[PATCH v4 16/21] math: Remove the SVID error handling from sinhf

Adhemerval Zanella adhemerval.zanella@linaro.org
Wed Oct 8 13:55:16 GMT 2025


It improves latency for about 3-10% and throughput for about 5-15%.

Tested on x86_64-linux-gnu and i686-linux-gnu.
---
 math/Versions                                       |  2 +-
 math/w_sinhf_compat.c                               | 11 ++++++++---
 sysdeps/ieee754/flt-32/e_sinhf.c                    | 13 ++++++++++++-
 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 +
 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 +
 .../sysv/linux/powerpc/powerpc64/be/libm.abilist    |  1 +
 .../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, 54 insertions(+), 5 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 3a300b3cb53..68d63a8e664 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; atanhf; coshf;
+    atan2f; atanhf; coshf; sinhf;
   }
 }
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 <math-svid-compat.h>
 #include <libm-alias-float.h>
 
-#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 6c8c1db404f..fdad5843722 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 <errno.h>
 #include <math.h>
 #include <stdint.h>
 #include <libm-alias-finite.h>
+#include <libm-alias-float.h>
+#include <math-svid-compat.h>
 #include <math-narrow-eval.h>
 #include "math_config.h"
 #include "e_sincoshf_data.h"
 
 float
-__ieee754_sinhf (float x)
+__sinhf (float x)
 {
   static const struct
   {
@@ -52,6 +55,7 @@ __ieee754_sinhf (float x)
 	  return copysignf (INFINITY, x); /* +-inf */
 	}
       float r = math_narrow_eval (sgn * 0x1.fffffep127f);
+      __set_errno (ERANGE);
       return r;
     }
   if (__glibc_unlikely (ux < 0x7c000000u))
@@ -105,4 +109,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 <math/w_sinhf_compat.c>
+#else
+# include <math-type-macros-float.h>
+# include <w_sinh_template.c>
+#endif
diff --git a/sysdeps/mach/hurd/i386/libm.abilist b/sysdeps/mach/hurd/i386/libm.abilist
index 2d288a54b46..d8d7cd87811 100644
--- a/sysdeps/mach/hurd/i386/libm.abilist
+++ b/sysdeps/mach/hurd/i386/libm.abilist
@@ -1330,3 +1330,4 @@ GLIBC_2.43 lgammaf_r F
 GLIBC_2.43 log10f F
 GLIBC_2.43 remainder F
 GLIBC_2.43 remainderf F
+GLIBC_2.43 sinhf F
diff --git a/sysdeps/unix/sysv/linux/aarch64/libm.abilist b/sysdeps/unix/sysv/linux/aarch64/libm.abilist
index 200df498d95..0f5baffe3eb 100644
--- a/sysdeps/unix/sysv/linux/aarch64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/aarch64/libm.abilist
@@ -1296,3 +1296,4 @@ GLIBC_2.43 lgammaf_r F
 GLIBC_2.43 log10f F
 GLIBC_2.43 remainder F
 GLIBC_2.43 remainderf F
+GLIBC_2.43 sinhf F
diff --git a/sysdeps/unix/sysv/linux/alpha/libm.abilist b/sysdeps/unix/sysv/linux/alpha/libm.abilist
index dfa684376f3..d1a03bf02e5 100644
--- a/sysdeps/unix/sysv/linux/alpha/libm.abilist
+++ b/sysdeps/unix/sysv/linux/alpha/libm.abilist
@@ -1455,3 +1455,4 @@ GLIBC_2.43 lgammaf_r F
 GLIBC_2.43 log10f F
 GLIBC_2.43 remainder F
 GLIBC_2.43 remainderf F
+GLIBC_2.43 sinhf F
diff --git a/sysdeps/unix/sysv/linux/arm/be/libm.abilist b/sysdeps/unix/sysv/linux/arm/be/libm.abilist
index ae81903d355..fbc3b5064a4 100644
--- a/sysdeps/unix/sysv/linux/arm/be/libm.abilist
+++ b/sysdeps/unix/sysv/linux/arm/be/libm.abilist
@@ -961,3 +961,4 @@ GLIBC_2.43 lgammaf_r F
 GLIBC_2.43 log10f F
 GLIBC_2.43 remainder F
 GLIBC_2.43 remainderf F
