diff --git a/libc/src/__support/FPUtil/FloatProperties.h b/libc/src/__support/FPUtil/FloatProperties.h index ef6a3cd403db61..0144404d952c0f 100644 --- a/libc/src/__support/FPUtil/FloatProperties.h +++ b/libc/src/__support/FPUtil/FloatProperties.h @@ -90,13 +90,12 @@ template static constexpr T mask_trailing_ones() { return count == 0 ? 0 : ((~T(0)) >> (t_bits - count)); } -// Derives more properties from 'FPBaseProperties' above. -// This class serves as a halfway point between 'FPBaseProperties' and -// 'FPProperties' below. +} // namespace internal + template -struct FPCommonProperties : private FPBaseProperties { +struct FPProperties : public internal::FPBaseProperties { private: - using UP = FPBaseProperties; + using UP = internal::FPBaseProperties; using UP::EXP_BITS; using UP::SIG_BITS; using UP::TOTAL_BITS; @@ -123,15 +122,15 @@ struct FPCommonProperties : private FPBaseProperties { // Masks LIBC_INLINE_VAR static constexpr UIntType SIG_MASK = - mask_trailing_ones() << SIG_MASK_SHIFT; + internal::mask_trailing_ones() << SIG_MASK_SHIFT; LIBC_INLINE_VAR static constexpr UIntType EXP_MASK = - mask_trailing_ones() << EXP_MASK_SHIFT; + internal::mask_trailing_ones() << EXP_MASK_SHIFT; // Trailing underscore on SIGN_MASK_ is temporary - it will be removed // once we can replace the public part below with the private one. LIBC_INLINE_VAR static constexpr UIntType SIGN_MASK_ = - mask_trailing_ones() << SIGN_MASK_SHIFT; + internal::mask_trailing_ones() << SIGN_MASK_SHIFT; LIBC_INLINE_VAR static constexpr UIntType FP_MASK = - mask_trailing_ones(); + internal::mask_trailing_ones(); static_assert((SIG_MASK & EXP_MASK & SIGN_MASK_) == 0, "masks disjoint"); static_assert((SIG_MASK | EXP_MASK | SIGN_MASK_) == FP_MASK, "masks cover"); @@ -140,19 +139,19 @@ struct FPCommonProperties : private FPBaseProperties { } LIBC_INLINE_VAR static constexpr UIntType QNAN_MASK = - UP::ENCODING == FPEncoding::X86_ExtendedPrecision + UP::ENCODING == internal::FPEncoding::X86_ExtendedPrecision ? bit_at(SIG_BITS - 1) | bit_at(SIG_BITS - 2) // 0b1100... : bit_at(SIG_BITS - 1); // 0b1000... LIBC_INLINE_VAR static constexpr UIntType SNAN_MASK = - UP::ENCODING == FPEncoding::X86_ExtendedPrecision + UP::ENCODING == internal::FPEncoding::X86_ExtendedPrecision ? bit_at(SIG_BITS - 1) | bit_at(SIG_BITS - 3) // 0b1010... : bit_at(SIG_BITS - 2); // 0b0100... // The number of bits after the decimal dot when the number if in normal form. LIBC_INLINE_VAR static constexpr int FRACTION_BITS = - UP::ENCODING == FPEncoding::X86_ExtendedPrecision ? SIG_BITS - 1 - : SIG_BITS; + UP::ENCODING == internal::FPEncoding::X86_ExtendedPrecision ? SIG_BITS - 1 + : SIG_BITS; public: // Public facing API to keep the change local to this file. @@ -163,7 +162,7 @@ struct FPCommonProperties : private FPBaseProperties { LIBC_INLINE_VAR static constexpr uint32_t MANTISSA_PRECISION = MANTISSA_WIDTH + 1; LIBC_INLINE_VAR static constexpr BitsType MANTISSA_MASK = - mask_trailing_ones(); + internal::mask_trailing_ones(); LIBC_INLINE_VAR static constexpr uint32_t EXPONENT_WIDTH = EXP_BITS; LIBC_INLINE_VAR static constexpr uint32_t EXPONENT_BIAS = static_cast(EXP_BIAS); @@ -177,29 +176,6 @@ struct FPCommonProperties : private FPBaseProperties { static constexpr BitsType QUIET_NAN_MASK = QNAN_MASK; }; -} // namespace internal - -template -struct FPProperties : public internal::FPCommonProperties {}; - -// ---------------- -// Work In Progress -// ---------------- -// The 'FPProperties' template specializations below are being slowly replaced -// with properties from 'FPCommonProperties' above. Once specializations are -// empty, 'FPProperties' declaration can be fully replace with -// 'FPCommonProperties' implementation. - -// Properties for numbers represented in 80 bits long double on non-Windows x86 -// platforms. -template <> -struct FPProperties - : public internal::FPCommonProperties { - // The x86 80 bit float represents the leading digit of the mantissa - // explicitly. This is the mask for that bit. - static constexpr BitsType EXPLICIT_BIT_MASK = (BitsType(1) << MANTISSA_WIDTH); -}; - //----------------------------------------------------------------------------- template LIBC_INLINE static constexpr FPType get_fp_type() { if constexpr (cpp::is_same_v && __FLT_MANT_DIG__ == 24) diff --git a/libc/src/__support/FPUtil/x86_64/LongDoubleBits.h b/libc/src/__support/FPUtil/x86_64/LongDoubleBits.h index bbc30ff7a376df..60953313a695c5 100644 --- a/libc/src/__support/FPUtil/x86_64/LongDoubleBits.h +++ b/libc/src/__support/FPUtil/x86_64/LongDoubleBits.h @@ -68,7 +68,11 @@ template <> struct FPBits { } LIBC_INLINE constexpr UIntType get_explicit_mantissa() const { - return bits & (FloatProp::MANTISSA_MASK | FloatProp::EXPLICIT_BIT_MASK); + // The x86 80 bit float represents the leading digit of the mantissa + // explicitly. This is the mask for that bit. + constexpr UIntType EXPLICIT_BIT_MASK = + (UIntType(1) << FloatProp::MANTISSA_WIDTH); + return bits & (FloatProp::MANTISSA_MASK | EXPLICIT_BIT_MASK); } LIBC_INLINE constexpr void set_biased_exponent(UIntType expVal) {