[libc-commits] [libc] d12a7f1 - [libc] Add on float properties for precision floating point numbers in FloatProperties.h
Hedin GarcĂa via libc-commits
libc-commits at lists.llvm.org
Tue Jul 13 13:16:36 PDT 2021
Author: Hedin Garca
Date: 2021-07-13T20:15:54Z
New Revision: d12a7f142e2430f4983c668d910897db8cc2afc7
URL: https://github.com/llvm/llvm-project/commit/d12a7f142e2430f4983c668d910897db8cc2afc7
DIFF: https://github.com/llvm/llvm-project/commit/d12a7f142e2430f4983c668d910897db8cc2afc7.diff
LOG: [libc] Add on float properties for precision floating point numbers in FloatProperties.h
Defined constant that express the number of bits for exponent in single and double precision. Added bit masks values and other properties for quad precision floating point numbers that specifically targets architectures defined in PlatfromDefs.h. The exponentWidth values were added to be used in LongDoubleBitsX86.h where the implementation to set the exponent component uses this and the bitWidth value. The need occurred because of the 80-bit quad precision implementation.
Reviewed By: aeubanks
Differential Revision: https://reviews.llvm.org/D105153
Added:
Modified:
libc/utils/FPUtil/FloatProperties.h
Removed:
################################################################################
diff --git a/libc/utils/FPUtil/FloatProperties.h b/libc/utils/FPUtil/FloatProperties.h
index fb0917259b915..ecf2ff10bd027 100644
--- 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 <stdint.h>
namespace __llvm_libc {
@@ -24,10 +25,12 @@ template <> struct FloatProperties<float> {
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 @@ template <> struct FloatProperties<double> {
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 @@ template <> struct FloatProperties<double> {
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<long double> {
+ typedef uint64_t BitsType;
+ static_assert(sizeof(BitsType) == sizeof(double),
+ "Unexpected size of 'double' type.");
+
+ static constexpr uint32_t bitWidth = FloatProperties<double>::bitWidth;
+
+ static constexpr uint32_t mantissaWidth =
+ FloatProperties<double>::mantissaWidth;
+ static constexpr uint32_t exponentWidth =
+ FloatProperties<double>::exponentWidth;
+ static constexpr BitsType mantissaMask =
+ FloatProperties<double>::mantissaMask;
+ static constexpr BitsType signMask = FloatProperties<double>::signMask;
+ static constexpr BitsType exponentMask =
+ FloatProperties<double>::exponentMask;
+ static constexpr uint32_t exponentBias =
+ FloatProperties<double>::exponentBias;
+};
+#elif defined(SPECIAL_X86_LONG_DOUBLE)
+// Properties for numbers represented in 80 bits long double on non-Windows x86
+// platforms.
+template <> struct FloatProperties<long double> {
+ 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<long double> {
+ 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 <typename BitsType> struct FloatType;
More information about the libc-commits
mailing list