]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
math: Use asinpif from CORE-MATH
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>
Fri, 20 Dec 2024 14:10:53 +0000 (11:10 -0300)
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>
Wed, 12 Feb 2025 19:31:57 +0000 (16:31 -0300)
The CORE-MATH implementation is correctly rounded (for any rounding mode)
and shows better performance to the generic asinpif.

The code was adapted to glibc style and to use the definition of
math_config.h (to handle errno, overflow, and underflow).

Benchtest on x64_64 (Ryzen 9 5900X, gcc 14.2.1), aarch64 (Neoverse-N1,
gcc 13.3.1), and powerpc (POWER10, gcc 13.2.1):

latency                 master        patched   improvement
x86_64                 46.4996        41.6126        10.51%
x86_64v2               46.7551        38.8235        16.96%
x86_64v3               42.6235        33.7603        20.79%
aarch64 (Neoverse)     17.4161        14.3604        17.55%
power8                 10.7347         9.0193        15.98%
power10                10.6420         9.0362        15.09%

reciprocal-throughput   master        patched   improvement
x86_64                 24.7208        16.5544        33.03%
x86_64v2               24.2177        14.8938        38.50%
x86_64v3               20.5617        10.5452        48.71%
aarch64 (Neoverse)     13.4827        7.17613        46.78%
power8                 6.46134        3.56089        44.89%
power10                5.79007        3.49544        39.63%

Reviewed-by: DJ Delorie <dj@redhat.com>
19 files changed:
SHARED-FILES
sysdeps/aarch64/libm-test-ulps
sysdeps/arc/fpu/libm-test-ulps
sysdeps/arc/nofpu/libm-test-ulps
sysdeps/arm/libm-test-ulps
sysdeps/hppa/fpu/libm-test-ulps
sysdeps/i386/fpu/libm-test-ulps
sysdeps/i386/i686/fpu/multiarch/libm-test-ulps
sysdeps/ieee754/flt-32/s_asinpif.c [new file with mode: 0644]
sysdeps/loongarch/lp64/libm-test-ulps
sysdeps/mips/mips64/libm-test-ulps
sysdeps/or1k/fpu/libm-test-ulps
sysdeps/or1k/nofpu/libm-test-ulps
sysdeps/powerpc/fpu/libm-test-ulps
sysdeps/riscv/nofpu/libm-test-ulps
sysdeps/riscv/rvd/libm-test-ulps
sysdeps/s390/fpu/libm-test-ulps
sysdeps/sparc/fpu/libm-test-ulps
sysdeps/x86_64/fpu/libm-test-ulps

index 3fde72644a45d888f10f5d3c66e97a55d1c92eb5..e700f4b1559419f9e5cbd49364ef543d94b5c230 100644 (file)
@@ -338,3 +338,7 @@ sysdeps/ieee754/flt-32/s_acospif.c:
   (src/binary32/acospi/acospif.c in CORE-MATH)
   - the code was adapted to use glibc code style and internal
     functions to handle errno, overflow, and underflow.
+sysdeps/ieee754/flt-32/s_asinpif.c:
+  (src/binary32/asinpi/asinpif.c in CORE-MATH)
+  - the code was adapted to use glibc code style and internal
+    functions to handle errno, overflow, and underflow.
index 1a403d95b6d366c64034a174c14f3c1a34d6ea25..abb0611ee5c20c5eb90dddc9d04f752231216681 100644 (file)
@@ -115,22 +115,18 @@ ldouble: 4
 
 Function: "asinpi":
 double: 1
-float: 1
 ldouble: 2
 
 Function: "asinpi_downward":
 double: 1
-float: 1
 ldouble: 2
 
 Function: "asinpi_towardzero":
 double: 1
-float: 2
 ldouble: 1
 
 Function: "asinpi_upward":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "atan":
index c0c5daa5899b5392be3ccd32280a2f38dd9ed9f6..35aebba38a95e77c27a2d418271445c6953166db 100644 (file)
@@ -63,19 +63,15 @@ double: 3
 
 Function: "asinpi":
 double: 1
-float: 1
 
 Function: "asinpi_downward":
 double: 1
-float: 1
 
 Function: "asinpi_towardzero":
 double: 1
-float: 2
 
 Function: "asinpi_upward":
 double: 2
