diff --git a/libc/utils/FPUtil/FloatProperties.h b/libc/utils/FPUtil/FloatProperties.h --- a/libc/utils/FPUtil/FloatProperties.h +++ b/libc/utils/FPUtil/FloatProperties.h @@ -9,6 +9,7 @@ #ifndef LLVM_LIBC_UTILS_FPUTIL_FLOAT_PROPERTIES_H #define LLVM_LIBC_UTILS_FPUTIL_FLOAT_PROPERTIES_H +#include "PlatformDefs.h" #include namespace __llvm_libc { @@ -24,10 +25,12 @@ static constexpr uint32_t bitWidth = sizeof(BitsType) << 3; static constexpr uint32_t mantissaWidth = 23; - static constexpr BitsType mantissaMask = 0x007fffffU; - static constexpr BitsType signMask = 0x80000000U; + static constexpr uint32_t exponentWidth = 8; + static constexpr BitsType mantissaMask = (BitsType(1) << mantissaWidth) - 1; + static constexpr BitsType signMask = BitsType(1) + << (exponentWidth + mantissaWidth); static constexpr BitsType exponentMask = ~(signMask | mantissaMask); - static constexpr uint32_t exponentOffset = 127; + static constexpr uint32_t exponentBias = 127; // If a number x is a NAN, then it is a quiet NAN if: // QuietNaNMask & bits(x) != 0 @@ -43,10 +46,12 @@ static constexpr uint32_t bitWidth = sizeof(BitsType) << 3; static constexpr uint32_t mantissaWidth = 52; - static constexpr BitsType mantissaMask = 0x000fffffffffffffU; - static constexpr BitsType signMask = 0x8000000000000000ULL; + static constexpr uint32_t exponentWidth = 11; + static constexpr BitsType mantissaMask = (BitsType(1) << mantissaWidth) - 1; + static constexpr BitsType signMask = BitsType(1) + << (exponentWidth + mantissaWidth); static constexpr BitsType exponentMask = ~(signMask | mantissaMask); - static constexpr uint32_t exponentOffset = 1023; + static constexpr uint32_t exponentBias = 1023; // If a number x is a NAN, then it is a quiet NAN if: // QuietNaNMask & bits(x) != 0 @@ -54,6 +59,67 @@ static constexpr BitsType quietNaNMask = 0x0008000000000000ULL; }; +#if defined(LONG_DOUBLE_IS_DOUBLE) +// Properties for numbers represented in 64 bits long double on Windows +// platform. +template <> struct FloatProperties { + typedef uint64_t BitsType; + static_assert(sizeof(BitsType) == sizeof(double), + "Unexpected size of 'double' type."); + + static constexpr uint32_t bitWidth = FloatProperties::bitWidth; + + static constexpr uint32_t mantissaWidth = + FloatProperties::mantissaWidth; + static constexpr uint32_t exponentWidth = + FloatProperties::exponentWidth; + static constexpr BitsType mantissaMask = + FloatProperties::mantissaMask; + static constexpr BitsType signMask = FloatProperties::signMask; + static constexpr BitsType exponentMask = + FloatProperties::exponentMask; + static constexpr uint32_t exponentBias = + FloatProperties::exponentBias; +}; +#elif defined(SPECIAL_X86_LONG_DOUBLE) +// Properties for numbers represented in 80 bits long double on non-Windows x86 +// platforms. +template <> struct FloatProperties { + typedef __uint128_t BitsType; + static_assert(sizeof(BitsType) == sizeof(long double), + "Unexpected size of 'long double' type."); + + static constexpr uint32_t bitWidth = (sizeof(BitsType) << 3) - 48; + + static constexpr uint32_t mantissaWidth = 63; + static constexpr uint32_t exponentWidth = 15; + static constexpr BitsType mantissaMask = (BitsType(1) << mantissaWidth) - 1; + static constexpr BitsType signMask = BitsType(1) + << (exponentWidth + mantissaWidth + 1); + static constexpr BitsType exponentMask = ((BitsType(1) << exponentWidth) - 1) + << (mantissaWidth + 1); + static constexpr uint32_t exponentBias = 16383; +}; +#else +// Properties for numbers represented in 128 bits long double on non x86 +// platform. +template <> struct FloatProperties { + typedef __uint128_t BitsType; + static_assert(sizeof(BitsType) == sizeof(long double), + "Unexpected size of 'long double' type."); + + static constexpr uint32_t bitWidth = sizeof(BitsType) << 3; + + static constexpr uint32_t mantissaWidth = 112; + static constexpr uint32_t exponentWidth = 15; + static constexpr BitsType mantissaMask = (BitsType(1) << mantissaWidth) - 1; + static constexpr BitsType signMask = BitsType(1) + << (exponentWidth + mantissaWidth); + static constexpr BitsType exponentMask = ~(signMask | mantissaMask); + static constexpr uint32_t exponentBias = 16383; +}; +#endif + // Define the float type corresponding to the BitsType. template struct FloatType;