[PATCH 00/11] Add binary64 cosh/sinh/tanh CORE-MATH implementations to libm
Adhemerval Zanella Netto
adhemerval.zanella@linaro.org
Fri Feb 13 12:23:59 GMT 2026
Ping.
On 28/01/26 13:29, Adhemerval Zanella wrote:
> As for previous binary64 work, I prioritized functions with the lowest
> accuracy. While binary32 allows exhaustive input accuracy checks using
> CPU time, binary64 requires a combination of mathematical analysis and
> statistical testing to ensure correctness.
>
> For the former, Paul Zimmermann and others [1][2] work on analysis and
> the requirements for the efficient and correctly rounded elementary
> functions implementation in floating-point arithmetic as defined by
> the additional mathematical operations of the IEEE 754-2019.
>
> For the latter, I compared the current and CORE-MATH implementations
> across various input ranges using uniformly distributed random numbers
> to assess accuracy and confirm CORE-MATH correctness.
>
> This patch introduces CORE-MATH implementations for cosh, sinh, and tanh,
> which exhibited lower accuracy, particularly in non-default rounding
> modes. As before, the CORE-MATH code was adapted to match glibc code
> style and internal math definitions. I also separated data and common
> definitions to prevent data definitions from being built in ifunc on
> x86_64 and to support code maintainability.
>
> Performance results are mixed, depending on whether the ISA supports a
> fast FMA operation: cosh shows some regressions, while both sinh and
> tanh show improvements. This is mitigated on x86_64 with a new cosh
> ifunc variant and a fix for tanh.
>
> [1] https://inria.hal.science/hal-04474530
> [2] https://members.loria.fr/PZimmermann/papers/accuracy.pdf
>
> Adhemerval Zanella (11):
> benchtests: Adapt cosh
> benchtests: Adapt sinh
> benchtests: Adapt tanh
> math: Use cosh from CORE-MATH
> math: Remove the SVID error handling from cosh
> math: Use sinh from CORE-MATH
> math: Remove the SVID error handling from sinh
> math: Use tanh from CORE-MATH
> math: Consolidated common definition/data for cosh/sinh/tanh
> x86_64: Add cosh with FMA
> x86: Fix tanh ifunc selection
>
> NEWS | 7 +-
> SHARED-FILES | 6 +
> benchtests/cosh-inputs | 1402 ++++++---
> benchtests/sinh-inputs | 1301 +++++++--
> benchtests/tanh-inputs | 1202 ++++++--
> math/Makefile | 4 +
> math/Versions | 5 +
> math/auto-libm-test-in | 52 +
> math/auto-libm-test-out-cosh | 897 ++++++
> math/auto-libm-test-out-sinh | 2553 +++++++++++++++++
> math/auto-libm-test-out-tanh | 69 +
> math/w_cosh_compat.c | 18 +-
> math/w_sinh_compat.c | 18 +-
> sysdeps/i386/Makefile | 3 +
> sysdeps/i386/fpu/libm-test-ulps | 10 +
> sysdeps/ieee754/dbl-64/e_cosh.c | 315 +-
> sysdeps/ieee754/dbl-64/e_cosh_data.c | 60 +
> sysdeps/ieee754/dbl-64/e_cosh_data.h | 38 +
> sysdeps/ieee754/dbl-64/e_coshsinh_common.h | 72 +
> sysdeps/ieee754/dbl-64/e_coshsinh_data.c | 168 ++
> sysdeps/ieee754/dbl-64/e_coshsinh_data.h | 35 +
> sysdeps/ieee754/dbl-64/e_sinh.c | 315 +-
> sysdeps/ieee754/dbl-64/e_sinh_data.c | 86 +
> sysdeps/ieee754/dbl-64/e_sinh_data.h | 35 +
> sysdeps/ieee754/dbl-64/e_tanh_data.c | 59 +
> sysdeps/ieee754/dbl-64/e_tanh_data.h | 38 +
> sysdeps/ieee754/dbl-64/libm-test-ulps | 36 +
> sysdeps/ieee754/dbl-64/math_config.h | 3 +
> sysdeps/ieee754/dbl-64/math_err.c | 2 +-
> sysdeps/ieee754/dbl-64/s_tanh.c | 319 +-
> sysdeps/ieee754/dbl-64/w_cosh.c | 1 +
> sysdeps/ieee754/dbl-64/w_sinh.c | 1 +
> sysdeps/ieee754/e_sinhcosh_common.h | 30 +
> sysdeps/m68k/m680x0/fpu/w_cosh_compat.c | 8 +
> sysdeps/m68k/m680x0/fpu/w_sinh_compat.c | 8 +
> sysdeps/mach/hurd/i386/libm.abilist | 2 +
> sysdeps/unix/sysv/linux/aarch64/libm.abilist | 2 +
> sysdeps/unix/sysv/linux/alpha/libm.abilist | 2 +
> sysdeps/unix/sysv/linux/arm/be/libm.abilist | 2 +
> sysdeps/unix/sysv/linux/arm/le/libm.abilist | 2 +
> sysdeps/unix/sysv/linux/hppa/libm.abilist | 2 +
> sysdeps/unix/sysv/linux/i386/libm.abilist | 2 +
> .../sysv/linux/m68k/coldfire/libm.abilist | 2 +
> .../sysv/linux/microblaze/be/libm.abilist | 2 +
> .../sysv/linux/microblaze/le/libm.abilist | 2 +
> .../unix/sysv/linux/mips/mips32/libm.abilist | 2 +
> .../unix/sysv/linux/mips/mips64/libm.abilist | 2 +
> .../linux/powerpc/powerpc32/fpu/libm.abilist | 2 +
> .../powerpc/powerpc32/nofpu/libm.abilist | 2 +
> .../linux/powerpc/powerpc64/be/libm.abilist | 2 +
> .../linux/powerpc/powerpc64/le/libm.abilist | 2 +
> .../unix/sysv/linux/s390/s390-32/libm.abilist | 2 +
> .../unix/sysv/linux/s390/s390-64/libm.abilist | 2 +
> sysdeps/unix/sysv/linux/sh/be/libm.abilist | 2 +
> sysdeps/unix/sysv/linux/sh/le/libm.abilist | 2 +
> .../sysv/linux/sparc/sparc32/libm.abilist | 2 +
> .../sysv/linux/sparc/sparc64/libm.abilist | 2 +
> .../unix/sysv/linux/x86_64/64/libm.abilist | 2 +
> .../unix/sysv/linux/x86_64/x32/libm.abilist | 2 +
> sysdeps/x86_64/fpu/multiarch/Makefile | 2 +
> sysdeps/x86_64/fpu/multiarch/e_cosh-fma.c | 5 +
> sysdeps/x86_64/fpu/multiarch/e_cosh.c | 44 +
> sysdeps/x86_64/fpu/multiarch/e_sinh-fma.c | 9 +-
> sysdeps/x86_64/fpu/multiarch/e_sinh.c | 17 +-
> sysdeps/x86_64/fpu/multiarch/s_tanh.c | 5 +-
> 65 files changed, 8148 insertions(+), 1158 deletions(-)
> create mode 100644 sysdeps/ieee754/dbl-64/e_cosh_data.c
> create mode 100644 sysdeps/ieee754/dbl-64/e_cosh_data.h
> create mode 100644 sysdeps/ieee754/dbl-64/e_coshsinh_common.h
> create mode 100644 sysdeps/ieee754/dbl-64/e_coshsinh_data.c
> create mode 100644 sysdeps/ieee754/dbl-64/e_coshsinh_data.h
> create mode 100644 sysdeps/ieee754/dbl-64/e_sinh_data.c
> create mode 100644 sysdeps/ieee754/dbl-64/e_sinh_data.h
> create mode 100644 sysdeps/ieee754/dbl-64/e_tanh_data.c
> create mode 100644 sysdeps/ieee754/dbl-64/e_tanh_data.h
> create mode 100644 sysdeps/ieee754/dbl-64/w_cosh.c
> create mode 100644 sysdeps/ieee754/dbl-64/w_sinh.c
> create mode 100644 sysdeps/ieee754/e_sinhcosh_common.h
> create mode 100644 sysdeps/m68k/m680x0/fpu/w_cosh_compat.c
> create mode 100644 sysdeps/m68k/m680x0/fpu/w_sinh_compat.c
> create mode 100644 sysdeps/x86_64/fpu/multiarch/e_cosh-fma.c
> create mode 100644 sysdeps/x86_64/fpu/multiarch/e_cosh.c
>
More information about the Libc-alpha
mailing list