[PATCH v2 2/8] math: Remove the SVID error handling from cosh

Adhemerval Zanella adhemerval.zanella@linaro.org
Fri Mar 6 12:25:19 GMT 2026


It improves throughout from 3.5% to 9%.
---
 NEWS                                           |  3 +++
 math/Versions                                  |  4 ++++
 math/w_cosh_compat.c                           | 18 +++++++++++++++---
 sysdeps/ieee754/dbl-64/e_cosh.c                | 11 ++++++++++-
 sysdeps/ieee754/dbl-64/w_cosh.c                |  1 +
 sysdeps/m68k/m680x0/fpu/w_cosh_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 +
 .../unix/sysv/linux/m68k/coldfire/libm.abilist |  1 +
 .../unix/sysv/linux/microblaze/be/libm.abilist |  1 +
 .../unix/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 +
 .../linux/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 +
 .../unix/sysv/linux/sparc/sparc32/libm.abilist |  1 +
 .../unix/sysv/linux/sparc/sparc64/libm.abilist |  1 +
 sysdeps/unix/sysv/linux/x86_64/64/libm.abilist |  1 +
 .../unix/sysv/linux/x86_64/x32/libm.abilist    |  1 +
 30 files changed, 65 insertions(+), 4 deletions(-)
 create mode 100644 sysdeps/ieee754/dbl-64/w_cosh.c
 create mode 100644 sysdeps/m68k/m680x0/fpu/w_cosh_compat.c

diff --git a/NEWS b/NEWS
index b922eb493f..981ea95015 100644
--- a/NEWS
+++ b/NEWS
@@ -12,6 +12,9 @@ Major new features:
 * Additional optimized and correctly rounded mathematical functions have
   been imported from the CORE-MATH project, in particular cosh.
 
+* The SVID handling for cosh was moved to compat symbols, allowing
+  improvements in performance.
+
 Deprecated and removed features, and other changes affecting compatibility:
 
 * Although malloc and related functions currently return pointers
diff --git a/math/Versions b/math/Versions
index d04ac92324..6a4f279842 100644
--- a/math/Versions
+++ b/math/Versions
@@ -718,4 +718,8 @@ libm {
     ufromfpx; ufromfpxf; ufromfpxl;
     ufromfpxf32; ufromfpxf64; ufromfpxf32x; ufromfpxf64x; ufromfpxf128;
   }
+  GLIBC_2.44 {
+    # No SVID compatible error handling.
+    cosh;
+  }
 }
diff --git a/math/w_cosh_compat.c b/math/w_cosh_compat.c
index 30897185c9..2522c5c989 100644
--- a/math/w_cosh_compat.c
+++ b/math/w_cosh_compat.c
@@ -19,9 +19,9 @@
 #include <math-svid-compat.h>
 #include <libm-alias-double.h>
 
-#if LIBM_SVID_COMPAT
+#if LIBM_SVID_COMPAT && SHLIB_COMPAT (libm, GLIBC_2_0, GLIBC_2_44)
 double
-__cosh (double x)
+__cosh_compat (double x)
 {
 	double z = __ieee754_cosh (x);
 	if (__builtin_expect (!isfinite (z), 0) && isfinite (x)
@@ -30,5 +30,17 @@ __cosh (double x)
 
 	return z;
 }
-libm_alias_double (__cosh, cosh)
+# ifdef NO_COMPAT_NEEDED
+strong_alias (__cosh_compat, __cosh)
+libm_alias_double (__cosh_compat, cosh)
+# else
+compat_symbol (libm, __cosh_compat, cosh, GLIBC_2_0);
+#  ifdef NO_LONG_DOUBLE
+weak_alias (__cosh_compat, coshl)
+#  endif
+#  ifdef LONG_DOUBLE_COMPAT
+LONG_DOUBLE_COMPAT_CHOOSE_libm_coshl (
+  compat_symbol (libm, __cosh_compat, coshl, FIRST_VERSION_libm_coshl), );
+#  endif
+# endif
 #endif
diff --git a/sysdeps/ieee754/dbl-64/e_cosh.c b/sysdeps/ieee754/dbl-64/e_cosh.c
index 0445352e51..c1fbd4241f 100644
--- a/sysdeps/ieee754/dbl-64/e_cosh.c
+++ b/sysdeps/ieee754/dbl-64/e_cosh.c
@@ -26,6 +26,8 @@ SOFTWARE.
 
 #include <math.h>
 #include <libm-alias-finite.h>
+#include <libm-alias-double.h>
+#include <math-svid-compat.h>
 #include <ddcoremath.h>
 #include "math_config.h"
 
@@ -148,7 +150,7 @@ as_cosh_database (double x, double f)
 }
 
 double
