[libc-commits] [libc] [libc][math] Update getpayload and fmul with NaN inputs. (PR #99812)
via libc-commits
libc-commits at lists.llvm.org
Sun Jul 21 08:57:32 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-libc
Author: None (lntue)
<details>
<summary>Changes</summary>
---
Full diff: https://github.com/llvm/llvm-project/pull/99812.diff
4 Files Affected:
- (modified) libc/src/__support/FPUtil/BasicOperations.h (+5-2)
- (modified) libc/src/__support/FPUtil/CMakeLists.txt (+29-28)
- (modified) libc/src/__support/FPUtil/generic/mul.h (+10-10)
- (modified) libc/test/src/math/smoke/MulTest.h (+2-17)
``````````diff
diff --git a/libc/src/__support/FPUtil/BasicOperations.h b/libc/src/__support/FPUtil/BasicOperations.h
index a963a92bfb074..40f37b281b02c 100644
--- a/libc/src/__support/FPUtil/BasicOperations.h
+++ b/libc/src/__support/FPUtil/BasicOperations.h
@@ -11,8 +11,8 @@
#include "FEnvImpl.h"
#include "FPBits.h"
+#include "dyadic_float.h"
-#include "FEnvImpl.h"
#include "src/__support/CPP/type_traits.h"
#include "src/__support/common.h"
#include "src/__support/macros/config.h"
@@ -274,7 +274,10 @@ LIBC_INLINE cpp::enable_if_t<cpp::is_floating_point_v<T>, T> getpayload(T x) {
if (!x_bits.is_nan())
return T(-1.0);
- return T(x_bits.uintval() & (FPBits::FRACTION_MASK >> 1));
+ DyadicFloat<FPBits::STORAGE_LEN> payload(
+ Sign::POS, 0, x_bits.uintval() & (FPBits::FRACTION_MASK >> 1));
+
+ return static_cast<T>(payload);
}
template <bool IsSignaling, typename T>
diff --git a/libc/src/__support/FPUtil/CMakeLists.txt b/libc/src/__support/FPUtil/CMakeLists.txt
index 793d3a121c742..8804f3a4d5e23 100644
--- a/libc/src/__support/FPUtil/CMakeLists.txt
+++ b/libc/src/__support/FPUtil/CMakeLists.txt
@@ -75,19 +75,6 @@ add_header_library(
libc.src.__support.common
)
-add_header_library(
- basic_operations
- HDRS
- BasicOperations.h
- DEPENDS
- .fp_bits
- .fenv_impl
- libc.src.__support.CPP.type_traits
- libc.src.__support.uint128
- libc.src.__support.common
- libc.src.__support.macros.optimization
-)
-
add_header_library(
division_and_remainder_operations
HDRS
@@ -113,21 +100,6 @@ add_header_library(
)
-add_header_library(
- hypot
- HDRS
- Hypot.h
- DEPENDS
- .basic_operations
- .fenv_impl
- .fp_bits
- .rounding_mode
- libc.src.__support.common
- libc.src.__support.CPP.bit
- libc.src.__support.CPP.type_traits
- libc.src.__support.uint128
-)
-
add_header_library(
sqrt
HDRS
@@ -208,6 +180,35 @@ add_header_library(
libc.src.__support.macros.optimization
)
+add_header_library(
+ basic_operations
+ HDRS
+ BasicOperations.h
+ DEPENDS
+ .dyadic_float
+ .fp_bits
+ .fenv_impl
+ libc.src.__support.CPP.type_traits
+ libc.src.__support.uint128
+ libc.src.__support.common
+ libc.src.__support.macros.optimization
+)
+
+add_header_library(
+ hypot
+ HDRS
+ Hypot.h
+ DEPENDS
+ .basic_operations
+ .fenv_impl
+ .fp_bits
+ .rounding_mode
+ libc.src.__support.common
+ libc.src.__support.CPP.bit
+ libc.src.__support.CPP.type_traits
+ libc.src.__support.uint128
+)
+
add_header_library(
manipulation_functions
HDRS
diff --git a/libc/src/__support/FPUtil/generic/mul.h b/libc/src/__support/FPUtil/generic/mul.h
index 02fc69c6cb1ba..61be3719e123a 100644
--- a/libc/src/__support/FPUtil/generic/mul.h
+++ b/libc/src/__support/FPUtil/generic/mul.h
@@ -50,19 +50,19 @@ mul(InType x, InType y) {
raise_except_if_required(FE_INVALID);
if (x_bits.is_quiet_nan()) {
- InStorageType x_payload = static_cast<InStorageType>(getpayload(x));
- if ((x_payload & ~(OutFPBits::FRACTION_MASK >> 1)) == 0)
- return OutFPBits::quiet_nan(x_bits.sign(),
- static_cast<OutStorageType>(x_payload))
- .get_val();
+ InStorageType x_payload = x_bits.get_mantissa();
+ x_payload >>= (InFPBits::FRACTION_LEN - OutFPBits::FRACTION_LEN);
+ return OutFPBits::quiet_nan(x_bits.sign(),
+ static_cast<OutStorageType>(x_payload))
+ .get_val();
}
if (y_bits.is_quiet_nan()) {
- InStorageType y_payload = static_cast<InStorageType>(getpayload(y));
- if ((y_payload & ~(OutFPBits::FRACTION_MASK >> 1)) == 0)
- return OutFPBits::quiet_nan(y_bits.sign(),
- static_cast<OutStorageType>(y_payload))
- .get_val();
+ InStorageType y_payload = y_bits.get_mantissa();
+ y_payload >>= (InFPBits::FRACTION_LEN - OutFPBits::FRACTION_LEN);
+ return OutFPBits::quiet_nan(y_bits.sign(),
+ static_cast<OutStorageType>(y_payload))
+ .get_val();
}
return OutFPBits::quiet_nan().get_val();
diff --git a/libc/test/src/math/smoke/MulTest.h b/libc/test/src/math/smoke/MulTest.h
index e2298eaeeb216..0c847e39687b7 100644
--- a/libc/test/src/math/smoke/MulTest.h
+++ b/libc/test/src/math/smoke/MulTest.h
@@ -38,23 +38,8 @@ class MulTest : public LIBC_NAMESPACE::testing::FEnvSafeTest {
EXPECT_FP_IS_NAN_WITH_EXCEPTION(func(sNaN, sNaN), FE_INVALID);
InType qnan_42 = InFPBits::quiet_nan(Sign::POS, 0x42).get_val();
- EXPECT_FP_EQ(InType(0x42.0p+0),
- LIBC_NAMESPACE::fputil::getpayload(func(qnan_42, zero)));
- EXPECT_FP_EQ(InType(0x42.0p+0),
- LIBC_NAMESPACE::fputil::getpayload(func(zero, qnan_42)));
-
- if constexpr (sizeof(OutType) < sizeof(InType)) {
- InStorageType max_payload = InFPBits::FRACTION_MASK >> 1;
- InType qnan_max = InFPBits::quiet_nan(Sign::POS, max_payload).get_val();
- EXPECT_FP_EQ(zero,
- LIBC_NAMESPACE::fputil::getpayload(func(qnan_max, zero)));
- EXPECT_FP_EQ(zero,
- LIBC_NAMESPACE::fputil::getpayload(func(zero, qnan_max)));
- EXPECT_FP_EQ(InType(0x42.0p+0),
- LIBC_NAMESPACE::fputil::getpayload(func(qnan_max, qnan_42)));
- EXPECT_FP_EQ(InType(0x42.0p+0),
- LIBC_NAMESPACE::fputil::getpayload(func(qnan_42, qnan_max)));
- }
+ EXPECT_FP_IS_NAN(func(qnan_42, zero));
+ EXPECT_FP_IS_NAN(func(zero, qnan_42));
EXPECT_FP_EQ(inf, func(inf, InType(1.0)));
EXPECT_FP_EQ(neg_inf, func(neg_inf, InType(1.0)));
``````````
</details>
https://github.com/llvm/llvm-project/pull/99812
More information about the libc-commits
mailing list