Skip to content

Commit

Permalink
Migrate to fputil::cast
Browse files Browse the repository at this point in the history
  • Loading branch information
overmighty committed Oct 15, 2024
1 parent 2687d88 commit e21264e
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 27 deletions.
1 change: 1 addition & 0 deletions libc/src/math/generic/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1647,6 +1647,7 @@ add_entrypoint_object(
.expxf16
libc.hdr.errno_macros
libc.hdr.fenv_macros
libc.src.__support.FPUtil.cast
libc.src.__support.FPUtil.except_value_utils
libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
Expand Down
15 changes: 8 additions & 7 deletions libc/src/math/generic/exp10m1f16.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#include "src/__support/FPUtil/FEnvImpl.h"
#include "src/__support/FPUtil/FPBits.h"
#include "src/__support/FPUtil/PolyEval.h"
#include "src/__support/FPUtil/cast.h"
#include "src/__support/FPUtil/except_value_utils.h"
#include "src/__support/FPUtil/multiply_add.h"
#include "src/__support/FPUtil/rounding_mode.h"
Expand Down Expand Up @@ -103,7 +104,7 @@ LLVM_LIBC_FUNCTION(float16, exp10m1f16, (float16 x)) {
// When x >= -0x1.ce4p+1, round(10^x - 1, HP, RN) = -0x1.ffcp-1.
if (x_u <= 0xc339U) {
return fputil::round_result_slightly_down(
static_cast<float16>(-0x1.ffcp-1));
fputil::cast<float16>(-0x1.ffcp-1));
}

// When x < -0x1.ce4p+1, round(10^x - 1, HP, RN) = -1.
Expand All @@ -112,7 +113,7 @@ LLVM_LIBC_FUNCTION(float16, exp10m1f16, (float16 x)) {
case FE_DOWNWARD:
return FPBits::one(Sign::NEG).get_val();
default:
return static_cast<float16>(-0x1.ffcp-1);
return fputil::cast<float16>(-0x1.ffcp-1);
}
}

