diff options
| -rw-r--r-- | clang/docs/LanguageExtensions.rst | 72 | ||||
| -rw-r--r-- | clang/include/clang/Basic/BuiltinsPPC.def | 3 | ||||
| -rw-r--r-- | clang/test/CodeGen/builtins-ppc.c | 13 |
3 files changed, 88 insertions, 0 deletions
diff --git a/clang/docs/LanguageExtensions.rst b/clang/docs/LanguageExtensions.rst index d4c40b29f80..d79d4122777 100644 --- a/clang/docs/LanguageExtensions.rst +++ b/clang/docs/LanguageExtensions.rst @@ -2376,6 +2376,78 @@ Which compiles to (on X86-32): movl %gs:(%eax), %eax ret +PowerPC Language Extensions +------------------------------ + +Set the Floating Point Rounding Mode +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +PowerPC64/PowerPC64le supports the builtin function ``__builtin_setrnd`` to set +the floating point rounding mode. This function will use the least significant +two bits of integer argument to set the floating point rounding mode. + +.. code-block:: c++ + + double __builtin_setrnd(int mode); + +The effective values for mode are: + + - 0 - round to nearest + - 1 - round to zero + - 2 - round to +infinity + - 3 - round to -infinity + +Note that the mode argument will modulo 4, so if the int argument is greater +than 3, it will only use the least significant two bits of the mode. +Namely, ``__builtin_setrnd(102))`` is equal to ``__builtin_setrnd(2)``. + +PowerPC Language Extensions +------------------------------ + +Set the Floating Point Rounding Mode +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +PowerPC64/PowerPC64le supports the builtin function ``__builtin_setrnd`` to set +the floating point rounding mode. This function will use the least significant +two bits of integer argument to set the floating point rounding mode. + +.. code-block:: c++ + + double __builtin_setrnd(int mode); + +The effective values for mode are: + + - 0 - round to nearest + - 1 - round to zero + - 2 - round to +infinity + - 3 - round to -infinity + +Note that the mode argument will modulo 4, so if the integer argument is greater +than 3, it will only use the least significant two bits of the mode. +Namely, ``__builtin_setrnd(102))`` is equal to ``__builtin_setrnd(2)``. + +PowerPC Language Extensions +------------------------------ + +Set the Floating Point Rounding Mode +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +PowerPC64/PowerPC64le supports the builtin function ``__builtin_setrnd`` to set +the floating point rounding mode. This function will use the least significant +two bits of integer argument to set the floating point rounding mode. + +.. code-block:: c++ + + double __builtin_setrnd(int mode); + +The effective values for mode are: + + - 0 - round to nearest + - 1 - round to zero + - 2 - round to +infinity + - 3 - round to -infinity + +Note that the mode argument will modulo 4, so if the integer argument is greater +than 3, it will only use the least significant two bits of the mode. +Namely, ``__builtin_setrnd(102))`` is equal to ``__builtin_setrnd(2)``. + Extensions for Static Analysis ============================== diff --git a/clang/include/clang/Basic/BuiltinsPPC.def b/clang/include/clang/Basic/BuiltinsPPC.def index e55fa04a3b6..9292458462a 100644 --- a/clang/include/clang/Basic/BuiltinsPPC.def +++ b/clang/include/clang/Basic/BuiltinsPPC.def @@ -475,6 +475,9 @@ BUILTIN(__builtin_bpermd, "SLLiSLLiSLLi", "") BUILTIN(__builtin_unpack_vector_int128, "ULLiV1LLLii", "") BUILTIN(__builtin_pack_vector_int128, "V1LLLiULLiULLi", "") +// Set the floating point rounding mode +BUILTIN(__builtin_setrnd, "di", "") + // FIXME: Obviously incomplete. #undef BUILTIN diff --git a/clang/test/CodeGen/builtins-ppc.c b/clang/test/CodeGen/builtins-ppc.c index 1f17787ad9c..1ff1b811c1a 100644 --- a/clang/test/CodeGen/builtins-ppc.c +++ b/clang/test/CodeGen/builtins-ppc.c @@ -14,3 +14,16 @@ long long test_builtin_ppc_get_timebase() { return __builtin_ppc_get_timebase(); } +void test_builtin_ppc_setrnd() { + volatile double res; + volatile int x = 100; + + // CHECK: call double @llvm.ppc.setrnd(i32 2) + res = __builtin_setrnd(2); + + // CHECK: call double @llvm.ppc.setrnd(i32 100) + res = __builtin_setrnd(100); + + // CHECK: call double @llvm.ppc.setrnd(i32 %2) + res = __builtin_setrnd(x); +} |