+GLIBC_2.43 sinhf F
diff --git a/sysdeps/unix/sysv/linux/arm/le/libm.abilist b/sysdeps/unix/sysv/linux/arm/le/libm.abilist
index ae81903d355..fbc3b5064a4 100644
--- a/sysdeps/unix/sysv/linux/arm/le/libm.abilist
+++ b/sysdeps/unix/sysv/linux/arm/le/libm.abilist
@@ -961,3 +961,4 @@ GLIBC_2.43 lgammaf_r F
 GLIBC_2.43 log10f F
 GLIBC_2.43 remainder F
 GLIBC_2.43 remainderf F
+GLIBC_2.43 sinhf F
diff --git a/sysdeps/unix/sysv/linux/hppa/libm.abilist b/sysdeps/unix/sysv/linux/hppa/libm.abilist
index 91dc1148162..0d4750fbe77 100644
--- a/sysdeps/unix/sysv/linux/hppa/libm.abilist
+++ b/sysdeps/unix/sysv/linux/hppa/libm.abilist
@@ -961,3 +961,4 @@ GLIBC_2.43 lgammaf_r F
 GLIBC_2.43 log10f F
 GLIBC_2.43 remainder F
 GLIBC_2.43 remainderf F
+GLIBC_2.43 sinhf F
diff --git a/sysdeps/unix/sysv/linux/i386/libm.abilist b/sysdeps/unix/sysv/linux/i386/libm.abilist
index 975d6878ab0..d84a2c8c78a 100644
--- a/sysdeps/unix/sysv/linux/i386/libm.abilist
+++ b/sysdeps/unix/sysv/linux/i386/libm.abilist
@@ -1337,3 +1337,4 @@ GLIBC_2.43 lgammaf_r F
 GLIBC_2.43 log10f F
 GLIBC_2.43 remainder F
 GLIBC_2.43 remainderf F
+GLIBC_2.43 sinhf F
diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist
index ae81903d355..fbc3b5064a4 100644
--- a/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist
@@ -961,3 +961,4 @@ GLIBC_2.43 lgammaf_r F
 GLIBC_2.43 log10f F
 GLIBC_2.43 remainder F
 GLIBC_2.43 remainderf F
+GLIBC_2.43 sinhf F
diff --git a/sysdeps/unix/sysv/linux/microblaze/be/libm.abilist b/sysdeps/unix/sysv/linux/microblaze/be/libm.abilist
index 358b838b6cb..720d3a55d06 100644
--- a/sysdeps/unix/sysv/linux/microblaze/be/libm.abilist
+++ b/sysdeps/unix/sysv/linux/microblaze/be/libm.abilist
@@ -961,3 +961,4 @@ GLIBC_2.43 lgammaf_r F
 GLIBC_2.43 log10f F
 GLIBC_2.43 remainder F
 GLIBC_2.43 remainderf F
+GLIBC_2.43 sinhf F
diff --git a/sysdeps/unix/sysv/linux/microblaze/le/libm.abilist b/sysdeps/unix/sysv/linux/microblaze/le/libm.abilist
index 358b838b6cb..720d3a55d06 100644
--- a/sysdeps/unix/sysv/linux/microblaze/le/libm.abilist
+++ b/sysdeps/unix/sysv/linux/microblaze/le/libm.abilist
@@ -961,3 +961,4 @@ GLIBC_2.43 lgammaf_r F
 GLIBC_2.43 log10f F
 GLIBC_2.43 remainder F
 GLIBC_2.43 remainderf F
+GLIBC_2.43 sinhf F
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist b/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist
index 7b866d32a79..85cb5826b71 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist
@@ -961,3 +961,4 @@ GLIBC_2.43 lgammaf_r F
 GLIBC_2.43 log10f F
 GLIBC_2.43 remainder F
 GLIBC_2.43 remainderf F
+GLIBC_2.43 sinhf F
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist b/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist
index 1e9129b6356..ca6901ae273 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist
@@ -1296,3 +1296,4 @@ GLIBC_2.43 lgammaf_r F
 GLIBC_2.43 log10f F
 GLIBC_2.43 remainder F
 GLIBC_2.43 remainderf F
+GLIBC_2.43 sinhf F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist
index e14846a1322..572b67bcf84 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist
@@ -1108,3 +1108,4 @@ GLIBC_2.43 lgammaf_r F
 GLIBC_2.43 log10f F
 GLIBC_2.43 remainder F
 GLIBC_2.43 remainderf F
