Skip to content

Commit e6a6a90

Browse files
authored
[libc][NFC] Use the Sign type for DyadicFloat (llvm#78577)
1 parent 0c76865 commit e6a6a90

File tree

12 files changed

+2387
-2368
lines changed

12 files changed

+2387
-2368
lines changed

libc/src/__support/FPUtil/dyadic_float.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@ template <size_t Bits> struct DyadicFloat {
4949
normalize();
5050
}
5151

52-
constexpr DyadicFloat(bool s, int e, MantissaType m)
53-
: sign(s ? Sign::NEG : Sign::POS), exponent(e), mantissa(m) {
52+
constexpr DyadicFloat(Sign s, int e, MantissaType m)
53+
: sign(s), exponent(e), mantissa(m) {
5454
normalize();
5555
}
5656

libc/src/__support/str_to_float.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -510,6 +510,7 @@ clinger_fast_path(ExpandedFloat<T> init_num,
510510
RoundDirection round = RoundDirection::Nearest) {
511511
using FPBits = typename fputil::FPBits<T>;
512512
using StorageType = typename FPBits::StorageType;
513+
using Sign = fputil::Sign;
513514

514515
StorageType mantissa = init_num.mantissa;
515516
int32_t exp10 = init_num.exponent;
@@ -522,7 +523,7 @@ clinger_fast_path(ExpandedFloat<T> init_num,
522523
T float_mantissa;
523524
if constexpr (cpp::is_same_v<StorageType, cpp::UInt<128>>) {
524525
float_mantissa = static_cast<T>(fputil::DyadicFloat<128>(
525-
false, 0,
526+
Sign::POS, 0,
526527
fputil::DyadicFloat<128>::MantissaType(
527528
{uint64_t(mantissa), uint64_t(mantissa >> 64)})));
528529
} else {

libc/src/math/generic/exp.cpp

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ namespace LIBC_NAMESPACE {
3030
using fputil::DoubleDouble;
3131
using fputil::TripleDouble;
3232
using Float128 = typename fputil::DyadicFloat<128>;
33+
using Sign = fputil::Sign;
3334

3435
// log2(e)
3536
constexpr double LOG2_E = 0x1.71547652b82fep+0;
@@ -99,14 +100,18 @@ Float128 poly_approx_f128(const Float128 &dx) {
99100
using MType = typename Float128::MantissaType;
100101

101102
constexpr Float128 COEFFS_128[]{
102-
{false, -127, MType({0, 0x8000000000000000})}, // 1.0
103-
{false, -127, MType({0, 0x8000000000000000})}, // 1.0
104-
{false, -128, MType({0, 0x8000000000000000})}, // 0.5
105-
{false, -130, MType({0xaaaaaaaaaaaaaaab, 0xaaaaaaaaaaaaaaaa})}, // 1/6
106-
{false, -132, MType({0xaaaaaaaaaaaaaaab, 0xaaaaaaaaaaaaaaaa})}, // 1/24
107-
{false, -134, MType({0x8888888888888889, 0x8888888888888888})}, // 1/120
108-
{false, -137, MType({0x60b60b60b60b60b6, 0xb60b60b60b60b60b})}, // 1/720
109-
{false, -140, MType({0x00d00d00d00d00d0, 0xd00d00d00d00d00d})}, // 1/5040
103+
{Sign::POS, -127, MType({0, 0x8000000000000000})}, // 1.0
104+
{Sign::POS, -127, MType({0, 0x8000000000000000})}, // 1.0
105+
{Sign::POS, -128, MType({0, 0x8000000000000000})}, // 0.5
106+
{Sign::POS, -130, MType({0xaaaaaaaaaaaaaaab, 0xaaaaaaaaaaaaaaaa})}, // 1/6
107+
{Sign::POS, -132,
108+
MType({0xaaaaaaaaaaaaaaab, 0xaaaaaaaaaaaaaaaa})}, // 1/24
109+
{Sign::POS, -134,
110+
MType({0x8888888888888889, 0x8888888888888888})}, // 1/120
111+
{Sign::POS, -137,
112+
MType({0x60b60b60b60b60b6, 0xb60b60b60b60b60b})}, // 1/720
113+
{Sign::POS, -140,
114+
MType({0x00d00d00d00d00d0, 0xd00d00d00d00d00d})}, // 1/5040
110115
};
111116

112117
Float128 p = fputil::polyeval(dx, COEFFS_128[0], COEFFS_128[1], COEFFS_128[2],

libc/src/math/generic/exp10.cpp

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ namespace LIBC_NAMESPACE {
3030
using fputil::DoubleDouble;
3131
using fputil::TripleDouble;
3232
using Float128 = typename fputil::DyadicFloat<128>;
33+
using Sign = fputil::Sign;
3334

3435
// log2(10)
3536
constexpr double LOG2_10 = 0x1.a934f0979a371p+1;
@@ -101,14 +102,14 @@ Float128 poly_approx_f128(const Float128 &dx) {
101102
using MType = typename Float128::MantissaType;
102103

103104
constexpr Float128 COEFFS_128[]{
104-
{false, -127, MType({0, 0x8000000000000000})}, // 1.0
105-
{false, -126, MType({0xea56d62b82d30a2d, 0x935d8dddaaa8ac16})},
106-
{false, -126, MType({0x80a99ce75f4d5bdb, 0xa9a92639e753443a})},
107-
{false, -126, MType({0x6a4f9d7dbf6c9635, 0x82382c8ef1652304})},
108-
{false, -124, MType({0x345787019216c7af, 0x12bd7609fd98c44c})},
109-
{false, -127, MType({0xcc41ed7e0d27aee5, 0x450a7ff47535d889})},
110-
{false, -130, MType({0x8326bb91a6e7601d, 0xd3f6b844702d636b})},
111-
{false, -130, MType({0xfa7b46df314112a9, 0x45b937f0d05bb1cd})},
105+
{Sign::POS, -127, MType({0, 0x8000000000000000})}, // 1.0
106+
{Sign::POS, -126, MType({0xea56d62b82d30a2d, 0x935d8dddaaa8ac16})},
107+
{Sign::POS, -126, MType({0x80a99ce75f4d5bdb, 0xa9a92639e753443a})},
108+
{Sign::POS, -126, MType({0x6a4f9d7dbf6c9635, 0x82382c8ef1652304})},
109+
{Sign::POS, -124, MType({0x345787019216c7af, 0x12bd7609fd98c44c})},
110+
{Sign::POS, -127, MType({0xcc41ed7e0d27aee5, 0x450a7ff47535d889})},
111+
{Sign::POS, -130, MType({0x8326bb91a6e7601d, 0xd3f6b844702d636b})},
112+
{Sign::POS, -130, MType({0xfa7b46df314112a9, 0x45b937f0d05bb1cd})},
112113
};
113114

114115
Float128 p = fputil::polyeval(dx, COEFFS_128[0], COEFFS_128[1], COEFFS_128[2],

libc/src/math/generic/exp2.cpp

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ namespace LIBC_NAMESPACE {
3030
using fputil::DoubleDouble;
3131
using fputil::TripleDouble;
3232
using Float128 = typename fputil::DyadicFloat<128>;
33+
using Sign = fputil::Sign;
3334

3435
// Error bounds:
3536
// Errors when using double precision.
@@ -90,14 +91,14 @@ Float128 poly_approx_f128(const Float128 &dx) {
9091
using MType = typename Float128::MantissaType;
9192

9293
constexpr Float128 COEFFS_128[]{
93-
{false, -127, MType({0, 0x8000000000000000})}, // 1.0
94-
{false, -128, MType({0xc9e3b39803f2f6af, 0xb17217f7d1cf79ab})},
95-
{false, -128, MType({0xde2d60dd9c9a1d9f, 0x3d7f7bff058b1d50})},
96-
{false, -132, MType({0x9d3b15d9e7fb6897, 0xe35846b82505fc59})},
97-
{false, -134, MType({0x184462f6bcd2b9e7, 0x9d955b7dd273b94e})},
98-
{false, -137, MType({0x39ea1bb964c51a89, 0xaec3ff3c53398883})},
99-
{false, -138, MType({0x842c53418fa8ae61, 0x2861225f345c396a})},
100-
{false, -144, MType({0x7abeb5abd5ad2079, 0xffe5fe2d109a319d})},
94+
{Sign::POS, -127, MType({0, 0x8000000000000000})}, // 1.0
95+
{Sign::POS, -128, MType({0xc9e3b39803f2f6af, 0xb17217f7d1cf79ab})},
96+
{Sign::POS, -128, MType({0xde2d60dd9c9a1d9f, 0x3d7f7bff058b1d50})},
97+
{Sign::POS, -132, MType({0x9d3b15d9e7fb6897, 0xe35846b82505fc59})},
98+
{Sign::POS, -134, MType({0x184462f6bcd2b9e7, 0x9d955b7dd273b94e})},
99+
{Sign::POS, -137, MType({0x39ea1bb964c51a89, 0xaec3ff3c53398883})},
100+
{Sign::POS, -138, MType({0x842c53418fa8ae61, 0x2861225f345c396a})},
101+
{Sign::POS, -144, MType({0x7abeb5abd5ad2079, 0xffe5fe2d109a319d})},
101102
};
102103

103104
Float128 p = fputil::polyeval(dx, COEFFS_128[0], COEFFS_128[1], COEFFS_128[2],

libc/src/math/generic/expm1.cpp

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ namespace LIBC_NAMESPACE {
3838
using fputil::DoubleDouble;
3939
using fputil::TripleDouble;
4040
using Float128 = typename fputil::DyadicFloat<128>;
41+
using Sign = fputil::Sign;
4142

4243
// log2(e)
4344
constexpr double LOG2_E = 0x1.71547652b82fep+0;
@@ -109,13 +110,17 @@ Float128 poly_approx_f128(const Float128 &dx) {
109110
using MType = typename Float128::MantissaType;
110111

111112
constexpr Float128 COEFFS_128[]{
112-
{false, -127, MType({0, 0x8000000000000000})}, // 1.0
113-
{false, -128, MType({0, 0x8000000000000000})}, // 0.5
114-
{false, -130, MType({0xaaaaaaaaaaaaaaab, 0xaaaaaaaaaaaaaaaa})}, // 1/6
115-
{false, -132, MType({0xaaaaaaaaaaaaaaab, 0xaaaaaaaaaaaaaaaa})}, // 1/24
116-
{false, -134, MType({0x8888888888888889, 0x8888888888888888})}, // 1/120
117-
{false, -137, MType({0x60b60b60b60b60b6, 0xb60b60b60b60b60b})}, // 1/720
118-
{false, -140, MType({0x00d00d00d00d00d0, 0xd00d00d00d00d00d})}, // 1/5040
113+
{Sign::POS, -127, MType({0, 0x8000000000000000})}, // 1.0
114+
{Sign::POS, -128, MType({0, 0x8000000000000000})}, // 0.5
115+
{Sign::POS, -130, MType({0xaaaaaaaaaaaaaaab, 0xaaaaaaaaaaaaaaaa})}, // 1/6
116+
{Sign::POS, -132,
117+
MType({0xaaaaaaaaaaaaaaab, 0xaaaaaaaaaaaaaaaa})}, // 1/24
118+
{Sign::POS, -134,
119+
MType({0x8888888888888889, 0x8888888888888888})}, // 1/120
120+
{Sign::POS, -137,
121+
MType({0x60b60b60b60b60b6, 0xb60b60b60b60b60b})}, // 1/720
122+
{Sign::POS, -140,
123+
MType({0x00d00d00d00d00d0, 0xd00d00d00d00d00d})}, // 1/5040
119124
};
120125

121126
Float128 p = fputil::polyeval(dx, COEFFS_128[0], COEFFS_128[1], COEFFS_128[2],
@@ -165,7 +170,7 @@ Float128 expm1_f128(double x, double kd, int idx1, int idx2) {
165170
Float128 exp_mid = fputil::quick_mul(exp_mid1, exp_mid2);
166171

167172
int hi = static_cast<int>(kd) >> 12;
168-
Float128 minus_one{true, -127 - hi, MType({0, 0x8000000000000000})};
173+
Float128 minus_one{Sign::NEG, -127 - hi, MType({0, 0x8000000000000000})};
169174

170175
Float128 exp_mid_m1 = fputil::quick_add(exp_mid, minus_one);
171176

0 commit comments

Comments
 (0)