Skip to content

Commit

Permalink
Revert "[libc][NFC] Use user defined literals to build 128 and 256 bi…
Browse files Browse the repository at this point in the history
…t constants." (llvm#81771)

Reverts llvm#81746
  • Loading branch information
gchatelet authored Feb 14, 2024
1 parent 0f33c54 commit 78d401b
Show file tree
Hide file tree
Showing 16 changed files with 2,490 additions and 2,523 deletions.
10 changes: 5 additions & 5 deletions libc/src/__support/integer_literals.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,19 +22,19 @@
namespace LIBC_NAMESPACE {

LIBC_INLINE constexpr uint8_t operator""_u8(unsigned long long value) {
return static_cast<uint8_t>(value);
return value;
}

LIBC_INLINE constexpr uint16_t operator""_u16(unsigned long long value) {
return static_cast<uint16_t>(value);
return value;
}

LIBC_INLINE constexpr uint32_t operator""_u32(unsigned long long value) {
return static_cast<uint32_t>(value);
return value;
}

LIBC_INLINE constexpr uint64_t operator""_u64(unsigned long long value) {
return static_cast<uint64_t>(value);
return value;
}

namespace internal {
Expand Down Expand Up @@ -76,7 +76,7 @@ template <typename T, int base> struct DigitBuffer {
// Returns the digit for a particular character.
// Returns 255 if the character is invalid.
LIBC_INLINE static constexpr uint8_t get_digit_value(const char c) {
const auto to_lower = [](char c) -> uint8_t { return c | 32; };
const auto to_lower = [](char c) { return c | 32; };
const auto is_digit = [](char c) { return c >= '0' && c <= '9'; };
const auto is_alpha = [](char c) {
return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z');
Expand Down
40 changes: 16 additions & 24 deletions libc/src/math/generic/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -622,8 +622,6 @@ add_entrypoint_object(
DEPENDS
.common_constants
.explogxf
libc.include.errno
libc.include.math
libc.src.__support.CPP.bit
libc.src.__support.CPP.optional
libc.src.__support.FPUtil.dyadic_float
Expand All @@ -634,9 +632,10 @@ add_entrypoint_object(
libc.src.__support.FPUtil.polyeval
libc.src.__support.FPUtil.rounding_mode
libc.src.__support.FPUtil.triple_double
libc.src.__support.integer_literals
libc.src.__support.macros.optimization
libc.include.errno
libc.src.errno.errno
libc.include.math
COMPILE_OPTIONS
-O3
)
Expand Down Expand Up @@ -673,8 +672,6 @@ add_entrypoint_object(
DEPENDS
.common_constants
.explogxf
libc.include.errno
libc.include.math
libc.src.__support.CPP.bit
libc.src.__support.CPP.optional
libc.src.__support.FPUtil.dyadic_float
Expand All @@ -685,9 +682,10 @@ add_entrypoint_object(
libc.src.__support.FPUtil.polyeval
libc.src.__support.FPUtil.rounding_mode
libc.src.__support.FPUtil.triple_double
libc.src.__support.integer_literals
libc.src.__support.macros.optimization
libc.include.errno
libc.src.errno.errno
libc.include.math
COMPILE_OPTIONS
-O3
)
Expand Down Expand Up @@ -733,8 +731,6 @@ add_entrypoint_object(
DEPENDS
.common_constants
.explogxf
libc.include.errno
libc.include.math
libc.src.__support.CPP.bit
libc.src.__support.CPP.optional
libc.src.__support.FPUtil.dyadic_float
Expand All @@ -745,9 +741,10 @@ add_entrypoint_object(
libc.src.__support.FPUtil.polyeval
libc.src.__support.FPUtil.rounding_mode
libc.src.__support.FPUtil.triple_double
libc.src.__support.integer_literals
libc.src.__support.macros.optimization
libc.include.errno
libc.src.errno.errno
libc.include.math
COMPILE_OPTIONS
-O3
)
Expand Down Expand Up @@ -794,8 +791,6 @@ add_entrypoint_object(
DEPENDS
.common_constants
.explogxf
libc.include.errno
libc.include.math
libc.src.__support.CPP.bit
libc.src.__support.CPP.optional
libc.src.__support.FPUtil.dyadic_float
Expand All @@ -806,9 +801,10 @@ add_entrypoint_object(
libc.src.__support.FPUtil.polyeval
libc.src.__support.FPUtil.rounding_mode
libc.src.__support.FPUtil.triple_double
libc.src.__support.integer_literals
libc.src.__support.macros.optimization
libc.include.errno
libc.src.errno.errno
libc.include.math
COMPILE_OPTIONS
-O3
)
Expand Down Expand Up @@ -1065,13 +1061,12 @@ add_entrypoint_object(
DEPENDS
.common_constants
.log_range_reduction
libc.src.__support.FPUtil.double_double
libc.src.__support.FPUtil.dyadic_float
libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
libc.src.__support.FPUtil.multiply_add
libc.src.__support.FPUtil.polyeval
libc.src.__support.integer_literals
libc.src.__support.FPUtil.double_double
libc.src.__support.FPUtil.dyadic_float
libc.src.__support.macros.optimization
COMPILE_OPTIONS
-O3
Expand Down Expand Up @@ -1102,13 +1097,12 @@ add_entrypoint_object(
../log1p.h
DEPENDS
.common_constants
libc.src.__support.FPUtil.double_double
libc.src.__support.FPUtil.dyadic_float
libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
libc.src.__support.FPUtil.multiply_add
libc.src.__support.FPUtil.polyeval
libc.src.__support.integer_literals
libc.src.__support.FPUtil.double_double
libc.src.__support.FPUtil.dyadic_float
libc.src.__support.macros.optimization
COMPILE_OPTIONS
-O3
Expand Down Expand Up @@ -1141,13 +1135,12 @@ add_entrypoint_object(
DEPENDS
.common_constants
.log_range_reduction
libc.src.__support.FPUtil.double_double
libc.src.__support.FPUtil.dyadic_float
libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
libc.src.__support.FPUtil.multiply_add
libc.src.__support.FPUtil.polyeval
libc.src.__support.integer_literals
libc.src.__support.FPUtil.double_double
libc.src.__support.FPUtil.dyadic_float
libc.src.__support.macros.optimization
COMPILE_OPTIONS
-O3
Expand Down Expand Up @@ -1180,13 +1173,12 @@ add_entrypoint_object(
DEPENDS
.common_constants
.log_range_reduction
libc.src.__support.FPUtil.double_double
libc.src.__support.FPUtil.dyadic_float
libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
libc.src.__support.FPUtil.multiply_add
libc.src.__support.FPUtil.polyeval
libc.src.__support.integer_literals
libc.src.__support.FPUtil.double_double
libc.src.__support.FPUtil.dyadic_float
libc.src.__support.macros.optimization
COMPILE_OPTIONS
-O3
Expand Down
24 changes: 14 additions & 10 deletions libc/src/math/generic/exp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
#include "src/__support/FPUtil/rounding_mode.h"
#include "src/__support/FPUtil/triple_double.h"
#include "src/__support/common.h"
#include "src/__support/integer_literals.h"
#include "src/__support/macros/optimization.h" // LIBC_UNLIKELY

#include <errno.h>
Expand All @@ -32,7 +31,6 @@ using fputil::DoubleDouble;
using fputil::TripleDouble;
using Float128 = typename fputil::DyadicFloat<128>;
using Sign = fputil::Sign;
using LIBC_NAMESPACE::operator""_u128;

// log2(e)
constexpr double LOG2_E = 0x1.71547652b82fep+0;
Expand Down Expand Up @@ -99,15 +97,21 @@ DoubleDouble poly_approx_dd(const DoubleDouble &dx) {
// For |dx| < 2^-13 + 2^-30:
// | output - exp(dx) | < 2^-126.
Float128 poly_approx_f128(const Float128 &dx) {
using MType = typename Float128::MantissaType;

constexpr Float128 COEFFS_128[]{
{Sign::POS, -127, 0x80000000'00000000'00000000'00000000_u128}, // 1.0
{Sign::POS, -127, 0x80000000'00000000'00000000'00000000_u128}, // 1.0
{Sign::POS, -128, 0x80000000'00000000'00000000'00000000_u128}, // 0.5
{Sign::POS, -130, 0xaaaaaaaa'aaaaaaaa'aaaaaaaa'aaaaaaab_u128}, // 1/6
{Sign::POS, -132, 0xaaaaaaaa'aaaaaaaa'aaaaaaaa'aaaaaaab_u128}, // 1/24
{Sign::POS, -134, 0x88888888'88888888'88888888'88888889_u128}, // 1/120
{Sign::POS, -137, 0xb60b60b6'0b60b60b'60b60b60'b60b60b6_u128}, // 1/720
{Sign::POS, -140, 0xd00d00d0'0d00d00d'00d00d00'd00d00d0_u128}, // 1/5040
{Sign::POS, -127, MType({0, 0x8000000000000000})}, // 1.0
{Sign::POS, -127, MType({0, 0x8000000000000000})}, // 1.0
{Sign::POS, -128, MType({0, 0x8000000000000000})}, // 0.5
{Sign::POS, -130, MType({0xaaaaaaaaaaaaaaab, 0xaaaaaaaaaaaaaaaa})}, // 1/6
{Sign::POS, -132,
MType({0xaaaaaaaaaaaaaaab, 0xaaaaaaaaaaaaaaaa})}, // 1/24
{Sign::POS, -134,
MType({0x8888888888888889, 0x8888888888888888})}, // 1/120
{Sign::POS, -137,
MType({0x60b60b60b60b60b6, 0xb60b60b60b60b60b})}, // 1/720
{Sign::POS, -140,
MType({0x00d00d00d00d00d0, 0xd00d00d00d00d00d})}, // 1/5040
};

Float128 p = fputil::polyeval(dx, COEFFS_128[0], COEFFS_128[1], COEFFS_128[2],
Expand Down
20 changes: 10 additions & 10 deletions libc/src/math/generic/exp10.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
#include "src/__support/FPUtil/rounding_mode.h"
#include "src/__support/FPUtil/triple_double.h"
#include "src/__support/common.h"
#include "src/__support/integer_literals.h"
#include "src/__support/macros/optimization.h" // LIBC_UNLIKELY

#include <errno.h>
Expand All @@ -32,7 +31,6 @@ using fputil::DoubleDouble;
using fputil::TripleDouble;
using Float128 = typename fputil::DyadicFloat<128>;
using Sign = fputil::Sign;
using LIBC_NAMESPACE::operator""_u128;

// log2(10)
constexpr double LOG2_10 = 0x1.a934f0979a371p+1;
Expand Down Expand Up @@ -101,15 +99,17 @@ DoubleDouble poly_approx_dd(const DoubleDouble &dx) {
// For |dx| < 2^-14:
// | output - 10^dx | < 1.5 * 2^-124.
Float128 poly_approx_f128(const Float128 &dx) {
using MType = typename Float128::MantissaType;

constexpr Float128 COEFFS_128[]{
{Sign::POS, -127, 0x80000000'00000000'00000000'00000000_u128}, // 1.0
{Sign::POS, -126, 0x935d8ddd'aaa8ac16'ea56d62b'82d30a2d_u128},
{Sign::POS, -126, 0xa9a92639'e753443a'80a99ce7'5f4d5bdb_u128},
{Sign::POS, -126, 0x82382c8e'f1652304'6a4f9d7d'bf6c9635_u128},
{Sign::POS, -124, 0x12bd7609'fd98c44c'34578701'9216c7af_u128},
{Sign::POS, -127, 0x450a7ff4'7535d889'cc41ed7e'0d27aee5_u128},
{Sign::POS, -130, 0xd3f6b844'702d636b'8326bb91'a6e7601d_u128},
{Sign::POS, -130, 0x45b937f0'd05bb1cd'fa7b46df'314112a9_u128},
{Sign::POS, -127, MType({0, 0x8000000000000000})}, // 1.0
{Sign::POS, -126, MType({0xea56d62b82d30a2d, 0x935d8dddaaa8ac16})},
{Sign::POS, -126, MType({0x80a99ce75f4d5bdb, 0xa9a92639e753443a})},
{Sign::POS, -126, MType({0x6a4f9d7dbf6c9635, 0x82382c8ef1652304})},
{Sign::POS, -124, MType({0x345787019216c7af, 0x12bd7609fd98c44c})},
{Sign::POS, -127, MType({0xcc41ed7e0d27aee5, 0x450a7ff47535d889})},
{Sign::POS, -130, MType({0x8326bb91a6e7601d, 0xd3f6b844702d636b})},
{Sign::POS, -130, MType({0xfa7b46df314112a9, 0x45b937f0d05bb1cd})},
};

Float128 p = fputil::polyeval(dx, COEFFS_128[0], COEFFS_128[1], COEFFS_128[2],
Expand Down
20 changes: 10 additions & 10 deletions libc/src/math/generic/exp2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
#include "src/__support/FPUtil/rounding_mode.h"
#include "src/__support/FPUtil/triple_double.h"
#include "src/__support/common.h"
#include "src/__support/integer_literals.h"
#include "src/__support/macros/optimization.h" // LIBC_UNLIKELY

#include <errno.h>
Expand All @@ -32,7 +31,6 @@ using fputil::DoubleDouble;
using fputil::TripleDouble;
using Float128 = typename fputil::DyadicFloat<128>;
using Sign = fputil::Sign;
using LIBC_NAMESPACE::operator""_u128;

// Error bounds:
// Errors when using double precision.
Expand Down Expand Up @@ -90,15 +88,17 @@ DoubleDouble poly_approx_dd(const DoubleDouble &dx) {
// For |dx| < 2^-13 + 2^-30:
// | output - exp(dx) | < 2^-126.
Float128 poly_approx_f128(const Float128 &dx) {
using MType = typename Float128::MantissaType;

constexpr Float128 COEFFS_128[]{
{Sign::POS, -127, 0x80000000'00000000'00000000'00000000_u128}, // 1.0
{Sign::POS, -128, 0xb17217f7'd1cf79ab'c9e3b398'03f2f6af_u128},
{Sign::POS, -128, 0x3d7f7bff'058b1d50'de2d60dd'9c9a1d9f_u128},
{Sign::POS, -132, 0xe35846b8'2505fc59'9d3b15d9'e7fb6897_u128},
{Sign::POS, -134, 0x9d955b7d'd273b94e'184462f6'bcd2b9e7_u128},
{Sign::POS, -137, 0xaec3ff3c'53398883'39ea1bb9'64c51a89_u128},
{Sign::POS, -138, 0x2861225f'345c396a'842c5341'8fa8ae61_u128},
{Sign::POS, -144, 0xffe5fe2d'109a319d'7abeb5ab'd5ad2079_u128},
{Sign::POS, -127, MType({0, 0x8000000000000000})}, // 1.0
{Sign::POS, -128, MType({0xc9e3b39803f2f6af, 0xb17217f7d1cf79ab})},
{Sign::POS, -128, MType({0xde2d60dd9c9a1d9f, 0x3d7f7bff058b1d50})},
{Sign::POS, -132, MType({0x9d3b15d9e7fb6897, 0xe35846b82505fc59})},
{Sign::POS, -134, MType({0x184462f6bcd2b9e7, 0x9d955b7dd273b94e})},
{Sign::POS, -137, MType({0x39ea1bb964c51a89, 0xaec3ff3c53398883})},
{Sign::POS, -138, MType({0x842c53418fa8ae61, 0x2861225f345c396a})},
{Sign::POS, -144, MType({0x7abeb5abd5ad2079, 0xffe5fe2d109a319d})},
};

Float128 p = fputil::polyeval(dx, COEFFS_128[0], COEFFS_128[1], COEFFS_128[2],
Expand Down
26 changes: 15 additions & 11 deletions libc/src/math/generic/expm1.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
#include "src/__support/FPUtil/rounding_mode.h"
#include "src/__support/FPUtil/triple_double.h"
#include "src/__support/common.h"
#include "src/__support/integer_literals.h"
#include "src/__support/macros/optimization.h" // LIBC_UNLIKELY

#include <errno.h>
Expand All @@ -40,7 +39,6 @@ using fputil::DoubleDouble;
using fputil::TripleDouble;
using Float128 = typename fputil::DyadicFloat<128>;
using Sign = fputil::Sign;
using LIBC_NAMESPACE::operator""_u128;

// log2(e)
constexpr double LOG2_E = 0x1.71547652b82fep+0;
Expand Down Expand Up @@ -109,14 +107,20 @@ DoubleDouble poly_approx_dd(const DoubleDouble &dx) {
// For |dx| < 2^-13 + 2^-30:
// | output - exp(dx) | < 2^-126.
Float128 poly_approx_f128(const Float128 &dx) {
using MType = typename Float128::MantissaType;

constexpr Float128 COEFFS_128[]{
{Sign::POS, -127, 0x80000000'00000000'00000000'00000000_u128}, // 1.0
{Sign::POS, -128, 0x80000000'00000000'00000000'00000000_u128}, // 0.5
{Sign::POS, -130, 0xaaaaaaaa'aaaaaaaa'aaaaaaaa'aaaaaaab_u128}, // 1/6
{Sign::POS, -132, 0xaaaaaaaa'aaaaaaaa'aaaaaaaa'aaaaaaab_u128}, // 1/24
{Sign::POS, -134, 0x88888888'88888888'88888888'88888889_u128}, // 1/120
{Sign::POS, -137, 0xb60b60b6'0b60b60b'60b60b60'b60b60b6_u128}, // 1/720
{Sign::POS, -140, 0xd00d00d0'0d00d00d'00d00d00'd00d00d0_u128}, // 1/5040
{Sign::POS, -127, MType({0, 0x8000000000000000})}, // 1.0
{Sign::POS, -128, MType({0, 0x8000000000000000})}, // 0.5
{Sign::POS, -130, MType({0xaaaaaaaaaaaaaaab, 0xaaaaaaaaaaaaaaaa})}, // 1/6
{Sign::POS, -132,
MType({0xaaaaaaaaaaaaaaab, 0xaaaaaaaaaaaaaaaa})}, // 1/24
{Sign::POS, -134,
MType({0x8888888888888889, 0x8888888888888888})}, // 1/120
{Sign::POS, -137,
MType({0x60b60b60b60b60b6, 0xb60b60b60b60b60b})}, // 1/720
{Sign::POS, -140,
MType({0x00d00d00d00d00d0, 0xd00d00d00d00d00d})}, // 1/5040
};

Float128 p = fputil::polyeval(dx, COEFFS_128[0], COEFFS_128[1], COEFFS_128[2],
Expand All @@ -142,6 +146,7 @@ std::ostream &operator<<(std::ostream &OS, const DoubleDouble &r) {
// TODO(lntue): investigate triple-double precision implementation for this
// step.
Float128 expm1_f128(double x, double kd, int idx1, int idx2) {
using MType = typename Float128::MantissaType;
// Recalculate dx:

double t1 = fputil::multiply_add(kd, MLOG_2_EXP2_M12_HI, x); // exact
Expand All @@ -165,8 +170,7 @@ Float128 expm1_f128(double x, double kd, int idx1, int idx2) {
Float128 exp_mid = fputil::quick_mul(exp_mid1, exp_mid2);

int hi = static_cast<int>(kd) >> 12;
Float128 minus_one{Sign::NEG, -127 - hi,
0x80000000'00000000'00000000'00000000_u128};
Float128 minus_one{Sign::NEG, -127 - hi, MType({0, 0x8000000000000000})};

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

Expand Down
Loading

0 comments on commit 78d401b

Please sign in to comment.