-float: 2
 
 Function: "atan":
 double: 1
index 2b34f5a0abed0e1b9694ac48f55c79860ff31abf..325546e582216e519dcc54ffd70617c6e0a8fa40 100644 (file)
@@ -18,7 +18,6 @@ double: 2
 
 Function: "asinpi":
 double: 1
-float: 1
 
 Function: "atan":
 double: 1
index afb0532a66984234ae7ec42ec4cf45199bdb34e9..0927fdb980442e644793926a7d93f8825467c740 100644 (file)
@@ -63,19 +63,15 @@ double: 3
 
 Function: "asinpi":
 double: 1
-float: 1
 
 Function: "asinpi_downward":
 double: 1
-float: 1
 
 Function: "asinpi_towardzero":
 double: 1
-float: 2
 
 Function: "asinpi_upward":
 double: 2
-float: 2
 
 Function: "atan":
 double: 1
index b9959c8a12c1af1acbe6bae2e8c752dddf0605e8..02cc3b5ddccdcd0ea70803b45a433a33166904e5 100644 (file)
@@ -63,19 +63,15 @@ double: 3
 
 Function: "asinpi":
 double: 1
-float: 1
 
 Function: "asinpi_downward":
 double: 1
-float: 1
 
 Function: "asinpi_towardzero":
 double: 1
-float: 2
 
 Function: "asinpi_upward":
 double: 2
-float: 2
 
 Function: "atan":
 double: 1
index 85c58f34e990c8c570188614e578a3c916357d26..69d0eb1eec5eb90c68cd46dc7a3bb27dc89538f0 100644 (file)
@@ -101,25 +101,21 @@ ldouble: 5
 
 Function: "asinpi":
 double: 1
-float: 1
 float128: 2
 ldouble: 2
 
 Function: "asinpi_downward":
 double: 2
-float: 1
 float128: 2
 ldouble: 2
 
 Function: "asinpi_towardzero":
 double: 1
-float: 2
 float128: 1
 ldouble: 2
 
 Function: "asinpi_upward":
 double: 2
-float: 2
 float128: 2
 ldouble: 2
 
index bc14e7e115ef9d2a2873921b4d18a0fe68eeb0e4..392d7d252c2c71ae32f9e85bee9ca40927ec793f 100644 (file)
@@ -101,25 +101,21 @@ ldouble: 5
 
 Function: "asinpi":
 double: 1
-float: 1
 float128: 2
 ldouble: 2
 
 Function: "asinpi_downward":
 double: 2
-float: 1
 float128: 2
 ldouble: 2
 
 Function: "asinpi_towardzero":
 double: 1
-float: 2
 float128: 1
 ldouble: 2
 
 Function: "asinpi_upward":
 double: 2
-float: 2
 float128: 2
 ldouble: 2
 
