mirror of
https://github.com/intel/llvm.git
synced 2026-01-16 21:55:39 +08:00
[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
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user