-__ieee754_cosh (double x)
+__cosh (double x)
 {
   /*
     The function cosh(x) is approximated by a minimax polynomial
@@ -443,4 +445,11 @@ __ieee754_cosh (double x)
     return as_cosh_database (x, rh);
   return rh;
 }
+strong_alias (__cosh, __ieee754_cosh)
+#if LIBM_SVID_COMPAT
+versioned_symbol (libm, __cosh, cosh, GLIBC_2_44);
+libm_alias_double_other (__cosh, cosh)
+#else
+libm_alias_double (__cosh, cosh)
+#endif
 libm_alias_finite (__ieee754_cosh, __cosh)
diff --git a/sysdeps/ieee754/dbl-64/w_cosh.c b/sysdeps/ieee754/dbl-64/w_cosh.c
new file mode 100644
index 0000000000..1cc8931700
--- /dev/null
+++ b/sysdeps/ieee754/dbl-64/w_cosh.c
@@ -0,0 +1 @@
+/* Not needed.  */
diff --git a/sysdeps/m68k/m680x0/fpu/w_cosh_compat.c b/sysdeps/m68k/m680x0/fpu/w_cosh_compat.c
new file mode 100644
index 0000000000..57d90d35f6
--- /dev/null
+++ b/sysdeps/m68k/m680x0/fpu/w_cosh_compat.c
@@ -0,0 +1,8 @@
+/* m68k provides an optimized __cosh_atan2f.  */
+#ifdef SHARED
+# define NO_COMPAT_NEEDED 1
+# include <math/w_cosh_compat.c>
+#else
+# include <math-type-macros-double.h>
+# include <w_cosh_template.c>
+#endif
diff --git a/sysdeps/mach/hurd/i386/libm.abilist b/sysdeps/mach/hurd/i386/libm.abilist
index a1b21698f6..aa57dd170b 100644
--- a/sysdeps/mach/hurd/i386/libm.abilist
+++ b/sysdeps/mach/hurd/i386/libm.abilist
@@ -1371,3 +1371,4 @@ GLIBC_2.43 ufromfpxl F
 GLIBC_2.43 y0f F
 GLIBC_2.43 y1f F
 GLIBC_2.43 ynf F
+GLIBC_2.44 cosh F
diff --git a/sysdeps/unix/sysv/linux/aarch64/libm.abilist b/sysdeps/unix/sysv/linux/aarch64/libm.abilist
index 23c1817085..1d815aad66 100644
--- a/sysdeps/unix/sysv/linux/aarch64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/aarch64/libm.abilist
@@ -1337,3 +1337,4 @@ GLIBC_2.43 ufromfpxl F
 GLIBC_2.43 y0f F
 GLIBC_2.43 y1f F
 GLIBC_2.43 ynf F
+GLIBC_2.44 cosh F
diff --git a/sysdeps/unix/sysv/linux/alpha/libm.abilist b/sysdeps/unix/sysv/linux/alpha/libm.abilist
index eaffa43b6c..f3bdc7f649 100644
--- a/sysdeps/unix/sysv/linux/alpha/libm.abilist
+++ b/sysdeps/unix/sysv/linux/alpha/libm.abilist
@@ -1496,3 +1496,4 @@ GLIBC_2.43 ufromfpxl F
 GLIBC_2.43 y0f F
 GLIBC_2.43 y1f F
 GLIBC_2.43 ynf F
+GLIBC_2.44 cosh F
diff --git a/sysdeps/unix/sysv/linux/arm/be/libm.abilist b/sysdeps/unix/sysv/linux/arm/be/libm.abilist
index 6f2f3282d8..a93bb4b85b 100644
--- a/sysdeps/unix/sysv/linux/arm/be/libm.abilist
+++ b/sysdeps/unix/sysv/linux/arm/be/libm.abilist
@@ -994,3 +994,4 @@ GLIBC_2.43 ufromfpxl F
 GLIBC_2.43 y0f F
 GLIBC_2.43 y1f F
 GLIBC_2.43 ynf F
+GLIBC_2.44 cosh F
diff --git a/sysdeps/unix/sysv/linux/arm/le/libm.abilist b/sysdeps/unix/sysv/linux/arm/le/libm.abilist
index 6f2f3282d8..a93bb4b85b 100644
--- a/sysdeps/unix/sysv/linux/arm/le/libm.abilist
+++ b/sysdeps/unix/sysv/linux/arm/le/libm.abilist
@@ -994,3 +994,4 @@ GLIBC_2.43 ufromfpxl F
 GLIBC_2.43 y0f F
 GLIBC_2.43 y1f F
 GLIBC_2.43 ynf F
+GLIBC_2.44 cosh F
diff --git a/sysdeps/unix/sysv/linux/hppa/libm.abilist b/sysdeps/unix/sysv/linux/hppa/libm.abilist
index a2d8a6bcba..bed06e5425 100644
--- a/sysdeps/unix/sysv/linux/hppa/libm.abilist
+++ b/sysdeps/unix/sysv/linux/hppa/libm.abilist
@@ -994,3 +994,4 @@ GLIBC_2.43 ufromfpxl F
 GLIBC_2.43 y0f F
 GLIBC_2.43 y1f F
 GLIBC_2.43 ynf F
+GLIBC_2.44 cosh F
diff --git a/sysdeps/unix/sysv/linux/i386/libm.abilist b/sysdeps/unix/sysv/linux/i386/libm.abilist
index 4369ca51bb..1633067640 100644
--- a/sysdeps/unix/sysv/linux/i386/libm.abilist
+++ b/sysdeps/unix/sysv/linux/i386/libm.abilist
@@ -1378,3 +1378,4 @@ GLIBC_2.43 ufromfpxl F
 GLIBC_2.43 y0f F
 GLIBC_2.43 y1f F
 GLIBC_2.43 ynf F
+GLIBC_2.44 cosh F
diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist
index 6f2f3282d8..a93bb4b85b 100644
--- a/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist
@@ -994,3 +994,4 @@ GLIBC_2.43 ufromfpxl F
 GLIBC_2.43 y0f F
 GLIBC_2.43 y1f F
 GLIBC_2.43 ynf F
+GLIBC_2.44 cosh F
diff --git a/sysdeps/unix/sysv/linux/microblaze/be/libm.abilist b/sysdeps/unix/sysv/linux/microblaze/be/libm.abilist
index b864d6b242..f2ac1956c9 100644
--- a/sysdeps/unix/sysv/linux/microblaze/be/libm.abilist
+++ b/sysdeps/unix/sysv/linux/microblaze/be/libm.abilist
@@ -994,3 +994,4 @@ GLIBC_2.43 ufromfpxl F
 GLIBC_2.43 y0f F
 GLIBC_2.43 y1f F
 GLIBC_2.43 ynf F
+GLIBC_2.44 cosh F
diff --git a/sysdeps/unix/sysv/linux/microblaze/le/libm.abilist b/sysdeps/unix/sysv/linux/microblaze/le/libm.abilist
index b864d6b242..f2ac1956c9 100644
--- a/sysdeps/unix/sysv/linux/microblaze/le/libm.abilist
+++ b/sysdeps/unix/sysv/linux/microblaze/le/libm.abilist
@@ -994,3 +994,4 @@ GLIBC_2.43 ufromfpxl F
 GLIBC_2.43 y0f F
 GLIBC_2.43 y1f F
 GLIBC_2.43 ynf F
+GLIBC_2.44 cosh F
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist b/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist
index cba91a3c60..35069ab524 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist
@@ -994,3 +994,4 @@ GLIBC_2.43 ufromfpxl F
 GLIBC_2.43 y0f F
 GLIBC_2.43 y1f F
 GLIBC_2.43 ynf F
+GLIBC_2.44 cosh F
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist b/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist
index d5dd941186..ea113d7c6f 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist
@@ -1337,3 +1337,4 @@ GLIBC_2.43 ufromfpxl F
 GLIBC_2.43 y0f F
 GLIBC_2.43 y1f F
 GLIBC_2.43 ynf F
+GLIBC_2.44 cosh F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist
index fcde397e30..fd45ac9a22 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist
@@ -1141,3 +1141,4 @@ GLIBC_2.43 ufromfpxl F
 GLIBC_2.43 y0f F
 GLIBC_2.43 y1f F
 GLIBC_2.43 ynf F
+GLIBC_2.44 cosh F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist
index c5af9a8ee8..20383daa8e 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist
@@ -1140,3 +1140,4 @@ GLIBC_2.43 ufromfpxl F
 GLIBC_2.43 y0f F
 GLIBC_2.43 y1f F
 GLIBC_2.43 ynf F
+GLIBC_2.44 cosh F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libm.abilist
index 456135f1b7..04e5284961 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libm.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libm.abilist
@@ -1134,3 +1134,4 @@ GLIBC_2.43 ufromfpxl F
 GLIBC_2.43 y0f F
 GLIBC_2.43 y1f F
 GLIBC_2.43 ynf F
+GLIBC_2.44 cosh F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libm.abilist
index 2347726e1c..0c5862f4cb 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libm.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libm.abilist
@@ -1530,3 +1530,4 @@ GLIBC_2.43 ufromfpxl F
 GLIBC_2.43 y0f F
 GLIBC_2.43 y1f F
 GLIBC_2.43 ynf F
+GLIBC_2.44 cosh F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist
index a3458a17f4..252e0849a7 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist
@@ -1440,3 +1440,4 @@ GLIBC_2.43 ufromfpxl F
 GLIBC_2.43 y0f F
 GLIBC_2.43 y1f F
 GLIBC_2.43 ynf F
+GLIBC_2.44 cosh F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist
index 8a2d012dbd..8279e0ac5e 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist
@@ -1440,3 +1440,4 @@ GLIBC_2.43 ufromfpxl F
 GLIBC_2.43 y0f F
 GLIBC_2.43 y1f F
 GLIBC_2.43 ynf F
+GLIBC_2.44 cosh F
diff --git a/sysdeps/unix/sysv/linux/sh/be/libm.abilist b/sysdeps/unix/sysv/linux/sh/be/libm.abilist
index d458c8721d..f4ab6ed10f 100644
--- a/sysdeps/unix/sysv/linux/sh/be/libm.abilist
+++ b/sysdeps/unix/sysv/linux/sh/be/libm.abilist
@@ -994,3 +994,4 @@ GLIBC_2.43 ufromfpxl F
 GLIBC_2.43 y0f F
 GLIBC_2.43 y1f F
 GLIBC_2.43 ynf F
+GLIBC_2.44 cosh F
diff --git a/sysdeps/unix/sysv/linux/sh/le/libm.abilist b/sysdeps/unix/sysv/linux/sh/le/libm.abilist
index d458c8721d..f4ab6ed10f 100644
--- a/sysdeps/unix/sysv/linux/sh/le/libm.abilist
+++ b/sysdeps/unix/sysv/linux/sh/le/libm.abilist
@@ -994,3 +994,4 @@ GLIBC_2.43 ufromfpxl F
 GLIBC_2.43 y0f F
 GLIBC_2.43 y1f F
 GLIBC_2.43 ynf F
+GLIBC_2.44 cosh F
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist
index cac2d2e914..2e88c36c4f 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist
@@ -1447,3 +1447,4 @@ GLIBC_2.43 ufromfpxl F
 GLIBC_2.43 y0f F
 GLIBC_2.43 y1f F
 GLIBC_2.43 ynf F
+GLIBC_2.44 cosh F
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist
index 22c8949912..8f929ae109 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist
@@ -1337,3 +1337,4 @@ GLIBC_2.43 ufromfpxl F
 GLIBC_2.43 y0f F
 GLIBC_2.43 y1f F
 GLIBC_2.43 ynf F
+GLIBC_2.44 cosh F
diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist
index b18629845e..831e9df7bf 100644
--- a/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist
@@ -1370,3 +1370,4 @@ GLIBC_2.43 ufromfpxl F
 GLIBC_2.43 y0f F
 GLIBC_2.43 y1f F
 GLIBC_2.43 ynf F
+GLIBC_2.44 cosh F
diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist
index 02e991c07f..b95e6359f5 100644
--- a/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist
@@ -1370,3 +1370,4 @@ GLIBC_2.43 ufromfpxl F
 GLIBC_2.43 y0f F
 GLIBC_2.43 y1f F
 GLIBC_2.43 ynf F
+GLIBC_2.44 cosh F
-- 
2.43.0



More information about the Libc-alpha mailing list