[FPEnv] Small fixes to implementation of flt.rounds

This change makes minor correction to the implementation of intrinsic
`llvm.flt.rounds`:
- Added documentation entry in LangRef,
- Attributes of the intrinsic changed to be in line with other functions
  dependent of floating-point environment.

Differential Revision: https://reviews.llvm.org/D79322
This commit is contained in:
Serge Pavlov 2020-05-26 13:19:01 +07:00
parent e6e89875b0
commit 61f72dd8ac
3 changed files with 50 additions and 3 deletions

View File

@ -323,6 +323,9 @@ BUILTIN(__builtin_truncf, "ff", "Fnc")
BUILTIN(__builtin_truncl, "LdLd", "Fnc")
BUILTIN(__builtin_truncf16, "hh", "Fnc")
// Access to floating point environment
BUILTIN(__builtin_flt_rounds, "i", "n")
// C99 complex builtins
BUILTIN(__builtin_cabs, "dXd", "Fne")
BUILTIN(__builtin_cabsf, "fXf", "Fne")
@ -517,7 +520,6 @@ BUILTIN(__builtin_return_address, "v*IUi", "n")
BUILTIN(__builtin_extract_return_addr, "v*v*", "n")
BUILTIN(__builtin_frame_address, "v*IUi", "n")
BUILTIN(__builtin___clear_cache, "vc*c*", "n")
BUILTIN(__builtin_flt_rounds, "i", "nc")
BUILTIN(__builtin_setjmp, "iv**", "j")
BUILTIN(__builtin_longjmp, "vv**i", "r")
BUILTIN(__builtin_unwind_init, "v", "")

View File

@ -18284,6 +18284,46 @@ This function returns the same values as the libm ``trunc`` functions
would and handles error conditions in the same way.
Floating Point Environment Manipulation intrinsics
--------------------------------------------------
These functions read or write floating point environment, such as rounding
mode or state of floating point exceptions. Altering the floating point
environment requires special care. See :ref:`Floating Point Environment <floatenv>`.
'``llvm.flt.rounds``' Intrinsic
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Syntax:
"""""""
::
declare i32 @llvm.flt.rounds()
Overview:
"""""""""
The '``llvm.flt.rounds``' intrinsic reads the current rounding mode.
Semantics:
""""""""""
The '``llvm.flt.rounds``' intrinsic returns the current rounding mode.
Encoding of the returned values is same as the result of ``FLT_ROUNDS``,
specified by C standard:
::
0 - toward zero
1 - to nearest, ties to even
2 - toward positive infinity
3 - toward negative infinity
4 - to nearest, ties away from zero
Other values may be used to represent additional rounding modes, supported by a
target. These values are target-specific.
General Intrinsics
------------------

View File

@ -612,6 +612,13 @@ def int_objectsize : Intrinsic<[llvm_anyint_ty],
[IntrNoMem, IntrSpeculatable, IntrWillReturn, ImmArg<1>, ImmArg<2>, ImmArg<3>]>,
GCCBuiltin<"__builtin_object_size">;
//===--------------- Access to Floating Point Environment -----------------===//
//
let IntrProperties = [IntrInaccessibleMemOnly, IntrWillReturn] in {
def int_flt_rounds : Intrinsic<[llvm_i32_ty], []>;
}
//===--------------- Constrained Floating Point Intrinsics ----------------===//
//
@ -1115,8 +1122,6 @@ def int_coro_subfn_addr : Intrinsic<[llvm_ptr_ty], [llvm_ptr_ty, llvm_i8_ty],
///===-------------------------- Other Intrinsics --------------------------===//
//
def int_flt_rounds : Intrinsic<[llvm_i32_ty]>,
GCCBuiltin<"__builtin_flt_rounds">;
def int_trap : Intrinsic<[], [], [IntrNoReturn, IntrCold]>,
GCCBuiltin<"__builtin_trap">;
def int_debugtrap : Intrinsic<[]>,