Skip to content

[libc][NFC] Make EXP_MANT_MASK an implementation detail #75810

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 12 additions & 4 deletions libc/src/__support/FPUtil/FPBits.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,11 @@ template <typename T> struct FPBits : private FloatProperties<T> {
"FPBits instantiated with invalid type.");
using typename FloatProperties<T>::StorageType;
using FloatProperties<T>::TOTAL_LEN;
using FloatProperties<T>::EXP_MANT_MASK;

private:
using FloatProperties<T>::EXP_SIG_MASK;

public:
using FloatProperties<T>::EXP_MASK;
using FloatProperties<T>::EXP_BIAS;
using FloatProperties<T>::EXP_LEN;
Expand Down Expand Up @@ -146,21 +150,25 @@ template <typename T> struct FPBits : private FloatProperties<T> {
}

LIBC_INLINE constexpr bool is_inf() const {
return (bits & EXP_MANT_MASK) == EXP_MASK;
return (bits & EXP_SIG_MASK) == EXP_MASK;
}

LIBC_INLINE constexpr bool is_nan() const {
return (bits & EXP_MANT_MASK) > EXP_MASK;
return (bits & EXP_SIG_MASK) > EXP_MASK;
}

LIBC_INLINE constexpr bool is_quiet_nan() const {
return (bits & EXP_MANT_MASK) == (EXP_MASK | QUIET_NAN_MASK);
return (bits & EXP_SIG_MASK) == (EXP_MASK | QUIET_NAN_MASK);
}

LIBC_INLINE constexpr bool is_inf_or_nan() const {
return (bits & EXP_MASK) == EXP_MASK;
}

LIBC_INLINE constexpr FPBits abs() const {
return FPBits(bits & EXP_SIG_MASK);
}

