[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

GitOrigin-RevId: 18da0c0a287707b2f80880c14d77e4f071aae88d
diff --git a/src/__support/FPUtil/FloatProperties.h b/src/__support/FPUtil/FloatProperties.h
index ff132ed..d8d0fea 100644
--- a/src/__support/FPUtil/FloatProperties.h
+++ b/src/__support/FPUtil/FloatProperties.h
@@ -80,6 +80,12 @@
       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 @@
   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 @@
                                        << (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/src/__support/FPUtil/LongDoubleBitsX86.h b/src/__support/FPUtil/LongDoubleBitsX86.h
index 1c963b0..77611ad 100644
--- a/src/__support/FPUtil/LongDoubleBitsX86.h
+++ b/src/__support/FPUtil/LongDoubleBitsX86.h
@@ -89,7 +89,11 @@
 
   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>