diff options
author | Joseph Huber <huberjn@outlook.com> | 2024-07-08 20:07:45 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-07-08 20:07:45 -0500 |
commit | afa6bed8afe9011c07c682a0a24362260d92cfdd (patch) | |
tree | 45dfa10a6648fd8aeaa3bb9ef2bc3f21c66c16c8 | |
parent | b2fd1ebc3523d225956120052bcc0698adf4579f (diff) | |
download | llvm-afa6bed8afe9011c07c682a0a24362260d92cfdd.zip llvm-afa6bed8afe9011c07c682a0a24362260d92cfdd.tar.gz llvm-afa6bed8afe9011c07c682a0a24362260d92cfdd.tar.bz2 |
[libc] Fix integer `rint` variants on the GPU (#98095)
Summary:
Currently these are implemented as a static cast on `__builtin_rint()`
to a long. Howver, this is not strictly correct. The standard states
that the output is unspecified, but most implementations, and the LLVM
libc implementation, do some kind of guarantee on this beahvior. This is
not guaranteed by just doing a cast. This patch just uses the generic
versions until we implement `__builitin_lrint` correctly.
-rw-r--r-- | libc/src/math/amdgpu/CMakeLists.txt | 48 | ||||
-rw-r--r-- | libc/src/math/nvptx/CMakeLists.txt | 48 | ||||
-rw-r--r-- | libc/test/src/math/RoundToIntegerTest.h | 1 | ||||
-rw-r--r-- | libc/test/src/math/smoke/RoundToIntegerTest.h | 9 |
4 files changed, 7 insertions, 99 deletions
diff --git a/libc/src/math/amdgpu/CMakeLists.txt b/libc/src/math/amdgpu/CMakeLists.txt index bc81f7b..202177f 100644 --- a/libc/src/math/amdgpu/CMakeLists.txt +++ b/libc/src/math/amdgpu/CMakeLists.txt @@ -457,54 +457,6 @@ add_entrypoint_object( ) add_entrypoint_object( - lrint - SRCS - lrint.cpp - HDRS - ../lrint.h - COMPILE_OPTIONS - ${bitcode_link_flags} - -O2 - VENDOR -) - -add_entrypoint_object( - lrintf - SRCS - lrintf.cpp - HDRS - ../lrintf.h - COMPILE_OPTIONS - ${bitcode_link_flags} - -O2 - VENDOR -) - -add_entrypoint_object( - llrint - SRCS - llrint.cpp - HDRS - ../llrint.h - COMPILE_OPTIONS - ${bitcode_link_flags} - -O2 - VENDOR -) - -add_entrypoint_object( - llrintf - SRCS - llrintf.cpp - HDRS - ../llrintf.h - COMPILE_OPTIONS - ${bitcode_link_flags} - -O2 - VENDOR -) - -add_entrypoint_object( pow SRCS pow.cpp diff --git a/libc/src/math/nvptx/CMakeLists.txt b/libc/src/math/nvptx/CMakeLists.txt index a09668c..bf37c52 100644 --- a/libc/src/math/nvptx/CMakeLists.txt +++ b/libc/src/math/nvptx/CMakeLists.txt @@ -410,54 +410,6 @@ add_entrypoint_object( ) add_entrypoint_object( - lrint - SRCS - lrint.cpp - HDRS - ../lrint.h - COMPILE_OPTIONS - ${bitcode_link_flags} - -O2 - VENDOR -) - -add_entrypoint_object( - lrintf - SRCS - lrintf.cpp - HDRS - ../lrintf.h - COMPILE_OPTIONS - ${bitcode_link_flags} - -O2 - VENDOR -) - -add_entrypoint_object( - llrint - SRCS - llrint.cpp - HDRS - ../llrint.h - COMPILE_OPTIONS - ${bitcode_link_flags} - -O2 - VENDOR -) - -add_entrypoint_object( - llrintf - SRCS - llrintf.cpp - HDRS - ../llrintf.h - COMPILE_OPTIONS - ${bitcode_link_flags} - -O2 - VENDOR -) - -add_entrypoint_object( pow SRCS pow.cpp diff --git a/libc/test/src/math/RoundToIntegerTest.h b/libc/test/src/math/RoundToIntegerTest.h index bb7e8643..2b1c643 100644 --- a/libc/test/src/math/RoundToIntegerTest.h +++ b/libc/test/src/math/RoundToIntegerTest.h @@ -12,6 +12,7 @@ #include "src/__support/CPP/algorithm.h" #include "src/__support/FPUtil/FEnvImpl.h" #include "src/__support/FPUtil/FPBits.h" +#include "src/__support/macros/properties/architectures.h" #include "test/UnitTest/FEnvSafeTest.h" #include "test/UnitTest/FPMatcher.h" #include "test/UnitTest/Test.h" diff --git a/libc/test/src/math/smoke/RoundToIntegerTest.h b/libc/test/src/math/smoke/RoundToIntegerTest.h index fd3fbde..8b5f678 100644 --- a/libc/test/src/math/smoke/RoundToIntegerTest.h +++ b/libc/test/src/math/smoke/RoundToIntegerTest.h @@ -12,7 +12,6 @@ #include "src/__support/CPP/algorithm.h" #include "src/__support/FPUtil/FEnvImpl.h" #include "src/__support/FPUtil/FPBits.h" -#include "src/__support/macros/properties/architectures.h" #include "test/UnitTest/FEnvSafeTest.h" #include "test/UnitTest/FPMatcher.h" #include "test/UnitTest/Test.h" @@ -51,12 +50,10 @@ private: // 0 for errno and exceptions, but this doesn't hold for // all math functions using RoundToInteger test: // https://github.com/llvm/llvm-project/pull/88816 -#ifndef LIBC_TARGET_ARCH_IS_GPU if (expectError) { ASSERT_FP_EXCEPTION(FE_INVALID); ASSERT_MATH_ERRNO(EDOM); } -#endif } public: @@ -169,7 +166,13 @@ public: #define LIST_ROUND_TO_INTEGER_TESTS(F, I, func) \ LIST_ROUND_TO_INTEGER_TESTS_HELPER(F, I, func, false) +// The GPU target does not support different rounding modes. +#ifdef LIBC_TARGET_ARCH_IS_GPU +#define LIST_ROUND_TO_INTEGER_TESTS_WITH_MODES(F, I, func) \ + LIST_ROUND_TO_INTEGER_TESTS_HELPER(F, I, func, false) +#else #define LIST_ROUND_TO_INTEGER_TESTS_WITH_MODES(F, I, func) \ LIST_ROUND_TO_INTEGER_TESTS_HELPER(F, I, func, true) +#endif #endif // LLVM_LIBC_TEST_SRC_MATH_SMOKE_ROUNDTOINTEGERTEST_H |