diff --git a/sysdeps/ieee754/flt-32/s_asinpif.c b/sysdeps/ieee754/flt-32/s_asinpif.c
new file mode 100644 (file)
index 0000000..5e97a34
--- /dev/null
@@ -0,0 +1,137 @@
+/* Correctly-rounded half-revolution arc-sine function for binary32 value.
+
+Copyright (c) 2022-2025 Alexei Sibidanov.
+
+The original version of this file was copied from the CORE-MATH
+project (file src/binary32/asinpi/asinpif.c, revision 6ee58266).
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+*/
+
+#include <errno.h>
+#include <math.h>
+#include <stdint.h>
+#include <libm-alias-float.h>
+#include "math_config.h"
+
+float
+__asinpif (float x)
+{
+  float ax = fabsf (x);
+  double az = ax;
+  double z = x;
+  uint32_t t = asuint (x);
+  int32_t e = (t >> 23) & 0xff;
+  if (__glibc_unlikely (e >= 127))
+    {
+      if (ax == 1.0f)
+       return copysignf (0.5f, x);
+      if (e == 0xff && (t << 9))
+       return x + x; /* nan */
+      return __math_edomf ((x - x) / (x - x)); /* nan */
+    }
+  int32_t s = 146 - e;
+  int32_t i = 0;
+  /* s<32 corresponds to |x| >= 2^-12 */
+  if (__glibc_likely (s < 32))
+    i = ((t & (~0u >> 9)) | 1 << 23) >> s;
+  static const double ch[][8] =
+    {
+      {  0x1.45f306dc9c882p-2,   0x1.b2995e7b7dc2fp-5,  0x1.8723a1cf50c7ep-6,
+        0x1.d1a4591d16a29p-7,   0x1.3ce3aa68ddaeep-7,  0x1.d3182ab0cc1bfp-8,
+        0x1.62b379a8b88e3p-8,   0x1.6811411fcfec2p-8 },
+      {  0x1.ffffffffd3cdap-2,  -0x1.17cc1b3355fddp-4,  0x1.d067a1e8d5a99p-6,
+       -0x1.08e16fb09314ap-6,   0x1.5eed43d42dcb2p-7, -0x1.f58baca7acc71p-8,
+        0x1.5dab64e2dcf15p-8,  -0x1.59270e30797acp-9 },
+      {  0x1.fffffff7c4617p-2,  -0x1.17cc149ded3a2p-4,  0x1.d0654d4cb2c1ap-6,
+       -0x1.08c3ba713d33ap-6,   0x1.5d2053481079cp-7, -0x1.e485ebc545e7ep-8,
+        0x1.303baca167dddp-8,  -0x1.dee8d16d06b38p-10 },
+      {  0x1.ffffffa749848p-2,  -0x1.17cbe7155935p-4,   0x1.d05a312269adfp-6,
+       -0x1.0862b3ee617d7p-6,   0x1.5920708db2a73p-7, -0x1.cb0463b3862c3p-8,
+        0x1.02b82478f95d7p-8,  -0x1.52a7b8579e729p-10 },
+      {  0x1.fffffe1f92bb5p-2,  -0x1.17cb3e74c64e3p-4,  0x1.d03af67311cbfp-6,
+       -0x1.079441cbfc7ap-6,    0x1.52b4287805a61p-7, -0x1.ac3286d604a98p-8,
+        0x1.b2f1210d9701bp-9,  -0x1.e740ddc25afd6p-11 },
+      {  0x1.fffff92beb6e2p-2,  -0x1.17c986fe9518bp-4,  0x1.cff98167c9a5ep-6,
+       -0x1.0638b591eae52p-6,   0x1.4a0803828959ep-7, -0x1.8adeca229f11dp-8,
+        0x1.6b9a7ba05dfcep-9,  -0x1.640521a43b2dp-11 },
+      {  0x1.ffffeccee5bfcp-2,  -0x1.17c5f1753f5eap-4,  0x1.cf874e4fe258fp-6,
+       -0x1.043e6cf77b256p-6,   0x1.3f7db42227d92p-7, -0x1.691a6fa2a2882p-8,
+        0x1.2f6543162bc61p-9,  -0x1.07d5da05822b6p-11 },
+      {  0x1.ffffd2f64431dp-2,  -0x1.17bf8208c10c1p-4,  0x1.ced7487cdb124p-6,
+       -0x1.01a0d30932905p-6,   0x1.3388f99b254dap-7, -0x1.4844e245c65bdp-8,
+        0x1.fa777150197c6p-10, -0x1.8c1ecf16a05c8p-12 },
+      {  0x1.ffffa36d1712ep-2,  -0x1.17b523971bd4ep-4,  0x1.cddee26de2deep-6,
+       -0x1.fccb00abaaabcp-7,   0x1.269afc3622342p-7, -0x1.2933152686752p-8,
+        0x1.a76d4956cc9a3p-10, -0x1.2ce7d6dc651cep-12 },
+      {  0x1.ffff5402ab3a1p-2,  -0x1.17a5ba85da77ap-4,  0x1.cc96894e05c02p-6,
+       -0x1.f532143cb832ep-7,   0x1.19180b660ff09p-7, -0x1.0c57417a78b3cp-8,
+        0x1.62e26cbd7bb1ep-10, -0x1.ce28d33fe1df3p-13 },
+      {  0x1.fffed8d639751p-2,  -0x1.1790349f3ae76p-4,  0x1.caf9a4fd1b398p-6,
+       -0x1.ec986b111342ep-7,   0x1.0b53c3ad4baa4p-7, -0x1.e3c2282eeace4p-9,
+        0x1.2a55369f55bbep-10, -0x1.667fe48c396e8p-13 },
+      {  0x1.fffe24b714161p-2,  -0x1.177394fbcb719p-4,  0x1.c90652d920ebdp-6,
+       -0x1.e3239197bddf1p-7,   0x1.fb2188525b025p-8, -0x1.b3aadd451afc7p-9,
+        0x1.f74020f31fdabp-11, -0x1.18b0cb246768dp-13 },
+      {  0x1.fffd298bec9e2p-2,  -0x1.174efbfd34648p-4,  0x1.c6bcfe48ea92bp-6,
+       -0x1.d8f9f2a16157cp-7,   0x1.e0044f56c8864p-8, -0x1.883e2347fe76cp-9,
+        0x1.a9f0e3c1b7af5p-11, -0x1.bb5acc0e60825p-14 },
+      {  0x1.fffbd8b784c4dp-2,  -0x1.1721abdd3722ep-4,  0x1.c41fee756d4bp-6,
+       -0x1.ce40bccf8065fp-7,   0x1.c59b684b70ef9p-8, -0x1.6133d027996b3p-9,
+        0x1.69cad01106397p-11, -0x1.60f8e45494156p-14 },
+      {  0x1.fffa23749cf88p-2,  -0x1.16eb0a8285c06p-4,  0x1.c132d762e1b0dp-6,
+       -0x1.c31a959398f4ep-7,   0x1.ac1c5b46bc8ap-8,  -0x1.3e34f1abe51dcp-9,
+        0x1.346738737c0b9p-11, -0x1.1b227a3f5c75p-14 },
+      {  0x1.fff7fb25bb407p-2,  -0x1.16aaa14d7564p-4,   0x1.bdfa75fca5ff2p-6,
+       -0x1.b7a6e260d079cp-7,   0x1.93ab06911033cp-8, -0x1.1ee5560967fd5p-9,
+        0x1.07d31060838bfp-11, -0x1.c96f33a283115p-15
+      }
+  };
+  const double *c = ch[i];
+  double z2 = z * z;
+  double z4 = z2 * z2;
+  if (__glibc_unlikely (i == 0)) /* |x| < 2^-4 */
+    {
+      double c0 = c[0] + z2 * c[1];
+      double c2 = c[2] + z2 * c[3];
+      double c4 = c[4] + z2 * c[5];
+      double c6 = c[6] + z2 * c[7];
+      c0 += c2 * z4;
+      c4 += c6 * z4;
+      c0 += c4 * (z4 * z4);
+      if (__glibc_unlikely (ax != 0.0 && ax <= 0x1.921fb4p-126f))
+       __set_errno (ERANGE);
+      return z * c0;
+    }
+  else /* |x| >= 2^-4 */
+    {
+      double f = sqrt (1 - az);
+      double c0 = c[0] + az * c[1];
+      double c2 = c[2] + az * c[3];
+      double c4 = c[4] + az * c[5];
+      double c6 = c[6] + az * c[7];
+      c0 += c2 * z2;
+      c4 += c6 * z2;
+      c0 += c4 * z4;
+      double r = fma (-c0, copysign (f, x), copysign (0.5, x));
+      return r;
+    }
+}
+libm_alias_float (__asinpi, asinpi)
index ce84ddf1e622873fd129fc00bac61126eae64df3..33dd6718bab440c4da0e475cb7482cdd38b1b146 100644 (file)
@@ -83,22 +83,18 @@ ldouble: 4
 
 Function: "asinpi":
 double: 1
