[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