[PATCH v4 14/21] math: Remove the SVID error handling from atanhf
Adhemerval Zanella
adhemerval.zanella@linaro.org
Wed Oct 8 13:55:14 GMT 2025
It improves latency for about 1-10% and throughput for about 5-10%.
Tested on x86_64-linux-gnu and i686-linux-gnu.
---
math/Versions | 2 +-
math/w_atanhf_compat.c | 11 ++++++++---
sysdeps/ieee754/flt-32/e_atanhf.c | 11 ++++++++++-
sysdeps/ieee754/flt-32/w_atanhf.c | 1 +
sysdeps/m68k/m680x0/fpu/w_atanhf_compat.c | 8 ++++++++
sysdeps/mach/hurd/i386/libm.abilist | 1 +
sysdeps/unix/sysv/linux/aarch64/libm.abilist | 1 +
sysdeps/unix/sysv/linux/alpha/libm.abilist | 1 +
sysdeps/unix/sysv/linux/arm/be/libm.abilist | 1 +
sysdeps/unix/sysv/linux/arm/le/libm.abilist | 1 +
sysdeps/unix/sysv/linux/hppa/libm.abilist | 1 +
sysdeps/unix/sysv/linux/i386/libm.abilist | 1 +
sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist | 1 +
sysdeps/unix/sysv/linux/microblaze/be/libm.abilist | 1 +
sysdeps/unix/sysv/linux/microblaze/le/libm.abilist | 1 +
sysdeps/unix/sysv/linux/mips/mips32/libm.abilist | 1 +
sysdeps/unix/sysv/linux/mips/mips64/libm.abilist | 1 +
.../sysv/linux/powerpc/powerpc32/fpu/libm.abilist | 1 +
.../sysv/linux/powerpc/powerpc32/nofpu/libm.abilist | 1 +
.../unix/sysv/linux/powerpc/powerpc64/be/libm.abilist | 1 +
.../unix/sysv/linux/powerpc/powerpc64/le/libm.abilist | 1 +
sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist | 1 +
sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist | 1 +
sysdeps/unix/sysv/linux/sh/be/libm.abilist | 1 +
sysdeps/unix/sysv/linux/sh/le/libm.abilist | 1 +
sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist | 1 +
sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist | 1 +
sysdeps/unix/sysv/linux/x86_64/64/libm.abilist | 1 +
sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist | 1 +
29 files changed, 52 insertions(+), 5 deletions(-)
create mode 100644 sysdeps/ieee754/flt-32/w_atanhf.c
create mode 100644 sysdeps/m68k/m680x0/fpu/w_atanhf_compat.c
diff --git a/math/Versions b/math/Versions
index 81042f34e06..e0430d8ecc7 100644
--- a/math/Versions
+++ b/math/Versions
@@ -689,6 +689,6 @@ libm {
GLIBC_2.43 {
# No SVID compatible error handling.
remainderf; remainder; log10f; lgammaf; lgammaf_r; acosf; asinf; acoshf;
- atan2f;
+ atan2f; atanhf;
}
}
diff --git a/math/w_atanhf_compat.c b/math/w_atanhf_compat.c
index b86686cd764..43232b2b3d8 100644
--- a/math/w_atanhf_compat.c
+++ b/math/w_atanhf_compat.c
@@ -21,10 +21,10 @@
#include <libm-alias-float.h>
-#if LIBM_SVID_COMPAT
+#if LIBM_SVID_COMPAT && SHLIB_COMPAT (libm, GLIBC_2_0, GLIBC_2_43)
/* wrapper atanhf */
float
-__atanhf (float x)
+__atanh_compatf (float x)
{
if (__builtin_expect (isgreaterequal (fabsf (x), 1.0f), 0)
&& _LIB_VERSION != _IEEE_)
@@ -35,5 +35,10 @@ __atanhf (float x)
return __ieee754_atanhf (x);
}
-libm_alias_float (__atanh, atanh)
+# ifdef NO_COMPAT_NEEDED
+strong_alias (__atanh_compatf, __atanhf)
+libm_alias_float (__atanh_compat, atanh)
+# else
+compat_symbol (libm, __atanh_compatf, atanhf, GLIBC_2_0);
+# endif
#endif
diff --git a/sysdeps/ieee754/flt-32/e_atanhf.c b/sysdeps/ieee754/flt-32/e_atanhf.c
index eeb1aae6a13..64512e433e7 100644
--- a/sysdeps/ieee754/flt-32/e_atanhf.c
+++ b/sysdeps/ieee754/flt-32/e_atanhf.c
@@ -27,6 +27,8 @@ SOFTWARE.
#include <math.h>
#include <stdint.h>
#include <libm-alias-finite.h>
+#include <libm-alias-float.h>
+#include <math-svid-compat.h>
#include "math_config.h"
static __attribute__((noinline)) float
@@ -42,7 +44,7 @@ as_special (float x)
}
float
-__ieee754_atanhf (float x)
+__atanhf (float x)
{
/* Calculate atanh(x) using the difference of two logarithms -- atanh(x) =
(ln(1+x) - ln(1-x))/2 */
@@ -175,4 +177,11 @@ __ieee754_atanhf (float x)
}
return ub;
}
+strong_alias (__atanhf, __ieee754_atanhf)
+#if LIBM_SVID_COMPAT
+versioned_symbol (libm, __atanhf, atanhf, GLIBC_2_43);
+libm_alias_float_other (__atanh, atanh)
+#else
+libm_alias_float (__atanh, atanh)
+#endif
libm_alias_finite (__ieee754_atanhf, __atanhf)
diff --git a/sysdeps/ieee754/flt-32/w_atanhf.c b/sysdeps/ieee754/flt-32/w_atanhf.c
new file mode 100644
index 00000000000..1cc89317007
--- /dev/null
+++ b/sysdeps/ieee754/flt-32/w_atanhf.c
@@ -0,0 +1 @@
+/* Not needed. */
diff --git a/sysdeps/m68k/m680x0/fpu/w_atanhf_compat.c b/sysdeps/m68k/m680x0/fpu/w_atanhf_compat.c
new file mode 100644
index 00000000000..1ec8434684c
--- /dev/null
+++ b/sysdeps/m68k/m680x0/fpu/w_atanhf_compat.c
@@ -0,0 +1,8 @@
+/* m68k provides an optimized __ieee754_atanhf. */
+#ifdef SHARED
+# define NO_COMPAT_NEEDED 1
+# include <math/w_atanhf_compat.c>
+#else
+# include <math-type-macros-float.h>
+# include <w_atanh_template.c>
+#endif
diff --git a/sysdeps/mach/hurd/i386/libm.abilist b/sysdeps/mach/hurd/i386/libm.abilist
index f76bdd5fe80..ebca620a208 100644
--- a/sysdeps/mach/hurd/i386/libm.abilist
+++ b/sysdeps/mach/hurd/i386/libm.abilist
@@ -1321,6 +1321,7 @@ GLIBC_2.43 acosf F
GLIBC_2.43 acoshf F
GLIBC_2.43 asinf F
GLIBC_2.43 atan2f F
+GLIBC_2.43 atanhf F
GLIBC_2.43 fmod F
GLIBC_2.43 fmodf F
GLIBC_2.43 lgammaf F
diff --git a/sysdeps/unix/sysv/linux/aarch64/libm.abilist b/sysdeps/unix/sysv/linux/aarch64/libm.abilist
index f1e243d3cb7..5babbf43ec0 100644
--- a/sysdeps/unix/sysv/linux/aarch64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/aarch64/libm.abilist
@@ -1289,6 +1289,7 @@ GLIBC_2.43 acosf F
GLIBC_2.43 acoshf F
GLIBC_2.43 asinf F
GLIBC_2.43 atan2f F
+GLIBC_2.43 atanhf F
GLIBC_2.43 lgammaf F
GLIBC_2.43 lgammaf_r F
GLIBC_2.43 log10f F
diff --git a/sysdeps/unix/sysv/linux/alpha/libm.abilist b/sysdeps/unix/sysv/linux/alpha/libm.abilist
index 0796948e0f8..d68f87f7af4 100644
--- a/sysdeps/unix/sysv/linux/alpha/libm.abilist
+++ b/sysdeps/unix/sysv/linux/alpha/libm.abilist
@@ -1448,6 +1448,7 @@ GLIBC_2.43 acosf F
GLIBC_2.43 acoshf F
GLIBC_2.43 asinf F
GLIBC_2.43 atan2f F
+GLIBC_2.43 atanhf F
GLIBC_2.43 lgammaf F
GLIBC_2.43 lgammaf_r F
GLIBC_2.43 log10f F
diff --git a/sysdeps/unix/sysv/linux/arm/be/libm.abilist b/sysdeps/unix/sysv/linux/arm/be/libm.abilist
index 410be27fbe2..4c3be38bae2 100644
--- a/sysdeps/unix/sysv/linux/arm/be/libm.abilist
+++ b/sysdeps/unix/sysv/linux/arm/be/libm.abilist
@@ -954,6 +954,7 @@ GLIBC_2.43 acosf F
GLIBC_2.43 acoshf F
GLIBC_2.43 asinf F
GLIBC_2.43 atan2f F
+GLIBC_2.43 atanhf F
GLIBC_2.43 lgammaf F
GLIBC_2.43 lgammaf_r F
GLIBC_2.43 log10f F
diff --git a/sysdeps/unix/sysv/linux/arm/le/libm.abilist b/sysdeps/unix/sysv/linux/arm/le/libm.abilist
index 410be27fbe2..4c3be38bae2 100644
--- a/sysdeps/unix/sysv/linux/arm/le/libm.abilist
+++ b/sysdeps/unix/sysv/linux/arm/le/libm.abilist
@@ -954,6 +954,7 @@ GLIBC_2.43 acosf F
GLIBC_2.43 acoshf F
GLIBC_2.43 asinf F
GLIBC_2.43 atan2f F
+GLIBC_2.43 atanhf F
GLIBC_2.43 lgammaf F
GLIBC_2.43 lgammaf_r F
GLIBC_2.43 log10f F
diff --git a/sysdeps/unix/sysv/linux/hppa/libm.abilist b/sysdeps/unix/sysv/linux/hppa/libm.abilist
index d594515e1b6..e79d15858e7 100644
--- a/sysdeps/unix/sysv/linux/hppa/libm.abilist
+++ b/sysdeps/unix/sysv/linux/hppa/libm.abilist
@@ -954,6 +954,7 @@ GLIBC_2.43 acosf F
GLIBC_2.43 acoshf F
GLIBC_2.43 asinf F
GLIBC_2.43 atan2f F
+GLIBC_2.43 atanhf F
GLIBC_2.43 lgammaf F
GLIBC_2.43 lgammaf_r F
GLIBC_2.43 log10f F
diff --git a/sysdeps/unix/sysv/linux/i386/libm.abilist b/sysdeps/unix/sysv/linux/i386/libm.abilist
index aff2dd11ba6..0aae5749431 100644
--- a/sysdeps/unix/sysv/linux/i386/libm.abilist
+++ b/sysdeps/unix/sysv/linux/i386/libm.abilist
@@ -1328,6 +1328,7 @@ GLIBC_2.43 acosf F
GLIBC_2.43 acoshf F
GLIBC_2.43 asinf F
GLIBC_2.43 atan2f F
+GLIBC_2.43 atanhf F
GLIBC_2.43 fmod F
GLIBC_2.43 fmodf F
GLIBC_2.43 lgammaf F
diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist
index 410be27fbe2..4c3be38bae2 100644
--- a/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist
@@ -954,6 +954,7 @@ GLIBC_2.43 acosf F
GLIBC_2.43 acoshf F
GLIBC_2.43 asinf F
GLIBC_2.43 atan2f F
+GLIBC_2.43 atanhf F
GLIBC_2.43 lgammaf F
GLIBC_2.43 lgammaf_r F
GLIBC_2.43 log10f F
diff --git a/sysdeps/unix/sysv/linux/microblaze/be/libm.abilist b/sysdeps/unix/sysv/linux/microblaze/be/libm.abilist
index 07e4f0c677e..733fa068e16 100644
--- a/sysdeps/unix/sysv/linux/microblaze/be/libm.abilist
+++ b/sysdeps/unix/sysv/linux/microblaze/be/libm.abilist
@@ -954,6 +954,7 @@ GLIBC_2.43 acosf F
GLIBC_2.43 acoshf F
GLIBC_2.43 asinf F
GLIBC_2.43 atan2f F
+GLIBC_2.43 atanhf F
GLIBC_2.43 lgammaf F
GLIBC_2.43 lgammaf_r F
GLIBC_2.43 log10f F
diff --git a/sysdeps/unix/sysv/linux/microblaze/le/libm.abilist b/sysdeps/unix/sysv/linux/microblaze/le/libm.abilist
index 07e4f0c677e..733fa068e16 100644
--- a/sysdeps/unix/sysv/linux/microblaze/le/libm.abilist
+++ b/sysdeps/unix/sysv/linux/microblaze/le/libm.abilist
@@ -954,6 +954,7 @@ GLIBC_2.43 acosf F
GLIBC_2.43 acoshf F
GLIBC_2.43 asinf F
GLIBC_2.43 atan2f F
+GLIBC_2.43 atanhf F
GLIBC_2.43 lgammaf F
GLIBC_2.43 lgammaf_r F
GLIBC_2.43 log10f F
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist b/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist
index 40de1a0c459..59d9fc927e9 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist
@@ -954,6 +954,7 @@ GLIBC_2.43 acosf F
GLIBC_2.43 acoshf F
GLIBC_2.43 asinf F
GLIBC_2.43 atan2f F
+GLIBC_2.43 atanhf F
GLIBC_2.43 lgammaf F
GLIBC_2.43 lgammaf_r F
GLIBC_2.43 log10f F
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist b/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist
index 02b4637c0af..f3c3f357816 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist
@@ -1289,6 +1289,7 @@ GLIBC_2.43 acosf F
GLIBC_2.43 acoshf F
GLIBC_2.43 asinf F
GLIBC_2.43 atan2f F
+GLIBC_2.43 atanhf F
GLIBC_2.43 lgammaf F
GLIBC_2.43 lgammaf_r F
GLIBC_2.43 log10f F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist
index 2741f4b043e..c8ef606cf20 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist
@@ -1101,6 +1101,7 @@ GLIBC_2.43 acosf F
GLIBC_2.43 acoshf F
GLIBC_2.43 asinf F
GLIBC_2.43 atan2f F
+GLIBC_2.43 atanhf F
GLIBC_2.43 lgammaf F
GLIBC_2.43 lgammaf_r F
GLIBC_2.43 log10f F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist
index 71f8d0cbb2c..b4ad3a696f5 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist
@@ -1100,6 +1100,7 @@ GLIBC_2.43 acosf F
GLIBC_2.43 acoshf F
GLIBC_2.43 asinf F
GLIBC_2.43 atan2f F
+GLIBC_2.43 atanhf F
GLIBC_2.43 lgammaf F
GLIBC_2.43 lgammaf_r F
GLIBC_2.43 log10f F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libm.abilist
index 234e9696304..be0c29eadc9 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libm.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libm.abilist
@@ -1094,6 +1094,7 @@ GLIBC_2.43 acosf F
GLIBC_2.43 acoshf F
GLIBC_2.43 asinf F
GLIBC_2.43 atan2f F
+GLIBC_2.43 atanhf F
GLIBC_2.43 lgammaf F
GLIBC_2.43 lgammaf_r F
GLIBC_2.43 log10f F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libm.abilist
index 36e45fb718d..5669acaa564 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libm.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libm.abilist
@@ -1478,6 +1478,7 @@ GLIBC_2.43 acosf F
GLIBC_2.43 acoshf F
GLIBC_2.43 asinf F
GLIBC_2.43 atan2f F
+GLIBC_2.43 atanhf F
GLIBC_2.43 lgammaf F
GLIBC_2.43 lgammaf_r F
GLIBC_2.43 log10f F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist
index 9e3acb10c2b..53679f9e012 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist
@@ -1392,6 +1392,7 @@ GLIBC_2.43 acosf F
GLIBC_2.43 acoshf F
GLIBC_2.43 asinf F
GLIBC_2.43 atan2f F
+GLIBC_2.43 atanhf F
GLIBC_2.43 lgammaf F
GLIBC_2.43 lgammaf_r F
GLIBC_2.43 log10f F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist
index 5e32f60a73f..8cb45ad5268 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist
@@ -1392,6 +1392,7 @@ GLIBC_2.43 acosf F
GLIBC_2.43 acoshf F
GLIBC_2.43 asinf F
GLIBC_2.43 atan2f F
+GLIBC_2.43 atanhf F
GLIBC_2.43 lgammaf F
GLIBC_2.43 lgammaf_r F
GLIBC_2.43 log10f F
diff --git a/sysdeps/unix/sysv/linux/sh/be/libm.abilist b/sysdeps/unix/sysv/linux/sh/be/libm.abilist
index 9c89c8effda..e8d4da9c49a 100644
--- a/sysdeps/unix/sysv/linux/sh/be/libm.abilist
+++ b/sysdeps/unix/sysv/linux/sh/be/libm.abilist
@@ -954,6 +954,7 @@ GLIBC_2.43 acosf F
GLIBC_2.43 acoshf F
GLIBC_2.43 asinf F
GLIBC_2.43 atan2f F
+GLIBC_2.43 atanhf F
GLIBC_2.43 lgammaf F
GLIBC_2.43 lgammaf_r F
GLIBC_2.43 log10f F
diff --git a/sysdeps/unix/sysv/linux/sh/le/libm.abilist b/sysdeps/unix/sysv/linux/sh/le/libm.abilist
index 9c89c8effda..e8d4da9c49a 100644
--- a/sysdeps/unix/sysv/linux/sh/le/libm.abilist
+++ b/sysdeps/unix/sysv/linux/sh/le/libm.abilist
@@ -954,6 +954,7 @@ GLIBC_2.43 acosf F
GLIBC_2.43 acoshf F
GLIBC_2.43 asinf F
GLIBC_2.43 atan2f F
+GLIBC_2.43 atanhf F
GLIBC_2.43 lgammaf F
GLIBC_2.43 lgammaf_r F
GLIBC_2.43 log10f F
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist
index 1d5b41e7fa8..86c0f3f7373 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist
@@ -1399,6 +1399,7 @@ GLIBC_2.43 acosf F
GLIBC_2.43 acoshf F
GLIBC_2.43 asinf F
GLIBC_2.43 atan2f F
+GLIBC_2.43 atanhf F
GLIBC_2.43 lgammaf F
GLIBC_2.43 lgammaf_r F
GLIBC_2.43 log10f F
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist
index 16a6ce4886c..1954e9f1ab4 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist
@@ -1289,6 +1289,7 @@ GLIBC_2.43 acosf F
GLIBC_2.43 acoshf F
GLIBC_2.43 asinf F
GLIBC_2.43 atan2f F
+GLIBC_2.43 atanhf F
GLIBC_2.43 lgammaf F
GLIBC_2.43 lgammaf_r F
GLIBC_2.43 log10f F
diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist
index c54d54f8ff3..abece7d9608 100644
--- a/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist
@@ -1322,6 +1322,7 @@ GLIBC_2.43 acosf F
GLIBC_2.43 acoshf F
GLIBC_2.43 asinf F
GLIBC_2.43 atan2f F
+GLIBC_2.43 atanhf F
GLIBC_2.43 lgammaf F
GLIBC_2.43 lgammaf_r F
GLIBC_2.43 log10f F
diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist
index 8bd7e0e3e1a..36b411f4e47 100644
--- a/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist
@@ -1322,6 +1322,7 @@ GLIBC_2.43 acosf F
GLIBC_2.43 acoshf F
GLIBC_2.43 asinf F
GLIBC_2.43 atan2f F
+GLIBC_2.43 atanhf F
GLIBC_2.43 lgammaf F
GLIBC_2.43 lgammaf_r F
GLIBC_2.43 log10f F
--
2.43.0
More information about the Libc-alpha
mailing list