-float: 1
 ldouble: 2
 
 Function: "asinpi_downward":
 double: 1
-float: 1
 ldouble: 2
 
 Function: "asinpi_towardzero":
 double: 1
-float: 2
 ldouble: 1
 
 Function: "asinpi_upward":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "atan":
index 67c37dfd5e00ab61426f4f4fabd86fbc44d52147..869ceff928c1472e06f7cc5e8b51e2aad1a5618b 100644 (file)
@@ -83,22 +83,18 @@ ldouble: 4
 
 Function: "asinpi":
 double: 1
-float: 1
 ldouble: 2
 
 Function: "asinpi_downward":
 double: 1
-float: 1
 ldouble: 2
 
 Function: "asinpi_towardzero":
 double: 1
-float: 2
 ldouble: 1
 
 Function: "asinpi_upward":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "atan":
index d3b1036d2927874371d8d77207b36578ea1784ec..75db236e093e9bf2d390eb0e22c69887d822172c 100644 (file)
@@ -63,19 +63,15 @@ double: 3
 
 Function: "asinpi":
 double: 1
-float: 1
 
 Function: "asinpi_downward":
 double: 1
-float: 1
 
 Function: "asinpi_towardzero":
 double: 1
-float: 2
 
 Function: "asinpi_upward":
 double: 2
