[libc-commits] [libc] 18da0c0 - [libc] clean up FPUtil long doubles
Michael Jones via libc-commits
libc-commits at lists.llvm.org
Thu Nov 11 10:17:43 PST 2021
Author: Michael Jones
Date: 2021-11-11T10:17:36-08:00
New Revision: 18da0c0a287707b2f80880c14d77e4f071aae88d
URL: https://github.com/llvm/llvm-project/commit/18da0c0a287707b2f80880c14d77e4f071aae88d
DIFF: https://github.com/llvm/llvm-project/commit/18da0c0a287707b2f80880c14d77e4f071aae88d.diff
LOG: [libc] clean up FPUtil long doubles
Add quietNaNMask consts to FloatProperties and make LongDoubleBitsX86
clear the extra bits that aren't set when initializing with an 80 bit
long double.
Reviewed By: sivachandra, lntue
Differential Revision: https://reviews.llvm.org/D113625
Added:
Modified:
libc/src/__support/FPUtil/FloatProperties.h
libc/src/__support/FPUtil/LongDoubleBitsX86.h
Removed:
################################################################################
diff --git a/libc/src/__support/FPUtil/FloatProperties.h b/libc/src/__support/FPUtil/FloatProperties.h
index ff132ed5dfa51..d8d0fea977d24 100644
--- a/libc/src/__support/FPUtil/FloatProperties.h
+++ b/libc/src/__support/FPUtil/FloatProperties.h
@@ -80,6 +80,12 @@ template <> struct FloatProperties<long double> {
FloatProperties<double>::exponentMask;
static constexpr uint32_t exponentBias =
FloatProperties<double>::exponentBias;
+
+ // 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 BitsType quietNaNMask =
+ FloatProperties<double>::quietNaNMask;
};
#elif defined(SPECIAL_X86_LONG_DOUBLE)
// Properties for numbers represented in 80 bits long double on non-Windows x86
@@ -99,6 +105,11 @@ template <> struct FloatProperties<long double> {
static constexpr BitsType exponentMask = ((BitsType(1) << exponentWidth) - 1)
<< (mantissaWidth + 1);
static constexpr uint32_t exponentBias = 16383;
+
+ // 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 BitsType quietNaNMask = BitsType(1) << (mantissaWidth - 1);
};
#else
// Properties for numbers represented in 128 bits long double on non x86
@@ -117,6 +128,11 @@ template <> struct FloatProperties<long double> {
<< (exponentWidth + mantissaWidth);
static constexpr BitsType exponentMask = ~(signMask | mantissaMask);
static constexpr uint32_t exponentBias = 16383;
+
+ // 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 BitsType quietNaNMask = BitsType(1) << (mantissaWidth - 1);
};
#endif
diff --git a/libc/src/__support/FPUtil/LongDoubleBitsX86.h b/libc/src/__support/FPUtil/LongDoubleBitsX86.h
index 1c963b0ac6104..77611ad281c66 100644
--- a/libc/src/__support/FPUtil/LongDoubleBitsX86.h
+++ b/libc/src/__support/FPUtil/LongDoubleBitsX86.h
@@ -89,7 +89,11 @@ template <> union FPBits<long double> {
template <typename XType,
cpp::EnableIfType<cpp::IsSame<long double, XType>::Value, int> = 0>
- explicit FPBits(XType x) : val(x) {}
+ explicit FPBits(XType x) : val(x) {
+ // bits starts uninitialized, and setting it to a long double only
+ // overwrites the first 80 bits. This clears those upper bits.
+ bits = bits & ((UIntType(1) << 80) - 1);
+ }
template <typename XType,
cpp::EnableIfType<cpp::IsSame<XType, UIntType>::Value, int> = 0>
More information about the libc-commits
mailing list