Expand All @@ -128,7 +129,7 @@ LLVM_LIBC_FUNCTION(float16, exp10m1f16, (float16 x)) {
// > display = hexadecimal;
// > P = fpminimax((10^x - 1)/x, 4, [|SG...|], [-2^-3, 2^-3]);
// > x * P;
return static_cast<float16>(
return fputil::cast<float16>(
xf * fputil::polyeval(xf, 0x1.26bb1cp+1f, 0x1.5351c8p+1f,
0x1.04704p+1f, 0x1.2ce084p+0f, 0x1.14a6bep-1f));
}
Expand All @@ -141,11 +142,11 @@ LLVM_LIBC_FUNCTION(float16, exp10m1f16, (float16 x)) {
if (LIBC_UNLIKELY((x_u & ~(0x3c00U | 0x4000U | 0x4200U | 0x4400U)) == 0)) {
switch (x_u) {
case 0x3c00U: // x = 1.0f16
return static_cast<float16>(9.0);
return fputil::cast<float16>(9.0);
case 0x4000U: // x = 2.0f16
return static_cast<float16>(99.0);
return fputil::cast<float16>(99.0);
case 0x4200U: // x = 3.0f16
return static_cast<float16>(999.0);
return fputil::cast<float16>(999.0);
}
}

Expand All @@ -155,7 +156,7 @@ LLVM_LIBC_FUNCTION(float16, exp10m1f16, (float16 x)) {
// exp10(x) = exp2((hi + mid) * log2(10)) * exp10(lo)
auto [exp2_hi_mid, exp10_lo] = exp10_range_reduction(x);
// exp10m1(x) = exp2((hi + mid) * log2(lo)) * exp10(lo) - 1
return static_cast<float16>(
return fputil::cast<float16>(
fputil::multiply_add(exp2_hi_mid, exp10_lo, -1.0f));
}

Expand Down
1 change: 1 addition & 0 deletions libc/test/src/math/smoke/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1234,6 +1234,7 @@ add_fp_unittest(
libc.hdr.fenv_macros
libc.src.errno.errno
libc.src.math.exp10m1f16
libc.src.__support.FPUtil.cast
)

add_fp_unittest(
Expand Down
44 changes: 24 additions & 20 deletions libc/test/src/math/smoke/exp10m1f16_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
//===----------------------------------------------------------------------===//

#include "hdr/fenv_macros.h"
#include "src/__support/FPUtil/cast.h"
#include "src/errno/libc_errno.h"
#include "src/math/exp10m1f16.h"
#include "test/UnitTest/FPMatcher.h"
Expand All @@ -27,7 +28,7 @@ TEST_F(LlvmLibcExp10m1f16Test, SpecialNumbers) {
EXPECT_FP_EQ_ALL_ROUNDING(inf, LIBC_NAMESPACE::exp10m1f16(inf));
EXPECT_MATH_ERRNO(0);

EXPECT_FP_EQ_ALL_ROUNDING(static_cast<float16>(-1.0),
EXPECT_FP_EQ_ALL_ROUNDING(LIBC_NAMESPACE::fputil::cast<float16>(-1.0),
LIBC_NAMESPACE::exp10m1f16(neg_inf));
EXPECT_MATH_ERRNO(0);

Expand All @@ -46,7 +47,7 @@ TEST_F(LlvmLibcExp10m1f16Test, Overflow) {
EXPECT_MATH_ERRNO(ERANGE);

// round(16 * log10(2), HP, RN);
float16 x = static_cast<float16>(0x1.344p+2);
float16 x = LIBC_NAMESPACE::fputil::cast<float16>(0x1.344p+2);

EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_NEAREST(
inf, LIBC_NAMESPACE::exp10m1f16(x), FE_OVERFLOW | FE_INEXACT);
Expand All @@ -68,42 +69,45 @@ TEST_F(LlvmLibcExp10m1f16Test, Overflow) {
TEST_F(LlvmLibcExp10m1f16Test, ResultNearNegOne) {
LIBC_NAMESPACE::libc_errno = 0;

EXPECT_FP_EQ_WITH_EXCEPTION(static_cast<float16>(-1.0),
EXPECT_FP_EQ_WITH_EXCEPTION(LIBC_NAMESPACE::fputil::cast<float16>(-1.0),
LIBC_NAMESPACE::exp10m1f16(neg_max_normal),
FE_INEXACT);

// round(-11 * log10(2), HP, RD);
float16 x = static_cast<float16>(-0x1.a8p+1);
float16 x = LIBC_NAMESPACE::fputil::cast<float16>(-0x1.a8p+1);

EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_NEAREST(
static_cast<float16>(-0x1.ffcp-1), LIBC_NAMESPACE::exp10m1f16(x),
FE_INEXACT);
LIBC_NAMESPACE::fputil::cast<float16>(-0x1.ffcp-1),
LIBC_NAMESPACE::exp10m1f16(x), FE_INEXACT);

EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_UPWARD(static_cast<float16>(-0x1.ffcp-1),
LIBC_NAMESPACE::exp10m1f16(x),
FE_INEXACT);
EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_UPWARD(
LIBC_NAMESPACE::fputil::cast<float16>(-0x1.ffcp-1),
LIBC_NAMESPACE::exp10m1f16(x), FE_INEXACT);

EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_DOWNWARD(
static_cast<float16>(-1.0), LIBC_NAMESPACE::exp10m1f16(x), FE_INEXACT);
LIBC_NAMESPACE::fputil::cast<float16>(-1.0),
LIBC_NAMESPACE::exp10m1f16(x), FE_INEXACT);

EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_TOWARD_ZERO(
static_cast<float16>(-0x1.ffcp-1), LIBC_NAMESPACE::exp10m1f16(x),
FE_INEXACT);
LIBC_NAMESPACE::fputil::cast<float16>(-0x1.ffcp-1),
LIBC_NAMESPACE::exp10m1f16(x), FE_INEXACT);

// Next float16 value below -0x1.ce4p+1.
x = static_cast<float16>(-0x1.ce8p+1);
x = LIBC_NAMESPACE::fputil::cast<float16>(-0x1.ce8p+1);

EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_NEAREST(
static_cast<float16>(-1.0), LIBC_NAMESPACE::exp10m1f16(x), FE_INEXACT);
LIBC_NAMESPACE::fputil::cast<float16>(-1.0),
LIBC_NAMESPACE::exp10m1f16(x), FE_INEXACT);

EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_UPWARD(static_cast<float16>(-0x1.ffcp-1),
LIBC_NAMESPACE::exp10m1f16(x),
FE_INEXACT);
EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_UPWARD(
LIBC_NAMESPACE::fputil::cast<float16>(-0x1.ffcp-1),
LIBC_NAMESPACE::exp10m1f16(x), FE_INEXACT);

EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_DOWNWARD(
static_cast<float16>(-1.0), LIBC_NAMESPACE::exp10m1f16(x), FE_INEXACT);
LIBC_NAMESPACE::fputil::cast<float16>(-1.0),
LIBC_NAMESPACE::exp10m1f16(x), FE_INEXACT);

EXPECT_FP_EQ_WITH_EXCEPTION_ROUNDING_TOWARD_ZERO(
static_cast<float16>(-0x1.ffcp-1), LIBC_NAMESPACE::exp10m1f16(x),
FE_INEXACT);
LIBC_NAMESPACE::fputil::cast<float16>(-0x1.ffcp-1),
LIBC_NAMESPACE::exp10m1f16(x), FE_INEXACT);
}

0 comments on commit e21264e

Please sign in to comment.