From f7cfae519b0305a2a4d6ed244388d9675da675b8 Mon Sep 17 00:00:00 2001 From: Joseph Huber Date: Mon, 8 Jul 2024 17:48:49 -0500 Subject: [PATCH] [libc] Fix integer `rint` variants on the GPU 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. --- libc/src/math/amdgpu/CMakeLists.txt | 48 ------------------- libc/src/math/nvptx/CMakeLists.txt | 48 ------------------- libc/test/src/math/RoundToIntegerTest.h | 1 + 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 bc81f7b20a71db..202177f54b11ad 100644 --- a/libc/src/math/amdgpu/CMakeLists.txt +++ b/libc/src/math/amdgpu/CMakeLists.txt @@ -456,54 +456,6 @@ add_entrypoint_object( VENDOR ) -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 diff --git a/libc/src/math/nvptx/CMakeLists.txt b/libc/src/math/nvptx/CMakeLists.txt index a09668ca10678d..bf37c52f09e44f 100644 --- a/libc/src/math/nvptx/CMakeLists.txt +++ b/libc/src/math/nvptx/CMakeLists.txt @@ -409,54 +409,6 @@ add_entrypoint_object( VENDOR ) -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 diff --git a/libc/test/src/math/RoundToIntegerTest.h b/libc/test/src/math/RoundToIntegerTest.h index bb7e8643973c36..2b1c6432675905 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 fd3fbde92b9630..8b5f678b32449f 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 @@ class RoundToIntegerTestTemplate // 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 @@ class RoundToIntegerTestTemplate #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