From f27a146409e633c73c8212ed8e38114102d9888c Mon Sep 17 00:00:00 2001 From: Adhemerval Zanella Date: Fri, 31 Oct 2025 13:08:54 -0300 Subject: [PATCH] math: Remove the SVID error handling from sinhf It improves latency for about 3-10% and throughput for about 5-15%. Tested on x86_64-linux-gnu and i686-linux-gnu. Reviewed-by: Wilco Dijkstra --- math/Versions | 1 + math/w_sinhf_compat.c | 11 +++++++--- sysdeps/ieee754/flt-32/e_sinhf.c | 22 +++++++++++-------- sysdeps/ieee754/flt-32/w_sinhf.c | 1 + sysdeps/m68k/m680x0/fpu/w_sinhf_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 + .../sysv/linux/m68k/coldfire/libm.abilist | 1 + .../sysv/linux/microblaze/be/libm.abilist | 1 + .../sysv/linux/microblaze/le/libm.abilist | 1 + .../unix/sysv/linux/mips/mips32/libm.abilist | 1 + .../unix/sysv/linux/mips/mips64/libm.abilist | 1 + .../linux/powerpc/powerpc32/fpu/libm.abilist | 1 + .../powerpc/powerpc32/nofpu/libm.abilist | 1 + .../linux/powerpc/powerpc64/be/libm.abilist | 1 + .../linux/powerpc/powerpc64/le/libm.abilist | 1 + .../unix/sysv/linux/s390/s390-32/libm.abilist | 1 + .../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 + .../sysv/linux/sparc/sparc32/libm.abilist | 1 + .../sysv/linux/sparc/sparc64/libm.abilist | 1 + .../unix/sysv/linux/x86_64/64/libm.abilist | 1 + .../unix/sysv/linux/x86_64/x32/libm.abilist | 1 + 29 files changed, 55 insertions(+), 12 deletions(-) create mode 100644 sysdeps/ieee754/flt-32/w_sinhf.c create mode 100644 sysdeps/m68k/m680x0/fpu/w_sinhf_compat.c diff --git a/math/Versions b/math/Versions index 3b16796453f..f81ff75a00d 100644 --- a/math/Versions +++ b/math/Versions @@ -699,6 +699,7 @@ libm { log10f; remainder; remainderf; + sinhf; y0f; y1f; ynf; diff --git a/math/w_sinhf_compat.c b/math/w_sinhf_compat.c index e8de6675af4..77c7cefb55b 100644 --- a/math/w_sinhf_compat.c +++ b/math/w_sinhf_compat.c @@ -21,9 +21,9 @@ #include #include -#if LIBM_SVID_COMPAT +#if LIBM_SVID_COMPAT && SHLIB_COMPAT (libm, GLIBC_2_0, GLIBC_2_43) float -__sinhf (float x) +__sinh_compatf (float x) { float z = __ieee754_sinhf (x); if (__builtin_expect (!isfinite (z), 0) && isfinite (x) @@ -32,5 +32,10 @@ __sinhf (float x) return z; } -libm_alias_float (__sinh, sinh) +# ifdef NO_COMPAT_NEEDED +strong_alias (__sinh_compatf, __sinhf) +libm_alias_float (__sinh_compat, sinh) +# else +compat_symbol (libm, __sinh_compatf, sinhf, GLIBC_2_0); +# endif #endif diff --git a/sysdeps/ieee754/flt-32/e_sinhf.c b/sysdeps/ieee754/flt-32/e_sinhf.c index 5e812c35afe..687f75332ef 100644 --- a/sysdeps/ieee754/flt-32/e_sinhf.c +++ b/sysdeps/ieee754/flt-32/e_sinhf.c @@ -24,15 +24,18 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +#include #include #include #include +#include +#include #include #include "math_config.h" #include "e_sincoshf_data.h" float -__ieee754_sinhf (float x) +__sinhf (float x) { static const struct { @@ -44,15 +47,9 @@ __ieee754_sinhf (float x) uint32_t ux = asuint (x) << 1; if (__glibc_unlikely (ux > 0x8565a9f8u)) { /* |x| >~ 89.4 */ - float sgn = copysignf (2.0f, x); if (ux >= 0xff000000u) - { - if (ux << 8) - return x + x; /* nan */ - return copysignf (INFINITY, x); /* +-inf */ - } - float r = math_narrow_eval (sgn * 0x1.fffffep127f); - return r; + return x + x;; + return __math_oflowf (x < 0); } if (__glibc_unlikely (ux < 0x7c000000u)) { /* |x| < 0.125 */ @@ -105,4 +102,11 @@ __ieee754_sinhf (float x) } return ub; } +strong_alias (__sinhf, __ieee754_sinhf) +#if LIBM_SVID_COMPAT +versioned_symbol (libm, __sinhf, sinhf, GLIBC_2_43); +libm_alias_float_other (__sinh, sinh) +#else +libm_alias_float (__sinh, sinh) +#endif libm_alias_finite (__ieee754_sinhf, __sinhf) diff --git a/sysdeps/ieee754/flt-32/w_sinhf.c b/sysdeps/ieee754/flt-32/w_sinhf.c new file mode 100644 index 00000000000..1cc89317007 --- /dev/null +++ b/sysdeps/ieee754/flt-32/w_sinhf.c @@ -0,0 +1 @@ +/* Not needed. */ diff --git a/sysdeps/m68k/m680x0/fpu/w_sinhf_compat.c b/sysdeps/m68k/m680x0/fpu/w_sinhf_compat.c new file mode 100644 index 00000000000..e8e4bc93264 --- /dev/null +++ b/sysdeps/m68k/m680x0/fpu/w_sinhf_compat.c @@ -0,0 +1,8 @@ +/* m68k provides an optimized __ieee754_sinhhf. */ +#ifdef SHARED +# define NO_COMPAT_NEEDED 1 +# include +#else +# include +# include +#endif diff --git a/sysdeps/mach/hurd/i386/libm.abilist b/sysdeps/mach/hurd/i386/libm.abilist index 1dc8f572d0e..b9274b47c46 100644 --- a/sysdeps/mach/hurd/i386/libm.abilist +++ b/sysdeps/mach/hurd/i386/libm.abilist @@ -1330,6 +1330,7 @@ GLIBC_2.43 jnf F GLIBC_2.43 log10f F GLIBC_2.43 remainder F GLIBC_2.43 remainderf F +GLIBC_2.43 sinhf F GLIBC_2.43 y0f F GLIBC_2.43 y1f F GLIBC_2.43 ynf F diff --git a/sysdeps/unix/sysv/linux/aarch64/libm.abilist b/sysdeps/unix/sysv/linux/aarch64/libm.abilist index d799f204faf..79a327aae29 100644 --- a/sysdeps/unix/sysv/linux/aarch64/libm.abilist +++ b/sysdeps/unix/sysv/linux/aarch64/libm.abilist @@ -1296,6 +1296,7 @@ GLIBC_2.43 jnf F GLIBC_2.43 log10f F GLIBC_2.43 remainder F GLIBC_2.43 remainderf F +GLIBC_2.43 sinhf F GLIBC_2.43 y0f F GLIBC_2.43 y1f F GLIBC_2.43 ynf F diff --git a/sysdeps/unix/sysv/linux/alpha/libm.abilist b/sysdeps/unix/sysv/linux/alpha/libm.abilist index 0d608533c92..63bba07bbf0 100644 --- a/sysdeps/unix/sysv/linux/alpha/libm.abilist +++ b/sysdeps/unix/sysv/linux/alpha/libm.abilist @@ -1455,6 +1455,7 @@ GLIBC_2.43 jnf F GLIBC_2.43 log10f F GLIBC_2.43 remainder F GLIBC_2.43 remainderf F +GLIBC_2.43 sinhf F GLIBC_2.43 y0f F GLIBC_2.43 y1f F GLIBC_2.43 ynf F diff --git a/sysdeps/unix/sysv/linux/arm/be/libm.abilist b/sysdeps/unix/sysv/linux/arm/be/libm.abilist index d60a11026cd..d62946108a3 100644 --- a/sysdeps/unix/sysv/linux/arm/be/libm.abilist +++ b/sysdeps/unix/sysv/linux/arm/be/libm.abilist @@ -961,6 +961,7 @@ GLIBC_2.43 jnf F GLIBC_2.43 log10f F GLIBC_2.43 remainder F GLIBC_2.43 remainderf F +GLIBC_2.43 sinhf F GLIBC_2.43 y0f F GLIBC_2.43 y1f F GLIBC_2.43 ynf F diff --git a/sysdeps/unix/sysv/linux/arm/le/libm.abilist b/sysdeps/unix/sysv/linux/arm/le/libm.abilist index d60a11026cd..d62946108a3 100644 --- a/sysdeps/unix/sysv/linux/arm/le/libm.abilist +++ b/sysdeps/unix/sysv/linux/arm/le/libm.abilist @@ -961,6 +961,7 @@ GLIBC_2.43 jnf F GLIBC_2.43 log10f F GLIBC_2.43 remainder F GLIBC_2.43 remainderf F +GLIBC_2.43 sinhf F GLIBC_2.43 y0f F GLIBC_2.43 y1f F GLIBC_2.43 ynf F diff --git a/sysdeps/unix/sysv/linux/hppa/libm.abilist b/sysdeps/unix/sysv/linux/hppa/libm.abilist index 60ce950d8af..e8083d0af58 100644 --- a/sysdeps/unix/sysv/linux/hppa/libm.abilist +++ b/sysdeps/unix/sysv/linux/hppa/libm.abilist @@ -961,6 +961,7 @@ GLIBC_2.43 jnf F GLIBC_2.43 log10f F GLIBC_2.43 remainder F GLIBC_2.43 remainderf F +GLIBC_2.43 sinhf F GLIBC_2.43 y0f F GLIBC_2.43 y1f F GLIBC_2.43 ynf F diff --git a/sysdeps/unix/sysv/linux/i386/libm.abilist b/sysdeps/unix/sysv/linux/i386/libm.abilist index b4164516f6b..67a4cc555ef 100644 --- a/sysdeps/unix/sysv/linux/i386/libm.abilist +++ b/sysdeps/unix/sysv/linux/i386/libm.abilist @@ -1337,6 +1337,7 @@ GLIBC_2.43 jnf F GLIBC_2.43 log10f F GLIBC_2.43 remainder F GLIBC_2.43 remainderf F +GLIBC_2.43 sinhf F GLIBC_2.43 y0f F GLIBC_2.43 y1f F GLIBC_2.43 ynf F diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist index d60a11026cd..d62946108a3 100644 --- a/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist +++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist @@ -961,6 +961,7 @@ GLIBC_2.43 jnf F GLIBC_2.43 log10f F GLIBC_2.43 remainder F GLIBC_2.43 remainderf F +GLIBC_2.43 sinhf F GLIBC_2.43 y0f F GLIBC_2.43 y1f F GLIBC_2.43 ynf F diff --git a/sysdeps/unix/sysv/linux/microblaze/be/libm.abilist b/sysdeps/unix/sysv/linux/microblaze/be/libm.abilist index e24b8ef83aa..624eff1cafd 100644 --- a/sysdeps/unix/sysv/linux/microblaze/be/libm.abilist +++ b/sysdeps/unix/sysv/linux/microblaze/be/libm.abilist @@ -961,6 +961,7 @@ GLIBC_2.43 jnf F GLIBC_2.43 log10f F GLIBC_2.43 remainder F GLIBC_2.43 remainderf F +GLIBC_2.43 sinhf F GLIBC_2.43 y0f F GLIBC_2.43 y1f F GLIBC_2.43 ynf F diff --git a/sysdeps/unix/sysv/linux/microblaze/le/libm.abilist b/sysdeps/unix/sysv/linux/microblaze/le/libm.abilist index e24b8ef83aa..624eff1cafd 100644 --- a/sysdeps/unix/sysv/linux/microblaze/le/libm.abilist +++ b/sysdeps/unix/sysv/linux/microblaze/le/libm.abilist @@ -961,6 +961,7 @@ GLIBC_2.43 jnf F GLIBC_2.43 log10f F GLIBC_2.43 remainder F GLIBC_2.43 remainderf F +GLIBC_2.43 sinhf F GLIBC_2.43 y0f F GLIBC_2.43 y1f F GLIBC_2.43 ynf F diff --git a/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist b/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist index 42afecec7c8..8502e66e3e7 100644 --- a/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist +++ b/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist @@ -961,6 +961,7 @@ GLIBC_2.43 jnf F GLIBC_2.43 log10f F GLIBC_2.43 remainder F GLIBC_2.43 remainderf F +GLIBC_2.43 sinhf F GLIBC_2.43 y0f F GLIBC_2.43 y1f F GLIBC_2.43 ynf F diff --git a/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist b/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist index 2850dacf7f3..fc20a8e42ea 100644 --- a/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist +++ b/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist @@ -1296,6 +1296,7 @@ GLIBC_2.43 jnf F GLIBC_2.43 log10f F GLIBC_2.43 remainder F GLIBC_2.43 remainderf F +GLIBC_2.43 sinhf F GLIBC_2.43 y0f F GLIBC_2.43 y1f F GLIBC_2.43 ynf F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist index 71f1e74f75e..f13ccd8a699 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist @@ -1108,6 +1108,7 @@ GLIBC_2.43 jnf F GLIBC_2.43 log10f F GLIBC_2.43 remainder F GLIBC_2.43 remainderf F +GLIBC_2.43 sinhf F GLIBC_2.43 y0f F GLIBC_2.43 y1f F GLIBC_2.43 ynf F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist index 2cab971c102..254e25106a5 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist @@ -1107,6 +1107,7 @@ GLIBC_2.43 jnf F GLIBC_2.43 log10f F GLIBC_2.43 remainder F GLIBC_2.43 remainderf F +GLIBC_2.43 sinhf F GLIBC_2.43 y0f F GLIBC_2.43 y1f F GLIBC_2.43 ynf F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libm.abilist index 6574ba9908b..8a8992d3243 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libm.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libm.abilist @@ -1101,6 +1101,7 @@ GLIBC_2.43 jnf F GLIBC_2.43 log10f F GLIBC_2.43 remainder F GLIBC_2.43 remainderf F +GLIBC_2.43 sinhf F GLIBC_2.43 y0f F GLIBC_2.43 y1f F GLIBC_2.43 ynf F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libm.abilist index e4888b6cf2b..cb469001876 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libm.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libm.abilist @@ -1485,6 +1485,7 @@ GLIBC_2.43 jnf F GLIBC_2.43 log10f F GLIBC_2.43 remainder F GLIBC_2.43 remainderf F +GLIBC_2.43 sinhf F GLIBC_2.43 y0f F GLIBC_2.43 y1f F GLIBC_2.43 ynf F diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist index ccc0de5b988..721e0c4bc51 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist +++ b/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist @@ -1399,6 +1399,7 @@ GLIBC_2.43 jnf F GLIBC_2.43 log10f F GLIBC_2.43 remainder F GLIBC_2.43 remainderf F +GLIBC_2.43 sinhf F GLIBC_2.43 y0f F GLIBC_2.43 y1f F GLIBC_2.43 ynf F diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist index 871c473efa6..fedb41284a4 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist +++ b/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist @@ -1399,6 +1399,7 @@ GLIBC_2.43 jnf F GLIBC_2.43 log10f F GLIBC_2.43 remainder F GLIBC_2.43 remainderf F +GLIBC_2.43 sinhf F GLIBC_2.43 y0f F GLIBC_2.43 y1f F GLIBC_2.43 ynf F diff --git a/sysdeps/unix/sysv/linux/sh/be/libm.abilist b/sysdeps/unix/sysv/linux/sh/be/libm.abilist index 7a0edfe5c37..312075b479c 100644 --- a/sysdeps/unix/sysv/linux/sh/be/libm.abilist +++ b/sysdeps/unix/sysv/linux/sh/be/libm.abilist @@ -961,6 +961,7 @@ GLIBC_2.43 jnf F GLIBC_2.43 log10f F GLIBC_2.43 remainder F GLIBC_2.43 remainderf F +GLIBC_2.43 sinhf F GLIBC_2.43 y0f F GLIBC_2.43 y1f F GLIBC_2.43 ynf F diff --git a/sysdeps/unix/sysv/linux/sh/le/libm.abilist b/sysdeps/unix/sysv/linux/sh/le/libm.abilist index 7a0edfe5c37..312075b479c 100644 --- a/sysdeps/unix/sysv/linux/sh/le/libm.abilist +++ b/sysdeps/unix/sysv/linux/sh/le/libm.abilist @@ -961,6 +961,7 @@ GLIBC_2.43 jnf F GLIBC_2.43 log10f F GLIBC_2.43 remainder F GLIBC_2.43 remainderf F +GLIBC_2.43 sinhf F GLIBC_2.43 y0f F GLIBC_2.43 y1f F GLIBC_2.43 ynf F diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist index acfe74ef6ff..192349cbf34 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist @@ -1406,6 +1406,7 @@ GLIBC_2.43 jnf F GLIBC_2.43 log10f F GLIBC_2.43 remainder F GLIBC_2.43 remainderf F +GLIBC_2.43 sinhf F GLIBC_2.43 y0f F GLIBC_2.43 y1f F GLIBC_2.43 ynf F diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist index dc28560fdcb..03f14432d61 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist @@ -1296,6 +1296,7 @@ GLIBC_2.43 jnf F GLIBC_2.43 log10f F GLIBC_2.43 remainder F GLIBC_2.43 remainderf F +GLIBC_2.43 sinhf F GLIBC_2.43 y0f F GLIBC_2.43 y1f F GLIBC_2.43 ynf F diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist index 36900001753..8e08ac5e182 100644 --- a/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist +++ b/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist @@ -1329,6 +1329,7 @@ GLIBC_2.43 jnf F GLIBC_2.43 log10f F GLIBC_2.43 remainder F GLIBC_2.43 remainderf F +GLIBC_2.43 sinhf F GLIBC_2.43 y0f F GLIBC_2.43 y1f F GLIBC_2.43 ynf F diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist index c41a781b5c9..be5cd7c8a15 100644 --- a/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist +++ b/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist @@ -1329,6 +1329,7 @@ GLIBC_2.43 jnf F GLIBC_2.43 log10f F GLIBC_2.43 remainder F GLIBC_2.43 remainderf F +GLIBC_2.43 sinhf F GLIBC_2.43 y0f F GLIBC_2.43 y1f F GLIBC_2.43 ynf F -- 2.47.3