-float: 2
 
 Function: "atan":
 double: 1
index 14b7e0f3f9f7ace00cb7bc2bd470561804359026..a1f7c800979989a18b90f2ef4c97a0172c655c2d 100644 (file)
@@ -54,7 +54,6 @@ double: 3
 
 Function: "asinpi":
 double: 1
-float: 1
 
 Function: "atan":
 double: 1
index c9c86de1470f3d63859854f61a083d68686a16c4..fa3cf2e844104a72843015abd7c59a42bbbfed09 100644 (file)
@@ -107,25 +107,21 @@ ldouble: 7
 
 Function: "asinpi":
 double: 1
-float: 1
 float128: 1
 ldouble: 2
 
 Function: "asinpi_downward":
 double: 1
-float: 1
 float128: 2
 ldouble: 4
 
 Function: "asinpi_towardzero":
 double: 1
-float: 2
 float128: 1
 ldouble: 4
 
 Function: "asinpi_upward":
 double: 2
-float: 2
 float128: 2
 ldouble: 4
 
index 6206a9531a4477dfbe93b2802b316fb9678874ab..a5184ecad93d5d9e969723a38dc7a1bd66a2ebcc 100644 (file)
@@ -71,7 +71,6 @@ ldouble: 4
 
 Function: "asinpi":
 double: 1
-float: 1
 ldouble: 2
 
 Function: "atan":
index 124ca4b71919c8fb78d0e719af489693c83ae3fb..3bfc9668d58b3772f3140b620233b38cfb6ebd86 100644 (file)
@@ -83,22 +83,18 @@ ldouble: 4
 
 Function: "asinpi":
 double: 1
-float: 1
 ldouble: 2
 
 Function: "asinpi_downward":
 double: 1
-float: 1
 ldouble: 2
 
 Function: "asinpi_towardzero":
 double: 1
-float: 2
 ldouble: 1
 
 Function: "asinpi_upward":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "atan":
index 364ccf3326e36ab38798019ce299c877eb2041a9..7d61bf1cefe6ea92eb00d4dd5ac6860df13037e8 100644 (file)
@@ -83,22 +83,18 @@ ldouble: 4
 
 Function: "asinpi":
 double: 1
-float: 1
 ldouble: 2
 
 Function: "asinpi_downward":
 double: 1
-float: 1
 ldouble: 2
 
 Function: "asinpi_towardzero":
 double: 1
-float: 2
 ldouble: 1
 
 Function: "asinpi_upward":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "atan":
index 117497200223a8ed655f381e3b44a28199b8942b..426f45893e2c3446a5f06aff088d6e0db03636d1 100644 (file)
@@ -83,22 +83,18 @@ ldouble: 4
 
 Function: "asinpi":
 double: 1
-float: 1
 ldouble: 2
 
 Function: "asinpi_downward":
 double: 1
-float: 1
 ldouble: 2
 
 Function: "asinpi_towardzero":
 double: 1
-float: 2
 ldouble: 1
 
 Function: "asinpi_upward":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "atan":
index 5ed5112b492565891a0a87bb6286dccfa2e72089..d4c4bfa42bc796886d3be09d84b383868cbd83a1 100644 (file)
@@ -180,25 +180,21 @@ float: 1
 
 Function: "asinpi":
 double: 1
-float: 1
 float128: 2
 ldouble: 2
 
 Function: "asinpi_downward":
 double: 1
-float: 1
 float128: 2
 ldouble: 2
 
 Function: "asinpi_towardzero":
 double: 1
-float: 2
 float128: 1
 ldouble: 2
 
 Function: "asinpi_upward":
 double: 2
-float: 2
 float128: 2
 ldouble: 2