-
Notifications
You must be signed in to change notification settings - Fork 15.2k
Revert "[libc][math][c23] Implement C23 math function asinpif16" #150756
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
Conversation
)" This reverts commit eed9b4e.
|
@llvm/pr-subscribers-libc Author: OverMighty (overmighty) ChangesReverts llvm/llvm-project#146226 The MPFR test uses See https://lab.llvm.org/buildbot/#/builders/104/builds/27743 for I said I was going to revert the PR but then I forgot and just disabled Full diff: https://github.com/llvm/llvm-project/pull/150756.diff 16 Files Affected:
diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt
index fe7e055fafbe2..b2abebee017d8 100644
--- a/libc/config/linux/aarch64/entrypoints.txt
+++ b/libc/config/linux/aarch64/entrypoints.txt
@@ -660,7 +660,6 @@ if(LIBC_TYPES_HAS_FLOAT16)
list(APPEND TARGET_LIBM_ENTRYPOINTS
# math.h C23 _Float16 entrypoints
# libc.src.math.acoshf16
- libc.src.math.asinpif16
libc.src.math.canonicalizef16
libc.src.math.ceilf16
libc.src.math.copysignf16
diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt
index 0f5ec1ae444b3..5e8278e586286 100644
--- a/libc/config/linux/x86_64/entrypoints.txt
+++ b/libc/config/linux/x86_64/entrypoints.txt
@@ -703,7 +703,6 @@ if(LIBC_TYPES_HAS_FLOAT16)
libc.src.math.acospif16
libc.src.math.asinf16
libc.src.math.asinhf16
- libc.src.math.asinpif16
libc.src.math.atanf16
libc.src.math.atanhf16
libc.src.math.canonicalizef16
diff --git a/libc/docs/headers/math/index.rst b/libc/docs/headers/math/index.rst
index 5a309175b1556..9679c4a6c807f 100644
--- a/libc/docs/headers/math/index.rst
+++ b/libc/docs/headers/math/index.rst
@@ -259,7 +259,7 @@ Higher Math Functions
+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+
| asinh | |check| | | | |check| | | 7.12.5.2 | F.10.2.2 |
+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+
-| asinpi | | | | |check| | | 7.12.4.9 | F.10.1.9 |
+| asinpi | | | | | | 7.12.4.9 | F.10.1.9 |
+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+
| atan | |check| | 1 ULP | | |check| | | 7.12.4.3 | F.10.1.3 |
+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+
diff --git a/libc/include/math.yaml b/libc/include/math.yaml
index b3b91237eb0f9..007be235f4380 100644
--- a/libc/include/math.yaml
+++ b/libc/include/math.yaml
@@ -79,13 +79,6 @@ functions:
arguments:
- type: _Float16
guard: LIBC_TYPES_HAS_FLOAT16
- - name: asinpif16
- standards:
- - stdc
- return_type: _Float16
- arguments:
- - type: _Float16
- guard: LIBC_TYPES_HAS_FLOAT16
- name: atan
standards:
- stdc
diff --git a/libc/src/math/CMakeLists.txt b/libc/src/math/CMakeLists.txt
index fc064ab540d13..455ad3456573a 100644
--- a/libc/src/math/CMakeLists.txt
+++ b/libc/src/math/CMakeLists.txt
@@ -58,8 +58,6 @@ add_math_entrypoint_object(asinh)
add_math_entrypoint_object(asinhf)
add_math_entrypoint_object(asinhf16)
-add_math_entrypoint_object(asinpif16)
-
add_math_entrypoint_object(atan)
add_math_entrypoint_object(atanf)
add_math_entrypoint_object(atanf16)
diff --git a/libc/src/math/asinpif16.h b/libc/src/math/asinpif16.h
deleted file mode 100644
index b97166af63f5d..0000000000000
--- a/libc/src/math/asinpif16.h
+++ /dev/null
@@ -1,21 +0,0 @@
-//===-- Implementation header for asinpif16 ---------------------*- 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_ASINPIF16_H
-#define LLVM_LIBC_SRC_MATH_ASINPIF16_H
-
-#include "src/__support/macros/config.h"
-#include "src/__support/macros/properties/types.h"
-
-namespace LIBC_NAMESPACE_DECL {
-
-float16 asinpif16(float16 x);
-
-} // namespace LIBC_NAMESPACE_DECL
-
-#endif // LLVM_LIBC_SRC_MATH_ASINPIF16_H
diff --git a/libc/src/math/generic/CMakeLists.txt b/libc/src/math/generic/CMakeLists.txt
index 8116ee29bc73f..ecf09674b4d4c 100644
--- a/libc/src/math/generic/CMakeLists.txt
+++ b/libc/src/math/generic/CMakeLists.txt
@@ -3918,25 +3918,6 @@ add_entrypoint_object(
libc.src.__support.macros.properties.types
)
-add_entrypoint_object(
- asinpif16
- SRCS
- asinpif16.cpp
- HDRS
- ../asinpif16.h
- DEPENDS
- 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
- libc.src.__support.FPUtil.multiply_add
- libc.src.__support.FPUtil.polyeval
- libc.src.__support.FPUtil.sqrt
- libc.src.__support.macros.optimization
-)
-
add_entrypoint_object(
atanhf
SRCS
diff --git a/libc/src/math/generic/asinpif16.cpp b/libc/src/math/generic/asinpif16.cpp
deleted file mode 100644
index aabc0863ba527..0000000000000
--- a/libc/src/math/generic/asinpif16.cpp
+++ /dev/null
@@ -1,127 +0,0 @@
-//===-- Half-precision asinpif16(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/asinpif16.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/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/sqrt.h"
-#include "src/__support/macros/optimization.h"
-
-namespace LIBC_NAMESPACE_DECL {
-
-LLVM_LIBC_FUNCTION(float16, asinpif16, (float16 x)) {
- using FPBits = fputil::FPBits<float16>;
-
- FPBits xbits(x);
- bool is_neg = xbits.is_neg();
- double x_abs = fputil::cast<double>(xbits.abs().get_val());
-
- auto signed_result = [is_neg](auto r) -> auto { return is_neg ? -r : r; };
-
- if (LIBC_UNLIKELY(x_abs > 1.0)) {
- // aspinf16(NaN) = NaN
- if (xbits.is_nan()) {
- if (xbits.is_signaling_nan()) {
- fputil::raise_except_if_required(FE_INVALID);
- return FPBits::quiet_nan().get_val();
- }
- return x;
- }
-
- // 1 < |x| <= +/-inf
- fputil::raise_except_if_required(FE_INVALID);
- fputil::set_errno_if_required(EDOM);
-
- return FPBits::quiet_nan().get_val();
- }
-
- // the coefficients for the polynomial approximation of asin(x)/pi in the
- // range [0, 0.5] extracted using python-sympy
- //
- // Python code to generate the coefficients:
- // > from sympy import *
- // > import math
- // > x = symbols('x')
- // > print(series(asin(x)/math.pi, x, 0, 21))
- //
- // OUTPUT:
- //
- // 0.318309886183791*x + 0.0530516476972984*x**3 + 0.0238732414637843*x**5 +
- // 0.0142102627760621*x**7 + 0.00967087327815336*x**9 +
- // 0.00712127941391293*x**11 + 0.00552355646848375*x**13 +
- // 0.00444514782463692*x**15 + 0.00367705242846804*x**17 +
- // 0.00310721681820837*x**19 + O(x**21)
- //
- // it's very accurate in the range [0, 0.5] and has a maximum error of
- // 0.0000000000000001 in the range [0, 0.5].
- constexpr double POLY_COEFFS[] = {
- 0x1.45f306dc9c889p-2, // x^1
- 0x1.b2995e7b7b5fdp-5, // x^3
- 0x1.8723a1d588a36p-6, // x^5
- 0x1.d1a452f20430dp-7, // x^7
- 0x1.3ce52a3a09f61p-7, // x^9
- 0x1.d2b33e303d375p-8, // x^11
- 0x1.69fde663c674fp-8, // x^13
- 0x1.235134885f19bp-8, // x^15
- };
- // polynomial evaluation using horner's method
- // work only for |x| in [0, 0.5]
- auto asinpi_polyeval = [](double x) -> double {
- return x * fputil::polyeval(x * x, POLY_COEFFS[0], POLY_COEFFS[1],
- POLY_COEFFS[2], POLY_COEFFS[3], POLY_COEFFS[4],
- POLY_COEFFS[5], POLY_COEFFS[6], POLY_COEFFS[7]);
- };
-
- // if |x| <= 0.5:
- if (LIBC_UNLIKELY(x_abs <= 0.5)) {
- // Use polynomial approximation of asin(x)/pi in the range [0, 0.5]
- double result = asinpi_polyeval(fputil::cast<double>(x));
- return fputil::cast<float16>(result);
- }
-
- // If |x| > 0.5, we need to use the range reduction method:
- // y = asin(x) => x = sin(y)
- // because: sin(a) = cos(pi/2 - a)
- // therefore:
- // x = cos(pi/2 - y)
- // let z = pi/2 - y,
- // x = cos(z)
- // because: cos(2a) = 1 - 2 * sin^2(a), z = 2a, a = z/2
- // therefore:
- // cos(z) = 1 - 2 * sin^2(z/2)
- // sin(z/2) = sqrt((1 - cos(z))/2)
- // sin(z/2) = sqrt((1 - x)/2)
- // let u = (1 - x)/2
- // then:
- // sin(z/2) = sqrt(u)
- // z/2 = asin(sqrt(u))
- // z = 2 * asin(sqrt(u))
- // pi/2 - y = 2 * asin(sqrt(u))
- // y = pi/2 - 2 * asin(sqrt(u))
- // y/pi = 1/2 - 2 * asin(sqrt(u))/pi
- //
- // Finally, we can write:
- // asinpi(x) = 1/2 - 2 * asinpi(sqrt(u))
- // where u = (1 - x) /2
- // = 0.5 - 0.5 * x
- // = multiply_add(-0.5, x, 0.5)
-
- double u = fputil::multiply_add(-0.5, x_abs, 0.5);
- double asinpi_sqrt_u = asinpi_polyeval(fputil::sqrt<double>(u));
- double result = fputil::multiply_add(-2.0, asinpi_sqrt_u, 0.5);
-
- return fputil::cast<float16>(signed_result(result));
-}
-
-} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/test/src/math/CMakeLists.txt b/libc/test/src/math/CMakeLists.txt
index ea5816bd6e27e..43cde0d68873e 100644
--- a/libc/test/src/math/CMakeLists.txt
+++ b/libc/test/src/math/CMakeLists.txt
@@ -2282,17 +2282,6 @@ add_fp_unittest(
libc.src.math.asinf16
)
-add_fp_unittest(
- asinpif16_test
- NEED_MPFR
- SUITE
- libc-math-unittests
- SRCS
- asinpif16_test.cpp
- DEPENDS
- libc.src.math.asinpif16
-)
-
add_fp_unittest(
acosf_test
NEED_MPFR
diff --git a/libc/test/src/math/asinpif16_test.cpp b/libc/test/src/math/asinpif16_test.cpp
deleted file mode 100644
index 3718f39fd06a6..0000000000000
--- a/libc/test/src/math/asinpif16_test.cpp
+++ /dev/null
@@ -1,40 +0,0 @@
-//===-- Exhaustive test for asinpif16 -------------------------------------===//
-//
-// 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/asinpif16.h"
-#include "test/UnitTest/FPMatcher.h"
-#include "test/UnitTest/Test.h"
-#include "utils/MPFRWrapper/MPFRUtils.h"
-
-using LlvmLibcAsinpif16Test = LIBC_NAMESPACE::testing::FPTest<float16>;
-
-namespace mpfr = LIBC_NAMESPACE::testing::mpfr;
-
-// Range: [0, Inf]
-static constexpr uint16_t POS_START = 0x0000U;
-static constexpr uint16_t POS_STOP = 0x7c00U;
-
-// Range: [-Inf, 0]
-static constexpr uint16_t NEG_START = 0x8000U;
-static constexpr uint16_t NEG_STOP = 0xfc00U;
-
-TEST_F(LlvmLibcAsinpif16Test, PositiveRange) {
- for (uint16_t v = POS_START; v <= POS_STOP; ++v) {
- float16 x = FPBits(v).get_val();
- EXPECT_MPFR_MATCH_ALL_ROUNDING(mpfr::Operation::Asinpi, x,
- LIBC_NAMESPACE::asinpif16(x), 0.5);
- }
-}
-
-TEST_F(LlvmLibcAsinpif16Test, NegativeRange) {
- for (uint16_t v = NEG_START; v <= NEG_STOP; ++v) {
- float16 x = FPBits(v).get_val();
- EXPECT_MPFR_MATCH_ALL_ROUNDING(mpfr::Operation::Asinpi, x,
- LIBC_NAMESPACE::asinpif16(x), 0.5);
- }
-}
diff --git a/libc/test/src/math/smoke/CMakeLists.txt b/libc/test/src/math/smoke/CMakeLists.txt
index 8b54691f2cdf4..ec4c09c5b70f7 100644
--- a/libc/test/src/math/smoke/CMakeLists.txt
+++ b/libc/test/src/math/smoke/CMakeLists.txt
@@ -3988,18 +3988,6 @@ add_fp_unittest(
libc.src.math.asinhf16
)
-add_fp_unittest(
- asinpif16_test
- NEED_MPFR
- SUITE
- libc-math-unittests
- SRCS
- asinpif16_test.cpp
- DEPENDS
- libc.src.math.asinpif16
- libc.src.errno.errno
-)
-
add_fp_unittest(
acoshf_test
SUITE
diff --git a/libc/test/src/math/smoke/asinpif16_test.cpp b/libc/test/src/math/smoke/asinpif16_test.cpp
deleted file mode 100644
index 5303eed8f5dae..0000000000000
--- a/libc/test/src/math/smoke/asinpif16_test.cpp
+++ /dev/null
@@ -1,86 +0,0 @@
-//===-- Unittests for asinpif16 -------------------------------------------===//
-//
-// 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/__support/libc_errno.h"
-#include "src/math/asinpif16.h"
-#include "test/UnitTest/FPMatcher.h"
-
-using LlvmLibcAsinpif16Test = LIBC_NAMESPACE::testing::FPTest<float16>;
-
-TEST_F(LlvmLibcAsinpif16Test, SpecialNumbers) {
- // zero
- EXPECT_FP_EQ(zero, LIBC_NAMESPACE::asinpif16(zero));
-
- // +/-1
- EXPECT_FP_EQ(0.5f16, LIBC_NAMESPACE::asinpif16(1.0));
- EXPECT_FP_EQ(-0.5f16, LIBC_NAMESPACE::asinpif16(-1.0));
-
- // NaN inputs
- EXPECT_FP_EQ(FPBits::quiet_nan().get_val(),
- LIBC_NAMESPACE::asinpif16(FPBits::quiet_nan().get_val()));
-
- EXPECT_FP_EQ(FPBits::quiet_nan().get_val(),
- LIBC_NAMESPACE::asinpif16(FPBits::signaling_nan().get_val()));
-
- // infinity inputs -> should return NaN
- libc_errno = 0;
- EXPECT_FP_EQ(FPBits::quiet_nan().get_val(), LIBC_NAMESPACE::asinpif16(inf));
- EXPECT_MATH_ERRNO(EDOM);
-
- libc_errno = 0;
- EXPECT_FP_EQ(FPBits::quiet_nan().get_val(),
- LIBC_NAMESPACE::asinpif16(neg_inf));
- EXPECT_MATH_ERRNO(EDOM);
-}
-
-TEST_F(LlvmLibcAsinpif16Test, OutOfRange) {
- // Test values > 1
- libc_errno = 0;
- EXPECT_FP_EQ(FPBits::quiet_nan().get_val(),
- LIBC_NAMESPACE::asinpif16(1.5f16));
- EXPECT_MATH_ERRNO(EDOM);
-
- libc_errno = 0;
- EXPECT_FP_EQ(FPBits::quiet_nan().get_val(),
- LIBC_NAMESPACE::asinpif16(2.0f16));
- EXPECT_MATH_ERRNO(EDOM);
-
- // Test values < -1
- libc_errno = 0;
- EXPECT_FP_EQ(FPBits::quiet_nan().get_val(),
- LIBC_NAMESPACE::asinpif16(-1.5f16));
- EXPECT_MATH_ERRNO(EDOM);
-
- libc_errno = 0;
- EXPECT_FP_EQ(FPBits::quiet_nan().get_val(),
- LIBC_NAMESPACE::asinpif16(-2.0f16));
- EXPECT_MATH_ERRNO(EDOM);
-
- // Test maximum normal value (should be > 1 for float16)
- libc_errno = 0;
- EXPECT_FP_EQ(FPBits::quiet_nan().get_val(),
- LIBC_NAMESPACE::asinpif16(FPBits::max_normal().get_val()));
- EXPECT_MATH_ERRNO(EDOM);
-}
-
-TEST_F(LlvmLibcAsinpif16Test, SymmetryProperty) {
- // Test that asinpi(-x) = -asinpi(x)
- constexpr float16 TEST_VALS[] = {0.1f16, 0.25f16, 0.5f16, 0.75f16,
- 0.9f16, 0.99f16, 1.0f16};
-
- for (float16 x : TEST_VALS) {
- FPBits neg_x_bits(x);
- neg_x_bits.set_sign(Sign::NEG);
- float16 neg_x = neg_x_bits.get_val();
-
- float16 pos_result = LIBC_NAMESPACE::asinpif16(x);
- float16 neg_result = LIBC_NAMESPACE::asinpif16(neg_x);
-
- EXPECT_FP_EQ(pos_result, FPBits(neg_result).abs().get_val());
- }
-}
diff --git a/libc/utils/MPFRWrapper/MPCommon.cpp b/libc/utils/MPFRWrapper/MPCommon.cpp
index fb6e6e8af71f8..07339a06fff80 100644
--- a/libc/utils/MPFRWrapper/MPCommon.cpp
+++ b/libc/utils/MPFRWrapper/MPCommon.cpp
@@ -105,12 +105,6 @@ MPFRNumber MPFRNumber::asinh() const {
return result;
}
-MPFRNumber MPFRNumber::asinpi() const {
- MPFRNumber result(*this);
- mpfr_asinpi(result.value, value, mpfr_rounding);
- return result;
-}
-
MPFRNumber MPFRNumber::atan() const {
MPFRNumber result(*this);
mpfr_atan(result.value, value, mpfr_rounding);
diff --git a/libc/utils/MPFRWrapper/MPCommon.h b/libc/utils/MPFRWrapper/MPCommon.h
index 47d6293c06af4..8bcc69c247a34 100644
--- a/libc/utils/MPFRWrapper/MPCommon.h
+++ b/libc/utils/MPFRWrapper/MPCommon.h
@@ -189,7 +189,6 @@ class MPFRNumber {
MPFRNumber add(const MPFRNumber &b) const;
MPFRNumber asin() const;
MPFRNumber asinh() const;
- MPFRNumber asinpi() const;
MPFRNumber atan() const;
MPFRNumber atan2(const MPFRNumber &b);
MPFRNumber atanh() const;
diff --git a/libc/utils/MPFRWrapper/MPFRUtils.cpp b/libc/utils/MPFRWrapper/MPFRUtils.cpp
index c58aae75cc700..8853f96ef8f92 100644
--- a/libc/utils/MPFRWrapper/MPFRUtils.cpp
+++ b/libc/utils/MPFRWrapper/MPFRUtils.cpp
@@ -38,8 +38,6 @@ unary_operation(Operation op, InputType input, unsigned int precision,
return mpfrInput.asin();
case Operation::Asinh:
return mpfrInput.asinh();
- case Operation::Asinpi:
- return mpfrInput.asinpi();
case Operation::Atan:
return mpfrInput.atan();
case Operation::Atanh:
diff --git a/libc/utils/MPFRWrapper/MPFRUtils.h b/libc/utils/MPFRWrapper/MPFRUtils.h
index e805607328f63..45468c6cb19ae 100644
--- a/libc/utils/MPFRWrapper/MPFRUtils.h
+++ b/libc/utils/MPFRWrapper/MPFRUtils.h
@@ -30,7 +30,6 @@ enum class Operation : int {
Acospi,
Asin,
Asinh,
- Asinpi,
Atan,
Atanh,
Cbrt,
|
…m#150756) Reverts llvm#146226 The MPFR test uses `mpfr_asinpi` which requires MPFR 4.2.0 or later, but the Buildbots are running an older version of MPFR. See https://lab.llvm.org/buildbot/#/builders/104/builds/27743 for example. I said I was going to revert the PR until we have a workaround for older versions of MPFR, but then I forgot and I just disabled the entrypoints which doesn't fix the Buildbot builds.
Reverts #146226
The MPFR test uses
mpfr_asinpiwhich requires MPFR 4.2.0 or later, butthe Buildbots are running an older version of MPFR.
See https://lab.llvm.org/buildbot/#/builders/104/builds/27743 for
example.
I said I was going to revert the PR until we have a workaround for older
versions of MPFR, but then I forgot and I just disabled the entrypoints
which doesn't fix the Buildbot builds.