[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:02 PDT 2024
https://github.com/lntue created https://github.com/llvm/llvm-project/pull/99812
None
>From 2c7d580f7d84ae54d971499b681e9fe05fc06928 Mon Sep 17 00:00:00 2001
From: Tue Ly <lntue.h at gmail.com>
Date: Sun, 21 Jul 2024 15:55:26 +0000
Subject: [PATCH] [libc][math] Update getpayload and fmul with NaN inputs.
---
libc/src/__support/FPUtil/BasicOperations.h | 7 ++-
libc/src/__support/FPUtil/CMakeLists.txt | 57 +++++++++++----------
libc/src/__support/FPUtil/generic/mul.h | 20 ++++----
libc/test/src/math/smoke/MulTest.h | 19 +------
4 files changed, 46 insertions(+), 57 deletions(-)
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)));
More information about the libc-commits
mailing list