mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-30 17:21:10 +00:00
[libc][NFC] Make EXP_MANT_MASK
an implementation detail (#75810)
This mask is an implementation detail of `FPBits` and shouldn't really leak outside of it.
This commit is contained in:
parent
c373f58134
commit
ea43c8ee73
@ -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;
|
||||
@ -149,21 +153,25 @@ public:
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
|
@ -131,6 +131,9 @@ public:
|
||||
// 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>();
|
||||
@ -152,8 +155,6 @@ public:
|
||||
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;
|
||||
|
||||
protected:
|
||||
// If a number x is a NAN, then it is a quiet NAN if:
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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)) {
|
||||
|
@ -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)) {
|
||||
|
@ -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) {
|
||||
|
@ -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) {
|
||||
|
@ -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) {
|
||||
|
@ -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) {
|
||||
|
@ -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(
|
||||
|
@ -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 ////////////////////////////////////
|
||||
|
||||
|
@ -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)) {
|
||||
|
@ -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))) {
|
||||
|
Loading…
Reference in New Issue
Block a user