[libc-commits] [libc] [libc][NFC] Make `QNAN_MASK` an implementation detail of `FPBits` (PR #75945)
Guillaume Chatelet via libc-commits
libc-commits at lists.llvm.org
Tue Dec 19 08:11:14 PST 2023
https://github.com/gchatelet updated https://github.com/llvm/llvm-project/pull/75945
>From f8bcc8e0e8ac999a0d53151f20d8e4f382216599 Mon Sep 17 00:00:00 2001
From: Guillaume Chatelet <gchatelet at google.com>
Date: Tue, 19 Dec 2023 16:07:56 +0000
Subject: [PATCH 1/2] [libc][NFC] Make `QNAN_MASK` an implementation detail
---
libc/src/__support/FPUtil/FPBits.h | 11 +++++---
libc/src/__support/FPUtil/FloatProperties.h | 25 +++++++++----------
.../__support/FPUtil/x86_64/LongDoubleBits.h | 8 ++++--
libc/src/__support/str_to_float.h | 1 -
4 files changed, 25 insertions(+), 20 deletions(-)
diff --git a/libc/src/__support/FPUtil/FPBits.h b/libc/src/__support/FPUtil/FPBits.h
index 7f5dd0fca58d4f..fd67c6e0ea5ff0 100644
--- a/libc/src/__support/FPUtil/FPBits.h
+++ b/libc/src/__support/FPUtil/FPBits.h
@@ -39,7 +39,11 @@ template <typename T> struct FPBits : private FloatProperties<T> {
using FloatProperties<T>::EXP_LEN;
using FloatProperties<T>::FRACTION_MASK;
using FloatProperties<T>::FRACTION_LEN;
- using FloatProperties<T>::QUIET_NAN_MASK;
+
+private:
+ using FloatProperties<T>::QNAN_MASK;
+
+public:
using FloatProperties<T>::SIGN_MASK;
// Reinterpreting bits as an integer value and interpreting the bits of an
@@ -90,7 +94,6 @@ template <typename T> struct FPBits : private FloatProperties<T> {
"Data type and integral representation have different sizes.");
static constexpr int MAX_EXPONENT = (1 << EXP_LEN) - 1;
-
static constexpr StorageType MIN_SUBNORMAL = StorageType(1);
static constexpr StorageType MAX_SUBNORMAL = FRACTION_MASK;
static constexpr StorageType MIN_NORMAL = (StorageType(1) << FRACTION_LEN);
@@ -154,7 +157,7 @@ template <typename T> struct FPBits : private FloatProperties<T> {
}
LIBC_INLINE constexpr bool is_quiet_nan() const {
- return (bits & EXP_MANT_MASK) == (EXP_MASK | QUIET_NAN_MASK);
+ return (bits & EXP_MANT_MASK) == (EXP_MASK | QNAN_MASK);
}
LIBC_INLINE constexpr bool is_inf_or_nan() const {
@@ -196,7 +199,7 @@ template <typename T> struct FPBits : private FloatProperties<T> {
}
LIBC_INLINE static constexpr T build_quiet_nan(StorageType v) {
- return build_nan(QUIET_NAN_MASK | v);
+ return build_nan(QNAN_MASK | v);
}
// The function convert integer number and unbiased exponent to proper float
diff --git a/libc/src/__support/FPUtil/FloatProperties.h b/libc/src/__support/FPUtil/FloatProperties.h
index 896c29919e2f77..dd714fde017874 100644
--- a/libc/src/__support/FPUtil/FloatProperties.h
+++ b/libc/src/__support/FPUtil/FloatProperties.h
@@ -143,16 +143,6 @@ struct FPProperties : public internal::FPBaseProperties<fp_type> {
return StorageType(1) << position;
}
- LIBC_INLINE_VAR static constexpr StorageType QNAN_MASK =
- UP::ENCODING == internal::FPEncoding::X86_ExtendedPrecision
- ? bit_at(SIG_LEN - 1) | bit_at(SIG_LEN - 2) // 0b1100...
- : bit_at(SIG_LEN - 1); // 0b1000...
-
- LIBC_INLINE_VAR static constexpr StorageType SNAN_MASK =
- UP::ENCODING == internal::FPEncoding::X86_ExtendedPrecision
- ? bit_at(SIG_LEN - 1) | bit_at(SIG_LEN - 3) // 0b1010...
- : bit_at(SIG_LEN - 2); // 0b0100...
-
public:
// The number of bits after the decimal dot when the number is in normal form.
LIBC_INLINE_VAR static constexpr int FRACTION_LEN =
@@ -166,9 +156,18 @@ struct FPProperties : public internal::FPBaseProperties<fp_type> {
EXP_MASK | SIG_MASK;
// If a number x is a NAN, then it is a quiet NAN if:
- // QuietNaNMask & bits(x) != 0
- // Else, it is a signalling NAN.
- static constexpr StorageType QUIET_NAN_MASK = QNAN_MASK;
+ // QNAN_MASK & bits(x) != 0
+ LIBC_INLINE_VAR static constexpr StorageType QNAN_MASK =
+ UP::ENCODING == internal::FPEncoding::X86_ExtendedPrecision
+ ? bit_at(SIG_LEN - 1) | bit_at(SIG_LEN - 2) // 0b1100...
+ : bit_at(SIG_LEN - 1); // 0b1000...
+
+ // If a number x is a NAN, then it is a signalling NAN if:
+ // SNAN_MASK & bits(x) != 0
+ LIBC_INLINE_VAR static constexpr StorageType SNAN_MASK =
+ UP::ENCODING == internal::FPEncoding::X86_ExtendedPrecision
+ ? bit_at(SIG_LEN - 1) | bit_at(SIG_LEN - 3) // 0b1010...
+ : bit_at(SIG_LEN - 2); // 0b0100...
};
//-----------------------------------------------------------------------------
diff --git a/libc/src/__support/FPUtil/x86_64/LongDoubleBits.h b/libc/src/__support/FPUtil/x86_64/LongDoubleBits.h
index 89c47063ebac4d..27435abdd16d4b 100644
--- a/libc/src/__support/FPUtil/x86_64/LongDoubleBits.h
+++ b/libc/src/__support/FPUtil/x86_64/LongDoubleBits.h
@@ -35,7 +35,11 @@ template <> struct FPBits<long double> : private FloatProperties<long double> {
using FloatProperties<long double>::EXP_LEN;
using FloatProperties<long double>::FRACTION_MASK;
using FloatProperties<long double>::FRACTION_LEN;
- using FloatProperties<long double>::QUIET_NAN_MASK;
+
+private:
+ using FloatProperties<long double>::QNAN_MASK;
+
+public:
using FloatProperties<long double>::SIGN_MASK;
static constexpr int MAX_EXPONENT = 0x7FFF;
@@ -196,7 +200,7 @@ template <> struct FPBits<long double> : private FloatProperties<long double> {
}
LIBC_INLINE static constexpr long double build_quiet_nan(StorageType v) {
- return build_nan(QUIET_NAN_MASK | v);
+ return build_nan(QNAN_MASK | v);
}
LIBC_INLINE static constexpr long double min_normal() {
diff --git a/libc/src/__support/str_to_float.h b/libc/src/__support/str_to_float.h
index 9984bcd7064d75..ec2b8b062b9b78 100644
--- a/libc/src/__support/str_to_float.h
+++ b/libc/src/__support/str_to_float.h
@@ -1167,7 +1167,6 @@ LIBC_INLINE StrToNumResult<T> strtofloatingpoint(const char *__restrict src) {
index = left_paren;
}
}
- nan_mantissa |= fputil::FloatProperties<T>::QUIET_NAN_MASK;
if (result.get_sign()) {
result = FPBits(result.build_quiet_nan(nan_mantissa));
result.set_sign(true);
>From 9a2aacb5970f250e87f69d336709beacfaa0cbfd Mon Sep 17 00:00:00 2001
From: Guillaume Chatelet <gchatelet at google.com>
Date: Tue, 19 Dec 2023 16:11:00 +0000
Subject: [PATCH 2/2] Make the mask protected in FloatProperties
---
libc/src/__support/FPUtil/FloatProperties.h | 1 +
1 file changed, 1 insertion(+)
diff --git a/libc/src/__support/FPUtil/FloatProperties.h b/libc/src/__support/FPUtil/FloatProperties.h
index dd714fde017874..047b5bc0828d8a 100644
--- a/libc/src/__support/FPUtil/FloatProperties.h
+++ b/libc/src/__support/FPUtil/FloatProperties.h
@@ -155,6 +155,7 @@ struct FPProperties : public internal::FPBaseProperties<fp_type> {
LIBC_INLINE_VAR static constexpr StorageType EXP_MANT_MASK =
EXP_MASK | SIG_MASK;
+protected:
// If a number x is a NAN, then it is a quiet NAN if:
// QNAN_MASK & bits(x) != 0
LIBC_INLINE_VAR static constexpr StorageType QNAN_MASK =
More information about the libc-commits
mailing list