LIBC_INLINE static constexpr T zero(bool sign = false) {
return FPBits(sign ? SIGN_MASK : StorageType(0)).get_val();
}
Expand Down
5 changes: 3 additions & 2 deletions libc/src/__support/FPUtil/FloatProperties.h
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,9 @@ struct FPProperties : public internal::FPBaseProperties<fp_type> {
// The bit pattern that keeps only the *sign* part.
LIBC_INLINE_VAR static constexpr StorageType SIGN_MASK =
mask_trailing_ones<StorageType, SIGN_LEN>() << SIGN_MASK_SHIFT;
// The bit pattern that keeps only the *exponent + significand* part.
LIBC_INLINE_VAR static constexpr StorageType EXP_SIG_MASK =
mask_trailing_ones<StorageType, EXP_LEN + SIG_LEN>();
// The bit pattern that keeps only the *sign + exponent + significand* part.
LIBC_INLINE_VAR static constexpr StorageType FP_MASK =
mask_trailing_ones<StorageType, TOTAL_LEN>();
Expand Down Expand Up @@ -162,8 +165,6 @@ struct FPProperties : public internal::FPBaseProperties<fp_type> {
FRACTION_LEN + 1;
LIBC_INLINE_VAR static constexpr StorageType FRACTION_MASK =
mask_trailing_ones<StorageType, FRACTION_LEN>();
LIBC_INLINE_VAR static constexpr StorageType EXP_MANT_MASK =
EXP_MASK | SIG_MASK;

// If a number x is a NAN, then it is a quiet NAN if:
// QuietNaNMask & bits(x) != 0
Expand Down
1 change: 0 additions & 1 deletion libc/src/__support/FPUtil/x86_64/LongDoubleBits.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ namespace fputil {
template <> struct FPBits<long double> : private FloatProperties<long double> {
using typename FloatProperties<long double>::StorageType;
using FloatProperties<long double>::TOTAL_LEN;
using FloatProperties<long double>::EXP_MANT_MASK;
using FloatProperties<long double>::EXP_MASK;
using FloatProperties<long double>::EXP_BIAS;
using FloatProperties<long double>::EXP_LEN;
Expand Down
2 changes: 1 addition & 1 deletion libc/src/math/generic/acoshf.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ LLVM_LIBC_FUNCTION(float, acoshf, (float x)) {

if (LIBC_UNLIKELY(x_u >= 0x4f8ffb03)) {
// Check for exceptional values.
uint32_t x_abs = x_u & FPBits_t::EXP_MANT_MASK;
uint32_t x_abs = xbits.abs().uintval();
if (LIBC_UNLIKELY(x_abs >= 0x7f80'0000U)) {
// x is +inf or NaN.
return x;
Expand Down
2 changes: 1 addition & 1 deletion libc/src/math/generic/asinhf.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ LLVM_LIBC_FUNCTION(float, asinhf, (float x)) {
using FPBits_t = typename fputil::FPBits<float>;
FPBits_t xbits(x);
uint32_t x_u = xbits.uintval();
uint32_t x_abs = x_u & FPBits_t::EXP_MANT_MASK;
uint32_t x_abs = xbits.abs().uintval();

// |x| <= 2^-3
if (LIBC_UNLIKELY(x_abs <= 0x3e80'0000U)) {
Expand Down
2 changes: 1 addition & 1 deletion libc/src/math/generic/atanhf.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ LLVM_LIBC_FUNCTION(float, atanhf, (float x)) {
using FPBits = typename fputil::FPBits<float>;
FPBits xbits(x);
bool sign = xbits.get_sign();
uint32_t x_abs = xbits.uintval() & FPBits::EXP_MANT_MASK;
uint32_t x_abs = xbits.abs().uintval();

// |x| >= 1.0
if (LIBC_UNLIKELY(x_abs >= 0x3F80'0000U)) {
Expand Down
3 changes: 1 addition & 2 deletions libc/src/math/generic/exp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -174,11 +174,10 @@ DoubleDouble exp_double_double(double x, double kd,
// |x| <= 2^-53 or x < log(2^-1075) or x >= 0x1.6232bdd7abcd3p+9
double set_exceptional(double x) {
using FPBits = typename fputil::FPBits<double>;
using FloatProp = typename fputil::FloatProperties<double>;
FPBits xbits(x);

uint64_t x_u = xbits.uintval();
uint64_t x_abs = x_u & FloatProp::EXP_MANT_MASK;
uint64_t x_abs = xbits.abs().uintval();

// |x| <= 2^-53
if (x_abs <= 0x3ca0'0000'0000'0000ULL) {
Expand Down
3 changes: 1 addition & 2 deletions libc/src/math/generic/exp10.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -221,11 +221,10 @@ double exp10_denorm(double x) {
// * x is inf or nan
double set_exceptional(double x) {
using FPBits = typename fputil::FPBits<double>;
using FloatProp = typename fputil::FloatProperties<double>;
FPBits xbits(x);

uint64_t x_u = xbits.uintval();
uint64_t x_abs = x_u & FloatProp::EXP_MANT_MASK;
uint64_t x_abs = xbits.abs().uintval();

// |x| < log10(1 + 2^-53)
if (x_abs <= 0x3c8bcb7b1526e50e) {
Expand Down
3 changes: 1 addition & 2 deletions libc/src/math/generic/exp2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -196,11 +196,10 @@ double exp2_denorm(double x) {
// * x is inf or nan
double set_exceptional(double x) {
using FPBits = typename fputil::FPBits<double>;
using FloatProp = typename fputil::FloatProperties<double>;
FPBits xbits(x);

uint64_t x_u = xbits.uintval();
uint64_t x_abs = x_u & FloatProp::EXP_MANT_MASK;
uint64_t x_abs = xbits.abs().uintval();

// |x| < log2(1 + 2^-53)
if (x_abs <= 0x3ca71547652b82fd) {
Expand Down
3 changes: 1 addition & 2 deletions libc/src/math/generic/expm1.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -219,11 +219,10 @@ DoubleDouble exp_double_double(double x, double kd, const DoubleDouble &exp_mid,
// |x| <= 2^-53 or x < log(2^-54) or x >= 0x1.6232bdd7abcd3p+9
double set_exceptional(double x) {
using FPBits = typename fputil::FPBits<double>;
using FloatProp = typename fputil::FloatProperties<double>;
FPBits xbits(x);

uint64_t x_u = xbits.uintval();
uint64_t x_abs = x_u & FloatProp::EXP_MANT_MASK;
uint64_t x_abs = xbits.abs().uintval();

// |x| <= 2^-53.
if (x_abs <= 0x3ca0'0000'0000'0000ULL) {
Expand Down
2 changes: 1 addition & 1 deletion libc/src/math/generic/inv_trigf_utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ LIBC_INLINE double atan_eval(double x) {

FPB bs(x);
bool sign = bs.get_sign();
auto x_abs = bs.uintval() & FPB::EXP_MANT_MASK;
auto x_abs = bs.abs().uintval();

if (x_abs <= umin) {
double pe = LIBC_NAMESPACE::fputil::polyeval(
Expand Down
4 changes: 2 additions & 2 deletions libc/src/math/generic/powf.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -517,9 +517,9 @@ LLVM_LIBC_FUNCTION(float, powf, (float x, float y)) {
FloatBits xbits(x), ybits(y);

uint32_t x_u = xbits.uintval();
uint32_t x_abs = x_u & FloatProp::EXP_MANT_MASK;
uint32_t x_abs = xbits.abs().uintval();
uint32_t y_u = ybits.uintval();
uint32_t y_abs = y_u & FloatProp::EXP_MANT_MASK;
uint32_t y_abs = ybits.abs().uintval();

///////// BEGIN - Check exceptional cases ////////////////////////////////////

Expand Down
2 changes: 1 addition & 1 deletion libc/src/math/generic/sinhf.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ namespace LIBC_NAMESPACE {
LLVM_LIBC_FUNCTION(float, sinhf, (float x)) {
using FPBits = typename fputil::FPBits<float>;
FPBits xbits(x);
uint32_t x_abs = xbits.uintval() & FPBits::EXP_MANT_MASK;
uint32_t x_abs = xbits.abs().uintval();

// When |x| >= 90, or x is inf or nan
if (LIBC_UNLIKELY(x_abs >= 0x42b4'0000U || x_abs <= 0x3da0'0000U)) {
Expand Down
3 changes: 1 addition & 2 deletions libc/src/math/generic/tanhf.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,7 @@ constexpr double LOG2_E_EXP2_6 = ExpBase::LOG2_B * 2.0;
LLVM_LIBC_FUNCTION(float, tanhf, (float x)) {
using FPBits = typename fputil::FPBits<float>;
FPBits xbits(x);
uint32_t x_u = xbits.uintval();
uint32_t x_abs = x_u & FPBits::EXP_MANT_MASK;
uint32_t x_abs = xbits.abs().uintval();

// When |x| >= 15, or x is inf or nan, or |x| <= 0.078125
if (LIBC_UNLIKELY((x_abs >= 0x4170'0000U) || (x_abs <= 0x3da0'0000U))) {
Expand Down