-
Notifications
You must be signed in to change notification settings - Fork 12.6k
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
[libc][math][c23] Add sinhf16 and coshf16 C23 math functions #105947
Merged
Merged
Conversation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@llvm/pr-subscribers-libc Author: OverMighty (overmighty) ChangesPart of #95250. Patch is 35.19 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/105947.diff 17 Files Affected:
diff --git a/libc/config/gpu/entrypoints.txt b/libc/config/gpu/entrypoints.txt
index 7c9a509647363e..7fdebe9322c283 100644
--- a/libc/config/gpu/entrypoints.txt
+++ b/libc/config/gpu/entrypoints.txt
@@ -485,6 +485,7 @@ if(LIBC_TYPES_HAS_FLOAT16)
libc.src.math.canonicalizef16
libc.src.math.ceilf16
libc.src.math.copysignf16
+ libc.src.math.coshf16
libc.src.math.exp10f16
libc.src.math.exp10m1f16
libc.src.math.exp2f16
@@ -549,6 +550,7 @@ if(LIBC_TYPES_HAS_FLOAT16)
libc.src.math.scalbnf16
libc.src.math.setpayloadf16
libc.src.math.setpayloadsigf16
+ libc.src.math.sinhf16
libc.src.math.totalorderf16
libc.src.math.totalordermagf16
libc.src.math.truncf16
diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt
index cc09c08ba1fddf..5b984c4bcd501d 100644
--- a/libc/config/linux/x86_64/entrypoints.txt
+++ b/libc/config/linux/x86_64/entrypoints.txt
@@ -594,6 +594,7 @@ if(LIBC_TYPES_HAS_FLOAT16)
libc.src.math.canonicalizef16
libc.src.math.ceilf16
libc.src.math.copysignf16
+ libc.src.math.coshf16
libc.src.math.exp10f16
libc.src.math.exp10m1f16
libc.src.math.exp2f16
@@ -660,6 +661,7 @@ if(LIBC_TYPES_HAS_FLOAT16)
libc.src.math.scalbnf16
libc.src.math.setpayloadf16
libc.src.math.setpayloadsigf16
+ libc.src.math.sinhf16
libc.src.math.totalorderf16
libc.src.math.totalordermagf16
libc.src.math.truncf16
diff --git a/libc/docs/math/index.rst b/libc/docs/math/index.rst
index 19f933ed2fe2b5..6f17d4fa022c9a 100644
--- a/libc/docs/math/index.rst
+++ b/libc/docs/math/index.rst
@@ -274,7 +274,7 @@ Higher Math Functions
+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+
| cos | |check| | |check| | | | | 7.12.4.5 | F.10.1.5 |
+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+
-| cosh | |check| | | | | | 7.12.5.4 | F.10.2.4 |
+| cosh | |check| | | | |check| | | 7.12.5.4 | F.10.2.4 |
+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+
| cospi | |check| | | | | | 7.12.4.12 | F.10.1.12 |
+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+
@@ -336,7 +336,7 @@ Higher Math Functions
+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+
| sincos | |check| | |check| | | | | | |
+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+
-| sinh | |check| | | | | | 7.12.5.5 | F.10.2.5 |
+| sinh | |check| | | | |check| | | 7.12.5.5 | F.10.2.5 |
+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+
| sinpi | |check| | | | | | 7.12.4.13 | F.10.1.13 |
+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+
diff --git a/libc/spec/stdc.td b/libc/spec/stdc.td
index 3415e5755c88c4..71c0c0364eecdf 100644
--- a/libc/spec/stdc.td
+++ b/libc/spec/stdc.td
@@ -706,7 +706,11 @@ def StdC : StandardSpec<"stdc"> {
FunctionSpec<"pow", RetValSpec<DoubleType>, [ArgSpec<DoubleType>, ArgSpec<DoubleType>]>,
FunctionSpec<"coshf", RetValSpec<FloatType>, [ArgSpec<FloatType>]>,
+ GuardedFunctionSpec<"coshf16", RetValSpec<Float16Type>, [ArgSpec<Float16Type>], "LIBC_TYPES_HAS_FLOAT16">,
+
FunctionSpec<"sinhf", RetValSpec<FloatType>, [ArgSpec<FloatType>]>,
+ GuardedFunctionSpec<"sinhf16", RetValSpec<Float16Type>, [ArgSpec<Float16Type>], "LIBC_TYPES_HAS_FLOAT16">,
+
FunctionSpec<"tanhf", RetValSpec<FloatType>, [ArgSpec<FloatType>]>,
FunctionSpec<"acosf", RetValSpec<FloatType>, [ArgSpec<FloatType>]>,
diff --git a/libc/src/math/CMakeLists.txt b/libc/src/math/CMakeLists.txt
index 2a3c15efb379a7..a9b866a31411e5 100644
--- a/libc/src/math/CMakeLists.txt
+++ b/libc/src/math/CMakeLists.txt
@@ -83,8 +83,11 @@ add_math_entrypoint_object(copysignf128)
add_math_entrypoint_object(cos)
add_math_entrypoint_object(cosf)
+
add_math_entrypoint_object(cosh)
add_math_entrypoint_object(coshf)
+add_math_entrypoint_object(coshf16)
+
add_math_entrypoint_object(cospif)
add_math_entrypoint_object(daddl)
@@ -468,6 +471,7 @@ add_math_entrypoint_object(sinpif)
add_math_entrypoint_object(sinh)
add_math_entrypoint_object(sinhf)
+add_math_entrypoint_object(sinhf16)
add_math_entrypoint_object(sqrt)
add_math_entrypoint_object(sqrtf)
diff --git a/libc/src/math/coshf16.h b/libc/src/math/coshf16.h
new file mode 100644
index 00000000000000..55c9d4941d4ae1
--- /dev/null
+++ b/libc/src/math/coshf16.h
@@ -0,0 +1,21 @@
+//===-- Implementation header for coshf16 -----------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SRC_MATH_COSHF16_H
+#define LLVM_LIBC_SRC_MATH_COSHF16_H
+
+#include "src/__support/macros/config.h"
+#include "src/__support/macros/properties/types.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+float16 coshf16(float16 x);
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC_MATH_COSHF16_H
diff --git a/libc/src/math/generic/CMakeLists.txt b/libc/src/math/generic/CMakeLists.txt
index 5199d8304f3ef9..12188eaf344f77 100644
--- a/libc/src/math/generic/CMakeLists.txt
+++ b/libc/src/math/generic/CMakeLists.txt
@@ -4084,6 +4084,25 @@ add_entrypoint_object(
-O3
)
+add_entrypoint_object(
+ coshf16
+ SRCS
+ coshf16.cpp
+ HDRS
+ ../coshf16.h
+ DEPENDS
+ .expxf16
+ libc.hdr.errno_macros
+ libc.hdr.fenv_macros
+ libc.src.__support.FPUtil.except_value_utils
+ libc.src.__support.FPUtil.fenv_impl
+ libc.src.__support.FPUtil.fp_bits
+ libc.src.__support.FPUtil.rounding_mode
+ libc.src.__support.macros.optimization
+ COMPILE_OPTIONS
+ -O3
+)
+
add_entrypoint_object(
sinhf
SRCS
@@ -4099,6 +4118,25 @@ add_entrypoint_object(
-O3
)
+add_entrypoint_object(
+ sinhf16
+ SRCS
+ sinhf16.cpp
+ HDRS
+ ../sinhf16.h
+ DEPENDS
+ .expxf16
+ libc.hdr.errno_macros
+ libc.hdr.fenv_macros
+ libc.src.__support.FPUtil.except_value_utils
+ libc.src.__support.FPUtil.fenv_impl
+ libc.src.__support.FPUtil.fp_bits
+ libc.src.__support.FPUtil.rounding_mode
+ libc.src.__support.macros.optimization
+ COMPILE_OPTIONS
+ -O3
+)
+
add_entrypoint_object(
tanhf
SRCS
diff --git a/libc/src/math/generic/coshf16.cpp b/libc/src/math/generic/coshf16.cpp
new file mode 100644
index 00000000000000..cca7581c70e0e3
--- /dev/null
+++ b/libc/src/math/generic/coshf16.cpp
@@ -0,0 +1,103 @@
+//===-- Half-precision cosh(x) function -----------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/math/coshf16.h"
+#include "expxf16.h"
+#include "hdr/errno_macros.h"
+#include "hdr/fenv_macros.h"
+#include "src/__support/FPUtil/FEnvImpl.h"
+#include "src/__support/FPUtil/FPBits.h"
+#include "src/__support/FPUtil/except_value_utils.h"
+#include "src/__support/FPUtil/rounding_mode.h"
+#include "src/__support/common.h"
+#include "src/__support/macros/config.h"
+#include "src/__support/macros/optimization.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+static constexpr fputil::ExceptValues<float16, 9> COSHF16_EXCEPTS_POS = {{
+ // x = 0x1.6ap-5, coshf16(x) = 0x1p+0 (RZ)
+ {0x29a8U, 0x3c00U, 1U, 0U, 1U},
+ // x = 0x1.8c4p+0, coshf16(x) = 0x1.3a8p+1 (RZ)
+ {0x3e31U, 0x40eaU, 1U, 0U, 0U},
+ // x = 0x1.994p+0, coshf16(x) = 0x1.498p+1 (RZ)
+ {0x3e65U, 0x4126U, 1U, 0U, 0U},
+ // x = 0x1.b6p+0, coshf16(x) = 0x1.6d8p+1 (RZ)
+ {0x3ed8U, 0x41b6U, 1U, 0U, 1U},
+ // x = 0x1.aap+1, coshf16(x) = 0x1.be8p+3 (RZ)
+ {0x42a8U, 0x4afaU, 1U, 0U, 1U},
+ // x = 0x1.cc4p+1, coshf16(x) = 0x1.23cp+4 (RZ)
+ {0x4331U, 0x4c8fU, 1U, 0U, 0U},
+ // x = 0x1.288p+2, coshf16(x) = 0x1.9b4p+5 (RZ)
+ {0x44a2U, 0x526dU, 1U, 0U, 0U},
+ // x = 0x1.958p+2, coshf16(x) = 0x1.1a4p+8 (RZ)
+ {0x4656U, 0x5c69U, 1U, 0U, 0U},
+ // x = 0x1.5fp+3, coshf16(x) = 0x1.c54p+14 (RZ)
+ {0x497cU, 0x7715U, 1U, 0U, 1U},
+}};
+
+static constexpr fputil::ExceptValues<float16, 4> COSHF16_EXCEPTS_NEG = {{
+ // x = -0x1.6ap-5, coshf16(x) = 0x1p+0 (RZ)
+ {0xa9a8U, 0x3c00U, 1U, 0U, 1U},
+ // x = -0x1.b6p+0, coshf16(x) = 0x1.6d8p+1 (RZ)
+ {0xbed8U, 0x41b6U, 1U, 0U, 1U},
+ // x = -0x1.288p+2, coshf16(x) = 0x1.9b4p+5 (RZ)
+ {0xc4a2U, 0x526dU, 1U, 0U, 0U},
+ // x = -0x1.5fp+3, coshf16(x) = 0x1.c54p+14 (RZ)
+ {0xc97cU, 0x7715U, 1U, 0U, 1U},
+}};
+
+LLVM_LIBC_FUNCTION(float16, coshf16, (float16 x)) {
+ using FPBits = fputil::FPBits<float16>;
+ FPBits x_bits(x);
+
+ uint16_t x_u = x_bits.uintval();
+ uint16_t x_abs = x_u & 0x7fffU;
+
+ // When |x| >= acosh(2^16), or x is NaN.
+ if (LIBC_UNLIKELY(x_abs >= 0x49e5U)) {
+ // cosh(NaN) = NaN
+ if (x_bits.is_nan()) {
+ if (x_bits.is_signaling_nan()) {
+ fputil::raise_except_if_required(FE_INVALID);
+ return FPBits::quiet_nan().get_val();
+ }
+
+ return x;
+ }
+
+ // When |x| >= acosh(2^16).
+ if (x_abs >= 0x49e5U) {
+ // cosh(+/-inf) = +inf
+ if (x_bits.is_inf())
+ return FPBits::inf().get_val();
+
+ switch (fputil::quick_get_round()) {
+ case FE_TONEAREST:
+ case FE_UPWARD:
+ fputil::set_errno_if_required(ERANGE);
+ fputil::raise_except_if_required(FE_OVERFLOW | FE_INEXACT);
+ return FPBits::inf().get_val();
+ default:
+ return FPBits::max_normal().get_val();
+ }
+ }
+ }
+
+ if (x_bits.is_pos()) {
+ if (auto r = COSHF16_EXCEPTS_POS.lookup(x_u); LIBC_UNLIKELY(r.has_value()))
+ return r.value();
+ } else {
+ if (auto r = COSHF16_EXCEPTS_NEG.lookup(x_u); LIBC_UNLIKELY(r.has_value()))
+ return r.value();
+ }
+
+ return eval_sinh_or_cosh</*IsSinh=*/false>(x);
+}
+
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/math/generic/expxf16.h b/libc/src/math/generic/expxf16.h
index 8de329bd2ab07f..3893305d5bfa18 100644
--- a/libc/src/math/generic/expxf16.h
+++ b/libc/src/math/generic/expxf16.h
@@ -174,6 +174,119 @@ LIBC_INLINE ExpRangeReduction exp10_range_reduction(float16 x) {
return {exp2_hi_mid, exp10_lo};
}
+// Generated by Sollya with the following commands:
+// > display = hexadecimal;
+// > round(log2(exp(1)), SG, RN);
+static constexpr float LOG2F_E = 0x1.715476p+0f;
+
+// Generated by Sollya with the following commands:
+// > display = hexadecimal;
+// > round(log(2), SG, RN);
+static constexpr float LOGF_2 = 0x1.62e43p-1f;
+
+// Generated by Sollya with the following commands:
+// > display = hexadecimal;
+// > for i from 0 to 31 do printsingle(round(2^(i * 2^-5), SG, RN));
+static constexpr cpp::array<uint32_t, 32> EXP2_MID_5_BITS = {
+ 0x3f80'0000U, 0x3f82'cd87U, 0x3f85'aac3U, 0x3f88'980fU, 0x3f8b'95c2U,
+ 0x3f8e'a43aU, 0x3f91'c3d3U, 0x3f94'f4f0U, 0x3f98'37f0U, 0x3f9b'8d3aU,
+ 0x3f9e'f532U, 0x3fa2'7043U, 0x3fa5'fed7U, 0x3fa9'a15bU, 0x3fad'583fU,
+ 0x3fb1'23f6U, 0x3fb5'04f3U, 0x3fb8'fbafU, 0x3fbd'08a4U, 0x3fc1'2c4dU,
+ 0x3fc5'672aU, 0x3fc9'b9beU, 0x3fce'248cU, 0x3fd2'a81eU, 0x3fd7'44fdU,
+ 0x3fdb'fbb8U, 0x3fe0'ccdfU, 0x3fe5'b907U, 0x3fea'c0c7U, 0x3fef'e4baU,
+ 0x3ff5'257dU, 0x3ffa'83b3U,
+};
+
+// This function correctly calculates sinh(x) and cosh(x) by calculating exp(x)
+// and exp(-x) simultaneously.
+// To compute e^x, we perform the following range reduction:
+// find hi, mid, lo such that:
+// x = (hi + mid) * log(2) + lo, in which
+// hi is an integer,
+// 0 <= mid * 2^5 < 32 is an integer
+// -2^(-5) <= lo * log2(e) <= 2^-5.
+// In particular,
+// hi + mid = round(x * log2(e) * 2^5) * 2^(-5).
+// Then,
+// e^x = 2^(hi + mid) * e^lo = 2^hi * 2^mid * e^lo.
+// We store 2^mid in the lookup table EXP2_MID_5_BITS, and compute 2^hi * 2^mid
+// by adding hi to the exponent field of 2^mid.
+// e^lo is computed using a degree-3 minimax polynomial generated by Sollya:
+// e^lo ~ P(lo)
+// = 1 + lo + c2 * lo^2 + ... + c5 * lo^5
+// = (1 + c2*lo^2 + c4*lo^4) + lo * (1 + c3*lo^2 + c5*lo^4)
+// = P_even + lo * P_odd
+// To compute e^(-x), notice that:
+// e^(-x) = 2^(-(hi + mid)) * e^(-lo)
+// ~ 2^(-(hi + mid)) * P(-lo)
+// = 2^(-(hi + mid)) * (P_even - lo * P_odd)
+// So:
+// sinh(x) = (e^x - e^(-x)) / 2
+// ~ 0.5 * (2^(hi + mid) * (P_even + lo * P_odd) -
+// 2^(-(hi + mid)) * (P_even - lo * P_odd))
+// = 0.5 * (P_even * (2^(hi + mid) - 2^(-(hi + mid))) +
+// lo * P_odd * (2^(hi + mid) + 2^(-(hi + mid))))
+// And similarly:
+// cosh(x) = (e^x + e^(-x)) / 2
+// ~ 0.5 * (P_even * (2^(hi + mid) + 2^(-(hi + mid))) +
+// lo * P_odd * (2^(hi + mid) - 2^(-(hi + mid))))
+// The main point of these formulas is that the expensive part of calculating
+// the polynomials approximating lower parts of e^x and e^(-x) is shared and
+// only done once.
+template <bool IsSinh> LIBC_INLINE float16 eval_sinh_or_cosh(float16 x) {
+ float xf = x;
+ float kf = fputil::nearest_integer(xf * (LOG2F_E * 0x1.0p+5f));
+ int x_hi_mid_p = static_cast<int>(kf);
+ int x_hi_mid_m = -x_hi_mid_p;
+
+ int x_hi_p = x_hi_mid_p >> 5;
+ int x_hi_m = x_hi_mid_m >> 5;
+ int x_mid_p = x_hi_mid_p & 0x1f;
+ int x_mid_m = x_hi_mid_m & 0x1f;
+
+ uint32_t exp2_hi_mid_bits_p =
+ EXP2_MID_5_BITS[x_mid_p] +
+ static_cast<uint32_t>(x_hi_p << fputil::FPBits<float>::FRACTION_LEN);
+ uint32_t exp2_hi_mid_bits_m =
+ EXP2_MID_5_BITS[x_mid_m] +
+ static_cast<uint32_t>(x_hi_m << fputil::FPBits<float>::FRACTION_LEN);
+ // exp2_hi_mid_p = 2^(hi + mid)
+ float exp2_hi_mid_p = fputil::FPBits<float>(exp2_hi_mid_bits_p).get_val();
+ // exp2_hi_mid_m = 2^(-(hi + mid))
+ float exp2_hi_mid_m = fputil::FPBits<float>(exp2_hi_mid_bits_m).get_val();
+
+ // exp2_hi_mid_sum = 2^(hi + mid) + 2^(-(hi + mid))
+ float exp2_hi_mid_sum = exp2_hi_mid_p + exp2_hi_mid_m;
+ // exp2_hi_mid_diff = 2^(hi + mid) - 2^(-(hi + mid))
+ float exp2_hi_mid_diff = exp2_hi_mid_p - exp2_hi_mid_m;
+
+ // lo = x - (hi + mid) = round(x * log2(e) * 2^5) * log(2) * (-2^(-5)) + x
+ float lo = fputil::multiply_add(kf, LOGF_2 * -0x1.0p-5f, xf);
+ float lo_sq = lo * lo;
+
+ // Degree-3 minimax polynomial generated by Sollya with the following
+ // commands:
+ // > display = hexadecimal;
+ // > P = fpminimax(expm1(x)/x, 2, [|SG...|], [-2^-5, 2^-5]);
+ // > 1 + x * P;
+ constexpr cpp::array<float, 4> COEFFS = {0x1p+0f, 0x1p+0f, 0x1.0004p-1f,
+ 0x1.555778p-3f};
+ float half_p_odd =
+ fputil::polyeval(lo_sq, COEFFS[1] * 0.5f, COEFFS[3] * 0.5f);
+ float half_p_even =
+ fputil::polyeval(lo_sq, COEFFS[0] * 0.5f, COEFFS[2] * 0.5f);
+
+ // sinh(x) = lo * (0.5 * P_odd * (2^(hi + mid) + 2^(-(hi + mid)))) +
+ // (0.5 * P_even * (2^(hi + mid) - 2^(-(hi + mid))))
+ if constexpr (IsSinh)
+ return static_cast<float16>(fputil::multiply_add(
+ lo, half_p_odd * exp2_hi_mid_sum, half_p_even * exp2_hi_mid_diff));
+ // cosh(x) = lo * (0.5 * P_odd * (2^(hi + mid) - 2^(-(hi + mid)))) +
+ // (0.5 * P_even * (2^(hi + mid) + 2^(-(hi + mid))))
+ return static_cast<float16>(fputil::multiply_add(
+ lo, half_p_odd * exp2_hi_mid_diff, half_p_even * exp2_hi_mid_sum));
+}
+
} // namespace LIBC_NAMESPACE_DECL
#endif // LLVM_LIBC_SRC_MATH_GENERIC_EXPXF16_H
diff --git a/libc/src/math/generic/sinhf16.cpp b/libc/src/math/generic/sinhf16.cpp
new file mode 100644
index 00000000000000..e2dd009dc72c6d
--- /dev/null
+++ b/libc/src/math/generic/sinhf16.cpp
@@ -0,0 +1,144 @@
+//===-- Half-precision sinh(x) function -----------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/math/sinhf16.h"
+#include "expxf16.h"
+#include "hdr/errno_macros.h"
+#include "hdr/fenv_macros.h"
+#include "src/__support/FPUtil/FEnvImpl.h"
+#include "src/__support/FPUtil/FPBits.h"
+#include "src/__support/FPUtil/except_value_utils.h"
+#include "src/__support/FPUtil/rounding_mode.h"
+#include "src/__support/common.h"
+#include "src/__support/macros/config.h"
+#include "src/__support/macros/optimization.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+static constexpr fputil::ExceptValues<float16, 16> SINHF16_EXCEPTS_POS = {{
+ // x = 0x1.714p-5, sinhf16(x) = 0x1.714p-5 (RZ)
+ {0x29c5U, 0x29c5U, 1U, 0U, 1U},
+ // x = 0x1.25p-4, sinhf16(x) = 0x1.25p-4 (RZ)
+ {0x2c94U, 0x2c94U, 1U, 0U, 1U},
+ // x = 0x1.f5p-4, sinhf16(x) = 0x1.f64p-4 (RZ)
+ {0x2fd4U, 0x2fd9U, 1U, 0U, 0U},
+ // x = 0x1.b1cp-3, sinhf16(x) = 0x1.b4cp-3 (RZ)
+ {0x32c7U, 0x32d3U, 1U, 0U, 1U},
+ // x = 0x1.6e8p-2, sinhf16(x) = 0x1.764p-2 (RZ)
+ {0x35baU, 0x35d9U, 1U, 0U, 1U},
+ // x = 0x1.6b4p-1, sinhf16(x) = 0x1.8a4p-1 (RZ)
+ {0x39adU, 0x3a29U, 1U, 0U, 1U},
+ // x = 0x1.a58p-1, sinhf16(x) = 0x1.d68p-1 (RZ)
+ {0x3a96U, 0x3b5aU, 1U, 0U, 1U},
+ // x = 0x1.574p+0, sinhf16(x) = 0x1.c78p+0 (RZ)
+ {0x3d5dU, 0x3f1eU, 1U, 0U, 1U},
+ // x = 0x1.648p+1, sinhf16(x) = 0x1.024p+3 (RZ)
+ {0x4192U, 0x4809U, 1U, 0U, 0U},
+ // x = 0x1.cdcp+1, sinhf16(x) = 0x1.26cp+4 (RZ)
+ {0x4337U, 0x4c9bU, 1U, 0U, 0U},
+ // x = 0x1.d0cp+1, sinhf16(x) = 0x1.2d8p+4 (RZ)
+ {0x4343U, 0x4cb6U, 1U, 0U, 1U},
+ // x = 0x1.018p+2, sinhf16(x) = 0x1.bfp+4 (RZ)
+ {0x4406U, 0x4efcU, 1U, 0U, 0U},
+ // x = 0x1.2fcp+2, sinhf16(x) = 0x1.cc4p+5 (RZ)
+ {0x44bfU, 0x5331U, 1U, 0U, 1U},
+ // x = 0x1.4ecp+2, sinhf16(x) = 0x1.75cp+6 (RZ)
+ {0x453bU, 0x55d7U, 1U, 0U, 0U},
+ // x = 0x1.8a4p+2, sinhf16(x) = 0x1.d94p+7 (RZ)
+ {0x4629U, 0x5b65U, 1U, 0U, 1U},
+ // x = 0x1.5fp+3, sinhf16(x) = 0x1.c54p+14 (RZ)
+ {0x497cU, 0x7715U, 1U, 0U, 1U},
+}};
+
+static constexpr fputil::ExceptValues<float16, 12> SINHF16_EXCEPTS_NEG = {{
+ // x = -0x1.714p-5, sinhf16(x) = -0x1.714p-5 (RZ)
+ {0xa9c5U, 0xa9c5U, 0U, 1U, 1U},
+ // x = -0x1.25p-4, sinhf16(x) = -0x1.25p-4 (RZ)
+ {0xac94U, 0xac94U, 0U, 1U, 1U},
+ //...
[truncated]
|
54 tasks
overmighty
force-pushed
the
users/overmighty/libc-math-exp10m1f16
branch
from
October 15, 2024 13:12
3f11a3c
to
e21264e
Compare
overmighty
force-pushed
the
users/overmighty/libc-math-sinhf16
branch
from
October 15, 2024 13:37
9102fa2
to
199bfcb
Compare
lntue
approved these changes
Oct 15, 2024
Base automatically changed from
users/overmighty/libc-math-exp10m1f16
to
main
October 16, 2024 14:33
overmighty
force-pushed
the
users/overmighty/libc-math-sinhf16
branch
from
October 17, 2024 16:46
199bfcb
to
8a4e781
Compare
Rebased and fixed merge conflict. |
bricknerb
pushed a commit
to bricknerb/llvm-project
that referenced
this pull request
Oct 21, 2024
EricWF
pushed a commit
to efcs/llvm-project
that referenced
this pull request
Oct 22, 2024
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Part of #95250.