aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Huber <huberjn@outlook.com>2024-07-08 20:07:45 -0500
committerGitHub <noreply@github.com>2024-07-08 20:07:45 -0500
commitafa6bed8afe9011c07c682a0a24362260d92cfdd (patch)
tree45dfa10a6648fd8aeaa3bb9ef2bc3f21c66c16c8
parentb2fd1ebc3523d225956120052bcc0698adf4579f (diff)
downloadllvm-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.txt48
-rw-r--r--libc/src/math/nvptx/CMakeLists.txt48
-rw-r--r--libc/test/src/math/RoundToIntegerTest.h1
-rw-r--r--libc/test/src/math/smoke/RoundToIntegerTest.h9
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