+GLIBC_2.43 sinhf F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist
index 98d677b4d68..134f11ec932 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist
@@ -1107,3 +1107,4 @@ GLIBC_2.43 lgammaf_r F
 GLIBC_2.43 log10f F
 GLIBC_2.43 remainder F
 GLIBC_2.43 remainderf F
+GLIBC_2.43 sinhf F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libm.abilist
index 50f82f92cc2..cff5aece427 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libm.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libm.abilist
@@ -1101,3 +1101,4 @@ GLIBC_2.43 lgammaf_r F
 GLIBC_2.43 log10f F
 GLIBC_2.43 remainder F
 GLIBC_2.43 remainderf F
+GLIBC_2.43 sinhf F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libm.abilist
index f2aaa6c4c2e..f48afb01e62 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libm.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libm.abilist
@@ -1485,3 +1485,4 @@ GLIBC_2.43 lgammaf_r F
 GLIBC_2.43 log10f F
 GLIBC_2.43 remainder F
 GLIBC_2.43 remainderf F
+GLIBC_2.43 sinhf F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist
index 5db036385c9..c1e4b87b49f 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist
@@ -1399,3 +1399,4 @@ GLIBC_2.43 lgammaf_r F
 GLIBC_2.43 log10f F
 GLIBC_2.43 remainder F
 GLIBC_2.43 remainderf F
+GLIBC_2.43 sinhf F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist
index da6f958dea0..ec84cdba566 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist
@@ -1399,3 +1399,4 @@ GLIBC_2.43 lgammaf_r F
 GLIBC_2.43 log10f F
 GLIBC_2.43 remainder F
 GLIBC_2.43 remainderf F
+GLIBC_2.43 sinhf F
diff --git a/sysdeps/unix/sysv/linux/sh/be/libm.abilist b/sysdeps/unix/sysv/linux/sh/be/libm.abilist
index f3ae10872de..b4b32ee3ee0 100644
--- a/sysdeps/unix/sysv/linux/sh/be/libm.abilist
+++ b/sysdeps/unix/sysv/linux/sh/be/libm.abilist
@@ -961,3 +961,4 @@ GLIBC_2.43 lgammaf_r F
 GLIBC_2.43 log10f F
 GLIBC_2.43 remainder F
 GLIBC_2.43 remainderf F
+GLIBC_2.43 sinhf F
diff --git a/sysdeps/unix/sysv/linux/sh/le/libm.abilist b/sysdeps/unix/sysv/linux/sh/le/libm.abilist
index f3ae10872de..b4b32ee3ee0 100644
--- a/sysdeps/unix/sysv/linux/sh/le/libm.abilist
+++ b/sysdeps/unix/sysv/linux/sh/le/libm.abilist
@@ -961,3 +961,4 @@ GLIBC_2.43 lgammaf_r F
 GLIBC_2.43 log10f F
 GLIBC_2.43 remainder F
 GLIBC_2.43 remainderf F
+GLIBC_2.43 sinhf F
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist
index 456b62f2cf8..b3a2c941f67 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist
@@ -1406,3 +1406,4 @@ GLIBC_2.43 lgammaf_r F
 GLIBC_2.43 log10f F
 GLIBC_2.43 remainder F
 GLIBC_2.43 remainderf F
+GLIBC_2.43 sinhf F
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist
index ed32e0fe108..b6d70df1e1c 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist
@@ -1296,3 +1296,4 @@ GLIBC_2.43 lgammaf_r F
 GLIBC_2.43 log10f F
 GLIBC_2.43 remainder F
 GLIBC_2.43 remainderf F
+GLIBC_2.43 sinhf F
diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist
index b36b1d96e2a..a881f1c65e3 100644
--- a/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist
@@ -1329,3 +1329,4 @@ GLIBC_2.43 lgammaf_r F
 GLIBC_2.43 log10f F
 GLIBC_2.43 remainder F
 GLIBC_2.43 remainderf F
+GLIBC_2.43 sinhf F
diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist
index 4474db45b94..d99c0257607 100644
--- a/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist
@@ -1329,3 +1329,4 @@ GLIBC_2.43 lgammaf_r F
 GLIBC_2.43 log10f F
 GLIBC_2.43 remainder F
 GLIBC_2.43 remainderf F
+GLIBC_2.43 sinhf F
-- 
2.43.0



More information about the Libc-alpha mailing list