* [PATCH v2 0/3] Add math support for non LDBL_EQ_DBL architecture
@ 2023-04-20 21:23 Jennifer Averett
2023-04-20 21:23 ` [PATCH v2 1/3] newlib: Add FreeBSD files for non LDBL_EQ_DBL support Jennifer Averett
` (2 more replies)
0 siblings, 3 replies; 9+ messages in thread
From: Jennifer Averett @ 2023-04-20 21:23 UTC (permalink / raw)
To: newlib; +Cc: Jennifer Averett
The attached set of patches add long double support for i386, aarch64 and
x86_64. The riscv and powerpc are supported by FreeBSD but will need more
work to be supported by newlib. FreeBSD has separate 64 and 32 bit powerpc
support which would have to be integrated for newlib. FreeBSD riscv support
is 64 and there are issues with fenv.h that would have to be addressed.
The first patch is FreeBSD source. Most of the source resides in three
directories ld, ld128, and ld80. These contain the long double methods.
The ld128 and ld80 are enabled based on the architecture. I also added
the FreeBSD sys/endian.h file which was required to build. Finally, an
architecture machine/_fpmath.h file was copied from FreeBSD for each
architecture the methods are to be built with. The existence of this file
is used to trigger the FreeBSD long double math methods to build. If the
architecture does not have _fpmath.h the LDBL_EQ_DBL files are built instead.
The second patch contains the modifications necessary to build in newlib.
In FreeBSD some header files from any of the three directories are visible to
all the source files. The include statements were modified so the header
file was pulled from the required directory (e.g, “file.h” was changed to
“ld/file.h”). The files invtrig.h and k_expl.h were created in the ld
directory and conditionally include either the ld128 or the ld80 version of
that header file. If the configure/makefile magic were changed it might be
possible to adjust the include arguments to the compiler rather than the
include statements.
Also in the second patch, some of the _fpmath.h and a couple of the source files
unsigned long and unsigned int were changed to fixed width types so different
sized unsigned long could be accommodated. The FreeBSD files s_nearbyint.c,
s_fdim.c, and scalbln.c contained integer, float and long double
methods. The int and float methods were removed and the file names were
changed to s_nearbyintl.c, fdiml.c and scalblnl.c to resolve conflicts.
Finally, defines were add to math.h for the added architectures.
These changes were checked against the FACE Conformance Test Suite.
Jennifer Averett (3):
newlib: Add FreeBSD files for non LDBL_EQ_DBL support
newlib: Add non LDBL_EQ_DBL math support for aarch64, i386, and x86_64
Regenerated source for adding non LDBL_EQ_DBL
newlib/Makefile.in | 1463 ++++++++++++++++-
newlib/configure | 16 +
newlib/libc/acinclude.m4 | 3 +
newlib/libc/include/endian.h | 207 +++
newlib/libc/include/math.h | 3 +-
newlib/libc/machine/aarch64/machine/_fpmath.h | 64 +
newlib/libc/machine/i386/machine/_fpmath.h | 56 +
newlib/libc/machine/x86_64/machine/_fpmath.h | 57 +
newlib/libm/Makefile.inc | 8 +
newlib/libm/ld/Makefile.inc | 56 +
newlib/libm/ld/e_acoshl.c | 89 +
newlib/libm/ld/e_acosl.c | 87 +
newlib/libm/ld/e_asinl.c | 77 +
newlib/libm/ld/e_atan2l.c | 120 ++
newlib/libm/ld/e_atanhl.c | 74 +
newlib/libm/ld/e_coshl.c | 132 ++
newlib/libm/ld/e_fmodl.c | 149 ++
newlib/libm/ld/e_lgammal.c | 27 +
newlib/libm/ld/e_remainderl.c | 40 +
newlib/libm/ld/e_sinhl.c | 134 ++
newlib/libm/ld/fdiml.c | 55 +
newlib/libm/ld/fpmath.h | 82 +
newlib/libm/ld/invtrig.h | 34 +
newlib/libm/ld/k_expl.h | 33 +
newlib/libm/ld/math_private.h | 941 +++++++++++
newlib/libm/ld/s_asinhl.c | 91 +
newlib/libm/ld/s_atanl.c | 85 +
newlib/libm/ld/s_cbrtl.c | 143 ++
newlib/libm/ld/s_ceill.c | 101 ++
newlib/libm/ld/s_copysignl.c | 44 +
newlib/libm/ld/s_cosl.c | 102 ++
newlib/libm/ld/s_fabsl.c | 45 +
newlib/libm/ld/s_floorl.c | 101 ++
newlib/libm/ld/s_fmal.c | 274 +++
newlib/libm/ld/s_fmaxl.c | 57 +
newlib/libm/ld/s_fminl.c | 57 +
newlib/libm/ld/s_frexpl.c | 64 +
newlib/libm/ld/s_ilogbl.c | 53 +
newlib/libm/ld/s_llrintl.c | 9 +
newlib/libm/ld/s_llroundl.c | 11 +
newlib/libm/ld/s_logbl.c | 54 +
newlib/libm/ld/s_lrint.c | 60 +
newlib/libm/ld/s_lrintl.c | 9 +
newlib/libm/ld/s_lround.c | 70 +
newlib/libm/ld/s_lroundl.c | 11 +
newlib/libm/ld/s_modfl.c | 103 ++
newlib/libm/ld/s_nearbyintl.c | 68 +
newlib/libm/ld/s_nextafterl.c | 80 +
newlib/libm/ld/s_nexttoward.c | 72 +
newlib/libm/ld/s_nexttowardf.c | 59 +
newlib/libm/ld/s_remquol.c | 173 ++
newlib/libm/ld/s_rintl.c | 92 ++
newlib/libm/ld/s_roundl.c | 64 +
newlib/libm/ld/s_scalbnl.c | 49 +
newlib/libm/ld/s_sinl.c | 95 ++
newlib/libm/ld/s_tanhl.c | 174 ++
newlib/libm/ld/s_tanl.c | 97 ++
newlib/libm/ld/s_truncl.c | 68 +
newlib/libm/ld/scalblnl.c | 63 +
newlib/libm/ld128/Makefile.inc | 14 +
newlib/libm/ld128/b_tgammal.c | 57 +
newlib/libm/ld128/e_lgammal_r.c | 330 ++++
newlib/libm/ld128/e_powl.c | 443 +++++
newlib/libm/ld128/e_rem_pio2l.h | 135 ++
newlib/libm/ld128/invtrig.c | 102 ++
newlib/libm/ld128/invtrig.h | 115 ++
newlib/libm/ld128/k_cosl.c | 59 +
newlib/libm/ld128/k_expl.h | 324 ++++
newlib/libm/ld128/k_sinl.c | 59 +
newlib/libm/ld128/s_erfl.c | 329 ++++
newlib/libm/ld128/s_exp2l.c | 429 +++++
newlib/libm/ld128/s_expl.c | 326 ++++
newlib/libm/ld128/s_logl.c | 740 +++++++++
newlib/libm/ld80/Makefile.inc | 15 +
newlib/libm/ld80/b_expl.c | 113 ++
newlib/libm/ld80/b_logl.c | 375 +++++
newlib/libm/ld80/b_tgammal.c | 422 +++++
newlib/libm/ld80/e_lgammal_r.c | 358 ++++
newlib/libm/ld80/e_powl.c | 662 ++++++++
newlib/libm/ld80/e_rem_pio2l.h | 143 ++
newlib/libm/ld80/invtrig.c | 84 +
newlib/libm/ld80/invtrig.h | 116 ++
newlib/libm/ld80/k_cosl.c | 78 +
newlib/libm/ld80/k_cospil.h | 42 +
newlib/libm/ld80/k_expl.h | 301 ++++
newlib/libm/ld80/k_sinl.c | 62 +
newlib/libm/ld80/k_sinpil.h | 42 +
newlib/libm/ld80/s_cospil.c | 129 ++
newlib/libm/ld80/s_erfl.c | 337 ++++
newlib/libm/ld80/s_exp2l.c | 290 ++++
newlib/libm/ld80/s_expl.c | 279 ++++
newlib/libm/ld80/s_logl.c | 722 ++++++++
newlib/libm/ld80/s_sinpil.c | 140 ++
newlib/newlib.hin | 12 +
94 files changed, 14823 insertions(+), 66 deletions(-)
create mode 100644 newlib/libc/include/endian.h
create mode 100644 newlib/libc/machine/aarch64/machine/_fpmath.h
create mode 100644 newlib/libc/machine/i386/machine/_fpmath.h
create mode 100644 newlib/libc/machine/x86_64/machine/_fpmath.h
create mode 100644 newlib/libm/ld/Makefile.inc
create mode 100644 newlib/libm/ld/e_acoshl.c
create mode 100644 newlib/libm/ld/e_acosl.c
create mode 100644 newlib/libm/ld/e_asinl.c
create mode 100644 newlib/libm/ld/e_atan2l.c
create mode 100644 newlib/libm/ld/e_atanhl.c
create mode 100644 newlib/libm/ld/e_coshl.c
create mode 100644 newlib/libm/ld/e_fmodl.c
create mode 100644 newlib/libm/ld/e_lgammal.c
create mode 100644 newlib/libm/ld/e_remainderl.c
create mode 100644 newlib/libm/ld/e_sinhl.c
create mode 100644 newlib/libm/ld/fdiml.c
create mode 100644 newlib/libm/ld/fpmath.h
create mode 100644 newlib/libm/ld/invtrig.h
create mode 100644 newlib/libm/ld/k_expl.h
create mode 100644 newlib/libm/ld/math_private.h
create mode 100644 newlib/libm/ld/s_asinhl.c
create mode 100644 newlib/libm/ld/s_atanl.c
create mode 100644 newlib/libm/ld/s_cbrtl.c
create mode 100644 newlib/libm/ld/s_ceill.c
create mode 100644 newlib/libm/ld/s_copysignl.c
create mode 100644 newlib/libm/ld/s_cosl.c
create mode 100644 newlib/libm/ld/s_fabsl.c
create mode 100644 newlib/libm/ld/s_floorl.c
create mode 100644 newlib/libm/ld/s_fmal.c
create mode 100644 newlib/libm/ld/s_fmaxl.c
create mode 100644 newlib/libm/ld/s_fminl.c
create mode 100644 newlib/libm/ld/s_frexpl.c
create mode 100644 newlib/libm/ld/s_ilogbl.c
create mode 100644 newlib/libm/ld/s_llrintl.c
create mode 100644 newlib/libm/ld/s_llroundl.c
create mode 100644 newlib/libm/ld/s_logbl.c
create mode 100644 newlib/libm/ld/s_lrint.c
create mode 100644 newlib/libm/ld/s_lrintl.c
create mode 100644 newlib/libm/ld/s_lround.c
create mode 100644 newlib/libm/ld/s_lroundl.c
create mode 100644 newlib/libm/ld/s_modfl.c
create mode 100644 newlib/libm/ld/s_nearbyintl.c
create mode 100644 newlib/libm/ld/s_nextafterl.c
create mode 100644 newlib/libm/ld/s_nexttoward.c
create mode 100644 newlib/libm/ld/s_nexttowardf.c
create mode 100644 newlib/libm/ld/s_remquol.c
create mode 100644 newlib/libm/ld/s_rintl.c
create mode 100644 newlib/libm/ld/s_roundl.c
create mode 100644 newlib/libm/ld/s_scalbnl.c
create mode 100644 newlib/libm/ld/s_sinl.c
create mode 100644 newlib/libm/ld/s_tanhl.c
create mode 100644 newlib/libm/ld/s_tanl.c
create mode 100644 newlib/libm/ld/s_truncl.c
create mode 100644 newlib/libm/ld/scalblnl.c
create mode 100644 newlib/libm/ld128/Makefile.inc
create mode 100644 newlib/libm/ld128/b_tgammal.c
create mode 100644 newlib/libm/ld128/e_lgammal_r.c
create mode 100644 newlib/libm/ld128/e_powl.c
create mode 100644 newlib/libm/ld128/e_rem_pio2l.h
create mode 100644 newlib/libm/ld128/invtrig.c
create mode 100644 newlib/libm/ld128/invtrig.h
create mode 100644 newlib/libm/ld128/k_cosl.c
create mode 100644 newlib/libm/ld128/k_expl.h
create mode 100644 newlib/libm/ld128/k_sinl.c
create mode 100644 newlib/libm/ld128/s_erfl.c
create mode 100644 newlib/libm/ld128/s_exp2l.c
create mode 100644 newlib/libm/ld128/s_expl.c
create mode 100644 newlib/libm/ld128/s_logl.c
create mode 100644 newlib/libm/ld80/Makefile.inc
create mode 100644 newlib/libm/ld80/b_expl.c
create mode 100644 newlib/libm/ld80/b_logl.c
create mode 100644 newlib/libm/ld80/b_tgammal.c
create mode 100644 newlib/libm/ld80/e_lgammal_r.c
create mode 100644 newlib/libm/ld80/e_powl.c
create mode 100644 newlib/libm/ld80/e_rem_pio2l.h
create mode 100644 newlib/libm/ld80/invtrig.c
create mode 100644 newlib/libm/ld80/invtrig.h
create mode 100644 newlib/libm/ld80/k_cosl.c
create mode 100644 newlib/libm/ld80/k_cospil.h
create mode 100644 newlib/libm/ld80/k_expl.h
create mode 100644 newlib/libm/ld80/k_sinl.c
create mode 100644 newlib/libm/ld80/k_sinpil.h
create mode 100644 newlib/libm/ld80/s_cospil.c
create mode 100644 newlib/libm/ld80/s_erfl.c
create mode 100644 newlib/libm/ld80/s_exp2l.c
create mode 100644 newlib/libm/ld80/s_expl.c
create mode 100644 newlib/libm/ld80/s_logl.c
create mode 100644 newlib/libm/ld80/s_sinpil.c
--
2.31.1
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v2 1/3] newlib: Add FreeBSD files for non LDBL_EQ_DBL support
2023-04-20 21:23 [PATCH v2 0/3] Add math support for non LDBL_EQ_DBL architecture Jennifer Averett
@ 2023-04-20 21:23 ` Jennifer Averett
2023-04-24 8:51 ` Corinna Vinschen
2023-04-24 13:03 ` Sebastian Huber
2023-04-20 21:23 ` [PATCH v2 2/3] newlib: Add non LDBL_EQ_DBL math support for aarch64, i386, and x86_64 Jennifer Averett
2023-04-20 21:23 ` [PATCH v2 3/3] Regenerated source for adding non LDBL_EQ_DBL Jennifer Averett
2 siblings, 2 replies; 9+ messages in thread
From: Jennifer Averett @ 2023-04-20 21:23 UTC (permalink / raw)
To: newlib; +Cc: Jennifer Averett
FreeBSD files to add long double support for i386,
aarch64 and x86_64.
---
newlib/libc/include/sys/endian.h | 177 ++++
newlib/libc/machine/aarch64/machine/_fpmath.h | 58 ++
newlib/libc/machine/i386/machine/_fpmath.h | 56 ++
newlib/libc/machine/x86_64/machine/_fpmath.h | 57 ++
newlib/libm/ld/e_acoshl.c | 89 ++
newlib/libm/ld/e_acosl.c | 87 ++
newlib/libm/ld/e_asinl.c | 77 ++
newlib/libm/ld/e_atan2l.c | 120 +++
newlib/libm/ld/e_atanhl.c | 74 ++
newlib/libm/ld/e_coshl.c | 132 +++
newlib/libm/ld/e_fmodl.c | 149 +++
newlib/libm/ld/e_lgammal.c | 25 +
newlib/libm/ld/e_remainderl.c | 40 +
newlib/libm/ld/e_sinhl.c | 134 +++
newlib/libm/ld/fpmath.h | 82 ++
newlib/libm/ld/math_private.h | 924 ++++++++++++++++++
newlib/libm/ld/s_asinhl.c | 91 ++
newlib/libm/ld/s_atanl.c | 85 ++
newlib/libm/ld/s_cbrtl.c | 143 +++
newlib/libm/ld/s_ceill.c | 101 ++
newlib/libm/ld/s_copysignl.c | 44 +
newlib/libm/ld/s_cosl.c | 102 ++
newlib/libm/ld/s_fabsl.c | 45 +
newlib/libm/ld/s_fdim.c | 48 +
newlib/libm/ld/s_floorl.c | 101 ++
newlib/libm/ld/s_fmal.c | 274 ++++++
newlib/libm/ld/s_fmaxl.c | 57 ++
newlib/libm/ld/s_fminl.c | 57 ++
newlib/libm/ld/s_frexpl.c | 64 ++
newlib/libm/ld/s_ilogbl.c | 53 +
newlib/libm/ld/s_llrintl.c | 9 +
newlib/libm/ld/s_llroundl.c | 11 +
newlib/libm/ld/s_logbl.c | 54 +
newlib/libm/ld/s_lrint.c | 60 ++
newlib/libm/ld/s_lrintl.c | 9 +
newlib/libm/ld/s_lround.c | 70 ++
newlib/libm/ld/s_lroundl.c | 11 +
newlib/libm/ld/s_modfl.c | 103 ++
newlib/libm/ld/s_nearbyint.c | 61 ++
newlib/libm/ld/s_nextafterl.c | 80 ++
newlib/libm/ld/s_nexttoward.c | 72 ++
newlib/libm/ld/s_nexttowardf.c | 59 ++
newlib/libm/ld/s_remquol.c | 173 ++++
newlib/libm/ld/s_rintl.c | 92 ++
newlib/libm/ld/s_roundl.c | 64 ++
newlib/libm/ld/s_scalbln.c | 56 ++
newlib/libm/ld/s_scalbnl.c | 49 +
newlib/libm/ld/s_sinl.c | 95 ++
newlib/libm/ld/s_tanhl.c | 174 ++++
newlib/libm/ld/s_tanl.c | 97 ++
newlib/libm/ld/s_truncl.c | 68 ++
newlib/libm/ld128/b_tgammal.c | 57 ++
newlib/libm/ld128/e_lgammal_r.c | 330 +++++++
newlib/libm/ld128/e_powl.c | 443 +++++++++
newlib/libm/ld128/e_rem_pio2l.h | 135 +++
newlib/libm/ld128/invtrig.c | 102 ++
newlib/libm/ld128/invtrig.h | 115 +++
newlib/libm/ld128/k_cosl.c | 59 ++
newlib/libm/ld128/k_expl.h | 324 ++++++
newlib/libm/ld128/k_sinl.c | 59 ++
newlib/libm/ld128/s_erfl.c | 329 +++++++
newlib/libm/ld128/s_exp2l.c | 429 ++++++++
newlib/libm/ld128/s_expl.c | 326 ++++++
newlib/libm/ld128/s_logl.c | 740 ++++++++++++++
newlib/libm/ld80/b_expl.c | 113 +++
newlib/libm/ld80/b_logl.c | 375 +++++++
newlib/libm/ld80/b_tgammal.c | 419 ++++++++
newlib/libm/ld80/e_lgammal_r.c | 358 +++++++
newlib/libm/ld80/e_powl.c | 662 +++++++++++++
newlib/libm/ld80/e_rem_pio2l.h | 143 +++
newlib/libm/ld80/invtrig.c | 84 ++
newlib/libm/ld80/invtrig.h | 116 +++
newlib/libm/ld80/k_cosl.c | 78 ++
newlib/libm/ld80/k_cospil.h | 42 +
newlib/libm/ld80/k_expl.h | 301 ++++++
newlib/libm/ld80/k_sinl.c | 62 ++
newlib/libm/ld80/k_sinpil.h | 42 +
newlib/libm/ld80/s_cospil.c | 129 +++
newlib/libm/ld80/s_erfl.c | 337 +++++++
newlib/libm/ld80/s_exp2l.c | 290 ++++++
newlib/libm/ld80/s_expl.c | 279 ++++++
newlib/libm/ld80/s_logl.c | 722 ++++++++++++++
newlib/libm/ld80/s_sinpil.c | 140 +++
83 files changed, 13153 insertions(+)
create mode 100644 newlib/libc/include/sys/endian.h
create mode 100644 newlib/libc/machine/aarch64/machine/_fpmath.h
create mode 100644 newlib/libc/machine/i386/machine/_fpmath.h
create mode 100644 newlib/libc/machine/x86_64/machine/_fpmath.h
create mode 100644 newlib/libm/ld/e_acoshl.c
create mode 100644 newlib/libm/ld/e_acosl.c
create mode 100644 newlib/libm/ld/e_asinl.c
create mode 100644 newlib/libm/ld/e_atan2l.c
create mode 100644 newlib/libm/ld/e_atanhl.c
create mode 100644 newlib/libm/ld/e_coshl.c
create mode 100644 newlib/libm/ld/e_fmodl.c
create mode 100644 newlib/libm/ld/e_lgammal.c
create mode 100644 newlib/libm/ld/e_remainderl.c
create mode 100644 newlib/libm/ld/e_sinhl.c
create mode 100644 newlib/libm/ld/fpmath.h
create mode 100644 newlib/libm/ld/math_private.h
create mode 100644 newlib/libm/ld/s_asinhl.c
create mode 100644 newlib/libm/ld/s_atanl.c
create mode 100644 newlib/libm/ld/s_cbrtl.c
create mode 100644 newlib/libm/ld/s_ceill.c
create mode 100644 newlib/libm/ld/s_copysignl.c
create mode 100644 newlib/libm/ld/s_cosl.c
create mode 100644 newlib/libm/ld/s_fabsl.c
create mode 100644 newlib/libm/ld/s_fdim.c
create mode 100644 newlib/libm/ld/s_floorl.c
create mode 100644 newlib/libm/ld/s_fmal.c
create mode 100644 newlib/libm/ld/s_fmaxl.c
create mode 100644 newlib/libm/ld/s_fminl.c
create mode 100644 newlib/libm/ld/s_frexpl.c
create mode 100644 newlib/libm/ld/s_ilogbl.c
create mode 100644 newlib/libm/ld/s_llrintl.c
create mode 100644 newlib/libm/ld/s_llroundl.c
create mode 100644 newlib/libm/ld/s_logbl.c
create mode 100644 newlib/libm/ld/s_lrint.c
create mode 100644 newlib/libm/ld/s_lrintl.c
create mode 100644 newlib/libm/ld/s_lround.c
create mode 100644 newlib/libm/ld/s_lroundl.c
create mode 100644 newlib/libm/ld/s_modfl.c
create mode 100644 newlib/libm/ld/s_nearbyint.c
create mode 100644 newlib/libm/ld/s_nextafterl.c
create mode 100644 newlib/libm/ld/s_nexttoward.c
create mode 100644 newlib/libm/ld/s_nexttowardf.c
create mode 100644 newlib/libm/ld/s_remquol.c
create mode 100644 newlib/libm/ld/s_rintl.c
create mode 100644 newlib/libm/ld/s_roundl.c
create mode 100644 newlib/libm/ld/s_scalbln.c
create mode 100644 newlib/libm/ld/s_scalbnl.c
create mode 100644 newlib/libm/ld/s_sinl.c
create mode 100644 newlib/libm/ld/s_tanhl.c
create mode 100644 newlib/libm/ld/s_tanl.c
create mode 100644 newlib/libm/ld/s_truncl.c
create mode 100644 newlib/libm/ld128/b_tgammal.c
create mode 100644 newlib/libm/ld128/e_lgammal_r.c
create mode 100644 newlib/libm/ld128/e_powl.c
create mode 100644 newlib/libm/ld128/e_rem_pio2l.h
create mode 100644 newlib/libm/ld128/invtrig.c
create mode 100644 newlib/libm/ld128/invtrig.h
create mode 100644 newlib/libm/ld128/k_cosl.c
create mode 100644 newlib/libm/ld128/k_expl.h
create mode 100644 newlib/libm/ld128/k_sinl.c
create mode 100644 newlib/libm/ld128/s_erfl.c
create mode 100644 newlib/libm/ld128/s_exp2l.c
create mode 100644 newlib/libm/ld128/s_expl.c
create mode 100644 newlib/libm/ld128/s_logl.c
create mode 100644 newlib/libm/ld80/b_expl.c
create mode 100644 newlib/libm/ld80/b_logl.c
create mode 100644 newlib/libm/ld80/b_tgammal.c
create mode 100644 newlib/libm/ld80/e_lgammal_r.c
create mode 100644 newlib/libm/ld80/e_powl.c
create mode 100644 newlib/libm/ld80/e_rem_pio2l.h
create mode 100644 newlib/libm/ld80/invtrig.c
create mode 100644 newlib/libm/ld80/invtrig.h
create mode 100644 newlib/libm/ld80/k_cosl.c
create mode 100644 newlib/libm/ld80/k_cospil.h
create mode 100644 newlib/libm/ld80/k_expl.h
create mode 100644 newlib/libm/ld80/k_sinl.c
create mode 100644 newlib/libm/ld80/k_sinpil.h
create mode 100644 newlib/libm/ld80/s_cospil.c
create mode 100644 newlib/libm/ld80/s_erfl.c
create mode 100644 newlib/libm/ld80/s_exp2l.c
create mode 100644 newlib/libm/ld80/s_expl.c
create mode 100644 newlib/libm/ld80/s_logl.c
create mode 100644 newlib/libm/ld80/s_sinpil.c
diff --git a/newlib/libc/include/sys/endian.h b/newlib/libc/include/sys/endian.h
new file mode 100644
index 000000000..d91c442e9
--- /dev/null
+++ b/newlib/libc/include/sys/endian.h
@@ -0,0 +1,177 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2002 Thomas Moestl <tmm@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _SYS_ENDIAN_H_
+#define _SYS_ENDIAN_H_
+
+#include <sys/cdefs.h>
+#include <sys/_types.h>
+#include <machine/endian.h>
+
+#ifndef _UINT8_T_DECLARED
+typedef __uint8_t uint8_t;
+#define _UINT8_T_DECLARED
+#endif
+
+#ifndef _UINT16_T_DECLARED
+typedef __uint16_t uint16_t;
+#define _UINT16_T_DECLARED
+#endif
+
+#ifndef _UINT32_T_DECLARED
+typedef __uint32_t uint32_t;
+#define _UINT32_T_DECLARED
+#endif
+
+#ifndef _UINT64_T_DECLARED
+typedef __uint64_t uint64_t;
+#define _UINT64_T_DECLARED
+#endif
+
+/*
+ * Note: While tempting to try to avoid namespace pollution from this file,
+ * several software packages assume these marcos are defined, even when it
+ * defines _POSIX_C_SOURCE to request an unpolluted namespace.
+ */
+
+/*
+ * General byte order swapping functions.
+ */
+#define bswap16(x) __bswap16(x)
+#define bswap32(x) __bswap32(x)
+#define bswap64(x) __bswap64(x)
+
+/* Alignment-agnostic encode/decode bytestream to/from little/big endian. */
+static __inline uint16_t
+be16dec(const void *pp)
+{
+ uint8_t const *p = (uint8_t const *)pp;
+
+ return ((p[0] << 8) | p[1]);
+}
+
+static __inline uint32_t
+be32dec(const void *pp)
+{
+ uint8_t const *p = (uint8_t const *)pp;
+
+ return (((unsigned)p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]);
+}
+
+static __inline uint64_t
+be64dec(const void *pp)
+{
+ uint8_t const *p = (uint8_t const *)pp;
+
+ return (((uint64_t)be32dec(p) << 32) | be32dec(p + 4));
+}
+
+static __inline uint16_t
+le16dec(const void *pp)
+{
+ uint8_t const *p = (uint8_t const *)pp;
+
+ return ((p[1] << 8) | p[0]);
+}
+
+static __inline uint32_t
+le32dec(const void *pp)
+{
+ uint8_t const *p = (uint8_t const *)pp;
+
+ return (((unsigned)p[3] << 24) | (p[2] << 16) | (p[1] << 8) | p[0]);
+}
+
+static __inline uint64_t
+le64dec(const void *pp)
+{
+ uint8_t const *p = (uint8_t const *)pp;
+
+ return (((uint64_t)le32dec(p + 4) << 32) | le32dec(p));
+}
+
+static __inline void
+be16enc(void *pp, uint16_t u)
+{
+ uint8_t *p = (uint8_t *)pp;
+
+ p[0] = (u >> 8) & 0xff;
+ p[1] = u & 0xff;
+}
+
+static __inline void
+be32enc(void *pp, uint32_t u)
+{
+ uint8_t *p = (uint8_t *)pp;
+
+ p[0] = (u >> 24) & 0xff;
+ p[1] = (u >> 16) & 0xff;
+ p[2] = (u >> 8) & 0xff;
+ p[3] = u & 0xff;
+}
+
+static __inline void
+be64enc(void *pp, uint64_t u)
+{
+ uint8_t *p = (uint8_t *)pp;
+
+ be32enc(p, (uint32_t)(u >> 32));
+ be32enc(p + 4, (uint32_t)(u & 0xffffffffU));
+}
+
+static __inline void
+le16enc(void *pp, uint16_t u)
+{
+ uint8_t *p = (uint8_t *)pp;
+
+ p[0] = u & 0xff;
+ p[1] = (u >> 8) & 0xff;
+}
+
+static __inline void
+le32enc(void *pp, uint32_t u)
+{
+ uint8_t *p = (uint8_t *)pp;
+
+ p[0] = u & 0xff;
+ p[1] = (u >> 8) & 0xff;
+ p[2] = (u >> 16) & 0xff;
+ p[3] = (u >> 24) & 0xff;
+}
+
+static __inline void
+le64enc(void *pp, uint64_t u)
+{
+ uint8_t *p = (uint8_t *)pp;
+
+ le32enc(p, (uint32_t)(u & 0xffffffffU));
+ le32enc(p + 4, (uint32_t)(u >> 32));
+}
+#endif /* _SYS_ENDIAN_H_ */
diff --git a/newlib/libc/machine/aarch64/machine/_fpmath.h b/newlib/libc/machine/aarch64/machine/_fpmath.h
new file mode 100644
index 000000000..71d0a7152
--- /dev/null
+++ b/newlib/libc/machine/aarch64/machine/_fpmath.h
@@ -0,0 +1,58 @@
+/*-
+ * Copyright (c) 2002, 2003 David Schultz <das@FreeBSD.ORG>
+ * Copyright (2) 2014 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+union IEEEl2bits {
+ long double e;
+ struct {
+ unsigned long manl :64;
+ unsigned long manh :48;
+ unsigned int exp :15;
+ unsigned int sign :1;
+ } bits;
+ /* TODO andrew: Check the packing here */
+ struct {
+ unsigned long manl :64;
+ unsigned long manh :48;
+ unsigned int expsign :16;
+ } xbits;
+};
+
+#define LDBL_NBIT 0
+#define LDBL_IMPLICIT_NBIT
+#define mask_nbit_l(u) ((void)0)
+
+#define LDBL_MANH_SIZE 48
+#define LDBL_MANL_SIZE 64
+
+#define LDBL_TO_ARRAY32(u, a) do { \
+ (a)[0] = (uint32_t)(u).bits.manl; \
+ (a)[1] = (uint32_t)((u).bits.manl >> 32); \
+ (a)[2] = (uint32_t)(u).bits.manh; \
+ (a)[3] = (uint32_t)((u).bits.manh >> 32); \
+} while(0)
diff --git a/newlib/libc/machine/i386/machine/_fpmath.h b/newlib/libc/machine/i386/machine/_fpmath.h
new file mode 100644
index 000000000..874439c34
--- /dev/null
+++ b/newlib/libc/machine/i386/machine/_fpmath.h
@@ -0,0 +1,56 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2002, 2003 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+union IEEEl2bits {
+ long double e;
+ struct {
+ unsigned int manl :32;
+ unsigned int manh :32;
+ unsigned int exp :15;
+ unsigned int sign :1;
+ unsigned int junk :16;
+ } bits;
+ struct {
+ unsigned long long man :64;
+ unsigned int expsign :16;
+ unsigned int junk :16;
+ } xbits;
+};
+
+#define LDBL_NBIT 0x80000000
+#define mask_nbit_l(u) ((u).bits.manh &= ~LDBL_NBIT)
+
+#define LDBL_MANH_SIZE 32
+#define LDBL_MANL_SIZE 32
+
+#define LDBL_TO_ARRAY32(u, a) do { \
+ (a)[0] = (uint32_t)(u).bits.manl; \
+ (a)[1] = (uint32_t)(u).bits.manh; \
+} while (0)
diff --git a/newlib/libc/machine/x86_64/machine/_fpmath.h b/newlib/libc/machine/x86_64/machine/_fpmath.h
new file mode 100644
index 000000000..8be7b7dba
--- /dev/null
+++ b/newlib/libc/machine/x86_64/machine/_fpmath.h
@@ -0,0 +1,57 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2002, 2003 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+union IEEEl2bits {
+ long double e;
+ struct {
+ unsigned int manl :32;
+ unsigned int manh :32;
+ unsigned int exp :15;
+ unsigned int sign :1;
+ unsigned int junkl :16;
+ unsigned int junkh :32;
+ } bits;
+ struct {
+ unsigned long man :64;
+ unsigned int expsign :16;
+ unsigned long junk :48;
+ } xbits;
+};
+
+#define LDBL_NBIT 0x80000000
+#define mask_nbit_l(u) ((u).bits.manh &= ~LDBL_NBIT)
+
+#define LDBL_MANH_SIZE 32
+#define LDBL_MANL_SIZE 32
+
+#define LDBL_TO_ARRAY32(u, a) do { \
+ (a)[0] = (uint32_t)(u).bits.manl; \
+ (a)[1] = (uint32_t)(u).bits.manh; \
+} while (0)
diff --git a/newlib/libm/ld/e_acoshl.c b/newlib/libm/ld/e_acoshl.c
new file mode 100644
index 000000000..b9f3aed67
--- /dev/null
+++ b/newlib/libm/ld/e_acoshl.c
@@ -0,0 +1,89 @@
+/* from: FreeBSD: head/lib/msun/src/e_acosh.c 176451 2008-02-22 02:30:36Z das */
+
+/* @(#)e_acosh.c 1.3 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * See e_acosh.c for complete comments.
+ *
+ * Converted to long double by David Schultz <das@FreeBSD.ORG> and
+ * Bruce D. Evans.
+ */
+
+#include <float.h>
+#ifdef __i386__
+#include <ieeefp.h>
+#endif
+
+#include "fpmath.h"
+#include "math.h"
+#include "math_private.h"
+
+/* EXP_LARGE is the threshold above which we use acosh(x) ~= log(2x). */
+#if LDBL_MANT_DIG == 64
+#define EXP_LARGE 34
+#elif LDBL_MANT_DIG == 113
+#define EXP_LARGE 58
+#else
+#error "Unsupported long double format"
+#endif
+
+#if LDBL_MAX_EXP != 0x4000
+/* We also require the usual expsign encoding. */
+#error "Unsupported long double format"
+#endif
+
+#define BIAS (LDBL_MAX_EXP - 1)
+
+static const double
+one = 1.0;
+
+#if LDBL_MANT_DIG == 64
+static const union IEEEl2bits
+u_ln2 = LD80C(0xb17217f7d1cf79ac, -1, 6.93147180559945309417e-1L);
+#define ln2 u_ln2.e
+#elif LDBL_MANT_DIG == 113
+static const long double
+ln2 = 6.93147180559945309417232121458176568e-1L; /* 0x162e42fefa39ef35793c7673007e6.0p-113 */
+#else
+#error "Unsupported long double format"
+#endif
+
+long double
+acoshl(long double x)
+{
+ long double t;
+ int16_t hx;
+
+ ENTERI();
+ GET_LDBL_EXPSIGN(hx, x);
+ if (hx < 0x3fff) { /* x < 1, or misnormal */
+ RETURNI((x-x)/(x-x));
+ } else if (hx >= BIAS + EXP_LARGE) { /* x >= LARGE */
+ if (hx >= 0x7fff) { /* x is inf, NaN or misnormal */
+ RETURNI(x+x);
+ } else
+ RETURNI(logl(x)+ln2); /* acosh(huge)=log(2x), or misnormal */
+ } else if (hx == 0x3fff && x == 1) {
+ RETURNI(0.0); /* acosh(1) = 0 */
+ } else if (hx >= 0x4000) { /* LARGE > x >= 2, or misnormal */
+ t=x*x;
+ RETURNI(logl(2.0*x-one/(x+sqrtl(t-one))));
+ } else { /* 1<x<2 */
+ t = x-one;
+ RETURNI(log1pl(t+sqrtl(2.0*t+t*t)));
+ }
+}
diff --git a/newlib/libm/ld/e_acosl.c b/newlib/libm/ld/e_acosl.c
new file mode 100644
index 000000000..d33c8feda
--- /dev/null
+++ b/newlib/libm/ld/e_acosl.c
@@ -0,0 +1,87 @@
+
+/* @(#)e_acos.c 1.3 95/01/18 */
+/* FreeBSD: head/lib/msun/src/e_acos.c 176451 2008-02-22 02:30:36Z das */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * See comments in e_acos.c.
+ * Converted to long double by David Schultz <das@FreeBSD.ORG>.
+ */
+
+#include <float.h>
+
+#include "invtrig.h"
+#include "math.h"
+#include "math_private.h"
+
+static const long double
+one= 1.00000000000000000000e+00;
+
+#ifdef __i386__
+/* XXX Work around the fact that gcc truncates long double constants on i386 */
+static volatile double
+pi1 = 3.14159265358979311600e+00, /* 0x1.921fb54442d18p+1 */
+pi2 = 1.22514845490862001043e-16; /* 0x1.1a80000000000p-53 */
+#define pi ((long double)pi1 + pi2)
+#else
+static const long double
+pi = 3.14159265358979323846264338327950280e+00L;
+#endif
+
+long double
+acosl(long double x)
+{
+ union IEEEl2bits u;
+ long double z,p,q,r,w,s,c,df;
+ int16_t expsign, expt;
+ u.e = x;
+ expsign = u.xbits.expsign;
+ expt = expsign & 0x7fff;
+ if(expt >= BIAS) { /* |x| >= 1 */
+ if(expt==BIAS && ((u.bits.manh&~LDBL_NBIT)|u.bits.manl)==0) {
+ if (expsign>0) return 0.0; /* acos(1) = 0 */
+ else return pi+2.0*pio2_lo; /* acos(-1)= pi */
+ }
+ return (x-x)/(x-x); /* acos(|x|>1) is NaN */
+ }
+ if(expt<BIAS-1) { /* |x| < 0.5 */
+ if(expt<ACOS_CONST) return pio2_hi+pio2_lo;/*x tiny: acosl=pi/2*/
+ z = x*x;
+ p = P(z);
+ q = Q(z);
+ r = p/q;
+ return pio2_hi - (x - (pio2_lo-x*r));
+ } else if (expsign<0) { /* x < -0.5 */
+ z = (one+x)*0.5;
+ p = P(z);
+ q = Q(z);
+ s = sqrtl(z);
+ r = p/q;
+ w = r*s-pio2_lo;
+ return pi - 2.0*(s+w);
+ } else { /* x > 0.5 */
+ z = (one-x)*0.5;
+ s = sqrtl(z);
+ u.e = s;
+ u.bits.manl = 0;
+ df = u.e;
+ c = (z-df*df)/(s+df);
+ p = P(z);
+ q = Q(z);
+ r = p/q;
+ w = r*s+c;
+ return 2.0*(df+w);
+ }
+}
diff --git a/newlib/libm/ld/e_asinl.c b/newlib/libm/ld/e_asinl.c
new file mode 100644
index 000000000..a85765f1b
--- /dev/null
+++ b/newlib/libm/ld/e_asinl.c
@@ -0,0 +1,77 @@
+
+/* @(#)e_asin.c 1.3 95/01/18 */
+/* FreeBSD: head/lib/msun/src/e_asin.c 176451 2008-02-22 02:30:36Z das */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * See comments in e_asin.c.
+ * Converted to long double by David Schultz <das@FreeBSD.ORG>.
+ */
+
+#include <float.h>
+
+#include "invtrig.h"
+#include "math.h"
+#include "math_private.h"
+
+static const long double
+one = 1.00000000000000000000e+00,
+huge = 1.000e+300;
+
+long double
+asinl(long double x)
+{
+ union IEEEl2bits u;
+ long double t=0.0,w,p,q,c,r,s;
+ int16_t expsign, expt;
+ u.e = x;
+ expsign = u.xbits.expsign;
+ expt = expsign & 0x7fff;
+ if(expt >= BIAS) { /* |x|>= 1 */
+ if(expt==BIAS && ((u.bits.manh&~LDBL_NBIT)|u.bits.manl)==0)
+ /* asin(1)=+-pi/2 with inexact */
+ return x*pio2_hi+x*pio2_lo;
+ return (x-x)/(x-x); /* asin(|x|>1) is NaN */
+ } else if (expt<BIAS-1) { /* |x|<0.5 */
+ if(expt<ASIN_LINEAR) { /* if |x| is small, asinl(x)=x */
+ if(huge+x>one) return x;/* return x with inexact if x!=0*/
+ }
+ t = x*x;
+ p = P(t);
+ q = Q(t);
+ w = p/q;
+ return x+x*w;
+ }
+ /* 1> |x|>= 0.5 */
+ w = one-fabsl(x);
+ t = w*0.5;
+ p = P(t);
+ q = Q(t);
+ s = sqrtl(t);
+ if(u.bits.manh>=THRESH) { /* if |x| is close to 1 */
+ w = p/q;
+ t = pio2_hi-(2.0*(s+s*w)-pio2_lo);
+ } else {
+ u.e = s;
+ u.bits.manl = 0;
+ w = u.e;
+ c = (t-w*w)/(s+w);
+ r = p/q;
+ p = 2.0*s*r-(pio2_lo-2.0*c);
+ q = pio4_hi-2.0*w;
+ t = pio4_hi-(p-q);
+ }
+ if(expsign>0) return t; else return -t;
+}
diff --git a/newlib/libm/ld/e_atan2l.c b/newlib/libm/ld/e_atan2l.c
new file mode 100644
index 000000000..94ebdec54
--- /dev/null
+++ b/newlib/libm/ld/e_atan2l.c
@@ -0,0 +1,120 @@
+
+/* @(#)e_atan2.c 1.3 95/01/18 */
+/* FreeBSD: head/lib/msun/src/e_atan2.c 176451 2008-02-22 02:30:36Z das */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * See comments in e_atan2.c.
+ * Converted to long double by David Schultz <das@FreeBSD.ORG>.
+ */
+
+#include <float.h>
+
+#include "invtrig.h"
+#include "math.h"
+#include "math_private.h"
+
+static volatile long double
+tiny = 1.0e-300;
+static const long double
+zero = 0.0;
+
+#ifdef __i386__
+/* XXX Work around the fact that gcc truncates long double constants on i386 */
+static volatile double
+pi1 = 3.14159265358979311600e+00, /* 0x1.921fb54442d18p+1 */
+pi2 = 1.22514845490862001043e-16; /* 0x1.1a80000000000p-53 */
+#define pi ((long double)pi1 + pi2)
+#else
+static const long double
+pi = 3.14159265358979323846264338327950280e+00L;
+#endif
+
+long double
+atan2l(long double y, long double x)
+{
+ union IEEEl2bits ux, uy;
+ long double z;
+ int32_t k,m;
+ int16_t exptx, expsignx, expty, expsigny;
+
+ uy.e = y;
+ expsigny = uy.xbits.expsign;
+ expty = expsigny & 0x7fff;
+ ux.e = x;
+ expsignx = ux.xbits.expsign;
+ exptx = expsignx & 0x7fff;
+
+ if ((exptx==BIAS+LDBL_MAX_EXP &&
+ ((ux.bits.manh&~LDBL_NBIT)|ux.bits.manl)!=0) || /* x is NaN */
+ (expty==BIAS+LDBL_MAX_EXP &&
+ ((uy.bits.manh&~LDBL_NBIT)|uy.bits.manl)!=0)) /* y is NaN */
+ return nan_mix(x, y);
+ if (expsignx==BIAS && ((ux.bits.manh&~LDBL_NBIT)|ux.bits.manl)==0)
+ return atanl(y); /* x=1.0 */
+ m = ((expsigny>>15)&1)|((expsignx>>14)&2); /* 2*sign(x)+sign(y) */
+
+ /* when y = 0 */
+ if(expty==0 && ((uy.bits.manh&~LDBL_NBIT)|uy.bits.manl)==0) {
+ switch(m) {
+ case 0:
+ case 1: return y; /* atan(+-0,+anything)=+-0 */
+ case 2: return pi+tiny;/* atan(+0,-anything) = pi */
+ case 3: return -pi-tiny;/* atan(-0,-anything) =-pi */
+ }
+ }
+ /* when x = 0 */
+ if(exptx==0 && ((ux.bits.manh&~LDBL_NBIT)|ux.bits.manl)==0)
+ return (expsigny<0)? -pio2_hi-tiny: pio2_hi+tiny;
+
+ /* when x is INF */
+ if(exptx==BIAS+LDBL_MAX_EXP) {
+ if(expty==BIAS+LDBL_MAX_EXP) {
+ switch(m) {
+ case 0: return pio2_hi*0.5+tiny;/* atan(+INF,+INF) */
+ case 1: return -pio2_hi*0.5-tiny;/* atan(-INF,+INF) */
+ case 2: return 1.5*pio2_hi+tiny;/*atan(+INF,-INF)*/
+ case 3: return -1.5*pio2_hi-tiny;/*atan(-INF,-INF)*/
+ }
+ } else {
+ switch(m) {
+ case 0: return zero ; /* atan(+...,+INF) */
+ case 1: return -zero ; /* atan(-...,+INF) */
+ case 2: return pi+tiny ; /* atan(+...,-INF) */
+ case 3: return -pi-tiny ; /* atan(-...,-INF) */
+ }
+ }
+ }
+ /* when y is INF */
+ if(expty==BIAS+LDBL_MAX_EXP)
+ return (expsigny<0)? -pio2_hi-tiny: pio2_hi+tiny;
+
+ /* compute y/x */
+ k = expty-exptx;
+ if(k > LDBL_MANT_DIG+2) { /* |y/x| huge */
+ z=pio2_hi+pio2_lo;
+ m&=1;
+ }
+ else if(expsignx<0&&k<-LDBL_MANT_DIG-2) z=0.0; /* |y/x| tiny, x<0 */
+ else z=atanl(fabsl(y/x)); /* safe to do y/x */
+ switch (m) {
+ case 0: return z ; /* atan(+,+) */
+ case 1: return -z ; /* atan(-,+) */
+ case 2: return pi-(z-pi_lo);/* atan(+,-) */
+ default: /* case 3 */
+ return (z-pi_lo)-pi;/* atan(-,-) */
+ }
+}
diff --git a/newlib/libm/ld/e_atanhl.c b/newlib/libm/ld/e_atanhl.c
new file mode 100644
index 000000000..11d56ea52
--- /dev/null
+++ b/newlib/libm/ld/e_atanhl.c
@@ -0,0 +1,74 @@
+/* from: FreeBSD: head/lib/msun/src/e_atanh.c 176451 2008-02-22 02:30:36Z das */
+
+/* @(#)e_atanh.c 1.3 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * See e_atanh.c for complete comments.
+ *
+ * Converted to long double by David Schultz <das@FreeBSD.ORG> and
+ * Bruce D. Evans.
+ */
+
+#include <float.h>
+#ifdef __i386__
+#include <ieeefp.h>
+#endif
+
+#include "fpmath.h"
+#include "math.h"
+#include "math_private.h"
+
+/* EXP_TINY is the threshold below which we use atanh(x) ~= x. */
+#if LDBL_MANT_DIG == 64
+#define EXP_TINY -34
+#elif LDBL_MANT_DIG == 113
+#define EXP_TINY -58
+#else
+#error "Unsupported long double format"
+#endif
+
+#if LDBL_MAX_EXP != 0x4000
+/* We also require the usual expsign encoding. */
+#error "Unsupported long double format"
+#endif
+
+#define BIAS (LDBL_MAX_EXP - 1)
+
+static const double one = 1.0, huge = 1e300;
+static const double zero = 0.0;
+
+long double
+atanhl(long double x)
+{
+ long double t;
+ uint16_t hx, ix;
+
+ ENTERI();
+ GET_LDBL_EXPSIGN(hx, x);
+ ix = hx & 0x7fff;
+ if (ix >= 0x3fff) /* |x| >= 1, or NaN or misnormal */
+ RETURNI(fabsl(x) == 1 ? x / zero : (x - x) / (x - x));
+ if (ix < BIAS + EXP_TINY && (huge + x) > zero)
+ RETURNI(x); /* x is tiny */
+ SET_LDBL_EXPSIGN(x, ix);
+ if (ix < 0x3ffe) { /* |x| < 0.5, or misnormal */
+ t = x+x;
+ t = 0.5*log1pl(t+t*x/(one-x));
+ } else
+ t = 0.5*log1pl((x+x)/(one-x));
+ RETURNI((hx & 0x8000) == 0 ? t : -t);
+}
diff --git a/newlib/libm/ld/e_coshl.c b/newlib/libm/ld/e_coshl.c
new file mode 100644
index 000000000..4e3b28311
--- /dev/null
+++ b/newlib/libm/ld/e_coshl.c
@@ -0,0 +1,132 @@
+/* from: FreeBSD: head/lib/msun/src/e_coshl.c XXX */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * See e_cosh.c for complete comments.
+ *
+ * Converted to long double by Bruce D. Evans.
+ */
+
+#include <float.h>
+#ifdef __i386__
+#include <ieeefp.h>
+#endif
+
+#include "fpmath.h"
+#include "math.h"
+#include "math_private.h"
+#include "k_expl.h"
+
+#if LDBL_MAX_EXP != 0x4000
+/* We also require the usual expsign encoding. */
+#error "Unsupported long double format"
+#endif
+
+#define BIAS (LDBL_MAX_EXP - 1)
+
+static const volatile long double huge = 0x1p10000L, tiny = 0x1p-10000L;
+#if LDBL_MANT_DIG == 64
+/*
+ * Domain [-1, 1], range ~[-1.8211e-21, 1.8211e-21]:
+ * |cosh(x) - c(x)| < 2**-68.8
+ */
+static const union IEEEl2bits
+C4u = LD80C(0xaaaaaaaaaaaaac78, -5, 4.16666666666666682297e-2L);
+#define C4 C4u.e
+static const double
+C2 = 0.5,
+C6 = 1.3888888888888616e-3, /* 0x16c16c16c16b99.0p-62 */
+C8 = 2.4801587301767953e-5, /* 0x1a01a01a027061.0p-68 */
+C10 = 2.7557319163300398e-7, /* 0x127e4fb6c9b55f.0p-74 */
+C12 = 2.0876768371393075e-9, /* 0x11eed99406a3f4.0p-81 */
+C14 = 1.1469537039374480e-11, /* 0x1938c67cd18c48.0p-89 */
+C16 = 4.8473490896852041e-14; /* 0x1b49c429701e45.0p-97 */
+#elif LDBL_MANT_DIG == 113
+/*
+ * Domain [-1, 1], range ~[-2.3194e-37, 2.3194e-37]:
+ * |cosh(x) - c(x)| < 2**-121.69
+ */
+static const long double
+C4 = 4.16666666666666666666666666666666225e-2L, /* 0x1555555555555555555555555554e.0p-117L */
+C6 = 1.38888888888888888888888888889434831e-3L, /* 0x16c16c16c16c16c16c16c16c1dd7a.0p-122L */
+C8 = 2.48015873015873015873015871870962089e-5L, /* 0x1a01a01a01a01a01a01a017af2756.0p-128L */
+C10 = 2.75573192239858906525574318600800201e-7L, /* 0x127e4fb7789f5c72ef01c8a040640.0p-134L */
+C12 = 2.08767569878680989791444691755468269e-9L, /* 0x11eed8eff8d897b543d0679607399.0p-141L */
+C14= 1.14707455977297247387801189650495351e-11L, /* 0x193974a8c07c9d24ae169a7fa9b54.0p-149L */
+C16 = 4.77947733238737883626416876486279985e-14L; /* 0x1ae7f3e733b814d4e1b90f5727fe4.0p-157L */
+static const double
+C2 = 0.5,
+C18 = 1.5619206968597871e-16, /* 0x16827863b9900b.0p-105 */
+C20 = 4.1103176218528049e-19, /* 0x1e542ba3d3c269.0p-114 */
+C22 = 8.8967926401641701e-22, /* 0x10ce399542a014.0p-122 */
+C24 = 1.6116681626523904e-24, /* 0x1f2c981d1f0cb7.0p-132 */
+C26 = 2.5022374732804632e-27; /* 0x18c7ecf8b2c4a0.0p-141 */
+#else
+#error "Unsupported long double format"
+#endif /* LDBL_MANT_DIG == 64 */
+
+/* log(2**16385 - 0.5) rounded up: */
+static const float
+o_threshold = 1.13572168e4; /* 0xb174de.0p-10 */
+
+long double
+coshl(long double x)
+{
+ long double hi,lo,x2,x4;
+#if LDBL_MANT_DIG == 113
+ double dx2;
+#endif
+ uint16_t ix;
+
+ GET_LDBL_EXPSIGN(ix,x);
+ ix &= 0x7fff;
+
+ /* x is INF or NaN */
+ if(ix>=0x7fff) return x*x;
+
+ ENTERI();
+
+ /* |x| < 1, return 1 or c(x) */
+ if(ix<0x3fff) {
+ if (ix<BIAS-(LDBL_MANT_DIG+1)/2) /* |x| < TINY */
+ RETURNI(1+tiny); /* cosh(tiny) = 1(+) with inexact */
+ x2 = x*x;
+#if LDBL_MANT_DIG == 64
+ x4 = x2*x2;
+ RETURNI(((C16*x2 + C14)*x4 + (C12*x2 + C10))*(x4*x4*x2) +
+ ((C8*x2 + C6)*x2 + C4)*x4 + C2*x2 + 1);
+#elif LDBL_MANT_DIG == 113
+ dx2 = x2;
+ RETURNI((((((((((((C26*dx2 + C24)*dx2 + C22)*dx2 +
+ C20)*x2 + C18)*x2 +
+ C16)*x2 + C14)*x2 + C12)*x2 + C10)*x2 + C8)*x2 + C6)*x2 +
+ C4)*(x2*x2) + C2*x2 + 1);
+#endif
+ }
+
+ /* |x| in [1, 64), return accurate exp(|x|)/2+1/exp(|x|)/2 */
+ if (ix < 0x4005) {
+ k_hexpl(fabsl(x), &hi, &lo);
+ RETURNI(lo + 0.25/(hi + lo) + hi);
+ }
+
+ /* |x| in [64, o_threshold], return correctly-overflowing exp(|x|)/2 */
+ if (fabsl(x) <= o_threshold)
+ RETURNI(hexpl(fabsl(x)));
+
+ /* |x| > o_threshold, cosh(x) overflow */
+ RETURNI(huge*huge);
+}
diff --git a/newlib/libm/ld/e_fmodl.c b/newlib/libm/ld/e_fmodl.c
new file mode 100644
index 000000000..ad3bcc34c
--- /dev/null
+++ b/newlib/libm/ld/e_fmodl.c
@@ -0,0 +1,149 @@
+/* @(#)e_fmod.c 1.3 95/01/18 */
+/*-
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <float.h>
+#include <stdint.h>
+
+#include "fpmath.h"
+#include "math.h"
+#include "math_private.h"
+
+#define BIAS (LDBL_MAX_EXP - 1)
+
+#if LDBL_MANL_SIZE > 32
+typedef uint64_t manl_t;
+#else
+typedef uint32_t manl_t;
+#endif
+
+#if LDBL_MANH_SIZE > 32
+typedef uint64_t manh_t;
+#else
+typedef uint32_t manh_t;
+#endif
+
+/*
+ * These macros add and remove an explicit integer bit in front of the
+ * fractional mantissa, if the architecture doesn't have such a bit by
+ * default already.
+ */
+#ifdef LDBL_IMPLICIT_NBIT
+#define SET_NBIT(hx) ((hx) | (1ULL << LDBL_MANH_SIZE))
+#define HFRAC_BITS LDBL_MANH_SIZE
+#else
+#define SET_NBIT(hx) (hx)
+#define HFRAC_BITS (LDBL_MANH_SIZE - 1)
+#endif
+
+#define MANL_SHIFT (LDBL_MANL_SIZE - 1)
+
+static const long double one = 1.0, Zero[] = {0.0, -0.0,};
+
+/*
+ * fmodl(x,y)
+ * Return x mod y in exact arithmetic
+ * Method: shift and subtract
+ *
+ * Assumptions:
+ * - The low part of the mantissa fits in a manl_t exactly.
+ * - The high part of the mantissa fits in an int64_t with enough room
+ * for an explicit integer bit in front of the fractional bits.
+ */
+long double
+fmodl(long double x, long double y)
+{
+ union IEEEl2bits ux, uy;
+ int64_t hx,hz; /* We need a carry bit even if LDBL_MANH_SIZE is 32. */
+ manh_t hy;
+ manl_t lx,ly,lz;
+ int ix,iy,n,sx;
+
+ ux.e = x;
+ uy.e = y;
+ sx = ux.bits.sign;
+
+ /* purge off exception values */
+ if((uy.bits.exp|uy.bits.manh|uy.bits.manl)==0 || /* y=0 */
+ (ux.bits.exp == BIAS + LDBL_MAX_EXP) || /* or x not finite */
+ (uy.bits.exp == BIAS + LDBL_MAX_EXP &&
+ ((uy.bits.manh&~LDBL_NBIT)|uy.bits.manl)!=0)) /* or y is NaN */
+ return nan_mix_op(x, y, *)/nan_mix_op(x, y, *);
+ if(ux.bits.exp<=uy.bits.exp) {
+ if((ux.bits.exp<uy.bits.exp) ||
+ (ux.bits.manh<=uy.bits.manh &&
+ (ux.bits.manh<uy.bits.manh ||
+ ux.bits.manl<uy.bits.manl))) {
+ return x; /* |x|<|y| return x or x-y */
+ }
+ if(ux.bits.manh==uy.bits.manh && ux.bits.manl==uy.bits.manl) {
+ return Zero[sx]; /* |x|=|y| return x*0*/
+ }
+ }
+
+ /* determine ix = ilogb(x) */
+ if(ux.bits.exp == 0) { /* subnormal x */
+ ux.e *= 0x1.0p512;
+ ix = ux.bits.exp - (BIAS + 512);
+ } else {
+ ix = ux.bits.exp - BIAS;
+ }
+
+ /* determine iy = ilogb(y) */
+ if(uy.bits.exp == 0) { /* subnormal y */
+ uy.e *= 0x1.0p512;
+ iy = uy.bits.exp - (BIAS + 512);
+ } else {
+ iy = uy.bits.exp - BIAS;
+ }
+
+ /* set up {hx,lx}, {hy,ly} and align y to x */
+ hx = SET_NBIT(ux.bits.manh);
+ hy = SET_NBIT(uy.bits.manh);
+ lx = ux.bits.manl;
+ ly = uy.bits.manl;
+
+ /* fix point fmod */
+ n = ix - iy;
+
+ while(n--) {
+ hz=hx-hy;lz=lx-ly; if(lx<ly) hz -= 1;
+ if(hz<0){hx = hx+hx+(lx>>MANL_SHIFT); lx = lx+lx;}
+ else {
+ if ((hz|lz)==0) /* return sign(x)*0 */
+ return Zero[sx];
+ hx = hz+hz+(lz>>MANL_SHIFT); lx = lz+lz;
+ }
+ }
+ hz=hx-hy;lz=lx-ly; if(lx<ly) hz -= 1;
+ if(hz>=0) {hx=hz;lx=lz;}
+
+ /* convert back to floating value and restore the sign */
+ if((hx|lx)==0) /* return sign(x)*0 */
+ return Zero[sx];
+ while(hx<(1ULL<<HFRAC_BITS)) { /* normalize x */
+ hx = hx+hx+(lx>>MANL_SHIFT); lx = lx+lx;
+ iy -= 1;
+ }
+ ux.bits.manh = hx; /* The mantissa is truncated here if needed. */
+ ux.bits.manl = lx;
+ if (iy < LDBL_MIN_EXP) {
+ ux.bits.exp = iy + (BIAS + 512);
+ ux.e *= 0x1p-512;
+ } else {
+ ux.bits.exp = iy + BIAS;
+ }
+ x = ux.e * one; /* create necessary signal */
+ return x; /* exact output */
+}
diff --git a/newlib/libm/ld/e_lgammal.c b/newlib/libm/ld/e_lgammal.c
new file mode 100644
index 000000000..ebc2fc78c
--- /dev/null
+++ b/newlib/libm/ld/e_lgammal.c
@@ -0,0 +1,25 @@
+/* @(#)e_lgamma.c 1.3 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "math.h"
+#include "math_private.h"
+
+extern int signgam;
+
+long double
+lgammal(long double x)
+{
+ return lgammal_r(x,&signgam);
+}
diff --git a/newlib/libm/ld/e_remainderl.c b/newlib/libm/ld/e_remainderl.c
new file mode 100644
index 000000000..4a6786309
--- /dev/null
+++ b/newlib/libm/ld/e_remainderl.c
@@ -0,0 +1,40 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2008 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <math.h>
+
+long double
+remainderl(long double x, long double y)
+{
+ int quo;
+
+ return (remquol(x, y, &quo));
+}
diff --git a/newlib/libm/ld/e_sinhl.c b/newlib/libm/ld/e_sinhl.c
new file mode 100644
index 000000000..38d3df195
--- /dev/null
+++ b/newlib/libm/ld/e_sinhl.c
@@ -0,0 +1,134 @@
+/* from: FreeBSD: head/lib/msun/src/e_sinhl.c XXX */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * See e_sinh.c for complete comments.
+ *
+ * Converted to long double by Bruce D. Evans.
+ */
+
+#include <float.h>
+#ifdef __i386__
+#include <ieeefp.h>
+#endif
+
+#include "fpmath.h"
+#include "math.h"
+#include "math_private.h"
+#include "k_expl.h"
+
+#if LDBL_MAX_EXP != 0x4000
+/* We also require the usual expsign encoding. */
+#error "Unsupported long double format"
+#endif
+
+#define BIAS (LDBL_MAX_EXP - 1)
+
+static const long double shuge = 0x1p16383L;
+#if LDBL_MANT_DIG == 64
+/*
+ * Domain [-1, 1], range ~[-6.6749e-22, 6.6749e-22]:
+ * |sinh(x)/x - s(x)| < 2**-70.3
+ */
+static const union IEEEl2bits
+S3u = LD80C(0xaaaaaaaaaaaaaaaa, -3, 1.66666666666666666658e-1L);
+#define S3 S3u.e
+static const double
+S5 = 8.3333333333333332e-3, /* 0x11111111111111.0p-59 */
+S7 = 1.9841269841270074e-4, /* 0x1a01a01a01a070.0p-65 */
+S9 = 2.7557319223873889e-6, /* 0x171de3a5565fe6.0p-71 */
+S11 = 2.5052108406704084e-8, /* 0x1ae6456857530f.0p-78 */
+S13 = 1.6059042748655297e-10, /* 0x161245fa910697.0p-85 */
+S15 = 7.6470006914396920e-13, /* 0x1ae7ce4eff2792.0p-93 */
+S17 = 2.8346142308424267e-15; /* 0x19882ce789ffc6.0p-101 */
+#elif LDBL_MANT_DIG == 113
+/*
+ * Domain [-1, 1], range ~[-2.9673e-36, 2.9673e-36]:
+ * |sinh(x)/x - s(x)| < 2**-118.0
+ */
+static const long double
+S3 = 1.66666666666666666666666666666666033e-1L, /* 0x1555555555555555555555555553b.0p-115L */
+S5 = 8.33333333333333333333333333337643193e-3L, /* 0x111111111111111111111111180f5.0p-119L */
+S7 = 1.98412698412698412698412697391263199e-4L, /* 0x1a01a01a01a01a01a01a0176aad11.0p-125L */
+S9 = 2.75573192239858906525574406205464218e-6L, /* 0x171de3a556c7338faac243aaa9592.0p-131L */
+S11 = 2.50521083854417187749675637460977997e-8L, /* 0x1ae64567f544e38fe59b3380d7413.0p-138L */
+S13 = 1.60590438368216146368737762431552702e-10L, /* 0x16124613a86d098059c7620850fc2.0p-145L */
+S15 = 7.64716373181980539786802470969096440e-13L, /* 0x1ae7f3e733b814193af09ce723043.0p-153L */
+S17 = 2.81145725434775409870584280722701574e-15L; /* 0x1952c77030c36898c3fd0b6dfc562.0p-161L */
+static const double
+S19= 8.2206352435411005e-18, /* 0x12f49b4662b86d.0p-109 */
+S21= 1.9572943931418891e-20, /* 0x171b8f2fab9628.0p-118 */
+S23 = 3.8679983530666939e-23, /* 0x17617002b73afc.0p-127 */
+S25 = 6.5067867911512749e-26; /* 0x1423352626048a.0p-136 */
+#else
+#error "Unsupported long double format"
+#endif /* LDBL_MANT_DIG == 64 */
+
+/* log(2**16385 - 0.5) rounded up: */
+static const float
+o_threshold = 1.13572168e4; /* 0xb174de.0p-10 */
+
+long double
+sinhl(long double x)
+{
+ long double hi,lo,x2,x4;
+#if LDBL_MANT_DIG == 113
+ double dx2;
+#endif
+ double s;
+ int16_t ix,jx;
+
+ GET_LDBL_EXPSIGN(jx,x);
+ ix = jx&0x7fff;
+
+ /* x is INF or NaN */
+ if(ix>=0x7fff) return x+x;
+
+ ENTERI();
+
+ s = 1;
+ if (jx<0) s = -1;
+
+ /* |x| < 64, return x, s(x), or accurate s*(exp(|x|)/2-1/exp(|x|)/2) */
+ if (ix<0x4005) { /* |x|<64 */
+ if (ix<BIAS-(LDBL_MANT_DIG+1)/2) /* |x|<TINY */
+ if(shuge+x>1) RETURNI(x); /* sinh(tiny) = tiny with inexact */
+ if (ix<0x3fff) { /* |x|<1 */
+ x2 = x*x;
+#if LDBL_MANT_DIG == 64
+ x4 = x2*x2;
+ RETURNI(((S17*x2 + S15)*x4 + (S13*x2 + S11))*(x2*x*x4*x4) +
+ ((S9*x2 + S7)*x2 + S5)*(x2*x*x2) + S3*(x2*x) + x);
+#elif LDBL_MANT_DIG == 113
+ dx2 = x2;
+ RETURNI(((((((((((S25*dx2 + S23)*dx2 +
+ S21)*x2 + S19)*x2 +
+ S17)*x2 + S15)*x2 + S13)*x2 + S11)*x2 + S9)*x2 + S7)*x2 +
+ S5)* (x2*x*x2) +
+ S3*(x2*x) + x);
+#endif
+ }
+ k_hexpl(fabsl(x), &hi, &lo);
+ RETURNI(s*(lo - 0.25/(hi + lo) + hi));
+ }
+
+ /* |x| in [64, o_threshold], return correctly-overflowing s*exp(|x|)/2 */
+ if (fabsl(x) <= o_threshold)
+ RETURNI(s*hexpl(fabsl(x)));
+
+ /* |x| > o_threshold, sinh(x) overflow */
+ return x*shuge;
+}
diff --git a/newlib/libm/ld/fpmath.h b/newlib/libm/ld/fpmath.h
new file mode 100644
index 000000000..ce935eb40
--- /dev/null
+++ b/newlib/libm/ld/fpmath.h
@@ -0,0 +1,82 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2003 Mike Barcroft <mike@FreeBSD.org>
+ * Copyright (c) 2002 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _FPMATH_H_
+#define _FPMATH_H_
+
+#include <sys/endian.h>
+#include "_fpmath.h"
+
+#ifndef _IEEE_WORD_ORDER
+#define _IEEE_WORD_ORDER _BYTE_ORDER
+#endif
+
+union IEEEf2bits {
+ float f;
+ struct {
+#if _BYTE_ORDER == _LITTLE_ENDIAN
+ unsigned int man :23;
+ unsigned int exp :8;
+ unsigned int sign :1;
+#else /* _BIG_ENDIAN */
+ unsigned int sign :1;
+ unsigned int exp :8;
+ unsigned int man :23;
+#endif
+ } bits;
+};
+
+#define DBL_MANH_SIZE 20
+#define DBL_MANL_SIZE 32
+
+union IEEEd2bits {
+ double d;
+ struct {
+#if _BYTE_ORDER == _LITTLE_ENDIAN
+#if _IEEE_WORD_ORDER == _LITTLE_ENDIAN
+ unsigned int manl :32;
+#endif
+ unsigned int manh :20;
+ unsigned int exp :11;
+ unsigned int sign :1;
+#if _IEEE_WORD_ORDER == _BIG_ENDIAN
+ unsigned int manl :32;
+#endif
+#else /* _BIG_ENDIAN */
+ unsigned int sign :1;
+ unsigned int exp :11;
+ unsigned int manh :20;
+ unsigned int manl :32;
+#endif
+ } bits;
+};
+
+#endif /* !_FPMATH_H */
diff --git a/newlib/libm/ld/math_private.h b/newlib/libm/ld/math_private.h
new file mode 100644
index 000000000..df526e71e
--- /dev/null
+++ b/newlib/libm/ld/math_private.h
@@ -0,0 +1,924 @@
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+/*
+ * from: @(#)fdlibm.h 5.1 93/09/24
+ * $FreeBSD$
+ */
+
+#ifndef _MATH_PRIVATE_H_
+#define _MATH_PRIVATE_H_
+
+#include <sys/types.h>
+#include <machine/endian.h>
+
+/*
+ * The original fdlibm code used statements like:
+ * n0 = ((*(int*)&one)>>29)^1; * index of high word *
+ * ix0 = *(n0+(int*)&x); * high word of x *
+ * ix1 = *((1-n0)+(int*)&x); * low word of x *
+ * to dig two 32 bit words out of the 64 bit IEEE floating point
+ * value. That is non-ANSI, and, moreover, the gcc instruction
+ * scheduler gets it wrong. We instead use the following macros.
+ * Unlike the original code, we determine the endianness at compile
+ * time, not at run time; I don't see much benefit to selecting
+ * endianness at run time.
+ */
+
+/*
+ * A union which permits us to convert between a double and two 32 bit
+ * ints.
+ */
+
+#ifdef __arm__
+#if defined(__VFP_FP__) || defined(__ARM_EABI__)
+#define IEEE_WORD_ORDER BYTE_ORDER
+#else
+#define IEEE_WORD_ORDER BIG_ENDIAN
+#endif
+#else /* __arm__ */
+#define IEEE_WORD_ORDER BYTE_ORDER
+#endif
+
+/* A union which permits us to convert between a long double and
+ four 32 bit ints. */
+
+#if IEEE_WORD_ORDER == BIG_ENDIAN
+
+typedef union
+{
+ long double value;
+ struct {
+ u_int32_t mswhi;
+ u_int32_t mswlo;
+ u_int32_t lswhi;
+ u_int32_t lswlo;
+ } parts32;
+ struct {
+ u_int64_t msw;
+ u_int64_t lsw;
+ } parts64;
+} ieee_quad_shape_type;
+
+#endif
+
+#if IEEE_WORD_ORDER == LITTLE_ENDIAN
+
+typedef union
+{
+ long double value;
+ struct {
+ u_int32_t lswlo;
+ u_int32_t lswhi;
+ u_int32_t mswlo;
+ u_int32_t mswhi;
+ } parts32;
+ struct {
+ u_int64_t lsw;
+ u_int64_t msw;
+ } parts64;
+} ieee_quad_shape_type;
+
+#endif
+
+#if IEEE_WORD_ORDER == BIG_ENDIAN
+
+typedef union
+{
+ double value;
+ struct
+ {
+ u_int32_t msw;
+ u_int32_t lsw;
+ } parts;
+ struct
+ {
+ u_int64_t w;
+ } xparts;
+} ieee_double_shape_type;
+
+#endif
+
+#if IEEE_WORD_ORDER == LITTLE_ENDIAN
+
+typedef union
+{
+ double value;
+ struct
+ {
+ u_int32_t lsw;
+ u_int32_t msw;
+ } parts;
+ struct
+ {
+ u_int64_t w;
+ } xparts;
+} ieee_double_shape_type;
+
+#endif
+
+/* Get two 32 bit ints from a double. */
+
+#define EXTRACT_WORDS(ix0,ix1,d) \
+do { \
+ ieee_double_shape_type ew_u; \
+ ew_u.value = (d); \
+ (ix0) = ew_u.parts.msw; \
+ (ix1) = ew_u.parts.lsw; \
+} while (0)
+
+/* Get a 64-bit int from a double. */
+#define EXTRACT_WORD64(ix,d) \
+do { \
+ ieee_double_shape_type ew_u; \
+ ew_u.value = (d); \
+ (ix) = ew_u.xparts.w; \
+} while (0)
+
+/* Get the more significant 32 bit int from a double. */
+
+#define GET_HIGH_WORD(i,d) \
+do { \
+ ieee_double_shape_type gh_u; \
+ gh_u.value = (d); \
+ (i) = gh_u.parts.msw; \
+} while (0)
+
+/* Get the less significant 32 bit int from a double. */
+
+#define GET_LOW_WORD(i,d) \
+do { \
+ ieee_double_shape_type gl_u; \
+ gl_u.value = (d); \
+ (i) = gl_u.parts.lsw; \
+} while (0)
+
+/* Set a double from two 32 bit ints. */
+
+#define INSERT_WORDS(d,ix0,ix1) \
+do { \
+ ieee_double_shape_type iw_u; \
+ iw_u.parts.msw = (ix0); \
+ iw_u.parts.lsw = (ix1); \
+ (d) = iw_u.value; \
+} while (0)
+
+/* Set a double from a 64-bit int. */
+#define INSERT_WORD64(d,ix) \
+do { \
+ ieee_double_shape_type iw_u; \
+ iw_u.xparts.w = (ix); \
+ (d) = iw_u.value; \
+} while (0)
+
+/* Set the more significant 32 bits of a double from an int. */
+
+#define SET_HIGH_WORD(d,v) \
+do { \
+ ieee_double_shape_type sh_u; \
+ sh_u.value = (d); \
+ sh_u.parts.msw = (v); \
+ (d) = sh_u.value; \
+} while (0)
+
+/* Set the less significant 32 bits of a double from an int. */
+
+#define SET_LOW_WORD(d,v) \
+do { \
+ ieee_double_shape_type sl_u; \
+ sl_u.value = (d); \
+ sl_u.parts.lsw = (v); \
+ (d) = sl_u.value; \
+} while (0)
+
+/*
+ * A union which permits us to convert between a float and a 32 bit
+ * int.
+ */
+
+typedef union
+{
+ float value;
+ /* FIXME: Assumes 32 bit int. */
+ unsigned int word;
+} ieee_float_shape_type;
+
+/* Get a 32 bit int from a float. */
+
+#define GET_FLOAT_WORD(i,d) \
+do { \
+ ieee_float_shape_type gf_u; \
+ gf_u.value = (d); \
+ (i) = gf_u.word; \
+} while (0)
+
+/* Set a float from a 32 bit int. */
+
+#define SET_FLOAT_WORD(d,i) \
+do { \
+ ieee_float_shape_type sf_u; \
+ sf_u.word = (i); \
+ (d) = sf_u.value; \
+} while (0)
+
+/*
+ * Get expsign and mantissa as 16 bit and 64 bit ints from an 80 bit long
+ * double.
+ */
+
+#define EXTRACT_LDBL80_WORDS(ix0,ix1,d) \
+do { \
+ union IEEEl2bits ew_u; \
+ ew_u.e = (d); \
+ (ix0) = ew_u.xbits.expsign; \
+ (ix1) = ew_u.xbits.man; \
+} while (0)
+
+/*
+ * Get expsign and mantissa as one 16 bit and two 64 bit ints from a 128 bit
+ * long double.
+ */
+
+#define EXTRACT_LDBL128_WORDS(ix0,ix1,ix2,d) \
+do { \
+ union IEEEl2bits ew_u; \
+ ew_u.e = (d); \
+ (ix0) = ew_u.xbits.expsign; \
+ (ix1) = ew_u.xbits.manh; \
+ (ix2) = ew_u.xbits.manl; \
+} while (0)
+
+/* Get expsign as a 16 bit int from a long double. */
+
+#define GET_LDBL_EXPSIGN(i,d) \
+do { \
+ union IEEEl2bits ge_u; \
+ ge_u.e = (d); \
+ (i) = ge_u.xbits.expsign; \
+} while (0)
+
+/*
+ * Set an 80 bit long double from a 16 bit int expsign and a 64 bit int
+ * mantissa.
+ */
+
+#define INSERT_LDBL80_WORDS(d,ix0,ix1) \
+do { \
+ union IEEEl2bits iw_u; \
+ iw_u.xbits.expsign = (ix0); \
+ iw_u.xbits.man = (ix1); \
+ (d) = iw_u.e; \
+} while (0)
+
+/*
+ * Set a 128 bit long double from a 16 bit int expsign and two 64 bit ints
+ * comprising the mantissa.
+ */
+
+#define INSERT_LDBL128_WORDS(d,ix0,ix1,ix2) \
+do { \
+ union IEEEl2bits iw_u; \
+ iw_u.xbits.expsign = (ix0); \
+ iw_u.xbits.manh = (ix1); \
+ iw_u.xbits.manl = (ix2); \
+ (d) = iw_u.e; \
+} while (0)
+
+/* Set expsign of a long double from a 16 bit int. */
+
+#define SET_LDBL_EXPSIGN(d,v) \
+do { \
+ union IEEEl2bits se_u; \
+ se_u.e = (d); \
+ se_u.xbits.expsign = (v); \
+ (d) = se_u.e; \
+} while (0)
+
+#ifdef __i386__
+/* Long double constants are broken on i386. */
+#define LD80C(m, ex, v) { \
+ .xbits.man = __CONCAT(m, ULL), \
+ .xbits.expsign = (0x3fff + (ex)) | ((v) < 0 ? 0x8000 : 0), \
+}
+#else
+/* The above works on non-i386 too, but we use this to check v. */
+#define LD80C(m, ex, v) { .e = (v), }
+#endif
+
+#ifdef FLT_EVAL_METHOD
+/*
+ * Attempt to get strict C99 semantics for assignment with non-C99 compilers.
+ */
+#if FLT_EVAL_METHOD == 0 || __GNUC__ == 0
+#define STRICT_ASSIGN(type, lval, rval) ((lval) = (rval))
+#else
+#define STRICT_ASSIGN(type, lval, rval) do { \
+ volatile type __lval; \
+ \
+ if (sizeof(type) >= sizeof(long double)) \
+ (lval) = (rval); \
+ else { \
+ __lval = (rval); \
+ (lval) = __lval; \
+ } \
+} while (0)
+#endif
+#endif /* FLT_EVAL_METHOD */
+
+/* Support switching the mode to FP_PE if necessary. */
+#if defined(__i386__) && !defined(NO_FPSETPREC)
+#define ENTERI() ENTERIT(long double)
+#define ENTERIT(returntype) \
+ returntype __retval; \
+ fp_prec_t __oprec; \
+ \
+ if ((__oprec = fpgetprec()) != FP_PE) \
+ fpsetprec(FP_PE)
+#define RETURNI(x) do { \
+ __retval = (x); \
+ if (__oprec != FP_PE) \
+ fpsetprec(__oprec); \
+ RETURNF(__retval); \
+} while (0)
+#define ENTERV() \
+ fp_prec_t __oprec; \
+ \
+ if ((__oprec = fpgetprec()) != FP_PE) \
+ fpsetprec(FP_PE)
+#define RETURNV() do { \
+ if (__oprec != FP_PE) \
+ fpsetprec(__oprec); \
+ return; \
+} while (0)
+#else
+#define ENTERI()
+#define ENTERIT(x)
+#define RETURNI(x) RETURNF(x)
+#define ENTERV()
+#define RETURNV() return
+#endif
+
+/* Default return statement if hack*_t() is not used. */
+#define RETURNF(v) return (v)
+
+/*
+ * 2sum gives the same result as 2sumF without requiring |a| >= |b| or
+ * a == 0, but is slower.
+ */
+#define _2sum(a, b) do { \
+ __typeof(a) __s, __w; \
+ \
+ __w = (a) + (b); \
+ __s = __w - (a); \
+ (b) = ((a) - (__w - __s)) + ((b) - __s); \
+ (a) = __w; \
+} while (0)
+
+/*
+ * 2sumF algorithm.
+ *
+ * "Normalize" the terms in the infinite-precision expression a + b for
+ * the sum of 2 floating point values so that b is as small as possible
+ * relative to 'a'. (The resulting 'a' is the value of the expression in
+ * the same precision as 'a' and the resulting b is the rounding error.)
+ * |a| must be >= |b| or 0, b's type must be no larger than 'a's type, and
+ * exponent overflow or underflow must not occur. This uses a Theorem of
+ * Dekker (1971). See Knuth (1981) 4.2.2 Theorem C. The name "TwoSum"
+ * is apparently due to Skewchuk (1997).
+ *
+ * For this to always work, assignment of a + b to 'a' must not retain any
+ * extra precision in a + b. This is required by C standards but broken
+ * in many compilers. The brokenness cannot be worked around using
+ * STRICT_ASSIGN() like we do elsewhere, since the efficiency of this
+ * algorithm would be destroyed by non-null strict assignments. (The
+ * compilers are correct to be broken -- the efficiency of all floating
+ * point code calculations would be destroyed similarly if they forced the
+ * conversions.)
+ *
+ * Fortunately, a case that works well can usually be arranged by building
+ * any extra precision into the type of 'a' -- 'a' should have type float_t,
+ * double_t or long double. b's type should be no larger than 'a's type.
+ * Callers should use these types with scopes as large as possible, to
+ * reduce their own extra-precision and efficiciency problems. In
+ * particular, they shouldn't convert back and forth just to call here.
+ */
+#ifdef DEBUG
+#define _2sumF(a, b) do { \
+ __typeof(a) __w; \
+ volatile __typeof(a) __ia, __ib, __r, __vw; \
+ \
+ __ia = (a); \
+ __ib = (b); \
+ assert(__ia == 0 || fabsl(__ia) >= fabsl(__ib)); \
+ \
+ __w = (a) + (b); \
+ (b) = ((a) - __w) + (b); \
+ (a) = __w; \
+ \
+ /* The next 2 assertions are weak if (a) is already long double. */ \
+ assert((long double)__ia + __ib == (long double)(a) + (b)); \
+ __vw = __ia + __ib; \
+ __r = __ia - __vw; \
+ __r += __ib; \
+ assert(__vw == (a) && __r == (b)); \
+} while (0)
+#else /* !DEBUG */
+#define _2sumF(a, b) do { \
+ __typeof(a) __w; \
+ \
+ __w = (a) + (b); \
+ (b) = ((a) - __w) + (b); \
+ (a) = __w; \
+} while (0)
+#endif /* DEBUG */
+
+/*
+ * Set x += c, where x is represented in extra precision as a + b.
+ * x must be sufficiently normalized and sufficiently larger than c,
+ * and the result is then sufficiently normalized.
+ *
+ * The details of ordering are that |a| must be >= |c| (so that (a, c)
+ * can be normalized without extra work to swap 'a' with c). The details of
+ * the normalization are that b must be small relative to the normalized 'a'.
+ * Normalization of (a, c) makes the normalized c tiny relative to the
+ * normalized a, so b remains small relative to 'a' in the result. However,
+ * b need not ever be tiny relative to 'a'. For example, b might be about
+ * 2**20 times smaller than 'a' to give about 20 extra bits of precision.
+ * That is usually enough, and adding c (which by normalization is about
+ * 2**53 times smaller than a) cannot change b significantly. However,
+ * cancellation of 'a' with c in normalization of (a, c) may reduce 'a'
+ * significantly relative to b. The caller must ensure that significant
+ * cancellation doesn't occur, either by having c of the same sign as 'a',
+ * or by having |c| a few percent smaller than |a|. Pre-normalization of
+ * (a, b) may help.
+ *
+ * This is a variant of an algorithm of Kahan (see Knuth (1981) 4.2.2
+ * exercise 19). We gain considerable efficiency by requiring the terms to
+ * be sufficiently normalized and sufficiently increasing.
+ */
+#define _3sumF(a, b, c) do { \
+ __typeof(a) __tmp; \
+ \
+ __tmp = (c); \
+ _2sumF(__tmp, (a)); \
+ (b) += (a); \
+ (a) = __tmp; \
+} while (0)
+
+/*
+ * Common routine to process the arguments to nan(), nanf(), and nanl().
+ */
+void _scan_nan(uint32_t *__words, int __num_words, const char *__s);
+
+/*
+ * Mix 0, 1 or 2 NaNs. First add 0 to each arg. This normally just turns
+ * signaling NaNs into quiet NaNs by setting a quiet bit. We do this
+ * because we want to never return a signaling NaN, and also because we
+ * don't want the quiet bit to affect the result. Then mix the converted
+ * args using the specified operation.
+ *
+ * When one arg is NaN, the result is typically that arg quieted. When both
+ * args are NaNs, the result is typically the quietening of the arg whose
+ * mantissa is largest after quietening. When neither arg is NaN, the
+ * result may be NaN because it is indeterminate, or finite for subsequent
+ * construction of a NaN as the indeterminate 0.0L/0.0L.
+ *
+ * Technical complications: the result in bits after rounding to the final
+ * precision might depend on the runtime precision and/or on compiler
+ * optimizations, especially when different register sets are used for
+ * different precisions. Try to make the result not depend on at least the
+ * runtime precision by always doing the main mixing step in long double
+ * precision. Try to reduce dependencies on optimizations by adding the
+ * the 0's in different precisions (unless everything is in long double
+ * precision).
+ */
+#define nan_mix(x, y) (nan_mix_op((x), (y), +))
+#define nan_mix_op(x, y, op) (((x) + 0.0L) op ((y) + 0))
+
+#ifdef _COMPLEX_H
+
+/*
+ * C99 specifies that complex numbers have the same representation as
+ * an array of two elements, where the first element is the real part
+ * and the second element is the imaginary part.
+ */
+typedef union {
+ float complex f;
+ float a[2];
+} float_complex;
+typedef union {
+ double complex f;
+ double a[2];
+} double_complex;
+typedef union {
+ long double complex f;
+ long double a[2];
+} long_double_complex;
+#define REALPART(z) ((z).a[0])
+#define IMAGPART(z) ((z).a[1])
+
+/*
+ * Inline functions that can be used to construct complex values.
+ *
+ * The C99 standard intends x+I*y to be used for this, but x+I*y is
+ * currently unusable in general since gcc introduces many overflow,
+ * underflow, sign and efficiency bugs by rewriting I*y as
+ * (0.0+I)*(y+0.0*I) and laboriously computing the full complex product.
+ * In particular, I*Inf is corrupted to NaN+I*Inf, and I*-0 is corrupted
+ * to -0.0+I*0.0.
+ *
+ * The C11 standard introduced the macros CMPLX(), CMPLXF() and CMPLXL()
+ * to construct complex values. Compilers that conform to the C99
+ * standard require the following functions to avoid the above issues.
+ */
+
+#ifndef CMPLXF
+static __inline float complex
+CMPLXF(float x, float y)
+{
+ float_complex z;
+
+ REALPART(z) = x;
+ IMAGPART(z) = y;
+ return (z.f);
+}
+#endif
+
+#ifndef CMPLX
+static __inline double complex
+CMPLX(double x, double y)
+{
+ double_complex z;
+
+ REALPART(z) = x;
+ IMAGPART(z) = y;
+ return (z.f);
+}
+#endif
+
+#ifndef CMPLXL
+static __inline long double complex
+CMPLXL(long double x, long double y)
+{
+ long_double_complex z;
+
+ REALPART(z) = x;
+ IMAGPART(z) = y;
+ return (z.f);
+}
+#endif
+
+#endif /* _COMPLEX_H */
+
+/*
+ * The rnint() family rounds to the nearest integer for a restricted range
+ * range of args (up to about 2**MANT_DIG). We assume that the current
+ * rounding mode is FE_TONEAREST so that this can be done efficiently.
+ * Extra precision causes more problems in practice, and we only centralize
+ * this here to reduce those problems, and have not solved the efficiency
+ * problems. The exp2() family uses a more delicate version of this that
+ * requires extracting bits from the intermediate value, so it is not
+ * centralized here and should copy any solution of the efficiency problems.
+ */
+
+static inline double
+rnint(__double_t x)
+{
+ /*
+ * This casts to double to kill any extra precision. This depends
+ * on the cast being applied to a double_t to avoid compiler bugs
+ * (this is a cleaner version of STRICT_ASSIGN()). This is
+ * inefficient if there actually is extra precision, but is hard
+ * to improve on. We use double_t in the API to minimise conversions
+ * for just calling here. Note that we cannot easily change the
+ * magic number to the one that works directly with double_t, since
+ * the rounding precision is variable at runtime on x86 so the
+ * magic number would need to be variable. Assuming that the
+ * rounding precision is always the default is too fragile. This
+ * and many other complications will move when the default is
+ * changed to FP_PE.
+ */
+ return ((double)(x + 0x1.8p52) - 0x1.8p52);
+}
+
+static inline float
+rnintf(__float_t x)
+{
+ /*
+ * As for rnint(), except we could just call that to handle the
+ * extra precision case, usually without losing efficiency.
+ */
+ return ((float)(x + 0x1.8p23F) - 0x1.8p23F);
+}
+
+#ifdef LDBL_MANT_DIG
+/*
+ * The complications for extra precision are smaller for rnintl() since it
+ * can safely assume that the rounding precision has been increased from
+ * its default to FP_PE on x86. We don't exploit that here to get small
+ * optimizations from limiting the rangle to double. We just need it for
+ * the magic number to work with long doubles. ld128 callers should use
+ * rnint() instead of this if possible. ld80 callers should prefer
+ * rnintl() since for amd64 this avoids swapping the register set, while
+ * for i386 it makes no difference (assuming FP_PE), and for other arches
+ * it makes little difference.
+ */
+static inline long double
+rnintl(long double x)
+{
+ return (x + __CONCAT(0x1.8p, LDBL_MANT_DIG) / 2 -
+ __CONCAT(0x1.8p, LDBL_MANT_DIG) / 2);
+}
+#endif /* LDBL_MANT_DIG */
+
+/*
+ * irint() and i64rint() give the same result as casting to their integer
+ * return type provided their arg is a floating point integer. They can
+ * sometimes be more efficient because no rounding is required.
+ */
+#if defined(amd64) || defined(__i386__)
+#define irint(x) \
+ (sizeof(x) == sizeof(float) && \
+ sizeof(__float_t) == sizeof(long double) ? irintf(x) : \
+ sizeof(x) == sizeof(double) && \
+ sizeof(__double_t) == sizeof(long double) ? irintd(x) : \
+ sizeof(x) == sizeof(long double) ? irintl(x) : (int)(x))
+#else
+#define irint(x) ((int)(x))
+#endif
+
+#define i64rint(x) ((int64_t)(x)) /* only needed for ld128 so not opt. */
+
+#if defined(__i386__)
+static __inline int
+irintf(float x)
+{
+ int n;
+
+ __asm("fistl %0" : "=m" (n) : "t" (x));
+ return (n);
+}
+
+static __inline int
+irintd(double x)
+{
+ int n;
+
+ __asm("fistl %0" : "=m" (n) : "t" (x));
+ return (n);
+}
+#endif
+
+#if defined(__amd64__) || defined(__i386__)
+static __inline int
+irintl(long double x)
+{
+ int n;
+
+ __asm("fistl %0" : "=m" (n) : "t" (x));
+ return (n);
+}
+#endif
+
+#ifdef DEBUG
+#if defined(__amd64__) || defined(__i386__)
+#define breakpoint() asm("int $3")
+#else
+#include <signal.h>
+
+#define breakpoint() raise(SIGTRAP)
+#endif
+#endif
+
+/* Write a pari script to test things externally. */
+#ifdef DOPRINT
+#include <stdio.h>
+
+#ifndef DOPRINT_SWIZZLE
+#define DOPRINT_SWIZZLE 0
+#endif
+
+#ifdef DOPRINT_LD80
+
+#define DOPRINT_START(xp) do { \
+ uint64_t __lx; \
+ uint16_t __hx; \
+ \
+ /* Hack to give more-problematic args. */ \
+ EXTRACT_LDBL80_WORDS(__hx, __lx, *xp); \
+ __lx ^= DOPRINT_SWIZZLE; \
+ INSERT_LDBL80_WORDS(*xp, __hx, __lx); \
+ printf("x = %.21Lg; ", (long double)*xp); \
+} while (0)
+#define DOPRINT_END1(v) \
+ printf("y = %.21Lg; z = 0; show(x, y, z);\n", (long double)(v))
+#define DOPRINT_END2(hi, lo) \
+ printf("y = %.21Lg; z = %.21Lg; show(x, y, z);\n", \
+ (long double)(hi), (long double)(lo))
+
+#elif defined(DOPRINT_D64)
+
+#define DOPRINT_START(xp) do { \
+ uint32_t __hx, __lx; \
+ \
+ EXTRACT_WORDS(__hx, __lx, *xp); \
+ __lx ^= DOPRINT_SWIZZLE; \
+ INSERT_WORDS(*xp, __hx, __lx); \
+ printf("x = %.21Lg; ", (long double)*xp); \
+} while (0)
+#define DOPRINT_END1(v) \
+ printf("y = %.21Lg; z = 0; show(x, y, z);\n", (long double)(v))
+#define DOPRINT_END2(hi, lo) \
+ printf("y = %.21Lg; z = %.21Lg; show(x, y, z);\n", \
+ (long double)(hi), (long double)(lo))
+
+#elif defined(DOPRINT_F32)
+
+#define DOPRINT_START(xp) do { \
+ uint32_t __hx; \
+ \
+ GET_FLOAT_WORD(__hx, *xp); \
+ __hx ^= DOPRINT_SWIZZLE; \
+ SET_FLOAT_WORD(*xp, __hx); \
+ printf("x = %.21Lg; ", (long double)*xp); \
+} while (0)
+#define DOPRINT_END1(v) \
+ printf("y = %.21Lg; z = 0; show(x, y, z);\n", (long double)(v))
+#define DOPRINT_END2(hi, lo) \
+ printf("y = %.21Lg; z = %.21Lg; show(x, y, z);\n", \
+ (long double)(hi), (long double)(lo))
+
+#else /* !DOPRINT_LD80 && !DOPRINT_D64 (LD128 only) */
+
+#ifndef DOPRINT_SWIZZLE_HIGH
+#define DOPRINT_SWIZZLE_HIGH 0
+#endif
+
+#define DOPRINT_START(xp) do { \
+ uint64_t __lx, __llx; \
+ uint16_t __hx; \
+ \
+ EXTRACT_LDBL128_WORDS(__hx, __lx, __llx, *xp); \
+ __llx ^= DOPRINT_SWIZZLE; \
+ __lx ^= DOPRINT_SWIZZLE_HIGH; \
+ INSERT_LDBL128_WORDS(*xp, __hx, __lx, __llx); \
+ printf("x = %.36Lg; ", (long double)*xp); \
+} while (0)
+#define DOPRINT_END1(v) \
+ printf("y = %.36Lg; z = 0; show(x, y, z);\n", (long double)(v))
+#define DOPRINT_END2(hi, lo) \
+ printf("y = %.36Lg; z = %.36Lg; show(x, y, z);\n", \
+ (long double)(hi), (long double)(lo))
+
+#endif /* DOPRINT_LD80 */
+
+#else /* !DOPRINT */
+#define DOPRINT_START(xp)
+#define DOPRINT_END1(v)
+#define DOPRINT_END2(hi, lo)
+#endif /* DOPRINT */
+
+#define RETURNP(x) do { \
+ DOPRINT_END1(x); \
+ RETURNF(x); \
+} while (0)
+#define RETURNPI(x) do { \
+ DOPRINT_END1(x); \
+ RETURNI(x); \
+} while (0)
+#define RETURN2P(x, y) do { \
+ DOPRINT_END2((x), (y)); \
+ RETURNF((x) + (y)); \
+} while (0)
+#define RETURN2PI(x, y) do { \
+ DOPRINT_END2((x), (y)); \
+ RETURNI((x) + (y)); \
+} while (0)
+#ifdef STRUCT_RETURN
+#define RETURNSP(rp) do { \
+ if (!(rp)->lo_set) \
+ RETURNP((rp)->hi); \
+ RETURN2P((rp)->hi, (rp)->lo); \
+} while (0)
+#define RETURNSPI(rp) do { \
+ if (!(rp)->lo_set) \
+ RETURNPI((rp)->hi); \
+ RETURN2PI((rp)->hi, (rp)->lo); \
+} while (0)
+#endif
+#define SUM2P(x, y) ({ \
+ const __typeof (x) __x = (x); \
+ const __typeof (y) __y = (y); \
+ \
+ DOPRINT_END2(__x, __y); \
+ __x + __y; \
+})
+
+/*
+ * ieee style elementary functions
+ *
+ * We rename functions here to improve other sources' diffability
+ * against fdlibm.
+ */
+#define __ieee754_sqrt sqrt
+#define __ieee754_acos acos
+#define __ieee754_acosh acosh
+#define __ieee754_log log
+#define __ieee754_log2 log2
+#define __ieee754_atanh atanh
+#define __ieee754_asin asin
+#define __ieee754_atan2 atan2
+#define __ieee754_exp exp
+#define __ieee754_cosh cosh
+#define __ieee754_fmod fmod
+#define __ieee754_pow pow
+#define __ieee754_lgamma lgamma
+#define __ieee754_gamma gamma
+#define __ieee754_lgamma_r lgamma_r
+#define __ieee754_gamma_r gamma_r
+#define __ieee754_log10 log10
+#define __ieee754_sinh sinh
+#define __ieee754_hypot hypot
+#define __ieee754_j0 j0
+#define __ieee754_j1 j1
+#define __ieee754_y0 y0
+#define __ieee754_y1 y1
+#define __ieee754_jn jn
+#define __ieee754_yn yn
+#define __ieee754_remainder remainder
+#define __ieee754_scalb scalb
+#define __ieee754_sqrtf sqrtf
+#define __ieee754_acosf acosf
+#define __ieee754_acoshf acoshf
+#define __ieee754_logf logf
+#define __ieee754_atanhf atanhf
+#define __ieee754_asinf asinf
+#define __ieee754_atan2f atan2f
+#define __ieee754_expf expf
+#define __ieee754_coshf coshf
+#define __ieee754_fmodf fmodf
+#define __ieee754_powf powf
+#define __ieee754_lgammaf lgammaf
+#define __ieee754_gammaf gammaf
+#define __ieee754_lgammaf_r lgammaf_r
+#define __ieee754_gammaf_r gammaf_r
+#define __ieee754_log10f log10f
+#define __ieee754_log2f log2f
+#define __ieee754_sinhf sinhf
+#define __ieee754_hypotf hypotf
+#define __ieee754_j0f j0f
+#define __ieee754_j1f j1f
+#define __ieee754_y0f y0f
+#define __ieee754_y1f y1f
+#define __ieee754_jnf jnf
+#define __ieee754_ynf ynf
+#define __ieee754_remainderf remainderf
+#define __ieee754_scalbf scalbf
+
+/* fdlibm kernel function */
+int __kernel_rem_pio2(double*,double*,int,int,int);
+
+/* double precision kernel functions */
+#ifndef INLINE_REM_PIO2
+int __ieee754_rem_pio2(double,double*);
+#endif
+double __kernel_sin(double,double,int);
+double __kernel_cos(double,double);
+double __kernel_tan(double,double,int);
+double __ldexp_exp(double,int);
+#ifdef _COMPLEX_H
+double complex __ldexp_cexp(double complex,int);
+#endif
+
+/* float precision kernel functions */
+#ifndef INLINE_REM_PIO2F
+int __ieee754_rem_pio2f(float,double*);
+#endif
+#ifndef INLINE_KERNEL_SINDF
+float __kernel_sindf(double);
+#endif
+#ifndef INLINE_KERNEL_COSDF
+float __kernel_cosdf(double);
+#endif
+#ifndef INLINE_KERNEL_TANDF
+float __kernel_tandf(double,int);
+#endif
+float __ldexp_expf(float,int);
+#ifdef _COMPLEX_H
+float complex __ldexp_cexpf(float complex,int);
+#endif
+
+/* long double precision kernel functions */
+long double __kernel_sinl(long double, long double, int);
+long double __kernel_cosl(long double, long double);
+long double __kernel_tanl(long double, long double, int);
+
+#endif /* !_MATH_PRIVATE_H_ */
diff --git a/newlib/libm/ld/s_asinhl.c b/newlib/libm/ld/s_asinhl.c
new file mode 100644
index 000000000..ba28f599c
--- /dev/null
+++ b/newlib/libm/ld/s_asinhl.c
@@ -0,0 +1,91 @@
+/* from: FreeBSD: head/lib/msun/src/e_acosh.c 176451 2008-02-22 02:30:36Z das */
+
+/* @(#)s_asinh.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * See s_asinh.c for complete comments.
+ *
+ * Converted to long double by David Schultz <das@FreeBSD.ORG> and
+ * Bruce D. Evans.
+ */
+
+#include <float.h>
+#ifdef __i386__
+#include <ieeefp.h>
+#endif
+
+#include "fpmath.h"
+#include "math.h"
+#include "math_private.h"
+
+/* EXP_LARGE is the threshold above which we use asinh(x) ~= log(2x). */
+/* EXP_TINY is the threshold below which we use asinh(x) ~= x. */
+#if LDBL_MANT_DIG == 64
+#define EXP_LARGE 34
+#define EXP_TINY -34
+#elif LDBL_MANT_DIG == 113
+#define EXP_LARGE 58
+#define EXP_TINY -58
+#else
+#error "Unsupported long double format"
+#endif
+
+#if LDBL_MAX_EXP != 0x4000
+/* We also require the usual expsign encoding. */
+#error "Unsupported long double format"
+#endif
+
+#define BIAS (LDBL_MAX_EXP - 1)
+
+static const double
+one = 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */
+huge= 1.00000000000000000000e+300;
+
+#if LDBL_MANT_DIG == 64
+static const union IEEEl2bits
+u_ln2 = LD80C(0xb17217f7d1cf79ac, -1, 6.93147180559945309417e-1L);
+#define ln2 u_ln2.e
+#elif LDBL_MANT_DIG == 113
+static const long double
+ln2 = 6.93147180559945309417232121458176568e-1L; /* 0x162e42fefa39ef35793c7673007e6.0p-113 */
+#else
+#error "Unsupported long double format"
+#endif
+
+long double
+asinhl(long double x)
+{
+ long double t, w;
+ uint16_t hx, ix;
+
+ ENTERI();
+ GET_LDBL_EXPSIGN(hx, x);
+ ix = hx & 0x7fff;
+ if (ix >= 0x7fff) RETURNI(x+x); /* x is inf, NaN or misnormal */
+ if (ix < BIAS + EXP_TINY) { /* |x| < TINY, or misnormal */
+ if (huge + x > one) RETURNI(x); /* return x inexact except 0 */
+ }
+ if (ix >= BIAS + EXP_LARGE) { /* |x| >= LARGE, or misnormal */
+ w = logl(fabsl(x))+ln2;
+ } else if (ix >= 0x4000) { /* LARGE > |x| >= 2.0, or misnormal */
+ t = fabsl(x);
+ w = logl(2.0*t+one/(sqrtl(x*x+one)+t));
+ } else { /* 2.0 > |x| >= TINY, or misnormal */
+ t = x*x;
+ w =log1pl(fabsl(x)+t/(one+sqrtl(one+t)));
+ }
+ RETURNI((hx & 0x8000) == 0 ? w : -w);
+}
diff --git a/newlib/libm/ld/s_atanl.c b/newlib/libm/ld/s_atanl.c
new file mode 100644
index 000000000..ff29c3ce8
--- /dev/null
+++ b/newlib/libm/ld/s_atanl.c
@@ -0,0 +1,85 @@
+/* @(#)s_atan.c 5.1 93/09/24 */
+/* FreeBSD: head/lib/msun/src/s_atan.c 176451 2008-02-22 02:30:36Z das */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * See comments in s_atan.c.
+ * Converted to long double by David Schultz <das@FreeBSD.ORG>.
+ */
+
+#include <float.h>
+
+#include "invtrig.h"
+#include "math.h"
+#include "math_private.h"
+
+static const long double
+one = 1.0,
+huge = 1.0e300;
+
+long double
+atanl(long double x)
+{
+ union IEEEl2bits u;
+ long double w,s1,s2,z;
+ int id;
+ int16_t expsign, expt;
+ int32_t expman;
+
+ u.e = x;
+ expsign = u.xbits.expsign;
+ expt = expsign & 0x7fff;
+ if(expt >= ATAN_CONST) { /* if |x| is large, atan(x)~=pi/2 */
+ if(expt == BIAS + LDBL_MAX_EXP &&
+ ((u.bits.manh&~LDBL_NBIT)|u.bits.manl)!=0)
+ return x+x; /* NaN */
+ if(expsign>0) return atanhi[3]+atanlo[3];
+ else return -atanhi[3]-atanlo[3];
+ }
+ /* Extract the exponent and the first few bits of the mantissa. */
+ /* XXX There should be a more convenient way to do this. */
+ expman = (expt << 8) | ((u.bits.manh >> (MANH_SIZE - 9)) & 0xff);
+ if (expman < ((BIAS - 2) << 8) + 0xc0) { /* |x| < 0.4375 */
+ if (expt < ATAN_LINEAR) { /* if |x| is small, atanl(x)~=x */
+ if(huge+x>one) return x; /* raise inexact */
+ }
+ id = -1;
+ } else {
+ x = fabsl(x);
+ if (expman < (BIAS << 8) + 0x30) { /* |x| < 1.1875 */
+ if (expman < ((BIAS - 1) << 8) + 0x60) { /* 7/16 <=|x|<11/16 */
+ id = 0; x = (2.0*x-one)/(2.0+x);
+ } else { /* 11/16<=|x|< 19/16 */
+ id = 1; x = (x-one)/(x+one);
+ }
+ } else {
+ if (expman < ((BIAS + 1) << 8) + 0x38) { /* |x| < 2.4375 */
+ id = 2; x = (x-1.5)/(one+1.5*x);
+ } else { /* 2.4375 <= |x| < 2^ATAN_CONST */
+ id = 3; x = -1.0/x;
+ }
+ }}
+ /* end of argument reduction */
+ z = x*x;
+ w = z*z;
+ /* break sum aT[i]z**(i+1) into odd and even poly */
+ s1 = z*T_even(w);
+ s2 = w*T_odd(w);
+ if (id<0) return x - x*(s1+s2);
+ else {
+ z = atanhi[id] - ((x*(s1+s2) - atanlo[id]) - x);
+ return (expsign<0)? -z:z;
+ }
+}
diff --git a/newlib/libm/ld/s_cbrtl.c b/newlib/libm/ld/s_cbrtl.c
new file mode 100644
index 000000000..b15c96ecd
--- /dev/null
+++ b/newlib/libm/ld/s_cbrtl.c
@@ -0,0 +1,143 @@
+/*-
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ * Copyright (c) 2009-2011, Bruce D. Evans, Steven G. Kargl, David Schultz.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ *
+ * The argument reduction and testing for exceptional cases was
+ * written by Steven G. Kargl with input from Bruce D. Evans
+ * and David A. Schultz.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <float.h>
+#ifdef __i386__
+#include <ieeefp.h>
+#endif
+
+#include "fpmath.h"
+#include "math.h"
+#include "math_private.h"
+
+#define BIAS (LDBL_MAX_EXP - 1)
+
+static const unsigned
+ B1 = 709958130; /* B1 = (127-127.0/3-0.03306235651)*2**23 */
+
+long double
+cbrtl(long double x)
+{
+ union IEEEl2bits u, v;
+ long double r, s, t, w;
+ double dr, dt, dx;
+ float ft, fx;
+ uint32_t hx;
+ uint16_t expsign;
+ int k;
+
+ u.e = x;
+ expsign = u.xbits.expsign;
+ k = expsign & 0x7fff;
+
+ /*
+ * If x = +-Inf, then cbrt(x) = +-Inf.
+ * If x = NaN, then cbrt(x) = NaN.
+ */
+ if (k == BIAS + LDBL_MAX_EXP)
+ return (x + x);
+
+ ENTERI();
+ if (k == 0) {
+ /* If x = +-0, then cbrt(x) = +-0. */
+ if ((u.bits.manh | u.bits.manl) == 0)
+ RETURNI(x);
+ /* Adjust subnormal numbers. */
+ u.e *= 0x1.0p514;
+ k = u.bits.exp;
+ k -= BIAS + 514;
+ } else
+ k -= BIAS;
+ u.xbits.expsign = BIAS;
+ v.e = 1;
+
+ x = u.e;
+ switch (k % 3) {
+ case 1:
+ case -2:
+ x = 2*x;
+ k--;
+ break;
+ case 2:
+ case -1:
+ x = 4*x;
+ k -= 2;
+ break;
+ }
+ v.xbits.expsign = (expsign & 0x8000) | (BIAS + k / 3);
+
+ /*
+ * The following is the guts of s_cbrtf, with the handling of
+ * special values removed and extra care for accuracy not taken,
+ * but with most of the extra accuracy not discarded.
+ */
+
+ /* ~5-bit estimate: */
+ fx = x;
+ GET_FLOAT_WORD(hx, fx);
+ SET_FLOAT_WORD(ft, ((hx & 0x7fffffff) / 3 + B1));
+
+ /* ~16-bit estimate: */
+ dx = x;
+ dt = ft;
+ dr = dt * dt * dt;
+ dt = dt * (dx + dx + dr) / (dx + dr + dr);
+
+ /* ~47-bit estimate: */
+ dr = dt * dt * dt;
+ dt = dt * (dx + dx + dr) / (dx + dr + dr);
+
+#if LDBL_MANT_DIG == 64
+ /*
+ * dt is cbrtl(x) to ~47 bits (after x has been reduced to 1 <= x < 8).
+ * Round it away from zero to 32 bits (32 so that t*t is exact, and
+ * away from zero for technical reasons).
+ */
+ volatile double vd2 = 0x1.0p32;
+ volatile double vd1 = 0x1.0p-31;
+ #define vd ((long double)vd2 + vd1)
+
+ t = dt + vd - 0x1.0p32;
+#elif LDBL_MANT_DIG == 113
+ /*
+ * Round dt away from zero to 47 bits. Since we don't trust the 47,
+ * add 2 47-bit ulps instead of 1 to round up. Rounding is slow and
+ * might be avoidable in this case, since on most machines dt will
+ * have been evaluated in 53-bit precision and the technical reasons
+ * for rounding up might not apply to either case in cbrtl() since
+ * dt is much more accurate than needed.
+ */
+ t = dt + 0x2.0p-46 + 0x1.0p60L - 0x1.0p60;
+#else
+#error "Unsupported long double format"
+#endif
+
+ /*
+ * Final step Newton iteration to 64 or 113 bits with
+ * error < 0.667 ulps
+ */
+ s=t*t; /* t*t is exact */
+ r=x/s; /* error <= 0.5 ulps; |r| < |t| */
+ w=t+t; /* t+t is exact */
+ r=(r-t)/(w+r); /* r-t is exact; w+r ~= 3*t */
+ t=t+t*r; /* error <= (0.5 + 0.5/3) * ulp */
+
+ t *= v.e;
+ RETURNI(t);
+}
diff --git a/newlib/libm/ld/s_ceill.c b/newlib/libm/ld/s_ceill.c
new file mode 100644
index 000000000..2d1045fe6
--- /dev/null
+++ b/newlib/libm/ld/s_ceill.c
@@ -0,0 +1,101 @@
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ *
+ * From: @(#)s_ceil.c 5.1 93/09/24
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * ceill(x)
+ * Return x rounded toward -inf to integral value
+ * Method:
+ * Bit twiddling.
+ * Exception:
+ * Inexact flag raised if x not equal to ceill(x).
+ */
+
+#include <float.h>
+#include <math.h>
+#include <stdint.h>
+
+#include "fpmath.h"
+
+#ifdef LDBL_IMPLICIT_NBIT
+#define MANH_SIZE (LDBL_MANH_SIZE + 1)
+#define INC_MANH(u, c) do { \
+ uint64_t o = u.bits.manh; \
+ u.bits.manh += (c); \
+ if (u.bits.manh < o) \
+ u.bits.exp++; \
+} while (0)
+#else
+#define MANH_SIZE LDBL_MANH_SIZE
+#define INC_MANH(u, c) do { \
+ uint64_t o = u.bits.manh; \
+ u.bits.manh += (c); \
+ if (u.bits.manh < o) { \
+ u.bits.exp++; \
+ u.bits.manh |= 1llu << (LDBL_MANH_SIZE - 1); \
+ } \
+} while (0)
+#endif
+
+static const long double huge = 1.0e300;
+
+long double
+ceill(long double x)
+{
+ union IEEEl2bits u = { .e = x };
+ int e = u.bits.exp - LDBL_MAX_EXP + 1;
+
+ if (e < MANH_SIZE - 1) {
+ if (e < 0) { /* raise inexact if x != 0 */
+ if (huge + x > 0.0)
+ if (u.bits.exp > 0 ||
+ (u.bits.manh | u.bits.manl) != 0)
+ u.e = u.bits.sign ? -0.0 : 1.0;
+ } else {
+ uint64_t m = ((1llu << MANH_SIZE) - 1) >> (e + 1);
+ if (((u.bits.manh & m) | u.bits.manl) == 0)
+ return (x); /* x is integral */
+ if (!u.bits.sign) {
+#ifdef LDBL_IMPLICIT_NBIT
+ if (e == 0)
+ u.bits.exp++;
+ else
+#endif
+ INC_MANH(u, 1llu << (MANH_SIZE - e - 1));
+ }
+ if (huge + x > 0.0) { /* raise inexact flag */
+ u.bits.manh &= ~m;
+ u.bits.manl = 0;
+ }
+ }
+ } else if (e < LDBL_MANT_DIG - 1) {
+ uint64_t m = (uint64_t)-1 >> (64 - LDBL_MANT_DIG + e + 1);
+ if ((u.bits.manl & m) == 0)
+ return (x); /* x is integral */
+ if (!u.bits.sign) {
+ if (e == MANH_SIZE - 1)
+ INC_MANH(u, 1);
+ else {
+ uint64_t o = u.bits.manl;
+ u.bits.manl += 1llu << (LDBL_MANT_DIG - e - 1);
+ if (u.bits.manl < o) /* got a carry */
+ INC_MANH(u, 1);
+ }
+ }
+ if (huge + x > 0.0) /* raise inexact flag */
+ u.bits.manl &= ~m;
+ }
+ return (u.e);
+}
diff --git a/newlib/libm/ld/s_copysignl.c b/newlib/libm/ld/s_copysignl.c
new file mode 100644
index 000000000..bd6744705
--- /dev/null
+++ b/newlib/libm/ld/s_copysignl.c
@@ -0,0 +1,44 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2004 Stefan Farfeleder
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <math.h>
+
+#include "fpmath.h"
+
+long double
+copysignl(long double x, long double y)
+{
+ union IEEEl2bits ux, uy;
+
+ ux.e = x;
+ uy.e = y;
+ ux.bits.sign = uy.bits.sign;
+ return (ux.e);
+}
diff --git a/newlib/libm/ld/s_cosl.c b/newlib/libm/ld/s_cosl.c
new file mode 100644
index 000000000..3d066483f
--- /dev/null
+++ b/newlib/libm/ld/s_cosl.c
@@ -0,0 +1,102 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2007 Steven G. Kargl
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice unmodified, this list of conditions, and the following
+ * disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * Limited testing on pseudorandom numbers drawn within [-2e8:4e8] shows
+ * an accuracy of <= 0.7412 ULP.
+ */
+
+#include <float.h>
+#ifdef __i386__
+#include <ieeefp.h>
+#endif
+
+#include "fpmath.h"
+#include "math.h"
+#include "math_private.h"
+#if LDBL_MANT_DIG == 64
+#include "../ld80/e_rem_pio2l.h"
+static const union IEEEl2bits
+pio4u = LD80C(0xc90fdaa22168c235, -00001, 7.85398163397448309628e-01L);
+#define pio4 (pio4u.e)
+#elif LDBL_MANT_DIG == 113
+#include "../ld128/e_rem_pio2l.h"
+long double pio4 = 7.85398163397448309615660845819875721e-1L;
+#else
+#error "Unsupported long double format"
+#endif
+
+long double
+cosl(long double x)
+{
+ union IEEEl2bits z;
+ int e0;
+ long double y[2];
+ long double hi, lo;
+
+ z.e = x;
+ z.bits.sign = 0;
+
+ /* If x = +-0 or x is a subnormal number, then cos(x) = 1 */
+ if (z.bits.exp == 0)
+ return (1.0);
+
+ /* If x = NaN or Inf, then cos(x) = NaN. */
+ if (z.bits.exp == 32767)
+ return ((x - x) / (x - x));
+
+ ENTERI();
+
+ /* Optimize the case where x is already within range. */
+ if (z.e < pio4)
+ RETURNI(__kernel_cosl(z.e, 0));
+
+ e0 = __ieee754_rem_pio2l(x, y);
+ hi = y[0];
+ lo = y[1];
+
+ switch (e0 & 3) {
+ case 0:
+ hi = __kernel_cosl(hi, lo);
+ break;
+ case 1:
+ hi = - __kernel_sinl(hi, lo, 1);
+ break;
+ case 2:
+ hi = - __kernel_cosl(hi, lo);
+ break;
+ case 3:
+ hi = __kernel_sinl(hi, lo, 1);
+ break;
+ }
+
+ RETURNI(hi);
+}
diff --git a/newlib/libm/ld/s_fabsl.c b/newlib/libm/ld/s_fabsl.c
new file mode 100644
index 000000000..5076d8a9b
--- /dev/null
+++ b/newlib/libm/ld/s_fabsl.c
@@ -0,0 +1,45 @@
+/*-
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright (c) 2003 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer
+ * in this position and unchanged.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <math.h>
+
+#include "fpmath.h"
+
+long double
+fabsl(long double x)
+{
+ union IEEEl2bits u;
+
+ u.e = x;
+ u.bits.sign = 0;
+ return (u.e);
+}
diff --git a/newlib/libm/ld/s_fdim.c b/newlib/libm/ld/s_fdim.c
new file mode 100644
index 000000000..c40c3e9d3
--- /dev/null
+++ b/newlib/libm/ld/s_fdim.c
@@ -0,0 +1,48 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <math.h>
+
+#define DECL(type, fn) \
+type \
+fn(type x, type y) \
+{ \
+ \
+ if (isnan(x)) \
+ return (x); \
+ if (isnan(y)) \
+ return (y); \
+ return (x > y ? x - y : 0.0); \
+}
+
+DECL(double, fdim)
+DECL(float, fdimf)
+DECL(long double, fdiml)
diff --git a/newlib/libm/ld/s_floorl.c b/newlib/libm/ld/s_floorl.c
new file mode 100644
index 000000000..6cec3e781
--- /dev/null
+++ b/newlib/libm/ld/s_floorl.c
@@ -0,0 +1,101 @@
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ *
+ * From: @(#)s_floor.c 5.1 93/09/24
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * floorl(x)
+ * Return x rounded toward -inf to integral value
+ * Method:
+ * Bit twiddling.
+ * Exception:
+ * Inexact flag raised if x not equal to floorl(x).
+ */
+
+#include <float.h>
+#include <math.h>
+#include <stdint.h>
+
+#include "fpmath.h"
+
+#ifdef LDBL_IMPLICIT_NBIT
+#define MANH_SIZE (LDBL_MANH_SIZE + 1)
+#define INC_MANH(u, c) do { \
+ uint64_t o = u.bits.manh; \
+ u.bits.manh += (c); \
+ if (u.bits.manh < o) \
+ u.bits.exp++; \
+} while (0)
+#else
+#define MANH_SIZE LDBL_MANH_SIZE
+#define INC_MANH(u, c) do { \
+ uint64_t o = u.bits.manh; \
+ u.bits.manh += (c); \
+ if (u.bits.manh < o) { \
+ u.bits.exp++; \
+ u.bits.manh |= 1llu << (LDBL_MANH_SIZE - 1); \
+ } \
+} while (0)
+#endif
+
+static const long double huge = 1.0e300;
+
+long double
+floorl(long double x)
+{
+ union IEEEl2bits u = { .e = x };
+ int e = u.bits.exp - LDBL_MAX_EXP + 1;
+
+ if (e < MANH_SIZE - 1) {
+ if (e < 0) { /* raise inexact if x != 0 */
+ if (huge + x > 0.0)
+ if (u.bits.exp > 0 ||
+ (u.bits.manh | u.bits.manl) != 0)
+ u.e = u.bits.sign ? -1.0 : 0.0;
+ } else {
+ uint64_t m = ((1llu << MANH_SIZE) - 1) >> (e + 1);
+ if (((u.bits.manh & m) | u.bits.manl) == 0)
+ return (x); /* x is integral */
+ if (u.bits.sign) {
+#ifdef LDBL_IMPLICIT_NBIT
+ if (e == 0)
+ u.bits.exp++;
+ else
+#endif
+ INC_MANH(u, 1llu << (MANH_SIZE - e - 1));
+ }
+ if (huge + x > 0.0) { /* raise inexact flag */
+ u.bits.manh &= ~m;
+ u.bits.manl = 0;
+ }
+ }
+ } else if (e < LDBL_MANT_DIG - 1) {
+ uint64_t m = (uint64_t)-1 >> (64 - LDBL_MANT_DIG + e + 1);
+ if ((u.bits.manl & m) == 0)
+ return (x); /* x is integral */
+ if (u.bits.sign) {
+ if (e == MANH_SIZE - 1)
+ INC_MANH(u, 1);
+ else {
+ uint64_t o = u.bits.manl;
+ u.bits.manl += 1llu << (LDBL_MANT_DIG - e - 1);
+ if (u.bits.manl < o) /* got a carry */
+ INC_MANH(u, 1);
+ }
+ }
+ if (huge + x > 0.0) /* raise inexact flag */
+ u.bits.manl &= ~m;
+ }
+ return (u.e);
+}
diff --git a/newlib/libm/ld/s_fmal.c b/newlib/libm/ld/s_fmal.c
new file mode 100644
index 000000000..a379346c1
--- /dev/null
+++ b/newlib/libm/ld/s_fmal.c
@@ -0,0 +1,274 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2005-2011 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <fenv.h>
+#include <float.h>
+#include <math.h>
+
+#include "fpmath.h"
+
+/*
+ * A struct dd represents a floating-point number with twice the precision
+ * of a long double. We maintain the invariant that "hi" stores the high-order
+ * bits of the result.
+ */
+struct dd {
+ long double hi;
+ long double lo;
+};
+
+/*
+ * Compute a+b exactly, returning the exact result in a struct dd. We assume
+ * that both a and b are finite, but make no assumptions about their relative
+ * magnitudes.
+ */
+static inline struct dd
+dd_add(long double a, long double b)
+{
+ struct dd ret;
+ long double s;
+
+ ret.hi = a + b;
+ s = ret.hi - a;
+ ret.lo = (a - (ret.hi - s)) + (b - s);
+ return (ret);
+}
+
+/*
+ * Compute a+b, with a small tweak: The least significant bit of the
+ * result is adjusted into a sticky bit summarizing all the bits that
+ * were lost to rounding. This adjustment negates the effects of double
+ * rounding when the result is added to another number with a higher
+ * exponent. For an explanation of round and sticky bits, see any reference
+ * on FPU design, e.g.,
+ *
+ * J. Coonen. An Implementation Guide to a Proposed Standard for
+ * Floating-Point Arithmetic. Computer, vol. 13, no. 1, Jan 1980.
+ */
+static inline long double
+add_adjusted(long double a, long double b)
+{
+ struct dd sum;
+ union IEEEl2bits u;
+
+ sum = dd_add(a, b);
+ if (sum.lo != 0) {
+ u.e = sum.hi;
+ if ((u.bits.manl & 1) == 0)
+ sum.hi = nextafterl(sum.hi, INFINITY * sum.lo);
+ }
+ return (sum.hi);
+}
+
+/*
+ * Compute ldexp(a+b, scale) with a single rounding error. It is assumed
+ * that the result will be subnormal, and care is taken to ensure that
+ * double rounding does not occur.
+ */
+static inline long double
+add_and_denormalize(long double a, long double b, int scale)
+{
+ struct dd sum;
+ int bits_lost;
+ union IEEEl2bits u;
+
+ sum = dd_add(a, b);
+
+ /*
+ * If we are losing at least two bits of accuracy to denormalization,
+ * then the first lost bit becomes a round bit, and we adjust the
+ * lowest bit of sum.hi to make it a sticky bit summarizing all the
+ * bits in sum.lo. With the sticky bit adjusted, the hardware will
+ * break any ties in the correct direction.
+ *
+ * If we are losing only one bit to denormalization, however, we must
+ * break the ties manually.
+ */
+ if (sum.lo != 0) {
+ u.e = sum.hi;
+ bits_lost = -u.bits.exp - scale + 1;
+ if ((bits_lost != 1) ^ (int)(u.bits.manl & 1))
+ sum.hi = nextafterl(sum.hi, INFINITY * sum.lo);
+ }
+ return (ldexp(sum.hi, scale));
+}
+
+/*
+ * Compute a*b exactly, returning the exact result in a struct dd. We assume
+ * that both a and b are normalized, so no underflow or overflow will occur.
+ * The current rounding mode must be round-to-nearest.
+ */
+static inline struct dd
+dd_mul(long double a, long double b)
+{
+#if LDBL_MANT_DIG == 64
+ static const long double split = 0x1p32L + 1.0;
+#elif LDBL_MANT_DIG == 113
+ static const long double split = 0x1p57L + 1.0;
+#endif
+ struct dd ret;
+ long double ha, hb, la, lb, p, q;
+
+ p = a * split;
+ ha = a - p;
+ ha += p;
+ la = a - ha;
+
+ p = b * split;
+ hb = b - p;
+ hb += p;
+ lb = b - hb;
+
+ p = ha * hb;
+ q = ha * lb + la * hb;
+
+ ret.hi = p + q;
+ ret.lo = p - ret.hi + q + la * lb;
+ return (ret);
+}
+
+/*
+ * Fused multiply-add: Compute x * y + z with a single rounding error.
+ *
+ * We use scaling to avoid overflow/underflow, along with the
+ * canonical precision-doubling technique adapted from:
+ *
+ * Dekker, T. A Floating-Point Technique for Extending the
+ * Available Precision. Numer. Math. 18, 224-242 (1971).
+ */
+long double
+fmal(long double x, long double y, long double z)
+{
+ long double xs, ys, zs, adj;
+ struct dd xy, r;
+ int oround;
+ int ex, ey, ez;
+ int spread;
+
+ /*
+ * Handle special cases. The order of operations and the particular
+ * return values here are crucial in handling special cases involving
+ * infinities, NaNs, overflows, and signed zeroes correctly.
+ */
+ if (x == 0.0 || y == 0.0)
+ return (x * y + z);
+ if (z == 0.0)
+ return (x * y);
+ if (!isfinite(x) || !isfinite(y))
+ return (x * y + z);
+ if (!isfinite(z))
+ return (z);
+
+ xs = frexpl(x, &ex);
+ ys = frexpl(y, &ey);
+ zs = frexpl(z, &ez);
+ oround = fegetround();
+ spread = ex + ey - ez;
+
+ /*
+ * If x * y and z are many orders of magnitude apart, the scaling
+ * will overflow, so we handle these cases specially. Rounding
+ * modes other than FE_TONEAREST are painful.
+ */
+ if (spread < -LDBL_MANT_DIG) {
+ feraiseexcept(FE_INEXACT);
+ if (!isnormal(z))
+ feraiseexcept(FE_UNDERFLOW);
+ switch (oround) {
+ case FE_TONEAREST:
+ return (z);
+ case FE_TOWARDZERO:
+ if (x > 0.0 ^ y < 0.0 ^ z < 0.0)
+ return (z);
+ else
+ return (nextafterl(z, 0));
+ case FE_DOWNWARD:
+ if (x > 0.0 ^ y < 0.0)
+ return (z);
+ else
+ return (nextafterl(z, -INFINITY));
+ default: /* FE_UPWARD */
+ if (x > 0.0 ^ y < 0.0)
+ return (nextafterl(z, INFINITY));
+ else
+ return (z);
+ }
+ }
+ if (spread <= LDBL_MANT_DIG * 2)
+ zs = ldexpl(zs, -spread);
+ else
+ zs = copysignl(LDBL_MIN, zs);
+
+ fesetround(FE_TONEAREST);
+ /* work around clang bug 8100 */
+ volatile long double vxs = xs;
+
+ /*
+ * Basic approach for round-to-nearest:
+ *
+ * (xy.hi, xy.lo) = x * y (exact)
+ * (r.hi, r.lo) = xy.hi + z (exact)
+ * adj = xy.lo + r.lo (inexact; low bit is sticky)
+ * result = r.hi + adj (correctly rounded)
+ */
+ xy = dd_mul(vxs, ys);
+ r = dd_add(xy.hi, zs);
+
+ spread = ex + ey;
+
+ if (r.hi == 0.0) {
+ /*
+ * When the addends cancel to 0, ensure that the result has
+ * the correct sign.
+ */
+ fesetround(oround);
+ volatile long double vzs = zs; /* XXX gcc CSE bug workaround */
+ return (xy.hi + vzs + ldexpl(xy.lo, spread));
+ }
+
+ if (oround != FE_TONEAREST) {
+ /*
+ * There is no need to worry about double rounding in directed
+ * rounding modes.
+ */
+ fesetround(oround);
+ /* work around clang bug 8100 */
+ volatile long double vrlo = r.lo;
+ adj = vrlo + xy.lo;
+ return (ldexpl(r.hi + adj, spread));
+ }
+
+ adj = add_adjusted(r.lo, xy.lo);
+ if (spread + ilogbl(r.hi) > -16383)
+ return (ldexpl(r.hi + adj, spread));
+ else
+ return (add_and_denormalize(r.hi, adj, spread));
+}
diff --git a/newlib/libm/ld/s_fmaxl.c b/newlib/libm/ld/s_fmaxl.c
new file mode 100644
index 000000000..c0d7c8832
--- /dev/null
+++ b/newlib/libm/ld/s_fmaxl.c
@@ -0,0 +1,57 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <math.h>
+
+#include "fpmath.h"
+
+long double
+fmaxl(long double x, long double y)
+{
+ union IEEEl2bits u[2];
+
+ u[0].e = x;
+ mask_nbit_l(u[0]);
+ u[1].e = y;
+ mask_nbit_l(u[1]);
+
+ /* Check for NaNs to avoid raising spurious exceptions. */
+ if (u[0].bits.exp == 32767 && (u[0].bits.manh | u[0].bits.manl) != 0)
+ return (y);
+ if (u[1].bits.exp == 32767 && (u[1].bits.manh | u[1].bits.manl) != 0)
+ return (x);
+
+ /* Handle comparisons of signed zeroes. */
+ if (u[0].bits.sign != u[1].bits.sign)
+ return (u[0].bits.sign ? y : x);
+
+ return (x > y ? x : y);
+}
diff --git a/newlib/libm/ld/s_fminl.c b/newlib/libm/ld/s_fminl.c
new file mode 100644
index 000000000..97604b38b
--- /dev/null
+++ b/newlib/libm/ld/s_fminl.c
@@ -0,0 +1,57 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <math.h>
+
+#include "fpmath.h"
+
+long double
+fminl(long double x, long double y)
+{
+ union IEEEl2bits u[2];
+
+ u[0].e = x;
+ mask_nbit_l(u[0]);
+ u[1].e = y;
+ mask_nbit_l(u[1]);
+
+ /* Check for NaNs to avoid raising spurious exceptions. */
+ if (u[0].bits.exp == 32767 && (u[0].bits.manh | u[0].bits.manl) != 0)
+ return (y);
+ if (u[1].bits.exp == 32767 && (u[1].bits.manh | u[1].bits.manl) != 0)
+ return (x);
+
+ /* Handle comparisons of signed zeroes. */
+ if (u[0].bits.sign != u[1].bits.sign)
+ return (u[1].bits.sign ? y : x);
+
+ return (x < y ? x : y);
+}
diff --git a/newlib/libm/ld/s_frexpl.c b/newlib/libm/ld/s_frexpl.c
new file mode 100644
index 000000000..66e284fdd
--- /dev/null
+++ b/newlib/libm/ld/s_frexpl.c
@@ -0,0 +1,64 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2004-2005 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <float.h>
+#include <math.h>
+
+#include "fpmath.h"
+
+#if LDBL_MAX_EXP != 0x4000
+#error "Unsupported long double format"
+#endif
+
+long double
+frexpl(long double x, int *ex)
+{
+ union IEEEl2bits u;
+
+ u.e = x;
+ switch (u.bits.exp) {
+ case 0: /* 0 or subnormal */
+ if ((u.bits.manl | u.bits.manh) == 0) {
+ *ex = 0;
+ } else {
+ u.e *= 0x1.0p514;
+ *ex = u.bits.exp - 0x4200;
+ u.bits.exp = 0x3ffe;
+ }
+ break;
+ case 0x7fff: /* infinity or NaN; value of *ex is unspecified */
+ break;
+ default: /* normal */
+ *ex = u.bits.exp - 0x3ffe;
+ u.bits.exp = 0x3ffe;
+ break;
+ }
+ return (u.e);
+}
diff --git a/newlib/libm/ld/s_ilogbl.c b/newlib/libm/ld/s_ilogbl.c
new file mode 100644
index 000000000..3211f4409
--- /dev/null
+++ b/newlib/libm/ld/s_ilogbl.c
@@ -0,0 +1,53 @@
+/*
+ * From: @(#)s_ilogb.c 5.1 93/09/24
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <float.h>
+#include <limits.h>
+#include <math.h>
+
+#include "fpmath.h"
+
+int
+ilogbl(long double x)
+{
+ union IEEEl2bits u;
+ unsigned long m;
+ int b;
+
+ u.e = x;
+ if (u.bits.exp == 0) {
+ if ((u.bits.manl | u.bits.manh) == 0)
+ return (FP_ILOGB0);
+ /* denormalized */
+ if (u.bits.manh == 0) {
+ m = 1lu << (LDBL_MANL_SIZE - 1);
+ for (b = LDBL_MANH_SIZE; !(u.bits.manl & m); m >>= 1)
+ b++;
+ } else {
+ m = 1lu << (LDBL_MANH_SIZE - 1);
+ for (b = 0; !(u.bits.manh & m); m >>= 1)
+ b++;
+ }
+#ifdef LDBL_IMPLICIT_NBIT
+ b++;
+#endif
+ return (LDBL_MIN_EXP - b - 1);
+ } else if (u.bits.exp < (LDBL_MAX_EXP << 1) - 1)
+ return (u.bits.exp - LDBL_MAX_EXP + 1);
+ else if (u.bits.manl != 0 || u.bits.manh != 0)
+ return (FP_ILOGBNAN);
+ else
+ return (INT_MAX);
+}
diff --git a/newlib/libm/ld/s_llrintl.c b/newlib/libm/ld/s_llrintl.c
new file mode 100644
index 000000000..6ef83759c
--- /dev/null
+++ b/newlib/libm/ld/s_llrintl.c
@@ -0,0 +1,9 @@
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#define type long double
+#define roundit rintl
+#define dtype long long
+#define fn llrintl
+
+#include "s_lrint.c"
diff --git a/newlib/libm/ld/s_llroundl.c b/newlib/libm/ld/s_llroundl.c
new file mode 100644
index 000000000..02c44eb4b
--- /dev/null
+++ b/newlib/libm/ld/s_llroundl.c
@@ -0,0 +1,11 @@
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#define type long double
+#define roundit roundl
+#define dtype long long
+#define DTYPE_MIN LLONG_MIN
+#define DTYPE_MAX LLONG_MAX
+#define fn llroundl
+
+#include "s_lround.c"
diff --git a/newlib/libm/ld/s_logbl.c b/newlib/libm/ld/s_logbl.c
new file mode 100644
index 000000000..ee1a91fd8
--- /dev/null
+++ b/newlib/libm/ld/s_logbl.c
@@ -0,0 +1,54 @@
+/*
+ * From: @(#)s_ilogb.c 5.1 93/09/24
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <float.h>
+#include <limits.h>
+#include <math.h>
+
+#include "fpmath.h"
+
+long double
+logbl(long double x)
+{
+ union IEEEl2bits u;
+ unsigned long m;
+ int b;
+
+ u.e = x;
+ if (u.bits.exp == 0) {
+ if ((u.bits.manl | u.bits.manh) == 0) { /* x == 0 */
+ u.bits.sign = 1;
+ return (1.0L / u.e);
+ }
+ /* denormalized */
+ if (u.bits.manh == 0) {
+ m = 1lu << (LDBL_MANL_SIZE - 1);
+ for (b = LDBL_MANH_SIZE; !(u.bits.manl & m); m >>= 1)
+ b++;
+ } else {
+ m = 1lu << (LDBL_MANH_SIZE - 1);
+ for (b = 0; !(u.bits.manh & m); m >>= 1)
+ b++;
+ }
+#ifdef LDBL_IMPLICIT_NBIT
+ b++;
+#endif
+ return ((long double)(LDBL_MIN_EXP - b - 1));
+ }
+ if (u.bits.exp < (LDBL_MAX_EXP << 1) - 1) /* normal */
+ return ((long double)(u.bits.exp - LDBL_MAX_EXP + 1));
+ else /* +/- inf or nan */
+ return (x * x);
+}
diff --git a/newlib/libm/ld/s_lrint.c b/newlib/libm/ld/s_lrint.c
new file mode 100644
index 000000000..ad9b978fa
--- /dev/null
+++ b/newlib/libm/ld/s_lrint.c
@@ -0,0 +1,60 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2005 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#include <fenv.h>
+#include <math.h>
+
+#ifndef type
+__FBSDID("$FreeBSD$");
+#define type double
+#define roundit rint
+#define dtype long
+#define fn lrint
+#endif
+
+/*
+ * C99 says we should not raise a spurious inexact exception when an
+ * invalid exception is raised. Unfortunately, the set of inputs
+ * that overflows depends on the rounding mode when 'dtype' has more
+ * significant bits than 'type'. Hence, we bend over backwards for the
+ * sake of correctness; an MD implementation could be more efficient.
+ */
+dtype
+fn(type x)
+{
+ fenv_t env;
+ dtype d;
+
+ feholdexcept(&env);
+ d = (dtype)roundit(x);
+ if (fetestexcept(FE_INVALID))
+ feclearexcept(FE_INEXACT);
+ feupdateenv(&env);
+ return (d);
+}
diff --git a/newlib/libm/ld/s_lrintl.c b/newlib/libm/ld/s_lrintl.c
new file mode 100644
index 000000000..497b442f3
--- /dev/null
+++ b/newlib/libm/ld/s_lrintl.c
@@ -0,0 +1,9 @@
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#define type long double
+#define roundit rintl
+#define dtype long
+#define fn lrintl
+
+#include "s_lrint.c"
diff --git a/newlib/libm/ld/s_lround.c b/newlib/libm/ld/s_lround.c
new file mode 100644
index 000000000..1dd8e697f
--- /dev/null
+++ b/newlib/libm/ld/s_lround.c
@@ -0,0 +1,70 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2005 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#include <sys/limits.h>
+#include <fenv.h>
+#include <math.h>
+
+#ifndef type
+__FBSDID("$FreeBSD$");
+#define type double
+#define roundit round
+#define dtype long
+#define DTYPE_MIN LONG_MIN
+#define DTYPE_MAX LONG_MAX
+#define fn lround
+#endif
+
+/*
+ * If type has more precision than dtype, the endpoints dtype_(min|max) are
+ * of the form xxx.5; they are "out of range" because lround() rounds away
+ * from 0. On the other hand, if type has less precision than dtype, then
+ * all values that are out of range are integral, so we might as well assume
+ * that everything is in range. At compile time, INRANGE(x) should reduce to
+ * two floating-point comparisons in the former case, or TRUE otherwise.
+ */
+static const type type_min = (type)DTYPE_MIN;
+static const type type_max = (type)DTYPE_MAX;
+static const type dtype_min = (type)DTYPE_MIN - 0.5;
+static const type dtype_max = (type)DTYPE_MAX + 0.5;
+#define INRANGE(x) (dtype_max - type_max != 0.5 || \
+ ((x) > dtype_min && (x) < dtype_max))
+
+dtype
+fn(type x)
+{
+
+ if (INRANGE(x)) {
+ x = roundit(x);
+ return ((dtype)x);
+ } else {
+ feraiseexcept(FE_INVALID);
+ return (DTYPE_MAX);
+ }
+}
diff --git a/newlib/libm/ld/s_lroundl.c b/newlib/libm/ld/s_lroundl.c
new file mode 100644
index 000000000..e410827e2
--- /dev/null
+++ b/newlib/libm/ld/s_lroundl.c
@@ -0,0 +1,11 @@
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#define type long double
+#define roundit roundl
+#define dtype long
+#define DTYPE_MIN LONG_MIN
+#define DTYPE_MAX LONG_MAX
+#define fn lroundl
+
+#include "s_lround.c"
diff --git a/newlib/libm/ld/s_modfl.c b/newlib/libm/ld/s_modfl.c
new file mode 100644
index 000000000..2d83bbe33
--- /dev/null
+++ b/newlib/libm/ld/s_modfl.c
@@ -0,0 +1,103 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2007 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * Derived from s_modf.c, which has the following Copyright:
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ *
+ * $FreeBSD$
+ */
+
+#include <float.h>
+#include <math.h>
+#include <sys/types.h>
+
+#include "fpmath.h"
+
+#if LDBL_MANL_SIZE > 32
+#define MASK ((uint64_t)-1)
+#else
+#define MASK ((uint32_t)-1)
+#endif
+/* Return the last n bits of a word, representing the fractional part. */
+#define GETFRAC(bits, n) ((bits) & ~(MASK << (n)))
+/* The number of fraction bits in manh, not counting the integer bit */
+#define HIBITS (LDBL_MANT_DIG - LDBL_MANL_SIZE)
+
+static const long double zero[] = { 0.0L, -0.0L };
+
+long double
+modfl(long double x, long double *iptr)
+{
+ union IEEEl2bits ux;
+ int e;
+
+ ux.e = x;
+ e = ux.bits.exp - LDBL_MAX_EXP + 1;
+ if (e < HIBITS) { /* Integer part is in manh. */
+ if (e < 0) { /* |x|<1 */
+ *iptr = zero[ux.bits.sign];
+ return (x);
+ } else {
+ if ((GETFRAC(ux.bits.manh, HIBITS - 1 - e) |
+ ux.bits.manl) == 0) { /* X is an integer. */
+ *iptr = x;
+ return (zero[ux.bits.sign]);
+ } else {
+ /* Clear all but the top e+1 bits. */
+ ux.bits.manh >>= HIBITS - 1 - e;
+ ux.bits.manh <<= HIBITS - 1 - e;
+ ux.bits.manl = 0;
+ *iptr = ux.e;
+ return (x - ux.e);
+ }
+ }
+ } else if (e >= LDBL_MANT_DIG - 1) { /* x has no fraction part. */
+ *iptr = x;
+ if (x != x) /* Handle NaNs. */
+ return (x);
+ return (zero[ux.bits.sign]);
+ } else { /* Fraction part is in manl. */
+ if (GETFRAC(ux.bits.manl, LDBL_MANT_DIG - 1 - e) == 0) {
+ /* x is integral. */
+ *iptr = x;
+ return (zero[ux.bits.sign]);
+ } else {
+ /* Clear all but the top e+1 bits. */
+ ux.bits.manl >>= LDBL_MANT_DIG - 1 - e;
+ ux.bits.manl <<= LDBL_MANT_DIG - 1 - e;
+ *iptr = ux.e;
+ return (x - ux.e);
+ }
+ }
+}
diff --git a/newlib/libm/ld/s_nearbyint.c b/newlib/libm/ld/s_nearbyint.c
new file mode 100644
index 000000000..796dbaf98
--- /dev/null
+++ b/newlib/libm/ld/s_nearbyint.c
@@ -0,0 +1,61 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <fenv.h>
+#include <math.h>
+
+/*
+ * We save and restore the floating-point environment to avoid raising
+ * an inexact exception. We can get away with using fesetenv()
+ * instead of feclearexcept()/feupdateenv() to restore the environment
+ * because the only exception defined for rint() is overflow, and
+ * rounding can't overflow as long as emax >= p.
+ *
+ * The volatile keyword is needed below because clang incorrectly assumes
+ * that rint won't raise any floating-point exceptions. Declaring ret volatile
+ * is sufficient to trick the compiler into doing the right thing.
+ */
+#define DECL(type, fn, rint) \
+type \
+fn(type x) \
+{ \
+ volatile type ret; \
+ fenv_t env; \
+ \
+ fegetenv(&env); \
+ ret = rint(x); \
+ fesetenv(&env); \
+ return (ret); \
+}
+
+DECL(double, nearbyint, rint)
+DECL(float, nearbyintf, rintf)
+DECL(long double, nearbyintl, rintl)
diff --git a/newlib/libm/ld/s_nextafterl.c b/newlib/libm/ld/s_nextafterl.c
new file mode 100644
index 000000000..9c61a436a
--- /dev/null
+++ b/newlib/libm/ld/s_nextafterl.c
@@ -0,0 +1,80 @@
+/* @(#)s_nextafter.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/* IEEE functions
+ * nextafter(x,y)
+ * return the next machine floating-point number of x in the
+ * direction toward y.
+ * Special cases:
+ */
+
+#include <float.h>
+
+#include "fpmath.h"
+#include "math.h"
+#include "math_private.h"
+
+#if LDBL_MAX_EXP != 0x4000
+#error "Unsupported long double format"
+#endif
+
+long double
+nextafterl(long double x, long double y)
+{
+ volatile long double t;
+ union IEEEl2bits ux, uy;
+
+ ux.e = x;
+ uy.e = y;
+
+ if ((ux.bits.exp == 0x7fff &&
+ ((ux.bits.manh&~LDBL_NBIT)|ux.bits.manl) != 0) ||
+ (uy.bits.exp == 0x7fff &&
+ ((uy.bits.manh&~LDBL_NBIT)|uy.bits.manl) != 0))
+ return x+y; /* x or y is nan */
+ if(x==y) return y; /* x=y, return y */
+ if(x==0.0) {
+ ux.bits.manh = 0; /* return +-minsubnormal */
+ ux.bits.manl = 1;
+ ux.bits.sign = uy.bits.sign;
+ t = ux.e*ux.e;
+ if(t==ux.e) return t; else return ux.e; /* raise underflow flag */
+ }
+ if(x>0.0 ^ x<y) { /* x -= ulp */
+ if(ux.bits.manl==0) {
+ if ((ux.bits.manh&~LDBL_NBIT)==0)
+ ux.bits.exp -= 1;
+ ux.bits.manh = (ux.bits.manh - 1) | (ux.bits.manh & LDBL_NBIT);
+ }
+ ux.bits.manl -= 1;
+ } else { /* x += ulp */
+ ux.bits.manl += 1;
+ if(ux.bits.manl==0) {
+ ux.bits.manh = (ux.bits.manh + 1) | (ux.bits.manh & LDBL_NBIT);
+ if ((ux.bits.manh&~LDBL_NBIT)==0)
+ ux.bits.exp += 1;
+ }
+ }
+ if(ux.bits.exp==0x7fff) return x+x; /* overflow */
+ if(ux.bits.exp==0) { /* underflow */
+ mask_nbit_l(ux);
+ t = ux.e * ux.e;
+ if(t!=ux.e) /* raise underflow flag */
+ return ux.e;
+ }
+ return ux.e;
+}
+
+__strong_reference(nextafterl, nexttowardl);
diff --git a/newlib/libm/ld/s_nexttoward.c b/newlib/libm/ld/s_nexttoward.c
new file mode 100644
index 000000000..b2a50d313
--- /dev/null
+++ b/newlib/libm/ld/s_nexttoward.c
@@ -0,0 +1,72 @@
+/* @(#)s_nextafter.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * We assume that a long double has a 15-bit exponent. On systems
+ * where long double is the same as double, nexttoward() is an alias
+ * for nextafter(), so we don't use this routine.
+ */
+
+#include <float.h>
+
+#include "fpmath.h"
+#include "math.h"
+#include "math_private.h"
+
+#if LDBL_MAX_EXP != 0x4000
+#error "Unsupported long double format"
+#endif
+
+double
+nexttoward(double x, long double y)
+{
+ union IEEEl2bits uy;
+ volatile double t;
+ int32_t hx,ix;
+ u_int32_t lx;
+
+ EXTRACT_WORDS(hx,lx,x);
+ ix = hx&0x7fffffff; /* |x| */
+ uy.e = y;
+
+ if(((ix>=0x7ff00000)&&((ix-0x7ff00000)|lx)!=0) ||
+ (uy.bits.exp == 0x7fff &&
+ ((uy.bits.manh&~LDBL_NBIT)|uy.bits.manl) != 0))
+ return x+y; /* x or y is nan */
+ if(x==y) return (double)y; /* x=y, return y */
+ if(x==0.0) {
+ INSERT_WORDS(x,uy.bits.sign<<31,1); /* return +-minsubnormal */
+ t = x*x;
+ if(t==x) return t; else return x; /* raise underflow flag */
+ }
+ if(hx>0.0 ^ x < y) { /* x -= ulp */
+ if(lx==0) hx -= 1;
+ lx -= 1;
+ } else { /* x += ulp */
+ lx += 1;
+ if(lx==0) hx += 1;
+ }
+ ix = hx&0x7ff00000;
+ if(ix>=0x7ff00000) return x+x; /* overflow */
+ if(ix<0x00100000) { /* underflow */
+ t = x*x;
+ if(t!=x) { /* raise underflow flag */
+ INSERT_WORDS(x,hx,lx);
+ return x;
+ }
+ }
+ INSERT_WORDS(x,hx,lx);
+ return x;
+}
diff --git a/newlib/libm/ld/s_nexttowardf.c b/newlib/libm/ld/s_nexttowardf.c
new file mode 100644
index 000000000..9ddfff961
--- /dev/null
+++ b/newlib/libm/ld/s_nexttowardf.c
@@ -0,0 +1,59 @@
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <float.h>
+
+#include "fpmath.h"
+#include "math.h"
+#include "math_private.h"
+
+#define LDBL_INFNAN_EXP (LDBL_MAX_EXP * 2 - 1)
+
+float
+nexttowardf(float x, long double y)
+{
+ union IEEEl2bits uy;
+ volatile float t;
+ int32_t hx,ix;
+
+ GET_FLOAT_WORD(hx,x);
+ ix = hx&0x7fffffff; /* |x| */
+ uy.e = y;
+
+ if((ix>0x7f800000) ||
+ (uy.bits.exp == LDBL_INFNAN_EXP &&
+ ((uy.bits.manh&~LDBL_NBIT)|uy.bits.manl) != 0))
+ return x+y; /* x or y is nan */
+ if(x==y) return (float)y; /* x=y, return y */
+ if(ix==0) { /* x == 0 */
+ SET_FLOAT_WORD(x,(uy.bits.sign<<31)|1);/* return +-minsubnormal */
+ t = x*x;
+ if(t==x) return t; else return x; /* raise underflow flag */
+ }
+ if(hx>=0 ^ x < y) /* x -= ulp */
+ hx -= 1;
+ else /* x += ulp */
+ hx += 1;
+ ix = hx&0x7f800000;
+ if(ix>=0x7f800000) return x+x; /* overflow */
+ if(ix<0x00800000) { /* underflow */
+ t = x*x;
+ if(t!=x) { /* raise underflow flag */
+ SET_FLOAT_WORD(x,hx);
+ return x;
+ }
+ }
+ SET_FLOAT_WORD(x,hx);
+ return x;
+}
diff --git a/newlib/libm/ld/s_remquol.c b/newlib/libm/ld/s_remquol.c
new file mode 100644
index 000000000..a9f5813d0
--- /dev/null
+++ b/newlib/libm/ld/s_remquol.c
@@ -0,0 +1,173 @@
+/* @(#)e_fmod.c 1.3 95/01/18 */
+/*-
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <float.h>
+#include <stdint.h>
+
+#include "fpmath.h"
+#include "math.h"
+#include "math_private.h"
+
+#define BIAS (LDBL_MAX_EXP - 1)
+
+#if LDBL_MANL_SIZE > 32
+typedef uint64_t manl_t;
+#else
+typedef uint32_t manl_t;
+#endif
+
+#if LDBL_MANH_SIZE > 32
+typedef uint64_t manh_t;
+#else
+typedef uint32_t manh_t;
+#endif
+
+/*
+ * These macros add and remove an explicit integer bit in front of the
+ * fractional mantissa, if the architecture doesn't have such a bit by
+ * default already.
+ */
+#ifdef LDBL_IMPLICIT_NBIT
+#define SET_NBIT(hx) ((hx) | (1ULL << LDBL_MANH_SIZE))
+#define HFRAC_BITS LDBL_MANH_SIZE
+#else
+#define SET_NBIT(hx) (hx)
+#define HFRAC_BITS (LDBL_MANH_SIZE - 1)
+#endif
+
+#define MANL_SHIFT (LDBL_MANL_SIZE - 1)
+
+static const long double Zero[] = {0.0L, -0.0L};
+
+/*
+ * Return the IEEE remainder and set *quo to the last n bits of the
+ * quotient, rounded to the nearest integer. We choose n=31 because
+ * we wind up computing all the integer bits of the quotient anyway as
+ * a side-effect of computing the remainder by the shift and subtract
+ * method. In practice, this is far more bits than are needed to use
+ * remquo in reduction algorithms.
+ *
+ * Assumptions:
+ * - The low part of the mantissa fits in a manl_t exactly.
+ * - The high part of the mantissa fits in an int64_t with enough room
+ * for an explicit integer bit in front of the fractional bits.
+ */
+long double
+remquol(long double x, long double y, int *quo)
+{
+ union IEEEl2bits ux, uy;
+ int64_t hx,hz; /* We need a carry bit even if LDBL_MANH_SIZE is 32. */
+ manh_t hy;
+ manl_t lx,ly,lz;
+ int ix,iy,n,q,sx,sxy;
+
+ ux.e = x;
+ uy.e = y;
+ sx = ux.bits.sign;
+ sxy = sx ^ uy.bits.sign;
+ ux.bits.sign = 0; /* |x| */
+ uy.bits.sign = 0; /* |y| */
+
+ /* purge off exception values */
+ if((uy.bits.exp|uy.bits.manh|uy.bits.manl)==0 || /* y=0 */
+ (ux.bits.exp == BIAS + LDBL_MAX_EXP) || /* or x not finite */
+ (uy.bits.exp == BIAS + LDBL_MAX_EXP &&
+ ((uy.bits.manh&~LDBL_NBIT)|uy.bits.manl)!=0)) /* or y is NaN */
+ return nan_mix_op(x, y, *)/nan_mix_op(x, y, *);
+ if(ux.bits.exp<=uy.bits.exp) {
+ if((ux.bits.exp<uy.bits.exp) ||
+ (ux.bits.manh<=uy.bits.manh &&
+ (ux.bits.manh<uy.bits.manh ||
+ ux.bits.manl<uy.bits.manl))) {
+ q = 0;
+ goto fixup; /* |x|<|y| return x or x-y */
+ }
+ if(ux.bits.manh==uy.bits.manh && ux.bits.manl==uy.bits.manl) {
+ *quo = (sxy ? -1 : 1);
+ return Zero[sx]; /* |x|=|y| return x*0*/
+ }
+ }
+
+ /* determine ix = ilogb(x) */
+ if(ux.bits.exp == 0) { /* subnormal x */
+ ux.e *= 0x1.0p512;
+ ix = ux.bits.exp - (BIAS + 512);
+ } else {
+ ix = ux.bits.exp - BIAS;
+ }
+
+ /* determine iy = ilogb(y) */
+ if(uy.bits.exp == 0) { /* subnormal y */
+ uy.e *= 0x1.0p512;
+ iy = uy.bits.exp - (BIAS + 512);
+ } else {
+ iy = uy.bits.exp - BIAS;
+ }
+
+ /* set up {hx,lx}, {hy,ly} and align y to x */
+ hx = SET_NBIT(ux.bits.manh);
+ hy = SET_NBIT(uy.bits.manh);
+ lx = ux.bits.manl;
+ ly = uy.bits.manl;
+
+ /* fix point fmod */
+ n = ix - iy;
+ q = 0;
+ while(n--) {
+ hz=hx-hy;lz=lx-ly; if(lx<ly) hz -= 1;
+ if(hz<0){hx = hx+hx+(lx>>MANL_SHIFT); lx = lx+lx;}
+ else {hx = hz+hz+(lz>>MANL_SHIFT); lx = lz+lz; q++;}
+ q <<= 1;
+ }
+ hz=hx-hy;lz=lx-ly; if(lx<ly) hz -= 1;
+ if(hz>=0) {hx=hz;lx=lz;q++;}
+
+ /* convert back to floating value and restore the sign */
+ if((hx|lx)==0) { /* return sign(x)*0 */
+ q &= 0x7fffffff;
+ *quo = (sxy ? -q : q);
+ return Zero[sx];
+ }
+ while(hx<(1ULL<<HFRAC_BITS)) { /* normalize x */
+ hx = hx+hx+(lx>>MANL_SHIFT); lx = lx+lx;
+ iy -= 1;
+ }
+ ux.bits.manh = hx; /* The integer bit is truncated here if needed. */
+ ux.bits.manl = lx;
+ if (iy < LDBL_MIN_EXP) {
+ ux.bits.exp = iy + (BIAS + 512);
+ ux.e *= 0x1p-512;
+ } else {
+ ux.bits.exp = iy + BIAS;
+ }
+fixup:
+ x = ux.e; /* |x| */
+ y = fabsl(y);
+ if (y < LDBL_MIN * 2) {
+ if (x+x>y || (x+x==y && (q & 1))) {
+ q++;
+ x-=y;
+ }
+ } else if (x>0.5*y || (x==0.5*y && (q & 1))) {
+ q++;
+ x-=y;
+ }
+ ux.e = x;
+ ux.bits.sign ^= sx;
+ x = ux.e;
+ q &= 0x7fffffff;
+ *quo = (sxy ? -q : q);
+ return x;
+}
diff --git a/newlib/libm/ld/s_rintl.c b/newlib/libm/ld/s_rintl.c
new file mode 100644
index 000000000..1e9824d83
--- /dev/null
+++ b/newlib/libm/ld/s_rintl.c
@@ -0,0 +1,92 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2008 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <float.h>
+#include <math.h>
+
+#include "fpmath.h"
+
+#if LDBL_MAX_EXP != 0x4000
+/* We also require the usual bias, min exp and expsign packing. */
+#error "Unsupported long double format"
+#endif
+
+#define BIAS (LDBL_MAX_EXP - 1)
+
+static const float
+shift[2] = {
+#if LDBL_MANT_DIG == 64
+ 0x1.0p63, -0x1.0p63
+#elif LDBL_MANT_DIG == 113
+ 0x1.0p112, -0x1.0p112
+#else
+#error "Unsupported long double format"
+#endif
+};
+static const float zero[2] = { 0.0, -0.0 };
+
+long double
+rintl(long double x)
+{
+ union IEEEl2bits u;
+ uint32_t expsign;
+ int ex, sign;
+
+ u.e = x;
+ expsign = u.xbits.expsign;
+ ex = expsign & 0x7fff;
+
+ if (ex >= BIAS + LDBL_MANT_DIG - 1) {
+ if (ex == BIAS + LDBL_MAX_EXP)
+ return (x + x); /* Inf, NaN, or unsupported format */
+ return (x); /* finite and already an integer */
+ }
+ sign = expsign >> 15;
+
+ /*
+ * The following code assumes that intermediate results are
+ * evaluated in long double precision. If they are evaluated in
+ * greater precision, double rounding may occur, and if they are
+ * evaluated in less precision (as on i386), results will be
+ * wildly incorrect.
+ */
+ x += shift[sign];
+ x -= shift[sign];
+
+ /*
+ * If the result is +-0, then it must have the same sign as x, but
+ * the above calculation doesn't always give this. Fix up the sign.
+ */
+ if (ex < BIAS && x == 0.0L)
+ return (zero[sign]);
+
+ return (x);
+}
diff --git a/newlib/libm/ld/s_roundl.c b/newlib/libm/ld/s_roundl.c
new file mode 100644
index 000000000..8d1c02a7f
--- /dev/null
+++ b/newlib/libm/ld/s_roundl.c
@@ -0,0 +1,64 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2003, Steven G. Kargl
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice unmodified, this list of conditions, and the following
+ * disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <float.h>
+#ifdef __i386__
+#include <ieeefp.h>
+#endif
+
+#include "fpmath.h"
+#include "math.h"
+#include "math_private.h"
+
+long double
+roundl(long double x)
+{
+ long double t;
+ uint16_t hx;
+
+ GET_LDBL_EXPSIGN(hx, x);
+ if ((hx & 0x7fff) == 0x7fff)
+ return (x + x);
+
+ ENTERI();
+
+ if (!(hx & 0x8000)) {
+ t = floorl(x);
+ if (t - x <= -0.5L)
+ t += 1;
+ RETURNI(t);
+ } else {
+ t = floorl(-x);
+ if (t + x <= -0.5L)
+ t += 1;
+ RETURNI(-t);
+ }
+}
diff --git a/newlib/libm/ld/s_scalbln.c b/newlib/libm/ld/s_scalbln.c
new file mode 100644
index 000000000..c27420c92
--- /dev/null
+++ b/newlib/libm/ld/s_scalbln.c
@@ -0,0 +1,56 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <math.h>
+
+#define NMAX 65536
+#define NMIN -65536
+
+double
+scalbln(double x, long n)
+{
+
+ return (scalbn(x, (n > NMAX) ? NMAX : (n < NMIN) ? NMIN : (int)n));
+}
+
+float
+scalblnf(float x, long n)
+{
+
+ return (scalbnf(x, (n > NMAX) ? NMAX : (n < NMIN) ? NMIN : (int)n));
+}
+
+long double
+scalblnl(long double x, long n)
+{
+
+ return (scalbnl(x, (n > NMAX) ? NMAX : (n < NMIN) ? NMIN : (int)n));
+}
diff --git a/newlib/libm/ld/s_scalbnl.c b/newlib/libm/ld/s_scalbnl.c
new file mode 100644
index 000000000..6044c1b1d
--- /dev/null
+++ b/newlib/libm/ld/s_scalbnl.c
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2005-2020 Rich Felker, et al.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Please see https://git.musl-libc.org/cgit/musl/tree/COPYRIGHT
+ * for all contributors to musl.
+ */
+#include <math.h>
+#include <float.h>
+#include "math_private.h"
+#include "fpmath.h"
+/*
+ * scalbnl (long double x, int n)
+ * scalbnl(x,n) returns x* 2**n computed by exponent
+ * manipulation rather than by actually performing an
+ * exponentiation or a multiplication.
+ */
+#if (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
+long double scalbnl(long double x, int n)
+{
+ union IEEEl2bits u;
+
+ if (n > 16383) {
+ x *= 0x1p16383L;
+ n -= 16383;
+ if (n > 16383) {
+ x *= 0x1p16383L;
+ n -= 16383;
+ if (n > 16383)
+ n = 16383;
+ }
+ } else if (n < -16382) {
+ x *= 0x1p-16382L * 0x1p113L;
+ n += 16382 - 113;
+ if (n < -16382) {
+ x *= 0x1p-16382L * 0x1p113L;
+ n += 16382 - 113;
+ if (n < -16382)
+ n = -16382;
+ }
+ }
+ u.e = 1.0;
+ u.xbits.expsign = 0x3fff + n;
+ return x * u.e;
+}
+__strong_reference(scalbnl, ldexpl);
+#endif
+
diff --git a/newlib/libm/ld/s_sinl.c b/newlib/libm/ld/s_sinl.c
new file mode 100644
index 000000000..f1ef84c8c
--- /dev/null
+++ b/newlib/libm/ld/s_sinl.c
@@ -0,0 +1,95 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2007 Steven G. Kargl
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice unmodified, this list of conditions, and the following
+ * disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <float.h>
+#ifdef __i386__
+#include <ieeefp.h>
+#endif
+
+#include "math.h"
+#include "math_private.h"
+#if LDBL_MANT_DIG == 64
+#include "../ld80/e_rem_pio2l.h"
+#elif LDBL_MANT_DIG == 113
+#include "../ld128/e_rem_pio2l.h"
+#else
+#error "Unsupported long double format"
+#endif
+
+long double
+sinl(long double x)
+{
+ union IEEEl2bits z;
+ int e0, s;
+ long double y[2];
+ long double hi, lo;
+
+ z.e = x;
+ s = z.bits.sign;
+ z.bits.sign = 0;
+
+ /* If x = +-0 or x is a subnormal number, then sin(x) = x */
+ if (z.bits.exp == 0)
+ return (x);
+
+ /* If x = NaN or Inf, then sin(x) = NaN. */
+ if (z.bits.exp == 32767)
+ return ((x - x) / (x - x));
+
+ ENTERI();
+
+ /* Optimize the case where x is already within range. */
+ if (z.e < M_PI_4) {
+ hi = __kernel_sinl(z.e, 0, 0);
+ RETURNI(s ? -hi : hi);
+ }
+
+ e0 = __ieee754_rem_pio2l(x, y);
+ hi = y[0];
+ lo = y[1];
+
+ switch (e0 & 3) {
+ case 0:
+ hi = __kernel_sinl(hi, lo, 1);
+ break;
+ case 1:
+ hi = __kernel_cosl(hi, lo);
+ break;
+ case 2:
+ hi = - __kernel_sinl(hi, lo, 1);
+ break;
+ case 3:
+ hi = - __kernel_cosl(hi, lo);
+ break;
+ }
+
+ RETURNI(hi);
+}
diff --git a/newlib/libm/ld/s_tanhl.c b/newlib/libm/ld/s_tanhl.c
new file mode 100644
index 000000000..b7531866d
--- /dev/null
+++ b/newlib/libm/ld/s_tanhl.c
@@ -0,0 +1,174 @@
+/* from: FreeBSD: head/lib/msun/src/s_tanhl.c XXX */
+
+/* @(#)s_tanh.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * See s_tanh.c for complete comments.
+ *
+ * Converted to long double by Bruce D. Evans.
+ */
+
+#include <float.h>
+#ifdef __i386__
+#include <ieeefp.h>
+#endif
+
+#include "math.h"
+#include "math_private.h"
+#include "fpmath.h"
+#include "k_expl.h"
+
+#if LDBL_MAX_EXP != 0x4000
+/* We also require the usual expsign encoding. */
+#error "Unsupported long double format"
+#endif
+
+#define BIAS (LDBL_MAX_EXP - 1)
+
+static const volatile double tiny = 1.0e-300;
+static const double one = 1.0;
+#if LDBL_MANT_DIG == 64
+/*
+ * Domain [-0.25, 0.25], range ~[-1.6304e-22, 1.6304e-22]:
+ * |tanh(x)/x - t(x)| < 2**-72.3
+ */
+static const union IEEEl2bits
+T3u = LD80C(0xaaaaaaaaaaaaaa9f, -2, -3.33333333333333333017e-1L);
+#define T3 T3u.e
+static const double
+T5 = 1.3333333333333314e-1, /* 0x1111111111110a.0p-55 */
+T7 = -5.3968253968210485e-2, /* -0x1ba1ba1ba1a1a1.0p-57 */
+T9 = 2.1869488531393817e-2, /* 0x1664f488172022.0p-58 */
+T11 = -8.8632352345964591e-3, /* -0x1226e34bc138d5.0p-59 */
+T13 = 3.5921169709993771e-3, /* 0x1d6d371d3e400f.0p-61 */
+T15 = -1.4555786415756001e-3, /* -0x17d923aa63814d.0p-62 */
+T17 = 5.8645267876296793e-4, /* 0x13378589b85aa7.0p-63 */
+T19 = -2.1121033571392224e-4; /* -0x1baf0af80c4090.0p-65 */
+#elif LDBL_MANT_DIG == 113
+/*
+ * Domain [-0.25, 0.25], range ~[-2.4211e-37, 2.4211e-37]:
+ * |tanh(x)/x - t(x)| < 2**121.6
+ */
+static const long double
+T3 = -3.33333333333333333333333333333332980e-1L, /* -0x1555555555555555555555555554e.0p-114L */
+T5 = 1.33333333333333333333333333332707260e-1L, /* 0x1111111111111111111111110ab7b.0p-115L */
+T7 = -5.39682539682539682539682535723482314e-2L, /* -0x1ba1ba1ba1ba1ba1ba1ba17b5fc98.0p-117L */
+T9 = 2.18694885361552028218693591149061717e-2L, /* 0x1664f4882c10f9f32d6b1a12a25e5.0p-118L */
+T11 = -8.86323552990219656883762347736381851e-3L, /* -0x1226e355e6c23c8f5a5a0f386cb4d.0p-119L */
+T13 = 3.59212803657248101358314398220822722e-3L, /* 0x1d6d3d0e157ddfb403ad3637442c6.0p-121L */
+T15 = -1.45583438705131796512568010348874662e-3L; /* -0x17da36452b75e150c44cc34253b34.0p-122L */
+static const double
+T17 = 5.9002744094556621e-4, /* 0x1355824803668e.0p-63 */
+T19 = -2.3912911424260516e-4, /* -0x1f57d7734c8dde.0p-65 */
+T21 = 9.6915379535512898e-5, /* 0x1967e18ad6a6ca.0p-66 */
+T23 = -3.9278322983156353e-5, /* -0x1497d8e6b75729.0p-67 */
+T25 = 1.5918887220143869e-5, /* 0x10b1319998cafa.0p-68 */
+T27 = -6.4514295231630956e-6, /* -0x1b0f2b71b218eb.0p-70 */
+T29 = 2.6120754043964365e-6, /* 0x15e963a3cf3a39.0p-71 */
+T31 = -1.0407567231003314e-6, /* -0x1176041e656869.0p-72 */
+T33 = 3.4744117554063574e-7; /* 0x1750fe732cab9c.0p-74 */
+#endif /* LDBL_MANT_DIG == 64 */
+
+static inline long double
+divl(long double a, long double b, long double c, long double d,
+ long double e, long double f)
+{
+ long double inv, r;
+ float fr, fw;
+
+ _2sumF(a, c);
+ b = b + c;
+ _2sumF(d, f);
+ e = e + f;
+
+ inv = 1 / (d + e);
+
+ r = (a + b) * inv;
+ fr = r;
+ r = fr;
+
+ fw = d + e;
+ e = d - fw + e;
+ d = fw;
+
+ r = r + (a - d * r + b - e * r) * inv;
+
+ return r;
+}
+
+long double
+tanhl(long double x)
+{
+ long double hi,lo,s,x2,x4,z;
+#if LDBL_MANT_DIG == 113
+ double dx2;
+#endif
+ int16_t jx,ix;
+
+ GET_LDBL_EXPSIGN(jx,x);
+ ix = jx&0x7fff;
+
+ /* x is INF or NaN */
+ if(ix>=0x7fff) {
+ if (jx>=0) return one/x+one; /* tanh(+-inf)=+-1 */
+ else return one/x-one; /* tanh(NaN) = NaN */
+ }
+
+ ENTERI();
+
+ /* |x| < 40 */
+ if (ix < 0x4004 || fabsl(x) < 40) { /* |x|<40 */
+ if (__predict_false(ix<BIAS-(LDBL_MANT_DIG+1)/2)) { /* |x|<TINY */
+ /* tanh(+-0) = +0; tanh(tiny) = tiny(-+) with inexact: */
+ return (x == 0 ? x : (0x1p200 * x - x) * 0x1p-200);
+ }
+ if (ix<0x3ffd) { /* |x|<0.25 */
+ x2 = x*x;
+#if LDBL_MANT_DIG == 64
+ x4 = x2*x2;
+ RETURNI(((T19*x2 + T17)*x4 + (T15*x2 + T13))*(x2*x*x2*x4*x4) +
+ ((T11*x2 + T9)*x4 + (T7*x2 + T5))*(x2*x*x2) +
+ T3*(x2*x) + x);
+#elif LDBL_MANT_DIG == 113
+ dx2 = x2;
+#if 0
+ RETURNI(((((((((((((((T33*dx2 + T31)*dx2 + T29)*dx2 + T27)*dx2 +
+ T25)*x2 + T23)*x2 + T21)*x2 + T19)*x2 + T17)*x2 +
+ T15)*x2 + T13)*x2 + T11)*x2 + T9)*x2 + T7)*x2 + T5)*
+ (x2*x*x2) +
+ T3*(x2*x) + x);
+#else
+ long double q = ((((((((((((((T33*dx2 + T31)*dx2 + T29)*dx2 + T27)*dx2 +
+ T25)*x2 + T23)*x2 + T21)*x2 + T19)*x2 + T17)*x2 +
+ T15)*x2 + T13)*x2 + T11)*x2 + T9)*x2 + T7)*x2 + T5)*
+ (x2*x*x2);
+ RETURNI(q + T3*(x2*x) + x);
+#endif
+#endif
+ }
+ k_hexpl(2*fabsl(x), &hi, &lo);
+ if (ix<0x4001 && fabsl(x) < 1.5) /* |x|<1.5 */
+ z = divl(hi, lo, -0.5, hi, lo, 0.5);
+ else
+ z = one - one/(lo+0.5+hi);
+ /* |x| >= 40, return +-1 */
+ } else {
+ z = one - tiny; /* raise inexact flag */
+ }
+ s = 1;
+ if (jx<0) s = -1;
+ RETURNI(s*z);
+}
diff --git a/newlib/libm/ld/s_tanl.c b/newlib/libm/ld/s_tanl.c
new file mode 100644
index 000000000..0c5228ec8
--- /dev/null
+++ b/newlib/libm/ld/s_tanl.c
@@ -0,0 +1,97 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2007 Steven G. Kargl
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice unmodified, this list of conditions, and the following
+ * disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * Limited testing on pseudorandom numbers drawn within [0:4e8] shows
+ * an accuracy of <= 1.5 ULP where 247024 values of x out of 40 million
+ * possibles resulted in tan(x) that exceeded 0.5 ULP (ie., 0.6%).
+ */
+
+#include <float.h>
+#ifdef __i386__
+#include <ieeefp.h>
+#endif
+
+#include "math.h"
+#include "math_private.h"
+#if LDBL_MANT_DIG == 64
+#include "../ld80/e_rem_pio2l.h"
+#elif LDBL_MANT_DIG == 113
+#include "../ld128/e_rem_pio2l.h"
+#else
+#error "Unsupported long double format"
+#endif
+
+long double
+tanl(long double x)
+{
+ union IEEEl2bits z;
+ int e0, s;
+ long double y[2];
+ long double hi, lo;
+
+ z.e = x;
+ s = z.bits.sign;
+ z.bits.sign = 0;
+
+ /* If x = +-0 or x is subnormal, then tan(x) = x. */
+ if (z.bits.exp == 0)
+ return (x);
+
+ /* If x = NaN or Inf, then tan(x) = NaN. */
+ if (z.bits.exp == 32767)
+ return ((x - x) / (x - x));
+
+ ENTERI();
+
+ /* Optimize the case where x is already within range. */
+ if (z.e < M_PI_4) {
+ hi = __kernel_tanl(z.e, 0, 0);
+ RETURNI(s ? -hi : hi);
+ }
+
+ e0 = __ieee754_rem_pio2l(x, y);
+ hi = y[0];
+ lo = y[1];
+
+ switch (e0 & 3) {
+ case 0:
+ case 2:
+ hi = __kernel_tanl(hi, lo, 0);
+ break;
+ case 1:
+ case 3:
+ hi = __kernel_tanl(hi, lo, 1);
+ break;
+ }
+
+ RETURNI(hi);
+}
diff --git a/newlib/libm/ld/s_truncl.c b/newlib/libm/ld/s_truncl.c
new file mode 100644
index 000000000..9e2b51132
--- /dev/null
+++ b/newlib/libm/ld/s_truncl.c
@@ -0,0 +1,68 @@
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ *
+ * From: @(#)s_floor.c 5.1 93/09/24
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * truncl(x)
+ * Return x rounded toward 0 to integral value
+ * Method:
+ * Bit twiddling.
+ * Exception:
+ * Inexact flag raised if x not equal to truncl(x).
+ */
+
+#include <float.h>
+#include <math.h>
+#include <stdint.h>
+
+#include "fpmath.h"
+
+#ifdef LDBL_IMPLICIT_NBIT
+#define MANH_SIZE (LDBL_MANH_SIZE + 1)
+#else
+#define MANH_SIZE LDBL_MANH_SIZE
+#endif
+
+static const long double huge = 1.0e300;
+static const float zero[] = { 0.0, -0.0 };
+
+long double
+truncl(long double x)
+{
+ union IEEEl2bits u = { .e = x };
+ int e = u.bits.exp - LDBL_MAX_EXP + 1;
+
+ if (e < MANH_SIZE - 1) {
+ if (e < 0) { /* raise inexact if x != 0 */
+ if (huge + x > 0.0)
+ u.e = zero[u.bits.sign];
+ } else {
+ uint64_t m = ((1llu << MANH_SIZE) - 1) >> (e + 1);
+ if (((u.bits.manh & m) | u.bits.manl) == 0)
+ return (x); /* x is integral */
+ if (huge + x > 0.0) { /* raise inexact flag */
+ u.bits.manh &= ~m;
+ u.bits.manl = 0;
+ }
+ }
+ } else if (e < LDBL_MANT_DIG - 1) {
+ uint64_t m = (uint64_t)-1 >> (64 - LDBL_MANT_DIG + e + 1);
+ if ((u.bits.manl & m) == 0)
+ return (x); /* x is integral */
+ if (huge + x > 0.0) /* raise inexact flag */
+ u.bits.manl &= ~m;
+ }
+ return (u.e);
+}
diff --git a/newlib/libm/ld128/b_tgammal.c b/newlib/libm/ld128/b_tgammal.c
new file mode 100644
index 000000000..1c995ab6d
--- /dev/null
+++ b/newlib/libm/ld128/b_tgammal.c
@@ -0,0 +1,57 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2013 David Chisnall
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <float.h>
+#include <math.h>
+
+/*
+ * If long double is not the same size as double, then these will lose
+ * precision and we should emit a warning whenever something links against
+ * them.
+ */
+#if (LDBL_MANT_DIG > 53)
+#define WARN_IMPRECISE(x) \
+ __warn_references(x, # x " has lower than advertised precision");
+#else
+#define WARN_IMPRECISE(x)
+#endif
+/*
+ * Declare the functions as weak variants so that other libraries providing
+ * real versions can override them.
+ */
+#define DECLARE_WEAK(x)\
+ __weak_reference(imprecise_## x, x);\
+ WARN_IMPRECISE(x)
+
+#define DECLARE_IMPRECISE(f) \
+ long double imprecise_ ## f ## l(long double v) { return f(v); }\
+ DECLARE_WEAK(f ## l)
+
+DECLARE_IMPRECISE(tgamma);
diff --git a/newlib/libm/ld128/e_lgammal_r.c b/newlib/libm/ld128/e_lgammal_r.c
new file mode 100644
index 000000000..53d3af17d
--- /dev/null
+++ b/newlib/libm/ld128/e_lgammal_r.c
@@ -0,0 +1,330 @@
+/* @(#)e_lgamma_r.c 1.3 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * See e_lgamma_r.c for complete comments.
+ *
+ * Converted to long double by Steven G. Kargl.
+ */
+
+#include "fpmath.h"
+#include "math.h"
+#include "math_private.h"
+
+static const volatile double vzero = 0;
+
+static const double
+zero= 0,
+half= 0.5,
+one = 1;
+
+static const long double
+pi = 3.14159265358979323846264338327950288e+00L;
+/*
+ * Domain y in [0x1p-119, 0.28], range ~[-1.4065e-36, 1.4065e-36]:
+ * |(lgamma(2 - y) + y / 2) / y - a(y)| < 2**-119.1
+ */
+static const long double
+a0 = 7.72156649015328606065120900824024296e-02L,
+a1 = 3.22467033424113218236207583323018498e-01L,
+a2 = 6.73523010531980951332460538330282217e-02L,
+a3 = 2.05808084277845478790009252803463129e-02L,
+a4 = 7.38555102867398526627292839296001626e-03L,
+a5 = 2.89051033074152328576829509522483468e-03L,
+a6 = 1.19275391170326097618357349881842913e-03L,
+a7 = 5.09669524743042462515256340206203019e-04L,
+a8 = 2.23154758453578096143609255559576017e-04L,
+a9 = 9.94575127818397632126978731542755129e-05L,
+a10 = 4.49262367375420471287545895027098145e-05L,
+a11 = 2.05072127845117995426519671481628849e-05L,
+a12 = 9.43948816959096748454087141447939513e-06L,
+a13 = 4.37486780697359330303852050718287419e-06L,
+a14 = 2.03920783892362558276037363847651809e-06L,
+a15 = 9.55191070057967287877923073200324649e-07L,
+a16 = 4.48993286185740853170657139487620560e-07L,
+a17 = 2.13107543597620911675316728179563522e-07L,
+a18 = 9.70745379855304499867546549551023473e-08L,
+a19 = 5.61889970390290257926487734695402075e-08L,
+a20 = 6.42739653024130071866684358960960951e-09L,
+a21 = 3.34491062143649291746195612991870119e-08L,
+a22 = -1.57068547394315223934653011440641472e-08L,
+a23 = 1.30812825422415841213733487745200632e-08L;
+/*
+ * Domain x in [tc-0.24, tc+0.28], range ~[-6.3201e-37, 6.3201e-37]:
+ * |(lgamma(x) - tf) - t(x - tc)| < 2**-120.3.
+ */
+static const long double
+tc = 1.46163214496836234126265954232572133e+00L,
+tf = -1.21486290535849608095514557177691584e-01L,
+tt = 1.57061739945077675484237837992951704e-36L,
+t0 = -1.99238329499314692728655623767019240e-36L,
+t1 = -6.08453430711711404116887457663281416e-35L,
+t2 = 4.83836122723810585213722380854828904e-01L,
+t3 = -1.47587722994530702030955093950668275e-01L,
+t4 = 6.46249402389127526561003464202671923e-02L,
+t5 = -3.27885410884813055008502586863748063e-02L,
+t6 = 1.79706751152103942928638276067164935e-02L,
+t7 = -1.03142230366363872751602029672767978e-02L,
+t8 = 6.10053602051788840313573150785080958e-03L,
+t9 = -3.68456960831637325470641021892968954e-03L,
+t10 = 2.25976482322181046611440855340968560e-03L,
+t11 = -1.40225144590445082933490395950664961e-03L,
+t12 = 8.78232634717681264035014878172485575e-04L,
+t13 = -5.54194952796682301220684760591403899e-04L,
+t14 = 3.51912956837848209220421213975000298e-04L,
+t15 = -2.24653443695947456542669289367055542e-04L,
+t16 = 1.44070395420840737695611929680511823e-04L,
+t17 = -9.27609865550394140067059487518862512e-05L,
+t18 = 5.99347334438437081412945428365433073e-05L,
+t19 = -3.88458388854572825603964274134801009e-05L,
+t20 = 2.52476631610328129217896436186551043e-05L,
+t21 = -1.64508584981658692556994212457518536e-05L,
+t22 = 1.07434583475987007495523340296173839e-05L,
+t23 = -7.03070407519397260929482550448878399e-06L,
+t24 = 4.60968590693753579648385629003100469e-06L,
+t25 = -3.02765473778832036018438676945512661e-06L,
+t26 = 1.99238771545503819972741288511303401e-06L,
+t27 = -1.31281299822614084861868817951788579e-06L,
+t28 = 8.60844432267399655055574642052370223e-07L,
+t29 = -5.64535486432397413273248363550536374e-07L,
+t30 = 3.99357783676275660934903139592727737e-07L,
+t31 = -2.95849029193433121795495215869311610e-07L,
+t32 = 1.37790144435073124976696250804940384e-07L;
+/*
+ * Domain y in [-0.1, 0.232], range ~[-1.4046e-37, 1.4181e-37]:
+ * |(lgamma(1 + y) + 0.5 * y) / y - u(y) / v(y)| < 2**-122.8
+ */
+static const long double
+u0 = -7.72156649015328606065120900824024311e-02L,
+u1 = 4.24082772271938167430983113242482656e-01L,
+u2 = 2.96194003481457101058321977413332171e+00L,
+u3 = 6.49503267711258043997790983071543710e+00L,
+u4 = 7.40090051288150177152835698948644483e+00L,
+u5 = 4.94698036296756044610805900340723464e+00L,
+u6 = 2.00194224610796294762469550684947768e+00L,
+u7 = 4.82073087750608895996915051568834949e-01L,
+u8 = 6.46694052280506568192333848437585427e-02L,
+u9 = 4.17685526755100259316625348933108810e-03L,
+u10 = 9.06361003550314327144119307810053410e-05L,
+v1 = 5.15937098592887275994320496999951947e+00L,
+v2 = 1.14068418766251486777604403304717558e+01L,
+v3 = 1.41164839437524744055723871839748489e+01L,
+v4 = 1.07170702656179582805791063277960532e+01L,
+v5 = 5.14448694179047879915042998453632434e+00L,
+v6 = 1.55210088094585540637493826431170289e+00L,
+v7 = 2.82975732849424562719893657416365673e-01L,
+v8 = 2.86424622754753198010525786005443539e-02L,
+v9 = 1.35364253570403771005922441442688978e-03L,
+v10 = 1.91514173702398375346658943749580666e-05L,
+v11 = -3.25364686890242327944584691466034268e-08L;
+/*
+ * Domain x in (2, 3], range ~[-1.3341e-36, 1.3536e-36]:
+ * |(lgamma(y+2) - 0.5 * y) / y - s(y)/r(y)| < 2**-120.1
+ * with y = x - 2.
+ */
+static const long double
+s0 = -7.72156649015328606065120900824024297e-02L,
+s1 = 1.23221687850916448903914170805852253e-01L,
+s2 = 5.43673188699937239808255378293820020e-01L,
+s3 = 6.31998137119005233383666791176301800e-01L,
+s4 = 3.75885340179479850993811501596213763e-01L,
+s5 = 1.31572908743275052623410195011261575e-01L,
+s6 = 2.82528453299138685507186287149699749e-02L,
+s7 = 3.70262021550340817867688714880797019e-03L,
+s8 = 2.83374000312371199625774129290973648e-04L,
+s9 = 1.15091830239148290758883505582343691e-05L,
+s10 = 2.04203474281493971326506384646692446e-07L,
+s11 = 9.79544198078992058548607407635645763e-10L,
+r1 = 2.58037466655605285937112832039537492e+00L,
+r2 = 2.86289413392776399262513849911531180e+00L,
+r3 = 1.78691044735267497452847829579514367e+00L,
+r4 = 6.89400381446725342846854215600008055e-01L,
+r5 = 1.70135865462567955867134197595365343e-01L,
+r6 = 2.68794816183964420375498986152766763e-02L,
+r7 = 2.64617234244861832870088893332006679e-03L,
+r8 = 1.52881761239180800640068128681725702e-04L,
+r9 = 4.63264813762296029824851351257638558e-06L,
+r10 = 5.89461519146957343083848967333671142e-08L,
+r11 = 1.79027678176582527798327441636552968e-10L;
+/*
+ * Domain z in [8, 0x1p70], range ~[-9.8214e-35, 9.8214e-35]:
+ * |lgamma(x) - (x - 0.5) * (log(x) - 1) - w(1/x)| < 2**-113.0
+ */
+static const long double
+w0 = 4.18938533204672741780329736405617738e-01L,
+w1 = 8.33333333333333333333333333332852026e-02L,
+w2 = -2.77777777777777777777777727810123528e-03L,
+w3 = 7.93650793650793650791708939493907380e-04L,
+w4 = -5.95238095238095234390450004444370959e-04L,
+w5 = 8.41750841750837633887817658848845695e-04L,
+w6 = -1.91752691752396849943172337347259743e-03L,
+w7 = 6.41025640880333069429106541459015557e-03L,
+w8 = -2.95506530801732133437990433080327074e-02L,
+w9 = 1.79644237328444101596766586979576927e-01L,
+w10 = -1.39240539108367641920172649259736394e+00L,
+w11 = 1.33987701479007233325288857758641761e+01L,
+w12 = -1.56363596431084279780966590116006255e+02L,
+w13 = 2.14830978044410267201172332952040777e+03L,
+w14 = -3.28636067474227378352761516589092334e+04L,
+w15 = 5.06201257747865138432663574251462485e+05L,
+w16 = -6.79720123352023636706247599728048344e+06L,
+w17 = 6.57556601705472106989497289465949255e+07L,
+w18 = -3.26229058141181783534257632389415580e+08L;
+
+static long double
+sin_pil(long double x)
+{
+ volatile long double vz;
+ long double y,z;
+ uint64_t lx, n;
+ uint16_t hx;
+
+ y = -x;
+
+ vz = y+0x1.p112;
+ z = vz-0x1.p112;
+ if (z == y)
+ return zero;
+
+ vz = y+0x1.p110;
+ EXTRACT_LDBL128_WORDS(hx,lx,n,vz);
+ z = vz-0x1.p110;
+ if (z > y) {
+ z -= 0.25;
+ n--;
+ }
+ n &= 7;
+ y = y - z + n * 0.25;
+
+ switch (n) {
+ case 0: y = __kernel_sinl(pi*y,zero,0); break;
+ case 1:
+ case 2: y = __kernel_cosl(pi*(0.5-y),zero); break;
+ case 3:
+ case 4: y = __kernel_sinl(pi*(one-y),zero,0); break;
+ case 5:
+ case 6: y = -__kernel_cosl(pi*(y-1.5),zero); break;
+ default: y = __kernel_sinl(pi*(y-2.0),zero,0); break;
+ }
+ return -y;
+}
+
+long double
+lgammal_r(long double x, int *signgamp)
+{
+ long double nadj,p,p1,p2,p3,q,r,t,w,y,z;
+ uint64_t llx,lx;
+ int i;
+ uint16_t hx,ix;
+
+ EXTRACT_LDBL128_WORDS(hx,lx,llx,x);
+
+ /* purge +-Inf and NaNs */
+ *signgamp = 1;
+ ix = hx&0x7fff;
+ if(ix==0x7fff) return x*x;
+
+ /* purge +-0 and tiny arguments */
+ *signgamp = 1-2*(hx>>15);
+ if(ix<0x3fff-116) { /* |x|<2**-(p+3), return -log(|x|) */
+ if((ix|lx|llx)==0)
+ return one/vzero;
+ return -logl(fabsl(x));
+ }
+
+ /* purge negative integers and start evaluation for other x < 0 */
+ if(hx&0x8000) {
+ *signgamp = 1;
+ if(ix>=0x3fff+112) /* |x|>=2**(p-1), must be -integer */
+ return one/vzero;
+ t = sin_pil(x);
+ if(t==zero) return one/vzero;
+ nadj = logl(pi/fabsl(t*x));
+ if(t<zero) *signgamp = -1;
+ x = -x;
+ }
+
+ /* purge 1 and 2 */
+ if((ix==0x3fff || ix==0x4000) && (lx|llx)==0) r = 0;
+ /* for x < 2.0 */
+ else if(ix<0x4000) {
+ if(x<=8.9999961853027344e-01) {
+ r = -logl(x);
+ if(x>=7.3159980773925781e-01) {y = 1-x; i= 0;}
+ else if(x>=2.3163998126983643e-01) {y= x-(tc-1); i=1;}
+ else {y = x; i=2;}
+ } else {
+ r = 0;
+ if(x>=1.7316312789916992e+00) {y=2-x;i=0;}
+ else if(x>=1.2316322326660156e+00) {y=x-tc;i=1;}
+ else {y=x-1;i=2;}
+ }
+ switch(i) {
+ case 0:
+ z = y*y;
+ p1 = a0+z*(a2+z*(a4+z*(a6+z*(a8+z*(a10+z*(a12+z*(a14+z*(a16+
+ z*(a18+z*(a20+z*a22))))))))));
+ p2 = z*(a1+z*(a3+z*(a5+z*(a7+z*(a9+z*(a11+z*(a13+z*(a15+
+ z*(a17+z*(a19+z*(a21+z*a23)))))))))));
+ p = y*p1+p2;
+ r += p-y/2; break;
+ case 1:
+ p = t0+y*t1+tt+y*y*(t2+y*(t3+y*(t4+y*(t5+y*(t6+y*(t7+y*(t8+
+ y*(t9+y*(t10+y*(t11+y*(t12+y*(t13+y*(t14+y*(t15+y*(t16+
+ y*(t17+y*(t18+y*(t19+y*(t20+y*(t21+y*(t22+y*(t23+
+ y*(t24+y*(t25+y*(t26+y*(t27+y*(t28+y*(t29+y*(t30+
+ y*(t31+y*t32))))))))))))))))))))))))))))));
+ r += tf + p; break;
+ case 2:
+ p1 = y*(u0+y*(u1+y*(u2+y*(u3+y*(u4+y*(u5+y*(u6+y*(u7+
+ y*(u8+y*(u9+y*u10))))))))));
+ p2 = one+y*(v1+y*(v2+y*(v3+y*(v4+y*(v5+y*(v6+y*(v7+
+ y*(v8+y*(v9+y*(v10+y*v11))))))))));
+ r += p1/p2-y/2;
+ }
+ }
+ /* x < 8.0 */
+ else if(ix<0x4002) {
+ i = x;
+ y = x-i;
+ p = y*(s0+y*(s1+y*(s2+y*(s3+y*(s4+y*(s5+y*(s6+y*(s7+y*(s8+
+ y*(s9+y*(s10+y*s11)))))))))));
+ q = one+y*(r1+y*(r2+y*(r3+y*(r4+y*(r5+y*(r6+y*(r7+y*(r8+
+ y*(r9+y*(r10+y*r11))))))))));
+ r = y/2+p/q;
+ z = 1; /* lgamma(1+s) = log(s) + lgamma(s) */
+ switch(i) {
+ case 7: z *= (y+6); /* FALLTHRU */
+ case 6: z *= (y+5); /* FALLTHRU */
+ case 5: z *= (y+4); /* FALLTHRU */
+ case 4: z *= (y+3); /* FALLTHRU */
+ case 3: z *= (y+2); /* FALLTHRU */
+ r += logl(z); break;
+ }
+ /* 8.0 <= x < 2**(p+3) */
+ } else if (ix<0x3fff+116) {
+ t = logl(x);
+ z = one/x;
+ y = z*z;
+ w = w0+z*(w1+y*(w2+y*(w3+y*(w4+y*(w5+y*(w6+y*(w7+y*(w8+
+ y*(w9+y*(w10+y*(w11+y*(w12+y*(w13+y*(w14+y*(w15+y*(w16+
+ y*(w17+y*w18)))))))))))))))));
+ r = (x-half)*(t-one)+w;
+ /* 2**(p+3) <= x <= inf */
+ } else
+ r = x*(logl(x)-1);
+ if(hx&0x8000) r = nadj - r;
+ return r;
+}
diff --git a/newlib/libm/ld128/e_powl.c b/newlib/libm/ld128/e_powl.c
new file mode 100644
index 000000000..12b92a1a9
--- /dev/null
+++ b/newlib/libm/ld128/e_powl.c
@@ -0,0 +1,443 @@
+/*-
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+/*
+ * Copyright (c) 2008 Stephen L. Moshier <steve@moshier.net>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/* powl(x,y) return x**y
+ *
+ * n
+ * Method: Let x = 2 * (1+f)
+ * 1. Compute and return log2(x) in two pieces:
+ * log2(x) = w1 + w2,
+ * where w1 has 113-53 = 60 bit trailing zeros.
+ * 2. Perform y*log2(x) = n+y' by simulating multi-precision
+ * arithmetic, where |y'|<=0.5.
+ * 3. Return x**y = 2**n*exp(y'*log2)
+ *
+ * Special cases:
+ * 1. (anything) ** 0 is 1
+ * 2. (anything) ** 1 is itself
+ * 3. (anything) ** NAN is NAN
+ * 4. NAN ** (anything except 0) is NAN
+ * 5. +-(|x| > 1) ** +INF is +INF
+ * 6. +-(|x| > 1) ** -INF is +0
+ * 7. +-(|x| < 1) ** +INF is +0
+ * 8. +-(|x| < 1) ** -INF is +INF
+ * 9. +-1 ** +-INF is NAN
+ * 10. +0 ** (+anything except 0, NAN) is +0
+ * 11. -0 ** (+anything except 0, NAN, odd integer) is +0
+ * 12. +0 ** (-anything except 0, NAN) is +INF
+ * 13. -0 ** (-anything except 0, NAN, odd integer) is +INF
+ * 14. -0 ** (odd integer) = -( +0 ** (odd integer) )
+ * 15. +INF ** (+anything except 0,NAN) is +INF
+ * 16. +INF ** (-anything except 0,NAN) is +0
+ * 17. -INF ** (anything) = -0 ** (-anything)
+ * 18. (-anything) ** (integer) is (-1)**(integer)*(+anything**integer)
+ * 19. (-anything except 0 and inf) ** (non-integer) is NAN
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <float.h>
+#include <math.h>
+
+#include "math_private.h"
+
+static const long double bp[] = {
+ 1.0L,
+ 1.5L,
+};
+
+/* log_2(1.5) */
+static const long double dp_h[] = {
+ 0.0,
+ 5.8496250072115607565592654282227158546448E-1L
+};
+
+/* Low part of log_2(1.5) */
+static const long double dp_l[] = {
+ 0.0,
+ 1.0579781240112554492329533686862998106046E-16L
+};
+
+static const long double zero = 0.0L,
+ one = 1.0L,
+ two = 2.0L,
+ two113 = 1.0384593717069655257060992658440192E34L,
+ huge = 1.0e3000L,
+ tiny = 1.0e-3000L;
+
+/* 3/2 log x = 3 z + z^3 + z^3 (z^2 R(z^2))
+ z = (x-1)/(x+1)
+ 1 <= x <= 1.25
+ Peak relative error 2.3e-37 */
+static const long double LN[] =
+{
+ -3.0779177200290054398792536829702930623200E1L,
+ 6.5135778082209159921251824580292116201640E1L,
+ -4.6312921812152436921591152809994014413540E1L,
+ 1.2510208195629420304615674658258363295208E1L,
+ -9.9266909031921425609179910128531667336670E-1L
+};
+static const long double LD[] =
+{
+ -5.129862866715009066465422805058933131960E1L,
+ 1.452015077564081884387441590064272782044E2L,
+ -1.524043275549860505277434040464085593165E2L,
+ 7.236063513651544224319663428634139768808E1L,
+ -1.494198912340228235853027849917095580053E1L
+ /* 1.0E0 */
+};
+
+/* exp(x) = 1 + x - x / (1 - 2 / (x - x^2 R(x^2)))
+ 0 <= x <= 0.5
+ Peak relative error 5.7e-38 */
+static const long double PN[] =
+{
+ 5.081801691915377692446852383385968225675E8L,
+ 9.360895299872484512023336636427675327355E6L,
+ 4.213701282274196030811629773097579432957E4L,
+ 5.201006511142748908655720086041570288182E1L,
+ 9.088368420359444263703202925095675982530E-3L,
+};
+static const long double PD[] =
+{
+ 3.049081015149226615468111430031590411682E9L,
+ 1.069833887183886839966085436512368982758E8L,
+ 8.259257717868875207333991924545445705394E5L,
+ 1.872583833284143212651746812884298360922E3L,
+ /* 1.0E0 */
+};
+
+static const long double
+ /* ln 2 */
+ lg2 = 6.9314718055994530941723212145817656807550E-1L,
+ lg2_h = 6.9314718055994528622676398299518041312695E-1L,
+ lg2_l = 2.3190468138462996154948554638754786504121E-17L,
+ ovt = 8.0085662595372944372e-0017L,
+ /* 2/(3*log(2)) */
+ cp = 9.6179669392597560490661645400126142495110E-1L,
+ cp_h = 9.6179669392597555432899980587535537779331E-1L,
+ cp_l = 5.0577616648125906047157785230014751039424E-17L;
+
+long double
+powl(long double x, long double y)
+{
+ long double z, ax, z_h, z_l, p_h, p_l;
+ long double yy1, t1, t2, r, s, t, u, v, w;
+ long double s2, s_h, s_l, t_h, t_l;
+ int32_t i, j, k, yisint, n;
+ u_int32_t ix, iy;
+ int32_t hx, hy;
+ ieee_quad_shape_type o, p, q;
+
+ p.value = x;
+ hx = p.parts32.mswhi;
+ ix = hx & 0x7fffffff;
+
+ q.value = y;
+ hy = q.parts32.mswhi;
+ iy = hy & 0x7fffffff;
+
+
+ /* y==zero: x**0 = 1 */
+ if ((iy | q.parts32.mswlo | q.parts32.lswhi | q.parts32.lswlo) == 0)
+ return one;
+
+ /* 1.0**y = 1; -1.0**+-Inf = 1 */
+ if (x == one)
+ return one;
+ if (x == -1.0L && iy == 0x7fff0000
+ && (q.parts32.mswlo | q.parts32.lswhi | q.parts32.lswlo) == 0)
+ return one;
+
+ /* +-NaN return x+y */
+ if ((ix > 0x7fff0000)
+ || ((ix == 0x7fff0000)
+ && ((p.parts32.mswlo | p.parts32.lswhi | p.parts32.lswlo) != 0))
+ || (iy > 0x7fff0000)
+ || ((iy == 0x7fff0000)
+ && ((q.parts32.mswlo | q.parts32.lswhi | q.parts32.lswlo) != 0)))
+ return nan_mix(x, y);
+
+ /* determine if y is an odd int when x < 0
+ * yisint = 0 ... y is not an integer
+ * yisint = 1 ... y is an odd int
+ * yisint = 2 ... y is an even int
+ */
+ yisint = 0;
+ if (hx < 0)
+ {
+ if (iy >= 0x40700000) /* 2^113 */
+ yisint = 2; /* even integer y */
+ else if (iy >= 0x3fff0000) /* 1.0 */
+ {
+ if (floorl (y) == y)
+ {
+ z = 0.5 * y;
+ if (floorl (z) == z)
+ yisint = 2;
+ else
+ yisint = 1;
+ }
+ }
+ }
+
+ /* special value of y */
+ if ((q.parts32.mswlo | q.parts32.lswhi | q.parts32.lswlo) == 0)
+ {
+ if (iy == 0x7fff0000) /* y is +-inf */
+ {
+ if (((ix - 0x3fff0000) | p.parts32.mswlo | p.parts32.lswhi |
+ p.parts32.lswlo) == 0)
+ return y - y; /* +-1**inf is NaN */
+ else if (ix >= 0x3fff0000) /* (|x|>1)**+-inf = inf,0 */
+ return (hy >= 0) ? y : zero;
+ else /* (|x|<1)**-,+inf = inf,0 */
+ return (hy < 0) ? -y : zero;
+ }
+ if (iy == 0x3fff0000)
+ { /* y is +-1 */
+ if (hy < 0)
+ return one / x;
+ else
+ return x;
+ }
+ if (hy == 0x40000000)
+ return x * x; /* y is 2 */
+ if (hy == 0x3ffe0000)
+ { /* y is 0.5 */
+ if (hx >= 0) /* x >= +0 */
+ return sqrtl (x);
+ }
+ }
+
+ ax = fabsl (x);
+ /* special value of x */
+ if ((p.parts32.mswlo | p.parts32.lswhi | p.parts32.lswlo) == 0)
+ {
+ if (ix == 0x7fff0000 || ix == 0 || ix == 0x3fff0000)
+ {
+ z = ax; /*x is +-0,+-inf,+-1 */
+ if (hy < 0)
+ z = one / z; /* z = (1/|x|) */
+ if (hx < 0)
+ {
+ if (((ix - 0x3fff0000) | yisint) == 0)
+ {
+ z = (z - z) / (z - z); /* (-1)**non-int is NaN */
+ }
+ else if (yisint == 1)
+ z = -z; /* (x<0)**odd = -(|x|**odd) */
+ }
+ return z;
+ }
+ }
+
+ /* (x<0)**(non-int) is NaN */
+ if (((((u_int32_t) hx >> 31) - 1) | yisint) == 0)
+ return (x - x) / (x - x);
+
+ /* |y| is huge.
+ 2^-16495 = 1/2 of smallest representable value.
+ If (1 - 1/131072)^y underflows, y > 1.4986e9 */
+ if (iy > 0x401d654b)
+ {
+ /* if (1 - 2^-113)^y underflows, y > 1.1873e38 */
+ if (iy > 0x407d654b)
+ {
+ if (ix <= 0x3ffeffff)
+ return (hy < 0) ? huge * huge : tiny * tiny;
+ if (ix >= 0x3fff0000)
+ return (hy > 0) ? huge * huge : tiny * tiny;
+ }
+ /* over/underflow if x is not close to one */
+ if (ix < 0x3ffeffff)
+ return (hy < 0) ? huge * huge : tiny * tiny;
+ if (ix > 0x3fff0000)
+ return (hy > 0) ? huge * huge : tiny * tiny;
+ }
+
+ n = 0;
+ /* take care subnormal number */
+ if (ix < 0x00010000)
+ {
+ ax *= two113;
+ n -= 113;
+ o.value = ax;
+ ix = o.parts32.mswhi;
+ }
+ n += ((ix) >> 16) - 0x3fff;
+ j = ix & 0x0000ffff;
+ /* determine interval */
+ ix = j | 0x3fff0000; /* normalize ix */
+ if (j <= 0x3988)
+ k = 0; /* |x|<sqrt(3/2) */
+ else if (j < 0xbb67)
+ k = 1; /* |x|<sqrt(3) */
+ else
+ {
+ k = 0;
+ n += 1;
+ ix -= 0x00010000;
+ }
+
+ o.value = ax;
+ o.parts32.mswhi = ix;
+ ax = o.value;
+
+ /* compute s = s_h+s_l = (x-1)/(x+1) or (x-1.5)/(x+1.5) */
+ u = ax - bp[k]; /* bp[0]=1.0, bp[1]=1.5 */
+ v = one / (ax + bp[k]);
+ s = u * v;
+ s_h = s;
+
+ o.value = s_h;
+ o.parts32.lswlo = 0;
+ o.parts32.lswhi &= 0xf8000000;
+ s_h = o.value;
+ /* t_h=ax+bp[k] High */
+ t_h = ax + bp[k];
+ o.value = t_h;
+ o.parts32.lswlo = 0;
+ o.parts32.lswhi &= 0xf8000000;
+ t_h = o.value;
+ t_l = ax - (t_h - bp[k]);
+ s_l = v * ((u - s_h * t_h) - s_h * t_l);
+ /* compute log(ax) */
+ s2 = s * s;
+ u = LN[0] + s2 * (LN[1] + s2 * (LN[2] + s2 * (LN[3] + s2 * LN[4])));
+ v = LD[0] + s2 * (LD[1] + s2 * (LD[2] + s2 * (LD[3] + s2 * (LD[4] + s2))));
+ r = s2 * s2 * u / v;
+ r += s_l * (s_h + s);
+ s2 = s_h * s_h;
+ t_h = 3.0 + s2 + r;
+ o.value = t_h;
+ o.parts32.lswlo = 0;
+ o.parts32.lswhi &= 0xf8000000;
+ t_h = o.value;
+ t_l = r - ((t_h - 3.0) - s2);
+ /* u+v = s*(1+...) */
+ u = s_h * t_h;
+ v = s_l * t_h + t_l * s;
+ /* 2/(3log2)*(s+...) */
+ p_h = u + v;
+ o.value = p_h;
+ o.parts32.lswlo = 0;
+ o.parts32.lswhi &= 0xf8000000;
+ p_h = o.value;
+ p_l = v - (p_h - u);
+ z_h = cp_h * p_h; /* cp_h+cp_l = 2/(3*log2) */
+ z_l = cp_l * p_h + p_l * cp + dp_l[k];
+ /* log2(ax) = (s+..)*2/(3*log2) = n + dp_h + z_h + z_l */
+ t = (long double) n;
+ t1 = (((z_h + z_l) + dp_h[k]) + t);
+ o.value = t1;
+ o.parts32.lswlo = 0;
+ o.parts32.lswhi &= 0xf8000000;
+ t1 = o.value;
+ t2 = z_l - (((t1 - t) - dp_h[k]) - z_h);
+
+ /* s (sign of result -ve**odd) = -1 else = 1 */
+ s = one;
+ if (((((u_int32_t) hx >> 31) - 1) | (yisint - 1)) == 0)
+ s = -one; /* (-ve)**(odd int) */
+
+ /* split up y into yy1+y2 and compute (yy1+y2)*(t1+t2) */
+ yy1 = y;
+ o.value = yy1;
+ o.parts32.lswlo = 0;
+ o.parts32.lswhi &= 0xf8000000;
+ yy1 = o.value;
+ p_l = (y - yy1) * t1 + y * t2;
+ p_h = yy1 * t1;
+ z = p_l + p_h;
+ o.value = z;
+ j = o.parts32.mswhi;
+ if (j >= 0x400d0000) /* z >= 16384 */
+ {
+ /* if z > 16384 */
+ if (((j - 0x400d0000) | o.parts32.mswlo | o.parts32.lswhi |
+ o.parts32.lswlo) != 0)
+ return s * huge * huge; /* overflow */
+ else
+ {
+ if (p_l + ovt > z - p_h)
+ return s * huge * huge; /* overflow */
+ }
+ }
+ else if ((j & 0x7fffffff) >= 0x400d01b9) /* z <= -16495 */
+ {
+ /* z < -16495 */
+ if (((j - 0xc00d01bc) | o.parts32.mswlo | o.parts32.lswhi |
+ o.parts32.lswlo)
+ != 0)
+ return s * tiny * tiny; /* underflow */
+ else
+ {
+ if (p_l <= z - p_h)
+ return s * tiny * tiny; /* underflow */
+ }
+ }
+ /* compute 2**(p_h+p_l) */
+ i = j & 0x7fffffff;
+ k = (i >> 16) - 0x3fff;
+ n = 0;
+ if (i > 0x3ffe0000)
+ { /* if |z| > 0.5, set n = [z+0.5] */
+ n = floorl (z + 0.5L);
+ t = n;
+ p_h -= t;
+ }
+ t = p_l + p_h;
+ o.value = t;
+ o.parts32.lswlo = 0;
+ o.parts32.lswhi &= 0xf8000000;
+ t = o.value;
+ u = t * lg2_h;
+ v = (p_l - (t - p_h)) * lg2 + t * lg2_l;
+ z = u + v;
+ w = v - (z - u);
+ /* exp(z) */
+ t = z * z;
+ u = PN[0] + t * (PN[1] + t * (PN[2] + t * (PN[3] + t * PN[4])));
+ v = PD[0] + t * (PD[1] + t * (PD[2] + t * (PD[3] + t)));
+ t1 = z - t * u / v;
+ r = (z * t1) / (t1 - two) - (w + z * w);
+ z = one - (r - z);
+ o.value = z;
+ j = o.parts32.mswhi;
+ j += (n << 16);
+ if ((j >> 16) <= 0)
+ z = scalbnl (z, n); /* subnormal output */
+ else
+ {
+ o.parts32.mswhi = j;
+ z = o.value;
+ }
+ return s * z;
+}
diff --git a/newlib/libm/ld128/e_rem_pio2l.h b/newlib/libm/ld128/e_rem_pio2l.h
new file mode 100644
index 000000000..7516ced49
--- /dev/null
+++ b/newlib/libm/ld128/e_rem_pio2l.h
@@ -0,0 +1,135 @@
+/* From: @(#)e_rem_pio2.c 1.4 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ * Copyright (c) 2008 Steven G. Kargl, David Schultz, Bruce D. Evans.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ *
+ * Optimized by Bruce D. Evans.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/* ld128 version of __ieee754_rem_pio2l(x,y)
+ *
+ * return the remainder of x rem pi/2 in y[0]+y[1]
+ * use __kernel_rem_pio2()
+ */
+
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+#include "../ld/fpmath.h"
+
+#define BIAS (LDBL_MAX_EXP - 1)
+
+/*
+ * XXX need to verify that nonzero integer multiples of pi/2 within the
+ * range get no closer to a long double than 2**-140, or that
+ * ilogb(x) + ilogb(min_delta) < 45 - -140.
+ */
+/*
+ * invpio2: 113 bits of 2/pi
+ * pio2_1: first 68 bits of pi/2
+ * pio2_1t: pi/2 - pio2_1
+ * pio2_2: second 68 bits of pi/2
+ * pio2_2t: pi/2 - (pio2_1+pio2_2)
+ * pio2_3: third 68 bits of pi/2
+ * pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3)
+ */
+
+static const double
+zero = 0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */
+two24 = 1.67772160000000000000e+07; /* 0x41700000, 0x00000000 */
+
+static const long double
+invpio2 = 6.3661977236758134307553505349005747e-01L, /* 0x145f306dc9c882a53f84eafa3ea6a.0p-113 */
+pio2_1 = 1.5707963267948966192292994253909555e+00L, /* 0x1921fb54442d18469800000000000.0p-112 */
+pio2_1t = 2.0222662487959507323996846200947577e-21L, /* 0x13198a2e03707344a4093822299f3.0p-181 */
+pio2_2 = 2.0222662487959507323994779168837751e-21L, /* 0x13198a2e03707344a400000000000.0p-181 */
+pio2_2t = 2.0670321098263988236496903051604844e-43L, /* 0x127044533e63a0105df531d89cd91.0p-254 */
+pio2_3 = 2.0670321098263988236499468110329591e-43L, /* 0x127044533e63a0105e00000000000.0p-254 */
+pio2_3t = -2.5650587247459238361625433492959285e-65L; /* -0x159c4ec64ddaeb5f78671cbfb2210.0p-327 */
+
+static inline __always_inline int
+__ieee754_rem_pio2l(long double x, long double *y)
+{
+ union IEEEl2bits u,u1;
+ long double z,w,t,r,fn;
+ double tx[5],ty[3];
+ int64_t n;
+ int e0,ex,i,j,nx;
+ int16_t expsign;
+
+ u.e = x;
+ expsign = u.xbits.expsign;
+ ex = expsign & 0x7fff;
+ if (ex < BIAS + 45 || ex == BIAS + 45 &&
+ u.bits.manh < 0x921fb54442d1LL) {
+ /* |x| ~< 2^45*(pi/2), medium size */
+ /* TODO: use only double precision for fn, as in expl(). */
+ fn = rnintl(x * invpio2);
+ n = i64rint(fn);
+ r = x-fn*pio2_1;
+ w = fn*pio2_1t; /* 1st round good to 180 bit */
+ {
+ union IEEEl2bits u2;
+ int ex1;
+ j = ex;
+ y[0] = r-w;
+ u2.e = y[0];
+ ex1 = u2.xbits.expsign & 0x7fff;
+ i = j-ex1;
+ if(i>51) { /* 2nd iteration needed, good to 248 */
+ t = r;
+ w = fn*pio2_2;
+ r = t-w;
+ w = fn*pio2_2t-((t-r)-w);
+ y[0] = r-w;
+ u2.e = y[0];
+ ex1 = u2.xbits.expsign & 0x7fff;
+ i = j-ex1;
+ if(i>119) { /* 3rd iteration need, 316 bits acc */
+ t = r; /* will cover all possible cases */
+ w = fn*pio2_3;
+ r = t-w;
+ w = fn*pio2_3t-((t-r)-w);
+ y[0] = r-w;
+ }
+ }
+ }
+ y[1] = (r-y[0])-w;
+ return n;
+ }
+ /*
+ * all other (large) arguments
+ */
+ if(ex==0x7fff) { /* x is inf or NaN */
+ y[0]=y[1]=x-x; return 0;
+ }
+ /* set z = scalbn(|x|,ilogb(x)-23) */
+ u1.e = x;
+ e0 = ex - BIAS - 23; /* e0 = ilogb(|x|)-23; */
+ u1.xbits.expsign = ex - e0;
+ z = u1.e;
+ for(i=0;i<4;i++) {
+ tx[i] = (double)((int32_t)(z));
+ z = (z-tx[i])*two24;
+ }
+ tx[4] = z;
+ nx = 5;
+ while(tx[nx-1]==zero) nx--; /* skip zero term */
+ n = __kernel_rem_pio2(tx,ty,e0,nx,3);
+ t = (long double)ty[2] + ty[1];
+ r = t + ty[0];
+ w = ty[0] - (r - t);
+ if(expsign<0) {y[0] = -r; y[1] = -w; return -n;}
+ y[0] = r; y[1] = w; return n;
+}
diff --git a/newlib/libm/ld128/invtrig.c b/newlib/libm/ld128/invtrig.c
new file mode 100644
index 000000000..ab93732c8
--- /dev/null
+++ b/newlib/libm/ld128/invtrig.c
@@ -0,0 +1,102 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2008 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "invtrig.h"
+
+/*
+ * asinl() and acosl()
+ */
+const long double
+pS0 = 1.66666666666666666666666666666700314e-01L,
+pS1 = -7.32816946414566252574527475428622708e-01L,
+pS2 = 1.34215708714992334609030036562143589e+00L,
+pS3 = -1.32483151677116409805070261790752040e+00L,
+pS4 = 7.61206183613632558824485341162121989e-01L,
+pS5 = -2.56165783329023486777386833928147375e-01L,
+pS6 = 4.80718586374448793411019434585413855e-02L,
+pS7 = -4.42523267167024279410230886239774718e-03L,
+pS8 = 1.44551535183911458253205638280410064e-04L,
+pS9 = -2.10558957916600254061591040482706179e-07L,
+qS1 = -4.84690167848739751544716485245697428e+00L,
+qS2 = 9.96619113536172610135016921140206980e+00L,
+qS3 = -1.13177895428973036660836798461641458e+01L,
+qS4 = 7.74004374389488266169304117714658761e+00L,
+qS5 = -3.25871986053534084709023539900339905e+00L,
+qS6 = 8.27830318881232209752469022352928864e-01L,
+qS7 = -1.18768052702942805423330715206348004e-01L,
+qS8 = 8.32600764660522313269101537926539470e-03L,
+qS9 = -1.99407384882605586705979504567947007e-04L;
+
+/*
+ * atanl()
+ */
+const long double atanhi[] = {
+ 4.63647609000806116214256231461214397e-01L,
+ 7.85398163397448309615660845819875699e-01L,
+ 9.82793723247329067985710611014666038e-01L,
+ 1.57079632679489661923132169163975140e+00L,
+};
+
+const long double atanlo[] = {
+ 4.89509642257333492668618435220297706e-36L,
+ 2.16795253253094525619926100651083806e-35L,
+ -2.31288434538183565909319952098066272e-35L,
+ 4.33590506506189051239852201302167613e-35L,
+};
+
+const long double aT[] = {
+ 3.33333333333333333333333333333333125e-01L,
+ -1.99999999999999999999999999999180430e-01L,
+ 1.42857142857142857142857142125269827e-01L,
+ -1.11111111111111111111110834490810169e-01L,
+ 9.09090909090909090908522355708623681e-02L,
+ -7.69230769230769230696553844935357021e-02L,
+ 6.66666666666666660390096773046256096e-02L,
+ -5.88235294117646671706582985209643694e-02L,
+ 5.26315789473666478515847092020327506e-02L,
+ -4.76190476189855517021024424991436144e-02L,
+ 4.34782608678695085948531993458097026e-02L,
+ -3.99999999632663469330634215991142368e-02L,
+ 3.70370363987423702891250829918659723e-02L,
+ -3.44827496515048090726669907612335954e-02L,
+ 3.22579620681420149871973710852268528e-02L,
+ -3.03020767654269261041647570626778067e-02L,
+ 2.85641979882534783223403715930946138e-02L,
+ -2.69824879726738568189929461383741323e-02L,
+ 2.54194698498808542954187110873675769e-02L,
+ -2.35083879708189059926183138130183215e-02L,
+ 2.04832358998165364349957325067131428e-02L,
+ -1.54489555488544397858507248612362957e-02L,
+ 8.64492360989278761493037861575248038e-03L,
+ -2.58521121597609872727919154569765469e-03L,
+};
+
+const long double pi_lo = 8.67181013012378102479704402604335225e-35L;
diff --git a/newlib/libm/ld128/invtrig.h b/newlib/libm/ld128/invtrig.h
new file mode 100644
index 000000000..423b56847
--- /dev/null
+++ b/newlib/libm/ld128/invtrig.h
@@ -0,0 +1,115 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2008 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <float.h>
+
+#include "fpmath.h"
+
+#define BIAS (LDBL_MAX_EXP - 1)
+#define MANH_SIZE (LDBL_MANH_SIZE + 1)
+
+/* Approximation thresholds. */
+#define ASIN_LINEAR (BIAS - 56) /* 2**-56 */
+#define ACOS_CONST (BIAS - 113) /* 2**-113 */
+#define ATAN_CONST (BIAS + 113) /* 2**113 */
+#define ATAN_LINEAR (BIAS - 56) /* 2**-56 */
+
+/* 0.95 */
+#define THRESH ((0xe666666666666666ULL>>(64-(MANH_SIZE-1)))|LDBL_NBIT)
+
+/* Constants shared by the long double inverse trig functions. */
+#define pS0 _ItL_pS0
+#define pS1 _ItL_pS1
+#define pS2 _ItL_pS2
+#define pS3 _ItL_pS3
+#define pS4 _ItL_pS4
+#define pS5 _ItL_pS5
+#define pS6 _ItL_pS6
+#define pS7 _ItL_pS7
+#define pS8 _ItL_pS8
+#define pS9 _ItL_pS9
+#define qS1 _ItL_qS1
+#define qS2 _ItL_qS2
+#define qS3 _ItL_qS3
+#define qS4 _ItL_qS4
+#define qS5 _ItL_qS5
+#define qS6 _ItL_qS6
+#define qS7 _ItL_qS7
+#define qS8 _ItL_qS8
+#define qS9 _ItL_qS9
+#define atanhi _ItL_atanhi
+#define atanlo _ItL_atanlo
+#define aT _ItL_aT
+#define pi_lo _ItL_pi_lo
+
+#define pio2_hi atanhi[3]
+#define pio2_lo atanlo[3]
+#define pio4_hi atanhi[1]
+
+/* Constants shared by the long double inverse trig functions. */
+extern const long double pS0, pS1, pS2, pS3, pS4, pS5, pS6, pS7, pS8, pS9;
+extern const long double qS1, qS2, qS3, qS4, qS5, qS6, qS7, qS8, qS9;
+extern const long double atanhi[], atanlo[], aT[];
+extern const long double pi_lo;
+
+static inline long double
+P(long double x)
+{
+
+ return (x * (pS0 + x * (pS1 + x * (pS2 + x * (pS3 + x * \
+ (pS4 + x * (pS5 + x * (pS6 + x * (pS7 + x * (pS8 + x * \
+ pS9))))))))));
+}
+
+static inline long double
+Q(long double x)
+{
+
+ return (1.0 + x * (qS1 + x * (qS2 + x * (qS3 + x * (qS4 + x * \
+ (qS5 + x * (qS6 + x * (qS7 + x * (qS8 + x * qS9)))))))));
+}
+
+static inline long double
+T_even(long double x)
+{
+
+ return (aT[0] + x * (aT[2] + x * (aT[4] + x * (aT[6] + x * \
+ (aT[8] + x * (aT[10] + x * (aT[12] + x * (aT[14] + x * \
+ (aT[16] + x * (aT[18] + x * (aT[20] + x * aT[22])))))))))));
+}
+
+static inline long double
+T_odd(long double x)
+{
+
+ return (aT[1] + x * (aT[3] + x * (aT[5] + x * (aT[7] + x * \
+ (aT[9] + x * (aT[11] + x * (aT[13] + x * (aT[15] + x * \
+ (aT[17] + x * (aT[19] + x * (aT[21] + x * aT[23])))))))))));
+}
diff --git a/newlib/libm/ld128/k_cosl.c b/newlib/libm/ld128/k_cosl.c
new file mode 100644
index 000000000..422357bf8
--- /dev/null
+++ b/newlib/libm/ld128/k_cosl.c
@@ -0,0 +1,59 @@
+/* From: @(#)k_cos.c 1.3 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ * Copyright (c) 2008 Steven G. Kargl, David Schultz, Bruce D. Evans.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * ld128 version of k_cos.c. See ../src/k_cos.c for most comments.
+ */
+
+#include "math_private.h"
+
+/*
+ * Domain [-0.7854, 0.7854], range ~[-1.17e-39, 1.19e-39]:
+ * |cos(x) - c(x))| < 2**-129.3
+ *
+ * 113-bit precision requires more care than 64-bit precision, since
+ * simple methods give a minimax polynomial with coefficient for x^2
+ * that is 1 ulp below 0.5, but we want it to be precisely 0.5. See
+ * ../ld80/k_cosl.c for more details.
+ */
+static const double
+one = 1.0;
+static const long double
+C1 = 4.16666666666666666666666666666666667e-02L,
+C2 = -1.38888888888888888888888888888888834e-03L,
+C3 = 2.48015873015873015873015873015446795e-05L,
+C4 = -2.75573192239858906525573190949988493e-07L,
+C5 = 2.08767569878680989792098886701451072e-09L,
+C6 = -1.14707455977297247136657111139971865e-11L,
+C7 = 4.77947733238738518870113294139830239e-14L,
+C8 = -1.56192069685858079920640872925306403e-16L,
+C9 = 4.11031762320473354032038893429515732e-19L,
+C10= -8.89679121027589608738005163931958096e-22L,
+C11= 1.61171797801314301767074036661901531e-24L,
+C12= -2.46748624357670948912574279501044295e-27L;
+
+long double
+__kernel_cosl(long double x, long double y)
+{
+ long double hz,z,r,w;
+
+ z = x*x;
+ r = z*(C1+z*(C2+z*(C3+z*(C4+z*(C5+z*(C6+z*(C7+
+ z*(C8+z*(C9+z*(C10+z*(C11+z*C12)))))))))));
+ hz = 0.5*z;
+ w = one-hz;
+ return w + (((one-w)-hz) + (z*r-x*y));
+}
diff --git a/newlib/libm/ld128/k_expl.h b/newlib/libm/ld128/k_expl.h
new file mode 100644
index 000000000..159338fe3
--- /dev/null
+++ b/newlib/libm/ld128/k_expl.h
@@ -0,0 +1,324 @@
+/* from: FreeBSD: head/lib/msun/ld128/s_expl.c 251345 2013-06-03 20:09:22Z kargl */
+
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2009-2013 Steven G. Kargl
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice unmodified, this list of conditions, and the following
+ * disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Optimized by Bruce D. Evans.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * ld128 version of k_expl.h. See ../ld80/s_expl.c for most comments.
+ *
+ * See ../src/e_exp.c and ../src/k_exp.h for precision-independent comments
+ * about the secondary kernels.
+ */
+
+#define INTERVALS 128
+#define LOG2_INTERVALS 7
+#define BIAS (LDBL_MAX_EXP - 1)
+
+static const double
+/*
+ * ln2/INTERVALS = L1+L2 (hi+lo decomposition for multiplication). L1 must
+ * have at least 22 (= log2(|LDBL_MIN_EXP-extras|) + log2(INTERVALS)) lowest
+ * bits zero so that multiplication of it by n is exact.
+ */
+INV_L = 1.8466496523378731e+2, /* 0x171547652b82fe.0p-45 */
+L2 = -1.0253670638894731e-29; /* -0x1.9ff0342542fc3p-97 */
+static const long double
+/* 0x1.62e42fefa39ef35793c768000000p-8 */
+L1 = 5.41521234812457272982212595914567508e-3L;
+
+/*
+ * XXX values in hex in comments have been lost (or were never present)
+ * from here.
+ */
+static const long double
+/*
+ * Domain [-0.002708, 0.002708], range ~[-2.4021e-38, 2.4234e-38]:
+ * |exp(x) - p(x)| < 2**-124.9
+ * (0.002708 is ln2/(2*INTERVALS) rounded up a little).
+ *
+ * XXX the coeffs aren't very carefully rounded, and I get 3.6 more bits.
+ */
+A2 = 0.5,
+A3 = 1.66666666666666666666666666651085500e-1L,
+A4 = 4.16666666666666666666666666425885320e-2L,
+A5 = 8.33333333333333333334522877160175842e-3L,
+A6 = 1.38888888888888888889971139751596836e-3L;
+
+static const double
+A7 = 1.9841269841269470e-4, /* 0x1.a01a01a019f91p-13 */
+A8 = 2.4801587301585286e-5, /* 0x1.71de3ec75a967p-19 */
+A9 = 2.7557324277411235e-6, /* 0x1.71de3ec75a967p-19 */
+A10 = 2.7557333722375069e-7; /* 0x1.27e505ab56259p-22 */
+
+static const struct {
+ /*
+ * hi must be rounded to at most 106 bits so that multiplication
+ * by r1 in expm1l() is exact, but it is rounded to 88 bits due to
+ * historical accidents.
+ *
+ * XXX it is wasteful to use long double for both hi and lo. ld128
+ * exp2l() uses only float for lo (in a very differently organized
+ * table; ld80 exp2l() is different again. It uses 2 doubles in a
+ * table organized like this one. 1 double and 1 float would
+ * suffice). There are different packing/locality/alignment/caching
+ * problems with these methods.
+ *
+ * XXX C's bad %a format makes the bits unreadable. They happen
+ * to all line up for the hi values 1 before the point and 88
+ * in 22 nybbles, but for the low values the nybbles are shifted
+ * randomly.
+ */
+ long double hi;
+ long double lo;
+} tbl[INTERVALS] = {
+ 0x1p0L, 0x0p0L,
+ 0x1.0163da9fb33356d84a66aep0L, 0x3.36dcdfa4003ec04c360be2404078p-92L,
+ 0x1.02c9a3e778060ee6f7cacap0L, 0x4.f7a29bde93d70a2cabc5cb89ba10p-92L,
+ 0x1.04315e86e7f84bd738f9a2p0L, 0xd.a47e6ed040bb4bfc05af6455e9b8p-96L,
+ 0x1.059b0d31585743ae7c548ep0L, 0xb.68ca417fe53e3495f7df4baf84a0p-92L,
+ 0x1.0706b29ddf6ddc6dc403a8p0L, 0x1.d87b27ed07cb8b092ac75e311753p-88L,
+ 0x1.0874518759bc808c35f25cp0L, 0x1.9427fa2b041b2d6829d8993a0d01p-88L,
+ 0x1.09e3ecac6f3834521e060cp0L, 0x5.84d6b74ba2e023da730e7fccb758p-92L,
+ 0x1.0b5586cf9890f6298b92b6p0L, 0x1.1842a98364291408b3ceb0a2a2bbp-88L,
+ 0x1.0cc922b7247f7407b705b8p0L, 0x9.3dc5e8aac564e6fe2ef1d431fd98p-92L,
+ 0x1.0e3ec32d3d1a2020742e4ep0L, 0x1.8af6a552ac4b358b1129e9f966a4p-88L,
+ 0x1.0fb66affed31af232091dcp0L, 0x1.8a1426514e0b627bda694a400a27p-88L,
+ 0x1.11301d0125b50a4ebbf1aep0L, 0xd.9318ceac5cc47ab166ee57427178p-92L,
+ 0x1.12abdc06c31cbfb92bad32p0L, 0x4.d68e2f7270bdf7cedf94eb1cb818p-92L,
+ 0x1.1429aaea92ddfb34101942p0L, 0x1.b2586d01844b389bea7aedd221d4p-88L,
+ 0x1.15a98c8a58e512480d573cp0L, 0x1.d5613bf92a2b618ee31b376c2689p-88L,
+ 0x1.172b83c7d517adcdf7c8c4p0L, 0x1.0eb14a792035509ff7d758693f24p-88L,
+ 0x1.18af9388c8de9bbbf70b9ap0L, 0x3.c2505c97c0102e5f1211941d2840p-92L,
+ 0x1.1a35beb6fcb753cb698f68p0L, 0x1.2d1c835a6c30724d5cfae31b84e5p-88L,
+ 0x1.1bbe084045cd39ab1e72b4p0L, 0x4.27e35f9acb57e473915519a1b448p-92L,
+ 0x1.1d4873168b9aa7805b8028p0L, 0x9.90f07a98b42206e46166cf051d70p-92L,
+ 0x1.1ed5022fcd91cb8819ff60p0L, 0x1.121d1e504d36c47474c9b7de6067p-88L,
+ 0x1.2063b88628cd63b8eeb028p0L, 0x1.50929d0fc487d21c2b84004264dep-88L,
+ 0x1.21f49917ddc962552fd292p0L, 0x9.4bdb4b61ea62477caa1dce823ba0p-92L,
+ 0x1.2387a6e75623866c1fadb0p0L, 0x1.c15cb593b0328566902df69e4de2p-88L,
+ 0x1.251ce4fb2a63f3582ab7dep0L, 0x9.e94811a9c8afdcf796934bc652d0p-92L,
+ 0x1.26b4565e27cdd257a67328p0L, 0x1.d3b249dce4e9186ddd5ff44e6b08p-92L,
+ 0x1.284dfe1f5638096cf15cf0p0L, 0x3.ca0967fdaa2e52d7c8106f2e262cp-92L,
+ 0x1.29e9df51fdee12c25d15f4p0L, 0x1.a24aa3bca890ac08d203fed80a07p-88L,
+ 0x1.2b87fd0dad98ffddea4652p0L, 0x1.8fcab88442fdc3cb6de4519165edp-88L,
+ 0x1.2d285a6e4030b40091d536p0L, 0xd.075384589c1cd1b3e4018a6b1348p-92L,
+ 0x1.2ecafa93e2f5611ca0f45cp0L, 0x1.523833af611bdcda253c554cf278p-88L,
+ 0x1.306fe0a31b7152de8d5a46p0L, 0x3.05c85edecbc27343629f502f1af2p-92L,
+ 0x1.32170fc4cd8313539cf1c2p0L, 0x1.008f86dde3220ae17a005b6412bep-88L,
+ 0x1.33c08b26416ff4c9c8610cp0L, 0x1.96696bf95d1593039539d94d662bp-88L,
+ 0x1.356c55f929ff0c94623476p0L, 0x3.73af38d6d8d6f9506c9bbc93cbc0p-92L,
+ 0x1.371a7373aa9caa7145502ep0L, 0x1.4547987e3e12516bf9c699be432fp-88L,
+ 0x1.38cae6d05d86585a9cb0d8p0L, 0x1.bed0c853bd30a02790931eb2e8f0p-88L,
+ 0x1.3a7db34e59ff6ea1bc9298p0L, 0x1.e0a1d336163fe2f852ceeb134067p-88L,
+ 0x1.3c32dc313a8e484001f228p0L, 0xb.58f3775e06ab66353001fae9fca0p-92L,
+ 0x1.3dea64c12342235b41223ep0L, 0x1.3d773fba2cb82b8244267c54443fp-92L,
+ 0x1.3fa4504ac801ba0bf701aap0L, 0x4.1832fb8c1c8dbdff2c49909e6c60p-92L,
+ 0x1.4160a21f72e29f84325b8ep0L, 0x1.3db61fb352f0540e6ba05634413ep-88L,
+ 0x1.431f5d950a896dc7044394p0L, 0x1.0ccec81e24b0caff7581ef4127f7p-92L,
+ 0x1.44e086061892d03136f408p0L, 0x1.df019fbd4f3b48709b78591d5cb5p-88L,
+ 0x1.46a41ed1d005772512f458p0L, 0x1.229d97df404ff21f39c1b594d3a8p-88L,
+ 0x1.486a2b5c13cd013c1a3b68p0L, 0x1.062f03c3dd75ce8757f780e6ec99p-88L,
+ 0x1.4a32af0d7d3de672d8bcf4p0L, 0x6.f9586461db1d878b1d148bd3ccb8p-92L,
+ 0x1.4bfdad5362a271d4397afep0L, 0xc.42e20e0363ba2e159c579f82e4b0p-92L,
+ 0x1.4dcb299fddd0d63b36ef1ap0L, 0x9.e0cc484b25a5566d0bd5f58ad238p-92L,
+ 0x1.4f9b2769d2ca6ad33d8b68p0L, 0x1.aa073ee55e028497a329a7333dbap-88L,
+ 0x1.516daa2cf6641c112f52c8p0L, 0x4.d822190e718226177d7608d20038p-92L,
+ 0x1.5342b569d4f81df0a83c48p0L, 0x1.d86a63f4e672a3e429805b049465p-88L,
+ 0x1.551a4ca5d920ec52ec6202p0L, 0x4.34ca672645dc6c124d6619a87574p-92L,
+ 0x1.56f4736b527da66ecb0046p0L, 0x1.64eb3c00f2f5ab3d801d7cc7272dp-88L,
+ 0x1.58d12d497c7fd252bc2b72p0L, 0x1.43bcf2ec936a970d9cc266f0072fp-88L,
+ 0x1.5ab07dd48542958c930150p0L, 0x1.91eb345d88d7c81280e069fbdb63p-88L,
+ 0x1.5c9268a5946b701c4b1b80p0L, 0x1.6986a203d84e6a4a92f179e71889p-88L,
+ 0x1.5e76f15ad21486e9be4c20p0L, 0x3.99766a06548a05829e853bdb2b52p-92L,
+ 0x1.605e1b976dc08b076f592ap0L, 0x4.86e3b34ead1b4769df867b9c89ccp-92L,
+ 0x1.6247eb03a5584b1f0fa06ep0L, 0x1.d2da42bb1ceaf9f732275b8aef30p-88L,
+ 0x1.6434634ccc31fc76f8714cp0L, 0x4.ed9a4e41000307103a18cf7a6e08p-92L,
+ 0x1.66238825522249127d9e28p0L, 0x1.b8f314a337f4dc0a3adf1787ff74p-88L,
+ 0x1.68155d44ca973081c57226p0L, 0x1.b9f32706bfe4e627d809a85dcc66p-88L,
+ 0x1.6a09e667f3bcc908b2fb12p0L, 0x1.66ea957d3e3adec17512775099dap-88L,
+ 0x1.6c012750bdabeed76a9980p0L, 0xf.4f33fdeb8b0ecd831106f57b3d00p-96L,
+ 0x1.6dfb23c651a2ef220e2cbep0L, 0x1.bbaa834b3f11577ceefbe6c1c411p-92L,
+ 0x1.6ff7df9519483cf87e1b4ep0L, 0x1.3e213bff9b702d5aa477c12523cep-88L,
+ 0x1.71f75e8ec5f73dd2370f2ep0L, 0xf.0acd6cb434b562d9e8a20adda648p-92L,
+ 0x1.73f9a48a58173bd5c9a4e6p0L, 0x8.ab1182ae217f3a7681759553e840p-92L,
+ 0x1.75feb564267c8bf6e9aa32p0L, 0x1.a48b27071805e61a17b954a2dad8p-88L,
+ 0x1.780694fde5d3f619ae0280p0L, 0x8.58b2bb2bdcf86cd08e35fb04c0f0p-92L,
+ 0x1.7a11473eb0186d7d51023ep0L, 0x1.6cda1f5ef42b66977960531e821bp-88L,
+ 0x1.7c1ed0130c1327c4933444p0L, 0x1.937562b2dc933d44fc828efd4c9cp-88L,
+ 0x1.7e2f336cf4e62105d02ba0p0L, 0x1.5797e170a1427f8fcdf5f3906108p-88L,
+ 0x1.80427543e1a11b60de6764p0L, 0x9.a354ea706b8e4d8b718a672bf7c8p-92L,
+ 0x1.82589994cce128acf88afap0L, 0xb.34a010f6ad65cbbac0f532d39be0p-92L,
+ 0x1.8471a4623c7acce52f6b96p0L, 0x1.c64095370f51f48817914dd78665p-88L,
+ 0x1.868d99b4492ec80e41d90ap0L, 0xc.251707484d73f136fb5779656b70p-92L,
+ 0x1.88ac7d98a669966530bcdep0L, 0x1.2d4e9d61283ef385de170ab20f96p-88L,
+ 0x1.8ace5422aa0db5ba7c55a0p0L, 0x1.92c9bb3e6ed61f2733304a346d8fp-88L,
+ 0x1.8cf3216b5448bef2aa1cd0p0L, 0x1.61c55d84a9848f8c453b3ca8c946p-88L,
+ 0x1.8f1ae991577362b982745cp0L, 0x7.2ed804efc9b4ae1458ae946099d4p-92L,
+ 0x1.9145b0b91ffc588a61b468p0L, 0x1.f6b70e01c2a90229a4c4309ea719p-88L,
+ 0x1.93737b0cdc5e4f4501c3f2p0L, 0x5.40a22d2fc4af581b63e8326efe9cp-92L,
+ 0x1.95a44cbc8520ee9b483694p0L, 0x1.a0fc6f7c7d61b2b3a22a0eab2cadp-88L,
+ 0x1.97d829fde4e4f8b9e920f8p0L, 0x1.1e8bd7edb9d7144b6f6818084cc7p-88L,
+ 0x1.9a0f170ca07b9ba3109b8cp0L, 0x4.6737beb19e1eada6825d3c557428p-92L,
+ 0x1.9c49182a3f0901c7c46b06p0L, 0x1.1f2be58ddade50c217186c90b457p-88L,
+ 0x1.9e86319e323231824ca78ep0L, 0x6.4c6e010f92c082bbadfaf605cfd4p-92L,
+ 0x1.a0c667b5de564b29ada8b8p0L, 0xc.ab349aa0422a8da7d4512edac548p-92L,
+ 0x1.a309bec4a2d3358c171f76p0L, 0x1.0daad547fa22c26d168ea762d854p-88L,
+ 0x1.a5503b23e255c8b424491cp0L, 0xa.f87bc8050a405381703ef7caff50p-92L,
+ 0x1.a799e1330b3586f2dfb2b0p0L, 0x1.58f1a98796ce8908ae852236ca94p-88L,
+ 0x1.a9e6b5579fdbf43eb243bcp0L, 0x1.ff4c4c58b571cf465caf07b4b9f5p-88L,
+ 0x1.ac36bbfd3f379c0db966a2p0L, 0x1.1265fc73e480712d20f8597a8e7bp-88L,
+ 0x1.ae89f995ad3ad5e8734d16p0L, 0x1.73205a7fbc3ae675ea440b162d6cp-88L,
+ 0x1.b0e07298db66590842acdep0L, 0x1.c6f6ca0e5dcae2aafffa7a0554cbp-88L,
+ 0x1.b33a2b84f15faf6bfd0e7ap0L, 0x1.d947c2575781dbb49b1237c87b6ep-88L,
+ 0x1.b59728de559398e3881110p0L, 0x1.64873c7171fefc410416be0a6525p-88L,
+ 0x1.b7f76f2fb5e46eaa7b081ap0L, 0xb.53c5354c8903c356e4b625aacc28p-92L,
+ 0x1.ba5b030a10649840cb3c6ap0L, 0xf.5b47f297203757e1cc6eadc8bad0p-92L,
+ 0x1.bcc1e904bc1d2247ba0f44p0L, 0x1.b3d08cd0b20287092bd59be4ad98p-88L,
+ 0x1.bf2c25bd71e088408d7024p0L, 0x1.18e3449fa073b356766dfb568ff4p-88L,
+ 0x1.c199bdd85529c2220cb12ap0L, 0x9.1ba6679444964a36661240043970p-96L,
+ 0x1.c40ab5fffd07a6d14df820p0L, 0xf.1828a5366fd387a7bdd54cdf7300p-92L,
+ 0x1.c67f12e57d14b4a2137fd2p0L, 0xf.2b301dd9e6b151a6d1f9d5d5f520p-96L,
+ 0x1.c8f6d9406e7b511acbc488p0L, 0x5.c442ddb55820171f319d9e5076a8p-96L,
+ 0x1.cb720dcef90691503cbd1ep0L, 0x9.49db761d9559ac0cb6dd3ed599e0p-92L,
+ 0x1.cdf0b555dc3f9c44f8958ep0L, 0x1.ac51be515f8c58bdfb6f5740a3a4p-88L,
+ 0x1.d072d4a07897b8d0f22f20p0L, 0x1.a158e18fbbfc625f09f4cca40874p-88L,
+ 0x1.d2f87080d89f18ade12398p0L, 0x9.ea2025b4c56553f5cdee4c924728p-92L,
+ 0x1.d5818dcfba48725da05aeap0L, 0x1.66e0dca9f589f559c0876ff23830p-88L,
+ 0x1.d80e316c98397bb84f9d04p0L, 0x8.805f84bec614de269900ddf98d28p-92L,
+ 0x1.da9e603db3285708c01a5ap0L, 0x1.6d4c97f6246f0ec614ec95c99392p-88L,
+ 0x1.dd321f301b4604b695de3cp0L, 0x6.30a393215299e30d4fb73503c348p-96L,
+ 0x1.dfc97337b9b5eb968cac38p0L, 0x1.ed291b7225a944efd5bb5524b927p-88L,
+ 0x1.e264614f5a128a12761fa0p0L, 0x1.7ada6467e77f73bf65e04c95e29dp-88L,
+ 0x1.e502ee78b3ff6273d13014p0L, 0x1.3991e8f49659e1693be17ae1d2f9p-88L,
+ 0x1.e7a51fbc74c834b548b282p0L, 0x1.23786758a84f4956354634a416cep-88L,
+ 0x1.ea4afa2a490d9858f73a18p0L, 0xf.5db301f86dea20610ceee13eb7b8p-92L,
+ 0x1.ecf482d8e67f08db0312fap0L, 0x1.949cef462010bb4bc4ce72a900dfp-88L,
+ 0x1.efa1bee615a27771fd21a8p0L, 0x1.2dac1f6dd5d229ff68e46f27e3dfp-88L,
+ 0x1.f252b376bba974e8696fc2p0L, 0x1.6390d4c6ad5476b5162f40e1d9a9p-88L,
+ 0x1.f50765b6e4540674f84b76p0L, 0x2.862baff99000dfc4352ba29b8908p-92L,
+ 0x1.f7bfdad9cbe138913b4bfep0L, 0x7.2bd95c5ce7280fa4d2344a3f5618p-92L,
+ 0x1.fa7c1819e90d82e90a7e74p0L, 0xb.263c1dc060c36f7650b4c0f233a8p-92L,
+ 0x1.fd3c22b8f71f10975ba4b2p0L, 0x1.2bcf3a5e12d269d8ad7c1a4a8875p-88L
+};
+
+/*
+ * Kernel for expl(x). x must be finite and not tiny or huge.
+ * "tiny" is anything that would make us underflow (|A6*x^6| < ~LDBL_MIN).
+ * "huge" is anything that would make fn*L1 inexact (|x| > ~2**17*ln2).
+ */
+static inline void
+__k_expl(long double x, long double *hip, long double *lop, int *kp)
+{
+ long double q, r, r1, t;
+ double dr, fn, r2;
+ int n, n2;
+
+ /* Reduce x to (k*ln2 + endpoint[n2] + r1 + r2). */
+ fn = rnint((double)x * INV_L);
+ n = irint(fn);
+ n2 = (unsigned)n % INTERVALS;
+ /* Depend on the sign bit being propagated: */
+ *kp = n >> LOG2_INTERVALS;
+ r1 = x - fn * L1;
+ r2 = fn * -L2;
+ r = r1 + r2;
+
+ /* Evaluate expl(endpoint[n2] + r1 + r2) = tbl[n2] * expl(r1 + r2). */
+ dr = r;
+ q = r2 + r * r * (A2 + r * (A3 + r * (A4 + r * (A5 + r * (A6 +
+ dr * (A7 + dr * (A8 + dr * (A9 + dr * A10))))))));
+ t = tbl[n2].lo + tbl[n2].hi;
+ *hip = tbl[n2].hi;
+ *lop = tbl[n2].lo + t * (q + r1);
+}
+
+/*
+ * XXX: the rest of the functions are identical for ld80 and ld128.
+ * However, we should use scalbnl() for ld128, since long double
+ * multiplication was very slow on sparc64 and no new evaluation has
+ * been made for aarch64 and/or riscv.
+ */
+
+static inline void
+k_hexpl(long double x, long double *hip, long double *lop)
+{
+ float twopkm1;
+ int k;
+
+ __k_expl(x, hip, lop, &k);
+ SET_FLOAT_WORD(twopkm1, 0x3f800000 + ((k - 1) << 23));
+ *hip *= twopkm1;
+ *lop *= twopkm1;
+}
+
+static inline long double
+hexpl(long double x)
+{
+ long double hi, lo, twopkm2;
+ int k;
+
+ twopkm2 = 1;
+ __k_expl(x, &hi, &lo, &k);
+ SET_LDBL_EXPSIGN(twopkm2, BIAS + k - 2);
+ return (lo + hi) * 2 * twopkm2;
+}
+
+#ifdef _COMPLEX_H
+/*
+ * See ../src/k_exp.c for details.
+ */
+static inline long double complex
+__ldexp_cexpl(long double complex z, int expt)
+{
+ long double c, exp_x, hi, lo, s;
+ long double x, y, scale1, scale2;
+ int half_expt, k;
+
+ x = creall(z);
+ y = cimagl(z);
+ __k_expl(x, &hi, &lo, &k);
+
+ exp_x = (lo + hi) * 0x1p16382L;
+ expt += k - 16382;
+
+ scale1 = 1;
+ half_expt = expt / 2;
+ SET_LDBL_EXPSIGN(scale1, BIAS + half_expt);
+ scale2 = 1;
+ SET_LDBL_EXPSIGN(scale2, BIAS + expt - half_expt);
+
+ sincosl(y, &s, &c);
+ return (CMPLXL(c * exp_x * scale1 * scale2,
+ s * exp_x * scale1 * scale2));
+}
+#endif /* _COMPLEX_H */
diff --git a/newlib/libm/ld128/k_sinl.c b/newlib/libm/ld128/k_sinl.c
new file mode 100644
index 000000000..09472d65f
--- /dev/null
+++ b/newlib/libm/ld128/k_sinl.c
@@ -0,0 +1,59 @@
+/* From: @(#)k_sin.c 1.3 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ * Copyright (c) 2008 Steven G. Kargl, David Schultz, Bruce D. Evans.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * ld128 version of k_sin.c. See ../src/k_sin.c for most comments.
+ */
+
+#include "math_private.h"
+
+static const double
+half = 0.5;
+
+/*
+ * Domain [-0.7854, 0.7854], range ~[-1.53e-37, 1.659e-37]
+ * |sin(x)/x - s(x)| < 2**-122.1
+ *
+ * See ../ld80/k_cosl.c for more details about the polynomial.
+ */
+static const long double
+S1 = -0.16666666666666666666666666666666666606732416116558L,
+S2 = 0.0083333333333333333333333333333331135404851288270047L,
+S3 = -0.00019841269841269841269841269839935785325638310428717L,
+S4 = 0.27557319223985890652557316053039946268333231205686e-5L,
+S5 = -0.25052108385441718775048214826384312253862930064745e-7L,
+S6 = 0.16059043836821614596571832194524392581082444805729e-9L,
+S7 = -0.76471637318198151807063387954939213287488216303768e-12L,
+S8 = 0.28114572543451292625024967174638477283187397621303e-14L;
+
+static const double
+S9 = -0.82206352458348947812512122163446202498005154296863e-17,
+S10 = 0.19572940011906109418080609928334380560135358385256e-19,
+S11 = -0.38680813379701966970673724299207480965452616911420e-22,
+S12 = 0.64038150078671872796678569586315881020659912139412e-25;
+
+long double
+__kernel_sinl(long double x, long double y, int iy)
+{
+ long double z,r,v;
+
+ z = x*x;
+ v = z*x;
+ r = S2+z*(S3+z*(S4+z*(S5+z*(S6+z*(S7+z*(S8+
+ z*(S9+z*(S10+z*(S11+z*S12)))))))));
+ if(iy==0) return x+v*(S1+z*r);
+ else return x-((z*(half*y-v*r)-y)-v*S1);
+}
diff --git a/newlib/libm/ld128/s_erfl.c b/newlib/libm/ld128/s_erfl.c
new file mode 100644
index 000000000..e29c9691f
--- /dev/null
+++ b/newlib/libm/ld128/s_erfl.c
@@ -0,0 +1,329 @@
+/* @(#)s_erf.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * See s_erf.c for complete comments.
+ *
+ * Converted to long double by Steven G. Kargl.
+ */
+#include <float.h>
+
+#include "fpmath.h"
+#include "math.h"
+#include "math_private.h"
+
+/* XXX Prevent compilers from erroneously constant folding these: */
+static const volatile long double tiny = 0x1p-10000L;
+
+static const double
+half= 0.5,
+one = 1,
+two = 2;
+/*
+ * In the domain [0, 2**-40], only the first term in the power series
+ * expansion of erf(x) is used. The magnitude of the first neglected
+ * terms is less than 2**-120.
+ */
+static const long double
+efx = 1.28379167095512573896158903121545167e-01L, /* 0xecbff6a7, 0x481dd788, 0xb64d21a8, 0xeb06fc3f */
+efx8 = 1.02703333676410059116927122497236133e+00L, /* 0xecbff6a7, 0x481dd788, 0xb64d21a8, 0xeb06ff3f */
+/*
+ * Domain [0, 0.84375], range ~[-1.919e-38, 1.919e-38]:
+ * |(erf(x) - x)/x - pp(x)/qq(x)| < 2**-125.29
+ */
+pp0 = 1.28379167095512573896158903121545167e-01L, /* 0x3ffc06eb, 0xa8214db6, 0x88d71d48, 0xa7f6bfec */
+pp1 = -3.14931554396568573802046931159683404e-01L, /* 0xbffd427d, 0x6ada7263, 0x547eb096, 0x95f37463 */
+pp2 = -5.27514920282183487103576956956725309e-02L, /* 0xbffab023, 0xe5a271e3, 0xb0e79b01, 0x2f7ac962 */
+pp3 = -1.13202828509005281355609495523452713e-02L, /* 0xbff872f1, 0x6a5023a1, 0xe08b3884, 0x326af20f */
+pp4 = -9.18626155872522453865998391206048506e-04L, /* 0xbff4e19f, 0xea5fb024, 0x43247a37, 0xe430b06c */
+pp5 = -7.87518862406176274922506447157284230e-05L, /* 0xbff14a4f, 0x31a85fe0, 0x7fff2204, 0x09c49b37 */
+pp6 = -3.42357944472240436548115331090560881e-06L, /* 0xbfeccb81, 0x4b43c336, 0xcd2eb6c2, 0x903f2d87 */
+pp7 = -1.37317432573890412634717890726745428e-07L, /* 0xbfe826e3, 0x0e915eb6, 0x42aee414, 0xf7e36805 */
+pp8 = -2.71115170113861755855049008732113726e-09L, /* 0xbfe2749e, 0x2b94fd00, 0xecb4d166, 0x0efb91f8 */
+pp9 = -3.37925756196555959454018189718117864e-11L, /* 0xbfdc293e, 0x1d9060cb, 0xd043204a, 0x314cd7f0 */
+qq1 = 4.76672625471551170489978555182449450e-01L, /* 0x3ffde81c, 0xde6531f0, 0x76803bee, 0x526e29e9 */
+qq2 = 1.06713144672281502058807525850732240e-01L, /* 0x3ffbb518, 0xd7a6bb74, 0xcd9bdd33, 0x7601eee5 */
+qq3 = 1.47747613127513761102189201923147490e-02L, /* 0x3ff8e423, 0xae527e18, 0xf12cb447, 0x723b4749 */
+qq4 = 1.39939377672028671891148770908874816e-03L, /* 0x3ff56ed7, 0xba055d84, 0xc21b45c4, 0x388d1812 */
+qq5 = 9.44302939359455241271983309378738276e-05L, /* 0x3ff18c11, 0xc18c99a4, 0x86d0fe09, 0x46387b4c */
+qq6 = 4.56199342312522842161301671745365650e-06L, /* 0x3fed3226, 0x73421d05, 0x08875300, 0x32fa1432 */
+qq7 = 1.53019260483764773845294600092361197e-07L, /* 0x3fe8489b, 0x3a63f627, 0x2b9ad2ce, 0x26516e57 */
+qq8 = 3.25542691121324805094777901250005508e-09L, /* 0x3fe2bf6c, 0x26d93a29, 0x9142be7c, 0x9f1dd043 */
+qq9 = 3.37405581964478060434410167262684979e-11L; /* 0x3fdc28c8, 0xfb8fa1be, 0x10e57eec, 0xaa19e49f */
+
+static const long double
+erx = 8.42700792949714894142232424201210961e-01L, /* 0x3ffeaf76, 0x7a741088, 0xb0000000, 0x00000000 */
+/*
+ * Domain [0.84375, 1.25], range ~[-2.521e-36, 2.523e-36]:
+ * |(erf(x) - erx) - pa(x)/qa(x)| < 2**-120.15
+ */
+pa0 = -2.48010117891186017024438233323795897e-17L, /* 0xbfc7c97f, 0x77812279, 0x6c877f22, 0xef4bfb2e */
+pa1 = 4.15107497420594680894327969504526489e-01L, /* 0x3ffda911, 0xf096fbc2, 0x55662005, 0x2337fa64 */
+pa2 = -3.94180628087084846724448515851892609e-02L, /* 0xbffa42e9, 0xab54528c, 0xad529da1, 0x6efc2af3 */
+pa3 = 4.48897599625192107295954790681677462e-02L, /* 0x3ffa6fbc, 0xa65edba1, 0x0e4cbcea, 0x73ef9a31 */
+pa4 = 8.02069252143016600110972019232995528e-02L, /* 0x3ffb4887, 0x0e8b548e, 0x3230b417, 0x11b553b3 */
+pa5 = -1.02729816533435279443621120242391295e-02L, /* 0xbff850a0, 0x041de3ee, 0xd5bca6c9, 0x4ef5f9f2 */
+pa6 = 5.70777694530755634864821094419982095e-03L, /* 0x3ff77610, 0x9b501e10, 0x4c978382, 0x742df68f */
+pa7 = 1.22635150233075521018231779267077071e-03L, /* 0x3ff5417b, 0x0e623682, 0x60327da0, 0x96b9219e */
+pa8 = 5.36100234820204569428412542856666503e-04L, /* 0x3ff41912, 0x27ceb4c1, 0x1d3298ec, 0x84ced627 */
+pa9 = -1.97753571846365167177187858667583165e-04L, /* 0xbff29eb8, 0x23f5bcf3, 0x15c83c46, 0xe4fda98b */
+pa10 = 6.19333039900846970674794789568415105e-05L, /* 0x3ff103c4, 0x60f88e46, 0xc0c9fb02, 0x13cc7fc1 */
+pa11 = -5.40531400436645861492290270311751349e-06L, /* 0xbfed6abe, 0x9665f8a8, 0xdd0ad3ba, 0xe5dc0ee3 */
+qa1 = 9.05041313265490487793231810291907851e-01L, /* 0x3ffecf61, 0x93340222, 0xe9930620, 0xc4e61168 */
+qa2 = 6.79848064708886864767240880834868092e-01L, /* 0x3ffe5c15, 0x0ba858dc, 0xf7900ae9, 0xfea1e09a */
+qa3 = 4.04720609926471677581066689316516445e-01L, /* 0x3ffd9e6f, 0x145e9b00, 0x6d8c1749, 0xd2928623 */
+qa4 = 1.69183273898369996364661075664302225e-01L, /* 0x3ffc5a7c, 0xc2a363c1, 0xd6c19097, 0xef9b4063 */
+qa5 = 7.44476185988067992342479750486764248e-02L, /* 0x3ffb30ef, 0xfc7259ef, 0x1bcbb089, 0x686dd62d */
+qa6 = 2.02981172725892407200420389604788573e-02L, /* 0x3ff94c90, 0x7976cb0e, 0x21e1d36b, 0x0f09ca2b */
+qa7 = 6.94281866271607668268269403102277234e-03L, /* 0x3ff7c701, 0x2b193250, 0xc5d46ecc, 0x374843d8 */
+qa8 = 1.12952275469171559611651594706820034e-03L, /* 0x3ff52818, 0xfd2a7c06, 0xd13e38fd, 0xda4b34f5 */
+qa9 = 3.13736683241992737197226578597710179e-04L, /* 0x3ff348fa, 0x0cb48d18, 0x051f849b, 0x135ccf74 */
+qa10 = 1.17037675204033225470121134087771410e-05L, /* 0x3fee88b6, 0x98f47704, 0xa5d8f8f2, 0xc6422e11 */
+qa11 = 4.61312518293853991439362806880973592e-06L, /* 0x3fed3594, 0xe31db94f, 0x3592b693, 0xed4386b4 */
+qa12 = -1.02158572037456893687737553657431771e-06L; /* 0xbfeb123a, 0xd60d9b1e, 0x1f6fdeb9, 0x7dc8410a */
+/*
+ * Domain [1.25,2.85715], range ~[-2.922e-37,2.922e-37]:
+ * |log(x*erfc(x)) + x**2 + 0.5625 - ra(x)/sa(x)| < 2**-121.36
+ */
+static const long double
+ra0 = -9.86494292470069009555706994426014461e-03L, /* 0xbff84341, 0x239e8709, 0xe941b06a, 0xcb4b6ec5 */
+ra1 = -1.13580436992565640457579040117568870e+00L, /* 0xbfff22c4, 0x133f7c0d, 0x72d5e231, 0x2eb1ee3f */
+ra2 = -4.89744330295291950661185707066921755e+01L, /* 0xc00487cb, 0xa38b4fc2, 0xc136695b, 0xc1df8047 */
+ra3 = -1.10766149300215937173768072715352140e+03L, /* 0xc00914ea, 0x55e6beb3, 0xabc50e07, 0xb6e5664d */
+ra4 = -1.49991031232170934967642795601952100e+04L, /* 0xc00cd4b8, 0xd33243e6, 0xffbf6545, 0x3c57ef6e */
+ra5 = -1.29805749738318462882524181556996692e+05L, /* 0xc00ffb0d, 0xbfeed9b6, 0x5b2a3ff4, 0xe245bd3c */
+ra6 = -7.42828497044940065828871976644647850e+05L, /* 0xc0126ab5, 0x8fe7caca, 0x473352d9, 0xcd4e0c90 */
+ra7 = -2.85637299581890734287995171242421106e+06L, /* 0xc0145cad, 0xa7f76fe7, 0x3e358051, 0x1799f927 */
+ra8 = -7.40674797129824999383748865571026084e+06L, /* 0xc015c412, 0x6fe29c02, 0x298ad158, 0x7d24e45c */
+ra9 = -1.28653420911930973914078724204151759e+07L, /* 0xc016889e, 0x7c2eb0dc, 0x95d5863b, 0x0aa34dc3 */
+ra10 = -1.47198163599330179552932489109452638e+07L, /* 0xc016c136, 0x90b84923, 0xf9bcb497, 0x19bbd0f5 */
+ra11 = -1.07812992258382800318665248311522624e+07L, /* 0xc0164904, 0xe673a113, 0x35d7f079, 0xe13701f3 */
+ra12 = -4.83545565681708642630419905537756076e+06L, /* 0xc0152721, 0xfea094a8, 0x869eb39d, 0x413d6f13 */
+ra13 = -1.23956521201673964822976917356685286e+06L, /* 0xc0132ea0, 0xd3646baa, 0x2fe62b0d, 0xbae5ce85 */
+ra14 = -1.62289333553652417591275333240371812e+05L, /* 0xc0103cf8, 0xaab1e2d6, 0x4c25e014, 0x248d76ab */
+ra15 = -8.82890392601176969729168894389833110e+03L, /* 0xc00c13e7, 0x3b3d8f94, 0x6fbda6f6, 0xe7049a82 */
+ra16 = -1.22591866337261720023681535568334619e+02L, /* 0xc005ea5e, 0x12358891, 0xcfa712c5, 0x77f050d4 */
+sa1 = 6.44508918884710829371852723353794047e+01L, /* 0x400501cd, 0xb69a6c0f, 0x5716de14, 0x47161af6 */
+sa2 = 1.76118475473171481523704824327358534e+03L, /* 0x4009b84b, 0xd305829f, 0xc4c771b0, 0xbf1f7f9b */
+sa3 = 2.69448346969488374857087646131950188e+04L, /* 0x400da503, 0x56bacc05, 0x4fdba68d, 0x2cca27e6 */
+sa4 = 2.56826633369941456778326497384543763e+05L, /* 0x4010f59d, 0x51124428, 0x69c41de6, 0xbd0d5753 */
+sa5 = 1.60647413092257206847700054645905859e+06L, /* 0x40138834, 0xa2184244, 0x557a1bed, 0x68c9d556 */
+sa6 = 6.76963075165099718574753447122393797e+06L, /* 0x40159d2f, 0x7b01b0cc, 0x8bac9e95, 0x5d35d56e */
+sa7 = 1.94295690905361884290986932493647741e+07L, /* 0x40172878, 0xc1172d61, 0x3068501e, 0x2f3c71da */
+sa8 = 3.79774781017759149060839255547073541e+07L, /* 0x401821be, 0xc30d06fe, 0x410563d7, 0x032111fd */
+sa9 = 5.00659831846029484248302236457727397e+07L, /* 0x40187df9, 0x1f97a111, 0xc51d6ac2, 0x4b389793 */
+sa10 = 4.36486287620506484276130525941972541e+07L, /* 0x40184d03, 0x3a618ae0, 0x2a723357, 0xfa45c60a */
+sa11 = 2.43779678791333894255510508253951934e+07L, /* 0x401773fa, 0x6fe10ee2, 0xc467850d, 0xc6b7ff30 */
+sa12 = 8.30732360384443202039372372212966542e+06L, /* 0x4015fb09, 0xee6a5631, 0xdd98de7e, 0x8b00461a */
+sa13 = 1.60160846942050515734192397495105693e+06L, /* 0x40138704, 0x8782bf13, 0x5b8fb315, 0xa898abe5 */
+sa14 = 1.54255505242533291014555153757001825e+05L, /* 0x40102d47, 0xc0abc98e, 0x843c9490, 0xb4352440 */
+sa15 = 5.87949220002375547561467275493888824e+03L, /* 0x400b6f77, 0xe00d21d1, 0xec4d41e8, 0x2f8e1673 */
+sa16 = 4.97272976346793193860385983372237710e+01L; /* 0x40048dd1, 0x816c1b3f, 0x24f540a6, 0x4cfe03cc */
+/*
+ * Domain [2.85715,9], range ~[-7.886e-37,7.918e-37]:
+ * |log(x*erfc(x)) + x**2 + 0.5625 - rb(x)/sb(x)| < 2**-120
+ */
+static const long double
+rb0 = -9.86494292470008707171371994479162369e-3L, /* 0xbff84341, 0x239e86f4, 0x2f57e561, 0xf4469360 */
+rb1 = -1.57047326624110727986326503729442830L, /* 0xbfff920a, 0x8935bf73, 0x8803b894, 0x4656482d */
+rb2 = -1.03228196364885474342132255440317065e2L, /* 0xc0059ce9, 0xac4ed0ff, 0x2cff0ff7, 0x5e70d1ab */
+rb3 = -3.74000570653418227179358710865224376e3L, /* 0xc00ad380, 0x2ebf7835, 0xf6b07ed2, 0x861242f7 */
+rb4 = -8.35435477739098044190860390632813956e4L, /* 0xc00f4657, 0x8c3ae934, 0x3647d7b3, 0x80e76fb7 */
+rb5 = -1.21398672055223642118716640216747152e6L, /* 0xc0132862, 0x2b8761c8, 0x27d18c0f, 0x137c9463 */
+rb6 = -1.17669175877248796101665344873273970e7L, /* 0xc0166719, 0x0b2cea46, 0x81f14174, 0x11602ea5 */
+rb7 = -7.66108006086998253606773064264599615e7L, /* 0xc019243f, 0x3c26f4f0, 0x1cc05241, 0x3b953728 */
+rb8 = -3.32547117558141845968704725353130804e8L, /* 0xc01b3d24, 0x42d8ee26, 0x24ef6f3b, 0x604a8c65 */
+rb9 = -9.41561252426350696802167711221739746e8L, /* 0xc01cc0f8, 0xad23692a, 0x8ddb2310, 0xe9937145 */
+rb10 = -1.67157110805390944549427329626281063e9L, /* 0xc01d8e88, 0x9a903734, 0x09a55fa3, 0xd205c903 */
+rb11 = -1.74339631004410841337645931421427373e9L, /* 0xc01d9fa8, 0x77582d2a, 0xc183b8ab, 0x7e00cb05 */
+rb12 = -9.57655233596934915727573141357471703e8L, /* 0xc01cc8a5, 0x460cc685, 0xd0271fa0, 0x6a70e3da */
+rb13 = -2.26320062731339353035254704082495066e8L, /* 0xc01aafab, 0xd7d76721, 0xc9720e11, 0x6a8bd489 */
+rb14 = -1.42777302996263256686002973851837039e7L, /* 0xc016b3b8, 0xc499689f, 0x2b88d965, 0xc32414f9 */
+sb1 = 1.08512869705594540211033733976348506e2L, /* 0x4005b20d, 0x2db7528d, 0x00d20dcb, 0x858f6191 */
+sb2 = 5.02757713761390460534494530537572834e3L, /* 0x400b3a39, 0x3bf4a690, 0x3025d28d, 0xfd40a891 */
+sb3 = 1.31019107205412870059331647078328430e5L, /* 0x400fffcb, 0x1b71d05e, 0x3b28361d, 0x2a3c3690 */
+sb4 = 2.13021555152296846166736757455018030e6L, /* 0x40140409, 0x3c6984df, 0xc4491d7c, 0xb04aa08d */
+sb5 = 2.26649105281820861953868568619768286e7L, /* 0x401759d6, 0xce8736f0, 0xf28ad037, 0x2a901e0c */
+sb6 = 1.61071939490875921812318684143076081e8L, /* 0x401a3338, 0x686fb541, 0x6bd27d06, 0x4f95c9ac */
+sb7 = 7.66895673844301852676056750497991966e8L, /* 0x401c6daf, 0x31cec121, 0x54699126, 0x4bd9bf9e */
+sb8 = 2.41884450436101936436023058196042526e9L, /* 0x401e2059, 0x46b0b8d7, 0x87b64cbf, 0x78bc296d */
+sb9 = 4.92403055884071695093305291535107666e9L, /* 0x401f257e, 0xbe5ed739, 0x39e17346, 0xcadd2e55 */
+sb10 = 6.18627786365587486459633615573786416e9L, /* 0x401f70bb, 0x1be7a7e7, 0x6a45b5ae, 0x607c70f0 */
+sb11 = 4.45898013426501378097430226324743199e9L, /* 0x401f09c6, 0xa32643d7, 0xf1724620, 0x9ea46c32 */
+sb12 = 1.63006115763329848117160344854224975e9L, /* 0x401d84a3, 0x0996887f, 0x65a4f43b, 0x978c1d74 */
+sb13 = 2.39216717012421697446304015847567721e8L, /* 0x401ac845, 0x09a065c2, 0x30095da7, 0x9d72d6ae */
+sb14 = 7.84837329009278694937250358810225609e6L; /* 0x4015df06, 0xd5290e15, 0x63031fac, 0x4d9c894c */
+/*
+ * Domain [9,108], range ~[-5.324e-38,5.340e-38]:
+ * |log(x*erfc(x)) + x**2 + 0.5625 - r(x)/s(x)| < 2**-124
+ */
+static const long double
+rc0 = -9.86494292470008707171367567652935673e-3L, /* 0xbff84341, 0x239e86f4, 0x2f57e55b, 0x1aa10fd3 */
+rc1 = -1.26229447747315096406518846411562266L, /* 0xbfff4325, 0xbb1aab28, 0xda395cd9, 0xfb861c15 */
+rc2 = -6.13742634438922591780742637728666162e1L, /* 0xc004eafe, 0x7dd51cd8, 0x3c7c5928, 0x751e50cf */
+rc3 = -1.50455835478908280402912854338421517e3L, /* 0xc0097823, 0xbc15b9ab, 0x3d60745c, 0x523e80a5 */
+rc4 = -2.04415631865861549920184039902945685e4L, /* 0xc00d3f66, 0x40b3fc04, 0x5388f2ec, 0xb009e1f0 */
+rc5 = -1.57625662981714582753490610560037638e5L, /* 0xc01033dc, 0xd4dc95b6, 0xfd4da93b, 0xf355b4a9 */
+rc6 = -6.73473451616752528402917538033283794e5L, /* 0xc01248d8, 0x2e73a4f9, 0xcded49c5, 0xfa3bfeb7 */
+rc7 = -1.47433165421387483167186683764364857e6L, /* 0xc01367f1, 0xba77a8f7, 0xcfdd0dbb, 0x25d554b3 */
+rc8 = -1.38811981807868828563794929997744139e6L, /* 0xc01352e5, 0x7d16d9ad, 0xbbdcbf38, 0x38fbc5ea */
+rc9 = -3.59659700530831825640766479698155060e5L, /* 0xc0115f3a, 0xecd57f45, 0x21f8ad6c, 0x910a5958 */
+sc1 = 7.72730753022908298637508998072635696e1L, /* 0x40053517, 0xa10d52bc, 0xdabb55b6, 0xbd0328cd */
+sc2 = 2.36825757341694050500333261769082182e3L, /* 0x400a2808, 0x3e0a9b42, 0x82977842, 0x9c5de29e */
+sc3 = 3.72210540173034735352888847134073099e4L, /* 0x400e22ca, 0x1ba827ef, 0xac8390d7, 0x1fc39a41 */
+sc4 = 3.24136032646418336712461033591393412e5L, /* 0x40113c8a, 0x0216e100, 0xc59d1e44, 0xf0e68d9d */
+sc5 = 1.57836135851134393802505823370009175e6L, /* 0x40138157, 0x95bc7664, 0x17575961, 0xdbe58eeb */
+sc6 = 4.12881981392063738026679089714182355e6L, /* 0x4014f801, 0x9e82e8d2, 0xb8b3a70e, 0xfd84185d */
+sc7 = 5.24438427289213488410596395361544142e6L, /* 0x40154017, 0x81177109, 0x2aa6c3b0, 0x1f106625 */
+sc8 = 2.59909544563616121735963429710382149e6L, /* 0x40143d45, 0xbb90a9b1, 0x12bf9390, 0xa827a700 */
+sc9 = 2.80930665169282501639651995082335693e5L; /* 0x40111258, 0xaa92222e, 0xa97e3216, 0xa237fa6c */
+
+long double
+erfl(long double x)
+{
+ long double ax,R,S,P,Q,s,y,z,r;
+ uint64_t lx, llx;
+ int32_t i;
+ uint16_t hx;
+
+ EXTRACT_LDBL128_WORDS(hx, lx, llx, x);
+
+ if((hx & 0x7fff) == 0x7fff) { /* erfl(nan)=nan */
+ i = (hx>>15)<<1;
+ return (1-i)+one/x; /* erfl(+-inf)=+-1 */
+ }
+
+ ax = fabsl(x);
+ if(ax < 0.84375) {
+ if(ax < 0x1p-40L) {
+ if(ax < 0x1p-16373L)
+ return (8*x+efx8*x)/8; /* avoid spurious underflow */
+ return x + efx*x;
+ }
+ z = x*x;
+ r = pp0+z*(pp1+z*(pp2+z*(pp3+z*(pp4+z*(pp5+z*(pp6+z*(pp7+
+ z*(pp8+z*pp9))))))));
+ s = one+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*(qq5+z*(qq6+z*(qq7+
+ z*(qq8+z*qq9))))))));
+ y = r/s;
+ return x + x*y;
+ }
+ if(ax < 1.25) {
+ s = ax-one;
+ P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*(pa6+s*(pa7+
+ s*(pa8+s*(pa9+s*(pa10+s*pa11))))))))));
+ Q = one+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*(qa6+s*(qa7+
+ s*(qa8+s*(qa9+s*(qa10+s*(qa11+s*qa12)))))))))));
+ if(x>=0) return (erx + P/Q); else return (-erx - P/Q);
+ }
+ if (ax >= 9) { /* inf>|x|>= 9 */
+ if(x>=0) return (one-tiny); else return (tiny-one);
+ }
+ s = one/(ax*ax);
+ if(ax < 2.85715) { /* |x| < 2.85715 */
+ R=ra0+s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*(ra5+s*(ra6+s*(ra7+
+ s*(ra8+s*(ra9+s*(ra10+s*(ra11+s*(ra12+s*(ra13+s*(ra14+
+ s*(ra15+s*ra16)))))))))))))));
+ S=one+s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*(sa5+s*(sa6+s*(sa7+
+ s*(sa8+s*(sa9+s*(sa10+s*(sa11+s*(sa12+s*(sa13+s*(sa14+
+ s*(sa15+s*sa16)))))))))))))));
+ } else { /* |x| >= 2.85715 */
+ R=rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*(rb5+s*(rb6+s*(rb7+
+ s*(rb8+s*(rb9+s*(rb10+s*(rb11+s*(rb12+s*(rb13+
+ s*rb14)))))))))))));
+ S=one+s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*(sb5+s*(sb6+s*(sb7+
+ s*(sb8+s*(sb9+s*(sb10+s*(sb11+s*(sb12+s*(sb13+
+ s*sb14)))))))))))));
+ }
+ z = (float)ax;
+ r = expl(-z*z-0.5625)*expl((z-ax)*(z+ax)+R/S);
+ if(x>=0) return (one-r/ax); else return (r/ax-one);
+}
+
+long double
+erfcl(long double x)
+{
+ long double ax,R,S,P,Q,s,y,z,r;
+ uint64_t lx, llx;
+ uint16_t hx;
+
+ EXTRACT_LDBL128_WORDS(hx, lx, llx, x);
+
+ if((hx & 0x7fff) == 0x7fff) { /* erfcl(nan)=nan */
+ /* erfcl(+-inf)=0,2 */
+ return ((hx>>15)<<1)+one/x;
+ }
+
+ ax = fabsl(x);
+ if(ax < 0.84375L) {
+ if(ax < 0x1p-34L)
+ return one-x;
+ z = x*x;
+ r = pp0+z*(pp1+z*(pp2+z*(pp3+z*(pp4+z*(pp5+z*(pp6+z*(pp7+
+ z*(pp8+z*pp9))))))));
+ s = one+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*(qq5+z*(qq6+z*(qq7+
+ z*(qq8+z*qq9))))))));
+ y = r/s;
+ if(ax < 0.25L) { /* x<1/4 */
+ return one-(x+x*y);
+ } else {
+ r = x*y;
+ r += (x-half);
+ return half - r;
+ }
+ }
+ if(ax < 1.25L) {
+ s = ax-one;
+ P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*(pa6+s*(pa7+
+ s*(pa8+s*(pa9+s*(pa10+s*pa11))))))))));
+ Q = one+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*(qa6+s*(qa7+
+ s*(qa8+s*(qa9+s*(qa10+s*(qa11+s*qa12)))))))))));
+ if(x>=0) {
+ z = one-erx; return z - P/Q;
+ } else {
+ z = erx+P/Q; return one+z;
+ }
+ }
+
+ if(ax < 108) { /* |x| < 108 */
+ s = one/(ax*ax);
+ if(ax < 2.85715) { /* |x| < 2.85715 */
+ R=ra0+s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*(ra5+s*(ra6+s*(ra7+
+ s*(ra8+s*(ra9+s*(ra10+s*(ra11+s*(ra12+s*(ra13+s*(ra14+
+ s*(ra15+s*ra16)))))))))))))));
+ S=one+s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*(sa5+s*(sa6+s*(sa7+
+ s*(sa8+s*(sa9+s*(sa10+s*(sa11+s*(sa12+s*(sa13+s*(sa14+
+ s*(sa15+s*sa16)))))))))))))));
+ } else if(ax < 9) {
+ R=rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*(rb5+s*(rb6+s*(rb7+
+ s*(rb8+s*(rb9+s*(rb10+s*(rb11+s*(rb12+s*(rb13+
+ s*rb14)))))))))))));
+ S=one+s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*(sb5+s*(sb6+s*(sb7+
+ s*(sb8+s*(sb9+s*(sb10+s*(sb11+s*(sb12+s*(sb13+
+ s*sb14)))))))))))));
+ } else {
+ if(x < -9) return two-tiny; /* x < -9 */
+ R=rc0+s*(rc1+s*(rc2+s*(rc3+s*(rc4+s*(rc5+s*(rc6+s*(rc7+
+ s*(rc8+s*rc9))))))));
+ S=one+s*(sc1+s*(sc2+s*(sc3+s*(sc4+s*(sc5+s*(sc6+s*(sc7+
+ s*(sc8+s*sc9))))))));
+ }
+ z = (float)ax;
+ r = expl(-z*z-0.5625)*expl((z-ax)*(z+ax)+R/S);
+ if(x>0) return r/ax; else return two-r/ax;
+ } else {
+ if(x>0) return tiny*tiny; else return two-tiny;
+ }
+}
diff --git a/newlib/libm/ld128/s_exp2l.c b/newlib/libm/ld128/s_exp2l.c
new file mode 100644
index 000000000..ee3d2c782
--- /dev/null
+++ b/newlib/libm/ld128/s_exp2l.c
@@ -0,0 +1,429 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2005-2008 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <float.h>
+#include <stdint.h>
+
+#include "fpmath.h"
+#include "math.h"
+
+#define TBLBITS 7
+#define TBLSIZE (1 << TBLBITS)
+
+#define BIAS (LDBL_MAX_EXP - 1)
+#define EXPMASK (BIAS + LDBL_MAX_EXP)
+
+static volatile long double
+ huge = 0x1p10000L,
+ twom10000 = 0x1p-10000L;
+
+static const long double
+ P1 = 0x1.62e42fefa39ef35793c7673007e6p-1L,
+ P2 = 0x1.ebfbdff82c58ea86f16b06ec9736p-3L,
+ P3 = 0x1.c6b08d704a0bf8b33a762bad3459p-5L,
+ P4 = 0x1.3b2ab6fba4e7729ccbbe0b4f3fc2p-7L,
+ P5 = 0x1.5d87fe78a67311071dee13fd11d9p-10L,
+ P6 = 0x1.430912f86c7876f4b663b23c5fe5p-13L;
+
+static const double
+ P7 = 0x1.ffcbfc588b041p-17,
+ P8 = 0x1.62c0223a5c7c7p-20,
+ P9 = 0x1.b52541ff59713p-24,
+ P10 = 0x1.e4cf56a391e22p-28,
+ redux = 0x1.8p112 / TBLSIZE;
+
+static const long double tbl[TBLSIZE] = {
+ 0x1.6a09e667f3bcc908b2fb1366dfeap-1L,
+ 0x1.6c012750bdabeed76a99800f4edep-1L,
+ 0x1.6dfb23c651a2ef220e2cbe1bc0d4p-1L,
+ 0x1.6ff7df9519483cf87e1b4f3e1e98p-1L,
+ 0x1.71f75e8ec5f73dd2370f2ef0b148p-1L,
+ 0x1.73f9a48a58173bd5c9a4e68ab074p-1L,
+ 0x1.75feb564267c8bf6e9aa33a489a8p-1L,
+ 0x1.780694fde5d3f619ae02808592a4p-1L,
+ 0x1.7a11473eb0186d7d51023f6ccb1ap-1L,
+ 0x1.7c1ed0130c1327c49334459378dep-1L,
+ 0x1.7e2f336cf4e62105d02ba1579756p-1L,
+ 0x1.80427543e1a11b60de67649a3842p-1L,
+ 0x1.82589994cce128acf88afab34928p-1L,
+ 0x1.8471a4623c7acce52f6b97c6444cp-1L,
+ 0x1.868d99b4492ec80e41d90ac2556ap-1L,
+ 0x1.88ac7d98a669966530bcdf2d4cc0p-1L,
+ 0x1.8ace5422aa0db5ba7c55a192c648p-1L,
+ 0x1.8cf3216b5448bef2aa1cd161c57ap-1L,
+ 0x1.8f1ae991577362b982745c72eddap-1L,
+ 0x1.9145b0b91ffc588a61b469f6b6a0p-1L,
+ 0x1.93737b0cdc5e4f4501c3f2540ae8p-1L,
+ 0x1.95a44cbc8520ee9b483695a0e7fep-1L,
+ 0x1.97d829fde4e4f8b9e920f91e8eb6p-1L,
+ 0x1.9a0f170ca07b9ba3109b8c467844p-1L,
+ 0x1.9c49182a3f0901c7c46b071f28dep-1L,
+ 0x1.9e86319e323231824ca78e64c462p-1L,
+ 0x1.a0c667b5de564b29ada8b8cabbacp-1L,
+ 0x1.a309bec4a2d3358c171f770db1f4p-1L,
+ 0x1.a5503b23e255c8b424491caf88ccp-1L,
+ 0x1.a799e1330b3586f2dfb2b158f31ep-1L,
+ 0x1.a9e6b5579fdbf43eb243bdff53a2p-1L,
+ 0x1.ac36bbfd3f379c0db966a3126988p-1L,
+ 0x1.ae89f995ad3ad5e8734d17731c80p-1L,
+ 0x1.b0e07298db66590842acdfc6fb4ep-1L,
+ 0x1.b33a2b84f15faf6bfd0e7bd941b0p-1L,
+ 0x1.b59728de559398e3881111648738p-1L,
+ 0x1.b7f76f2fb5e46eaa7b081ab53ff6p-1L,
+ 0x1.ba5b030a10649840cb3c6af5b74cp-1L,
+ 0x1.bcc1e904bc1d2247ba0f45b3d06cp-1L,
+ 0x1.bf2c25bd71e088408d7025190cd0p-1L,
+ 0x1.c199bdd85529c2220cb12a0916bap-1L,
+ 0x1.c40ab5fffd07a6d14df820f17deap-1L,
+ 0x1.c67f12e57d14b4a2137fd20f2a26p-1L,
+ 0x1.c8f6d9406e7b511acbc48805c3f6p-1L,
+ 0x1.cb720dcef90691503cbd1e949d0ap-1L,
+ 0x1.cdf0b555dc3f9c44f8958fac4f12p-1L,
+ 0x1.d072d4a07897b8d0f22f21a13792p-1L,
+ 0x1.d2f87080d89f18ade123989ea50ep-1L,
+ 0x1.d5818dcfba48725da05aeb66dff8p-1L,
+ 0x1.d80e316c98397bb84f9d048807a0p-1L,
+ 0x1.da9e603db3285708c01a5b6d480cp-1L,
+ 0x1.dd321f301b4604b695de3c0630c0p-1L,
+ 0x1.dfc97337b9b5eb968cac39ed284cp-1L,
+ 0x1.e264614f5a128a12761fa17adc74p-1L,
+ 0x1.e502ee78b3ff6273d130153992d0p-1L,
+ 0x1.e7a51fbc74c834b548b2832378a4p-1L,
+ 0x1.ea4afa2a490d9858f73a18f5dab4p-1L,
+ 0x1.ecf482d8e67f08db0312fb949d50p-1L,
+ 0x1.efa1bee615a27771fd21a92dabb6p-1L,
+ 0x1.f252b376bba974e8696fc3638f24p-1L,
+ 0x1.f50765b6e4540674f84b762861a6p-1L,
+ 0x1.f7bfdad9cbe138913b4bfe72bd78p-1L,
+ 0x1.fa7c1819e90d82e90a7e74b26360p-1L,
+ 0x1.fd3c22b8f71f10975ba4b32bd006p-1L,
+ 0x1.0000000000000000000000000000p+0L,
+ 0x1.0163da9fb33356d84a66ae336e98p+0L,
+ 0x1.02c9a3e778060ee6f7caca4f7a18p+0L,
+ 0x1.04315e86e7f84bd738f9a20da442p+0L,
+ 0x1.059b0d31585743ae7c548eb68c6ap+0L,
+ 0x1.0706b29ddf6ddc6dc403a9d87b1ep+0L,
+ 0x1.0874518759bc808c35f25d942856p+0L,
+ 0x1.09e3ecac6f3834521e060c584d5cp+0L,
+ 0x1.0b5586cf9890f6298b92b7184200p+0L,
+ 0x1.0cc922b7247f7407b705b893dbdep+0L,
+ 0x1.0e3ec32d3d1a2020742e4f8af794p+0L,
+ 0x1.0fb66affed31af232091dd8a169ep+0L,
+ 0x1.11301d0125b50a4ebbf1aed9321cp+0L,
+ 0x1.12abdc06c31cbfb92bad324d6f84p+0L,
+ 0x1.1429aaea92ddfb34101943b2588ep+0L,
+ 0x1.15a98c8a58e512480d573dd562aep+0L,
+ 0x1.172b83c7d517adcdf7c8c50eb162p+0L,
+ 0x1.18af9388c8de9bbbf70b9a3c269cp+0L,
+ 0x1.1a35beb6fcb753cb698f692d2038p+0L,
+ 0x1.1bbe084045cd39ab1e72b442810ep+0L,
+ 0x1.1d4873168b9aa7805b8028990be8p+0L,
+ 0x1.1ed5022fcd91cb8819ff61121fbep+0L,
+ 0x1.2063b88628cd63b8eeb0295093f6p+0L,
+ 0x1.21f49917ddc962552fd29294bc20p+0L,
+ 0x1.2387a6e75623866c1fadb1c159c0p+0L,
+ 0x1.251ce4fb2a63f3582ab7de9e9562p+0L,
+ 0x1.26b4565e27cdd257a673281d3068p+0L,
+ 0x1.284dfe1f5638096cf15cf03c9fa0p+0L,
+ 0x1.29e9df51fdee12c25d15f5a25022p+0L,
+ 0x1.2b87fd0dad98ffddea46538fca24p+0L,
+ 0x1.2d285a6e4030b40091d536d0733ep+0L,
+ 0x1.2ecafa93e2f5611ca0f45d5239a4p+0L,
+ 0x1.306fe0a31b7152de8d5a463063bep+0L,
+ 0x1.32170fc4cd8313539cf1c3009330p+0L,
+ 0x1.33c08b26416ff4c9c8610d96680ep+0L,
+ 0x1.356c55f929ff0c94623476373be4p+0L,
+ 0x1.371a7373aa9caa7145502f45452ap+0L,
+ 0x1.38cae6d05d86585a9cb0d9bed530p+0L,
+ 0x1.3a7db34e59ff6ea1bc9299e0a1fep+0L,
+ 0x1.3c32dc313a8e484001f228b58cf0p+0L,
+ 0x1.3dea64c12342235b41223e13d7eep+0L,
+ 0x1.3fa4504ac801ba0bf701aa417b9cp+0L,
+ 0x1.4160a21f72e29f84325b8f3dbacap+0L,
+ 0x1.431f5d950a896dc704439410b628p+0L,
+ 0x1.44e086061892d03136f409df0724p+0L,
+ 0x1.46a41ed1d005772512f459229f0ap+0L,
+ 0x1.486a2b5c13cd013c1a3b69062f26p+0L,
+ 0x1.4a32af0d7d3de672d8bcf46f99b4p+0L,
+ 0x1.4bfdad5362a271d4397afec42e36p+0L,
+ 0x1.4dcb299fddd0d63b36ef1a9e19dep+0L,
+ 0x1.4f9b2769d2ca6ad33d8b69aa0b8cp+0L,
+ 0x1.516daa2cf6641c112f52c84d6066p+0L,
+ 0x1.5342b569d4f81df0a83c49d86bf4p+0L,
+ 0x1.551a4ca5d920ec52ec620243540cp+0L,
+ 0x1.56f4736b527da66ecb004764e61ep+0L,
+ 0x1.58d12d497c7fd252bc2b7343d554p+0L,
+ 0x1.5ab07dd48542958c93015191e9a8p+0L,
+ 0x1.5c9268a5946b701c4b1b81697ed4p+0L,
+ 0x1.5e76f15ad21486e9be4c20399d12p+0L,
+ 0x1.605e1b976dc08b076f592a487066p+0L,
+ 0x1.6247eb03a5584b1f0fa06fd2d9eap+0L,
+ 0x1.6434634ccc31fc76f8714c4ee122p+0L,
+ 0x1.66238825522249127d9e29b92ea2p+0L,
+ 0x1.68155d44ca973081c57227b9f69ep+0L,
+};
+
+static const float eps[TBLSIZE] = {
+ -0x1.5c50p-101,
+ -0x1.5d00p-106,
+ 0x1.8e90p-102,
+ -0x1.5340p-103,
+ 0x1.1bd0p-102,
+ -0x1.4600p-105,
+ -0x1.7a40p-104,
+ 0x1.d590p-102,
+ -0x1.d590p-101,
+ 0x1.b100p-103,
+ -0x1.0d80p-105,
+ 0x1.6b00p-103,
+ -0x1.9f00p-105,
+ 0x1.c400p-103,
+ 0x1.e120p-103,
+ -0x1.c100p-104,
+ -0x1.9d20p-103,
+ 0x1.a800p-108,
+ 0x1.4c00p-106,
+ -0x1.9500p-106,
+ 0x1.6900p-105,
+ -0x1.29d0p-100,
+ 0x1.4c60p-103,
+ 0x1.13a0p-102,
+ -0x1.5b60p-103,
+ -0x1.1c40p-103,
+ 0x1.db80p-102,
+ 0x1.91a0p-102,
+ 0x1.dc00p-105,
+ 0x1.44c0p-104,
+ 0x1.9710p-102,
+ 0x1.8760p-103,
+ -0x1.a720p-103,
+ 0x1.ed20p-103,
+ -0x1.49c0p-102,
+ -0x1.e000p-111,
+ 0x1.86a0p-103,
+ 0x1.2b40p-103,
+ -0x1.b400p-108,
+ 0x1.1280p-99,
+ -0x1.02d8p-102,
+ -0x1.e3d0p-103,
+ -0x1.b080p-105,
+ -0x1.f100p-107,
+ -0x1.16c0p-105,
+ -0x1.1190p-103,
+ -0x1.a7d2p-100,
+ 0x1.3450p-103,
+ -0x1.67c0p-105,
+ 0x1.4b80p-104,
+ -0x1.c4e0p-103,
+ 0x1.6000p-108,
+ -0x1.3f60p-105,
+ 0x1.93f0p-104,
+ 0x1.5fe0p-105,
+ 0x1.6f80p-107,
+ -0x1.7600p-106,
+ 0x1.21e0p-106,
+ -0x1.3a40p-106,
+ -0x1.40c0p-104,
+ -0x1.9860p-105,
+ -0x1.5d40p-108,
+ -0x1.1d70p-106,
+ 0x1.2760p-105,
+ 0x0.0000p+0,
+ 0x1.21e2p-104,
+ -0x1.9520p-108,
+ -0x1.5720p-106,
+ -0x1.4810p-106,
+ -0x1.be00p-109,
+ 0x1.0080p-105,
+ -0x1.5780p-108,
+ -0x1.d460p-105,
+ -0x1.6140p-105,
+ 0x1.4630p-104,
+ 0x1.ad50p-103,
+ 0x1.82e0p-105,
+ 0x1.1d3cp-101,
+ 0x1.6100p-107,
+ 0x1.ec30p-104,
+ 0x1.f200p-108,
+ 0x1.0b40p-103,
+ 0x1.3660p-102,
+ 0x1.d9d0p-103,
+ -0x1.02d0p-102,
+ 0x1.b070p-103,
+ 0x1.b9c0p-104,
+ -0x1.01c0p-103,
+ -0x1.dfe0p-103,
+ 0x1.1b60p-104,
+ -0x1.ae94p-101,
+ -0x1.3340p-104,
+ 0x1.b3d8p-102,
+ -0x1.6e40p-105,
+ -0x1.3670p-103,
+ 0x1.c140p-104,
+ 0x1.1840p-101,
+ 0x1.1ab0p-102,
+ -0x1.a400p-104,
+ 0x1.1f00p-104,
+ -0x1.7180p-103,
+ 0x1.4ce0p-102,
+ 0x1.9200p-107,
+ -0x1.54c0p-103,
+ 0x1.1b80p-105,
+ -0x1.1828p-101,
+ 0x1.5720p-102,
+ -0x1.a060p-100,
+ 0x1.9160p-102,
+ 0x1.a280p-104,
+ 0x1.3400p-107,
+ 0x1.2b20p-102,
+ 0x1.7800p-108,
+ 0x1.cfd0p-101,
+ 0x1.2ef0p-102,
+ -0x1.2760p-99,
+ 0x1.b380p-104,
+ 0x1.0048p-101,
+ -0x1.60b0p-102,
+ 0x1.a1ccp-100,
+ -0x1.a640p-104,
+ -0x1.08a0p-101,
+ 0x1.7e60p-102,
+ 0x1.22c0p-103,
+ -0x1.7200p-106,
+ 0x1.f0f0p-102,
+ 0x1.eb4ep-99,
+ 0x1.c6e0p-103,
+};
+
+/*
+ * exp2l(x): compute the base 2 exponential of x
+ *
+ * Accuracy: Peak error < 0.502 ulp.
+ *
+ * Method: (accurate tables)
+ *
+ * Reduce x:
+ * x = 2**k + y, for integer k and |y| <= 1/2.
+ * Thus we have exp2(x) = 2**k * exp2(y).
+ *
+ * Reduce y:
+ * y = i/TBLSIZE + z - eps[i] for integer i near y * TBLSIZE.
+ * Thus we have exp2(y) = exp2(i/TBLSIZE) * exp2(z - eps[i]),
+ * with |z - eps[i]| <= 2**-8 + 2**-98 for the table used.
+ *
+ * We compute exp2(i/TBLSIZE) via table lookup and exp2(z - eps[i]) via
+ * a degree-10 minimax polynomial with maximum error under 2**-120.
+ * The values in exp2t[] and eps[] are chosen such that
+ * exp2t[i] = exp2(i/TBLSIZE + eps[i]), and eps[i] is a small offset such
+ * that exp2t[i] is accurate to 2**-122.
+ *
+ * Note that the range of i is +-TBLSIZE/2, so we actually index the tables
+ * by i0 = i + TBLSIZE/2.
+ *
+ * This method is due to Gal, with many details due to Gal and Bachelis:
+ *
+ * Gal, S. and Bachelis, B. An Accurate Elementary Mathematical Library
+ * for the IEEE Floating Point Standard. TOMS 17(1), 26-46 (1991).
+ */
+long double
+exp2l(long double x)
+{
+ union IEEEl2bits u, v;
+ long double r, t, twopk, twopkp10000, z;
+ uint32_t hx, ix, i0;
+ int k;
+
+ u.e = x;
+
+ /* Filter out exceptional cases. */
+ hx = u.xbits.expsign;
+ ix = hx & EXPMASK;
+ if (ix >= BIAS + 14) { /* |x| >= 16384 */
+ if (ix == BIAS + LDBL_MAX_EXP) {
+ if (u.xbits.manh != 0
+ || u.xbits.manl != 0
+ || (hx & 0x8000) == 0)
+ return (x + x); /* x is NaN or +Inf */
+ else
+ return (0.0); /* x is -Inf */
+ }
+ if (x >= 16384)
+ return (huge * huge); /* overflow */
+ if (x <= -16495)
+ return (twom10000 * twom10000); /* underflow */
+ } else if (ix <= BIAS - 115) { /* |x| < 0x1p-115 */
+ return (1.0 + x);
+ }
+
+ /*
+ * Reduce x, computing z, i0, and k. The low bits of x + redux
+ * contain the 16-bit integer part of the exponent (k) followed by
+ * TBLBITS fractional bits (i0). We use bit tricks to extract these
+ * as integers, then set z to the remainder.
+ *
+ * Example: Suppose x is 0xabc.123456p0 and TBLBITS is 8.
+ * Then the low-order word of x + redux is 0x000abc12,
+ * We split this into k = 0xabc and i0 = 0x12 (adjusted to
+ * index into the table), then we compute z = 0x0.003456p0.
+ *
+ * XXX If the exponent is negative, the computation of k depends on
+ * '>>' doing sign extension.
+ */
+ u.e = x + redux;
+ i0 = (u.bits.manl & 0xffffffff) + TBLSIZE / 2;
+ k = (int)i0 >> TBLBITS;
+ i0 = i0 & (TBLSIZE - 1);
+ u.e -= redux;
+ z = x - u.e;
+ v.xbits.manh = 0;
+ v.xbits.manl = 0;
+ if (k >= LDBL_MIN_EXP) {
+ v.xbits.expsign = LDBL_MAX_EXP - 1 + k;
+ twopk = v.e;
+ } else {
+ v.xbits.expsign = LDBL_MAX_EXP - 1 + k + 10000;
+ twopkp10000 = v.e;
+ }
+
+ /* Compute r = exp2(y) = exp2t[i0] * p(z - eps[i]). */
+ t = tbl[i0]; /* exp2t[i0] */
+ z -= eps[i0]; /* eps[i0] */
+ r = t + t * z * (P1 + z * (P2 + z * (P3 + z * (P4 + z * (P5 + z * (P6
+ + z * (P7 + z * (P8 + z * (P9 + z * P10)))))))));
+
+ /* Scale by 2**k. */
+ if(k >= LDBL_MIN_EXP) {
+ if (k == LDBL_MAX_EXP)
+ return (r * 2.0 * 0x1p16383L);
+ return (r * twopk);
+ } else {
+ return (r * twopkp10000 * twom10000);
+ }
+}
diff --git a/newlib/libm/ld128/s_expl.c b/newlib/libm/ld128/s_expl.c
new file mode 100644
index 000000000..5b786af49
--- /dev/null
+++ b/newlib/libm/ld128/s_expl.c
@@ -0,0 +1,326 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2009-2013 Steven G. Kargl
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice unmodified, this list of conditions, and the following
+ * disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Optimized by Bruce D. Evans.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * ld128 version of s_expl.c. See ../ld80/s_expl.c for most comments.
+ */
+
+#include <float.h>
+
+#include "fpmath.h"
+#include "math.h"
+#include "math_private.h"
+#include "k_expl.h"
+
+/* XXX Prevent compilers from erroneously constant folding these: */
+static const volatile long double
+huge = 0x1p10000L,
+tiny = 0x1p-10000L;
+
+static const long double
+twom10000 = 0x1p-10000L;
+
+static const long double
+/* log(2**16384 - 0.5) rounded towards zero: */
+/* log(2**16384 - 0.5 + 1) rounded towards zero for expm1l() is the same: */
+o_threshold = 11356.523406294143949491931077970763428L,
+/* log(2**(-16381-64-1)) rounded towards zero: */
+u_threshold = -11433.462743336297878837243843452621503L;
+
+long double
+expl(long double x)
+{
+ union IEEEl2bits u;
+ long double hi, lo, t, twopk;
+ int k;
+ uint16_t hx, ix;
+
+ DOPRINT_START(&x);
+
+ /* Filter out exceptional cases. */
+ u.e = x;
+ hx = u.xbits.expsign;
+ ix = hx & 0x7fff;
+ if (ix >= BIAS + 13) { /* |x| >= 8192 or x is NaN */
+ if (ix == BIAS + LDBL_MAX_EXP) {
+ if (hx & 0x8000) /* x is -Inf or -NaN */
+ RETURNP(-1 / x);
+ RETURNP(x + x); /* x is +Inf or +NaN */
+ }
+ if (x > o_threshold)
+ RETURNP(huge * huge);
+ if (x < u_threshold)
+ RETURNP(tiny * tiny);
+ } else if (ix < BIAS - 114) { /* |x| < 0x1p-114 */
+ RETURN2P(1, x); /* 1 with inexact iff x != 0 */
+ }
+
+ ENTERI();
+
+ twopk = 1;
+ __k_expl(x, &hi, &lo, &k);
+ t = SUM2P(hi, lo);
+
+ /* Scale by 2**k. */
+ /*
+ * XXX sparc64 multiplication was so slow that scalbnl() is faster,
+ * but performance on aarch64 and riscv hasn't yet been quantified.
+ */
+ if (k >= LDBL_MIN_EXP) {
+ if (k == LDBL_MAX_EXP)
+ RETURNI(t * 2 * 0x1p16383L);
+ SET_LDBL_EXPSIGN(twopk, BIAS + k);
+ RETURNI(t * twopk);
+ } else {
+ SET_LDBL_EXPSIGN(twopk, BIAS + k + 10000);
+ RETURNI(t * twopk * twom10000);
+ }
+}
+
+/*
+ * Our T1 and T2 are chosen to be approximately the points where method
+ * A and method B have the same accuracy. Tang's T1 and T2 are the
+ * points where method A's accuracy changes by a full bit. For Tang,
+ * this drop in accuracy makes method A immediately less accurate than
+ * method B, but our larger INTERVALS makes method A 2 bits more
+ * accurate so it remains the most accurate method significantly
+ * closer to the origin despite losing the full bit in our extended
+ * range for it.
+ *
+ * Split the interval [T1, T2] into two intervals [T1, T3] and [T3, T2].
+ * Setting T3 to 0 would require the |x| < 0x1p-113 condition to appear
+ * in both subintervals, so set T3 = 2**-5, which places the condition
+ * into the [T1, T3] interval.
+ *
+ * XXX we now do this more to (partially) balance the number of terms
+ * in the C and D polys than to avoid checking the condition in both
+ * intervals.
+ *
+ * XXX these micro-optimizations are excessive.
+ */
+static const double
+T1 = -0.1659, /* ~-30.625/128 * log(2) */
+T2 = 0.1659, /* ~30.625/128 * log(2) */
+T3 = 0.03125;
+
+/*
+ * Domain [-0.1659, 0.03125], range ~[2.9134e-44, 1.8404e-37]:
+ * |(exp(x)-1-x-x**2/2)/x - p(x)| < 2**-122.03
+ *
+ * XXX none of the long double C or D coeffs except C10 is correctly printed.
+ * If you re-print their values in %.35Le format, the result is always
+ * different. For example, the last 2 digits in C3 should be 59, not 67.
+ * 67 is apparently from rounding an extra-precision value to 36 decimal
+ * places.
+ */
+static const long double
+C3 = 1.66666666666666666666666666666666667e-1L,
+C4 = 4.16666666666666666666666666666666645e-2L,
+C5 = 8.33333333333333333333333333333371638e-3L,
+C6 = 1.38888888888888888888888888891188658e-3L,
+C7 = 1.98412698412698412698412697235950394e-4L,
+C8 = 2.48015873015873015873015112487849040e-5L,
+C9 = 2.75573192239858906525606685484412005e-6L,
+C10 = 2.75573192239858906612966093057020362e-7L,
+C11 = 2.50521083854417203619031960151253944e-8L,
+C12 = 2.08767569878679576457272282566520649e-9L,
+C13 = 1.60590438367252471783548748824255707e-10L;
+
+/*
+ * XXX this has 1 more coeff than needed.
+ * XXX can start the double coeffs but not the double mults at C10.
+ * With my coeffs (C10-C17 double; s = best_s):
+ * Domain [-0.1659, 0.03125], range ~[-1.1976e-37, 1.1976e-37]:
+ * |(exp(x)-1-x-x**2/2)/x - p(x)| ~< 2**-122.65
+ */
+static const double
+C14 = 1.1470745580491932e-11, /* 0x1.93974a81dae30p-37 */
+C15 = 7.6471620181090468e-13, /* 0x1.ae7f3820adab1p-41 */
+C16 = 4.7793721460260450e-14, /* 0x1.ae7cd18a18eacp-45 */
+C17 = 2.8074757356658877e-15, /* 0x1.949992a1937d9p-49 */
+C18 = 1.4760610323699476e-16; /* 0x1.545b43aabfbcdp-53 */
+
+/*
+ * Domain [0.03125, 0.1659], range ~[-2.7676e-37, -1.0367e-38]:
+ * |(exp(x)-1-x-x**2/2)/x - p(x)| < 2**-121.44
+ */
+static const long double
+D3 = 1.66666666666666666666666666666682245e-1L,
+D4 = 4.16666666666666666666666666634228324e-2L,
+D5 = 8.33333333333333333333333364022244481e-3L,
+D6 = 1.38888888888888888888887138722762072e-3L,
+D7 = 1.98412698412698412699085805424661471e-4L,
+D8 = 2.48015873015873015687993712101479612e-5L,
+D9 = 2.75573192239858944101036288338208042e-6L,
+D10 = 2.75573192239853161148064676533754048e-7L,
+D11 = 2.50521083855084570046480450935267433e-8L,
+D12 = 2.08767569819738524488686318024854942e-9L,
+D13 = 1.60590442297008495301927448122499313e-10L;
+
+/*
+ * XXX this has 1 more coeff than needed.
+ * XXX can start the double coeffs but not the double mults at D11.
+ * With my coeffs (D11-D16 double):
+ * Domain [0.03125, 0.1659], range ~[-1.1980e-37, 1.1980e-37]:
+ * |(exp(x)-1-x-x**2/2)/x - p(x)| ~< 2**-122.65
+ */
+static const double
+D14 = 1.1470726176204336e-11, /* 0x1.93971dc395d9ep-37 */
+D15 = 7.6478532249581686e-13, /* 0x1.ae892e3D16fcep-41 */
+D16 = 4.7628892832607741e-14, /* 0x1.ad00Dfe41feccp-45 */
+D17 = 3.0524857220358650e-15; /* 0x1.D7e8d886Df921p-49 */
+
+long double
+expm1l(long double x)
+{
+ union IEEEl2bits u, v;
+ long double hx2_hi, hx2_lo, q, r, r1, t, twomk, twopk, x_hi;
+ long double x_lo, x2;
+ double dr, dx, fn, r2;
+ int k, n, n2;
+ uint16_t hx, ix;
+
+ DOPRINT_START(&x);
+
+ /* Filter out exceptional cases. */
+ u.e = x;
+ hx = u.xbits.expsign;
+ ix = hx & 0x7fff;
+ if (ix >= BIAS + 7) { /* |x| >= 128 or x is NaN */
+ if (ix == BIAS + LDBL_MAX_EXP) {
+ if (hx & 0x8000) /* x is -Inf or -NaN */
+ RETURNP(-1 / x - 1);
+ RETURNP(x + x); /* x is +Inf or +NaN */
+ }
+ if (x > o_threshold)
+ RETURNP(huge * huge);
+ /*
+ * expm1l() never underflows, but it must avoid
+ * unrepresentable large negative exponents. We used a
+ * much smaller threshold for large |x| above than in
+ * expl() so as to handle not so large negative exponents
+ * in the same way as large ones here.
+ */
+ if (hx & 0x8000) /* x <= -128 */
+ RETURN2P(tiny, -1); /* good for x < -114ln2 - eps */
+ }
+
+ ENTERI();
+
+ if (T1 < x && x < T2) {
+ x2 = x * x;
+ dx = x;
+
+ if (x < T3) {
+ if (ix < BIAS - 113) { /* |x| < 0x1p-113 */
+ /* x (rounded) with inexact if x != 0: */
+ RETURNPI(x == 0 ? x :
+ (0x1p200 * x + fabsl(x)) * 0x1p-200);
+ }
+ q = x * x2 * C3 + x2 * x2 * (C4 + x * (C5 + x * (C6 +
+ x * (C7 + x * (C8 + x * (C9 + x * (C10 +
+ x * (C11 + x * (C12 + x * (C13 +
+ dx * (C14 + dx * (C15 + dx * (C16 +
+ dx * (C17 + dx * C18))))))))))))));
+ } else {
+ q = x * x2 * D3 + x2 * x2 * (D4 + x * (D5 + x * (D6 +
+ x * (D7 + x * (D8 + x * (D9 + x * (D10 +
+ x * (D11 + x * (D12 + x * (D13 +
+ dx * (D14 + dx * (D15 + dx * (D16 +
+ dx * D17)))))))))))));
+ }
+
+ x_hi = (float)x;
+ x_lo = x - x_hi;
+ hx2_hi = x_hi * x_hi / 2;
+ hx2_lo = x_lo * (x + x_hi) / 2;
+ if (ix >= BIAS - 7)
+ RETURN2PI(hx2_hi + x_hi, hx2_lo + x_lo + q);
+ else
+ RETURN2PI(x, hx2_lo + q + hx2_hi);
+ }
+
+ /* Reduce x to (k*ln2 + endpoint[n2] + r1 + r2). */
+ fn = rnint((double)x * INV_L);
+ n = irint(fn);
+ n2 = (unsigned)n % INTERVALS;
+ k = n >> LOG2_INTERVALS;
+ r1 = x - fn * L1;
+ r2 = fn * -L2;
+ r = r1 + r2;
+
+ /* Prepare scale factor. */
+ v.e = 1;
+ v.xbits.expsign = BIAS + k;
+ twopk = v.e;
+
+ /*
+ * Evaluate lower terms of
+ * expl(endpoint[n2] + r1 + r2) = tbl[n2] * expl(r1 + r2).
+ */
+ dr = r;
+ q = r2 + r * r * (A2 + r * (A3 + r * (A4 + r * (A5 + r * (A6 +
+ dr * (A7 + dr * (A8 + dr * (A9 + dr * A10))))))));
+
+ t = tbl[n2].lo + tbl[n2].hi;
+
+ if (k == 0) {
+ t = SUM2P(tbl[n2].hi - 1, tbl[n2].lo * (r1 + 1) + t * q +
+ tbl[n2].hi * r1);
+ RETURNI(t);
+ }
+ if (k == -1) {
+ t = SUM2P(tbl[n2].hi - 2, tbl[n2].lo * (r1 + 1) + t * q +
+ tbl[n2].hi * r1);
+ RETURNI(t / 2);
+ }
+ if (k < -7) {
+ t = SUM2P(tbl[n2].hi, tbl[n2].lo + t * (q + r1));
+ RETURNI(t * twopk - 1);
+ }
+ if (k > 2 * LDBL_MANT_DIG - 1) {
+ t = SUM2P(tbl[n2].hi, tbl[n2].lo + t * (q + r1));
+ if (k == LDBL_MAX_EXP)
+ RETURNI(t * 2 * 0x1p16383L - 1);
+ RETURNI(t * twopk - 1);
+ }
+
+ v.xbits.expsign = BIAS - k;
+ twomk = v.e;
+
+ if (k > LDBL_MANT_DIG - 1)
+ t = SUM2P(tbl[n2].hi, tbl[n2].lo - twomk + t * (q + r1));
+ else
+ t = SUM2P(tbl[n2].hi - twomk, tbl[n2].lo + t * (q + r1));
+ RETURNI(t * twopk);
+}
diff --git a/newlib/libm/ld128/s_logl.c b/newlib/libm/ld128/s_logl.c
new file mode 100644
index 000000000..4774a271e
--- /dev/null
+++ b/newlib/libm/ld128/s_logl.c
@@ -0,0 +1,740 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2007-2013 Bruce D. Evans
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice unmodified, this list of conditions, and the following
+ * disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/**
+ * Implementation of the natural logarithm of x for 128-bit format.
+ *
+ * First decompose x into its base 2 representation:
+ *
+ * log(x) = log(X * 2**k), where X is in [1, 2)
+ * = log(X) + k * log(2).
+ *
+ * Let X = X_i + e, where X_i is the center of one of the intervals
+ * [-1.0/256, 1.0/256), [1.0/256, 3.0/256), .... [2.0-1.0/256, 2.0+1.0/256)
+ * and X is in this interval. Then
+ *
+ * log(X) = log(X_i + e)
+ * = log(X_i * (1 + e / X_i))
+ * = log(X_i) + log(1 + e / X_i).
+ *
+ * The values log(X_i) are tabulated below. Let d = e / X_i and use
+ *
+ * log(1 + d) = p(d)
+ *
+ * where p(d) = d - 0.5*d*d + ... is a special minimax polynomial of
+ * suitably high degree.
+ *
+ * To get sufficiently small roundoff errors, k * log(2), log(X_i), and
+ * sometimes (if |k| is not large) the first term in p(d) must be evaluated
+ * and added up in extra precision. Extra precision is not needed for the
+ * rest of p(d). In the worst case when k = 0 and log(X_i) is 0, the final
+ * error is controlled mainly by the error in the second term in p(d). The
+ * error in this term itself is at most 0.5 ulps from the d*d operation in
+ * it. The error in this term relative to the first term is thus at most
+ * 0.5 * |-0.5| * |d| < 1.0/1024 ulps. We aim for an accumulated error of
+ * at most twice this at the point of the final rounding step. Thus the
+ * final error should be at most 0.5 + 1.0/512 = 0.5020 ulps. Exhaustive
+ * testing of a float variant of this function showed a maximum final error
+ * of 0.5008 ulps. Non-exhaustive testing of a double variant of this
+ * function showed a maximum final error of 0.5078 ulps (near 1+1.0/256).
+ *
+ * We made the maximum of |d| (and thus the total relative error and the
+ * degree of p(d)) small by using a large number of intervals. Using
+ * centers of intervals instead of endpoints reduces this maximum by a
+ * factor of 2 for a given number of intervals. p(d) is special only
+ * in beginning with the Taylor coefficients 0 + 1*d, which tends to happen
+ * naturally. The most accurate minimax polynomial of a given degree might
+ * be different, but then we wouldn't want it since we would have to do
+ * extra work to avoid roundoff error (especially for P0*d instead of d).
+ */
+
+#ifdef DEBUG
+#include <assert.h>
+#include <fenv.h>
+#endif
+
+#include "fpmath.h"
+#include "math.h"
+#ifndef NO_STRUCT_RETURN
+#define STRUCT_RETURN
+#endif
+#include "math_private.h"
+
+#if !defined(NO_UTAB) && !defined(NO_UTABL)
+#define USE_UTAB
+#endif
+
+/*
+ * Domain [-0.005280, 0.004838], range ~[-1.1577e-37, 1.1582e-37]:
+ * |log(1 + d)/d - p(d)| < 2**-122.7
+ */
+static const long double
+P2 = -0.5L,
+P3 = 3.33333333333333333333333333333233795e-1L, /* 0x15555555555555555555555554d42.0p-114L */
+P4 = -2.49999999999999999999999999941139296e-1L, /* -0x1ffffffffffffffffffffffdab14e.0p-115L */
+P5 = 2.00000000000000000000000085468039943e-1L, /* 0x19999999999999999999a6d3567f4.0p-115L */
+P6 = -1.66666666666666666666696142372698408e-1L, /* -0x15555555555555555567267a58e13.0p-115L */
+P7 = 1.42857142857142857119522943477166120e-1L, /* 0x1249249249249248ed79a0ae434de.0p-115L */
+P8 = -1.24999999999999994863289015033581301e-1L; /* -0x1fffffffffffffa13e91765e46140.0p-116L */
+/* Double precision gives ~ 53 + log2(P9 * max(|d|)**8) ~= 120 bits. */
+static const double
+P9 = 1.1111111111111401e-1, /* 0x1c71c71c71c7ed.0p-56 */
+P10 = -1.0000000000040135e-1, /* -0x199999999a0a92.0p-56 */
+P11 = 9.0909090728136258e-2, /* 0x1745d173962111.0p-56 */
+P12 = -8.3333318851855284e-2, /* -0x1555551722c7a3.0p-56 */
+P13 = 7.6928634666404178e-2, /* 0x13b1985204a4ae.0p-56 */
+P14 = -7.1626810078462499e-2; /* -0x12562276cdc5d0.0p-56 */
+
+static volatile const double zero = 0;
+
+#define INTERVALS 128
+#define LOG2_INTERVALS 7
+#define TSIZE (INTERVALS + 1)
+#define G(i) (T[(i)].G)
+#define F_hi(i) (T[(i)].F_hi)
+#define F_lo(i) (T[(i)].F_lo)
+#define ln2_hi F_hi(TSIZE - 1)
+#define ln2_lo F_lo(TSIZE - 1)
+#define E(i) (U[(i)].E)
+#define H(i) (U[(i)].H)
+
+static const struct {
+ float G; /* 1/(1 + i/128) rounded to 8/9 bits */
+ float F_hi; /* log(1 / G_i) rounded (see below) */
+ /* The compiler will insert 8 bytes of padding here. */
+ long double F_lo; /* next 113 bits for log(1 / G_i) */
+} T[TSIZE] = {
+ /*
+ * ln2_hi and each F_hi(i) are rounded to a number of bits that
+ * makes F_hi(i) + dk*ln2_hi exact for all i and all dk.
+ *
+ * The last entry (for X just below 2) is used to define ln2_hi
+ * and ln2_lo, to ensure that F_hi(i) and F_lo(i) cancel exactly
+ * with dk*ln2_hi and dk*ln2_lo, respectively, when dk = -1.
+ * This is needed for accuracy when x is just below 1. (To avoid
+ * special cases, such x are "reduced" strangely to X just below
+ * 2 and dk = -1, and then the exact cancellation is needed
+ * because any the error from any non-exactness would be too
+ * large).
+ *
+ * The relevant range of dk is [-16445, 16383]. The maximum number
+ * of bits in F_hi(i) that works is very dependent on i but has
+ * a minimum of 93. We only need about 12 bits in F_hi(i) for
+ * it to provide enough extra precision.
+ *
+ * We round F_hi(i) to 24 bits so that it can have type float,
+ * mainly to minimize the size of the table. Using all 24 bits
+ * in a float for it automatically satisfies the above constraints.
+ */
+ 0x800000.0p-23, 0, 0,
+ 0xfe0000.0p-24, 0x8080ac.0p-30, -0x14ee431dae6674afa0c4bfe16e8fd.0p-144L,
+ 0xfc0000.0p-24, 0x8102b3.0p-29, -0x1db29ee2d83717be918e1119642ab.0p-144L,
+ 0xfa0000.0p-24, 0xc24929.0p-29, 0x1191957d173697cf302cc9476f561.0p-143L,
+ 0xf80000.0p-24, 0x820aec.0p-28, 0x13ce8888e02e78eba9b1113bc1c18.0p-142L,
+ 0xf60000.0p-24, 0xa33577.0p-28, -0x17a4382ce6eb7bfa509bec8da5f22.0p-142L,
+ 0xf48000.0p-24, 0xbc42cb.0p-28, -0x172a21161a107674986dcdca6709c.0p-143L,
+ 0xf30000.0p-24, 0xd57797.0p-28, -0x1e09de07cb958897a3ea46e84abb3.0p-142L,
+ 0xf10000.0p-24, 0xf7518e.0p-28, 0x1ae1eec1b036c484993c549c4bf40.0p-151L,
+ 0xef0000.0p-24, 0x8cb9df.0p-27, -0x1d7355325d560d9e9ab3d6ebab580.0p-141L,
+ 0xed8000.0p-24, 0x999ec0.0p-27, -0x1f9f02d256d5037108f4ec21e48cd.0p-142L,
+ 0xec0000.0p-24, 0xa6988b.0p-27, -0x16fc0a9d12c17a70f7a684c596b12.0p-143L,
+ 0xea0000.0p-24, 0xb80698.0p-27, 0x15d581c1e8da99ded322fb08b8462.0p-141L,
+ 0xe80000.0p-24, 0xc99af3.0p-27, -0x1535b3ba8f150ae09996d7bb4653e.0p-143L,
+ 0xe70000.0p-24, 0xd273b2.0p-27, 0x163786f5251aefe0ded34c8318f52.0p-145L,
+ 0xe50000.0p-24, 0xe442c0.0p-27, 0x1bc4b2368e32d56699c1799a244d4.0p-144L,
+ 0xe38000.0p-24, 0xf1b83f.0p-27, 0x1c6090f684e6766abceccab1d7174.0p-141L,
+ 0xe20000.0p-24, 0xff448a.0p-27, -0x1890aa69ac9f4215f93936b709efb.0p-142L,
+ 0xe08000.0p-24, 0x8673f6.0p-26, 0x1b9985194b6affd511b534b72a28e.0p-140L,
+ 0xdf0000.0p-24, 0x8d515c.0p-26, -0x1dc08d61c6ef1d9b2ef7e68680598.0p-143L,
+ 0xdd8000.0p-24, 0x943a9e.0p-26, -0x1f72a2dac729b3f46662238a9425a.0p-142L,
+ 0xdc0000.0p-24, 0x9b2fe6.0p-26, -0x1fd4dfd3a0afb9691aed4d5e3df94.0p-140L,
+ 0xda8000.0p-24, 0xa2315d.0p-26, -0x11b26121629c46c186384993e1c93.0p-142L,
+ 0xd90000.0p-24, 0xa93f2f.0p-26, 0x1286d633e8e5697dc6a402a56fce1.0p-141L,
+ 0xd78000.0p-24, 0xb05988.0p-26, 0x16128eba9367707ebfa540e45350c.0p-144L,
+ 0xd60000.0p-24, 0xb78094.0p-26, 0x16ead577390d31ef0f4c9d43f79b2.0p-140L,
+ 0xd50000.0p-24, 0xbc4c6c.0p-26, 0x151131ccf7c7b75e7d900b521c48d.0p-141L,
+ 0xd38000.0p-24, 0xc3890a.0p-26, -0x115e2cd714bd06508aeb00d2ae3e9.0p-140L,
+ 0xd20000.0p-24, 0xcad2d7.0p-26, -0x1847f406ebd3af80485c2f409633c.0p-142L,
+ 0xd10000.0p-24, 0xcfb620.0p-26, 0x1c2259904d686581799fbce0b5f19.0p-141L,
+ 0xcf8000.0p-24, 0xd71653.0p-26, 0x1ece57a8d5ae54f550444ecf8b995.0p-140L,
+ 0xce0000.0p-24, 0xde843a.0p-26, -0x1f109d4bc4595412b5d2517aaac13.0p-141L,
+ 0xcd0000.0p-24, 0xe37fde.0p-26, 0x1bc03dc271a74d3a85b5b43c0e727.0p-141L,
+ 0xcb8000.0p-24, 0xeb050c.0p-26, -0x1bf2badc0df841a71b79dd5645b46.0p-145L,
+ 0xca0000.0p-24, 0xf29878.0p-26, -0x18efededd89fbe0bcfbe6d6db9f66.0p-147L,
+ 0xc90000.0p-24, 0xf7ad6f.0p-26, 0x1373ff977baa6911c7bafcb4d84fb.0p-141L,
+ 0xc80000.0p-24, 0xfcc8e3.0p-26, 0x196766f2fb328337cc050c6d83b22.0p-140L,
+ 0xc68000.0p-24, 0x823f30.0p-25, 0x19bd076f7c434e5fcf1a212e2a91e.0p-139L,
+ 0xc58000.0p-24, 0x84d52c.0p-25, -0x1a327257af0f465e5ecab5f2a6f81.0p-139L,
+ 0xc40000.0p-24, 0x88bc74.0p-25, 0x113f23def19c5a0fe396f40f1dda9.0p-141L,
+ 0xc30000.0p-24, 0x8b5ae6.0p-25, 0x1759f6e6b37de945a049a962e66c6.0p-139L,
+ 0xc20000.0p-24, 0x8dfccb.0p-25, 0x1ad35ca6ed5147bdb6ddcaf59c425.0p-141L,
+ 0xc10000.0p-24, 0x90a22b.0p-25, 0x1a1d71a87deba46bae9827221dc98.0p-139L,
+ 0xbf8000.0p-24, 0x94a0d8.0p-25, -0x139e5210c2b730e28aba001a9b5e0.0p-140L,
+ 0xbe8000.0p-24, 0x974f16.0p-25, -0x18f6ebcff3ed72e23e13431adc4a5.0p-141L,
+ 0xbd8000.0p-24, 0x9a00f1.0p-25, -0x1aa268be39aab7148e8d80caa10b7.0p-139L,
+ 0xbc8000.0p-24, 0x9cb672.0p-25, -0x14c8815839c5663663d15faed7771.0p-139L,
+ 0xbb0000.0p-24, 0xa0cda1.0p-25, 0x1eaf46390dbb2438273918db7df5c.0p-141L,
+ 0xba0000.0p-24, 0xa38c6e.0p-25, 0x138e20d831f698298adddd7f32686.0p-141L,
+ 0xb90000.0p-24, 0xa64f05.0p-25, -0x1e8d3c41123615b147a5d47bc208f.0p-142L,
+ 0xb80000.0p-24, 0xa91570.0p-25, 0x1ce28f5f3840b263acb4351104631.0p-140L,
+ 0xb70000.0p-24, 0xabdfbb.0p-25, -0x186e5c0a42423457e22d8c650b355.0p-139L,
+ 0xb60000.0p-24, 0xaeadef.0p-25, -0x14d41a0b2a08a465dc513b13f567d.0p-143L,
+ 0xb50000.0p-24, 0xb18018.0p-25, 0x16755892770633947ffe651e7352f.0p-139L,
+ 0xb40000.0p-24, 0xb45642.0p-25, -0x16395ebe59b15228bfe8798d10ff0.0p-142L,
+ 0xb30000.0p-24, 0xb73077.0p-25, 0x1abc65c8595f088b61a335f5b688c.0p-140L,
+ 0xb20000.0p-24, 0xba0ec4.0p-25, -0x1273089d3dad88e7d353e9967d548.0p-139L,
+ 0xb10000.0p-24, 0xbcf133.0p-25, 0x10f9f67b1f4bbf45de06ecebfaf6d.0p-139L,
+ 0xb00000.0p-24, 0xbfd7d2.0p-25, -0x109fab904864092b34edda19a831e.0p-140L,
+ 0xaf0000.0p-24, 0xc2c2ac.0p-25, -0x1124680aa43333221d8a9b475a6ba.0p-139L,
+ 0xae8000.0p-24, 0xc439b3.0p-25, -0x1f360cc4710fbfe24b633f4e8d84d.0p-140L,
+ 0xad8000.0p-24, 0xc72afd.0p-25, -0x132d91f21d89c89c45003fc5d7807.0p-140L,
+ 0xac8000.0p-24, 0xca20a2.0p-25, -0x16bf9b4d1f8da8002f2449e174504.0p-139L,
+ 0xab8000.0p-24, 0xcd1aae.0p-25, 0x19deb5ce6a6a8717d5626e16acc7d.0p-141L,
+ 0xaa8000.0p-24, 0xd0192f.0p-25, 0x1a29fb48f7d3ca87dabf351aa41f4.0p-139L,
+ 0xaa0000.0p-24, 0xd19a20.0p-25, 0x1127d3c6457f9d79f51dcc73014c9.0p-141L,
+ 0xa90000.0p-24, 0xd49f6a.0p-25, -0x1ba930e486a0ac42d1bf9199188e7.0p-141L,
+ 0xa80000.0p-24, 0xd7a94b.0p-25, -0x1b6e645f31549dd1160bcc45c7e2c.0p-139L,
+ 0xa70000.0p-24, 0xdab7d0.0p-25, 0x1118a425494b610665377f15625b6.0p-140L,
+ 0xa68000.0p-24, 0xdc40d5.0p-25, 0x1966f24d29d3a2d1b2176010478be.0p-140L,
+ 0xa58000.0p-24, 0xdf566d.0p-25, -0x1d8e52eb2248f0c95dd83626d7333.0p-142L,
+ 0xa48000.0p-24, 0xe270ce.0p-25, -0x1ee370f96e6b67ccb006a5b9890ea.0p-140L,
+ 0xa40000.0p-24, 0xe3ffce.0p-25, 0x1d155324911f56db28da4d629d00a.0p-140L,
+ 0xa30000.0p-24, 0xe72179.0p-25, -0x1fe6e2f2f867d8f4d60c713346641.0p-140L,
+ 0xa20000.0p-24, 0xea4812.0p-25, 0x1b7be9add7f4d3b3d406b6cbf3ce5.0p-140L,
+ 0xa18000.0p-24, 0xebdd3d.0p-25, 0x1b3cfb3f7511dd73692609040ccc2.0p-139L,
+ 0xa08000.0p-24, 0xef0b5b.0p-25, -0x1220de1f7301901b8ad85c25afd09.0p-139L,
+ 0xa00000.0p-24, 0xf0a451.0p-25, -0x176364c9ac81cc8a4dfb804de6867.0p-140L,
+ 0x9f0000.0p-24, 0xf3da16.0p-25, 0x1eed6b9aafac8d42f78d3e65d3727.0p-141L,
+ 0x9e8000.0p-24, 0xf576e9.0p-25, 0x1d593218675af269647b783d88999.0p-139L,
+ 0x9d8000.0p-24, 0xf8b47c.0p-25, -0x13e8eb7da053e063714615f7cc91d.0p-144L,
+ 0x9d0000.0p-24, 0xfa553f.0p-25, 0x1c063259bcade02951686d5373aec.0p-139L,
+ 0x9c0000.0p-24, 0xfd9ac5.0p-25, 0x1ef491085fa3c1649349630531502.0p-139L,
+ 0x9b8000.0p-24, 0xff3f8c.0p-25, 0x1d607a7c2b8c5320619fb9433d841.0p-139L,
+ 0x9a8000.0p-24, 0x814697.0p-24, -0x12ad3817004f3f0bdff99f932b273.0p-138L,
+ 0x9a0000.0p-24, 0x821b06.0p-24, -0x189fc53117f9e54e78103a2bc1767.0p-141L,
+ 0x990000.0p-24, 0x83c5f8.0p-24, 0x14cf15a048907b7d7f47ddb45c5a3.0p-139L,
+ 0x988000.0p-24, 0x849c7d.0p-24, 0x1cbb1d35fb82873b04a9af1dd692c.0p-138L,
+ 0x978000.0p-24, 0x864ba6.0p-24, 0x1128639b814f9b9770d8cb6573540.0p-138L,
+ 0x970000.0p-24, 0x87244c.0p-24, 0x184733853300f002e836dfd47bd41.0p-139L,
+ 0x968000.0p-24, 0x87fdaa.0p-24, 0x109d23aef77dd5cd7cc94306fb3ff.0p-140L,
+ 0x958000.0p-24, 0x89b293.0p-24, -0x1a81ef367a59de2b41eeebd550702.0p-138L,
+ 0x950000.0p-24, 0x8a8e20.0p-24, -0x121ad3dbb2f45275c917a30df4ac9.0p-138L,
+ 0x948000.0p-24, 0x8b6a6a.0p-24, -0x1cfb981628af71a89df4e6df2e93b.0p-139L,
+ 0x938000.0p-24, 0x8d253a.0p-24, -0x1d21730ea76cfdec367828734cae5.0p-139L,
+ 0x930000.0p-24, 0x8e03c2.0p-24, 0x135cc00e566f76b87333891e0dec4.0p-138L,
+ 0x928000.0p-24, 0x8ee30d.0p-24, -0x10fcb5df257a263e3bf446c6e3f69.0p-140L,
+ 0x918000.0p-24, 0x90a3ee.0p-24, -0x16e171b15433d723a4c7380a448d8.0p-139L,
+ 0x910000.0p-24, 0x918587.0p-24, -0x1d050da07f3236f330972da2a7a87.0p-139L,
+ 0x908000.0p-24, 0x9267e7.0p-24, 0x1be03669a5268d21148c6002becd3.0p-139L,
+ 0x8f8000.0p-24, 0x942f04.0p-24, 0x10b28e0e26c336af90e00533323ba.0p-139L,
+ 0x8f0000.0p-24, 0x9513c3.0p-24, 0x1a1d820da57cf2f105a89060046aa.0p-138L,
+ 0x8e8000.0p-24, 0x95f950.0p-24, -0x19ef8f13ae3cf162409d8ea99d4c0.0p-139L,
+ 0x8e0000.0p-24, 0x96dfab.0p-24, -0x109e417a6e507b9dc10dac743ad7a.0p-138L,
+ 0x8d0000.0p-24, 0x98aed2.0p-24, 0x10d01a2c5b0e97c4990b23d9ac1f5.0p-139L,
+ 0x8c8000.0p-24, 0x9997a2.0p-24, -0x1d6a50d4b61ea74540bdd2aa99a42.0p-138L,
+ 0x8c0000.0p-24, 0x9a8145.0p-24, 0x1b3b190b83f9527e6aba8f2d783c1.0p-138L,
+ 0x8b8000.0p-24, 0x9b6bbf.0p-24, 0x13a69fad7e7abe7ba81c664c107e0.0p-138L,
+ 0x8b0000.0p-24, 0x9c5711.0p-24, -0x11cd12316f576aad348ae79867223.0p-138L,
+ 0x8a8000.0p-24, 0x9d433b.0p-24, 0x1c95c444b807a246726b304ccae56.0p-139L,
+ 0x898000.0p-24, 0x9f1e22.0p-24, -0x1b9c224ea698c2f9b47466d6123fe.0p-139L,
+ 0x890000.0p-24, 0xa00ce1.0p-24, 0x125ca93186cf0f38b4619a2483399.0p-141L,
+ 0x888000.0p-24, 0xa0fc80.0p-24, -0x1ee38a7bc228b3597043be78eaf49.0p-139L,
+ 0x880000.0p-24, 0xa1ed00.0p-24, -0x1a0db876613d204147dc69a07a649.0p-138L,
+ 0x878000.0p-24, 0xa2de62.0p-24, 0x193224e8516c008d3602a7b41c6e8.0p-139L,
+ 0x870000.0p-24, 0xa3d0a9.0p-24, 0x1fa28b4d2541aca7d5844606b2421.0p-139L,
+ 0x868000.0p-24, 0xa4c3d6.0p-24, 0x1c1b5760fb4571acbcfb03f16daf4.0p-138L,
+ 0x858000.0p-24, 0xa6acea.0p-24, 0x1fed5d0f65949c0a345ad743ae1ae.0p-140L,
+ 0x850000.0p-24, 0xa7a2d4.0p-24, 0x1ad270c9d749362382a7688479e24.0p-140L,
+ 0x848000.0p-24, 0xa899ab.0p-24, 0x199ff15ce532661ea9643a3a2d378.0p-139L,
+ 0x840000.0p-24, 0xa99171.0p-24, 0x1a19e15ccc45d257530a682b80490.0p-139L,
+ 0x838000.0p-24, 0xaa8a28.0p-24, -0x121a14ec532b35ba3e1f868fd0b5e.0p-140L,
+ 0x830000.0p-24, 0xab83d1.0p-24, 0x1aee319980bff3303dd481779df69.0p-139L,
+ 0x828000.0p-24, 0xac7e6f.0p-24, -0x18ffd9e3900345a85d2d86161742e.0p-140L,
+ 0x820000.0p-24, 0xad7a03.0p-24, -0x1e4db102ce29f79b026b64b42caa1.0p-140L,
+ 0x818000.0p-24, 0xae768f.0p-24, 0x17c35c55a04a82ab19f77652d977a.0p-141L,
+ 0x810000.0p-24, 0xaf7415.0p-24, 0x1448324047019b48d7b98c1cf7234.0p-138L,
+ 0x808000.0p-24, 0xb07298.0p-24, -0x1750ee3915a197e9c7359dd94152f.0p-138L,
+ 0x800000.0p-24, 0xb17218.0p-24, -0x105c610ca86c3898cff81a12a17e2.0p-141L,
+};
+
+#ifdef USE_UTAB
+static const struct {
+ float H; /* 1 + i/INTERVALS (exact) */
+ float E; /* H(i) * G(i) - 1 (exact) */
+} U[TSIZE] = {
+ 0x800000.0p-23, 0,
+ 0x810000.0p-23, -0x800000.0p-37,
+ 0x820000.0p-23, -0x800000.0p-35,
+ 0x830000.0p-23, -0x900000.0p-34,
+ 0x840000.0p-23, -0x800000.0p-33,
+ 0x850000.0p-23, -0xc80000.0p-33,
+ 0x860000.0p-23, -0xa00000.0p-36,
+ 0x870000.0p-23, 0x940000.0p-33,
+ 0x880000.0p-23, 0x800000.0p-35,
+ 0x890000.0p-23, -0xc80000.0p-34,
+ 0x8a0000.0p-23, 0xe00000.0p-36,
+ 0x8b0000.0p-23, 0x900000.0p-33,
+ 0x8c0000.0p-23, -0x800000.0p-35,
+ 0x8d0000.0p-23, -0xe00000.0p-33,
+ 0x8e0000.0p-23, 0x880000.0p-33,
+ 0x8f0000.0p-23, -0xa80000.0p-34,
+ 0x900000.0p-23, -0x800000.0p-35,
+ 0x910000.0p-23, 0x800000.0p-37,
+ 0x920000.0p-23, 0x900000.0p-35,
+ 0x930000.0p-23, 0xd00000.0p-35,
+ 0x940000.0p-23, 0xe00000.0p-35,
+ 0x950000.0p-23, 0xc00000.0p-35,
+ 0x960000.0p-23, 0xe00000.0p-36,
+ 0x970000.0p-23, -0x800000.0p-38,
+ 0x980000.0p-23, -0xc00000.0p-35,
+ 0x990000.0p-23, -0xd00000.0p-34,
+ 0x9a0000.0p-23, 0x880000.0p-33,
+ 0x9b0000.0p-23, 0xe80000.0p-35,
+ 0x9c0000.0p-23, -0x800000.0p-35,
+ 0x9d0000.0p-23, 0xb40000.0p-33,
+ 0x9e0000.0p-23, 0x880000.0p-34,
+ 0x9f0000.0p-23, -0xe00000.0p-35,
+ 0xa00000.0p-23, 0x800000.0p-33,
+ 0xa10000.0p-23, -0x900000.0p-36,
+ 0xa20000.0p-23, -0xb00000.0p-33,
+ 0xa30000.0p-23, -0xa00000.0p-36,
+ 0xa40000.0p-23, 0x800000.0p-33,
+ 0xa50000.0p-23, -0xf80000.0p-35,
+ 0xa60000.0p-23, 0x880000.0p-34,
+ 0xa70000.0p-23, -0x900000.0p-33,
+ 0xa80000.0p-23, -0x800000.0p-35,
+ 0xa90000.0p-23, 0x900000.0p-34,
+ 0xaa0000.0p-23, 0xa80000.0p-33,
+ 0xab0000.0p-23, -0xac0000.0p-34,
+ 0xac0000.0p-23, -0x800000.0p-37,
+ 0xad0000.0p-23, 0xf80000.0p-35,
+ 0xae0000.0p-23, 0xf80000.0p-34,
+ 0xaf0000.0p-23, -0xac0000.0p-33,
+ 0xb00000.0p-23, -0x800000.0p-33,
+ 0xb10000.0p-23, -0xb80000.0p-34,
+ 0xb20000.0p-23, -0x800000.0p-34,
+ 0xb30000.0p-23, -0xb00000.0p-35,
+ 0xb40000.0p-23, -0x800000.0p-35,
+ 0xb50000.0p-23, -0xe00000.0p-36,
+ 0xb60000.0p-23, -0x800000.0p-35,
+ 0xb70000.0p-23, -0xb00000.0p-35,
+ 0xb80000.0p-23, -0x800000.0p-34,
+ 0xb90000.0p-23, -0xb80000.0p-34,
+ 0xba0000.0p-23, -0x800000.0p-33,
+ 0xbb0000.0p-23, -0xac0000.0p-33,
+ 0xbc0000.0p-23, 0x980000.0p-33,
+ 0xbd0000.0p-23, 0xbc0000.0p-34,
+ 0xbe0000.0p-23, 0xe00000.0p-36,
+ 0xbf0000.0p-23, -0xb80000.0p-35,
+ 0xc00000.0p-23, -0x800000.0p-33,
+ 0xc10000.0p-23, 0xa80000.0p-33,
+ 0xc20000.0p-23, 0x900000.0p-34,
+ 0xc30000.0p-23, -0x800000.0p-35,
+ 0xc40000.0p-23, -0x900000.0p-33,
+ 0xc50000.0p-23, 0x820000.0p-33,
+ 0xc60000.0p-23, 0x800000.0p-38,
+ 0xc70000.0p-23, -0x820000.0p-33,
+ 0xc80000.0p-23, 0x800000.0p-33,
+ 0xc90000.0p-23, -0xa00000.0p-36,
+ 0xca0000.0p-23, -0xb00000.0p-33,
+ 0xcb0000.0p-23, 0x840000.0p-34,
+ 0xcc0000.0p-23, -0xd00000.0p-34,
+ 0xcd0000.0p-23, 0x800000.0p-33,
+ 0xce0000.0p-23, -0xe00000.0p-35,
+ 0xcf0000.0p-23, 0xa60000.0p-33,
+ 0xd00000.0p-23, -0x800000.0p-35,
+ 0xd10000.0p-23, 0xb40000.0p-33,
+ 0xd20000.0p-23, -0x800000.0p-35,
+ 0xd30000.0p-23, 0xaa0000.0p-33,
+ 0xd40000.0p-23, -0xe00000.0p-35,
+ 0xd50000.0p-23, 0x880000.0p-33,
+ 0xd60000.0p-23, -0xd00000.0p-34,
+ 0xd70000.0p-23, 0x9c0000.0p-34,
+ 0xd80000.0p-23, -0xb00000.0p-33,
+ 0xd90000.0p-23, -0x800000.0p-38,
+ 0xda0000.0p-23, 0xa40000.0p-33,
+ 0xdb0000.0p-23, -0xdc0000.0p-34,
+ 0xdc0000.0p-23, 0xc00000.0p-35,
+ 0xdd0000.0p-23, 0xca0000.0p-33,
+ 0xde0000.0p-23, -0xb80000.0p-34,
+ 0xdf0000.0p-23, 0xd00000.0p-35,
+ 0xe00000.0p-23, 0xc00000.0p-33,
+ 0xe10000.0p-23, -0xf40000.0p-34,
+ 0xe20000.0p-23, 0x800000.0p-37,
+ 0xe30000.0p-23, 0x860000.0p-33,
+ 0xe40000.0p-23, -0xc80000.0p-33,
+ 0xe50000.0p-23, -0xa80000.0p-34,
+ 0xe60000.0p-23, 0xe00000.0p-36,
+ 0xe70000.0p-23, 0x880000.0p-33,
+ 0xe80000.0p-23, -0xe00000.0p-33,
+ 0xe90000.0p-23, -0xfc0000.0p-34,
+ 0xea0000.0p-23, -0x800000.0p-35,
+ 0xeb0000.0p-23, 0xe80000.0p-35,
+ 0xec0000.0p-23, 0x900000.0p-33,
+ 0xed0000.0p-23, 0xe20000.0p-33,
+ 0xee0000.0p-23, -0xac0000.0p-33,
+ 0xef0000.0p-23, -0xc80000.0p-34,
+ 0xf00000.0p-23, -0x800000.0p-35,
+ 0xf10000.0p-23, 0x800000.0p-35,
+ 0xf20000.0p-23, 0xb80000.0p-34,
+ 0xf30000.0p-23, 0x940000.0p-33,
+ 0xf40000.0p-23, 0xc80000.0p-33,
+ 0xf50000.0p-23, -0xf20000.0p-33,
+ 0xf60000.0p-23, -0xc80000.0p-33,
+ 0xf70000.0p-23, -0xa20000.0p-33,
+ 0xf80000.0p-23, -0x800000.0p-33,
+ 0xf90000.0p-23, -0xc40000.0p-34,
+ 0xfa0000.0p-23, -0x900000.0p-34,
+ 0xfb0000.0p-23, -0xc80000.0p-35,
+ 0xfc0000.0p-23, -0x800000.0p-35,
+ 0xfd0000.0p-23, -0x900000.0p-36,
+ 0xfe0000.0p-23, -0x800000.0p-37,
+ 0xff0000.0p-23, -0x800000.0p-39,
+ 0x800000.0p-22, 0,
+};
+#endif /* USE_UTAB */
+
+#ifdef STRUCT_RETURN
+#define RETURN1(rp, v) do { \
+ (rp)->hi = (v); \
+ (rp)->lo_set = 0; \
+ return; \
+} while (0)
+
+#define RETURN2(rp, h, l) do { \
+ (rp)->hi = (h); \
+ (rp)->lo = (l); \
+ (rp)->lo_set = 1; \
+ return; \
+} while (0)
+
+struct ld {
+ long double hi;
+ long double lo;
+ int lo_set;
+};
+#else
+#define RETURN1(rp, v) RETURNF(v)
+#define RETURN2(rp, h, l) RETURNI((h) + (l))
+#endif
+
+#ifdef STRUCT_RETURN
+static inline __always_inline void
+k_logl(long double x, struct ld *rp)
+#else
+long double
+logl(long double x)
+#endif
+{
+ long double d, val_hi, val_lo;
+ double dd, dk;
+ uint64_t lx, llx;
+ int i, k;
+ uint16_t hx;
+
+ EXTRACT_LDBL128_WORDS(hx, lx, llx, x);
+ k = -16383;
+#if 0 /* Hard to do efficiently. Don't do it until we support all modes. */
+ if (x == 1)
+ RETURN1(rp, 0); /* log(1) = +0 in all rounding modes */
+#endif
+ if (hx == 0 || hx >= 0x8000) { /* zero, negative or subnormal? */
+ if (((hx & 0x7fff) | lx | llx) == 0)
+ RETURN1(rp, -1 / zero); /* log(+-0) = -Inf */
+ if (hx != 0)
+ /* log(neg or NaN) = qNaN: */
+ RETURN1(rp, (x - x) / zero);
+ x *= 0x1.0p113; /* subnormal; scale up x */
+ EXTRACT_LDBL128_WORDS(hx, lx, llx, x);
+ k = -16383 - 113;
+ } else if (hx >= 0x7fff)
+ RETURN1(rp, x + x); /* log(Inf or NaN) = Inf or qNaN */
+#ifndef STRUCT_RETURN
+ ENTERI();
+#endif
+ k += hx;
+ dk = k;
+
+ /* Scale x to be in [1, 2). */
+ SET_LDBL_EXPSIGN(x, 0x3fff);
+
+ /* 0 <= i <= INTERVALS: */
+#define L2I (49 - LOG2_INTERVALS)
+ i = (lx + (1LL << (L2I - 2))) >> (L2I - 1);
+
+ /*
+ * -0.005280 < d < 0.004838. In particular, the infinite-
+ * precision |d| is <= 2**-7. Rounding of G(i) to 8 bits
+ * ensures that d is representable without extra precision for
+ * this bound on |d| (since when this calculation is expressed
+ * as x*G(i)-1, the multiplication needs as many extra bits as
+ * G(i) has and the subtraction cancels 8 bits). But for
+ * most i (107 cases out of 129), the infinite-precision |d|
+ * is <= 2**-8. G(i) is rounded to 9 bits for such i to give
+ * better accuracy (this works by improving the bound on |d|,
+ * which in turn allows rounding to 9 bits in more cases).
+ * This is only important when the original x is near 1 -- it
+ * lets us avoid using a special method to give the desired
+ * accuracy for such x.
+ */
+ if (0)
+ d = x * G(i) - 1;
+ else {
+#ifdef USE_UTAB
+ d = (x - H(i)) * G(i) + E(i);
+#else
+ long double x_hi;
+ double x_lo;
+
+ /*
+ * Split x into x_hi + x_lo to calculate x*G(i)-1 exactly.
+ * G(i) has at most 9 bits, so the splitting point is not
+ * critical.
+ */
+ INSERT_LDBL128_WORDS(x_hi, 0x3fff, lx,
+ llx & 0xffffffffff000000ULL);
+ x_lo = x - x_hi;
+ d = x_hi * G(i) - 1 + x_lo * G(i);
+#endif
+ }
+
+ /*
+ * Our algorithm depends on exact cancellation of F_lo(i) and
+ * F_hi(i) with dk*ln_2_lo and dk*ln2_hi when k is -1 and i is
+ * at the end of the table. This and other technical complications
+ * make it difficult to avoid the double scaling in (dk*ln2) *
+ * log(base) for base != e without losing more accuracy and/or
+ * efficiency than is gained.
+ */
+ /*
+ * Use double precision operations wherever possible, since
+ * long double operations are emulated and were very slow on
+ * the old sparc64 and unknown on the newer aarch64 and riscv
+ * machines. Also, don't try to improve parallelism by
+ * increasing the number of operations, since any parallelism
+ * on such machines is needed for the emulation. Horner's
+ * method is good for this, and is also good for accuracy.
+ * Horner's method doesn't handle the `lo' term well, either
+ * for efficiency or accuracy. However, for accuracy we
+ * evaluate d * d * P2 separately to take advantage of by P2
+ * being exact, and this gives a good place to sum the 'lo'
+ * term too.
+ */
+ dd = (double)d;
+ val_lo = d * d * d * (P3 +
+ d * (P4 + d * (P5 + d * (P6 + d * (P7 + d * (P8 +
+ dd * (P9 + dd * (P10 + dd * (P11 + dd * (P12 + dd * (P13 +
+ dd * P14))))))))))) + (F_lo(i) + dk * ln2_lo) + d * d * P2;
+ val_hi = d;
+#ifdef DEBUG
+ if (fetestexcept(FE_UNDERFLOW))
+ breakpoint();
+#endif
+
+ _3sumF(val_hi, val_lo, F_hi(i) + dk * ln2_hi);
+ RETURN2(rp, val_hi, val_lo);
+}
+
+long double
+log1pl(long double x)
+{
+ long double d, d_hi, f_lo, val_hi, val_lo;
+ long double f_hi, twopminusk;
+ double d_lo, dd, dk;
+ uint64_t lx, llx;
+ int i, k;
+ int16_t ax, hx;
+
+ DOPRINT_START(&x);
+ EXTRACT_LDBL128_WORDS(hx, lx, llx, x);
+ if (hx < 0x3fff) { /* x < 1, or x neg NaN */
+ ax = hx & 0x7fff;
+ if (ax >= 0x3fff) { /* x <= -1, or x neg NaN */
+ if (ax == 0x3fff && (lx | llx) == 0)
+ RETURNP(-1 / zero); /* log1p(-1) = -Inf */
+ /* log1p(x < 1, or x NaN) = qNaN: */
+ RETURNP((x - x) / (x - x));
+ }
+ if (ax <= 0x3f8d) { /* |x| < 2**-113 */
+ if ((int)x == 0)
+ RETURNP(x); /* x with inexact if x != 0 */
+ }
+ f_hi = 1;
+ f_lo = x;
+ } else if (hx >= 0x7fff) { /* x +Inf or non-neg NaN */
+ RETURNP(x + x); /* log1p(Inf or NaN) = Inf or qNaN */
+ } else if (hx < 0x40e1) { /* 1 <= x < 2**226 */
+ f_hi = x;
+ f_lo = 1;
+ } else { /* 2**226 <= x < +Inf */
+ f_hi = x;
+ f_lo = 0; /* avoid underflow of the P3 term */
+ }
+ ENTERI();
+ x = f_hi + f_lo;
+ f_lo = (f_hi - x) + f_lo;
+
+ EXTRACT_LDBL128_WORDS(hx, lx, llx, x);
+ k = -16383;
+
+ k += hx;
+ dk = k;
+
+ SET_LDBL_EXPSIGN(x, 0x3fff);
+ twopminusk = 1;
+ SET_LDBL_EXPSIGN(twopminusk, 0x7ffe - (hx & 0x7fff));
+ f_lo *= twopminusk;
+
+ i = (lx + (1LL << (L2I - 2))) >> (L2I - 1);
+
+ /*
+ * x*G(i)-1 (with a reduced x) can be represented exactly, as
+ * above, but now we need to evaluate the polynomial on d =
+ * (x+f_lo)*G(i)-1 and extra precision is needed for that.
+ * Since x+x_lo is a hi+lo decomposition and subtracting 1
+ * doesn't lose too many bits, an inexact calculation for
+ * f_lo*G(i) is good enough.
+ */
+ if (0)
+ d_hi = x * G(i) - 1;
+ else {
+#ifdef USE_UTAB
+ d_hi = (x - H(i)) * G(i) + E(i);
+#else
+ long double x_hi;
+ double x_lo;
+
+ INSERT_LDBL128_WORDS(x_hi, 0x3fff, lx,
+ llx & 0xffffffffff000000ULL);
+ x_lo = x - x_hi;
+ d_hi = x_hi * G(i) - 1 + x_lo * G(i);
+#endif
+ }
+ d_lo = f_lo * G(i);
+
+ /*
+ * This is _2sumF(d_hi, d_lo) inlined. The condition
+ * (d_hi == 0 || |d_hi| >= |d_lo|) for using _2sumF() is not
+ * always satisifed, so it is not clear that this works, but
+ * it works in practice. It works even if it gives a wrong
+ * normalized d_lo, since |d_lo| > |d_hi| implies that i is
+ * nonzero and d is tiny, so the F(i) term dominates d_lo.
+ * In float precision:
+ * (By exhaustive testing, the worst case is d_hi = 0x1.bp-25.
+ * And if d is only a little tinier than that, we would have
+ * another underflow problem for the P3 term; this is also ruled
+ * out by exhaustive testing.)
+ */
+ d = d_hi + d_lo;
+ d_lo = d_hi - d + d_lo;
+ d_hi = d;
+
+ dd = (double)d;
+ val_lo = d * d * d * (P3 +
+ d * (P4 + d * (P5 + d * (P6 + d * (P7 + d * (P8 +
+ dd * (P9 + dd * (P10 + dd * (P11 + dd * (P12 + dd * (P13 +
+ dd * P14))))))))))) + (F_lo(i) + dk * ln2_lo + d_lo) + d * d * P2;
+ val_hi = d_hi;
+#ifdef DEBUG
+ if (fetestexcept(FE_UNDERFLOW))
+ breakpoint();
+#endif
+
+ _3sumF(val_hi, val_lo, F_hi(i) + dk * ln2_hi);
+ RETURN2PI(val_hi, val_lo);
+}
+
+#ifdef STRUCT_RETURN
+
+long double
+logl(long double x)
+{
+ struct ld r;
+
+ ENTERI();
+ DOPRINT_START(&x);
+ k_logl(x, &r);
+ RETURNSPI(&r);
+}
+
+/*
+ * 29+113 bit decompositions. The bits are distributed so that the products
+ * of the hi terms are exact in double precision. The types are chosen so
+ * that the products of the hi terms are done in at least double precision,
+ * without any explicit conversions. More natural choices would require a
+ * slow long double precision multiplication.
+ */
+static const double
+invln10_hi = 4.3429448176175356e-1, /* 0x1bcb7b15000000.0p-54 */
+invln2_hi = 1.4426950402557850e0; /* 0x17154765000000.0p-52 */
+static const long double
+invln10_lo = 1.41498268538580090791605082294397000e-10L, /* 0x137287195355baaafad33dc323ee3.0p-145L */
+invln2_lo = 6.33178418956604368501892137426645911e-10L, /* 0x15c17f0bbbe87fed0691d3e88eb57.0p-143L */
+invln10_lo_plus_hi = invln10_lo + invln10_hi,
+invln2_lo_plus_hi = invln2_lo + invln2_hi;
+
+long double
+log10l(long double x)
+{
+ struct ld r;
+ long double hi, lo;
+
+ ENTERI();
+ DOPRINT_START(&x);
+ k_logl(x, &r);
+ if (!r.lo_set)
+ RETURNPI(r.hi);
+ _2sumF(r.hi, r.lo);
+ hi = (float)r.hi;
+ lo = r.lo + (r.hi - hi);
+ RETURN2PI(invln10_hi * hi,
+ invln10_lo_plus_hi * lo + invln10_lo * hi);
+}
+
+long double
+log2l(long double x)
+{
+ struct ld r;
+ long double hi, lo;
+
+ ENTERI();
+ DOPRINT_START(&x);
+ k_logl(x, &r);
+ if (!r.lo_set)
+ RETURNPI(r.hi);
+ _2sumF(r.hi, r.lo);
+ hi = (float)r.hi;
+ lo = r.lo + (r.hi - hi);
+ RETURN2PI(invln2_hi * hi,
+ invln2_lo_plus_hi * lo + invln2_lo * hi);
+}
+
+#endif /* STRUCT_RETURN */
diff --git a/newlib/libm/ld80/b_expl.c b/newlib/libm/ld80/b_expl.c
new file mode 100644
index 000000000..21bacf449
--- /dev/null
+++ b/newlib/libm/ld80/b_expl.c
@@ -0,0 +1,113 @@
+/*-
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright (c) 1985, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * See bsdsrc/b_exp.c for implementation details.
+ *
+ * bsdrc/b_exp.c converted to long double by Steven G. Kargl.
+ */
+
+#include "fpmath.h"
+#include "math_private.h"
+
+static const union IEEEl2bits
+ p0u = LD80C(0xaaaaaaaaaaaaaaab, -3, 1.66666666666666666671e-01L),
+ p1u = LD80C(0xb60b60b60b60b59a, -9, -2.77777777777777775377e-03L),
+ p2u = LD80C(0x8ab355e008a3cfce, -14, 6.61375661375629297465e-05L),
+ p3u = LD80C(0xddebbc994b0c1376, -20, -1.65343915327882529784e-06L),
+ p4u = LD80C(0xb354784cb4ef4c41, -25, 4.17535101591534118469e-08L),
+ p5u = LD80C(0x913e8a718382ce75, -30, -1.05679137034774806475e-09L),
+ p6u = LD80C(0xe8f0042aa134502e, -36, 2.64819349895429516863e-11L);
+#define p1 (p0u.e)
+#define p2 (p1u.e)
+#define p3 (p2u.e)
+#define p4 (p3u.e)
+#define p5 (p4u.e)
+#define p6 (p5u.e)
+#define p7 (p6u.e)
+
+/*
+ * lnhuge = (LDBL_MAX_EXP + 9) * log(2.)
+ * lntiny = (LDBL_MIN_EXP - 64 - 10) * log(2.)
+ * invln2 = 1 / log(2.)
+ */
+static const union IEEEl2bits
+ln2hiu = LD80C(0xb17217f700000000, -1, 6.93147180369123816490e-01L),
+ln2lou = LD80C(0xd1cf79abc9e3b398, -33, 1.90821492927058781614e-10L),
+lnhugeu = LD80C(0xb18b0c0330a8fad9, 13, 1.13627617309191834574e+04L),
+lntinyu = LD80C(0xb236f28a68bc3bd7, 13, -1.14057368561139000667e+04L),
+invln2u = LD80C(0xb8aa3b295c17f0bc, 0, 1.44269504088896340739e+00L);
+#define ln2hi (ln2hiu.e)
+#define ln2lo (ln2lou.e)
+#define lnhuge (lnhugeu.e)
+#define lntiny (lntinyu.e)
+#define invln2 (invln2u.e)
+
+/* returns exp(r = x + c) for |c| < |x| with no overlap. */
+
+static long double
+__exp__D(long double x, long double c)
+{
+ long double hi, lo, z;
+ int k;
+
+ if (x != x) /* x is NaN. */
+ return(x);
+
+ if (x <= lnhuge) {
+ if (x >= lntiny) {
+ /* argument reduction: x --> x - k*ln2 */
+ z = invln2 * x;
+ k = z + copysignl(0.5L, x);
+
+ /*
+ * Express (x + c) - k * ln2 as hi - lo.
+ * Let x = hi - lo rounded.
+ */
+ hi = x - k * ln2hi; /* Exact. */
+ lo = k * ln2lo - c;
+ x = hi - lo;
+
+ /* Return 2^k*[1+x+x*c/(2+c)] */
+ z = x * x;
+ c = x - z * (p1 + z * (p2 + z * (p3 + z * (p4 +
+ z * (p5 + z * (p6 + z * p7))))));
+ c = (x * c) / (2 - c);
+
+ return (ldexpl(1 + (hi - (lo - c)), k));
+ } else {
+ /* exp(-INF) is 0. exp(-big) underflows to 0. */
+ return (isfinite(x) ? ldexpl(1., -5000) : 0);
+ }
+ } else
+ /* exp(INF) is INF, exp(+big#) overflows to INF */
+ return (isfinite(x) ? ldexpl(1., 5000) : x);
+}
diff --git a/newlib/libm/ld80/b_logl.c b/newlib/libm/ld80/b_logl.c
new file mode 100644
index 000000000..b11eacbe1
--- /dev/null
+++ b/newlib/libm/ld80/b_logl.c
@@ -0,0 +1,375 @@
+/*-
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright (c) 1992, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * See bsdsrc/b_log.c for implementation details.
+ *
+ * bsdrc/b_log.c converted to long double by Steven G. Kargl.
+ */
+
+#define N 128
+
+/*
+ * Coefficients in the polynomial approximation of log(1+f/F).
+ * Domain of x is [0,1./256] with 2**(-84.48) precision.
+ */
+static const union IEEEl2bits
+ a1u = LD80C(0xaaaaaaaaaaaaaaab, -4, 8.33333333333333333356e-02L),
+ a2u = LD80C(0xcccccccccccccd29, -7, 1.25000000000000000781e-02L),
+ a3u = LD80C(0x9249249241ed3764, -9, 2.23214285711721994134e-03L),
+ a4u = LD80C(0xe38e959e1e7e01cf, -12, 4.34030476540000360640e-04L);
+#define A1 (a1u.e)
+#define A2 (a2u.e)
+#define A3 (a3u.e)
+#define A4 (a4u.e)
+
+/*
+ * Table of log(Fj) = logF_head[j] + logF_tail[j], for Fj = 1+j/128.
+ * Used for generation of extend precision logarithms.
+ * The constant 35184372088832 is 2^45, so the divide is exact.
+ * It ensures correct reading of logF_head, even for inaccurate
+ * decimal-to-binary conversion routines. (Everybody gets the
+ * right answer for integers less than 2^53.)
+ * Values for log(F) were generated using error < 10^-57 absolute
+ * with the bc -l package.
+ */
+
+static double logF_head[N+1] = {
+ 0.,
+ .007782140442060381246,
+ .015504186535963526694,
+ .023167059281547608406,
+ .030771658666765233647,
+ .038318864302141264488,
+ .045809536031242714670,
+ .053244514518837604555,
+ .060624621816486978786,
+ .067950661908525944454,
+ .075223421237524235039,
+ .082443669210988446138,
+ .089612158689760690322,
+ .096729626458454731618,
+ .103796793681567578460,
+ .110814366340264314203,
+ .117783035656430001836,
+ .124703478501032805070,
+ .131576357788617315236,
+ .138402322859292326029,
+ .145182009844575077295,
+ .151916042025732167530,
+ .158605030176659056451,
+ .165249572895390883786,
+ .171850256926518341060,
+ .178407657472689606947,
+ .184922338493834104156,
+ .191394852999565046047,
+ .197825743329758552135,
+ .204215541428766300668,
+ .210564769107350002741,
+ .216873938300523150246,
+ .223143551314024080056,
+ .229374101064877322642,
+ .235566071312860003672,
+ .241719936886966024758,
+ .247836163904594286577,
+ .253915209980732470285,
+ .259957524436686071567,
+ .265963548496984003577,
+ .271933715484010463114,
+ .277868451003087102435,
+ .283768173130738432519,
+ .289633292582948342896,
+ .295464212893421063199,
+ .301261330578199704177,
+ .307025035294827830512,
+ .312755710004239517729,
+ .318453731118097493890,
+ .324119468654316733591,
+ .329753286372579168528,
+ .335355541920762334484,
+ .340926586970454081892,
+ .346466767346100823488,
+ .351976423156884266063,
+ .357455888922231679316,
+ .362905493689140712376,
+ .368325561158599157352,
+ .373716409793814818840,
+ .379078352934811846353,
+ .384411698910298582632,
+ .389716751140440464951,
+ .394993808240542421117,
+ .400243164127459749579,
+ .405465108107819105498,
+ .410659924985338875558,
+ .415827895143593195825,
+ .420969294644237379543,
+ .426084395310681429691,
+ .431173464818130014464,
+ .436236766774527495726,
+ .441274560805140936281,
+ .446287102628048160113,
+ .451274644139630254358,
+ .456237433481874177232,
+ .461175715122408291790,
+ .466089729924533457960,
+ .470979715219073113985,
+ .475845904869856894947,
+ .480688529345570714212,
+ .485507815781602403149,
+ .490303988045525329653,
+ .495077266798034543171,
+ .499827869556611403822,
+ .504556010751912253908,
+ .509261901790523552335,
+ .513945751101346104405,
+ .518607764208354637958,
+ .523248143765158602036,
+ .527867089620485785417,
+ .532464798869114019908,
+ .537041465897345915436,
+ .541597282432121573947,
+ .546132437597407260909,
+ .550647117952394182793,
+ .555141507540611200965,
+ .559615787935399566777,
+ .564070138285387656651,
+ .568504735352689749561,
+ .572919753562018740922,
+ .577315365035246941260,
+ .581691739635061821900,
+ .586049045003164792433,
+ .590387446602107957005,
+ .594707107746216934174,
+ .599008189645246602594,
+ .603290851438941899687,
+ .607555250224322662688,
+ .611801541106615331955,
+ .616029877215623855590,
+ .620240409751204424537,
+ .624433288012369303032,
+ .628608659422752680256,
+ .632766669570628437213,
+ .636907462236194987781,
+ .641031179420679109171,
+ .645137961373620782978,
+ .649227946625615004450,
+ .653301272011958644725,
+ .657358072709030238911,
+ .661398482245203922502,
+ .665422632544505177065,
+ .669430653942981734871,
+ .673422675212350441142,
+ .677398823590920073911,
+ .681359224807238206267,
+ .685304003098281100392,
+ .689233281238557538017,
+ .693147180560117703862
+};
+
+static double logF_tail[N+1] = {
+ 0.,
+ -.00000000000000543229938420049,
+ .00000000000000172745674997061,
+ -.00000000000001323017818229233,
+ -.00000000000001154527628289872,
+ -.00000000000000466529469958300,
+ .00000000000005148849572685810,
+ -.00000000000002532168943117445,
+ -.00000000000005213620639136504,
+ -.00000000000001819506003016881,
+ .00000000000006329065958724544,
+ .00000000000008614512936087814,
+ -.00000000000007355770219435028,
+ .00000000000009638067658552277,
+ .00000000000007598636597194141,
+ .00000000000002579999128306990,
+ -.00000000000004654729747598444,
+ -.00000000000007556920687451336,
+ .00000000000010195735223708472,
+ -.00000000000017319034406422306,
+ -.00000000000007718001336828098,
+ .00000000000010980754099855238,
+ -.00000000000002047235780046195,
+ -.00000000000008372091099235912,
+ .00000000000014088127937111135,
+ .00000000000012869017157588257,
+ .00000000000017788850778198106,
+ .00000000000006440856150696891,
+ .00000000000016132822667240822,
+ -.00000000000007540916511956188,
+ -.00000000000000036507188831790,
+ .00000000000009120937249914984,
+ .00000000000018567570959796010,
+ -.00000000000003149265065191483,
+ -.00000000000009309459495196889,
+ .00000000000017914338601329117,
+ -.00000000000001302979717330866,
+ .00000000000023097385217586939,
+ .00000000000023999540484211737,
+ .00000000000015393776174455408,
+ -.00000000000036870428315837678,
+ .00000000000036920375082080089,
+ -.00000000000009383417223663699,
+ .00000000000009433398189512690,
+ .00000000000041481318704258568,
+ -.00000000000003792316480209314,
+ .00000000000008403156304792424,
+ -.00000000000034262934348285429,
+ .00000000000043712191957429145,
+ -.00000000000010475750058776541,
+ -.00000000000011118671389559323,
+ .00000000000037549577257259853,
+ .00000000000013912841212197565,
+ .00000000000010775743037572640,
+ .00000000000029391859187648000,
+ -.00000000000042790509060060774,
+ .00000000000022774076114039555,
+ .00000000000010849569622967912,
+ -.00000000000023073801945705758,
+ .00000000000015761203773969435,
+ .00000000000003345710269544082,
+ -.00000000000041525158063436123,
+ .00000000000032655698896907146,
+ -.00000000000044704265010452446,
+ .00000000000034527647952039772,
+ -.00000000000007048962392109746,
+ .00000000000011776978751369214,
+ -.00000000000010774341461609578,
+ .00000000000021863343293215910,
+ .00000000000024132639491333131,
+ .00000000000039057462209830700,
+ -.00000000000026570679203560751,
+ .00000000000037135141919592021,
+ -.00000000000017166921336082431,
+ -.00000000000028658285157914353,
+ -.00000000000023812542263446809,
+ .00000000000006576659768580062,
+ -.00000000000028210143846181267,
+ .00000000000010701931762114254,
+ .00000000000018119346366441110,
+ .00000000000009840465278232627,
+ -.00000000000033149150282752542,
+ -.00000000000018302857356041668,
+ -.00000000000016207400156744949,
+ .00000000000048303314949553201,
+ -.00000000000071560553172382115,
+ .00000000000088821239518571855,
+ -.00000000000030900580513238244,
+ -.00000000000061076551972851496,
+ .00000000000035659969663347830,
+ .00000000000035782396591276383,
+ -.00000000000046226087001544578,
+ .00000000000062279762917225156,
+ .00000000000072838947272065741,
+ .00000000000026809646615211673,
+ -.00000000000010960825046059278,
+ .00000000000002311949383800537,
+ -.00000000000058469058005299247,
+ -.00000000000002103748251144494,
+ -.00000000000023323182945587408,
+ -.00000000000042333694288141916,
+ -.00000000000043933937969737844,
+ .00000000000041341647073835565,
+ .00000000000006841763641591466,
+ .00000000000047585534004430641,
+ .00000000000083679678674757695,
+ -.00000000000085763734646658640,
+ .00000000000021913281229340092,
+ -.00000000000062242842536431148,
+ -.00000000000010983594325438430,
+ .00000000000065310431377633651,
+ -.00000000000047580199021710769,
+ -.00000000000037854251265457040,
+ .00000000000040939233218678664,
+ .00000000000087424383914858291,
+ .00000000000025218188456842882,
+ -.00000000000003608131360422557,
+ -.00000000000050518555924280902,
+ .00000000000078699403323355317,
+ -.00000000000067020876961949060,
+ .00000000000016108575753932458,
+ .00000000000058527188436251509,
+ -.00000000000035246757297904791,
+ -.00000000000018372084495629058,
+ .00000000000088606689813494916,
+ .00000000000066486268071468700,
+ .00000000000063831615170646519,
+ .00000000000025144230728376072,
+ -.00000000000017239444525614834
+};
+/*
+ * Extra precision variant, returning struct {double a, b;};
+ * log(x) = a + b to 63 bits, with 'a' rounded to 24 bits.
+ */
+static struct Double
+__log__D(long double x)
+{
+ int m, j;
+ long double F, f, g, q, u, v, u1, u2;
+ struct Double r;
+
+ /*
+ * Argument reduction: 1 <= g < 2; x/2^m = g;
+ * y = F*(1 + f/F) for |f| <= 2^-8
+ */
+ g = frexpl(x, &m);
+ g *= 2;
+ m--;
+ if (m == DBL_MIN_EXP - 1) {
+ j = ilogbl(g);
+ m += j;
+ g = ldexpl(g, -j);
+ }
+ j = N * (g - 1) + 0.5L;
+ F = (1.L / N) * j + 1;
+ f = g - F;
+
+ g = 1 / (2 * F + f);
+ u = 2 * f * g;
+ v = u * u;
+ q = u * v * (A1 + v * (A2 + v * (A3 + v * A4)));
+ if (m | j) {
+ u1 = u + 513;
+ u1 -= 513;
+ } else {
+ u1 = (float)u;
+ }
+ u2 = (2 * (f - F * u1) - u1 * f) * g;
+
+ u1 += m * (long double)logF_head[N] + logF_head[j];
+
+ u2 += logF_tail[j];
+ u2 += q;
+ u2 += logF_tail[N] * m;
+ r.a = (float)(u1 + u2); /* Only difference is here. */
+ r.b = (u1 - r.a) + u2;
+ return (r);
+}
diff --git a/newlib/libm/ld80/b_tgammal.c b/newlib/libm/ld80/b_tgammal.c
new file mode 100644
index 000000000..121248adb
--- /dev/null
+++ b/newlib/libm/ld80/b_tgammal.c
@@ -0,0 +1,419 @@
+/*-
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright (c) 1992, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * The original code, FreeBSD's old svn r93211, contain the following
+ * attribution:
+ *
+ * This code by P. McIlroy, Oct 1992;
+ *
+ * The financial support of UUNET Communications Services is greatfully
+ * acknowledged.
+ *
+ * bsdrc/b_tgamma.c converted to long double by Steven G. Kargl.
+ */
+
+/*
+ * See bsdsrc/t_tgamma.c for implementation details.
+ */
+
+#include <float.h>
+
+#if LDBL_MAX_EXP != 0x4000
+#error "Unsupported long double format"
+#endif
+
+#ifdef __i386__
+#include <ieeefp.h>
+#endif
+
+#include "fpmath.h"
+#include "math.h"
+#include "math_private.h"
+
+/* Used in b_log.c and below. */
+struct Double {
+ long double a;
+ long double b;
+};
+
+#include "b_logl.c"
+#include "b_expl.c"
+
+static const double zero = 0.;
+static const volatile double tiny = 1e-300;
+/*
+ * x >= 6
+ *
+ * Use the asymptotic approximation (Stirling's formula) adjusted for
+ * equal-ripples:
+ *
+ * log(G(x)) ~= (x-0.5)*(log(x)-1) + 0.5(log(2*pi)-1) + 1/x*P(1/(x*x))
+ *
+ * Keep extra precision in multiplying (x-.5)(log(x)-1), to avoid
+ * premature round-off.
+ *
+ * Accurate to max(ulp(1/128) absolute, 2^-66 relative) error.
+ */
+
+/*
+ * The following is a decomposition of 0.5 * (log(2*pi) - 1) into the
+ * first 12 bits in ln2pi_hi and the trailing 64 bits in ln2pi_lo. The
+ * variables are clearly misnamed.
+ */
+static const union IEEEl2bits
+ln2pi_hiu = LD80C(0xd680000000000000, -2, 4.18945312500000000000e-01L),
+ln2pi_lou = LD80C(0xe379b414b596d687, -18, -6.77929532725821967032e-06L);
+#define ln2pi_hi (ln2pi_hiu.e)
+#define ln2pi_lo (ln2pi_lou.e)
+
+static const union IEEEl2bits
+ Pa0u = LD80C(0xaaaaaaaaaaaaaaaa, -4, 8.33333333333333333288e-02L),
+ Pa1u = LD80C(0xb60b60b60b5fcd59, -9, -2.77777777777776516326e-03L),
+ Pa2u = LD80C(0xd00d00cffbb47014, -11, 7.93650793635429639018e-04L),
+ Pa3u = LD80C(0x9c09c07c0805343e, -11, -5.95238087960599252215e-04L),
+ Pa4u = LD80C(0xdca8d31f8e6e5e8f, -11, 8.41749082509607342883e-04L),
+ Pa5u = LD80C(0xfb4d4289632f1638, -10, -1.91728055205541624556e-03L),
+ Pa6u = LD80C(0xd15a4ba04078d3f8, -8, 6.38893788027752396194e-03L),
+ Pa7u = LD80C(0xe877283110bcad95, -6, -2.83771309846297590312e-02L),
+ Pa8u = LD80C(0x8da97eed13717af8, -3, 1.38341887683837576925e-01L),
+ Pa9u = LD80C(0xf093b1c1584e30ce, -2, -4.69876818515470146031e-01L);
+#define Pa0 (Pa0u.e)
+#define Pa1 (Pa1u.e)
+#define Pa2 (Pa2u.e)
+#define Pa3 (Pa3u.e)
+#define Pa4 (Pa4u.e)
+#define Pa5 (Pa5u.e)
+#define Pa6 (Pa6u.e)
+#define Pa7 (Pa7u.e)
+#define Pa8 (Pa8u.e)
+#define Pa9 (Pa9u.e)
+
+static struct Double
+large_gam(long double x)
+{
+ long double p, z, thi, tlo, xhi, xlo;
+ long double logx;
+ struct Double u;
+
+ z = 1 / (x * x);
+ p = Pa0 + z * (Pa1 + z * (Pa2 + z * (Pa3 + z * (Pa4 + z * (Pa5 +
+ z * (Pa6 + z * (Pa7 + z * (Pa8 + z * Pa9))))))));
+ p = p / x;
+
+ u = __log__D(x);
+ u.a -= 1;
+
+ /* Split (x - 0.5) in high and low parts. */
+ x -= 0.5L;
+ xhi = (float)x;
+ xlo = x - xhi;
+
+ /* Compute t = (x-.5)*(log(x)-1) in extra precision. */
+ thi = xhi * u.a;
+ tlo = xlo * u.a + x * u.b;
+
+ /* Compute thi + tlo + ln2pi_hi + ln2pi_lo + p. */
+ tlo += ln2pi_lo;
+ tlo += p;
+ u.a = ln2pi_hi + tlo;
+ u.a += thi;
+ u.b = thi - u.a;
+ u.b += ln2pi_hi;
+ u.b += tlo;
+ return (u);
+}
+/*
+ * Rational approximation, A0 + x * x * P(x) / Q(x), on the interval
+ * [1.066.., 2.066..] accurate to 4.25e-19.
+ *
+ * Returns r.a + r.b = a0 + (z + c)^2 * p / q, with r.a truncated.
+ */
+static const union IEEEl2bits
+ a0_hiu = LD80C(0xe2b6e4153a57746c, -1, 8.85603194410888700265e-01L),
+ a0_lou = LD80C(0x851566d40f32c76d, -66, 1.40907742727049706207e-20L);
+#define a0_hi (a0_hiu.e)
+#define a0_lo (a0_lou.e)
+
+static const union IEEEl2bits
+P0u = LD80C(0xdb629fb9bbdc1c1d, -2, 4.28486815855585429733e-01L),
+P1u = LD80C(0xe6f4f9f5641aa6be, -3, 2.25543885805587730552e-01L),
+P2u = LD80C(0xead1bd99fdaf7cc1, -6, 2.86644652514293482381e-02L),
+P3u = LD80C(0x9ccc8b25838ab1e0, -8, 4.78512567772456362048e-03L),
+P4u = LD80C(0x8f0c4383ef9ce72a, -9, 2.18273781132301146458e-03L),
+P5u = LD80C(0xe732ab2c0a2778da, -13, 2.20487522485636008928e-04L),
+P6u = LD80C(0xce70b27ca822b297, -16, 2.46095923774929264284e-05L),
+P7u = LD80C(0xa309e2e16fb63663, -19, 2.42946473022376182921e-06L),
+P8u = LD80C(0xaf9c110efb2c633d, -23, 1.63549217667765869987e-07L),
+Q1u = LD80C(0xd4d7422719f48f15, -1, 8.31409582658993993626e-01L),
+Q2u = LD80C(0xe13138ea404f1268, -5, -5.49785826915643198508e-02L),
+Q3u = LD80C(0xd1c6cc91989352c0, -4, -1.02429960435139887683e-01L),
+Q4u = LD80C(0xa7e9435a84445579, -7, 1.02484853505908820524e-02L),
+Q5u = LD80C(0x83c7c34db89b7bda, -8, 4.02161632832052872697e-03L),
+Q6u = LD80C(0xbed06bf6e1c14e5b, -11, -7.27898206351223022157e-04L),
+Q7u = LD80C(0xef05bf841d4504c0, -18, 7.12342421869453515194e-06L),
+Q8u = LD80C(0xf348d08a1ff53cb1, -19, 3.62522053809474067060e-06L);
+#define P0 (P0u.e)
+#define P1 (P1u.e)
+#define P2 (P2u.e)
+#define P3 (P3u.e)
+#define P4 (P4u.e)
+#define P5 (P5u.e)
+#define P6 (P6u.e)
+#define P7 (P7u.e)
+#define P8 (P8u.e)
+#define Q1 (Q1u.e)
+#define Q2 (Q2u.e)
+#define Q3 (Q3u.e)
+#define Q4 (Q4u.e)
+#define Q5 (Q5u.e)
+#define Q6 (Q6u.e)
+#define Q7 (Q7u.e)
+#define Q8 (Q8u.e)
+
+static struct Double
+ratfun_gam(long double z, long double c)
+{
+ long double p, q, thi, tlo;
+ struct Double r;
+
+ q = 1 + z * (Q1 + z * (Q2 + z * (Q3 + z * (Q4 + z * (Q5 +
+ z * (Q6 + z * (Q7 + z * Q8)))))));
+ p = P0 + z * (P1 + z * (P2 + z * (P3 + z * (P4 + z * (P5 +
+ z * (P6 + z * (P7 + z * P8)))))));
+ p = p / q;
+
+ /* Split z into high and low parts. */
+ thi = (float)z;
+ tlo = (z - thi) + c;
+ tlo *= (thi + z);
+
+ /* Split (z+c)^2 into high and low parts. */
+ thi *= thi;
+ q = thi;
+ thi = (float)thi;
+ tlo += (q - thi);
+
+ /* Split p/q into high and low parts. */
+ r.a = (float)p;
+ r.b = p - r.a;
+
+ tlo = tlo * p + thi * r.b + a0_lo;
+ thi *= r.a; /* t = (z+c)^2*(P/Q) */
+ r.a = (float)(thi + a0_hi);
+ r.b = ((a0_hi - r.a) + thi) + tlo;
+ return (r); /* r = a0 + t */
+}
+/*
+ * x < 6
+ *
+ * Use argument reduction G(x+1) = xG(x) to reach the range [1.066124,
+ * 2.066124]. Use a rational approximation centered at the minimum
+ * (x0+1) to ensure monotonicity.
+ *
+ * Good to < 1 ulp. (provably .90 ulp; .87 ulp on 1,000,000 runs.)
+ * It also has correct monotonicity.
+ */
+static const union IEEEl2bits
+ xm1u = LD80C(0xec5b0c6ad7c7edc3, -2, 4.61632144968362341254e-01L);
+#define x0 (xm1u.e)
+
+static const double
+ left = -0.3955078125; /* left boundary for rat. approx */
+
+static long double
+small_gam(long double x)
+{
+ long double t, y, ym1;
+ struct Double yy, r;
+
+ y = x - 1;
+
+ if (y <= 1 + (left + x0)) {
+ yy = ratfun_gam(y - x0, 0);
+ return (yy.a + yy.b);
+ }
+
+ r.a = (float)y;
+ yy.a = r.a - 1;
+ y = y - 1 ;
+ r.b = yy.b = y - yy.a;
+
+ /* Argument reduction: G(x+1) = x*G(x) */
+ for (ym1 = y - 1; ym1 > left + x0; y = ym1--, yy.a--) {
+ t = r.a * yy.a;
+ r.b = r.a * yy.b + y * r.b;
+ r.a = (float)t;
+ r.b += (t - r.a);
+ }
+
+ /* Return r*tgamma(y). */
+ yy = ratfun_gam(y - x0, 0);
+ y = r.b * (yy.a + yy.b) + r.a * yy.b;
+ y += yy.a * r.a;
+ return (y);
+}
+/*
+ * Good on (0, 1+x0+left]. Accurate to 1 ulp.
+ */
+static long double
+smaller_gam(long double x)
+{
+ long double d, rhi, rlo, t, xhi, xlo;
+ struct Double r;
+
+ if (x < x0 + left) {
+ t = (float)x;
+ d = (t + x) * (x - t);
+ t *= t;
+ xhi = (float)(t + x);
+ xlo = x - xhi;
+ xlo += t;
+ xlo += d;
+ t = 1 - x0;
+ t += x;
+ d = 1 - x0;
+ d -= t;
+ d += x;
+ x = xhi + xlo;
+ } else {
+ xhi = (float)x;
+ xlo = x - xhi;
+ t = x - x0;
+ d = - x0 - t;
+ d += x;
+ }
+
+ r = ratfun_gam(t, d);
+ d = (float)(r.a / x);
+ r.a -= d * xhi;
+ r.a -= d * xlo;
+ r.a += r.b;
+
+ return (d + r.a / x);
+}
+/*
+ * x < 0
+ *
+ * Use reflection formula, G(x) = pi/(sin(pi*x)*x*G(x)).
+ * At negative integers, return NaN and raise invalid.
+ */
+static const union IEEEl2bits
+piu = LD80C(0xc90fdaa22168c235, 1, 3.14159265358979323851e+00L);
+#define pi (piu.e)
+
+static long double
+neg_gam(long double x)
+{
+ int sgn = 1;
+ struct Double lg, lsine;
+ long double y, z;
+
+ y = ceill(x);
+ if (y == x) /* Negative integer. */
+ return ((x - x) / zero);
+
+ z = y - x;
+ if (z > 0.5)
+ z = 1 - z;
+
+ y = y / 2;
+ if (y == ceill(y))
+ sgn = -1;
+
+ if (z < 0.25)
+ z = sinpil(z);
+ else
+ z = cospil(0.5 - z);
+
+ /* Special case: G(1-x) = Inf; G(x) may be nonzero. */
+ if (x < -1753) {
+
+ if (x < -1760)
+ return (sgn * tiny * tiny);
+ y = expl(lgammal(x) / 2);
+ y *= y;
+ return (sgn < 0 ? -y : y);
+ }
+
+
+ y = 1 - x;
+ if (1 - y == x)
+ y = tgammal(y);
+ else /* 1-x is inexact */
+ y = - x * tgammal(-x);
+
+ if (sgn < 0) y = -y;
+ return (pi / (y * z));
+}
+/*
+ * xmax comes from lgamma(xmax) - emax * log(2) = 0.
+ * static const float xmax = 35.040095f
+ * static const double xmax = 171.624376956302725;
+ * ld80: LD80C(0xdb718c066b352e20, 10, 1.75554834290446291689e+03L),
+ * ld128: 1.75554834290446291700388921607020320e+03L,
+ *
+ * iota is a sloppy threshold to isolate x = 0.
+ */
+static const double xmax = 1755.54834290446291689;
+static const double iota = 0x1p-116;
+
+long double
+tgammal(long double x)
+{
+ struct Double u;
+
+ ENTERI();
+
+ if (x >= 6) {
+ if (x > xmax)
+ RETURNI(x / zero);
+ u = large_gam(x);
+ RETURNI(__exp__D(u.a, u.b));
+ }
+
+ if (x >= 1 + left + x0)
+ RETURNI(small_gam(x));
+
+ if (x > iota)
+ RETURNI(smaller_gam(x));
+
+ if (x > -iota) {
+ if (x != 0)
+ u.a = 1 - tiny; /* raise inexact */
+ RETURNI(1 / x);
+ }
+
+ if (!isfinite(x))
+ RETURNI(x - x); /* x is NaN or -Inf */
+
+ RETURNI(neg_gam(x));
+}
diff --git a/newlib/libm/ld80/e_lgammal_r.c b/newlib/libm/ld80/e_lgammal_r.c
new file mode 100644
index 000000000..f56758b18
--- /dev/null
+++ b/newlib/libm/ld80/e_lgammal_r.c
@@ -0,0 +1,358 @@
+/* @(#)e_lgamma_r.c 1.3 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * See e_lgamma_r.c for complete comments.
+ *
+ * Converted to long double by Steven G. Kargl.
+ */
+
+#ifdef __i386__
+#include <ieeefp.h>
+#endif
+
+#include "fpmath.h"
+#include "math.h"
+#include "math_private.h"
+
+static const volatile double vzero = 0;
+
+static const double
+zero= 0,
+half= 0.5,
+one = 1;
+
+static const union IEEEl2bits
+piu = LD80C(0xc90fdaa22168c235, 1, 3.14159265358979323851e+00L);
+#define pi (piu.e)
+/*
+ * Domain y in [0x1p-70, 0.27], range ~[-4.5264e-22, 4.5264e-22]:
+ * |(lgamma(2 - y) + y / 2) / y - a(y)| < 2**-70.9
+ */
+static const union IEEEl2bits
+a0u = LD80C(0x9e233f1bed863d26, -4, 7.72156649015328606028e-02L),
+a1u = LD80C(0xa51a6625307d3249, -2, 3.22467033424113218889e-01L),
+a2u = LD80C(0x89f000d2abafda8c, -4, 6.73523010531979398946e-02L),
+a3u = LD80C(0xa8991563eca75f26, -6, 2.05808084277991211934e-02L),
+a4u = LD80C(0xf2027e10634ce6b6, -8, 7.38555102796070454026e-03L),
+a5u = LD80C(0xbd6eb76dd22187f4, -9, 2.89051035162703932972e-03L),
+a6u = LD80C(0x9c562ab05e0458ed, -10, 1.19275351624639999297e-03L),
+a7u = LD80C(0x859baed93ee48e46, -11, 5.09674593842117925320e-04L),
+a8u = LD80C(0xe9f28a4432949af2, -13, 2.23109648015769155122e-04L),
+a9u = LD80C(0xd12ad0d9b93c6bb0, -14, 9.97387167479808509830e-05L),
+a10u= LD80C(0xb7522643c78a219b, -15, 4.37071076331030136818e-05L),
+a11u= LD80C(0xca024dcdece2cb79, -16, 2.40813493372040143061e-05L),
+a12u= LD80C(0xbb90fb6968ebdbf9, -19, 2.79495621083634031729e-06L),
+a13u= LD80C(0xba1c9ffeeae07b37, -17, 1.10931287015513924136e-05L);
+#define a0 (a0u.e)
+#define a1 (a1u.e)
+#define a2 (a2u.e)
+#define a3 (a3u.e)
+#define a4 (a4u.e)
+#define a5 (a5u.e)
+#define a6 (a6u.e)
+#define a7 (a7u.e)
+#define a8 (a8u.e)
+#define a9 (a9u.e)
+#define a10 (a10u.e)
+#define a11 (a11u.e)
+#define a12 (a12u.e)
+#define a13 (a13u.e)
+/*
+ * Domain x in [tc-0.24, tc+0.28], range ~[-6.1205e-22, 6.1205e-22]:
+ * |(lgamma(x) - tf) - t(x - tc)| < 2**-70.5
+ */
+static const union IEEEl2bits
+tcu = LD80C(0xbb16c31ab5f1fb71, 0, 1.46163214496836234128e+00L),
+tfu = LD80C(0xf8cdcde61c520e0f, -4, -1.21486290535849608093e-01L),
+ttu = LD80C(0xd46ee54b27d4de99, -69, -2.81152980996018785880e-21L),
+t0u = LD80C(0x80b9406556a62a6b, -68, 3.40728634996055147231e-21L),
+t1u = LD80C(0xc7e9c6f6df3f8c39, -67, -1.05833162742737073665e-20L),
+t2u = LD80C(0xf7b95e4771c55d51, -2, 4.83836122723810583532e-01L),
+t3u = LD80C(0x97213c6e35e119ff, -3, -1.47587722994530691476e-01L),
+t4u = LD80C(0x845a14a6a81dc94b, -4, 6.46249402389135358063e-02L),
+t5u = LD80C(0x864d46fa89997796, -5, -3.27885410884846056084e-02L),
+t6u = LD80C(0x93373cbd00297438, -6, 1.79706751150707171293e-02L),
+t7u = LD80C(0xa8fcfca7eddc8d1d, -7, -1.03142230361450732547e-02L),
+t8u = LD80C(0xc7e7015ff4bc45af, -8, 6.10053603296546099193e-03L),
+t9u = LD80C(0xf178d2247adc5093, -9, -3.68456964904901200152e-03L),
+t10u = LD80C(0x94188d58f12e5e9f, -9, 2.25976420273774583089e-03L),
+t11u = LD80C(0xb7cbaef14e1406f1, -10, -1.40224943666225639823e-03L),
+t12u = LD80C(0xe63a671e6704ea4d, -11, 8.78250640744776944887e-04L),
+t13u = LD80C(0x914b6c9cae61783e, -11, -5.54255012657716808811e-04L),
+t14u = LD80C(0xb858f5bdb79276fe, -12, 3.51614951536825927370e-04L),
+t15u = LD80C(0xea73e744c34b9591, -13, -2.23591563824520112236e-04L),
+t16u = LD80C(0x99aeabb0d67ba835, -13, 1.46562869351659194136e-04L),
+t17u = LD80C(0xd7c6938325db2024, -14, -1.02889866046435680588e-04L),
+t18u = LD80C(0xe24cb1e3b0474775, -15, 5.39540265505221957652e-05L);
+#define tc (tcu.e)
+#define tf (tfu.e)
+#define tt (ttu.e)
+#define t0 (t0u.e)
+#define t1 (t1u.e)
+#define t2 (t2u.e)
+#define t3 (t3u.e)
+#define t4 (t4u.e)
+#define t5 (t5u.e)
+#define t6 (t6u.e)
+#define t7 (t7u.e)
+#define t8 (t8u.e)
+#define t9 (t9u.e)
+#define t10 (t10u.e)
+#define t11 (t11u.e)
+#define t12 (t12u.e)
+#define t13 (t13u.e)
+#define t14 (t14u.e)
+#define t15 (t15u.e)
+#define t16 (t16u.e)
+#define t17 (t17u.e)
+#define t18 (t18u.e)
+/*
+ * Domain y in [-0.1, 0.232], range ~[-8.1938e-22, 8.3815e-22]:
+ * |(lgamma(1 + y) + 0.5 * y) / y - u(y) / v(y)| < 2**-71.2
+ */
+static const union IEEEl2bits
+u0u = LD80C(0x9e233f1bed863d27, -4, -7.72156649015328606095e-02L),
+u1u = LD80C(0x98280ee45e4ddd3d, -1, 5.94361239198682739769e-01L),
+u2u = LD80C(0xe330c8ead4130733, 0, 1.77492629495841234275e+00L),
+u3u = LD80C(0xd4a213f1a002ec52, 0, 1.66119622514818078064e+00L),
+u4u = LD80C(0xa5a9ca6f5bc62163, -1, 6.47122051417476492989e-01L),
+u5u = LD80C(0xc980e49cd5b019e6, -4, 9.83903751718671509455e-02L),
+u6u = LD80C(0xff636a8bdce7025b, -9, 3.89691687802305743450e-03L),
+v1u = LD80C(0xbd109c533a19fbf5, 1, 2.95413883330948556544e+00L),
+v2u = LD80C(0xd295cbf96f31f099, 1, 3.29039286955665403176e+00L),
+v3u = LD80C(0xdab8bcfee40496cb, 0, 1.70876276441416471410e+00L),
+v4u = LD80C(0xd2f2dc3638567e9f, -2, 4.12009126299534668571e-01L),
+v5u = LD80C(0xa07d9b0851070f41, -5, 3.91822868305682491442e-02L),
+v6u = LD80C(0xe3cd8318f7adb2c4, -11, 8.68998648222144351114e-04L);
+#define u0 (u0u.e)
+#define u1 (u1u.e)
+#define u2 (u2u.e)
+#define u3 (u3u.e)
+#define u4 (u4u.e)
+#define u5 (u5u.e)
+#define u6 (u6u.e)
+#define v1 (v1u.e)
+#define v2 (v2u.e)
+#define v3 (v3u.e)
+#define v4 (v4u.e)
+#define v5 (v5u.e)
+#define v6 (v6u.e)
+/*
+ * Domain x in (2, 3], range ~[-3.3648e-22, 3.4416e-22]:
+ * |(lgamma(y+2) - 0.5 * y) / y - s(y)/r(y)| < 2**-72.3
+ * with y = x - 2.
+ */
+static const union IEEEl2bits
+s0u = LD80C(0x9e233f1bed863d27, -4, -7.72156649015328606095e-02L),
+s1u = LD80C(0xd3ff0dcc7fa91f94, -3, 2.07027640921219389860e-01L),
+s2u = LD80C(0xb2bb62782478ef31, -2, 3.49085881391362090549e-01L),
+s3u = LD80C(0xb49f7438c4611a74, -3, 1.76389518704213357954e-01L),
+s4u = LD80C(0x9a957008fa27ecf9, -5, 3.77401710862930008071e-02L),
+s5u = LD80C(0xda9b389a6ca7a7ac, -9, 3.33566791452943399399e-03L),
+s6u = LD80C(0xbc7a2263faf59c14, -14, 8.98728786745638844395e-05L),
+r1u = LD80C(0xbf5cff5b11477d4d, 0, 1.49502555796294337722e+00L),
+r2u = LD80C(0xd9aec89de08e3da6, -1, 8.50323236984473285866e-01L),
+r3u = LD80C(0xeab7ae5057c443f9, -3, 2.29216312078225806131e-01L),
+r4u = LD80C(0xf29707d9bd2b1e37, -6, 2.96130326586640089145e-02L),
+r5u = LD80C(0xd376c2f09736c5a3, -10, 1.61334161411590662495e-03L),
+r6u = LD80C(0xc985983d0cd34e3d, -16, 2.40232770710953450636e-05L),
+r7u = LD80C(0xe5c7a4f7fc2ef13d, -25, -5.34997929289167573510e-08L);
+#define s0 (s0u.e)
+#define s1 (s1u.e)
+#define s2 (s2u.e)
+#define s3 (s3u.e)
+#define s4 (s4u.e)
+#define s5 (s5u.e)
+#define s6 (s6u.e)
+#define r1 (r1u.e)
+#define r2 (r2u.e)
+#define r3 (r3u.e)
+#define r4 (r4u.e)
+#define r5 (r5u.e)
+#define r6 (r6u.e)
+#define r7 (r7u.e)
+/*
+ * Domain z in [8, 0x1p70], range ~[-3.0235e-22, 3.0563e-22]:
+ * |lgamma(x) - (x - 0.5) * (log(x) - 1) - w(1/x)| < 2**-71.7
+ */
+static const union IEEEl2bits
+w0u = LD80C(0xd67f1c864beb4a69, -2, 4.18938533204672741776e-01L),
+w1u = LD80C(0xaaaaaaaaaaaaaaa1, -4, 8.33333333333333332678e-02L),
+w2u = LD80C(0xb60b60b60b5491c9, -9, -2.77777777777760927870e-03L),
+w3u = LD80C(0xd00d00cf58aede4c, -11, 7.93650793490637233668e-04L),
+w4u = LD80C(0x9c09bf626783d4a5, -11, -5.95238023926039051268e-04L),
+w5u = LD80C(0xdca7cadc5baa517b, -11, 8.41733700408000822962e-04L),
+w6u = LD80C(0xfb060e361e1ffd07, -10, -1.91515849570245136604e-03L),
+w7u = LD80C(0xcbd5101bb58d1f2b, -8, 6.22046743903262649294e-03L),
+w8u = LD80C(0xad27a668d32c821b, -6, -2.11370706734662081843e-02L);
+#define w0 (w0u.e)
+#define w1 (w1u.e)
+#define w2 (w2u.e)
+#define w3 (w3u.e)
+#define w4 (w4u.e)
+#define w5 (w5u.e)
+#define w6 (w6u.e)
+#define w7 (w7u.e)
+#define w8 (w8u.e)
+
+static long double
+sin_pil(long double x)
+{
+ volatile long double vz;
+ long double y,z;
+ uint64_t n;
+ uint16_t hx;
+
+ y = -x;
+
+ vz = y+0x1p63;
+ z = vz-0x1p63;
+ if (z == y)
+ return zero;
+
+ vz = y+0x1p61;
+ EXTRACT_LDBL80_WORDS(hx,n,vz);
+ z = vz-0x1p61;
+ if (z > y) {
+ z -= 0.25; /* adjust to round down */
+ n--;
+ }
+ n &= 7; /* octant of y mod 2 */
+ y = y - z + n * 0.25; /* y mod 2 */
+
+ switch (n) {
+ case 0: y = __kernel_sinl(pi*y,zero,0); break;
+ case 1:
+ case 2: y = __kernel_cosl(pi*(0.5-y),zero); break;
+ case 3:
+ case 4: y = __kernel_sinl(pi*(one-y),zero,0); break;
+ case 5:
+ case 6: y = -__kernel_cosl(pi*(y-1.5),zero); break;
+ default: y = __kernel_sinl(pi*(y-2.0),zero,0); break;
+ }
+ return -y;
+}
+
+long double
+lgammal_r(long double x, int *signgamp)
+{
+ long double nadj,p,p1,p2,q,r,t,w,y,z;
+ uint64_t lx;
+ int i;
+ uint16_t hx,ix;
+
+ EXTRACT_LDBL80_WORDS(hx,lx,x);
+
+ /* purge +-Inf and NaNs */
+ *signgamp = 1;
+ ix = hx&0x7fff;
+ if(ix==0x7fff) return x*x;
+
+ ENTERI();
+
+ /* purge +-0 and tiny arguments */
+ *signgamp = 1-2*(hx>>15);
+ if(ix<0x3fff-67) { /* |x|<2**-(p+3), return -log(|x|) */
+ if((ix|lx)==0)
+ RETURNI(one/vzero);
+ RETURNI(-logl(fabsl(x)));
+ }
+
+ /* purge negative integers and start evaluation for other x < 0 */
+ if(hx&0x8000) {
+ *signgamp = 1;
+ if(ix>=0x3fff+63) /* |x|>=2**(p-1), must be -integer */
+ RETURNI(one/vzero);
+ t = sin_pil(x);
+ if(t==zero) RETURNI(one/vzero); /* -integer */
+ nadj = logl(pi/fabsl(t*x));
+ if(t<zero) *signgamp = -1;
+ x = -x;
+ }
+
+ /* purge 1 and 2 */
+ if((ix==0x3fff || ix==0x4000) && lx==0x8000000000000000ULL) r = 0;
+ /* for x < 2.0 */
+ else if(ix<0x4000) {
+ /*
+ * XXX Supposedly, one can use the following information to replace the
+ * XXX FP rational expressions. A similar approach is appropriate
+ * XXX for ld128, but one (may need?) needs to consider llx, too.
+ *
+ * 8.9999961853027344e-01 3ffe e666600000000000
+ * 7.3159980773925781e-01 3ffe bb4a200000000000
+ * 2.3163998126983643e-01 3ffc ed33080000000000
+ * 1.7316312789916992e+00 3fff dda6180000000000
+ * 1.2316322326660156e+00 3fff 9da6200000000000
+ */
+ if(x<8.9999961853027344e-01) {
+ r = -logl(x);
+ if(x>=7.3159980773925781e-01) {y = 1-x; i= 0;}
+ else if(x>=2.3163998126983643e-01) {y= x-(tc-1); i=1;}
+ else {y = x; i=2;}
+ } else {
+ r = 0;
+ if(x>=1.7316312789916992e+00) {y=2-x;i=0;}
+ else if(x>=1.2316322326660156e+00) {y=x-tc;i=1;}
+ else {y=x-1;i=2;}
+ }
+ switch(i) {
+ case 0:
+ z = y*y;
+ p1 = a0+z*(a2+z*(a4+z*(a6+z*(a8+z*(a10+z*a12)))));
+ p2 = z*(a1+z*(a3+z*(a5+z*(a7+z*(a9+z*(a11+z*a13))))));
+ p = y*p1+p2;
+ r += p-y/2; break;
+ case 1:
+ p = t0+y*t1+tt+y*y*(t2+y*(t3+y*(t4+y*(t5+y*(t6+y*(t7+y*(t8+
+ y*(t9+y*(t10+y*(t11+y*(t12+y*(t13+y*(t14+y*(t15+y*(t16+
+ y*(t17+y*t18))))))))))))))));
+ r += tf + p; break;
+ case 2:
+ p1 = y*(u0+y*(u1+y*(u2+y*(u3+y*(u4+y*(u5+y*u6))))));
+ p2 = 1+y*(v1+y*(v2+y*(v3+y*(v4+y*(v5+y*v6)))));
+ r += p1/p2-y/2;
+ }
+ }
+ /* x < 8.0 */
+ else if(ix<0x4002) {
+ i = x;
+ y = x-i;
+ p = y*(s0+y*(s1+y*(s2+y*(s3+y*(s4+y*(s5+y*s6))))));
+ q = 1+y*(r1+y*(r2+y*(r3+y*(r4+y*(r5+y*(r6+y*r7))))));
+ r = y/2+p/q;
+ z = 1; /* lgamma(1+s) = log(s) + lgamma(s) */
+ switch(i) {
+ case 7: z *= (y+6); /* FALLTHRU */
+ case 6: z *= (y+5); /* FALLTHRU */
+ case 5: z *= (y+4); /* FALLTHRU */
+ case 4: z *= (y+3); /* FALLTHRU */
+ case 3: z *= (y+2); /* FALLTHRU */
+ r += logl(z); break;
+ }
+ /* 8.0 <= x < 2**(p+3) */
+ } else if (ix<0x3fff+67) {
+ t = logl(x);
+ z = one/x;
+ y = z*z;
+ w = w0+z*(w1+y*(w2+y*(w3+y*(w4+y*(w5+y*(w6+y*(w7+y*w8)))))));
+ r = (x-half)*(t-one)+w;
+ /* 2**(p+3) <= x <= inf */
+ } else
+ r = x*(logl(x)-1);
+ if(hx&0x8000) r = nadj - r;
+ RETURNI(r);
+}
diff --git a/newlib/libm/ld80/e_powl.c b/newlib/libm/ld80/e_powl.c
new file mode 100644
index 000000000..ea25354c2
--- /dev/null
+++ b/newlib/libm/ld80/e_powl.c
@@ -0,0 +1,662 @@
+/*-
+ * Copyright (c) 2008 Stephen L. Moshier <steve@moshier.net>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <math.h>
+
+#include "math_private.h"
+
+/*
+ * Polynomial evaluator:
+ * P[0] x^n + P[1] x^(n-1) + ... + P[n]
+ */
+static inline long double
+__polevll(long double x, long double *PP, int n)
+{
+ long double y;
+ long double *P;
+
+ P = PP;
+ y = *P++;
+ do {
+ y = y * x + *P++;
+ } while (--n);
+
+ return (y);
+}
+
+/*
+ * Polynomial evaluator:
+ * x^n + P[0] x^(n-1) + P[1] x^(n-2) + ... + P[n]
+ */
+static inline long double
+__p1evll(long double x, long double *PP, int n)
+{
+ long double y;
+ long double *P;
+
+ P = PP;
+ n -= 1;
+ y = x + *P++;
+ do {
+ y = y * x + *P++;
+ } while (--n);
+
+ return (y);
+}
+
+/* powl.c
+ *
+ * Power function, long double precision
+ *
+ *
+ *
+ * SYNOPSIS:
+ *
+ * long double x, y, z, powl();
+ *
+ * z = powl( x, y );
+ *
+ *
+ *
+ * DESCRIPTION:
+ *
+ * Computes x raised to the yth power. Analytically,
+ *
+ * x**y = exp( y log(x) ).
+ *
+ * Following Cody and Waite, this program uses a lookup table
+ * of 2**-i/32 and pseudo extended precision arithmetic to
+ * obtain several extra bits of accuracy in both the logarithm
+ * and the exponential.
+ *
+ *
+ *
+ * ACCURACY:
+ *
+ * The relative error of pow(x,y) can be estimated
+ * by y dl ln(2), where dl is the absolute error of
+ * the internally computed base 2 logarithm. At the ends
+ * of the approximation interval the logarithm equal 1/32
+ * and its relative error is about 1 lsb = 1.1e-19. Hence
+ * the predicted relative error in the result is 2.3e-21 y .
+ *
+ * Relative error:
+ * arithmetic domain # trials peak rms
+ *
+ * IEEE +-1000 40000 2.8e-18 3.7e-19
+ * .001 < x < 1000, with log(x) uniformly distributed.
+ * -1000 < y < 1000, y uniformly distributed.
+ *
+ * IEEE 0,8700 60000 6.5e-18 1.0e-18
+ * 0.99 < x < 1.01, 0 < y < 8700, uniformly distributed.
+ *
+ *
+ * ERROR MESSAGES:
+ *
+ * message condition value returned
+ * pow overflow x**y > MAXNUM INFINITY
+ * pow underflow x**y < 1/MAXNUM 0.0
+ * pow domain x<0 and y noninteger 0.0
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <float.h>
+#include <math.h>
+
+#include "math_private.h"
+
+/* Table size */
+#define NXT 32
+/* log2(Table size) */
+#define LNXT 5
+
+/* log(1+x) = x - .5x^2 + x^3 * P(z)/Q(z)
+ * on the domain 2^(-1/32) - 1 <= x <= 2^(1/32) - 1
+ */
+static long double P[] = {
+ 8.3319510773868690346226E-4L,
+ 4.9000050881978028599627E-1L,
+ 1.7500123722550302671919E0L,
+ 1.4000100839971580279335E0L,
+};
+static long double Q[] = {
+/* 1.0000000000000000000000E0L,*/
+ 5.2500282295834889175431E0L,
+ 8.4000598057587009834666E0L,
+ 4.2000302519914740834728E0L,
+};
+/* A[i] = 2^(-i/32), rounded to IEEE long double precision.
+ * If i is even, A[i] + B[i/2] gives additional accuracy.
+ */
+static long double A[33] = {
+ 1.0000000000000000000000E0L,
+ 9.7857206208770013448287E-1L,
+ 9.5760328069857364691013E-1L,
+ 9.3708381705514995065011E-1L,
+ 9.1700404320467123175367E-1L,
+ 8.9735453750155359320742E-1L,
+ 8.7812608018664974155474E-1L,
+ 8.5930964906123895780165E-1L,
+ 8.4089641525371454301892E-1L,
+ 8.2287773907698242225554E-1L,
+ 8.0524516597462715409607E-1L,
+ 7.8799042255394324325455E-1L,
+ 7.7110541270397041179298E-1L,
+ 7.5458221379671136985669E-1L,
+ 7.3841307296974965571198E-1L,
+ 7.2259040348852331001267E-1L,
+ 7.0710678118654752438189E-1L,
+ 6.9195494098191597746178E-1L,
+ 6.7712777346844636413344E-1L,
+ 6.6261832157987064729696E-1L,
+ 6.4841977732550483296079E-1L,
+ 6.3452547859586661129850E-1L,
+ 6.2092890603674202431705E-1L,
+ 6.0762367999023443907803E-1L,
+ 5.9460355750136053334378E-1L,
+ 5.8186242938878875689693E-1L,
+ 5.6939431737834582684856E-1L,
+ 5.5719337129794626814472E-1L,
+ 5.4525386633262882960438E-1L,
+ 5.3357020033841180906486E-1L,
+ 5.2213689121370692017331E-1L,
+ 5.1094857432705833910408E-1L,
+ 5.0000000000000000000000E-1L,
+};
+static long double B[17] = {
+ 0.0000000000000000000000E0L,
+ 2.6176170809902549338711E-20L,
+-1.0126791927256478897086E-20L,
+ 1.3438228172316276937655E-21L,
+ 1.2207982955417546912101E-20L,
+-6.3084814358060867200133E-21L,
+ 1.3164426894366316434230E-20L,
+-1.8527916071632873716786E-20L,
+ 1.8950325588932570796551E-20L,
+ 1.5564775779538780478155E-20L,
+ 6.0859793637556860974380E-21L,
+-2.0208749253662532228949E-20L,
+ 1.4966292219224761844552E-20L,
+ 3.3540909728056476875639E-21L,
+-8.6987564101742849540743E-22L,
+-1.2327176863327626135542E-20L,
+ 0.0000000000000000000000E0L,
+};
+
+/* 2^x = 1 + x P(x),
+ * on the interval -1/32 <= x <= 0
+ */
+static long double R[] = {
+ 1.5089970579127659901157E-5L,
+ 1.5402715328927013076125E-4L,
+ 1.3333556028915671091390E-3L,
+ 9.6181291046036762031786E-3L,
+ 5.5504108664798463044015E-2L,
+ 2.4022650695910062854352E-1L,
+ 6.9314718055994530931447E-1L,
+};
+
+#define douba(k) A[k]
+#define doubb(k) B[k]
+#define MEXP (NXT*16384.0L)
+/* The following if denormal numbers are supported, else -MEXP: */
+#define MNEXP (-NXT*(16384.0L+64.0L))
+/* log2(e) - 1 */
+#define LOG2EA 0.44269504088896340735992L
+
+#define F W
+#define Fa Wa
+#define Fb Wb
+#define G W
+#define Ga Wa
+#define Gb u
+#define H W
+#define Ha Wb
+#define Hb Wb
+
+static const long double MAXLOGL = 1.1356523406294143949492E4L;
+static const long double MINLOGL = -1.13994985314888605586758E4L;
+static const long double LOGE2L = 6.9314718055994530941723E-1L;
+static volatile long double z;
+static long double w, W, Wa, Wb, ya, yb, u;
+static const long double huge = 0x1p10000L;
+#if 0 /* XXX Prevent gcc from erroneously constant folding this. */
+static const long double twom10000 = 0x1p-10000L;
+#else
+static volatile long double twom10000 = 0x1p-10000L;
+#endif
+
+static long double reducl( long double );
+static long double powil ( long double, int );
+
+long double
+powl(long double x, long double y)
+{
+/* double F, Fa, Fb, G, Ga, Gb, H, Ha, Hb */
+int i, nflg, iyflg, yoddint;
+long e;
+
+if( y == 0.0L )
+ return( 1.0L );
+
+if( x == 1.0L )
+ return( 1.0L );
+
+if( isnan(x) )
+ return ( nan_mix(x, y) );
+if( isnan(y) )
+ return ( nan_mix(x, y) );
+
+if( y == 1.0L )
+ return( x );
+
+if( !isfinite(y) && x == -1.0L )
+ return( 1.0L );
+
+if( y >= LDBL_MAX )
+ {
+ if( x > 1.0L )
+ return( INFINITY );
+ if( x > 0.0L && x < 1.0L )
+ return( 0.0L );
+ if( x < -1.0L )
+ return( INFINITY );
+ if( x > -1.0L && x < 0.0L )
+ return( 0.0L );
+ }
+if( y <= -LDBL_MAX )
+ {
+ if( x > 1.0L )
+ return( 0.0L );
+ if( x > 0.0L && x < 1.0L )
+ return( INFINITY );
+ if( x < -1.0L )
+ return( 0.0L );
+ if( x > -1.0L && x < 0.0L )
+ return( INFINITY );
+ }
+if( x >= LDBL_MAX )
+ {
+ if( y > 0.0L )
+ return( INFINITY );
+ return( 0.0L );
+ }
+
+w = floorl(y);
+/* Set iyflg to 1 if y is an integer. */
+iyflg = 0;
+if( w == y )
+ iyflg = 1;
+
+/* Test for odd integer y. */
+yoddint = 0;
+if( iyflg )
+ {
+ ya = fabsl(y);
+ ya = floorl(0.5L * ya);
+ yb = 0.5L * fabsl(w);
+ if( ya != yb )
+ yoddint = 1;
+ }
+
+if( x <= -LDBL_MAX )
+ {
+ if( y > 0.0L )
+ {
+ if( yoddint )
+ return( -INFINITY );
+ return( INFINITY );
+ }
+ if( y < 0.0L )
+ {
+ if( yoddint )
+ return( -0.0L );
+ return( 0.0 );
+ }
+ }
+
+
+nflg = 0; /* flag = 1 if x<0 raised to integer power */
+if( x <= 0.0L )
+ {
+ if( x == 0.0L )
+ {
+ if( y < 0.0 )
+ {
+ if( signbit(x) && yoddint )
+ return( -INFINITY );
+ return( INFINITY );
+ }
+ if( y > 0.0 )
+ {
+ if( signbit(x) && yoddint )
+ return( -0.0L );
+ return( 0.0 );
+ }
+ if( y == 0.0L )
+ return( 1.0L ); /* 0**0 */
+ else
+ return( 0.0L ); /* 0**y */
+ }
+ else
+ {
+ if( iyflg == 0 )
+ return (x - x) / (x - x); /* (x<0)**(non-int) is NaN */
+ nflg = 1;
+ }
+ }
+
+/* Integer power of an integer. */
+
+if( iyflg )
+ {
+ i = w;
+ w = floorl(x);
+ if( (w == x) && (fabsl(y) < 32768.0) )
+ {
+ w = powil( x, (int) y );
+ return( w );
+ }
+ }
+
+
+if( nflg )
+ x = fabsl(x);
+
+/* separate significand from exponent */
+x = frexpl( x, &i );
+e = i;
+
+/* find significand in antilog table A[] */
+i = 1;
+if( x <= douba(17) )
+ i = 17;
+if( x <= douba(i+8) )
+ i += 8;
+if( x <= douba(i+4) )
+ i += 4;
+if( x <= douba(i+2) )
+ i += 2;
+if( x >= douba(1) )
+ i = -1;
+i += 1;
+
+
+/* Find (x - A[i])/A[i]
+ * in order to compute log(x/A[i]):
+ *
+ * log(x) = log( a x/a ) = log(a) + log(x/a)
+ *
+ * log(x/a) = log(1+v), v = x/a - 1 = (x-a)/a
+ */
+x -= douba(i);
+x -= doubb(i/2);
+x /= douba(i);
+
+
+/* rational approximation for log(1+v):
+ *
+ * log(1+v) = v - v**2/2 + v**3 P(v) / Q(v)
+ */
+z = x*x;
+w = x * ( z * __polevll( x, P, 3 ) / __p1evll( x, Q, 3 ) );
+w = w - ldexpl( z, -1 ); /* w - 0.5 * z */
+
+/* Convert to base 2 logarithm:
+ * multiply by log2(e) = 1 + LOG2EA
+ */
+z = LOG2EA * w;
+z += w;
+z += LOG2EA * x;
+z += x;
+
+/* Compute exponent term of the base 2 logarithm. */
+w = -i;
+w = ldexpl( w, -LNXT ); /* divide by NXT */
+w += e;
+/* Now base 2 log of x is w + z. */
+
+/* Multiply base 2 log by y, in extended precision. */
+
+/* separate y into large part ya
+ * and small part yb less than 1/NXT
+ */
+ya = reducl(y);
+yb = y - ya;
+
+/* (w+z)(ya+yb)
+ * = w*ya + w*yb + z*y
+ */
+F = z * y + w * yb;
+Fa = reducl(F);
+Fb = F - Fa;
+
+G = Fa + w * ya;
+Ga = reducl(G);
+Gb = G - Ga;
+
+H = Fb + Gb;
+Ha = reducl(H);
+w = ldexpl( Ga+Ha, LNXT );
+
+/* Test the power of 2 for overflow */
+if( w > MEXP )
+ return (huge * huge); /* overflow */
+
+if( w < MNEXP )
+ return (twom10000 * twom10000); /* underflow */
+
+e = w;
+Hb = H - Ha;
+
+if( Hb > 0.0L )
+ {
+ e += 1;
+ Hb -= (1.0L/NXT); /*0.0625L;*/
+ }
+
+/* Now the product y * log2(x) = Hb + e/NXT.
+ *
+ * Compute base 2 exponential of Hb,
+ * where -0.0625 <= Hb <= 0.
+ */
+z = Hb * __polevll( Hb, R, 6 ); /* z = 2**Hb - 1 */
+
+/* Express e/NXT as an integer plus a negative number of (1/NXT)ths.
+ * Find lookup table entry for the fractional power of 2.
+ */
+if( e < 0 )
+ i = 0;
+else
+ i = 1;
+i = e/NXT + i;
+e = NXT*i - e;
+w = douba( e );
+z = w * z; /* 2**-e * ( 1 + (2**Hb-1) ) */
+z = z + w;
+z = ldexpl( z, i ); /* multiply by integer power of 2 */
+
+if( nflg )
+ {
+/* For negative x,
+ * find out if the integer exponent
+ * is odd or even.
+ */
+ w = ldexpl( y, -1 );
+ w = floorl(w);
+ w = ldexpl( w, 1 );
+ if( w != y )
+ z = -z; /* odd exponent */
+ }
+
+return( z );
+}
+
+
+/* Find a multiple of 1/NXT that is within 1/NXT of x. */
+static inline long double
+reducl(long double x)
+{
+long double t;
+
+t = ldexpl( x, LNXT );
+t = floorl( t );
+t = ldexpl( t, -LNXT );
+return(t);
+}
+
+/* powil.c
+ *
+ * Real raised to integer power, long double precision
+ *
+ *
+ *
+ * SYNOPSIS:
+ *
+ * long double x, y, powil();
+ * int n;
+ *
+ * y = powil( x, n );
+ *
+ *
+ *
+ * DESCRIPTION:
+ *
+ * Returns argument x raised to the nth power.
+ * The routine efficiently decomposes n as a sum of powers of
+ * two. The desired power is a product of two-to-the-kth
+ * powers of x. Thus to compute the 32767 power of x requires
+ * 28 multiplications instead of 32767 multiplications.
+ *
+ *
+ *
+ * ACCURACY:
+ *
+ *
+ * Relative error:
+ * arithmetic x domain n domain # trials peak rms
+ * IEEE .001,1000 -1022,1023 50000 4.3e-17 7.8e-18
+ * IEEE 1,2 -1022,1023 20000 3.9e-17 7.6e-18
+ * IEEE .99,1.01 0,8700 10000 3.6e-16 7.2e-17
+ *
+ * Returns MAXNUM on overflow, zero on underflow.
+ *
+ */
+
+static long double
+powil(long double x, int nn)
+{
+long double ww, y;
+long double s;
+int n, e, sign, asign, lx;
+
+if( x == 0.0L )
+ {
+ if( nn == 0 )
+ return( 1.0L );
+ else if( nn < 0 )
+ return( LDBL_MAX );
+ else
+ return( 0.0L );
+ }
+
+if( nn == 0 )
+ return( 1.0L );
+
+
+if( x < 0.0L )
+ {
+ asign = -1;
+ x = -x;
+ }
+else
+ asign = 0;
+
+
+if( nn < 0 )
+ {
+ sign = -1;
+ n = -nn;
+ }
+else
+ {
+ sign = 1;
+ n = nn;
+ }
+
+/* Overflow detection */
+
+/* Calculate approximate logarithm of answer */
+s = x;
+s = frexpl( s, &lx );
+e = (lx - 1)*n;
+if( (e == 0) || (e > 64) || (e < -64) )
+ {
+ s = (s - 7.0710678118654752e-1L) / (s + 7.0710678118654752e-1L);
+ s = (2.9142135623730950L * s - 0.5L + lx) * nn * LOGE2L;
+ }
+else
+ {
+ s = LOGE2L * e;
+ }
+
+if( s > MAXLOGL )
+ return (huge * huge); /* overflow */
+
+if( s < MINLOGL )
+ return (twom10000 * twom10000); /* underflow */
+/* Handle tiny denormal answer, but with less accuracy
+ * since roundoff error in 1.0/x will be amplified.
+ * The precise demarcation should be the gradual underflow threshold.
+ */
+if( s < (-MAXLOGL+2.0L) )
+ {
+ x = 1.0L/x;
+ sign = -sign;
+ }
+
+/* First bit of the power */
+if( n & 1 )
+ y = x;
+
+else
+ {
+ y = 1.0L;
+ asign = 0;
+ }
+
+ww = x;
+n >>= 1;
+while( n )
+ {
+ ww = ww * ww; /* arg to the 2-to-the-kth power */
+ if( n & 1 ) /* if that bit is set, then include in product */
+ y *= ww;
+ n >>= 1;
+ }
+
+if( asign )
+ y = -y; /* odd power of negative number */
+if( sign < 0 )
+ y = 1.0L/y;
+return(y);
+}
diff --git a/newlib/libm/ld80/e_rem_pio2l.h b/newlib/libm/ld80/e_rem_pio2l.h
new file mode 100644
index 000000000..b7ef5d983
--- /dev/null
+++ b/newlib/libm/ld80/e_rem_pio2l.h
@@ -0,0 +1,143 @@
+/* From: @(#)e_rem_pio2.c 1.4 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ * Copyright (c) 2008 Steven G. Kargl, David Schultz, Bruce D. Evans.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ *
+ * Optimized by Bruce D. Evans.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/* ld80 version of __ieee754_rem_pio2l(x,y)
+ *
+ * return the remainder of x rem pi/2 in y[0]+y[1]
+ * use __kernel_rem_pio2()
+ */
+
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+#include "../ld/fpmath.h"
+
+#define BIAS (LDBL_MAX_EXP - 1)
+
+/*
+ * invpio2: 64 bits of 2/pi
+ * pio2_1: first 39 bits of pi/2
+ * pio2_1t: pi/2 - pio2_1
+ * pio2_2: second 39 bits of pi/2
+ * pio2_2t: pi/2 - (pio2_1+pio2_2)
+ * pio2_3: third 39 bits of pi/2
+ * pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3)
+ */
+
+static const double
+zero = 0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */
+two24 = 1.67772160000000000000e+07, /* 0x41700000, 0x00000000 */
+pio2_1 = 1.57079632679597125389e+00, /* 0x3FF921FB, 0x54444000 */
+pio2_2 = -1.07463465549783099519e-12, /* -0x12e7b967674000.0p-92 */
+pio2_3 = 6.36831716351370313614e-25; /* 0x18a2e037074000.0p-133 */
+
+#if defined(__amd64__) || defined(__i386__)
+/* Long double constants are slow on these arches, and broken on i386. */
+static const volatile double
+invpio2hi = 6.3661977236758138e-01, /* 0x145f306dc9c883.0p-53 */
+invpio2lo = -3.9356538861223811e-17, /* -0x16b00000000000.0p-107 */
+pio2_1thi = -1.0746346554971943e-12, /* -0x12e7b9676733af.0p-92 */
+pio2_1tlo = 8.8451028997905949e-29, /* 0x1c080000000000.0p-146 */
+pio2_2thi = 6.3683171635109499e-25, /* 0x18a2e03707344a.0p-133 */
+pio2_2tlo = 2.3183081793789774e-41, /* 0x10280000000000.0p-187 */
+pio2_3thi = -2.7529965190440717e-37, /* -0x176b7ed8fbbacc.0p-174 */
+pio2_3tlo = -4.2006647512740502e-54; /* -0x19c00000000000.0p-230 */
+#define invpio2 ((long double)invpio2hi + invpio2lo)
+#define pio2_1t ((long double)pio2_1thi + pio2_1tlo)
+#define pio2_2t ((long double)pio2_2thi + pio2_2tlo)
+#define pio2_3t ((long double)pio2_3thi + pio2_3tlo)
+#else
+static const long double
+invpio2 = 6.36619772367581343076e-01L, /* 0xa2f9836e4e44152a.0p-64 */
+pio2_1t = -1.07463465549719416346e-12L, /* -0x973dcb3b399d747f.0p-103 */
+pio2_2t = 6.36831716351095013979e-25L, /* 0xc51701b839a25205.0p-144 */
+pio2_3t = -2.75299651904407171810e-37L; /* -0xbb5bf6c7ddd660ce.0p-185 */
+#endif
+
+static inline __always_inline int
+__ieee754_rem_pio2l(long double x, long double *y)
+{
+ union IEEEl2bits u,u1;
+ long double z,w,t,r,fn;
+ double tx[3],ty[2];
+ int e0,ex,i,j,nx,n;
+ int16_t expsign;
+
+ u.e = x;
+ expsign = u.xbits.expsign;
+ ex = expsign & 0x7fff;
+ if (ex < BIAS + 25 || (ex == BIAS + 25 && u.bits.manh < 0xc90fdaa2)) {
+ /* |x| ~< 2^25*(pi/2), medium size */
+ fn = rnintl(x*invpio2);
+ n = irint(fn);
+ r = x-fn*pio2_1;
+ w = fn*pio2_1t; /* 1st round good to 102 bit */
+ {
+ union IEEEl2bits u2;
+ int ex1;
+ j = ex;
+ y[0] = r-w;
+ u2.e = y[0];
+ ex1 = u2.xbits.expsign & 0x7fff;
+ i = j-ex1;
+ if(i>22) { /* 2nd iteration needed, good to 141 */
+ t = r;
+ w = fn*pio2_2;
+ r = t-w;
+ w = fn*pio2_2t-((t-r)-w);
+ y[0] = r-w;
+ u2.e = y[0];
+ ex1 = u2.xbits.expsign & 0x7fff;
+ i = j-ex1;
+ if(i>61) { /* 3rd iteration need, 180 bits acc */
+ t = r; /* will cover all possible cases */
+ w = fn*pio2_3;
+ r = t-w;
+ w = fn*pio2_3t-((t-r)-w);
+ y[0] = r-w;
+ }
+ }
+ }
+ y[1] = (r-y[0])-w;
+ return n;
+ }
+ /*
+ * all other (large) arguments
+ */
+ if(ex==0x7fff) { /* x is inf or NaN */
+ y[0]=y[1]=x-x; return 0;
+ }
+ /* set z = scalbn(|x|,ilogb(x)-23) */
+ u1.e = x;
+ e0 = ex - BIAS - 23; /* e0 = ilogb(|x|)-23; */
+ u1.xbits.expsign = ex - e0;
+ z = u1.e;
+ for(i=0;i<2;i++) {
+ tx[i] = (double)((int32_t)(z));
+ z = (z-tx[i])*two24;
+ }
+ tx[2] = z;
+ nx = 3;
+ while(tx[nx-1]==zero) nx--; /* skip zero term */
+ n = __kernel_rem_pio2(tx,ty,e0,nx,2);
+ r = (long double)ty[0] + ty[1];
+ w = ty[1] - (r - ty[0]);
+ if(expsign<0) {y[0] = -r; y[1] = -w; return -n;}
+ y[0] = r; y[1] = w; return n;
+}
diff --git a/newlib/libm/ld80/invtrig.c b/newlib/libm/ld80/invtrig.c
new file mode 100644
index 000000000..5c8047857
--- /dev/null
+++ b/newlib/libm/ld80/invtrig.c
@@ -0,0 +1,84 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2008 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "invtrig.h"
+
+/*
+ * asinl() and acosl()
+ */
+const long double
+pS0 = 1.66666666666666666631e-01L,
+pS1 = -4.16313987993683104320e-01L,
+pS2 = 3.69068046323246813704e-01L,
+pS3 = -1.36213932016738603108e-01L,
+pS4 = 1.78324189708471965733e-02L,
+pS5 = -2.19216428382605211588e-04L,
+pS6 = -7.10526623669075243183e-06L,
+qS1 = -2.94788392796209867269e+00L,
+qS2 = 3.27309890266528636716e+00L,
+qS3 = -1.68285799854822427013e+00L,
+qS4 = 3.90699412641738801874e-01L,
+qS5 = -3.14365703596053263322e-02L;
+
+/*
+ * atanl()
+ */
+const long double atanhi[] = {
+ 4.63647609000806116202e-01L,
+ 7.85398163397448309628e-01L,
+ 9.82793723247329067960e-01L,
+ 1.57079632679489661926e+00L,
+};
+
+const long double atanlo[] = {
+ 1.18469937025062860669e-20L,
+ -1.25413940316708300586e-20L,
+ 2.55232234165405176172e-20L,
+ -2.50827880633416601173e-20L,
+};
+
+const long double aT[] = {
+ 3.33333333333333333017e-01L,
+ -1.99999999999999632011e-01L,
+ 1.42857142857046531280e-01L,
+ -1.11111111100562372733e-01L,
+ 9.09090902935647302252e-02L,
+ -7.69230552476207730353e-02L,
+ 6.66661718042406260546e-02L,
+ -5.88158892835030888692e-02L,
+ 5.25499891539726639379e-02L,
+ -4.70119845393155721494e-02L,
+ 4.03539201366454414072e-02L,
+ -2.91303858419364158725e-02L,
+ 1.24822046299269234080e-02L,
+};
+
+const long double pi_lo = -5.01655761266833202345e-20L;
diff --git a/newlib/libm/ld80/invtrig.h b/newlib/libm/ld80/invtrig.h
new file mode 100644
index 000000000..be06a044b
--- /dev/null
+++ b/newlib/libm/ld80/invtrig.h
@@ -0,0 +1,116 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2008 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <float.h>
+
+#include "fpmath.h"
+
+#define BIAS (LDBL_MAX_EXP - 1)
+#define MANH_SIZE LDBL_MANH_SIZE
+
+/* Approximation thresholds. */
+#define ASIN_LINEAR (BIAS - 32) /* 2**-32 */
+#define ACOS_CONST (BIAS - 65) /* 2**-65 */
+#define ATAN_CONST (BIAS + 65) /* 2**65 */
+#define ATAN_LINEAR (BIAS - 32) /* 2**-32 */
+
+/* 0.95 */
+#define THRESH ((0xe666666666666666ULL>>(64-(MANH_SIZE-1)))|LDBL_NBIT)
+
+/* Constants shared by the long double inverse trig functions. */
+#define pS0 _ItL_pS0
+#define pS1 _ItL_pS1
+#define pS2 _ItL_pS2
+#define pS3 _ItL_pS3
+#define pS4 _ItL_pS4
+#define pS5 _ItL_pS5
+#define pS6 _ItL_pS6
+#define qS1 _ItL_qS1
+#define qS2 _ItL_qS2
+#define qS3 _ItL_qS3
+#define qS4 _ItL_qS4
+#define qS5 _ItL_qS5
+#define atanhi _ItL_atanhi
+#define atanlo _ItL_atanlo
+#define aT _ItL_aT
+#define pi_lo _ItL_pi_lo
+
+#define pio2_hi atanhi[3]
+#define pio2_lo atanlo[3]
+#define pio4_hi atanhi[1]
+
+#ifdef STRUCT_DECLS
+typedef struct longdouble {
+ uint64_t mant;
+ uint16_t expsign;
+} LONGDOUBLE;
+#else
+typedef long double LONGDOUBLE;
+#endif
+
+extern const LONGDOUBLE pS0, pS1, pS2, pS3, pS4, pS5, pS6;
+extern const LONGDOUBLE qS1, qS2, qS3, qS4, qS5;
+extern const LONGDOUBLE atanhi[], atanlo[], aT[];
+extern const LONGDOUBLE pi_lo;
+
+#ifndef STRUCT_DECLS
+
+static inline long double
+P(long double x)
+{
+
+ return (x * (pS0 + x * (pS1 + x * (pS2 + x * (pS3 + x * \
+ (pS4 + x * (pS5 + x * pS6)))))));
+}
+
+static inline long double
+Q(long double x)
+{
+
+ return (1.0 + x * (qS1 + x * (qS2 + x * (qS3 + x * (qS4 + x * qS5)))));
+}
+
+static inline long double
+T_even(long double x)
+{
+
+ return (aT[0] + x * (aT[2] + x * (aT[4] + x * (aT[6] + x * \
+ (aT[8] + x * (aT[10] + x * aT[12]))))));
+}
+
+static inline long double
+T_odd(long double x)
+{
+
+ return (aT[1] + x * (aT[3] + x * (aT[5] + x * (aT[7] + x * \
+ (aT[9] + x * aT[11])))));
+}
+
+#endif
diff --git a/newlib/libm/ld80/k_cosl.c b/newlib/libm/ld80/k_cosl.c
new file mode 100644
index 000000000..6dde6adad
--- /dev/null
+++ b/newlib/libm/ld80/k_cosl.c
@@ -0,0 +1,78 @@
+/* From: @(#)k_cos.c 1.3 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ * Copyright (c) 2008 Steven G. Kargl, David Schultz, Bruce D. Evans.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * ld80 version of k_cos.c. See ../src/k_cos.c for most comments.
+ */
+
+#include "math_private.h"
+
+/*
+ * Domain [-0.7854, 0.7854], range ~[-2.43e-23, 2.425e-23]:
+ * |cos(x) - c(x)| < 2**-75.1
+ *
+ * The coefficients of c(x) were generated by a pari-gp script using
+ * a Remez algorithm that searches for the best higher coefficients
+ * after rounding leading coefficients to a specified precision.
+ *
+ * Simpler methods like Chebyshev or basic Remez barely suffice for
+ * cos() in 64-bit precision, because we want the coefficient of x^2
+ * to be precisely -0.5 so that multiplying by it is exact, and plain
+ * rounding of the coefficients of a good polynomial approximation only
+ * gives this up to about 64-bit precision. Plain rounding also gives
+ * a mediocre approximation for the coefficient of x^4, but a rounding
+ * error of 0.5 ulps for this coefficient would only contribute ~0.01
+ * ulps to the final error, so this is unimportant. Rounding errors in
+ * higher coefficients are even less important.
+ *
+ * In fact, coefficients above the x^4 one only need to have 53-bit
+ * precision, and this is more efficient. We get this optimization
+ * almost for free from the complications needed to search for the best
+ * higher coefficients.
+ */
+static const double
+one = 1.0;
+
+#if defined(__amd64__) || defined(__i386__)
+/* Long double constants are slow on these arches, and broken on i386. */
+static const volatile double
+C1hi = 0.041666666666666664, /* 0x15555555555555.0p-57 */
+C1lo = 2.2598839032744733e-18; /* 0x14d80000000000.0p-111 */
+#define C1 ((long double)C1hi + C1lo)
+#else
+static const long double
+C1 = 0.0416666666666666666136L; /* 0xaaaaaaaaaaaaaa9b.0p-68 */
+#endif
+
+static const double
+C2 = -0.0013888888888888874, /* -0x16c16c16c16c10.0p-62 */
+C3 = 0.000024801587301571716, /* 0x1a01a01a018e22.0p-68 */
+C4 = -0.00000027557319215507120, /* -0x127e4fb7602f22.0p-74 */
+C5 = 0.0000000020876754400407278, /* 0x11eed8caaeccf1.0p-81 */
+C6 = -1.1470297442401303e-11, /* -0x19393412bd1529.0p-89 */
+C7 = 4.7383039476436467e-14; /* 0x1aac9d9af5c43e.0p-97 */
+
+long double
+__kernel_cosl(long double x, long double y)
+{
+ long double hz,z,r,w;
+
+ z = x*x;
+ r = z*(C1+z*(C2+z*(C3+z*(C4+z*(C5+z*(C6+z*C7))))));
+ hz = 0.5*z;
+ w = one-hz;
+ return w + (((one-w)-hz) + (z*r-x*y));
+}
diff --git a/newlib/libm/ld80/k_cospil.h b/newlib/libm/ld80/k_cospil.h
new file mode 100644
index 000000000..6e13ef02a
--- /dev/null
+++ b/newlib/libm/ld80/k_cospil.h
@@ -0,0 +1,42 @@
+/*-
+ * Copyright (c) 2017 Steven G. Kargl
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice unmodified, this list of conditions, and the following
+ * disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * See ../src/k_cospi.c for implementation details.
+ */
+
+static inline long double
+__kernel_cospil(long double x)
+{
+ long double hi, lo;
+
+ hi = (float)x;
+ lo = x - hi;
+ lo = lo * (pi_lo + pi_hi) + hi * pi_lo;
+ hi *= pi_hi;
+ _2sumF(hi, lo);
+ return (__kernel_cosl(hi, lo));
+}
diff --git a/newlib/libm/ld80/k_expl.h b/newlib/libm/ld80/k_expl.h
new file mode 100644
index 000000000..a744d2d38
--- /dev/null
+++ b/newlib/libm/ld80/k_expl.h
@@ -0,0 +1,301 @@
+/* from: FreeBSD: head/lib/msun/ld80/s_expl.c 251343 2013-06-03 19:51:32Z kargl */
+
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2009-2013 Steven G. Kargl
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice unmodified, this list of conditions, and the following
+ * disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Optimized by Bruce D. Evans.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * See s_expl.c for more comments about __k_expl().
+ *
+ * See ../src/e_exp.c and ../src/k_exp.h for precision-independent comments
+ * about the secondary kernels.
+ */
+
+#define INTERVALS 128
+#define LOG2_INTERVALS 7
+#define BIAS (LDBL_MAX_EXP - 1)
+
+static const double
+/*
+ * ln2/INTERVALS = L1+L2 (hi+lo decomposition for multiplication). L1 must
+ * have at least 22 (= log2(|LDBL_MIN_EXP-extras|) + log2(INTERVALS)) lowest
+ * bits zero so that multiplication of it by n is exact.
+ */
+INV_L = 1.8466496523378731e+2, /* 0x171547652b82fe.0p-45 */
+L1 = 5.4152123484527692e-3, /* 0x162e42ff000000.0p-60 */
+L2 = -3.2819649005320973e-13, /* -0x1718432a1b0e26.0p-94 */
+/*
+ * Domain [-0.002708, 0.002708], range ~[-5.7136e-24, 5.7110e-24]:
+ * |exp(x) - p(x)| < 2**-77.2
+ * (0.002708 is ln2/(2*INTERVALS) rounded up a little).
+ */
+A2 = 0.5,
+A3 = 1.6666666666666119e-1, /* 0x15555555555490.0p-55 */
+A4 = 4.1666666666665887e-2, /* 0x155555555554e5.0p-57 */
+A5 = 8.3333354987869413e-3, /* 0x1111115b789919.0p-59 */
+A6 = 1.3888891738560272e-3; /* 0x16c16c651633ae.0p-62 */
+
+/*
+ * 2^(i/INTERVALS) for i in [0,INTERVALS] is represented by two values where
+ * the first 53 bits of the significand are stored in hi and the next 53
+ * bits are in lo. Tang's paper states that the trailing 6 bits of hi must
+ * be zero for his algorithm in both single and double precision, because
+ * the table is re-used in the implementation of expm1() where a floating
+ * point addition involving hi must be exact. Here hi is double, so
+ * converting it to long double gives 11 trailing zero bits.
+ */
+static const struct {
+ double hi;
+ double lo;
+} tbl[INTERVALS] = {
+ { 0x1p+0, 0x0p+0 },
+ /*
+ * XXX hi is rounded down, and the formatting is not quite normal.
+ * But I rather like both. The 0x1.*p format is good for 4N+1
+ * mantissa bits. Rounding down makes the lo terms positive,
+ * so that the columnar formatting can be simpler.
+ */
+ { 0x1.0163da9fb3335p+0, 0x1.b61299ab8cdb7p-54 },
+ { 0x1.02c9a3e778060p+0, 0x1.dcdef95949ef4p-53 },
+ { 0x1.04315e86e7f84p+0, 0x1.7ae71f3441b49p-53 },
+ { 0x1.059b0d3158574p+0, 0x1.d73e2a475b465p-55 },
+ { 0x1.0706b29ddf6ddp+0, 0x1.8db880753b0f6p-53 },
+ { 0x1.0874518759bc8p+0, 0x1.186be4bb284ffp-57 },
+ { 0x1.09e3ecac6f383p+0, 0x1.1487818316136p-54 },
+ { 0x1.0b5586cf9890fp+0, 0x1.8a62e4adc610bp-54 },
+ { 0x1.0cc922b7247f7p+0, 0x1.01edc16e24f71p-54 },
+ { 0x1.0e3ec32d3d1a2p+0, 0x1.03a1727c57b53p-59 },
+ { 0x1.0fb66affed31ap+0, 0x1.e464123bb1428p-53 },
+ { 0x1.11301d0125b50p+0, 0x1.49d77e35db263p-53 },
+ { 0x1.12abdc06c31cbp+0, 0x1.f72575a649ad2p-53 },
+ { 0x1.1429aaea92ddfp+0, 0x1.66820328764b1p-53 },
+ { 0x1.15a98c8a58e51p+0, 0x1.2406ab9eeab0ap-55 },
+ { 0x1.172b83c7d517ap+0, 0x1.b9bef918a1d63p-53 },
+ { 0x1.18af9388c8de9p+0, 0x1.777ee1734784ap-53 },
+ { 0x1.1a35beb6fcb75p+0, 0x1.e5b4c7b4968e4p-55 },
+ { 0x1.1bbe084045cd3p+0, 0x1.3563ce56884fcp-53 },
+ { 0x1.1d4873168b9aap+0, 0x1.e016e00a2643cp-54 },
+ { 0x1.1ed5022fcd91cp+0, 0x1.71033fec2243ap-53 },
+ { 0x1.2063b88628cd6p+0, 0x1.dc775814a8495p-55 },
+ { 0x1.21f49917ddc96p+0, 0x1.2a97e9494a5eep-55 },
+ { 0x1.2387a6e756238p+0, 0x1.9b07eb6c70573p-54 },
+ { 0x1.251ce4fb2a63fp+0, 0x1.ac155bef4f4a4p-55 },
+ { 0x1.26b4565e27cddp+0, 0x1.2bd339940e9d9p-55 },
+ { 0x1.284dfe1f56380p+0, 0x1.2d9e2b9e07941p-53 },
+ { 0x1.29e9df51fdee1p+0, 0x1.612e8afad1255p-55 },
+ { 0x1.2b87fd0dad98fp+0, 0x1.fbbd48ca71f95p-53 },
+ { 0x1.2d285a6e4030bp+0, 0x1.0024754db41d5p-54 },
+ { 0x1.2ecafa93e2f56p+0, 0x1.1ca0f45d52383p-56 },
+ { 0x1.306fe0a31b715p+0, 0x1.6f46ad23182e4p-55 },
+ { 0x1.32170fc4cd831p+0, 0x1.a9ce78e18047cp-55 },
+ { 0x1.33c08b26416ffp+0, 0x1.32721843659a6p-54 },
+ { 0x1.356c55f929ff0p+0, 0x1.928c468ec6e76p-53 },
+ { 0x1.371a7373aa9cap+0, 0x1.4e28aa05e8a8fp-53 },
+ { 0x1.38cae6d05d865p+0, 0x1.0b53961b37da2p-53 },
+ { 0x1.3a7db34e59ff6p+0, 0x1.d43792533c144p-53 },
+ { 0x1.3c32dc313a8e4p+0, 0x1.08003e4516b1ep-53 },
+ { 0x1.3dea64c123422p+0, 0x1.ada0911f09ebcp-55 },
+ { 0x1.3fa4504ac801bp+0, 0x1.417ee03548306p-53 },
+ { 0x1.4160a21f72e29p+0, 0x1.f0864b71e7b6cp-53 },
+ { 0x1.431f5d950a896p+0, 0x1.b8e088728219ap-53 },
+ { 0x1.44e086061892dp+0, 0x1.89b7a04ef80d0p-59 },
+ { 0x1.46a41ed1d0057p+0, 0x1.c944bd1648a76p-54 },
+ { 0x1.486a2b5c13cd0p+0, 0x1.3c1a3b69062f0p-56 },
+ { 0x1.4a32af0d7d3dep+0, 0x1.9cb62f3d1be56p-54 },
+ { 0x1.4bfdad5362a27p+0, 0x1.d4397afec42e2p-56 },
+ { 0x1.4dcb299fddd0dp+0, 0x1.8ecdbbc6a7833p-54 },
+ { 0x1.4f9b2769d2ca6p+0, 0x1.5a67b16d3540ep-53 },
+ { 0x1.516daa2cf6641p+0, 0x1.8225ea5909b04p-53 },
+ { 0x1.5342b569d4f81p+0, 0x1.be1507893b0d5p-53 },
+ { 0x1.551a4ca5d920ep+0, 0x1.8a5d8c4048699p-53 },
+ { 0x1.56f4736b527dap+0, 0x1.9bb2c011d93adp-54 },
+ { 0x1.58d12d497c7fdp+0, 0x1.295e15b9a1de8p-55 },
+ { 0x1.5ab07dd485429p+0, 0x1.6324c054647adp-54 },
+ { 0x1.5c9268a5946b7p+0, 0x1.c4b1b816986a2p-60 },
+ { 0x1.5e76f15ad2148p+0, 0x1.ba6f93080e65ep-54 },
+ { 0x1.605e1b976dc08p+0, 0x1.60edeb25490dcp-53 },
+ { 0x1.6247eb03a5584p+0, 0x1.63e1f40dfa5b5p-53 },
+ { 0x1.6434634ccc31fp+0, 0x1.8edf0e2989db3p-53 },
+ { 0x1.6623882552224p+0, 0x1.224fb3c5371e6p-53 },
+ { 0x1.68155d44ca973p+0, 0x1.038ae44f73e65p-57 },
+ { 0x1.6a09e667f3bccp+0, 0x1.21165f626cdd5p-53 },
+ { 0x1.6c012750bdabep+0, 0x1.daed533001e9ep-53 },
+ { 0x1.6dfb23c651a2ep+0, 0x1.e441c597c3775p-53 },
+ { 0x1.6ff7df9519483p+0, 0x1.9f0fc369e7c42p-53 },
+ { 0x1.71f75e8ec5f73p+0, 0x1.ba46e1e5de15ap-53 },
+ { 0x1.73f9a48a58173p+0, 0x1.7ab9349cd1562p-53 },
+ { 0x1.75feb564267c8p+0, 0x1.7edd354674916p-53 },
+ { 0x1.780694fde5d3fp+0, 0x1.866b80a02162dp-54 },
+ { 0x1.7a11473eb0186p+0, 0x1.afaa2047ed9b4p-53 },
+ { 0x1.7c1ed0130c132p+0, 0x1.f124cd1164dd6p-54 },
+ { 0x1.7e2f336cf4e62p+0, 0x1.05d02ba15797ep-56 },
+ { 0x1.80427543e1a11p+0, 0x1.6c1bccec9346bp-53 },
+ { 0x1.82589994cce12p+0, 0x1.159f115f56694p-53 },
+ { 0x1.8471a4623c7acp+0, 0x1.9ca5ed72f8c81p-53 },
+ { 0x1.868d99b4492ecp+0, 0x1.01c83b21584a3p-53 },
+ { 0x1.88ac7d98a6699p+0, 0x1.994c2f37cb53ap-54 },
+ { 0x1.8ace5422aa0dbp+0, 0x1.6e9f156864b27p-54 },
+ { 0x1.8cf3216b5448bp+0, 0x1.de55439a2c38bp-53 },
+ { 0x1.8f1ae99157736p+0, 0x1.5cc13a2e3976cp-55 },
+ { 0x1.9145b0b91ffc5p+0, 0x1.114c368d3ed6ep-53 },
+ { 0x1.93737b0cdc5e4p+0, 0x1.e8a0387e4a814p-53 },
+ { 0x1.95a44cbc8520ep+0, 0x1.d36906d2b41f9p-53 },
+ { 0x1.97d829fde4e4fp+0, 0x1.173d241f23d18p-53 },
+ { 0x1.9a0f170ca07b9p+0, 0x1.7462137188ce7p-53 },
+ { 0x1.9c49182a3f090p+0, 0x1.c7c46b071f2bep-56 },
+ { 0x1.9e86319e32323p+0, 0x1.824ca78e64c6ep-56 },
+ { 0x1.a0c667b5de564p+0, 0x1.6535b51719567p-53 },
+ { 0x1.a309bec4a2d33p+0, 0x1.6305c7ddc36abp-54 },
+ { 0x1.a5503b23e255cp+0, 0x1.1684892395f0fp-53 },
+ { 0x1.a799e1330b358p+0, 0x1.bcb7ecac563c7p-54 },
+ { 0x1.a9e6b5579fdbfp+0, 0x1.0fac90ef7fd31p-54 },
+ { 0x1.ac36bbfd3f379p+0, 0x1.81b72cd4624ccp-53 },
+ { 0x1.ae89f995ad3adp+0, 0x1.7a1cd345dcc81p-54 },
+ { 0x1.b0e07298db665p+0, 0x1.2108559bf8deep-53 },
+ { 0x1.b33a2b84f15fap+0, 0x1.ed7fa1cf7b290p-53 },
+ { 0x1.b59728de55939p+0, 0x1.1c7102222c90ep-53 },
+ { 0x1.b7f76f2fb5e46p+0, 0x1.d54f610356a79p-53 },
+ { 0x1.ba5b030a10649p+0, 0x1.0819678d5eb69p-53 },
+ { 0x1.bcc1e904bc1d2p+0, 0x1.23dd07a2d9e84p-55 },
+ { 0x1.bf2c25bd71e08p+0, 0x1.0811ae04a31c7p-53 },
+ { 0x1.c199bdd85529cp+0, 0x1.11065895048ddp-55 },
+ { 0x1.c40ab5fffd07ap+0, 0x1.b4537e083c60ap-54 },
+ { 0x1.c67f12e57d14bp+0, 0x1.2884dff483cadp-54 },
+ { 0x1.c8f6d9406e7b5p+0, 0x1.1acbc48805c44p-56 },
+ { 0x1.cb720dcef9069p+0, 0x1.503cbd1e949dbp-56 },
+ { 0x1.cdf0b555dc3f9p+0, 0x1.889f12b1f58a3p-53 },
+ { 0x1.d072d4a07897bp+0, 0x1.1a1e45e4342b2p-53 },
+ { 0x1.d2f87080d89f1p+0, 0x1.15bc247313d44p-53 },
+ { 0x1.d5818dcfba487p+0, 0x1.2ed02d75b3707p-55 },
+ { 0x1.d80e316c98397p+0, 0x1.7709f3a09100cp-53 },
+ { 0x1.da9e603db3285p+0, 0x1.c2300696db532p-54 },
+ { 0x1.dd321f301b460p+0, 0x1.2da5778f018c3p-54 },
+ { 0x1.dfc97337b9b5ep+0, 0x1.72d195873da52p-53 },
+ { 0x1.e264614f5a128p+0, 0x1.424ec3f42f5b5p-53 },
+ { 0x1.e502ee78b3ff6p+0, 0x1.39e8980a9cc8fp-55 },
+ { 0x1.e7a51fbc74c83p+0, 0x1.2d522ca0c8de2p-54 },
+ { 0x1.ea4afa2a490d9p+0, 0x1.0b1ee7431ebb6p-53 },
+ { 0x1.ecf482d8e67f0p+0, 0x1.1b60625f7293ap-53 },
+ { 0x1.efa1bee615a27p+0, 0x1.dc7f486a4b6b0p-54 },
+ { 0x1.f252b376bba97p+0, 0x1.3a1a5bf0d8e43p-54 },
+ { 0x1.f50765b6e4540p+0, 0x1.9d3e12dd8a18bp-54 },
+ { 0x1.f7bfdad9cbe13p+0, 0x1.1227697fce57bp-53 },
+ { 0x1.fa7c1819e90d8p+0, 0x1.74853f3a5931ep-55 },
+ { 0x1.fd3c22b8f71f1p+0, 0x1.2eb74966579e7p-57 }
+};
+
+/*
+ * Kernel for expl(x). x must be finite and not tiny or huge.
+ * "tiny" is anything that would make us underflow (|A6*x^6| < ~LDBL_MIN).
+ * "huge" is anything that would make fn*L1 inexact (|x| > ~2**17*ln2).
+ */
+static inline void
+__k_expl(long double x, long double *hip, long double *lop, int *kp)
+{
+ long double fn, q, r, r1, r2, t, z;
+ int n, n2;
+
+ /* Reduce x to (k*ln2 + endpoint[n2] + r1 + r2). */
+ fn = rnintl(x * INV_L);
+ r = x - fn * L1 - fn * L2; /* r = r1 + r2 done independently. */
+ n = irint(fn);
+ n2 = (unsigned)n % INTERVALS;
+ /* Depend on the sign bit being propagated: */
+ *kp = n >> LOG2_INTERVALS;
+ r1 = x - fn * L1;
+ r2 = fn * -L2;
+
+ /* Evaluate expl(endpoint[n2] + r1 + r2) = tbl[n2] * expl(r1 + r2). */
+ z = r * r;
+#if 0
+ q = r2 + z * (A2 + r * A3) + z * z * (A4 + r * A5) + z * z * z * A6;
+#else
+ q = r2 + z * A2 + z * r * (A3 + r * A4 + z * (A5 + r * A6));
+#endif
+ t = (long double)tbl[n2].lo + tbl[n2].hi;
+ *hip = tbl[n2].hi;
+ *lop = tbl[n2].lo + t * (q + r1);
+}
+
+static inline void
+k_hexpl(long double x, long double *hip, long double *lop)
+{
+ float twopkm1;
+ int k;
+
+ __k_expl(x, hip, lop, &k);
+ SET_FLOAT_WORD(twopkm1, 0x3f800000 + ((k - 1) << 23));
+ *hip *= twopkm1;
+ *lop *= twopkm1;
+}
+
+static inline long double
+hexpl(long double x)
+{
+ long double hi, lo, twopkm2;
+ int k;
+
+ twopkm2 = 1;
+ __k_expl(x, &hi, &lo, &k);
+ SET_LDBL_EXPSIGN(twopkm2, BIAS + k - 2);
+ return (lo + hi) * 2 * twopkm2;
+}
+
+#ifdef _COMPLEX_H
+/*
+ * See ../src/k_exp.c for details.
+ */
+static inline long double complex
+__ldexp_cexpl(long double complex z, int expt)
+{
+ long double c, exp_x, hi, lo, s;
+ long double x, y, scale1, scale2;
+ int half_expt, k;
+
+ x = creall(z);
+ y = cimagl(z);
+ __k_expl(x, &hi, &lo, &k);
+
+ exp_x = (lo + hi) * 0x1p16382L;
+ expt += k - 16382;
+
+ scale1 = 1;
+ half_expt = expt / 2;
+ SET_LDBL_EXPSIGN(scale1, BIAS + half_expt);
+ scale2 = 1;
+ SET_LDBL_EXPSIGN(scale2, BIAS + expt - half_expt);
+
+ sincosl(y, &s, &c);
+ return (CMPLXL(c * exp_x * scale1 * scale2,
+ s * exp_x * scale1 * scale2));
+}
+#endif /* _COMPLEX_H */
diff --git a/newlib/libm/ld80/k_sinl.c b/newlib/libm/ld80/k_sinl.c
new file mode 100644
index 000000000..af5598dba
--- /dev/null
+++ b/newlib/libm/ld80/k_sinl.c
@@ -0,0 +1,62 @@
+/* From: @(#)k_sin.c 1.3 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ * Copyright (c) 2008 Steven G. Kargl, David Schultz, Bruce D. Evans.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * ld80 version of k_sin.c. See ../src/k_sin.c for most comments.
+ */
+
+#include "math_private.h"
+
+static const double
+half = 0.5;
+
+/*
+ * Domain [-0.7854, 0.7854], range ~[-1.89e-22, 1.915e-22]
+ * |sin(x)/x - s(x)| < 2**-72.1
+ *
+ * See ../ld80/k_cosl.c for more details about the polynomial.
+ */
+#if defined(__amd64__) || defined(__i386__)
+/* Long double constants are slow on these arches, and broken on i386. */
+static const volatile double
+S1hi = -0.16666666666666666, /* -0x15555555555555.0p-55 */
+S1lo = -9.2563760475949941e-18; /* -0x15580000000000.0p-109 */
+#define S1 ((long double)S1hi + S1lo)
+#else
+static const long double
+S1 = -0.166666666666666666671L; /* -0xaaaaaaaaaaaaaaab.0p-66 */
+#endif
+
+static const double
+S2 = 0.0083333333333333332, /* 0x11111111111111.0p-59 */
+S3 = -0.00019841269841269427, /* -0x1a01a01a019f81.0p-65 */
+S4 = 0.0000027557319223597490, /* 0x171de3a55560f7.0p-71 */
+S5 = -0.000000025052108218074604, /* -0x1ae64564f16cad.0p-78 */
+S6 = 1.6059006598854211e-10, /* 0x161242b90243b5.0p-85 */
+S7 = -7.6429779983024564e-13, /* -0x1ae42ebd1b2e00.0p-93 */
+S8 = 2.6174587166648325e-15; /* 0x179372ea0b3f64.0p-101 */
+
+long double
+__kernel_sinl(long double x, long double y, int iy)
+{
+ long double z,r,v;
+
+ z = x*x;
+ v = z*x;
+ r = S2+z*(S3+z*(S4+z*(S5+z*(S6+z*(S7+z*S8)))));
+ if(iy==0) return x+v*(S1+z*r);
+ else return x-((z*(half*y-v*r)-y)-v*S1);
+}
diff --git a/newlib/libm/ld80/k_sinpil.h b/newlib/libm/ld80/k_sinpil.h
new file mode 100644
index 000000000..00241b932
--- /dev/null
+++ b/newlib/libm/ld80/k_sinpil.h
@@ -0,0 +1,42 @@
+/*-
+ * Copyright (c) 2017 Steven G. Kargl
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice unmodified, this list of conditions, and the following
+ * disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * See ../src/k_sinpi.c for implementation details.
+ */
+
+static inline long double
+__kernel_sinpil(long double x)
+{
+ long double hi, lo;
+
+ hi = (float)x;
+ lo = x - hi;
+ lo = lo * (pi_lo + pi_hi) + hi * pi_lo;
+ hi *= pi_hi;
+ _2sumF(hi, lo);
+ return (__kernel_sinl(hi, lo, 1));
+}
diff --git a/newlib/libm/ld80/s_cospil.c b/newlib/libm/ld80/s_cospil.c
new file mode 100644
index 000000000..199479e9e
--- /dev/null
+++ b/newlib/libm/ld80/s_cospil.c
@@ -0,0 +1,129 @@
+/*-
+ * Copyright (c) 2017 Steven G. Kargl
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice unmodified, this list of conditions, and the following
+ * disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * See ../src/s_cospi.c for implementation details.
+ */
+
+#ifdef __i386__
+#include <ieeefp.h>
+#endif
+#include <stdint.h>
+
+#include "fpmath.h"
+#include "math.h"
+#include "math_private.h"
+
+static const double
+pi_hi = 3.1415926814079285e+00, /* 0x400921fb 0x58000000 */
+pi_lo =-2.7818135228334233e-08; /* 0xbe5dde97 0x3dcb3b3a */
+
+#include "k_cospil.h"
+#include "k_sinpil.h"
+
+volatile static const double vzero = 0;
+
+long double
+cospil(long double x)
+{
+ long double ax, c;
+ uint64_t lx, m;
+ uint32_t j0;
+ uint16_t hx, ix;
+
+ EXTRACT_LDBL80_WORDS(hx, lx, x);
+ ix = hx & 0x7fff;
+ INSERT_LDBL80_WORDS(ax, ix, lx);
+
+ ENTERI();
+
+ if (ix < 0x3fff) { /* |x| < 1 */
+ if (ix < 0x3ffd) { /* |x| < 0.25 */
+ if (ix < 0x3fdd) { /* |x| < 0x1p-34 */
+ if ((int)x == 0)
+ RETURNI(1);
+ }
+ RETURNI(__kernel_cospil(ax));
+ }
+
+ if (ix < 0x3ffe) /* |x| < 0.5 */
+ c = __kernel_sinpil(0.5 - ax);
+ else if (lx < 0xc000000000000000ull) { /* |x| < 0.75 */
+ if (ax == 0.5)
+ RETURNI(0);
+ c = -__kernel_sinpil(ax - 0.5);
+ } else
+ c = -__kernel_cospil(1 - ax);
+ RETURNI(c);
+ }
+
+ if (ix < 0x403e) { /* 1 <= |x| < 0x1p63 */
+ /* Determine integer part of ax. */
+ j0 = ix - 0x3fff + 1;
+ if (j0 < 32) {
+ lx = (lx >> 32) << 32;
+ lx &= ~(((lx << 32)-1) >> j0);
+ } else {
+ m = (uint64_t)-1 >> (j0 + 1);
+ if (lx & m) lx &= ~m;
+ }
+ INSERT_LDBL80_WORDS(x, ix, lx);
+
+ ax -= x;
+ EXTRACT_LDBL80_WORDS(ix, lx, ax);
+
+ if (ix < 0x3ffe) { /* |x| < 0.5 */
+ if (ix < 0x3ffd) /* |x| < 0.25 */
+ c = ix == 0 ? 1 : __kernel_cospil(ax);
+ else
+ c = __kernel_sinpil(0.5 - ax);
+
+ } else {
+ if (lx < 0xc000000000000000ull) { /* |x| < 0.75 */
+ if (ax == 0.5)
+ RETURNI(0);
+ c = -__kernel_sinpil(ax - 0.5);
+ } else
+ c = -__kernel_cospil(1 - ax);
+ }
+
+ if (j0 > 40)
+ x -= 0x1p40;
+ if (j0 > 30)
+ x -= 0x1p30;
+ j0 = (uint32_t)x;
+
+ RETURNI(j0 & 1 ? -c : c);
+ }
+
+ if (ix >= 0x7fff)
+ RETURNI(vzero / vzero);
+
+ /*
+ * |x| >= 0x1p63 is always an even integer, so return 1.
+ */
+ RETURNI(1);
+}
diff --git a/newlib/libm/ld80/s_erfl.c b/newlib/libm/ld80/s_erfl.c
new file mode 100644
index 000000000..1ae2f9092
--- /dev/null
+++ b/newlib/libm/ld80/s_erfl.c
@@ -0,0 +1,337 @@
+/* @(#)s_erf.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * See s_erf.c for complete comments.
+ *
+ * Converted to long double by Steven G. Kargl.
+ */
+#include <float.h>
+#ifdef __i386__
+#include <ieeefp.h>
+#endif
+
+#include "fpmath.h"
+#include "math.h"
+#include "math_private.h"
+
+/* XXX Prevent compilers from erroneously constant folding: */
+static const volatile long double tiny = 0x1p-10000L;
+
+static const double
+half= 0.5,
+one = 1,
+two = 2;
+/*
+ * In the domain [0, 2**-34], only the first term in the power series
+ * expansion of erf(x) is used. The magnitude of the first neglected
+ * terms is less than 2**-102.
+ */
+static const union IEEEl2bits
+efxu = LD80C(0x8375d410a6db446c, -3, 1.28379167095512573902e-1L),
+efx8u = LD80C(0x8375d410a6db446c, 0, 1.02703333676410059122e+0L),
+/*
+ * Domain [0, 0.84375], range ~[-1.423e-22, 1.423e-22]:
+ * |(erf(x) - x)/x - pp(x)/qq(x)| < 2**-72.573
+ */
+pp0u = LD80C(0x8375d410a6db446c, -3, 1.28379167095512573902e-1L),
+pp1u = LD80C(0xa46c7d09ec3d0cec, -2, -3.21140201054840180596e-1L),
+pp2u = LD80C(0x9b31e66325576f86, -5, -3.78893851760347812082e-2L),
+pp3u = LD80C(0x804ac72c9a0b97dd, -7, -7.83032847030604679616e-3L),
+pp4u = LD80C(0x9f42bcbc3d5a601d, -12, -3.03765663857082048459e-4L),
+pp5u = LD80C(0x9ec4ad6193470693, -16, -1.89266527398167917502e-5L),
+qq1u = LD80C(0xdb4b8eb713188d6b, -2, 4.28310832832310510579e-1L),
+qq2u = LD80C(0xa5750835b2459bd1, -4, 8.07896272074540216658e-2L),
+qq3u = LD80C(0x8b85d6bd6a90b51c, -7, 8.51579638189385354266e-3L),
+qq4u = LD80C(0x87332f82cff4ff96, -11, 5.15746855583604912827e-4L),
+qq5u = LD80C(0x83466cb6bf9dca00, -16, 1.56492109706256700009e-5L),
+qq6u = LD80C(0xf5bf98c2f996bf63, -24, 1.14435527803073879724e-7L);
+#define efx (efxu.e)
+#define efx8 (efx8u.e)
+#define pp0 (pp0u.e)
+#define pp1 (pp1u.e)
+#define pp2 (pp2u.e)
+#define pp3 (pp3u.e)
+#define pp4 (pp4u.e)
+#define pp5 (pp5u.e)
+#define qq1 (qq1u.e)
+#define qq2 (qq2u.e)
+#define qq3 (qq3u.e)
+#define qq4 (qq4u.e)
+#define qq5 (qq5u.e)
+#define qq6 (qq6u.e)
+static const union IEEEl2bits
+erxu = LD80C(0xd7bb3d0000000000, -1, 8.42700779438018798828e-1L),
+/*
+ * Domain [0.84375, 1.25], range ~[-8.132e-22, 8.113e-22]:
+ * |(erf(x) - erx) - pa(x)/qa(x)| < 2**-71.762
+ */
+pa0u = LD80C(0xe8211158da02c692, -27, 1.35116960705131296711e-8L),
+pa1u = LD80C(0xd488f89f36988618, -2, 4.15107507167065612570e-1L),
+pa2u = LD80C(0xece74f8c63fa3942, -4, -1.15675565215949226989e-1L),
+pa3u = LD80C(0xc8d31e020727c006, -4, 9.80589241379624665791e-2L),
+pa4u = LD80C(0x985d5d5fafb0551f, -5, 3.71984145558422368847e-2L),
+pa5u = LD80C(0xa5b6c4854d2f5452, -8, -5.05718799340957673661e-3L),
+pa6u = LD80C(0x85c8d58fe3993a47, -8, 4.08277919612202243721e-3L),
+pa7u = LD80C(0xddbfbc23677b35cf, -13, 2.11476292145347530794e-4L),
+qa1u = LD80C(0xb8a977896f5eff3f, -1, 7.21335860303380361298e-1L),
+qa2u = LD80C(0x9fcd662c3d4eac86, -1, 6.24227891731886593333e-1L),
+qa3u = LD80C(0x9d0b618eac67ba07, -2, 3.06727455774491855801e-1L),
+qa4u = LD80C(0x881a4293f6d6c92d, -3, 1.32912674218195890535e-1L),
+qa5u = LD80C(0xbab144f07dea45bf, -5, 4.55792134233613027584e-2L),
+qa6u = LD80C(0xa6c34ba438bdc900, -7, 1.01783980070527682680e-2L),
+qa7u = LD80C(0x8fa866dc20717a91, -9, 2.19204436518951438183e-3L);
+#define erx (erxu.e)
+#define pa0 (pa0u.e)
+#define pa1 (pa1u.e)
+#define pa2 (pa2u.e)
+#define pa3 (pa3u.e)
+#define pa4 (pa4u.e)
+#define pa5 (pa5u.e)
+#define pa6 (pa6u.e)
+#define pa7 (pa7u.e)
+#define qa1 (qa1u.e)
+#define qa2 (qa2u.e)
+#define qa3 (qa3u.e)
+#define qa4 (qa4u.e)
+#define qa5 (qa5u.e)
+#define qa6 (qa6u.e)
+#define qa7 (qa7u.e)
+static const union IEEEl2bits
+/*
+ * Domain [1.25,2.85715], range ~[-2.334e-22,2.334e-22]:
+ * |log(x*erfc(x)) + x**2 + 0.5625 - ra(x)/sa(x)| < 2**-71.860
+ */
+ra0u = LD80C(0xa1a091e0fb4f335a, -7, -9.86494298915814308249e-3L),
+ra1u = LD80C(0xc2b0d045ae37df6b, -1, -7.60510460864878271275e-1L),
+ra2u = LD80C(0xf2cec3ee7da636c5, 3, -1.51754798236892278250e+1L),
+ra3u = LD80C(0x813cc205395adc7d, 7, -1.29237335516455333420e+2L),
+ra4u = LD80C(0x8737c8b7b4062c2f, 9, -5.40871625829510494776e+2L),
+ra5u = LD80C(0x8ffe5383c08d4943, 10, -1.15194769466026108551e+3L),
+ra6u = LD80C(0x983573e64d5015a9, 10, -1.21767039790249025544e+3L),
+ra7u = LD80C(0x92a794e763a6d4db, 9, -5.86618463370624636688e+2L),
+ra8u = LD80C(0xd5ad1fae77c3d9a3, 6, -1.06838132335777049840e+2L),
+ra9u = LD80C(0x934c1a247807bb9c, 2, -4.60303980944467334806e+0L),
+sa1u = LD80C(0xd342f90012bb1189, 4, 2.64077014928547064865e+1L),
+sa2u = LD80C(0x839be13d9d5da883, 8, 2.63217811300123973067e+2L),
+sa3u = LD80C(0x9f8cba6d1ae1b24b, 10, 1.27639775710344617587e+3L),
+sa4u = LD80C(0xcaa83f403713e33e, 11, 3.24251544209971162003e+3L),
+sa5u = LD80C(0x8796aff2f3c47968, 12, 4.33883591261332837874e+3L),
+sa6u = LD80C(0xb6ef97f9c753157b, 11, 2.92697460344182158454e+3L),
+sa7u = LD80C(0xe02aee5f83773d1c, 9, 8.96670799139389559818e+2L),
+sa8u = LD80C(0xc82b83855b88e07e, 6, 1.00084987800048510018e+2L),
+sa9u = LD80C(0x92f030aefadf28ad, 1, 2.29591004455459083843e+0L);
+#define ra0 (ra0u.e)
+#define ra1 (ra1u.e)
+#define ra2 (ra2u.e)
+#define ra3 (ra3u.e)
+#define ra4 (ra4u.e)
+#define ra5 (ra5u.e)
+#define ra6 (ra6u.e)
+#define ra7 (ra7u.e)
+#define ra8 (ra8u.e)
+#define ra9 (ra9u.e)
+#define sa1 (sa1u.e)
+#define sa2 (sa2u.e)
+#define sa3 (sa3u.e)
+#define sa4 (sa4u.e)
+#define sa5 (sa5u.e)
+#define sa6 (sa6u.e)
+#define sa7 (sa7u.e)
+#define sa8 (sa8u.e)
+#define sa9 (sa9u.e)
+/*
+ * Domain [2.85715,7], range ~[-8.323e-22,8.390e-22]:
+ * |log(x*erfc(x)) + x**2 + 0.5625 - rb(x)/sb(x)| < 2**-70.326
+ */
+static const union IEEEl2bits
+rb0u = LD80C(0xa1a091cf43abcd26, -7, -9.86494292470284646962e-3L),
+rb1u = LD80C(0xd19d2df1cbb8da0a, -1, -8.18804618389296662837e-1L),
+rb2u = LD80C(0x9a4dd1383e5daf5b, 4, -1.92879967111618594779e+1L),
+rb3u = LD80C(0xbff0ae9fc0751de6, 7, -1.91940164551245394969e+2L),
+rb4u = LD80C(0xdde08465310b472b, 9, -8.87508080766577324539e+2L),
+rb5u = LD80C(0xe796e1d38c8c70a9, 10, -1.85271506669474503781e+3L),
+rb6u = LD80C(0xbaf655a76e0ab3b5, 10, -1.49569795581333675349e+3L),
+rb7u = LD80C(0x95d21e3e75503c21, 8, -2.99641547972948019157e+2L),
+sb1u = LD80C(0x814487ed823c8cbd, 5, 3.23169247732868256569e+1L),
+sb2u = LD80C(0xbe4bfbb1301304be, 8, 3.80593618534539961773e+2L),
+sb3u = LD80C(0x809c4ade46b927c7, 11, 2.05776827838541292848e+3L),
+sb4u = LD80C(0xa55284359f3395a8, 12, 5.29031455540062116327e+3L),
+sb5u = LD80C(0xbcfa72da9b820874, 12, 6.04730608102312640462e+3L),
+sb6u = LD80C(0x9d09a35988934631, 11, 2.51260238030767176221e+3L),
+sb7u = LD80C(0xd675bbe542c159fa, 7, 2.14459898308561015684e+2L);
+#define rb0 (rb0u.e)
+#define rb1 (rb1u.e)
+#define rb2 (rb2u.e)
+#define rb3 (rb3u.e)
+#define rb4 (rb4u.e)
+#define rb5 (rb5u.e)
+#define rb6 (rb6u.e)
+#define rb7 (rb7u.e)
+#define sb1 (sb1u.e)
+#define sb2 (sb2u.e)
+#define sb3 (sb3u.e)
+#define sb4 (sb4u.e)
+#define sb5 (sb5u.e)
+#define sb6 (sb6u.e)
+#define sb7 (sb7u.e)
+/*
+ * Domain [7,108], range ~[-4.422e-22,4.422e-22]:
+ * |log(x*erfc(x)) + x**2 + 0.5625 - rc(x)/sc(x)| < 2**-70.938
+ */
+static const union IEEEl2bits
+/* err = -4.422092275318925082e-22 -70.937689 */
+rc0u = LD80C(0xa1a091cf437a17ad, -7, -9.86494292470008707260e-3L),
+rc1u = LD80C(0xbe79c5a978122b00, -1, -7.44045595049165939261e-1L),
+rc2u = LD80C(0xdb26f9bbe31a2794, 3, -1.36970155085888424425e+1L),
+rc3u = LD80C(0xb5f69a38f5747ac8, 6, -9.09816453742625888546e+1L),
+rc4u = LD80C(0xd79676d970d0a21a, 7, -2.15587750997584074147e+2L),
+rc5u = LD80C(0xfe528153c45ec97c, 6, -1.27161142938347796666e+2L),
+sc1u = LD80C(0xc5e8cd46d5604a96, 4, 2.47386727842204312937e+1L),
+sc2u = LD80C(0xc5f0f5a5484520eb, 7, 1.97941248254913378865e+2L),
+sc3u = LD80C(0x964e3c7b34db9170, 9, 6.01222441484087787522e+2L),
+sc4u = LD80C(0x99be1b89faa0596a, 9, 6.14970430845978077827e+2L),
+sc5u = LD80C(0xf80dfcbf37ffc5ea, 6, 1.24027318931184605891e+2L);
+#define rc0 (rc0u.e)
+#define rc1 (rc1u.e)
+#define rc2 (rc2u.e)
+#define rc3 (rc3u.e)
+#define rc4 (rc4u.e)
+#define rc5 (rc5u.e)
+#define sc1 (sc1u.e)
+#define sc2 (sc2u.e)
+#define sc3 (sc3u.e)
+#define sc4 (sc4u.e)
+#define sc5 (sc5u.e)
+
+long double
+erfl(long double x)
+{
+ long double ax,R,S,P,Q,s,y,z,r;
+ uint64_t lx;
+ int32_t i;
+ uint16_t hx;
+
+ EXTRACT_LDBL80_WORDS(hx, lx, x);
+
+ if((hx & 0x7fff) == 0x7fff) { /* erfl(nan)=nan */
+ i = (hx>>15)<<1;
+ return (1-i)+one/x; /* erfl(+-inf)=+-1 */
+ }
+
+ ENTERI();
+
+ ax = fabsl(x);
+ if(ax < 0.84375) {
+ if(ax < 0x1p-34L) {
+ if(ax < 0x1p-16373L)
+ RETURNI((8*x+efx8*x)/8); /* avoid spurious underflow */
+ RETURNI(x + efx*x);
+ }
+ z = x*x;
+ r = pp0+z*(pp1+z*(pp2+z*(pp3+z*(pp4+z*pp5))));
+ s = one+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*(qq5+z*qq6)))));
+ y = r/s;
+ RETURNI(x + x*y);
+ }
+ if(ax < 1.25) {
+ s = ax-one;
+ P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*(pa6+s*pa7))))));
+ Q = one+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*(qa6+s*qa7))))));
+ if(x>=0) RETURNI(erx + P/Q); else RETURNI(-erx - P/Q);
+ }
+ if(ax >= 7) { /* inf>|x|>= 7 */
+ if(x>=0) RETURNI(one-tiny); else RETURNI(tiny-one);
+ }
+ s = one/(ax*ax);
+ if(ax < 2.85715) { /* |x| < 2.85715 */
+ R=ra0+s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*(ra5+s*(ra6+s*(ra7+
+ s*(ra8+s*ra9))))))));
+ S=one+s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*(sa5+s*(sa6+s*(sa7+
+ s*(sa8+s*sa9))))))));
+ } else { /* |x| >= 2.85715 */
+ R=rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*(rb5+s*(rb6+s*rb7))))));
+ S=one+s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*(sb5+s*(sb6+s*sb7))))));
+ }
+ z=(float)ax;
+ r=expl(-z*z-0.5625)*expl((z-ax)*(z+ax)+R/S);
+ if(x>=0) RETURNI(one-r/ax); else RETURNI(r/ax-one);
+}
+
+long double
+erfcl(long double x)
+{
+ long double ax,R,S,P,Q,s,y,z,r;
+ uint64_t lx;
+ uint16_t hx;
+
+ EXTRACT_LDBL80_WORDS(hx, lx, x);
+
+ if((hx & 0x7fff) == 0x7fff) { /* erfcl(nan)=nan */
+ /* erfcl(+-inf)=0,2 */
+ return ((hx>>15)<<1)+one/x;
+ }
+
+ ENTERI();
+
+ ax = fabsl(x);
+ if(ax < 0.84375L) {
+ if(ax < 0x1p-34L)
+ RETURNI(one-x);
+ z = x*x;
+ r = pp0+z*(pp1+z*(pp2+z*(pp3+z*(pp4+z*pp5))));
+ s = one+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*(qq5+z*qq6)))));
+ y = r/s;
+ if(ax < 0.25L) { /* x<1/4 */
+ RETURNI(one-(x+x*y));
+ } else {
+ r = x*y;
+ r += (x-half);
+ RETURNI(half - r);
+ }
+ }
+ if(ax < 1.25L) {
+ s = ax-one;
+ P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*(pa6+s*pa7))))));
+ Q = one+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*(qa6+s*qa7))))));
+ if(x>=0) {
+ z = one-erx; RETURNI(z - P/Q);
+ } else {
+ z = (erx+P/Q); RETURNI(one+z);
+ }
+ }
+
+ if(ax < 108) { /* |x| < 108 */
+ s = one/(ax*ax);
+ if(ax < 2.85715) { /* |x| < 2.85715 */
+ R=ra0+s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*(ra5+s*(ra6+s*(ra7+
+ s*(ra8+s*ra9))))))));
+ S=one+s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*(sa5+s*(sa6+s*(sa7+
+ s*(sa8+s*sa9))))))));
+ } else if(ax < 7) { /* | |x| < 7 */
+ R=rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*(rb5+s*(rb6+s*rb7))))));
+ S=one+s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*(sb5+s*(sb6+s*sb7))))));
+ } else {
+ if(x < -7) RETURNI(two-tiny);/* x < -7 */
+ R=rc0+s*(rc1+s*(rc2+s*(rc3+s*(rc4+s*rc5))));
+ S=one+s*(sc1+s*(sc2+s*(sc3+s*(sc4+s*sc5))));
+ }
+ z = (float)ax;
+ r = expl(-z*z-0.5625)*expl((z-ax)*(z+ax)+R/S);
+ if(x>0) RETURNI(r/ax); else RETURNI(two-r/ax);
+ } else {
+ if(x>0) RETURNI(tiny*tiny); else RETURNI(two-tiny);
+ }
+}
diff --git a/newlib/libm/ld80/s_exp2l.c b/newlib/libm/ld80/s_exp2l.c
new file mode 100644
index 000000000..421d6e2e0
--- /dev/null
+++ b/newlib/libm/ld80/s_exp2l.c
@@ -0,0 +1,290 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2005-2008 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <float.h>
+#include <stdint.h>
+
+#ifdef __i386__
+#include <ieeefp.h>
+#endif
+
+#include "fpmath.h"
+#include "math.h"
+#include "math_private.h"
+
+#define TBLBITS 7
+#define TBLSIZE (1 << TBLBITS)
+
+#define BIAS (LDBL_MAX_EXP - 1)
+
+static volatile long double
+ huge = 0x1p10000L,
+ twom10000 = 0x1p-10000L;
+
+static const union IEEEl2bits
+P1 = LD80C(0xb17217f7d1cf79ac, -1, 6.93147180559945309429e-1L);
+
+static const double
+redux = 0x1.8p63 / TBLSIZE,
+/*
+ * Domain [-0.00390625, 0.00390625], range ~[-1.7079e-23, 1.7079e-23]
+ * |exp(x) - p(x)| < 2**-75.6
+ */
+P2 = 2.4022650695910072e-1, /* 0x1ebfbdff82c58f.0p-55 */
+P3 = 5.5504108664816879e-2, /* 0x1c6b08d7049e1a.0p-57 */
+P4 = 9.6181291055695180e-3, /* 0x13b2ab6fa8321a.0p-59 */
+P5 = 1.3333563089183052e-3, /* 0x15d8806f67f251.0p-62 */
+P6 = 1.5413361552277414e-4; /* 0x1433ddacff3441.0p-65 */
+
+static const double tbl[TBLSIZE * 2] = {
+ 0x1.6a09e667f3bcdp-1, -0x1.bdd3413b2648p-55,
+ 0x1.6c012750bdabfp-1, -0x1.2895667ff0cp-57,
+ 0x1.6dfb23c651a2fp-1, -0x1.bbe3a683c88p-58,
+ 0x1.6ff7df9519484p-1, -0x1.83c0f25860fp-56,
+ 0x1.71f75e8ec5f74p-1, -0x1.16e4786887bp-56,
+ 0x1.73f9a48a58174p-1, -0x1.0a8d96c65d5p-55,
+ 0x1.75feb564267c9p-1, -0x1.0245957316ep-55,
+ 0x1.780694fde5d3fp-1, 0x1.866b80a0216p-55,
+ 0x1.7a11473eb0187p-1, -0x1.41577ee0499p-56,
+ 0x1.7c1ed0130c132p-1, 0x1.f124cd1164ep-55,
+ 0x1.7e2f336cf4e62p-1, 0x1.05d02ba157ap-57,
+ 0x1.80427543e1a12p-1, -0x1.27c86626d97p-55,
+ 0x1.82589994cce13p-1, -0x1.d4c1dd41533p-55,
+ 0x1.8471a4623c7adp-1, -0x1.8d684a341cep-56,
+ 0x1.868d99b4492edp-1, -0x1.fc6f89bd4f68p-55,
+ 0x1.88ac7d98a6699p-1, 0x1.994c2f37cb5p-55,
+ 0x1.8ace5422aa0dbp-1, 0x1.6e9f156864bp-55,
+ 0x1.8cf3216b5448cp-1, -0x1.0d55e32e9e4p-57,
+ 0x1.8f1ae99157736p-1, 0x1.5cc13a2e397p-56,
+ 0x1.9145b0b91ffc6p-1, -0x1.dd6792e5825p-55,
+ 0x1.93737b0cdc5e5p-1, -0x1.75fc781b58p-58,
+ 0x1.95a44cbc8520fp-1, -0x1.64b7c96a5fp-57,
+ 0x1.97d829fde4e5p-1, -0x1.d185b7c1b86p-55,
+ 0x1.9a0f170ca07bap-1, -0x1.173bd91cee6p-55,
+ 0x1.9c49182a3f09p-1, 0x1.c7c46b071f2p-57,
+ 0x1.9e86319e32323p-1, 0x1.824ca78e64cp-57,
+ 0x1.a0c667b5de565p-1, -0x1.359495d1cd5p-55,
+ 0x1.a309bec4a2d33p-1, 0x1.6305c7ddc368p-55,
+ 0x1.a5503b23e255dp-1, -0x1.d2f6edb8d42p-55,
+ 0x1.a799e1330b358p-1, 0x1.bcb7ecac564p-55,
+ 0x1.a9e6b5579fdbfp-1, 0x1.0fac90ef7fdp-55,
+ 0x1.ac36bbfd3f37ap-1, -0x1.f9234cae76dp-56,
+ 0x1.ae89f995ad3adp-1, 0x1.7a1cd345dcc8p-55,
+ 0x1.b0e07298db666p-1, -0x1.bdef54c80e4p-55,
+ 0x1.b33a2b84f15fbp-1, -0x1.2805e3084d8p-58,
+ 0x1.b59728de5593ap-1, -0x1.c71dfbbba6ep-55,
+ 0x1.b7f76f2fb5e47p-1, -0x1.5584f7e54acp-57,
+ 0x1.ba5b030a1064ap-1, -0x1.efcd30e5429p-55,
+ 0x1.bcc1e904bc1d2p-1, 0x1.23dd07a2d9fp-56,
+ 0x1.bf2c25bd71e09p-1, -0x1.efdca3f6b9c8p-55,
+ 0x1.c199bdd85529cp-1, 0x1.11065895049p-56,
+ 0x1.c40ab5fffd07ap-1, 0x1.b4537e083c6p-55,
+ 0x1.c67f12e57d14bp-1, 0x1.2884dff483c8p-55,
+ 0x1.c8f6d9406e7b5p-1, 0x1.1acbc48805cp-57,
+ 0x1.cb720dcef9069p-1, 0x1.503cbd1e94ap-57,
+ 0x1.cdf0b555dc3fap-1, -0x1.dd83b53829dp-56,
+ 0x1.d072d4a07897cp-1, -0x1.cbc3743797a8p-55,
+ 0x1.d2f87080d89f2p-1, -0x1.d487b719d858p-55,
+ 0x1.d5818dcfba487p-1, 0x1.2ed02d75b37p-56,
+ 0x1.d80e316c98398p-1, -0x1.11ec18bedep-55,
+ 0x1.da9e603db3285p-1, 0x1.c2300696db5p-55,
+ 0x1.dd321f301b46p-1, 0x1.2da5778f019p-55,
+ 0x1.dfc97337b9b5fp-1, -0x1.1a5cd4f184b8p-55,
+ 0x1.e264614f5a129p-1, -0x1.7b627817a148p-55,
+ 0x1.e502ee78b3ff6p-1, 0x1.39e8980a9cdp-56,
+ 0x1.e7a51fbc74c83p-1, 0x1.2d522ca0c8ep-55,
+ 0x1.ea4afa2a490dap-1, -0x1.e9c23179c288p-55,
+ 0x1.ecf482d8e67f1p-1, -0x1.c93f3b411ad8p-55,
+ 0x1.efa1bee615a27p-1, 0x1.dc7f486a4b68p-55,
+ 0x1.f252b376bba97p-1, 0x1.3a1a5bf0d8e8p-55,
+ 0x1.f50765b6e454p-1, 0x1.9d3e12dd8a18p-55,
+ 0x1.f7bfdad9cbe14p-1, -0x1.dbb12d00635p-55,
+ 0x1.fa7c1819e90d8p-1, 0x1.74853f3a593p-56,
+ 0x1.fd3c22b8f71f1p-1, 0x1.2eb74966578p-58,
+ 0x1p+0, 0x0p+0,
+ 0x1.0163da9fb3335p+0, 0x1.b61299ab8cd8p-54,
+ 0x1.02c9a3e778061p+0, -0x1.19083535b08p-56,
+ 0x1.04315e86e7f85p+0, -0x1.0a31c1977c98p-54,
+ 0x1.059b0d3158574p+0, 0x1.d73e2a475b4p-55,
+ 0x1.0706b29ddf6dep+0, -0x1.c91dfe2b13cp-55,
+ 0x1.0874518759bc8p+0, 0x1.186be4bb284p-57,
+ 0x1.09e3ecac6f383p+0, 0x1.14878183161p-54,
+ 0x1.0b5586cf9890fp+0, 0x1.8a62e4adc61p-54,
+ 0x1.0cc922b7247f7p+0, 0x1.01edc16e24f8p-54,
+ 0x1.0e3ec32d3d1a2p+0, 0x1.03a1727c58p-59,
+ 0x1.0fb66affed31bp+0, -0x1.b9bedc44ebcp-57,
+ 0x1.11301d0125b51p+0, -0x1.6c51039449bp-54,
+ 0x1.12abdc06c31ccp+0, -0x1.1b514b36ca8p-58,
+ 0x1.1429aaea92dep+0, -0x1.32fbf9af1368p-54,
+ 0x1.15a98c8a58e51p+0, 0x1.2406ab9eeabp-55,
+ 0x1.172b83c7d517bp+0, -0x1.19041b9d78ap-55,
+ 0x1.18af9388c8deap+0, -0x1.11023d1970f8p-54,
+ 0x1.1a35beb6fcb75p+0, 0x1.e5b4c7b4969p-55,
+ 0x1.1bbe084045cd4p+0, -0x1.95386352ef6p-54,
+ 0x1.1d4873168b9aap+0, 0x1.e016e00a264p-54,
+ 0x1.1ed5022fcd91dp+0, -0x1.1df98027bb78p-54,
+ 0x1.2063b88628cd6p+0, 0x1.dc775814a85p-55,
+ 0x1.21f49917ddc96p+0, 0x1.2a97e9494a6p-55,
+ 0x1.2387a6e756238p+0, 0x1.9b07eb6c7058p-54,
+ 0x1.251ce4fb2a63fp+0, 0x1.ac155bef4f5p-55,
+ 0x1.26b4565e27cddp+0, 0x1.2bd339940eap-55,
+ 0x1.284dfe1f56381p+0, -0x1.a4c3a8c3f0d8p-54,
+ 0x1.29e9df51fdee1p+0, 0x1.612e8afad12p-55,
+ 0x1.2b87fd0dad99p+0, -0x1.10adcd6382p-59,
+ 0x1.2d285a6e4030bp+0, 0x1.0024754db42p-54,
+ 0x1.2ecafa93e2f56p+0, 0x1.1ca0f45d524p-56,
+ 0x1.306fe0a31b715p+0, 0x1.6f46ad23183p-55,
+ 0x1.32170fc4cd831p+0, 0x1.a9ce78e1804p-55,
+ 0x1.33c08b26416ffp+0, 0x1.327218436598p-54,
+ 0x1.356c55f929ff1p+0, -0x1.b5cee5c4e46p-55,
+ 0x1.371a7373aa9cbp+0, -0x1.63aeabf42ebp-54,
+ 0x1.38cae6d05d866p+0, -0x1.e958d3c99048p-54,
+ 0x1.3a7db34e59ff7p+0, -0x1.5e436d661f6p-56,
+ 0x1.3c32dc313a8e5p+0, -0x1.efff8375d2ap-54,
+ 0x1.3dea64c123422p+0, 0x1.ada0911f09fp-55,
+ 0x1.3fa4504ac801cp+0, -0x1.7d023f956fap-54,
+ 0x1.4160a21f72e2ap+0, -0x1.ef3691c309p-58,
+ 0x1.431f5d950a897p+0, -0x1.1c7dde35f7ap-55,
+ 0x1.44e086061892dp+0, 0x1.89b7a04ef8p-59,
+ 0x1.46a41ed1d0057p+0, 0x1.c944bd1648a8p-54,
+ 0x1.486a2b5c13cdp+0, 0x1.3c1a3b69062p-56,
+ 0x1.4a32af0d7d3dep+0, 0x1.9cb62f3d1be8p-54,
+ 0x1.4bfdad5362a27p+0, 0x1.d4397afec42p-56,
+ 0x1.4dcb299fddd0dp+0, 0x1.8ecdbbc6a78p-54,
+ 0x1.4f9b2769d2ca7p+0, -0x1.4b309d25958p-54,
+ 0x1.516daa2cf6642p+0, -0x1.f768569bd94p-55,
+ 0x1.5342b569d4f82p+0, -0x1.07abe1db13dp-55,
+ 0x1.551a4ca5d920fp+0, -0x1.d689cefede6p-55,
+ 0x1.56f4736b527dap+0, 0x1.9bb2c011d938p-54,
+ 0x1.58d12d497c7fdp+0, 0x1.295e15b9a1ep-55,
+ 0x1.5ab07dd485429p+0, 0x1.6324c0546478p-54,
+ 0x1.5c9268a5946b7p+0, 0x1.c4b1b81698p-60,
+ 0x1.5e76f15ad2148p+0, 0x1.ba6f93080e68p-54,
+ 0x1.605e1b976dc09p+0, -0x1.3e2429b56de8p-54,
+ 0x1.6247eb03a5585p+0, -0x1.383c17e40b48p-54,
+ 0x1.6434634ccc32p+0, -0x1.c483c759d89p-55,
+ 0x1.6623882552225p+0, -0x1.bb60987591cp-54,
+ 0x1.68155d44ca973p+0, 0x1.038ae44f74p-57,
+};
+
+/**
+ * Compute the base 2 exponential of x for Intel 80-bit format.
+ *
+ * Accuracy: Peak error < 0.511 ulp.
+ *
+ * Method: (equally-spaced tables)
+ *
+ * Reduce x:
+ * x = 2**k + y, for integer k and |y| <= 1/2.
+ * Thus we have exp2l(x) = 2**k * exp2(y).
+ *
+ * Reduce y:
+ * y = i/TBLSIZE + z for integer i near y * TBLSIZE.
+ * Thus we have exp2(y) = exp2(i/TBLSIZE) * exp2(z),
+ * with |z| <= 2**-(TBLBITS+1).
+ *
+ * We compute exp2(i/TBLSIZE) via table lookup and exp2(z) via a
+ * degree-6 minimax polynomial with maximum error under 2**-75.6.
+ * The table entries each have 104 bits of accuracy, encoded as
+ * a pair of double precision values.
+ */
+long double
+exp2l(long double x)
+{
+ union IEEEl2bits u, v;
+ long double r, twopk, twopkp10000, z;
+ uint32_t hx, ix, i0;
+ int k;
+
+ /* Filter out exceptional cases. */
+ u.e = x;
+ hx = u.xbits.expsign;
+ ix = hx & 0x7fff;
+ if (ix >= BIAS + 14) { /* |x| >= 16384 or x is NaN */
+ if (ix == BIAS + LDBL_MAX_EXP) {
+ if (hx & 0x8000 && u.xbits.man == 1ULL << 63)
+ return (0.0L); /* x is -Inf */
+ return (x + x); /* x is +Inf, NaN or unsupported */
+ }
+ if (x >= 16384)
+ return (huge * huge); /* overflow */
+ if (x <= -16446)
+ return (twom10000 * twom10000); /* underflow */
+ } else if (ix <= BIAS - 66) { /* |x| < 0x1p-65 (includes pseudos) */
+ return (1.0L + x); /* 1 with inexact */
+ }
+
+ ENTERI();
+
+ /*
+ * Reduce x, computing z, i0, and k. The low bits of x + redux
+ * contain the 16-bit integer part of the exponent (k) followed by
+ * TBLBITS fractional bits (i0). We use bit tricks to extract these
+ * as integers, then set z to the remainder.
+ *
+ * Example: Suppose x is 0xabc.123456p0 and TBLBITS is 8.
+ * Then the low-order word of x + redux is 0x000abc12,
+ * We split this into k = 0xabc and i0 = 0x12 (adjusted to
+ * index into the table), then we compute z = 0x0.003456p0.
+ *
+ * XXX If the exponent is negative, the computation of k depends on
+ * '>>' doing sign extension.
+ */
+ u.e = x + redux;
+ i0 = u.bits.manl + TBLSIZE / 2;
+ k = (int)i0 >> TBLBITS;
+ i0 = (i0 & (TBLSIZE - 1)) << 1;
+ u.e -= redux;
+ z = x - u.e;
+ v.xbits.man = 1ULL << 63;
+ if (k >= LDBL_MIN_EXP) {
+ v.xbits.expsign = BIAS + k;
+ twopk = v.e;
+ } else {
+ v.xbits.expsign = BIAS + k + 10000;
+ twopkp10000 = v.e;
+ }
+
+ /* Compute r = exp2l(y) = exp2lt[i0] * p(z). */
+ long double t_hi = tbl[i0];
+ long double t_lo = tbl[i0 + 1];
+ r = t_lo + (t_hi + t_lo) * z * (P1.e + z * (P2 + z * (P3 + z * (P4
+ + z * (P5 + z * P6))))) + t_hi;
+
+ /* Scale by 2**k. */
+ if (k >= LDBL_MIN_EXP) {
+ if (k == LDBL_MAX_EXP)
+ RETURNI(r * 2.0 * 0x1p16383L);
+ RETURNI(r * twopk);
+ } else {
+ RETURNI(r * twopkp10000 * twom10000);
+ }
+}
diff --git a/newlib/libm/ld80/s_expl.c b/newlib/libm/ld80/s_expl.c
new file mode 100644
index 000000000..e46e73f0c
--- /dev/null
+++ b/newlib/libm/ld80/s_expl.c
@@ -0,0 +1,279 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2009-2013 Steven G. Kargl
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice unmodified, this list of conditions, and the following
+ * disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Optimized by Bruce D. Evans.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/**
+ * Compute the exponential of x for Intel 80-bit format. This is based on:
+ *
+ * PTP Tang, "Table-driven implementation of the exponential function
+ * in IEEE floating-point arithmetic," ACM Trans. Math. Soft., 15,
+ * 144-157 (1989).
+ *
+ * where the 32 table entries have been expanded to INTERVALS (see below).
+ */
+
+#include <float.h>
+
+#ifdef __i386__
+#include <ieeefp.h>
+#endif
+
+#include "fpmath.h"
+#include "math.h"
+#include "math_private.h"
+#include "k_expl.h"
+
+/* XXX Prevent compilers from erroneously constant folding these: */
+static const volatile long double
+huge = 0x1p10000L,
+tiny = 0x1p-10000L;
+
+static const long double
+twom10000 = 0x1p-10000L;
+
+static const union IEEEl2bits
+/* log(2**16384 - 0.5) rounded towards zero: */
+/* log(2**16384 - 0.5 + 1) rounded towards zero for expm1l() is the same: */
+o_thresholdu = LD80C(0xb17217f7d1cf79ab, 13, 11356.5234062941439488L),
+#define o_threshold (o_thresholdu.e)
+/* log(2**(-16381-64-1)) rounded towards zero: */
+u_thresholdu = LD80C(0xb21dfe7f09e2baa9, 13, -11399.4985314888605581L);
+#define u_threshold (u_thresholdu.e)
+
+long double
+expl(long double x)
+{
+ union IEEEl2bits u;
+ long double hi, lo, t, twopk;
+ int k;
+ uint16_t hx, ix;
+
+ DOPRINT_START(&x);
+
+ /* Filter out exceptional cases. */
+ u.e = x;
+ hx = u.xbits.expsign;
+ ix = hx & 0x7fff;
+ if (ix >= BIAS + 13) { /* |x| >= 8192 or x is NaN */
+ if (ix == BIAS + LDBL_MAX_EXP) {
+ if (hx & 0x8000) /* x is -Inf, -NaN or unsupported */
+ RETURNP(-1 / x);
+ RETURNP(x + x); /* x is +Inf, +NaN or unsupported */
+ }
+ if (x > o_threshold)
+ RETURNP(huge * huge);
+ if (x < u_threshold)
+ RETURNP(tiny * tiny);
+ } else if (ix < BIAS - 75) { /* |x| < 0x1p-75 (includes pseudos) */
+ RETURN2P(1, x); /* 1 with inexact iff x != 0 */
+ }
+
+ ENTERI();
+
+ twopk = 1;
+ __k_expl(x, &hi, &lo, &k);
+ t = SUM2P(hi, lo);
+
+ /* Scale by 2**k. */
+ if (k >= LDBL_MIN_EXP) {
+ if (k == LDBL_MAX_EXP)
+ RETURNI(t * 2 * 0x1p16383L);
+ SET_LDBL_EXPSIGN(twopk, BIAS + k);
+ RETURNI(t * twopk);
+ } else {
+ SET_LDBL_EXPSIGN(twopk, BIAS + k + 10000);
+ RETURNI(t * twopk * twom10000);
+ }
+}
+
+/**
+ * Compute expm1l(x) for Intel 80-bit format. This is based on:
+ *
+ * PTP Tang, "Table-driven implementation of the Expm1 function
+ * in IEEE floating-point arithmetic," ACM Trans. Math. Soft., 18,
+ * 211-222 (1992).
+ */
+
+/*
+ * Our T1 and T2 are chosen to be approximately the points where method
+ * A and method B have the same accuracy. Tang's T1 and T2 are the
+ * points where method A's accuracy changes by a full bit. For Tang,
+ * this drop in accuracy makes method A immediately less accurate than
+ * method B, but our larger INTERVALS makes method A 2 bits more
+ * accurate so it remains the most accurate method significantly
+ * closer to the origin despite losing the full bit in our extended
+ * range for it.
+ */
+static const double
+T1 = -0.1659, /* ~-30.625/128 * log(2) */
+T2 = 0.1659; /* ~30.625/128 * log(2) */
+
+/*
+ * Domain [-0.1659, 0.1659], range ~[-2.6155e-22, 2.5507e-23]:
+ * |(exp(x)-1-x-x**2/2)/x - p(x)| < 2**-71.6
+ *
+ * XXX the coeffs aren't very carefully rounded, and I get 2.8 more bits,
+ * but unlike for ld128 we can't drop any terms.
+ */
+static const union IEEEl2bits
+B3 = LD80C(0xaaaaaaaaaaaaaaab, -3, 1.66666666666666666671e-1L),
+B4 = LD80C(0xaaaaaaaaaaaaaaac, -5, 4.16666666666666666712e-2L);
+
+static const double
+B5 = 8.3333333333333245e-3, /* 0x1.111111111110cp-7 */
+B6 = 1.3888888888888861e-3, /* 0x1.6c16c16c16c0ap-10 */
+B7 = 1.9841269841532042e-4, /* 0x1.a01a01a0319f9p-13 */
+B8 = 2.4801587302069236e-5, /* 0x1.a01a01a03cbbcp-16 */
+B9 = 2.7557316558468562e-6, /* 0x1.71de37fd33d67p-19 */
+B10 = 2.7557315829785151e-7, /* 0x1.27e4f91418144p-22 */
+B11 = 2.5063168199779829e-8, /* 0x1.ae94fabdc6b27p-26 */
+B12 = 2.0887164654459567e-9; /* 0x1.1f122d6413fe1p-29 */
+
+long double
+expm1l(long double x)
+{
+ union IEEEl2bits u, v;
+ long double fn, hx2_hi, hx2_lo, q, r, r1, r2, t, twomk, twopk, x_hi;
+ long double x_lo, x2, z;
+ long double x4;
+ int k, n, n2;
+ uint16_t hx, ix;
+
+ DOPRINT_START(&x);
+
+ /* Filter out exceptional cases. */
+ u.e = x;
+ hx = u.xbits.expsign;
+ ix = hx & 0x7fff;
+ if (ix >= BIAS + 6) { /* |x| >= 64 or x is NaN */
+ if (ix == BIAS + LDBL_MAX_EXP) {
+ if (hx & 0x8000) /* x is -Inf, -NaN or unsupported */
+ RETURNP(-1 / x - 1);
+ RETURNP(x + x); /* x is +Inf, +NaN or unsupported */
+ }
+ if (x > o_threshold)
+ RETURNP(huge * huge);
+ /*
+ * expm1l() never underflows, but it must avoid
+ * unrepresentable large negative exponents. We used a
+ * much smaller threshold for large |x| above than in
+ * expl() so as to handle not so large negative exponents
+ * in the same way as large ones here.
+ */
+ if (hx & 0x8000) /* x <= -64 */
+ RETURN2P(tiny, -1); /* good for x < -65ln2 - eps */
+ }
+
+ ENTERI();
+
+ if (T1 < x && x < T2) {
+ if (ix < BIAS - 74) { /* |x| < 0x1p-74 (includes pseudos) */
+ /* x (rounded) with inexact if x != 0: */
+ RETURNPI(x == 0 ? x :
+ (0x1p100 * x + fabsl(x)) * 0x1p-100);
+ }
+
+ x2 = x * x;
+ x4 = x2 * x2;
+ q = x4 * (x2 * (x4 *
+ /*
+ * XXX the number of terms is no longer good for
+ * pairwise grouping of all except B3, and the
+ * grouping is no longer from highest down.
+ */
+ (x2 * B12 + (x * B11 + B10)) +
+ (x2 * (x * B9 + B8) + (x * B7 + B6))) +
+ (x * B5 + B4.e)) + x2 * x * B3.e;
+
+ x_hi = (float)x;
+ x_lo = x - x_hi;
+ hx2_hi = x_hi * x_hi / 2;
+ hx2_lo = x_lo * (x + x_hi) / 2;
+ if (ix >= BIAS - 7)
+ RETURN2PI(hx2_hi + x_hi, hx2_lo + x_lo + q);
+ else
+ RETURN2PI(x, hx2_lo + q + hx2_hi);
+ }
+
+ /* Reduce x to (k*ln2 + endpoint[n2] + r1 + r2). */
+ fn = rnintl(x * INV_L);
+ n = irint(fn);
+ n2 = (unsigned)n % INTERVALS;
+ k = n >> LOG2_INTERVALS;
+ r1 = x - fn * L1;
+ r2 = fn * -L2;
+ r = r1 + r2;
+
+ /* Prepare scale factor. */
+ v.e = 1;
+ v.xbits.expsign = BIAS + k;
+ twopk = v.e;
+
+ /*
+ * Evaluate lower terms of
+ * expl(endpoint[n2] + r1 + r2) = tbl[n2] * expl(r1 + r2).
+ */
+ z = r * r;
+ q = r2 + z * (A2 + r * A3) + z * z * (A4 + r * A5) + z * z * z * A6;
+
+ t = (long double)tbl[n2].lo + tbl[n2].hi;
+
+ if (k == 0) {
+ t = SUM2P(tbl[n2].hi - 1, tbl[n2].lo * (r1 + 1) + t * q +
+ tbl[n2].hi * r1);
+ RETURNI(t);
+ }
+ if (k == -1) {
+ t = SUM2P(tbl[n2].hi - 2, tbl[n2].lo * (r1 + 1) + t * q +
+ tbl[n2].hi * r1);
+ RETURNI(t / 2);
+ }
+ if (k < -7) {
+ t = SUM2P(tbl[n2].hi, tbl[n2].lo + t * (q + r1));
+ RETURNI(t * twopk - 1);
+ }
+ if (k > 2 * LDBL_MANT_DIG - 1) {
+ t = SUM2P(tbl[n2].hi, tbl[n2].lo + t * (q + r1));
+ if (k == LDBL_MAX_EXP)
+ RETURNI(t * 2 * 0x1p16383L - 1);
+ RETURNI(t * twopk - 1);
+ }
+
+ v.xbits.expsign = BIAS - k;
+ twomk = v.e;
+
+ if (k > LDBL_MANT_DIG - 1)
+ t = SUM2P(tbl[n2].hi, tbl[n2].lo - twomk + t * (q + r1));
+ else
+ t = SUM2P(tbl[n2].hi - twomk, tbl[n2].lo + t * (q + r1));
+ RETURNI(t * twopk);
+}
diff --git a/newlib/libm/ld80/s_logl.c b/newlib/libm/ld80/s_logl.c
new file mode 100644
index 000000000..c74519caf
--- /dev/null
+++ b/newlib/libm/ld80/s_logl.c
@@ -0,0 +1,722 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2007-2013 Bruce D. Evans
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice unmodified, this list of conditions, and the following
+ * disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/**
+ * Implementation of the natural logarithm of x for Intel 80-bit format.
+ *
+ * First decompose x into its base 2 representation:
+ *
+ * log(x) = log(X * 2**k), where X is in [1, 2)
+ * = log(X) + k * log(2).
+ *
+ * Let X = X_i + e, where X_i is the center of one of the intervals
+ * [-1.0/256, 1.0/256), [1.0/256, 3.0/256), .... [2.0-1.0/256, 2.0+1.0/256)
+ * and X is in this interval. Then
+ *
+ * log(X) = log(X_i + e)
+ * = log(X_i * (1 + e / X_i))
+ * = log(X_i) + log(1 + e / X_i).
+ *
+ * The values log(X_i) are tabulated below. Let d = e / X_i and use
+ *
+ * log(1 + d) = p(d)
+ *
+ * where p(d) = d - 0.5*d*d + ... is a special minimax polynomial of
+ * suitably high degree.
+ *
+ * To get sufficiently small roundoff errors, k * log(2), log(X_i), and
+ * sometimes (if |k| is not large) the first term in p(d) must be evaluated
+ * and added up in extra precision. Extra precision is not needed for the
+ * rest of p(d). In the worst case when k = 0 and log(X_i) is 0, the final
+ * error is controlled mainly by the error in the second term in p(d). The
+ * error in this term itself is at most 0.5 ulps from the d*d operation in
+ * it. The error in this term relative to the first term is thus at most
+ * 0.5 * |-0.5| * |d| < 1.0/1024 ulps. We aim for an accumulated error of
+ * at most twice this at the point of the final rounding step. Thus the
+ * final error should be at most 0.5 + 1.0/512 = 0.5020 ulps. Exhaustive
+ * testing of a float variant of this function showed a maximum final error
+ * of 0.5008 ulps. Non-exhaustive testing of a double variant of this
+ * function showed a maximum final error of 0.5078 ulps (near 1+1.0/256).
+ *
+ * We made the maximum of |d| (and thus the total relative error and the
+ * degree of p(d)) small by using a large number of intervals. Using
+ * centers of intervals instead of endpoints reduces this maximum by a
+ * factor of 2 for a given number of intervals. p(d) is special only
+ * in beginning with the Taylor coefficients 0 + 1*d, which tends to happen
+ * naturally. The most accurate minimax polynomial of a given degree might
+ * be different, but then we wouldn't want it since we would have to do
+ * extra work to avoid roundoff error (especially for P0*d instead of d).
+ */
+
+#ifdef DEBUG
+#include <assert.h>
+#include <fenv.h>
+#endif
+
+#ifdef __i386__
+#include <ieeefp.h>
+#endif
+
+#include "fpmath.h"
+#include "math.h"
+#define i386_SSE_GOOD
+#ifndef NO_STRUCT_RETURN
+#define STRUCT_RETURN
+#endif
+#include "math_private.h"
+
+#if !defined(NO_UTAB) && !defined(NO_UTABL)
+#define USE_UTAB
+#endif
+
+/*
+ * Domain [-0.005280, 0.004838], range ~[-5.1736e-22, 5.1738e-22]:
+ * |log(1 + d)/d - p(d)| < 2**-70.7
+ */
+static const double
+P2 = -0.5,
+P3 = 3.3333333333333359e-1, /* 0x1555555555555a.0p-54 */
+P4 = -2.5000000000004424e-1, /* -0x1000000000031d.0p-54 */
+P5 = 1.9999999992970016e-1, /* 0x1999999972f3c7.0p-55 */
+P6 = -1.6666666072191585e-1, /* -0x15555548912c09.0p-55 */
+P7 = 1.4286227413310518e-1, /* 0x12494f9d9def91.0p-55 */
+P8 = -1.2518388626763144e-1; /* -0x1006068cc0b97c.0p-55 */
+
+static volatile const double zero = 0;
+
+#define INTERVALS 128
+#define LOG2_INTERVALS 7
+#define TSIZE (INTERVALS + 1)
+#define G(i) (T[(i)].G)
+#define F_hi(i) (T[(i)].F_hi)
+#define F_lo(i) (T[(i)].F_lo)
+#define ln2_hi F_hi(TSIZE - 1)
+#define ln2_lo F_lo(TSIZE - 1)
+#define E(i) (U[(i)].E)
+#define H(i) (U[(i)].H)
+
+static const struct {
+ float G; /* 1/(1 + i/128) rounded to 8/9 bits */
+ float F_hi; /* log(1 / G_i) rounded (see below) */
+ double F_lo; /* next 53 bits for log(1 / G_i) */
+} T[TSIZE] = {
+ /*
+ * ln2_hi and each F_hi(i) are rounded to a number of bits that
+ * makes F_hi(i) + dk*ln2_hi exact for all i and all dk.
+ *
+ * The last entry (for X just below 2) is used to define ln2_hi
+ * and ln2_lo, to ensure that F_hi(i) and F_lo(i) cancel exactly
+ * with dk*ln2_hi and dk*ln2_lo, respectively, when dk = -1.
+ * This is needed for accuracy when x is just below 1. (To avoid
+ * special cases, such x are "reduced" strangely to X just below
+ * 2 and dk = -1, and then the exact cancellation is needed
+ * because any the error from any non-exactness would be too
+ * large).
+ *
+ * We want to share this table between double precision and ld80,
+ * so the relevant range of dk is the larger one of ld80
+ * ([-16445, 16383]) and the relevant exactness requirement is
+ * the stricter one of double precision. The maximum number of
+ * bits in F_hi(i) that works is very dependent on i but has
+ * a minimum of 33. We only need about 12 bits in F_hi(i) for
+ * it to provide enough extra precision in double precision (11
+ * more than that are required for ld80).
+ *
+ * We round F_hi(i) to 24 bits so that it can have type float,
+ * mainly to minimize the size of the table. Using all 24 bits
+ * in a float for it automatically satisfies the above constraints.
+ */
+ { 0x800000.0p-23, 0, 0 },
+ { 0xfe0000.0p-24, 0x8080ac.0p-30, -0x14ee431dae6675.0p-84 },
+ { 0xfc0000.0p-24, 0x8102b3.0p-29, -0x1db29ee2d83718.0p-84 },
+ { 0xfa0000.0p-24, 0xc24929.0p-29, 0x1191957d173698.0p-83 },
+ { 0xf80000.0p-24, 0x820aec.0p-28, 0x13ce8888e02e79.0p-82 },
+ { 0xf60000.0p-24, 0xa33577.0p-28, -0x17a4382ce6eb7c.0p-82 },
+ { 0xf48000.0p-24, 0xbc42cb.0p-28, -0x172a21161a1076.0p-83 },
+ { 0xf30000.0p-24, 0xd57797.0p-28, -0x1e09de07cb9589.0p-82 },
+ { 0xf10000.0p-24, 0xf7518e.0p-28, 0x1ae1eec1b036c5.0p-91 },
+ { 0xef0000.0p-24, 0x8cb9df.0p-27, -0x1d7355325d560e.0p-81 },
+ { 0xed8000.0p-24, 0x999ec0.0p-27, -0x1f9f02d256d503.0p-82 },
+ { 0xec0000.0p-24, 0xa6988b.0p-27, -0x16fc0a9d12c17a.0p-83 },
+ { 0xea0000.0p-24, 0xb80698.0p-27, 0x15d581c1e8da9a.0p-81 },
+ { 0xe80000.0p-24, 0xc99af3.0p-27, -0x1535b3ba8f150b.0p-83 },
+ { 0xe70000.0p-24, 0xd273b2.0p-27, 0x163786f5251af0.0p-85 },
+ { 0xe50000.0p-24, 0xe442c0.0p-27, 0x1bc4b2368e32d5.0p-84 },
+ { 0xe38000.0p-24, 0xf1b83f.0p-27, 0x1c6090f684e676.0p-81 },
+ { 0xe20000.0p-24, 0xff448a.0p-27, -0x1890aa69ac9f42.0p-82 },
+ { 0xe08000.0p-24, 0x8673f6.0p-26, 0x1b9985194b6b00.0p-80 },
+ { 0xdf0000.0p-24, 0x8d515c.0p-26, -0x1dc08d61c6ef1e.0p-83 },
+ { 0xdd8000.0p-24, 0x943a9e.0p-26, -0x1f72a2dac729b4.0p-82 },
+ { 0xdc0000.0p-24, 0x9b2fe6.0p-26, -0x1fd4dfd3a0afb9.0p-80 },
+ { 0xda8000.0p-24, 0xa2315d.0p-26, -0x11b26121629c47.0p-82 },
+ { 0xd90000.0p-24, 0xa93f2f.0p-26, 0x1286d633e8e569.0p-81 },
+ { 0xd78000.0p-24, 0xb05988.0p-26, 0x16128eba936770.0p-84 },
+ { 0xd60000.0p-24, 0xb78094.0p-26, 0x16ead577390d32.0p-80 },
+ { 0xd50000.0p-24, 0xbc4c6c.0p-26, 0x151131ccf7c7b7.0p-81 },
+ { 0xd38000.0p-24, 0xc3890a.0p-26, -0x115e2cd714bd06.0p-80 },
+ { 0xd20000.0p-24, 0xcad2d7.0p-26, -0x1847f406ebd3b0.0p-82 },
+ { 0xd10000.0p-24, 0xcfb620.0p-26, 0x1c2259904d6866.0p-81 },
+ { 0xcf8000.0p-24, 0xd71653.0p-26, 0x1ece57a8d5ae55.0p-80 },
+ { 0xce0000.0p-24, 0xde843a.0p-26, -0x1f109d4bc45954.0p-81 },
+ { 0xcd0000.0p-24, 0xe37fde.0p-26, 0x1bc03dc271a74d.0p-81 },
+ { 0xcb8000.0p-24, 0xeb050c.0p-26, -0x1bf2badc0df842.0p-85 },
+ { 0xca0000.0p-24, 0xf29878.0p-26, -0x18efededd89fbe.0p-87 },
+ { 0xc90000.0p-24, 0xf7ad6f.0p-26, 0x1373ff977baa69.0p-81 },
+ { 0xc80000.0p-24, 0xfcc8e3.0p-26, 0x196766f2fb3283.0p-80 },
+ { 0xc68000.0p-24, 0x823f30.0p-25, 0x19bd076f7c434e.0p-79 },
+ { 0xc58000.0p-24, 0x84d52c.0p-25, -0x1a327257af0f46.0p-79 },
+ { 0xc40000.0p-24, 0x88bc74.0p-25, 0x113f23def19c5a.0p-81 },
+ { 0xc30000.0p-24, 0x8b5ae6.0p-25, 0x1759f6e6b37de9.0p-79 },
+ { 0xc20000.0p-24, 0x8dfccb.0p-25, 0x1ad35ca6ed5148.0p-81 },
+ { 0xc10000.0p-24, 0x90a22b.0p-25, 0x1a1d71a87deba4.0p-79 },
+ { 0xbf8000.0p-24, 0x94a0d8.0p-25, -0x139e5210c2b731.0p-80 },
+ { 0xbe8000.0p-24, 0x974f16.0p-25, -0x18f6ebcff3ed73.0p-81 },
+ { 0xbd8000.0p-24, 0x9a00f1.0p-25, -0x1aa268be39aab7.0p-79 },
+ { 0xbc8000.0p-24, 0x9cb672.0p-25, -0x14c8815839c566.0p-79 },
+ { 0xbb0000.0p-24, 0xa0cda1.0p-25, 0x1eaf46390dbb24.0p-81 },
+ { 0xba0000.0p-24, 0xa38c6e.0p-25, 0x138e20d831f698.0p-81 },
+ { 0xb90000.0p-24, 0xa64f05.0p-25, -0x1e8d3c41123616.0p-82 },
+ { 0xb80000.0p-24, 0xa91570.0p-25, 0x1ce28f5f3840b2.0p-80 },
+ { 0xb70000.0p-24, 0xabdfbb.0p-25, -0x186e5c0a424234.0p-79 },
+ { 0xb60000.0p-24, 0xaeadef.0p-25, -0x14d41a0b2a08a4.0p-83 },
+ { 0xb50000.0p-24, 0xb18018.0p-25, 0x16755892770634.0p-79 },
+ { 0xb40000.0p-24, 0xb45642.0p-25, -0x16395ebe59b152.0p-82 },
+ { 0xb30000.0p-24, 0xb73077.0p-25, 0x1abc65c8595f09.0p-80 },
+ { 0xb20000.0p-24, 0xba0ec4.0p-25, -0x1273089d3dad89.0p-79 },
+ { 0xb10000.0p-24, 0xbcf133.0p-25, 0x10f9f67b1f4bbf.0p-79 },
+ { 0xb00000.0p-24, 0xbfd7d2.0p-25, -0x109fab90486409.0p-80 },
+ { 0xaf0000.0p-24, 0xc2c2ac.0p-25, -0x1124680aa43333.0p-79 },
+ { 0xae8000.0p-24, 0xc439b3.0p-25, -0x1f360cc4710fc0.0p-80 },
+ { 0xad8000.0p-24, 0xc72afd.0p-25, -0x132d91f21d89c9.0p-80 },
+ { 0xac8000.0p-24, 0xca20a2.0p-25, -0x16bf9b4d1f8da8.0p-79 },
+ { 0xab8000.0p-24, 0xcd1aae.0p-25, 0x19deb5ce6a6a87.0p-81 },
+ { 0xaa8000.0p-24, 0xd0192f.0p-25, 0x1a29fb48f7d3cb.0p-79 },
+ { 0xaa0000.0p-24, 0xd19a20.0p-25, 0x1127d3c6457f9d.0p-81 },
+ { 0xa90000.0p-24, 0xd49f6a.0p-25, -0x1ba930e486a0ac.0p-81 },
+ { 0xa80000.0p-24, 0xd7a94b.0p-25, -0x1b6e645f31549e.0p-79 },
+ { 0xa70000.0p-24, 0xdab7d0.0p-25, 0x1118a425494b61.0p-80 },
+ { 0xa68000.0p-24, 0xdc40d5.0p-25, 0x1966f24d29d3a3.0p-80 },
+ { 0xa58000.0p-24, 0xdf566d.0p-25, -0x1d8e52eb2248f1.0p-82 },
+ { 0xa48000.0p-24, 0xe270ce.0p-25, -0x1ee370f96e6b68.0p-80 },
+ { 0xa40000.0p-24, 0xe3ffce.0p-25, 0x1d155324911f57.0p-80 },
+ { 0xa30000.0p-24, 0xe72179.0p-25, -0x1fe6e2f2f867d9.0p-80 },
+ { 0xa20000.0p-24, 0xea4812.0p-25, 0x1b7be9add7f4d4.0p-80 },
+ { 0xa18000.0p-24, 0xebdd3d.0p-25, 0x1b3cfb3f7511dd.0p-79 },
+ { 0xa08000.0p-24, 0xef0b5b.0p-25, -0x1220de1f730190.0p-79 },
+ { 0xa00000.0p-24, 0xf0a451.0p-25, -0x176364c9ac81cd.0p-80 },
+ { 0x9f0000.0p-24, 0xf3da16.0p-25, 0x1eed6b9aafac8d.0p-81 },
+ { 0x9e8000.0p-24, 0xf576e9.0p-25, 0x1d593218675af2.0p-79 },
+ { 0x9d8000.0p-24, 0xf8b47c.0p-25, -0x13e8eb7da053e0.0p-84 },
+ { 0x9d0000.0p-24, 0xfa553f.0p-25, 0x1c063259bcade0.0p-79 },
+ { 0x9c0000.0p-24, 0xfd9ac5.0p-25, 0x1ef491085fa3c1.0p-79 },
+ { 0x9b8000.0p-24, 0xff3f8c.0p-25, 0x1d607a7c2b8c53.0p-79 },
+ { 0x9a8000.0p-24, 0x814697.0p-24, -0x12ad3817004f3f.0p-78 },
+ { 0x9a0000.0p-24, 0x821b06.0p-24, -0x189fc53117f9e5.0p-81 },
+ { 0x990000.0p-24, 0x83c5f8.0p-24, 0x14cf15a048907b.0p-79 },
+ { 0x988000.0p-24, 0x849c7d.0p-24, 0x1cbb1d35fb8287.0p-78 },
+ { 0x978000.0p-24, 0x864ba6.0p-24, 0x1128639b814f9c.0p-78 },
+ { 0x970000.0p-24, 0x87244c.0p-24, 0x184733853300f0.0p-79 },
+ { 0x968000.0p-24, 0x87fdaa.0p-24, 0x109d23aef77dd6.0p-80 },
+ { 0x958000.0p-24, 0x89b293.0p-24, -0x1a81ef367a59de.0p-78 },
+ { 0x950000.0p-24, 0x8a8e20.0p-24, -0x121ad3dbb2f452.0p-78 },
+ { 0x948000.0p-24, 0x8b6a6a.0p-24, -0x1cfb981628af72.0p-79 },
+ { 0x938000.0p-24, 0x8d253a.0p-24, -0x1d21730ea76cfe.0p-79 },
+ { 0x930000.0p-24, 0x8e03c2.0p-24, 0x135cc00e566f77.0p-78 },
+ { 0x928000.0p-24, 0x8ee30d.0p-24, -0x10fcb5df257a26.0p-80 },
+ { 0x918000.0p-24, 0x90a3ee.0p-24, -0x16e171b15433d7.0p-79 },
+ { 0x910000.0p-24, 0x918587.0p-24, -0x1d050da07f3237.0p-79 },
+ { 0x908000.0p-24, 0x9267e7.0p-24, 0x1be03669a5268d.0p-79 },
+ { 0x8f8000.0p-24, 0x942f04.0p-24, 0x10b28e0e26c337.0p-79 },
+ { 0x8f0000.0p-24, 0x9513c3.0p-24, 0x1a1d820da57cf3.0p-78 },
+ { 0x8e8000.0p-24, 0x95f950.0p-24, -0x19ef8f13ae3cf1.0p-79 },
+ { 0x8e0000.0p-24, 0x96dfab.0p-24, -0x109e417a6e507c.0p-78 },
+ { 0x8d0000.0p-24, 0x98aed2.0p-24, 0x10d01a2c5b0e98.0p-79 },
+ { 0x8c8000.0p-24, 0x9997a2.0p-24, -0x1d6a50d4b61ea7.0p-78 },
+ { 0x8c0000.0p-24, 0x9a8145.0p-24, 0x1b3b190b83f952.0p-78 },
+ { 0x8b8000.0p-24, 0x9b6bbf.0p-24, 0x13a69fad7e7abe.0p-78 },
+ { 0x8b0000.0p-24, 0x9c5711.0p-24, -0x11cd12316f576b.0p-78 },
+ { 0x8a8000.0p-24, 0x9d433b.0p-24, 0x1c95c444b807a2.0p-79 },
+ { 0x898000.0p-24, 0x9f1e22.0p-24, -0x1b9c224ea698c3.0p-79 },
+ { 0x890000.0p-24, 0xa00ce1.0p-24, 0x125ca93186cf0f.0p-81 },
+ { 0x888000.0p-24, 0xa0fc80.0p-24, -0x1ee38a7bc228b3.0p-79 },
+ { 0x880000.0p-24, 0xa1ed00.0p-24, -0x1a0db876613d20.0p-78 },
+ { 0x878000.0p-24, 0xa2de62.0p-24, 0x193224e8516c01.0p-79 },
+ { 0x870000.0p-24, 0xa3d0a9.0p-24, 0x1fa28b4d2541ad.0p-79 },
+ { 0x868000.0p-24, 0xa4c3d6.0p-24, 0x1c1b5760fb4572.0p-78 },
+ { 0x858000.0p-24, 0xa6acea.0p-24, 0x1fed5d0f65949c.0p-80 },
+ { 0x850000.0p-24, 0xa7a2d4.0p-24, 0x1ad270c9d74936.0p-80 },
+ { 0x848000.0p-24, 0xa899ab.0p-24, 0x199ff15ce53266.0p-79 },
+ { 0x840000.0p-24, 0xa99171.0p-24, 0x1a19e15ccc45d2.0p-79 },
+ { 0x838000.0p-24, 0xaa8a28.0p-24, -0x121a14ec532b36.0p-80 },
+ { 0x830000.0p-24, 0xab83d1.0p-24, 0x1aee319980bff3.0p-79 },
+ { 0x828000.0p-24, 0xac7e6f.0p-24, -0x18ffd9e3900346.0p-80 },
+ { 0x820000.0p-24, 0xad7a03.0p-24, -0x1e4db102ce29f8.0p-80 },
+ { 0x818000.0p-24, 0xae768f.0p-24, 0x17c35c55a04a83.0p-81 },
+ { 0x810000.0p-24, 0xaf7415.0p-24, 0x1448324047019b.0p-78 },
+ { 0x808000.0p-24, 0xb07298.0p-24, -0x1750ee3915a198.0p-78 },
+ { 0x800000.0p-24, 0xb17218.0p-24, -0x105c610ca86c39.0p-81 },
+};
+
+#ifdef USE_UTAB
+static const struct {
+ float H; /* 1 + i/INTERVALS (exact) */
+ float E; /* H(i) * G(i) - 1 (exact) */
+} U[TSIZE] = {
+ { 0x800000.0p-23, 0 },
+ { 0x810000.0p-23, -0x800000.0p-37 },
+ { 0x820000.0p-23, -0x800000.0p-35 },
+ { 0x830000.0p-23, -0x900000.0p-34 },
+ { 0x840000.0p-23, -0x800000.0p-33 },
+ { 0x850000.0p-23, -0xc80000.0p-33 },
+ { 0x860000.0p-23, -0xa00000.0p-36 },
+ { 0x870000.0p-23, 0x940000.0p-33 },
+ { 0x880000.0p-23, 0x800000.0p-35 },
+ { 0x890000.0p-23, -0xc80000.0p-34 },
+ { 0x8a0000.0p-23, 0xe00000.0p-36 },
+ { 0x8b0000.0p-23, 0x900000.0p-33 },
+ { 0x8c0000.0p-23, -0x800000.0p-35 },
+ { 0x8d0000.0p-23, -0xe00000.0p-33 },
+ { 0x8e0000.0p-23, 0x880000.0p-33 },
+ { 0x8f0000.0p-23, -0xa80000.0p-34 },
+ { 0x900000.0p-23, -0x800000.0p-35 },
+ { 0x910000.0p-23, 0x800000.0p-37 },
+ { 0x920000.0p-23, 0x900000.0p-35 },
+ { 0x930000.0p-23, 0xd00000.0p-35 },
+ { 0x940000.0p-23, 0xe00000.0p-35 },
+ { 0x950000.0p-23, 0xc00000.0p-35 },
+ { 0x960000.0p-23, 0xe00000.0p-36 },
+ { 0x970000.0p-23, -0x800000.0p-38 },
+ { 0x980000.0p-23, -0xc00000.0p-35 },
+ { 0x990000.0p-23, -0xd00000.0p-34 },
+ { 0x9a0000.0p-23, 0x880000.0p-33 },
+ { 0x9b0000.0p-23, 0xe80000.0p-35 },
+ { 0x9c0000.0p-23, -0x800000.0p-35 },
+ { 0x9d0000.0p-23, 0xb40000.0p-33 },
+ { 0x9e0000.0p-23, 0x880000.0p-34 },
+ { 0x9f0000.0p-23, -0xe00000.0p-35 },
+ { 0xa00000.0p-23, 0x800000.0p-33 },
+ { 0xa10000.0p-23, -0x900000.0p-36 },
+ { 0xa20000.0p-23, -0xb00000.0p-33 },
+ { 0xa30000.0p-23, -0xa00000.0p-36 },
+ { 0xa40000.0p-23, 0x800000.0p-33 },
+ { 0xa50000.0p-23, -0xf80000.0p-35 },
+ { 0xa60000.0p-23, 0x880000.0p-34 },
+ { 0xa70000.0p-23, -0x900000.0p-33 },
+ { 0xa80000.0p-23, -0x800000.0p-35 },
+ { 0xa90000.0p-23, 0x900000.0p-34 },
+ { 0xaa0000.0p-23, 0xa80000.0p-33 },
+ { 0xab0000.0p-23, -0xac0000.0p-34 },
+ { 0xac0000.0p-23, -0x800000.0p-37 },
+ { 0xad0000.0p-23, 0xf80000.0p-35 },
+ { 0xae0000.0p-23, 0xf80000.0p-34 },
+ { 0xaf0000.0p-23, -0xac0000.0p-33 },
+ { 0xb00000.0p-23, -0x800000.0p-33 },
+ { 0xb10000.0p-23, -0xb80000.0p-34 },
+ { 0xb20000.0p-23, -0x800000.0p-34 },
+ { 0xb30000.0p-23, -0xb00000.0p-35 },
+ { 0xb40000.0p-23, -0x800000.0p-35 },
+ { 0xb50000.0p-23, -0xe00000.0p-36 },
+ { 0xb60000.0p-23, -0x800000.0p-35 },
+ { 0xb70000.0p-23, -0xb00000.0p-35 },
+ { 0xb80000.0p-23, -0x800000.0p-34 },
+ { 0xb90000.0p-23, -0xb80000.0p-34 },
+ { 0xba0000.0p-23, -0x800000.0p-33 },
+ { 0xbb0000.0p-23, -0xac0000.0p-33 },
+ { 0xbc0000.0p-23, 0x980000.0p-33 },
+ { 0xbd0000.0p-23, 0xbc0000.0p-34 },
+ { 0xbe0000.0p-23, 0xe00000.0p-36 },
+ { 0xbf0000.0p-23, -0xb80000.0p-35 },
+ { 0xc00000.0p-23, -0x800000.0p-33 },
+ { 0xc10000.0p-23, 0xa80000.0p-33 },
+ { 0xc20000.0p-23, 0x900000.0p-34 },
+ { 0xc30000.0p-23, -0x800000.0p-35 },
+ { 0xc40000.0p-23, -0x900000.0p-33 },
+ { 0xc50000.0p-23, 0x820000.0p-33 },
+ { 0xc60000.0p-23, 0x800000.0p-38 },
+ { 0xc70000.0p-23, -0x820000.0p-33 },
+ { 0xc80000.0p-23, 0x800000.0p-33 },
+ { 0xc90000.0p-23, -0xa00000.0p-36 },
+ { 0xca0000.0p-23, -0xb00000.0p-33 },
+ { 0xcb0000.0p-23, 0x840000.0p-34 },
+ { 0xcc0000.0p-23, -0xd00000.0p-34 },
+ { 0xcd0000.0p-23, 0x800000.0p-33 },
+ { 0xce0000.0p-23, -0xe00000.0p-35 },
+ { 0xcf0000.0p-23, 0xa60000.0p-33 },
+ { 0xd00000.0p-23, -0x800000.0p-35 },
+ { 0xd10000.0p-23, 0xb40000.0p-33 },
+ { 0xd20000.0p-23, -0x800000.0p-35 },
+ { 0xd30000.0p-23, 0xaa0000.0p-33 },
+ { 0xd40000.0p-23, -0xe00000.0p-35 },
+ { 0xd50000.0p-23, 0x880000.0p-33 },
+ { 0xd60000.0p-23, -0xd00000.0p-34 },
+ { 0xd70000.0p-23, 0x9c0000.0p-34 },
+ { 0xd80000.0p-23, -0xb00000.0p-33 },
+ { 0xd90000.0p-23, -0x800000.0p-38 },
+ { 0xda0000.0p-23, 0xa40000.0p-33 },
+ { 0xdb0000.0p-23, -0xdc0000.0p-34 },
+ { 0xdc0000.0p-23, 0xc00000.0p-35 },
+ { 0xdd0000.0p-23, 0xca0000.0p-33 },
+ { 0xde0000.0p-23, -0xb80000.0p-34 },
+ { 0xdf0000.0p-23, 0xd00000.0p-35 },
+ { 0xe00000.0p-23, 0xc00000.0p-33 },
+ { 0xe10000.0p-23, -0xf40000.0p-34 },
+ { 0xe20000.0p-23, 0x800000.0p-37 },
+ { 0xe30000.0p-23, 0x860000.0p-33 },
+ { 0xe40000.0p-23, -0xc80000.0p-33 },
+ { 0xe50000.0p-23, -0xa80000.0p-34 },
+ { 0xe60000.0p-23, 0xe00000.0p-36 },
+ { 0xe70000.0p-23, 0x880000.0p-33 },
+ { 0xe80000.0p-23, -0xe00000.0p-33 },
+ { 0xe90000.0p-23, -0xfc0000.0p-34 },
+ { 0xea0000.0p-23, -0x800000.0p-35 },
+ { 0xeb0000.0p-23, 0xe80000.0p-35 },
+ { 0xec0000.0p-23, 0x900000.0p-33 },
+ { 0xed0000.0p-23, 0xe20000.0p-33 },
+ { 0xee0000.0p-23, -0xac0000.0p-33 },
+ { 0xef0000.0p-23, -0xc80000.0p-34 },
+ { 0xf00000.0p-23, -0x800000.0p-35 },
+ { 0xf10000.0p-23, 0x800000.0p-35 },
+ { 0xf20000.0p-23, 0xb80000.0p-34 },
+ { 0xf30000.0p-23, 0x940000.0p-33 },
+ { 0xf40000.0p-23, 0xc80000.0p-33 },
+ { 0xf50000.0p-23, -0xf20000.0p-33 },
+ { 0xf60000.0p-23, -0xc80000.0p-33 },
+ { 0xf70000.0p-23, -0xa20000.0p-33 },
+ { 0xf80000.0p-23, -0x800000.0p-33 },
+ { 0xf90000.0p-23, -0xc40000.0p-34 },
+ { 0xfa0000.0p-23, -0x900000.0p-34 },
+ { 0xfb0000.0p-23, -0xc80000.0p-35 },
+ { 0xfc0000.0p-23, -0x800000.0p-35 },
+ { 0xfd0000.0p-23, -0x900000.0p-36 },
+ { 0xfe0000.0p-23, -0x800000.0p-37 },
+ { 0xff0000.0p-23, -0x800000.0p-39 },
+ { 0x800000.0p-22, 0 },
+};
+#endif /* USE_UTAB */
+
+#ifdef STRUCT_RETURN
+#define RETURN1(rp, v) do { \
+ (rp)->hi = (v); \
+ (rp)->lo_set = 0; \
+ return; \
+} while (0)
+
+#define RETURN2(rp, h, l) do { \
+ (rp)->hi = (h); \
+ (rp)->lo = (l); \
+ (rp)->lo_set = 1; \
+ return; \
+} while (0)
+
+struct ld {
+ long double hi;
+ long double lo;
+ int lo_set;
+};
+#else
+#define RETURN1(rp, v) RETURNF(v)
+#define RETURN2(rp, h, l) RETURNI((h) + (l))
+#endif
+
+#ifdef STRUCT_RETURN
+static inline __always_inline void
+k_logl(long double x, struct ld *rp)
+#else
+long double
+logl(long double x)
+#endif
+{
+ long double d, dk, val_hi, val_lo, z;
+ uint64_t ix, lx;
+ int i, k;
+ uint16_t hx;
+
+ EXTRACT_LDBL80_WORDS(hx, lx, x);
+ k = -16383;
+#if 0 /* Hard to do efficiently. Don't do it until we support all modes. */
+ if (x == 1)
+ RETURN1(rp, 0); /* log(1) = +0 in all rounding modes */
+#endif
+ if (hx == 0 || hx >= 0x8000) { /* zero, negative or subnormal? */
+ if (((hx & 0x7fff) | lx) == 0)
+ RETURN1(rp, -1 / zero); /* log(+-0) = -Inf */
+ if (hx != 0)
+ /* log(neg or [pseudo-]NaN) = qNaN: */
+ RETURN1(rp, (x - x) / zero);
+ x *= 0x1.0p65; /* subnormal; scale up x */
+ /* including pseudo-subnormals */
+ EXTRACT_LDBL80_WORDS(hx, lx, x);
+ k = -16383 - 65;
+ } else if (hx >= 0x7fff || (lx & 0x8000000000000000ULL) == 0)
+ RETURN1(rp, x + x); /* log(Inf or NaN) = Inf or qNaN */
+ /* log(pseudo-Inf) = qNaN */
+ /* log(pseudo-NaN) = qNaN */
+ /* log(unnormal) = qNaN */
+#ifndef STRUCT_RETURN
+ ENTERI();
+#endif
+ k += hx;
+ ix = lx & 0x7fffffffffffffffULL;
+ dk = k;
+
+ /* Scale x to be in [1, 2). */
+ SET_LDBL_EXPSIGN(x, 0x3fff);
+
+ /* 0 <= i <= INTERVALS: */
+#define L2I (64 - LOG2_INTERVALS)
+ i = (ix + (1LL << (L2I - 2))) >> (L2I - 1);
+
+ /*
+ * -0.005280 < d < 0.004838. In particular, the infinite-
+ * precision |d| is <= 2**-7. Rounding of G(i) to 8 bits
+ * ensures that d is representable without extra precision for
+ * this bound on |d| (since when this calculation is expressed
+ * as x*G(i)-1, the multiplication needs as many extra bits as
+ * G(i) has and the subtraction cancels 8 bits). But for
+ * most i (107 cases out of 129), the infinite-precision |d|
+ * is <= 2**-8. G(i) is rounded to 9 bits for such i to give
+ * better accuracy (this works by improving the bound on |d|,
+ * which in turn allows rounding to 9 bits in more cases).
+ * This is only important when the original x is near 1 -- it
+ * lets us avoid using a special method to give the desired
+ * accuracy for such x.
+ */
+ if (0)
+ d = x * G(i) - 1;
+ else {
+#ifdef USE_UTAB
+ d = (x - H(i)) * G(i) + E(i);
+#else
+ long double x_hi, x_lo;
+ float fx_hi;
+
+ /*
+ * Split x into x_hi + x_lo to calculate x*G(i)-1 exactly.
+ * G(i) has at most 9 bits, so the splitting point is not
+ * critical.
+ */
+ SET_FLOAT_WORD(fx_hi, (lx >> 40) | 0x3f800000);
+ x_hi = fx_hi;
+ x_lo = x - x_hi;
+ d = x_hi * G(i) - 1 + x_lo * G(i);
+#endif
+ }
+
+ /*
+ * Our algorithm depends on exact cancellation of F_lo(i) and
+ * F_hi(i) with dk*ln_2_lo and dk*ln2_hi when k is -1 and i is
+ * at the end of the table. This and other technical complications
+ * make it difficult to avoid the double scaling in (dk*ln2) *
+ * log(base) for base != e without losing more accuracy and/or
+ * efficiency than is gained.
+ */
+ z = d * d;
+ val_lo = z * d * z * (z * (d * P8 + P7) + (d * P6 + P5)) +
+ (F_lo(i) + dk * ln2_lo + z * d * (d * P4 + P3)) + z * P2;
+ val_hi = d;
+#ifdef DEBUG
+ if (fetestexcept(FE_UNDERFLOW))
+ breakpoint();
+#endif
+
+ _3sumF(val_hi, val_lo, F_hi(i) + dk * ln2_hi);
+ RETURN2(rp, val_hi, val_lo);
+}
+
+long double
+log1pl(long double x)
+{
+ long double d, d_hi, d_lo, dk, f_lo, val_hi, val_lo, z;
+ long double f_hi, twopminusk;
+ uint64_t ix, lx;
+ int i, k;
+ int16_t ax, hx;
+
+ DOPRINT_START(&x);
+ EXTRACT_LDBL80_WORDS(hx, lx, x);
+ if (hx < 0x3fff) { /* x < 1, or x neg NaN */
+ ax = hx & 0x7fff;
+ if (ax >= 0x3fff) { /* x <= -1, or x neg NaN */
+ if (ax == 0x3fff && lx == 0x8000000000000000ULL)
+ RETURNP(-1 / zero); /* log1p(-1) = -Inf */
+ /* log1p(x < 1, or x [pseudo-]NaN) = qNaN: */
+ RETURNP((x - x) / (x - x));
+ }
+ if (ax <= 0x3fbe) { /* |x| < 2**-64 */
+ if ((int)x == 0)
+ RETURNP(x); /* x with inexact if x != 0 */
+ }
+ f_hi = 1;
+ f_lo = x;
+ } else if (hx >= 0x7fff) { /* x +Inf or non-neg NaN */
+ RETURNP(x + x); /* log1p(Inf or NaN) = Inf or qNaN */
+ /* log1p(pseudo-Inf) = qNaN */
+ /* log1p(pseudo-NaN) = qNaN */
+ /* log1p(unnormal) = qNaN */
+ } else if (hx < 0x407f) { /* 1 <= x < 2**128 */
+ f_hi = x;
+ f_lo = 1;
+ } else { /* 2**128 <= x < +Inf */
+ f_hi = x;
+ f_lo = 0; /* avoid underflow of the P5 term */
+ }
+ ENTERI();
+ x = f_hi + f_lo;
+ f_lo = (f_hi - x) + f_lo;
+
+ EXTRACT_LDBL80_WORDS(hx, lx, x);
+ k = -16383;
+
+ k += hx;
+ ix = lx & 0x7fffffffffffffffULL;
+ dk = k;
+
+ SET_LDBL_EXPSIGN(x, 0x3fff);
+ twopminusk = 1;
+ SET_LDBL_EXPSIGN(twopminusk, 0x7ffe - (hx & 0x7fff));
+ f_lo *= twopminusk;
+
+ i = (ix + (1LL << (L2I - 2))) >> (L2I - 1);
+
+ /*
+ * x*G(i)-1 (with a reduced x) can be represented exactly, as
+ * above, but now we need to evaluate the polynomial on d =
+ * (x+f_lo)*G(i)-1 and extra precision is needed for that.
+ * Since x+x_lo is a hi+lo decomposition and subtracting 1
+ * doesn't lose too many bits, an inexact calculation for
+ * f_lo*G(i) is good enough.
+ */
+ if (0)
+ d_hi = x * G(i) - 1;
+ else {
+#ifdef USE_UTAB
+ d_hi = (x - H(i)) * G(i) + E(i);
+#else
+ long double x_hi, x_lo;
+ float fx_hi;
+
+ SET_FLOAT_WORD(fx_hi, (lx >> 40) | 0x3f800000);
+ x_hi = fx_hi;
+ x_lo = x - x_hi;
+ d_hi = x_hi * G(i) - 1 + x_lo * G(i);
+#endif
+ }
+ d_lo = f_lo * G(i);
+
+ /*
+ * This is _2sumF(d_hi, d_lo) inlined. The condition
+ * (d_hi == 0 || |d_hi| >= |d_lo|) for using _2sumF() is not
+ * always satisifed, so it is not clear that this works, but
+ * it works in practice. It works even if it gives a wrong
+ * normalized d_lo, since |d_lo| > |d_hi| implies that i is
+ * nonzero and d is tiny, so the F(i) term dominates d_lo.
+ * In float precision:
+ * (By exhaustive testing, the worst case is d_hi = 0x1.bp-25.
+ * And if d is only a little tinier than that, we would have
+ * another underflow problem for the P3 term; this is also ruled
+ * out by exhaustive testing.)
+ */
+ d = d_hi + d_lo;
+ d_lo = d_hi - d + d_lo;
+ d_hi = d;
+
+ z = d * d;
+ val_lo = z * d * z * (z * (d * P8 + P7) + (d * P6 + P5)) +
+ (F_lo(i) + dk * ln2_lo + d_lo + z * d * (d * P4 + P3)) + z * P2;
+ val_hi = d_hi;
+#ifdef DEBUG
+ if (fetestexcept(FE_UNDERFLOW))
+ breakpoint();
+#endif
+
+ _3sumF(val_hi, val_lo, F_hi(i) + dk * ln2_hi);
+ RETURN2PI(val_hi, val_lo);
+}
+
+#ifdef STRUCT_RETURN
+
+long double
+logl(long double x)
+{
+ struct ld r;
+
+ ENTERI();
+ DOPRINT_START(&x);
+ k_logl(x, &r);
+ RETURNSPI(&r);
+}
+
+/* Use macros since GCC < 8 rejects static const expressions in initializers. */
+#define invln10_hi 4.3429448190317999e-1 /* 0x1bcb7b1526e000.0p-54 */
+#define invln10_lo 7.1842412889749798e-14 /* 0x1438ca9aadd558.0p-96 */
+#define invln2_hi 1.4426950408887933e0 /* 0x171547652b8000.0p-52 */
+#define invln2_lo 1.7010652264631490e-13 /* 0x17f0bbbe87fed0.0p-95 */
+/* Let the compiler pre-calculate this sum to avoid FE_INEXACT at run time. */
+static const double invln10_lo_plus_hi = invln10_lo + invln10_hi;
+static const double invln2_lo_plus_hi = invln2_lo + invln2_hi;
+
+long double
+log10l(long double x)
+{
+ struct ld r;
+ long double hi, lo;
+
+ ENTERI();
+ DOPRINT_START(&x);
+ k_logl(x, &r);
+ if (!r.lo_set)
+ RETURNPI(r.hi);
+ _2sumF(r.hi, r.lo);
+ hi = (float)r.hi;
+ lo = r.lo + (r.hi - hi);
+ RETURN2PI(invln10_hi * hi,
+ invln10_lo_plus_hi * lo + invln10_lo * hi);
+}
+
+long double
+log2l(long double x)
+{
+ struct ld r;
+ long double hi, lo;
+
+ ENTERI();
+ DOPRINT_START(&x);
+ k_logl(x, &r);
+ if (!r.lo_set)
+ RETURNPI(r.hi);
+ _2sumF(r.hi, r.lo);
+ hi = (float)r.hi;
+ lo = r.lo + (r.hi - hi);
+ RETURN2PI(invln2_hi * hi,
+ invln2_lo_plus_hi * lo + invln2_lo * hi);
+}
+
+#endif /* STRUCT_RETURN */
diff --git a/newlib/libm/ld80/s_sinpil.c b/newlib/libm/ld80/s_sinpil.c
new file mode 100644
index 000000000..4cefa9235
--- /dev/null
+++ b/newlib/libm/ld80/s_sinpil.c
@@ -0,0 +1,140 @@
+/*-
+ * Copyright (c) 2017 Steven G. Kargl
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice unmodified, this list of conditions, and the following
+ * disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * See ../src/s_sinpi.c for implementation details.
+ */
+
+#ifdef __i386__
+#include <ieeefp.h>
+#endif
+#include <stdint.h>
+
+#include "fpmath.h"
+#include "math.h"
+#include "math_private.h"
+
+static const union IEEEl2bits
+pi_hi_u = LD80C(0xc90fdaa200000000, 1, 3.14159265346825122833e+00L),
+pi_lo_u = LD80C(0x85a308d313198a2e, -33, 1.21542010130123852029e-10L);
+#define pi_hi (pi_hi_u.e)
+#define pi_lo (pi_lo_u.e)
+
+#include "k_cospil.h"
+#include "k_sinpil.h"
+
+volatile static const double vzero = 0;
+
+long double
+sinpil(long double x)
+{
+ long double ax, hi, lo, s;
+ uint64_t lx, m;
+ uint32_t j0;
+ uint16_t hx, ix;
+
+ EXTRACT_LDBL80_WORDS(hx, lx, x);
+ ix = hx & 0x7fff;
+ INSERT_LDBL80_WORDS(ax, ix, lx);
+
+ ENTERI();
+
+ if (ix < 0x3fff) { /* |x| < 1 */
+ if (ix < 0x3ffd) { /* |x| < 0.25 */
+ if (ix < 0x3fdd) { /* |x| < 0x1p-34 */
+ if (x == 0)
+ RETURNI(x);
+ INSERT_LDBL80_WORDS(hi, hx,
+ lx & 0xffffffff00000000ull);
+ hi *= 0x1p63L;
+ lo = x * 0x1p63L - hi;
+ s = (pi_lo + pi_hi) * lo + pi_lo * hi +
+ pi_hi * hi;
+ RETURNI(s * 0x1p-63L);
+ }
+ s = __kernel_sinpil(ax);
+ RETURNI((hx & 0x8000) ? -s : s);
+ }
+
+ if (ix < 0x3ffe) /* |x| < 0.5 */
+ s = __kernel_cospil(0.5 - ax);
+ else if (lx < 0xc000000000000000ull) /* |x| < 0.75 */
+ s = __kernel_cospil(ax - 0.5);
+ else
+ s = __kernel_sinpil(1 - ax);
+ RETURNI((hx & 0x8000) ? -s : s);
+ }
+
+ if (ix < 0x403e) { /* 1 <= |x| < 0x1p63 */
+ /* Determine integer part of ax. */
+ j0 = ix - 0x3fff + 1;
+ if (j0 < 32) {
+ lx = (lx >> 32) << 32;
+ lx &= ~(((lx << 32)-1) >> j0);
+ } else {
+ m = (uint64_t)-1 >> (j0 + 1);
+ if (lx & m) lx &= ~m;
+ }
+ INSERT_LDBL80_WORDS(x, ix, lx);
+
+ ax -= x;
+ EXTRACT_LDBL80_WORDS(ix, lx, ax);
+
+ if (ix == 0) {
+ s = 0;
+ } else {
+ if (ix < 0x3ffe) { /* |x| < 0.5 */
+ if (ix < 0x3ffd) /* |x| < 0.25 */
+ s = __kernel_sinpil(ax);
+ else
+ s = __kernel_cospil(0.5 - ax);
+ } else {
+ /* |x| < 0.75 */
+ if (lx < 0xc000000000000000ull)
+ s = __kernel_cospil(ax - 0.5);
+ else
+ s = __kernel_sinpil(1 - ax);
+ }
+
+ if (j0 > 40)
+ x -= 0x1p40;
+ if (j0 > 30)
+ x -= 0x1p30;
+ j0 = (uint32_t)x;
+ if (j0 & 1) s = -s;
+ }
+ RETURNI((hx & 0x8000) ? -s : s);
+ }
+
+ /* x = +-inf or nan. */
+ if (ix >= 0x7fff)
+ RETURNI(vzero / vzero);
+
+ /*
+ * |x| >= 0x1p63 is always an integer, so return +-0.
+ */
+ RETURNI(copysignl(0, x));
+}
--
2.31.1
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v2 2/3] newlib: Add non LDBL_EQ_DBL math support for aarch64, i386, and x86_64
2023-04-20 21:23 [PATCH v2 0/3] Add math support for non LDBL_EQ_DBL architecture Jennifer Averett
2023-04-20 21:23 ` [PATCH v2 1/3] newlib: Add FreeBSD files for non LDBL_EQ_DBL support Jennifer Averett
@ 2023-04-20 21:23 ` Jennifer Averett
2023-04-20 21:23 ` [PATCH v2 3/3] Regenerated source for adding non LDBL_EQ_DBL Jennifer Averett
2 siblings, 0 replies; 9+ messages in thread
From: Jennifer Averett @ 2023-04-20 21:23 UTC (permalink / raw)
To: newlib; +Cc: Jennifer Averett
Rename s_nearbyint.c, s_fdim.c and s_scalbln.c to remove conflicts
Remove functions that are not needed from above files
Modify include paths
Add missing types
Create Makefiles
Create header files to resolve dependencies between directories
Modify some instances of unsigned long to uint64_t for 32 bit platforms
Add HAVE_FPMATH_H
---
newlib/libc/acinclude.m4 | 3 +
newlib/libc/include/{sys => }/endian.h | 42 ++++++++++++--
newlib/libc/include/math.h | 3 +-
newlib/libc/machine/aarch64/machine/_fpmath.h | 20 ++++---
newlib/libm/Makefile.inc | 8 +++
newlib/libm/ld/Makefile.inc | 56 +++++++++++++++++++
newlib/libm/ld/e_lgammal.c | 2 +
newlib/libm/ld/{s_fdim.c => fdiml.c} | 7 +++
newlib/libm/ld/fpmath.h | 4 +-
newlib/libm/ld/invtrig.h | 34 +++++++++++
newlib/libm/ld/k_expl.h | 33 +++++++++++
newlib/libm/ld/math_private.h | 21 ++++++-
newlib/libm/ld/s_ilogbl.c | 6 +-
newlib/libm/ld/s_logbl.c | 6 +-
newlib/libm/ld/s_lround.c | 2 +-
.../libm/ld/{s_nearbyint.c => s_nearbyintl.c} | 7 +++
newlib/libm/ld/{s_scalbln.c => scalblnl.c} | 7 +++
newlib/libm/ld128/Makefile.inc | 14 +++++
newlib/libm/ld128/e_lgammal_r.c | 4 +-
newlib/libm/ld128/e_powl.c | 2 +-
newlib/libm/ld128/e_rem_pio2l.h | 2 +-
newlib/libm/ld128/invtrig.h | 2 +-
newlib/libm/ld128/k_cosl.c | 4 +-
newlib/libm/ld128/k_sinl.c | 4 +-
newlib/libm/ld128/s_erfl.c | 4 +-
newlib/libm/ld128/s_exp2l.c | 2 +-
newlib/libm/ld128/s_expl.c | 4 +-
newlib/libm/ld128/s_logl.c | 4 +-
newlib/libm/ld80/Makefile.inc | 15 +++++
newlib/libm/ld80/b_expl.c | 4 +-
newlib/libm/ld80/b_tgammal.c | 7 ++-
newlib/libm/ld80/e_lgammal_r.c | 4 +-
newlib/libm/ld80/e_powl.c | 4 +-
newlib/libm/ld80/e_rem_pio2l.h | 2 +-
newlib/libm/ld80/invtrig.h | 2 +-
newlib/libm/ld80/k_cosl.c | 4 +-
newlib/libm/ld80/k_sinl.c | 4 +-
newlib/libm/ld80/s_cospil.c | 4 +-
newlib/libm/ld80/s_erfl.c | 4 +-
newlib/libm/ld80/s_exp2l.c | 4 +-
newlib/libm/ld80/s_expl.c | 4 +-
newlib/libm/ld80/s_logl.c | 4 +-
newlib/libm/ld80/s_sinpil.c | 4 +-
43 files changed, 310 insertions(+), 67 deletions(-)
rename newlib/libc/include/{sys => }/endian.h (78%)
create mode 100644 newlib/libm/ld/Makefile.inc
rename newlib/libm/ld/{s_fdim.c => fdiml.c} (93%)
create mode 100644 newlib/libm/ld/invtrig.h
create mode 100644 newlib/libm/ld/k_expl.h
rename newlib/libm/ld/{s_nearbyint.c => s_nearbyintl.c} (94%)
rename newlib/libm/ld/{s_scalbln.c => scalblnl.c} (93%)
create mode 100644 newlib/libm/ld128/Makefile.inc
create mode 100644 newlib/libm/ld80/Makefile.inc
diff --git a/newlib/libc/acinclude.m4 b/newlib/libc/acinclude.m4
index 7cba7db39..42662669f 100644
--- a/newlib/libc/acinclude.m4
+++ b/newlib/libc/acinclude.m4
@@ -62,4 +62,7 @@ m4_foreach_w([MACHINE], [
z8k
], [AM_CONDITIONAL([HAVE_LIBC_MACHINE_]m4_toupper(MACHINE), test "${machine_dir}" = MACHINE)])
+AM_CONDITIONAL(HAVE_FPMATH_H, test -r "${srcdir}/libc/machine/${machine_dir}/machine/_fpmath.h")
+
+
AM_CONDITIONAL(MACH_ADD_SETJMP, test "x$mach_add_setjmp" = "xtrue")
diff --git a/newlib/libc/include/sys/endian.h b/newlib/libc/include/endian.h
similarity index 78%
rename from newlib/libc/include/sys/endian.h
rename to newlib/libc/include/endian.h
index d91c442e9..d070d09ad 100644
--- a/newlib/libc/include/sys/endian.h
+++ b/newlib/libc/include/endian.h
@@ -55,12 +55,6 @@ typedef __uint64_t uint64_t;
#define _UINT64_T_DECLARED
#endif
-/*
- * Note: While tempting to try to avoid namespace pollution from this file,
- * several software packages assume these marcos are defined, even when it
- * defines _POSIX_C_SOURCE to request an unpolluted namespace.
- */
-
/*
* General byte order swapping functions.
*/
@@ -68,7 +62,42 @@ typedef __uint64_t uint64_t;
#define bswap32(x) __bswap32(x)
#define bswap64(x) __bswap64(x)
+/*
+ * Host to big endian, host to little endian, big endian to host, and little
+ * endian to host byte order functions as detailed in byteorder(9).
+ */
+#if _BYTE_ORDER == _LITTLE_ENDIAN
+#define htobe16(x) bswap16((x))
+#define htobe32(x) bswap32((x))
+#define htobe64(x) bswap64((x))
+#define htole16(x) ((uint16_t)(x))
+#define htole32(x) ((uint32_t)(x))
+#define htole64(x) ((uint64_t)(x))
+
+#define be16toh(x) bswap16((x))
+#define be32toh(x) bswap32((x))
+#define be64toh(x) bswap64((x))
+#define le16toh(x) ((uint16_t)(x))
+#define le32toh(x) ((uint32_t)(x))
+#define le64toh(x) ((uint64_t)(x))
+#else /* _BYTE_ORDER != _LITTLE_ENDIAN */
+#define htobe16(x) ((uint16_t)(x))
+#define htobe32(x) ((uint32_t)(x))
+#define htobe64(x) ((uint64_t)(x))
+#define htole16(x) bswap16((x))
+#define htole32(x) bswap32((x))
+#define htole64(x) bswap64((x))
+
+#define be16toh(x) ((uint16_t)(x))
+#define be32toh(x) ((uint32_t)(x))
+#define be64toh(x) ((uint64_t)(x))
+#define le16toh(x) bswap16((x))
+#define le32toh(x) bswap32((x))
+#define le64toh(x) bswap64((x))
+#endif /* _BYTE_ORDER == _LITTLE_ENDIAN */
+
/* Alignment-agnostic encode/decode bytestream to/from little/big endian. */
+
static __inline uint16_t
be16dec(const void *pp)
{
@@ -174,4 +203,5 @@ le64enc(void *pp, uint64_t u)
le32enc(p, (uint32_t)(u & 0xffffffffU));
le32enc(p + 4, (uint32_t)(u >> 32));
}
+
#endif /* _SYS_ENDIAN_H_ */
diff --git a/newlib/libc/include/math.h b/newlib/libc/include/math.h
index 54e30ef82..dabde9a7d 100644
--- a/newlib/libc/include/math.h
+++ b/newlib/libc/include/math.h
@@ -445,7 +445,8 @@ extern float hypotf (float, float);
simply call the double functions. On Cygwin the long double functions
are implemented independently from newlib to be able to use optimized
assembler functions despite using the Microsoft x86_64 ABI. */
-#if defined (_LDBL_EQ_DBL) || defined (__CYGWIN__)
+#if defined (_LDBL_EQ_DBL) || defined (__CYGWIN__) || \
+ defined(__aarch64__) || defined(__i386__) || defined(__x86_64__)
/* Reentrant ANSI C functions. */
#ifndef __math_68881
extern long double atanl (long double);
diff --git a/newlib/libc/machine/aarch64/machine/_fpmath.h b/newlib/libc/machine/aarch64/machine/_fpmath.h
index 71d0a7152..fa62ae81c 100644
--- a/newlib/libc/machine/aarch64/machine/_fpmath.h
+++ b/newlib/libc/machine/aarch64/machine/_fpmath.h
@@ -27,19 +27,25 @@
* $FreeBSD$
*/
+/*
+ * Change unsigned int/long used by FreeBSD to fixed width types because
+ * ilp32 has a different size for unsigned long. --joel (20 Aug 2022)
+ */
+#include <stdint.h>
+
union IEEEl2bits {
long double e;
struct {
- unsigned long manl :64;
- unsigned long manh :48;
- unsigned int exp :15;
- unsigned int sign :1;
+ uint64_t manl :64;
+ uint64_t manh :48;
+ uint32_t exp :15;
+ uint32_t sign :1;
} bits;
/* TODO andrew: Check the packing here */
struct {
- unsigned long manl :64;
- unsigned long manh :48;
- unsigned int expsign :16;
+ uint64_t manl :64;
+ uint64_t manh :48;
+ uint32_t expsign :16;
} xbits;
};
diff --git a/newlib/libm/Makefile.inc b/newlib/libm/Makefile.inc
index 9d1469555..075693a73 100644
--- a/newlib/libm/Makefile.inc
+++ b/newlib/libm/Makefile.inc
@@ -44,12 +44,18 @@ else
include %D%/math/Makefile.inc
endif
include %D%/common/Makefile.inc
+
+if HAVE_FPMATH_H
+include %D%/ld/Makefile.inc
+endif # HAVE_FPMATH_H
+
include %D%/complex/Makefile.inc
include %D%/fenv/Makefile.inc
include %D%/test/Makefile.inc
if HAVE_LIBM_MACHINE_AARCH64
include %D%/machine/aarch64/Makefile.inc
+include %D%/ld128/Makefile.inc
endif
if HAVE_LIBM_MACHINE_AMDGCN
include %D%/machine/amdgcn/Makefile.inc
@@ -59,6 +65,7 @@ include %D%/machine/arm/Makefile.inc
endif
if HAVE_LIBM_MACHINE_I386
include %D%/machine/i386/Makefile.inc
+include %D%/ld80/Makefile.inc
endif
if HAVE_LIBM_MACHINE_MIPS
include %D%/machine/mips/Makefile.inc
@@ -83,6 +90,7 @@ include %D%/machine/riscv/Makefile.inc
endif
if HAVE_LIBM_MACHINE_X86_64
include %D%/machine/x86_64/Makefile.inc
+include %D%/ld80/Makefile.inc
endif
CLEANFILES += \
diff --git a/newlib/libm/ld/Makefile.inc b/newlib/libm/ld/Makefile.inc
new file mode 100644
index 000000000..891a89cc5
--- /dev/null
+++ b/newlib/libm/ld/Makefile.inc
@@ -0,0 +1,56 @@
+%C%_lsrc = \
+ %D%/e_acoshl.c \
+ %D%/e_acosl.c \
+ %D%/e_asinl.c \
+ %D%/e_atan2l.c \
+ %D%/e_atanhl.c \
+ %D%/e_coshl.c \
+ %D%/e_fmodl.c \
+ %D%/e_lgammal.c \
+ %D%/e_remainderl.c \
+ %D%/e_sinhl.c \
+ %D%/s_asinhl.c \
+ %D%/s_atanl.c \
+ %D%/s_cbrtl.c \
+ %D%/s_ceill.c \
+ %D%/s_copysignl.c \
+ %D%/s_cosl.c \
+ %D%/s_fabsl.c \
+ %D%/fdiml.c \
+ %D%/s_floorl.c \
+ %D%/s_fmal.c \
+ %D%/s_fmaxl.c \
+ %D%/s_fminl.c \
+ %D%/s_frexpl.c \
+ %D%/s_ilogbl.c \
+ %D%/s_llrintl.c \
+ %D%/s_llroundl.c \
+ %D%/s_logbl.c \
+ %D%/s_lrint.c \
+ %D%/s_lrintl.c \
+ %D%/s_lround.c \
+ %D%/s_lroundl.c \
+ %D%/s_modfl.c \
+ %D%/s_nearbyintl.c \
+ %D%/s_nextafterl.c \
+ %D%/s_nexttoward.c \
+ %D%/s_nexttowardf.c \
+ %D%/s_remquol.c \
+ %D%/s_rintl.c \
+ %D%/s_roundl.c \
+ %D%/scalblnl.c \
+ %D%/s_scalbnl.c \
+ %D%/s_sinl.c \
+ %D%/s_tanhl.c \
+ %D%/s_tanl.c \
+ %D%/s_truncl.c
+
+libm_a_CFLAGS_%C% = -fbuiltin -fno-math-errno
+
+if HAVE_LONG_DOUBLE
+libm_a_SOURCES += $(%C%_lsrc)
+endif # HAVE_LONG_DOUBLE
+
+LIBM_CHEWOUT_FILES +=
+
+LIBM_CHAPTERS +=
diff --git a/newlib/libm/ld/e_lgammal.c b/newlib/libm/ld/e_lgammal.c
index ebc2fc78c..0e6a0c39b 100644
--- a/newlib/libm/ld/e_lgammal.c
+++ b/newlib/libm/ld/e_lgammal.c
@@ -16,6 +16,8 @@ __FBSDID("$FreeBSD$");
#include "math.h"
#include "math_private.h"
+long double lgammal_r(long double x, int *signp);
+
extern int signgam;
long double
diff --git a/newlib/libm/ld/s_fdim.c b/newlib/libm/ld/fdiml.c
similarity index 93%
rename from newlib/libm/ld/s_fdim.c
rename to newlib/libm/ld/fdiml.c
index c40c3e9d3..dfdb4e63d 100644
--- a/newlib/libm/ld/s_fdim.c
+++ b/newlib/libm/ld/fdiml.c
@@ -43,6 +43,13 @@ fn(type x, type y) \
return (x > y ? x - y : 0.0); \
}
+/*
+ * fdim and fdimf are defined elsewhere in
+ * newlib. Ignore the freebsd versions and only compile
+ * fdiml.
+ */
+#if 0
DECL(double, fdim)
DECL(float, fdimf)
+#endif
DECL(long double, fdiml)
diff --git a/newlib/libm/ld/fpmath.h b/newlib/libm/ld/fpmath.h
index ce935eb40..517960b10 100644
--- a/newlib/libm/ld/fpmath.h
+++ b/newlib/libm/ld/fpmath.h
@@ -32,8 +32,8 @@
#ifndef _FPMATH_H_
#define _FPMATH_H_
-#include <sys/endian.h>
-#include "_fpmath.h"
+#include <endian.h>
+#include "machine/_fpmath.h" /* changed to machine for newlib */
#ifndef _IEEE_WORD_ORDER
#define _IEEE_WORD_ORDER _BYTE_ORDER
diff --git a/newlib/libm/ld/invtrig.h b/newlib/libm/ld/invtrig.h
new file mode 100644
index 000000000..028807f86
--- /dev/null
+++ b/newlib/libm/ld/invtrig.h
@@ -0,0 +1,34 @@
+/*
+ * COPYRIGHT (c) 1989-1999.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#if LDBL_MANT_DIG == 64
+#include "../ld80/invtrig.h"
+#elif LDBL_MANT_DIG == 113
+#include "../ld128/invtrig.h"
+#else
+#error "Unsupported long double format"
+#endif
+
diff --git a/newlib/libm/ld/k_expl.h b/newlib/libm/ld/k_expl.h
new file mode 100644
index 000000000..721a91280
--- /dev/null
+++ b/newlib/libm/ld/k_expl.h
@@ -0,0 +1,33 @@
+/*
+ * COPYRIGHT (c) 1989-1999.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#if LDBL_MANT_DIG == 64
+#include "../ld80/k_expl.h"
+#elif LDBL_MANT_DIG == 113
+#include "../ld128/k_expl.h"
+#else
+#error "Unsupported long double format"
+#endif
diff --git a/newlib/libm/ld/math_private.h b/newlib/libm/ld/math_private.h
index df526e71e..28c4d1304 100644
--- a/newlib/libm/ld/math_private.h
+++ b/newlib/libm/ld/math_private.h
@@ -20,6 +20,23 @@
#include <sys/types.h>
#include <machine/endian.h>
+/*
+ * __double_t and __float_t are defined elsewhere in
+ * freebsd and used to define double_t and float_t.
+ * Newlib has already went through the process of
+ * defining double_t and float_t so we should be able
+ * to use them to define __double_t and __float_t for
+ * this file.
+ */
+typedef double_t __double_t;
+typedef float_t __float_t;
+
+/*
+ * Necessary to disable Protection Enabled specific
+ * Free-bsd source.
+ */
+#define NO_FPSETPREC
+
/*
* The original fdlibm code used statements like:
* n0 = ((*(int*)&one)>>29)^1; * index of high word *
@@ -644,7 +661,7 @@ rnintl(long double x)
* return type provided their arg is a floating point integer. They can
* sometimes be more efficient because no rounding is required.
*/
-#if defined(amd64) || defined(__i386__)
+#if defined(amd64) || (defined(__i386__) && (!defined _SOFT_FLOAT))
#define irint(x) \
(sizeof(x) == sizeof(float) && \
sizeof(__float_t) == sizeof(long double) ? irintf(x) : \
@@ -677,7 +694,7 @@ irintd(double x)
}
#endif
-#if defined(__amd64__) || defined(__i386__)
+#if defined(__amd64__) || (defined(__i386__) && (!defined _SOFT_FLOAT))
static __inline int
irintl(long double x)
{
diff --git a/newlib/libm/ld/s_ilogbl.c b/newlib/libm/ld/s_ilogbl.c
index 3211f4409..37e6f7ba6 100644
--- a/newlib/libm/ld/s_ilogbl.c
+++ b/newlib/libm/ld/s_ilogbl.c
@@ -23,7 +23,7 @@ int
ilogbl(long double x)
{
union IEEEl2bits u;
- unsigned long m;
+ uint64_t m;
int b;
u.e = x;
@@ -32,11 +32,11 @@ ilogbl(long double x)
return (FP_ILOGB0);
/* denormalized */
if (u.bits.manh == 0) {
- m = 1lu << (LDBL_MANL_SIZE - 1);
+ m = 1llu << (LDBL_MANL_SIZE - 1);
for (b = LDBL_MANH_SIZE; !(u.bits.manl & m); m >>= 1)
b++;
} else {
- m = 1lu << (LDBL_MANH_SIZE - 1);
+ m = 1llu << (LDBL_MANH_SIZE - 1);
for (b = 0; !(u.bits.manh & m); m >>= 1)
b++;
}
diff --git a/newlib/libm/ld/s_logbl.c b/newlib/libm/ld/s_logbl.c
index ee1a91fd8..90ce6ec04 100644
--- a/newlib/libm/ld/s_logbl.c
+++ b/newlib/libm/ld/s_logbl.c
@@ -23,7 +23,7 @@ long double
logbl(long double x)
{
union IEEEl2bits u;
- unsigned long m;
+ uint64_t m;
int b;
u.e = x;
@@ -34,11 +34,11 @@ logbl(long double x)
}
/* denormalized */
if (u.bits.manh == 0) {
- m = 1lu << (LDBL_MANL_SIZE - 1);
+ m = 1llu << (LDBL_MANL_SIZE - 1);
for (b = LDBL_MANH_SIZE; !(u.bits.manl & m); m >>= 1)
b++;
} else {
- m = 1lu << (LDBL_MANH_SIZE - 1);
+ m = 1llu << (LDBL_MANH_SIZE - 1);
for (b = 0; !(u.bits.manh & m); m >>= 1)
b++;
}
diff --git a/newlib/libm/ld/s_lround.c b/newlib/libm/ld/s_lround.c
index 1dd8e697f..f67f9fbeb 100644
--- a/newlib/libm/ld/s_lround.c
+++ b/newlib/libm/ld/s_lround.c
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-#include <sys/limits.h>
+#include <limits.h>
#include <fenv.h>
#include <math.h>
diff --git a/newlib/libm/ld/s_nearbyint.c b/newlib/libm/ld/s_nearbyintl.c
similarity index 94%
rename from newlib/libm/ld/s_nearbyint.c
rename to newlib/libm/ld/s_nearbyintl.c
index 796dbaf98..9befed4df 100644
--- a/newlib/libm/ld/s_nearbyint.c
+++ b/newlib/libm/ld/s_nearbyintl.c
@@ -56,6 +56,13 @@ fn(type x) \
return (ret); \
}
+/*
+ * nearbyint and nearbyintf are defined elsewhere in
+ * newlib. Ignore the freebsd versions and only compile
+ * nearbyintl.
+ */
+#if 0
DECL(double, nearbyint, rint)
DECL(float, nearbyintf, rintf)
+#endif
DECL(long double, nearbyintl, rintl)
diff --git a/newlib/libm/ld/s_scalbln.c b/newlib/libm/ld/scalblnl.c
similarity index 93%
rename from newlib/libm/ld/s_scalbln.c
rename to newlib/libm/ld/scalblnl.c
index c27420c92..b0a0fc323 100644
--- a/newlib/libm/ld/s_scalbln.c
+++ b/newlib/libm/ld/scalblnl.c
@@ -34,6 +34,12 @@ __FBSDID("$FreeBSD$");
#define NMAX 65536
#define NMIN -65536
+/*
+ * scalbln and scalblnf are defined elsewhere in
+ * newlib. Ignore the freebsd versions and only compile
+ * scalblnl.
+ */
+#if 0
double
scalbln(double x, long n)
{
@@ -47,6 +53,7 @@ scalblnf(float x, long n)
return (scalbnf(x, (n > NMAX) ? NMAX : (n < NMIN) ? NMIN : (int)n));
}
+#endif
long double
scalblnl(long double x, long n)
diff --git a/newlib/libm/ld128/Makefile.inc b/newlib/libm/ld128/Makefile.inc
new file mode 100644
index 000000000..43706c4e9
--- /dev/null
+++ b/newlib/libm/ld128/Makefile.inc
@@ -0,0 +1,14 @@
+%C%_lsrc = \
+ %D%/e_powl.c %D%/s_erfl.c %D%/s_exp2l.c %D%/s_expl.c \
+ %D%/s_logl.c %D%/b_tgammal.c %D%/invtrig.c \
+ %D%/e_lgammal_r.c %D%/k_cosl.c %D%/k_sinl.c
+
+libm_a_CFLAGS_%C% = -fbuiltin -fno-math-errno
+
+if HAVE_LONG_DOUBLE
+libm_a_SOURCES += $(%C%_lsrc)
+endif # HAVE_LONG_DOUBLE
+
+LIBM_CHEWOUT_FILES +=
+
+LIBM_CHAPTERS +=
diff --git a/newlib/libm/ld128/e_lgammal_r.c b/newlib/libm/ld128/e_lgammal_r.c
index 53d3af17d..37e041aba 100644
--- a/newlib/libm/ld128/e_lgammal_r.c
+++ b/newlib/libm/ld128/e_lgammal_r.c
@@ -19,9 +19,9 @@ __FBSDID("$FreeBSD$");
* Converted to long double by Steven G. Kargl.
*/
-#include "fpmath.h"
+#include "../ld/fpmath.h"
#include "math.h"
-#include "math_private.h"
+#include "../ld/math_private.h"
static const volatile double vzero = 0;
diff --git a/newlib/libm/ld128/e_powl.c b/newlib/libm/ld128/e_powl.c
index 12b92a1a9..ea68f87ba 100644
--- a/newlib/libm/ld128/e_powl.c
+++ b/newlib/libm/ld128/e_powl.c
@@ -65,7 +65,7 @@ __FBSDID("$FreeBSD$");
#include <float.h>
#include <math.h>
-#include "math_private.h"
+#include "../ld/math_private.h"
static const long double bp[] = {
1.0L,
diff --git a/newlib/libm/ld128/e_rem_pio2l.h b/newlib/libm/ld128/e_rem_pio2l.h
index 7516ced49..be1410283 100644
--- a/newlib/libm/ld128/e_rem_pio2l.h
+++ b/newlib/libm/ld128/e_rem_pio2l.h
@@ -25,7 +25,7 @@ __FBSDID("$FreeBSD$");
#include <float.h>
#include "math.h"
-#include "math_private.h"
+#include "../ld/math_private.h"
#include "../ld/fpmath.h"
#define BIAS (LDBL_MAX_EXP - 1)
diff --git a/newlib/libm/ld128/invtrig.h b/newlib/libm/ld128/invtrig.h
index 423b56847..eaa801d43 100644
--- a/newlib/libm/ld128/invtrig.h
+++ b/newlib/libm/ld128/invtrig.h
@@ -30,7 +30,7 @@
#include <float.h>
-#include "fpmath.h"
+#include "../ld/fpmath.h"
#define BIAS (LDBL_MAX_EXP - 1)
#define MANH_SIZE (LDBL_MANH_SIZE + 1)
diff --git a/newlib/libm/ld128/k_cosl.c b/newlib/libm/ld128/k_cosl.c
index 422357bf8..897180f1c 100644
--- a/newlib/libm/ld128/k_cosl.c
+++ b/newlib/libm/ld128/k_cosl.c
@@ -17,8 +17,8 @@ __FBSDID("$FreeBSD$");
/*
* ld128 version of k_cos.c. See ../src/k_cos.c for most comments.
*/
-
-#include "math_private.h"
+#include <math.h>
+#include "../ld/math_private.h"
/*
* Domain [-0.7854, 0.7854], range ~[-1.17e-39, 1.19e-39]:
diff --git a/newlib/libm/ld128/k_sinl.c b/newlib/libm/ld128/k_sinl.c
index 09472d65f..a4a4d183f 100644
--- a/newlib/libm/ld128/k_sinl.c
+++ b/newlib/libm/ld128/k_sinl.c
@@ -17,8 +17,8 @@ __FBSDID("$FreeBSD$");
/*
* ld128 version of k_sin.c. See ../src/k_sin.c for most comments.
*/
-
-#include "math_private.h"
+#include <math.h>
+#include "../ld/math_private.h"
static const double
half = 0.5;
diff --git a/newlib/libm/ld128/s_erfl.c b/newlib/libm/ld128/s_erfl.c
index e29c9691f..d9b17b59f 100644
--- a/newlib/libm/ld128/s_erfl.c
+++ b/newlib/libm/ld128/s_erfl.c
@@ -20,9 +20,9 @@ __FBSDID("$FreeBSD$");
*/
#include <float.h>
-#include "fpmath.h"
+#include "../ld/fpmath.h"
#include "math.h"
-#include "math_private.h"
+#include "../ld/math_private.h"
/* XXX Prevent compilers from erroneously constant folding these: */
static const volatile long double tiny = 0x1p-10000L;
diff --git a/newlib/libm/ld128/s_exp2l.c b/newlib/libm/ld128/s_exp2l.c
index ee3d2c782..da0d5f9e0 100644
--- a/newlib/libm/ld128/s_exp2l.c
+++ b/newlib/libm/ld128/s_exp2l.c
@@ -32,7 +32,7 @@ __FBSDID("$FreeBSD$");
#include <float.h>
#include <stdint.h>
-#include "fpmath.h"
+#include "../ld/fpmath.h"
#include "math.h"
#define TBLBITS 7
diff --git a/newlib/libm/ld128/s_expl.c b/newlib/libm/ld128/s_expl.c
index 5b786af49..29fcda350 100644
--- a/newlib/libm/ld128/s_expl.c
+++ b/newlib/libm/ld128/s_expl.c
@@ -37,9 +37,9 @@ __FBSDID("$FreeBSD$");
#include <float.h>
-#include "fpmath.h"
+#include "../ld/fpmath.h"
#include "math.h"
-#include "math_private.h"
+#include "../ld/math_private.h"
#include "k_expl.h"
/* XXX Prevent compilers from erroneously constant folding these: */
diff --git a/newlib/libm/ld128/s_logl.c b/newlib/libm/ld128/s_logl.c
index 4774a271e..3b00d47ad 100644
--- a/newlib/libm/ld128/s_logl.c
+++ b/newlib/libm/ld128/s_logl.c
@@ -81,12 +81,12 @@ __FBSDID("$FreeBSD$");
#include <fenv.h>
#endif
-#include "fpmath.h"
+#include "../ld/fpmath.h"
#include "math.h"
#ifndef NO_STRUCT_RETURN
#define STRUCT_RETURN
#endif
-#include "math_private.h"
+#include "../ld/math_private.h"
#if !defined(NO_UTAB) && !defined(NO_UTABL)
#define USE_UTAB
diff --git a/newlib/libm/ld80/Makefile.inc b/newlib/libm/ld80/Makefile.inc
new file mode 100644
index 000000000..e87d00316
--- /dev/null
+++ b/newlib/libm/ld80/Makefile.inc
@@ -0,0 +1,15 @@
+%C%_lsrc = \
+ %D%/b_tgammal.c %D%/e_powl.c %D%/s_erfl.c %D%/s_exp2l.c \
+ %D%/s_expl.c %D%/s_logl.c %D%/s_sinpil.c %D%/s_cospil.c \
+ %D%/invtrig.c %D%/e_lgammal_r.c %D%/k_cosl.c %D%/k_sinl.c
+
+
+libm_a_CFLAGS_%C% = -fbuiltin -fno-math-errno
+
+if HAVE_LONG_DOUBLE
+libm_a_SOURCES += $(%C%_lsrc)
+endif # HAVE_LONG_DOUBLE
+
+LIBM_CHEWOUT_FILES +=
+
+LIBM_CHAPTERS +=
diff --git a/newlib/libm/ld80/b_expl.c b/newlib/libm/ld80/b_expl.c
index 21bacf449..502fb4720 100644
--- a/newlib/libm/ld80/b_expl.c
+++ b/newlib/libm/ld80/b_expl.c
@@ -35,8 +35,8 @@
* bsdrc/b_exp.c converted to long double by Steven G. Kargl.
*/
-#include "fpmath.h"
-#include "math_private.h"
+#include "../ld/fpmath.h"
+#include "../ld/math_private.h"
static const union IEEEl2bits
p0u = LD80C(0xaaaaaaaaaaaaaaab, -3, 1.66666666666666666671e-01L),
diff --git a/newlib/libm/ld80/b_tgammal.c b/newlib/libm/ld80/b_tgammal.c
index 121248adb..e36557bcf 100644
--- a/newlib/libm/ld80/b_tgammal.c
+++ b/newlib/libm/ld80/b_tgammal.c
@@ -55,9 +55,12 @@
#include <ieeefp.h>
#endif
-#include "fpmath.h"
+#include "../ld/fpmath.h"
#include "math.h"
-#include "math_private.h"
+#include "../ld/math_private.h"
+
+long double sinpil(long double x);
+long double cospil(long double x);
/* Used in b_log.c and below. */
struct Double {
diff --git a/newlib/libm/ld80/e_lgammal_r.c b/newlib/libm/ld80/e_lgammal_r.c
index f56758b18..4fcaa7445 100644
--- a/newlib/libm/ld80/e_lgammal_r.c
+++ b/newlib/libm/ld80/e_lgammal_r.c
@@ -23,9 +23,9 @@ __FBSDID("$FreeBSD$");
#include <ieeefp.h>
#endif
-#include "fpmath.h"
+#include "../ld/fpmath.h"
#include "math.h"
-#include "math_private.h"
+#include "../ld/math_private.h"
static const volatile double vzero = 0;
diff --git a/newlib/libm/ld80/e_powl.c b/newlib/libm/ld80/e_powl.c
index ea25354c2..6c11c73d0 100644
--- a/newlib/libm/ld80/e_powl.c
+++ b/newlib/libm/ld80/e_powl.c
@@ -19,7 +19,7 @@ __FBSDID("$FreeBSD$");
#include <math.h>
-#include "math_private.h"
+#include "../ld/math_private.h"
/*
* Polynomial evaluator:
@@ -122,7 +122,7 @@ __FBSDID("$FreeBSD$");
#include <float.h>
#include <math.h>
-#include "math_private.h"
+#include "../ld/math_private.h"
/* Table size */
#define NXT 32
diff --git a/newlib/libm/ld80/e_rem_pio2l.h b/newlib/libm/ld80/e_rem_pio2l.h
index b7ef5d983..00b0eb74d 100644
--- a/newlib/libm/ld80/e_rem_pio2l.h
+++ b/newlib/libm/ld80/e_rem_pio2l.h
@@ -25,7 +25,7 @@ __FBSDID("$FreeBSD$");
#include <float.h>
#include "math.h"
-#include "math_private.h"
+#include "../ld/math_private.h"
#include "../ld/fpmath.h"
#define BIAS (LDBL_MAX_EXP - 1)
diff --git a/newlib/libm/ld80/invtrig.h b/newlib/libm/ld80/invtrig.h
index be06a044b..4a2469ed6 100644
--- a/newlib/libm/ld80/invtrig.h
+++ b/newlib/libm/ld80/invtrig.h
@@ -30,7 +30,7 @@
#include <float.h>
-#include "fpmath.h"
+#include "../ld/fpmath.h"
#define BIAS (LDBL_MAX_EXP - 1)
#define MANH_SIZE LDBL_MANH_SIZE
diff --git a/newlib/libm/ld80/k_cosl.c b/newlib/libm/ld80/k_cosl.c
index 6dde6adad..9430d5a1c 100644
--- a/newlib/libm/ld80/k_cosl.c
+++ b/newlib/libm/ld80/k_cosl.c
@@ -17,8 +17,8 @@ __FBSDID("$FreeBSD$");
/*
* ld80 version of k_cos.c. See ../src/k_cos.c for most comments.
*/
-
-#include "math_private.h"
+#include <math.h>
+#include "../ld/math_private.h"
/*
* Domain [-0.7854, 0.7854], range ~[-2.43e-23, 2.425e-23]:
diff --git a/newlib/libm/ld80/k_sinl.c b/newlib/libm/ld80/k_sinl.c
index af5598dba..d88c89708 100644
--- a/newlib/libm/ld80/k_sinl.c
+++ b/newlib/libm/ld80/k_sinl.c
@@ -17,8 +17,8 @@ __FBSDID("$FreeBSD$");
/*
* ld80 version of k_sin.c. See ../src/k_sin.c for most comments.
*/
-
-#include "math_private.h"
+#include <math.h>
+#include "../ld/math_private.h"
static const double
half = 0.5;
diff --git a/newlib/libm/ld80/s_cospil.c b/newlib/libm/ld80/s_cospil.c
index 199479e9e..75ec27d0c 100644
--- a/newlib/libm/ld80/s_cospil.c
+++ b/newlib/libm/ld80/s_cospil.c
@@ -33,9 +33,9 @@
#endif
#include <stdint.h>
-#include "fpmath.h"
+#include "../ld/fpmath.h"
#include "math.h"
-#include "math_private.h"
+#include "../ld/math_private.h"
static const double
pi_hi = 3.1415926814079285e+00, /* 0x400921fb 0x58000000 */
diff --git a/newlib/libm/ld80/s_erfl.c b/newlib/libm/ld80/s_erfl.c
index 1ae2f9092..06fca5d28 100644
--- a/newlib/libm/ld80/s_erfl.c
+++ b/newlib/libm/ld80/s_erfl.c
@@ -23,9 +23,9 @@ __FBSDID("$FreeBSD$");
#include <ieeefp.h>
#endif
-#include "fpmath.h"
+#include "../ld/fpmath.h"
#include "math.h"
-#include "math_private.h"
+#include "../ld/math_private.h"
/* XXX Prevent compilers from erroneously constant folding: */
static const volatile long double tiny = 0x1p-10000L;
diff --git a/newlib/libm/ld80/s_exp2l.c b/newlib/libm/ld80/s_exp2l.c
index 421d6e2e0..552956b8b 100644
--- a/newlib/libm/ld80/s_exp2l.c
+++ b/newlib/libm/ld80/s_exp2l.c
@@ -36,9 +36,9 @@ __FBSDID("$FreeBSD$");
#include <ieeefp.h>
#endif
-#include "fpmath.h"
+#include "../ld/fpmath.h"
#include "math.h"
-#include "math_private.h"
+#include "../ld/math_private.h"
#define TBLBITS 7
#define TBLSIZE (1 << TBLBITS)
diff --git a/newlib/libm/ld80/s_expl.c b/newlib/libm/ld80/s_expl.c
index e46e73f0c..81469e00f 100644
--- a/newlib/libm/ld80/s_expl.c
+++ b/newlib/libm/ld80/s_expl.c
@@ -47,9 +47,9 @@ __FBSDID("$FreeBSD$");
#include <ieeefp.h>
#endif
-#include "fpmath.h"
+#include "../ld/fpmath.h"
#include "math.h"
-#include "math_private.h"
+#include "../ld/math_private.h"
#include "k_expl.h"
/* XXX Prevent compilers from erroneously constant folding these: */
diff --git a/newlib/libm/ld80/s_logl.c b/newlib/libm/ld80/s_logl.c
index c74519caf..01e541b49 100644
--- a/newlib/libm/ld80/s_logl.c
+++ b/newlib/libm/ld80/s_logl.c
@@ -85,13 +85,13 @@ __FBSDID("$FreeBSD$");
#include <ieeefp.h>
#endif
-#include "fpmath.h"
+#include "../ld/fpmath.h"
#include "math.h"
#define i386_SSE_GOOD
#ifndef NO_STRUCT_RETURN
#define STRUCT_RETURN
#endif
-#include "math_private.h"
+#include "../ld/math_private.h"
#if !defined(NO_UTAB) && !defined(NO_UTABL)
#define USE_UTAB
diff --git a/newlib/libm/ld80/s_sinpil.c b/newlib/libm/ld80/s_sinpil.c
index 4cefa9235..671a6a007 100644
--- a/newlib/libm/ld80/s_sinpil.c
+++ b/newlib/libm/ld80/s_sinpil.c
@@ -33,9 +33,9 @@
#endif
#include <stdint.h>
-#include "fpmath.h"
+#include "../ld/fpmath.h"
#include "math.h"
-#include "math_private.h"
+#include "../ld/math_private.h"
static const union IEEEl2bits
pi_hi_u = LD80C(0xc90fdaa200000000, 1, 3.14159265346825122833e+00L),
--
2.31.1
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v2 3/3] Regenerated source for adding non LDBL_EQ_DBL
2023-04-20 21:23 [PATCH v2 0/3] Add math support for non LDBL_EQ_DBL architecture Jennifer Averett
2023-04-20 21:23 ` [PATCH v2 1/3] newlib: Add FreeBSD files for non LDBL_EQ_DBL support Jennifer Averett
2023-04-20 21:23 ` [PATCH v2 2/3] newlib: Add non LDBL_EQ_DBL math support for aarch64, i386, and x86_64 Jennifer Averett
@ 2023-04-20 21:23 ` Jennifer Averett
2 siblings, 0 replies; 9+ messages in thread
From: Jennifer Averett @ 2023-04-20 21:23 UTC (permalink / raw)
To: newlib; +Cc: Jennifer Averett
---
newlib/Makefile.in | 1463 ++++++++++++++++++++++++++++++++++++++++++--
newlib/configure | 16 +
newlib/newlib.hin | 12 +
3 files changed, 1426 insertions(+), 65 deletions(-)
diff --git a/newlib/Makefile.in b/newlib/Makefile.in
index b1685772d..2f1e26877 100644
--- a/newlib/Makefile.in
+++ b/newlib/Makefile.in
@@ -910,20 +910,32 @@ check_PROGRAMS =
@NEWLIB_HW_FP_FALSE@am__append_136 = libm/math/math.tex
@HAVE_LONG_DOUBLE_TRUE@am__append_137 = $(libm_common_lsrc)
-@HAVE_LIBM_MACHINE_AARCH64_TRUE@am__append_138 = $(libm_machine_aarch64_src)
-@HAVE_LIBM_MACHINE_AMDGCN_TRUE@am__append_139 = $(libm_machine_amdgcn_src)
-@HAVE_LIBM_MACHINE_ARM_TRUE@am__append_140 = $(libm_machine_arm_src)
-@HAVE_LIBM_MACHINE_I386_TRUE@am__append_141 = $(libm_machine_i386_src)
-@HAVE_LIBM_MACHINE_MIPS_TRUE@am__append_142 = $(libm_machine_mips_src)
-@HAS_NDS32_FPU_SP_TRUE@@HAVE_LIBM_MACHINE_NDS32_TRUE@am__append_143 = libm/machine/nds32/wf_sqrt.S
-@HAS_NDS32_FPU_DP_TRUE@@HAVE_LIBM_MACHINE_NDS32_TRUE@am__append_144 = libm/machine/nds32/w_sqrt.S
-@HAVE_LIBM_MACHINE_NDS32_TRUE@am__append_145 = $(libm_machine_nds32_src)
-@HAVE_LIBM_MACHINE_POWERPC_TRUE@am__append_146 = $(libm_machine_powerpc_src)
-@HAVE_LIBM_MACHINE_PRU_TRUE@am__append_147 = $(libm_machine_pru_src)
-@HAVE_LIBM_MACHINE_SPARC_TRUE@am__append_148 = $(libm_machine_sparc_src)
-@HAVE_LIBM_MACHINE_SPU_TRUE@am__append_149 = $(libm_machine_spu_src)
-@HAVE_LIBM_MACHINE_RISCV_TRUE@am__append_150 = $(libm_machine_riscv_src)
-@HAVE_LIBM_MACHINE_X86_64_TRUE@am__append_151 = $(libm_machine_x86_64_src)
+@HAVE_FPMATH_H_TRUE@@HAVE_LONG_DOUBLE_TRUE@am__append_138 = $(libm_ld_lsrc)
+@HAVE_FPMATH_H_TRUE@am__append_139 =
+@HAVE_FPMATH_H_TRUE@am__append_140 =
+@HAVE_LIBM_MACHINE_AARCH64_TRUE@am__append_141 = $(libm_machine_aarch64_src)
+@HAVE_LIBM_MACHINE_AARCH64_TRUE@@HAVE_LONG_DOUBLE_TRUE@am__append_142 = $(libm_ld128_lsrc)
+@HAVE_LIBM_MACHINE_AARCH64_TRUE@am__append_143 =
+@HAVE_LIBM_MACHINE_AARCH64_TRUE@am__append_144 =
+@HAVE_LIBM_MACHINE_AMDGCN_TRUE@am__append_145 = $(libm_machine_amdgcn_src)
+@HAVE_LIBM_MACHINE_ARM_TRUE@am__append_146 = $(libm_machine_arm_src)
+@HAVE_LIBM_MACHINE_I386_TRUE@am__append_147 = $(libm_machine_i386_src)
+@HAVE_LIBM_MACHINE_I386_TRUE@@HAVE_LONG_DOUBLE_TRUE@am__append_148 = $(libm_ld80_lsrc)
+@HAVE_LIBM_MACHINE_I386_TRUE@am__append_149 =
+@HAVE_LIBM_MACHINE_I386_TRUE@am__append_150 =
+@HAVE_LIBM_MACHINE_MIPS_TRUE@am__append_151 = $(libm_machine_mips_src)
+@HAS_NDS32_FPU_SP_TRUE@@HAVE_LIBM_MACHINE_NDS32_TRUE@am__append_152 = libm/machine/nds32/wf_sqrt.S
+@HAS_NDS32_FPU_DP_TRUE@@HAVE_LIBM_MACHINE_NDS32_TRUE@am__append_153 = libm/machine/nds32/w_sqrt.S
+@HAVE_LIBM_MACHINE_NDS32_TRUE@am__append_154 = $(libm_machine_nds32_src)
+@HAVE_LIBM_MACHINE_POWERPC_TRUE@am__append_155 = $(libm_machine_powerpc_src)
+@HAVE_LIBM_MACHINE_PRU_TRUE@am__append_156 = $(libm_machine_pru_src)
+@HAVE_LIBM_MACHINE_SPARC_TRUE@am__append_157 = $(libm_machine_sparc_src)
+@HAVE_LIBM_MACHINE_SPU_TRUE@am__append_158 = $(libm_machine_spu_src)
+@HAVE_LIBM_MACHINE_RISCV_TRUE@am__append_159 = $(libm_machine_riscv_src)
+@HAVE_LIBM_MACHINE_X86_64_TRUE@am__append_160 = $(libm_machine_x86_64_src)
+@HAVE_LIBM_MACHINE_X86_64_TRUE@@HAVE_LONG_DOUBLE_TRUE@am__append_161 = $(libm_ld80_lsrc)
+@HAVE_LIBM_MACHINE_X86_64_TRUE@am__append_162 =
+@HAVE_LIBM_MACHINE_X86_64_TRUE@am__append_163 =
subdir = .
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/../config/depstand.m4 \
@@ -2968,7 +2980,55 @@ am__objects_150 = libm/common/libm_a-atanl.$(OBJEXT) \
libm/common/libm_a-log2l.$(OBJEXT) \
libm/common/libm_a-sl_finite.$(OBJEXT)
@HAVE_LONG_DOUBLE_TRUE@am__objects_151 = $(am__objects_150)
-am__objects_152 = libm/complex/libm_a-cabs.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@am__objects_152 = \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-e_acoshl.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-e_acosl.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-e_asinl.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-e_atan2l.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-e_atanhl.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-e_coshl.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-e_fmodl.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-e_lgammal.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-e_remainderl.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-e_sinhl.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-s_asinhl.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-s_atanl.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-s_cbrtl.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-s_ceill.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-s_copysignl.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-s_cosl.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-s_fabsl.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-fdiml.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-s_floorl.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-s_fmal.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-s_fmaxl.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-s_fminl.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-s_frexpl.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-s_ilogbl.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-s_llrintl.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-s_llroundl.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-s_logbl.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-s_lrint.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-s_lrintl.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-s_lround.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-s_lroundl.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-s_modfl.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-s_nearbyintl.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-s_nextafterl.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-s_nexttoward.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-s_nexttowardf.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-s_remquol.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-s_rintl.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-s_roundl.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-scalblnl.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-s_scalbnl.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-s_sinl.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-s_tanhl.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-s_tanl.$(OBJEXT) \
+@HAVE_FPMATH_H_TRUE@ libm/ld/libm_a-s_truncl.$(OBJEXT)
+@HAVE_FPMATH_H_TRUE@@HAVE_LONG_DOUBLE_TRUE@am__objects_153 = \
+@HAVE_FPMATH_H_TRUE@@HAVE_LONG_DOUBLE_TRUE@ $(am__objects_152)
+am__objects_154 = libm/complex/libm_a-cabs.$(OBJEXT) \
libm/complex/libm_a-cacos.$(OBJEXT) \
libm/complex/libm_a-cacosh.$(OBJEXT) \
libm/complex/libm_a-carg.$(OBJEXT) \
@@ -2992,7 +3052,7 @@ am__objects_152 = libm/complex/libm_a-cabs.$(OBJEXT) \
libm/complex/libm_a-csqrt.$(OBJEXT) \
libm/complex/libm_a-ctan.$(OBJEXT) \
libm/complex/libm_a-ctanh.$(OBJEXT)
-am__objects_153 = libm/complex/libm_a-cabsf.$(OBJEXT) \
+am__objects_155 = libm/complex/libm_a-cabsf.$(OBJEXT) \
libm/complex/libm_a-casinf.$(OBJEXT) \
libm/complex/libm_a-ccosf.$(OBJEXT) \
libm/complex/libm_a-cimagf.$(OBJEXT) \
@@ -3016,7 +3076,7 @@ am__objects_153 = libm/complex/libm_a-cabsf.$(OBJEXT) \
libm/complex/libm_a-cexpf.$(OBJEXT) \
libm/complex/libm_a-cpowf.$(OBJEXT) \
libm/complex/libm_a-csinhf.$(OBJEXT)
-am__objects_154 = libm/complex/libm_a-cabsl.$(OBJEXT) \
+am__objects_156 = libm/complex/libm_a-cabsl.$(OBJEXT) \
libm/complex/libm_a-creall.$(OBJEXT) \
libm/complex/libm_a-cimagl.$(OBJEXT) \
libm/complex/libm_a-ccoshl.$(OBJEXT) \
@@ -3039,7 +3099,7 @@ am__objects_154 = libm/complex/libm_a-cabsl.$(OBJEXT) \
libm/complex/libm_a-csinhl.$(OBJEXT) \
libm/complex/libm_a-csinl.$(OBJEXT) \
libm/complex/libm_a-catanl.$(OBJEXT)
-am__objects_155 = libm/fenv/libm_a-feclearexcept.$(OBJEXT) \
+am__objects_157 = libm/fenv/libm_a-feclearexcept.$(OBJEXT) \
libm/fenv/libm_a-fe_dfl_env.$(OBJEXT) \
libm/fenv/libm_a-fegetenv.$(OBJEXT) \
libm/fenv/libm_a-fegetexceptflag.$(OBJEXT) \
@@ -3051,7 +3111,7 @@ am__objects_155 = libm/fenv/libm_a-feclearexcept.$(OBJEXT) \
libm/fenv/libm_a-fesetround.$(OBJEXT) \
libm/fenv/libm_a-fetestexcept.$(OBJEXT) \
libm/fenv/libm_a-feupdateenv.$(OBJEXT)
-@HAVE_LIBM_MACHINE_AARCH64_TRUE@am__objects_156 = libm/machine/aarch64/libm_a-e_sqrt.$(OBJEXT) \
+@HAVE_LIBM_MACHINE_AARCH64_TRUE@am__objects_158 = libm/machine/aarch64/libm_a-e_sqrt.$(OBJEXT) \
@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/machine/aarch64/libm_a-ef_sqrt.$(OBJEXT) \
@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/machine/aarch64/libm_a-s_ceil.$(OBJEXT) \
@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/machine/aarch64/libm_a-s_fabs.$(OBJEXT) \
@@ -3093,8 +3153,19 @@ am__objects_155 = libm/fenv/libm_a-feclearexcept.$(OBJEXT) \
@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/machine/aarch64/libm_a-fesetround.$(OBJEXT) \
@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/machine/aarch64/libm_a-fetestexcept.$(OBJEXT) \
@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/machine/aarch64/libm_a-feupdateenv.$(OBJEXT)
-@HAVE_LIBM_MACHINE_AARCH64_TRUE@am__objects_157 = $(am__objects_156)
-@HAVE_LIBM_MACHINE_AMDGCN_TRUE@am__objects_158 = libm/machine/amdgcn/libm_a-v64_mathcnst.$(OBJEXT) \
+@HAVE_LIBM_MACHINE_AARCH64_TRUE@am__objects_159 = $(am__objects_158)
+@HAVE_LIBM_MACHINE_AARCH64_TRUE@am__objects_160 = libm/ld128/libm_a-e_powl.$(OBJEXT) \
+@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/libm_a-s_erfl.$(OBJEXT) \
+@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/libm_a-s_exp2l.$(OBJEXT) \
+@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/libm_a-s_expl.$(OBJEXT) \
+@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/libm_a-s_logl.$(OBJEXT) \
+@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/libm_a-b_tgammal.$(OBJEXT) \
+@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/libm_a-invtrig.$(OBJEXT) \
+@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/libm_a-e_lgammal_r.$(OBJEXT) \
+@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/libm_a-k_cosl.$(OBJEXT) \
+@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/libm_a-k_sinl.$(OBJEXT)
+@HAVE_LIBM_MACHINE_AARCH64_TRUE@@HAVE_LONG_DOUBLE_TRUE@am__objects_161 = $(am__objects_160)
+@HAVE_LIBM_MACHINE_AMDGCN_TRUE@am__objects_162 = libm/machine/amdgcn/libm_a-v64_mathcnst.$(OBJEXT) \
@HAVE_LIBM_MACHINE_AMDGCN_TRUE@ libm/machine/amdgcn/libm_a-v64_reent.$(OBJEXT) \
@HAVE_LIBM_MACHINE_AMDGCN_TRUE@ libm/machine/amdgcn/libm_a-v64df_acos.$(OBJEXT) \
@HAVE_LIBM_MACHINE_AMDGCN_TRUE@ libm/machine/amdgcn/libm_a-v64df_acosh.$(OBJEXT) \
@@ -3182,8 +3253,8 @@ am__objects_155 = libm/fenv/libm_a-feclearexcept.$(OBJEXT) \
@HAVE_LIBM_MACHINE_AMDGCN_TRUE@ libm/machine/amdgcn/libm_a-v64sf_tan.$(OBJEXT) \
@HAVE_LIBM_MACHINE_AMDGCN_TRUE@ libm/machine/amdgcn/libm_a-v64sf_tanh.$(OBJEXT) \
@HAVE_LIBM_MACHINE_AMDGCN_TRUE@ libm/machine/amdgcn/libm_a-v64sf_tgamma.$(OBJEXT)
-@HAVE_LIBM_MACHINE_AMDGCN_TRUE@am__objects_159 = $(am__objects_158)
-@HAVE_LIBM_MACHINE_ARM_TRUE@am__objects_160 = libm/machine/arm/libm_a-e_sqrt.$(OBJEXT) \
+@HAVE_LIBM_MACHINE_AMDGCN_TRUE@am__objects_163 = $(am__objects_162)
+@HAVE_LIBM_MACHINE_ARM_TRUE@am__objects_164 = libm/machine/arm/libm_a-e_sqrt.$(OBJEXT) \
@HAVE_LIBM_MACHINE_ARM_TRUE@ libm/machine/arm/libm_a-ef_sqrt.$(OBJEXT) \
@HAVE_LIBM_MACHINE_ARM_TRUE@ libm/machine/arm/libm_a-s_ceil.$(OBJEXT) \
@HAVE_LIBM_MACHINE_ARM_TRUE@ libm/machine/arm/libm_a-s_floor.$(OBJEXT) \
@@ -3214,8 +3285,8 @@ am__objects_155 = libm/fenv/libm_a-feclearexcept.$(OBJEXT) \
@HAVE_LIBM_MACHINE_ARM_TRUE@ libm/machine/arm/libm_a-feupdateenv.$(OBJEXT) \
@HAVE_LIBM_MACHINE_ARM_TRUE@ libm/machine/arm/libm_a-feenableexcept.$(OBJEXT) \
@HAVE_LIBM_MACHINE_ARM_TRUE@ libm/machine/arm/libm_a-fedisableexcept.$(OBJEXT)
-@HAVE_LIBM_MACHINE_ARM_TRUE@am__objects_161 = $(am__objects_160)
-@HAVE_LIBM_MACHINE_I386_TRUE@am__objects_162 = libm/machine/i386/libm_a-f_atan2.$(OBJEXT) \
+@HAVE_LIBM_MACHINE_ARM_TRUE@am__objects_165 = $(am__objects_164)
+@HAVE_LIBM_MACHINE_I386_TRUE@am__objects_166 = libm/machine/i386/libm_a-f_atan2.$(OBJEXT) \
@HAVE_LIBM_MACHINE_I386_TRUE@ libm/machine/i386/libm_a-f_atan2f.$(OBJEXT) \
@HAVE_LIBM_MACHINE_I386_TRUE@ libm/machine/i386/libm_a-f_exp.$(OBJEXT) \
@HAVE_LIBM_MACHINE_I386_TRUE@ libm/machine/i386/libm_a-f_expf.$(OBJEXT) \
@@ -3252,8 +3323,33 @@ am__objects_155 = libm/fenv/libm_a-feclearexcept.$(OBJEXT) \
@HAVE_LIBM_MACHINE_I386_TRUE@ libm/machine/i386/libm_a-fesetround.$(OBJEXT) \
@HAVE_LIBM_MACHINE_I386_TRUE@ libm/machine/i386/libm_a-fetestexcept.$(OBJEXT) \
@HAVE_LIBM_MACHINE_I386_TRUE@ libm/machine/i386/libm_a-feupdateenv.$(OBJEXT)
-@HAVE_LIBM_MACHINE_I386_TRUE@am__objects_163 = $(am__objects_162)
-@HAVE_LIBM_MACHINE_MIPS_TRUE@am__objects_164 = libm/machine/mips/libm_a-feclearexcept.$(OBJEXT) \
+@HAVE_LIBM_MACHINE_I386_TRUE@am__objects_167 = $(am__objects_166)
+@HAVE_LIBM_MACHINE_I386_FALSE@@HAVE_LIBM_MACHINE_X86_64_TRUE@am__objects_168 = libm/ld80/libm_a-b_tgammal.$(OBJEXT) \
+@HAVE_LIBM_MACHINE_I386_FALSE@@HAVE_LIBM_MACHINE_X86_64_TRUE@ libm/ld80/libm_a-e_powl.$(OBJEXT) \
+@HAVE_LIBM_MACHINE_I386_FALSE@@HAVE_LIBM_MACHINE_X86_64_TRUE@ libm/ld80/libm_a-s_erfl.$(OBJEXT) \
+@HAVE_LIBM_MACHINE_I386_FALSE@@HAVE_LIBM_MACHINE_X86_64_TRUE@ libm/ld80/libm_a-s_exp2l.$(OBJEXT) \
+@HAVE_LIBM_MACHINE_I386_FALSE@@HAVE_LIBM_MACHINE_X86_64_TRUE@ libm/ld80/libm_a-s_expl.$(OBJEXT) \
+@HAVE_LIBM_MACHINE_I386_FALSE@@HAVE_LIBM_MACHINE_X86_64_TRUE@ libm/ld80/libm_a-s_logl.$(OBJEXT) \
+@HAVE_LIBM_MACHINE_I386_FALSE@@HAVE_LIBM_MACHINE_X86_64_TRUE@ libm/ld80/libm_a-s_sinpil.$(OBJEXT) \
+@HAVE_LIBM_MACHINE_I386_FALSE@@HAVE_LIBM_MACHINE_X86_64_TRUE@ libm/ld80/libm_a-s_cospil.$(OBJEXT) \
+@HAVE_LIBM_MACHINE_I386_FALSE@@HAVE_LIBM_MACHINE_X86_64_TRUE@ libm/ld80/libm_a-invtrig.$(OBJEXT) \
+@HAVE_LIBM_MACHINE_I386_FALSE@@HAVE_LIBM_MACHINE_X86_64_TRUE@ libm/ld80/libm_a-e_lgammal_r.$(OBJEXT) \
+@HAVE_LIBM_MACHINE_I386_FALSE@@HAVE_LIBM_MACHINE_X86_64_TRUE@ libm/ld80/libm_a-k_cosl.$(OBJEXT) \
+@HAVE_LIBM_MACHINE_I386_FALSE@@HAVE_LIBM_MACHINE_X86_64_TRUE@ libm/ld80/libm_a-k_sinl.$(OBJEXT)
+@HAVE_LIBM_MACHINE_I386_TRUE@am__objects_168 = libm/ld80/libm_a-b_tgammal.$(OBJEXT) \
+@HAVE_LIBM_MACHINE_I386_TRUE@ libm/ld80/libm_a-e_powl.$(OBJEXT) \
+@HAVE_LIBM_MACHINE_I386_TRUE@ libm/ld80/libm_a-s_erfl.$(OBJEXT) \
+@HAVE_LIBM_MACHINE_I386_TRUE@ libm/ld80/libm_a-s_exp2l.$(OBJEXT) \
+@HAVE_LIBM_MACHINE_I386_TRUE@ libm/ld80/libm_a-s_expl.$(OBJEXT) \
+@HAVE_LIBM_MACHINE_I386_TRUE@ libm/ld80/libm_a-s_logl.$(OBJEXT) \
+@HAVE_LIBM_MACHINE_I386_TRUE@ libm/ld80/libm_a-s_sinpil.$(OBJEXT) \
+@HAVE_LIBM_MACHINE_I386_TRUE@ libm/ld80/libm_a-s_cospil.$(OBJEXT) \
+@HAVE_LIBM_MACHINE_I386_TRUE@ libm/ld80/libm_a-invtrig.$(OBJEXT) \
+@HAVE_LIBM_MACHINE_I386_TRUE@ libm/ld80/libm_a-e_lgammal_r.$(OBJEXT) \
+@HAVE_LIBM_MACHINE_I386_TRUE@ libm/ld80/libm_a-k_cosl.$(OBJEXT) \
+@HAVE_LIBM_MACHINE_I386_TRUE@ libm/ld80/libm_a-k_sinl.$(OBJEXT)
+@HAVE_LIBM_MACHINE_I386_TRUE@@HAVE_LONG_DOUBLE_TRUE@am__objects_169 = $(am__objects_168)
+@HAVE_LIBM_MACHINE_MIPS_TRUE@am__objects_170 = libm/machine/mips/libm_a-feclearexcept.$(OBJEXT) \
@HAVE_LIBM_MACHINE_MIPS_TRUE@ libm/machine/mips/libm_a-fegetenv.$(OBJEXT) \
@HAVE_LIBM_MACHINE_MIPS_TRUE@ libm/machine/mips/libm_a-fegetexceptflag.$(OBJEXT) \
@HAVE_LIBM_MACHINE_MIPS_TRUE@ libm/machine/mips/libm_a-fegetround.$(OBJEXT) \
@@ -3265,13 +3361,13 @@ am__objects_155 = libm/fenv/libm_a-feclearexcept.$(OBJEXT) \
@HAVE_LIBM_MACHINE_MIPS_TRUE@ libm/machine/mips/libm_a-fetestexcept.$(OBJEXT) \
@HAVE_LIBM_MACHINE_MIPS_TRUE@ libm/machine/mips/libm_a-feupdateenv.$(OBJEXT) \
@HAVE_LIBM_MACHINE_MIPS_TRUE@ libm/machine/mips/libm_a-fenv.$(OBJEXT)
-@HAVE_LIBM_MACHINE_MIPS_TRUE@am__objects_165 = $(am__objects_164)
-@HAS_NDS32_FPU_SP_TRUE@@HAVE_LIBM_MACHINE_NDS32_TRUE@am__objects_166 = libm/machine/nds32/libm_a-wf_sqrt.$(OBJEXT)
-@HAS_NDS32_FPU_DP_TRUE@@HAVE_LIBM_MACHINE_NDS32_TRUE@am__objects_167 = libm/machine/nds32/libm_a-w_sqrt.$(OBJEXT)
-@HAVE_LIBM_MACHINE_NDS32_TRUE@am__objects_168 = $(am__objects_166) \
-@HAVE_LIBM_MACHINE_NDS32_TRUE@ $(am__objects_167)
-@HAVE_LIBM_MACHINE_NDS32_TRUE@am__objects_169 = $(am__objects_168)
-@HAVE_LIBM_MACHINE_POWERPC_TRUE@am__objects_170 = libm/machine/powerpc/libm_a-feclearexcept.$(OBJEXT) \
+@HAVE_LIBM_MACHINE_MIPS_TRUE@am__objects_171 = $(am__objects_170)
+@HAS_NDS32_FPU_SP_TRUE@@HAVE_LIBM_MACHINE_NDS32_TRUE@am__objects_172 = libm/machine/nds32/libm_a-wf_sqrt.$(OBJEXT)
+@HAS_NDS32_FPU_DP_TRUE@@HAVE_LIBM_MACHINE_NDS32_TRUE@am__objects_173 = libm/machine/nds32/libm_a-w_sqrt.$(OBJEXT)
+@HAVE_LIBM_MACHINE_NDS32_TRUE@am__objects_174 = $(am__objects_172) \
+@HAVE_LIBM_MACHINE_NDS32_TRUE@ $(am__objects_173)
+@HAVE_LIBM_MACHINE_NDS32_TRUE@am__objects_175 = $(am__objects_174)
+@HAVE_LIBM_MACHINE_POWERPC_TRUE@am__objects_176 = libm/machine/powerpc/libm_a-feclearexcept.$(OBJEXT) \
@HAVE_LIBM_MACHINE_POWERPC_TRUE@ libm/machine/powerpc/libm_a-fegetenv.$(OBJEXT) \
@HAVE_LIBM_MACHINE_POWERPC_TRUE@ libm/machine/powerpc/libm_a-fegetexceptflag.$(OBJEXT) \
@HAVE_LIBM_MACHINE_POWERPC_TRUE@ libm/machine/powerpc/libm_a-fegetround.$(OBJEXT) \
@@ -3283,8 +3379,8 @@ am__objects_155 = libm/fenv/libm_a-feclearexcept.$(OBJEXT) \
@HAVE_LIBM_MACHINE_POWERPC_TRUE@ libm/machine/powerpc/libm_a-fesetround.$(OBJEXT) \
@HAVE_LIBM_MACHINE_POWERPC_TRUE@ libm/machine/powerpc/libm_a-fetestexcept.$(OBJEXT) \
@HAVE_LIBM_MACHINE_POWERPC_TRUE@ libm/machine/powerpc/libm_a-feupdateenv.$(OBJEXT)
-@HAVE_LIBM_MACHINE_POWERPC_TRUE@am__objects_171 = $(am__objects_170)
-@HAVE_LIBM_MACHINE_PRU_TRUE@am__objects_172 = libm/machine/pru/libm_a-fpclassify.$(OBJEXT) \
+@HAVE_LIBM_MACHINE_POWERPC_TRUE@am__objects_177 = $(am__objects_176)
+@HAVE_LIBM_MACHINE_PRU_TRUE@am__objects_178 = libm/machine/pru/libm_a-fpclassify.$(OBJEXT) \
@HAVE_LIBM_MACHINE_PRU_TRUE@ libm/machine/pru/libm_a-fpclassifyf.$(OBJEXT) \
@HAVE_LIBM_MACHINE_PRU_TRUE@ libm/machine/pru/libm_a-isfinite.$(OBJEXT) \
@HAVE_LIBM_MACHINE_PRU_TRUE@ libm/machine/pru/libm_a-isfinitef.$(OBJEXT) \
@@ -3294,8 +3390,8 @@ am__objects_155 = libm/fenv/libm_a-feclearexcept.$(OBJEXT) \
@HAVE_LIBM_MACHINE_PRU_TRUE@ libm/machine/pru/libm_a-isnanf.$(OBJEXT) \
@HAVE_LIBM_MACHINE_PRU_TRUE@ libm/machine/pru/libm_a-isnormal.$(OBJEXT) \
@HAVE_LIBM_MACHINE_PRU_TRUE@ libm/machine/pru/libm_a-isnormalf.$(OBJEXT)
-@HAVE_LIBM_MACHINE_PRU_TRUE@am__objects_173 = $(am__objects_172)
-@HAVE_LIBM_MACHINE_SPARC_TRUE@am__objects_174 = libm/machine/sparc/libm_a-feclearexcept.$(OBJEXT) \
+@HAVE_LIBM_MACHINE_PRU_TRUE@am__objects_179 = $(am__objects_178)
+@HAVE_LIBM_MACHINE_SPARC_TRUE@am__objects_180 = libm/machine/sparc/libm_a-feclearexcept.$(OBJEXT) \
@HAVE_LIBM_MACHINE_SPARC_TRUE@ libm/machine/sparc/libm_a-fegetenv.$(OBJEXT) \
@HAVE_LIBM_MACHINE_SPARC_TRUE@ libm/machine/sparc/libm_a-fegetexceptflag.$(OBJEXT) \
@HAVE_LIBM_MACHINE_SPARC_TRUE@ libm/machine/sparc/libm_a-fegetround.$(OBJEXT) \
@@ -3307,8 +3403,8 @@ am__objects_155 = libm/fenv/libm_a-feclearexcept.$(OBJEXT) \
@HAVE_LIBM_MACHINE_SPARC_TRUE@ libm/machine/sparc/libm_a-fetestexcept.$(OBJEXT) \
@HAVE_LIBM_MACHINE_SPARC_TRUE@ libm/machine/sparc/libm_a-feupdateenv.$(OBJEXT) \
@HAVE_LIBM_MACHINE_SPARC_TRUE@ libm/machine/sparc/libm_a-fenv.$(OBJEXT)
-@HAVE_LIBM_MACHINE_SPARC_TRUE@am__objects_175 = $(am__objects_174)
-@HAVE_LIBM_MACHINE_SPU_TRUE@am__objects_176 = libm/machine/spu/libm_a-feclearexcept.$(OBJEXT) \
+@HAVE_LIBM_MACHINE_SPARC_TRUE@am__objects_181 = $(am__objects_180)
+@HAVE_LIBM_MACHINE_SPU_TRUE@am__objects_182 = libm/machine/spu/libm_a-feclearexcept.$(OBJEXT) \
@HAVE_LIBM_MACHINE_SPU_TRUE@ libm/machine/spu/libm_a-fe_dfl_env.$(OBJEXT) \
@HAVE_LIBM_MACHINE_SPU_TRUE@ libm/machine/spu/libm_a-fegetenv.$(OBJEXT) \
@HAVE_LIBM_MACHINE_SPU_TRUE@ libm/machine/spu/libm_a-fegetexceptflag.$(OBJEXT) \
@@ -3433,8 +3529,8 @@ am__objects_155 = libm/fenv/libm_a-feclearexcept.$(OBJEXT) \
@HAVE_LIBM_MACHINE_SPU_TRUE@ libm/machine/spu/libm_a-w_sinh.$(OBJEXT) \
@HAVE_LIBM_MACHINE_SPU_TRUE@ libm/machine/spu/libm_a-w_sqrt.$(OBJEXT) \
@HAVE_LIBM_MACHINE_SPU_TRUE@ libm/machine/spu/libm_a-w_tgamma.$(OBJEXT)
-@HAVE_LIBM_MACHINE_SPU_TRUE@am__objects_177 = $(am__objects_176)
-@HAVE_LIBM_MACHINE_RISCV_TRUE@am__objects_178 = libm/machine/riscv/libm_a-feclearexcept.$(OBJEXT) \
+@HAVE_LIBM_MACHINE_SPU_TRUE@am__objects_183 = $(am__objects_182)
+@HAVE_LIBM_MACHINE_RISCV_TRUE@am__objects_184 = libm/machine/riscv/libm_a-feclearexcept.$(OBJEXT) \
@HAVE_LIBM_MACHINE_RISCV_TRUE@ libm/machine/riscv/libm_a-fe_dfl_env.$(OBJEXT) \
@HAVE_LIBM_MACHINE_RISCV_TRUE@ libm/machine/riscv/libm_a-fegetenv.$(OBJEXT) \
@HAVE_LIBM_MACHINE_RISCV_TRUE@ libm/machine/riscv/libm_a-fegetexceptflag.$(OBJEXT) \
@@ -3474,8 +3570,8 @@ am__objects_155 = libm/fenv/libm_a-feclearexcept.$(OBJEXT) \
@HAVE_LIBM_MACHINE_RISCV_TRUE@ libm/machine/riscv/libm_a-sf_llrint.$(OBJEXT) \
@HAVE_LIBM_MACHINE_RISCV_TRUE@ libm/machine/riscv/libm_a-s_llround.$(OBJEXT) \
@HAVE_LIBM_MACHINE_RISCV_TRUE@ libm/machine/riscv/libm_a-sf_llround.$(OBJEXT)
-@HAVE_LIBM_MACHINE_RISCV_TRUE@am__objects_179 = $(am__objects_178)
-@HAVE_LIBM_MACHINE_X86_64_TRUE@am__objects_180 = libm/machine/x86_64/libm_a-feclearexcept.$(OBJEXT) \
+@HAVE_LIBM_MACHINE_RISCV_TRUE@am__objects_185 = $(am__objects_184)
+@HAVE_LIBM_MACHINE_X86_64_TRUE@am__objects_186 = libm/machine/x86_64/libm_a-feclearexcept.$(OBJEXT) \
@HAVE_LIBM_MACHINE_X86_64_TRUE@ libm/machine/x86_64/libm_a-fegetenv.$(OBJEXT) \
@HAVE_LIBM_MACHINE_X86_64_TRUE@ libm/machine/x86_64/libm_a-fegetexceptflag.$(OBJEXT) \
@HAVE_LIBM_MACHINE_X86_64_TRUE@ libm/machine/x86_64/libm_a-fegetround.$(OBJEXT) \
@@ -3487,15 +3583,17 @@ am__objects_155 = libm/fenv/libm_a-feclearexcept.$(OBJEXT) \
@HAVE_LIBM_MACHINE_X86_64_TRUE@ libm/machine/x86_64/libm_a-fesetround.$(OBJEXT) \
@HAVE_LIBM_MACHINE_X86_64_TRUE@ libm/machine/x86_64/libm_a-fetestexcept.$(OBJEXT) \
@HAVE_LIBM_MACHINE_X86_64_TRUE@ libm/machine/x86_64/libm_a-feupdateenv.$(OBJEXT)
-@HAVE_LIBM_MACHINE_X86_64_TRUE@am__objects_181 = $(am__objects_180)
+@HAVE_LIBM_MACHINE_X86_64_TRUE@am__objects_187 = $(am__objects_186)
+@HAVE_LIBM_MACHINE_X86_64_TRUE@@HAVE_LONG_DOUBLE_TRUE@am__objects_188 = $(am__objects_168)
am_libm_a_OBJECTS = $(am__objects_143) $(am__objects_147) \
$(am__objects_148) $(am__objects_149) $(am__objects_151) \
- $(am__objects_152) $(am__objects_153) $(am__objects_154) \
- $(am__objects_155) $(am__objects_157) $(am__objects_159) \
+ $(am__objects_153) $(am__objects_154) $(am__objects_155) \
+ $(am__objects_156) $(am__objects_157) $(am__objects_159) \
$(am__objects_161) $(am__objects_163) $(am__objects_165) \
- $(am__objects_169) $(am__objects_171) $(am__objects_173) \
+ $(am__objects_167) $(am__objects_169) $(am__objects_171) \
$(am__objects_175) $(am__objects_177) $(am__objects_179) \
- $(am__objects_181)
+ $(am__objects_181) $(am__objects_183) $(am__objects_185) \
+ $(am__objects_187) $(am__objects_188)
libm_a_OBJECTS = $(am_libm_a_OBJECTS)
am_libm_test_test_OBJECTS = libm/test/test.$(OBJEXT) \
libm/test/string.$(OBJEXT) libm/test/convert.$(OBJEXT) \
@@ -4044,12 +4142,13 @@ libc_a_CPPFLAGS = $(AM_CPPFLAGS) $(libc_a_CPPFLAGS_$(subst /,_,$(@D))) $(libc_a_
libc_a_DEPENDENCIES = stamp-libc-math-objects
libm_a_SOURCES = $(am__append_131) $(am__append_134) \
$(libm_common_src) $(libm_common_fsrc) $(am__append_137) \
- $(libm_complex_src) $(libm_complex_fsrc) $(libm_complex_lsrc) \
- $(libm_fenv_src) $(am__append_138) $(am__append_139) \
- $(am__append_140) $(am__append_141) $(am__append_142) \
- $(am__append_145) $(am__append_146) $(am__append_147) \
- $(am__append_148) $(am__append_149) $(am__append_150) \
- $(am__append_151)
+ $(am__append_138) $(libm_complex_src) $(libm_complex_fsrc) \
+ $(libm_complex_lsrc) $(libm_fenv_src) $(am__append_141) \
+ $(am__append_142) $(am__append_145) $(am__append_146) \
+ $(am__append_147) $(am__append_148) $(am__append_151) \
+ $(am__append_154) $(am__append_155) $(am__append_156) \
+ $(am__append_157) $(am__append_158) $(am__append_159) \
+ $(am__append_160) $(am__append_161)
libm_a_CFLAGS = $(AM_CFLAGS) $(libm_a_CFLAGS_$(subst /,_,$(@D))) $(libm_a_CFLAGS_$(subst /,_,$(@D)_$(<F)))
libm_a_CCASFLAGS = $(AM_CCASFLAGS) $(libm_a_CCASFLAGS_$(subst /,_,$(@D))) $(libm_a_CCASFLAGS_$(subst /,_,$(@D)_$(<F)))
libm_a_CPPFLAGS = $(AM_CPPFLAGS) -I$(srcdir)/libm/common $(libm_a_CPPFLAGS_$(subst /,_,$(@D))) $(libm_a_CPPFLAGS_$(subst /,_,$(@D)_$(<F)))
@@ -4493,7 +4592,7 @@ LIBM_CHEWOUT_FILES = $(am__append_132) $(am__append_135) \
libm/common/s_remquo.def libm/common/s_rint.def \
libm/common/s_round.def libm/common/s_signbit.def \
libm/common/s_trunc.def libm/common/isgreater.def \
- libm/complex/cabs.def libm/complex/cacos.def \
+ $(am__append_139) libm/complex/cabs.def libm/complex/cacos.def \
libm/complex/cacosh.def libm/complex/carg.def \
libm/complex/casin.def libm/complex/casinh.def \
libm/complex/catan.def libm/complex/catanh.def \
@@ -4509,9 +4608,11 @@ LIBM_CHEWOUT_FILES = $(am__append_132) $(am__append_135) \
libm/fenv/fegetround.def libm/fenv/feholdexcept.def \
libm/fenv/feraiseexcept.def libm/fenv/fesetenv.def \
libm/fenv/fesetexceptflag.def libm/fenv/fesetround.def \
- libm/fenv/fetestexcept.def libm/fenv/feupdateenv.def
-LIBM_CHAPTERS = $(am__append_133) $(am__append_136) \
- libm/complex/complex.tex libm/fenv/fenv.tex
+ libm/fenv/fetestexcept.def libm/fenv/feupdateenv.def \
+ $(am__append_143) $(am__append_149) $(am__append_162)
+LIBM_CHAPTERS = $(am__append_133) $(am__append_136) $(am__append_140) \
+ libm/complex/complex.tex libm/fenv/fenv.tex $(am__append_144) \
+ $(am__append_150) $(am__append_163)
LIBM_DOCBOOK_OUT_FILES = $(LIBM_CHEWOUT_FILES:.def=.xml)
@NEWLIB_HW_FP_TRUE@libm_mathfp_src = \
@NEWLIB_HW_FP_TRUE@ libm/mathfp/s_acos.c libm/mathfp/s_frexp.c libm/mathfp/s_mathcnst.c \
@@ -4677,6 +4778,54 @@ libm_common_lsrc = \
libm/common/sl_finite.c
libm_a_CFLAGS_libm_common = -fbuiltin -fno-math-errno
+@HAVE_FPMATH_H_TRUE@libm_ld_lsrc = \
+@HAVE_FPMATH_H_TRUE@ libm/ld/e_acoshl.c \
+@HAVE_FPMATH_H_TRUE@ libm/ld/e_acosl.c \
+@HAVE_FPMATH_H_TRUE@ libm/ld/e_asinl.c \
+@HAVE_FPMATH_H_TRUE@ libm/ld/e_atan2l.c \
+@HAVE_FPMATH_H_TRUE@ libm/ld/e_atanhl.c \
+@HAVE_FPMATH_H_TRUE@ libm/ld/e_coshl.c \
+@HAVE_FPMATH_H_TRUE@ libm/ld/e_fmodl.c \
+@HAVE_FPMATH_H_TRUE@ libm/ld/e_lgammal.c \
+@HAVE_FPMATH_H_TRUE@ libm/ld/e_remainderl.c \
+@HAVE_FPMATH_H_TRUE@ libm/ld/e_sinhl.c \
+@HAVE_FPMATH_H_TRUE@ libm/ld/s_asinhl.c \
+@HAVE_FPMATH_H_TRUE@ libm/ld/s_atanl.c \
+@HAVE_FPMATH_H_TRUE@ libm/ld/s_cbrtl.c \
+@HAVE_FPMATH_H_TRUE@ libm/ld/s_ceill.c \
+@HAVE_FPMATH_H_TRUE@ libm/ld/s_copysignl.c \
+@HAVE_FPMATH_H_TRUE@ libm/ld/s_cosl.c \
+@HAVE_FPMATH_H_TRUE@ libm/ld/s_fabsl.c \
+@HAVE_FPMATH_H_TRUE@ libm/ld/fdiml.c \
+@HAVE_FPMATH_H_TRUE@ libm/ld/s_floorl.c \
+@HAVE_FPMATH_H_TRUE@ libm/ld/s_fmal.c \
+@HAVE_FPMATH_H_TRUE@ libm/ld/s_fmaxl.c \
+@HAVE_FPMATH_H_TRUE@ libm/ld/s_fminl.c \
+@HAVE_FPMATH_H_TRUE@ libm/ld/s_frexpl.c \
+@HAVE_FPMATH_H_TRUE@ libm/ld/s_ilogbl.c \
+@HAVE_FPMATH_H_TRUE@ libm/ld/s_llrintl.c \
+@HAVE_FPMATH_H_TRUE@ libm/ld/s_llroundl.c \
+@HAVE_FPMATH_H_TRUE@ libm/ld/s_logbl.c \
+@HAVE_FPMATH_H_TRUE@ libm/ld/s_lrint.c \
+@HAVE_FPMATH_H_TRUE@ libm/ld/s_lrintl.c \
+@HAVE_FPMATH_H_TRUE@ libm/ld/s_lround.c \
+@HAVE_FPMATH_H_TRUE@ libm/ld/s_lroundl.c \
+@HAVE_FPMATH_H_TRUE@ libm/ld/s_modfl.c \
+@HAVE_FPMATH_H_TRUE@ libm/ld/s_nearbyintl.c \
+@HAVE_FPMATH_H_TRUE@ libm/ld/s_nextafterl.c \
+@HAVE_FPMATH_H_TRUE@ libm/ld/s_nexttoward.c \
+@HAVE_FPMATH_H_TRUE@ libm/ld/s_nexttowardf.c \
+@HAVE_FPMATH_H_TRUE@ libm/ld/s_remquol.c \
+@HAVE_FPMATH_H_TRUE@ libm/ld/s_rintl.c \
+@HAVE_FPMATH_H_TRUE@ libm/ld/s_roundl.c \
+@HAVE_FPMATH_H_TRUE@ libm/ld/scalblnl.c \
+@HAVE_FPMATH_H_TRUE@ libm/ld/s_scalbnl.c \
+@HAVE_FPMATH_H_TRUE@ libm/ld/s_sinl.c \
+@HAVE_FPMATH_H_TRUE@ libm/ld/s_tanhl.c \
+@HAVE_FPMATH_H_TRUE@ libm/ld/s_tanl.c \
+@HAVE_FPMATH_H_TRUE@ libm/ld/s_truncl.c
+
+@HAVE_FPMATH_H_TRUE@libm_a_CFLAGS_libm_ld = -fbuiltin -fno-math-errno
libm_complex_src = \
libm/complex/cabs.c libm/complex/cacos.c libm/complex/cacosh.c libm/complex/carg.c libm/complex/casin.c libm/complex/casinh.c \
libm/complex/catan.c libm/complex/catanh.c libm/complex/ccos.c libm/complex/ccosh.c libm/complex/cephes_subr.c \
@@ -4828,6 +4977,12 @@ libm_test_test_LDADD = $(CRT0) libm.a libc.a
@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/machine/aarch64/fetestexcept.c \
@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/machine/aarch64/feupdateenv.c
+@HAVE_LIBM_MACHINE_AARCH64_TRUE@libm_ld128_lsrc = \
+@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/e_powl.c libm/ld128/s_erfl.c libm/ld128/s_exp2l.c libm/ld128/s_expl.c \
+@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/s_logl.c libm/ld128/b_tgammal.c libm/ld128/invtrig.c \
+@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/e_lgammal_r.c libm/ld128/k_cosl.c libm/ld128/k_sinl.c
+
+@HAVE_LIBM_MACHINE_AARCH64_TRUE@libm_a_CFLAGS_libm_ld128 = -fbuiltin -fno-math-errno
@HAVE_LIBM_MACHINE_AMDGCN_TRUE@libm_machine_amdgcn_src = \
@HAVE_LIBM_MACHINE_AMDGCN_TRUE@ libm/machine/amdgcn/v64_mathcnst.c \
@HAVE_LIBM_MACHINE_AMDGCN_TRUE@ libm/machine/amdgcn/v64_reent.c \
@@ -4962,6 +5117,18 @@ libm_test_test_LDADD = $(CRT0) libm.a libc.a
@HAVE_LIBM_MACHINE_I386_TRUE@ libm/machine/i386/fegetround.c libm/machine/i386/feholdexcept.c libm/machine/i386/feraiseexcept.c libm/machine/i386/fesetenv.c \
@HAVE_LIBM_MACHINE_I386_TRUE@ libm/machine/i386/fesetexceptflag.c libm/machine/i386/fesetround.c libm/machine/i386/fetestexcept.c libm/machine/i386/feupdateenv.c
+@HAVE_LIBM_MACHINE_I386_TRUE@libm_ld80_lsrc = \
+@HAVE_LIBM_MACHINE_I386_TRUE@ libm/ld80/b_tgammal.c libm/ld80/e_powl.c libm/ld80/s_erfl.c libm/ld80/s_exp2l.c \
+@HAVE_LIBM_MACHINE_I386_TRUE@ libm/ld80/s_expl.c libm/ld80/s_logl.c libm/ld80/s_sinpil.c libm/ld80/s_cospil.c \
+@HAVE_LIBM_MACHINE_I386_TRUE@ libm/ld80/invtrig.c libm/ld80/e_lgammal_r.c libm/ld80/k_cosl.c libm/ld80/k_sinl.c
+
+@HAVE_LIBM_MACHINE_X86_64_TRUE@libm_ld80_lsrc = \
+@HAVE_LIBM_MACHINE_X86_64_TRUE@ libm/ld80/b_tgammal.c libm/ld80/e_powl.c libm/ld80/s_erfl.c libm/ld80/s_exp2l.c \
+@HAVE_LIBM_MACHINE_X86_64_TRUE@ libm/ld80/s_expl.c libm/ld80/s_logl.c libm/ld80/s_sinpil.c libm/ld80/s_cospil.c \
+@HAVE_LIBM_MACHINE_X86_64_TRUE@ libm/ld80/invtrig.c libm/ld80/e_lgammal_r.c libm/ld80/k_cosl.c libm/ld80/k_sinl.c
+
+@HAVE_LIBM_MACHINE_I386_TRUE@libm_a_CFLAGS_libm_ld80 = -fbuiltin -fno-math-errno
+@HAVE_LIBM_MACHINE_X86_64_TRUE@libm_a_CFLAGS_libm_ld80 = -fbuiltin -fno-math-errno
@HAVE_LIBM_MACHINE_MIPS_TRUE@libm_machine_mips_src = \
@HAVE_LIBM_MACHINE_MIPS_TRUE@ libm/machine/mips/feclearexcept.c libm/machine/mips/fegetenv.c libm/machine/mips/fegetexceptflag.c \
@HAVE_LIBM_MACHINE_MIPS_TRUE@ libm/machine/mips/fegetround.c libm/machine/mips/feholdexcept.c libm/machine/mips/feraiseexcept.c libm/machine/mips/fesetenv.c \
@@ -4972,8 +5139,8 @@ libm_test_test_LDADD = $(CRT0) libm.a libc.a
# fenv.c cannot be compiled as mips16 since it uses the cfc1 instruction.
@HAVE_LIBM_MACHINE_MIPS_TRUE@libm_a_CFLAGS_libm_machine_mips_fenv.c = -mno-mips16
@HAVE_LIBM_MACHINE_NDS32_TRUE@libm_machine_nds32_src = \
-@HAVE_LIBM_MACHINE_NDS32_TRUE@ $(am__append_143) \
-@HAVE_LIBM_MACHINE_NDS32_TRUE@ $(am__append_144)
+@HAVE_LIBM_MACHINE_NDS32_TRUE@ $(am__append_152) \
+@HAVE_LIBM_MACHINE_NDS32_TRUE@ $(am__append_153)
@HAVE_LIBM_MACHINE_POWERPC_TRUE@libm_machine_powerpc_src = \
@HAVE_LIBM_MACHINE_POWERPC_TRUE@ libm/machine/powerpc/feclearexcept.c libm/machine/powerpc/fegetenv.c libm/machine/powerpc/fegetexceptflag.c \
@HAVE_LIBM_MACHINE_POWERPC_TRUE@ libm/machine/powerpc/fegetround.c libm/machine/powerpc/feholdexcept.c libm/machine/powerpc/fenv.c libm/machine/powerpc/feraiseexcept.c libm/machine/powerpc/fesetenv.c \
@@ -5042,7 +5209,7 @@ all: newlib.h _newlib_version.h
.SUFFIXES: .def .xml .S .c .dvi .o .obj .ps .s
am--refresh: Makefile
@:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/../multilib.am $(srcdir)/doc/Makefile.inc $(srcdir)/libc/Makefile.inc $(srcdir)/libc/argz/Makefile.inc $(srcdir)/libc/stdlib/Makefile.inc $(srcdir)/libc/ctype/Makefile.inc $(srcdir)/libc/search/Makefile.inc $(srcdir)/libc/stdio/Makefile.inc $(srcdir)/libc/stdio64/Makefile.inc $(srcdir)/libc/string/Makefile.inc $(srcdir)/libc/signal/Makefile.inc $(srcdir)/libc/time/Makefile.inc $(srcdir)/libc/locale/Makefile.inc $(srcdir)/libc/reent/Makefile.inc $(srcdir)/libc/errno/Makefile.inc $(srcdir)/libc/misc/Makefile.inc $(srcdir)/libc/unix/Makefile.inc $(srcdir)/libc/posix/Makefile.inc $(srcdir)/libc/syscalls/Makefile.inc $(srcdir)/libc/iconv/Makefile.inc $(srcdir)/libc/iconv/ces/Makefile.inc $(srcdir)/libc/iconv/ccs/Makefile.inc $(srcdir)/libc/iconv/ccs/binary/Makefile.inc $(srcdir)/libc/iconv/lib/Makefile.inc $(srcdir)/libc/xdr/Makefile.inc $(srcdir)/libc/ssp/Makefile.inc $(srcdir)/libc/sys/Makefile.inc $(srcdir)/libc/sys/a29khif/Makefile.inc $(srcdir)/libc/sys/amdgcn/Makefile.inc $(srcdir)/libc/sys/arm/Makefile.inc $(srcdir)/libc/sys/d10v/Makefile.inc $(srcdir)/libc/sys/epiphany/Makefile.inc $(srcdir)/libc/sys/h8300hms/Makefile.inc $(srcdir)/libc/sys/h8500hms/Makefile.inc $(srcdir)/libc/sys/m88kbug/Makefile.inc $(srcdir)/libc/sys/mmixware/Makefile.inc $(srcdir)/libc/sys/netware/Makefile.inc $(srcdir)/libc/sys/or1k/Makefile.inc $(srcdir)/libc/sys/rdos/Makefile.inc $(srcdir)/libc/sys/rtems/Makefile.inc $(srcdir)/libc/sys/sh/Makefile.inc $(srcdir)/libc/sys/sysmec/Makefile.inc $(srcdir)/libc/sys/sysnec810/Makefile.inc $(srcdir)/libc/sys/sysnecv850/Makefile.inc $(srcdir)/libc/sys/sysvi386/Makefile.inc $(srcdir)/libc/sys/sysvnecv70/Makefile.inc $(srcdir)/libc/sys/tic80/Makefile.inc $(srcdir)/libc/sys/tirtos/Makefile.inc $(srcdir)/libc/sys/w65/Makefile.inc $(srcdir)/libc/sys/z8ksim/Makefile.inc $(srcdir)/libc/machine/Makefile.inc $(srcdir)/libc/machine/aarch64/Makefile.inc $(srcdir)/libc/machine/amdgcn/Makefile.inc $(srcdir)/libc/machine/arc/Makefile.inc $(srcdir)/libc/machine/arm/Makefile.inc $(srcdir)/libc/machine/bfin/Makefile.inc $(srcdir)/libc/machine/cr16/Makefile.inc $(srcdir)/libc/machine/cris/Makefile.inc $(srcdir)/libc/machine/crx/Makefile.inc $(srcdir)/libc/machine/csky/Makefile.inc $(srcdir)/libc/machine/d10v/Makefile.inc $(srcdir)/libc/machine/d30v/Makefile.inc $(srcdir)/libc/machine/epiphany/Makefile.inc $(srcdir)/libc/machine/fr30/Makefile.inc $(srcdir)/libc/machine/frv/Makefile.inc $(srcdir)/libc/machine/ft32/Makefile.inc $(srcdir)/libc/machine/h8300/Makefile.inc $(srcdir)/libc/machine/h8500/Makefile.inc $(srcdir)/libc/machine/hppa/Makefile.inc $(srcdir)/libc/machine/i386/Makefile.inc $(srcdir)/libc/machine/i960/Makefile.inc $(srcdir)/libc/machine/iq2000/Makefile.inc $(srcdir)/libc/machine/lm32/Makefile.inc $(srcdir)/libc/machine/m32c/Makefile.inc $(srcdir)/libc/machine/m32r/Makefile.inc $(srcdir)/libc/machine/m68hc11/Makefile.inc $(srcdir)/libc/machine/m68k/Makefile.inc $(srcdir)/libc/machine/m88k/Makefile.inc $(srcdir)/libc/machine/mep/Makefile.inc $(srcdir)/libc/machine/microblaze/Makefile.inc $(srcdir)/libc/machine/mips/Makefile.inc $(srcdir)/libc/machine/mn10200/Makefile.inc $(srcdir)/libc/machine/mn10300/Makefile.inc $(srcdir)/libc/machine/moxie/Makefile.inc $(srcdir)/libc/machine/msp430/Makefile.inc $(srcdir)/libc/machine/mt/Makefile.inc $(srcdir)/libc/machine/nds32/Makefile.inc $(srcdir)/libc/machine/necv70/Makefile.inc $(srcdir)/libc/machine/nios2/Makefile.inc $(srcdir)/libc/machine/nvptx/Makefile.inc $(srcdir)/libc/machine/or1k/Makefile.inc $(srcdir)/libc/machine/powerpc/Makefile.inc $(srcdir)/libc/machine/pru/Makefile.inc $(srcdir)/libc/machine/riscv/Makefile.inc $(srcdir)/libc/machine/rl78/Makefile.inc $(srcdir)/libc/machine/rx/Makefile.inc $(srcdir)/libc/machine/sh/Makefile.inc $(srcdir)/libc/machine/sparc/Makefile.inc $(srcdir)/libc/machine/spu/Makefile.inc $(srcdir)/libc/machine/tic4x/Makefile.inc $(srcdir)/libc/machine/tic6x/Makefile.inc $(srcdir)/libc/machine/tic80/Makefile.inc $(srcdir)/libc/machine/v850/Makefile.inc $(srcdir)/libc/machine/visium/Makefile.inc $(srcdir)/libc/machine/w65/Makefile.inc $(srcdir)/libc/machine/x86_64/Makefile.inc $(srcdir)/libc/machine/xc16x/Makefile.inc $(srcdir)/libc/machine/xstormy16/Makefile.inc $(srcdir)/libc/machine/z8k/Makefile.inc $(srcdir)/libm/Makefile.inc $(srcdir)/libm/mathfp/Makefile.inc $(srcdir)/libm/math/Makefile.inc $(srcdir)/libm/common/Makefile.inc $(srcdir)/libm/complex/Makefile.inc $(srcdir)/libm/fenv/Makefile.inc $(srcdir)/libm/test/Makefile.inc $(srcdir)/libm/machine/aarch64/Makefile.inc $(srcdir)/libm/machine/amdgcn/Makefile.inc $(srcdir)/libm/machine/arm/Makefile.inc $(srcdir)/libm/machine/i386/Makefile.inc $(srcdir)/libm/machine/mips/Makefile.inc $(srcdir)/libm/machine/nds32/Makefile.inc $(srcdir)/libm/machine/powerpc/Makefile.inc $(srcdir)/libm/machine/pru/Makefile.inc $(srcdir)/libm/machine/sparc/Makefile.inc $(srcdir)/libm/machine/spu/Makefile.inc $(srcdir)/libm/machine/riscv/Makefile.inc $(srcdir)/libm/machine/x86_64/Makefile.inc $(am__configure_deps)
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/../multilib.am $(srcdir)/doc/Makefile.inc $(srcdir)/libc/Makefile.inc $(srcdir)/libc/argz/Makefile.inc $(srcdir)/libc/stdlib/Makefile.inc $(srcdir)/libc/ctype/Makefile.inc $(srcdir)/libc/search/Makefile.inc $(srcdir)/libc/stdio/Makefile.inc $(srcdir)/libc/stdio64/Makefile.inc $(srcdir)/libc/string/Makefile.inc $(srcdir)/libc/signal/Makefile.inc $(srcdir)/libc/time/Makefile.inc $(srcdir)/libc/locale/Makefile.inc $(srcdir)/libc/reent/Makefile.inc $(srcdir)/libc/errno/Makefile.inc $(srcdir)/libc/misc/Makefile.inc $(srcdir)/libc/unix/Makefile.inc $(srcdir)/libc/posix/Makefile.inc $(srcdir)/libc/syscalls/Makefile.inc $(srcdir)/libc/iconv/Makefile.inc $(srcdir)/libc/iconv/ces/Makefile.inc $(srcdir)/libc/iconv/ccs/Makefile.inc $(srcdir)/libc/iconv/ccs/binary/Makefile.inc $(srcdir)/libc/iconv/lib/Makefile.inc $(srcdir)/libc/xdr/Makefile.inc $(srcdir)/libc/ssp/Makefile.inc $(srcdir)/libc/sys/Makefile.inc $(srcdir)/libc/sys/a29khif/Makefile.inc $(srcdir)/libc/sys/amdgcn/Makefile.inc $(srcdir)/libc/sys/arm/Makefile.inc $(srcdir)/libc/sys/d10v/Makefile.inc $(srcdir)/libc/sys/epiphany/Makefile.inc $(srcdir)/libc/sys/h8300hms/Makefile.inc $(srcdir)/libc/sys/h8500hms/Makefile.inc $(srcdir)/libc/sys/m88kbug/Makefile.inc $(srcdir)/libc/sys/mmixware/Makefile.inc $(srcdir)/libc/sys/netware/Makefile.inc $(srcdir)/libc/sys/or1k/Makefile.inc $(srcdir)/libc/sys/rdos/Makefile.inc $(srcdir)/libc/sys/rtems/Makefile.inc $(srcdir)/libc/sys/sh/Makefile.inc $(srcdir)/libc/sys/sysmec/Makefile.inc $(srcdir)/libc/sys/sysnec810/Makefile.inc $(srcdir)/libc/sys/sysnecv850/Makefile.inc $(srcdir)/libc/sys/sysvi386/Makefile.inc $(srcdir)/libc/sys/sysvnecv70/Makefile.inc $(srcdir)/libc/sys/tic80/Makefile.inc $(srcdir)/libc/sys/tirtos/Makefile.inc $(srcdir)/libc/sys/w65/Makefile.inc $(srcdir)/libc/sys/z8ksim/Makefile.inc $(srcdir)/libc/machine/Makefile.inc $(srcdir)/libc/machine/aarch64/Makefile.inc $(srcdir)/libc/machine/amdgcn/Makefile.inc $(srcdir)/libc/machine/arc/Makefile.inc $(srcdir)/libc/machine/arm/Makefile.inc $(srcdir)/libc/machine/bfin/Makefile.inc $(srcdir)/libc/machine/cr16/Makefile.inc $(srcdir)/libc/machine/cris/Makefile.inc $(srcdir)/libc/machine/crx/Makefile.inc $(srcdir)/libc/machine/csky/Makefile.inc $(srcdir)/libc/machine/d10v/Makefile.inc $(srcdir)/libc/machine/d30v/Makefile.inc $(srcdir)/libc/machine/epiphany/Makefile.inc $(srcdir)/libc/machine/fr30/Makefile.inc $(srcdir)/libc/machine/frv/Makefile.inc $(srcdir)/libc/machine/ft32/Makefile.inc $(srcdir)/libc/machine/h8300/Makefile.inc $(srcdir)/libc/machine/h8500/Makefile.inc $(srcdir)/libc/machine/hppa/Makefile.inc $(srcdir)/libc/machine/i386/Makefile.inc $(srcdir)/libc/machine/i960/Makefile.inc $(srcdir)/libc/machine/iq2000/Makefile.inc $(srcdir)/libc/machine/lm32/Makefile.inc $(srcdir)/libc/machine/m32c/Makefile.inc $(srcdir)/libc/machine/m32r/Makefile.inc $(srcdir)/libc/machine/m68hc11/Makefile.inc $(srcdir)/libc/machine/m68k/Makefile.inc $(srcdir)/libc/machine/m88k/Makefile.inc $(srcdir)/libc/machine/mep/Makefile.inc $(srcdir)/libc/machine/microblaze/Makefile.inc $(srcdir)/libc/machine/mips/Makefile.inc $(srcdir)/libc/machine/mn10200/Makefile.inc $(srcdir)/libc/machine/mn10300/Makefile.inc $(srcdir)/libc/machine/moxie/Makefile.inc $(srcdir)/libc/machine/msp430/Makefile.inc $(srcdir)/libc/machine/mt/Makefile.inc $(srcdir)/libc/machine/nds32/Makefile.inc $(srcdir)/libc/machine/necv70/Makefile.inc $(srcdir)/libc/machine/nios2/Makefile.inc $(srcdir)/libc/machine/nvptx/Makefile.inc $(srcdir)/libc/machine/or1k/Makefile.inc $(srcdir)/libc/machine/powerpc/Makefile.inc $(srcdir)/libc/machine/pru/Makefile.inc $(srcdir)/libc/machine/riscv/Makefile.inc $(srcdir)/libc/machine/rl78/Makefile.inc $(srcdir)/libc/machine/rx/Makefile.inc $(srcdir)/libc/machine/sh/Makefile.inc $(srcdir)/libc/machine/sparc/Makefile.inc $(srcdir)/libc/machine/spu/Makefile.inc $(srcdir)/libc/machine/tic4x/Makefile.inc $(srcdir)/libc/machine/tic6x/Makefile.inc $(srcdir)/libc/machine/tic80/Makefile.inc $(srcdir)/libc/machine/v850/Makefile.inc $(srcdir)/libc/machine/visium/Makefile.inc $(srcdir)/libc/machine/w65/Makefile.inc $(srcdir)/libc/machine/x86_64/Makefile.inc $(srcdir)/libc/machine/xc16x/Makefile.inc $(srcdir)/libc/machine/xstormy16/Makefile.inc $(srcdir)/libc/machine/z8k/Makefile.inc $(srcdir)/libm/Makefile.inc $(srcdir)/libm/mathfp/Makefile.inc $(srcdir)/libm/math/Makefile.inc $(srcdir)/libm/common/Makefile.inc $(srcdir)/libm/ld/Makefile.inc $(srcdir)/libm/complex/Makefile.inc $(srcdir)/libm/fenv/Makefile.inc $(srcdir)/libm/test/Makefile.inc $(srcdir)/libm/machine/aarch64/Makefile.inc $(srcdir)/libm/ld128/Makefile.inc $(srcdir)/libm/machine/amdgcn/Makefile.inc $(srcdir)/libm/machine/arm/Makefile.inc $(srcdir)/libm/machine/i386/Makefile.inc $(srcdir)/libm/ld80/Makefile.inc $(srcdir)/libm/machine/mips/Makefile.inc $(srcdir)/libm/machine/nds32/Makefile.inc $(srcdir)/libm/machine/powerpc/Makefile.inc $(srcdir)/libm/machine/pru/Makefile.inc $(srcdir)/libm/machine/sparc/Makefile.inc $(srcdir)/libm/machine/spu/Makefile.inc $(srcdir)/libm/machine/riscv/Makefile.inc $(srcdir)/libm/machine/x86_64/Makefile.inc $(srcdir)/libm/ld80/Makefile.inc $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
@@ -5064,7 +5231,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
esac;
-$(srcdir)/../multilib.am $(srcdir)/doc/Makefile.inc $(srcdir)/libc/Makefile.inc $(srcdir)/libc/argz/Makefile.inc $(srcdir)/libc/stdlib/Makefile.inc $(srcdir)/libc/ctype/Makefile.inc $(srcdir)/libc/search/Makefile.inc $(srcdir)/libc/stdio/Makefile.inc $(srcdir)/libc/stdio64/Makefile.inc $(srcdir)/libc/string/Makefile.inc $(srcdir)/libc/signal/Makefile.inc $(srcdir)/libc/time/Makefile.inc $(srcdir)/libc/locale/Makefile.inc $(srcdir)/libc/reent/Makefile.inc $(srcdir)/libc/errno/Makefile.inc $(srcdir)/libc/misc/Makefile.inc $(srcdir)/libc/unix/Makefile.inc $(srcdir)/libc/posix/Makefile.inc $(srcdir)/libc/syscalls/Makefile.inc $(srcdir)/libc/iconv/Makefile.inc $(srcdir)/libc/iconv/ces/Makefile.inc $(srcdir)/libc/iconv/ccs/Makefile.inc $(srcdir)/libc/iconv/ccs/binary/Makefile.inc $(srcdir)/libc/iconv/lib/Makefile.inc $(srcdir)/libc/xdr/Makefile.inc $(srcdir)/libc/ssp/Makefile.inc $(srcdir)/libc/sys/Makefile.inc $(srcdir)/libc/sys/a29khif/Makefile.inc $(srcdir)/libc/sys/amdgcn/Makefile.inc $(srcdir)/libc/sys/arm/Makefile.inc $(srcdir)/libc/sys/d10v/Makefile.inc $(srcdir)/libc/sys/epiphany/Makefile.inc $(srcdir)/libc/sys/h8300hms/Makefile.inc $(srcdir)/libc/sys/h8500hms/Makefile.inc $(srcdir)/libc/sys/m88kbug/Makefile.inc $(srcdir)/libc/sys/mmixware/Makefile.inc $(srcdir)/libc/sys/netware/Makefile.inc $(srcdir)/libc/sys/or1k/Makefile.inc $(srcdir)/libc/sys/rdos/Makefile.inc $(srcdir)/libc/sys/rtems/Makefile.inc $(srcdir)/libc/sys/sh/Makefile.inc $(srcdir)/libc/sys/sysmec/Makefile.inc $(srcdir)/libc/sys/sysnec810/Makefile.inc $(srcdir)/libc/sys/sysnecv850/Makefile.inc $(srcdir)/libc/sys/sysvi386/Makefile.inc $(srcdir)/libc/sys/sysvnecv70/Makefile.inc $(srcdir)/libc/sys/tic80/Makefile.inc $(srcdir)/libc/sys/tirtos/Makefile.inc $(srcdir)/libc/sys/w65/Makefile.inc $(srcdir)/libc/sys/z8ksim/Makefile.inc $(srcdir)/libc/machine/Makefile.inc $(srcdir)/libc/machine/aarch64/Makefile.inc $(srcdir)/libc/machine/amdgcn/Makefile.inc $(srcdir)/libc/machine/arc/Makefile.inc $(srcdir)/libc/machine/arm/Makefile.inc $(srcdir)/libc/machine/bfin/Makefile.inc $(srcdir)/libc/machine/cr16/Makefile.inc $(srcdir)/libc/machine/cris/Makefile.inc $(srcdir)/libc/machine/crx/Makefile.inc $(srcdir)/libc/machine/csky/Makefile.inc $(srcdir)/libc/machine/d10v/Makefile.inc $(srcdir)/libc/machine/d30v/Makefile.inc $(srcdir)/libc/machine/epiphany/Makefile.inc $(srcdir)/libc/machine/fr30/Makefile.inc $(srcdir)/libc/machine/frv/Makefile.inc $(srcdir)/libc/machine/ft32/Makefile.inc $(srcdir)/libc/machine/h8300/Makefile.inc $(srcdir)/libc/machine/h8500/Makefile.inc $(srcdir)/libc/machine/hppa/Makefile.inc $(srcdir)/libc/machine/i386/Makefile.inc $(srcdir)/libc/machine/i960/Makefile.inc $(srcdir)/libc/machine/iq2000/Makefile.inc $(srcdir)/libc/machine/lm32/Makefile.inc $(srcdir)/libc/machine/m32c/Makefile.inc $(srcdir)/libc/machine/m32r/Makefile.inc $(srcdir)/libc/machine/m68hc11/Makefile.inc $(srcdir)/libc/machine/m68k/Makefile.inc $(srcdir)/libc/machine/m88k/Makefile.inc $(srcdir)/libc/machine/mep/Makefile.inc $(srcdir)/libc/machine/microblaze/Makefile.inc $(srcdir)/libc/machine/mips/Makefile.inc $(srcdir)/libc/machine/mn10200/Makefile.inc $(srcdir)/libc/machine/mn10300/Makefile.inc $(srcdir)/libc/machine/moxie/Makefile.inc $(srcdir)/libc/machine/msp430/Makefile.inc $(srcdir)/libc/machine/mt/Makefile.inc $(srcdir)/libc/machine/nds32/Makefile.inc $(srcdir)/libc/machine/necv70/Makefile.inc $(srcdir)/libc/machine/nios2/Makefile.inc $(srcdir)/libc/machine/nvptx/Makefile.inc $(srcdir)/libc/machine/or1k/Makefile.inc $(srcdir)/libc/machine/powerpc/Makefile.inc $(srcdir)/libc/machine/pru/Makefile.inc $(srcdir)/libc/machine/riscv/Makefile.inc $(srcdir)/libc/machine/rl78/Makefile.inc $(srcdir)/libc/machine/rx/Makefile.inc $(srcdir)/libc/machine/sh/Makefile.inc $(srcdir)/libc/machine/sparc/Makefile.inc $(srcdir)/libc/machine/spu/Makefile.inc $(srcdir)/libc/machine/tic4x/Makefile.inc $(srcdir)/libc/machine/tic6x/Makefile.inc $(srcdir)/libc/machine/tic80/Makefile.inc $(srcdir)/libc/machine/v850/Makefile.inc $(srcdir)/libc/machine/visium/Makefile.inc $(srcdir)/libc/machine/w65/Makefile.inc $(srcdir)/libc/machine/x86_64/Makefile.inc $(srcdir)/libc/machine/xc16x/Makefile.inc $(srcdir)/libc/machine/xstormy16/Makefile.inc $(srcdir)/libc/machine/z8k/Makefile.inc $(srcdir)/libm/Makefile.inc $(srcdir)/libm/mathfp/Makefile.inc $(srcdir)/libm/math/Makefile.inc $(srcdir)/libm/common/Makefile.inc $(srcdir)/libm/complex/Makefile.inc $(srcdir)/libm/fenv/Makefile.inc $(srcdir)/libm/test/Makefile.inc $(srcdir)/libm/machine/aarch64/Makefile.inc $(srcdir)/libm/machine/amdgcn/Makefile.inc $(srcdir)/libm/machine/arm/Makefile.inc $(srcdir)/libm/machine/i386/Makefile.inc $(srcdir)/libm/machine/mips/Makefile.inc $(srcdir)/libm/machine/nds32/Makefile.inc $(srcdir)/libm/machine/powerpc/Makefile.inc $(srcdir)/libm/machine/pru/Makefile.inc $(srcdir)/libm/machine/sparc/Makefile.inc $(srcdir)/libm/machine/spu/Makefile.inc $(srcdir)/libm/machine/riscv/Makefile.inc $(srcdir)/libm/machine/x86_64/Makefile.inc $(am__empty):
+$(srcdir)/../multilib.am $(srcdir)/doc/Makefile.inc $(srcdir)/libc/Makefile.inc $(srcdir)/libc/argz/Makefile.inc $(srcdir)/libc/stdlib/Makefile.inc $(srcdir)/libc/ctype/Makefile.inc $(srcdir)/libc/search/Makefile.inc $(srcdir)/libc/stdio/Makefile.inc $(srcdir)/libc/stdio64/Makefile.inc $(srcdir)/libc/string/Makefile.inc $(srcdir)/libc/signal/Makefile.inc $(srcdir)/libc/time/Makefile.inc $(srcdir)/libc/locale/Makefile.inc $(srcdir)/libc/reent/Makefile.inc $(srcdir)/libc/errno/Makefile.inc $(srcdir)/libc/misc/Makefile.inc $(srcdir)/libc/unix/Makefile.inc $(srcdir)/libc/posix/Makefile.inc $(srcdir)/libc/syscalls/Makefile.inc $(srcdir)/libc/iconv/Makefile.inc $(srcdir)/libc/iconv/ces/Makefile.inc $(srcdir)/libc/iconv/ccs/Makefile.inc $(srcdir)/libc/iconv/ccs/binary/Makefile.inc $(srcdir)/libc/iconv/lib/Makefile.inc $(srcdir)/libc/xdr/Makefile.inc $(srcdir)/libc/ssp/Makefile.inc $(srcdir)/libc/sys/Makefile.inc $(srcdir)/libc/sys/a29khif/Makefile.inc $(srcdir)/libc/sys/amdgcn/Makefile.inc $(srcdir)/libc/sys/arm/Makefile.inc $(srcdir)/libc/sys/d10v/Makefile.inc $(srcdir)/libc/sys/epiphany/Makefile.inc $(srcdir)/libc/sys/h8300hms/Makefile.inc $(srcdir)/libc/sys/h8500hms/Makefile.inc $(srcdir)/libc/sys/m88kbug/Makefile.inc $(srcdir)/libc/sys/mmixware/Makefile.inc $(srcdir)/libc/sys/netware/Makefile.inc $(srcdir)/libc/sys/or1k/Makefile.inc $(srcdir)/libc/sys/rdos/Makefile.inc $(srcdir)/libc/sys/rtems/Makefile.inc $(srcdir)/libc/sys/sh/Makefile.inc $(srcdir)/libc/sys/sysmec/Makefile.inc $(srcdir)/libc/sys/sysnec810/Makefile.inc $(srcdir)/libc/sys/sysnecv850/Makefile.inc $(srcdir)/libc/sys/sysvi386/Makefile.inc $(srcdir)/libc/sys/sysvnecv70/Makefile.inc $(srcdir)/libc/sys/tic80/Makefile.inc $(srcdir)/libc/sys/tirtos/Makefile.inc $(srcdir)/libc/sys/w65/Makefile.inc $(srcdir)/libc/sys/z8ksim/Makefile.inc $(srcdir)/libc/machine/Makefile.inc $(srcdir)/libc/machine/aarch64/Makefile.inc $(srcdir)/libc/machine/amdgcn/Makefile.inc $(srcdir)/libc/machine/arc/Makefile.inc $(srcdir)/libc/machine/arm/Makefile.inc $(srcdir)/libc/machine/bfin/Makefile.inc $(srcdir)/libc/machine/cr16/Makefile.inc $(srcdir)/libc/machine/cris/Makefile.inc $(srcdir)/libc/machine/crx/Makefile.inc $(srcdir)/libc/machine/csky/Makefile.inc $(srcdir)/libc/machine/d10v/Makefile.inc $(srcdir)/libc/machine/d30v/Makefile.inc $(srcdir)/libc/machine/epiphany/Makefile.inc $(srcdir)/libc/machine/fr30/Makefile.inc $(srcdir)/libc/machine/frv/Makefile.inc $(srcdir)/libc/machine/ft32/Makefile.inc $(srcdir)/libc/machine/h8300/Makefile.inc $(srcdir)/libc/machine/h8500/Makefile.inc $(srcdir)/libc/machine/hppa/Makefile.inc $(srcdir)/libc/machine/i386/Makefile.inc $(srcdir)/libc/machine/i960/Makefile.inc $(srcdir)/libc/machine/iq2000/Makefile.inc $(srcdir)/libc/machine/lm32/Makefile.inc $(srcdir)/libc/machine/m32c/Makefile.inc $(srcdir)/libc/machine/m32r/Makefile.inc $(srcdir)/libc/machine/m68hc11/Makefile.inc $(srcdir)/libc/machine/m68k/Makefile.inc $(srcdir)/libc/machine/m88k/Makefile.inc $(srcdir)/libc/machine/mep/Makefile.inc $(srcdir)/libc/machine/microblaze/Makefile.inc $(srcdir)/libc/machine/mips/Makefile.inc $(srcdir)/libc/machine/mn10200/Makefile.inc $(srcdir)/libc/machine/mn10300/Makefile.inc $(srcdir)/libc/machine/moxie/Makefile.inc $(srcdir)/libc/machine/msp430/Makefile.inc $(srcdir)/libc/machine/mt/Makefile.inc $(srcdir)/libc/machine/nds32/Makefile.inc $(srcdir)/libc/machine/necv70/Makefile.inc $(srcdir)/libc/machine/nios2/Makefile.inc $(srcdir)/libc/machine/nvptx/Makefile.inc $(srcdir)/libc/machine/or1k/Makefile.inc $(srcdir)/libc/machine/powerpc/Makefile.inc $(srcdir)/libc/machine/pru/Makefile.inc $(srcdir)/libc/machine/riscv/Makefile.inc $(srcdir)/libc/machine/rl78/Makefile.inc $(srcdir)/libc/machine/rx/Makefile.inc $(srcdir)/libc/machine/sh/Makefile.inc $(srcdir)/libc/machine/sparc/Makefile.inc $(srcdir)/libc/machine/spu/Makefile.inc $(srcdir)/libc/machine/tic4x/Makefile.inc $(srcdir)/libc/machine/tic6x/Makefile.inc $(srcdir)/libc/machine/tic80/Makefile.inc $(srcdir)/libc/machine/v850/Makefile.inc $(srcdir)/libc/machine/visium/Makefile.inc $(srcdir)/libc/machine/w65/Makefile.inc $(srcdir)/libc/machine/x86_64/Makefile.inc $(srcdir)/libc/machine/xc16x/Makefile.inc $(srcdir)/libc/machine/xstormy16/Makefile.inc $(srcdir)/libc/machine/z8k/Makefile.inc $(srcdir)/libm/Makefile.inc $(srcdir)/libm/mathfp/Makefile.inc $(srcdir)/libm/math/Makefile.inc $(srcdir)/libm/common/Makefile.inc $(srcdir)/libm/ld/Makefile.inc $(srcdir)/libm/complex/Makefile.inc $(srcdir)/libm/fenv/Makefile.inc $(srcdir)/libm/test/Makefile.inc $(srcdir)/libm/machine/aarch64/Makefile.inc $(srcdir)/libm/ld128/Makefile.inc $(srcdir)/libm/machine/amdgcn/Makefile.inc $(srcdir)/libm/machine/arm/Makefile.inc $(srcdir)/libm/machine/i386/Makefile.inc $(srcdir)/libm/ld80/Makefile.inc $(srcdir)/libm/machine/mips/Makefile.inc $(srcdir)/libm/machine/nds32/Makefile.inc $(srcdir)/libm/machine/powerpc/Makefile.inc $(srcdir)/libm/machine/pru/Makefile.inc $(srcdir)/libm/machine/sparc/Makefile.inc $(srcdir)/libm/machine/spu/Makefile.inc $(srcdir)/libm/machine/riscv/Makefile.inc $(srcdir)/libm/machine/x86_64/Makefile.inc $(srcdir)/libm/ld80/Makefile.inc $(am__empty):
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
$(SHELL) ./config.status --recheck
@@ -10280,6 +10447,102 @@ libm/common/libm_a-log2l.$(OBJEXT): libm/common/$(am__dirstamp) \
libm/common/$(DEPDIR)/$(am__dirstamp)
libm/common/libm_a-sl_finite.$(OBJEXT): libm/common/$(am__dirstamp) \
libm/common/$(DEPDIR)/$(am__dirstamp)
+libm/ld/$(am__dirstamp):
+ @$(MKDIR_P) libm/ld
+ @: > libm/ld/$(am__dirstamp)
+libm/ld/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) libm/ld/$(DEPDIR)
+ @: > libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-e_acoshl.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-e_acosl.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-e_asinl.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-e_atan2l.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-e_atanhl.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-e_coshl.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-e_fmodl.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-e_lgammal.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-e_remainderl.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-e_sinhl.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-s_asinhl.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-s_atanl.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-s_cbrtl.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-s_ceill.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-s_copysignl.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-s_cosl.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-s_fabsl.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-fdiml.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-s_floorl.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-s_fmal.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-s_fmaxl.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-s_fminl.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-s_frexpl.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-s_ilogbl.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-s_llrintl.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-s_llroundl.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-s_logbl.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-s_lrint.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-s_lrintl.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-s_lround.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-s_lroundl.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-s_modfl.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-s_nearbyintl.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-s_nextafterl.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-s_nexttoward.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-s_nexttowardf.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-s_remquol.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-s_rintl.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-s_roundl.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-scalblnl.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-s_scalbnl.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-s_sinl.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-s_tanhl.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-s_tanl.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
+libm/ld/libm_a-s_truncl.$(OBJEXT): libm/ld/$(am__dirstamp) \
+ libm/ld/$(DEPDIR)/$(am__dirstamp)
libm/complex/$(am__dirstamp):
@$(MKDIR_P) libm/complex
@: > libm/complex/$(am__dirstamp)
@@ -10593,6 +10856,32 @@ libm/machine/aarch64/libm_a-fetestexcept.$(OBJEXT): \
libm/machine/aarch64/libm_a-feupdateenv.$(OBJEXT): \
libm/machine/aarch64/$(am__dirstamp) \
libm/machine/aarch64/$(DEPDIR)/$(am__dirstamp)
+libm/ld128/$(am__dirstamp):
+ @$(MKDIR_P) libm/ld128
+ @: > libm/ld128/$(am__dirstamp)
+libm/ld128/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) libm/ld128/$(DEPDIR)
+ @: > libm/ld128/$(DEPDIR)/$(am__dirstamp)
+libm/ld128/libm_a-e_powl.$(OBJEXT): libm/ld128/$(am__dirstamp) \
+ libm/ld128/$(DEPDIR)/$(am__dirstamp)
+libm/ld128/libm_a-s_erfl.$(OBJEXT): libm/ld128/$(am__dirstamp) \
+ libm/ld128/$(DEPDIR)/$(am__dirstamp)
+libm/ld128/libm_a-s_exp2l.$(OBJEXT): libm/ld128/$(am__dirstamp) \
+ libm/ld128/$(DEPDIR)/$(am__dirstamp)
+libm/ld128/libm_a-s_expl.$(OBJEXT): libm/ld128/$(am__dirstamp) \
+ libm/ld128/$(DEPDIR)/$(am__dirstamp)
+libm/ld128/libm_a-s_logl.$(OBJEXT): libm/ld128/$(am__dirstamp) \
+ libm/ld128/$(DEPDIR)/$(am__dirstamp)
+libm/ld128/libm_a-b_tgammal.$(OBJEXT): libm/ld128/$(am__dirstamp) \
+ libm/ld128/$(DEPDIR)/$(am__dirstamp)
+libm/ld128/libm_a-invtrig.$(OBJEXT): libm/ld128/$(am__dirstamp) \
+ libm/ld128/$(DEPDIR)/$(am__dirstamp)
+libm/ld128/libm_a-e_lgammal_r.$(OBJEXT): libm/ld128/$(am__dirstamp) \
+ libm/ld128/$(DEPDIR)/$(am__dirstamp)
+libm/ld128/libm_a-k_cosl.$(OBJEXT): libm/ld128/$(am__dirstamp) \
+ libm/ld128/$(DEPDIR)/$(am__dirstamp)
+libm/ld128/libm_a-k_sinl.$(OBJEXT): libm/ld128/$(am__dirstamp) \
+ libm/ld128/$(DEPDIR)/$(am__dirstamp)
libm/machine/amdgcn/$(am__dirstamp):
@$(MKDIR_P) libm/machine/amdgcn
@: > libm/machine/amdgcn/$(am__dirstamp)
@@ -11079,6 +11368,36 @@ libm/machine/i386/libm_a-fetestexcept.$(OBJEXT): \
libm/machine/i386/libm_a-feupdateenv.$(OBJEXT): \
libm/machine/i386/$(am__dirstamp) \
libm/machine/i386/$(DEPDIR)/$(am__dirstamp)
+libm/ld80/$(am__dirstamp):
+ @$(MKDIR_P) libm/ld80
+ @: > libm/ld80/$(am__dirstamp)
+libm/ld80/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) libm/ld80/$(DEPDIR)
+ @: > libm/ld80/$(DEPDIR)/$(am__dirstamp)
+libm/ld80/libm_a-b_tgammal.$(OBJEXT): libm/ld80/$(am__dirstamp) \
+ libm/ld80/$(DEPDIR)/$(am__dirstamp)
+libm/ld80/libm_a-e_powl.$(OBJEXT): libm/ld80/$(am__dirstamp) \
+ libm/ld80/$(DEPDIR)/$(am__dirstamp)
+libm/ld80/libm_a-s_erfl.$(OBJEXT): libm/ld80/$(am__dirstamp) \
+ libm/ld80/$(DEPDIR)/$(am__dirstamp)
+libm/ld80/libm_a-s_exp2l.$(OBJEXT): libm/ld80/$(am__dirstamp) \
+ libm/ld80/$(DEPDIR)/$(am__dirstamp)
+libm/ld80/libm_a-s_expl.$(OBJEXT): libm/ld80/$(am__dirstamp) \
+ libm/ld80/$(DEPDIR)/$(am__dirstamp)
+libm/ld80/libm_a-s_logl.$(OBJEXT): libm/ld80/$(am__dirstamp) \
+ libm/ld80/$(DEPDIR)/$(am__dirstamp)
+libm/ld80/libm_a-s_sinpil.$(OBJEXT): libm/ld80/$(am__dirstamp) \
+ libm/ld80/$(DEPDIR)/$(am__dirstamp)
+libm/ld80/libm_a-s_cospil.$(OBJEXT): libm/ld80/$(am__dirstamp) \
+ libm/ld80/$(DEPDIR)/$(am__dirstamp)
+libm/ld80/libm_a-invtrig.$(OBJEXT): libm/ld80/$(am__dirstamp) \
+ libm/ld80/$(DEPDIR)/$(am__dirstamp)
+libm/ld80/libm_a-e_lgammal_r.$(OBJEXT): libm/ld80/$(am__dirstamp) \
+ libm/ld80/$(DEPDIR)/$(am__dirstamp)
+libm/ld80/libm_a-k_cosl.$(OBJEXT): libm/ld80/$(am__dirstamp) \
+ libm/ld80/$(DEPDIR)/$(am__dirstamp)
+libm/ld80/libm_a-k_sinl.$(OBJEXT): libm/ld80/$(am__dirstamp) \
+ libm/ld80/$(DEPDIR)/$(am__dirstamp)
libm/machine/mips/$(am__dirstamp):
@$(MKDIR_P) libm/machine/mips
@: > libm/machine/mips/$(am__dirstamp)
@@ -12078,6 +12397,9 @@ mostlyclean-compile:
-rm -f libm/common/*.$(OBJEXT)
-rm -f libm/complex/*.$(OBJEXT)
-rm -f libm/fenv/*.$(OBJEXT)
+ -rm -f libm/ld/*.$(OBJEXT)
+ -rm -f libm/ld128/*.$(OBJEXT)
+ -rm -f libm/ld80/*.$(OBJEXT)
-rm -f libm/machine/aarch64/*.$(OBJEXT)
-rm -f libm/machine/amdgcn/*.$(OBJEXT)
-rm -f libm/machine/arm/*.$(OBJEXT)
@@ -13815,6 +14137,73 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@libm/fenv/$(DEPDIR)/libm_a-fesetround.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@libm/fenv/$(DEPDIR)/libm_a-fetestexcept.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@libm/fenv/$(DEPDIR)/libm_a-feupdateenv.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-e_acoshl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-e_acosl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-e_asinl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-e_atan2l.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-e_atanhl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-e_coshl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-e_fmodl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-e_lgammal.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-e_remainderl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-e_sinhl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-fdiml.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-s_asinhl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-s_atanl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-s_cbrtl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-s_ceill.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-s_copysignl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-s_cosl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-s_fabsl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-s_floorl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-s_fmal.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-s_fmaxl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-s_fminl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-s_frexpl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-s_ilogbl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-s_llrintl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-s_llroundl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-s_logbl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-s_lrint.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-s_lrintl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-s_lround.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-s_lroundl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-s_modfl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-s_nearbyintl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-s_nextafterl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-s_nexttoward.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-s_nexttowardf.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-s_remquol.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-s_rintl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-s_roundl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-s_scalbnl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-s_sinl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-s_tanhl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-s_tanl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-s_truncl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld/$(DEPDIR)/libm_a-scalblnl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld128/$(DEPDIR)/libm_a-b_tgammal.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld128/$(DEPDIR)/libm_a-e_lgammal_r.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld128/$(DEPDIR)/libm_a-e_powl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld128/$(DEPDIR)/libm_a-invtrig.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld128/$(DEPDIR)/libm_a-k_cosl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld128/$(DEPDIR)/libm_a-k_sinl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld128/$(DEPDIR)/libm_a-s_erfl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld128/$(DEPDIR)/libm_a-s_exp2l.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld128/$(DEPDIR)/libm_a-s_expl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld128/$(DEPDIR)/libm_a-s_logl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld80/$(DEPDIR)/libm_a-b_tgammal.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld80/$(DEPDIR)/libm_a-e_lgammal_r.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld80/$(DEPDIR)/libm_a-e_powl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld80/$(DEPDIR)/libm_a-invtrig.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld80/$(DEPDIR)/libm_a-k_cosl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld80/$(DEPDIR)/libm_a-k_sinl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld80/$(DEPDIR)/libm_a-s_cospil.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld80/$(DEPDIR)/libm_a-s_erfl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld80/$(DEPDIR)/libm_a-s_exp2l.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld80/$(DEPDIR)/libm_a-s_expl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld80/$(DEPDIR)/libm_a-s_logl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libm/ld80/$(DEPDIR)/libm_a-s_sinpil.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@libm/machine/aarch64/$(DEPDIR)/libm_a-e_sqrt.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@libm/machine/aarch64/$(DEPDIR)/libm_a-ef_sqrt.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@libm/machine/aarch64/$(DEPDIR)/libm_a-feclearexcept.Po@am__quote@
@@ -40855,6 +41244,636 @@ libm/common/libm_a-sl_finite.obj: libm/common/sl_finite.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/common/libm_a-sl_finite.obj `if test -f 'libm/common/sl_finite.c'; then $(CYGPATH_W) 'libm/common/sl_finite.c'; else $(CYGPATH_W) '$(srcdir)/libm/common/sl_finite.c'; fi`
+libm/ld/libm_a-e_acoshl.o: libm/ld/e_acoshl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-e_acoshl.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-e_acoshl.Tpo -c -o libm/ld/libm_a-e_acoshl.o `test -f 'libm/ld/e_acoshl.c' || echo '$(srcdir)/'`libm/ld/e_acoshl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-e_acoshl.Tpo libm/ld/$(DEPDIR)/libm_a-e_acoshl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/e_acoshl.c' object='libm/ld/libm_a-e_acoshl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-e_acoshl.o `test -f 'libm/ld/e_acoshl.c' || echo '$(srcdir)/'`libm/ld/e_acoshl.c
+
+libm/ld/libm_a-e_acoshl.obj: libm/ld/e_acoshl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-e_acoshl.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-e_acoshl.Tpo -c -o libm/ld/libm_a-e_acoshl.obj `if test -f 'libm/ld/e_acoshl.c'; then $(CYGPATH_W) 'libm/ld/e_acoshl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/e_acoshl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-e_acoshl.Tpo libm/ld/$(DEPDIR)/libm_a-e_acoshl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/e_acoshl.c' object='libm/ld/libm_a-e_acoshl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-e_acoshl.obj `if test -f 'libm/ld/e_acoshl.c'; then $(CYGPATH_W) 'libm/ld/e_acoshl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/e_acoshl.c'; fi`
+
+libm/ld/libm_a-e_acosl.o: libm/ld/e_acosl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-e_acosl.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-e_acosl.Tpo -c -o libm/ld/libm_a-e_acosl.o `test -f 'libm/ld/e_acosl.c' || echo '$(srcdir)/'`libm/ld/e_acosl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-e_acosl.Tpo libm/ld/$(DEPDIR)/libm_a-e_acosl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/e_acosl.c' object='libm/ld/libm_a-e_acosl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-e_acosl.o `test -f 'libm/ld/e_acosl.c' || echo '$(srcdir)/'`libm/ld/e_acosl.c
+
+libm/ld/libm_a-e_acosl.obj: libm/ld/e_acosl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-e_acosl.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-e_acosl.Tpo -c -o libm/ld/libm_a-e_acosl.obj `if test -f 'libm/ld/e_acosl.c'; then $(CYGPATH_W) 'libm/ld/e_acosl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/e_acosl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-e_acosl.Tpo libm/ld/$(DEPDIR)/libm_a-e_acosl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/e_acosl.c' object='libm/ld/libm_a-e_acosl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-e_acosl.obj `if test -f 'libm/ld/e_acosl.c'; then $(CYGPATH_W) 'libm/ld/e_acosl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/e_acosl.c'; fi`
+
+libm/ld/libm_a-e_asinl.o: libm/ld/e_asinl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-e_asinl.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-e_asinl.Tpo -c -o libm/ld/libm_a-e_asinl.o `test -f 'libm/ld/e_asinl.c' || echo '$(srcdir)/'`libm/ld/e_asinl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-e_asinl.Tpo libm/ld/$(DEPDIR)/libm_a-e_asinl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/e_asinl.c' object='libm/ld/libm_a-e_asinl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-e_asinl.o `test -f 'libm/ld/e_asinl.c' || echo '$(srcdir)/'`libm/ld/e_asinl.c
+
+libm/ld/libm_a-e_asinl.obj: libm/ld/e_asinl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-e_asinl.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-e_asinl.Tpo -c -o libm/ld/libm_a-e_asinl.obj `if test -f 'libm/ld/e_asinl.c'; then $(CYGPATH_W) 'libm/ld/e_asinl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/e_asinl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-e_asinl.Tpo libm/ld/$(DEPDIR)/libm_a-e_asinl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/e_asinl.c' object='libm/ld/libm_a-e_asinl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-e_asinl.obj `if test -f 'libm/ld/e_asinl.c'; then $(CYGPATH_W) 'libm/ld/e_asinl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/e_asinl.c'; fi`
+
+libm/ld/libm_a-e_atan2l.o: libm/ld/e_atan2l.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-e_atan2l.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-e_atan2l.Tpo -c -o libm/ld/libm_a-e_atan2l.o `test -f 'libm/ld/e_atan2l.c' || echo '$(srcdir)/'`libm/ld/e_atan2l.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-e_atan2l.Tpo libm/ld/$(DEPDIR)/libm_a-e_atan2l.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/e_atan2l.c' object='libm/ld/libm_a-e_atan2l.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-e_atan2l.o `test -f 'libm/ld/e_atan2l.c' || echo '$(srcdir)/'`libm/ld/e_atan2l.c
+
+libm/ld/libm_a-e_atan2l.obj: libm/ld/e_atan2l.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-e_atan2l.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-e_atan2l.Tpo -c -o libm/ld/libm_a-e_atan2l.obj `if test -f 'libm/ld/e_atan2l.c'; then $(CYGPATH_W) 'libm/ld/e_atan2l.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/e_atan2l.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-e_atan2l.Tpo libm/ld/$(DEPDIR)/libm_a-e_atan2l.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/e_atan2l.c' object='libm/ld/libm_a-e_atan2l.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-e_atan2l.obj `if test -f 'libm/ld/e_atan2l.c'; then $(CYGPATH_W) 'libm/ld/e_atan2l.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/e_atan2l.c'; fi`
+
+libm/ld/libm_a-e_atanhl.o: libm/ld/e_atanhl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-e_atanhl.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-e_atanhl.Tpo -c -o libm/ld/libm_a-e_atanhl.o `test -f 'libm/ld/e_atanhl.c' || echo '$(srcdir)/'`libm/ld/e_atanhl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-e_atanhl.Tpo libm/ld/$(DEPDIR)/libm_a-e_atanhl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/e_atanhl.c' object='libm/ld/libm_a-e_atanhl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-e_atanhl.o `test -f 'libm/ld/e_atanhl.c' || echo '$(srcdir)/'`libm/ld/e_atanhl.c
+
+libm/ld/libm_a-e_atanhl.obj: libm/ld/e_atanhl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-e_atanhl.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-e_atanhl.Tpo -c -o libm/ld/libm_a-e_atanhl.obj `if test -f 'libm/ld/e_atanhl.c'; then $(CYGPATH_W) 'libm/ld/e_atanhl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/e_atanhl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-e_atanhl.Tpo libm/ld/$(DEPDIR)/libm_a-e_atanhl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/e_atanhl.c' object='libm/ld/libm_a-e_atanhl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-e_atanhl.obj `if test -f 'libm/ld/e_atanhl.c'; then $(CYGPATH_W) 'libm/ld/e_atanhl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/e_atanhl.c'; fi`
+
+libm/ld/libm_a-e_coshl.o: libm/ld/e_coshl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-e_coshl.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-e_coshl.Tpo -c -o libm/ld/libm_a-e_coshl.o `test -f 'libm/ld/e_coshl.c' || echo '$(srcdir)/'`libm/ld/e_coshl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-e_coshl.Tpo libm/ld/$(DEPDIR)/libm_a-e_coshl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/e_coshl.c' object='libm/ld/libm_a-e_coshl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-e_coshl.o `test -f 'libm/ld/e_coshl.c' || echo '$(srcdir)/'`libm/ld/e_coshl.c
+
+libm/ld/libm_a-e_coshl.obj: libm/ld/e_coshl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-e_coshl.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-e_coshl.Tpo -c -o libm/ld/libm_a-e_coshl.obj `if test -f 'libm/ld/e_coshl.c'; then $(CYGPATH_W) 'libm/ld/e_coshl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/e_coshl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-e_coshl.Tpo libm/ld/$(DEPDIR)/libm_a-e_coshl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/e_coshl.c' object='libm/ld/libm_a-e_coshl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-e_coshl.obj `if test -f 'libm/ld/e_coshl.c'; then $(CYGPATH_W) 'libm/ld/e_coshl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/e_coshl.c'; fi`
+
+libm/ld/libm_a-e_fmodl.o: libm/ld/e_fmodl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-e_fmodl.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-e_fmodl.Tpo -c -o libm/ld/libm_a-e_fmodl.o `test -f 'libm/ld/e_fmodl.c' || echo '$(srcdir)/'`libm/ld/e_fmodl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-e_fmodl.Tpo libm/ld/$(DEPDIR)/libm_a-e_fmodl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/e_fmodl.c' object='libm/ld/libm_a-e_fmodl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-e_fmodl.o `test -f 'libm/ld/e_fmodl.c' || echo '$(srcdir)/'`libm/ld/e_fmodl.c
+
+libm/ld/libm_a-e_fmodl.obj: libm/ld/e_fmodl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-e_fmodl.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-e_fmodl.Tpo -c -o libm/ld/libm_a-e_fmodl.obj `if test -f 'libm/ld/e_fmodl.c'; then $(CYGPATH_W) 'libm/ld/e_fmodl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/e_fmodl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-e_fmodl.Tpo libm/ld/$(DEPDIR)/libm_a-e_fmodl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/e_fmodl.c' object='libm/ld/libm_a-e_fmodl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-e_fmodl.obj `if test -f 'libm/ld/e_fmodl.c'; then $(CYGPATH_W) 'libm/ld/e_fmodl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/e_fmodl.c'; fi`
+
+libm/ld/libm_a-e_lgammal.o: libm/ld/e_lgammal.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-e_lgammal.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-e_lgammal.Tpo -c -o libm/ld/libm_a-e_lgammal.o `test -f 'libm/ld/e_lgammal.c' || echo '$(srcdir)/'`libm/ld/e_lgammal.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-e_lgammal.Tpo libm/ld/$(DEPDIR)/libm_a-e_lgammal.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/e_lgammal.c' object='libm/ld/libm_a-e_lgammal.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-e_lgammal.o `test -f 'libm/ld/e_lgammal.c' || echo '$(srcdir)/'`libm/ld/e_lgammal.c
+
+libm/ld/libm_a-e_lgammal.obj: libm/ld/e_lgammal.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-e_lgammal.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-e_lgammal.Tpo -c -o libm/ld/libm_a-e_lgammal.obj `if test -f 'libm/ld/e_lgammal.c'; then $(CYGPATH_W) 'libm/ld/e_lgammal.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/e_lgammal.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-e_lgammal.Tpo libm/ld/$(DEPDIR)/libm_a-e_lgammal.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/e_lgammal.c' object='libm/ld/libm_a-e_lgammal.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-e_lgammal.obj `if test -f 'libm/ld/e_lgammal.c'; then $(CYGPATH_W) 'libm/ld/e_lgammal.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/e_lgammal.c'; fi`
+
+libm/ld/libm_a-e_remainderl.o: libm/ld/e_remainderl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-e_remainderl.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-e_remainderl.Tpo -c -o libm/ld/libm_a-e_remainderl.o `test -f 'libm/ld/e_remainderl.c' || echo '$(srcdir)/'`libm/ld/e_remainderl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-e_remainderl.Tpo libm/ld/$(DEPDIR)/libm_a-e_remainderl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/e_remainderl.c' object='libm/ld/libm_a-e_remainderl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-e_remainderl.o `test -f 'libm/ld/e_remainderl.c' || echo '$(srcdir)/'`libm/ld/e_remainderl.c
+
+libm/ld/libm_a-e_remainderl.obj: libm/ld/e_remainderl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-e_remainderl.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-e_remainderl.Tpo -c -o libm/ld/libm_a-e_remainderl.obj `if test -f 'libm/ld/e_remainderl.c'; then $(CYGPATH_W) 'libm/ld/e_remainderl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/e_remainderl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-e_remainderl.Tpo libm/ld/$(DEPDIR)/libm_a-e_remainderl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/e_remainderl.c' object='libm/ld/libm_a-e_remainderl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-e_remainderl.obj `if test -f 'libm/ld/e_remainderl.c'; then $(CYGPATH_W) 'libm/ld/e_remainderl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/e_remainderl.c'; fi`
+
+libm/ld/libm_a-e_sinhl.o: libm/ld/e_sinhl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-e_sinhl.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-e_sinhl.Tpo -c -o libm/ld/libm_a-e_sinhl.o `test -f 'libm/ld/e_sinhl.c' || echo '$(srcdir)/'`libm/ld/e_sinhl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-e_sinhl.Tpo libm/ld/$(DEPDIR)/libm_a-e_sinhl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/e_sinhl.c' object='libm/ld/libm_a-e_sinhl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-e_sinhl.o `test -f 'libm/ld/e_sinhl.c' || echo '$(srcdir)/'`libm/ld/e_sinhl.c
+
+libm/ld/libm_a-e_sinhl.obj: libm/ld/e_sinhl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-e_sinhl.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-e_sinhl.Tpo -c -o libm/ld/libm_a-e_sinhl.obj `if test -f 'libm/ld/e_sinhl.c'; then $(CYGPATH_W) 'libm/ld/e_sinhl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/e_sinhl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-e_sinhl.Tpo libm/ld/$(DEPDIR)/libm_a-e_sinhl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/e_sinhl.c' object='libm/ld/libm_a-e_sinhl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-e_sinhl.obj `if test -f 'libm/ld/e_sinhl.c'; then $(CYGPATH_W) 'libm/ld/e_sinhl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/e_sinhl.c'; fi`
+
+libm/ld/libm_a-s_asinhl.o: libm/ld/s_asinhl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_asinhl.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_asinhl.Tpo -c -o libm/ld/libm_a-s_asinhl.o `test -f 'libm/ld/s_asinhl.c' || echo '$(srcdir)/'`libm/ld/s_asinhl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_asinhl.Tpo libm/ld/$(DEPDIR)/libm_a-s_asinhl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_asinhl.c' object='libm/ld/libm_a-s_asinhl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_asinhl.o `test -f 'libm/ld/s_asinhl.c' || echo '$(srcdir)/'`libm/ld/s_asinhl.c
+
+libm/ld/libm_a-s_asinhl.obj: libm/ld/s_asinhl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_asinhl.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_asinhl.Tpo -c -o libm/ld/libm_a-s_asinhl.obj `if test -f 'libm/ld/s_asinhl.c'; then $(CYGPATH_W) 'libm/ld/s_asinhl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_asinhl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_asinhl.Tpo libm/ld/$(DEPDIR)/libm_a-s_asinhl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_asinhl.c' object='libm/ld/libm_a-s_asinhl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_asinhl.obj `if test -f 'libm/ld/s_asinhl.c'; then $(CYGPATH_W) 'libm/ld/s_asinhl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_asinhl.c'; fi`
+
+libm/ld/libm_a-s_atanl.o: libm/ld/s_atanl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_atanl.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_atanl.Tpo -c -o libm/ld/libm_a-s_atanl.o `test -f 'libm/ld/s_atanl.c' || echo '$(srcdir)/'`libm/ld/s_atanl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_atanl.Tpo libm/ld/$(DEPDIR)/libm_a-s_atanl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_atanl.c' object='libm/ld/libm_a-s_atanl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_atanl.o `test -f 'libm/ld/s_atanl.c' || echo '$(srcdir)/'`libm/ld/s_atanl.c
+
+libm/ld/libm_a-s_atanl.obj: libm/ld/s_atanl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_atanl.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_atanl.Tpo -c -o libm/ld/libm_a-s_atanl.obj `if test -f 'libm/ld/s_atanl.c'; then $(CYGPATH_W) 'libm/ld/s_atanl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_atanl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_atanl.Tpo libm/ld/$(DEPDIR)/libm_a-s_atanl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_atanl.c' object='libm/ld/libm_a-s_atanl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_atanl.obj `if test -f 'libm/ld/s_atanl.c'; then $(CYGPATH_W) 'libm/ld/s_atanl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_atanl.c'; fi`
+
+libm/ld/libm_a-s_cbrtl.o: libm/ld/s_cbrtl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_cbrtl.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_cbrtl.Tpo -c -o libm/ld/libm_a-s_cbrtl.o `test -f 'libm/ld/s_cbrtl.c' || echo '$(srcdir)/'`libm/ld/s_cbrtl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_cbrtl.Tpo libm/ld/$(DEPDIR)/libm_a-s_cbrtl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_cbrtl.c' object='libm/ld/libm_a-s_cbrtl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_cbrtl.o `test -f 'libm/ld/s_cbrtl.c' || echo '$(srcdir)/'`libm/ld/s_cbrtl.c
+
+libm/ld/libm_a-s_cbrtl.obj: libm/ld/s_cbrtl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_cbrtl.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_cbrtl.Tpo -c -o libm/ld/libm_a-s_cbrtl.obj `if test -f 'libm/ld/s_cbrtl.c'; then $(CYGPATH_W) 'libm/ld/s_cbrtl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_cbrtl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_cbrtl.Tpo libm/ld/$(DEPDIR)/libm_a-s_cbrtl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_cbrtl.c' object='libm/ld/libm_a-s_cbrtl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_cbrtl.obj `if test -f 'libm/ld/s_cbrtl.c'; then $(CYGPATH_W) 'libm/ld/s_cbrtl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_cbrtl.c'; fi`
+
+libm/ld/libm_a-s_ceill.o: libm/ld/s_ceill.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_ceill.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_ceill.Tpo -c -o libm/ld/libm_a-s_ceill.o `test -f 'libm/ld/s_ceill.c' || echo '$(srcdir)/'`libm/ld/s_ceill.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_ceill.Tpo libm/ld/$(DEPDIR)/libm_a-s_ceill.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_ceill.c' object='libm/ld/libm_a-s_ceill.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_ceill.o `test -f 'libm/ld/s_ceill.c' || echo '$(srcdir)/'`libm/ld/s_ceill.c
+
+libm/ld/libm_a-s_ceill.obj: libm/ld/s_ceill.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_ceill.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_ceill.Tpo -c -o libm/ld/libm_a-s_ceill.obj `if test -f 'libm/ld/s_ceill.c'; then $(CYGPATH_W) 'libm/ld/s_ceill.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_ceill.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_ceill.Tpo libm/ld/$(DEPDIR)/libm_a-s_ceill.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_ceill.c' object='libm/ld/libm_a-s_ceill.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_ceill.obj `if test -f 'libm/ld/s_ceill.c'; then $(CYGPATH_W) 'libm/ld/s_ceill.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_ceill.c'; fi`
+
+libm/ld/libm_a-s_copysignl.o: libm/ld/s_copysignl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_copysignl.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_copysignl.Tpo -c -o libm/ld/libm_a-s_copysignl.o `test -f 'libm/ld/s_copysignl.c' || echo '$(srcdir)/'`libm/ld/s_copysignl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_copysignl.Tpo libm/ld/$(DEPDIR)/libm_a-s_copysignl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_copysignl.c' object='libm/ld/libm_a-s_copysignl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_copysignl.o `test -f 'libm/ld/s_copysignl.c' || echo '$(srcdir)/'`libm/ld/s_copysignl.c
+
+libm/ld/libm_a-s_copysignl.obj: libm/ld/s_copysignl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_copysignl.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_copysignl.Tpo -c -o libm/ld/libm_a-s_copysignl.obj `if test -f 'libm/ld/s_copysignl.c'; then $(CYGPATH_W) 'libm/ld/s_copysignl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_copysignl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_copysignl.Tpo libm/ld/$(DEPDIR)/libm_a-s_copysignl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_copysignl.c' object='libm/ld/libm_a-s_copysignl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_copysignl.obj `if test -f 'libm/ld/s_copysignl.c'; then $(CYGPATH_W) 'libm/ld/s_copysignl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_copysignl.c'; fi`
+
+libm/ld/libm_a-s_cosl.o: libm/ld/s_cosl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_cosl.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_cosl.Tpo -c -o libm/ld/libm_a-s_cosl.o `test -f 'libm/ld/s_cosl.c' || echo '$(srcdir)/'`libm/ld/s_cosl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_cosl.Tpo libm/ld/$(DEPDIR)/libm_a-s_cosl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_cosl.c' object='libm/ld/libm_a-s_cosl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_cosl.o `test -f 'libm/ld/s_cosl.c' || echo '$(srcdir)/'`libm/ld/s_cosl.c
+
+libm/ld/libm_a-s_cosl.obj: libm/ld/s_cosl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_cosl.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_cosl.Tpo -c -o libm/ld/libm_a-s_cosl.obj `if test -f 'libm/ld/s_cosl.c'; then $(CYGPATH_W) 'libm/ld/s_cosl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_cosl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_cosl.Tpo libm/ld/$(DEPDIR)/libm_a-s_cosl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_cosl.c' object='libm/ld/libm_a-s_cosl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_cosl.obj `if test -f 'libm/ld/s_cosl.c'; then $(CYGPATH_W) 'libm/ld/s_cosl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_cosl.c'; fi`
+
+libm/ld/libm_a-s_fabsl.o: libm/ld/s_fabsl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_fabsl.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_fabsl.Tpo -c -o libm/ld/libm_a-s_fabsl.o `test -f 'libm/ld/s_fabsl.c' || echo '$(srcdir)/'`libm/ld/s_fabsl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_fabsl.Tpo libm/ld/$(DEPDIR)/libm_a-s_fabsl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_fabsl.c' object='libm/ld/libm_a-s_fabsl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_fabsl.o `test -f 'libm/ld/s_fabsl.c' || echo '$(srcdir)/'`libm/ld/s_fabsl.c
+
+libm/ld/libm_a-s_fabsl.obj: libm/ld/s_fabsl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_fabsl.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_fabsl.Tpo -c -o libm/ld/libm_a-s_fabsl.obj `if test -f 'libm/ld/s_fabsl.c'; then $(CYGPATH_W) 'libm/ld/s_fabsl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_fabsl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_fabsl.Tpo libm/ld/$(DEPDIR)/libm_a-s_fabsl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_fabsl.c' object='libm/ld/libm_a-s_fabsl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_fabsl.obj `if test -f 'libm/ld/s_fabsl.c'; then $(CYGPATH_W) 'libm/ld/s_fabsl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_fabsl.c'; fi`
+
+libm/ld/libm_a-fdiml.o: libm/ld/fdiml.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-fdiml.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-fdiml.Tpo -c -o libm/ld/libm_a-fdiml.o `test -f 'libm/ld/fdiml.c' || echo '$(srcdir)/'`libm/ld/fdiml.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-fdiml.Tpo libm/ld/$(DEPDIR)/libm_a-fdiml.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/fdiml.c' object='libm/ld/libm_a-fdiml.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-fdiml.o `test -f 'libm/ld/fdiml.c' || echo '$(srcdir)/'`libm/ld/fdiml.c
+
+libm/ld/libm_a-fdiml.obj: libm/ld/fdiml.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-fdiml.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-fdiml.Tpo -c -o libm/ld/libm_a-fdiml.obj `if test -f 'libm/ld/fdiml.c'; then $(CYGPATH_W) 'libm/ld/fdiml.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/fdiml.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-fdiml.Tpo libm/ld/$(DEPDIR)/libm_a-fdiml.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/fdiml.c' object='libm/ld/libm_a-fdiml.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-fdiml.obj `if test -f 'libm/ld/fdiml.c'; then $(CYGPATH_W) 'libm/ld/fdiml.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/fdiml.c'; fi`
+
+libm/ld/libm_a-s_floorl.o: libm/ld/s_floorl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_floorl.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_floorl.Tpo -c -o libm/ld/libm_a-s_floorl.o `test -f 'libm/ld/s_floorl.c' || echo '$(srcdir)/'`libm/ld/s_floorl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_floorl.Tpo libm/ld/$(DEPDIR)/libm_a-s_floorl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_floorl.c' object='libm/ld/libm_a-s_floorl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_floorl.o `test -f 'libm/ld/s_floorl.c' || echo '$(srcdir)/'`libm/ld/s_floorl.c
+
+libm/ld/libm_a-s_floorl.obj: libm/ld/s_floorl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_floorl.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_floorl.Tpo -c -o libm/ld/libm_a-s_floorl.obj `if test -f 'libm/ld/s_floorl.c'; then $(CYGPATH_W) 'libm/ld/s_floorl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_floorl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_floorl.Tpo libm/ld/$(DEPDIR)/libm_a-s_floorl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_floorl.c' object='libm/ld/libm_a-s_floorl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_floorl.obj `if test -f 'libm/ld/s_floorl.c'; then $(CYGPATH_W) 'libm/ld/s_floorl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_floorl.c'; fi`
+
+libm/ld/libm_a-s_fmal.o: libm/ld/s_fmal.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_fmal.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_fmal.Tpo -c -o libm/ld/libm_a-s_fmal.o `test -f 'libm/ld/s_fmal.c' || echo '$(srcdir)/'`libm/ld/s_fmal.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_fmal.Tpo libm/ld/$(DEPDIR)/libm_a-s_fmal.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_fmal.c' object='libm/ld/libm_a-s_fmal.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_fmal.o `test -f 'libm/ld/s_fmal.c' || echo '$(srcdir)/'`libm/ld/s_fmal.c
+
+libm/ld/libm_a-s_fmal.obj: libm/ld/s_fmal.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_fmal.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_fmal.Tpo -c -o libm/ld/libm_a-s_fmal.obj `if test -f 'libm/ld/s_fmal.c'; then $(CYGPATH_W) 'libm/ld/s_fmal.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_fmal.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_fmal.Tpo libm/ld/$(DEPDIR)/libm_a-s_fmal.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_fmal.c' object='libm/ld/libm_a-s_fmal.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_fmal.obj `if test -f 'libm/ld/s_fmal.c'; then $(CYGPATH_W) 'libm/ld/s_fmal.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_fmal.c'; fi`
+
+libm/ld/libm_a-s_fmaxl.o: libm/ld/s_fmaxl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_fmaxl.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_fmaxl.Tpo -c -o libm/ld/libm_a-s_fmaxl.o `test -f 'libm/ld/s_fmaxl.c' || echo '$(srcdir)/'`libm/ld/s_fmaxl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_fmaxl.Tpo libm/ld/$(DEPDIR)/libm_a-s_fmaxl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_fmaxl.c' object='libm/ld/libm_a-s_fmaxl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_fmaxl.o `test -f 'libm/ld/s_fmaxl.c' || echo '$(srcdir)/'`libm/ld/s_fmaxl.c
+
+libm/ld/libm_a-s_fmaxl.obj: libm/ld/s_fmaxl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_fmaxl.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_fmaxl.Tpo -c -o libm/ld/libm_a-s_fmaxl.obj `if test -f 'libm/ld/s_fmaxl.c'; then $(CYGPATH_W) 'libm/ld/s_fmaxl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_fmaxl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_fmaxl.Tpo libm/ld/$(DEPDIR)/libm_a-s_fmaxl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_fmaxl.c' object='libm/ld/libm_a-s_fmaxl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_fmaxl.obj `if test -f 'libm/ld/s_fmaxl.c'; then $(CYGPATH_W) 'libm/ld/s_fmaxl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_fmaxl.c'; fi`
+
+libm/ld/libm_a-s_fminl.o: libm/ld/s_fminl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_fminl.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_fminl.Tpo -c -o libm/ld/libm_a-s_fminl.o `test -f 'libm/ld/s_fminl.c' || echo '$(srcdir)/'`libm/ld/s_fminl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_fminl.Tpo libm/ld/$(DEPDIR)/libm_a-s_fminl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_fminl.c' object='libm/ld/libm_a-s_fminl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_fminl.o `test -f 'libm/ld/s_fminl.c' || echo '$(srcdir)/'`libm/ld/s_fminl.c
+
+libm/ld/libm_a-s_fminl.obj: libm/ld/s_fminl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_fminl.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_fminl.Tpo -c -o libm/ld/libm_a-s_fminl.obj `if test -f 'libm/ld/s_fminl.c'; then $(CYGPATH_W) 'libm/ld/s_fminl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_fminl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_fminl.Tpo libm/ld/$(DEPDIR)/libm_a-s_fminl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_fminl.c' object='libm/ld/libm_a-s_fminl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_fminl.obj `if test -f 'libm/ld/s_fminl.c'; then $(CYGPATH_W) 'libm/ld/s_fminl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_fminl.c'; fi`
+
+libm/ld/libm_a-s_frexpl.o: libm/ld/s_frexpl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_frexpl.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_frexpl.Tpo -c -o libm/ld/libm_a-s_frexpl.o `test -f 'libm/ld/s_frexpl.c' || echo '$(srcdir)/'`libm/ld/s_frexpl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_frexpl.Tpo libm/ld/$(DEPDIR)/libm_a-s_frexpl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_frexpl.c' object='libm/ld/libm_a-s_frexpl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_frexpl.o `test -f 'libm/ld/s_frexpl.c' || echo '$(srcdir)/'`libm/ld/s_frexpl.c
+
+libm/ld/libm_a-s_frexpl.obj: libm/ld/s_frexpl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_frexpl.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_frexpl.Tpo -c -o libm/ld/libm_a-s_frexpl.obj `if test -f 'libm/ld/s_frexpl.c'; then $(CYGPATH_W) 'libm/ld/s_frexpl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_frexpl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_frexpl.Tpo libm/ld/$(DEPDIR)/libm_a-s_frexpl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_frexpl.c' object='libm/ld/libm_a-s_frexpl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_frexpl.obj `if test -f 'libm/ld/s_frexpl.c'; then $(CYGPATH_W) 'libm/ld/s_frexpl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_frexpl.c'; fi`
+
+libm/ld/libm_a-s_ilogbl.o: libm/ld/s_ilogbl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_ilogbl.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_ilogbl.Tpo -c -o libm/ld/libm_a-s_ilogbl.o `test -f 'libm/ld/s_ilogbl.c' || echo '$(srcdir)/'`libm/ld/s_ilogbl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_ilogbl.Tpo libm/ld/$(DEPDIR)/libm_a-s_ilogbl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_ilogbl.c' object='libm/ld/libm_a-s_ilogbl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_ilogbl.o `test -f 'libm/ld/s_ilogbl.c' || echo '$(srcdir)/'`libm/ld/s_ilogbl.c
+
+libm/ld/libm_a-s_ilogbl.obj: libm/ld/s_ilogbl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_ilogbl.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_ilogbl.Tpo -c -o libm/ld/libm_a-s_ilogbl.obj `if test -f 'libm/ld/s_ilogbl.c'; then $(CYGPATH_W) 'libm/ld/s_ilogbl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_ilogbl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_ilogbl.Tpo libm/ld/$(DEPDIR)/libm_a-s_ilogbl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_ilogbl.c' object='libm/ld/libm_a-s_ilogbl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_ilogbl.obj `if test -f 'libm/ld/s_ilogbl.c'; then $(CYGPATH_W) 'libm/ld/s_ilogbl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_ilogbl.c'; fi`
+
+libm/ld/libm_a-s_llrintl.o: libm/ld/s_llrintl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_llrintl.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_llrintl.Tpo -c -o libm/ld/libm_a-s_llrintl.o `test -f 'libm/ld/s_llrintl.c' || echo '$(srcdir)/'`libm/ld/s_llrintl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_llrintl.Tpo libm/ld/$(DEPDIR)/libm_a-s_llrintl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_llrintl.c' object='libm/ld/libm_a-s_llrintl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_llrintl.o `test -f 'libm/ld/s_llrintl.c' || echo '$(srcdir)/'`libm/ld/s_llrintl.c
+
+libm/ld/libm_a-s_llrintl.obj: libm/ld/s_llrintl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_llrintl.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_llrintl.Tpo -c -o libm/ld/libm_a-s_llrintl.obj `if test -f 'libm/ld/s_llrintl.c'; then $(CYGPATH_W) 'libm/ld/s_llrintl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_llrintl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_llrintl.Tpo libm/ld/$(DEPDIR)/libm_a-s_llrintl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_llrintl.c' object='libm/ld/libm_a-s_llrintl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_llrintl.obj `if test -f 'libm/ld/s_llrintl.c'; then $(CYGPATH_W) 'libm/ld/s_llrintl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_llrintl.c'; fi`
+
+libm/ld/libm_a-s_llroundl.o: libm/ld/s_llroundl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_llroundl.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_llroundl.Tpo -c -o libm/ld/libm_a-s_llroundl.o `test -f 'libm/ld/s_llroundl.c' || echo '$(srcdir)/'`libm/ld/s_llroundl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_llroundl.Tpo libm/ld/$(DEPDIR)/libm_a-s_llroundl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_llroundl.c' object='libm/ld/libm_a-s_llroundl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_llroundl.o `test -f 'libm/ld/s_llroundl.c' || echo '$(srcdir)/'`libm/ld/s_llroundl.c
+
+libm/ld/libm_a-s_llroundl.obj: libm/ld/s_llroundl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_llroundl.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_llroundl.Tpo -c -o libm/ld/libm_a-s_llroundl.obj `if test -f 'libm/ld/s_llroundl.c'; then $(CYGPATH_W) 'libm/ld/s_llroundl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_llroundl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_llroundl.Tpo libm/ld/$(DEPDIR)/libm_a-s_llroundl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_llroundl.c' object='libm/ld/libm_a-s_llroundl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_llroundl.obj `if test -f 'libm/ld/s_llroundl.c'; then $(CYGPATH_W) 'libm/ld/s_llroundl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_llroundl.c'; fi`
+
+libm/ld/libm_a-s_logbl.o: libm/ld/s_logbl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_logbl.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_logbl.Tpo -c -o libm/ld/libm_a-s_logbl.o `test -f 'libm/ld/s_logbl.c' || echo '$(srcdir)/'`libm/ld/s_logbl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_logbl.Tpo libm/ld/$(DEPDIR)/libm_a-s_logbl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_logbl.c' object='libm/ld/libm_a-s_logbl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_logbl.o `test -f 'libm/ld/s_logbl.c' || echo '$(srcdir)/'`libm/ld/s_logbl.c
+
+libm/ld/libm_a-s_logbl.obj: libm/ld/s_logbl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_logbl.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_logbl.Tpo -c -o libm/ld/libm_a-s_logbl.obj `if test -f 'libm/ld/s_logbl.c'; then $(CYGPATH_W) 'libm/ld/s_logbl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_logbl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_logbl.Tpo libm/ld/$(DEPDIR)/libm_a-s_logbl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_logbl.c' object='libm/ld/libm_a-s_logbl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_logbl.obj `if test -f 'libm/ld/s_logbl.c'; then $(CYGPATH_W) 'libm/ld/s_logbl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_logbl.c'; fi`
+
+libm/ld/libm_a-s_lrint.o: libm/ld/s_lrint.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_lrint.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_lrint.Tpo -c -o libm/ld/libm_a-s_lrint.o `test -f 'libm/ld/s_lrint.c' || echo '$(srcdir)/'`libm/ld/s_lrint.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_lrint.Tpo libm/ld/$(DEPDIR)/libm_a-s_lrint.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_lrint.c' object='libm/ld/libm_a-s_lrint.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_lrint.o `test -f 'libm/ld/s_lrint.c' || echo '$(srcdir)/'`libm/ld/s_lrint.c
+
+libm/ld/libm_a-s_lrint.obj: libm/ld/s_lrint.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_lrint.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_lrint.Tpo -c -o libm/ld/libm_a-s_lrint.obj `if test -f 'libm/ld/s_lrint.c'; then $(CYGPATH_W) 'libm/ld/s_lrint.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_lrint.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_lrint.Tpo libm/ld/$(DEPDIR)/libm_a-s_lrint.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_lrint.c' object='libm/ld/libm_a-s_lrint.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_lrint.obj `if test -f 'libm/ld/s_lrint.c'; then $(CYGPATH_W) 'libm/ld/s_lrint.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_lrint.c'; fi`
+
+libm/ld/libm_a-s_lrintl.o: libm/ld/s_lrintl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_lrintl.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_lrintl.Tpo -c -o libm/ld/libm_a-s_lrintl.o `test -f 'libm/ld/s_lrintl.c' || echo '$(srcdir)/'`libm/ld/s_lrintl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_lrintl.Tpo libm/ld/$(DEPDIR)/libm_a-s_lrintl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_lrintl.c' object='libm/ld/libm_a-s_lrintl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_lrintl.o `test -f 'libm/ld/s_lrintl.c' || echo '$(srcdir)/'`libm/ld/s_lrintl.c
+
+libm/ld/libm_a-s_lrintl.obj: libm/ld/s_lrintl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_lrintl.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_lrintl.Tpo -c -o libm/ld/libm_a-s_lrintl.obj `if test -f 'libm/ld/s_lrintl.c'; then $(CYGPATH_W) 'libm/ld/s_lrintl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_lrintl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_lrintl.Tpo libm/ld/$(DEPDIR)/libm_a-s_lrintl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_lrintl.c' object='libm/ld/libm_a-s_lrintl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_lrintl.obj `if test -f 'libm/ld/s_lrintl.c'; then $(CYGPATH_W) 'libm/ld/s_lrintl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_lrintl.c'; fi`
+
+libm/ld/libm_a-s_lround.o: libm/ld/s_lround.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_lround.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_lround.Tpo -c -o libm/ld/libm_a-s_lround.o `test -f 'libm/ld/s_lround.c' || echo '$(srcdir)/'`libm/ld/s_lround.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_lround.Tpo libm/ld/$(DEPDIR)/libm_a-s_lround.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_lround.c' object='libm/ld/libm_a-s_lround.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_lround.o `test -f 'libm/ld/s_lround.c' || echo '$(srcdir)/'`libm/ld/s_lround.c
+
+libm/ld/libm_a-s_lround.obj: libm/ld/s_lround.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_lround.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_lround.Tpo -c -o libm/ld/libm_a-s_lround.obj `if test -f 'libm/ld/s_lround.c'; then $(CYGPATH_W) 'libm/ld/s_lround.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_lround.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_lround.Tpo libm/ld/$(DEPDIR)/libm_a-s_lround.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_lround.c' object='libm/ld/libm_a-s_lround.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_lround.obj `if test -f 'libm/ld/s_lround.c'; then $(CYGPATH_W) 'libm/ld/s_lround.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_lround.c'; fi`
+
+libm/ld/libm_a-s_lroundl.o: libm/ld/s_lroundl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_lroundl.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_lroundl.Tpo -c -o libm/ld/libm_a-s_lroundl.o `test -f 'libm/ld/s_lroundl.c' || echo '$(srcdir)/'`libm/ld/s_lroundl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_lroundl.Tpo libm/ld/$(DEPDIR)/libm_a-s_lroundl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_lroundl.c' object='libm/ld/libm_a-s_lroundl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_lroundl.o `test -f 'libm/ld/s_lroundl.c' || echo '$(srcdir)/'`libm/ld/s_lroundl.c
+
+libm/ld/libm_a-s_lroundl.obj: libm/ld/s_lroundl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_lroundl.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_lroundl.Tpo -c -o libm/ld/libm_a-s_lroundl.obj `if test -f 'libm/ld/s_lroundl.c'; then $(CYGPATH_W) 'libm/ld/s_lroundl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_lroundl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_lroundl.Tpo libm/ld/$(DEPDIR)/libm_a-s_lroundl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_lroundl.c' object='libm/ld/libm_a-s_lroundl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_lroundl.obj `if test -f 'libm/ld/s_lroundl.c'; then $(CYGPATH_W) 'libm/ld/s_lroundl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_lroundl.c'; fi`
+
+libm/ld/libm_a-s_modfl.o: libm/ld/s_modfl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_modfl.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_modfl.Tpo -c -o libm/ld/libm_a-s_modfl.o `test -f 'libm/ld/s_modfl.c' || echo '$(srcdir)/'`libm/ld/s_modfl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_modfl.Tpo libm/ld/$(DEPDIR)/libm_a-s_modfl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_modfl.c' object='libm/ld/libm_a-s_modfl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_modfl.o `test -f 'libm/ld/s_modfl.c' || echo '$(srcdir)/'`libm/ld/s_modfl.c
+
+libm/ld/libm_a-s_modfl.obj: libm/ld/s_modfl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_modfl.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_modfl.Tpo -c -o libm/ld/libm_a-s_modfl.obj `if test -f 'libm/ld/s_modfl.c'; then $(CYGPATH_W) 'libm/ld/s_modfl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_modfl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_modfl.Tpo libm/ld/$(DEPDIR)/libm_a-s_modfl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_modfl.c' object='libm/ld/libm_a-s_modfl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_modfl.obj `if test -f 'libm/ld/s_modfl.c'; then $(CYGPATH_W) 'libm/ld/s_modfl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_modfl.c'; fi`
+
+libm/ld/libm_a-s_nearbyintl.o: libm/ld/s_nearbyintl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_nearbyintl.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_nearbyintl.Tpo -c -o libm/ld/libm_a-s_nearbyintl.o `test -f 'libm/ld/s_nearbyintl.c' || echo '$(srcdir)/'`libm/ld/s_nearbyintl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_nearbyintl.Tpo libm/ld/$(DEPDIR)/libm_a-s_nearbyintl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_nearbyintl.c' object='libm/ld/libm_a-s_nearbyintl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_nearbyintl.o `test -f 'libm/ld/s_nearbyintl.c' || echo '$(srcdir)/'`libm/ld/s_nearbyintl.c
+
+libm/ld/libm_a-s_nearbyintl.obj: libm/ld/s_nearbyintl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_nearbyintl.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_nearbyintl.Tpo -c -o libm/ld/libm_a-s_nearbyintl.obj `if test -f 'libm/ld/s_nearbyintl.c'; then $(CYGPATH_W) 'libm/ld/s_nearbyintl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_nearbyintl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_nearbyintl.Tpo libm/ld/$(DEPDIR)/libm_a-s_nearbyintl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_nearbyintl.c' object='libm/ld/libm_a-s_nearbyintl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_nearbyintl.obj `if test -f 'libm/ld/s_nearbyintl.c'; then $(CYGPATH_W) 'libm/ld/s_nearbyintl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_nearbyintl.c'; fi`
+
+libm/ld/libm_a-s_nextafterl.o: libm/ld/s_nextafterl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_nextafterl.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_nextafterl.Tpo -c -o libm/ld/libm_a-s_nextafterl.o `test -f 'libm/ld/s_nextafterl.c' || echo '$(srcdir)/'`libm/ld/s_nextafterl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_nextafterl.Tpo libm/ld/$(DEPDIR)/libm_a-s_nextafterl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_nextafterl.c' object='libm/ld/libm_a-s_nextafterl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_nextafterl.o `test -f 'libm/ld/s_nextafterl.c' || echo '$(srcdir)/'`libm/ld/s_nextafterl.c
+
+libm/ld/libm_a-s_nextafterl.obj: libm/ld/s_nextafterl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_nextafterl.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_nextafterl.Tpo -c -o libm/ld/libm_a-s_nextafterl.obj `if test -f 'libm/ld/s_nextafterl.c'; then $(CYGPATH_W) 'libm/ld/s_nextafterl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_nextafterl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_nextafterl.Tpo libm/ld/$(DEPDIR)/libm_a-s_nextafterl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_nextafterl.c' object='libm/ld/libm_a-s_nextafterl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_nextafterl.obj `if test -f 'libm/ld/s_nextafterl.c'; then $(CYGPATH_W) 'libm/ld/s_nextafterl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_nextafterl.c'; fi`
+
+libm/ld/libm_a-s_nexttoward.o: libm/ld/s_nexttoward.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_nexttoward.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_nexttoward.Tpo -c -o libm/ld/libm_a-s_nexttoward.o `test -f 'libm/ld/s_nexttoward.c' || echo '$(srcdir)/'`libm/ld/s_nexttoward.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_nexttoward.Tpo libm/ld/$(DEPDIR)/libm_a-s_nexttoward.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_nexttoward.c' object='libm/ld/libm_a-s_nexttoward.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_nexttoward.o `test -f 'libm/ld/s_nexttoward.c' || echo '$(srcdir)/'`libm/ld/s_nexttoward.c
+
+libm/ld/libm_a-s_nexttoward.obj: libm/ld/s_nexttoward.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_nexttoward.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_nexttoward.Tpo -c -o libm/ld/libm_a-s_nexttoward.obj `if test -f 'libm/ld/s_nexttoward.c'; then $(CYGPATH_W) 'libm/ld/s_nexttoward.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_nexttoward.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_nexttoward.Tpo libm/ld/$(DEPDIR)/libm_a-s_nexttoward.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_nexttoward.c' object='libm/ld/libm_a-s_nexttoward.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_nexttoward.obj `if test -f 'libm/ld/s_nexttoward.c'; then $(CYGPATH_W) 'libm/ld/s_nexttoward.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_nexttoward.c'; fi`
+
+libm/ld/libm_a-s_nexttowardf.o: libm/ld/s_nexttowardf.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_nexttowardf.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_nexttowardf.Tpo -c -o libm/ld/libm_a-s_nexttowardf.o `test -f 'libm/ld/s_nexttowardf.c' || echo '$(srcdir)/'`libm/ld/s_nexttowardf.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_nexttowardf.Tpo libm/ld/$(DEPDIR)/libm_a-s_nexttowardf.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_nexttowardf.c' object='libm/ld/libm_a-s_nexttowardf.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_nexttowardf.o `test -f 'libm/ld/s_nexttowardf.c' || echo '$(srcdir)/'`libm/ld/s_nexttowardf.c
+
+libm/ld/libm_a-s_nexttowardf.obj: libm/ld/s_nexttowardf.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_nexttowardf.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_nexttowardf.Tpo -c -o libm/ld/libm_a-s_nexttowardf.obj `if test -f 'libm/ld/s_nexttowardf.c'; then $(CYGPATH_W) 'libm/ld/s_nexttowardf.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_nexttowardf.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_nexttowardf.Tpo libm/ld/$(DEPDIR)/libm_a-s_nexttowardf.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_nexttowardf.c' object='libm/ld/libm_a-s_nexttowardf.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_nexttowardf.obj `if test -f 'libm/ld/s_nexttowardf.c'; then $(CYGPATH_W) 'libm/ld/s_nexttowardf.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_nexttowardf.c'; fi`
+
+libm/ld/libm_a-s_remquol.o: libm/ld/s_remquol.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_remquol.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_remquol.Tpo -c -o libm/ld/libm_a-s_remquol.o `test -f 'libm/ld/s_remquol.c' || echo '$(srcdir)/'`libm/ld/s_remquol.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_remquol.Tpo libm/ld/$(DEPDIR)/libm_a-s_remquol.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_remquol.c' object='libm/ld/libm_a-s_remquol.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_remquol.o `test -f 'libm/ld/s_remquol.c' || echo '$(srcdir)/'`libm/ld/s_remquol.c
+
+libm/ld/libm_a-s_remquol.obj: libm/ld/s_remquol.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_remquol.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_remquol.Tpo -c -o libm/ld/libm_a-s_remquol.obj `if test -f 'libm/ld/s_remquol.c'; then $(CYGPATH_W) 'libm/ld/s_remquol.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_remquol.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_remquol.Tpo libm/ld/$(DEPDIR)/libm_a-s_remquol.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_remquol.c' object='libm/ld/libm_a-s_remquol.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_remquol.obj `if test -f 'libm/ld/s_remquol.c'; then $(CYGPATH_W) 'libm/ld/s_remquol.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_remquol.c'; fi`
+
+libm/ld/libm_a-s_rintl.o: libm/ld/s_rintl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_rintl.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_rintl.Tpo -c -o libm/ld/libm_a-s_rintl.o `test -f 'libm/ld/s_rintl.c' || echo '$(srcdir)/'`libm/ld/s_rintl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_rintl.Tpo libm/ld/$(DEPDIR)/libm_a-s_rintl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_rintl.c' object='libm/ld/libm_a-s_rintl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_rintl.o `test -f 'libm/ld/s_rintl.c' || echo '$(srcdir)/'`libm/ld/s_rintl.c
+
+libm/ld/libm_a-s_rintl.obj: libm/ld/s_rintl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_rintl.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_rintl.Tpo -c -o libm/ld/libm_a-s_rintl.obj `if test -f 'libm/ld/s_rintl.c'; then $(CYGPATH_W) 'libm/ld/s_rintl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_rintl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_rintl.Tpo libm/ld/$(DEPDIR)/libm_a-s_rintl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_rintl.c' object='libm/ld/libm_a-s_rintl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_rintl.obj `if test -f 'libm/ld/s_rintl.c'; then $(CYGPATH_W) 'libm/ld/s_rintl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_rintl.c'; fi`
+
+libm/ld/libm_a-s_roundl.o: libm/ld/s_roundl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_roundl.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_roundl.Tpo -c -o libm/ld/libm_a-s_roundl.o `test -f 'libm/ld/s_roundl.c' || echo '$(srcdir)/'`libm/ld/s_roundl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_roundl.Tpo libm/ld/$(DEPDIR)/libm_a-s_roundl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_roundl.c' object='libm/ld/libm_a-s_roundl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_roundl.o `test -f 'libm/ld/s_roundl.c' || echo '$(srcdir)/'`libm/ld/s_roundl.c
+
+libm/ld/libm_a-s_roundl.obj: libm/ld/s_roundl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_roundl.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_roundl.Tpo -c -o libm/ld/libm_a-s_roundl.obj `if test -f 'libm/ld/s_roundl.c'; then $(CYGPATH_W) 'libm/ld/s_roundl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_roundl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_roundl.Tpo libm/ld/$(DEPDIR)/libm_a-s_roundl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_roundl.c' object='libm/ld/libm_a-s_roundl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_roundl.obj `if test -f 'libm/ld/s_roundl.c'; then $(CYGPATH_W) 'libm/ld/s_roundl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_roundl.c'; fi`
+
+libm/ld/libm_a-scalblnl.o: libm/ld/scalblnl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-scalblnl.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-scalblnl.Tpo -c -o libm/ld/libm_a-scalblnl.o `test -f 'libm/ld/scalblnl.c' || echo '$(srcdir)/'`libm/ld/scalblnl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-scalblnl.Tpo libm/ld/$(DEPDIR)/libm_a-scalblnl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/scalblnl.c' object='libm/ld/libm_a-scalblnl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-scalblnl.o `test -f 'libm/ld/scalblnl.c' || echo '$(srcdir)/'`libm/ld/scalblnl.c
+
+libm/ld/libm_a-scalblnl.obj: libm/ld/scalblnl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-scalblnl.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-scalblnl.Tpo -c -o libm/ld/libm_a-scalblnl.obj `if test -f 'libm/ld/scalblnl.c'; then $(CYGPATH_W) 'libm/ld/scalblnl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/scalblnl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-scalblnl.Tpo libm/ld/$(DEPDIR)/libm_a-scalblnl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/scalblnl.c' object='libm/ld/libm_a-scalblnl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-scalblnl.obj `if test -f 'libm/ld/scalblnl.c'; then $(CYGPATH_W) 'libm/ld/scalblnl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/scalblnl.c'; fi`
+
+libm/ld/libm_a-s_scalbnl.o: libm/ld/s_scalbnl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_scalbnl.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_scalbnl.Tpo -c -o libm/ld/libm_a-s_scalbnl.o `test -f 'libm/ld/s_scalbnl.c' || echo '$(srcdir)/'`libm/ld/s_scalbnl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_scalbnl.Tpo libm/ld/$(DEPDIR)/libm_a-s_scalbnl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_scalbnl.c' object='libm/ld/libm_a-s_scalbnl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_scalbnl.o `test -f 'libm/ld/s_scalbnl.c' || echo '$(srcdir)/'`libm/ld/s_scalbnl.c
+
+libm/ld/libm_a-s_scalbnl.obj: libm/ld/s_scalbnl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_scalbnl.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_scalbnl.Tpo -c -o libm/ld/libm_a-s_scalbnl.obj `if test -f 'libm/ld/s_scalbnl.c'; then $(CYGPATH_W) 'libm/ld/s_scalbnl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_scalbnl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_scalbnl.Tpo libm/ld/$(DEPDIR)/libm_a-s_scalbnl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_scalbnl.c' object='libm/ld/libm_a-s_scalbnl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_scalbnl.obj `if test -f 'libm/ld/s_scalbnl.c'; then $(CYGPATH_W) 'libm/ld/s_scalbnl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_scalbnl.c'; fi`
+
+libm/ld/libm_a-s_sinl.o: libm/ld/s_sinl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_sinl.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_sinl.Tpo -c -o libm/ld/libm_a-s_sinl.o `test -f 'libm/ld/s_sinl.c' || echo '$(srcdir)/'`libm/ld/s_sinl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_sinl.Tpo libm/ld/$(DEPDIR)/libm_a-s_sinl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_sinl.c' object='libm/ld/libm_a-s_sinl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_sinl.o `test -f 'libm/ld/s_sinl.c' || echo '$(srcdir)/'`libm/ld/s_sinl.c
+
+libm/ld/libm_a-s_sinl.obj: libm/ld/s_sinl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_sinl.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_sinl.Tpo -c -o libm/ld/libm_a-s_sinl.obj `if test -f 'libm/ld/s_sinl.c'; then $(CYGPATH_W) 'libm/ld/s_sinl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_sinl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_sinl.Tpo libm/ld/$(DEPDIR)/libm_a-s_sinl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_sinl.c' object='libm/ld/libm_a-s_sinl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_sinl.obj `if test -f 'libm/ld/s_sinl.c'; then $(CYGPATH_W) 'libm/ld/s_sinl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_sinl.c'; fi`
+
+libm/ld/libm_a-s_tanhl.o: libm/ld/s_tanhl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_tanhl.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_tanhl.Tpo -c -o libm/ld/libm_a-s_tanhl.o `test -f 'libm/ld/s_tanhl.c' || echo '$(srcdir)/'`libm/ld/s_tanhl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_tanhl.Tpo libm/ld/$(DEPDIR)/libm_a-s_tanhl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_tanhl.c' object='libm/ld/libm_a-s_tanhl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_tanhl.o `test -f 'libm/ld/s_tanhl.c' || echo '$(srcdir)/'`libm/ld/s_tanhl.c
+
+libm/ld/libm_a-s_tanhl.obj: libm/ld/s_tanhl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_tanhl.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_tanhl.Tpo -c -o libm/ld/libm_a-s_tanhl.obj `if test -f 'libm/ld/s_tanhl.c'; then $(CYGPATH_W) 'libm/ld/s_tanhl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_tanhl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_tanhl.Tpo libm/ld/$(DEPDIR)/libm_a-s_tanhl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_tanhl.c' object='libm/ld/libm_a-s_tanhl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_tanhl.obj `if test -f 'libm/ld/s_tanhl.c'; then $(CYGPATH_W) 'libm/ld/s_tanhl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_tanhl.c'; fi`
+
+libm/ld/libm_a-s_tanl.o: libm/ld/s_tanl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_tanl.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_tanl.Tpo -c -o libm/ld/libm_a-s_tanl.o `test -f 'libm/ld/s_tanl.c' || echo '$(srcdir)/'`libm/ld/s_tanl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_tanl.Tpo libm/ld/$(DEPDIR)/libm_a-s_tanl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_tanl.c' object='libm/ld/libm_a-s_tanl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_tanl.o `test -f 'libm/ld/s_tanl.c' || echo '$(srcdir)/'`libm/ld/s_tanl.c
+
+libm/ld/libm_a-s_tanl.obj: libm/ld/s_tanl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_tanl.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_tanl.Tpo -c -o libm/ld/libm_a-s_tanl.obj `if test -f 'libm/ld/s_tanl.c'; then $(CYGPATH_W) 'libm/ld/s_tanl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_tanl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_tanl.Tpo libm/ld/$(DEPDIR)/libm_a-s_tanl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_tanl.c' object='libm/ld/libm_a-s_tanl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_tanl.obj `if test -f 'libm/ld/s_tanl.c'; then $(CYGPATH_W) 'libm/ld/s_tanl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_tanl.c'; fi`
+
+libm/ld/libm_a-s_truncl.o: libm/ld/s_truncl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_truncl.o -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_truncl.Tpo -c -o libm/ld/libm_a-s_truncl.o `test -f 'libm/ld/s_truncl.c' || echo '$(srcdir)/'`libm/ld/s_truncl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_truncl.Tpo libm/ld/$(DEPDIR)/libm_a-s_truncl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_truncl.c' object='libm/ld/libm_a-s_truncl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_truncl.o `test -f 'libm/ld/s_truncl.c' || echo '$(srcdir)/'`libm/ld/s_truncl.c
+
+libm/ld/libm_a-s_truncl.obj: libm/ld/s_truncl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld/libm_a-s_truncl.obj -MD -MP -MF libm/ld/$(DEPDIR)/libm_a-s_truncl.Tpo -c -o libm/ld/libm_a-s_truncl.obj `if test -f 'libm/ld/s_truncl.c'; then $(CYGPATH_W) 'libm/ld/s_truncl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_truncl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld/$(DEPDIR)/libm_a-s_truncl.Tpo libm/ld/$(DEPDIR)/libm_a-s_truncl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld/s_truncl.c' object='libm/ld/libm_a-s_truncl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld/libm_a-s_truncl.obj `if test -f 'libm/ld/s_truncl.c'; then $(CYGPATH_W) 'libm/ld/s_truncl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld/s_truncl.c'; fi`
+
libm/complex/libm_a-cabs.o: libm/complex/cabs.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/complex/libm_a-cabs.o -MD -MP -MF libm/complex/$(DEPDIR)/libm_a-cabs.Tpo -c -o libm/complex/libm_a-cabs.o `test -f 'libm/complex/cabs.c' || echo '$(srcdir)/'`libm/complex/cabs.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/complex/$(DEPDIR)/libm_a-cabs.Tpo libm/complex/$(DEPDIR)/libm_a-cabs.Po
@@ -42605,6 +43624,146 @@ libm/machine/aarch64/libm_a-feupdateenv.obj: libm/machine/aarch64/feupdateenv.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/machine/aarch64/libm_a-feupdateenv.obj `if test -f 'libm/machine/aarch64/feupdateenv.c'; then $(CYGPATH_W) 'libm/machine/aarch64/feupdateenv.c'; else $(CYGPATH_W) '$(srcdir)/libm/machine/aarch64/feupdateenv.c'; fi`
+libm/ld128/libm_a-e_powl.o: libm/ld128/e_powl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld128/libm_a-e_powl.o -MD -MP -MF libm/ld128/$(DEPDIR)/libm_a-e_powl.Tpo -c -o libm/ld128/libm_a-e_powl.o `test -f 'libm/ld128/e_powl.c' || echo '$(srcdir)/'`libm/ld128/e_powl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld128/$(DEPDIR)/libm_a-e_powl.Tpo libm/ld128/$(DEPDIR)/libm_a-e_powl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld128/e_powl.c' object='libm/ld128/libm_a-e_powl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld128/libm_a-e_powl.o `test -f 'libm/ld128/e_powl.c' || echo '$(srcdir)/'`libm/ld128/e_powl.c
+
+libm/ld128/libm_a-e_powl.obj: libm/ld128/e_powl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld128/libm_a-e_powl.obj -MD -MP -MF libm/ld128/$(DEPDIR)/libm_a-e_powl.Tpo -c -o libm/ld128/libm_a-e_powl.obj `if test -f 'libm/ld128/e_powl.c'; then $(CYGPATH_W) 'libm/ld128/e_powl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld128/e_powl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld128/$(DEPDIR)/libm_a-e_powl.Tpo libm/ld128/$(DEPDIR)/libm_a-e_powl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld128/e_powl.c' object='libm/ld128/libm_a-e_powl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld128/libm_a-e_powl.obj `if test -f 'libm/ld128/e_powl.c'; then $(CYGPATH_W) 'libm/ld128/e_powl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld128/e_powl.c'; fi`
+
+libm/ld128/libm_a-s_erfl.o: libm/ld128/s_erfl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld128/libm_a-s_erfl.o -MD -MP -MF libm/ld128/$(DEPDIR)/libm_a-s_erfl.Tpo -c -o libm/ld128/libm_a-s_erfl.o `test -f 'libm/ld128/s_erfl.c' || echo '$(srcdir)/'`libm/ld128/s_erfl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld128/$(DEPDIR)/libm_a-s_erfl.Tpo libm/ld128/$(DEPDIR)/libm_a-s_erfl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld128/s_erfl.c' object='libm/ld128/libm_a-s_erfl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld128/libm_a-s_erfl.o `test -f 'libm/ld128/s_erfl.c' || echo '$(srcdir)/'`libm/ld128/s_erfl.c
+
+libm/ld128/libm_a-s_erfl.obj: libm/ld128/s_erfl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld128/libm_a-s_erfl.obj -MD -MP -MF libm/ld128/$(DEPDIR)/libm_a-s_erfl.Tpo -c -o libm/ld128/libm_a-s_erfl.obj `if test -f 'libm/ld128/s_erfl.c'; then $(CYGPATH_W) 'libm/ld128/s_erfl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld128/s_erfl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld128/$(DEPDIR)/libm_a-s_erfl.Tpo libm/ld128/$(DEPDIR)/libm_a-s_erfl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld128/s_erfl.c' object='libm/ld128/libm_a-s_erfl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld128/libm_a-s_erfl.obj `if test -f 'libm/ld128/s_erfl.c'; then $(CYGPATH_W) 'libm/ld128/s_erfl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld128/s_erfl.c'; fi`
+
+libm/ld128/libm_a-s_exp2l.o: libm/ld128/s_exp2l.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld128/libm_a-s_exp2l.o -MD -MP -MF libm/ld128/$(DEPDIR)/libm_a-s_exp2l.Tpo -c -o libm/ld128/libm_a-s_exp2l.o `test -f 'libm/ld128/s_exp2l.c' || echo '$(srcdir)/'`libm/ld128/s_exp2l.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld128/$(DEPDIR)/libm_a-s_exp2l.Tpo libm/ld128/$(DEPDIR)/libm_a-s_exp2l.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld128/s_exp2l.c' object='libm/ld128/libm_a-s_exp2l.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld128/libm_a-s_exp2l.o `test -f 'libm/ld128/s_exp2l.c' || echo '$(srcdir)/'`libm/ld128/s_exp2l.c
+
+libm/ld128/libm_a-s_exp2l.obj: libm/ld128/s_exp2l.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld128/libm_a-s_exp2l.obj -MD -MP -MF libm/ld128/$(DEPDIR)/libm_a-s_exp2l.Tpo -c -o libm/ld128/libm_a-s_exp2l.obj `if test -f 'libm/ld128/s_exp2l.c'; then $(CYGPATH_W) 'libm/ld128/s_exp2l.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld128/s_exp2l.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld128/$(DEPDIR)/libm_a-s_exp2l.Tpo libm/ld128/$(DEPDIR)/libm_a-s_exp2l.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld128/s_exp2l.c' object='libm/ld128/libm_a-s_exp2l.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld128/libm_a-s_exp2l.obj `if test -f 'libm/ld128/s_exp2l.c'; then $(CYGPATH_W) 'libm/ld128/s_exp2l.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld128/s_exp2l.c'; fi`
+
+libm/ld128/libm_a-s_expl.o: libm/ld128/s_expl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld128/libm_a-s_expl.o -MD -MP -MF libm/ld128/$(DEPDIR)/libm_a-s_expl.Tpo -c -o libm/ld128/libm_a-s_expl.o `test -f 'libm/ld128/s_expl.c' || echo '$(srcdir)/'`libm/ld128/s_expl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld128/$(DEPDIR)/libm_a-s_expl.Tpo libm/ld128/$(DEPDIR)/libm_a-s_expl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld128/s_expl.c' object='libm/ld128/libm_a-s_expl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld128/libm_a-s_expl.o `test -f 'libm/ld128/s_expl.c' || echo '$(srcdir)/'`libm/ld128/s_expl.c
+
+libm/ld128/libm_a-s_expl.obj: libm/ld128/s_expl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld128/libm_a-s_expl.obj -MD -MP -MF libm/ld128/$(DEPDIR)/libm_a-s_expl.Tpo -c -o libm/ld128/libm_a-s_expl.obj `if test -f 'libm/ld128/s_expl.c'; then $(CYGPATH_W) 'libm/ld128/s_expl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld128/s_expl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld128/$(DEPDIR)/libm_a-s_expl.Tpo libm/ld128/$(DEPDIR)/libm_a-s_expl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld128/s_expl.c' object='libm/ld128/libm_a-s_expl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld128/libm_a-s_expl.obj `if test -f 'libm/ld128/s_expl.c'; then $(CYGPATH_W) 'libm/ld128/s_expl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld128/s_expl.c'; fi`
+
+libm/ld128/libm_a-s_logl.o: libm/ld128/s_logl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld128/libm_a-s_logl.o -MD -MP -MF libm/ld128/$(DEPDIR)/libm_a-s_logl.Tpo -c -o libm/ld128/libm_a-s_logl.o `test -f 'libm/ld128/s_logl.c' || echo '$(srcdir)/'`libm/ld128/s_logl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld128/$(DEPDIR)/libm_a-s_logl.Tpo libm/ld128/$(DEPDIR)/libm_a-s_logl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld128/s_logl.c' object='libm/ld128/libm_a-s_logl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld128/libm_a-s_logl.o `test -f 'libm/ld128/s_logl.c' || echo '$(srcdir)/'`libm/ld128/s_logl.c
+
+libm/ld128/libm_a-s_logl.obj: libm/ld128/s_logl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld128/libm_a-s_logl.obj -MD -MP -MF libm/ld128/$(DEPDIR)/libm_a-s_logl.Tpo -c -o libm/ld128/libm_a-s_logl.obj `if test -f 'libm/ld128/s_logl.c'; then $(CYGPATH_W) 'libm/ld128/s_logl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld128/s_logl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld128/$(DEPDIR)/libm_a-s_logl.Tpo libm/ld128/$(DEPDIR)/libm_a-s_logl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld128/s_logl.c' object='libm/ld128/libm_a-s_logl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld128/libm_a-s_logl.obj `if test -f 'libm/ld128/s_logl.c'; then $(CYGPATH_W) 'libm/ld128/s_logl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld128/s_logl.c'; fi`
+
+libm/ld128/libm_a-b_tgammal.o: libm/ld128/b_tgammal.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld128/libm_a-b_tgammal.o -MD -MP -MF libm/ld128/$(DEPDIR)/libm_a-b_tgammal.Tpo -c -o libm/ld128/libm_a-b_tgammal.o `test -f 'libm/ld128/b_tgammal.c' || echo '$(srcdir)/'`libm/ld128/b_tgammal.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld128/$(DEPDIR)/libm_a-b_tgammal.Tpo libm/ld128/$(DEPDIR)/libm_a-b_tgammal.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld128/b_tgammal.c' object='libm/ld128/libm_a-b_tgammal.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld128/libm_a-b_tgammal.o `test -f 'libm/ld128/b_tgammal.c' || echo '$(srcdir)/'`libm/ld128/b_tgammal.c
+
+libm/ld128/libm_a-b_tgammal.obj: libm/ld128/b_tgammal.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld128/libm_a-b_tgammal.obj -MD -MP -MF libm/ld128/$(DEPDIR)/libm_a-b_tgammal.Tpo -c -o libm/ld128/libm_a-b_tgammal.obj `if test -f 'libm/ld128/b_tgammal.c'; then $(CYGPATH_W) 'libm/ld128/b_tgammal.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld128/b_tgammal.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld128/$(DEPDIR)/libm_a-b_tgammal.Tpo libm/ld128/$(DEPDIR)/libm_a-b_tgammal.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld128/b_tgammal.c' object='libm/ld128/libm_a-b_tgammal.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld128/libm_a-b_tgammal.obj `if test -f 'libm/ld128/b_tgammal.c'; then $(CYGPATH_W) 'libm/ld128/b_tgammal.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld128/b_tgammal.c'; fi`
+
+libm/ld128/libm_a-invtrig.o: libm/ld128/invtrig.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld128/libm_a-invtrig.o -MD -MP -MF libm/ld128/$(DEPDIR)/libm_a-invtrig.Tpo -c -o libm/ld128/libm_a-invtrig.o `test -f 'libm/ld128/invtrig.c' || echo '$(srcdir)/'`libm/ld128/invtrig.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld128/$(DEPDIR)/libm_a-invtrig.Tpo libm/ld128/$(DEPDIR)/libm_a-invtrig.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld128/invtrig.c' object='libm/ld128/libm_a-invtrig.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld128/libm_a-invtrig.o `test -f 'libm/ld128/invtrig.c' || echo '$(srcdir)/'`libm/ld128/invtrig.c
+
+libm/ld128/libm_a-invtrig.obj: libm/ld128/invtrig.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld128/libm_a-invtrig.obj -MD -MP -MF libm/ld128/$(DEPDIR)/libm_a-invtrig.Tpo -c -o libm/ld128/libm_a-invtrig.obj `if test -f 'libm/ld128/invtrig.c'; then $(CYGPATH_W) 'libm/ld128/invtrig.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld128/invtrig.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld128/$(DEPDIR)/libm_a-invtrig.Tpo libm/ld128/$(DEPDIR)/libm_a-invtrig.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld128/invtrig.c' object='libm/ld128/libm_a-invtrig.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld128/libm_a-invtrig.obj `if test -f 'libm/ld128/invtrig.c'; then $(CYGPATH_W) 'libm/ld128/invtrig.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld128/invtrig.c'; fi`
+
+libm/ld128/libm_a-e_lgammal_r.o: libm/ld128/e_lgammal_r.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld128/libm_a-e_lgammal_r.o -MD -MP -MF libm/ld128/$(DEPDIR)/libm_a-e_lgammal_r.Tpo -c -o libm/ld128/libm_a-e_lgammal_r.o `test -f 'libm/ld128/e_lgammal_r.c' || echo '$(srcdir)/'`libm/ld128/e_lgammal_r.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld128/$(DEPDIR)/libm_a-e_lgammal_r.Tpo libm/ld128/$(DEPDIR)/libm_a-e_lgammal_r.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld128/e_lgammal_r.c' object='libm/ld128/libm_a-e_lgammal_r.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld128/libm_a-e_lgammal_r.o `test -f 'libm/ld128/e_lgammal_r.c' || echo '$(srcdir)/'`libm/ld128/e_lgammal_r.c
+
+libm/ld128/libm_a-e_lgammal_r.obj: libm/ld128/e_lgammal_r.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld128/libm_a-e_lgammal_r.obj -MD -MP -MF libm/ld128/$(DEPDIR)/libm_a-e_lgammal_r.Tpo -c -o libm/ld128/libm_a-e_lgammal_r.obj `if test -f 'libm/ld128/e_lgammal_r.c'; then $(CYGPATH_W) 'libm/ld128/e_lgammal_r.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld128/e_lgammal_r.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld128/$(DEPDIR)/libm_a-e_lgammal_r.Tpo libm/ld128/$(DEPDIR)/libm_a-e_lgammal_r.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld128/e_lgammal_r.c' object='libm/ld128/libm_a-e_lgammal_r.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld128/libm_a-e_lgammal_r.obj `if test -f 'libm/ld128/e_lgammal_r.c'; then $(CYGPATH_W) 'libm/ld128/e_lgammal_r.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld128/e_lgammal_r.c'; fi`
+
+libm/ld128/libm_a-k_cosl.o: libm/ld128/k_cosl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld128/libm_a-k_cosl.o -MD -MP -MF libm/ld128/$(DEPDIR)/libm_a-k_cosl.Tpo -c -o libm/ld128/libm_a-k_cosl.o `test -f 'libm/ld128/k_cosl.c' || echo '$(srcdir)/'`libm/ld128/k_cosl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld128/$(DEPDIR)/libm_a-k_cosl.Tpo libm/ld128/$(DEPDIR)/libm_a-k_cosl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld128/k_cosl.c' object='libm/ld128/libm_a-k_cosl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld128/libm_a-k_cosl.o `test -f 'libm/ld128/k_cosl.c' || echo '$(srcdir)/'`libm/ld128/k_cosl.c
+
+libm/ld128/libm_a-k_cosl.obj: libm/ld128/k_cosl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld128/libm_a-k_cosl.obj -MD -MP -MF libm/ld128/$(DEPDIR)/libm_a-k_cosl.Tpo -c -o libm/ld128/libm_a-k_cosl.obj `if test -f 'libm/ld128/k_cosl.c'; then $(CYGPATH_W) 'libm/ld128/k_cosl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld128/k_cosl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld128/$(DEPDIR)/libm_a-k_cosl.Tpo libm/ld128/$(DEPDIR)/libm_a-k_cosl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld128/k_cosl.c' object='libm/ld128/libm_a-k_cosl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld128/libm_a-k_cosl.obj `if test -f 'libm/ld128/k_cosl.c'; then $(CYGPATH_W) 'libm/ld128/k_cosl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld128/k_cosl.c'; fi`
+
+libm/ld128/libm_a-k_sinl.o: libm/ld128/k_sinl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld128/libm_a-k_sinl.o -MD -MP -MF libm/ld128/$(DEPDIR)/libm_a-k_sinl.Tpo -c -o libm/ld128/libm_a-k_sinl.o `test -f 'libm/ld128/k_sinl.c' || echo '$(srcdir)/'`libm/ld128/k_sinl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld128/$(DEPDIR)/libm_a-k_sinl.Tpo libm/ld128/$(DEPDIR)/libm_a-k_sinl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld128/k_sinl.c' object='libm/ld128/libm_a-k_sinl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld128/libm_a-k_sinl.o `test -f 'libm/ld128/k_sinl.c' || echo '$(srcdir)/'`libm/ld128/k_sinl.c
+
+libm/ld128/libm_a-k_sinl.obj: libm/ld128/k_sinl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld128/libm_a-k_sinl.obj -MD -MP -MF libm/ld128/$(DEPDIR)/libm_a-k_sinl.Tpo -c -o libm/ld128/libm_a-k_sinl.obj `if test -f 'libm/ld128/k_sinl.c'; then $(CYGPATH_W) 'libm/ld128/k_sinl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld128/k_sinl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld128/$(DEPDIR)/libm_a-k_sinl.Tpo libm/ld128/$(DEPDIR)/libm_a-k_sinl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld128/k_sinl.c' object='libm/ld128/libm_a-k_sinl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld128/libm_a-k_sinl.obj `if test -f 'libm/ld128/k_sinl.c'; then $(CYGPATH_W) 'libm/ld128/k_sinl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld128/k_sinl.c'; fi`
+
libm/machine/amdgcn/libm_a-v64_mathcnst.o: libm/machine/amdgcn/v64_mathcnst.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/machine/amdgcn/libm_a-v64_mathcnst.o -MD -MP -MF libm/machine/amdgcn/$(DEPDIR)/libm_a-v64_mathcnst.Tpo -c -o libm/machine/amdgcn/libm_a-v64_mathcnst.o `test -f 'libm/machine/amdgcn/v64_mathcnst.c' || echo '$(srcdir)/'`libm/machine/amdgcn/v64_mathcnst.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/machine/amdgcn/$(DEPDIR)/libm_a-v64_mathcnst.Tpo libm/machine/amdgcn/$(DEPDIR)/libm_a-v64_mathcnst.Po
@@ -44621,6 +45780,174 @@ libm/machine/i386/libm_a-feupdateenv.obj: libm/machine/i386/feupdateenv.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/machine/i386/libm_a-feupdateenv.obj `if test -f 'libm/machine/i386/feupdateenv.c'; then $(CYGPATH_W) 'libm/machine/i386/feupdateenv.c'; else $(CYGPATH_W) '$(srcdir)/libm/machine/i386/feupdateenv.c'; fi`
+libm/ld80/libm_a-b_tgammal.o: libm/ld80/b_tgammal.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld80/libm_a-b_tgammal.o -MD -MP -MF libm/ld80/$(DEPDIR)/libm_a-b_tgammal.Tpo -c -o libm/ld80/libm_a-b_tgammal.o `test -f 'libm/ld80/b_tgammal.c' || echo '$(srcdir)/'`libm/ld80/b_tgammal.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld80/$(DEPDIR)/libm_a-b_tgammal.Tpo libm/ld80/$(DEPDIR)/libm_a-b_tgammal.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld80/b_tgammal.c' object='libm/ld80/libm_a-b_tgammal.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld80/libm_a-b_tgammal.o `test -f 'libm/ld80/b_tgammal.c' || echo '$(srcdir)/'`libm/ld80/b_tgammal.c
+
+libm/ld80/libm_a-b_tgammal.obj: libm/ld80/b_tgammal.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld80/libm_a-b_tgammal.obj -MD -MP -MF libm/ld80/$(DEPDIR)/libm_a-b_tgammal.Tpo -c -o libm/ld80/libm_a-b_tgammal.obj `if test -f 'libm/ld80/b_tgammal.c'; then $(CYGPATH_W) 'libm/ld80/b_tgammal.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld80/b_tgammal.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld80/$(DEPDIR)/libm_a-b_tgammal.Tpo libm/ld80/$(DEPDIR)/libm_a-b_tgammal.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld80/b_tgammal.c' object='libm/ld80/libm_a-b_tgammal.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld80/libm_a-b_tgammal.obj `if test -f 'libm/ld80/b_tgammal.c'; then $(CYGPATH_W) 'libm/ld80/b_tgammal.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld80/b_tgammal.c'; fi`
+
+libm/ld80/libm_a-e_powl.o: libm/ld80/e_powl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld80/libm_a-e_powl.o -MD -MP -MF libm/ld80/$(DEPDIR)/libm_a-e_powl.Tpo -c -o libm/ld80/libm_a-e_powl.o `test -f 'libm/ld80/e_powl.c' || echo '$(srcdir)/'`libm/ld80/e_powl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld80/$(DEPDIR)/libm_a-e_powl.Tpo libm/ld80/$(DEPDIR)/libm_a-e_powl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld80/e_powl.c' object='libm/ld80/libm_a-e_powl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld80/libm_a-e_powl.o `test -f 'libm/ld80/e_powl.c' || echo '$(srcdir)/'`libm/ld80/e_powl.c
+
+libm/ld80/libm_a-e_powl.obj: libm/ld80/e_powl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld80/libm_a-e_powl.obj -MD -MP -MF libm/ld80/$(DEPDIR)/libm_a-e_powl.Tpo -c -o libm/ld80/libm_a-e_powl.obj `if test -f 'libm/ld80/e_powl.c'; then $(CYGPATH_W) 'libm/ld80/e_powl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld80/e_powl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld80/$(DEPDIR)/libm_a-e_powl.Tpo libm/ld80/$(DEPDIR)/libm_a-e_powl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld80/e_powl.c' object='libm/ld80/libm_a-e_powl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld80/libm_a-e_powl.obj `if test -f 'libm/ld80/e_powl.c'; then $(CYGPATH_W) 'libm/ld80/e_powl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld80/e_powl.c'; fi`
+
+libm/ld80/libm_a-s_erfl.o: libm/ld80/s_erfl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld80/libm_a-s_erfl.o -MD -MP -MF libm/ld80/$(DEPDIR)/libm_a-s_erfl.Tpo -c -o libm/ld80/libm_a-s_erfl.o `test -f 'libm/ld80/s_erfl.c' || echo '$(srcdir)/'`libm/ld80/s_erfl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld80/$(DEPDIR)/libm_a-s_erfl.Tpo libm/ld80/$(DEPDIR)/libm_a-s_erfl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld80/s_erfl.c' object='libm/ld80/libm_a-s_erfl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld80/libm_a-s_erfl.o `test -f 'libm/ld80/s_erfl.c' || echo '$(srcdir)/'`libm/ld80/s_erfl.c
+
+libm/ld80/libm_a-s_erfl.obj: libm/ld80/s_erfl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld80/libm_a-s_erfl.obj -MD -MP -MF libm/ld80/$(DEPDIR)/libm_a-s_erfl.Tpo -c -o libm/ld80/libm_a-s_erfl.obj `if test -f 'libm/ld80/s_erfl.c'; then $(CYGPATH_W) 'libm/ld80/s_erfl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld80/s_erfl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld80/$(DEPDIR)/libm_a-s_erfl.Tpo libm/ld80/$(DEPDIR)/libm_a-s_erfl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld80/s_erfl.c' object='libm/ld80/libm_a-s_erfl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld80/libm_a-s_erfl.obj `if test -f 'libm/ld80/s_erfl.c'; then $(CYGPATH_W) 'libm/ld80/s_erfl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld80/s_erfl.c'; fi`
+
+libm/ld80/libm_a-s_exp2l.o: libm/ld80/s_exp2l.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld80/libm_a-s_exp2l.o -MD -MP -MF libm/ld80/$(DEPDIR)/libm_a-s_exp2l.Tpo -c -o libm/ld80/libm_a-s_exp2l.o `test -f 'libm/ld80/s_exp2l.c' || echo '$(srcdir)/'`libm/ld80/s_exp2l.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld80/$(DEPDIR)/libm_a-s_exp2l.Tpo libm/ld80/$(DEPDIR)/libm_a-s_exp2l.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld80/s_exp2l.c' object='libm/ld80/libm_a-s_exp2l.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld80/libm_a-s_exp2l.o `test -f 'libm/ld80/s_exp2l.c' || echo '$(srcdir)/'`libm/ld80/s_exp2l.c
+
+libm/ld80/libm_a-s_exp2l.obj: libm/ld80/s_exp2l.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld80/libm_a-s_exp2l.obj -MD -MP -MF libm/ld80/$(DEPDIR)/libm_a-s_exp2l.Tpo -c -o libm/ld80/libm_a-s_exp2l.obj `if test -f 'libm/ld80/s_exp2l.c'; then $(CYGPATH_W) 'libm/ld80/s_exp2l.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld80/s_exp2l.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld80/$(DEPDIR)/libm_a-s_exp2l.Tpo libm/ld80/$(DEPDIR)/libm_a-s_exp2l.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld80/s_exp2l.c' object='libm/ld80/libm_a-s_exp2l.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld80/libm_a-s_exp2l.obj `if test -f 'libm/ld80/s_exp2l.c'; then $(CYGPATH_W) 'libm/ld80/s_exp2l.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld80/s_exp2l.c'; fi`
+
+libm/ld80/libm_a-s_expl.o: libm/ld80/s_expl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld80/libm_a-s_expl.o -MD -MP -MF libm/ld80/$(DEPDIR)/libm_a-s_expl.Tpo -c -o libm/ld80/libm_a-s_expl.o `test -f 'libm/ld80/s_expl.c' || echo '$(srcdir)/'`libm/ld80/s_expl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld80/$(DEPDIR)/libm_a-s_expl.Tpo libm/ld80/$(DEPDIR)/libm_a-s_expl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld80/s_expl.c' object='libm/ld80/libm_a-s_expl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld80/libm_a-s_expl.o `test -f 'libm/ld80/s_expl.c' || echo '$(srcdir)/'`libm/ld80/s_expl.c
+
+libm/ld80/libm_a-s_expl.obj: libm/ld80/s_expl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld80/libm_a-s_expl.obj -MD -MP -MF libm/ld80/$(DEPDIR)/libm_a-s_expl.Tpo -c -o libm/ld80/libm_a-s_expl.obj `if test -f 'libm/ld80/s_expl.c'; then $(CYGPATH_W) 'libm/ld80/s_expl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld80/s_expl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld80/$(DEPDIR)/libm_a-s_expl.Tpo libm/ld80/$(DEPDIR)/libm_a-s_expl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld80/s_expl.c' object='libm/ld80/libm_a-s_expl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld80/libm_a-s_expl.obj `if test -f 'libm/ld80/s_expl.c'; then $(CYGPATH_W) 'libm/ld80/s_expl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld80/s_expl.c'; fi`
+
+libm/ld80/libm_a-s_logl.o: libm/ld80/s_logl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld80/libm_a-s_logl.o -MD -MP -MF libm/ld80/$(DEPDIR)/libm_a-s_logl.Tpo -c -o libm/ld80/libm_a-s_logl.o `test -f 'libm/ld80/s_logl.c' || echo '$(srcdir)/'`libm/ld80/s_logl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld80/$(DEPDIR)/libm_a-s_logl.Tpo libm/ld80/$(DEPDIR)/libm_a-s_logl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld80/s_logl.c' object='libm/ld80/libm_a-s_logl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld80/libm_a-s_logl.o `test -f 'libm/ld80/s_logl.c' || echo '$(srcdir)/'`libm/ld80/s_logl.c
+
+libm/ld80/libm_a-s_logl.obj: libm/ld80/s_logl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld80/libm_a-s_logl.obj -MD -MP -MF libm/ld80/$(DEPDIR)/libm_a-s_logl.Tpo -c -o libm/ld80/libm_a-s_logl.obj `if test -f 'libm/ld80/s_logl.c'; then $(CYGPATH_W) 'libm/ld80/s_logl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld80/s_logl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld80/$(DEPDIR)/libm_a-s_logl.Tpo libm/ld80/$(DEPDIR)/libm_a-s_logl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld80/s_logl.c' object='libm/ld80/libm_a-s_logl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld80/libm_a-s_logl.obj `if test -f 'libm/ld80/s_logl.c'; then $(CYGPATH_W) 'libm/ld80/s_logl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld80/s_logl.c'; fi`
+
+libm/ld80/libm_a-s_sinpil.o: libm/ld80/s_sinpil.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld80/libm_a-s_sinpil.o -MD -MP -MF libm/ld80/$(DEPDIR)/libm_a-s_sinpil.Tpo -c -o libm/ld80/libm_a-s_sinpil.o `test -f 'libm/ld80/s_sinpil.c' || echo '$(srcdir)/'`libm/ld80/s_sinpil.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld80/$(DEPDIR)/libm_a-s_sinpil.Tpo libm/ld80/$(DEPDIR)/libm_a-s_sinpil.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld80/s_sinpil.c' object='libm/ld80/libm_a-s_sinpil.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld80/libm_a-s_sinpil.o `test -f 'libm/ld80/s_sinpil.c' || echo '$(srcdir)/'`libm/ld80/s_sinpil.c
+
+libm/ld80/libm_a-s_sinpil.obj: libm/ld80/s_sinpil.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld80/libm_a-s_sinpil.obj -MD -MP -MF libm/ld80/$(DEPDIR)/libm_a-s_sinpil.Tpo -c -o libm/ld80/libm_a-s_sinpil.obj `if test -f 'libm/ld80/s_sinpil.c'; then $(CYGPATH_W) 'libm/ld80/s_sinpil.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld80/s_sinpil.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld80/$(DEPDIR)/libm_a-s_sinpil.Tpo libm/ld80/$(DEPDIR)/libm_a-s_sinpil.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld80/s_sinpil.c' object='libm/ld80/libm_a-s_sinpil.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld80/libm_a-s_sinpil.obj `if test -f 'libm/ld80/s_sinpil.c'; then $(CYGPATH_W) 'libm/ld80/s_sinpil.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld80/s_sinpil.c'; fi`
+
+libm/ld80/libm_a-s_cospil.o: libm/ld80/s_cospil.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld80/libm_a-s_cospil.o -MD -MP -MF libm/ld80/$(DEPDIR)/libm_a-s_cospil.Tpo -c -o libm/ld80/libm_a-s_cospil.o `test -f 'libm/ld80/s_cospil.c' || echo '$(srcdir)/'`libm/ld80/s_cospil.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld80/$(DEPDIR)/libm_a-s_cospil.Tpo libm/ld80/$(DEPDIR)/libm_a-s_cospil.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld80/s_cospil.c' object='libm/ld80/libm_a-s_cospil.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld80/libm_a-s_cospil.o `test -f 'libm/ld80/s_cospil.c' || echo '$(srcdir)/'`libm/ld80/s_cospil.c
+
+libm/ld80/libm_a-s_cospil.obj: libm/ld80/s_cospil.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld80/libm_a-s_cospil.obj -MD -MP -MF libm/ld80/$(DEPDIR)/libm_a-s_cospil.Tpo -c -o libm/ld80/libm_a-s_cospil.obj `if test -f 'libm/ld80/s_cospil.c'; then $(CYGPATH_W) 'libm/ld80/s_cospil.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld80/s_cospil.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld80/$(DEPDIR)/libm_a-s_cospil.Tpo libm/ld80/$(DEPDIR)/libm_a-s_cospil.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld80/s_cospil.c' object='libm/ld80/libm_a-s_cospil.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld80/libm_a-s_cospil.obj `if test -f 'libm/ld80/s_cospil.c'; then $(CYGPATH_W) 'libm/ld80/s_cospil.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld80/s_cospil.c'; fi`
+
+libm/ld80/libm_a-invtrig.o: libm/ld80/invtrig.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld80/libm_a-invtrig.o -MD -MP -MF libm/ld80/$(DEPDIR)/libm_a-invtrig.Tpo -c -o libm/ld80/libm_a-invtrig.o `test -f 'libm/ld80/invtrig.c' || echo '$(srcdir)/'`libm/ld80/invtrig.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld80/$(DEPDIR)/libm_a-invtrig.Tpo libm/ld80/$(DEPDIR)/libm_a-invtrig.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld80/invtrig.c' object='libm/ld80/libm_a-invtrig.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld80/libm_a-invtrig.o `test -f 'libm/ld80/invtrig.c' || echo '$(srcdir)/'`libm/ld80/invtrig.c
+
+libm/ld80/libm_a-invtrig.obj: libm/ld80/invtrig.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld80/libm_a-invtrig.obj -MD -MP -MF libm/ld80/$(DEPDIR)/libm_a-invtrig.Tpo -c -o libm/ld80/libm_a-invtrig.obj `if test -f 'libm/ld80/invtrig.c'; then $(CYGPATH_W) 'libm/ld80/invtrig.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld80/invtrig.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld80/$(DEPDIR)/libm_a-invtrig.Tpo libm/ld80/$(DEPDIR)/libm_a-invtrig.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld80/invtrig.c' object='libm/ld80/libm_a-invtrig.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld80/libm_a-invtrig.obj `if test -f 'libm/ld80/invtrig.c'; then $(CYGPATH_W) 'libm/ld80/invtrig.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld80/invtrig.c'; fi`
+
+libm/ld80/libm_a-e_lgammal_r.o: libm/ld80/e_lgammal_r.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld80/libm_a-e_lgammal_r.o -MD -MP -MF libm/ld80/$(DEPDIR)/libm_a-e_lgammal_r.Tpo -c -o libm/ld80/libm_a-e_lgammal_r.o `test -f 'libm/ld80/e_lgammal_r.c' || echo '$(srcdir)/'`libm/ld80/e_lgammal_r.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld80/$(DEPDIR)/libm_a-e_lgammal_r.Tpo libm/ld80/$(DEPDIR)/libm_a-e_lgammal_r.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld80/e_lgammal_r.c' object='libm/ld80/libm_a-e_lgammal_r.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld80/libm_a-e_lgammal_r.o `test -f 'libm/ld80/e_lgammal_r.c' || echo '$(srcdir)/'`libm/ld80/e_lgammal_r.c
+
+libm/ld80/libm_a-e_lgammal_r.obj: libm/ld80/e_lgammal_r.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld80/libm_a-e_lgammal_r.obj -MD -MP -MF libm/ld80/$(DEPDIR)/libm_a-e_lgammal_r.Tpo -c -o libm/ld80/libm_a-e_lgammal_r.obj `if test -f 'libm/ld80/e_lgammal_r.c'; then $(CYGPATH_W) 'libm/ld80/e_lgammal_r.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld80/e_lgammal_r.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld80/$(DEPDIR)/libm_a-e_lgammal_r.Tpo libm/ld80/$(DEPDIR)/libm_a-e_lgammal_r.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld80/e_lgammal_r.c' object='libm/ld80/libm_a-e_lgammal_r.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld80/libm_a-e_lgammal_r.obj `if test -f 'libm/ld80/e_lgammal_r.c'; then $(CYGPATH_W) 'libm/ld80/e_lgammal_r.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld80/e_lgammal_r.c'; fi`
+
+libm/ld80/libm_a-k_cosl.o: libm/ld80/k_cosl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld80/libm_a-k_cosl.o -MD -MP -MF libm/ld80/$(DEPDIR)/libm_a-k_cosl.Tpo -c -o libm/ld80/libm_a-k_cosl.o `test -f 'libm/ld80/k_cosl.c' || echo '$(srcdir)/'`libm/ld80/k_cosl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld80/$(DEPDIR)/libm_a-k_cosl.Tpo libm/ld80/$(DEPDIR)/libm_a-k_cosl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld80/k_cosl.c' object='libm/ld80/libm_a-k_cosl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld80/libm_a-k_cosl.o `test -f 'libm/ld80/k_cosl.c' || echo '$(srcdir)/'`libm/ld80/k_cosl.c
+
+libm/ld80/libm_a-k_cosl.obj: libm/ld80/k_cosl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld80/libm_a-k_cosl.obj -MD -MP -MF libm/ld80/$(DEPDIR)/libm_a-k_cosl.Tpo -c -o libm/ld80/libm_a-k_cosl.obj `if test -f 'libm/ld80/k_cosl.c'; then $(CYGPATH_W) 'libm/ld80/k_cosl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld80/k_cosl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld80/$(DEPDIR)/libm_a-k_cosl.Tpo libm/ld80/$(DEPDIR)/libm_a-k_cosl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld80/k_cosl.c' object='libm/ld80/libm_a-k_cosl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld80/libm_a-k_cosl.obj `if test -f 'libm/ld80/k_cosl.c'; then $(CYGPATH_W) 'libm/ld80/k_cosl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld80/k_cosl.c'; fi`
+
+libm/ld80/libm_a-k_sinl.o: libm/ld80/k_sinl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld80/libm_a-k_sinl.o -MD -MP -MF libm/ld80/$(DEPDIR)/libm_a-k_sinl.Tpo -c -o libm/ld80/libm_a-k_sinl.o `test -f 'libm/ld80/k_sinl.c' || echo '$(srcdir)/'`libm/ld80/k_sinl.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld80/$(DEPDIR)/libm_a-k_sinl.Tpo libm/ld80/$(DEPDIR)/libm_a-k_sinl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld80/k_sinl.c' object='libm/ld80/libm_a-k_sinl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld80/libm_a-k_sinl.o `test -f 'libm/ld80/k_sinl.c' || echo '$(srcdir)/'`libm/ld80/k_sinl.c
+
+libm/ld80/libm_a-k_sinl.obj: libm/ld80/k_sinl.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/ld80/libm_a-k_sinl.obj -MD -MP -MF libm/ld80/$(DEPDIR)/libm_a-k_sinl.Tpo -c -o libm/ld80/libm_a-k_sinl.obj `if test -f 'libm/ld80/k_sinl.c'; then $(CYGPATH_W) 'libm/ld80/k_sinl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld80/k_sinl.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/ld80/$(DEPDIR)/libm_a-k_sinl.Tpo libm/ld80/$(DEPDIR)/libm_a-k_sinl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libm/ld80/k_sinl.c' object='libm/ld80/libm_a-k_sinl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -c -o libm/ld80/libm_a-k_sinl.obj `if test -f 'libm/ld80/k_sinl.c'; then $(CYGPATH_W) 'libm/ld80/k_sinl.c'; else $(CYGPATH_W) '$(srcdir)/libm/ld80/k_sinl.c'; fi`
+
libm/machine/mips/libm_a-feclearexcept.o: libm/machine/mips/feclearexcept.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libm_a_CPPFLAGS) $(CPPFLAGS) $(libm_a_CFLAGS) $(CFLAGS) -MT libm/machine/mips/libm_a-feclearexcept.o -MD -MP -MF libm/machine/mips/$(DEPDIR)/libm_a-feclearexcept.Tpo -c -o libm/machine/mips/libm_a-feclearexcept.o `test -f 'libm/machine/mips/feclearexcept.c' || echo '$(srcdir)/'`libm/machine/mips/feclearexcept.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libm/machine/mips/$(DEPDIR)/libm_a-feclearexcept.Tpo libm/machine/mips/$(DEPDIR)/libm_a-feclearexcept.Po
@@ -48291,6 +49618,12 @@ distclean-generic:
-rm -f libm/complex/$(am__dirstamp)
-rm -f libm/fenv/$(DEPDIR)/$(am__dirstamp)
-rm -f libm/fenv/$(am__dirstamp)
+ -rm -f libm/ld/$(DEPDIR)/$(am__dirstamp)
+ -rm -f libm/ld/$(am__dirstamp)
+ -rm -f libm/ld128/$(DEPDIR)/$(am__dirstamp)
+ -rm -f libm/ld128/$(am__dirstamp)
+ -rm -f libm/ld80/$(DEPDIR)/$(am__dirstamp)
+ -rm -f libm/ld80/$(am__dirstamp)
-rm -f libm/machine/aarch64/$(DEPDIR)/$(am__dirstamp)
-rm -f libm/machine/aarch64/$(am__dirstamp)
-rm -f libm/machine/amdgcn/$(DEPDIR)/$(am__dirstamp)
@@ -48332,7 +49665,7 @@ clean-am: clean-aminfo clean-checkPROGRAMS clean-generic clean-local \
distclean: distclean-am
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
- -rm -rf libc/argz/$(DEPDIR) libc/ctype/$(DEPDIR) libc/errno/$(DEPDIR) libc/iconv/ccs/$(DEPDIR) libc/iconv/ces/$(DEPDIR) libc/iconv/lib/$(DEPDIR) libc/locale/$(DEPDIR) libc/machine/aarch64/$(DEPDIR) libc/machine/amdgcn/$(DEPDIR) libc/machine/arc/$(DEPDIR) libc/machine/arm/$(DEPDIR) libc/machine/bfin/$(DEPDIR) libc/machine/cr16/$(DEPDIR) libc/machine/cris/$(DEPDIR) libc/machine/crx/$(DEPDIR) libc/machine/csky/$(DEPDIR) libc/machine/d10v/$(DEPDIR) libc/machine/d30v/$(DEPDIR) libc/machine/epiphany/$(DEPDIR) libc/machine/fr30/$(DEPDIR) libc/machine/frv/$(DEPDIR) libc/machine/ft32/$(DEPDIR) libc/machine/h8300/$(DEPDIR) libc/machine/h8500/$(DEPDIR) libc/machine/hppa/$(DEPDIR) libc/machine/i386/$(DEPDIR) libc/machine/i960/$(DEPDIR) libc/machine/iq2000/$(DEPDIR) libc/machine/lm32/$(DEPDIR) libc/machine/m32c/$(DEPDIR) libc/machine/m32r/$(DEPDIR) libc/machine/m68hc11/$(DEPDIR) libc/machine/m68k/$(DEPDIR) libc/machine/m88k/$(DEPDIR) libc/machine/mep/$(DEPDIR) libc/machine/microblaze/$(DEPDIR) libc/machine/mips/$(DEPDIR) libc/machine/mn10200/$(DEPDIR) libc/machine/mn10300/$(DEPDIR) libc/machine/moxie/$(DEPDIR) libc/machine/msp430/$(DEPDIR) libc/machine/mt/$(DEPDIR) libc/machine/nds32/$(DEPDIR) libc/machine/necv70/$(DEPDIR) libc/machine/nvptx/$(DEPDIR) libc/machine/or1k/$(DEPDIR) libc/machine/powerpc/$(DEPDIR) libc/machine/riscv/$(DEPDIR) libc/machine/rl78/$(DEPDIR) libc/machine/rx/$(DEPDIR) libc/machine/sh/$(DEPDIR) libc/machine/sparc/$(DEPDIR) libc/machine/spu/$(DEPDIR) libc/machine/tic4x/$(DEPDIR) libc/machine/tic6x/$(DEPDIR) libc/machine/tic80/$(DEPDIR) libc/machine/v850/$(DEPDIR) libc/machine/visium/$(DEPDIR) libc/machine/w65/$(DEPDIR) libc/machine/x86_64/$(DEPDIR) libc/machine/xc16x/$(DEPDIR) libc/machine/xstormy16/$(DEPDIR) libc/machine/z8k/$(DEPDIR) libc/misc/$(DEPDIR) libc/posix/$(DEPDIR) libc/reent/$(DEPDIR) libc/search/$(DEPDIR) libc/signal/$(DEPDIR) libc/ssp/$(DEPDIR) libc/stdio/$(DEPDIR) libc/stdio64/$(DEPDIR) libc/stdlib/$(DEPDIR) libc/string/$(DEPDIR) libc/sys/a29khif/$(DEPDIR) libc/sys/amdgcn/$(DEPDIR) libc/sys/arm/$(DEPDIR) libc/sys/d10v/$(DEPDIR) libc/sys/epiphany/$(DEPDIR) libc/sys/h8300hms/$(DEPDIR) libc/sys/h8500hms/$(DEPDIR) libc/sys/m88kbug/$(DEPDIR) libc/sys/mmixware/$(DEPDIR) libc/sys/netware/$(DEPDIR) libc/sys/or1k/$(DEPDIR) libc/sys/rdos/$(DEPDIR) libc/sys/rtems/$(DEPDIR) libc/sys/sh/$(DEPDIR) libc/sys/sysmec/$(DEPDIR) libc/sys/sysnec810/$(DEPDIR) libc/sys/sysnecv850/$(DEPDIR) libc/sys/sysvi386/$(DEPDIR) libc/sys/sysvnecv70/$(DEPDIR) libc/sys/tirtos/$(DEPDIR) libc/sys/w65/$(DEPDIR) libc/sys/z8ksim/$(DEPDIR) libc/syscalls/$(DEPDIR) libc/time/$(DEPDIR) libc/unix/$(DEPDIR) libc/xdr/$(DEPDIR) libm/common/$(DEPDIR) libm/complex/$(DEPDIR) libm/fenv/$(DEPDIR) libm/machine/aarch64/$(DEPDIR) libm/machine/amdgcn/$(DEPDIR) libm/machine/arm/$(DEPDIR) libm/machine/i386/$(DEPDIR) libm/machine/mips/$(DEPDIR) libm/machine/nds32/$(DEPDIR) libm/machine/powerpc/$(DEPDIR) libm/machine/pru/$(DEPDIR) libm/machine/riscv/$(DEPDIR) libm/machine/sparc/$(DEPDIR) libm/machine/spu/$(DEPDIR) libm/machine/x86_64/$(DEPDIR) libm/math/$(DEPDIR) libm/mathfp/$(DEPDIR) libm/test/$(DEPDIR)
+ -rm -rf libc/argz/$(DEPDIR) libc/ctype/$(DEPDIR) libc/errno/$(DEPDIR) libc/iconv/ccs/$(DEPDIR) libc/iconv/ces/$(DEPDIR) libc/iconv/lib/$(DEPDIR) libc/locale/$(DEPDIR) libc/machine/aarch64/$(DEPDIR) libc/machine/amdgcn/$(DEPDIR) libc/machine/arc/$(DEPDIR) libc/machine/arm/$(DEPDIR) libc/machine/bfin/$(DEPDIR) libc/machine/cr16/$(DEPDIR) libc/machine/cris/$(DEPDIR) libc/machine/crx/$(DEPDIR) libc/machine/csky/$(DEPDIR) libc/machine/d10v/$(DEPDIR) libc/machine/d30v/$(DEPDIR) libc/machine/epiphany/$(DEPDIR) libc/machine/fr30/$(DEPDIR) libc/machine/frv/$(DEPDIR) libc/machine/ft32/$(DEPDIR) libc/machine/h8300/$(DEPDIR) libc/machine/h8500/$(DEPDIR) libc/machine/hppa/$(DEPDIR) libc/machine/i386/$(DEPDIR) libc/machine/i960/$(DEPDIR) libc/machine/iq2000/$(DEPDIR) libc/machine/lm32/$(DEPDIR) libc/machine/m32c/$(DEPDIR) libc/machine/m32r/$(DEPDIR) libc/machine/m68hc11/$(DEPDIR) libc/machine/m68k/$(DEPDIR) libc/machine/m88k/$(DEPDIR) libc/machine/mep/$(DEPDIR) libc/machine/microblaze/$(DEPDIR) libc/machine/mips/$(DEPDIR) libc/machine/mn10200/$(DEPDIR) libc/machine/mn10300/$(DEPDIR) libc/machine/moxie/$(DEPDIR) libc/machine/msp430/$(DEPDIR) libc/machine/mt/$(DEPDIR) libc/machine/nds32/$(DEPDIR) libc/machine/necv70/$(DEPDIR) libc/machine/nvptx/$(DEPDIR) libc/machine/or1k/$(DEPDIR) libc/machine/powerpc/$(DEPDIR) libc/machine/riscv/$(DEPDIR) libc/machine/rl78/$(DEPDIR) libc/machine/rx/$(DEPDIR) libc/machine/sh/$(DEPDIR) libc/machine/sparc/$(DEPDIR) libc/machine/spu/$(DEPDIR) libc/machine/tic4x/$(DEPDIR) libc/machine/tic6x/$(DEPDIR) libc/machine/tic80/$(DEPDIR) libc/machine/v850/$(DEPDIR) libc/machine/visium/$(DEPDIR) libc/machine/w65/$(DEPDIR) libc/machine/x86_64/$(DEPDIR) libc/machine/xc16x/$(DEPDIR) libc/machine/xstormy16/$(DEPDIR) libc/machine/z8k/$(DEPDIR) libc/misc/$(DEPDIR) libc/posix/$(DEPDIR) libc/reent/$(DEPDIR) libc/search/$(DEPDIR) libc/signal/$(DEPDIR) libc/ssp/$(DEPDIR) libc/stdio/$(DEPDIR) libc/stdio64/$(DEPDIR) libc/stdlib/$(DEPDIR) libc/string/$(DEPDIR) libc/sys/a29khif/$(DEPDIR) libc/sys/amdgcn/$(DEPDIR) libc/sys/arm/$(DEPDIR) libc/sys/d10v/$(DEPDIR) libc/sys/epiphany/$(DEPDIR) libc/sys/h8300hms/$(DEPDIR) libc/sys/h8500hms/$(DEPDIR) libc/sys/m88kbug/$(DEPDIR) libc/sys/mmixware/$(DEPDIR) libc/sys/netware/$(DEPDIR) libc/sys/or1k/$(DEPDIR) libc/sys/rdos/$(DEPDIR) libc/sys/rtems/$(DEPDIR) libc/sys/sh/$(DEPDIR) libc/sys/sysmec/$(DEPDIR) libc/sys/sysnec810/$(DEPDIR) libc/sys/sysnecv850/$(DEPDIR) libc/sys/sysvi386/$(DEPDIR) libc/sys/sysvnecv70/$(DEPDIR) libc/sys/tirtos/$(DEPDIR) libc/sys/w65/$(DEPDIR) libc/sys/z8ksim/$(DEPDIR) libc/syscalls/$(DEPDIR) libc/time/$(DEPDIR) libc/unix/$(DEPDIR) libc/xdr/$(DEPDIR) libm/common/$(DEPDIR) libm/complex/$(DEPDIR) libm/fenv/$(DEPDIR) libm/ld/$(DEPDIR) libm/ld128/$(DEPDIR) libm/ld80/$(DEPDIR) libm/machine/aarch64/$(DEPDIR) libm/machine/amdgcn/$(DEPDIR) libm/machine/arm/$(DEPDIR) libm/machine/i386/$(DEPDIR) libm/machine/mips/$(DEPDIR) libm/machine/nds32/$(DEPDIR) libm/machine/powerpc/$(DEPDIR) libm/machine/pru/$(DEPDIR) libm/machine/riscv/$(DEPDIR) libm/machine/sparc/$(DEPDIR) libm/machine/spu/$(DEPDIR) libm/machine/x86_64/$(DEPDIR) libm/math/$(DEPDIR) libm/mathfp/$(DEPDIR) libm/test/$(DEPDIR)
-rm -f Makefile
distclean-am: clean-am distclean-DEJAGNU distclean-compile \
distclean-generic distclean-hdr distclean-local distclean-tags
@@ -48470,7 +49803,7 @@ installcheck-am:
maintainer-clean: maintainer-clean-am
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-rm -rf $(top_srcdir)/autom4te.cache
- -rm -rf libc/argz/$(DEPDIR) libc/ctype/$(DEPDIR) libc/errno/$(DEPDIR) libc/iconv/ccs/$(DEPDIR) libc/iconv/ces/$(DEPDIR) libc/iconv/lib/$(DEPDIR) libc/locale/$(DEPDIR) libc/machine/aarch64/$(DEPDIR) libc/machine/amdgcn/$(DEPDIR) libc/machine/arc/$(DEPDIR) libc/machine/arm/$(DEPDIR) libc/machine/bfin/$(DEPDIR) libc/machine/cr16/$(DEPDIR) libc/machine/cris/$(DEPDIR) libc/machine/crx/$(DEPDIR) libc/machine/csky/$(DEPDIR) libc/machine/d10v/$(DEPDIR) libc/machine/d30v/$(DEPDIR) libc/machine/epiphany/$(DEPDIR) libc/machine/fr30/$(DEPDIR) libc/machine/frv/$(DEPDIR) libc/machine/ft32/$(DEPDIR) libc/machine/h8300/$(DEPDIR) libc/machine/h8500/$(DEPDIR) libc/machine/hppa/$(DEPDIR) libc/machine/i386/$(DEPDIR) libc/machine/i960/$(DEPDIR) libc/machine/iq2000/$(DEPDIR) libc/machine/lm32/$(DEPDIR) libc/machine/m32c/$(DEPDIR) libc/machine/m32r/$(DEPDIR) libc/machine/m68hc11/$(DEPDIR) libc/machine/m68k/$(DEPDIR) libc/machine/m88k/$(DEPDIR) libc/machine/mep/$(DEPDIR) libc/machine/microblaze/$(DEPDIR) libc/machine/mips/$(DEPDIR) libc/machine/mn10200/$(DEPDIR) libc/machine/mn10300/$(DEPDIR) libc/machine/moxie/$(DEPDIR) libc/machine/msp430/$(DEPDIR) libc/machine/mt/$(DEPDIR) libc/machine/nds32/$(DEPDIR) libc/machine/necv70/$(DEPDIR) libc/machine/nvptx/$(DEPDIR) libc/machine/or1k/$(DEPDIR) libc/machine/powerpc/$(DEPDIR) libc/machine/riscv/$(DEPDIR) libc/machine/rl78/$(DEPDIR) libc/machine/rx/$(DEPDIR) libc/machine/sh/$(DEPDIR) libc/machine/sparc/$(DEPDIR) libc/machine/spu/$(DEPDIR) libc/machine/tic4x/$(DEPDIR) libc/machine/tic6x/$(DEPDIR) libc/machine/tic80/$(DEPDIR) libc/machine/v850/$(DEPDIR) libc/machine/visium/$(DEPDIR) libc/machine/w65/$(DEPDIR) libc/machine/x86_64/$(DEPDIR) libc/machine/xc16x/$(DEPDIR) libc/machine/xstormy16/$(DEPDIR) libc/machine/z8k/$(DEPDIR) libc/misc/$(DEPDIR) libc/posix/$(DEPDIR) libc/reent/$(DEPDIR) libc/search/$(DEPDIR) libc/signal/$(DEPDIR) libc/ssp/$(DEPDIR) libc/stdio/$(DEPDIR) libc/stdio64/$(DEPDIR) libc/stdlib/$(DEPDIR) libc/string/$(DEPDIR) libc/sys/a29khif/$(DEPDIR) libc/sys/amdgcn/$(DEPDIR) libc/sys/arm/$(DEPDIR) libc/sys/d10v/$(DEPDIR) libc/sys/epiphany/$(DEPDIR) libc/sys/h8300hms/$(DEPDIR) libc/sys/h8500hms/$(DEPDIR) libc/sys/m88kbug/$(DEPDIR) libc/sys/mmixware/$(DEPDIR) libc/sys/netware/$(DEPDIR) libc/sys/or1k/$(DEPDIR) libc/sys/rdos/$(DEPDIR) libc/sys/rtems/$(DEPDIR) libc/sys/sh/$(DEPDIR) libc/sys/sysmec/$(DEPDIR) libc/sys/sysnec810/$(DEPDIR) libc/sys/sysnecv850/$(DEPDIR) libc/sys/sysvi386/$(DEPDIR) libc/sys/sysvnecv70/$(DEPDIR) libc/sys/tirtos/$(DEPDIR) libc/sys/w65/$(DEPDIR) libc/sys/z8ksim/$(DEPDIR) libc/syscalls/$(DEPDIR) libc/time/$(DEPDIR) libc/unix/$(DEPDIR) libc/xdr/$(DEPDIR) libm/common/$(DEPDIR) libm/complex/$(DEPDIR) libm/fenv/$(DEPDIR) libm/machine/aarch64/$(DEPDIR) libm/machine/amdgcn/$(DEPDIR) libm/machine/arm/$(DEPDIR) libm/machine/i386/$(DEPDIR) libm/machine/mips/$(DEPDIR) libm/machine/nds32/$(DEPDIR) libm/machine/powerpc/$(DEPDIR) libm/machine/pru/$(DEPDIR) libm/machine/riscv/$(DEPDIR) libm/machine/sparc/$(DEPDIR) libm/machine/spu/$(DEPDIR) libm/machine/x86_64/$(DEPDIR) libm/math/$(DEPDIR) libm/mathfp/$(DEPDIR) libm/test/$(DEPDIR)
+ -rm -rf libc/argz/$(DEPDIR) libc/ctype/$(DEPDIR) libc/errno/$(DEPDIR) libc/iconv/ccs/$(DEPDIR) libc/iconv/ces/$(DEPDIR) libc/iconv/lib/$(DEPDIR) libc/locale/$(DEPDIR) libc/machine/aarch64/$(DEPDIR) libc/machine/amdgcn/$(DEPDIR) libc/machine/arc/$(DEPDIR) libc/machine/arm/$(DEPDIR) libc/machine/bfin/$(DEPDIR) libc/machine/cr16/$(DEPDIR) libc/machine/cris/$(DEPDIR) libc/machine/crx/$(DEPDIR) libc/machine/csky/$(DEPDIR) libc/machine/d10v/$(DEPDIR) libc/machine/d30v/$(DEPDIR) libc/machine/epiphany/$(DEPDIR) libc/machine/fr30/$(DEPDIR) libc/machine/frv/$(DEPDIR) libc/machine/ft32/$(DEPDIR) libc/machine/h8300/$(DEPDIR) libc/machine/h8500/$(DEPDIR) libc/machine/hppa/$(DEPDIR) libc/machine/i386/$(DEPDIR) libc/machine/i960/$(DEPDIR) libc/machine/iq2000/$(DEPDIR) libc/machine/lm32/$(DEPDIR) libc/machine/m32c/$(DEPDIR) libc/machine/m32r/$(DEPDIR) libc/machine/m68hc11/$(DEPDIR) libc/machine/m68k/$(DEPDIR) libc/machine/m88k/$(DEPDIR) libc/machine/mep/$(DEPDIR) libc/machine/microblaze/$(DEPDIR) libc/machine/mips/$(DEPDIR) libc/machine/mn10200/$(DEPDIR) libc/machine/mn10300/$(DEPDIR) libc/machine/moxie/$(DEPDIR) libc/machine/msp430/$(DEPDIR) libc/machine/mt/$(DEPDIR) libc/machine/nds32/$(DEPDIR) libc/machine/necv70/$(DEPDIR) libc/machine/nvptx/$(DEPDIR) libc/machine/or1k/$(DEPDIR) libc/machine/powerpc/$(DEPDIR) libc/machine/riscv/$(DEPDIR) libc/machine/rl78/$(DEPDIR) libc/machine/rx/$(DEPDIR) libc/machine/sh/$(DEPDIR) libc/machine/sparc/$(DEPDIR) libc/machine/spu/$(DEPDIR) libc/machine/tic4x/$(DEPDIR) libc/machine/tic6x/$(DEPDIR) libc/machine/tic80/$(DEPDIR) libc/machine/v850/$(DEPDIR) libc/machine/visium/$(DEPDIR) libc/machine/w65/$(DEPDIR) libc/machine/x86_64/$(DEPDIR) libc/machine/xc16x/$(DEPDIR) libc/machine/xstormy16/$(DEPDIR) libc/machine/z8k/$(DEPDIR) libc/misc/$(DEPDIR) libc/posix/$(DEPDIR) libc/reent/$(DEPDIR) libc/search/$(DEPDIR) libc/signal/$(DEPDIR) libc/ssp/$(DEPDIR) libc/stdio/$(DEPDIR) libc/stdio64/$(DEPDIR) libc/stdlib/$(DEPDIR) libc/string/$(DEPDIR) libc/sys/a29khif/$(DEPDIR) libc/sys/amdgcn/$(DEPDIR) libc/sys/arm/$(DEPDIR) libc/sys/d10v/$(DEPDIR) libc/sys/epiphany/$(DEPDIR) libc/sys/h8300hms/$(DEPDIR) libc/sys/h8500hms/$(DEPDIR) libc/sys/m88kbug/$(DEPDIR) libc/sys/mmixware/$(DEPDIR) libc/sys/netware/$(DEPDIR) libc/sys/or1k/$(DEPDIR) libc/sys/rdos/$(DEPDIR) libc/sys/rtems/$(DEPDIR) libc/sys/sh/$(DEPDIR) libc/sys/sysmec/$(DEPDIR) libc/sys/sysnec810/$(DEPDIR) libc/sys/sysnecv850/$(DEPDIR) libc/sys/sysvi386/$(DEPDIR) libc/sys/sysvnecv70/$(DEPDIR) libc/sys/tirtos/$(DEPDIR) libc/sys/w65/$(DEPDIR) libc/sys/z8ksim/$(DEPDIR) libc/syscalls/$(DEPDIR) libc/time/$(DEPDIR) libc/unix/$(DEPDIR) libc/xdr/$(DEPDIR) libm/common/$(DEPDIR) libm/complex/$(DEPDIR) libm/fenv/$(DEPDIR) libm/ld/$(DEPDIR) libm/ld128/$(DEPDIR) libm/ld80/$(DEPDIR) libm/machine/aarch64/$(DEPDIR) libm/machine/amdgcn/$(DEPDIR) libm/machine/arm/$(DEPDIR) libm/machine/i386/$(DEPDIR) libm/machine/mips/$(DEPDIR) libm/machine/nds32/$(DEPDIR) libm/machine/powerpc/$(DEPDIR) libm/machine/pru/$(DEPDIR) libm/machine/riscv/$(DEPDIR) libm/machine/sparc/$(DEPDIR) libm/machine/spu/$(DEPDIR) libm/machine/x86_64/$(DEPDIR) libm/math/$(DEPDIR) libm/mathfp/$(DEPDIR) libm/test/$(DEPDIR)
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-aminfo \
maintainer-clean-generic maintainer-clean-local
diff --git a/newlib/configure b/newlib/configure
index 6be7896ea..77ab8eca0 100755
--- a/newlib/configure
+++ b/newlib/configure
@@ -633,6 +633,8 @@ HAS_NDS32_FPU_SP_FALSE
HAS_NDS32_FPU_SP_TRUE
MACH_ADD_SETJMP_FALSE
MACH_ADD_SETJMP_TRUE
+HAVE_FPMATH_H_FALSE
+HAVE_FPMATH_H_TRUE
HAVE_LIBC_MACHINE_Z8K_FALSE
HAVE_LIBC_MACHINE_Z8K_TRUE
HAVE_LIBC_MACHINE_XSTORMY16_FALSE
@@ -6123,6 +6125,16 @@ else
fi
+ if test -r "${srcdir}/libc/machine/${machine_dir}/machine/_fpmath.h"; then
+ HAVE_FPMATH_H_TRUE=
+ HAVE_FPMATH_H_FALSE='#'
+else
+ HAVE_FPMATH_H_TRUE='#'
+ HAVE_FPMATH_H_FALSE=
+fi
+
+
+
if test "x$mach_add_setjmp" = "xtrue"; then
MACH_ADD_SETJMP_TRUE=
MACH_ADD_SETJMP_FALSE='#'
@@ -7869,6 +7881,10 @@ if test -z "${HAVE_LIBC_MACHINE_Z8K_TRUE}" && test -z "${HAVE_LIBC_MACHINE_Z8K_F
as_fn_error $? "conditional \"HAVE_LIBC_MACHINE_Z8K\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
+if test -z "${HAVE_FPMATH_H_TRUE}" && test -z "${HAVE_FPMATH_H_FALSE}"; then
+ as_fn_error $? "conditional \"HAVE_FPMATH_H\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
if test -z "${MACH_ADD_SETJMP_TRUE}" && test -z "${MACH_ADD_SETJMP_FALSE}"; then
as_fn_error $? "conditional \"MACH_ADD_SETJMP\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
diff --git a/newlib/newlib.hin b/newlib/newlib.hin
index e87a5eabb..7a1d921d6 100644
--- a/newlib/newlib.hin
+++ b/newlib/newlib.hin
@@ -375,6 +375,9 @@
/* nano version of malloc is used. */
#undef _NANO_MALLOC
+/* "The newlib version in string format." */
+#undef _NEWLIB_VERSION
+
/* Verify _REENT_CHECK macros allocate memory successfully. */
#undef _REENT_CHECK_VERIFY
@@ -422,4 +425,13 @@
/* Define if wide char orientation is supported. */
#undef _WIDE_ORIENT
+/* "The newlib minor version number." */
+#undef __NEWLIB_MINOR__
+
+/* "The newlib patch level." */
+#undef __NEWLIB_PATCHLEVEL__
+
+/* "The newlib major version number." */
+#undef __NEWLIB__
+
#endif /* !__NEWLIB_H__ */
--
2.31.1
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 1/3] newlib: Add FreeBSD files for non LDBL_EQ_DBL support
2023-04-20 21:23 ` [PATCH v2 1/3] newlib: Add FreeBSD files for non LDBL_EQ_DBL support Jennifer Averett
@ 2023-04-24 8:51 ` Corinna Vinschen
2023-04-24 12:47 ` Jennifer Averett
2023-04-24 13:03 ` Sebastian Huber
1 sibling, 1 reply; 9+ messages in thread
From: Corinna Vinschen @ 2023-04-24 8:51 UTC (permalink / raw)
To: Jennifer Averett; +Cc: newlib
Hi Jennifer,
On Apr 20 16:23, Jennifer Averett wrote:
> FreeBSD files to add long double support for i386,
> aarch64 and x86_64.
Building on Cygwin, I'm ewncountering a few errors:
newlib/libm/ld/s_ilogbl.c: In function ‘ilogbl’:
newlib/libm/ld/s_ilogbl.c:26:9: error: unknown type name ‘uint64_t’
26 | uint64_t m;
| ^~~~~~~~
newlib/libm/ld/s_ilogbl.c:21:1: note: ‘uint64_t’ is defined in header ‘<stdint.h>’; did you forget to ‘#include <stdint.h>’?
20 | #include "fpmath.h"
+++ |+#include <stdint.h>
21 |
newlib/libm/ld/s_rintl.c: In function ‘rintl’:
CC libm/complex/libm_a-creal.o
newlib/libm/ld/s_rintl.c:60:9: error: unknown type name ‘uint32_t’
60 | uint32_t expsign;
| ^~~~~~~~
newlib/libm/ld/s_rintl.c:36:1: note: ‘uint32_t’ is defined in header ‘<stdint.h>’; did you forget to ‘#include <stdint.h>’?
35 | #include "fpmath.h"
+++ |+#include <stdint.h>
36 |
newlib/libm/ld/s_ilogbl.c: In function ‘ilogbl’:
newlib/libm/ld/s_ilogbl.c:26:9: error: unknown type name ‘uint64_t’
26 | uint64_t m;
| ^~~~~~~~
newlib/libm/ld/s_ilogbl.c:21:1: note: ‘uint64_t’ is defined in header ‘<stdint.h>’; did you forget to ‘#include <stdint.h>’?
20 | #include "fpmath.h"
+++ |+#include <stdint.h>
21 |
Adding #include <stdint.h> actually fixes them.
Thanks,
Corinna
> ---
> newlib/libc/include/sys/endian.h | 177 ++++
> newlib/libc/machine/aarch64/machine/_fpmath.h | 58 ++
> newlib/libc/machine/i386/machine/_fpmath.h | 56 ++
> newlib/libc/machine/x86_64/machine/_fpmath.h | 57 ++
> newlib/libm/ld/e_acoshl.c | 89 ++
> newlib/libm/ld/e_acosl.c | 87 ++
> newlib/libm/ld/e_asinl.c | 77 ++
> newlib/libm/ld/e_atan2l.c | 120 +++
> newlib/libm/ld/e_atanhl.c | 74 ++
> newlib/libm/ld/e_coshl.c | 132 +++
> newlib/libm/ld/e_fmodl.c | 149 +++
> newlib/libm/ld/e_lgammal.c | 25 +
> newlib/libm/ld/e_remainderl.c | 40 +
> newlib/libm/ld/e_sinhl.c | 134 +++
> newlib/libm/ld/fpmath.h | 82 ++
> newlib/libm/ld/math_private.h | 924 ++++++++++++++++++
> newlib/libm/ld/s_asinhl.c | 91 ++
> newlib/libm/ld/s_atanl.c | 85 ++
> newlib/libm/ld/s_cbrtl.c | 143 +++
> newlib/libm/ld/s_ceill.c | 101 ++
> newlib/libm/ld/s_copysignl.c | 44 +
> newlib/libm/ld/s_cosl.c | 102 ++
> newlib/libm/ld/s_fabsl.c | 45 +
> newlib/libm/ld/s_fdim.c | 48 +
> newlib/libm/ld/s_floorl.c | 101 ++
> newlib/libm/ld/s_fmal.c | 274 ++++++
> newlib/libm/ld/s_fmaxl.c | 57 ++
> newlib/libm/ld/s_fminl.c | 57 ++
> newlib/libm/ld/s_frexpl.c | 64 ++
> newlib/libm/ld/s_ilogbl.c | 53 +
> newlib/libm/ld/s_llrintl.c | 9 +
> newlib/libm/ld/s_llroundl.c | 11 +
> newlib/libm/ld/s_logbl.c | 54 +
> newlib/libm/ld/s_lrint.c | 60 ++
> newlib/libm/ld/s_lrintl.c | 9 +
> newlib/libm/ld/s_lround.c | 70 ++
> newlib/libm/ld/s_lroundl.c | 11 +
> newlib/libm/ld/s_modfl.c | 103 ++
> newlib/libm/ld/s_nearbyint.c | 61 ++
> newlib/libm/ld/s_nextafterl.c | 80 ++
> newlib/libm/ld/s_nexttoward.c | 72 ++
> newlib/libm/ld/s_nexttowardf.c | 59 ++
> newlib/libm/ld/s_remquol.c | 173 ++++
> newlib/libm/ld/s_rintl.c | 92 ++
> newlib/libm/ld/s_roundl.c | 64 ++
> newlib/libm/ld/s_scalbln.c | 56 ++
> newlib/libm/ld/s_scalbnl.c | 49 +
> newlib/libm/ld/s_sinl.c | 95 ++
> newlib/libm/ld/s_tanhl.c | 174 ++++
> newlib/libm/ld/s_tanl.c | 97 ++
> newlib/libm/ld/s_truncl.c | 68 ++
> newlib/libm/ld128/b_tgammal.c | 57 ++
> newlib/libm/ld128/e_lgammal_r.c | 330 +++++++
> newlib/libm/ld128/e_powl.c | 443 +++++++++
> newlib/libm/ld128/e_rem_pio2l.h | 135 +++
> newlib/libm/ld128/invtrig.c | 102 ++
> newlib/libm/ld128/invtrig.h | 115 +++
> newlib/libm/ld128/k_cosl.c | 59 ++
> newlib/libm/ld128/k_expl.h | 324 ++++++
> newlib/libm/ld128/k_sinl.c | 59 ++
> newlib/libm/ld128/s_erfl.c | 329 +++++++
> newlib/libm/ld128/s_exp2l.c | 429 ++++++++
> newlib/libm/ld128/s_expl.c | 326 ++++++
> newlib/libm/ld128/s_logl.c | 740 ++++++++++++++
> newlib/libm/ld80/b_expl.c | 113 +++
> newlib/libm/ld80/b_logl.c | 375 +++++++
> newlib/libm/ld80/b_tgammal.c | 419 ++++++++
> newlib/libm/ld80/e_lgammal_r.c | 358 +++++++
> newlib/libm/ld80/e_powl.c | 662 +++++++++++++
> newlib/libm/ld80/e_rem_pio2l.h | 143 +++
> newlib/libm/ld80/invtrig.c | 84 ++
> newlib/libm/ld80/invtrig.h | 116 +++
> newlib/libm/ld80/k_cosl.c | 78 ++
> newlib/libm/ld80/k_cospil.h | 42 +
> newlib/libm/ld80/k_expl.h | 301 ++++++
> newlib/libm/ld80/k_sinl.c | 62 ++
> newlib/libm/ld80/k_sinpil.h | 42 +
> newlib/libm/ld80/s_cospil.c | 129 +++
> newlib/libm/ld80/s_erfl.c | 337 +++++++
> newlib/libm/ld80/s_exp2l.c | 290 ++++++
> newlib/libm/ld80/s_expl.c | 279 ++++++
> newlib/libm/ld80/s_logl.c | 722 ++++++++++++++
> newlib/libm/ld80/s_sinpil.c | 140 +++
> 83 files changed, 13153 insertions(+)
> create mode 100644 newlib/libc/include/sys/endian.h
> create mode 100644 newlib/libc/machine/aarch64/machine/_fpmath.h
> create mode 100644 newlib/libc/machine/i386/machine/_fpmath.h
> create mode 100644 newlib/libc/machine/x86_64/machine/_fpmath.h
> create mode 100644 newlib/libm/ld/e_acoshl.c
> create mode 100644 newlib/libm/ld/e_acosl.c
> create mode 100644 newlib/libm/ld/e_asinl.c
> create mode 100644 newlib/libm/ld/e_atan2l.c
> create mode 100644 newlib/libm/ld/e_atanhl.c
> create mode 100644 newlib/libm/ld/e_coshl.c
> create mode 100644 newlib/libm/ld/e_fmodl.c
> create mode 100644 newlib/libm/ld/e_lgammal.c
> create mode 100644 newlib/libm/ld/e_remainderl.c
> create mode 100644 newlib/libm/ld/e_sinhl.c
> create mode 100644 newlib/libm/ld/fpmath.h
> create mode 100644 newlib/libm/ld/math_private.h
> create mode 100644 newlib/libm/ld/s_asinhl.c
> create mode 100644 newlib/libm/ld/s_atanl.c
> create mode 100644 newlib/libm/ld/s_cbrtl.c
> create mode 100644 newlib/libm/ld/s_ceill.c
> create mode 100644 newlib/libm/ld/s_copysignl.c
> create mode 100644 newlib/libm/ld/s_cosl.c
> create mode 100644 newlib/libm/ld/s_fabsl.c
> create mode 100644 newlib/libm/ld/s_fdim.c
> create mode 100644 newlib/libm/ld/s_floorl.c
> create mode 100644 newlib/libm/ld/s_fmal.c
> create mode 100644 newlib/libm/ld/s_fmaxl.c
> create mode 100644 newlib/libm/ld/s_fminl.c
> create mode 100644 newlib/libm/ld/s_frexpl.c
> create mode 100644 newlib/libm/ld/s_ilogbl.c
> create mode 100644 newlib/libm/ld/s_llrintl.c
> create mode 100644 newlib/libm/ld/s_llroundl.c
> create mode 100644 newlib/libm/ld/s_logbl.c
> create mode 100644 newlib/libm/ld/s_lrint.c
> create mode 100644 newlib/libm/ld/s_lrintl.c
> create mode 100644 newlib/libm/ld/s_lround.c
> create mode 100644 newlib/libm/ld/s_lroundl.c
> create mode 100644 newlib/libm/ld/s_modfl.c
> create mode 100644 newlib/libm/ld/s_nearbyint.c
> create mode 100644 newlib/libm/ld/s_nextafterl.c
> create mode 100644 newlib/libm/ld/s_nexttoward.c
> create mode 100644 newlib/libm/ld/s_nexttowardf.c
> create mode 100644 newlib/libm/ld/s_remquol.c
> create mode 100644 newlib/libm/ld/s_rintl.c
> create mode 100644 newlib/libm/ld/s_roundl.c
> create mode 100644 newlib/libm/ld/s_scalbln.c
> create mode 100644 newlib/libm/ld/s_scalbnl.c
> create mode 100644 newlib/libm/ld/s_sinl.c
> create mode 100644 newlib/libm/ld/s_tanhl.c
> create mode 100644 newlib/libm/ld/s_tanl.c
> create mode 100644 newlib/libm/ld/s_truncl.c
> create mode 100644 newlib/libm/ld128/b_tgammal.c
> create mode 100644 newlib/libm/ld128/e_lgammal_r.c
> create mode 100644 newlib/libm/ld128/e_powl.c
> create mode 100644 newlib/libm/ld128/e_rem_pio2l.h
> create mode 100644 newlib/libm/ld128/invtrig.c
> create mode 100644 newlib/libm/ld128/invtrig.h
> create mode 100644 newlib/libm/ld128/k_cosl.c
> create mode 100644 newlib/libm/ld128/k_expl.h
> create mode 100644 newlib/libm/ld128/k_sinl.c
> create mode 100644 newlib/libm/ld128/s_erfl.c
> create mode 100644 newlib/libm/ld128/s_exp2l.c
> create mode 100644 newlib/libm/ld128/s_expl.c
> create mode 100644 newlib/libm/ld128/s_logl.c
> create mode 100644 newlib/libm/ld80/b_expl.c
> create mode 100644 newlib/libm/ld80/b_logl.c
> create mode 100644 newlib/libm/ld80/b_tgammal.c
> create mode 100644 newlib/libm/ld80/e_lgammal_r.c
> create mode 100644 newlib/libm/ld80/e_powl.c
> create mode 100644 newlib/libm/ld80/e_rem_pio2l.h
> create mode 100644 newlib/libm/ld80/invtrig.c
> create mode 100644 newlib/libm/ld80/invtrig.h
> create mode 100644 newlib/libm/ld80/k_cosl.c
> create mode 100644 newlib/libm/ld80/k_cospil.h
> create mode 100644 newlib/libm/ld80/k_expl.h
> create mode 100644 newlib/libm/ld80/k_sinl.c
> create mode 100644 newlib/libm/ld80/k_sinpil.h
> create mode 100644 newlib/libm/ld80/s_cospil.c
> create mode 100644 newlib/libm/ld80/s_erfl.c
> create mode 100644 newlib/libm/ld80/s_exp2l.c
> create mode 100644 newlib/libm/ld80/s_expl.c
> create mode 100644 newlib/libm/ld80/s_logl.c
> create mode 100644 newlib/libm/ld80/s_sinpil.c
>
> diff --git a/newlib/libc/include/sys/endian.h b/newlib/libc/include/sys/endian.h
> new file mode 100644
> index 000000000..d91c442e9
> --- /dev/null
> +++ b/newlib/libc/include/sys/endian.h
> @@ -0,0 +1,177 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2002 Thomas Moestl <tmm@FreeBSD.org>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + *
> + * $FreeBSD$
> + */
> +
> +#ifndef _SYS_ENDIAN_H_
> +#define _SYS_ENDIAN_H_
> +
> +#include <sys/cdefs.h>
> +#include <sys/_types.h>
> +#include <machine/endian.h>
> +
> +#ifndef _UINT8_T_DECLARED
> +typedef __uint8_t uint8_t;
> +#define _UINT8_T_DECLARED
> +#endif
> +
> +#ifndef _UINT16_T_DECLARED
> +typedef __uint16_t uint16_t;
> +#define _UINT16_T_DECLARED
> +#endif
> +
> +#ifndef _UINT32_T_DECLARED
> +typedef __uint32_t uint32_t;
> +#define _UINT32_T_DECLARED
> +#endif
> +
> +#ifndef _UINT64_T_DECLARED
> +typedef __uint64_t uint64_t;
> +#define _UINT64_T_DECLARED
> +#endif
> +
> +/*
> + * Note: While tempting to try to avoid namespace pollution from this file,
> + * several software packages assume these marcos are defined, even when it
> + * defines _POSIX_C_SOURCE to request an unpolluted namespace.
> + */
> +
> +/*
> + * General byte order swapping functions.
> + */
> +#define bswap16(x) __bswap16(x)
> +#define bswap32(x) __bswap32(x)
> +#define bswap64(x) __bswap64(x)
> +
> +/* Alignment-agnostic encode/decode bytestream to/from little/big endian. */
> +static __inline uint16_t
> +be16dec(const void *pp)
> +{
> + uint8_t const *p = (uint8_t const *)pp;
> +
> + return ((p[0] << 8) | p[1]);
> +}
> +
> +static __inline uint32_t
> +be32dec(const void *pp)
> +{
> + uint8_t const *p = (uint8_t const *)pp;
> +
> + return (((unsigned)p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]);
> +}
> +
> +static __inline uint64_t
> +be64dec(const void *pp)
> +{
> + uint8_t const *p = (uint8_t const *)pp;
> +
> + return (((uint64_t)be32dec(p) << 32) | be32dec(p + 4));
> +}
> +
> +static __inline uint16_t
> +le16dec(const void *pp)
> +{
> + uint8_t const *p = (uint8_t const *)pp;
> +
> + return ((p[1] << 8) | p[0]);
> +}
> +
> +static __inline uint32_t
> +le32dec(const void *pp)
> +{
> + uint8_t const *p = (uint8_t const *)pp;
> +
> + return (((unsigned)p[3] << 24) | (p[2] << 16) | (p[1] << 8) | p[0]);
> +}
> +
> +static __inline uint64_t
> +le64dec(const void *pp)
> +{
> + uint8_t const *p = (uint8_t const *)pp;
> +
> + return (((uint64_t)le32dec(p + 4) << 32) | le32dec(p));
> +}
> +
> +static __inline void
> +be16enc(void *pp, uint16_t u)
> +{
> + uint8_t *p = (uint8_t *)pp;
> +
> + p[0] = (u >> 8) & 0xff;
> + p[1] = u & 0xff;
> +}
> +
> +static __inline void
> +be32enc(void *pp, uint32_t u)
> +{
> + uint8_t *p = (uint8_t *)pp;
> +
> + p[0] = (u >> 24) & 0xff;
> + p[1] = (u >> 16) & 0xff;
> + p[2] = (u >> 8) & 0xff;
> + p[3] = u & 0xff;
> +}
> +
> +static __inline void
> +be64enc(void *pp, uint64_t u)
> +{
> + uint8_t *p = (uint8_t *)pp;
> +
> + be32enc(p, (uint32_t)(u >> 32));
> + be32enc(p + 4, (uint32_t)(u & 0xffffffffU));
> +}
> +
> +static __inline void
> +le16enc(void *pp, uint16_t u)
> +{
> + uint8_t *p = (uint8_t *)pp;
> +
> + p[0] = u & 0xff;
> + p[1] = (u >> 8) & 0xff;
> +}
> +
> +static __inline void
> +le32enc(void *pp, uint32_t u)
> +{
> + uint8_t *p = (uint8_t *)pp;
> +
> + p[0] = u & 0xff;
> + p[1] = (u >> 8) & 0xff;
> + p[2] = (u >> 16) & 0xff;
> + p[3] = (u >> 24) & 0xff;
> +}
> +
> +static __inline void
> +le64enc(void *pp, uint64_t u)
> +{
> + uint8_t *p = (uint8_t *)pp;
> +
> + le32enc(p, (uint32_t)(u & 0xffffffffU));
> + le32enc(p + 4, (uint32_t)(u >> 32));
> +}
> +#endif /* _SYS_ENDIAN_H_ */
> diff --git a/newlib/libc/machine/aarch64/machine/_fpmath.h b/newlib/libc/machine/aarch64/machine/_fpmath.h
> new file mode 100644
> index 000000000..71d0a7152
> --- /dev/null
> +++ b/newlib/libc/machine/aarch64/machine/_fpmath.h
> @@ -0,0 +1,58 @@
> +/*-
> + * Copyright (c) 2002, 2003 David Schultz <das@FreeBSD.ORG>
> + * Copyright (2) 2014 The FreeBSD Foundation
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + *
> + * $FreeBSD$
> + */
> +
> +union IEEEl2bits {
> + long double e;
> + struct {
> + unsigned long manl :64;
> + unsigned long manh :48;
> + unsigned int exp :15;
> + unsigned int sign :1;
> + } bits;
> + /* TODO andrew: Check the packing here */
> + struct {
> + unsigned long manl :64;
> + unsigned long manh :48;
> + unsigned int expsign :16;
> + } xbits;
> +};
> +
> +#define LDBL_NBIT 0
> +#define LDBL_IMPLICIT_NBIT
> +#define mask_nbit_l(u) ((void)0)
> +
> +#define LDBL_MANH_SIZE 48
> +#define LDBL_MANL_SIZE 64
> +
> +#define LDBL_TO_ARRAY32(u, a) do { \
> + (a)[0] = (uint32_t)(u).bits.manl; \
> + (a)[1] = (uint32_t)((u).bits.manl >> 32); \
> + (a)[2] = (uint32_t)(u).bits.manh; \
> + (a)[3] = (uint32_t)((u).bits.manh >> 32); \
> +} while(0)
> diff --git a/newlib/libc/machine/i386/machine/_fpmath.h b/newlib/libc/machine/i386/machine/_fpmath.h
> new file mode 100644
> index 000000000..874439c34
> --- /dev/null
> +++ b/newlib/libc/machine/i386/machine/_fpmath.h
> @@ -0,0 +1,56 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2002, 2003 David Schultz <das@FreeBSD.ORG>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + *
> + * $FreeBSD$
> + */
> +
> +union IEEEl2bits {
> + long double e;
> + struct {
> + unsigned int manl :32;
> + unsigned int manh :32;
> + unsigned int exp :15;
> + unsigned int sign :1;
> + unsigned int junk :16;
> + } bits;
> + struct {
> + unsigned long long man :64;
> + unsigned int expsign :16;
> + unsigned int junk :16;
> + } xbits;
> +};
> +
> +#define LDBL_NBIT 0x80000000
> +#define mask_nbit_l(u) ((u).bits.manh &= ~LDBL_NBIT)
> +
> +#define LDBL_MANH_SIZE 32
> +#define LDBL_MANL_SIZE 32
> +
> +#define LDBL_TO_ARRAY32(u, a) do { \
> + (a)[0] = (uint32_t)(u).bits.manl; \
> + (a)[1] = (uint32_t)(u).bits.manh; \
> +} while (0)
> diff --git a/newlib/libc/machine/x86_64/machine/_fpmath.h b/newlib/libc/machine/x86_64/machine/_fpmath.h
> new file mode 100644
> index 000000000..8be7b7dba
> --- /dev/null
> +++ b/newlib/libc/machine/x86_64/machine/_fpmath.h
> @@ -0,0 +1,57 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2002, 2003 David Schultz <das@FreeBSD.ORG>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + *
> + * $FreeBSD$
> + */
> +
> +union IEEEl2bits {
> + long double e;
> + struct {
> + unsigned int manl :32;
> + unsigned int manh :32;
> + unsigned int exp :15;
> + unsigned int sign :1;
> + unsigned int junkl :16;
> + unsigned int junkh :32;
> + } bits;
> + struct {
> + unsigned long man :64;
> + unsigned int expsign :16;
> + unsigned long junk :48;
> + } xbits;
> +};
> +
> +#define LDBL_NBIT 0x80000000
> +#define mask_nbit_l(u) ((u).bits.manh &= ~LDBL_NBIT)
> +
> +#define LDBL_MANH_SIZE 32
> +#define LDBL_MANL_SIZE 32
> +
> +#define LDBL_TO_ARRAY32(u, a) do { \
> + (a)[0] = (uint32_t)(u).bits.manl; \
> + (a)[1] = (uint32_t)(u).bits.manh; \
> +} while (0)
> diff --git a/newlib/libm/ld/e_acoshl.c b/newlib/libm/ld/e_acoshl.c
> new file mode 100644
> index 000000000..b9f3aed67
> --- /dev/null
> +++ b/newlib/libm/ld/e_acoshl.c
> @@ -0,0 +1,89 @@
> +/* from: FreeBSD: head/lib/msun/src/e_acosh.c 176451 2008-02-22 02:30:36Z das */
> +
> +/* @(#)e_acosh.c 1.3 95/01/18 */
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunSoft, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + *
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * See e_acosh.c for complete comments.
> + *
> + * Converted to long double by David Schultz <das@FreeBSD.ORG> and
> + * Bruce D. Evans.
> + */
> +
> +#include <float.h>
> +#ifdef __i386__
> +#include <ieeefp.h>
> +#endif
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +
> +/* EXP_LARGE is the threshold above which we use acosh(x) ~= log(2x). */
> +#if LDBL_MANT_DIG == 64
> +#define EXP_LARGE 34
> +#elif LDBL_MANT_DIG == 113
> +#define EXP_LARGE 58
> +#else
> +#error "Unsupported long double format"
> +#endif
> +
> +#if LDBL_MAX_EXP != 0x4000
> +/* We also require the usual expsign encoding. */
> +#error "Unsupported long double format"
> +#endif
> +
> +#define BIAS (LDBL_MAX_EXP - 1)
> +
> +static const double
> +one = 1.0;
> +
> +#if LDBL_MANT_DIG == 64
> +static const union IEEEl2bits
> +u_ln2 = LD80C(0xb17217f7d1cf79ac, -1, 6.93147180559945309417e-1L);
> +#define ln2 u_ln2.e
> +#elif LDBL_MANT_DIG == 113
> +static const long double
> +ln2 = 6.93147180559945309417232121458176568e-1L; /* 0x162e42fefa39ef35793c7673007e6.0p-113 */
> +#else
> +#error "Unsupported long double format"
> +#endif
> +
> +long double
> +acoshl(long double x)
> +{
> + long double t;
> + int16_t hx;
> +
> + ENTERI();
> + GET_LDBL_EXPSIGN(hx, x);
> + if (hx < 0x3fff) { /* x < 1, or misnormal */
> + RETURNI((x-x)/(x-x));
> + } else if (hx >= BIAS + EXP_LARGE) { /* x >= LARGE */
> + if (hx >= 0x7fff) { /* x is inf, NaN or misnormal */
> + RETURNI(x+x);
> + } else
> + RETURNI(logl(x)+ln2); /* acosh(huge)=log(2x), or misnormal */
> + } else if (hx == 0x3fff && x == 1) {
> + RETURNI(0.0); /* acosh(1) = 0 */
> + } else if (hx >= 0x4000) { /* LARGE > x >= 2, or misnormal */
> + t=x*x;
> + RETURNI(logl(2.0*x-one/(x+sqrtl(t-one))));
> + } else { /* 1<x<2 */
> + t = x-one;
> + RETURNI(log1pl(t+sqrtl(2.0*t+t*t)));
> + }
> +}
> diff --git a/newlib/libm/ld/e_acosl.c b/newlib/libm/ld/e_acosl.c
> new file mode 100644
> index 000000000..d33c8feda
> --- /dev/null
> +++ b/newlib/libm/ld/e_acosl.c
> @@ -0,0 +1,87 @@
> +
> +/* @(#)e_acos.c 1.3 95/01/18 */
> +/* FreeBSD: head/lib/msun/src/e_acos.c 176451 2008-02-22 02:30:36Z das */
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunSoft, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * See comments in e_acos.c.
> + * Converted to long double by David Schultz <das@FreeBSD.ORG>.
> + */
> +
> +#include <float.h>
> +
> +#include "invtrig.h"
> +#include "math.h"
> +#include "math_private.h"
> +
> +static const long double
> +one= 1.00000000000000000000e+00;
> +
> +#ifdef __i386__
> +/* XXX Work around the fact that gcc truncates long double constants on i386 */
> +static volatile double
> +pi1 = 3.14159265358979311600e+00, /* 0x1.921fb54442d18p+1 */
> +pi2 = 1.22514845490862001043e-16; /* 0x1.1a80000000000p-53 */
> +#define pi ((long double)pi1 + pi2)
> +#else
> +static const long double
> +pi = 3.14159265358979323846264338327950280e+00L;
> +#endif
> +
> +long double
> +acosl(long double x)
> +{
> + union IEEEl2bits u;
> + long double z,p,q,r,w,s,c,df;
> + int16_t expsign, expt;
> + u.e = x;
> + expsign = u.xbits.expsign;
> + expt = expsign & 0x7fff;
> + if(expt >= BIAS) { /* |x| >= 1 */
> + if(expt==BIAS && ((u.bits.manh&~LDBL_NBIT)|u.bits.manl)==0) {
> + if (expsign>0) return 0.0; /* acos(1) = 0 */
> + else return pi+2.0*pio2_lo; /* acos(-1)= pi */
> + }
> + return (x-x)/(x-x); /* acos(|x|>1) is NaN */
> + }
> + if(expt<BIAS-1) { /* |x| < 0.5 */
> + if(expt<ACOS_CONST) return pio2_hi+pio2_lo;/*x tiny: acosl=pi/2*/
> + z = x*x;
> + p = P(z);
> + q = Q(z);
> + r = p/q;
> + return pio2_hi - (x - (pio2_lo-x*r));
> + } else if (expsign<0) { /* x < -0.5 */
> + z = (one+x)*0.5;
> + p = P(z);
> + q = Q(z);
> + s = sqrtl(z);
> + r = p/q;
> + w = r*s-pio2_lo;
> + return pi - 2.0*(s+w);
> + } else { /* x > 0.5 */
> + z = (one-x)*0.5;
> + s = sqrtl(z);
> + u.e = s;
> + u.bits.manl = 0;
> + df = u.e;
> + c = (z-df*df)/(s+df);
> + p = P(z);
> + q = Q(z);
> + r = p/q;
> + w = r*s+c;
> + return 2.0*(df+w);
> + }
> +}
> diff --git a/newlib/libm/ld/e_asinl.c b/newlib/libm/ld/e_asinl.c
> new file mode 100644
> index 000000000..a85765f1b
> --- /dev/null
> +++ b/newlib/libm/ld/e_asinl.c
> @@ -0,0 +1,77 @@
> +
> +/* @(#)e_asin.c 1.3 95/01/18 */
> +/* FreeBSD: head/lib/msun/src/e_asin.c 176451 2008-02-22 02:30:36Z das */
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunSoft, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * See comments in e_asin.c.
> + * Converted to long double by David Schultz <das@FreeBSD.ORG>.
> + */
> +
> +#include <float.h>
> +
> +#include "invtrig.h"
> +#include "math.h"
> +#include "math_private.h"
> +
> +static const long double
> +one = 1.00000000000000000000e+00,
> +huge = 1.000e+300;
> +
> +long double
> +asinl(long double x)
> +{
> + union IEEEl2bits u;
> + long double t=0.0,w,p,q,c,r,s;
> + int16_t expsign, expt;
> + u.e = x;
> + expsign = u.xbits.expsign;
> + expt = expsign & 0x7fff;
> + if(expt >= BIAS) { /* |x|>= 1 */
> + if(expt==BIAS && ((u.bits.manh&~LDBL_NBIT)|u.bits.manl)==0)
> + /* asin(1)=+-pi/2 with inexact */
> + return x*pio2_hi+x*pio2_lo;
> + return (x-x)/(x-x); /* asin(|x|>1) is NaN */
> + } else if (expt<BIAS-1) { /* |x|<0.5 */
> + if(expt<ASIN_LINEAR) { /* if |x| is small, asinl(x)=x */
> + if(huge+x>one) return x;/* return x with inexact if x!=0*/
> + }
> + t = x*x;
> + p = P(t);
> + q = Q(t);
> + w = p/q;
> + return x+x*w;
> + }
> + /* 1> |x|>= 0.5 */
> + w = one-fabsl(x);
> + t = w*0.5;
> + p = P(t);
> + q = Q(t);
> + s = sqrtl(t);
> + if(u.bits.manh>=THRESH) { /* if |x| is close to 1 */
> + w = p/q;
> + t = pio2_hi-(2.0*(s+s*w)-pio2_lo);
> + } else {
> + u.e = s;
> + u.bits.manl = 0;
> + w = u.e;
> + c = (t-w*w)/(s+w);
> + r = p/q;
> + p = 2.0*s*r-(pio2_lo-2.0*c);
> + q = pio4_hi-2.0*w;
> + t = pio4_hi-(p-q);
> + }
> + if(expsign>0) return t; else return -t;
> +}
> diff --git a/newlib/libm/ld/e_atan2l.c b/newlib/libm/ld/e_atan2l.c
> new file mode 100644
> index 000000000..94ebdec54
> --- /dev/null
> +++ b/newlib/libm/ld/e_atan2l.c
> @@ -0,0 +1,120 @@
> +
> +/* @(#)e_atan2.c 1.3 95/01/18 */
> +/* FreeBSD: head/lib/msun/src/e_atan2.c 176451 2008-02-22 02:30:36Z das */
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunSoft, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + *
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * See comments in e_atan2.c.
> + * Converted to long double by David Schultz <das@FreeBSD.ORG>.
> + */
> +
> +#include <float.h>
> +
> +#include "invtrig.h"
> +#include "math.h"
> +#include "math_private.h"
> +
> +static volatile long double
> +tiny = 1.0e-300;
> +static const long double
> +zero = 0.0;
> +
> +#ifdef __i386__
> +/* XXX Work around the fact that gcc truncates long double constants on i386 */
> +static volatile double
> +pi1 = 3.14159265358979311600e+00, /* 0x1.921fb54442d18p+1 */
> +pi2 = 1.22514845490862001043e-16; /* 0x1.1a80000000000p-53 */
> +#define pi ((long double)pi1 + pi2)
> +#else
> +static const long double
> +pi = 3.14159265358979323846264338327950280e+00L;
> +#endif
> +
> +long double
> +atan2l(long double y, long double x)
> +{
> + union IEEEl2bits ux, uy;
> + long double z;
> + int32_t k,m;
> + int16_t exptx, expsignx, expty, expsigny;
> +
> + uy.e = y;
> + expsigny = uy.xbits.expsign;
> + expty = expsigny & 0x7fff;
> + ux.e = x;
> + expsignx = ux.xbits.expsign;
> + exptx = expsignx & 0x7fff;
> +
> + if ((exptx==BIAS+LDBL_MAX_EXP &&
> + ((ux.bits.manh&~LDBL_NBIT)|ux.bits.manl)!=0) || /* x is NaN */
> + (expty==BIAS+LDBL_MAX_EXP &&
> + ((uy.bits.manh&~LDBL_NBIT)|uy.bits.manl)!=0)) /* y is NaN */
> + return nan_mix(x, y);
> + if (expsignx==BIAS && ((ux.bits.manh&~LDBL_NBIT)|ux.bits.manl)==0)
> + return atanl(y); /* x=1.0 */
> + m = ((expsigny>>15)&1)|((expsignx>>14)&2); /* 2*sign(x)+sign(y) */
> +
> + /* when y = 0 */
> + if(expty==0 && ((uy.bits.manh&~LDBL_NBIT)|uy.bits.manl)==0) {
> + switch(m) {
> + case 0:
> + case 1: return y; /* atan(+-0,+anything)=+-0 */
> + case 2: return pi+tiny;/* atan(+0,-anything) = pi */
> + case 3: return -pi-tiny;/* atan(-0,-anything) =-pi */
> + }
> + }
> + /* when x = 0 */
> + if(exptx==0 && ((ux.bits.manh&~LDBL_NBIT)|ux.bits.manl)==0)
> + return (expsigny<0)? -pio2_hi-tiny: pio2_hi+tiny;
> +
> + /* when x is INF */
> + if(exptx==BIAS+LDBL_MAX_EXP) {
> + if(expty==BIAS+LDBL_MAX_EXP) {
> + switch(m) {
> + case 0: return pio2_hi*0.5+tiny;/* atan(+INF,+INF) */
> + case 1: return -pio2_hi*0.5-tiny;/* atan(-INF,+INF) */
> + case 2: return 1.5*pio2_hi+tiny;/*atan(+INF,-INF)*/
> + case 3: return -1.5*pio2_hi-tiny;/*atan(-INF,-INF)*/
> + }
> + } else {
> + switch(m) {
> + case 0: return zero ; /* atan(+...,+INF) */
> + case 1: return -zero ; /* atan(-...,+INF) */
> + case 2: return pi+tiny ; /* atan(+...,-INF) */
> + case 3: return -pi-tiny ; /* atan(-...,-INF) */
> + }
> + }
> + }
> + /* when y is INF */
> + if(expty==BIAS+LDBL_MAX_EXP)
> + return (expsigny<0)? -pio2_hi-tiny: pio2_hi+tiny;
> +
> + /* compute y/x */
> + k = expty-exptx;
> + if(k > LDBL_MANT_DIG+2) { /* |y/x| huge */
> + z=pio2_hi+pio2_lo;
> + m&=1;
> + }
> + else if(expsignx<0&&k<-LDBL_MANT_DIG-2) z=0.0; /* |y/x| tiny, x<0 */
> + else z=atanl(fabsl(y/x)); /* safe to do y/x */
> + switch (m) {
> + case 0: return z ; /* atan(+,+) */
> + case 1: return -z ; /* atan(-,+) */
> + case 2: return pi-(z-pi_lo);/* atan(+,-) */
> + default: /* case 3 */
> + return (z-pi_lo)-pi;/* atan(-,-) */
> + }
> +}
> diff --git a/newlib/libm/ld/e_atanhl.c b/newlib/libm/ld/e_atanhl.c
> new file mode 100644
> index 000000000..11d56ea52
> --- /dev/null
> +++ b/newlib/libm/ld/e_atanhl.c
> @@ -0,0 +1,74 @@
> +/* from: FreeBSD: head/lib/msun/src/e_atanh.c 176451 2008-02-22 02:30:36Z das */
> +
> +/* @(#)e_atanh.c 1.3 95/01/18 */
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunSoft, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + *
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * See e_atanh.c for complete comments.
> + *
> + * Converted to long double by David Schultz <das@FreeBSD.ORG> and
> + * Bruce D. Evans.
> + */
> +
> +#include <float.h>
> +#ifdef __i386__
> +#include <ieeefp.h>
> +#endif
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +
> +/* EXP_TINY is the threshold below which we use atanh(x) ~= x. */
> +#if LDBL_MANT_DIG == 64
> +#define EXP_TINY -34
> +#elif LDBL_MANT_DIG == 113
> +#define EXP_TINY -58
> +#else
> +#error "Unsupported long double format"
> +#endif
> +
> +#if LDBL_MAX_EXP != 0x4000
> +/* We also require the usual expsign encoding. */
> +#error "Unsupported long double format"
> +#endif
> +
> +#define BIAS (LDBL_MAX_EXP - 1)
> +
> +static const double one = 1.0, huge = 1e300;
> +static const double zero = 0.0;
> +
> +long double
> +atanhl(long double x)
> +{
> + long double t;
> + uint16_t hx, ix;
> +
> + ENTERI();
> + GET_LDBL_EXPSIGN(hx, x);
> + ix = hx & 0x7fff;
> + if (ix >= 0x3fff) /* |x| >= 1, or NaN or misnormal */
> + RETURNI(fabsl(x) == 1 ? x / zero : (x - x) / (x - x));
> + if (ix < BIAS + EXP_TINY && (huge + x) > zero)
> + RETURNI(x); /* x is tiny */
> + SET_LDBL_EXPSIGN(x, ix);
> + if (ix < 0x3ffe) { /* |x| < 0.5, or misnormal */
> + t = x+x;
> + t = 0.5*log1pl(t+t*x/(one-x));
> + } else
> + t = 0.5*log1pl((x+x)/(one-x));
> + RETURNI((hx & 0x8000) == 0 ? t : -t);
> +}
> diff --git a/newlib/libm/ld/e_coshl.c b/newlib/libm/ld/e_coshl.c
> new file mode 100644
> index 000000000..4e3b28311
> --- /dev/null
> +++ b/newlib/libm/ld/e_coshl.c
> @@ -0,0 +1,132 @@
> +/* from: FreeBSD: head/lib/msun/src/e_coshl.c XXX */
> +
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunPro, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * See e_cosh.c for complete comments.
> + *
> + * Converted to long double by Bruce D. Evans.
> + */
> +
> +#include <float.h>
> +#ifdef __i386__
> +#include <ieeefp.h>
> +#endif
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +#include "k_expl.h"
> +
> +#if LDBL_MAX_EXP != 0x4000
> +/* We also require the usual expsign encoding. */
> +#error "Unsupported long double format"
> +#endif
> +
> +#define BIAS (LDBL_MAX_EXP - 1)
> +
> +static const volatile long double huge = 0x1p10000L, tiny = 0x1p-10000L;
> +#if LDBL_MANT_DIG == 64
> +/*
> + * Domain [-1, 1], range ~[-1.8211e-21, 1.8211e-21]:
> + * |cosh(x) - c(x)| < 2**-68.8
> + */
> +static const union IEEEl2bits
> +C4u = LD80C(0xaaaaaaaaaaaaac78, -5, 4.16666666666666682297e-2L);
> +#define C4 C4u.e
> +static const double
> +C2 = 0.5,
> +C6 = 1.3888888888888616e-3, /* 0x16c16c16c16b99.0p-62 */
> +C8 = 2.4801587301767953e-5, /* 0x1a01a01a027061.0p-68 */
> +C10 = 2.7557319163300398e-7, /* 0x127e4fb6c9b55f.0p-74 */
> +C12 = 2.0876768371393075e-9, /* 0x11eed99406a3f4.0p-81 */
> +C14 = 1.1469537039374480e-11, /* 0x1938c67cd18c48.0p-89 */
> +C16 = 4.8473490896852041e-14; /* 0x1b49c429701e45.0p-97 */
> +#elif LDBL_MANT_DIG == 113
> +/*
> + * Domain [-1, 1], range ~[-2.3194e-37, 2.3194e-37]:
> + * |cosh(x) - c(x)| < 2**-121.69
> + */
> +static const long double
> +C4 = 4.16666666666666666666666666666666225e-2L, /* 0x1555555555555555555555555554e.0p-117L */
> +C6 = 1.38888888888888888888888888889434831e-3L, /* 0x16c16c16c16c16c16c16c16c1dd7a.0p-122L */
> +C8 = 2.48015873015873015873015871870962089e-5L, /* 0x1a01a01a01a01a01a01a017af2756.0p-128L */
> +C10 = 2.75573192239858906525574318600800201e-7L, /* 0x127e4fb7789f5c72ef01c8a040640.0p-134L */
> +C12 = 2.08767569878680989791444691755468269e-9L, /* 0x11eed8eff8d897b543d0679607399.0p-141L */
> +C14= 1.14707455977297247387801189650495351e-11L, /* 0x193974a8c07c9d24ae169a7fa9b54.0p-149L */
> +C16 = 4.77947733238737883626416876486279985e-14L; /* 0x1ae7f3e733b814d4e1b90f5727fe4.0p-157L */
> +static const double
> +C2 = 0.5,
> +C18 = 1.5619206968597871e-16, /* 0x16827863b9900b.0p-105 */
> +C20 = 4.1103176218528049e-19, /* 0x1e542ba3d3c269.0p-114 */
> +C22 = 8.8967926401641701e-22, /* 0x10ce399542a014.0p-122 */
> +C24 = 1.6116681626523904e-24, /* 0x1f2c981d1f0cb7.0p-132 */
> +C26 = 2.5022374732804632e-27; /* 0x18c7ecf8b2c4a0.0p-141 */
> +#else
> +#error "Unsupported long double format"
> +#endif /* LDBL_MANT_DIG == 64 */
> +
> +/* log(2**16385 - 0.5) rounded up: */
> +static const float
> +o_threshold = 1.13572168e4; /* 0xb174de.0p-10 */
> +
> +long double
> +coshl(long double x)
> +{
> + long double hi,lo,x2,x4;
> +#if LDBL_MANT_DIG == 113
> + double dx2;
> +#endif
> + uint16_t ix;
> +
> + GET_LDBL_EXPSIGN(ix,x);
> + ix &= 0x7fff;
> +
> + /* x is INF or NaN */
> + if(ix>=0x7fff) return x*x;
> +
> + ENTERI();
> +
> + /* |x| < 1, return 1 or c(x) */
> + if(ix<0x3fff) {
> + if (ix<BIAS-(LDBL_MANT_DIG+1)/2) /* |x| < TINY */
> + RETURNI(1+tiny); /* cosh(tiny) = 1(+) with inexact */
> + x2 = x*x;
> +#if LDBL_MANT_DIG == 64
> + x4 = x2*x2;
> + RETURNI(((C16*x2 + C14)*x4 + (C12*x2 + C10))*(x4*x4*x2) +
> + ((C8*x2 + C6)*x2 + C4)*x4 + C2*x2 + 1);
> +#elif LDBL_MANT_DIG == 113
> + dx2 = x2;
> + RETURNI((((((((((((C26*dx2 + C24)*dx2 + C22)*dx2 +
> + C20)*x2 + C18)*x2 +
> + C16)*x2 + C14)*x2 + C12)*x2 + C10)*x2 + C8)*x2 + C6)*x2 +
> + C4)*(x2*x2) + C2*x2 + 1);
> +#endif
> + }
> +
> + /* |x| in [1, 64), return accurate exp(|x|)/2+1/exp(|x|)/2 */
> + if (ix < 0x4005) {
> + k_hexpl(fabsl(x), &hi, &lo);
> + RETURNI(lo + 0.25/(hi + lo) + hi);
> + }
> +
> + /* |x| in [64, o_threshold], return correctly-overflowing exp(|x|)/2 */
> + if (fabsl(x) <= o_threshold)
> + RETURNI(hexpl(fabsl(x)));
> +
> + /* |x| > o_threshold, cosh(x) overflow */
> + RETURNI(huge*huge);
> +}
> diff --git a/newlib/libm/ld/e_fmodl.c b/newlib/libm/ld/e_fmodl.c
> new file mode 100644
> index 000000000..ad3bcc34c
> --- /dev/null
> +++ b/newlib/libm/ld/e_fmodl.c
> @@ -0,0 +1,149 @@
> +/* @(#)e_fmod.c 1.3 95/01/18 */
> +/*-
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunSoft, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include <float.h>
> +#include <stdint.h>
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +
> +#define BIAS (LDBL_MAX_EXP - 1)
> +
> +#if LDBL_MANL_SIZE > 32
> +typedef uint64_t manl_t;
> +#else
> +typedef uint32_t manl_t;
> +#endif
> +
> +#if LDBL_MANH_SIZE > 32
> +typedef uint64_t manh_t;
> +#else
> +typedef uint32_t manh_t;
> +#endif
> +
> +/*
> + * These macros add and remove an explicit integer bit in front of the
> + * fractional mantissa, if the architecture doesn't have such a bit by
> + * default already.
> + */
> +#ifdef LDBL_IMPLICIT_NBIT
> +#define SET_NBIT(hx) ((hx) | (1ULL << LDBL_MANH_SIZE))
> +#define HFRAC_BITS LDBL_MANH_SIZE
> +#else
> +#define SET_NBIT(hx) (hx)
> +#define HFRAC_BITS (LDBL_MANH_SIZE - 1)
> +#endif
> +
> +#define MANL_SHIFT (LDBL_MANL_SIZE - 1)
> +
> +static const long double one = 1.0, Zero[] = {0.0, -0.0,};
> +
> +/*
> + * fmodl(x,y)
> + * Return x mod y in exact arithmetic
> + * Method: shift and subtract
> + *
> + * Assumptions:
> + * - The low part of the mantissa fits in a manl_t exactly.
> + * - The high part of the mantissa fits in an int64_t with enough room
> + * for an explicit integer bit in front of the fractional bits.
> + */
> +long double
> +fmodl(long double x, long double y)
> +{
> + union IEEEl2bits ux, uy;
> + int64_t hx,hz; /* We need a carry bit even if LDBL_MANH_SIZE is 32. */
> + manh_t hy;
> + manl_t lx,ly,lz;
> + int ix,iy,n,sx;
> +
> + ux.e = x;
> + uy.e = y;
> + sx = ux.bits.sign;
> +
> + /* purge off exception values */
> + if((uy.bits.exp|uy.bits.manh|uy.bits.manl)==0 || /* y=0 */
> + (ux.bits.exp == BIAS + LDBL_MAX_EXP) || /* or x not finite */
> + (uy.bits.exp == BIAS + LDBL_MAX_EXP &&
> + ((uy.bits.manh&~LDBL_NBIT)|uy.bits.manl)!=0)) /* or y is NaN */
> + return nan_mix_op(x, y, *)/nan_mix_op(x, y, *);
> + if(ux.bits.exp<=uy.bits.exp) {
> + if((ux.bits.exp<uy.bits.exp) ||
> + (ux.bits.manh<=uy.bits.manh &&
> + (ux.bits.manh<uy.bits.manh ||
> + ux.bits.manl<uy.bits.manl))) {
> + return x; /* |x|<|y| return x or x-y */
> + }
> + if(ux.bits.manh==uy.bits.manh && ux.bits.manl==uy.bits.manl) {
> + return Zero[sx]; /* |x|=|y| return x*0*/
> + }
> + }
> +
> + /* determine ix = ilogb(x) */
> + if(ux.bits.exp == 0) { /* subnormal x */
> + ux.e *= 0x1.0p512;
> + ix = ux.bits.exp - (BIAS + 512);
> + } else {
> + ix = ux.bits.exp - BIAS;
> + }
> +
> + /* determine iy = ilogb(y) */
> + if(uy.bits.exp == 0) { /* subnormal y */
> + uy.e *= 0x1.0p512;
> + iy = uy.bits.exp - (BIAS + 512);
> + } else {
> + iy = uy.bits.exp - BIAS;
> + }
> +
> + /* set up {hx,lx}, {hy,ly} and align y to x */
> + hx = SET_NBIT(ux.bits.manh);
> + hy = SET_NBIT(uy.bits.manh);
> + lx = ux.bits.manl;
> + ly = uy.bits.manl;
> +
> + /* fix point fmod */
> + n = ix - iy;
> +
> + while(n--) {
> + hz=hx-hy;lz=lx-ly; if(lx<ly) hz -= 1;
> + if(hz<0){hx = hx+hx+(lx>>MANL_SHIFT); lx = lx+lx;}
> + else {
> + if ((hz|lz)==0) /* return sign(x)*0 */
> + return Zero[sx];
> + hx = hz+hz+(lz>>MANL_SHIFT); lx = lz+lz;
> + }
> + }
> + hz=hx-hy;lz=lx-ly; if(lx<ly) hz -= 1;
> + if(hz>=0) {hx=hz;lx=lz;}
> +
> + /* convert back to floating value and restore the sign */
> + if((hx|lx)==0) /* return sign(x)*0 */
> + return Zero[sx];
> + while(hx<(1ULL<<HFRAC_BITS)) { /* normalize x */
> + hx = hx+hx+(lx>>MANL_SHIFT); lx = lx+lx;
> + iy -= 1;
> + }
> + ux.bits.manh = hx; /* The mantissa is truncated here if needed. */
> + ux.bits.manl = lx;
> + if (iy < LDBL_MIN_EXP) {
> + ux.bits.exp = iy + (BIAS + 512);
> + ux.e *= 0x1p-512;
> + } else {
> + ux.bits.exp = iy + BIAS;
> + }
> + x = ux.e * one; /* create necessary signal */
> + return x; /* exact output */
> +}
> diff --git a/newlib/libm/ld/e_lgammal.c b/newlib/libm/ld/e_lgammal.c
> new file mode 100644
> index 000000000..ebc2fc78c
> --- /dev/null
> +++ b/newlib/libm/ld/e_lgammal.c
> @@ -0,0 +1,25 @@
> +/* @(#)e_lgamma.c 1.3 95/01/18 */
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunSoft, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include "math.h"
> +#include "math_private.h"
> +
> +extern int signgam;
> +
> +long double
> +lgammal(long double x)
> +{
> + return lgammal_r(x,&signgam);
> +}
> diff --git a/newlib/libm/ld/e_remainderl.c b/newlib/libm/ld/e_remainderl.c
> new file mode 100644
> index 000000000..4a6786309
> --- /dev/null
> +++ b/newlib/libm/ld/e_remainderl.c
> @@ -0,0 +1,40 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2008 David Schultz <das@FreeBSD.ORG>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include <math.h>
> +
> +long double
> +remainderl(long double x, long double y)
> +{
> + int quo;
> +
> + return (remquol(x, y, &quo));
> +}
> diff --git a/newlib/libm/ld/e_sinhl.c b/newlib/libm/ld/e_sinhl.c
> new file mode 100644
> index 000000000..38d3df195
> --- /dev/null
> +++ b/newlib/libm/ld/e_sinhl.c
> @@ -0,0 +1,134 @@
> +/* from: FreeBSD: head/lib/msun/src/e_sinhl.c XXX */
> +
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunPro, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * See e_sinh.c for complete comments.
> + *
> + * Converted to long double by Bruce D. Evans.
> + */
> +
> +#include <float.h>
> +#ifdef __i386__
> +#include <ieeefp.h>
> +#endif
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +#include "k_expl.h"
> +
> +#if LDBL_MAX_EXP != 0x4000
> +/* We also require the usual expsign encoding. */
> +#error "Unsupported long double format"
> +#endif
> +
> +#define BIAS (LDBL_MAX_EXP - 1)
> +
> +static const long double shuge = 0x1p16383L;
> +#if LDBL_MANT_DIG == 64
> +/*
> + * Domain [-1, 1], range ~[-6.6749e-22, 6.6749e-22]:
> + * |sinh(x)/x - s(x)| < 2**-70.3
> + */
> +static const union IEEEl2bits
> +S3u = LD80C(0xaaaaaaaaaaaaaaaa, -3, 1.66666666666666666658e-1L);
> +#define S3 S3u.e
> +static const double
> +S5 = 8.3333333333333332e-3, /* 0x11111111111111.0p-59 */
> +S7 = 1.9841269841270074e-4, /* 0x1a01a01a01a070.0p-65 */
> +S9 = 2.7557319223873889e-6, /* 0x171de3a5565fe6.0p-71 */
> +S11 = 2.5052108406704084e-8, /* 0x1ae6456857530f.0p-78 */
> +S13 = 1.6059042748655297e-10, /* 0x161245fa910697.0p-85 */
> +S15 = 7.6470006914396920e-13, /* 0x1ae7ce4eff2792.0p-93 */
> +S17 = 2.8346142308424267e-15; /* 0x19882ce789ffc6.0p-101 */
> +#elif LDBL_MANT_DIG == 113
> +/*
> + * Domain [-1, 1], range ~[-2.9673e-36, 2.9673e-36]:
> + * |sinh(x)/x - s(x)| < 2**-118.0
> + */
> +static const long double
> +S3 = 1.66666666666666666666666666666666033e-1L, /* 0x1555555555555555555555555553b.0p-115L */
> +S5 = 8.33333333333333333333333333337643193e-3L, /* 0x111111111111111111111111180f5.0p-119L */
> +S7 = 1.98412698412698412698412697391263199e-4L, /* 0x1a01a01a01a01a01a01a0176aad11.0p-125L */
> +S9 = 2.75573192239858906525574406205464218e-6L, /* 0x171de3a556c7338faac243aaa9592.0p-131L */
> +S11 = 2.50521083854417187749675637460977997e-8L, /* 0x1ae64567f544e38fe59b3380d7413.0p-138L */
> +S13 = 1.60590438368216146368737762431552702e-10L, /* 0x16124613a86d098059c7620850fc2.0p-145L */
> +S15 = 7.64716373181980539786802470969096440e-13L, /* 0x1ae7f3e733b814193af09ce723043.0p-153L */
> +S17 = 2.81145725434775409870584280722701574e-15L; /* 0x1952c77030c36898c3fd0b6dfc562.0p-161L */
> +static const double
> +S19= 8.2206352435411005e-18, /* 0x12f49b4662b86d.0p-109 */
> +S21= 1.9572943931418891e-20, /* 0x171b8f2fab9628.0p-118 */
> +S23 = 3.8679983530666939e-23, /* 0x17617002b73afc.0p-127 */
> +S25 = 6.5067867911512749e-26; /* 0x1423352626048a.0p-136 */
> +#else
> +#error "Unsupported long double format"
> +#endif /* LDBL_MANT_DIG == 64 */
> +
> +/* log(2**16385 - 0.5) rounded up: */
> +static const float
> +o_threshold = 1.13572168e4; /* 0xb174de.0p-10 */
> +
> +long double
> +sinhl(long double x)
> +{
> + long double hi,lo,x2,x4;
> +#if LDBL_MANT_DIG == 113
> + double dx2;
> +#endif
> + double s;
> + int16_t ix,jx;
> +
> + GET_LDBL_EXPSIGN(jx,x);
> + ix = jx&0x7fff;
> +
> + /* x is INF or NaN */
> + if(ix>=0x7fff) return x+x;
> +
> + ENTERI();
> +
> + s = 1;
> + if (jx<0) s = -1;
> +
> + /* |x| < 64, return x, s(x), or accurate s*(exp(|x|)/2-1/exp(|x|)/2) */
> + if (ix<0x4005) { /* |x|<64 */
> + if (ix<BIAS-(LDBL_MANT_DIG+1)/2) /* |x|<TINY */
> + if(shuge+x>1) RETURNI(x); /* sinh(tiny) = tiny with inexact */
> + if (ix<0x3fff) { /* |x|<1 */
> + x2 = x*x;
> +#if LDBL_MANT_DIG == 64
> + x4 = x2*x2;
> + RETURNI(((S17*x2 + S15)*x4 + (S13*x2 + S11))*(x2*x*x4*x4) +
> + ((S9*x2 + S7)*x2 + S5)*(x2*x*x2) + S3*(x2*x) + x);
> +#elif LDBL_MANT_DIG == 113
> + dx2 = x2;
> + RETURNI(((((((((((S25*dx2 + S23)*dx2 +
> + S21)*x2 + S19)*x2 +
> + S17)*x2 + S15)*x2 + S13)*x2 + S11)*x2 + S9)*x2 + S7)*x2 +
> + S5)* (x2*x*x2) +
> + S3*(x2*x) + x);
> +#endif
> + }
> + k_hexpl(fabsl(x), &hi, &lo);
> + RETURNI(s*(lo - 0.25/(hi + lo) + hi));
> + }
> +
> + /* |x| in [64, o_threshold], return correctly-overflowing s*exp(|x|)/2 */
> + if (fabsl(x) <= o_threshold)
> + RETURNI(s*hexpl(fabsl(x)));
> +
> + /* |x| > o_threshold, sinh(x) overflow */
> + return x*shuge;
> +}
> diff --git a/newlib/libm/ld/fpmath.h b/newlib/libm/ld/fpmath.h
> new file mode 100644
> index 000000000..ce935eb40
> --- /dev/null
> +++ b/newlib/libm/ld/fpmath.h
> @@ -0,0 +1,82 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2003 Mike Barcroft <mike@FreeBSD.org>
> + * Copyright (c) 2002 David Schultz <das@FreeBSD.ORG>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + *
> + * $FreeBSD$
> + */
> +
> +#ifndef _FPMATH_H_
> +#define _FPMATH_H_
> +
> +#include <sys/endian.h>
> +#include "_fpmath.h"
> +
> +#ifndef _IEEE_WORD_ORDER
> +#define _IEEE_WORD_ORDER _BYTE_ORDER
> +#endif
> +
> +union IEEEf2bits {
> + float f;
> + struct {
> +#if _BYTE_ORDER == _LITTLE_ENDIAN
> + unsigned int man :23;
> + unsigned int exp :8;
> + unsigned int sign :1;
> +#else /* _BIG_ENDIAN */
> + unsigned int sign :1;
> + unsigned int exp :8;
> + unsigned int man :23;
> +#endif
> + } bits;
> +};
> +
> +#define DBL_MANH_SIZE 20
> +#define DBL_MANL_SIZE 32
> +
> +union IEEEd2bits {
> + double d;
> + struct {
> +#if _BYTE_ORDER == _LITTLE_ENDIAN
> +#if _IEEE_WORD_ORDER == _LITTLE_ENDIAN
> + unsigned int manl :32;
> +#endif
> + unsigned int manh :20;
> + unsigned int exp :11;
> + unsigned int sign :1;
> +#if _IEEE_WORD_ORDER == _BIG_ENDIAN
> + unsigned int manl :32;
> +#endif
> +#else /* _BIG_ENDIAN */
> + unsigned int sign :1;
> + unsigned int exp :11;
> + unsigned int manh :20;
> + unsigned int manl :32;
> +#endif
> + } bits;
> +};
> +
> +#endif /* !_FPMATH_H */
> diff --git a/newlib/libm/ld/math_private.h b/newlib/libm/ld/math_private.h
> new file mode 100644
> index 000000000..df526e71e
> --- /dev/null
> +++ b/newlib/libm/ld/math_private.h
> @@ -0,0 +1,924 @@
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunPro, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +/*
> + * from: @(#)fdlibm.h 5.1 93/09/24
> + * $FreeBSD$
> + */
> +
> +#ifndef _MATH_PRIVATE_H_
> +#define _MATH_PRIVATE_H_
> +
> +#include <sys/types.h>
> +#include <machine/endian.h>
> +
> +/*
> + * The original fdlibm code used statements like:
> + * n0 = ((*(int*)&one)>>29)^1; * index of high word *
> + * ix0 = *(n0+(int*)&x); * high word of x *
> + * ix1 = *((1-n0)+(int*)&x); * low word of x *
> + * to dig two 32 bit words out of the 64 bit IEEE floating point
> + * value. That is non-ANSI, and, moreover, the gcc instruction
> + * scheduler gets it wrong. We instead use the following macros.
> + * Unlike the original code, we determine the endianness at compile
> + * time, not at run time; I don't see much benefit to selecting
> + * endianness at run time.
> + */
> +
> +/*
> + * A union which permits us to convert between a double and two 32 bit
> + * ints.
> + */
> +
> +#ifdef __arm__
> +#if defined(__VFP_FP__) || defined(__ARM_EABI__)
> +#define IEEE_WORD_ORDER BYTE_ORDER
> +#else
> +#define IEEE_WORD_ORDER BIG_ENDIAN
> +#endif
> +#else /* __arm__ */
> +#define IEEE_WORD_ORDER BYTE_ORDER
> +#endif
> +
> +/* A union which permits us to convert between a long double and
> + four 32 bit ints. */
> +
> +#if IEEE_WORD_ORDER == BIG_ENDIAN
> +
> +typedef union
> +{
> + long double value;
> + struct {
> + u_int32_t mswhi;
> + u_int32_t mswlo;
> + u_int32_t lswhi;
> + u_int32_t lswlo;
> + } parts32;
> + struct {
> + u_int64_t msw;
> + u_int64_t lsw;
> + } parts64;
> +} ieee_quad_shape_type;
> +
> +#endif
> +
> +#if IEEE_WORD_ORDER == LITTLE_ENDIAN
> +
> +typedef union
> +{
> + long double value;
> + struct {
> + u_int32_t lswlo;
> + u_int32_t lswhi;
> + u_int32_t mswlo;
> + u_int32_t mswhi;
> + } parts32;
> + struct {
> + u_int64_t lsw;
> + u_int64_t msw;
> + } parts64;
> +} ieee_quad_shape_type;
> +
> +#endif
> +
> +#if IEEE_WORD_ORDER == BIG_ENDIAN
> +
> +typedef union
> +{
> + double value;
> + struct
> + {
> + u_int32_t msw;
> + u_int32_t lsw;
> + } parts;
> + struct
> + {
> + u_int64_t w;
> + } xparts;
> +} ieee_double_shape_type;
> +
> +#endif
> +
> +#if IEEE_WORD_ORDER == LITTLE_ENDIAN
> +
> +typedef union
> +{
> + double value;
> + struct
> + {
> + u_int32_t lsw;
> + u_int32_t msw;
> + } parts;
> + struct
> + {
> + u_int64_t w;
> + } xparts;
> +} ieee_double_shape_type;
> +
> +#endif
> +
> +/* Get two 32 bit ints from a double. */
> +
> +#define EXTRACT_WORDS(ix0,ix1,d) \
> +do { \
> + ieee_double_shape_type ew_u; \
> + ew_u.value = (d); \
> + (ix0) = ew_u.parts.msw; \
> + (ix1) = ew_u.parts.lsw; \
> +} while (0)
> +
> +/* Get a 64-bit int from a double. */
> +#define EXTRACT_WORD64(ix,d) \
> +do { \
> + ieee_double_shape_type ew_u; \
> + ew_u.value = (d); \
> + (ix) = ew_u.xparts.w; \
> +} while (0)
> +
> +/* Get the more significant 32 bit int from a double. */
> +
> +#define GET_HIGH_WORD(i,d) \
> +do { \
> + ieee_double_shape_type gh_u; \
> + gh_u.value = (d); \
> + (i) = gh_u.parts.msw; \
> +} while (0)
> +
> +/* Get the less significant 32 bit int from a double. */
> +
> +#define GET_LOW_WORD(i,d) \
> +do { \
> + ieee_double_shape_type gl_u; \
> + gl_u.value = (d); \
> + (i) = gl_u.parts.lsw; \
> +} while (0)
> +
> +/* Set a double from two 32 bit ints. */
> +
> +#define INSERT_WORDS(d,ix0,ix1) \
> +do { \
> + ieee_double_shape_type iw_u; \
> + iw_u.parts.msw = (ix0); \
> + iw_u.parts.lsw = (ix1); \
> + (d) = iw_u.value; \
> +} while (0)
> +
> +/* Set a double from a 64-bit int. */
> +#define INSERT_WORD64(d,ix) \
> +do { \
> + ieee_double_shape_type iw_u; \
> + iw_u.xparts.w = (ix); \
> + (d) = iw_u.value; \
> +} while (0)
> +
> +/* Set the more significant 32 bits of a double from an int. */
> +
> +#define SET_HIGH_WORD(d,v) \
> +do { \
> + ieee_double_shape_type sh_u; \
> + sh_u.value = (d); \
> + sh_u.parts.msw = (v); \
> + (d) = sh_u.value; \
> +} while (0)
> +
> +/* Set the less significant 32 bits of a double from an int. */
> +
> +#define SET_LOW_WORD(d,v) \
> +do { \
> + ieee_double_shape_type sl_u; \
> + sl_u.value = (d); \
> + sl_u.parts.lsw = (v); \
> + (d) = sl_u.value; \
> +} while (0)
> +
> +/*
> + * A union which permits us to convert between a float and a 32 bit
> + * int.
> + */
> +
> +typedef union
> +{
> + float value;
> + /* FIXME: Assumes 32 bit int. */
> + unsigned int word;
> +} ieee_float_shape_type;
> +
> +/* Get a 32 bit int from a float. */
> +
> +#define GET_FLOAT_WORD(i,d) \
> +do { \
> + ieee_float_shape_type gf_u; \
> + gf_u.value = (d); \
> + (i) = gf_u.word; \
> +} while (0)
> +
> +/* Set a float from a 32 bit int. */
> +
> +#define SET_FLOAT_WORD(d,i) \
> +do { \
> + ieee_float_shape_type sf_u; \
> + sf_u.word = (i); \
> + (d) = sf_u.value; \
> +} while (0)
> +
> +/*
> + * Get expsign and mantissa as 16 bit and 64 bit ints from an 80 bit long
> + * double.
> + */
> +
> +#define EXTRACT_LDBL80_WORDS(ix0,ix1,d) \
> +do { \
> + union IEEEl2bits ew_u; \
> + ew_u.e = (d); \
> + (ix0) = ew_u.xbits.expsign; \
> + (ix1) = ew_u.xbits.man; \
> +} while (0)
> +
> +/*
> + * Get expsign and mantissa as one 16 bit and two 64 bit ints from a 128 bit
> + * long double.
> + */
> +
> +#define EXTRACT_LDBL128_WORDS(ix0,ix1,ix2,d) \
> +do { \
> + union IEEEl2bits ew_u; \
> + ew_u.e = (d); \
> + (ix0) = ew_u.xbits.expsign; \
> + (ix1) = ew_u.xbits.manh; \
> + (ix2) = ew_u.xbits.manl; \
> +} while (0)
> +
> +/* Get expsign as a 16 bit int from a long double. */
> +
> +#define GET_LDBL_EXPSIGN(i,d) \
> +do { \
> + union IEEEl2bits ge_u; \
> + ge_u.e = (d); \
> + (i) = ge_u.xbits.expsign; \
> +} while (0)
> +
> +/*
> + * Set an 80 bit long double from a 16 bit int expsign and a 64 bit int
> + * mantissa.
> + */
> +
> +#define INSERT_LDBL80_WORDS(d,ix0,ix1) \
> +do { \
> + union IEEEl2bits iw_u; \
> + iw_u.xbits.expsign = (ix0); \
> + iw_u.xbits.man = (ix1); \
> + (d) = iw_u.e; \
> +} while (0)
> +
> +/*
> + * Set a 128 bit long double from a 16 bit int expsign and two 64 bit ints
> + * comprising the mantissa.
> + */
> +
> +#define INSERT_LDBL128_WORDS(d,ix0,ix1,ix2) \
> +do { \
> + union IEEEl2bits iw_u; \
> + iw_u.xbits.expsign = (ix0); \
> + iw_u.xbits.manh = (ix1); \
> + iw_u.xbits.manl = (ix2); \
> + (d) = iw_u.e; \
> +} while (0)
> +
> +/* Set expsign of a long double from a 16 bit int. */
> +
> +#define SET_LDBL_EXPSIGN(d,v) \
> +do { \
> + union IEEEl2bits se_u; \
> + se_u.e = (d); \
> + se_u.xbits.expsign = (v); \
> + (d) = se_u.e; \
> +} while (0)
> +
> +#ifdef __i386__
> +/* Long double constants are broken on i386. */
> +#define LD80C(m, ex, v) { \
> + .xbits.man = __CONCAT(m, ULL), \
> + .xbits.expsign = (0x3fff + (ex)) | ((v) < 0 ? 0x8000 : 0), \
> +}
> +#else
> +/* The above works on non-i386 too, but we use this to check v. */
> +#define LD80C(m, ex, v) { .e = (v), }
> +#endif
> +
> +#ifdef FLT_EVAL_METHOD
> +/*
> + * Attempt to get strict C99 semantics for assignment with non-C99 compilers.
> + */
> +#if FLT_EVAL_METHOD == 0 || __GNUC__ == 0
> +#define STRICT_ASSIGN(type, lval, rval) ((lval) = (rval))
> +#else
> +#define STRICT_ASSIGN(type, lval, rval) do { \
> + volatile type __lval; \
> + \
> + if (sizeof(type) >= sizeof(long double)) \
> + (lval) = (rval); \
> + else { \
> + __lval = (rval); \
> + (lval) = __lval; \
> + } \
> +} while (0)
> +#endif
> +#endif /* FLT_EVAL_METHOD */
> +
> +/* Support switching the mode to FP_PE if necessary. */
> +#if defined(__i386__) && !defined(NO_FPSETPREC)
> +#define ENTERI() ENTERIT(long double)
> +#define ENTERIT(returntype) \
> + returntype __retval; \
> + fp_prec_t __oprec; \
> + \
> + if ((__oprec = fpgetprec()) != FP_PE) \
> + fpsetprec(FP_PE)
> +#define RETURNI(x) do { \
> + __retval = (x); \
> + if (__oprec != FP_PE) \
> + fpsetprec(__oprec); \
> + RETURNF(__retval); \
> +} while (0)
> +#define ENTERV() \
> + fp_prec_t __oprec; \
> + \
> + if ((__oprec = fpgetprec()) != FP_PE) \
> + fpsetprec(FP_PE)
> +#define RETURNV() do { \
> + if (__oprec != FP_PE) \
> + fpsetprec(__oprec); \
> + return; \
> +} while (0)
> +#else
> +#define ENTERI()
> +#define ENTERIT(x)
> +#define RETURNI(x) RETURNF(x)
> +#define ENTERV()
> +#define RETURNV() return
> +#endif
> +
> +/* Default return statement if hack*_t() is not used. */
> +#define RETURNF(v) return (v)
> +
> +/*
> + * 2sum gives the same result as 2sumF without requiring |a| >= |b| or
> + * a == 0, but is slower.
> + */
> +#define _2sum(a, b) do { \
> + __typeof(a) __s, __w; \
> + \
> + __w = (a) + (b); \
> + __s = __w - (a); \
> + (b) = ((a) - (__w - __s)) + ((b) - __s); \
> + (a) = __w; \
> +} while (0)
> +
> +/*
> + * 2sumF algorithm.
> + *
> + * "Normalize" the terms in the infinite-precision expression a + b for
> + * the sum of 2 floating point values so that b is as small as possible
> + * relative to 'a'. (The resulting 'a' is the value of the expression in
> + * the same precision as 'a' and the resulting b is the rounding error.)
> + * |a| must be >= |b| or 0, b's type must be no larger than 'a's type, and
> + * exponent overflow or underflow must not occur. This uses a Theorem of
> + * Dekker (1971). See Knuth (1981) 4.2.2 Theorem C. The name "TwoSum"
> + * is apparently due to Skewchuk (1997).
> + *
> + * For this to always work, assignment of a + b to 'a' must not retain any
> + * extra precision in a + b. This is required by C standards but broken
> + * in many compilers. The brokenness cannot be worked around using
> + * STRICT_ASSIGN() like we do elsewhere, since the efficiency of this
> + * algorithm would be destroyed by non-null strict assignments. (The
> + * compilers are correct to be broken -- the efficiency of all floating
> + * point code calculations would be destroyed similarly if they forced the
> + * conversions.)
> + *
> + * Fortunately, a case that works well can usually be arranged by building
> + * any extra precision into the type of 'a' -- 'a' should have type float_t,
> + * double_t or long double. b's type should be no larger than 'a's type.
> + * Callers should use these types with scopes as large as possible, to
> + * reduce their own extra-precision and efficiciency problems. In
> + * particular, they shouldn't convert back and forth just to call here.
> + */
> +#ifdef DEBUG
> +#define _2sumF(a, b) do { \
> + __typeof(a) __w; \
> + volatile __typeof(a) __ia, __ib, __r, __vw; \
> + \
> + __ia = (a); \
> + __ib = (b); \
> + assert(__ia == 0 || fabsl(__ia) >= fabsl(__ib)); \
> + \
> + __w = (a) + (b); \
> + (b) = ((a) - __w) + (b); \
> + (a) = __w; \
> + \
> + /* The next 2 assertions are weak if (a) is already long double. */ \
> + assert((long double)__ia + __ib == (long double)(a) + (b)); \
> + __vw = __ia + __ib; \
> + __r = __ia - __vw; \
> + __r += __ib; \
> + assert(__vw == (a) && __r == (b)); \
> +} while (0)
> +#else /* !DEBUG */
> +#define _2sumF(a, b) do { \
> + __typeof(a) __w; \
> + \
> + __w = (a) + (b); \
> + (b) = ((a) - __w) + (b); \
> + (a) = __w; \
> +} while (0)
> +#endif /* DEBUG */
> +
> +/*
> + * Set x += c, where x is represented in extra precision as a + b.
> + * x must be sufficiently normalized and sufficiently larger than c,
> + * and the result is then sufficiently normalized.
> + *
> + * The details of ordering are that |a| must be >= |c| (so that (a, c)
> + * can be normalized without extra work to swap 'a' with c). The details of
> + * the normalization are that b must be small relative to the normalized 'a'.
> + * Normalization of (a, c) makes the normalized c tiny relative to the
> + * normalized a, so b remains small relative to 'a' in the result. However,
> + * b need not ever be tiny relative to 'a'. For example, b might be about
> + * 2**20 times smaller than 'a' to give about 20 extra bits of precision.
> + * That is usually enough, and adding c (which by normalization is about
> + * 2**53 times smaller than a) cannot change b significantly. However,
> + * cancellation of 'a' with c in normalization of (a, c) may reduce 'a'
> + * significantly relative to b. The caller must ensure that significant
> + * cancellation doesn't occur, either by having c of the same sign as 'a',
> + * or by having |c| a few percent smaller than |a|. Pre-normalization of
> + * (a, b) may help.
> + *
> + * This is a variant of an algorithm of Kahan (see Knuth (1981) 4.2.2
> + * exercise 19). We gain considerable efficiency by requiring the terms to
> + * be sufficiently normalized and sufficiently increasing.
> + */
> +#define _3sumF(a, b, c) do { \
> + __typeof(a) __tmp; \
> + \
> + __tmp = (c); \
> + _2sumF(__tmp, (a)); \
> + (b) += (a); \
> + (a) = __tmp; \
> +} while (0)
> +
> +/*
> + * Common routine to process the arguments to nan(), nanf(), and nanl().
> + */
> +void _scan_nan(uint32_t *__words, int __num_words, const char *__s);
> +
> +/*
> + * Mix 0, 1 or 2 NaNs. First add 0 to each arg. This normally just turns
> + * signaling NaNs into quiet NaNs by setting a quiet bit. We do this
> + * because we want to never return a signaling NaN, and also because we
> + * don't want the quiet bit to affect the result. Then mix the converted
> + * args using the specified operation.
> + *
> + * When one arg is NaN, the result is typically that arg quieted. When both
> + * args are NaNs, the result is typically the quietening of the arg whose
> + * mantissa is largest after quietening. When neither arg is NaN, the
> + * result may be NaN because it is indeterminate, or finite for subsequent
> + * construction of a NaN as the indeterminate 0.0L/0.0L.
> + *
> + * Technical complications: the result in bits after rounding to the final
> + * precision might depend on the runtime precision and/or on compiler
> + * optimizations, especially when different register sets are used for
> + * different precisions. Try to make the result not depend on at least the
> + * runtime precision by always doing the main mixing step in long double
> + * precision. Try to reduce dependencies on optimizations by adding the
> + * the 0's in different precisions (unless everything is in long double
> + * precision).
> + */
> +#define nan_mix(x, y) (nan_mix_op((x), (y), +))
> +#define nan_mix_op(x, y, op) (((x) + 0.0L) op ((y) + 0))
> +
> +#ifdef _COMPLEX_H
> +
> +/*
> + * C99 specifies that complex numbers have the same representation as
> + * an array of two elements, where the first element is the real part
> + * and the second element is the imaginary part.
> + */
> +typedef union {
> + float complex f;
> + float a[2];
> +} float_complex;
> +typedef union {
> + double complex f;
> + double a[2];
> +} double_complex;
> +typedef union {
> + long double complex f;
> + long double a[2];
> +} long_double_complex;
> +#define REALPART(z) ((z).a[0])
> +#define IMAGPART(z) ((z).a[1])
> +
> +/*
> + * Inline functions that can be used to construct complex values.
> + *
> + * The C99 standard intends x+I*y to be used for this, but x+I*y is
> + * currently unusable in general since gcc introduces many overflow,
> + * underflow, sign and efficiency bugs by rewriting I*y as
> + * (0.0+I)*(y+0.0*I) and laboriously computing the full complex product.
> + * In particular, I*Inf is corrupted to NaN+I*Inf, and I*-0 is corrupted
> + * to -0.0+I*0.0.
> + *
> + * The C11 standard introduced the macros CMPLX(), CMPLXF() and CMPLXL()
> + * to construct complex values. Compilers that conform to the C99
> + * standard require the following functions to avoid the above issues.
> + */
> +
> +#ifndef CMPLXF
> +static __inline float complex
> +CMPLXF(float x, float y)
> +{
> + float_complex z;
> +
> + REALPART(z) = x;
> + IMAGPART(z) = y;
> + return (z.f);
> +}
> +#endif
> +
> +#ifndef CMPLX
> +static __inline double complex
> +CMPLX(double x, double y)
> +{
> + double_complex z;
> +
> + REALPART(z) = x;
> + IMAGPART(z) = y;
> + return (z.f);
> +}
> +#endif
> +
> +#ifndef CMPLXL
> +static __inline long double complex
> +CMPLXL(long double x, long double y)
> +{
> + long_double_complex z;
> +
> + REALPART(z) = x;
> + IMAGPART(z) = y;
> + return (z.f);
> +}
> +#endif
> +
> +#endif /* _COMPLEX_H */
> +
> +/*
> + * The rnint() family rounds to the nearest integer for a restricted range
> + * range of args (up to about 2**MANT_DIG). We assume that the current
> + * rounding mode is FE_TONEAREST so that this can be done efficiently.
> + * Extra precision causes more problems in practice, and we only centralize
> + * this here to reduce those problems, and have not solved the efficiency
> + * problems. The exp2() family uses a more delicate version of this that
> + * requires extracting bits from the intermediate value, so it is not
> + * centralized here and should copy any solution of the efficiency problems.
> + */
> +
> +static inline double
> +rnint(__double_t x)
> +{
> + /*
> + * This casts to double to kill any extra precision. This depends
> + * on the cast being applied to a double_t to avoid compiler bugs
> + * (this is a cleaner version of STRICT_ASSIGN()). This is
> + * inefficient if there actually is extra precision, but is hard
> + * to improve on. We use double_t in the API to minimise conversions
> + * for just calling here. Note that we cannot easily change the
> + * magic number to the one that works directly with double_t, since
> + * the rounding precision is variable at runtime on x86 so the
> + * magic number would need to be variable. Assuming that the
> + * rounding precision is always the default is too fragile. This
> + * and many other complications will move when the default is
> + * changed to FP_PE.
> + */
> + return ((double)(x + 0x1.8p52) - 0x1.8p52);
> +}
> +
> +static inline float
> +rnintf(__float_t x)
> +{
> + /*
> + * As for rnint(), except we could just call that to handle the
> + * extra precision case, usually without losing efficiency.
> + */
> + return ((float)(x + 0x1.8p23F) - 0x1.8p23F);
> +}
> +
> +#ifdef LDBL_MANT_DIG
> +/*
> + * The complications for extra precision are smaller for rnintl() since it
> + * can safely assume that the rounding precision has been increased from
> + * its default to FP_PE on x86. We don't exploit that here to get small
> + * optimizations from limiting the rangle to double. We just need it for
> + * the magic number to work with long doubles. ld128 callers should use
> + * rnint() instead of this if possible. ld80 callers should prefer
> + * rnintl() since for amd64 this avoids swapping the register set, while
> + * for i386 it makes no difference (assuming FP_PE), and for other arches
> + * it makes little difference.
> + */
> +static inline long double
> +rnintl(long double x)
> +{
> + return (x + __CONCAT(0x1.8p, LDBL_MANT_DIG) / 2 -
> + __CONCAT(0x1.8p, LDBL_MANT_DIG) / 2);
> +}
> +#endif /* LDBL_MANT_DIG */
> +
> +/*
> + * irint() and i64rint() give the same result as casting to their integer
> + * return type provided their arg is a floating point integer. They can
> + * sometimes be more efficient because no rounding is required.
> + */
> +#if defined(amd64) || defined(__i386__)
> +#define irint(x) \
> + (sizeof(x) == sizeof(float) && \
> + sizeof(__float_t) == sizeof(long double) ? irintf(x) : \
> + sizeof(x) == sizeof(double) && \
> + sizeof(__double_t) == sizeof(long double) ? irintd(x) : \
> + sizeof(x) == sizeof(long double) ? irintl(x) : (int)(x))
> +#else
> +#define irint(x) ((int)(x))
> +#endif
> +
> +#define i64rint(x) ((int64_t)(x)) /* only needed for ld128 so not opt. */
> +
> +#if defined(__i386__)
> +static __inline int
> +irintf(float x)
> +{
> + int n;
> +
> + __asm("fistl %0" : "=m" (n) : "t" (x));
> + return (n);
> +}
> +
> +static __inline int
> +irintd(double x)
> +{
> + int n;
> +
> + __asm("fistl %0" : "=m" (n) : "t" (x));
> + return (n);
> +}
> +#endif
> +
> +#if defined(__amd64__) || defined(__i386__)
> +static __inline int
> +irintl(long double x)
> +{
> + int n;
> +
> + __asm("fistl %0" : "=m" (n) : "t" (x));
> + return (n);
> +}
> +#endif
> +
> +#ifdef DEBUG
> +#if defined(__amd64__) || defined(__i386__)
> +#define breakpoint() asm("int $3")
> +#else
> +#include <signal.h>
> +
> +#define breakpoint() raise(SIGTRAP)
> +#endif
> +#endif
> +
> +/* Write a pari script to test things externally. */
> +#ifdef DOPRINT
> +#include <stdio.h>
> +
> +#ifndef DOPRINT_SWIZZLE
> +#define DOPRINT_SWIZZLE 0
> +#endif
> +
> +#ifdef DOPRINT_LD80
> +
> +#define DOPRINT_START(xp) do { \
> + uint64_t __lx; \
> + uint16_t __hx; \
> + \
> + /* Hack to give more-problematic args. */ \
> + EXTRACT_LDBL80_WORDS(__hx, __lx, *xp); \
> + __lx ^= DOPRINT_SWIZZLE; \
> + INSERT_LDBL80_WORDS(*xp, __hx, __lx); \
> + printf("x = %.21Lg; ", (long double)*xp); \
> +} while (0)
> +#define DOPRINT_END1(v) \
> + printf("y = %.21Lg; z = 0; show(x, y, z);\n", (long double)(v))
> +#define DOPRINT_END2(hi, lo) \
> + printf("y = %.21Lg; z = %.21Lg; show(x, y, z);\n", \
> + (long double)(hi), (long double)(lo))
> +
> +#elif defined(DOPRINT_D64)
> +
> +#define DOPRINT_START(xp) do { \
> + uint32_t __hx, __lx; \
> + \
> + EXTRACT_WORDS(__hx, __lx, *xp); \
> + __lx ^= DOPRINT_SWIZZLE; \
> + INSERT_WORDS(*xp, __hx, __lx); \
> + printf("x = %.21Lg; ", (long double)*xp); \
> +} while (0)
> +#define DOPRINT_END1(v) \
> + printf("y = %.21Lg; z = 0; show(x, y, z);\n", (long double)(v))
> +#define DOPRINT_END2(hi, lo) \
> + printf("y = %.21Lg; z = %.21Lg; show(x, y, z);\n", \
> + (long double)(hi), (long double)(lo))
> +
> +#elif defined(DOPRINT_F32)
> +
> +#define DOPRINT_START(xp) do { \
> + uint32_t __hx; \
> + \
> + GET_FLOAT_WORD(__hx, *xp); \
> + __hx ^= DOPRINT_SWIZZLE; \
> + SET_FLOAT_WORD(*xp, __hx); \
> + printf("x = %.21Lg; ", (long double)*xp); \
> +} while (0)
> +#define DOPRINT_END1(v) \
> + printf("y = %.21Lg; z = 0; show(x, y, z);\n", (long double)(v))
> +#define DOPRINT_END2(hi, lo) \
> + printf("y = %.21Lg; z = %.21Lg; show(x, y, z);\n", \
> + (long double)(hi), (long double)(lo))
> +
> +#else /* !DOPRINT_LD80 && !DOPRINT_D64 (LD128 only) */
> +
> +#ifndef DOPRINT_SWIZZLE_HIGH
> +#define DOPRINT_SWIZZLE_HIGH 0
> +#endif
> +
> +#define DOPRINT_START(xp) do { \
> + uint64_t __lx, __llx; \
> + uint16_t __hx; \
> + \
> + EXTRACT_LDBL128_WORDS(__hx, __lx, __llx, *xp); \
> + __llx ^= DOPRINT_SWIZZLE; \
> + __lx ^= DOPRINT_SWIZZLE_HIGH; \
> + INSERT_LDBL128_WORDS(*xp, __hx, __lx, __llx); \
> + printf("x = %.36Lg; ", (long double)*xp); \
> +} while (0)
> +#define DOPRINT_END1(v) \
> + printf("y = %.36Lg; z = 0; show(x, y, z);\n", (long double)(v))
> +#define DOPRINT_END2(hi, lo) \
> + printf("y = %.36Lg; z = %.36Lg; show(x, y, z);\n", \
> + (long double)(hi), (long double)(lo))
> +
> +#endif /* DOPRINT_LD80 */
> +
> +#else /* !DOPRINT */
> +#define DOPRINT_START(xp)
> +#define DOPRINT_END1(v)
> +#define DOPRINT_END2(hi, lo)
> +#endif /* DOPRINT */
> +
> +#define RETURNP(x) do { \
> + DOPRINT_END1(x); \
> + RETURNF(x); \
> +} while (0)
> +#define RETURNPI(x) do { \
> + DOPRINT_END1(x); \
> + RETURNI(x); \
> +} while (0)
> +#define RETURN2P(x, y) do { \
> + DOPRINT_END2((x), (y)); \
> + RETURNF((x) + (y)); \
> +} while (0)
> +#define RETURN2PI(x, y) do { \
> + DOPRINT_END2((x), (y)); \
> + RETURNI((x) + (y)); \
> +} while (0)
> +#ifdef STRUCT_RETURN
> +#define RETURNSP(rp) do { \
> + if (!(rp)->lo_set) \
> + RETURNP((rp)->hi); \
> + RETURN2P((rp)->hi, (rp)->lo); \
> +} while (0)
> +#define RETURNSPI(rp) do { \
> + if (!(rp)->lo_set) \
> + RETURNPI((rp)->hi); \
> + RETURN2PI((rp)->hi, (rp)->lo); \
> +} while (0)
> +#endif
> +#define SUM2P(x, y) ({ \
> + const __typeof (x) __x = (x); \
> + const __typeof (y) __y = (y); \
> + \
> + DOPRINT_END2(__x, __y); \
> + __x + __y; \
> +})
> +
> +/*
> + * ieee style elementary functions
> + *
> + * We rename functions here to improve other sources' diffability
> + * against fdlibm.
> + */
> +#define __ieee754_sqrt sqrt
> +#define __ieee754_acos acos
> +#define __ieee754_acosh acosh
> +#define __ieee754_log log
> +#define __ieee754_log2 log2
> +#define __ieee754_atanh atanh
> +#define __ieee754_asin asin
> +#define __ieee754_atan2 atan2
> +#define __ieee754_exp exp
> +#define __ieee754_cosh cosh
> +#define __ieee754_fmod fmod
> +#define __ieee754_pow pow
> +#define __ieee754_lgamma lgamma
> +#define __ieee754_gamma gamma
> +#define __ieee754_lgamma_r lgamma_r
> +#define __ieee754_gamma_r gamma_r
> +#define __ieee754_log10 log10
> +#define __ieee754_sinh sinh
> +#define __ieee754_hypot hypot
> +#define __ieee754_j0 j0
> +#define __ieee754_j1 j1
> +#define __ieee754_y0 y0
> +#define __ieee754_y1 y1
> +#define __ieee754_jn jn
> +#define __ieee754_yn yn
> +#define __ieee754_remainder remainder
> +#define __ieee754_scalb scalb
> +#define __ieee754_sqrtf sqrtf
> +#define __ieee754_acosf acosf
> +#define __ieee754_acoshf acoshf
> +#define __ieee754_logf logf
> +#define __ieee754_atanhf atanhf
> +#define __ieee754_asinf asinf
> +#define __ieee754_atan2f atan2f
> +#define __ieee754_expf expf
> +#define __ieee754_coshf coshf
> +#define __ieee754_fmodf fmodf
> +#define __ieee754_powf powf
> +#define __ieee754_lgammaf lgammaf
> +#define __ieee754_gammaf gammaf
> +#define __ieee754_lgammaf_r lgammaf_r
> +#define __ieee754_gammaf_r gammaf_r
> +#define __ieee754_log10f log10f
> +#define __ieee754_log2f log2f
> +#define __ieee754_sinhf sinhf
> +#define __ieee754_hypotf hypotf
> +#define __ieee754_j0f j0f
> +#define __ieee754_j1f j1f
> +#define __ieee754_y0f y0f
> +#define __ieee754_y1f y1f
> +#define __ieee754_jnf jnf
> +#define __ieee754_ynf ynf
> +#define __ieee754_remainderf remainderf
> +#define __ieee754_scalbf scalbf
> +
> +/* fdlibm kernel function */
> +int __kernel_rem_pio2(double*,double*,int,int,int);
> +
> +/* double precision kernel functions */
> +#ifndef INLINE_REM_PIO2
> +int __ieee754_rem_pio2(double,double*);
> +#endif
> +double __kernel_sin(double,double,int);
> +double __kernel_cos(double,double);
> +double __kernel_tan(double,double,int);
> +double __ldexp_exp(double,int);
> +#ifdef _COMPLEX_H
> +double complex __ldexp_cexp(double complex,int);
> +#endif
> +
> +/* float precision kernel functions */
> +#ifndef INLINE_REM_PIO2F
> +int __ieee754_rem_pio2f(float,double*);
> +#endif
> +#ifndef INLINE_KERNEL_SINDF
> +float __kernel_sindf(double);
> +#endif
> +#ifndef INLINE_KERNEL_COSDF
> +float __kernel_cosdf(double);
> +#endif
> +#ifndef INLINE_KERNEL_TANDF
> +float __kernel_tandf(double,int);
> +#endif
> +float __ldexp_expf(float,int);
> +#ifdef _COMPLEX_H
> +float complex __ldexp_cexpf(float complex,int);
> +#endif
> +
> +/* long double precision kernel functions */
> +long double __kernel_sinl(long double, long double, int);
> +long double __kernel_cosl(long double, long double);
> +long double __kernel_tanl(long double, long double, int);
> +
> +#endif /* !_MATH_PRIVATE_H_ */
> diff --git a/newlib/libm/ld/s_asinhl.c b/newlib/libm/ld/s_asinhl.c
> new file mode 100644
> index 000000000..ba28f599c
> --- /dev/null
> +++ b/newlib/libm/ld/s_asinhl.c
> @@ -0,0 +1,91 @@
> +/* from: FreeBSD: head/lib/msun/src/e_acosh.c 176451 2008-02-22 02:30:36Z das */
> +
> +/* @(#)s_asinh.c 5.1 93/09/24 */
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunPro, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * See s_asinh.c for complete comments.
> + *
> + * Converted to long double by David Schultz <das@FreeBSD.ORG> and
> + * Bruce D. Evans.
> + */
> +
> +#include <float.h>
> +#ifdef __i386__
> +#include <ieeefp.h>
> +#endif
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +
> +/* EXP_LARGE is the threshold above which we use asinh(x) ~= log(2x). */
> +/* EXP_TINY is the threshold below which we use asinh(x) ~= x. */
> +#if LDBL_MANT_DIG == 64
> +#define EXP_LARGE 34
> +#define EXP_TINY -34
> +#elif LDBL_MANT_DIG == 113
> +#define EXP_LARGE 58
> +#define EXP_TINY -58
> +#else
> +#error "Unsupported long double format"
> +#endif
> +
> +#if LDBL_MAX_EXP != 0x4000
> +/* We also require the usual expsign encoding. */
> +#error "Unsupported long double format"
> +#endif
> +
> +#define BIAS (LDBL_MAX_EXP - 1)
> +
> +static const double
> +one = 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */
> +huge= 1.00000000000000000000e+300;
> +
> +#if LDBL_MANT_DIG == 64
> +static const union IEEEl2bits
> +u_ln2 = LD80C(0xb17217f7d1cf79ac, -1, 6.93147180559945309417e-1L);
> +#define ln2 u_ln2.e
> +#elif LDBL_MANT_DIG == 113
> +static const long double
> +ln2 = 6.93147180559945309417232121458176568e-1L; /* 0x162e42fefa39ef35793c7673007e6.0p-113 */
> +#else
> +#error "Unsupported long double format"
> +#endif
> +
> +long double
> +asinhl(long double x)
> +{
> + long double t, w;
> + uint16_t hx, ix;
> +
> + ENTERI();
> + GET_LDBL_EXPSIGN(hx, x);
> + ix = hx & 0x7fff;
> + if (ix >= 0x7fff) RETURNI(x+x); /* x is inf, NaN or misnormal */
> + if (ix < BIAS + EXP_TINY) { /* |x| < TINY, or misnormal */
> + if (huge + x > one) RETURNI(x); /* return x inexact except 0 */
> + }
> + if (ix >= BIAS + EXP_LARGE) { /* |x| >= LARGE, or misnormal */
> + w = logl(fabsl(x))+ln2;
> + } else if (ix >= 0x4000) { /* LARGE > |x| >= 2.0, or misnormal */
> + t = fabsl(x);
> + w = logl(2.0*t+one/(sqrtl(x*x+one)+t));
> + } else { /* 2.0 > |x| >= TINY, or misnormal */
> + t = x*x;
> + w =log1pl(fabsl(x)+t/(one+sqrtl(one+t)));
> + }
> + RETURNI((hx & 0x8000) == 0 ? w : -w);
> +}
> diff --git a/newlib/libm/ld/s_atanl.c b/newlib/libm/ld/s_atanl.c
> new file mode 100644
> index 000000000..ff29c3ce8
> --- /dev/null
> +++ b/newlib/libm/ld/s_atanl.c
> @@ -0,0 +1,85 @@
> +/* @(#)s_atan.c 5.1 93/09/24 */
> +/* FreeBSD: head/lib/msun/src/s_atan.c 176451 2008-02-22 02:30:36Z das */
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunPro, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * See comments in s_atan.c.
> + * Converted to long double by David Schultz <das@FreeBSD.ORG>.
> + */
> +
> +#include <float.h>
> +
> +#include "invtrig.h"
> +#include "math.h"
> +#include "math_private.h"
> +
> +static const long double
> +one = 1.0,
> +huge = 1.0e300;
> +
> +long double
> +atanl(long double x)
> +{
> + union IEEEl2bits u;
> + long double w,s1,s2,z;
> + int id;
> + int16_t expsign, expt;
> + int32_t expman;
> +
> + u.e = x;
> + expsign = u.xbits.expsign;
> + expt = expsign & 0x7fff;
> + if(expt >= ATAN_CONST) { /* if |x| is large, atan(x)~=pi/2 */
> + if(expt == BIAS + LDBL_MAX_EXP &&
> + ((u.bits.manh&~LDBL_NBIT)|u.bits.manl)!=0)
> + return x+x; /* NaN */
> + if(expsign>0) return atanhi[3]+atanlo[3];
> + else return -atanhi[3]-atanlo[3];
> + }
> + /* Extract the exponent and the first few bits of the mantissa. */
> + /* XXX There should be a more convenient way to do this. */
> + expman = (expt << 8) | ((u.bits.manh >> (MANH_SIZE - 9)) & 0xff);
> + if (expman < ((BIAS - 2) << 8) + 0xc0) { /* |x| < 0.4375 */
> + if (expt < ATAN_LINEAR) { /* if |x| is small, atanl(x)~=x */
> + if(huge+x>one) return x; /* raise inexact */
> + }
> + id = -1;
> + } else {
> + x = fabsl(x);
> + if (expman < (BIAS << 8) + 0x30) { /* |x| < 1.1875 */
> + if (expman < ((BIAS - 1) << 8) + 0x60) { /* 7/16 <=|x|<11/16 */
> + id = 0; x = (2.0*x-one)/(2.0+x);
> + } else { /* 11/16<=|x|< 19/16 */
> + id = 1; x = (x-one)/(x+one);
> + }
> + } else {
> + if (expman < ((BIAS + 1) << 8) + 0x38) { /* |x| < 2.4375 */
> + id = 2; x = (x-1.5)/(one+1.5*x);
> + } else { /* 2.4375 <= |x| < 2^ATAN_CONST */
> + id = 3; x = -1.0/x;
> + }
> + }}
> + /* end of argument reduction */
> + z = x*x;
> + w = z*z;
> + /* break sum aT[i]z**(i+1) into odd and even poly */
> + s1 = z*T_even(w);
> + s2 = w*T_odd(w);
> + if (id<0) return x - x*(s1+s2);
> + else {
> + z = atanhi[id] - ((x*(s1+s2) - atanlo[id]) - x);
> + return (expsign<0)? -z:z;
> + }
> +}
> diff --git a/newlib/libm/ld/s_cbrtl.c b/newlib/libm/ld/s_cbrtl.c
> new file mode 100644
> index 000000000..b15c96ecd
> --- /dev/null
> +++ b/newlib/libm/ld/s_cbrtl.c
> @@ -0,0 +1,143 @@
> +/*-
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + * Copyright (c) 2009-2011, Bruce D. Evans, Steven G. Kargl, David Schultz.
> + *
> + * Developed at SunPro, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + *
> + * The argument reduction and testing for exceptional cases was
> + * written by Steven G. Kargl with input from Bruce D. Evans
> + * and David A. Schultz.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include <float.h>
> +#ifdef __i386__
> +#include <ieeefp.h>
> +#endif
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +
> +#define BIAS (LDBL_MAX_EXP - 1)
> +
> +static const unsigned
> + B1 = 709958130; /* B1 = (127-127.0/3-0.03306235651)*2**23 */
> +
> +long double
> +cbrtl(long double x)
> +{
> + union IEEEl2bits u, v;
> + long double r, s, t, w;
> + double dr, dt, dx;
> + float ft, fx;
> + uint32_t hx;
> + uint16_t expsign;
> + int k;
> +
> + u.e = x;
> + expsign = u.xbits.expsign;
> + k = expsign & 0x7fff;
> +
> + /*
> + * If x = +-Inf, then cbrt(x) = +-Inf.
> + * If x = NaN, then cbrt(x) = NaN.
> + */
> + if (k == BIAS + LDBL_MAX_EXP)
> + return (x + x);
> +
> + ENTERI();
> + if (k == 0) {
> + /* If x = +-0, then cbrt(x) = +-0. */
> + if ((u.bits.manh | u.bits.manl) == 0)
> + RETURNI(x);
> + /* Adjust subnormal numbers. */
> + u.e *= 0x1.0p514;
> + k = u.bits.exp;
> + k -= BIAS + 514;
> + } else
> + k -= BIAS;
> + u.xbits.expsign = BIAS;
> + v.e = 1;
> +
> + x = u.e;
> + switch (k % 3) {
> + case 1:
> + case -2:
> + x = 2*x;
> + k--;
> + break;
> + case 2:
> + case -1:
> + x = 4*x;
> + k -= 2;
> + break;
> + }
> + v.xbits.expsign = (expsign & 0x8000) | (BIAS + k / 3);
> +
> + /*
> + * The following is the guts of s_cbrtf, with the handling of
> + * special values removed and extra care for accuracy not taken,
> + * but with most of the extra accuracy not discarded.
> + */
> +
> + /* ~5-bit estimate: */
> + fx = x;
> + GET_FLOAT_WORD(hx, fx);
> + SET_FLOAT_WORD(ft, ((hx & 0x7fffffff) / 3 + B1));
> +
> + /* ~16-bit estimate: */
> + dx = x;
> + dt = ft;
> + dr = dt * dt * dt;
> + dt = dt * (dx + dx + dr) / (dx + dr + dr);
> +
> + /* ~47-bit estimate: */
> + dr = dt * dt * dt;
> + dt = dt * (dx + dx + dr) / (dx + dr + dr);
> +
> +#if LDBL_MANT_DIG == 64
> + /*
> + * dt is cbrtl(x) to ~47 bits (after x has been reduced to 1 <= x < 8).
> + * Round it away from zero to 32 bits (32 so that t*t is exact, and
> + * away from zero for technical reasons).
> + */
> + volatile double vd2 = 0x1.0p32;
> + volatile double vd1 = 0x1.0p-31;
> + #define vd ((long double)vd2 + vd1)
> +
> + t = dt + vd - 0x1.0p32;
> +#elif LDBL_MANT_DIG == 113
> + /*
> + * Round dt away from zero to 47 bits. Since we don't trust the 47,
> + * add 2 47-bit ulps instead of 1 to round up. Rounding is slow and
> + * might be avoidable in this case, since on most machines dt will
> + * have been evaluated in 53-bit precision and the technical reasons
> + * for rounding up might not apply to either case in cbrtl() since
> + * dt is much more accurate than needed.
> + */
> + t = dt + 0x2.0p-46 + 0x1.0p60L - 0x1.0p60;
> +#else
> +#error "Unsupported long double format"
> +#endif
> +
> + /*
> + * Final step Newton iteration to 64 or 113 bits with
> + * error < 0.667 ulps
> + */
> + s=t*t; /* t*t is exact */
> + r=x/s; /* error <= 0.5 ulps; |r| < |t| */
> + w=t+t; /* t+t is exact */
> + r=(r-t)/(w+r); /* r-t is exact; w+r ~= 3*t */
> + t=t+t*r; /* error <= (0.5 + 0.5/3) * ulp */
> +
> + t *= v.e;
> + RETURNI(t);
> +}
> diff --git a/newlib/libm/ld/s_ceill.c b/newlib/libm/ld/s_ceill.c
> new file mode 100644
> index 000000000..2d1045fe6
> --- /dev/null
> +++ b/newlib/libm/ld/s_ceill.c
> @@ -0,0 +1,101 @@
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunPro, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + *
> + * From: @(#)s_ceil.c 5.1 93/09/24
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * ceill(x)
> + * Return x rounded toward -inf to integral value
> + * Method:
> + * Bit twiddling.
> + * Exception:
> + * Inexact flag raised if x not equal to ceill(x).
> + */
> +
> +#include <float.h>
> +#include <math.h>
> +#include <stdint.h>
> +
> +#include "fpmath.h"
> +
> +#ifdef LDBL_IMPLICIT_NBIT
> +#define MANH_SIZE (LDBL_MANH_SIZE + 1)
> +#define INC_MANH(u, c) do { \
> + uint64_t o = u.bits.manh; \
> + u.bits.manh += (c); \
> + if (u.bits.manh < o) \
> + u.bits.exp++; \
> +} while (0)
> +#else
> +#define MANH_SIZE LDBL_MANH_SIZE
> +#define INC_MANH(u, c) do { \
> + uint64_t o = u.bits.manh; \
> + u.bits.manh += (c); \
> + if (u.bits.manh < o) { \
> + u.bits.exp++; \
> + u.bits.manh |= 1llu << (LDBL_MANH_SIZE - 1); \
> + } \
> +} while (0)
> +#endif
> +
> +static const long double huge = 1.0e300;
> +
> +long double
> +ceill(long double x)
> +{
> + union IEEEl2bits u = { .e = x };
> + int e = u.bits.exp - LDBL_MAX_EXP + 1;
> +
> + if (e < MANH_SIZE - 1) {
> + if (e < 0) { /* raise inexact if x != 0 */
> + if (huge + x > 0.0)
> + if (u.bits.exp > 0 ||
> + (u.bits.manh | u.bits.manl) != 0)
> + u.e = u.bits.sign ? -0.0 : 1.0;
> + } else {
> + uint64_t m = ((1llu << MANH_SIZE) - 1) >> (e + 1);
> + if (((u.bits.manh & m) | u.bits.manl) == 0)
> + return (x); /* x is integral */
> + if (!u.bits.sign) {
> +#ifdef LDBL_IMPLICIT_NBIT
> + if (e == 0)
> + u.bits.exp++;
> + else
> +#endif
> + INC_MANH(u, 1llu << (MANH_SIZE - e - 1));
> + }
> + if (huge + x > 0.0) { /* raise inexact flag */
> + u.bits.manh &= ~m;
> + u.bits.manl = 0;
> + }
> + }
> + } else if (e < LDBL_MANT_DIG - 1) {
> + uint64_t m = (uint64_t)-1 >> (64 - LDBL_MANT_DIG + e + 1);
> + if ((u.bits.manl & m) == 0)
> + return (x); /* x is integral */
> + if (!u.bits.sign) {
> + if (e == MANH_SIZE - 1)
> + INC_MANH(u, 1);
> + else {
> + uint64_t o = u.bits.manl;
> + u.bits.manl += 1llu << (LDBL_MANT_DIG - e - 1);
> + if (u.bits.manl < o) /* got a carry */
> + INC_MANH(u, 1);
> + }
> + }
> + if (huge + x > 0.0) /* raise inexact flag */
> + u.bits.manl &= ~m;
> + }
> + return (u.e);
> +}
> diff --git a/newlib/libm/ld/s_copysignl.c b/newlib/libm/ld/s_copysignl.c
> new file mode 100644
> index 000000000..bd6744705
> --- /dev/null
> +++ b/newlib/libm/ld/s_copysignl.c
> @@ -0,0 +1,44 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2004 Stefan Farfeleder
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + *
> + * $FreeBSD$
> + */
> +
> +#include <math.h>
> +
> +#include "fpmath.h"
> +
> +long double
> +copysignl(long double x, long double y)
> +{
> + union IEEEl2bits ux, uy;
> +
> + ux.e = x;
> + uy.e = y;
> + ux.bits.sign = uy.bits.sign;
> + return (ux.e);
> +}
> diff --git a/newlib/libm/ld/s_cosl.c b/newlib/libm/ld/s_cosl.c
> new file mode 100644
> index 000000000..3d066483f
> --- /dev/null
> +++ b/newlib/libm/ld/s_cosl.c
> @@ -0,0 +1,102 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2007 Steven G. Kargl
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice unmodified, this list of conditions, and the following
> + * disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
> + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
> + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
> + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
> + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
> + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
> + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * Limited testing on pseudorandom numbers drawn within [-2e8:4e8] shows
> + * an accuracy of <= 0.7412 ULP.
> + */
> +
> +#include <float.h>
> +#ifdef __i386__
> +#include <ieeefp.h>
> +#endif
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +#if LDBL_MANT_DIG == 64
> +#include "../ld80/e_rem_pio2l.h"
> +static const union IEEEl2bits
> +pio4u = LD80C(0xc90fdaa22168c235, -00001, 7.85398163397448309628e-01L);
> +#define pio4 (pio4u.e)
> +#elif LDBL_MANT_DIG == 113
> +#include "../ld128/e_rem_pio2l.h"
> +long double pio4 = 7.85398163397448309615660845819875721e-1L;
> +#else
> +#error "Unsupported long double format"
> +#endif
> +
> +long double
> +cosl(long double x)
> +{
> + union IEEEl2bits z;
> + int e0;
> + long double y[2];
> + long double hi, lo;
> +
> + z.e = x;
> + z.bits.sign = 0;
> +
> + /* If x = +-0 or x is a subnormal number, then cos(x) = 1 */
> + if (z.bits.exp == 0)
> + return (1.0);
> +
> + /* If x = NaN or Inf, then cos(x) = NaN. */
> + if (z.bits.exp == 32767)
> + return ((x - x) / (x - x));
> +
> + ENTERI();
> +
> + /* Optimize the case where x is already within range. */
> + if (z.e < pio4)
> + RETURNI(__kernel_cosl(z.e, 0));
> +
> + e0 = __ieee754_rem_pio2l(x, y);
> + hi = y[0];
> + lo = y[1];
> +
> + switch (e0 & 3) {
> + case 0:
> + hi = __kernel_cosl(hi, lo);
> + break;
> + case 1:
> + hi = - __kernel_sinl(hi, lo, 1);
> + break;
> + case 2:
> + hi = - __kernel_cosl(hi, lo);
> + break;
> + case 3:
> + hi = __kernel_sinl(hi, lo, 1);
> + break;
> + }
> +
> + RETURNI(hi);
> +}
> diff --git a/newlib/libm/ld/s_fabsl.c b/newlib/libm/ld/s_fabsl.c
> new file mode 100644
> index 000000000..5076d8a9b
> --- /dev/null
> +++ b/newlib/libm/ld/s_fabsl.c
> @@ -0,0 +1,45 @@
> +/*-
> + * SPDX-License-Identifier: BSD-3-Clause
> + *
> + * Copyright (c) 2003 Dag-Erling Smørgrav
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer
> + * in this position and unchanged.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + * 3. The name of the author may not be used to endorse or promote products
> + * derived from this software without specific prior written permission.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
> + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
> + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
> + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
> + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
> + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
> + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + *
> + * $FreeBSD$
> + */
> +
> +#include <math.h>
> +
> +#include "fpmath.h"
> +
> +long double
> +fabsl(long double x)
> +{
> + union IEEEl2bits u;
> +
> + u.e = x;
> + u.bits.sign = 0;
> + return (u.e);
> +}
> diff --git a/newlib/libm/ld/s_fdim.c b/newlib/libm/ld/s_fdim.c
> new file mode 100644
> index 000000000..c40c3e9d3
> --- /dev/null
> +++ b/newlib/libm/ld/s_fdim.c
> @@ -0,0 +1,48 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include <math.h>
> +
> +#define DECL(type, fn) \
> +type \
> +fn(type x, type y) \
> +{ \
> + \
> + if (isnan(x)) \
> + return (x); \
> + if (isnan(y)) \
> + return (y); \
> + return (x > y ? x - y : 0.0); \
> +}
> +
> +DECL(double, fdim)
> +DECL(float, fdimf)
> +DECL(long double, fdiml)
> diff --git a/newlib/libm/ld/s_floorl.c b/newlib/libm/ld/s_floorl.c
> new file mode 100644
> index 000000000..6cec3e781
> --- /dev/null
> +++ b/newlib/libm/ld/s_floorl.c
> @@ -0,0 +1,101 @@
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunPro, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + *
> + * From: @(#)s_floor.c 5.1 93/09/24
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * floorl(x)
> + * Return x rounded toward -inf to integral value
> + * Method:
> + * Bit twiddling.
> + * Exception:
> + * Inexact flag raised if x not equal to floorl(x).
> + */
> +
> +#include <float.h>
> +#include <math.h>
> +#include <stdint.h>
> +
> +#include "fpmath.h"
> +
> +#ifdef LDBL_IMPLICIT_NBIT
> +#define MANH_SIZE (LDBL_MANH_SIZE + 1)
> +#define INC_MANH(u, c) do { \
> + uint64_t o = u.bits.manh; \
> + u.bits.manh += (c); \
> + if (u.bits.manh < o) \
> + u.bits.exp++; \
> +} while (0)
> +#else
> +#define MANH_SIZE LDBL_MANH_SIZE
> +#define INC_MANH(u, c) do { \
> + uint64_t o = u.bits.manh; \
> + u.bits.manh += (c); \
> + if (u.bits.manh < o) { \
> + u.bits.exp++; \
> + u.bits.manh |= 1llu << (LDBL_MANH_SIZE - 1); \
> + } \
> +} while (0)
> +#endif
> +
> +static const long double huge = 1.0e300;
> +
> +long double
> +floorl(long double x)
> +{
> + union IEEEl2bits u = { .e = x };
> + int e = u.bits.exp - LDBL_MAX_EXP + 1;
> +
> + if (e < MANH_SIZE - 1) {
> + if (e < 0) { /* raise inexact if x != 0 */
> + if (huge + x > 0.0)
> + if (u.bits.exp > 0 ||
> + (u.bits.manh | u.bits.manl) != 0)
> + u.e = u.bits.sign ? -1.0 : 0.0;
> + } else {
> + uint64_t m = ((1llu << MANH_SIZE) - 1) >> (e + 1);
> + if (((u.bits.manh & m) | u.bits.manl) == 0)
> + return (x); /* x is integral */
> + if (u.bits.sign) {
> +#ifdef LDBL_IMPLICIT_NBIT
> + if (e == 0)
> + u.bits.exp++;
> + else
> +#endif
> + INC_MANH(u, 1llu << (MANH_SIZE - e - 1));
> + }
> + if (huge + x > 0.0) { /* raise inexact flag */
> + u.bits.manh &= ~m;
> + u.bits.manl = 0;
> + }
> + }
> + } else if (e < LDBL_MANT_DIG - 1) {
> + uint64_t m = (uint64_t)-1 >> (64 - LDBL_MANT_DIG + e + 1);
> + if ((u.bits.manl & m) == 0)
> + return (x); /* x is integral */
> + if (u.bits.sign) {
> + if (e == MANH_SIZE - 1)
> + INC_MANH(u, 1);
> + else {
> + uint64_t o = u.bits.manl;
> + u.bits.manl += 1llu << (LDBL_MANT_DIG - e - 1);
> + if (u.bits.manl < o) /* got a carry */
> + INC_MANH(u, 1);
> + }
> + }
> + if (huge + x > 0.0) /* raise inexact flag */
> + u.bits.manl &= ~m;
> + }
> + return (u.e);
> +}
> diff --git a/newlib/libm/ld/s_fmal.c b/newlib/libm/ld/s_fmal.c
> new file mode 100644
> index 000000000..a379346c1
> --- /dev/null
> +++ b/newlib/libm/ld/s_fmal.c
> @@ -0,0 +1,274 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2005-2011 David Schultz <das@FreeBSD.ORG>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include <fenv.h>
> +#include <float.h>
> +#include <math.h>
> +
> +#include "fpmath.h"
> +
> +/*
> + * A struct dd represents a floating-point number with twice the precision
> + * of a long double. We maintain the invariant that "hi" stores the high-order
> + * bits of the result.
> + */
> +struct dd {
> + long double hi;
> + long double lo;
> +};
> +
> +/*
> + * Compute a+b exactly, returning the exact result in a struct dd. We assume
> + * that both a and b are finite, but make no assumptions about their relative
> + * magnitudes.
> + */
> +static inline struct dd
> +dd_add(long double a, long double b)
> +{
> + struct dd ret;
> + long double s;
> +
> + ret.hi = a + b;
> + s = ret.hi - a;
> + ret.lo = (a - (ret.hi - s)) + (b - s);
> + return (ret);
> +}
> +
> +/*
> + * Compute a+b, with a small tweak: The least significant bit of the
> + * result is adjusted into a sticky bit summarizing all the bits that
> + * were lost to rounding. This adjustment negates the effects of double
> + * rounding when the result is added to another number with a higher
> + * exponent. For an explanation of round and sticky bits, see any reference
> + * on FPU design, e.g.,
> + *
> + * J. Coonen. An Implementation Guide to a Proposed Standard for
> + * Floating-Point Arithmetic. Computer, vol. 13, no. 1, Jan 1980.
> + */
> +static inline long double
> +add_adjusted(long double a, long double b)
> +{
> + struct dd sum;
> + union IEEEl2bits u;
> +
> + sum = dd_add(a, b);
> + if (sum.lo != 0) {
> + u.e = sum.hi;
> + if ((u.bits.manl & 1) == 0)
> + sum.hi = nextafterl(sum.hi, INFINITY * sum.lo);
> + }
> + return (sum.hi);
> +}
> +
> +/*
> + * Compute ldexp(a+b, scale) with a single rounding error. It is assumed
> + * that the result will be subnormal, and care is taken to ensure that
> + * double rounding does not occur.
> + */
> +static inline long double
> +add_and_denormalize(long double a, long double b, int scale)
> +{
> + struct dd sum;
> + int bits_lost;
> + union IEEEl2bits u;
> +
> + sum = dd_add(a, b);
> +
> + /*
> + * If we are losing at least two bits of accuracy to denormalization,
> + * then the first lost bit becomes a round bit, and we adjust the
> + * lowest bit of sum.hi to make it a sticky bit summarizing all the
> + * bits in sum.lo. With the sticky bit adjusted, the hardware will
> + * break any ties in the correct direction.
> + *
> + * If we are losing only one bit to denormalization, however, we must
> + * break the ties manually.
> + */
> + if (sum.lo != 0) {
> + u.e = sum.hi;
> + bits_lost = -u.bits.exp - scale + 1;
> + if ((bits_lost != 1) ^ (int)(u.bits.manl & 1))
> + sum.hi = nextafterl(sum.hi, INFINITY * sum.lo);
> + }
> + return (ldexp(sum.hi, scale));
> +}
> +
> +/*
> + * Compute a*b exactly, returning the exact result in a struct dd. We assume
> + * that both a and b are normalized, so no underflow or overflow will occur.
> + * The current rounding mode must be round-to-nearest.
> + */
> +static inline struct dd
> +dd_mul(long double a, long double b)
> +{
> +#if LDBL_MANT_DIG == 64
> + static const long double split = 0x1p32L + 1.0;
> +#elif LDBL_MANT_DIG == 113
> + static const long double split = 0x1p57L + 1.0;
> +#endif
> + struct dd ret;
> + long double ha, hb, la, lb, p, q;
> +
> + p = a * split;
> + ha = a - p;
> + ha += p;
> + la = a - ha;
> +
> + p = b * split;
> + hb = b - p;
> + hb += p;
> + lb = b - hb;
> +
> + p = ha * hb;
> + q = ha * lb + la * hb;
> +
> + ret.hi = p + q;
> + ret.lo = p - ret.hi + q + la * lb;
> + return (ret);
> +}
> +
> +/*
> + * Fused multiply-add: Compute x * y + z with a single rounding error.
> + *
> + * We use scaling to avoid overflow/underflow, along with the
> + * canonical precision-doubling technique adapted from:
> + *
> + * Dekker, T. A Floating-Point Technique for Extending the
> + * Available Precision. Numer. Math. 18, 224-242 (1971).
> + */
> +long double
> +fmal(long double x, long double y, long double z)
> +{
> + long double xs, ys, zs, adj;
> + struct dd xy, r;
> + int oround;
> + int ex, ey, ez;
> + int spread;
> +
> + /*
> + * Handle special cases. The order of operations and the particular
> + * return values here are crucial in handling special cases involving
> + * infinities, NaNs, overflows, and signed zeroes correctly.
> + */
> + if (x == 0.0 || y == 0.0)
> + return (x * y + z);
> + if (z == 0.0)
> + return (x * y);
> + if (!isfinite(x) || !isfinite(y))
> + return (x * y + z);
> + if (!isfinite(z))
> + return (z);
> +
> + xs = frexpl(x, &ex);
> + ys = frexpl(y, &ey);
> + zs = frexpl(z, &ez);
> + oround = fegetround();
> + spread = ex + ey - ez;
> +
> + /*
> + * If x * y and z are many orders of magnitude apart, the scaling
> + * will overflow, so we handle these cases specially. Rounding
> + * modes other than FE_TONEAREST are painful.
> + */
> + if (spread < -LDBL_MANT_DIG) {
> + feraiseexcept(FE_INEXACT);
> + if (!isnormal(z))
> + feraiseexcept(FE_UNDERFLOW);
> + switch (oround) {
> + case FE_TONEAREST:
> + return (z);
> + case FE_TOWARDZERO:
> + if (x > 0.0 ^ y < 0.0 ^ z < 0.0)
> + return (z);
> + else
> + return (nextafterl(z, 0));
> + case FE_DOWNWARD:
> + if (x > 0.0 ^ y < 0.0)
> + return (z);
> + else
> + return (nextafterl(z, -INFINITY));
> + default: /* FE_UPWARD */
> + if (x > 0.0 ^ y < 0.0)
> + return (nextafterl(z, INFINITY));
> + else
> + return (z);
> + }
> + }
> + if (spread <= LDBL_MANT_DIG * 2)
> + zs = ldexpl(zs, -spread);
> + else
> + zs = copysignl(LDBL_MIN, zs);
> +
> + fesetround(FE_TONEAREST);
> + /* work around clang bug 8100 */
> + volatile long double vxs = xs;
> +
> + /*
> + * Basic approach for round-to-nearest:
> + *
> + * (xy.hi, xy.lo) = x * y (exact)
> + * (r.hi, r.lo) = xy.hi + z (exact)
> + * adj = xy.lo + r.lo (inexact; low bit is sticky)
> + * result = r.hi + adj (correctly rounded)
> + */
> + xy = dd_mul(vxs, ys);
> + r = dd_add(xy.hi, zs);
> +
> + spread = ex + ey;
> +
> + if (r.hi == 0.0) {
> + /*
> + * When the addends cancel to 0, ensure that the result has
> + * the correct sign.
> + */
> + fesetround(oround);
> + volatile long double vzs = zs; /* XXX gcc CSE bug workaround */
> + return (xy.hi + vzs + ldexpl(xy.lo, spread));
> + }
> +
> + if (oround != FE_TONEAREST) {
> + /*
> + * There is no need to worry about double rounding in directed
> + * rounding modes.
> + */
> + fesetround(oround);
> + /* work around clang bug 8100 */
> + volatile long double vrlo = r.lo;
> + adj = vrlo + xy.lo;
> + return (ldexpl(r.hi + adj, spread));
> + }
> +
> + adj = add_adjusted(r.lo, xy.lo);
> + if (spread + ilogbl(r.hi) > -16383)
> + return (ldexpl(r.hi + adj, spread));
> + else
> + return (add_and_denormalize(r.hi, adj, spread));
> +}
> diff --git a/newlib/libm/ld/s_fmaxl.c b/newlib/libm/ld/s_fmaxl.c
> new file mode 100644
> index 000000000..c0d7c8832
> --- /dev/null
> +++ b/newlib/libm/ld/s_fmaxl.c
> @@ -0,0 +1,57 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include <math.h>
> +
> +#include "fpmath.h"
> +
> +long double
> +fmaxl(long double x, long double y)
> +{
> + union IEEEl2bits u[2];
> +
> + u[0].e = x;
> + mask_nbit_l(u[0]);
> + u[1].e = y;
> + mask_nbit_l(u[1]);
> +
> + /* Check for NaNs to avoid raising spurious exceptions. */
> + if (u[0].bits.exp == 32767 && (u[0].bits.manh | u[0].bits.manl) != 0)
> + return (y);
> + if (u[1].bits.exp == 32767 && (u[1].bits.manh | u[1].bits.manl) != 0)
> + return (x);
> +
> + /* Handle comparisons of signed zeroes. */
> + if (u[0].bits.sign != u[1].bits.sign)
> + return (u[0].bits.sign ? y : x);
> +
> + return (x > y ? x : y);
> +}
> diff --git a/newlib/libm/ld/s_fminl.c b/newlib/libm/ld/s_fminl.c
> new file mode 100644
> index 000000000..97604b38b
> --- /dev/null
> +++ b/newlib/libm/ld/s_fminl.c
> @@ -0,0 +1,57 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include <math.h>
> +
> +#include "fpmath.h"
> +
> +long double
> +fminl(long double x, long double y)
> +{
> + union IEEEl2bits u[2];
> +
> + u[0].e = x;
> + mask_nbit_l(u[0]);
> + u[1].e = y;
> + mask_nbit_l(u[1]);
> +
> + /* Check for NaNs to avoid raising spurious exceptions. */
> + if (u[0].bits.exp == 32767 && (u[0].bits.manh | u[0].bits.manl) != 0)
> + return (y);
> + if (u[1].bits.exp == 32767 && (u[1].bits.manh | u[1].bits.manl) != 0)
> + return (x);
> +
> + /* Handle comparisons of signed zeroes. */
> + if (u[0].bits.sign != u[1].bits.sign)
> + return (u[1].bits.sign ? y : x);
> +
> + return (x < y ? x : y);
> +}
> diff --git a/newlib/libm/ld/s_frexpl.c b/newlib/libm/ld/s_frexpl.c
> new file mode 100644
> index 000000000..66e284fdd
> --- /dev/null
> +++ b/newlib/libm/ld/s_frexpl.c
> @@ -0,0 +1,64 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2004-2005 David Schultz <das@FreeBSD.ORG>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + *
> + * $FreeBSD$
> + */
> +
> +#include <float.h>
> +#include <math.h>
> +
> +#include "fpmath.h"
> +
> +#if LDBL_MAX_EXP != 0x4000
> +#error "Unsupported long double format"
> +#endif
> +
> +long double
> +frexpl(long double x, int *ex)
> +{
> + union IEEEl2bits u;
> +
> + u.e = x;
> + switch (u.bits.exp) {
> + case 0: /* 0 or subnormal */
> + if ((u.bits.manl | u.bits.manh) == 0) {
> + *ex = 0;
> + } else {
> + u.e *= 0x1.0p514;
> + *ex = u.bits.exp - 0x4200;
> + u.bits.exp = 0x3ffe;
> + }
> + break;
> + case 0x7fff: /* infinity or NaN; value of *ex is unspecified */
> + break;
> + default: /* normal */
> + *ex = u.bits.exp - 0x3ffe;
> + u.bits.exp = 0x3ffe;
> + break;
> + }
> + return (u.e);
> +}
> diff --git a/newlib/libm/ld/s_ilogbl.c b/newlib/libm/ld/s_ilogbl.c
> new file mode 100644
> index 000000000..3211f4409
> --- /dev/null
> +++ b/newlib/libm/ld/s_ilogbl.c
> @@ -0,0 +1,53 @@
> +/*
> + * From: @(#)s_ilogb.c 5.1 93/09/24
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunPro, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include <float.h>
> +#include <limits.h>
> +#include <math.h>
> +
> +#include "fpmath.h"
> +
> +int
> +ilogbl(long double x)
> +{
> + union IEEEl2bits u;
> + unsigned long m;
> + int b;
> +
> + u.e = x;
> + if (u.bits.exp == 0) {
> + if ((u.bits.manl | u.bits.manh) == 0)
> + return (FP_ILOGB0);
> + /* denormalized */
> + if (u.bits.manh == 0) {
> + m = 1lu << (LDBL_MANL_SIZE - 1);
> + for (b = LDBL_MANH_SIZE; !(u.bits.manl & m); m >>= 1)
> + b++;
> + } else {
> + m = 1lu << (LDBL_MANH_SIZE - 1);
> + for (b = 0; !(u.bits.manh & m); m >>= 1)
> + b++;
> + }
> +#ifdef LDBL_IMPLICIT_NBIT
> + b++;
> +#endif
> + return (LDBL_MIN_EXP - b - 1);
> + } else if (u.bits.exp < (LDBL_MAX_EXP << 1) - 1)
> + return (u.bits.exp - LDBL_MAX_EXP + 1);
> + else if (u.bits.manl != 0 || u.bits.manh != 0)
> + return (FP_ILOGBNAN);
> + else
> + return (INT_MAX);
> +}
> diff --git a/newlib/libm/ld/s_llrintl.c b/newlib/libm/ld/s_llrintl.c
> new file mode 100644
> index 000000000..6ef83759c
> --- /dev/null
> +++ b/newlib/libm/ld/s_llrintl.c
> @@ -0,0 +1,9 @@
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#define type long double
> +#define roundit rintl
> +#define dtype long long
> +#define fn llrintl
> +
> +#include "s_lrint.c"
> diff --git a/newlib/libm/ld/s_llroundl.c b/newlib/libm/ld/s_llroundl.c
> new file mode 100644
> index 000000000..02c44eb4b
> --- /dev/null
> +++ b/newlib/libm/ld/s_llroundl.c
> @@ -0,0 +1,11 @@
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#define type long double
> +#define roundit roundl
> +#define dtype long long
> +#define DTYPE_MIN LLONG_MIN
> +#define DTYPE_MAX LLONG_MAX
> +#define fn llroundl
> +
> +#include "s_lround.c"
> diff --git a/newlib/libm/ld/s_logbl.c b/newlib/libm/ld/s_logbl.c
> new file mode 100644
> index 000000000..ee1a91fd8
> --- /dev/null
> +++ b/newlib/libm/ld/s_logbl.c
> @@ -0,0 +1,54 @@
> +/*
> + * From: @(#)s_ilogb.c 5.1 93/09/24
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunPro, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include <float.h>
> +#include <limits.h>
> +#include <math.h>
> +
> +#include "fpmath.h"
> +
> +long double
> +logbl(long double x)
> +{
> + union IEEEl2bits u;
> + unsigned long m;
> + int b;
> +
> + u.e = x;
> + if (u.bits.exp == 0) {
> + if ((u.bits.manl | u.bits.manh) == 0) { /* x == 0 */
> + u.bits.sign = 1;
> + return (1.0L / u.e);
> + }
> + /* denormalized */
> + if (u.bits.manh == 0) {
> + m = 1lu << (LDBL_MANL_SIZE - 1);
> + for (b = LDBL_MANH_SIZE; !(u.bits.manl & m); m >>= 1)
> + b++;
> + } else {
> + m = 1lu << (LDBL_MANH_SIZE - 1);
> + for (b = 0; !(u.bits.manh & m); m >>= 1)
> + b++;
> + }
> +#ifdef LDBL_IMPLICIT_NBIT
> + b++;
> +#endif
> + return ((long double)(LDBL_MIN_EXP - b - 1));
> + }
> + if (u.bits.exp < (LDBL_MAX_EXP << 1) - 1) /* normal */
> + return ((long double)(u.bits.exp - LDBL_MAX_EXP + 1));
> + else /* +/- inf or nan */
> + return (x * x);
> +}
> diff --git a/newlib/libm/ld/s_lrint.c b/newlib/libm/ld/s_lrint.c
> new file mode 100644
> index 000000000..ad9b978fa
> --- /dev/null
> +++ b/newlib/libm/ld/s_lrint.c
> @@ -0,0 +1,60 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2005 David Schultz <das@FreeBSD.ORG>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + */
> +
> +#include <sys/cdefs.h>
> +#include <fenv.h>
> +#include <math.h>
> +
> +#ifndef type
> +__FBSDID("$FreeBSD$");
> +#define type double
> +#define roundit rint
> +#define dtype long
> +#define fn lrint
> +#endif
> +
> +/*
> + * C99 says we should not raise a spurious inexact exception when an
> + * invalid exception is raised. Unfortunately, the set of inputs
> + * that overflows depends on the rounding mode when 'dtype' has more
> + * significant bits than 'type'. Hence, we bend over backwards for the
> + * sake of correctness; an MD implementation could be more efficient.
> + */
> +dtype
> +fn(type x)
> +{
> + fenv_t env;
> + dtype d;
> +
> + feholdexcept(&env);
> + d = (dtype)roundit(x);
> + if (fetestexcept(FE_INVALID))
> + feclearexcept(FE_INEXACT);
> + feupdateenv(&env);
> + return (d);
> +}
> diff --git a/newlib/libm/ld/s_lrintl.c b/newlib/libm/ld/s_lrintl.c
> new file mode 100644
> index 000000000..497b442f3
> --- /dev/null
> +++ b/newlib/libm/ld/s_lrintl.c
> @@ -0,0 +1,9 @@
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#define type long double
> +#define roundit rintl
> +#define dtype long
> +#define fn lrintl
> +
> +#include "s_lrint.c"
> diff --git a/newlib/libm/ld/s_lround.c b/newlib/libm/ld/s_lround.c
> new file mode 100644
> index 000000000..1dd8e697f
> --- /dev/null
> +++ b/newlib/libm/ld/s_lround.c
> @@ -0,0 +1,70 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2005 David Schultz <das@FreeBSD.ORG>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + */
> +
> +#include <sys/cdefs.h>
> +#include <sys/limits.h>
> +#include <fenv.h>
> +#include <math.h>
> +
> +#ifndef type
> +__FBSDID("$FreeBSD$");
> +#define type double
> +#define roundit round
> +#define dtype long
> +#define DTYPE_MIN LONG_MIN
> +#define DTYPE_MAX LONG_MAX
> +#define fn lround
> +#endif
> +
> +/*
> + * If type has more precision than dtype, the endpoints dtype_(min|max) are
> + * of the form xxx.5; they are "out of range" because lround() rounds away
> + * from 0. On the other hand, if type has less precision than dtype, then
> + * all values that are out of range are integral, so we might as well assume
> + * that everything is in range. At compile time, INRANGE(x) should reduce to
> + * two floating-point comparisons in the former case, or TRUE otherwise.
> + */
> +static const type type_min = (type)DTYPE_MIN;
> +static const type type_max = (type)DTYPE_MAX;
> +static const type dtype_min = (type)DTYPE_MIN - 0.5;
> +static const type dtype_max = (type)DTYPE_MAX + 0.5;
> +#define INRANGE(x) (dtype_max - type_max != 0.5 || \
> + ((x) > dtype_min && (x) < dtype_max))
> +
> +dtype
> +fn(type x)
> +{
> +
> + if (INRANGE(x)) {
> + x = roundit(x);
> + return ((dtype)x);
> + } else {
> + feraiseexcept(FE_INVALID);
> + return (DTYPE_MAX);
> + }
> +}
> diff --git a/newlib/libm/ld/s_lroundl.c b/newlib/libm/ld/s_lroundl.c
> new file mode 100644
> index 000000000..e410827e2
> --- /dev/null
> +++ b/newlib/libm/ld/s_lroundl.c
> @@ -0,0 +1,11 @@
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#define type long double
> +#define roundit roundl
> +#define dtype long
> +#define DTYPE_MIN LONG_MIN
> +#define DTYPE_MAX LONG_MAX
> +#define fn lroundl
> +
> +#include "s_lround.c"
> diff --git a/newlib/libm/ld/s_modfl.c b/newlib/libm/ld/s_modfl.c
> new file mode 100644
> index 000000000..2d83bbe33
> --- /dev/null
> +++ b/newlib/libm/ld/s_modfl.c
> @@ -0,0 +1,103 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2007 David Schultz <das@FreeBSD.ORG>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + *
> + * Derived from s_modf.c, which has the following Copyright:
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunPro, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + *
> + * $FreeBSD$
> + */
> +
> +#include <float.h>
> +#include <math.h>
> +#include <sys/types.h>
> +
> +#include "fpmath.h"
> +
> +#if LDBL_MANL_SIZE > 32
> +#define MASK ((uint64_t)-1)
> +#else
> +#define MASK ((uint32_t)-1)
> +#endif
> +/* Return the last n bits of a word, representing the fractional part. */
> +#define GETFRAC(bits, n) ((bits) & ~(MASK << (n)))
> +/* The number of fraction bits in manh, not counting the integer bit */
> +#define HIBITS (LDBL_MANT_DIG - LDBL_MANL_SIZE)
> +
> +static const long double zero[] = { 0.0L, -0.0L };
> +
> +long double
> +modfl(long double x, long double *iptr)
> +{
> + union IEEEl2bits ux;
> + int e;
> +
> + ux.e = x;
> + e = ux.bits.exp - LDBL_MAX_EXP + 1;
> + if (e < HIBITS) { /* Integer part is in manh. */
> + if (e < 0) { /* |x|<1 */
> + *iptr = zero[ux.bits.sign];
> + return (x);
> + } else {
> + if ((GETFRAC(ux.bits.manh, HIBITS - 1 - e) |
> + ux.bits.manl) == 0) { /* X is an integer. */
> + *iptr = x;
> + return (zero[ux.bits.sign]);
> + } else {
> + /* Clear all but the top e+1 bits. */
> + ux.bits.manh >>= HIBITS - 1 - e;
> + ux.bits.manh <<= HIBITS - 1 - e;
> + ux.bits.manl = 0;
> + *iptr = ux.e;
> + return (x - ux.e);
> + }
> + }
> + } else if (e >= LDBL_MANT_DIG - 1) { /* x has no fraction part. */
> + *iptr = x;
> + if (x != x) /* Handle NaNs. */
> + return (x);
> + return (zero[ux.bits.sign]);
> + } else { /* Fraction part is in manl. */
> + if (GETFRAC(ux.bits.manl, LDBL_MANT_DIG - 1 - e) == 0) {
> + /* x is integral. */
> + *iptr = x;
> + return (zero[ux.bits.sign]);
> + } else {
> + /* Clear all but the top e+1 bits. */
> + ux.bits.manl >>= LDBL_MANT_DIG - 1 - e;
> + ux.bits.manl <<= LDBL_MANT_DIG - 1 - e;
> + *iptr = ux.e;
> + return (x - ux.e);
> + }
> + }
> +}
> diff --git a/newlib/libm/ld/s_nearbyint.c b/newlib/libm/ld/s_nearbyint.c
> new file mode 100644
> index 000000000..796dbaf98
> --- /dev/null
> +++ b/newlib/libm/ld/s_nearbyint.c
> @@ -0,0 +1,61 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include <fenv.h>
> +#include <math.h>
> +
> +/*
> + * We save and restore the floating-point environment to avoid raising
> + * an inexact exception. We can get away with using fesetenv()
> + * instead of feclearexcept()/feupdateenv() to restore the environment
> + * because the only exception defined for rint() is overflow, and
> + * rounding can't overflow as long as emax >= p.
> + *
> + * The volatile keyword is needed below because clang incorrectly assumes
> + * that rint won't raise any floating-point exceptions. Declaring ret volatile
> + * is sufficient to trick the compiler into doing the right thing.
> + */
> +#define DECL(type, fn, rint) \
> +type \
> +fn(type x) \
> +{ \
> + volatile type ret; \
> + fenv_t env; \
> + \
> + fegetenv(&env); \
> + ret = rint(x); \
> + fesetenv(&env); \
> + return (ret); \
> +}
> +
> +DECL(double, nearbyint, rint)
> +DECL(float, nearbyintf, rintf)
> +DECL(long double, nearbyintl, rintl)
> diff --git a/newlib/libm/ld/s_nextafterl.c b/newlib/libm/ld/s_nextafterl.c
> new file mode 100644
> index 000000000..9c61a436a
> --- /dev/null
> +++ b/newlib/libm/ld/s_nextafterl.c
> @@ -0,0 +1,80 @@
> +/* @(#)s_nextafter.c 5.1 93/09/24 */
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunPro, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/* IEEE functions
> + * nextafter(x,y)
> + * return the next machine floating-point number of x in the
> + * direction toward y.
> + * Special cases:
> + */
> +
> +#include <float.h>
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +
> +#if LDBL_MAX_EXP != 0x4000
> +#error "Unsupported long double format"
> +#endif
> +
> +long double
> +nextafterl(long double x, long double y)
> +{
> + volatile long double t;
> + union IEEEl2bits ux, uy;
> +
> + ux.e = x;
> + uy.e = y;
> +
> + if ((ux.bits.exp == 0x7fff &&
> + ((ux.bits.manh&~LDBL_NBIT)|ux.bits.manl) != 0) ||
> + (uy.bits.exp == 0x7fff &&
> + ((uy.bits.manh&~LDBL_NBIT)|uy.bits.manl) != 0))
> + return x+y; /* x or y is nan */
> + if(x==y) return y; /* x=y, return y */
> + if(x==0.0) {
> + ux.bits.manh = 0; /* return +-minsubnormal */
> + ux.bits.manl = 1;
> + ux.bits.sign = uy.bits.sign;
> + t = ux.e*ux.e;
> + if(t==ux.e) return t; else return ux.e; /* raise underflow flag */
> + }
> + if(x>0.0 ^ x<y) { /* x -= ulp */
> + if(ux.bits.manl==0) {
> + if ((ux.bits.manh&~LDBL_NBIT)==0)
> + ux.bits.exp -= 1;
> + ux.bits.manh = (ux.bits.manh - 1) | (ux.bits.manh & LDBL_NBIT);
> + }
> + ux.bits.manl -= 1;
> + } else { /* x += ulp */
> + ux.bits.manl += 1;
> + if(ux.bits.manl==0) {
> + ux.bits.manh = (ux.bits.manh + 1) | (ux.bits.manh & LDBL_NBIT);
> + if ((ux.bits.manh&~LDBL_NBIT)==0)
> + ux.bits.exp += 1;
> + }
> + }
> + if(ux.bits.exp==0x7fff) return x+x; /* overflow */
> + if(ux.bits.exp==0) { /* underflow */
> + mask_nbit_l(ux);
> + t = ux.e * ux.e;
> + if(t!=ux.e) /* raise underflow flag */
> + return ux.e;
> + }
> + return ux.e;
> +}
> +
> +__strong_reference(nextafterl, nexttowardl);
> diff --git a/newlib/libm/ld/s_nexttoward.c b/newlib/libm/ld/s_nexttoward.c
> new file mode 100644
> index 000000000..b2a50d313
> --- /dev/null
> +++ b/newlib/libm/ld/s_nexttoward.c
> @@ -0,0 +1,72 @@
> +/* @(#)s_nextafter.c 5.1 93/09/24 */
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunPro, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * We assume that a long double has a 15-bit exponent. On systems
> + * where long double is the same as double, nexttoward() is an alias
> + * for nextafter(), so we don't use this routine.
> + */
> +
> +#include <float.h>
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +
> +#if LDBL_MAX_EXP != 0x4000
> +#error "Unsupported long double format"
> +#endif
> +
> +double
> +nexttoward(double x, long double y)
> +{
> + union IEEEl2bits uy;
> + volatile double t;
> + int32_t hx,ix;
> + u_int32_t lx;
> +
> + EXTRACT_WORDS(hx,lx,x);
> + ix = hx&0x7fffffff; /* |x| */
> + uy.e = y;
> +
> + if(((ix>=0x7ff00000)&&((ix-0x7ff00000)|lx)!=0) ||
> + (uy.bits.exp == 0x7fff &&
> + ((uy.bits.manh&~LDBL_NBIT)|uy.bits.manl) != 0))
> + return x+y; /* x or y is nan */
> + if(x==y) return (double)y; /* x=y, return y */
> + if(x==0.0) {
> + INSERT_WORDS(x,uy.bits.sign<<31,1); /* return +-minsubnormal */
> + t = x*x;
> + if(t==x) return t; else return x; /* raise underflow flag */
> + }
> + if(hx>0.0 ^ x < y) { /* x -= ulp */
> + if(lx==0) hx -= 1;
> + lx -= 1;
> + } else { /* x += ulp */
> + lx += 1;
> + if(lx==0) hx += 1;
> + }
> + ix = hx&0x7ff00000;
> + if(ix>=0x7ff00000) return x+x; /* overflow */
> + if(ix<0x00100000) { /* underflow */
> + t = x*x;
> + if(t!=x) { /* raise underflow flag */
> + INSERT_WORDS(x,hx,lx);
> + return x;
> + }
> + }
> + INSERT_WORDS(x,hx,lx);
> + return x;
> +}
> diff --git a/newlib/libm/ld/s_nexttowardf.c b/newlib/libm/ld/s_nexttowardf.c
> new file mode 100644
> index 000000000..9ddfff961
> --- /dev/null
> +++ b/newlib/libm/ld/s_nexttowardf.c
> @@ -0,0 +1,59 @@
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunPro, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include <float.h>
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +
> +#define LDBL_INFNAN_EXP (LDBL_MAX_EXP * 2 - 1)
> +
> +float
> +nexttowardf(float x, long double y)
> +{
> + union IEEEl2bits uy;
> + volatile float t;
> + int32_t hx,ix;
> +
> + GET_FLOAT_WORD(hx,x);
> + ix = hx&0x7fffffff; /* |x| */
> + uy.e = y;
> +
> + if((ix>0x7f800000) ||
> + (uy.bits.exp == LDBL_INFNAN_EXP &&
> + ((uy.bits.manh&~LDBL_NBIT)|uy.bits.manl) != 0))
> + return x+y; /* x or y is nan */
> + if(x==y) return (float)y; /* x=y, return y */
> + if(ix==0) { /* x == 0 */
> + SET_FLOAT_WORD(x,(uy.bits.sign<<31)|1);/* return +-minsubnormal */
> + t = x*x;
> + if(t==x) return t; else return x; /* raise underflow flag */
> + }
> + if(hx>=0 ^ x < y) /* x -= ulp */
> + hx -= 1;
> + else /* x += ulp */
> + hx += 1;
> + ix = hx&0x7f800000;
> + if(ix>=0x7f800000) return x+x; /* overflow */
> + if(ix<0x00800000) { /* underflow */
> + t = x*x;
> + if(t!=x) { /* raise underflow flag */
> + SET_FLOAT_WORD(x,hx);
> + return x;
> + }
> + }
> + SET_FLOAT_WORD(x,hx);
> + return x;
> +}
> diff --git a/newlib/libm/ld/s_remquol.c b/newlib/libm/ld/s_remquol.c
> new file mode 100644
> index 000000000..a9f5813d0
> --- /dev/null
> +++ b/newlib/libm/ld/s_remquol.c
> @@ -0,0 +1,173 @@
> +/* @(#)e_fmod.c 1.3 95/01/18 */
> +/*-
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunSoft, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include <float.h>
> +#include <stdint.h>
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +
> +#define BIAS (LDBL_MAX_EXP - 1)
> +
> +#if LDBL_MANL_SIZE > 32
> +typedef uint64_t manl_t;
> +#else
> +typedef uint32_t manl_t;
> +#endif
> +
> +#if LDBL_MANH_SIZE > 32
> +typedef uint64_t manh_t;
> +#else
> +typedef uint32_t manh_t;
> +#endif
> +
> +/*
> + * These macros add and remove an explicit integer bit in front of the
> + * fractional mantissa, if the architecture doesn't have such a bit by
> + * default already.
> + */
> +#ifdef LDBL_IMPLICIT_NBIT
> +#define SET_NBIT(hx) ((hx) | (1ULL << LDBL_MANH_SIZE))
> +#define HFRAC_BITS LDBL_MANH_SIZE
> +#else
> +#define SET_NBIT(hx) (hx)
> +#define HFRAC_BITS (LDBL_MANH_SIZE - 1)
> +#endif
> +
> +#define MANL_SHIFT (LDBL_MANL_SIZE - 1)
> +
> +static const long double Zero[] = {0.0L, -0.0L};
> +
> +/*
> + * Return the IEEE remainder and set *quo to the last n bits of the
> + * quotient, rounded to the nearest integer. We choose n=31 because
> + * we wind up computing all the integer bits of the quotient anyway as
> + * a side-effect of computing the remainder by the shift and subtract
> + * method. In practice, this is far more bits than are needed to use
> + * remquo in reduction algorithms.
> + *
> + * Assumptions:
> + * - The low part of the mantissa fits in a manl_t exactly.
> + * - The high part of the mantissa fits in an int64_t with enough room
> + * for an explicit integer bit in front of the fractional bits.
> + */
> +long double
> +remquol(long double x, long double y, int *quo)
> +{
> + union IEEEl2bits ux, uy;
> + int64_t hx,hz; /* We need a carry bit even if LDBL_MANH_SIZE is 32. */
> + manh_t hy;
> + manl_t lx,ly,lz;
> + int ix,iy,n,q,sx,sxy;
> +
> + ux.e = x;
> + uy.e = y;
> + sx = ux.bits.sign;
> + sxy = sx ^ uy.bits.sign;
> + ux.bits.sign = 0; /* |x| */
> + uy.bits.sign = 0; /* |y| */
> +
> + /* purge off exception values */
> + if((uy.bits.exp|uy.bits.manh|uy.bits.manl)==0 || /* y=0 */
> + (ux.bits.exp == BIAS + LDBL_MAX_EXP) || /* or x not finite */
> + (uy.bits.exp == BIAS + LDBL_MAX_EXP &&
> + ((uy.bits.manh&~LDBL_NBIT)|uy.bits.manl)!=0)) /* or y is NaN */
> + return nan_mix_op(x, y, *)/nan_mix_op(x, y, *);
> + if(ux.bits.exp<=uy.bits.exp) {
> + if((ux.bits.exp<uy.bits.exp) ||
> + (ux.bits.manh<=uy.bits.manh &&
> + (ux.bits.manh<uy.bits.manh ||
> + ux.bits.manl<uy.bits.manl))) {
> + q = 0;
> + goto fixup; /* |x|<|y| return x or x-y */
> + }
> + if(ux.bits.manh==uy.bits.manh && ux.bits.manl==uy.bits.manl) {
> + *quo = (sxy ? -1 : 1);
> + return Zero[sx]; /* |x|=|y| return x*0*/
> + }
> + }
> +
> + /* determine ix = ilogb(x) */
> + if(ux.bits.exp == 0) { /* subnormal x */
> + ux.e *= 0x1.0p512;
> + ix = ux.bits.exp - (BIAS + 512);
> + } else {
> + ix = ux.bits.exp - BIAS;
> + }
> +
> + /* determine iy = ilogb(y) */
> + if(uy.bits.exp == 0) { /* subnormal y */
> + uy.e *= 0x1.0p512;
> + iy = uy.bits.exp - (BIAS + 512);
> + } else {
> + iy = uy.bits.exp - BIAS;
> + }
> +
> + /* set up {hx,lx}, {hy,ly} and align y to x */
> + hx = SET_NBIT(ux.bits.manh);
> + hy = SET_NBIT(uy.bits.manh);
> + lx = ux.bits.manl;
> + ly = uy.bits.manl;
> +
> + /* fix point fmod */
> + n = ix - iy;
> + q = 0;
> + while(n--) {
> + hz=hx-hy;lz=lx-ly; if(lx<ly) hz -= 1;
> + if(hz<0){hx = hx+hx+(lx>>MANL_SHIFT); lx = lx+lx;}
> + else {hx = hz+hz+(lz>>MANL_SHIFT); lx = lz+lz; q++;}
> + q <<= 1;
> + }
> + hz=hx-hy;lz=lx-ly; if(lx<ly) hz -= 1;
> + if(hz>=0) {hx=hz;lx=lz;q++;}
> +
> + /* convert back to floating value and restore the sign */
> + if((hx|lx)==0) { /* return sign(x)*0 */
> + q &= 0x7fffffff;
> + *quo = (sxy ? -q : q);
> + return Zero[sx];
> + }
> + while(hx<(1ULL<<HFRAC_BITS)) { /* normalize x */
> + hx = hx+hx+(lx>>MANL_SHIFT); lx = lx+lx;
> + iy -= 1;
> + }
> + ux.bits.manh = hx; /* The integer bit is truncated here if needed. */
> + ux.bits.manl = lx;
> + if (iy < LDBL_MIN_EXP) {
> + ux.bits.exp = iy + (BIAS + 512);
> + ux.e *= 0x1p-512;
> + } else {
> + ux.bits.exp = iy + BIAS;
> + }
> +fixup:
> + x = ux.e; /* |x| */
> + y = fabsl(y);
> + if (y < LDBL_MIN * 2) {
> + if (x+x>y || (x+x==y && (q & 1))) {
> + q++;
> + x-=y;
> + }
> + } else if (x>0.5*y || (x==0.5*y && (q & 1))) {
> + q++;
> + x-=y;
> + }
> + ux.e = x;
> + ux.bits.sign ^= sx;
> + x = ux.e;
> + q &= 0x7fffffff;
> + *quo = (sxy ? -q : q);
> + return x;
> +}
> diff --git a/newlib/libm/ld/s_rintl.c b/newlib/libm/ld/s_rintl.c
> new file mode 100644
> index 000000000..1e9824d83
> --- /dev/null
> +++ b/newlib/libm/ld/s_rintl.c
> @@ -0,0 +1,92 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2008 David Schultz <das@FreeBSD.ORG>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include <float.h>
> +#include <math.h>
> +
> +#include "fpmath.h"
> +
> +#if LDBL_MAX_EXP != 0x4000
> +/* We also require the usual bias, min exp and expsign packing. */
> +#error "Unsupported long double format"
> +#endif
> +
> +#define BIAS (LDBL_MAX_EXP - 1)
> +
> +static const float
> +shift[2] = {
> +#if LDBL_MANT_DIG == 64
> + 0x1.0p63, -0x1.0p63
> +#elif LDBL_MANT_DIG == 113
> + 0x1.0p112, -0x1.0p112
> +#else
> +#error "Unsupported long double format"
> +#endif
> +};
> +static const float zero[2] = { 0.0, -0.0 };
> +
> +long double
> +rintl(long double x)
> +{
> + union IEEEl2bits u;
> + uint32_t expsign;
> + int ex, sign;
> +
> + u.e = x;
> + expsign = u.xbits.expsign;
> + ex = expsign & 0x7fff;
> +
> + if (ex >= BIAS + LDBL_MANT_DIG - 1) {
> + if (ex == BIAS + LDBL_MAX_EXP)
> + return (x + x); /* Inf, NaN, or unsupported format */
> + return (x); /* finite and already an integer */
> + }
> + sign = expsign >> 15;
> +
> + /*
> + * The following code assumes that intermediate results are
> + * evaluated in long double precision. If they are evaluated in
> + * greater precision, double rounding may occur, and if they are
> + * evaluated in less precision (as on i386), results will be
> + * wildly incorrect.
> + */
> + x += shift[sign];
> + x -= shift[sign];
> +
> + /*
> + * If the result is +-0, then it must have the same sign as x, but
> + * the above calculation doesn't always give this. Fix up the sign.
> + */
> + if (ex < BIAS && x == 0.0L)
> + return (zero[sign]);
> +
> + return (x);
> +}
> diff --git a/newlib/libm/ld/s_roundl.c b/newlib/libm/ld/s_roundl.c
> new file mode 100644
> index 000000000..8d1c02a7f
> --- /dev/null
> +++ b/newlib/libm/ld/s_roundl.c
> @@ -0,0 +1,64 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2003, Steven G. Kargl
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice unmodified, this list of conditions, and the following
> + * disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
> + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
> + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
> + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
> + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
> + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
> + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include <float.h>
> +#ifdef __i386__
> +#include <ieeefp.h>
> +#endif
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +
> +long double
> +roundl(long double x)
> +{
> + long double t;
> + uint16_t hx;
> +
> + GET_LDBL_EXPSIGN(hx, x);
> + if ((hx & 0x7fff) == 0x7fff)
> + return (x + x);
> +
> + ENTERI();
> +
> + if (!(hx & 0x8000)) {
> + t = floorl(x);
> + if (t - x <= -0.5L)
> + t += 1;
> + RETURNI(t);
> + } else {
> + t = floorl(-x);
> + if (t + x <= -0.5L)
> + t += 1;
> + RETURNI(-t);
> + }
> +}
> diff --git a/newlib/libm/ld/s_scalbln.c b/newlib/libm/ld/s_scalbln.c
> new file mode 100644
> index 000000000..c27420c92
> --- /dev/null
> +++ b/newlib/libm/ld/s_scalbln.c
> @@ -0,0 +1,56 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include <math.h>
> +
> +#define NMAX 65536
> +#define NMIN -65536
> +
> +double
> +scalbln(double x, long n)
> +{
> +
> + return (scalbn(x, (n > NMAX) ? NMAX : (n < NMIN) ? NMIN : (int)n));
> +}
> +
> +float
> +scalblnf(float x, long n)
> +{
> +
> + return (scalbnf(x, (n > NMAX) ? NMAX : (n < NMIN) ? NMIN : (int)n));
> +}
> +
> +long double
> +scalblnl(long double x, long n)
> +{
> +
> + return (scalbnl(x, (n > NMAX) ? NMAX : (n < NMIN) ? NMIN : (int)n));
> +}
> diff --git a/newlib/libm/ld/s_scalbnl.c b/newlib/libm/ld/s_scalbnl.c
> new file mode 100644
> index 000000000..6044c1b1d
> --- /dev/null
> +++ b/newlib/libm/ld/s_scalbnl.c
> @@ -0,0 +1,49 @@
> +/*
> + * Copyright (c) 2005-2020 Rich Felker, et al.
> + *
> + * SPDX-License-Identifier: MIT
> + *
> + * Please see https://git.musl-libc.org/cgit/musl/tree/COPYRIGHT
> + * for all contributors to musl.
> + */
> +#include <math.h>
> +#include <float.h>
> +#include "math_private.h"
> +#include "fpmath.h"
> +/*
> + * scalbnl (long double x, int n)
> + * scalbnl(x,n) returns x* 2**n computed by exponent
> + * manipulation rather than by actually performing an
> + * exponentiation or a multiplication.
> + */
> +#if (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
> +long double scalbnl(long double x, int n)
> +{
> + union IEEEl2bits u;
> +
> + if (n > 16383) {
> + x *= 0x1p16383L;
> + n -= 16383;
> + if (n > 16383) {
> + x *= 0x1p16383L;
> + n -= 16383;
> + if (n > 16383)
> + n = 16383;
> + }
> + } else if (n < -16382) {
> + x *= 0x1p-16382L * 0x1p113L;
> + n += 16382 - 113;
> + if (n < -16382) {
> + x *= 0x1p-16382L * 0x1p113L;
> + n += 16382 - 113;
> + if (n < -16382)
> + n = -16382;
> + }
> + }
> + u.e = 1.0;
> + u.xbits.expsign = 0x3fff + n;
> + return x * u.e;
> +}
> +__strong_reference(scalbnl, ldexpl);
> +#endif
> +
> diff --git a/newlib/libm/ld/s_sinl.c b/newlib/libm/ld/s_sinl.c
> new file mode 100644
> index 000000000..f1ef84c8c
> --- /dev/null
> +++ b/newlib/libm/ld/s_sinl.c
> @@ -0,0 +1,95 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2007 Steven G. Kargl
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice unmodified, this list of conditions, and the following
> + * disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
> + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
> + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
> + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
> + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
> + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
> + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include <float.h>
> +#ifdef __i386__
> +#include <ieeefp.h>
> +#endif
> +
> +#include "math.h"
> +#include "math_private.h"
> +#if LDBL_MANT_DIG == 64
> +#include "../ld80/e_rem_pio2l.h"
> +#elif LDBL_MANT_DIG == 113
> +#include "../ld128/e_rem_pio2l.h"
> +#else
> +#error "Unsupported long double format"
> +#endif
> +
> +long double
> +sinl(long double x)
> +{
> + union IEEEl2bits z;
> + int e0, s;
> + long double y[2];
> + long double hi, lo;
> +
> + z.e = x;
> + s = z.bits.sign;
> + z.bits.sign = 0;
> +
> + /* If x = +-0 or x is a subnormal number, then sin(x) = x */
> + if (z.bits.exp == 0)
> + return (x);
> +
> + /* If x = NaN or Inf, then sin(x) = NaN. */
> + if (z.bits.exp == 32767)
> + return ((x - x) / (x - x));
> +
> + ENTERI();
> +
> + /* Optimize the case where x is already within range. */
> + if (z.e < M_PI_4) {
> + hi = __kernel_sinl(z.e, 0, 0);
> + RETURNI(s ? -hi : hi);
> + }
> +
> + e0 = __ieee754_rem_pio2l(x, y);
> + hi = y[0];
> + lo = y[1];
> +
> + switch (e0 & 3) {
> + case 0:
> + hi = __kernel_sinl(hi, lo, 1);
> + break;
> + case 1:
> + hi = __kernel_cosl(hi, lo);
> + break;
> + case 2:
> + hi = - __kernel_sinl(hi, lo, 1);
> + break;
> + case 3:
> + hi = - __kernel_cosl(hi, lo);
> + break;
> + }
> +
> + RETURNI(hi);
> +}
> diff --git a/newlib/libm/ld/s_tanhl.c b/newlib/libm/ld/s_tanhl.c
> new file mode 100644
> index 000000000..b7531866d
> --- /dev/null
> +++ b/newlib/libm/ld/s_tanhl.c
> @@ -0,0 +1,174 @@
> +/* from: FreeBSD: head/lib/msun/src/s_tanhl.c XXX */
> +
> +/* @(#)s_tanh.c 5.1 93/09/24 */
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunPro, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * See s_tanh.c for complete comments.
> + *
> + * Converted to long double by Bruce D. Evans.
> + */
> +
> +#include <float.h>
> +#ifdef __i386__
> +#include <ieeefp.h>
> +#endif
> +
> +#include "math.h"
> +#include "math_private.h"
> +#include "fpmath.h"
> +#include "k_expl.h"
> +
> +#if LDBL_MAX_EXP != 0x4000
> +/* We also require the usual expsign encoding. */
> +#error "Unsupported long double format"
> +#endif
> +
> +#define BIAS (LDBL_MAX_EXP - 1)
> +
> +static const volatile double tiny = 1.0e-300;
> +static const double one = 1.0;
> +#if LDBL_MANT_DIG == 64
> +/*
> + * Domain [-0.25, 0.25], range ~[-1.6304e-22, 1.6304e-22]:
> + * |tanh(x)/x - t(x)| < 2**-72.3
> + */
> +static const union IEEEl2bits
> +T3u = LD80C(0xaaaaaaaaaaaaaa9f, -2, -3.33333333333333333017e-1L);
> +#define T3 T3u.e
> +static const double
> +T5 = 1.3333333333333314e-1, /* 0x1111111111110a.0p-55 */
> +T7 = -5.3968253968210485e-2, /* -0x1ba1ba1ba1a1a1.0p-57 */
> +T9 = 2.1869488531393817e-2, /* 0x1664f488172022.0p-58 */
> +T11 = -8.8632352345964591e-3, /* -0x1226e34bc138d5.0p-59 */
> +T13 = 3.5921169709993771e-3, /* 0x1d6d371d3e400f.0p-61 */
> +T15 = -1.4555786415756001e-3, /* -0x17d923aa63814d.0p-62 */
> +T17 = 5.8645267876296793e-4, /* 0x13378589b85aa7.0p-63 */
> +T19 = -2.1121033571392224e-4; /* -0x1baf0af80c4090.0p-65 */
> +#elif LDBL_MANT_DIG == 113
> +/*
> + * Domain [-0.25, 0.25], range ~[-2.4211e-37, 2.4211e-37]:
> + * |tanh(x)/x - t(x)| < 2**121.6
> + */
> +static const long double
> +T3 = -3.33333333333333333333333333333332980e-1L, /* -0x1555555555555555555555555554e.0p-114L */
> +T5 = 1.33333333333333333333333333332707260e-1L, /* 0x1111111111111111111111110ab7b.0p-115L */
> +T7 = -5.39682539682539682539682535723482314e-2L, /* -0x1ba1ba1ba1ba1ba1ba1ba17b5fc98.0p-117L */
> +T9 = 2.18694885361552028218693591149061717e-2L, /* 0x1664f4882c10f9f32d6b1a12a25e5.0p-118L */
> +T11 = -8.86323552990219656883762347736381851e-3L, /* -0x1226e355e6c23c8f5a5a0f386cb4d.0p-119L */
> +T13 = 3.59212803657248101358314398220822722e-3L, /* 0x1d6d3d0e157ddfb403ad3637442c6.0p-121L */
> +T15 = -1.45583438705131796512568010348874662e-3L; /* -0x17da36452b75e150c44cc34253b34.0p-122L */
> +static const double
> +T17 = 5.9002744094556621e-4, /* 0x1355824803668e.0p-63 */
> +T19 = -2.3912911424260516e-4, /* -0x1f57d7734c8dde.0p-65 */
> +T21 = 9.6915379535512898e-5, /* 0x1967e18ad6a6ca.0p-66 */
> +T23 = -3.9278322983156353e-5, /* -0x1497d8e6b75729.0p-67 */
> +T25 = 1.5918887220143869e-5, /* 0x10b1319998cafa.0p-68 */
> +T27 = -6.4514295231630956e-6, /* -0x1b0f2b71b218eb.0p-70 */
> +T29 = 2.6120754043964365e-6, /* 0x15e963a3cf3a39.0p-71 */
> +T31 = -1.0407567231003314e-6, /* -0x1176041e656869.0p-72 */
> +T33 = 3.4744117554063574e-7; /* 0x1750fe732cab9c.0p-74 */
> +#endif /* LDBL_MANT_DIG == 64 */
> +
> +static inline long double
> +divl(long double a, long double b, long double c, long double d,
> + long double e, long double f)
> +{
> + long double inv, r;
> + float fr, fw;
> +
> + _2sumF(a, c);
> + b = b + c;
> + _2sumF(d, f);
> + e = e + f;
> +
> + inv = 1 / (d + e);
> +
> + r = (a + b) * inv;
> + fr = r;
> + r = fr;
> +
> + fw = d + e;
> + e = d - fw + e;
> + d = fw;
> +
> + r = r + (a - d * r + b - e * r) * inv;
> +
> + return r;
> +}
> +
> +long double
> +tanhl(long double x)
> +{
> + long double hi,lo,s,x2,x4,z;
> +#if LDBL_MANT_DIG == 113
> + double dx2;
> +#endif
> + int16_t jx,ix;
> +
> + GET_LDBL_EXPSIGN(jx,x);
> + ix = jx&0x7fff;
> +
> + /* x is INF or NaN */
> + if(ix>=0x7fff) {
> + if (jx>=0) return one/x+one; /* tanh(+-inf)=+-1 */
> + else return one/x-one; /* tanh(NaN) = NaN */
> + }
> +
> + ENTERI();
> +
> + /* |x| < 40 */
> + if (ix < 0x4004 || fabsl(x) < 40) { /* |x|<40 */
> + if (__predict_false(ix<BIAS-(LDBL_MANT_DIG+1)/2)) { /* |x|<TINY */
> + /* tanh(+-0) = +0; tanh(tiny) = tiny(-+) with inexact: */
> + return (x == 0 ? x : (0x1p200 * x - x) * 0x1p-200);
> + }
> + if (ix<0x3ffd) { /* |x|<0.25 */
> + x2 = x*x;
> +#if LDBL_MANT_DIG == 64
> + x4 = x2*x2;
> + RETURNI(((T19*x2 + T17)*x4 + (T15*x2 + T13))*(x2*x*x2*x4*x4) +
> + ((T11*x2 + T9)*x4 + (T7*x2 + T5))*(x2*x*x2) +
> + T3*(x2*x) + x);
> +#elif LDBL_MANT_DIG == 113
> + dx2 = x2;
> +#if 0
> + RETURNI(((((((((((((((T33*dx2 + T31)*dx2 + T29)*dx2 + T27)*dx2 +
> + T25)*x2 + T23)*x2 + T21)*x2 + T19)*x2 + T17)*x2 +
> + T15)*x2 + T13)*x2 + T11)*x2 + T9)*x2 + T7)*x2 + T5)*
> + (x2*x*x2) +
> + T3*(x2*x) + x);
> +#else
> + long double q = ((((((((((((((T33*dx2 + T31)*dx2 + T29)*dx2 + T27)*dx2 +
> + T25)*x2 + T23)*x2 + T21)*x2 + T19)*x2 + T17)*x2 +
> + T15)*x2 + T13)*x2 + T11)*x2 + T9)*x2 + T7)*x2 + T5)*
> + (x2*x*x2);
> + RETURNI(q + T3*(x2*x) + x);
> +#endif
> +#endif
> + }
> + k_hexpl(2*fabsl(x), &hi, &lo);
> + if (ix<0x4001 && fabsl(x) < 1.5) /* |x|<1.5 */
> + z = divl(hi, lo, -0.5, hi, lo, 0.5);
> + else
> + z = one - one/(lo+0.5+hi);
> + /* |x| >= 40, return +-1 */
> + } else {
> + z = one - tiny; /* raise inexact flag */
> + }
> + s = 1;
> + if (jx<0) s = -1;
> + RETURNI(s*z);
> +}
> diff --git a/newlib/libm/ld/s_tanl.c b/newlib/libm/ld/s_tanl.c
> new file mode 100644
> index 000000000..0c5228ec8
> --- /dev/null
> +++ b/newlib/libm/ld/s_tanl.c
> @@ -0,0 +1,97 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2007 Steven G. Kargl
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice unmodified, this list of conditions, and the following
> + * disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
> + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
> + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
> + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
> + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
> + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
> + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * Limited testing on pseudorandom numbers drawn within [0:4e8] shows
> + * an accuracy of <= 1.5 ULP where 247024 values of x out of 40 million
> + * possibles resulted in tan(x) that exceeded 0.5 ULP (ie., 0.6%).
> + */
> +
> +#include <float.h>
> +#ifdef __i386__
> +#include <ieeefp.h>
> +#endif
> +
> +#include "math.h"
> +#include "math_private.h"
> +#if LDBL_MANT_DIG == 64
> +#include "../ld80/e_rem_pio2l.h"
> +#elif LDBL_MANT_DIG == 113
> +#include "../ld128/e_rem_pio2l.h"
> +#else
> +#error "Unsupported long double format"
> +#endif
> +
> +long double
> +tanl(long double x)
> +{
> + union IEEEl2bits z;
> + int e0, s;
> + long double y[2];
> + long double hi, lo;
> +
> + z.e = x;
> + s = z.bits.sign;
> + z.bits.sign = 0;
> +
> + /* If x = +-0 or x is subnormal, then tan(x) = x. */
> + if (z.bits.exp == 0)
> + return (x);
> +
> + /* If x = NaN or Inf, then tan(x) = NaN. */
> + if (z.bits.exp == 32767)
> + return ((x - x) / (x - x));
> +
> + ENTERI();
> +
> + /* Optimize the case where x is already within range. */
> + if (z.e < M_PI_4) {
> + hi = __kernel_tanl(z.e, 0, 0);
> + RETURNI(s ? -hi : hi);
> + }
> +
> + e0 = __ieee754_rem_pio2l(x, y);
> + hi = y[0];
> + lo = y[1];
> +
> + switch (e0 & 3) {
> + case 0:
> + case 2:
> + hi = __kernel_tanl(hi, lo, 0);
> + break;
> + case 1:
> + case 3:
> + hi = __kernel_tanl(hi, lo, 1);
> + break;
> + }
> +
> + RETURNI(hi);
> +}
> diff --git a/newlib/libm/ld/s_truncl.c b/newlib/libm/ld/s_truncl.c
> new file mode 100644
> index 000000000..9e2b51132
> --- /dev/null
> +++ b/newlib/libm/ld/s_truncl.c
> @@ -0,0 +1,68 @@
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunPro, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + *
> + * From: @(#)s_floor.c 5.1 93/09/24
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * truncl(x)
> + * Return x rounded toward 0 to integral value
> + * Method:
> + * Bit twiddling.
> + * Exception:
> + * Inexact flag raised if x not equal to truncl(x).
> + */
> +
> +#include <float.h>
> +#include <math.h>
> +#include <stdint.h>
> +
> +#include "fpmath.h"
> +
> +#ifdef LDBL_IMPLICIT_NBIT
> +#define MANH_SIZE (LDBL_MANH_SIZE + 1)
> +#else
> +#define MANH_SIZE LDBL_MANH_SIZE
> +#endif
> +
> +static const long double huge = 1.0e300;
> +static const float zero[] = { 0.0, -0.0 };
> +
> +long double
> +truncl(long double x)
> +{
> + union IEEEl2bits u = { .e = x };
> + int e = u.bits.exp - LDBL_MAX_EXP + 1;
> +
> + if (e < MANH_SIZE - 1) {
> + if (e < 0) { /* raise inexact if x != 0 */
> + if (huge + x > 0.0)
> + u.e = zero[u.bits.sign];
> + } else {
> + uint64_t m = ((1llu << MANH_SIZE) - 1) >> (e + 1);
> + if (((u.bits.manh & m) | u.bits.manl) == 0)
> + return (x); /* x is integral */
> + if (huge + x > 0.0) { /* raise inexact flag */
> + u.bits.manh &= ~m;
> + u.bits.manl = 0;
> + }
> + }
> + } else if (e < LDBL_MANT_DIG - 1) {
> + uint64_t m = (uint64_t)-1 >> (64 - LDBL_MANT_DIG + e + 1);
> + if ((u.bits.manl & m) == 0)
> + return (x); /* x is integral */
> + if (huge + x > 0.0) /* raise inexact flag */
> + u.bits.manl &= ~m;
> + }
> + return (u.e);
> +}
> diff --git a/newlib/libm/ld128/b_tgammal.c b/newlib/libm/ld128/b_tgammal.c
> new file mode 100644
> index 000000000..1c995ab6d
> --- /dev/null
> +++ b/newlib/libm/ld128/b_tgammal.c
> @@ -0,0 +1,57 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2013 David Chisnall
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + *
> + * $FreeBSD$
> + */
> +
> +#include <float.h>
> +#include <math.h>
> +
> +/*
> + * If long double is not the same size as double, then these will lose
> + * precision and we should emit a warning whenever something links against
> + * them.
> + */
> +#if (LDBL_MANT_DIG > 53)
> +#define WARN_IMPRECISE(x) \
> + __warn_references(x, # x " has lower than advertised precision");
> +#else
> +#define WARN_IMPRECISE(x)
> +#endif
> +/*
> + * Declare the functions as weak variants so that other libraries providing
> + * real versions can override them.
> + */
> +#define DECLARE_WEAK(x)\
> + __weak_reference(imprecise_## x, x);\
> + WARN_IMPRECISE(x)
> +
> +#define DECLARE_IMPRECISE(f) \
> + long double imprecise_ ## f ## l(long double v) { return f(v); }\
> + DECLARE_WEAK(f ## l)
> +
> +DECLARE_IMPRECISE(tgamma);
> diff --git a/newlib/libm/ld128/e_lgammal_r.c b/newlib/libm/ld128/e_lgammal_r.c
> new file mode 100644
> index 000000000..53d3af17d
> --- /dev/null
> +++ b/newlib/libm/ld128/e_lgammal_r.c
> @@ -0,0 +1,330 @@
> +/* @(#)e_lgamma_r.c 1.3 95/01/18 */
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunSoft, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * See e_lgamma_r.c for complete comments.
> + *
> + * Converted to long double by Steven G. Kargl.
> + */
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +
> +static const volatile double vzero = 0;
> +
> +static const double
> +zero= 0,
> +half= 0.5,
> +one = 1;
> +
> +static const long double
> +pi = 3.14159265358979323846264338327950288e+00L;
> +/*
> + * Domain y in [0x1p-119, 0.28], range ~[-1.4065e-36, 1.4065e-36]:
> + * |(lgamma(2 - y) + y / 2) / y - a(y)| < 2**-119.1
> + */
> +static const long double
> +a0 = 7.72156649015328606065120900824024296e-02L,
> +a1 = 3.22467033424113218236207583323018498e-01L,
> +a2 = 6.73523010531980951332460538330282217e-02L,
> +a3 = 2.05808084277845478790009252803463129e-02L,
> +a4 = 7.38555102867398526627292839296001626e-03L,
> +a5 = 2.89051033074152328576829509522483468e-03L,
> +a6 = 1.19275391170326097618357349881842913e-03L,
> +a7 = 5.09669524743042462515256340206203019e-04L,
> +a8 = 2.23154758453578096143609255559576017e-04L,
> +a9 = 9.94575127818397632126978731542755129e-05L,
> +a10 = 4.49262367375420471287545895027098145e-05L,
> +a11 = 2.05072127845117995426519671481628849e-05L,
> +a12 = 9.43948816959096748454087141447939513e-06L,
> +a13 = 4.37486780697359330303852050718287419e-06L,
> +a14 = 2.03920783892362558276037363847651809e-06L,
> +a15 = 9.55191070057967287877923073200324649e-07L,
> +a16 = 4.48993286185740853170657139487620560e-07L,
> +a17 = 2.13107543597620911675316728179563522e-07L,
> +a18 = 9.70745379855304499867546549551023473e-08L,
> +a19 = 5.61889970390290257926487734695402075e-08L,
> +a20 = 6.42739653024130071866684358960960951e-09L,
> +a21 = 3.34491062143649291746195612991870119e-08L,
> +a22 = -1.57068547394315223934653011440641472e-08L,
> +a23 = 1.30812825422415841213733487745200632e-08L;
> +/*
> + * Domain x in [tc-0.24, tc+0.28], range ~[-6.3201e-37, 6.3201e-37]:
> + * |(lgamma(x) - tf) - t(x - tc)| < 2**-120.3.
> + */
> +static const long double
> +tc = 1.46163214496836234126265954232572133e+00L,
> +tf = -1.21486290535849608095514557177691584e-01L,
> +tt = 1.57061739945077675484237837992951704e-36L,
> +t0 = -1.99238329499314692728655623767019240e-36L,
> +t1 = -6.08453430711711404116887457663281416e-35L,
> +t2 = 4.83836122723810585213722380854828904e-01L,
> +t3 = -1.47587722994530702030955093950668275e-01L,
> +t4 = 6.46249402389127526561003464202671923e-02L,
> +t5 = -3.27885410884813055008502586863748063e-02L,
> +t6 = 1.79706751152103942928638276067164935e-02L,
> +t7 = -1.03142230366363872751602029672767978e-02L,
> +t8 = 6.10053602051788840313573150785080958e-03L,
> +t9 = -3.68456960831637325470641021892968954e-03L,
> +t10 = 2.25976482322181046611440855340968560e-03L,
> +t11 = -1.40225144590445082933490395950664961e-03L,
> +t12 = 8.78232634717681264035014878172485575e-04L,
> +t13 = -5.54194952796682301220684760591403899e-04L,
> +t14 = 3.51912956837848209220421213975000298e-04L,
> +t15 = -2.24653443695947456542669289367055542e-04L,
> +t16 = 1.44070395420840737695611929680511823e-04L,
> +t17 = -9.27609865550394140067059487518862512e-05L,
> +t18 = 5.99347334438437081412945428365433073e-05L,
> +t19 = -3.88458388854572825603964274134801009e-05L,
> +t20 = 2.52476631610328129217896436186551043e-05L,
> +t21 = -1.64508584981658692556994212457518536e-05L,
> +t22 = 1.07434583475987007495523340296173839e-05L,
> +t23 = -7.03070407519397260929482550448878399e-06L,
> +t24 = 4.60968590693753579648385629003100469e-06L,
> +t25 = -3.02765473778832036018438676945512661e-06L,
> +t26 = 1.99238771545503819972741288511303401e-06L,
> +t27 = -1.31281299822614084861868817951788579e-06L,
> +t28 = 8.60844432267399655055574642052370223e-07L,
> +t29 = -5.64535486432397413273248363550536374e-07L,
> +t30 = 3.99357783676275660934903139592727737e-07L,
> +t31 = -2.95849029193433121795495215869311610e-07L,
> +t32 = 1.37790144435073124976696250804940384e-07L;
> +/*
> + * Domain y in [-0.1, 0.232], range ~[-1.4046e-37, 1.4181e-37]:
> + * |(lgamma(1 + y) + 0.5 * y) / y - u(y) / v(y)| < 2**-122.8
> + */
> +static const long double
> +u0 = -7.72156649015328606065120900824024311e-02L,
> +u1 = 4.24082772271938167430983113242482656e-01L,
> +u2 = 2.96194003481457101058321977413332171e+00L,
> +u3 = 6.49503267711258043997790983071543710e+00L,
> +u4 = 7.40090051288150177152835698948644483e+00L,
> +u5 = 4.94698036296756044610805900340723464e+00L,
> +u6 = 2.00194224610796294762469550684947768e+00L,
> +u7 = 4.82073087750608895996915051568834949e-01L,
> +u8 = 6.46694052280506568192333848437585427e-02L,
> +u9 = 4.17685526755100259316625348933108810e-03L,
> +u10 = 9.06361003550314327144119307810053410e-05L,
> +v1 = 5.15937098592887275994320496999951947e+00L,
> +v2 = 1.14068418766251486777604403304717558e+01L,
> +v3 = 1.41164839437524744055723871839748489e+01L,
> +v4 = 1.07170702656179582805791063277960532e+01L,
> +v5 = 5.14448694179047879915042998453632434e+00L,
> +v6 = 1.55210088094585540637493826431170289e+00L,
> +v7 = 2.82975732849424562719893657416365673e-01L,
> +v8 = 2.86424622754753198010525786005443539e-02L,
> +v9 = 1.35364253570403771005922441442688978e-03L,
> +v10 = 1.91514173702398375346658943749580666e-05L,
> +v11 = -3.25364686890242327944584691466034268e-08L;
> +/*
> + * Domain x in (2, 3], range ~[-1.3341e-36, 1.3536e-36]:
> + * |(lgamma(y+2) - 0.5 * y) / y - s(y)/r(y)| < 2**-120.1
> + * with y = x - 2.
> + */
> +static const long double
> +s0 = -7.72156649015328606065120900824024297e-02L,
> +s1 = 1.23221687850916448903914170805852253e-01L,
> +s2 = 5.43673188699937239808255378293820020e-01L,
> +s3 = 6.31998137119005233383666791176301800e-01L,
> +s4 = 3.75885340179479850993811501596213763e-01L,
> +s5 = 1.31572908743275052623410195011261575e-01L,
> +s6 = 2.82528453299138685507186287149699749e-02L,
> +s7 = 3.70262021550340817867688714880797019e-03L,
> +s8 = 2.83374000312371199625774129290973648e-04L,
> +s9 = 1.15091830239148290758883505582343691e-05L,
> +s10 = 2.04203474281493971326506384646692446e-07L,
> +s11 = 9.79544198078992058548607407635645763e-10L,
> +r1 = 2.58037466655605285937112832039537492e+00L,
> +r2 = 2.86289413392776399262513849911531180e+00L,
> +r3 = 1.78691044735267497452847829579514367e+00L,
> +r4 = 6.89400381446725342846854215600008055e-01L,
> +r5 = 1.70135865462567955867134197595365343e-01L,
> +r6 = 2.68794816183964420375498986152766763e-02L,
> +r7 = 2.64617234244861832870088893332006679e-03L,
> +r8 = 1.52881761239180800640068128681725702e-04L,
> +r9 = 4.63264813762296029824851351257638558e-06L,
> +r10 = 5.89461519146957343083848967333671142e-08L,
> +r11 = 1.79027678176582527798327441636552968e-10L;
> +/*
> + * Domain z in [8, 0x1p70], range ~[-9.8214e-35, 9.8214e-35]:
> + * |lgamma(x) - (x - 0.5) * (log(x) - 1) - w(1/x)| < 2**-113.0
> + */
> +static const long double
> +w0 = 4.18938533204672741780329736405617738e-01L,
> +w1 = 8.33333333333333333333333333332852026e-02L,
> +w2 = -2.77777777777777777777777727810123528e-03L,
> +w3 = 7.93650793650793650791708939493907380e-04L,
> +w4 = -5.95238095238095234390450004444370959e-04L,
> +w5 = 8.41750841750837633887817658848845695e-04L,
> +w6 = -1.91752691752396849943172337347259743e-03L,
> +w7 = 6.41025640880333069429106541459015557e-03L,
> +w8 = -2.95506530801732133437990433080327074e-02L,
> +w9 = 1.79644237328444101596766586979576927e-01L,
> +w10 = -1.39240539108367641920172649259736394e+00L,
> +w11 = 1.33987701479007233325288857758641761e+01L,
> +w12 = -1.56363596431084279780966590116006255e+02L,
> +w13 = 2.14830978044410267201172332952040777e+03L,
> +w14 = -3.28636067474227378352761516589092334e+04L,
> +w15 = 5.06201257747865138432663574251462485e+05L,
> +w16 = -6.79720123352023636706247599728048344e+06L,
> +w17 = 6.57556601705472106989497289465949255e+07L,
> +w18 = -3.26229058141181783534257632389415580e+08L;
> +
> +static long double
> +sin_pil(long double x)
> +{
> + volatile long double vz;
> + long double y,z;
> + uint64_t lx, n;
> + uint16_t hx;
> +
> + y = -x;
> +
> + vz = y+0x1.p112;
> + z = vz-0x1.p112;
> + if (z == y)
> + return zero;
> +
> + vz = y+0x1.p110;
> + EXTRACT_LDBL128_WORDS(hx,lx,n,vz);
> + z = vz-0x1.p110;
> + if (z > y) {
> + z -= 0.25;
> + n--;
> + }
> + n &= 7;
> + y = y - z + n * 0.25;
> +
> + switch (n) {
> + case 0: y = __kernel_sinl(pi*y,zero,0); break;
> + case 1:
> + case 2: y = __kernel_cosl(pi*(0.5-y),zero); break;
> + case 3:
> + case 4: y = __kernel_sinl(pi*(one-y),zero,0); break;
> + case 5:
> + case 6: y = -__kernel_cosl(pi*(y-1.5),zero); break;
> + default: y = __kernel_sinl(pi*(y-2.0),zero,0); break;
> + }
> + return -y;
> +}
> +
> +long double
> +lgammal_r(long double x, int *signgamp)
> +{
> + long double nadj,p,p1,p2,p3,q,r,t,w,y,z;
> + uint64_t llx,lx;
> + int i;
> + uint16_t hx,ix;
> +
> + EXTRACT_LDBL128_WORDS(hx,lx,llx,x);
> +
> + /* purge +-Inf and NaNs */
> + *signgamp = 1;
> + ix = hx&0x7fff;
> + if(ix==0x7fff) return x*x;
> +
> + /* purge +-0 and tiny arguments */
> + *signgamp = 1-2*(hx>>15);
> + if(ix<0x3fff-116) { /* |x|<2**-(p+3), return -log(|x|) */
> + if((ix|lx|llx)==0)
> + return one/vzero;
> + return -logl(fabsl(x));
> + }
> +
> + /* purge negative integers and start evaluation for other x < 0 */
> + if(hx&0x8000) {
> + *signgamp = 1;
> + if(ix>=0x3fff+112) /* |x|>=2**(p-1), must be -integer */
> + return one/vzero;
> + t = sin_pil(x);
> + if(t==zero) return one/vzero;
> + nadj = logl(pi/fabsl(t*x));
> + if(t<zero) *signgamp = -1;
> + x = -x;
> + }
> +
> + /* purge 1 and 2 */
> + if((ix==0x3fff || ix==0x4000) && (lx|llx)==0) r = 0;
> + /* for x < 2.0 */
> + else if(ix<0x4000) {
> + if(x<=8.9999961853027344e-01) {
> + r = -logl(x);
> + if(x>=7.3159980773925781e-01) {y = 1-x; i= 0;}
> + else if(x>=2.3163998126983643e-01) {y= x-(tc-1); i=1;}
> + else {y = x; i=2;}
> + } else {
> + r = 0;
> + if(x>=1.7316312789916992e+00) {y=2-x;i=0;}
> + else if(x>=1.2316322326660156e+00) {y=x-tc;i=1;}
> + else {y=x-1;i=2;}
> + }
> + switch(i) {
> + case 0:
> + z = y*y;
> + p1 = a0+z*(a2+z*(a4+z*(a6+z*(a8+z*(a10+z*(a12+z*(a14+z*(a16+
> + z*(a18+z*(a20+z*a22))))))))));
> + p2 = z*(a1+z*(a3+z*(a5+z*(a7+z*(a9+z*(a11+z*(a13+z*(a15+
> + z*(a17+z*(a19+z*(a21+z*a23)))))))))));
> + p = y*p1+p2;
> + r += p-y/2; break;
> + case 1:
> + p = t0+y*t1+tt+y*y*(t2+y*(t3+y*(t4+y*(t5+y*(t6+y*(t7+y*(t8+
> + y*(t9+y*(t10+y*(t11+y*(t12+y*(t13+y*(t14+y*(t15+y*(t16+
> + y*(t17+y*(t18+y*(t19+y*(t20+y*(t21+y*(t22+y*(t23+
> + y*(t24+y*(t25+y*(t26+y*(t27+y*(t28+y*(t29+y*(t30+
> + y*(t31+y*t32))))))))))))))))))))))))))))));
> + r += tf + p; break;
> + case 2:
> + p1 = y*(u0+y*(u1+y*(u2+y*(u3+y*(u4+y*(u5+y*(u6+y*(u7+
> + y*(u8+y*(u9+y*u10))))))))));
> + p2 = one+y*(v1+y*(v2+y*(v3+y*(v4+y*(v5+y*(v6+y*(v7+
> + y*(v8+y*(v9+y*(v10+y*v11))))))))));
> + r += p1/p2-y/2;
> + }
> + }
> + /* x < 8.0 */
> + else if(ix<0x4002) {
> + i = x;
> + y = x-i;
> + p = y*(s0+y*(s1+y*(s2+y*(s3+y*(s4+y*(s5+y*(s6+y*(s7+y*(s8+
> + y*(s9+y*(s10+y*s11)))))))))));
> + q = one+y*(r1+y*(r2+y*(r3+y*(r4+y*(r5+y*(r6+y*(r7+y*(r8+
> + y*(r9+y*(r10+y*r11))))))))));
> + r = y/2+p/q;
> + z = 1; /* lgamma(1+s) = log(s) + lgamma(s) */
> + switch(i) {
> + case 7: z *= (y+6); /* FALLTHRU */
> + case 6: z *= (y+5); /* FALLTHRU */
> + case 5: z *= (y+4); /* FALLTHRU */
> + case 4: z *= (y+3); /* FALLTHRU */
> + case 3: z *= (y+2); /* FALLTHRU */
> + r += logl(z); break;
> + }
> + /* 8.0 <= x < 2**(p+3) */
> + } else if (ix<0x3fff+116) {
> + t = logl(x);
> + z = one/x;
> + y = z*z;
> + w = w0+z*(w1+y*(w2+y*(w3+y*(w4+y*(w5+y*(w6+y*(w7+y*(w8+
> + y*(w9+y*(w10+y*(w11+y*(w12+y*(w13+y*(w14+y*(w15+y*(w16+
> + y*(w17+y*w18)))))))))))))))));
> + r = (x-half)*(t-one)+w;
> + /* 2**(p+3) <= x <= inf */
> + } else
> + r = x*(logl(x)-1);
> + if(hx&0x8000) r = nadj - r;
> + return r;
> +}
> diff --git a/newlib/libm/ld128/e_powl.c b/newlib/libm/ld128/e_powl.c
> new file mode 100644
> index 000000000..12b92a1a9
> --- /dev/null
> +++ b/newlib/libm/ld128/e_powl.c
> @@ -0,0 +1,443 @@
> +/*-
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunPro, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +/*
> + * Copyright (c) 2008 Stephen L. Moshier <steve@moshier.net>
> + *
> + * Permission to use, copy, modify, and distribute this software for any
> + * purpose with or without fee is hereby granted, provided that the above
> + * copyright notice and this permission notice appear in all copies.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
> + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
> + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
> + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
> + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
> + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
> + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
> + */
> +
> +/* powl(x,y) return x**y
> + *
> + * n
> + * Method: Let x = 2 * (1+f)
> + * 1. Compute and return log2(x) in two pieces:
> + * log2(x) = w1 + w2,
> + * where w1 has 113-53 = 60 bit trailing zeros.
> + * 2. Perform y*log2(x) = n+y' by simulating multi-precision
> + * arithmetic, where |y'|<=0.5.
> + * 3. Return x**y = 2**n*exp(y'*log2)
> + *
> + * Special cases:
> + * 1. (anything) ** 0 is 1
> + * 2. (anything) ** 1 is itself
> + * 3. (anything) ** NAN is NAN
> + * 4. NAN ** (anything except 0) is NAN
> + * 5. +-(|x| > 1) ** +INF is +INF
> + * 6. +-(|x| > 1) ** -INF is +0
> + * 7. +-(|x| < 1) ** +INF is +0
> + * 8. +-(|x| < 1) ** -INF is +INF
> + * 9. +-1 ** +-INF is NAN
> + * 10. +0 ** (+anything except 0, NAN) is +0
> + * 11. -0 ** (+anything except 0, NAN, odd integer) is +0
> + * 12. +0 ** (-anything except 0, NAN) is +INF
> + * 13. -0 ** (-anything except 0, NAN, odd integer) is +INF
> + * 14. -0 ** (odd integer) = -( +0 ** (odd integer) )
> + * 15. +INF ** (+anything except 0,NAN) is +INF
> + * 16. +INF ** (-anything except 0,NAN) is +0
> + * 17. -INF ** (anything) = -0 ** (-anything)
> + * 18. (-anything) ** (integer) is (-1)**(integer)*(+anything**integer)
> + * 19. (-anything except 0 and inf) ** (non-integer) is NAN
> + *
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include <float.h>
> +#include <math.h>
> +
> +#include "math_private.h"
> +
> +static const long double bp[] = {
> + 1.0L,
> + 1.5L,
> +};
> +
> +/* log_2(1.5) */
> +static const long double dp_h[] = {
> + 0.0,
> + 5.8496250072115607565592654282227158546448E-1L
> +};
> +
> +/* Low part of log_2(1.5) */
> +static const long double dp_l[] = {
> + 0.0,
> + 1.0579781240112554492329533686862998106046E-16L
> +};
> +
> +static const long double zero = 0.0L,
> + one = 1.0L,
> + two = 2.0L,
> + two113 = 1.0384593717069655257060992658440192E34L,
> + huge = 1.0e3000L,
> + tiny = 1.0e-3000L;
> +
> +/* 3/2 log x = 3 z + z^3 + z^3 (z^2 R(z^2))
> + z = (x-1)/(x+1)
> + 1 <= x <= 1.25
> + Peak relative error 2.3e-37 */
> +static const long double LN[] =
> +{
> + -3.0779177200290054398792536829702930623200E1L,
> + 6.5135778082209159921251824580292116201640E1L,
> + -4.6312921812152436921591152809994014413540E1L,
> + 1.2510208195629420304615674658258363295208E1L,
> + -9.9266909031921425609179910128531667336670E-1L
> +};
> +static const long double LD[] =
> +{
> + -5.129862866715009066465422805058933131960E1L,
> + 1.452015077564081884387441590064272782044E2L,
> + -1.524043275549860505277434040464085593165E2L,
> + 7.236063513651544224319663428634139768808E1L,
> + -1.494198912340228235853027849917095580053E1L
> + /* 1.0E0 */
> +};
> +
> +/* exp(x) = 1 + x - x / (1 - 2 / (x - x^2 R(x^2)))
> + 0 <= x <= 0.5
> + Peak relative error 5.7e-38 */
> +static const long double PN[] =
> +{
> + 5.081801691915377692446852383385968225675E8L,
> + 9.360895299872484512023336636427675327355E6L,
> + 4.213701282274196030811629773097579432957E4L,
> + 5.201006511142748908655720086041570288182E1L,
> + 9.088368420359444263703202925095675982530E-3L,
> +};
> +static const long double PD[] =
> +{
> + 3.049081015149226615468111430031590411682E9L,
> + 1.069833887183886839966085436512368982758E8L,
> + 8.259257717868875207333991924545445705394E5L,
> + 1.872583833284143212651746812884298360922E3L,
> + /* 1.0E0 */
> +};
> +
> +static const long double
> + /* ln 2 */
> + lg2 = 6.9314718055994530941723212145817656807550E-1L,
> + lg2_h = 6.9314718055994528622676398299518041312695E-1L,
> + lg2_l = 2.3190468138462996154948554638754786504121E-17L,
> + ovt = 8.0085662595372944372e-0017L,
> + /* 2/(3*log(2)) */
> + cp = 9.6179669392597560490661645400126142495110E-1L,
> + cp_h = 9.6179669392597555432899980587535537779331E-1L,
> + cp_l = 5.0577616648125906047157785230014751039424E-17L;
> +
> +long double
> +powl(long double x, long double y)
> +{
> + long double z, ax, z_h, z_l, p_h, p_l;
> + long double yy1, t1, t2, r, s, t, u, v, w;
> + long double s2, s_h, s_l, t_h, t_l;
> + int32_t i, j, k, yisint, n;
> + u_int32_t ix, iy;
> + int32_t hx, hy;
> + ieee_quad_shape_type o, p, q;
> +
> + p.value = x;
> + hx = p.parts32.mswhi;
> + ix = hx & 0x7fffffff;
> +
> + q.value = y;
> + hy = q.parts32.mswhi;
> + iy = hy & 0x7fffffff;
> +
> +
> + /* y==zero: x**0 = 1 */
> + if ((iy | q.parts32.mswlo | q.parts32.lswhi | q.parts32.lswlo) == 0)
> + return one;
> +
> + /* 1.0**y = 1; -1.0**+-Inf = 1 */
> + if (x == one)
> + return one;
> + if (x == -1.0L && iy == 0x7fff0000
> + && (q.parts32.mswlo | q.parts32.lswhi | q.parts32.lswlo) == 0)
> + return one;
> +
> + /* +-NaN return x+y */
> + if ((ix > 0x7fff0000)
> + || ((ix == 0x7fff0000)
> + && ((p.parts32.mswlo | p.parts32.lswhi | p.parts32.lswlo) != 0))
> + || (iy > 0x7fff0000)
> + || ((iy == 0x7fff0000)
> + && ((q.parts32.mswlo | q.parts32.lswhi | q.parts32.lswlo) != 0)))
> + return nan_mix(x, y);
> +
> + /* determine if y is an odd int when x < 0
> + * yisint = 0 ... y is not an integer
> + * yisint = 1 ... y is an odd int
> + * yisint = 2 ... y is an even int
> + */
> + yisint = 0;
> + if (hx < 0)
> + {
> + if (iy >= 0x40700000) /* 2^113 */
> + yisint = 2; /* even integer y */
> + else if (iy >= 0x3fff0000) /* 1.0 */
> + {
> + if (floorl (y) == y)
> + {
> + z = 0.5 * y;
> + if (floorl (z) == z)
> + yisint = 2;
> + else
> + yisint = 1;
> + }
> + }
> + }
> +
> + /* special value of y */
> + if ((q.parts32.mswlo | q.parts32.lswhi | q.parts32.lswlo) == 0)
> + {
> + if (iy == 0x7fff0000) /* y is +-inf */
> + {
> + if (((ix - 0x3fff0000) | p.parts32.mswlo | p.parts32.lswhi |
> + p.parts32.lswlo) == 0)
> + return y - y; /* +-1**inf is NaN */
> + else if (ix >= 0x3fff0000) /* (|x|>1)**+-inf = inf,0 */
> + return (hy >= 0) ? y : zero;
> + else /* (|x|<1)**-,+inf = inf,0 */
> + return (hy < 0) ? -y : zero;
> + }
> + if (iy == 0x3fff0000)
> + { /* y is +-1 */
> + if (hy < 0)
> + return one / x;
> + else
> + return x;
> + }
> + if (hy == 0x40000000)
> + return x * x; /* y is 2 */
> + if (hy == 0x3ffe0000)
> + { /* y is 0.5 */
> + if (hx >= 0) /* x >= +0 */
> + return sqrtl (x);
> + }
> + }
> +
> + ax = fabsl (x);
> + /* special value of x */
> + if ((p.parts32.mswlo | p.parts32.lswhi | p.parts32.lswlo) == 0)
> + {
> + if (ix == 0x7fff0000 || ix == 0 || ix == 0x3fff0000)
> + {
> + z = ax; /*x is +-0,+-inf,+-1 */
> + if (hy < 0)
> + z = one / z; /* z = (1/|x|) */
> + if (hx < 0)
> + {
> + if (((ix - 0x3fff0000) | yisint) == 0)
> + {
> + z = (z - z) / (z - z); /* (-1)**non-int is NaN */
> + }
> + else if (yisint == 1)
> + z = -z; /* (x<0)**odd = -(|x|**odd) */
> + }
> + return z;
> + }
> + }
> +
> + /* (x<0)**(non-int) is NaN */
> + if (((((u_int32_t) hx >> 31) - 1) | yisint) == 0)
> + return (x - x) / (x - x);
> +
> + /* |y| is huge.
> + 2^-16495 = 1/2 of smallest representable value.
> + If (1 - 1/131072)^y underflows, y > 1.4986e9 */
> + if (iy > 0x401d654b)
> + {
> + /* if (1 - 2^-113)^y underflows, y > 1.1873e38 */
> + if (iy > 0x407d654b)
> + {
> + if (ix <= 0x3ffeffff)
> + return (hy < 0) ? huge * huge : tiny * tiny;
> + if (ix >= 0x3fff0000)
> + return (hy > 0) ? huge * huge : tiny * tiny;
> + }
> + /* over/underflow if x is not close to one */
> + if (ix < 0x3ffeffff)
> + return (hy < 0) ? huge * huge : tiny * tiny;
> + if (ix > 0x3fff0000)
> + return (hy > 0) ? huge * huge : tiny * tiny;
> + }
> +
> + n = 0;
> + /* take care subnormal number */
> + if (ix < 0x00010000)
> + {
> + ax *= two113;
> + n -= 113;
> + o.value = ax;
> + ix = o.parts32.mswhi;
> + }
> + n += ((ix) >> 16) - 0x3fff;
> + j = ix & 0x0000ffff;
> + /* determine interval */
> + ix = j | 0x3fff0000; /* normalize ix */
> + if (j <= 0x3988)
> + k = 0; /* |x|<sqrt(3/2) */
> + else if (j < 0xbb67)
> + k = 1; /* |x|<sqrt(3) */
> + else
> + {
> + k = 0;
> + n += 1;
> + ix -= 0x00010000;
> + }
> +
> + o.value = ax;
> + o.parts32.mswhi = ix;
> + ax = o.value;
> +
> + /* compute s = s_h+s_l = (x-1)/(x+1) or (x-1.5)/(x+1.5) */
> + u = ax - bp[k]; /* bp[0]=1.0, bp[1]=1.5 */
> + v = one / (ax + bp[k]);
> + s = u * v;
> + s_h = s;
> +
> + o.value = s_h;
> + o.parts32.lswlo = 0;
> + o.parts32.lswhi &= 0xf8000000;
> + s_h = o.value;
> + /* t_h=ax+bp[k] High */
> + t_h = ax + bp[k];
> + o.value = t_h;
> + o.parts32.lswlo = 0;
> + o.parts32.lswhi &= 0xf8000000;
> + t_h = o.value;
> + t_l = ax - (t_h - bp[k]);
> + s_l = v * ((u - s_h * t_h) - s_h * t_l);
> + /* compute log(ax) */
> + s2 = s * s;
> + u = LN[0] + s2 * (LN[1] + s2 * (LN[2] + s2 * (LN[3] + s2 * LN[4])));
> + v = LD[0] + s2 * (LD[1] + s2 * (LD[2] + s2 * (LD[3] + s2 * (LD[4] + s2))));
> + r = s2 * s2 * u / v;
> + r += s_l * (s_h + s);
> + s2 = s_h * s_h;
> + t_h = 3.0 + s2 + r;
> + o.value = t_h;
> + o.parts32.lswlo = 0;
> + o.parts32.lswhi &= 0xf8000000;
> + t_h = o.value;
> + t_l = r - ((t_h - 3.0) - s2);
> + /* u+v = s*(1+...) */
> + u = s_h * t_h;
> + v = s_l * t_h + t_l * s;
> + /* 2/(3log2)*(s+...) */
> + p_h = u + v;
> + o.value = p_h;
> + o.parts32.lswlo = 0;
> + o.parts32.lswhi &= 0xf8000000;
> + p_h = o.value;
> + p_l = v - (p_h - u);
> + z_h = cp_h * p_h; /* cp_h+cp_l = 2/(3*log2) */
> + z_l = cp_l * p_h + p_l * cp + dp_l[k];
> + /* log2(ax) = (s+..)*2/(3*log2) = n + dp_h + z_h + z_l */
> + t = (long double) n;
> + t1 = (((z_h + z_l) + dp_h[k]) + t);
> + o.value = t1;
> + o.parts32.lswlo = 0;
> + o.parts32.lswhi &= 0xf8000000;
> + t1 = o.value;
> + t2 = z_l - (((t1 - t) - dp_h[k]) - z_h);
> +
> + /* s (sign of result -ve**odd) = -1 else = 1 */
> + s = one;
> + if (((((u_int32_t) hx >> 31) - 1) | (yisint - 1)) == 0)
> + s = -one; /* (-ve)**(odd int) */
> +
> + /* split up y into yy1+y2 and compute (yy1+y2)*(t1+t2) */
> + yy1 = y;
> + o.value = yy1;
> + o.parts32.lswlo = 0;
> + o.parts32.lswhi &= 0xf8000000;
> + yy1 = o.value;
> + p_l = (y - yy1) * t1 + y * t2;
> + p_h = yy1 * t1;
> + z = p_l + p_h;
> + o.value = z;
> + j = o.parts32.mswhi;
> + if (j >= 0x400d0000) /* z >= 16384 */
> + {
> + /* if z > 16384 */
> + if (((j - 0x400d0000) | o.parts32.mswlo | o.parts32.lswhi |
> + o.parts32.lswlo) != 0)
> + return s * huge * huge; /* overflow */
> + else
> + {
> + if (p_l + ovt > z - p_h)
> + return s * huge * huge; /* overflow */
> + }
> + }
> + else if ((j & 0x7fffffff) >= 0x400d01b9) /* z <= -16495 */
> + {
> + /* z < -16495 */
> + if (((j - 0xc00d01bc) | o.parts32.mswlo | o.parts32.lswhi |
> + o.parts32.lswlo)
> + != 0)
> + return s * tiny * tiny; /* underflow */
> + else
> + {
> + if (p_l <= z - p_h)
> + return s * tiny * tiny; /* underflow */
> + }
> + }
> + /* compute 2**(p_h+p_l) */
> + i = j & 0x7fffffff;
> + k = (i >> 16) - 0x3fff;
> + n = 0;
> + if (i > 0x3ffe0000)
> + { /* if |z| > 0.5, set n = [z+0.5] */
> + n = floorl (z + 0.5L);
> + t = n;
> + p_h -= t;
> + }
> + t = p_l + p_h;
> + o.value = t;
> + o.parts32.lswlo = 0;
> + o.parts32.lswhi &= 0xf8000000;
> + t = o.value;
> + u = t * lg2_h;
> + v = (p_l - (t - p_h)) * lg2 + t * lg2_l;
> + z = u + v;
> + w = v - (z - u);
> + /* exp(z) */
> + t = z * z;
> + u = PN[0] + t * (PN[1] + t * (PN[2] + t * (PN[3] + t * PN[4])));
> + v = PD[0] + t * (PD[1] + t * (PD[2] + t * (PD[3] + t)));
> + t1 = z - t * u / v;
> + r = (z * t1) / (t1 - two) - (w + z * w);
> + z = one - (r - z);
> + o.value = z;
> + j = o.parts32.mswhi;
> + j += (n << 16);
> + if ((j >> 16) <= 0)
> + z = scalbnl (z, n); /* subnormal output */
> + else
> + {
> + o.parts32.mswhi = j;
> + z = o.value;
> + }
> + return s * z;
> +}
> diff --git a/newlib/libm/ld128/e_rem_pio2l.h b/newlib/libm/ld128/e_rem_pio2l.h
> new file mode 100644
> index 000000000..7516ced49
> --- /dev/null
> +++ b/newlib/libm/ld128/e_rem_pio2l.h
> @@ -0,0 +1,135 @@
> +/* From: @(#)e_rem_pio2.c 1.4 95/01/18 */
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + * Copyright (c) 2008 Steven G. Kargl, David Schultz, Bruce D. Evans.
> + *
> + * Developed at SunSoft, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + *
> + * Optimized by Bruce D. Evans.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/* ld128 version of __ieee754_rem_pio2l(x,y)
> + *
> + * return the remainder of x rem pi/2 in y[0]+y[1]
> + * use __kernel_rem_pio2()
> + */
> +
> +#include <float.h>
> +
> +#include "math.h"
> +#include "math_private.h"
> +#include "../ld/fpmath.h"
> +
> +#define BIAS (LDBL_MAX_EXP - 1)
> +
> +/*
> + * XXX need to verify that nonzero integer multiples of pi/2 within the
> + * range get no closer to a long double than 2**-140, or that
> + * ilogb(x) + ilogb(min_delta) < 45 - -140.
> + */
> +/*
> + * invpio2: 113 bits of 2/pi
> + * pio2_1: first 68 bits of pi/2
> + * pio2_1t: pi/2 - pio2_1
> + * pio2_2: second 68 bits of pi/2
> + * pio2_2t: pi/2 - (pio2_1+pio2_2)
> + * pio2_3: third 68 bits of pi/2
> + * pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3)
> + */
> +
> +static const double
> +zero = 0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */
> +two24 = 1.67772160000000000000e+07; /* 0x41700000, 0x00000000 */
> +
> +static const long double
> +invpio2 = 6.3661977236758134307553505349005747e-01L, /* 0x145f306dc9c882a53f84eafa3ea6a.0p-113 */
> +pio2_1 = 1.5707963267948966192292994253909555e+00L, /* 0x1921fb54442d18469800000000000.0p-112 */
> +pio2_1t = 2.0222662487959507323996846200947577e-21L, /* 0x13198a2e03707344a4093822299f3.0p-181 */
> +pio2_2 = 2.0222662487959507323994779168837751e-21L, /* 0x13198a2e03707344a400000000000.0p-181 */
> +pio2_2t = 2.0670321098263988236496903051604844e-43L, /* 0x127044533e63a0105df531d89cd91.0p-254 */
> +pio2_3 = 2.0670321098263988236499468110329591e-43L, /* 0x127044533e63a0105e00000000000.0p-254 */
> +pio2_3t = -2.5650587247459238361625433492959285e-65L; /* -0x159c4ec64ddaeb5f78671cbfb2210.0p-327 */
> +
> +static inline __always_inline int
> +__ieee754_rem_pio2l(long double x, long double *y)
> +{
> + union IEEEl2bits u,u1;
> + long double z,w,t,r,fn;
> + double tx[5],ty[3];
> + int64_t n;
> + int e0,ex,i,j,nx;
> + int16_t expsign;
> +
> + u.e = x;
> + expsign = u.xbits.expsign;
> + ex = expsign & 0x7fff;
> + if (ex < BIAS + 45 || ex == BIAS + 45 &&
> + u.bits.manh < 0x921fb54442d1LL) {
> + /* |x| ~< 2^45*(pi/2), medium size */
> + /* TODO: use only double precision for fn, as in expl(). */
> + fn = rnintl(x * invpio2);
> + n = i64rint(fn);
> + r = x-fn*pio2_1;
> + w = fn*pio2_1t; /* 1st round good to 180 bit */
> + {
> + union IEEEl2bits u2;
> + int ex1;
> + j = ex;
> + y[0] = r-w;
> + u2.e = y[0];
> + ex1 = u2.xbits.expsign & 0x7fff;
> + i = j-ex1;
> + if(i>51) { /* 2nd iteration needed, good to 248 */
> + t = r;
> + w = fn*pio2_2;
> + r = t-w;
> + w = fn*pio2_2t-((t-r)-w);
> + y[0] = r-w;
> + u2.e = y[0];
> + ex1 = u2.xbits.expsign & 0x7fff;
> + i = j-ex1;
> + if(i>119) { /* 3rd iteration need, 316 bits acc */
> + t = r; /* will cover all possible cases */
> + w = fn*pio2_3;
> + r = t-w;
> + w = fn*pio2_3t-((t-r)-w);
> + y[0] = r-w;
> + }
> + }
> + }
> + y[1] = (r-y[0])-w;
> + return n;
> + }
> + /*
> + * all other (large) arguments
> + */
> + if(ex==0x7fff) { /* x is inf or NaN */
> + y[0]=y[1]=x-x; return 0;
> + }
> + /* set z = scalbn(|x|,ilogb(x)-23) */
> + u1.e = x;
> + e0 = ex - BIAS - 23; /* e0 = ilogb(|x|)-23; */
> + u1.xbits.expsign = ex - e0;
> + z = u1.e;
> + for(i=0;i<4;i++) {
> + tx[i] = (double)((int32_t)(z));
> + z = (z-tx[i])*two24;
> + }
> + tx[4] = z;
> + nx = 5;
> + while(tx[nx-1]==zero) nx--; /* skip zero term */
> + n = __kernel_rem_pio2(tx,ty,e0,nx,3);
> + t = (long double)ty[2] + ty[1];
> + r = t + ty[0];
> + w = ty[0] - (r - t);
> + if(expsign<0) {y[0] = -r; y[1] = -w; return -n;}
> + y[0] = r; y[1] = w; return n;
> +}
> diff --git a/newlib/libm/ld128/invtrig.c b/newlib/libm/ld128/invtrig.c
> new file mode 100644
> index 000000000..ab93732c8
> --- /dev/null
> +++ b/newlib/libm/ld128/invtrig.c
> @@ -0,0 +1,102 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2008 David Schultz <das@FreeBSD.ORG>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include "invtrig.h"
> +
> +/*
> + * asinl() and acosl()
> + */
> +const long double
> +pS0 = 1.66666666666666666666666666666700314e-01L,
> +pS1 = -7.32816946414566252574527475428622708e-01L,
> +pS2 = 1.34215708714992334609030036562143589e+00L,
> +pS3 = -1.32483151677116409805070261790752040e+00L,
> +pS4 = 7.61206183613632558824485341162121989e-01L,
> +pS5 = -2.56165783329023486777386833928147375e-01L,
> +pS6 = 4.80718586374448793411019434585413855e-02L,
> +pS7 = -4.42523267167024279410230886239774718e-03L,
> +pS8 = 1.44551535183911458253205638280410064e-04L,
> +pS9 = -2.10558957916600254061591040482706179e-07L,
> +qS1 = -4.84690167848739751544716485245697428e+00L,
> +qS2 = 9.96619113536172610135016921140206980e+00L,
> +qS3 = -1.13177895428973036660836798461641458e+01L,
> +qS4 = 7.74004374389488266169304117714658761e+00L,
> +qS5 = -3.25871986053534084709023539900339905e+00L,
> +qS6 = 8.27830318881232209752469022352928864e-01L,
> +qS7 = -1.18768052702942805423330715206348004e-01L,
> +qS8 = 8.32600764660522313269101537926539470e-03L,
> +qS9 = -1.99407384882605586705979504567947007e-04L;
> +
> +/*
> + * atanl()
> + */
> +const long double atanhi[] = {
> + 4.63647609000806116214256231461214397e-01L,
> + 7.85398163397448309615660845819875699e-01L,
> + 9.82793723247329067985710611014666038e-01L,
> + 1.57079632679489661923132169163975140e+00L,
> +};
> +
> +const long double atanlo[] = {
> + 4.89509642257333492668618435220297706e-36L,
> + 2.16795253253094525619926100651083806e-35L,
> + -2.31288434538183565909319952098066272e-35L,
> + 4.33590506506189051239852201302167613e-35L,
> +};
> +
> +const long double aT[] = {
> + 3.33333333333333333333333333333333125e-01L,
> + -1.99999999999999999999999999999180430e-01L,
> + 1.42857142857142857142857142125269827e-01L,
> + -1.11111111111111111111110834490810169e-01L,
> + 9.09090909090909090908522355708623681e-02L,
> + -7.69230769230769230696553844935357021e-02L,
> + 6.66666666666666660390096773046256096e-02L,
> + -5.88235294117646671706582985209643694e-02L,
> + 5.26315789473666478515847092020327506e-02L,
> + -4.76190476189855517021024424991436144e-02L,
> + 4.34782608678695085948531993458097026e-02L,
> + -3.99999999632663469330634215991142368e-02L,
> + 3.70370363987423702891250829918659723e-02L,
> + -3.44827496515048090726669907612335954e-02L,
> + 3.22579620681420149871973710852268528e-02L,
> + -3.03020767654269261041647570626778067e-02L,
> + 2.85641979882534783223403715930946138e-02L,
> + -2.69824879726738568189929461383741323e-02L,
> + 2.54194698498808542954187110873675769e-02L,
> + -2.35083879708189059926183138130183215e-02L,
> + 2.04832358998165364349957325067131428e-02L,
> + -1.54489555488544397858507248612362957e-02L,
> + 8.64492360989278761493037861575248038e-03L,
> + -2.58521121597609872727919154569765469e-03L,
> +};
> +
> +const long double pi_lo = 8.67181013012378102479704402604335225e-35L;
> diff --git a/newlib/libm/ld128/invtrig.h b/newlib/libm/ld128/invtrig.h
> new file mode 100644
> index 000000000..423b56847
> --- /dev/null
> +++ b/newlib/libm/ld128/invtrig.h
> @@ -0,0 +1,115 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2008 David Schultz <das@FreeBSD.ORG>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + *
> + * $FreeBSD$
> + */
> +
> +#include <float.h>
> +
> +#include "fpmath.h"
> +
> +#define BIAS (LDBL_MAX_EXP - 1)
> +#define MANH_SIZE (LDBL_MANH_SIZE + 1)
> +
> +/* Approximation thresholds. */
> +#define ASIN_LINEAR (BIAS - 56) /* 2**-56 */
> +#define ACOS_CONST (BIAS - 113) /* 2**-113 */
> +#define ATAN_CONST (BIAS + 113) /* 2**113 */
> +#define ATAN_LINEAR (BIAS - 56) /* 2**-56 */
> +
> +/* 0.95 */
> +#define THRESH ((0xe666666666666666ULL>>(64-(MANH_SIZE-1)))|LDBL_NBIT)
> +
> +/* Constants shared by the long double inverse trig functions. */
> +#define pS0 _ItL_pS0
> +#define pS1 _ItL_pS1
> +#define pS2 _ItL_pS2
> +#define pS3 _ItL_pS3
> +#define pS4 _ItL_pS4
> +#define pS5 _ItL_pS5
> +#define pS6 _ItL_pS6
> +#define pS7 _ItL_pS7
> +#define pS8 _ItL_pS8
> +#define pS9 _ItL_pS9
> +#define qS1 _ItL_qS1
> +#define qS2 _ItL_qS2
> +#define qS3 _ItL_qS3
> +#define qS4 _ItL_qS4
> +#define qS5 _ItL_qS5
> +#define qS6 _ItL_qS6
> +#define qS7 _ItL_qS7
> +#define qS8 _ItL_qS8
> +#define qS9 _ItL_qS9
> +#define atanhi _ItL_atanhi
> +#define atanlo _ItL_atanlo
> +#define aT _ItL_aT
> +#define pi_lo _ItL_pi_lo
> +
> +#define pio2_hi atanhi[3]
> +#define pio2_lo atanlo[3]
> +#define pio4_hi atanhi[1]
> +
> +/* Constants shared by the long double inverse trig functions. */
> +extern const long double pS0, pS1, pS2, pS3, pS4, pS5, pS6, pS7, pS8, pS9;
> +extern const long double qS1, qS2, qS3, qS4, qS5, qS6, qS7, qS8, qS9;
> +extern const long double atanhi[], atanlo[], aT[];
> +extern const long double pi_lo;
> +
> +static inline long double
> +P(long double x)
> +{
> +
> + return (x * (pS0 + x * (pS1 + x * (pS2 + x * (pS3 + x * \
> + (pS4 + x * (pS5 + x * (pS6 + x * (pS7 + x * (pS8 + x * \
> + pS9))))))))));
> +}
> +
> +static inline long double
> +Q(long double x)
> +{
> +
> + return (1.0 + x * (qS1 + x * (qS2 + x * (qS3 + x * (qS4 + x * \
> + (qS5 + x * (qS6 + x * (qS7 + x * (qS8 + x * qS9)))))))));
> +}
> +
> +static inline long double
> +T_even(long double x)
> +{
> +
> + return (aT[0] + x * (aT[2] + x * (aT[4] + x * (aT[6] + x * \
> + (aT[8] + x * (aT[10] + x * (aT[12] + x * (aT[14] + x * \
> + (aT[16] + x * (aT[18] + x * (aT[20] + x * aT[22])))))))))));
> +}
> +
> +static inline long double
> +T_odd(long double x)
> +{
> +
> + return (aT[1] + x * (aT[3] + x * (aT[5] + x * (aT[7] + x * \
> + (aT[9] + x * (aT[11] + x * (aT[13] + x * (aT[15] + x * \
> + (aT[17] + x * (aT[19] + x * (aT[21] + x * aT[23])))))))))));
> +}
> diff --git a/newlib/libm/ld128/k_cosl.c b/newlib/libm/ld128/k_cosl.c
> new file mode 100644
> index 000000000..422357bf8
> --- /dev/null
> +++ b/newlib/libm/ld128/k_cosl.c
> @@ -0,0 +1,59 @@
> +/* From: @(#)k_cos.c 1.3 95/01/18 */
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + * Copyright (c) 2008 Steven G. Kargl, David Schultz, Bruce D. Evans.
> + *
> + * Developed at SunSoft, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * ld128 version of k_cos.c. See ../src/k_cos.c for most comments.
> + */
> +
> +#include "math_private.h"
> +
> +/*
> + * Domain [-0.7854, 0.7854], range ~[-1.17e-39, 1.19e-39]:
> + * |cos(x) - c(x))| < 2**-129.3
> + *
> + * 113-bit precision requires more care than 64-bit precision, since
> + * simple methods give a minimax polynomial with coefficient for x^2
> + * that is 1 ulp below 0.5, but we want it to be precisely 0.5. See
> + * ../ld80/k_cosl.c for more details.
> + */
> +static const double
> +one = 1.0;
> +static const long double
> +C1 = 4.16666666666666666666666666666666667e-02L,
> +C2 = -1.38888888888888888888888888888888834e-03L,
> +C3 = 2.48015873015873015873015873015446795e-05L,
> +C4 = -2.75573192239858906525573190949988493e-07L,
> +C5 = 2.08767569878680989792098886701451072e-09L,
> +C6 = -1.14707455977297247136657111139971865e-11L,
> +C7 = 4.77947733238738518870113294139830239e-14L,
> +C8 = -1.56192069685858079920640872925306403e-16L,
> +C9 = 4.11031762320473354032038893429515732e-19L,
> +C10= -8.89679121027589608738005163931958096e-22L,
> +C11= 1.61171797801314301767074036661901531e-24L,
> +C12= -2.46748624357670948912574279501044295e-27L;
> +
> +long double
> +__kernel_cosl(long double x, long double y)
> +{
> + long double hz,z,r,w;
> +
> + z = x*x;
> + r = z*(C1+z*(C2+z*(C3+z*(C4+z*(C5+z*(C6+z*(C7+
> + z*(C8+z*(C9+z*(C10+z*(C11+z*C12)))))))))));
> + hz = 0.5*z;
> + w = one-hz;
> + return w + (((one-w)-hz) + (z*r-x*y));
> +}
> diff --git a/newlib/libm/ld128/k_expl.h b/newlib/libm/ld128/k_expl.h
> new file mode 100644
> index 000000000..159338fe3
> --- /dev/null
> +++ b/newlib/libm/ld128/k_expl.h
> @@ -0,0 +1,324 @@
> +/* from: FreeBSD: head/lib/msun/ld128/s_expl.c 251345 2013-06-03 20:09:22Z kargl */
> +
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2009-2013 Steven G. Kargl
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice unmodified, this list of conditions, and the following
> + * disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
> + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
> + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
> + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
> + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
> + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
> + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + *
> + * Optimized by Bruce D. Evans.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * ld128 version of k_expl.h. See ../ld80/s_expl.c for most comments.
> + *
> + * See ../src/e_exp.c and ../src/k_exp.h for precision-independent comments
> + * about the secondary kernels.
> + */
> +
> +#define INTERVALS 128
> +#define LOG2_INTERVALS 7
> +#define BIAS (LDBL_MAX_EXP - 1)
> +
> +static const double
> +/*
> + * ln2/INTERVALS = L1+L2 (hi+lo decomposition for multiplication). L1 must
> + * have at least 22 (= log2(|LDBL_MIN_EXP-extras|) + log2(INTERVALS)) lowest
> + * bits zero so that multiplication of it by n is exact.
> + */
> +INV_L = 1.8466496523378731e+2, /* 0x171547652b82fe.0p-45 */
> +L2 = -1.0253670638894731e-29; /* -0x1.9ff0342542fc3p-97 */
> +static const long double
> +/* 0x1.62e42fefa39ef35793c768000000p-8 */
> +L1 = 5.41521234812457272982212595914567508e-3L;
> +
> +/*
> + * XXX values in hex in comments have been lost (or were never present)
> + * from here.
> + */
> +static const long double
> +/*
> + * Domain [-0.002708, 0.002708], range ~[-2.4021e-38, 2.4234e-38]:
> + * |exp(x) - p(x)| < 2**-124.9
> + * (0.002708 is ln2/(2*INTERVALS) rounded up a little).
> + *
> + * XXX the coeffs aren't very carefully rounded, and I get 3.6 more bits.
> + */
> +A2 = 0.5,
> +A3 = 1.66666666666666666666666666651085500e-1L,
> +A4 = 4.16666666666666666666666666425885320e-2L,
> +A5 = 8.33333333333333333334522877160175842e-3L,
> +A6 = 1.38888888888888888889971139751596836e-3L;
> +
> +static const double
> +A7 = 1.9841269841269470e-4, /* 0x1.a01a01a019f91p-13 */
> +A8 = 2.4801587301585286e-5, /* 0x1.71de3ec75a967p-19 */
> +A9 = 2.7557324277411235e-6, /* 0x1.71de3ec75a967p-19 */
> +A10 = 2.7557333722375069e-7; /* 0x1.27e505ab56259p-22 */
> +
> +static const struct {
> + /*
> + * hi must be rounded to at most 106 bits so that multiplication
> + * by r1 in expm1l() is exact, but it is rounded to 88 bits due to
> + * historical accidents.
> + *
> + * XXX it is wasteful to use long double for both hi and lo. ld128
> + * exp2l() uses only float for lo (in a very differently organized
> + * table; ld80 exp2l() is different again. It uses 2 doubles in a
> + * table organized like this one. 1 double and 1 float would
> + * suffice). There are different packing/locality/alignment/caching
> + * problems with these methods.
> + *
> + * XXX C's bad %a format makes the bits unreadable. They happen
> + * to all line up for the hi values 1 before the point and 88
> + * in 22 nybbles, but for the low values the nybbles are shifted
> + * randomly.
> + */
> + long double hi;
> + long double lo;
> +} tbl[INTERVALS] = {
> + 0x1p0L, 0x0p0L,
> + 0x1.0163da9fb33356d84a66aep0L, 0x3.36dcdfa4003ec04c360be2404078p-92L,
> + 0x1.02c9a3e778060ee6f7cacap0L, 0x4.f7a29bde93d70a2cabc5cb89ba10p-92L,
> + 0x1.04315e86e7f84bd738f9a2p0L, 0xd.a47e6ed040bb4bfc05af6455e9b8p-96L,
> + 0x1.059b0d31585743ae7c548ep0L, 0xb.68ca417fe53e3495f7df4baf84a0p-92L,
> + 0x1.0706b29ddf6ddc6dc403a8p0L, 0x1.d87b27ed07cb8b092ac75e311753p-88L,
> + 0x1.0874518759bc808c35f25cp0L, 0x1.9427fa2b041b2d6829d8993a0d01p-88L,
> + 0x1.09e3ecac6f3834521e060cp0L, 0x5.84d6b74ba2e023da730e7fccb758p-92L,
> + 0x1.0b5586cf9890f6298b92b6p0L, 0x1.1842a98364291408b3ceb0a2a2bbp-88L,
> + 0x1.0cc922b7247f7407b705b8p0L, 0x9.3dc5e8aac564e6fe2ef1d431fd98p-92L,
> + 0x1.0e3ec32d3d1a2020742e4ep0L, 0x1.8af6a552ac4b358b1129e9f966a4p-88L,
> + 0x1.0fb66affed31af232091dcp0L, 0x1.8a1426514e0b627bda694a400a27p-88L,
> + 0x1.11301d0125b50a4ebbf1aep0L, 0xd.9318ceac5cc47ab166ee57427178p-92L,
> + 0x1.12abdc06c31cbfb92bad32p0L, 0x4.d68e2f7270bdf7cedf94eb1cb818p-92L,
> + 0x1.1429aaea92ddfb34101942p0L, 0x1.b2586d01844b389bea7aedd221d4p-88L,
> + 0x1.15a98c8a58e512480d573cp0L, 0x1.d5613bf92a2b618ee31b376c2689p-88L,
> + 0x1.172b83c7d517adcdf7c8c4p0L, 0x1.0eb14a792035509ff7d758693f24p-88L,
> + 0x1.18af9388c8de9bbbf70b9ap0L, 0x3.c2505c97c0102e5f1211941d2840p-92L,
> + 0x1.1a35beb6fcb753cb698f68p0L, 0x1.2d1c835a6c30724d5cfae31b84e5p-88L,
> + 0x1.1bbe084045cd39ab1e72b4p0L, 0x4.27e35f9acb57e473915519a1b448p-92L,
> + 0x1.1d4873168b9aa7805b8028p0L, 0x9.90f07a98b42206e46166cf051d70p-92L,
> + 0x1.1ed5022fcd91cb8819ff60p0L, 0x1.121d1e504d36c47474c9b7de6067p-88L,
> + 0x1.2063b88628cd63b8eeb028p0L, 0x1.50929d0fc487d21c2b84004264dep-88L,
> + 0x1.21f49917ddc962552fd292p0L, 0x9.4bdb4b61ea62477caa1dce823ba0p-92L,
> + 0x1.2387a6e75623866c1fadb0p0L, 0x1.c15cb593b0328566902df69e4de2p-88L,
> + 0x1.251ce4fb2a63f3582ab7dep0L, 0x9.e94811a9c8afdcf796934bc652d0p-92L,
> + 0x1.26b4565e27cdd257a67328p0L, 0x1.d3b249dce4e9186ddd5ff44e6b08p-92L,
> + 0x1.284dfe1f5638096cf15cf0p0L, 0x3.ca0967fdaa2e52d7c8106f2e262cp-92L,
> + 0x1.29e9df51fdee12c25d15f4p0L, 0x1.a24aa3bca890ac08d203fed80a07p-88L,
> + 0x1.2b87fd0dad98ffddea4652p0L, 0x1.8fcab88442fdc3cb6de4519165edp-88L,
> + 0x1.2d285a6e4030b40091d536p0L, 0xd.075384589c1cd1b3e4018a6b1348p-92L,
> + 0x1.2ecafa93e2f5611ca0f45cp0L, 0x1.523833af611bdcda253c554cf278p-88L,
> + 0x1.306fe0a31b7152de8d5a46p0L, 0x3.05c85edecbc27343629f502f1af2p-92L,
> + 0x1.32170fc4cd8313539cf1c2p0L, 0x1.008f86dde3220ae17a005b6412bep-88L,
> + 0x1.33c08b26416ff4c9c8610cp0L, 0x1.96696bf95d1593039539d94d662bp-88L,
> + 0x1.356c55f929ff0c94623476p0L, 0x3.73af38d6d8d6f9506c9bbc93cbc0p-92L,
> + 0x1.371a7373aa9caa7145502ep0L, 0x1.4547987e3e12516bf9c699be432fp-88L,
> + 0x1.38cae6d05d86585a9cb0d8p0L, 0x1.bed0c853bd30a02790931eb2e8f0p-88L,
> + 0x1.3a7db34e59ff6ea1bc9298p0L, 0x1.e0a1d336163fe2f852ceeb134067p-88L,
> + 0x1.3c32dc313a8e484001f228p0L, 0xb.58f3775e06ab66353001fae9fca0p-92L,
> + 0x1.3dea64c12342235b41223ep0L, 0x1.3d773fba2cb82b8244267c54443fp-92L,
> + 0x1.3fa4504ac801ba0bf701aap0L, 0x4.1832fb8c1c8dbdff2c49909e6c60p-92L,
> + 0x1.4160a21f72e29f84325b8ep0L, 0x1.3db61fb352f0540e6ba05634413ep-88L,
> + 0x1.431f5d950a896dc7044394p0L, 0x1.0ccec81e24b0caff7581ef4127f7p-92L,
> + 0x1.44e086061892d03136f408p0L, 0x1.df019fbd4f3b48709b78591d5cb5p-88L,
> + 0x1.46a41ed1d005772512f458p0L, 0x1.229d97df404ff21f39c1b594d3a8p-88L,
> + 0x1.486a2b5c13cd013c1a3b68p0L, 0x1.062f03c3dd75ce8757f780e6ec99p-88L,
> + 0x1.4a32af0d7d3de672d8bcf4p0L, 0x6.f9586461db1d878b1d148bd3ccb8p-92L,
> + 0x1.4bfdad5362a271d4397afep0L, 0xc.42e20e0363ba2e159c579f82e4b0p-92L,
> + 0x1.4dcb299fddd0d63b36ef1ap0L, 0x9.e0cc484b25a5566d0bd5f58ad238p-92L,
> + 0x1.4f9b2769d2ca6ad33d8b68p0L, 0x1.aa073ee55e028497a329a7333dbap-88L,
> + 0x1.516daa2cf6641c112f52c8p0L, 0x4.d822190e718226177d7608d20038p-92L,
> + 0x1.5342b569d4f81df0a83c48p0L, 0x1.d86a63f4e672a3e429805b049465p-88L,
> + 0x1.551a4ca5d920ec52ec6202p0L, 0x4.34ca672645dc6c124d6619a87574p-92L,
> + 0x1.56f4736b527da66ecb0046p0L, 0x1.64eb3c00f2f5ab3d801d7cc7272dp-88L,
> + 0x1.58d12d497c7fd252bc2b72p0L, 0x1.43bcf2ec936a970d9cc266f0072fp-88L,
> + 0x1.5ab07dd48542958c930150p0L, 0x1.91eb345d88d7c81280e069fbdb63p-88L,
> + 0x1.5c9268a5946b701c4b1b80p0L, 0x1.6986a203d84e6a4a92f179e71889p-88L,
> + 0x1.5e76f15ad21486e9be4c20p0L, 0x3.99766a06548a05829e853bdb2b52p-92L,
> + 0x1.605e1b976dc08b076f592ap0L, 0x4.86e3b34ead1b4769df867b9c89ccp-92L,
> + 0x1.6247eb03a5584b1f0fa06ep0L, 0x1.d2da42bb1ceaf9f732275b8aef30p-88L,
> + 0x1.6434634ccc31fc76f8714cp0L, 0x4.ed9a4e41000307103a18cf7a6e08p-92L,
> + 0x1.66238825522249127d9e28p0L, 0x1.b8f314a337f4dc0a3adf1787ff74p-88L,
> + 0x1.68155d44ca973081c57226p0L, 0x1.b9f32706bfe4e627d809a85dcc66p-88L,
> + 0x1.6a09e667f3bcc908b2fb12p0L, 0x1.66ea957d3e3adec17512775099dap-88L,
> + 0x1.6c012750bdabeed76a9980p0L, 0xf.4f33fdeb8b0ecd831106f57b3d00p-96L,
> + 0x1.6dfb23c651a2ef220e2cbep0L, 0x1.bbaa834b3f11577ceefbe6c1c411p-92L,
> + 0x1.6ff7df9519483cf87e1b4ep0L, 0x1.3e213bff9b702d5aa477c12523cep-88L,
> + 0x1.71f75e8ec5f73dd2370f2ep0L, 0xf.0acd6cb434b562d9e8a20adda648p-92L,
> + 0x1.73f9a48a58173bd5c9a4e6p0L, 0x8.ab1182ae217f3a7681759553e840p-92L,
> + 0x1.75feb564267c8bf6e9aa32p0L, 0x1.a48b27071805e61a17b954a2dad8p-88L,
> + 0x1.780694fde5d3f619ae0280p0L, 0x8.58b2bb2bdcf86cd08e35fb04c0f0p-92L,
> + 0x1.7a11473eb0186d7d51023ep0L, 0x1.6cda1f5ef42b66977960531e821bp-88L,
> + 0x1.7c1ed0130c1327c4933444p0L, 0x1.937562b2dc933d44fc828efd4c9cp-88L,
> + 0x1.7e2f336cf4e62105d02ba0p0L, 0x1.5797e170a1427f8fcdf5f3906108p-88L,
> + 0x1.80427543e1a11b60de6764p0L, 0x9.a354ea706b8e4d8b718a672bf7c8p-92L,
> + 0x1.82589994cce128acf88afap0L, 0xb.34a010f6ad65cbbac0f532d39be0p-92L,
> + 0x1.8471a4623c7acce52f6b96p0L, 0x1.c64095370f51f48817914dd78665p-88L,
> + 0x1.868d99b4492ec80e41d90ap0L, 0xc.251707484d73f136fb5779656b70p-92L,
> + 0x1.88ac7d98a669966530bcdep0L, 0x1.2d4e9d61283ef385de170ab20f96p-88L,
> + 0x1.8ace5422aa0db5ba7c55a0p0L, 0x1.92c9bb3e6ed61f2733304a346d8fp-88L,
> + 0x1.8cf3216b5448bef2aa1cd0p0L, 0x1.61c55d84a9848f8c453b3ca8c946p-88L,
> + 0x1.8f1ae991577362b982745cp0L, 0x7.2ed804efc9b4ae1458ae946099d4p-92L,
> + 0x1.9145b0b91ffc588a61b468p0L, 0x1.f6b70e01c2a90229a4c4309ea719p-88L,
> + 0x1.93737b0cdc5e4f4501c3f2p0L, 0x5.40a22d2fc4af581b63e8326efe9cp-92L,
> + 0x1.95a44cbc8520ee9b483694p0L, 0x1.a0fc6f7c7d61b2b3a22a0eab2cadp-88L,
> + 0x1.97d829fde4e4f8b9e920f8p0L, 0x1.1e8bd7edb9d7144b6f6818084cc7p-88L,
> + 0x1.9a0f170ca07b9ba3109b8cp0L, 0x4.6737beb19e1eada6825d3c557428p-92L,
> + 0x1.9c49182a3f0901c7c46b06p0L, 0x1.1f2be58ddade50c217186c90b457p-88L,
> + 0x1.9e86319e323231824ca78ep0L, 0x6.4c6e010f92c082bbadfaf605cfd4p-92L,
> + 0x1.a0c667b5de564b29ada8b8p0L, 0xc.ab349aa0422a8da7d4512edac548p-92L,
> + 0x1.a309bec4a2d3358c171f76p0L, 0x1.0daad547fa22c26d168ea762d854p-88L,
> + 0x1.a5503b23e255c8b424491cp0L, 0xa.f87bc8050a405381703ef7caff50p-92L,
> + 0x1.a799e1330b3586f2dfb2b0p0L, 0x1.58f1a98796ce8908ae852236ca94p-88L,
> + 0x1.a9e6b5579fdbf43eb243bcp0L, 0x1.ff4c4c58b571cf465caf07b4b9f5p-88L,
> + 0x1.ac36bbfd3f379c0db966a2p0L, 0x1.1265fc73e480712d20f8597a8e7bp-88L,
> + 0x1.ae89f995ad3ad5e8734d16p0L, 0x1.73205a7fbc3ae675ea440b162d6cp-88L,
> + 0x1.b0e07298db66590842acdep0L, 0x1.c6f6ca0e5dcae2aafffa7a0554cbp-88L,
> + 0x1.b33a2b84f15faf6bfd0e7ap0L, 0x1.d947c2575781dbb49b1237c87b6ep-88L,
> + 0x1.b59728de559398e3881110p0L, 0x1.64873c7171fefc410416be0a6525p-88L,
> + 0x1.b7f76f2fb5e46eaa7b081ap0L, 0xb.53c5354c8903c356e4b625aacc28p-92L,
> + 0x1.ba5b030a10649840cb3c6ap0L, 0xf.5b47f297203757e1cc6eadc8bad0p-92L,
> + 0x1.bcc1e904bc1d2247ba0f44p0L, 0x1.b3d08cd0b20287092bd59be4ad98p-88L,
> + 0x1.bf2c25bd71e088408d7024p0L, 0x1.18e3449fa073b356766dfb568ff4p-88L,
> + 0x1.c199bdd85529c2220cb12ap0L, 0x9.1ba6679444964a36661240043970p-96L,
> + 0x1.c40ab5fffd07a6d14df820p0L, 0xf.1828a5366fd387a7bdd54cdf7300p-92L,
> + 0x1.c67f12e57d14b4a2137fd2p0L, 0xf.2b301dd9e6b151a6d1f9d5d5f520p-96L,
> + 0x1.c8f6d9406e7b511acbc488p0L, 0x5.c442ddb55820171f319d9e5076a8p-96L,
> + 0x1.cb720dcef90691503cbd1ep0L, 0x9.49db761d9559ac0cb6dd3ed599e0p-92L,
> + 0x1.cdf0b555dc3f9c44f8958ep0L, 0x1.ac51be515f8c58bdfb6f5740a3a4p-88L,
> + 0x1.d072d4a07897b8d0f22f20p0L, 0x1.a158e18fbbfc625f09f4cca40874p-88L,
> + 0x1.d2f87080d89f18ade12398p0L, 0x9.ea2025b4c56553f5cdee4c924728p-92L,
> + 0x1.d5818dcfba48725da05aeap0L, 0x1.66e0dca9f589f559c0876ff23830p-88L,
> + 0x1.d80e316c98397bb84f9d04p0L, 0x8.805f84bec614de269900ddf98d28p-92L,
> + 0x1.da9e603db3285708c01a5ap0L, 0x1.6d4c97f6246f0ec614ec95c99392p-88L,
> + 0x1.dd321f301b4604b695de3cp0L, 0x6.30a393215299e30d4fb73503c348p-96L,
> + 0x1.dfc97337b9b5eb968cac38p0L, 0x1.ed291b7225a944efd5bb5524b927p-88L,
> + 0x1.e264614f5a128a12761fa0p0L, 0x1.7ada6467e77f73bf65e04c95e29dp-88L,
> + 0x1.e502ee78b3ff6273d13014p0L, 0x1.3991e8f49659e1693be17ae1d2f9p-88L,
> + 0x1.e7a51fbc74c834b548b282p0L, 0x1.23786758a84f4956354634a416cep-88L,
> + 0x1.ea4afa2a490d9858f73a18p0L, 0xf.5db301f86dea20610ceee13eb7b8p-92L,
> + 0x1.ecf482d8e67f08db0312fap0L, 0x1.949cef462010bb4bc4ce72a900dfp-88L,
> + 0x1.efa1bee615a27771fd21a8p0L, 0x1.2dac1f6dd5d229ff68e46f27e3dfp-88L,
> + 0x1.f252b376bba974e8696fc2p0L, 0x1.6390d4c6ad5476b5162f40e1d9a9p-88L,
> + 0x1.f50765b6e4540674f84b76p0L, 0x2.862baff99000dfc4352ba29b8908p-92L,
> + 0x1.f7bfdad9cbe138913b4bfep0L, 0x7.2bd95c5ce7280fa4d2344a3f5618p-92L,
> + 0x1.fa7c1819e90d82e90a7e74p0L, 0xb.263c1dc060c36f7650b4c0f233a8p-92L,
> + 0x1.fd3c22b8f71f10975ba4b2p0L, 0x1.2bcf3a5e12d269d8ad7c1a4a8875p-88L
> +};
> +
> +/*
> + * Kernel for expl(x). x must be finite and not tiny or huge.
> + * "tiny" is anything that would make us underflow (|A6*x^6| < ~LDBL_MIN).
> + * "huge" is anything that would make fn*L1 inexact (|x| > ~2**17*ln2).
> + */
> +static inline void
> +__k_expl(long double x, long double *hip, long double *lop, int *kp)
> +{
> + long double q, r, r1, t;
> + double dr, fn, r2;
> + int n, n2;
> +
> + /* Reduce x to (k*ln2 + endpoint[n2] + r1 + r2). */
> + fn = rnint((double)x * INV_L);
> + n = irint(fn);
> + n2 = (unsigned)n % INTERVALS;
> + /* Depend on the sign bit being propagated: */
> + *kp = n >> LOG2_INTERVALS;
> + r1 = x - fn * L1;
> + r2 = fn * -L2;
> + r = r1 + r2;
> +
> + /* Evaluate expl(endpoint[n2] + r1 + r2) = tbl[n2] * expl(r1 + r2). */
> + dr = r;
> + q = r2 + r * r * (A2 + r * (A3 + r * (A4 + r * (A5 + r * (A6 +
> + dr * (A7 + dr * (A8 + dr * (A9 + dr * A10))))))));
> + t = tbl[n2].lo + tbl[n2].hi;
> + *hip = tbl[n2].hi;
> + *lop = tbl[n2].lo + t * (q + r1);
> +}
> +
> +/*
> + * XXX: the rest of the functions are identical for ld80 and ld128.
> + * However, we should use scalbnl() for ld128, since long double
> + * multiplication was very slow on sparc64 and no new evaluation has
> + * been made for aarch64 and/or riscv.
> + */
> +
> +static inline void
> +k_hexpl(long double x, long double *hip, long double *lop)
> +{
> + float twopkm1;
> + int k;
> +
> + __k_expl(x, hip, lop, &k);
> + SET_FLOAT_WORD(twopkm1, 0x3f800000 + ((k - 1) << 23));
> + *hip *= twopkm1;
> + *lop *= twopkm1;
> +}
> +
> +static inline long double
> +hexpl(long double x)
> +{
> + long double hi, lo, twopkm2;
> + int k;
> +
> + twopkm2 = 1;
> + __k_expl(x, &hi, &lo, &k);
> + SET_LDBL_EXPSIGN(twopkm2, BIAS + k - 2);
> + return (lo + hi) * 2 * twopkm2;
> +}
> +
> +#ifdef _COMPLEX_H
> +/*
> + * See ../src/k_exp.c for details.
> + */
> +static inline long double complex
> +__ldexp_cexpl(long double complex z, int expt)
> +{
> + long double c, exp_x, hi, lo, s;
> + long double x, y, scale1, scale2;
> + int half_expt, k;
> +
> + x = creall(z);
> + y = cimagl(z);
> + __k_expl(x, &hi, &lo, &k);
> +
> + exp_x = (lo + hi) * 0x1p16382L;
> + expt += k - 16382;
> +
> + scale1 = 1;
> + half_expt = expt / 2;
> + SET_LDBL_EXPSIGN(scale1, BIAS + half_expt);
> + scale2 = 1;
> + SET_LDBL_EXPSIGN(scale2, BIAS + expt - half_expt);
> +
> + sincosl(y, &s, &c);
> + return (CMPLXL(c * exp_x * scale1 * scale2,
> + s * exp_x * scale1 * scale2));
> +}
> +#endif /* _COMPLEX_H */
> diff --git a/newlib/libm/ld128/k_sinl.c b/newlib/libm/ld128/k_sinl.c
> new file mode 100644
> index 000000000..09472d65f
> --- /dev/null
> +++ b/newlib/libm/ld128/k_sinl.c
> @@ -0,0 +1,59 @@
> +/* From: @(#)k_sin.c 1.3 95/01/18 */
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + * Copyright (c) 2008 Steven G. Kargl, David Schultz, Bruce D. Evans.
> + *
> + * Developed at SunSoft, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * ld128 version of k_sin.c. See ../src/k_sin.c for most comments.
> + */
> +
> +#include "math_private.h"
> +
> +static const double
> +half = 0.5;
> +
> +/*
> + * Domain [-0.7854, 0.7854], range ~[-1.53e-37, 1.659e-37]
> + * |sin(x)/x - s(x)| < 2**-122.1
> + *
> + * See ../ld80/k_cosl.c for more details about the polynomial.
> + */
> +static const long double
> +S1 = -0.16666666666666666666666666666666666606732416116558L,
> +S2 = 0.0083333333333333333333333333333331135404851288270047L,
> +S3 = -0.00019841269841269841269841269839935785325638310428717L,
> +S4 = 0.27557319223985890652557316053039946268333231205686e-5L,
> +S5 = -0.25052108385441718775048214826384312253862930064745e-7L,
> +S6 = 0.16059043836821614596571832194524392581082444805729e-9L,
> +S7 = -0.76471637318198151807063387954939213287488216303768e-12L,
> +S8 = 0.28114572543451292625024967174638477283187397621303e-14L;
> +
> +static const double
> +S9 = -0.82206352458348947812512122163446202498005154296863e-17,
> +S10 = 0.19572940011906109418080609928334380560135358385256e-19,
> +S11 = -0.38680813379701966970673724299207480965452616911420e-22,
> +S12 = 0.64038150078671872796678569586315881020659912139412e-25;
> +
> +long double
> +__kernel_sinl(long double x, long double y, int iy)
> +{
> + long double z,r,v;
> +
> + z = x*x;
> + v = z*x;
> + r = S2+z*(S3+z*(S4+z*(S5+z*(S6+z*(S7+z*(S8+
> + z*(S9+z*(S10+z*(S11+z*S12)))))))));
> + if(iy==0) return x+v*(S1+z*r);
> + else return x-((z*(half*y-v*r)-y)-v*S1);
> +}
> diff --git a/newlib/libm/ld128/s_erfl.c b/newlib/libm/ld128/s_erfl.c
> new file mode 100644
> index 000000000..e29c9691f
> --- /dev/null
> +++ b/newlib/libm/ld128/s_erfl.c
> @@ -0,0 +1,329 @@
> +/* @(#)s_erf.c 5.1 93/09/24 */
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunPro, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * See s_erf.c for complete comments.
> + *
> + * Converted to long double by Steven G. Kargl.
> + */
> +#include <float.h>
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +
> +/* XXX Prevent compilers from erroneously constant folding these: */
> +static const volatile long double tiny = 0x1p-10000L;
> +
> +static const double
> +half= 0.5,
> +one = 1,
> +two = 2;
> +/*
> + * In the domain [0, 2**-40], only the first term in the power series
> + * expansion of erf(x) is used. The magnitude of the first neglected
> + * terms is less than 2**-120.
> + */
> +static const long double
> +efx = 1.28379167095512573896158903121545167e-01L, /* 0xecbff6a7, 0x481dd788, 0xb64d21a8, 0xeb06fc3f */
> +efx8 = 1.02703333676410059116927122497236133e+00L, /* 0xecbff6a7, 0x481dd788, 0xb64d21a8, 0xeb06ff3f */
> +/*
> + * Domain [0, 0.84375], range ~[-1.919e-38, 1.919e-38]:
> + * |(erf(x) - x)/x - pp(x)/qq(x)| < 2**-125.29
> + */
> +pp0 = 1.28379167095512573896158903121545167e-01L, /* 0x3ffc06eb, 0xa8214db6, 0x88d71d48, 0xa7f6bfec */
> +pp1 = -3.14931554396568573802046931159683404e-01L, /* 0xbffd427d, 0x6ada7263, 0x547eb096, 0x95f37463 */
> +pp2 = -5.27514920282183487103576956956725309e-02L, /* 0xbffab023, 0xe5a271e3, 0xb0e79b01, 0x2f7ac962 */
> +pp3 = -1.13202828509005281355609495523452713e-02L, /* 0xbff872f1, 0x6a5023a1, 0xe08b3884, 0x326af20f */
> +pp4 = -9.18626155872522453865998391206048506e-04L, /* 0xbff4e19f, 0xea5fb024, 0x43247a37, 0xe430b06c */
> +pp5 = -7.87518862406176274922506447157284230e-05L, /* 0xbff14a4f, 0x31a85fe0, 0x7fff2204, 0x09c49b37 */
> +pp6 = -3.42357944472240436548115331090560881e-06L, /* 0xbfeccb81, 0x4b43c336, 0xcd2eb6c2, 0x903f2d87 */
> +pp7 = -1.37317432573890412634717890726745428e-07L, /* 0xbfe826e3, 0x0e915eb6, 0x42aee414, 0xf7e36805 */
> +pp8 = -2.71115170113861755855049008732113726e-09L, /* 0xbfe2749e, 0x2b94fd00, 0xecb4d166, 0x0efb91f8 */
> +pp9 = -3.37925756196555959454018189718117864e-11L, /* 0xbfdc293e, 0x1d9060cb, 0xd043204a, 0x314cd7f0 */
> +qq1 = 4.76672625471551170489978555182449450e-01L, /* 0x3ffde81c, 0xde6531f0, 0x76803bee, 0x526e29e9 */
> +qq2 = 1.06713144672281502058807525850732240e-01L, /* 0x3ffbb518, 0xd7a6bb74, 0xcd9bdd33, 0x7601eee5 */
> +qq3 = 1.47747613127513761102189201923147490e-02L, /* 0x3ff8e423, 0xae527e18, 0xf12cb447, 0x723b4749 */
> +qq4 = 1.39939377672028671891148770908874816e-03L, /* 0x3ff56ed7, 0xba055d84, 0xc21b45c4, 0x388d1812 */
> +qq5 = 9.44302939359455241271983309378738276e-05L, /* 0x3ff18c11, 0xc18c99a4, 0x86d0fe09, 0x46387b4c */
> +qq6 = 4.56199342312522842161301671745365650e-06L, /* 0x3fed3226, 0x73421d05, 0x08875300, 0x32fa1432 */
> +qq7 = 1.53019260483764773845294600092361197e-07L, /* 0x3fe8489b, 0x3a63f627, 0x2b9ad2ce, 0x26516e57 */
> +qq8 = 3.25542691121324805094777901250005508e-09L, /* 0x3fe2bf6c, 0x26d93a29, 0x9142be7c, 0x9f1dd043 */
> +qq9 = 3.37405581964478060434410167262684979e-11L; /* 0x3fdc28c8, 0xfb8fa1be, 0x10e57eec, 0xaa19e49f */
> +
> +static const long double
> +erx = 8.42700792949714894142232424201210961e-01L, /* 0x3ffeaf76, 0x7a741088, 0xb0000000, 0x00000000 */
> +/*
> + * Domain [0.84375, 1.25], range ~[-2.521e-36, 2.523e-36]:
> + * |(erf(x) - erx) - pa(x)/qa(x)| < 2**-120.15
> + */
> +pa0 = -2.48010117891186017024438233323795897e-17L, /* 0xbfc7c97f, 0x77812279, 0x6c877f22, 0xef4bfb2e */
> +pa1 = 4.15107497420594680894327969504526489e-01L, /* 0x3ffda911, 0xf096fbc2, 0x55662005, 0x2337fa64 */
> +pa2 = -3.94180628087084846724448515851892609e-02L, /* 0xbffa42e9, 0xab54528c, 0xad529da1, 0x6efc2af3 */
> +pa3 = 4.48897599625192107295954790681677462e-02L, /* 0x3ffa6fbc, 0xa65edba1, 0x0e4cbcea, 0x73ef9a31 */
> +pa4 = 8.02069252143016600110972019232995528e-02L, /* 0x3ffb4887, 0x0e8b548e, 0x3230b417, 0x11b553b3 */
> +pa5 = -1.02729816533435279443621120242391295e-02L, /* 0xbff850a0, 0x041de3ee, 0xd5bca6c9, 0x4ef5f9f2 */
> +pa6 = 5.70777694530755634864821094419982095e-03L, /* 0x3ff77610, 0x9b501e10, 0x4c978382, 0x742df68f */
> +pa7 = 1.22635150233075521018231779267077071e-03L, /* 0x3ff5417b, 0x0e623682, 0x60327da0, 0x96b9219e */
> +pa8 = 5.36100234820204569428412542856666503e-04L, /* 0x3ff41912, 0x27ceb4c1, 0x1d3298ec, 0x84ced627 */
> +pa9 = -1.97753571846365167177187858667583165e-04L, /* 0xbff29eb8, 0x23f5bcf3, 0x15c83c46, 0xe4fda98b */
> +pa10 = 6.19333039900846970674794789568415105e-05L, /* 0x3ff103c4, 0x60f88e46, 0xc0c9fb02, 0x13cc7fc1 */
> +pa11 = -5.40531400436645861492290270311751349e-06L, /* 0xbfed6abe, 0x9665f8a8, 0xdd0ad3ba, 0xe5dc0ee3 */
> +qa1 = 9.05041313265490487793231810291907851e-01L, /* 0x3ffecf61, 0x93340222, 0xe9930620, 0xc4e61168 */
> +qa2 = 6.79848064708886864767240880834868092e-01L, /* 0x3ffe5c15, 0x0ba858dc, 0xf7900ae9, 0xfea1e09a */
> +qa3 = 4.04720609926471677581066689316516445e-01L, /* 0x3ffd9e6f, 0x145e9b00, 0x6d8c1749, 0xd2928623 */
> +qa4 = 1.69183273898369996364661075664302225e-01L, /* 0x3ffc5a7c, 0xc2a363c1, 0xd6c19097, 0xef9b4063 */
> +qa5 = 7.44476185988067992342479750486764248e-02L, /* 0x3ffb30ef, 0xfc7259ef, 0x1bcbb089, 0x686dd62d */
> +qa6 = 2.02981172725892407200420389604788573e-02L, /* 0x3ff94c90, 0x7976cb0e, 0x21e1d36b, 0x0f09ca2b */
> +qa7 = 6.94281866271607668268269403102277234e-03L, /* 0x3ff7c701, 0x2b193250, 0xc5d46ecc, 0x374843d8 */
> +qa8 = 1.12952275469171559611651594706820034e-03L, /* 0x3ff52818, 0xfd2a7c06, 0xd13e38fd, 0xda4b34f5 */
> +qa9 = 3.13736683241992737197226578597710179e-04L, /* 0x3ff348fa, 0x0cb48d18, 0x051f849b, 0x135ccf74 */
> +qa10 = 1.17037675204033225470121134087771410e-05L, /* 0x3fee88b6, 0x98f47704, 0xa5d8f8f2, 0xc6422e11 */
> +qa11 = 4.61312518293853991439362806880973592e-06L, /* 0x3fed3594, 0xe31db94f, 0x3592b693, 0xed4386b4 */
> +qa12 = -1.02158572037456893687737553657431771e-06L; /* 0xbfeb123a, 0xd60d9b1e, 0x1f6fdeb9, 0x7dc8410a */
> +/*
> + * Domain [1.25,2.85715], range ~[-2.922e-37,2.922e-37]:
> + * |log(x*erfc(x)) + x**2 + 0.5625 - ra(x)/sa(x)| < 2**-121.36
> + */
> +static const long double
> +ra0 = -9.86494292470069009555706994426014461e-03L, /* 0xbff84341, 0x239e8709, 0xe941b06a, 0xcb4b6ec5 */
> +ra1 = -1.13580436992565640457579040117568870e+00L, /* 0xbfff22c4, 0x133f7c0d, 0x72d5e231, 0x2eb1ee3f */
> +ra2 = -4.89744330295291950661185707066921755e+01L, /* 0xc00487cb, 0xa38b4fc2, 0xc136695b, 0xc1df8047 */
> +ra3 = -1.10766149300215937173768072715352140e+03L, /* 0xc00914ea, 0x55e6beb3, 0xabc50e07, 0xb6e5664d */
> +ra4 = -1.49991031232170934967642795601952100e+04L, /* 0xc00cd4b8, 0xd33243e6, 0xffbf6545, 0x3c57ef6e */
> +ra5 = -1.29805749738318462882524181556996692e+05L, /* 0xc00ffb0d, 0xbfeed9b6, 0x5b2a3ff4, 0xe245bd3c */
> +ra6 = -7.42828497044940065828871976644647850e+05L, /* 0xc0126ab5, 0x8fe7caca, 0x473352d9, 0xcd4e0c90 */
> +ra7 = -2.85637299581890734287995171242421106e+06L, /* 0xc0145cad, 0xa7f76fe7, 0x3e358051, 0x1799f927 */
> +ra8 = -7.40674797129824999383748865571026084e+06L, /* 0xc015c412, 0x6fe29c02, 0x298ad158, 0x7d24e45c */
> +ra9 = -1.28653420911930973914078724204151759e+07L, /* 0xc016889e, 0x7c2eb0dc, 0x95d5863b, 0x0aa34dc3 */
> +ra10 = -1.47198163599330179552932489109452638e+07L, /* 0xc016c136, 0x90b84923, 0xf9bcb497, 0x19bbd0f5 */
> +ra11 = -1.07812992258382800318665248311522624e+07L, /* 0xc0164904, 0xe673a113, 0x35d7f079, 0xe13701f3 */
> +ra12 = -4.83545565681708642630419905537756076e+06L, /* 0xc0152721, 0xfea094a8, 0x869eb39d, 0x413d6f13 */
> +ra13 = -1.23956521201673964822976917356685286e+06L, /* 0xc0132ea0, 0xd3646baa, 0x2fe62b0d, 0xbae5ce85 */
> +ra14 = -1.62289333553652417591275333240371812e+05L, /* 0xc0103cf8, 0xaab1e2d6, 0x4c25e014, 0x248d76ab */
> +ra15 = -8.82890392601176969729168894389833110e+03L, /* 0xc00c13e7, 0x3b3d8f94, 0x6fbda6f6, 0xe7049a82 */
> +ra16 = -1.22591866337261720023681535568334619e+02L, /* 0xc005ea5e, 0x12358891, 0xcfa712c5, 0x77f050d4 */
> +sa1 = 6.44508918884710829371852723353794047e+01L, /* 0x400501cd, 0xb69a6c0f, 0x5716de14, 0x47161af6 */
> +sa2 = 1.76118475473171481523704824327358534e+03L, /* 0x4009b84b, 0xd305829f, 0xc4c771b0, 0xbf1f7f9b */
> +sa3 = 2.69448346969488374857087646131950188e+04L, /* 0x400da503, 0x56bacc05, 0x4fdba68d, 0x2cca27e6 */
> +sa4 = 2.56826633369941456778326497384543763e+05L, /* 0x4010f59d, 0x51124428, 0x69c41de6, 0xbd0d5753 */
> +sa5 = 1.60647413092257206847700054645905859e+06L, /* 0x40138834, 0xa2184244, 0x557a1bed, 0x68c9d556 */
> +sa6 = 6.76963075165099718574753447122393797e+06L, /* 0x40159d2f, 0x7b01b0cc, 0x8bac9e95, 0x5d35d56e */
> +sa7 = 1.94295690905361884290986932493647741e+07L, /* 0x40172878, 0xc1172d61, 0x3068501e, 0x2f3c71da */
> +sa8 = 3.79774781017759149060839255547073541e+07L, /* 0x401821be, 0xc30d06fe, 0x410563d7, 0x032111fd */
> +sa9 = 5.00659831846029484248302236457727397e+07L, /* 0x40187df9, 0x1f97a111, 0xc51d6ac2, 0x4b389793 */
> +sa10 = 4.36486287620506484276130525941972541e+07L, /* 0x40184d03, 0x3a618ae0, 0x2a723357, 0xfa45c60a */
> +sa11 = 2.43779678791333894255510508253951934e+07L, /* 0x401773fa, 0x6fe10ee2, 0xc467850d, 0xc6b7ff30 */
> +sa12 = 8.30732360384443202039372372212966542e+06L, /* 0x4015fb09, 0xee6a5631, 0xdd98de7e, 0x8b00461a */
> +sa13 = 1.60160846942050515734192397495105693e+06L, /* 0x40138704, 0x8782bf13, 0x5b8fb315, 0xa898abe5 */
> +sa14 = 1.54255505242533291014555153757001825e+05L, /* 0x40102d47, 0xc0abc98e, 0x843c9490, 0xb4352440 */
> +sa15 = 5.87949220002375547561467275493888824e+03L, /* 0x400b6f77, 0xe00d21d1, 0xec4d41e8, 0x2f8e1673 */
> +sa16 = 4.97272976346793193860385983372237710e+01L; /* 0x40048dd1, 0x816c1b3f, 0x24f540a6, 0x4cfe03cc */
> +/*
> + * Domain [2.85715,9], range ~[-7.886e-37,7.918e-37]:
> + * |log(x*erfc(x)) + x**2 + 0.5625 - rb(x)/sb(x)| < 2**-120
> + */
> +static const long double
> +rb0 = -9.86494292470008707171371994479162369e-3L, /* 0xbff84341, 0x239e86f4, 0x2f57e561, 0xf4469360 */
> +rb1 = -1.57047326624110727986326503729442830L, /* 0xbfff920a, 0x8935bf73, 0x8803b894, 0x4656482d */
> +rb2 = -1.03228196364885474342132255440317065e2L, /* 0xc0059ce9, 0xac4ed0ff, 0x2cff0ff7, 0x5e70d1ab */
> +rb3 = -3.74000570653418227179358710865224376e3L, /* 0xc00ad380, 0x2ebf7835, 0xf6b07ed2, 0x861242f7 */
> +rb4 = -8.35435477739098044190860390632813956e4L, /* 0xc00f4657, 0x8c3ae934, 0x3647d7b3, 0x80e76fb7 */
> +rb5 = -1.21398672055223642118716640216747152e6L, /* 0xc0132862, 0x2b8761c8, 0x27d18c0f, 0x137c9463 */
> +rb6 = -1.17669175877248796101665344873273970e7L, /* 0xc0166719, 0x0b2cea46, 0x81f14174, 0x11602ea5 */
> +rb7 = -7.66108006086998253606773064264599615e7L, /* 0xc019243f, 0x3c26f4f0, 0x1cc05241, 0x3b953728 */
> +rb8 = -3.32547117558141845968704725353130804e8L, /* 0xc01b3d24, 0x42d8ee26, 0x24ef6f3b, 0x604a8c65 */
> +rb9 = -9.41561252426350696802167711221739746e8L, /* 0xc01cc0f8, 0xad23692a, 0x8ddb2310, 0xe9937145 */
> +rb10 = -1.67157110805390944549427329626281063e9L, /* 0xc01d8e88, 0x9a903734, 0x09a55fa3, 0xd205c903 */
> +rb11 = -1.74339631004410841337645931421427373e9L, /* 0xc01d9fa8, 0x77582d2a, 0xc183b8ab, 0x7e00cb05 */
> +rb12 = -9.57655233596934915727573141357471703e8L, /* 0xc01cc8a5, 0x460cc685, 0xd0271fa0, 0x6a70e3da */
> +rb13 = -2.26320062731339353035254704082495066e8L, /* 0xc01aafab, 0xd7d76721, 0xc9720e11, 0x6a8bd489 */
> +rb14 = -1.42777302996263256686002973851837039e7L, /* 0xc016b3b8, 0xc499689f, 0x2b88d965, 0xc32414f9 */
> +sb1 = 1.08512869705594540211033733976348506e2L, /* 0x4005b20d, 0x2db7528d, 0x00d20dcb, 0x858f6191 */
> +sb2 = 5.02757713761390460534494530537572834e3L, /* 0x400b3a39, 0x3bf4a690, 0x3025d28d, 0xfd40a891 */
> +sb3 = 1.31019107205412870059331647078328430e5L, /* 0x400fffcb, 0x1b71d05e, 0x3b28361d, 0x2a3c3690 */
> +sb4 = 2.13021555152296846166736757455018030e6L, /* 0x40140409, 0x3c6984df, 0xc4491d7c, 0xb04aa08d */
> +sb5 = 2.26649105281820861953868568619768286e7L, /* 0x401759d6, 0xce8736f0, 0xf28ad037, 0x2a901e0c */
> +sb6 = 1.61071939490875921812318684143076081e8L, /* 0x401a3338, 0x686fb541, 0x6bd27d06, 0x4f95c9ac */
> +sb7 = 7.66895673844301852676056750497991966e8L, /* 0x401c6daf, 0x31cec121, 0x54699126, 0x4bd9bf9e */
> +sb8 = 2.41884450436101936436023058196042526e9L, /* 0x401e2059, 0x46b0b8d7, 0x87b64cbf, 0x78bc296d */
> +sb9 = 4.92403055884071695093305291535107666e9L, /* 0x401f257e, 0xbe5ed739, 0x39e17346, 0xcadd2e55 */
> +sb10 = 6.18627786365587486459633615573786416e9L, /* 0x401f70bb, 0x1be7a7e7, 0x6a45b5ae, 0x607c70f0 */
> +sb11 = 4.45898013426501378097430226324743199e9L, /* 0x401f09c6, 0xa32643d7, 0xf1724620, 0x9ea46c32 */
> +sb12 = 1.63006115763329848117160344854224975e9L, /* 0x401d84a3, 0x0996887f, 0x65a4f43b, 0x978c1d74 */
> +sb13 = 2.39216717012421697446304015847567721e8L, /* 0x401ac845, 0x09a065c2, 0x30095da7, 0x9d72d6ae */
> +sb14 = 7.84837329009278694937250358810225609e6L; /* 0x4015df06, 0xd5290e15, 0x63031fac, 0x4d9c894c */
> +/*
> + * Domain [9,108], range ~[-5.324e-38,5.340e-38]:
> + * |log(x*erfc(x)) + x**2 + 0.5625 - r(x)/s(x)| < 2**-124
> + */
> +static const long double
> +rc0 = -9.86494292470008707171367567652935673e-3L, /* 0xbff84341, 0x239e86f4, 0x2f57e55b, 0x1aa10fd3 */
> +rc1 = -1.26229447747315096406518846411562266L, /* 0xbfff4325, 0xbb1aab28, 0xda395cd9, 0xfb861c15 */
> +rc2 = -6.13742634438922591780742637728666162e1L, /* 0xc004eafe, 0x7dd51cd8, 0x3c7c5928, 0x751e50cf */
> +rc3 = -1.50455835478908280402912854338421517e3L, /* 0xc0097823, 0xbc15b9ab, 0x3d60745c, 0x523e80a5 */
> +rc4 = -2.04415631865861549920184039902945685e4L, /* 0xc00d3f66, 0x40b3fc04, 0x5388f2ec, 0xb009e1f0 */
> +rc5 = -1.57625662981714582753490610560037638e5L, /* 0xc01033dc, 0xd4dc95b6, 0xfd4da93b, 0xf355b4a9 */
> +rc6 = -6.73473451616752528402917538033283794e5L, /* 0xc01248d8, 0x2e73a4f9, 0xcded49c5, 0xfa3bfeb7 */
> +rc7 = -1.47433165421387483167186683764364857e6L, /* 0xc01367f1, 0xba77a8f7, 0xcfdd0dbb, 0x25d554b3 */
> +rc8 = -1.38811981807868828563794929997744139e6L, /* 0xc01352e5, 0x7d16d9ad, 0xbbdcbf38, 0x38fbc5ea */
> +rc9 = -3.59659700530831825640766479698155060e5L, /* 0xc0115f3a, 0xecd57f45, 0x21f8ad6c, 0x910a5958 */
> +sc1 = 7.72730753022908298637508998072635696e1L, /* 0x40053517, 0xa10d52bc, 0xdabb55b6, 0xbd0328cd */
> +sc2 = 2.36825757341694050500333261769082182e3L, /* 0x400a2808, 0x3e0a9b42, 0x82977842, 0x9c5de29e */
> +sc3 = 3.72210540173034735352888847134073099e4L, /* 0x400e22ca, 0x1ba827ef, 0xac8390d7, 0x1fc39a41 */
> +sc4 = 3.24136032646418336712461033591393412e5L, /* 0x40113c8a, 0x0216e100, 0xc59d1e44, 0xf0e68d9d */
> +sc5 = 1.57836135851134393802505823370009175e6L, /* 0x40138157, 0x95bc7664, 0x17575961, 0xdbe58eeb */
> +sc6 = 4.12881981392063738026679089714182355e6L, /* 0x4014f801, 0x9e82e8d2, 0xb8b3a70e, 0xfd84185d */
> +sc7 = 5.24438427289213488410596395361544142e6L, /* 0x40154017, 0x81177109, 0x2aa6c3b0, 0x1f106625 */
> +sc8 = 2.59909544563616121735963429710382149e6L, /* 0x40143d45, 0xbb90a9b1, 0x12bf9390, 0xa827a700 */
> +sc9 = 2.80930665169282501639651995082335693e5L; /* 0x40111258, 0xaa92222e, 0xa97e3216, 0xa237fa6c */
> +
> +long double
> +erfl(long double x)
> +{
> + long double ax,R,S,P,Q,s,y,z,r;
> + uint64_t lx, llx;
> + int32_t i;
> + uint16_t hx;
> +
> + EXTRACT_LDBL128_WORDS(hx, lx, llx, x);
> +
> + if((hx & 0x7fff) == 0x7fff) { /* erfl(nan)=nan */
> + i = (hx>>15)<<1;
> + return (1-i)+one/x; /* erfl(+-inf)=+-1 */
> + }
> +
> + ax = fabsl(x);
> + if(ax < 0.84375) {
> + if(ax < 0x1p-40L) {
> + if(ax < 0x1p-16373L)
> + return (8*x+efx8*x)/8; /* avoid spurious underflow */
> + return x + efx*x;
> + }
> + z = x*x;
> + r = pp0+z*(pp1+z*(pp2+z*(pp3+z*(pp4+z*(pp5+z*(pp6+z*(pp7+
> + z*(pp8+z*pp9))))))));
> + s = one+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*(qq5+z*(qq6+z*(qq7+
> + z*(qq8+z*qq9))))))));
> + y = r/s;
> + return x + x*y;
> + }
> + if(ax < 1.25) {
> + s = ax-one;
> + P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*(pa6+s*(pa7+
> + s*(pa8+s*(pa9+s*(pa10+s*pa11))))))))));
> + Q = one+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*(qa6+s*(qa7+
> + s*(qa8+s*(qa9+s*(qa10+s*(qa11+s*qa12)))))))))));
> + if(x>=0) return (erx + P/Q); else return (-erx - P/Q);
> + }
> + if (ax >= 9) { /* inf>|x|>= 9 */
> + if(x>=0) return (one-tiny); else return (tiny-one);
> + }
> + s = one/(ax*ax);
> + if(ax < 2.85715) { /* |x| < 2.85715 */
> + R=ra0+s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*(ra5+s*(ra6+s*(ra7+
> + s*(ra8+s*(ra9+s*(ra10+s*(ra11+s*(ra12+s*(ra13+s*(ra14+
> + s*(ra15+s*ra16)))))))))))))));
> + S=one+s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*(sa5+s*(sa6+s*(sa7+
> + s*(sa8+s*(sa9+s*(sa10+s*(sa11+s*(sa12+s*(sa13+s*(sa14+
> + s*(sa15+s*sa16)))))))))))))));
> + } else { /* |x| >= 2.85715 */
> + R=rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*(rb5+s*(rb6+s*(rb7+
> + s*(rb8+s*(rb9+s*(rb10+s*(rb11+s*(rb12+s*(rb13+
> + s*rb14)))))))))))));
> + S=one+s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*(sb5+s*(sb6+s*(sb7+
> + s*(sb8+s*(sb9+s*(sb10+s*(sb11+s*(sb12+s*(sb13+
> + s*sb14)))))))))))));
> + }
> + z = (float)ax;
> + r = expl(-z*z-0.5625)*expl((z-ax)*(z+ax)+R/S);
> + if(x>=0) return (one-r/ax); else return (r/ax-one);
> +}
> +
> +long double
> +erfcl(long double x)
> +{
> + long double ax,R,S,P,Q,s,y,z,r;
> + uint64_t lx, llx;
> + uint16_t hx;
> +
> + EXTRACT_LDBL128_WORDS(hx, lx, llx, x);
> +
> + if((hx & 0x7fff) == 0x7fff) { /* erfcl(nan)=nan */
> + /* erfcl(+-inf)=0,2 */
> + return ((hx>>15)<<1)+one/x;
> + }
> +
> + ax = fabsl(x);
> + if(ax < 0.84375L) {
> + if(ax < 0x1p-34L)
> + return one-x;
> + z = x*x;
> + r = pp0+z*(pp1+z*(pp2+z*(pp3+z*(pp4+z*(pp5+z*(pp6+z*(pp7+
> + z*(pp8+z*pp9))))))));
> + s = one+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*(qq5+z*(qq6+z*(qq7+
> + z*(qq8+z*qq9))))))));
> + y = r/s;
> + if(ax < 0.25L) { /* x<1/4 */
> + return one-(x+x*y);
> + } else {
> + r = x*y;
> + r += (x-half);
> + return half - r;
> + }
> + }
> + if(ax < 1.25L) {
> + s = ax-one;
> + P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*(pa6+s*(pa7+
> + s*(pa8+s*(pa9+s*(pa10+s*pa11))))))))));
> + Q = one+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*(qa6+s*(qa7+
> + s*(qa8+s*(qa9+s*(qa10+s*(qa11+s*qa12)))))))))));
> + if(x>=0) {
> + z = one-erx; return z - P/Q;
> + } else {
> + z = erx+P/Q; return one+z;
> + }
> + }
> +
> + if(ax < 108) { /* |x| < 108 */
> + s = one/(ax*ax);
> + if(ax < 2.85715) { /* |x| < 2.85715 */
> + R=ra0+s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*(ra5+s*(ra6+s*(ra7+
> + s*(ra8+s*(ra9+s*(ra10+s*(ra11+s*(ra12+s*(ra13+s*(ra14+
> + s*(ra15+s*ra16)))))))))))))));
> + S=one+s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*(sa5+s*(sa6+s*(sa7+
> + s*(sa8+s*(sa9+s*(sa10+s*(sa11+s*(sa12+s*(sa13+s*(sa14+
> + s*(sa15+s*sa16)))))))))))))));
> + } else if(ax < 9) {
> + R=rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*(rb5+s*(rb6+s*(rb7+
> + s*(rb8+s*(rb9+s*(rb10+s*(rb11+s*(rb12+s*(rb13+
> + s*rb14)))))))))))));
> + S=one+s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*(sb5+s*(sb6+s*(sb7+
> + s*(sb8+s*(sb9+s*(sb10+s*(sb11+s*(sb12+s*(sb13+
> + s*sb14)))))))))))));
> + } else {
> + if(x < -9) return two-tiny; /* x < -9 */
> + R=rc0+s*(rc1+s*(rc2+s*(rc3+s*(rc4+s*(rc5+s*(rc6+s*(rc7+
> + s*(rc8+s*rc9))))))));
> + S=one+s*(sc1+s*(sc2+s*(sc3+s*(sc4+s*(sc5+s*(sc6+s*(sc7+
> + s*(sc8+s*sc9))))))));
> + }
> + z = (float)ax;
> + r = expl(-z*z-0.5625)*expl((z-ax)*(z+ax)+R/S);
> + if(x>0) return r/ax; else return two-r/ax;
> + } else {
> + if(x>0) return tiny*tiny; else return two-tiny;
> + }
> +}
> diff --git a/newlib/libm/ld128/s_exp2l.c b/newlib/libm/ld128/s_exp2l.c
> new file mode 100644
> index 000000000..ee3d2c782
> --- /dev/null
> +++ b/newlib/libm/ld128/s_exp2l.c
> @@ -0,0 +1,429 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2005-2008 David Schultz <das@FreeBSD.ORG>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include <float.h>
> +#include <stdint.h>
> +
> +#include "fpmath.h"
> +#include "math.h"
> +
> +#define TBLBITS 7
> +#define TBLSIZE (1 << TBLBITS)
> +
> +#define BIAS (LDBL_MAX_EXP - 1)
> +#define EXPMASK (BIAS + LDBL_MAX_EXP)
> +
> +static volatile long double
> + huge = 0x1p10000L,
> + twom10000 = 0x1p-10000L;
> +
> +static const long double
> + P1 = 0x1.62e42fefa39ef35793c7673007e6p-1L,
> + P2 = 0x1.ebfbdff82c58ea86f16b06ec9736p-3L,
> + P3 = 0x1.c6b08d704a0bf8b33a762bad3459p-5L,
> + P4 = 0x1.3b2ab6fba4e7729ccbbe0b4f3fc2p-7L,
> + P5 = 0x1.5d87fe78a67311071dee13fd11d9p-10L,
> + P6 = 0x1.430912f86c7876f4b663b23c5fe5p-13L;
> +
> +static const double
> + P7 = 0x1.ffcbfc588b041p-17,
> + P8 = 0x1.62c0223a5c7c7p-20,
> + P9 = 0x1.b52541ff59713p-24,
> + P10 = 0x1.e4cf56a391e22p-28,
> + redux = 0x1.8p112 / TBLSIZE;
> +
> +static const long double tbl[TBLSIZE] = {
> + 0x1.6a09e667f3bcc908b2fb1366dfeap-1L,
> + 0x1.6c012750bdabeed76a99800f4edep-1L,
> + 0x1.6dfb23c651a2ef220e2cbe1bc0d4p-1L,
> + 0x1.6ff7df9519483cf87e1b4f3e1e98p-1L,
> + 0x1.71f75e8ec5f73dd2370f2ef0b148p-1L,
> + 0x1.73f9a48a58173bd5c9a4e68ab074p-1L,
> + 0x1.75feb564267c8bf6e9aa33a489a8p-1L,
> + 0x1.780694fde5d3f619ae02808592a4p-1L,
> + 0x1.7a11473eb0186d7d51023f6ccb1ap-1L,
> + 0x1.7c1ed0130c1327c49334459378dep-1L,
> + 0x1.7e2f336cf4e62105d02ba1579756p-1L,
> + 0x1.80427543e1a11b60de67649a3842p-1L,
> + 0x1.82589994cce128acf88afab34928p-1L,
> + 0x1.8471a4623c7acce52f6b97c6444cp-1L,
> + 0x1.868d99b4492ec80e41d90ac2556ap-1L,
> + 0x1.88ac7d98a669966530bcdf2d4cc0p-1L,
> + 0x1.8ace5422aa0db5ba7c55a192c648p-1L,
> + 0x1.8cf3216b5448bef2aa1cd161c57ap-1L,
> + 0x1.8f1ae991577362b982745c72eddap-1L,
> + 0x1.9145b0b91ffc588a61b469f6b6a0p-1L,
> + 0x1.93737b0cdc5e4f4501c3f2540ae8p-1L,
> + 0x1.95a44cbc8520ee9b483695a0e7fep-1L,
> + 0x1.97d829fde4e4f8b9e920f91e8eb6p-1L,
> + 0x1.9a0f170ca07b9ba3109b8c467844p-1L,
> + 0x1.9c49182a3f0901c7c46b071f28dep-1L,
> + 0x1.9e86319e323231824ca78e64c462p-1L,
> + 0x1.a0c667b5de564b29ada8b8cabbacp-1L,
> + 0x1.a309bec4a2d3358c171f770db1f4p-1L,
> + 0x1.a5503b23e255c8b424491caf88ccp-1L,
> + 0x1.a799e1330b3586f2dfb2b158f31ep-1L,
> + 0x1.a9e6b5579fdbf43eb243bdff53a2p-1L,
> + 0x1.ac36bbfd3f379c0db966a3126988p-1L,
> + 0x1.ae89f995ad3ad5e8734d17731c80p-1L,
> + 0x1.b0e07298db66590842acdfc6fb4ep-1L,
> + 0x1.b33a2b84f15faf6bfd0e7bd941b0p-1L,
> + 0x1.b59728de559398e3881111648738p-1L,
> + 0x1.b7f76f2fb5e46eaa7b081ab53ff6p-1L,
> + 0x1.ba5b030a10649840cb3c6af5b74cp-1L,
> + 0x1.bcc1e904bc1d2247ba0f45b3d06cp-1L,
> + 0x1.bf2c25bd71e088408d7025190cd0p-1L,
> + 0x1.c199bdd85529c2220cb12a0916bap-1L,
> + 0x1.c40ab5fffd07a6d14df820f17deap-1L,
> + 0x1.c67f12e57d14b4a2137fd20f2a26p-1L,
> + 0x1.c8f6d9406e7b511acbc48805c3f6p-1L,
> + 0x1.cb720dcef90691503cbd1e949d0ap-1L,
> + 0x1.cdf0b555dc3f9c44f8958fac4f12p-1L,
> + 0x1.d072d4a07897b8d0f22f21a13792p-1L,
> + 0x1.d2f87080d89f18ade123989ea50ep-1L,
> + 0x1.d5818dcfba48725da05aeb66dff8p-1L,
> + 0x1.d80e316c98397bb84f9d048807a0p-1L,
> + 0x1.da9e603db3285708c01a5b6d480cp-1L,
> + 0x1.dd321f301b4604b695de3c0630c0p-1L,
> + 0x1.dfc97337b9b5eb968cac39ed284cp-1L,
> + 0x1.e264614f5a128a12761fa17adc74p-1L,
> + 0x1.e502ee78b3ff6273d130153992d0p-1L,
> + 0x1.e7a51fbc74c834b548b2832378a4p-1L,
> + 0x1.ea4afa2a490d9858f73a18f5dab4p-1L,
> + 0x1.ecf482d8e67f08db0312fb949d50p-1L,
> + 0x1.efa1bee615a27771fd21a92dabb6p-1L,
> + 0x1.f252b376bba974e8696fc3638f24p-1L,
> + 0x1.f50765b6e4540674f84b762861a6p-1L,
> + 0x1.f7bfdad9cbe138913b4bfe72bd78p-1L,
> + 0x1.fa7c1819e90d82e90a7e74b26360p-1L,
> + 0x1.fd3c22b8f71f10975ba4b32bd006p-1L,
> + 0x1.0000000000000000000000000000p+0L,
> + 0x1.0163da9fb33356d84a66ae336e98p+0L,
> + 0x1.02c9a3e778060ee6f7caca4f7a18p+0L,
> + 0x1.04315e86e7f84bd738f9a20da442p+0L,
> + 0x1.059b0d31585743ae7c548eb68c6ap+0L,
> + 0x1.0706b29ddf6ddc6dc403a9d87b1ep+0L,
> + 0x1.0874518759bc808c35f25d942856p+0L,
> + 0x1.09e3ecac6f3834521e060c584d5cp+0L,
> + 0x1.0b5586cf9890f6298b92b7184200p+0L,
> + 0x1.0cc922b7247f7407b705b893dbdep+0L,
> + 0x1.0e3ec32d3d1a2020742e4f8af794p+0L,
> + 0x1.0fb66affed31af232091dd8a169ep+0L,
> + 0x1.11301d0125b50a4ebbf1aed9321cp+0L,
> + 0x1.12abdc06c31cbfb92bad324d6f84p+0L,
> + 0x1.1429aaea92ddfb34101943b2588ep+0L,
> + 0x1.15a98c8a58e512480d573dd562aep+0L,
> + 0x1.172b83c7d517adcdf7c8c50eb162p+0L,
> + 0x1.18af9388c8de9bbbf70b9a3c269cp+0L,
> + 0x1.1a35beb6fcb753cb698f692d2038p+0L,
> + 0x1.1bbe084045cd39ab1e72b442810ep+0L,
> + 0x1.1d4873168b9aa7805b8028990be8p+0L,
> + 0x1.1ed5022fcd91cb8819ff61121fbep+0L,
> + 0x1.2063b88628cd63b8eeb0295093f6p+0L,
> + 0x1.21f49917ddc962552fd29294bc20p+0L,
> + 0x1.2387a6e75623866c1fadb1c159c0p+0L,
> + 0x1.251ce4fb2a63f3582ab7de9e9562p+0L,
> + 0x1.26b4565e27cdd257a673281d3068p+0L,
> + 0x1.284dfe1f5638096cf15cf03c9fa0p+0L,
> + 0x1.29e9df51fdee12c25d15f5a25022p+0L,
> + 0x1.2b87fd0dad98ffddea46538fca24p+0L,
> + 0x1.2d285a6e4030b40091d536d0733ep+0L,
> + 0x1.2ecafa93e2f5611ca0f45d5239a4p+0L,
> + 0x1.306fe0a31b7152de8d5a463063bep+0L,
> + 0x1.32170fc4cd8313539cf1c3009330p+0L,
> + 0x1.33c08b26416ff4c9c8610d96680ep+0L,
> + 0x1.356c55f929ff0c94623476373be4p+0L,
> + 0x1.371a7373aa9caa7145502f45452ap+0L,
> + 0x1.38cae6d05d86585a9cb0d9bed530p+0L,
> + 0x1.3a7db34e59ff6ea1bc9299e0a1fep+0L,
> + 0x1.3c32dc313a8e484001f228b58cf0p+0L,
> + 0x1.3dea64c12342235b41223e13d7eep+0L,
> + 0x1.3fa4504ac801ba0bf701aa417b9cp+0L,
> + 0x1.4160a21f72e29f84325b8f3dbacap+0L,
> + 0x1.431f5d950a896dc704439410b628p+0L,
> + 0x1.44e086061892d03136f409df0724p+0L,
> + 0x1.46a41ed1d005772512f459229f0ap+0L,
> + 0x1.486a2b5c13cd013c1a3b69062f26p+0L,
> + 0x1.4a32af0d7d3de672d8bcf46f99b4p+0L,
> + 0x1.4bfdad5362a271d4397afec42e36p+0L,
> + 0x1.4dcb299fddd0d63b36ef1a9e19dep+0L,
> + 0x1.4f9b2769d2ca6ad33d8b69aa0b8cp+0L,
> + 0x1.516daa2cf6641c112f52c84d6066p+0L,
> + 0x1.5342b569d4f81df0a83c49d86bf4p+0L,
> + 0x1.551a4ca5d920ec52ec620243540cp+0L,
> + 0x1.56f4736b527da66ecb004764e61ep+0L,
> + 0x1.58d12d497c7fd252bc2b7343d554p+0L,
> + 0x1.5ab07dd48542958c93015191e9a8p+0L,
> + 0x1.5c9268a5946b701c4b1b81697ed4p+0L,
> + 0x1.5e76f15ad21486e9be4c20399d12p+0L,
> + 0x1.605e1b976dc08b076f592a487066p+0L,
> + 0x1.6247eb03a5584b1f0fa06fd2d9eap+0L,
> + 0x1.6434634ccc31fc76f8714c4ee122p+0L,
> + 0x1.66238825522249127d9e29b92ea2p+0L,
> + 0x1.68155d44ca973081c57227b9f69ep+0L,
> +};
> +
> +static const float eps[TBLSIZE] = {
> + -0x1.5c50p-101,
> + -0x1.5d00p-106,
> + 0x1.8e90p-102,
> + -0x1.5340p-103,
> + 0x1.1bd0p-102,
> + -0x1.4600p-105,
> + -0x1.7a40p-104,
> + 0x1.d590p-102,
> + -0x1.d590p-101,
> + 0x1.b100p-103,
> + -0x1.0d80p-105,
> + 0x1.6b00p-103,
> + -0x1.9f00p-105,
> + 0x1.c400p-103,
> + 0x1.e120p-103,
> + -0x1.c100p-104,
> + -0x1.9d20p-103,
> + 0x1.a800p-108,
> + 0x1.4c00p-106,
> + -0x1.9500p-106,
> + 0x1.6900p-105,
> + -0x1.29d0p-100,
> + 0x1.4c60p-103,
> + 0x1.13a0p-102,
> + -0x1.5b60p-103,
> + -0x1.1c40p-103,
> + 0x1.db80p-102,
> + 0x1.91a0p-102,
> + 0x1.dc00p-105,
> + 0x1.44c0p-104,
> + 0x1.9710p-102,
> + 0x1.8760p-103,
> + -0x1.a720p-103,
> + 0x1.ed20p-103,
> + -0x1.49c0p-102,
> + -0x1.e000p-111,
> + 0x1.86a0p-103,
> + 0x1.2b40p-103,
> + -0x1.b400p-108,
> + 0x1.1280p-99,
> + -0x1.02d8p-102,
> + -0x1.e3d0p-103,
> + -0x1.b080p-105,
> + -0x1.f100p-107,
> + -0x1.16c0p-105,
> + -0x1.1190p-103,
> + -0x1.a7d2p-100,
> + 0x1.3450p-103,
> + -0x1.67c0p-105,
> + 0x1.4b80p-104,
> + -0x1.c4e0p-103,
> + 0x1.6000p-108,
> + -0x1.3f60p-105,
> + 0x1.93f0p-104,
> + 0x1.5fe0p-105,
> + 0x1.6f80p-107,
> + -0x1.7600p-106,
> + 0x1.21e0p-106,
> + -0x1.3a40p-106,
> + -0x1.40c0p-104,
> + -0x1.9860p-105,
> + -0x1.5d40p-108,
> + -0x1.1d70p-106,
> + 0x1.2760p-105,
> + 0x0.0000p+0,
> + 0x1.21e2p-104,
> + -0x1.9520p-108,
> + -0x1.5720p-106,
> + -0x1.4810p-106,
> + -0x1.be00p-109,
> + 0x1.0080p-105,
> + -0x1.5780p-108,
> + -0x1.d460p-105,
> + -0x1.6140p-105,
> + 0x1.4630p-104,
> + 0x1.ad50p-103,
> + 0x1.82e0p-105,
> + 0x1.1d3cp-101,
> + 0x1.6100p-107,
> + 0x1.ec30p-104,
> + 0x1.f200p-108,
> + 0x1.0b40p-103,
> + 0x1.3660p-102,
> + 0x1.d9d0p-103,
> + -0x1.02d0p-102,
> + 0x1.b070p-103,
> + 0x1.b9c0p-104,
> + -0x1.01c0p-103,
> + -0x1.dfe0p-103,
> + 0x1.1b60p-104,
> + -0x1.ae94p-101,
> + -0x1.3340p-104,
> + 0x1.b3d8p-102,
> + -0x1.6e40p-105,
> + -0x1.3670p-103,
> + 0x1.c140p-104,
> + 0x1.1840p-101,
> + 0x1.1ab0p-102,
> + -0x1.a400p-104,
> + 0x1.1f00p-104,
> + -0x1.7180p-103,
> + 0x1.4ce0p-102,
> + 0x1.9200p-107,
> + -0x1.54c0p-103,
> + 0x1.1b80p-105,
> + -0x1.1828p-101,
> + 0x1.5720p-102,
> + -0x1.a060p-100,
> + 0x1.9160p-102,
> + 0x1.a280p-104,
> + 0x1.3400p-107,
> + 0x1.2b20p-102,
> + 0x1.7800p-108,
> + 0x1.cfd0p-101,
> + 0x1.2ef0p-102,
> + -0x1.2760p-99,
> + 0x1.b380p-104,
> + 0x1.0048p-101,
> + -0x1.60b0p-102,
> + 0x1.a1ccp-100,
> + -0x1.a640p-104,
> + -0x1.08a0p-101,
> + 0x1.7e60p-102,
> + 0x1.22c0p-103,
> + -0x1.7200p-106,
> + 0x1.f0f0p-102,
> + 0x1.eb4ep-99,
> + 0x1.c6e0p-103,
> +};
> +
> +/*
> + * exp2l(x): compute the base 2 exponential of x
> + *
> + * Accuracy: Peak error < 0.502 ulp.
> + *
> + * Method: (accurate tables)
> + *
> + * Reduce x:
> + * x = 2**k + y, for integer k and |y| <= 1/2.
> + * Thus we have exp2(x) = 2**k * exp2(y).
> + *
> + * Reduce y:
> + * y = i/TBLSIZE + z - eps[i] for integer i near y * TBLSIZE.
> + * Thus we have exp2(y) = exp2(i/TBLSIZE) * exp2(z - eps[i]),
> + * with |z - eps[i]| <= 2**-8 + 2**-98 for the table used.
> + *
> + * We compute exp2(i/TBLSIZE) via table lookup and exp2(z - eps[i]) via
> + * a degree-10 minimax polynomial with maximum error under 2**-120.
> + * The values in exp2t[] and eps[] are chosen such that
> + * exp2t[i] = exp2(i/TBLSIZE + eps[i]), and eps[i] is a small offset such
> + * that exp2t[i] is accurate to 2**-122.
> + *
> + * Note that the range of i is +-TBLSIZE/2, so we actually index the tables
> + * by i0 = i + TBLSIZE/2.
> + *
> + * This method is due to Gal, with many details due to Gal and Bachelis:
> + *
> + * Gal, S. and Bachelis, B. An Accurate Elementary Mathematical Library
> + * for the IEEE Floating Point Standard. TOMS 17(1), 26-46 (1991).
> + */
> +long double
> +exp2l(long double x)
> +{
> + union IEEEl2bits u, v;
> + long double r, t, twopk, twopkp10000, z;
> + uint32_t hx, ix, i0;
> + int k;
> +
> + u.e = x;
> +
> + /* Filter out exceptional cases. */
> + hx = u.xbits.expsign;
> + ix = hx & EXPMASK;
> + if (ix >= BIAS + 14) { /* |x| >= 16384 */
> + if (ix == BIAS + LDBL_MAX_EXP) {
> + if (u.xbits.manh != 0
> + || u.xbits.manl != 0
> + || (hx & 0x8000) == 0)
> + return (x + x); /* x is NaN or +Inf */
> + else
> + return (0.0); /* x is -Inf */
> + }
> + if (x >= 16384)
> + return (huge * huge); /* overflow */
> + if (x <= -16495)
> + return (twom10000 * twom10000); /* underflow */
> + } else if (ix <= BIAS - 115) { /* |x| < 0x1p-115 */
> + return (1.0 + x);
> + }
> +
> + /*
> + * Reduce x, computing z, i0, and k. The low bits of x + redux
> + * contain the 16-bit integer part of the exponent (k) followed by
> + * TBLBITS fractional bits (i0). We use bit tricks to extract these
> + * as integers, then set z to the remainder.
> + *
> + * Example: Suppose x is 0xabc.123456p0 and TBLBITS is 8.
> + * Then the low-order word of x + redux is 0x000abc12,
> + * We split this into k = 0xabc and i0 = 0x12 (adjusted to
> + * index into the table), then we compute z = 0x0.003456p0.
> + *
> + * XXX If the exponent is negative, the computation of k depends on
> + * '>>' doing sign extension.
> + */
> + u.e = x + redux;
> + i0 = (u.bits.manl & 0xffffffff) + TBLSIZE / 2;
> + k = (int)i0 >> TBLBITS;
> + i0 = i0 & (TBLSIZE - 1);
> + u.e -= redux;
> + z = x - u.e;
> + v.xbits.manh = 0;
> + v.xbits.manl = 0;
> + if (k >= LDBL_MIN_EXP) {
> + v.xbits.expsign = LDBL_MAX_EXP - 1 + k;
> + twopk = v.e;
> + } else {
> + v.xbits.expsign = LDBL_MAX_EXP - 1 + k + 10000;
> + twopkp10000 = v.e;
> + }
> +
> + /* Compute r = exp2(y) = exp2t[i0] * p(z - eps[i]). */
> + t = tbl[i0]; /* exp2t[i0] */
> + z -= eps[i0]; /* eps[i0] */
> + r = t + t * z * (P1 + z * (P2 + z * (P3 + z * (P4 + z * (P5 + z * (P6
> + + z * (P7 + z * (P8 + z * (P9 + z * P10)))))))));
> +
> + /* Scale by 2**k. */
> + if(k >= LDBL_MIN_EXP) {
> + if (k == LDBL_MAX_EXP)
> + return (r * 2.0 * 0x1p16383L);
> + return (r * twopk);
> + } else {
> + return (r * twopkp10000 * twom10000);
> + }
> +}
> diff --git a/newlib/libm/ld128/s_expl.c b/newlib/libm/ld128/s_expl.c
> new file mode 100644
> index 000000000..5b786af49
> --- /dev/null
> +++ b/newlib/libm/ld128/s_expl.c
> @@ -0,0 +1,326 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2009-2013 Steven G. Kargl
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice unmodified, this list of conditions, and the following
> + * disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
> + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
> + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
> + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
> + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
> + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
> + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + *
> + * Optimized by Bruce D. Evans.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * ld128 version of s_expl.c. See ../ld80/s_expl.c for most comments.
> + */
> +
> +#include <float.h>
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +#include "k_expl.h"
> +
> +/* XXX Prevent compilers from erroneously constant folding these: */
> +static const volatile long double
> +huge = 0x1p10000L,
> +tiny = 0x1p-10000L;
> +
> +static const long double
> +twom10000 = 0x1p-10000L;
> +
> +static const long double
> +/* log(2**16384 - 0.5) rounded towards zero: */
> +/* log(2**16384 - 0.5 + 1) rounded towards zero for expm1l() is the same: */
> +o_threshold = 11356.523406294143949491931077970763428L,
> +/* log(2**(-16381-64-1)) rounded towards zero: */
> +u_threshold = -11433.462743336297878837243843452621503L;
> +
> +long double
> +expl(long double x)
> +{
> + union IEEEl2bits u;
> + long double hi, lo, t, twopk;
> + int k;
> + uint16_t hx, ix;
> +
> + DOPRINT_START(&x);
> +
> + /* Filter out exceptional cases. */
> + u.e = x;
> + hx = u.xbits.expsign;
> + ix = hx & 0x7fff;
> + if (ix >= BIAS + 13) { /* |x| >= 8192 or x is NaN */
> + if (ix == BIAS + LDBL_MAX_EXP) {
> + if (hx & 0x8000) /* x is -Inf or -NaN */
> + RETURNP(-1 / x);
> + RETURNP(x + x); /* x is +Inf or +NaN */
> + }
> + if (x > o_threshold)
> + RETURNP(huge * huge);
> + if (x < u_threshold)
> + RETURNP(tiny * tiny);
> + } else if (ix < BIAS - 114) { /* |x| < 0x1p-114 */
> + RETURN2P(1, x); /* 1 with inexact iff x != 0 */
> + }
> +
> + ENTERI();
> +
> + twopk = 1;
> + __k_expl(x, &hi, &lo, &k);
> + t = SUM2P(hi, lo);
> +
> + /* Scale by 2**k. */
> + /*
> + * XXX sparc64 multiplication was so slow that scalbnl() is faster,
> + * but performance on aarch64 and riscv hasn't yet been quantified.
> + */
> + if (k >= LDBL_MIN_EXP) {
> + if (k == LDBL_MAX_EXP)
> + RETURNI(t * 2 * 0x1p16383L);
> + SET_LDBL_EXPSIGN(twopk, BIAS + k);
> + RETURNI(t * twopk);
> + } else {
> + SET_LDBL_EXPSIGN(twopk, BIAS + k + 10000);
> + RETURNI(t * twopk * twom10000);
> + }
> +}
> +
> +/*
> + * Our T1 and T2 are chosen to be approximately the points where method
> + * A and method B have the same accuracy. Tang's T1 and T2 are the
> + * points where method A's accuracy changes by a full bit. For Tang,
> + * this drop in accuracy makes method A immediately less accurate than
> + * method B, but our larger INTERVALS makes method A 2 bits more
> + * accurate so it remains the most accurate method significantly
> + * closer to the origin despite losing the full bit in our extended
> + * range for it.
> + *
> + * Split the interval [T1, T2] into two intervals [T1, T3] and [T3, T2].
> + * Setting T3 to 0 would require the |x| < 0x1p-113 condition to appear
> + * in both subintervals, so set T3 = 2**-5, which places the condition
> + * into the [T1, T3] interval.
> + *
> + * XXX we now do this more to (partially) balance the number of terms
> + * in the C and D polys than to avoid checking the condition in both
> + * intervals.
> + *
> + * XXX these micro-optimizations are excessive.
> + */
> +static const double
> +T1 = -0.1659, /* ~-30.625/128 * log(2) */
> +T2 = 0.1659, /* ~30.625/128 * log(2) */
> +T3 = 0.03125;
> +
> +/*
> + * Domain [-0.1659, 0.03125], range ~[2.9134e-44, 1.8404e-37]:
> + * |(exp(x)-1-x-x**2/2)/x - p(x)| < 2**-122.03
> + *
> + * XXX none of the long double C or D coeffs except C10 is correctly printed.
> + * If you re-print their values in %.35Le format, the result is always
> + * different. For example, the last 2 digits in C3 should be 59, not 67.
> + * 67 is apparently from rounding an extra-precision value to 36 decimal
> + * places.
> + */
> +static const long double
> +C3 = 1.66666666666666666666666666666666667e-1L,
> +C4 = 4.16666666666666666666666666666666645e-2L,
> +C5 = 8.33333333333333333333333333333371638e-3L,
> +C6 = 1.38888888888888888888888888891188658e-3L,
> +C7 = 1.98412698412698412698412697235950394e-4L,
> +C8 = 2.48015873015873015873015112487849040e-5L,
> +C9 = 2.75573192239858906525606685484412005e-6L,
> +C10 = 2.75573192239858906612966093057020362e-7L,
> +C11 = 2.50521083854417203619031960151253944e-8L,
> +C12 = 2.08767569878679576457272282566520649e-9L,
> +C13 = 1.60590438367252471783548748824255707e-10L;
> +
> +/*
> + * XXX this has 1 more coeff than needed.
> + * XXX can start the double coeffs but not the double mults at C10.
> + * With my coeffs (C10-C17 double; s = best_s):
> + * Domain [-0.1659, 0.03125], range ~[-1.1976e-37, 1.1976e-37]:
> + * |(exp(x)-1-x-x**2/2)/x - p(x)| ~< 2**-122.65
> + */
> +static const double
> +C14 = 1.1470745580491932e-11, /* 0x1.93974a81dae30p-37 */
> +C15 = 7.6471620181090468e-13, /* 0x1.ae7f3820adab1p-41 */
> +C16 = 4.7793721460260450e-14, /* 0x1.ae7cd18a18eacp-45 */
> +C17 = 2.8074757356658877e-15, /* 0x1.949992a1937d9p-49 */
> +C18 = 1.4760610323699476e-16; /* 0x1.545b43aabfbcdp-53 */
> +
> +/*
> + * Domain [0.03125, 0.1659], range ~[-2.7676e-37, -1.0367e-38]:
> + * |(exp(x)-1-x-x**2/2)/x - p(x)| < 2**-121.44
> + */
> +static const long double
> +D3 = 1.66666666666666666666666666666682245e-1L,
> +D4 = 4.16666666666666666666666666634228324e-2L,
> +D5 = 8.33333333333333333333333364022244481e-3L,
> +D6 = 1.38888888888888888888887138722762072e-3L,
> +D7 = 1.98412698412698412699085805424661471e-4L,
> +D8 = 2.48015873015873015687993712101479612e-5L,
> +D9 = 2.75573192239858944101036288338208042e-6L,
> +D10 = 2.75573192239853161148064676533754048e-7L,
> +D11 = 2.50521083855084570046480450935267433e-8L,
> +D12 = 2.08767569819738524488686318024854942e-9L,
> +D13 = 1.60590442297008495301927448122499313e-10L;
> +
> +/*
> + * XXX this has 1 more coeff than needed.
> + * XXX can start the double coeffs but not the double mults at D11.
> + * With my coeffs (D11-D16 double):
> + * Domain [0.03125, 0.1659], range ~[-1.1980e-37, 1.1980e-37]:
> + * |(exp(x)-1-x-x**2/2)/x - p(x)| ~< 2**-122.65
> + */
> +static const double
> +D14 = 1.1470726176204336e-11, /* 0x1.93971dc395d9ep-37 */
> +D15 = 7.6478532249581686e-13, /* 0x1.ae892e3D16fcep-41 */
> +D16 = 4.7628892832607741e-14, /* 0x1.ad00Dfe41feccp-45 */
> +D17 = 3.0524857220358650e-15; /* 0x1.D7e8d886Df921p-49 */
> +
> +long double
> +expm1l(long double x)
> +{
> + union IEEEl2bits u, v;
> + long double hx2_hi, hx2_lo, q, r, r1, t, twomk, twopk, x_hi;
> + long double x_lo, x2;
> + double dr, dx, fn, r2;
> + int k, n, n2;
> + uint16_t hx, ix;
> +
> + DOPRINT_START(&x);
> +
> + /* Filter out exceptional cases. */
> + u.e = x;
> + hx = u.xbits.expsign;
> + ix = hx & 0x7fff;
> + if (ix >= BIAS + 7) { /* |x| >= 128 or x is NaN */
> + if (ix == BIAS + LDBL_MAX_EXP) {
> + if (hx & 0x8000) /* x is -Inf or -NaN */
> + RETURNP(-1 / x - 1);
> + RETURNP(x + x); /* x is +Inf or +NaN */
> + }
> + if (x > o_threshold)
> + RETURNP(huge * huge);
> + /*
> + * expm1l() never underflows, but it must avoid
> + * unrepresentable large negative exponents. We used a
> + * much smaller threshold for large |x| above than in
> + * expl() so as to handle not so large negative exponents
> + * in the same way as large ones here.
> + */
> + if (hx & 0x8000) /* x <= -128 */
> + RETURN2P(tiny, -1); /* good for x < -114ln2 - eps */
> + }
> +
> + ENTERI();
> +
> + if (T1 < x && x < T2) {
> + x2 = x * x;
> + dx = x;
> +
> + if (x < T3) {
> + if (ix < BIAS - 113) { /* |x| < 0x1p-113 */
> + /* x (rounded) with inexact if x != 0: */
> + RETURNPI(x == 0 ? x :
> + (0x1p200 * x + fabsl(x)) * 0x1p-200);
> + }
> + q = x * x2 * C3 + x2 * x2 * (C4 + x * (C5 + x * (C6 +
> + x * (C7 + x * (C8 + x * (C9 + x * (C10 +
> + x * (C11 + x * (C12 + x * (C13 +
> + dx * (C14 + dx * (C15 + dx * (C16 +
> + dx * (C17 + dx * C18))))))))))))));
> + } else {
> + q = x * x2 * D3 + x2 * x2 * (D4 + x * (D5 + x * (D6 +
> + x * (D7 + x * (D8 + x * (D9 + x * (D10 +
> + x * (D11 + x * (D12 + x * (D13 +
> + dx * (D14 + dx * (D15 + dx * (D16 +
> + dx * D17)))))))))))));
> + }
> +
> + x_hi = (float)x;
> + x_lo = x - x_hi;
> + hx2_hi = x_hi * x_hi / 2;
> + hx2_lo = x_lo * (x + x_hi) / 2;
> + if (ix >= BIAS - 7)
> + RETURN2PI(hx2_hi + x_hi, hx2_lo + x_lo + q);
> + else
> + RETURN2PI(x, hx2_lo + q + hx2_hi);
> + }
> +
> + /* Reduce x to (k*ln2 + endpoint[n2] + r1 + r2). */
> + fn = rnint((double)x * INV_L);
> + n = irint(fn);
> + n2 = (unsigned)n % INTERVALS;
> + k = n >> LOG2_INTERVALS;
> + r1 = x - fn * L1;
> + r2 = fn * -L2;
> + r = r1 + r2;
> +
> + /* Prepare scale factor. */
> + v.e = 1;
> + v.xbits.expsign = BIAS + k;
> + twopk = v.e;
> +
> + /*
> + * Evaluate lower terms of
> + * expl(endpoint[n2] + r1 + r2) = tbl[n2] * expl(r1 + r2).
> + */
> + dr = r;
> + q = r2 + r * r * (A2 + r * (A3 + r * (A4 + r * (A5 + r * (A6 +
> + dr * (A7 + dr * (A8 + dr * (A9 + dr * A10))))))));
> +
> + t = tbl[n2].lo + tbl[n2].hi;
> +
> + if (k == 0) {
> + t = SUM2P(tbl[n2].hi - 1, tbl[n2].lo * (r1 + 1) + t * q +
> + tbl[n2].hi * r1);
> + RETURNI(t);
> + }
> + if (k == -1) {
> + t = SUM2P(tbl[n2].hi - 2, tbl[n2].lo * (r1 + 1) + t * q +
> + tbl[n2].hi * r1);
> + RETURNI(t / 2);
> + }
> + if (k < -7) {
> + t = SUM2P(tbl[n2].hi, tbl[n2].lo + t * (q + r1));
> + RETURNI(t * twopk - 1);
> + }
> + if (k > 2 * LDBL_MANT_DIG - 1) {
> + t = SUM2P(tbl[n2].hi, tbl[n2].lo + t * (q + r1));
> + if (k == LDBL_MAX_EXP)
> + RETURNI(t * 2 * 0x1p16383L - 1);
> + RETURNI(t * twopk - 1);
> + }
> +
> + v.xbits.expsign = BIAS - k;
> + twomk = v.e;
> +
> + if (k > LDBL_MANT_DIG - 1)
> + t = SUM2P(tbl[n2].hi, tbl[n2].lo - twomk + t * (q + r1));
> + else
> + t = SUM2P(tbl[n2].hi - twomk, tbl[n2].lo + t * (q + r1));
> + RETURNI(t * twopk);
> +}
> diff --git a/newlib/libm/ld128/s_logl.c b/newlib/libm/ld128/s_logl.c
> new file mode 100644
> index 000000000..4774a271e
> --- /dev/null
> +++ b/newlib/libm/ld128/s_logl.c
> @@ -0,0 +1,740 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2007-2013 Bruce D. Evans
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice unmodified, this list of conditions, and the following
> + * disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
> + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
> + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
> + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
> + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
> + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
> + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/**
> + * Implementation of the natural logarithm of x for 128-bit format.
> + *
> + * First decompose x into its base 2 representation:
> + *
> + * log(x) = log(X * 2**k), where X is in [1, 2)
> + * = log(X) + k * log(2).
> + *
> + * Let X = X_i + e, where X_i is the center of one of the intervals
> + * [-1.0/256, 1.0/256), [1.0/256, 3.0/256), .... [2.0-1.0/256, 2.0+1.0/256)
> + * and X is in this interval. Then
> + *
> + * log(X) = log(X_i + e)
> + * = log(X_i * (1 + e / X_i))
> + * = log(X_i) + log(1 + e / X_i).
> + *
> + * The values log(X_i) are tabulated below. Let d = e / X_i and use
> + *
> + * log(1 + d) = p(d)
> + *
> + * where p(d) = d - 0.5*d*d + ... is a special minimax polynomial of
> + * suitably high degree.
> + *
> + * To get sufficiently small roundoff errors, k * log(2), log(X_i), and
> + * sometimes (if |k| is not large) the first term in p(d) must be evaluated
> + * and added up in extra precision. Extra precision is not needed for the
> + * rest of p(d). In the worst case when k = 0 and log(X_i) is 0, the final
> + * error is controlled mainly by the error in the second term in p(d). The
> + * error in this term itself is at most 0.5 ulps from the d*d operation in
> + * it. The error in this term relative to the first term is thus at most
> + * 0.5 * |-0.5| * |d| < 1.0/1024 ulps. We aim for an accumulated error of
> + * at most twice this at the point of the final rounding step. Thus the
> + * final error should be at most 0.5 + 1.0/512 = 0.5020 ulps. Exhaustive
> + * testing of a float variant of this function showed a maximum final error
> + * of 0.5008 ulps. Non-exhaustive testing of a double variant of this
> + * function showed a maximum final error of 0.5078 ulps (near 1+1.0/256).
> + *
> + * We made the maximum of |d| (and thus the total relative error and the
> + * degree of p(d)) small by using a large number of intervals. Using
> + * centers of intervals instead of endpoints reduces this maximum by a
> + * factor of 2 for a given number of intervals. p(d) is special only
> + * in beginning with the Taylor coefficients 0 + 1*d, which tends to happen
> + * naturally. The most accurate minimax polynomial of a given degree might
> + * be different, but then we wouldn't want it since we would have to do
> + * extra work to avoid roundoff error (especially for P0*d instead of d).
> + */
> +
> +#ifdef DEBUG
> +#include <assert.h>
> +#include <fenv.h>
> +#endif
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#ifndef NO_STRUCT_RETURN
> +#define STRUCT_RETURN
> +#endif
> +#include "math_private.h"
> +
> +#if !defined(NO_UTAB) && !defined(NO_UTABL)
> +#define USE_UTAB
> +#endif
> +
> +/*
> + * Domain [-0.005280, 0.004838], range ~[-1.1577e-37, 1.1582e-37]:
> + * |log(1 + d)/d - p(d)| < 2**-122.7
> + */
> +static const long double
> +P2 = -0.5L,
> +P3 = 3.33333333333333333333333333333233795e-1L, /* 0x15555555555555555555555554d42.0p-114L */
> +P4 = -2.49999999999999999999999999941139296e-1L, /* -0x1ffffffffffffffffffffffdab14e.0p-115L */
> +P5 = 2.00000000000000000000000085468039943e-1L, /* 0x19999999999999999999a6d3567f4.0p-115L */
> +P6 = -1.66666666666666666666696142372698408e-1L, /* -0x15555555555555555567267a58e13.0p-115L */
> +P7 = 1.42857142857142857119522943477166120e-1L, /* 0x1249249249249248ed79a0ae434de.0p-115L */
> +P8 = -1.24999999999999994863289015033581301e-1L; /* -0x1fffffffffffffa13e91765e46140.0p-116L */
> +/* Double precision gives ~ 53 + log2(P9 * max(|d|)**8) ~= 120 bits. */
> +static const double
> +P9 = 1.1111111111111401e-1, /* 0x1c71c71c71c7ed.0p-56 */
> +P10 = -1.0000000000040135e-1, /* -0x199999999a0a92.0p-56 */
> +P11 = 9.0909090728136258e-2, /* 0x1745d173962111.0p-56 */
> +P12 = -8.3333318851855284e-2, /* -0x1555551722c7a3.0p-56 */
> +P13 = 7.6928634666404178e-2, /* 0x13b1985204a4ae.0p-56 */
> +P14 = -7.1626810078462499e-2; /* -0x12562276cdc5d0.0p-56 */
> +
> +static volatile const double zero = 0;
> +
> +#define INTERVALS 128
> +#define LOG2_INTERVALS 7
> +#define TSIZE (INTERVALS + 1)
> +#define G(i) (T[(i)].G)
> +#define F_hi(i) (T[(i)].F_hi)
> +#define F_lo(i) (T[(i)].F_lo)
> +#define ln2_hi F_hi(TSIZE - 1)
> +#define ln2_lo F_lo(TSIZE - 1)
> +#define E(i) (U[(i)].E)
> +#define H(i) (U[(i)].H)
> +
> +static const struct {
> + float G; /* 1/(1 + i/128) rounded to 8/9 bits */
> + float F_hi; /* log(1 / G_i) rounded (see below) */
> + /* The compiler will insert 8 bytes of padding here. */
> + long double F_lo; /* next 113 bits for log(1 / G_i) */
> +} T[TSIZE] = {
> + /*
> + * ln2_hi and each F_hi(i) are rounded to a number of bits that
> + * makes F_hi(i) + dk*ln2_hi exact for all i and all dk.
> + *
> + * The last entry (for X just below 2) is used to define ln2_hi
> + * and ln2_lo, to ensure that F_hi(i) and F_lo(i) cancel exactly
> + * with dk*ln2_hi and dk*ln2_lo, respectively, when dk = -1.
> + * This is needed for accuracy when x is just below 1. (To avoid
> + * special cases, such x are "reduced" strangely to X just below
> + * 2 and dk = -1, and then the exact cancellation is needed
> + * because any the error from any non-exactness would be too
> + * large).
> + *
> + * The relevant range of dk is [-16445, 16383]. The maximum number
> + * of bits in F_hi(i) that works is very dependent on i but has
> + * a minimum of 93. We only need about 12 bits in F_hi(i) for
> + * it to provide enough extra precision.
> + *
> + * We round F_hi(i) to 24 bits so that it can have type float,
> + * mainly to minimize the size of the table. Using all 24 bits
> + * in a float for it automatically satisfies the above constraints.
> + */
> + 0x800000.0p-23, 0, 0,
> + 0xfe0000.0p-24, 0x8080ac.0p-30, -0x14ee431dae6674afa0c4bfe16e8fd.0p-144L,
> + 0xfc0000.0p-24, 0x8102b3.0p-29, -0x1db29ee2d83717be918e1119642ab.0p-144L,
> + 0xfa0000.0p-24, 0xc24929.0p-29, 0x1191957d173697cf302cc9476f561.0p-143L,
> + 0xf80000.0p-24, 0x820aec.0p-28, 0x13ce8888e02e78eba9b1113bc1c18.0p-142L,
> + 0xf60000.0p-24, 0xa33577.0p-28, -0x17a4382ce6eb7bfa509bec8da5f22.0p-142L,
> + 0xf48000.0p-24, 0xbc42cb.0p-28, -0x172a21161a107674986dcdca6709c.0p-143L,
> + 0xf30000.0p-24, 0xd57797.0p-28, -0x1e09de07cb958897a3ea46e84abb3.0p-142L,
> + 0xf10000.0p-24, 0xf7518e.0p-28, 0x1ae1eec1b036c484993c549c4bf40.0p-151L,
> + 0xef0000.0p-24, 0x8cb9df.0p-27, -0x1d7355325d560d9e9ab3d6ebab580.0p-141L,
> + 0xed8000.0p-24, 0x999ec0.0p-27, -0x1f9f02d256d5037108f4ec21e48cd.0p-142L,
> + 0xec0000.0p-24, 0xa6988b.0p-27, -0x16fc0a9d12c17a70f7a684c596b12.0p-143L,
> + 0xea0000.0p-24, 0xb80698.0p-27, 0x15d581c1e8da99ded322fb08b8462.0p-141L,
> + 0xe80000.0p-24, 0xc99af3.0p-27, -0x1535b3ba8f150ae09996d7bb4653e.0p-143L,
> + 0xe70000.0p-24, 0xd273b2.0p-27, 0x163786f5251aefe0ded34c8318f52.0p-145L,
> + 0xe50000.0p-24, 0xe442c0.0p-27, 0x1bc4b2368e32d56699c1799a244d4.0p-144L,
> + 0xe38000.0p-24, 0xf1b83f.0p-27, 0x1c6090f684e6766abceccab1d7174.0p-141L,
> + 0xe20000.0p-24, 0xff448a.0p-27, -0x1890aa69ac9f4215f93936b709efb.0p-142L,
> + 0xe08000.0p-24, 0x8673f6.0p-26, 0x1b9985194b6affd511b534b72a28e.0p-140L,
> + 0xdf0000.0p-24, 0x8d515c.0p-26, -0x1dc08d61c6ef1d9b2ef7e68680598.0p-143L,
> + 0xdd8000.0p-24, 0x943a9e.0p-26, -0x1f72a2dac729b3f46662238a9425a.0p-142L,
> + 0xdc0000.0p-24, 0x9b2fe6.0p-26, -0x1fd4dfd3a0afb9691aed4d5e3df94.0p-140L,
> + 0xda8000.0p-24, 0xa2315d.0p-26, -0x11b26121629c46c186384993e1c93.0p-142L,
> + 0xd90000.0p-24, 0xa93f2f.0p-26, 0x1286d633e8e5697dc6a402a56fce1.0p-141L,
> + 0xd78000.0p-24, 0xb05988.0p-26, 0x16128eba9367707ebfa540e45350c.0p-144L,
> + 0xd60000.0p-24, 0xb78094.0p-26, 0x16ead577390d31ef0f4c9d43f79b2.0p-140L,
> + 0xd50000.0p-24, 0xbc4c6c.0p-26, 0x151131ccf7c7b75e7d900b521c48d.0p-141L,
> + 0xd38000.0p-24, 0xc3890a.0p-26, -0x115e2cd714bd06508aeb00d2ae3e9.0p-140L,
> + 0xd20000.0p-24, 0xcad2d7.0p-26, -0x1847f406ebd3af80485c2f409633c.0p-142L,
> + 0xd10000.0p-24, 0xcfb620.0p-26, 0x1c2259904d686581799fbce0b5f19.0p-141L,
> + 0xcf8000.0p-24, 0xd71653.0p-26, 0x1ece57a8d5ae54f550444ecf8b995.0p-140L,
> + 0xce0000.0p-24, 0xde843a.0p-26, -0x1f109d4bc4595412b5d2517aaac13.0p-141L,
> + 0xcd0000.0p-24, 0xe37fde.0p-26, 0x1bc03dc271a74d3a85b5b43c0e727.0p-141L,
> + 0xcb8000.0p-24, 0xeb050c.0p-26, -0x1bf2badc0df841a71b79dd5645b46.0p-145L,
> + 0xca0000.0p-24, 0xf29878.0p-26, -0x18efededd89fbe0bcfbe6d6db9f66.0p-147L,
> + 0xc90000.0p-24, 0xf7ad6f.0p-26, 0x1373ff977baa6911c7bafcb4d84fb.0p-141L,
> + 0xc80000.0p-24, 0xfcc8e3.0p-26, 0x196766f2fb328337cc050c6d83b22.0p-140L,
> + 0xc68000.0p-24, 0x823f30.0p-25, 0x19bd076f7c434e5fcf1a212e2a91e.0p-139L,
> + 0xc58000.0p-24, 0x84d52c.0p-25, -0x1a327257af0f465e5ecab5f2a6f81.0p-139L,
> + 0xc40000.0p-24, 0x88bc74.0p-25, 0x113f23def19c5a0fe396f40f1dda9.0p-141L,
> + 0xc30000.0p-24, 0x8b5ae6.0p-25, 0x1759f6e6b37de945a049a962e66c6.0p-139L,
> + 0xc20000.0p-24, 0x8dfccb.0p-25, 0x1ad35ca6ed5147bdb6ddcaf59c425.0p-141L,
> + 0xc10000.0p-24, 0x90a22b.0p-25, 0x1a1d71a87deba46bae9827221dc98.0p-139L,
> + 0xbf8000.0p-24, 0x94a0d8.0p-25, -0x139e5210c2b730e28aba001a9b5e0.0p-140L,
> + 0xbe8000.0p-24, 0x974f16.0p-25, -0x18f6ebcff3ed72e23e13431adc4a5.0p-141L,
> + 0xbd8000.0p-24, 0x9a00f1.0p-25, -0x1aa268be39aab7148e8d80caa10b7.0p-139L,
> + 0xbc8000.0p-24, 0x9cb672.0p-25, -0x14c8815839c5663663d15faed7771.0p-139L,
> + 0xbb0000.0p-24, 0xa0cda1.0p-25, 0x1eaf46390dbb2438273918db7df5c.0p-141L,
> + 0xba0000.0p-24, 0xa38c6e.0p-25, 0x138e20d831f698298adddd7f32686.0p-141L,
> + 0xb90000.0p-24, 0xa64f05.0p-25, -0x1e8d3c41123615b147a5d47bc208f.0p-142L,
> + 0xb80000.0p-24, 0xa91570.0p-25, 0x1ce28f5f3840b263acb4351104631.0p-140L,
> + 0xb70000.0p-24, 0xabdfbb.0p-25, -0x186e5c0a42423457e22d8c650b355.0p-139L,
> + 0xb60000.0p-24, 0xaeadef.0p-25, -0x14d41a0b2a08a465dc513b13f567d.0p-143L,
> + 0xb50000.0p-24, 0xb18018.0p-25, 0x16755892770633947ffe651e7352f.0p-139L,
> + 0xb40000.0p-24, 0xb45642.0p-25, -0x16395ebe59b15228bfe8798d10ff0.0p-142L,
> + 0xb30000.0p-24, 0xb73077.0p-25, 0x1abc65c8595f088b61a335f5b688c.0p-140L,
> + 0xb20000.0p-24, 0xba0ec4.0p-25, -0x1273089d3dad88e7d353e9967d548.0p-139L,
> + 0xb10000.0p-24, 0xbcf133.0p-25, 0x10f9f67b1f4bbf45de06ecebfaf6d.0p-139L,
> + 0xb00000.0p-24, 0xbfd7d2.0p-25, -0x109fab904864092b34edda19a831e.0p-140L,
> + 0xaf0000.0p-24, 0xc2c2ac.0p-25, -0x1124680aa43333221d8a9b475a6ba.0p-139L,
> + 0xae8000.0p-24, 0xc439b3.0p-25, -0x1f360cc4710fbfe24b633f4e8d84d.0p-140L,
> + 0xad8000.0p-24, 0xc72afd.0p-25, -0x132d91f21d89c89c45003fc5d7807.0p-140L,
> + 0xac8000.0p-24, 0xca20a2.0p-25, -0x16bf9b4d1f8da8002f2449e174504.0p-139L,
> + 0xab8000.0p-24, 0xcd1aae.0p-25, 0x19deb5ce6a6a8717d5626e16acc7d.0p-141L,
> + 0xaa8000.0p-24, 0xd0192f.0p-25, 0x1a29fb48f7d3ca87dabf351aa41f4.0p-139L,
> + 0xaa0000.0p-24, 0xd19a20.0p-25, 0x1127d3c6457f9d79f51dcc73014c9.0p-141L,
> + 0xa90000.0p-24, 0xd49f6a.0p-25, -0x1ba930e486a0ac42d1bf9199188e7.0p-141L,
> + 0xa80000.0p-24, 0xd7a94b.0p-25, -0x1b6e645f31549dd1160bcc45c7e2c.0p-139L,
> + 0xa70000.0p-24, 0xdab7d0.0p-25, 0x1118a425494b610665377f15625b6.0p-140L,
> + 0xa68000.0p-24, 0xdc40d5.0p-25, 0x1966f24d29d3a2d1b2176010478be.0p-140L,
> + 0xa58000.0p-24, 0xdf566d.0p-25, -0x1d8e52eb2248f0c95dd83626d7333.0p-142L,
> + 0xa48000.0p-24, 0xe270ce.0p-25, -0x1ee370f96e6b67ccb006a5b9890ea.0p-140L,
> + 0xa40000.0p-24, 0xe3ffce.0p-25, 0x1d155324911f56db28da4d629d00a.0p-140L,
> + 0xa30000.0p-24, 0xe72179.0p-25, -0x1fe6e2f2f867d8f4d60c713346641.0p-140L,
> + 0xa20000.0p-24, 0xea4812.0p-25, 0x1b7be9add7f4d3b3d406b6cbf3ce5.0p-140L,
> + 0xa18000.0p-24, 0xebdd3d.0p-25, 0x1b3cfb3f7511dd73692609040ccc2.0p-139L,
> + 0xa08000.0p-24, 0xef0b5b.0p-25, -0x1220de1f7301901b8ad85c25afd09.0p-139L,
> + 0xa00000.0p-24, 0xf0a451.0p-25, -0x176364c9ac81cc8a4dfb804de6867.0p-140L,
> + 0x9f0000.0p-24, 0xf3da16.0p-25, 0x1eed6b9aafac8d42f78d3e65d3727.0p-141L,
> + 0x9e8000.0p-24, 0xf576e9.0p-25, 0x1d593218675af269647b783d88999.0p-139L,
> + 0x9d8000.0p-24, 0xf8b47c.0p-25, -0x13e8eb7da053e063714615f7cc91d.0p-144L,
> + 0x9d0000.0p-24, 0xfa553f.0p-25, 0x1c063259bcade02951686d5373aec.0p-139L,
> + 0x9c0000.0p-24, 0xfd9ac5.0p-25, 0x1ef491085fa3c1649349630531502.0p-139L,
> + 0x9b8000.0p-24, 0xff3f8c.0p-25, 0x1d607a7c2b8c5320619fb9433d841.0p-139L,
> + 0x9a8000.0p-24, 0x814697.0p-24, -0x12ad3817004f3f0bdff99f932b273.0p-138L,
> + 0x9a0000.0p-24, 0x821b06.0p-24, -0x189fc53117f9e54e78103a2bc1767.0p-141L,
> + 0x990000.0p-24, 0x83c5f8.0p-24, 0x14cf15a048907b7d7f47ddb45c5a3.0p-139L,
> + 0x988000.0p-24, 0x849c7d.0p-24, 0x1cbb1d35fb82873b04a9af1dd692c.0p-138L,
> + 0x978000.0p-24, 0x864ba6.0p-24, 0x1128639b814f9b9770d8cb6573540.0p-138L,
> + 0x970000.0p-24, 0x87244c.0p-24, 0x184733853300f002e836dfd47bd41.0p-139L,
> + 0x968000.0p-24, 0x87fdaa.0p-24, 0x109d23aef77dd5cd7cc94306fb3ff.0p-140L,
> + 0x958000.0p-24, 0x89b293.0p-24, -0x1a81ef367a59de2b41eeebd550702.0p-138L,
> + 0x950000.0p-24, 0x8a8e20.0p-24, -0x121ad3dbb2f45275c917a30df4ac9.0p-138L,
> + 0x948000.0p-24, 0x8b6a6a.0p-24, -0x1cfb981628af71a89df4e6df2e93b.0p-139L,
> + 0x938000.0p-24, 0x8d253a.0p-24, -0x1d21730ea76cfdec367828734cae5.0p-139L,
> + 0x930000.0p-24, 0x8e03c2.0p-24, 0x135cc00e566f76b87333891e0dec4.0p-138L,
> + 0x928000.0p-24, 0x8ee30d.0p-24, -0x10fcb5df257a263e3bf446c6e3f69.0p-140L,
> + 0x918000.0p-24, 0x90a3ee.0p-24, -0x16e171b15433d723a4c7380a448d8.0p-139L,
> + 0x910000.0p-24, 0x918587.0p-24, -0x1d050da07f3236f330972da2a7a87.0p-139L,
> + 0x908000.0p-24, 0x9267e7.0p-24, 0x1be03669a5268d21148c6002becd3.0p-139L,
> + 0x8f8000.0p-24, 0x942f04.0p-24, 0x10b28e0e26c336af90e00533323ba.0p-139L,
> + 0x8f0000.0p-24, 0x9513c3.0p-24, 0x1a1d820da57cf2f105a89060046aa.0p-138L,
> + 0x8e8000.0p-24, 0x95f950.0p-24, -0x19ef8f13ae3cf162409d8ea99d4c0.0p-139L,
> + 0x8e0000.0p-24, 0x96dfab.0p-24, -0x109e417a6e507b9dc10dac743ad7a.0p-138L,
> + 0x8d0000.0p-24, 0x98aed2.0p-24, 0x10d01a2c5b0e97c4990b23d9ac1f5.0p-139L,
> + 0x8c8000.0p-24, 0x9997a2.0p-24, -0x1d6a50d4b61ea74540bdd2aa99a42.0p-138L,
> + 0x8c0000.0p-24, 0x9a8145.0p-24, 0x1b3b190b83f9527e6aba8f2d783c1.0p-138L,
> + 0x8b8000.0p-24, 0x9b6bbf.0p-24, 0x13a69fad7e7abe7ba81c664c107e0.0p-138L,
> + 0x8b0000.0p-24, 0x9c5711.0p-24, -0x11cd12316f576aad348ae79867223.0p-138L,
> + 0x8a8000.0p-24, 0x9d433b.0p-24, 0x1c95c444b807a246726b304ccae56.0p-139L,
> + 0x898000.0p-24, 0x9f1e22.0p-24, -0x1b9c224ea698c2f9b47466d6123fe.0p-139L,
> + 0x890000.0p-24, 0xa00ce1.0p-24, 0x125ca93186cf0f38b4619a2483399.0p-141L,
> + 0x888000.0p-24, 0xa0fc80.0p-24, -0x1ee38a7bc228b3597043be78eaf49.0p-139L,
> + 0x880000.0p-24, 0xa1ed00.0p-24, -0x1a0db876613d204147dc69a07a649.0p-138L,
> + 0x878000.0p-24, 0xa2de62.0p-24, 0x193224e8516c008d3602a7b41c6e8.0p-139L,
> + 0x870000.0p-24, 0xa3d0a9.0p-24, 0x1fa28b4d2541aca7d5844606b2421.0p-139L,
> + 0x868000.0p-24, 0xa4c3d6.0p-24, 0x1c1b5760fb4571acbcfb03f16daf4.0p-138L,
> + 0x858000.0p-24, 0xa6acea.0p-24, 0x1fed5d0f65949c0a345ad743ae1ae.0p-140L,
> + 0x850000.0p-24, 0xa7a2d4.0p-24, 0x1ad270c9d749362382a7688479e24.0p-140L,
> + 0x848000.0p-24, 0xa899ab.0p-24, 0x199ff15ce532661ea9643a3a2d378.0p-139L,
> + 0x840000.0p-24, 0xa99171.0p-24, 0x1a19e15ccc45d257530a682b80490.0p-139L,
> + 0x838000.0p-24, 0xaa8a28.0p-24, -0x121a14ec532b35ba3e1f868fd0b5e.0p-140L,
> + 0x830000.0p-24, 0xab83d1.0p-24, 0x1aee319980bff3303dd481779df69.0p-139L,
> + 0x828000.0p-24, 0xac7e6f.0p-24, -0x18ffd9e3900345a85d2d86161742e.0p-140L,
> + 0x820000.0p-24, 0xad7a03.0p-24, -0x1e4db102ce29f79b026b64b42caa1.0p-140L,
> + 0x818000.0p-24, 0xae768f.0p-24, 0x17c35c55a04a82ab19f77652d977a.0p-141L,
> + 0x810000.0p-24, 0xaf7415.0p-24, 0x1448324047019b48d7b98c1cf7234.0p-138L,
> + 0x808000.0p-24, 0xb07298.0p-24, -0x1750ee3915a197e9c7359dd94152f.0p-138L,
> + 0x800000.0p-24, 0xb17218.0p-24, -0x105c610ca86c3898cff81a12a17e2.0p-141L,
> +};
> +
> +#ifdef USE_UTAB
> +static const struct {
> + float H; /* 1 + i/INTERVALS (exact) */
> + float E; /* H(i) * G(i) - 1 (exact) */
> +} U[TSIZE] = {
> + 0x800000.0p-23, 0,
> + 0x810000.0p-23, -0x800000.0p-37,
> + 0x820000.0p-23, -0x800000.0p-35,
> + 0x830000.0p-23, -0x900000.0p-34,
> + 0x840000.0p-23, -0x800000.0p-33,
> + 0x850000.0p-23, -0xc80000.0p-33,
> + 0x860000.0p-23, -0xa00000.0p-36,
> + 0x870000.0p-23, 0x940000.0p-33,
> + 0x880000.0p-23, 0x800000.0p-35,
> + 0x890000.0p-23, -0xc80000.0p-34,
> + 0x8a0000.0p-23, 0xe00000.0p-36,
> + 0x8b0000.0p-23, 0x900000.0p-33,
> + 0x8c0000.0p-23, -0x800000.0p-35,
> + 0x8d0000.0p-23, -0xe00000.0p-33,
> + 0x8e0000.0p-23, 0x880000.0p-33,
> + 0x8f0000.0p-23, -0xa80000.0p-34,
> + 0x900000.0p-23, -0x800000.0p-35,
> + 0x910000.0p-23, 0x800000.0p-37,
> + 0x920000.0p-23, 0x900000.0p-35,
> + 0x930000.0p-23, 0xd00000.0p-35,
> + 0x940000.0p-23, 0xe00000.0p-35,
> + 0x950000.0p-23, 0xc00000.0p-35,
> + 0x960000.0p-23, 0xe00000.0p-36,
> + 0x970000.0p-23, -0x800000.0p-38,
> + 0x980000.0p-23, -0xc00000.0p-35,
> + 0x990000.0p-23, -0xd00000.0p-34,
> + 0x9a0000.0p-23, 0x880000.0p-33,
> + 0x9b0000.0p-23, 0xe80000.0p-35,
> + 0x9c0000.0p-23, -0x800000.0p-35,
> + 0x9d0000.0p-23, 0xb40000.0p-33,
> + 0x9e0000.0p-23, 0x880000.0p-34,
> + 0x9f0000.0p-23, -0xe00000.0p-35,
> + 0xa00000.0p-23, 0x800000.0p-33,
> + 0xa10000.0p-23, -0x900000.0p-36,
> + 0xa20000.0p-23, -0xb00000.0p-33,
> + 0xa30000.0p-23, -0xa00000.0p-36,
> + 0xa40000.0p-23, 0x800000.0p-33,
> + 0xa50000.0p-23, -0xf80000.0p-35,
> + 0xa60000.0p-23, 0x880000.0p-34,
> + 0xa70000.0p-23, -0x900000.0p-33,
> + 0xa80000.0p-23, -0x800000.0p-35,
> + 0xa90000.0p-23, 0x900000.0p-34,
> + 0xaa0000.0p-23, 0xa80000.0p-33,
> + 0xab0000.0p-23, -0xac0000.0p-34,
> + 0xac0000.0p-23, -0x800000.0p-37,
> + 0xad0000.0p-23, 0xf80000.0p-35,
> + 0xae0000.0p-23, 0xf80000.0p-34,
> + 0xaf0000.0p-23, -0xac0000.0p-33,
> + 0xb00000.0p-23, -0x800000.0p-33,
> + 0xb10000.0p-23, -0xb80000.0p-34,
> + 0xb20000.0p-23, -0x800000.0p-34,
> + 0xb30000.0p-23, -0xb00000.0p-35,
> + 0xb40000.0p-23, -0x800000.0p-35,
> + 0xb50000.0p-23, -0xe00000.0p-36,
> + 0xb60000.0p-23, -0x800000.0p-35,
> + 0xb70000.0p-23, -0xb00000.0p-35,
> + 0xb80000.0p-23, -0x800000.0p-34,
> + 0xb90000.0p-23, -0xb80000.0p-34,
> + 0xba0000.0p-23, -0x800000.0p-33,
> + 0xbb0000.0p-23, -0xac0000.0p-33,
> + 0xbc0000.0p-23, 0x980000.0p-33,
> + 0xbd0000.0p-23, 0xbc0000.0p-34,
> + 0xbe0000.0p-23, 0xe00000.0p-36,
> + 0xbf0000.0p-23, -0xb80000.0p-35,
> + 0xc00000.0p-23, -0x800000.0p-33,
> + 0xc10000.0p-23, 0xa80000.0p-33,
> + 0xc20000.0p-23, 0x900000.0p-34,
> + 0xc30000.0p-23, -0x800000.0p-35,
> + 0xc40000.0p-23, -0x900000.0p-33,
> + 0xc50000.0p-23, 0x820000.0p-33,
> + 0xc60000.0p-23, 0x800000.0p-38,
> + 0xc70000.0p-23, -0x820000.0p-33,
> + 0xc80000.0p-23, 0x800000.0p-33,
> + 0xc90000.0p-23, -0xa00000.0p-36,
> + 0xca0000.0p-23, -0xb00000.0p-33,
> + 0xcb0000.0p-23, 0x840000.0p-34,
> + 0xcc0000.0p-23, -0xd00000.0p-34,
> + 0xcd0000.0p-23, 0x800000.0p-33,
> + 0xce0000.0p-23, -0xe00000.0p-35,
> + 0xcf0000.0p-23, 0xa60000.0p-33,
> + 0xd00000.0p-23, -0x800000.0p-35,
> + 0xd10000.0p-23, 0xb40000.0p-33,
> + 0xd20000.0p-23, -0x800000.0p-35,
> + 0xd30000.0p-23, 0xaa0000.0p-33,
> + 0xd40000.0p-23, -0xe00000.0p-35,
> + 0xd50000.0p-23, 0x880000.0p-33,
> + 0xd60000.0p-23, -0xd00000.0p-34,
> + 0xd70000.0p-23, 0x9c0000.0p-34,
> + 0xd80000.0p-23, -0xb00000.0p-33,
> + 0xd90000.0p-23, -0x800000.0p-38,
> + 0xda0000.0p-23, 0xa40000.0p-33,
> + 0xdb0000.0p-23, -0xdc0000.0p-34,
> + 0xdc0000.0p-23, 0xc00000.0p-35,
> + 0xdd0000.0p-23, 0xca0000.0p-33,
> + 0xde0000.0p-23, -0xb80000.0p-34,
> + 0xdf0000.0p-23, 0xd00000.0p-35,
> + 0xe00000.0p-23, 0xc00000.0p-33,
> + 0xe10000.0p-23, -0xf40000.0p-34,
> + 0xe20000.0p-23, 0x800000.0p-37,
> + 0xe30000.0p-23, 0x860000.0p-33,
> + 0xe40000.0p-23, -0xc80000.0p-33,
> + 0xe50000.0p-23, -0xa80000.0p-34,
> + 0xe60000.0p-23, 0xe00000.0p-36,
> + 0xe70000.0p-23, 0x880000.0p-33,
> + 0xe80000.0p-23, -0xe00000.0p-33,
> + 0xe90000.0p-23, -0xfc0000.0p-34,
> + 0xea0000.0p-23, -0x800000.0p-35,
> + 0xeb0000.0p-23, 0xe80000.0p-35,
> + 0xec0000.0p-23, 0x900000.0p-33,
> + 0xed0000.0p-23, 0xe20000.0p-33,
> + 0xee0000.0p-23, -0xac0000.0p-33,
> + 0xef0000.0p-23, -0xc80000.0p-34,
> + 0xf00000.0p-23, -0x800000.0p-35,
> + 0xf10000.0p-23, 0x800000.0p-35,
> + 0xf20000.0p-23, 0xb80000.0p-34,
> + 0xf30000.0p-23, 0x940000.0p-33,
> + 0xf40000.0p-23, 0xc80000.0p-33,
> + 0xf50000.0p-23, -0xf20000.0p-33,
> + 0xf60000.0p-23, -0xc80000.0p-33,
> + 0xf70000.0p-23, -0xa20000.0p-33,
> + 0xf80000.0p-23, -0x800000.0p-33,
> + 0xf90000.0p-23, -0xc40000.0p-34,
> + 0xfa0000.0p-23, -0x900000.0p-34,
> + 0xfb0000.0p-23, -0xc80000.0p-35,
> + 0xfc0000.0p-23, -0x800000.0p-35,
> + 0xfd0000.0p-23, -0x900000.0p-36,
> + 0xfe0000.0p-23, -0x800000.0p-37,
> + 0xff0000.0p-23, -0x800000.0p-39,
> + 0x800000.0p-22, 0,
> +};
> +#endif /* USE_UTAB */
> +
> +#ifdef STRUCT_RETURN
> +#define RETURN1(rp, v) do { \
> + (rp)->hi = (v); \
> + (rp)->lo_set = 0; \
> + return; \
> +} while (0)
> +
> +#define RETURN2(rp, h, l) do { \
> + (rp)->hi = (h); \
> + (rp)->lo = (l); \
> + (rp)->lo_set = 1; \
> + return; \
> +} while (0)
> +
> +struct ld {
> + long double hi;
> + long double lo;
> + int lo_set;
> +};
> +#else
> +#define RETURN1(rp, v) RETURNF(v)
> +#define RETURN2(rp, h, l) RETURNI((h) + (l))
> +#endif
> +
> +#ifdef STRUCT_RETURN
> +static inline __always_inline void
> +k_logl(long double x, struct ld *rp)
> +#else
> +long double
> +logl(long double x)
> +#endif
> +{
> + long double d, val_hi, val_lo;
> + double dd, dk;
> + uint64_t lx, llx;
> + int i, k;
> + uint16_t hx;
> +
> + EXTRACT_LDBL128_WORDS(hx, lx, llx, x);
> + k = -16383;
> +#if 0 /* Hard to do efficiently. Don't do it until we support all modes. */
> + if (x == 1)
> + RETURN1(rp, 0); /* log(1) = +0 in all rounding modes */
> +#endif
> + if (hx == 0 || hx >= 0x8000) { /* zero, negative or subnormal? */
> + if (((hx & 0x7fff) | lx | llx) == 0)
> + RETURN1(rp, -1 / zero); /* log(+-0) = -Inf */
> + if (hx != 0)
> + /* log(neg or NaN) = qNaN: */
> + RETURN1(rp, (x - x) / zero);
> + x *= 0x1.0p113; /* subnormal; scale up x */
> + EXTRACT_LDBL128_WORDS(hx, lx, llx, x);
> + k = -16383 - 113;
> + } else if (hx >= 0x7fff)
> + RETURN1(rp, x + x); /* log(Inf or NaN) = Inf or qNaN */
> +#ifndef STRUCT_RETURN
> + ENTERI();
> +#endif
> + k += hx;
> + dk = k;
> +
> + /* Scale x to be in [1, 2). */
> + SET_LDBL_EXPSIGN(x, 0x3fff);
> +
> + /* 0 <= i <= INTERVALS: */
> +#define L2I (49 - LOG2_INTERVALS)
> + i = (lx + (1LL << (L2I - 2))) >> (L2I - 1);
> +
> + /*
> + * -0.005280 < d < 0.004838. In particular, the infinite-
> + * precision |d| is <= 2**-7. Rounding of G(i) to 8 bits
> + * ensures that d is representable without extra precision for
> + * this bound on |d| (since when this calculation is expressed
> + * as x*G(i)-1, the multiplication needs as many extra bits as
> + * G(i) has and the subtraction cancels 8 bits). But for
> + * most i (107 cases out of 129), the infinite-precision |d|
> + * is <= 2**-8. G(i) is rounded to 9 bits for such i to give
> + * better accuracy (this works by improving the bound on |d|,
> + * which in turn allows rounding to 9 bits in more cases).
> + * This is only important when the original x is near 1 -- it
> + * lets us avoid using a special method to give the desired
> + * accuracy for such x.
> + */
> + if (0)
> + d = x * G(i) - 1;
> + else {
> +#ifdef USE_UTAB
> + d = (x - H(i)) * G(i) + E(i);
> +#else
> + long double x_hi;
> + double x_lo;
> +
> + /*
> + * Split x into x_hi + x_lo to calculate x*G(i)-1 exactly.
> + * G(i) has at most 9 bits, so the splitting point is not
> + * critical.
> + */
> + INSERT_LDBL128_WORDS(x_hi, 0x3fff, lx,
> + llx & 0xffffffffff000000ULL);
> + x_lo = x - x_hi;
> + d = x_hi * G(i) - 1 + x_lo * G(i);
> +#endif
> + }
> +
> + /*
> + * Our algorithm depends on exact cancellation of F_lo(i) and
> + * F_hi(i) with dk*ln_2_lo and dk*ln2_hi when k is -1 and i is
> + * at the end of the table. This and other technical complications
> + * make it difficult to avoid the double scaling in (dk*ln2) *
> + * log(base) for base != e without losing more accuracy and/or
> + * efficiency than is gained.
> + */
> + /*
> + * Use double precision operations wherever possible, since
> + * long double operations are emulated and were very slow on
> + * the old sparc64 and unknown on the newer aarch64 and riscv
> + * machines. Also, don't try to improve parallelism by
> + * increasing the number of operations, since any parallelism
> + * on such machines is needed for the emulation. Horner's
> + * method is good for this, and is also good for accuracy.
> + * Horner's method doesn't handle the `lo' term well, either
> + * for efficiency or accuracy. However, for accuracy we
> + * evaluate d * d * P2 separately to take advantage of by P2
> + * being exact, and this gives a good place to sum the 'lo'
> + * term too.
> + */
> + dd = (double)d;
> + val_lo = d * d * d * (P3 +
> + d * (P4 + d * (P5 + d * (P6 + d * (P7 + d * (P8 +
> + dd * (P9 + dd * (P10 + dd * (P11 + dd * (P12 + dd * (P13 +
> + dd * P14))))))))))) + (F_lo(i) + dk * ln2_lo) + d * d * P2;
> + val_hi = d;
> +#ifdef DEBUG
> + if (fetestexcept(FE_UNDERFLOW))
> + breakpoint();
> +#endif
> +
> + _3sumF(val_hi, val_lo, F_hi(i) + dk * ln2_hi);
> + RETURN2(rp, val_hi, val_lo);
> +}
> +
> +long double
> +log1pl(long double x)
> +{
> + long double d, d_hi, f_lo, val_hi, val_lo;
> + long double f_hi, twopminusk;
> + double d_lo, dd, dk;
> + uint64_t lx, llx;
> + int i, k;
> + int16_t ax, hx;
> +
> + DOPRINT_START(&x);
> + EXTRACT_LDBL128_WORDS(hx, lx, llx, x);
> + if (hx < 0x3fff) { /* x < 1, or x neg NaN */
> + ax = hx & 0x7fff;
> + if (ax >= 0x3fff) { /* x <= -1, or x neg NaN */
> + if (ax == 0x3fff && (lx | llx) == 0)
> + RETURNP(-1 / zero); /* log1p(-1) = -Inf */
> + /* log1p(x < 1, or x NaN) = qNaN: */
> + RETURNP((x - x) / (x - x));
> + }
> + if (ax <= 0x3f8d) { /* |x| < 2**-113 */
> + if ((int)x == 0)
> + RETURNP(x); /* x with inexact if x != 0 */
> + }
> + f_hi = 1;
> + f_lo = x;
> + } else if (hx >= 0x7fff) { /* x +Inf or non-neg NaN */
> + RETURNP(x + x); /* log1p(Inf or NaN) = Inf or qNaN */
> + } else if (hx < 0x40e1) { /* 1 <= x < 2**226 */
> + f_hi = x;
> + f_lo = 1;
> + } else { /* 2**226 <= x < +Inf */
> + f_hi = x;
> + f_lo = 0; /* avoid underflow of the P3 term */
> + }
> + ENTERI();
> + x = f_hi + f_lo;
> + f_lo = (f_hi - x) + f_lo;
> +
> + EXTRACT_LDBL128_WORDS(hx, lx, llx, x);
> + k = -16383;
> +
> + k += hx;
> + dk = k;
> +
> + SET_LDBL_EXPSIGN(x, 0x3fff);
> + twopminusk = 1;
> + SET_LDBL_EXPSIGN(twopminusk, 0x7ffe - (hx & 0x7fff));
> + f_lo *= twopminusk;
> +
> + i = (lx + (1LL << (L2I - 2))) >> (L2I - 1);
> +
> + /*
> + * x*G(i)-1 (with a reduced x) can be represented exactly, as
> + * above, but now we need to evaluate the polynomial on d =
> + * (x+f_lo)*G(i)-1 and extra precision is needed for that.
> + * Since x+x_lo is a hi+lo decomposition and subtracting 1
> + * doesn't lose too many bits, an inexact calculation for
> + * f_lo*G(i) is good enough.
> + */
> + if (0)
> + d_hi = x * G(i) - 1;
> + else {
> +#ifdef USE_UTAB
> + d_hi = (x - H(i)) * G(i) + E(i);
> +#else
> + long double x_hi;
> + double x_lo;
> +
> + INSERT_LDBL128_WORDS(x_hi, 0x3fff, lx,
> + llx & 0xffffffffff000000ULL);
> + x_lo = x - x_hi;
> + d_hi = x_hi * G(i) - 1 + x_lo * G(i);
> +#endif
> + }
> + d_lo = f_lo * G(i);
> +
> + /*
> + * This is _2sumF(d_hi, d_lo) inlined. The condition
> + * (d_hi == 0 || |d_hi| >= |d_lo|) for using _2sumF() is not
> + * always satisifed, so it is not clear that this works, but
> + * it works in practice. It works even if it gives a wrong
> + * normalized d_lo, since |d_lo| > |d_hi| implies that i is
> + * nonzero and d is tiny, so the F(i) term dominates d_lo.
> + * In float precision:
> + * (By exhaustive testing, the worst case is d_hi = 0x1.bp-25.
> + * And if d is only a little tinier than that, we would have
> + * another underflow problem for the P3 term; this is also ruled
> + * out by exhaustive testing.)
> + */
> + d = d_hi + d_lo;
> + d_lo = d_hi - d + d_lo;
> + d_hi = d;
> +
> + dd = (double)d;
> + val_lo = d * d * d * (P3 +
> + d * (P4 + d * (P5 + d * (P6 + d * (P7 + d * (P8 +
> + dd * (P9 + dd * (P10 + dd * (P11 + dd * (P12 + dd * (P13 +
> + dd * P14))))))))))) + (F_lo(i) + dk * ln2_lo + d_lo) + d * d * P2;
> + val_hi = d_hi;
> +#ifdef DEBUG
> + if (fetestexcept(FE_UNDERFLOW))
> + breakpoint();
> +#endif
> +
> + _3sumF(val_hi, val_lo, F_hi(i) + dk * ln2_hi);
> + RETURN2PI(val_hi, val_lo);
> +}
> +
> +#ifdef STRUCT_RETURN
> +
> +long double
> +logl(long double x)
> +{
> + struct ld r;
> +
> + ENTERI();
> + DOPRINT_START(&x);
> + k_logl(x, &r);
> + RETURNSPI(&r);
> +}
> +
> +/*
> + * 29+113 bit decompositions. The bits are distributed so that the products
> + * of the hi terms are exact in double precision. The types are chosen so
> + * that the products of the hi terms are done in at least double precision,
> + * without any explicit conversions. More natural choices would require a
> + * slow long double precision multiplication.
> + */
> +static const double
> +invln10_hi = 4.3429448176175356e-1, /* 0x1bcb7b15000000.0p-54 */
> +invln2_hi = 1.4426950402557850e0; /* 0x17154765000000.0p-52 */
> +static const long double
> +invln10_lo = 1.41498268538580090791605082294397000e-10L, /* 0x137287195355baaafad33dc323ee3.0p-145L */
> +invln2_lo = 6.33178418956604368501892137426645911e-10L, /* 0x15c17f0bbbe87fed0691d3e88eb57.0p-143L */
> +invln10_lo_plus_hi = invln10_lo + invln10_hi,
> +invln2_lo_plus_hi = invln2_lo + invln2_hi;
> +
> +long double
> +log10l(long double x)
> +{
> + struct ld r;
> + long double hi, lo;
> +
> + ENTERI();
> + DOPRINT_START(&x);
> + k_logl(x, &r);
> + if (!r.lo_set)
> + RETURNPI(r.hi);
> + _2sumF(r.hi, r.lo);
> + hi = (float)r.hi;
> + lo = r.lo + (r.hi - hi);
> + RETURN2PI(invln10_hi * hi,
> + invln10_lo_plus_hi * lo + invln10_lo * hi);
> +}
> +
> +long double
> +log2l(long double x)
> +{
> + struct ld r;
> + long double hi, lo;
> +
> + ENTERI();
> + DOPRINT_START(&x);
> + k_logl(x, &r);
> + if (!r.lo_set)
> + RETURNPI(r.hi);
> + _2sumF(r.hi, r.lo);
> + hi = (float)r.hi;
> + lo = r.lo + (r.hi - hi);
> + RETURN2PI(invln2_hi * hi,
> + invln2_lo_plus_hi * lo + invln2_lo * hi);
> +}
> +
> +#endif /* STRUCT_RETURN */
> diff --git a/newlib/libm/ld80/b_expl.c b/newlib/libm/ld80/b_expl.c
> new file mode 100644
> index 000000000..21bacf449
> --- /dev/null
> +++ b/newlib/libm/ld80/b_expl.c
> @@ -0,0 +1,113 @@
> +/*-
> + * SPDX-License-Identifier: BSD-3-Clause
> + *
> + * Copyright (c) 1985, 1993
> + * The Regents of the University of California. All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + * 3. Neither the name of the University nor the names of its contributors
> + * may be used to endorse or promote products derived from this software
> + * without specific prior written permission.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + */
> +
> +/*
> + * See bsdsrc/b_exp.c for implementation details.
> + *
> + * bsdrc/b_exp.c converted to long double by Steven G. Kargl.
> + */
> +
> +#include "fpmath.h"
> +#include "math_private.h"
> +
> +static const union IEEEl2bits
> + p0u = LD80C(0xaaaaaaaaaaaaaaab, -3, 1.66666666666666666671e-01L),
> + p1u = LD80C(0xb60b60b60b60b59a, -9, -2.77777777777777775377e-03L),
> + p2u = LD80C(0x8ab355e008a3cfce, -14, 6.61375661375629297465e-05L),
> + p3u = LD80C(0xddebbc994b0c1376, -20, -1.65343915327882529784e-06L),
> + p4u = LD80C(0xb354784cb4ef4c41, -25, 4.17535101591534118469e-08L),
> + p5u = LD80C(0x913e8a718382ce75, -30, -1.05679137034774806475e-09L),
> + p6u = LD80C(0xe8f0042aa134502e, -36, 2.64819349895429516863e-11L);
> +#define p1 (p0u.e)
> +#define p2 (p1u.e)
> +#define p3 (p2u.e)
> +#define p4 (p3u.e)
> +#define p5 (p4u.e)
> +#define p6 (p5u.e)
> +#define p7 (p6u.e)
> +
> +/*
> + * lnhuge = (LDBL_MAX_EXP + 9) * log(2.)
> + * lntiny = (LDBL_MIN_EXP - 64 - 10) * log(2.)
> + * invln2 = 1 / log(2.)
> + */
> +static const union IEEEl2bits
> +ln2hiu = LD80C(0xb17217f700000000, -1, 6.93147180369123816490e-01L),
> +ln2lou = LD80C(0xd1cf79abc9e3b398, -33, 1.90821492927058781614e-10L),
> +lnhugeu = LD80C(0xb18b0c0330a8fad9, 13, 1.13627617309191834574e+04L),
> +lntinyu = LD80C(0xb236f28a68bc3bd7, 13, -1.14057368561139000667e+04L),
> +invln2u = LD80C(0xb8aa3b295c17f0bc, 0, 1.44269504088896340739e+00L);
> +#define ln2hi (ln2hiu.e)
> +#define ln2lo (ln2lou.e)
> +#define lnhuge (lnhugeu.e)
> +#define lntiny (lntinyu.e)
> +#define invln2 (invln2u.e)
> +
> +/* returns exp(r = x + c) for |c| < |x| with no overlap. */
> +
> +static long double
> +__exp__D(long double x, long double c)
> +{
> + long double hi, lo, z;
> + int k;
> +
> + if (x != x) /* x is NaN. */
> + return(x);
> +
> + if (x <= lnhuge) {
> + if (x >= lntiny) {
> + /* argument reduction: x --> x - k*ln2 */
> + z = invln2 * x;
> + k = z + copysignl(0.5L, x);
> +
> + /*
> + * Express (x + c) - k * ln2 as hi - lo.
> + * Let x = hi - lo rounded.
> + */
> + hi = x - k * ln2hi; /* Exact. */
> + lo = k * ln2lo - c;
> + x = hi - lo;
> +
> + /* Return 2^k*[1+x+x*c/(2+c)] */
> + z = x * x;
> + c = x - z * (p1 + z * (p2 + z * (p3 + z * (p4 +
> + z * (p5 + z * (p6 + z * p7))))));
> + c = (x * c) / (2 - c);
> +
> + return (ldexpl(1 + (hi - (lo - c)), k));
> + } else {
> + /* exp(-INF) is 0. exp(-big) underflows to 0. */
> + return (isfinite(x) ? ldexpl(1., -5000) : 0);
> + }
> + } else
> + /* exp(INF) is INF, exp(+big#) overflows to INF */
> + return (isfinite(x) ? ldexpl(1., 5000) : x);
> +}
> diff --git a/newlib/libm/ld80/b_logl.c b/newlib/libm/ld80/b_logl.c
> new file mode 100644
> index 000000000..b11eacbe1
> --- /dev/null
> +++ b/newlib/libm/ld80/b_logl.c
> @@ -0,0 +1,375 @@
> +/*-
> + * SPDX-License-Identifier: BSD-3-Clause
> + *
> + * Copyright (c) 1992, 1993
> + * The Regents of the University of California. All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + * 3. Neither the name of the University nor the names of its contributors
> + * may be used to endorse or promote products derived from this software
> + * without specific prior written permission.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + */
> +
> +/*
> + * See bsdsrc/b_log.c for implementation details.
> + *
> + * bsdrc/b_log.c converted to long double by Steven G. Kargl.
> + */
> +
> +#define N 128
> +
> +/*
> + * Coefficients in the polynomial approximation of log(1+f/F).
> + * Domain of x is [0,1./256] with 2**(-84.48) precision.
> + */
> +static const union IEEEl2bits
> + a1u = LD80C(0xaaaaaaaaaaaaaaab, -4, 8.33333333333333333356e-02L),
> + a2u = LD80C(0xcccccccccccccd29, -7, 1.25000000000000000781e-02L),
> + a3u = LD80C(0x9249249241ed3764, -9, 2.23214285711721994134e-03L),
> + a4u = LD80C(0xe38e959e1e7e01cf, -12, 4.34030476540000360640e-04L);
> +#define A1 (a1u.e)
> +#define A2 (a2u.e)
> +#define A3 (a3u.e)
> +#define A4 (a4u.e)
> +
> +/*
> + * Table of log(Fj) = logF_head[j] + logF_tail[j], for Fj = 1+j/128.
> + * Used for generation of extend precision logarithms.
> + * The constant 35184372088832 is 2^45, so the divide is exact.
> + * It ensures correct reading of logF_head, even for inaccurate
> + * decimal-to-binary conversion routines. (Everybody gets the
> + * right answer for integers less than 2^53.)
> + * Values for log(F) were generated using error < 10^-57 absolute
> + * with the bc -l package.
> + */
> +
> +static double logF_head[N+1] = {
> + 0.,
> + .007782140442060381246,
> + .015504186535963526694,
> + .023167059281547608406,
> + .030771658666765233647,
> + .038318864302141264488,
> + .045809536031242714670,
> + .053244514518837604555,
> + .060624621816486978786,
> + .067950661908525944454,
> + .075223421237524235039,
> + .082443669210988446138,
> + .089612158689760690322,
> + .096729626458454731618,
> + .103796793681567578460,
> + .110814366340264314203,
> + .117783035656430001836,
> + .124703478501032805070,
> + .131576357788617315236,
> + .138402322859292326029,
> + .145182009844575077295,
> + .151916042025732167530,
> + .158605030176659056451,
> + .165249572895390883786,
> + .171850256926518341060,
> + .178407657472689606947,
> + .184922338493834104156,
> + .191394852999565046047,
> + .197825743329758552135,
> + .204215541428766300668,
> + .210564769107350002741,
> + .216873938300523150246,
> + .223143551314024080056,
> + .229374101064877322642,
> + .235566071312860003672,
> + .241719936886966024758,
> + .247836163904594286577,
> + .253915209980732470285,
> + .259957524436686071567,
> + .265963548496984003577,
> + .271933715484010463114,
> + .277868451003087102435,
> + .283768173130738432519,
> + .289633292582948342896,
> + .295464212893421063199,
> + .301261330578199704177,
> + .307025035294827830512,
> + .312755710004239517729,
> + .318453731118097493890,
> + .324119468654316733591,
> + .329753286372579168528,
> + .335355541920762334484,
> + .340926586970454081892,
> + .346466767346100823488,
> + .351976423156884266063,
> + .357455888922231679316,
> + .362905493689140712376,
> + .368325561158599157352,
> + .373716409793814818840,
> + .379078352934811846353,
> + .384411698910298582632,
> + .389716751140440464951,
> + .394993808240542421117,
> + .400243164127459749579,
> + .405465108107819105498,
> + .410659924985338875558,
> + .415827895143593195825,
> + .420969294644237379543,
> + .426084395310681429691,
> + .431173464818130014464,
> + .436236766774527495726,
> + .441274560805140936281,
> + .446287102628048160113,
> + .451274644139630254358,
> + .456237433481874177232,
> + .461175715122408291790,
> + .466089729924533457960,
> + .470979715219073113985,
> + .475845904869856894947,
> + .480688529345570714212,
> + .485507815781602403149,
> + .490303988045525329653,
> + .495077266798034543171,
> + .499827869556611403822,
> + .504556010751912253908,
> + .509261901790523552335,
> + .513945751101346104405,
> + .518607764208354637958,
> + .523248143765158602036,
> + .527867089620485785417,
> + .532464798869114019908,
> + .537041465897345915436,
> + .541597282432121573947,
> + .546132437597407260909,
> + .550647117952394182793,
> + .555141507540611200965,
> + .559615787935399566777,
> + .564070138285387656651,
> + .568504735352689749561,
> + .572919753562018740922,
> + .577315365035246941260,
> + .581691739635061821900,
> + .586049045003164792433,
> + .590387446602107957005,
> + .594707107746216934174,
> + .599008189645246602594,
> + .603290851438941899687,
> + .607555250224322662688,
> + .611801541106615331955,
> + .616029877215623855590,
> + .620240409751204424537,
> + .624433288012369303032,
> + .628608659422752680256,
> + .632766669570628437213,
> + .636907462236194987781,
> + .641031179420679109171,
> + .645137961373620782978,
> + .649227946625615004450,
> + .653301272011958644725,
> + .657358072709030238911,
> + .661398482245203922502,
> + .665422632544505177065,
> + .669430653942981734871,
> + .673422675212350441142,
> + .677398823590920073911,
> + .681359224807238206267,
> + .685304003098281100392,
> + .689233281238557538017,
> + .693147180560117703862
> +};
> +
> +static double logF_tail[N+1] = {
> + 0.,
> + -.00000000000000543229938420049,
> + .00000000000000172745674997061,
> + -.00000000000001323017818229233,
> + -.00000000000001154527628289872,
> + -.00000000000000466529469958300,
> + .00000000000005148849572685810,
> + -.00000000000002532168943117445,
> + -.00000000000005213620639136504,
> + -.00000000000001819506003016881,
> + .00000000000006329065958724544,
> + .00000000000008614512936087814,
> + -.00000000000007355770219435028,
> + .00000000000009638067658552277,
> + .00000000000007598636597194141,
> + .00000000000002579999128306990,
> + -.00000000000004654729747598444,
> + -.00000000000007556920687451336,
> + .00000000000010195735223708472,
> + -.00000000000017319034406422306,
> + -.00000000000007718001336828098,
> + .00000000000010980754099855238,
> + -.00000000000002047235780046195,
> + -.00000000000008372091099235912,
> + .00000000000014088127937111135,
> + .00000000000012869017157588257,
> + .00000000000017788850778198106,
> + .00000000000006440856150696891,
> + .00000000000016132822667240822,
> + -.00000000000007540916511956188,
> + -.00000000000000036507188831790,
> + .00000000000009120937249914984,
> + .00000000000018567570959796010,
> + -.00000000000003149265065191483,
> + -.00000000000009309459495196889,
> + .00000000000017914338601329117,
> + -.00000000000001302979717330866,
> + .00000000000023097385217586939,
> + .00000000000023999540484211737,
> + .00000000000015393776174455408,
> + -.00000000000036870428315837678,
> + .00000000000036920375082080089,
> + -.00000000000009383417223663699,
> + .00000000000009433398189512690,
> + .00000000000041481318704258568,
> + -.00000000000003792316480209314,
> + .00000000000008403156304792424,
> + -.00000000000034262934348285429,
> + .00000000000043712191957429145,
> + -.00000000000010475750058776541,
> + -.00000000000011118671389559323,
> + .00000000000037549577257259853,
> + .00000000000013912841212197565,
> + .00000000000010775743037572640,
> + .00000000000029391859187648000,
> + -.00000000000042790509060060774,
> + .00000000000022774076114039555,
> + .00000000000010849569622967912,
> + -.00000000000023073801945705758,
> + .00000000000015761203773969435,
> + .00000000000003345710269544082,
> + -.00000000000041525158063436123,
> + .00000000000032655698896907146,
> + -.00000000000044704265010452446,
> + .00000000000034527647952039772,
> + -.00000000000007048962392109746,
> + .00000000000011776978751369214,
> + -.00000000000010774341461609578,
> + .00000000000021863343293215910,
> + .00000000000024132639491333131,
> + .00000000000039057462209830700,
> + -.00000000000026570679203560751,
> + .00000000000037135141919592021,
> + -.00000000000017166921336082431,
> + -.00000000000028658285157914353,
> + -.00000000000023812542263446809,
> + .00000000000006576659768580062,
> + -.00000000000028210143846181267,
> + .00000000000010701931762114254,
> + .00000000000018119346366441110,
> + .00000000000009840465278232627,
> + -.00000000000033149150282752542,
> + -.00000000000018302857356041668,
> + -.00000000000016207400156744949,
> + .00000000000048303314949553201,
> + -.00000000000071560553172382115,
> + .00000000000088821239518571855,
> + -.00000000000030900580513238244,
> + -.00000000000061076551972851496,
> + .00000000000035659969663347830,
> + .00000000000035782396591276383,
> + -.00000000000046226087001544578,
> + .00000000000062279762917225156,
> + .00000000000072838947272065741,
> + .00000000000026809646615211673,
> + -.00000000000010960825046059278,
> + .00000000000002311949383800537,
> + -.00000000000058469058005299247,
> + -.00000000000002103748251144494,
> + -.00000000000023323182945587408,
> + -.00000000000042333694288141916,
> + -.00000000000043933937969737844,
> + .00000000000041341647073835565,
> + .00000000000006841763641591466,
> + .00000000000047585534004430641,
> + .00000000000083679678674757695,
> + -.00000000000085763734646658640,
> + .00000000000021913281229340092,
> + -.00000000000062242842536431148,
> + -.00000000000010983594325438430,
> + .00000000000065310431377633651,
> + -.00000000000047580199021710769,
> + -.00000000000037854251265457040,
> + .00000000000040939233218678664,
> + .00000000000087424383914858291,
> + .00000000000025218188456842882,
> + -.00000000000003608131360422557,
> + -.00000000000050518555924280902,
> + .00000000000078699403323355317,
> + -.00000000000067020876961949060,
> + .00000000000016108575753932458,
> + .00000000000058527188436251509,
> + -.00000000000035246757297904791,
> + -.00000000000018372084495629058,
> + .00000000000088606689813494916,
> + .00000000000066486268071468700,
> + .00000000000063831615170646519,
> + .00000000000025144230728376072,
> + -.00000000000017239444525614834
> +};
> +/*
> + * Extra precision variant, returning struct {double a, b;};
> + * log(x) = a + b to 63 bits, with 'a' rounded to 24 bits.
> + */
> +static struct Double
> +__log__D(long double x)
> +{
> + int m, j;
> + long double F, f, g, q, u, v, u1, u2;
> + struct Double r;
> +
> + /*
> + * Argument reduction: 1 <= g < 2; x/2^m = g;
> + * y = F*(1 + f/F) for |f| <= 2^-8
> + */
> + g = frexpl(x, &m);
> + g *= 2;
> + m--;
> + if (m == DBL_MIN_EXP - 1) {
> + j = ilogbl(g);
> + m += j;
> + g = ldexpl(g, -j);
> + }
> + j = N * (g - 1) + 0.5L;
> + F = (1.L / N) * j + 1;
> + f = g - F;
> +
> + g = 1 / (2 * F + f);
> + u = 2 * f * g;
> + v = u * u;
> + q = u * v * (A1 + v * (A2 + v * (A3 + v * A4)));
> + if (m | j) {
> + u1 = u + 513;
> + u1 -= 513;
> + } else {
> + u1 = (float)u;
> + }
> + u2 = (2 * (f - F * u1) - u1 * f) * g;
> +
> + u1 += m * (long double)logF_head[N] + logF_head[j];
> +
> + u2 += logF_tail[j];
> + u2 += q;
> + u2 += logF_tail[N] * m;
> + r.a = (float)(u1 + u2); /* Only difference is here. */
> + r.b = (u1 - r.a) + u2;
> + return (r);
> +}
> diff --git a/newlib/libm/ld80/b_tgammal.c b/newlib/libm/ld80/b_tgammal.c
> new file mode 100644
> index 000000000..121248adb
> --- /dev/null
> +++ b/newlib/libm/ld80/b_tgammal.c
> @@ -0,0 +1,419 @@
> +/*-
> + * SPDX-License-Identifier: BSD-3-Clause
> + *
> + * Copyright (c) 1992, 1993
> + * The Regents of the University of California. All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + * 3. Neither the name of the University nor the names of its contributors
> + * may be used to endorse or promote products derived from this software
> + * without specific prior written permission.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + */
> +
> +/*
> + * The original code, FreeBSD's old svn r93211, contain the following
> + * attribution:
> + *
> + * This code by P. McIlroy, Oct 1992;
> + *
> + * The financial support of UUNET Communications Services is greatfully
> + * acknowledged.
> + *
> + * bsdrc/b_tgamma.c converted to long double by Steven G. Kargl.
> + */
> +
> +/*
> + * See bsdsrc/t_tgamma.c for implementation details.
> + */
> +
> +#include <float.h>
> +
> +#if LDBL_MAX_EXP != 0x4000
> +#error "Unsupported long double format"
> +#endif
> +
> +#ifdef __i386__
> +#include <ieeefp.h>
> +#endif
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +
> +/* Used in b_log.c and below. */
> +struct Double {
> + long double a;
> + long double b;
> +};
> +
> +#include "b_logl.c"
> +#include "b_expl.c"
> +
> +static const double zero = 0.;
> +static const volatile double tiny = 1e-300;
> +/*
> + * x >= 6
> + *
> + * Use the asymptotic approximation (Stirling's formula) adjusted for
> + * equal-ripples:
> + *
> + * log(G(x)) ~= (x-0.5)*(log(x)-1) + 0.5(log(2*pi)-1) + 1/x*P(1/(x*x))
> + *
> + * Keep extra precision in multiplying (x-.5)(log(x)-1), to avoid
> + * premature round-off.
> + *
> + * Accurate to max(ulp(1/128) absolute, 2^-66 relative) error.
> + */
> +
> +/*
> + * The following is a decomposition of 0.5 * (log(2*pi) - 1) into the
> + * first 12 bits in ln2pi_hi and the trailing 64 bits in ln2pi_lo. The
> + * variables are clearly misnamed.
> + */
> +static const union IEEEl2bits
> +ln2pi_hiu = LD80C(0xd680000000000000, -2, 4.18945312500000000000e-01L),
> +ln2pi_lou = LD80C(0xe379b414b596d687, -18, -6.77929532725821967032e-06L);
> +#define ln2pi_hi (ln2pi_hiu.e)
> +#define ln2pi_lo (ln2pi_lou.e)
> +
> +static const union IEEEl2bits
> + Pa0u = LD80C(0xaaaaaaaaaaaaaaaa, -4, 8.33333333333333333288e-02L),
> + Pa1u = LD80C(0xb60b60b60b5fcd59, -9, -2.77777777777776516326e-03L),
> + Pa2u = LD80C(0xd00d00cffbb47014, -11, 7.93650793635429639018e-04L),
> + Pa3u = LD80C(0x9c09c07c0805343e, -11, -5.95238087960599252215e-04L),
> + Pa4u = LD80C(0xdca8d31f8e6e5e8f, -11, 8.41749082509607342883e-04L),
> + Pa5u = LD80C(0xfb4d4289632f1638, -10, -1.91728055205541624556e-03L),
> + Pa6u = LD80C(0xd15a4ba04078d3f8, -8, 6.38893788027752396194e-03L),
> + Pa7u = LD80C(0xe877283110bcad95, -6, -2.83771309846297590312e-02L),
> + Pa8u = LD80C(0x8da97eed13717af8, -3, 1.38341887683837576925e-01L),
> + Pa9u = LD80C(0xf093b1c1584e30ce, -2, -4.69876818515470146031e-01L);
> +#define Pa0 (Pa0u.e)
> +#define Pa1 (Pa1u.e)
> +#define Pa2 (Pa2u.e)
> +#define Pa3 (Pa3u.e)
> +#define Pa4 (Pa4u.e)
> +#define Pa5 (Pa5u.e)
> +#define Pa6 (Pa6u.e)
> +#define Pa7 (Pa7u.e)
> +#define Pa8 (Pa8u.e)
> +#define Pa9 (Pa9u.e)
> +
> +static struct Double
> +large_gam(long double x)
> +{
> + long double p, z, thi, tlo, xhi, xlo;
> + long double logx;
> + struct Double u;
> +
> + z = 1 / (x * x);
> + p = Pa0 + z * (Pa1 + z * (Pa2 + z * (Pa3 + z * (Pa4 + z * (Pa5 +
> + z * (Pa6 + z * (Pa7 + z * (Pa8 + z * Pa9))))))));
> + p = p / x;
> +
> + u = __log__D(x);
> + u.a -= 1;
> +
> + /* Split (x - 0.5) in high and low parts. */
> + x -= 0.5L;
> + xhi = (float)x;
> + xlo = x - xhi;
> +
> + /* Compute t = (x-.5)*(log(x)-1) in extra precision. */
> + thi = xhi * u.a;
> + tlo = xlo * u.a + x * u.b;
> +
> + /* Compute thi + tlo + ln2pi_hi + ln2pi_lo + p. */
> + tlo += ln2pi_lo;
> + tlo += p;
> + u.a = ln2pi_hi + tlo;
> + u.a += thi;
> + u.b = thi - u.a;
> + u.b += ln2pi_hi;
> + u.b += tlo;
> + return (u);
> +}
> +/*
> + * Rational approximation, A0 + x * x * P(x) / Q(x), on the interval
> + * [1.066.., 2.066..] accurate to 4.25e-19.
> + *
> + * Returns r.a + r.b = a0 + (z + c)^2 * p / q, with r.a truncated.
> + */
> +static const union IEEEl2bits
> + a0_hiu = LD80C(0xe2b6e4153a57746c, -1, 8.85603194410888700265e-01L),
> + a0_lou = LD80C(0x851566d40f32c76d, -66, 1.40907742727049706207e-20L);
> +#define a0_hi (a0_hiu.e)
> +#define a0_lo (a0_lou.e)
> +
> +static const union IEEEl2bits
> +P0u = LD80C(0xdb629fb9bbdc1c1d, -2, 4.28486815855585429733e-01L),
> +P1u = LD80C(0xe6f4f9f5641aa6be, -3, 2.25543885805587730552e-01L),
> +P2u = LD80C(0xead1bd99fdaf7cc1, -6, 2.86644652514293482381e-02L),
> +P3u = LD80C(0x9ccc8b25838ab1e0, -8, 4.78512567772456362048e-03L),
> +P4u = LD80C(0x8f0c4383ef9ce72a, -9, 2.18273781132301146458e-03L),
> +P5u = LD80C(0xe732ab2c0a2778da, -13, 2.20487522485636008928e-04L),
> +P6u = LD80C(0xce70b27ca822b297, -16, 2.46095923774929264284e-05L),
> +P7u = LD80C(0xa309e2e16fb63663, -19, 2.42946473022376182921e-06L),
> +P8u = LD80C(0xaf9c110efb2c633d, -23, 1.63549217667765869987e-07L),
> +Q1u = LD80C(0xd4d7422719f48f15, -1, 8.31409582658993993626e-01L),
> +Q2u = LD80C(0xe13138ea404f1268, -5, -5.49785826915643198508e-02L),
> +Q3u = LD80C(0xd1c6cc91989352c0, -4, -1.02429960435139887683e-01L),
> +Q4u = LD80C(0xa7e9435a84445579, -7, 1.02484853505908820524e-02L),
> +Q5u = LD80C(0x83c7c34db89b7bda, -8, 4.02161632832052872697e-03L),
> +Q6u = LD80C(0xbed06bf6e1c14e5b, -11, -7.27898206351223022157e-04L),
> +Q7u = LD80C(0xef05bf841d4504c0, -18, 7.12342421869453515194e-06L),
> +Q8u = LD80C(0xf348d08a1ff53cb1, -19, 3.62522053809474067060e-06L);
> +#define P0 (P0u.e)
> +#define P1 (P1u.e)
> +#define P2 (P2u.e)
> +#define P3 (P3u.e)
> +#define P4 (P4u.e)
> +#define P5 (P5u.e)
> +#define P6 (P6u.e)
> +#define P7 (P7u.e)
> +#define P8 (P8u.e)
> +#define Q1 (Q1u.e)
> +#define Q2 (Q2u.e)
> +#define Q3 (Q3u.e)
> +#define Q4 (Q4u.e)
> +#define Q5 (Q5u.e)
> +#define Q6 (Q6u.e)
> +#define Q7 (Q7u.e)
> +#define Q8 (Q8u.e)
> +
> +static struct Double
> +ratfun_gam(long double z, long double c)
> +{
> + long double p, q, thi, tlo;
> + struct Double r;
> +
> + q = 1 + z * (Q1 + z * (Q2 + z * (Q3 + z * (Q4 + z * (Q5 +
> + z * (Q6 + z * (Q7 + z * Q8)))))));
> + p = P0 + z * (P1 + z * (P2 + z * (P3 + z * (P4 + z * (P5 +
> + z * (P6 + z * (P7 + z * P8)))))));
> + p = p / q;
> +
> + /* Split z into high and low parts. */
> + thi = (float)z;
> + tlo = (z - thi) + c;
> + tlo *= (thi + z);
> +
> + /* Split (z+c)^2 into high and low parts. */
> + thi *= thi;
> + q = thi;
> + thi = (float)thi;
> + tlo += (q - thi);
> +
> + /* Split p/q into high and low parts. */
> + r.a = (float)p;
> + r.b = p - r.a;
> +
> + tlo = tlo * p + thi * r.b + a0_lo;
> + thi *= r.a; /* t = (z+c)^2*(P/Q) */
> + r.a = (float)(thi + a0_hi);
> + r.b = ((a0_hi - r.a) + thi) + tlo;
> + return (r); /* r = a0 + t */
> +}
> +/*
> + * x < 6
> + *
> + * Use argument reduction G(x+1) = xG(x) to reach the range [1.066124,
> + * 2.066124]. Use a rational approximation centered at the minimum
> + * (x0+1) to ensure monotonicity.
> + *
> + * Good to < 1 ulp. (provably .90 ulp; .87 ulp on 1,000,000 runs.)
> + * It also has correct monotonicity.
> + */
> +static const union IEEEl2bits
> + xm1u = LD80C(0xec5b0c6ad7c7edc3, -2, 4.61632144968362341254e-01L);
> +#define x0 (xm1u.e)
> +
> +static const double
> + left = -0.3955078125; /* left boundary for rat. approx */
> +
> +static long double
> +small_gam(long double x)
> +{
> + long double t, y, ym1;
> + struct Double yy, r;
> +
> + y = x - 1;
> +
> + if (y <= 1 + (left + x0)) {
> + yy = ratfun_gam(y - x0, 0);
> + return (yy.a + yy.b);
> + }
> +
> + r.a = (float)y;
> + yy.a = r.a - 1;
> + y = y - 1 ;
> + r.b = yy.b = y - yy.a;
> +
> + /* Argument reduction: G(x+1) = x*G(x) */
> + for (ym1 = y - 1; ym1 > left + x0; y = ym1--, yy.a--) {
> + t = r.a * yy.a;
> + r.b = r.a * yy.b + y * r.b;
> + r.a = (float)t;
> + r.b += (t - r.a);
> + }
> +
> + /* Return r*tgamma(y). */
> + yy = ratfun_gam(y - x0, 0);
> + y = r.b * (yy.a + yy.b) + r.a * yy.b;
> + y += yy.a * r.a;
> + return (y);
> +}
> +/*
> + * Good on (0, 1+x0+left]. Accurate to 1 ulp.
> + */
> +static long double
> +smaller_gam(long double x)
> +{
> + long double d, rhi, rlo, t, xhi, xlo;
> + struct Double r;
> +
> + if (x < x0 + left) {
> + t = (float)x;
> + d = (t + x) * (x - t);
> + t *= t;
> + xhi = (float)(t + x);
> + xlo = x - xhi;
> + xlo += t;
> + xlo += d;
> + t = 1 - x0;
> + t += x;
> + d = 1 - x0;
> + d -= t;
> + d += x;
> + x = xhi + xlo;
> + } else {
> + xhi = (float)x;
> + xlo = x - xhi;
> + t = x - x0;
> + d = - x0 - t;
> + d += x;
> + }
> +
> + r = ratfun_gam(t, d);
> + d = (float)(r.a / x);
> + r.a -= d * xhi;
> + r.a -= d * xlo;
> + r.a += r.b;
> +
> + return (d + r.a / x);
> +}
> +/*
> + * x < 0
> + *
> + * Use reflection formula, G(x) = pi/(sin(pi*x)*x*G(x)).
> + * At negative integers, return NaN and raise invalid.
> + */
> +static const union IEEEl2bits
> +piu = LD80C(0xc90fdaa22168c235, 1, 3.14159265358979323851e+00L);
> +#define pi (piu.e)
> +
> +static long double
> +neg_gam(long double x)
> +{
> + int sgn = 1;
> + struct Double lg, lsine;
> + long double y, z;
> +
> + y = ceill(x);
> + if (y == x) /* Negative integer. */
> + return ((x - x) / zero);
> +
> + z = y - x;
> + if (z > 0.5)
> + z = 1 - z;
> +
> + y = y / 2;
> + if (y == ceill(y))
> + sgn = -1;
> +
> + if (z < 0.25)
> + z = sinpil(z);
> + else
> + z = cospil(0.5 - z);
> +
> + /* Special case: G(1-x) = Inf; G(x) may be nonzero. */
> + if (x < -1753) {
> +
> + if (x < -1760)
> + return (sgn * tiny * tiny);
> + y = expl(lgammal(x) / 2);
> + y *= y;
> + return (sgn < 0 ? -y : y);
> + }
> +
> +
> + y = 1 - x;
> + if (1 - y == x)
> + y = tgammal(y);
> + else /* 1-x is inexact */
> + y = - x * tgammal(-x);
> +
> + if (sgn < 0) y = -y;
> + return (pi / (y * z));
> +}
> +/*
> + * xmax comes from lgamma(xmax) - emax * log(2) = 0.
> + * static const float xmax = 35.040095f
> + * static const double xmax = 171.624376956302725;
> + * ld80: LD80C(0xdb718c066b352e20, 10, 1.75554834290446291689e+03L),
> + * ld128: 1.75554834290446291700388921607020320e+03L,
> + *
> + * iota is a sloppy threshold to isolate x = 0.
> + */
> +static const double xmax = 1755.54834290446291689;
> +static const double iota = 0x1p-116;
> +
> +long double
> +tgammal(long double x)
> +{
> + struct Double u;
> +
> + ENTERI();
> +
> + if (x >= 6) {
> + if (x > xmax)
> + RETURNI(x / zero);
> + u = large_gam(x);
> + RETURNI(__exp__D(u.a, u.b));
> + }
> +
> + if (x >= 1 + left + x0)
> + RETURNI(small_gam(x));
> +
> + if (x > iota)
> + RETURNI(smaller_gam(x));
> +
> + if (x > -iota) {
> + if (x != 0)
> + u.a = 1 - tiny; /* raise inexact */
> + RETURNI(1 / x);
> + }
> +
> + if (!isfinite(x))
> + RETURNI(x - x); /* x is NaN or -Inf */
> +
> + RETURNI(neg_gam(x));
> +}
> diff --git a/newlib/libm/ld80/e_lgammal_r.c b/newlib/libm/ld80/e_lgammal_r.c
> new file mode 100644
> index 000000000..f56758b18
> --- /dev/null
> +++ b/newlib/libm/ld80/e_lgammal_r.c
> @@ -0,0 +1,358 @@
> +/* @(#)e_lgamma_r.c 1.3 95/01/18 */
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunSoft, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * See e_lgamma_r.c for complete comments.
> + *
> + * Converted to long double by Steven G. Kargl.
> + */
> +
> +#ifdef __i386__
> +#include <ieeefp.h>
> +#endif
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +
> +static const volatile double vzero = 0;
> +
> +static const double
> +zero= 0,
> +half= 0.5,
> +one = 1;
> +
> +static const union IEEEl2bits
> +piu = LD80C(0xc90fdaa22168c235, 1, 3.14159265358979323851e+00L);
> +#define pi (piu.e)
> +/*
> + * Domain y in [0x1p-70, 0.27], range ~[-4.5264e-22, 4.5264e-22]:
> + * |(lgamma(2 - y) + y / 2) / y - a(y)| < 2**-70.9
> + */
> +static const union IEEEl2bits
> +a0u = LD80C(0x9e233f1bed863d26, -4, 7.72156649015328606028e-02L),
> +a1u = LD80C(0xa51a6625307d3249, -2, 3.22467033424113218889e-01L),
> +a2u = LD80C(0x89f000d2abafda8c, -4, 6.73523010531979398946e-02L),
> +a3u = LD80C(0xa8991563eca75f26, -6, 2.05808084277991211934e-02L),
> +a4u = LD80C(0xf2027e10634ce6b6, -8, 7.38555102796070454026e-03L),
> +a5u = LD80C(0xbd6eb76dd22187f4, -9, 2.89051035162703932972e-03L),
> +a6u = LD80C(0x9c562ab05e0458ed, -10, 1.19275351624639999297e-03L),
> +a7u = LD80C(0x859baed93ee48e46, -11, 5.09674593842117925320e-04L),
> +a8u = LD80C(0xe9f28a4432949af2, -13, 2.23109648015769155122e-04L),
> +a9u = LD80C(0xd12ad0d9b93c6bb0, -14, 9.97387167479808509830e-05L),
> +a10u= LD80C(0xb7522643c78a219b, -15, 4.37071076331030136818e-05L),
> +a11u= LD80C(0xca024dcdece2cb79, -16, 2.40813493372040143061e-05L),
> +a12u= LD80C(0xbb90fb6968ebdbf9, -19, 2.79495621083634031729e-06L),
> +a13u= LD80C(0xba1c9ffeeae07b37, -17, 1.10931287015513924136e-05L);
> +#define a0 (a0u.e)
> +#define a1 (a1u.e)
> +#define a2 (a2u.e)
> +#define a3 (a3u.e)
> +#define a4 (a4u.e)
> +#define a5 (a5u.e)
> +#define a6 (a6u.e)
> +#define a7 (a7u.e)
> +#define a8 (a8u.e)
> +#define a9 (a9u.e)
> +#define a10 (a10u.e)
> +#define a11 (a11u.e)
> +#define a12 (a12u.e)
> +#define a13 (a13u.e)
> +/*
> + * Domain x in [tc-0.24, tc+0.28], range ~[-6.1205e-22, 6.1205e-22]:
> + * |(lgamma(x) - tf) - t(x - tc)| < 2**-70.5
> + */
> +static const union IEEEl2bits
> +tcu = LD80C(0xbb16c31ab5f1fb71, 0, 1.46163214496836234128e+00L),
> +tfu = LD80C(0xf8cdcde61c520e0f, -4, -1.21486290535849608093e-01L),
> +ttu = LD80C(0xd46ee54b27d4de99, -69, -2.81152980996018785880e-21L),
> +t0u = LD80C(0x80b9406556a62a6b, -68, 3.40728634996055147231e-21L),
> +t1u = LD80C(0xc7e9c6f6df3f8c39, -67, -1.05833162742737073665e-20L),
> +t2u = LD80C(0xf7b95e4771c55d51, -2, 4.83836122723810583532e-01L),
> +t3u = LD80C(0x97213c6e35e119ff, -3, -1.47587722994530691476e-01L),
> +t4u = LD80C(0x845a14a6a81dc94b, -4, 6.46249402389135358063e-02L),
> +t5u = LD80C(0x864d46fa89997796, -5, -3.27885410884846056084e-02L),
> +t6u = LD80C(0x93373cbd00297438, -6, 1.79706751150707171293e-02L),
> +t7u = LD80C(0xa8fcfca7eddc8d1d, -7, -1.03142230361450732547e-02L),
> +t8u = LD80C(0xc7e7015ff4bc45af, -8, 6.10053603296546099193e-03L),
> +t9u = LD80C(0xf178d2247adc5093, -9, -3.68456964904901200152e-03L),
> +t10u = LD80C(0x94188d58f12e5e9f, -9, 2.25976420273774583089e-03L),
> +t11u = LD80C(0xb7cbaef14e1406f1, -10, -1.40224943666225639823e-03L),
> +t12u = LD80C(0xe63a671e6704ea4d, -11, 8.78250640744776944887e-04L),
> +t13u = LD80C(0x914b6c9cae61783e, -11, -5.54255012657716808811e-04L),
> +t14u = LD80C(0xb858f5bdb79276fe, -12, 3.51614951536825927370e-04L),
> +t15u = LD80C(0xea73e744c34b9591, -13, -2.23591563824520112236e-04L),
> +t16u = LD80C(0x99aeabb0d67ba835, -13, 1.46562869351659194136e-04L),
> +t17u = LD80C(0xd7c6938325db2024, -14, -1.02889866046435680588e-04L),
> +t18u = LD80C(0xe24cb1e3b0474775, -15, 5.39540265505221957652e-05L);
> +#define tc (tcu.e)
> +#define tf (tfu.e)
> +#define tt (ttu.e)
> +#define t0 (t0u.e)
> +#define t1 (t1u.e)
> +#define t2 (t2u.e)
> +#define t3 (t3u.e)
> +#define t4 (t4u.e)
> +#define t5 (t5u.e)
> +#define t6 (t6u.e)
> +#define t7 (t7u.e)
> +#define t8 (t8u.e)
> +#define t9 (t9u.e)
> +#define t10 (t10u.e)
> +#define t11 (t11u.e)
> +#define t12 (t12u.e)
> +#define t13 (t13u.e)
> +#define t14 (t14u.e)
> +#define t15 (t15u.e)
> +#define t16 (t16u.e)
> +#define t17 (t17u.e)
> +#define t18 (t18u.e)
> +/*
> + * Domain y in [-0.1, 0.232], range ~[-8.1938e-22, 8.3815e-22]:
> + * |(lgamma(1 + y) + 0.5 * y) / y - u(y) / v(y)| < 2**-71.2
> + */
> +static const union IEEEl2bits
> +u0u = LD80C(0x9e233f1bed863d27, -4, -7.72156649015328606095e-02L),
> +u1u = LD80C(0x98280ee45e4ddd3d, -1, 5.94361239198682739769e-01L),
> +u2u = LD80C(0xe330c8ead4130733, 0, 1.77492629495841234275e+00L),
> +u3u = LD80C(0xd4a213f1a002ec52, 0, 1.66119622514818078064e+00L),
> +u4u = LD80C(0xa5a9ca6f5bc62163, -1, 6.47122051417476492989e-01L),
> +u5u = LD80C(0xc980e49cd5b019e6, -4, 9.83903751718671509455e-02L),
> +u6u = LD80C(0xff636a8bdce7025b, -9, 3.89691687802305743450e-03L),
> +v1u = LD80C(0xbd109c533a19fbf5, 1, 2.95413883330948556544e+00L),
> +v2u = LD80C(0xd295cbf96f31f099, 1, 3.29039286955665403176e+00L),
> +v3u = LD80C(0xdab8bcfee40496cb, 0, 1.70876276441416471410e+00L),
> +v4u = LD80C(0xd2f2dc3638567e9f, -2, 4.12009126299534668571e-01L),
> +v5u = LD80C(0xa07d9b0851070f41, -5, 3.91822868305682491442e-02L),
> +v6u = LD80C(0xe3cd8318f7adb2c4, -11, 8.68998648222144351114e-04L);
> +#define u0 (u0u.e)
> +#define u1 (u1u.e)
> +#define u2 (u2u.e)
> +#define u3 (u3u.e)
> +#define u4 (u4u.e)
> +#define u5 (u5u.e)
> +#define u6 (u6u.e)
> +#define v1 (v1u.e)
> +#define v2 (v2u.e)
> +#define v3 (v3u.e)
> +#define v4 (v4u.e)
> +#define v5 (v5u.e)
> +#define v6 (v6u.e)
> +/*
> + * Domain x in (2, 3], range ~[-3.3648e-22, 3.4416e-22]:
> + * |(lgamma(y+2) - 0.5 * y) / y - s(y)/r(y)| < 2**-72.3
> + * with y = x - 2.
> + */
> +static const union IEEEl2bits
> +s0u = LD80C(0x9e233f1bed863d27, -4, -7.72156649015328606095e-02L),
> +s1u = LD80C(0xd3ff0dcc7fa91f94, -3, 2.07027640921219389860e-01L),
> +s2u = LD80C(0xb2bb62782478ef31, -2, 3.49085881391362090549e-01L),
> +s3u = LD80C(0xb49f7438c4611a74, -3, 1.76389518704213357954e-01L),
> +s4u = LD80C(0x9a957008fa27ecf9, -5, 3.77401710862930008071e-02L),
> +s5u = LD80C(0xda9b389a6ca7a7ac, -9, 3.33566791452943399399e-03L),
> +s6u = LD80C(0xbc7a2263faf59c14, -14, 8.98728786745638844395e-05L),
> +r1u = LD80C(0xbf5cff5b11477d4d, 0, 1.49502555796294337722e+00L),
> +r2u = LD80C(0xd9aec89de08e3da6, -1, 8.50323236984473285866e-01L),
> +r3u = LD80C(0xeab7ae5057c443f9, -3, 2.29216312078225806131e-01L),
> +r4u = LD80C(0xf29707d9bd2b1e37, -6, 2.96130326586640089145e-02L),
> +r5u = LD80C(0xd376c2f09736c5a3, -10, 1.61334161411590662495e-03L),
> +r6u = LD80C(0xc985983d0cd34e3d, -16, 2.40232770710953450636e-05L),
> +r7u = LD80C(0xe5c7a4f7fc2ef13d, -25, -5.34997929289167573510e-08L);
> +#define s0 (s0u.e)
> +#define s1 (s1u.e)
> +#define s2 (s2u.e)
> +#define s3 (s3u.e)
> +#define s4 (s4u.e)
> +#define s5 (s5u.e)
> +#define s6 (s6u.e)
> +#define r1 (r1u.e)
> +#define r2 (r2u.e)
> +#define r3 (r3u.e)
> +#define r4 (r4u.e)
> +#define r5 (r5u.e)
> +#define r6 (r6u.e)
> +#define r7 (r7u.e)
> +/*
> + * Domain z in [8, 0x1p70], range ~[-3.0235e-22, 3.0563e-22]:
> + * |lgamma(x) - (x - 0.5) * (log(x) - 1) - w(1/x)| < 2**-71.7
> + */
> +static const union IEEEl2bits
> +w0u = LD80C(0xd67f1c864beb4a69, -2, 4.18938533204672741776e-01L),
> +w1u = LD80C(0xaaaaaaaaaaaaaaa1, -4, 8.33333333333333332678e-02L),
> +w2u = LD80C(0xb60b60b60b5491c9, -9, -2.77777777777760927870e-03L),
> +w3u = LD80C(0xd00d00cf58aede4c, -11, 7.93650793490637233668e-04L),
> +w4u = LD80C(0x9c09bf626783d4a5, -11, -5.95238023926039051268e-04L),
> +w5u = LD80C(0xdca7cadc5baa517b, -11, 8.41733700408000822962e-04L),
> +w6u = LD80C(0xfb060e361e1ffd07, -10, -1.91515849570245136604e-03L),
> +w7u = LD80C(0xcbd5101bb58d1f2b, -8, 6.22046743903262649294e-03L),
> +w8u = LD80C(0xad27a668d32c821b, -6, -2.11370706734662081843e-02L);
> +#define w0 (w0u.e)
> +#define w1 (w1u.e)
> +#define w2 (w2u.e)
> +#define w3 (w3u.e)
> +#define w4 (w4u.e)
> +#define w5 (w5u.e)
> +#define w6 (w6u.e)
> +#define w7 (w7u.e)
> +#define w8 (w8u.e)
> +
> +static long double
> +sin_pil(long double x)
> +{
> + volatile long double vz;
> + long double y,z;
> + uint64_t n;
> + uint16_t hx;
> +
> + y = -x;
> +
> + vz = y+0x1p63;
> + z = vz-0x1p63;
> + if (z == y)
> + return zero;
> +
> + vz = y+0x1p61;
> + EXTRACT_LDBL80_WORDS(hx,n,vz);
> + z = vz-0x1p61;
> + if (z > y) {
> + z -= 0.25; /* adjust to round down */
> + n--;
> + }
> + n &= 7; /* octant of y mod 2 */
> + y = y - z + n * 0.25; /* y mod 2 */
> +
> + switch (n) {
> + case 0: y = __kernel_sinl(pi*y,zero,0); break;
> + case 1:
> + case 2: y = __kernel_cosl(pi*(0.5-y),zero); break;
> + case 3:
> + case 4: y = __kernel_sinl(pi*(one-y),zero,0); break;
> + case 5:
> + case 6: y = -__kernel_cosl(pi*(y-1.5),zero); break;
> + default: y = __kernel_sinl(pi*(y-2.0),zero,0); break;
> + }
> + return -y;
> +}
> +
> +long double
> +lgammal_r(long double x, int *signgamp)
> +{
> + long double nadj,p,p1,p2,q,r,t,w,y,z;
> + uint64_t lx;
> + int i;
> + uint16_t hx,ix;
> +
> + EXTRACT_LDBL80_WORDS(hx,lx,x);
> +
> + /* purge +-Inf and NaNs */
> + *signgamp = 1;
> + ix = hx&0x7fff;
> + if(ix==0x7fff) return x*x;
> +
> + ENTERI();
> +
> + /* purge +-0 and tiny arguments */
> + *signgamp = 1-2*(hx>>15);
> + if(ix<0x3fff-67) { /* |x|<2**-(p+3), return -log(|x|) */
> + if((ix|lx)==0)
> + RETURNI(one/vzero);
> + RETURNI(-logl(fabsl(x)));
> + }
> +
> + /* purge negative integers and start evaluation for other x < 0 */
> + if(hx&0x8000) {
> + *signgamp = 1;
> + if(ix>=0x3fff+63) /* |x|>=2**(p-1), must be -integer */
> + RETURNI(one/vzero);
> + t = sin_pil(x);
> + if(t==zero) RETURNI(one/vzero); /* -integer */
> + nadj = logl(pi/fabsl(t*x));
> + if(t<zero) *signgamp = -1;
> + x = -x;
> + }
> +
> + /* purge 1 and 2 */
> + if((ix==0x3fff || ix==0x4000) && lx==0x8000000000000000ULL) r = 0;
> + /* for x < 2.0 */
> + else if(ix<0x4000) {
> + /*
> + * XXX Supposedly, one can use the following information to replace the
> + * XXX FP rational expressions. A similar approach is appropriate
> + * XXX for ld128, but one (may need?) needs to consider llx, too.
> + *
> + * 8.9999961853027344e-01 3ffe e666600000000000
> + * 7.3159980773925781e-01 3ffe bb4a200000000000
> + * 2.3163998126983643e-01 3ffc ed33080000000000
> + * 1.7316312789916992e+00 3fff dda6180000000000
> + * 1.2316322326660156e+00 3fff 9da6200000000000
> + */
> + if(x<8.9999961853027344e-01) {
> + r = -logl(x);
> + if(x>=7.3159980773925781e-01) {y = 1-x; i= 0;}
> + else if(x>=2.3163998126983643e-01) {y= x-(tc-1); i=1;}
> + else {y = x; i=2;}
> + } else {
> + r = 0;
> + if(x>=1.7316312789916992e+00) {y=2-x;i=0;}
> + else if(x>=1.2316322326660156e+00) {y=x-tc;i=1;}
> + else {y=x-1;i=2;}
> + }
> + switch(i) {
> + case 0:
> + z = y*y;
> + p1 = a0+z*(a2+z*(a4+z*(a6+z*(a8+z*(a10+z*a12)))));
> + p2 = z*(a1+z*(a3+z*(a5+z*(a7+z*(a9+z*(a11+z*a13))))));
> + p = y*p1+p2;
> + r += p-y/2; break;
> + case 1:
> + p = t0+y*t1+tt+y*y*(t2+y*(t3+y*(t4+y*(t5+y*(t6+y*(t7+y*(t8+
> + y*(t9+y*(t10+y*(t11+y*(t12+y*(t13+y*(t14+y*(t15+y*(t16+
> + y*(t17+y*t18))))))))))))))));
> + r += tf + p; break;
> + case 2:
> + p1 = y*(u0+y*(u1+y*(u2+y*(u3+y*(u4+y*(u5+y*u6))))));
> + p2 = 1+y*(v1+y*(v2+y*(v3+y*(v4+y*(v5+y*v6)))));
> + r += p1/p2-y/2;
> + }
> + }
> + /* x < 8.0 */
> + else if(ix<0x4002) {
> + i = x;
> + y = x-i;
> + p = y*(s0+y*(s1+y*(s2+y*(s3+y*(s4+y*(s5+y*s6))))));
> + q = 1+y*(r1+y*(r2+y*(r3+y*(r4+y*(r5+y*(r6+y*r7))))));
> + r = y/2+p/q;
> + z = 1; /* lgamma(1+s) = log(s) + lgamma(s) */
> + switch(i) {
> + case 7: z *= (y+6); /* FALLTHRU */
> + case 6: z *= (y+5); /* FALLTHRU */
> + case 5: z *= (y+4); /* FALLTHRU */
> + case 4: z *= (y+3); /* FALLTHRU */
> + case 3: z *= (y+2); /* FALLTHRU */
> + r += logl(z); break;
> + }
> + /* 8.0 <= x < 2**(p+3) */
> + } else if (ix<0x3fff+67) {
> + t = logl(x);
> + z = one/x;
> + y = z*z;
> + w = w0+z*(w1+y*(w2+y*(w3+y*(w4+y*(w5+y*(w6+y*(w7+y*w8)))))));
> + r = (x-half)*(t-one)+w;
> + /* 2**(p+3) <= x <= inf */
> + } else
> + r = x*(logl(x)-1);
> + if(hx&0x8000) r = nadj - r;
> + RETURNI(r);
> +}
> diff --git a/newlib/libm/ld80/e_powl.c b/newlib/libm/ld80/e_powl.c
> new file mode 100644
> index 000000000..ea25354c2
> --- /dev/null
> +++ b/newlib/libm/ld80/e_powl.c
> @@ -0,0 +1,662 @@
> +/*-
> + * Copyright (c) 2008 Stephen L. Moshier <steve@moshier.net>
> + *
> + * Permission to use, copy, modify, and distribute this software for any
> + * purpose with or without fee is hereby granted, provided that the above
> + * copyright notice and this permission notice appear in all copies.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
> + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
> + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
> + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
> + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
> + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
> + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include <math.h>
> +
> +#include "math_private.h"
> +
> +/*
> + * Polynomial evaluator:
> + * P[0] x^n + P[1] x^(n-1) + ... + P[n]
> + */
> +static inline long double
> +__polevll(long double x, long double *PP, int n)
> +{
> + long double y;
> + long double *P;
> +
> + P = PP;
> + y = *P++;
> + do {
> + y = y * x + *P++;
> + } while (--n);
> +
> + return (y);
> +}
> +
> +/*
> + * Polynomial evaluator:
> + * x^n + P[0] x^(n-1) + P[1] x^(n-2) + ... + P[n]
> + */
> +static inline long double
> +__p1evll(long double x, long double *PP, int n)
> +{
> + long double y;
> + long double *P;
> +
> + P = PP;
> + n -= 1;
> + y = x + *P++;
> + do {
> + y = y * x + *P++;
> + } while (--n);
> +
> + return (y);
> +}
> +
> +/* powl.c
> + *
> + * Power function, long double precision
> + *
> + *
> + *
> + * SYNOPSIS:
> + *
> + * long double x, y, z, powl();
> + *
> + * z = powl( x, y );
> + *
> + *
> + *
> + * DESCRIPTION:
> + *
> + * Computes x raised to the yth power. Analytically,
> + *
> + * x**y = exp( y log(x) ).
> + *
> + * Following Cody and Waite, this program uses a lookup table
> + * of 2**-i/32 and pseudo extended precision arithmetic to
> + * obtain several extra bits of accuracy in both the logarithm
> + * and the exponential.
> + *
> + *
> + *
> + * ACCURACY:
> + *
> + * The relative error of pow(x,y) can be estimated
> + * by y dl ln(2), where dl is the absolute error of
> + * the internally computed base 2 logarithm. At the ends
> + * of the approximation interval the logarithm equal 1/32
> + * and its relative error is about 1 lsb = 1.1e-19. Hence
> + * the predicted relative error in the result is 2.3e-21 y .
> + *
> + * Relative error:
> + * arithmetic domain # trials peak rms
> + *
> + * IEEE +-1000 40000 2.8e-18 3.7e-19
> + * .001 < x < 1000, with log(x) uniformly distributed.
> + * -1000 < y < 1000, y uniformly distributed.
> + *
> + * IEEE 0,8700 60000 6.5e-18 1.0e-18
> + * 0.99 < x < 1.01, 0 < y < 8700, uniformly distributed.
> + *
> + *
> + * ERROR MESSAGES:
> + *
> + * message condition value returned
> + * pow overflow x**y > MAXNUM INFINITY
> + * pow underflow x**y < 1/MAXNUM 0.0
> + * pow domain x<0 and y noninteger 0.0
> + *
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include <float.h>
> +#include <math.h>
> +
> +#include "math_private.h"
> +
> +/* Table size */
> +#define NXT 32
> +/* log2(Table size) */
> +#define LNXT 5
> +
> +/* log(1+x) = x - .5x^2 + x^3 * P(z)/Q(z)
> + * on the domain 2^(-1/32) - 1 <= x <= 2^(1/32) - 1
> + */
> +static long double P[] = {
> + 8.3319510773868690346226E-4L,
> + 4.9000050881978028599627E-1L,
> + 1.7500123722550302671919E0L,
> + 1.4000100839971580279335E0L,
> +};
> +static long double Q[] = {
> +/* 1.0000000000000000000000E0L,*/
> + 5.2500282295834889175431E0L,
> + 8.4000598057587009834666E0L,
> + 4.2000302519914740834728E0L,
> +};
> +/* A[i] = 2^(-i/32), rounded to IEEE long double precision.
> + * If i is even, A[i] + B[i/2] gives additional accuracy.
> + */
> +static long double A[33] = {
> + 1.0000000000000000000000E0L,
> + 9.7857206208770013448287E-1L,
> + 9.5760328069857364691013E-1L,
> + 9.3708381705514995065011E-1L,
> + 9.1700404320467123175367E-1L,
> + 8.9735453750155359320742E-1L,
> + 8.7812608018664974155474E-1L,
> + 8.5930964906123895780165E-1L,
> + 8.4089641525371454301892E-1L,
> + 8.2287773907698242225554E-1L,
> + 8.0524516597462715409607E-1L,
> + 7.8799042255394324325455E-1L,
> + 7.7110541270397041179298E-1L,
> + 7.5458221379671136985669E-1L,
> + 7.3841307296974965571198E-1L,
> + 7.2259040348852331001267E-1L,
> + 7.0710678118654752438189E-1L,
> + 6.9195494098191597746178E-1L,
> + 6.7712777346844636413344E-1L,
> + 6.6261832157987064729696E-1L,
> + 6.4841977732550483296079E-1L,
> + 6.3452547859586661129850E-1L,
> + 6.2092890603674202431705E-1L,
> + 6.0762367999023443907803E-1L,
> + 5.9460355750136053334378E-1L,
> + 5.8186242938878875689693E-1L,
> + 5.6939431737834582684856E-1L,
> + 5.5719337129794626814472E-1L,
> + 5.4525386633262882960438E-1L,
> + 5.3357020033841180906486E-1L,
> + 5.2213689121370692017331E-1L,
> + 5.1094857432705833910408E-1L,
> + 5.0000000000000000000000E-1L,
> +};
> +static long double B[17] = {
> + 0.0000000000000000000000E0L,
> + 2.6176170809902549338711E-20L,
> +-1.0126791927256478897086E-20L,
> + 1.3438228172316276937655E-21L,
> + 1.2207982955417546912101E-20L,
> +-6.3084814358060867200133E-21L,
> + 1.3164426894366316434230E-20L,
> +-1.8527916071632873716786E-20L,
> + 1.8950325588932570796551E-20L,
> + 1.5564775779538780478155E-20L,
> + 6.0859793637556860974380E-21L,
> +-2.0208749253662532228949E-20L,
> + 1.4966292219224761844552E-20L,
> + 3.3540909728056476875639E-21L,
> +-8.6987564101742849540743E-22L,
> +-1.2327176863327626135542E-20L,
> + 0.0000000000000000000000E0L,
> +};
> +
> +/* 2^x = 1 + x P(x),
> + * on the interval -1/32 <= x <= 0
> + */
> +static long double R[] = {
> + 1.5089970579127659901157E-5L,
> + 1.5402715328927013076125E-4L,
> + 1.3333556028915671091390E-3L,
> + 9.6181291046036762031786E-3L,
> + 5.5504108664798463044015E-2L,
> + 2.4022650695910062854352E-1L,
> + 6.9314718055994530931447E-1L,
> +};
> +
> +#define douba(k) A[k]
> +#define doubb(k) B[k]
> +#define MEXP (NXT*16384.0L)
> +/* The following if denormal numbers are supported, else -MEXP: */
> +#define MNEXP (-NXT*(16384.0L+64.0L))
> +/* log2(e) - 1 */
> +#define LOG2EA 0.44269504088896340735992L
> +
> +#define F W
> +#define Fa Wa
> +#define Fb Wb
> +#define G W
> +#define Ga Wa
> +#define Gb u
> +#define H W
> +#define Ha Wb
> +#define Hb Wb
> +
> +static const long double MAXLOGL = 1.1356523406294143949492E4L;
> +static const long double MINLOGL = -1.13994985314888605586758E4L;
> +static const long double LOGE2L = 6.9314718055994530941723E-1L;
> +static volatile long double z;
> +static long double w, W, Wa, Wb, ya, yb, u;
> +static const long double huge = 0x1p10000L;
> +#if 0 /* XXX Prevent gcc from erroneously constant folding this. */
> +static const long double twom10000 = 0x1p-10000L;
> +#else
> +static volatile long double twom10000 = 0x1p-10000L;
> +#endif
> +
> +static long double reducl( long double );
> +static long double powil ( long double, int );
> +
> +long double
> +powl(long double x, long double y)
> +{
> +/* double F, Fa, Fb, G, Ga, Gb, H, Ha, Hb */
> +int i, nflg, iyflg, yoddint;
> +long e;
> +
> +if( y == 0.0L )
> + return( 1.0L );
> +
> +if( x == 1.0L )
> + return( 1.0L );
> +
> +if( isnan(x) )
> + return ( nan_mix(x, y) );
> +if( isnan(y) )
> + return ( nan_mix(x, y) );
> +
> +if( y == 1.0L )
> + return( x );
> +
> +if( !isfinite(y) && x == -1.0L )
> + return( 1.0L );
> +
> +if( y >= LDBL_MAX )
> + {
> + if( x > 1.0L )
> + return( INFINITY );
> + if( x > 0.0L && x < 1.0L )
> + return( 0.0L );
> + if( x < -1.0L )
> + return( INFINITY );
> + if( x > -1.0L && x < 0.0L )
> + return( 0.0L );
> + }
> +if( y <= -LDBL_MAX )
> + {
> + if( x > 1.0L )
> + return( 0.0L );
> + if( x > 0.0L && x < 1.0L )
> + return( INFINITY );
> + if( x < -1.0L )
> + return( 0.0L );
> + if( x > -1.0L && x < 0.0L )
> + return( INFINITY );
> + }
> +if( x >= LDBL_MAX )
> + {
> + if( y > 0.0L )
> + return( INFINITY );
> + return( 0.0L );
> + }
> +
> +w = floorl(y);
> +/* Set iyflg to 1 if y is an integer. */
> +iyflg = 0;
> +if( w == y )
> + iyflg = 1;
> +
> +/* Test for odd integer y. */
> +yoddint = 0;
> +if( iyflg )
> + {
> + ya = fabsl(y);
> + ya = floorl(0.5L * ya);
> + yb = 0.5L * fabsl(w);
> + if( ya != yb )
> + yoddint = 1;
> + }
> +
> +if( x <= -LDBL_MAX )
> + {
> + if( y > 0.0L )
> + {
> + if( yoddint )
> + return( -INFINITY );
> + return( INFINITY );
> + }
> + if( y < 0.0L )
> + {
> + if( yoddint )
> + return( -0.0L );
> + return( 0.0 );
> + }
> + }
> +
> +
> +nflg = 0; /* flag = 1 if x<0 raised to integer power */
> +if( x <= 0.0L )
> + {
> + if( x == 0.0L )
> + {
> + if( y < 0.0 )
> + {
> + if( signbit(x) && yoddint )
> + return( -INFINITY );
> + return( INFINITY );
> + }
> + if( y > 0.0 )
> + {
> + if( signbit(x) && yoddint )
> + return( -0.0L );
> + return( 0.0 );
> + }
> + if( y == 0.0L )
> + return( 1.0L ); /* 0**0 */
> + else
> + return( 0.0L ); /* 0**y */
> + }
> + else
> + {
> + if( iyflg == 0 )
> + return (x - x) / (x - x); /* (x<0)**(non-int) is NaN */
> + nflg = 1;
> + }
> + }
> +
> +/* Integer power of an integer. */
> +
> +if( iyflg )
> + {
> + i = w;
> + w = floorl(x);
> + if( (w == x) && (fabsl(y) < 32768.0) )
> + {
> + w = powil( x, (int) y );
> + return( w );
> + }
> + }
> +
> +
> +if( nflg )
> + x = fabsl(x);
> +
> +/* separate significand from exponent */
> +x = frexpl( x, &i );
> +e = i;
> +
> +/* find significand in antilog table A[] */
> +i = 1;
> +if( x <= douba(17) )
> + i = 17;
> +if( x <= douba(i+8) )
> + i += 8;
> +if( x <= douba(i+4) )
> + i += 4;
> +if( x <= douba(i+2) )
> + i += 2;
> +if( x >= douba(1) )
> + i = -1;
> +i += 1;
> +
> +
> +/* Find (x - A[i])/A[i]
> + * in order to compute log(x/A[i]):
> + *
> + * log(x) = log( a x/a ) = log(a) + log(x/a)
> + *
> + * log(x/a) = log(1+v), v = x/a - 1 = (x-a)/a
> + */
> +x -= douba(i);
> +x -= doubb(i/2);
> +x /= douba(i);
> +
> +
> +/* rational approximation for log(1+v):
> + *
> + * log(1+v) = v - v**2/2 + v**3 P(v) / Q(v)
> + */
> +z = x*x;
> +w = x * ( z * __polevll( x, P, 3 ) / __p1evll( x, Q, 3 ) );
> +w = w - ldexpl( z, -1 ); /* w - 0.5 * z */
> +
> +/* Convert to base 2 logarithm:
> + * multiply by log2(e) = 1 + LOG2EA
> + */
> +z = LOG2EA * w;
> +z += w;
> +z += LOG2EA * x;
> +z += x;
> +
> +/* Compute exponent term of the base 2 logarithm. */
> +w = -i;
> +w = ldexpl( w, -LNXT ); /* divide by NXT */
> +w += e;
> +/* Now base 2 log of x is w + z. */
> +
> +/* Multiply base 2 log by y, in extended precision. */
> +
> +/* separate y into large part ya
> + * and small part yb less than 1/NXT
> + */
> +ya = reducl(y);
> +yb = y - ya;
> +
> +/* (w+z)(ya+yb)
> + * = w*ya + w*yb + z*y
> + */
> +F = z * y + w * yb;
> +Fa = reducl(F);
> +Fb = F - Fa;
> +
> +G = Fa + w * ya;
> +Ga = reducl(G);
> +Gb = G - Ga;
> +
> +H = Fb + Gb;
> +Ha = reducl(H);
> +w = ldexpl( Ga+Ha, LNXT );
> +
> +/* Test the power of 2 for overflow */
> +if( w > MEXP )
> + return (huge * huge); /* overflow */
> +
> +if( w < MNEXP )
> + return (twom10000 * twom10000); /* underflow */
> +
> +e = w;
> +Hb = H - Ha;
> +
> +if( Hb > 0.0L )
> + {
> + e += 1;
> + Hb -= (1.0L/NXT); /*0.0625L;*/
> + }
> +
> +/* Now the product y * log2(x) = Hb + e/NXT.
> + *
> + * Compute base 2 exponential of Hb,
> + * where -0.0625 <= Hb <= 0.
> + */
> +z = Hb * __polevll( Hb, R, 6 ); /* z = 2**Hb - 1 */
> +
> +/* Express e/NXT as an integer plus a negative number of (1/NXT)ths.
> + * Find lookup table entry for the fractional power of 2.
> + */
> +if( e < 0 )
> + i = 0;
> +else
> + i = 1;
> +i = e/NXT + i;
> +e = NXT*i - e;
> +w = douba( e );
> +z = w * z; /* 2**-e * ( 1 + (2**Hb-1) ) */
> +z = z + w;
> +z = ldexpl( z, i ); /* multiply by integer power of 2 */
> +
> +if( nflg )
> + {
> +/* For negative x,
> + * find out if the integer exponent
> + * is odd or even.
> + */
> + w = ldexpl( y, -1 );
> + w = floorl(w);
> + w = ldexpl( w, 1 );
> + if( w != y )
> + z = -z; /* odd exponent */
> + }
> +
> +return( z );
> +}
> +
> +
> +/* Find a multiple of 1/NXT that is within 1/NXT of x. */
> +static inline long double
> +reducl(long double x)
> +{
> +long double t;
> +
> +t = ldexpl( x, LNXT );
> +t = floorl( t );
> +t = ldexpl( t, -LNXT );
> +return(t);
> +}
> +
> +/* powil.c
> + *
> + * Real raised to integer power, long double precision
> + *
> + *
> + *
> + * SYNOPSIS:
> + *
> + * long double x, y, powil();
> + * int n;
> + *
> + * y = powil( x, n );
> + *
> + *
> + *
> + * DESCRIPTION:
> + *
> + * Returns argument x raised to the nth power.
> + * The routine efficiently decomposes n as a sum of powers of
> + * two. The desired power is a product of two-to-the-kth
> + * powers of x. Thus to compute the 32767 power of x requires
> + * 28 multiplications instead of 32767 multiplications.
> + *
> + *
> + *
> + * ACCURACY:
> + *
> + *
> + * Relative error:
> + * arithmetic x domain n domain # trials peak rms
> + * IEEE .001,1000 -1022,1023 50000 4.3e-17 7.8e-18
> + * IEEE 1,2 -1022,1023 20000 3.9e-17 7.6e-18
> + * IEEE .99,1.01 0,8700 10000 3.6e-16 7.2e-17
> + *
> + * Returns MAXNUM on overflow, zero on underflow.
> + *
> + */
> +
> +static long double
> +powil(long double x, int nn)
> +{
> +long double ww, y;
> +long double s;
> +int n, e, sign, asign, lx;
> +
> +if( x == 0.0L )
> + {
> + if( nn == 0 )
> + return( 1.0L );
> + else if( nn < 0 )
> + return( LDBL_MAX );
> + else
> + return( 0.0L );
> + }
> +
> +if( nn == 0 )
> + return( 1.0L );
> +
> +
> +if( x < 0.0L )
> + {
> + asign = -1;
> + x = -x;
> + }
> +else
> + asign = 0;
> +
> +
> +if( nn < 0 )
> + {
> + sign = -1;
> + n = -nn;
> + }
> +else
> + {
> + sign = 1;
> + n = nn;
> + }
> +
> +/* Overflow detection */
> +
> +/* Calculate approximate logarithm of answer */
> +s = x;
> +s = frexpl( s, &lx );
> +e = (lx - 1)*n;
> +if( (e == 0) || (e > 64) || (e < -64) )
> + {
> + s = (s - 7.0710678118654752e-1L) / (s + 7.0710678118654752e-1L);
> + s = (2.9142135623730950L * s - 0.5L + lx) * nn * LOGE2L;
> + }
> +else
> + {
> + s = LOGE2L * e;
> + }
> +
> +if( s > MAXLOGL )
> + return (huge * huge); /* overflow */
> +
> +if( s < MINLOGL )
> + return (twom10000 * twom10000); /* underflow */
> +/* Handle tiny denormal answer, but with less accuracy
> + * since roundoff error in 1.0/x will be amplified.
> + * The precise demarcation should be the gradual underflow threshold.
> + */
> +if( s < (-MAXLOGL+2.0L) )
> + {
> + x = 1.0L/x;
> + sign = -sign;
> + }
> +
> +/* First bit of the power */
> +if( n & 1 )
> + y = x;
> +
> +else
> + {
> + y = 1.0L;
> + asign = 0;
> + }
> +
> +ww = x;
> +n >>= 1;
> +while( n )
> + {
> + ww = ww * ww; /* arg to the 2-to-the-kth power */
> + if( n & 1 ) /* if that bit is set, then include in product */
> + y *= ww;
> + n >>= 1;
> + }
> +
> +if( asign )
> + y = -y; /* odd power of negative number */
> +if( sign < 0 )
> + y = 1.0L/y;
> +return(y);
> +}
> diff --git a/newlib/libm/ld80/e_rem_pio2l.h b/newlib/libm/ld80/e_rem_pio2l.h
> new file mode 100644
> index 000000000..b7ef5d983
> --- /dev/null
> +++ b/newlib/libm/ld80/e_rem_pio2l.h
> @@ -0,0 +1,143 @@
> +/* From: @(#)e_rem_pio2.c 1.4 95/01/18 */
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + * Copyright (c) 2008 Steven G. Kargl, David Schultz, Bruce D. Evans.
> + *
> + * Developed at SunSoft, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + *
> + * Optimized by Bruce D. Evans.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/* ld80 version of __ieee754_rem_pio2l(x,y)
> + *
> + * return the remainder of x rem pi/2 in y[0]+y[1]
> + * use __kernel_rem_pio2()
> + */
> +
> +#include <float.h>
> +
> +#include "math.h"
> +#include "math_private.h"
> +#include "../ld/fpmath.h"
> +
> +#define BIAS (LDBL_MAX_EXP - 1)
> +
> +/*
> + * invpio2: 64 bits of 2/pi
> + * pio2_1: first 39 bits of pi/2
> + * pio2_1t: pi/2 - pio2_1
> + * pio2_2: second 39 bits of pi/2
> + * pio2_2t: pi/2 - (pio2_1+pio2_2)
> + * pio2_3: third 39 bits of pi/2
> + * pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3)
> + */
> +
> +static const double
> +zero = 0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */
> +two24 = 1.67772160000000000000e+07, /* 0x41700000, 0x00000000 */
> +pio2_1 = 1.57079632679597125389e+00, /* 0x3FF921FB, 0x54444000 */
> +pio2_2 = -1.07463465549783099519e-12, /* -0x12e7b967674000.0p-92 */
> +pio2_3 = 6.36831716351370313614e-25; /* 0x18a2e037074000.0p-133 */
> +
> +#if defined(__amd64__) || defined(__i386__)
> +/* Long double constants are slow on these arches, and broken on i386. */
> +static const volatile double
> +invpio2hi = 6.3661977236758138e-01, /* 0x145f306dc9c883.0p-53 */
> +invpio2lo = -3.9356538861223811e-17, /* -0x16b00000000000.0p-107 */
> +pio2_1thi = -1.0746346554971943e-12, /* -0x12e7b9676733af.0p-92 */
> +pio2_1tlo = 8.8451028997905949e-29, /* 0x1c080000000000.0p-146 */
> +pio2_2thi = 6.3683171635109499e-25, /* 0x18a2e03707344a.0p-133 */
> +pio2_2tlo = 2.3183081793789774e-41, /* 0x10280000000000.0p-187 */
> +pio2_3thi = -2.7529965190440717e-37, /* -0x176b7ed8fbbacc.0p-174 */
> +pio2_3tlo = -4.2006647512740502e-54; /* -0x19c00000000000.0p-230 */
> +#define invpio2 ((long double)invpio2hi + invpio2lo)
> +#define pio2_1t ((long double)pio2_1thi + pio2_1tlo)
> +#define pio2_2t ((long double)pio2_2thi + pio2_2tlo)
> +#define pio2_3t ((long double)pio2_3thi + pio2_3tlo)
> +#else
> +static const long double
> +invpio2 = 6.36619772367581343076e-01L, /* 0xa2f9836e4e44152a.0p-64 */
> +pio2_1t = -1.07463465549719416346e-12L, /* -0x973dcb3b399d747f.0p-103 */
> +pio2_2t = 6.36831716351095013979e-25L, /* 0xc51701b839a25205.0p-144 */
> +pio2_3t = -2.75299651904407171810e-37L; /* -0xbb5bf6c7ddd660ce.0p-185 */
> +#endif
> +
> +static inline __always_inline int
> +__ieee754_rem_pio2l(long double x, long double *y)
> +{
> + union IEEEl2bits u,u1;
> + long double z,w,t,r,fn;
> + double tx[3],ty[2];
> + int e0,ex,i,j,nx,n;
> + int16_t expsign;
> +
> + u.e = x;
> + expsign = u.xbits.expsign;
> + ex = expsign & 0x7fff;
> + if (ex < BIAS + 25 || (ex == BIAS + 25 && u.bits.manh < 0xc90fdaa2)) {
> + /* |x| ~< 2^25*(pi/2), medium size */
> + fn = rnintl(x*invpio2);
> + n = irint(fn);
> + r = x-fn*pio2_1;
> + w = fn*pio2_1t; /* 1st round good to 102 bit */
> + {
> + union IEEEl2bits u2;
> + int ex1;
> + j = ex;
> + y[0] = r-w;
> + u2.e = y[0];
> + ex1 = u2.xbits.expsign & 0x7fff;
> + i = j-ex1;
> + if(i>22) { /* 2nd iteration needed, good to 141 */
> + t = r;
> + w = fn*pio2_2;
> + r = t-w;
> + w = fn*pio2_2t-((t-r)-w);
> + y[0] = r-w;
> + u2.e = y[0];
> + ex1 = u2.xbits.expsign & 0x7fff;
> + i = j-ex1;
> + if(i>61) { /* 3rd iteration need, 180 bits acc */
> + t = r; /* will cover all possible cases */
> + w = fn*pio2_3;
> + r = t-w;
> + w = fn*pio2_3t-((t-r)-w);
> + y[0] = r-w;
> + }
> + }
> + }
> + y[1] = (r-y[0])-w;
> + return n;
> + }
> + /*
> + * all other (large) arguments
> + */
> + if(ex==0x7fff) { /* x is inf or NaN */
> + y[0]=y[1]=x-x; return 0;
> + }
> + /* set z = scalbn(|x|,ilogb(x)-23) */
> + u1.e = x;
> + e0 = ex - BIAS - 23; /* e0 = ilogb(|x|)-23; */
> + u1.xbits.expsign = ex - e0;
> + z = u1.e;
> + for(i=0;i<2;i++) {
> + tx[i] = (double)((int32_t)(z));
> + z = (z-tx[i])*two24;
> + }
> + tx[2] = z;
> + nx = 3;
> + while(tx[nx-1]==zero) nx--; /* skip zero term */
> + n = __kernel_rem_pio2(tx,ty,e0,nx,2);
> + r = (long double)ty[0] + ty[1];
> + w = ty[1] - (r - ty[0]);
> + if(expsign<0) {y[0] = -r; y[1] = -w; return -n;}
> + y[0] = r; y[1] = w; return n;
> +}
> diff --git a/newlib/libm/ld80/invtrig.c b/newlib/libm/ld80/invtrig.c
> new file mode 100644
> index 000000000..5c8047857
> --- /dev/null
> +++ b/newlib/libm/ld80/invtrig.c
> @@ -0,0 +1,84 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2008 David Schultz <das@FreeBSD.ORG>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include "invtrig.h"
> +
> +/*
> + * asinl() and acosl()
> + */
> +const long double
> +pS0 = 1.66666666666666666631e-01L,
> +pS1 = -4.16313987993683104320e-01L,
> +pS2 = 3.69068046323246813704e-01L,
> +pS3 = -1.36213932016738603108e-01L,
> +pS4 = 1.78324189708471965733e-02L,
> +pS5 = -2.19216428382605211588e-04L,
> +pS6 = -7.10526623669075243183e-06L,
> +qS1 = -2.94788392796209867269e+00L,
> +qS2 = 3.27309890266528636716e+00L,
> +qS3 = -1.68285799854822427013e+00L,
> +qS4 = 3.90699412641738801874e-01L,
> +qS5 = -3.14365703596053263322e-02L;
> +
> +/*
> + * atanl()
> + */
> +const long double atanhi[] = {
> + 4.63647609000806116202e-01L,
> + 7.85398163397448309628e-01L,
> + 9.82793723247329067960e-01L,
> + 1.57079632679489661926e+00L,
> +};
> +
> +const long double atanlo[] = {
> + 1.18469937025062860669e-20L,
> + -1.25413940316708300586e-20L,
> + 2.55232234165405176172e-20L,
> + -2.50827880633416601173e-20L,
> +};
> +
> +const long double aT[] = {
> + 3.33333333333333333017e-01L,
> + -1.99999999999999632011e-01L,
> + 1.42857142857046531280e-01L,
> + -1.11111111100562372733e-01L,
> + 9.09090902935647302252e-02L,
> + -7.69230552476207730353e-02L,
> + 6.66661718042406260546e-02L,
> + -5.88158892835030888692e-02L,
> + 5.25499891539726639379e-02L,
> + -4.70119845393155721494e-02L,
> + 4.03539201366454414072e-02L,
> + -2.91303858419364158725e-02L,
> + 1.24822046299269234080e-02L,
> +};
> +
> +const long double pi_lo = -5.01655761266833202345e-20L;
> diff --git a/newlib/libm/ld80/invtrig.h b/newlib/libm/ld80/invtrig.h
> new file mode 100644
> index 000000000..be06a044b
> --- /dev/null
> +++ b/newlib/libm/ld80/invtrig.h
> @@ -0,0 +1,116 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2008 David Schultz <das@FreeBSD.ORG>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + *
> + * $FreeBSD$
> + */
> +
> +#include <float.h>
> +
> +#include "fpmath.h"
> +
> +#define BIAS (LDBL_MAX_EXP - 1)
> +#define MANH_SIZE LDBL_MANH_SIZE
> +
> +/* Approximation thresholds. */
> +#define ASIN_LINEAR (BIAS - 32) /* 2**-32 */
> +#define ACOS_CONST (BIAS - 65) /* 2**-65 */
> +#define ATAN_CONST (BIAS + 65) /* 2**65 */
> +#define ATAN_LINEAR (BIAS - 32) /* 2**-32 */
> +
> +/* 0.95 */
> +#define THRESH ((0xe666666666666666ULL>>(64-(MANH_SIZE-1)))|LDBL_NBIT)
> +
> +/* Constants shared by the long double inverse trig functions. */
> +#define pS0 _ItL_pS0
> +#define pS1 _ItL_pS1
> +#define pS2 _ItL_pS2
> +#define pS3 _ItL_pS3
> +#define pS4 _ItL_pS4
> +#define pS5 _ItL_pS5
> +#define pS6 _ItL_pS6
> +#define qS1 _ItL_qS1
> +#define qS2 _ItL_qS2
> +#define qS3 _ItL_qS3
> +#define qS4 _ItL_qS4
> +#define qS5 _ItL_qS5
> +#define atanhi _ItL_atanhi
> +#define atanlo _ItL_atanlo
> +#define aT _ItL_aT
> +#define pi_lo _ItL_pi_lo
> +
> +#define pio2_hi atanhi[3]
> +#define pio2_lo atanlo[3]
> +#define pio4_hi atanhi[1]
> +
> +#ifdef STRUCT_DECLS
> +typedef struct longdouble {
> + uint64_t mant;
> + uint16_t expsign;
> +} LONGDOUBLE;
> +#else
> +typedef long double LONGDOUBLE;
> +#endif
> +
> +extern const LONGDOUBLE pS0, pS1, pS2, pS3, pS4, pS5, pS6;
> +extern const LONGDOUBLE qS1, qS2, qS3, qS4, qS5;
> +extern const LONGDOUBLE atanhi[], atanlo[], aT[];
> +extern const LONGDOUBLE pi_lo;
> +
> +#ifndef STRUCT_DECLS
> +
> +static inline long double
> +P(long double x)
> +{
> +
> + return (x * (pS0 + x * (pS1 + x * (pS2 + x * (pS3 + x * \
> + (pS4 + x * (pS5 + x * pS6)))))));
> +}
> +
> +static inline long double
> +Q(long double x)
> +{
> +
> + return (1.0 + x * (qS1 + x * (qS2 + x * (qS3 + x * (qS4 + x * qS5)))));
> +}
> +
> +static inline long double
> +T_even(long double x)
> +{
> +
> + return (aT[0] + x * (aT[2] + x * (aT[4] + x * (aT[6] + x * \
> + (aT[8] + x * (aT[10] + x * aT[12]))))));
> +}
> +
> +static inline long double
> +T_odd(long double x)
> +{
> +
> + return (aT[1] + x * (aT[3] + x * (aT[5] + x * (aT[7] + x * \
> + (aT[9] + x * aT[11])))));
> +}
> +
> +#endif
> diff --git a/newlib/libm/ld80/k_cosl.c b/newlib/libm/ld80/k_cosl.c
> new file mode 100644
> index 000000000..6dde6adad
> --- /dev/null
> +++ b/newlib/libm/ld80/k_cosl.c
> @@ -0,0 +1,78 @@
> +/* From: @(#)k_cos.c 1.3 95/01/18 */
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + * Copyright (c) 2008 Steven G. Kargl, David Schultz, Bruce D. Evans.
> + *
> + * Developed at SunSoft, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * ld80 version of k_cos.c. See ../src/k_cos.c for most comments.
> + */
> +
> +#include "math_private.h"
> +
> +/*
> + * Domain [-0.7854, 0.7854], range ~[-2.43e-23, 2.425e-23]:
> + * |cos(x) - c(x)| < 2**-75.1
> + *
> + * The coefficients of c(x) were generated by a pari-gp script using
> + * a Remez algorithm that searches for the best higher coefficients
> + * after rounding leading coefficients to a specified precision.
> + *
> + * Simpler methods like Chebyshev or basic Remez barely suffice for
> + * cos() in 64-bit precision, because we want the coefficient of x^2
> + * to be precisely -0.5 so that multiplying by it is exact, and plain
> + * rounding of the coefficients of a good polynomial approximation only
> + * gives this up to about 64-bit precision. Plain rounding also gives
> + * a mediocre approximation for the coefficient of x^4, but a rounding
> + * error of 0.5 ulps for this coefficient would only contribute ~0.01
> + * ulps to the final error, so this is unimportant. Rounding errors in
> + * higher coefficients are even less important.
> + *
> + * In fact, coefficients above the x^4 one only need to have 53-bit
> + * precision, and this is more efficient. We get this optimization
> + * almost for free from the complications needed to search for the best
> + * higher coefficients.
> + */
> +static const double
> +one = 1.0;
> +
> +#if defined(__amd64__) || defined(__i386__)
> +/* Long double constants are slow on these arches, and broken on i386. */
> +static const volatile double
> +C1hi = 0.041666666666666664, /* 0x15555555555555.0p-57 */
> +C1lo = 2.2598839032744733e-18; /* 0x14d80000000000.0p-111 */
> +#define C1 ((long double)C1hi + C1lo)
> +#else
> +static const long double
> +C1 = 0.0416666666666666666136L; /* 0xaaaaaaaaaaaaaa9b.0p-68 */
> +#endif
> +
> +static const double
> +C2 = -0.0013888888888888874, /* -0x16c16c16c16c10.0p-62 */
> +C3 = 0.000024801587301571716, /* 0x1a01a01a018e22.0p-68 */
> +C4 = -0.00000027557319215507120, /* -0x127e4fb7602f22.0p-74 */
> +C5 = 0.0000000020876754400407278, /* 0x11eed8caaeccf1.0p-81 */
> +C6 = -1.1470297442401303e-11, /* -0x19393412bd1529.0p-89 */
> +C7 = 4.7383039476436467e-14; /* 0x1aac9d9af5c43e.0p-97 */
> +
> +long double
> +__kernel_cosl(long double x, long double y)
> +{
> + long double hz,z,r,w;
> +
> + z = x*x;
> + r = z*(C1+z*(C2+z*(C3+z*(C4+z*(C5+z*(C6+z*C7))))));
> + hz = 0.5*z;
> + w = one-hz;
> + return w + (((one-w)-hz) + (z*r-x*y));
> +}
> diff --git a/newlib/libm/ld80/k_cospil.h b/newlib/libm/ld80/k_cospil.h
> new file mode 100644
> index 000000000..6e13ef02a
> --- /dev/null
> +++ b/newlib/libm/ld80/k_cospil.h
> @@ -0,0 +1,42 @@
> +/*-
> + * Copyright (c) 2017 Steven G. Kargl
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice unmodified, this list of conditions, and the following
> + * disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
> + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
> + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
> + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
> + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
> + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
> + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +/*
> + * See ../src/k_cospi.c for implementation details.
> + */
> +
> +static inline long double
> +__kernel_cospil(long double x)
> +{
> + long double hi, lo;
> +
> + hi = (float)x;
> + lo = x - hi;
> + lo = lo * (pi_lo + pi_hi) + hi * pi_lo;
> + hi *= pi_hi;
> + _2sumF(hi, lo);
> + return (__kernel_cosl(hi, lo));
> +}
> diff --git a/newlib/libm/ld80/k_expl.h b/newlib/libm/ld80/k_expl.h
> new file mode 100644
> index 000000000..a744d2d38
> --- /dev/null
> +++ b/newlib/libm/ld80/k_expl.h
> @@ -0,0 +1,301 @@
> +/* from: FreeBSD: head/lib/msun/ld80/s_expl.c 251343 2013-06-03 19:51:32Z kargl */
> +
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2009-2013 Steven G. Kargl
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice unmodified, this list of conditions, and the following
> + * disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
> + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
> + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
> + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
> + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
> + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
> + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + *
> + * Optimized by Bruce D. Evans.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * See s_expl.c for more comments about __k_expl().
> + *
> + * See ../src/e_exp.c and ../src/k_exp.h for precision-independent comments
> + * about the secondary kernels.
> + */
> +
> +#define INTERVALS 128
> +#define LOG2_INTERVALS 7
> +#define BIAS (LDBL_MAX_EXP - 1)
> +
> +static const double
> +/*
> + * ln2/INTERVALS = L1+L2 (hi+lo decomposition for multiplication). L1 must
> + * have at least 22 (= log2(|LDBL_MIN_EXP-extras|) + log2(INTERVALS)) lowest
> + * bits zero so that multiplication of it by n is exact.
> + */
> +INV_L = 1.8466496523378731e+2, /* 0x171547652b82fe.0p-45 */
> +L1 = 5.4152123484527692e-3, /* 0x162e42ff000000.0p-60 */
> +L2 = -3.2819649005320973e-13, /* -0x1718432a1b0e26.0p-94 */
> +/*
> + * Domain [-0.002708, 0.002708], range ~[-5.7136e-24, 5.7110e-24]:
> + * |exp(x) - p(x)| < 2**-77.2
> + * (0.002708 is ln2/(2*INTERVALS) rounded up a little).
> + */
> +A2 = 0.5,
> +A3 = 1.6666666666666119e-1, /* 0x15555555555490.0p-55 */
> +A4 = 4.1666666666665887e-2, /* 0x155555555554e5.0p-57 */
> +A5 = 8.3333354987869413e-3, /* 0x1111115b789919.0p-59 */
> +A6 = 1.3888891738560272e-3; /* 0x16c16c651633ae.0p-62 */
> +
> +/*
> + * 2^(i/INTERVALS) for i in [0,INTERVALS] is represented by two values where
> + * the first 53 bits of the significand are stored in hi and the next 53
> + * bits are in lo. Tang's paper states that the trailing 6 bits of hi must
> + * be zero for his algorithm in both single and double precision, because
> + * the table is re-used in the implementation of expm1() where a floating
> + * point addition involving hi must be exact. Here hi is double, so
> + * converting it to long double gives 11 trailing zero bits.
> + */
> +static const struct {
> + double hi;
> + double lo;
> +} tbl[INTERVALS] = {
> + { 0x1p+0, 0x0p+0 },
> + /*
> + * XXX hi is rounded down, and the formatting is not quite normal.
> + * But I rather like both. The 0x1.*p format is good for 4N+1
> + * mantissa bits. Rounding down makes the lo terms positive,
> + * so that the columnar formatting can be simpler.
> + */
> + { 0x1.0163da9fb3335p+0, 0x1.b61299ab8cdb7p-54 },
> + { 0x1.02c9a3e778060p+0, 0x1.dcdef95949ef4p-53 },
> + { 0x1.04315e86e7f84p+0, 0x1.7ae71f3441b49p-53 },
> + { 0x1.059b0d3158574p+0, 0x1.d73e2a475b465p-55 },
> + { 0x1.0706b29ddf6ddp+0, 0x1.8db880753b0f6p-53 },
> + { 0x1.0874518759bc8p+0, 0x1.186be4bb284ffp-57 },
> + { 0x1.09e3ecac6f383p+0, 0x1.1487818316136p-54 },
> + { 0x1.0b5586cf9890fp+0, 0x1.8a62e4adc610bp-54 },
> + { 0x1.0cc922b7247f7p+0, 0x1.01edc16e24f71p-54 },
> + { 0x1.0e3ec32d3d1a2p+0, 0x1.03a1727c57b53p-59 },
> + { 0x1.0fb66affed31ap+0, 0x1.e464123bb1428p-53 },
> + { 0x1.11301d0125b50p+0, 0x1.49d77e35db263p-53 },
> + { 0x1.12abdc06c31cbp+0, 0x1.f72575a649ad2p-53 },
> + { 0x1.1429aaea92ddfp+0, 0x1.66820328764b1p-53 },
> + { 0x1.15a98c8a58e51p+0, 0x1.2406ab9eeab0ap-55 },
> + { 0x1.172b83c7d517ap+0, 0x1.b9bef918a1d63p-53 },
> + { 0x1.18af9388c8de9p+0, 0x1.777ee1734784ap-53 },
> + { 0x1.1a35beb6fcb75p+0, 0x1.e5b4c7b4968e4p-55 },
> + { 0x1.1bbe084045cd3p+0, 0x1.3563ce56884fcp-53 },
> + { 0x1.1d4873168b9aap+0, 0x1.e016e00a2643cp-54 },
> + { 0x1.1ed5022fcd91cp+0, 0x1.71033fec2243ap-53 },
> + { 0x1.2063b88628cd6p+0, 0x1.dc775814a8495p-55 },
> + { 0x1.21f49917ddc96p+0, 0x1.2a97e9494a5eep-55 },
> + { 0x1.2387a6e756238p+0, 0x1.9b07eb6c70573p-54 },
> + { 0x1.251ce4fb2a63fp+0, 0x1.ac155bef4f4a4p-55 },
> + { 0x1.26b4565e27cddp+0, 0x1.2bd339940e9d9p-55 },
> + { 0x1.284dfe1f56380p+0, 0x1.2d9e2b9e07941p-53 },
> + { 0x1.29e9df51fdee1p+0, 0x1.612e8afad1255p-55 },
> + { 0x1.2b87fd0dad98fp+0, 0x1.fbbd48ca71f95p-53 },
> + { 0x1.2d285a6e4030bp+0, 0x1.0024754db41d5p-54 },
> + { 0x1.2ecafa93e2f56p+0, 0x1.1ca0f45d52383p-56 },
> + { 0x1.306fe0a31b715p+0, 0x1.6f46ad23182e4p-55 },
> + { 0x1.32170fc4cd831p+0, 0x1.a9ce78e18047cp-55 },
> + { 0x1.33c08b26416ffp+0, 0x1.32721843659a6p-54 },
> + { 0x1.356c55f929ff0p+0, 0x1.928c468ec6e76p-53 },
> + { 0x1.371a7373aa9cap+0, 0x1.4e28aa05e8a8fp-53 },
> + { 0x1.38cae6d05d865p+0, 0x1.0b53961b37da2p-53 },
> + { 0x1.3a7db34e59ff6p+0, 0x1.d43792533c144p-53 },
> + { 0x1.3c32dc313a8e4p+0, 0x1.08003e4516b1ep-53 },
> + { 0x1.3dea64c123422p+0, 0x1.ada0911f09ebcp-55 },
> + { 0x1.3fa4504ac801bp+0, 0x1.417ee03548306p-53 },
> + { 0x1.4160a21f72e29p+0, 0x1.f0864b71e7b6cp-53 },
> + { 0x1.431f5d950a896p+0, 0x1.b8e088728219ap-53 },
> + { 0x1.44e086061892dp+0, 0x1.89b7a04ef80d0p-59 },
> + { 0x1.46a41ed1d0057p+0, 0x1.c944bd1648a76p-54 },
> + { 0x1.486a2b5c13cd0p+0, 0x1.3c1a3b69062f0p-56 },
> + { 0x1.4a32af0d7d3dep+0, 0x1.9cb62f3d1be56p-54 },
> + { 0x1.4bfdad5362a27p+0, 0x1.d4397afec42e2p-56 },
> + { 0x1.4dcb299fddd0dp+0, 0x1.8ecdbbc6a7833p-54 },
> + { 0x1.4f9b2769d2ca6p+0, 0x1.5a67b16d3540ep-53 },
> + { 0x1.516daa2cf6641p+0, 0x1.8225ea5909b04p-53 },
> + { 0x1.5342b569d4f81p+0, 0x1.be1507893b0d5p-53 },
> + { 0x1.551a4ca5d920ep+0, 0x1.8a5d8c4048699p-53 },
> + { 0x1.56f4736b527dap+0, 0x1.9bb2c011d93adp-54 },
> + { 0x1.58d12d497c7fdp+0, 0x1.295e15b9a1de8p-55 },
> + { 0x1.5ab07dd485429p+0, 0x1.6324c054647adp-54 },
> + { 0x1.5c9268a5946b7p+0, 0x1.c4b1b816986a2p-60 },
> + { 0x1.5e76f15ad2148p+0, 0x1.ba6f93080e65ep-54 },
> + { 0x1.605e1b976dc08p+0, 0x1.60edeb25490dcp-53 },
> + { 0x1.6247eb03a5584p+0, 0x1.63e1f40dfa5b5p-53 },
> + { 0x1.6434634ccc31fp+0, 0x1.8edf0e2989db3p-53 },
> + { 0x1.6623882552224p+0, 0x1.224fb3c5371e6p-53 },
> + { 0x1.68155d44ca973p+0, 0x1.038ae44f73e65p-57 },
> + { 0x1.6a09e667f3bccp+0, 0x1.21165f626cdd5p-53 },
> + { 0x1.6c012750bdabep+0, 0x1.daed533001e9ep-53 },
> + { 0x1.6dfb23c651a2ep+0, 0x1.e441c597c3775p-53 },
> + { 0x1.6ff7df9519483p+0, 0x1.9f0fc369e7c42p-53 },
> + { 0x1.71f75e8ec5f73p+0, 0x1.ba46e1e5de15ap-53 },
> + { 0x1.73f9a48a58173p+0, 0x1.7ab9349cd1562p-53 },
> + { 0x1.75feb564267c8p+0, 0x1.7edd354674916p-53 },
> + { 0x1.780694fde5d3fp+0, 0x1.866b80a02162dp-54 },
> + { 0x1.7a11473eb0186p+0, 0x1.afaa2047ed9b4p-53 },
> + { 0x1.7c1ed0130c132p+0, 0x1.f124cd1164dd6p-54 },
> + { 0x1.7e2f336cf4e62p+0, 0x1.05d02ba15797ep-56 },
> + { 0x1.80427543e1a11p+0, 0x1.6c1bccec9346bp-53 },
> + { 0x1.82589994cce12p+0, 0x1.159f115f56694p-53 },
> + { 0x1.8471a4623c7acp+0, 0x1.9ca5ed72f8c81p-53 },
> + { 0x1.868d99b4492ecp+0, 0x1.01c83b21584a3p-53 },
> + { 0x1.88ac7d98a6699p+0, 0x1.994c2f37cb53ap-54 },
> + { 0x1.8ace5422aa0dbp+0, 0x1.6e9f156864b27p-54 },
> + { 0x1.8cf3216b5448bp+0, 0x1.de55439a2c38bp-53 },
> + { 0x1.8f1ae99157736p+0, 0x1.5cc13a2e3976cp-55 },
> + { 0x1.9145b0b91ffc5p+0, 0x1.114c368d3ed6ep-53 },
> + { 0x1.93737b0cdc5e4p+0, 0x1.e8a0387e4a814p-53 },
> + { 0x1.95a44cbc8520ep+0, 0x1.d36906d2b41f9p-53 },
> + { 0x1.97d829fde4e4fp+0, 0x1.173d241f23d18p-53 },
> + { 0x1.9a0f170ca07b9p+0, 0x1.7462137188ce7p-53 },
> + { 0x1.9c49182a3f090p+0, 0x1.c7c46b071f2bep-56 },
> + { 0x1.9e86319e32323p+0, 0x1.824ca78e64c6ep-56 },
> + { 0x1.a0c667b5de564p+0, 0x1.6535b51719567p-53 },
> + { 0x1.a309bec4a2d33p+0, 0x1.6305c7ddc36abp-54 },
> + { 0x1.a5503b23e255cp+0, 0x1.1684892395f0fp-53 },
> + { 0x1.a799e1330b358p+0, 0x1.bcb7ecac563c7p-54 },
> + { 0x1.a9e6b5579fdbfp+0, 0x1.0fac90ef7fd31p-54 },
> + { 0x1.ac36bbfd3f379p+0, 0x1.81b72cd4624ccp-53 },
> + { 0x1.ae89f995ad3adp+0, 0x1.7a1cd345dcc81p-54 },
> + { 0x1.b0e07298db665p+0, 0x1.2108559bf8deep-53 },
> + { 0x1.b33a2b84f15fap+0, 0x1.ed7fa1cf7b290p-53 },
> + { 0x1.b59728de55939p+0, 0x1.1c7102222c90ep-53 },
> + { 0x1.b7f76f2fb5e46p+0, 0x1.d54f610356a79p-53 },
> + { 0x1.ba5b030a10649p+0, 0x1.0819678d5eb69p-53 },
> + { 0x1.bcc1e904bc1d2p+0, 0x1.23dd07a2d9e84p-55 },
> + { 0x1.bf2c25bd71e08p+0, 0x1.0811ae04a31c7p-53 },
> + { 0x1.c199bdd85529cp+0, 0x1.11065895048ddp-55 },
> + { 0x1.c40ab5fffd07ap+0, 0x1.b4537e083c60ap-54 },
> + { 0x1.c67f12e57d14bp+0, 0x1.2884dff483cadp-54 },
> + { 0x1.c8f6d9406e7b5p+0, 0x1.1acbc48805c44p-56 },
> + { 0x1.cb720dcef9069p+0, 0x1.503cbd1e949dbp-56 },
> + { 0x1.cdf0b555dc3f9p+0, 0x1.889f12b1f58a3p-53 },
> + { 0x1.d072d4a07897bp+0, 0x1.1a1e45e4342b2p-53 },
> + { 0x1.d2f87080d89f1p+0, 0x1.15bc247313d44p-53 },
> + { 0x1.d5818dcfba487p+0, 0x1.2ed02d75b3707p-55 },
> + { 0x1.d80e316c98397p+0, 0x1.7709f3a09100cp-53 },
> + { 0x1.da9e603db3285p+0, 0x1.c2300696db532p-54 },
> + { 0x1.dd321f301b460p+0, 0x1.2da5778f018c3p-54 },
> + { 0x1.dfc97337b9b5ep+0, 0x1.72d195873da52p-53 },
> + { 0x1.e264614f5a128p+0, 0x1.424ec3f42f5b5p-53 },
> + { 0x1.e502ee78b3ff6p+0, 0x1.39e8980a9cc8fp-55 },
> + { 0x1.e7a51fbc74c83p+0, 0x1.2d522ca0c8de2p-54 },
> + { 0x1.ea4afa2a490d9p+0, 0x1.0b1ee7431ebb6p-53 },
> + { 0x1.ecf482d8e67f0p+0, 0x1.1b60625f7293ap-53 },
> + { 0x1.efa1bee615a27p+0, 0x1.dc7f486a4b6b0p-54 },
> + { 0x1.f252b376bba97p+0, 0x1.3a1a5bf0d8e43p-54 },
> + { 0x1.f50765b6e4540p+0, 0x1.9d3e12dd8a18bp-54 },
> + { 0x1.f7bfdad9cbe13p+0, 0x1.1227697fce57bp-53 },
> + { 0x1.fa7c1819e90d8p+0, 0x1.74853f3a5931ep-55 },
> + { 0x1.fd3c22b8f71f1p+0, 0x1.2eb74966579e7p-57 }
> +};
> +
> +/*
> + * Kernel for expl(x). x must be finite and not tiny or huge.
> + * "tiny" is anything that would make us underflow (|A6*x^6| < ~LDBL_MIN).
> + * "huge" is anything that would make fn*L1 inexact (|x| > ~2**17*ln2).
> + */
> +static inline void
> +__k_expl(long double x, long double *hip, long double *lop, int *kp)
> +{
> + long double fn, q, r, r1, r2, t, z;
> + int n, n2;
> +
> + /* Reduce x to (k*ln2 + endpoint[n2] + r1 + r2). */
> + fn = rnintl(x * INV_L);
> + r = x - fn * L1 - fn * L2; /* r = r1 + r2 done independently. */
> + n = irint(fn);
> + n2 = (unsigned)n % INTERVALS;
> + /* Depend on the sign bit being propagated: */
> + *kp = n >> LOG2_INTERVALS;
> + r1 = x - fn * L1;
> + r2 = fn * -L2;
> +
> + /* Evaluate expl(endpoint[n2] + r1 + r2) = tbl[n2] * expl(r1 + r2). */
> + z = r * r;
> +#if 0
> + q = r2 + z * (A2 + r * A3) + z * z * (A4 + r * A5) + z * z * z * A6;
> +#else
> + q = r2 + z * A2 + z * r * (A3 + r * A4 + z * (A5 + r * A6));
> +#endif
> + t = (long double)tbl[n2].lo + tbl[n2].hi;
> + *hip = tbl[n2].hi;
> + *lop = tbl[n2].lo + t * (q + r1);
> +}
> +
> +static inline void
> +k_hexpl(long double x, long double *hip, long double *lop)
> +{
> + float twopkm1;
> + int k;
> +
> + __k_expl(x, hip, lop, &k);
> + SET_FLOAT_WORD(twopkm1, 0x3f800000 + ((k - 1) << 23));
> + *hip *= twopkm1;
> + *lop *= twopkm1;
> +}
> +
> +static inline long double
> +hexpl(long double x)
> +{
> + long double hi, lo, twopkm2;
> + int k;
> +
> + twopkm2 = 1;
> + __k_expl(x, &hi, &lo, &k);
> + SET_LDBL_EXPSIGN(twopkm2, BIAS + k - 2);
> + return (lo + hi) * 2 * twopkm2;
> +}
> +
> +#ifdef _COMPLEX_H
> +/*
> + * See ../src/k_exp.c for details.
> + */
> +static inline long double complex
> +__ldexp_cexpl(long double complex z, int expt)
> +{
> + long double c, exp_x, hi, lo, s;
> + long double x, y, scale1, scale2;
> + int half_expt, k;
> +
> + x = creall(z);
> + y = cimagl(z);
> + __k_expl(x, &hi, &lo, &k);
> +
> + exp_x = (lo + hi) * 0x1p16382L;
> + expt += k - 16382;
> +
> + scale1 = 1;
> + half_expt = expt / 2;
> + SET_LDBL_EXPSIGN(scale1, BIAS + half_expt);
> + scale2 = 1;
> + SET_LDBL_EXPSIGN(scale2, BIAS + expt - half_expt);
> +
> + sincosl(y, &s, &c);
> + return (CMPLXL(c * exp_x * scale1 * scale2,
> + s * exp_x * scale1 * scale2));
> +}
> +#endif /* _COMPLEX_H */
> diff --git a/newlib/libm/ld80/k_sinl.c b/newlib/libm/ld80/k_sinl.c
> new file mode 100644
> index 000000000..af5598dba
> --- /dev/null
> +++ b/newlib/libm/ld80/k_sinl.c
> @@ -0,0 +1,62 @@
> +/* From: @(#)k_sin.c 1.3 95/01/18 */
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + * Copyright (c) 2008 Steven G. Kargl, David Schultz, Bruce D. Evans.
> + *
> + * Developed at SunSoft, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * ld80 version of k_sin.c. See ../src/k_sin.c for most comments.
> + */
> +
> +#include "math_private.h"
> +
> +static const double
> +half = 0.5;
> +
> +/*
> + * Domain [-0.7854, 0.7854], range ~[-1.89e-22, 1.915e-22]
> + * |sin(x)/x - s(x)| < 2**-72.1
> + *
> + * See ../ld80/k_cosl.c for more details about the polynomial.
> + */
> +#if defined(__amd64__) || defined(__i386__)
> +/* Long double constants are slow on these arches, and broken on i386. */
> +static const volatile double
> +S1hi = -0.16666666666666666, /* -0x15555555555555.0p-55 */
> +S1lo = -9.2563760475949941e-18; /* -0x15580000000000.0p-109 */
> +#define S1 ((long double)S1hi + S1lo)
> +#else
> +static const long double
> +S1 = -0.166666666666666666671L; /* -0xaaaaaaaaaaaaaaab.0p-66 */
> +#endif
> +
> +static const double
> +S2 = 0.0083333333333333332, /* 0x11111111111111.0p-59 */
> +S3 = -0.00019841269841269427, /* -0x1a01a01a019f81.0p-65 */
> +S4 = 0.0000027557319223597490, /* 0x171de3a55560f7.0p-71 */
> +S5 = -0.000000025052108218074604, /* -0x1ae64564f16cad.0p-78 */
> +S6 = 1.6059006598854211e-10, /* 0x161242b90243b5.0p-85 */
> +S7 = -7.6429779983024564e-13, /* -0x1ae42ebd1b2e00.0p-93 */
> +S8 = 2.6174587166648325e-15; /* 0x179372ea0b3f64.0p-101 */
> +
> +long double
> +__kernel_sinl(long double x, long double y, int iy)
> +{
> + long double z,r,v;
> +
> + z = x*x;
> + v = z*x;
> + r = S2+z*(S3+z*(S4+z*(S5+z*(S6+z*(S7+z*S8)))));
> + if(iy==0) return x+v*(S1+z*r);
> + else return x-((z*(half*y-v*r)-y)-v*S1);
> +}
> diff --git a/newlib/libm/ld80/k_sinpil.h b/newlib/libm/ld80/k_sinpil.h
> new file mode 100644
> index 000000000..00241b932
> --- /dev/null
> +++ b/newlib/libm/ld80/k_sinpil.h
> @@ -0,0 +1,42 @@
> +/*-
> + * Copyright (c) 2017 Steven G. Kargl
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice unmodified, this list of conditions, and the following
> + * disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
> + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
> + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
> + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
> + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
> + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
> + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +/*
> + * See ../src/k_sinpi.c for implementation details.
> + */
> +
> +static inline long double
> +__kernel_sinpil(long double x)
> +{
> + long double hi, lo;
> +
> + hi = (float)x;
> + lo = x - hi;
> + lo = lo * (pi_lo + pi_hi) + hi * pi_lo;
> + hi *= pi_hi;
> + _2sumF(hi, lo);
> + return (__kernel_sinl(hi, lo, 1));
> +}
> diff --git a/newlib/libm/ld80/s_cospil.c b/newlib/libm/ld80/s_cospil.c
> new file mode 100644
> index 000000000..199479e9e
> --- /dev/null
> +++ b/newlib/libm/ld80/s_cospil.c
> @@ -0,0 +1,129 @@
> +/*-
> + * Copyright (c) 2017 Steven G. Kargl
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice unmodified, this list of conditions, and the following
> + * disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
> + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
> + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
> + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
> + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
> + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
> + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +/*
> + * See ../src/s_cospi.c for implementation details.
> + */
> +
> +#ifdef __i386__
> +#include <ieeefp.h>
> +#endif
> +#include <stdint.h>
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +
> +static const double
> +pi_hi = 3.1415926814079285e+00, /* 0x400921fb 0x58000000 */
> +pi_lo =-2.7818135228334233e-08; /* 0xbe5dde97 0x3dcb3b3a */
> +
> +#include "k_cospil.h"
> +#include "k_sinpil.h"
> +
> +volatile static const double vzero = 0;
> +
> +long double
> +cospil(long double x)
> +{
> + long double ax, c;
> + uint64_t lx, m;
> + uint32_t j0;
> + uint16_t hx, ix;
> +
> + EXTRACT_LDBL80_WORDS(hx, lx, x);
> + ix = hx & 0x7fff;
> + INSERT_LDBL80_WORDS(ax, ix, lx);
> +
> + ENTERI();
> +
> + if (ix < 0x3fff) { /* |x| < 1 */
> + if (ix < 0x3ffd) { /* |x| < 0.25 */
> + if (ix < 0x3fdd) { /* |x| < 0x1p-34 */
> + if ((int)x == 0)
> + RETURNI(1);
> + }
> + RETURNI(__kernel_cospil(ax));
> + }
> +
> + if (ix < 0x3ffe) /* |x| < 0.5 */
> + c = __kernel_sinpil(0.5 - ax);
> + else if (lx < 0xc000000000000000ull) { /* |x| < 0.75 */
> + if (ax == 0.5)
> + RETURNI(0);
> + c = -__kernel_sinpil(ax - 0.5);
> + } else
> + c = -__kernel_cospil(1 - ax);
> + RETURNI(c);
> + }
> +
> + if (ix < 0x403e) { /* 1 <= |x| < 0x1p63 */
> + /* Determine integer part of ax. */
> + j0 = ix - 0x3fff + 1;
> + if (j0 < 32) {
> + lx = (lx >> 32) << 32;
> + lx &= ~(((lx << 32)-1) >> j0);
> + } else {
> + m = (uint64_t)-1 >> (j0 + 1);
> + if (lx & m) lx &= ~m;
> + }
> + INSERT_LDBL80_WORDS(x, ix, lx);
> +
> + ax -= x;
> + EXTRACT_LDBL80_WORDS(ix, lx, ax);
> +
> + if (ix < 0x3ffe) { /* |x| < 0.5 */
> + if (ix < 0x3ffd) /* |x| < 0.25 */
> + c = ix == 0 ? 1 : __kernel_cospil(ax);
> + else
> + c = __kernel_sinpil(0.5 - ax);
> +
> + } else {
> + if (lx < 0xc000000000000000ull) { /* |x| < 0.75 */
> + if (ax == 0.5)
> + RETURNI(0);
> + c = -__kernel_sinpil(ax - 0.5);
> + } else
> + c = -__kernel_cospil(1 - ax);
> + }
> +
> + if (j0 > 40)
> + x -= 0x1p40;
> + if (j0 > 30)
> + x -= 0x1p30;
> + j0 = (uint32_t)x;
> +
> + RETURNI(j0 & 1 ? -c : c);
> + }
> +
> + if (ix >= 0x7fff)
> + RETURNI(vzero / vzero);
> +
> + /*
> + * |x| >= 0x1p63 is always an even integer, so return 1.
> + */
> + RETURNI(1);
> +}
> diff --git a/newlib/libm/ld80/s_erfl.c b/newlib/libm/ld80/s_erfl.c
> new file mode 100644
> index 000000000..1ae2f9092
> --- /dev/null
> +++ b/newlib/libm/ld80/s_erfl.c
> @@ -0,0 +1,337 @@
> +/* @(#)s_erf.c 5.1 93/09/24 */
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunPro, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * See s_erf.c for complete comments.
> + *
> + * Converted to long double by Steven G. Kargl.
> + */
> +#include <float.h>
> +#ifdef __i386__
> +#include <ieeefp.h>
> +#endif
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +
> +/* XXX Prevent compilers from erroneously constant folding: */
> +static const volatile long double tiny = 0x1p-10000L;
> +
> +static const double
> +half= 0.5,
> +one = 1,
> +two = 2;
> +/*
> + * In the domain [0, 2**-34], only the first term in the power series
> + * expansion of erf(x) is used. The magnitude of the first neglected
> + * terms is less than 2**-102.
> + */
> +static const union IEEEl2bits
> +efxu = LD80C(0x8375d410a6db446c, -3, 1.28379167095512573902e-1L),
> +efx8u = LD80C(0x8375d410a6db446c, 0, 1.02703333676410059122e+0L),
> +/*
> + * Domain [0, 0.84375], range ~[-1.423e-22, 1.423e-22]:
> + * |(erf(x) - x)/x - pp(x)/qq(x)| < 2**-72.573
> + */
> +pp0u = LD80C(0x8375d410a6db446c, -3, 1.28379167095512573902e-1L),
> +pp1u = LD80C(0xa46c7d09ec3d0cec, -2, -3.21140201054840180596e-1L),
> +pp2u = LD80C(0x9b31e66325576f86, -5, -3.78893851760347812082e-2L),
> +pp3u = LD80C(0x804ac72c9a0b97dd, -7, -7.83032847030604679616e-3L),
> +pp4u = LD80C(0x9f42bcbc3d5a601d, -12, -3.03765663857082048459e-4L),
> +pp5u = LD80C(0x9ec4ad6193470693, -16, -1.89266527398167917502e-5L),
> +qq1u = LD80C(0xdb4b8eb713188d6b, -2, 4.28310832832310510579e-1L),
> +qq2u = LD80C(0xa5750835b2459bd1, -4, 8.07896272074540216658e-2L),
> +qq3u = LD80C(0x8b85d6bd6a90b51c, -7, 8.51579638189385354266e-3L),
> +qq4u = LD80C(0x87332f82cff4ff96, -11, 5.15746855583604912827e-4L),
> +qq5u = LD80C(0x83466cb6bf9dca00, -16, 1.56492109706256700009e-5L),
> +qq6u = LD80C(0xf5bf98c2f996bf63, -24, 1.14435527803073879724e-7L);
> +#define efx (efxu.e)
> +#define efx8 (efx8u.e)
> +#define pp0 (pp0u.e)
> +#define pp1 (pp1u.e)
> +#define pp2 (pp2u.e)
> +#define pp3 (pp3u.e)
> +#define pp4 (pp4u.e)
> +#define pp5 (pp5u.e)
> +#define qq1 (qq1u.e)
> +#define qq2 (qq2u.e)
> +#define qq3 (qq3u.e)
> +#define qq4 (qq4u.e)
> +#define qq5 (qq5u.e)
> +#define qq6 (qq6u.e)
> +static const union IEEEl2bits
> +erxu = LD80C(0xd7bb3d0000000000, -1, 8.42700779438018798828e-1L),
> +/*
> + * Domain [0.84375, 1.25], range ~[-8.132e-22, 8.113e-22]:
> + * |(erf(x) - erx) - pa(x)/qa(x)| < 2**-71.762
> + */
> +pa0u = LD80C(0xe8211158da02c692, -27, 1.35116960705131296711e-8L),
> +pa1u = LD80C(0xd488f89f36988618, -2, 4.15107507167065612570e-1L),
> +pa2u = LD80C(0xece74f8c63fa3942, -4, -1.15675565215949226989e-1L),
> +pa3u = LD80C(0xc8d31e020727c006, -4, 9.80589241379624665791e-2L),
> +pa4u = LD80C(0x985d5d5fafb0551f, -5, 3.71984145558422368847e-2L),
> +pa5u = LD80C(0xa5b6c4854d2f5452, -8, -5.05718799340957673661e-3L),
> +pa6u = LD80C(0x85c8d58fe3993a47, -8, 4.08277919612202243721e-3L),
> +pa7u = LD80C(0xddbfbc23677b35cf, -13, 2.11476292145347530794e-4L),
> +qa1u = LD80C(0xb8a977896f5eff3f, -1, 7.21335860303380361298e-1L),
> +qa2u = LD80C(0x9fcd662c3d4eac86, -1, 6.24227891731886593333e-1L),
> +qa3u = LD80C(0x9d0b618eac67ba07, -2, 3.06727455774491855801e-1L),
> +qa4u = LD80C(0x881a4293f6d6c92d, -3, 1.32912674218195890535e-1L),
> +qa5u = LD80C(0xbab144f07dea45bf, -5, 4.55792134233613027584e-2L),
> +qa6u = LD80C(0xa6c34ba438bdc900, -7, 1.01783980070527682680e-2L),
> +qa7u = LD80C(0x8fa866dc20717a91, -9, 2.19204436518951438183e-3L);
> +#define erx (erxu.e)
> +#define pa0 (pa0u.e)
> +#define pa1 (pa1u.e)
> +#define pa2 (pa2u.e)
> +#define pa3 (pa3u.e)
> +#define pa4 (pa4u.e)
> +#define pa5 (pa5u.e)
> +#define pa6 (pa6u.e)
> +#define pa7 (pa7u.e)
> +#define qa1 (qa1u.e)
> +#define qa2 (qa2u.e)
> +#define qa3 (qa3u.e)
> +#define qa4 (qa4u.e)
> +#define qa5 (qa5u.e)
> +#define qa6 (qa6u.e)
> +#define qa7 (qa7u.e)
> +static const union IEEEl2bits
> +/*
> + * Domain [1.25,2.85715], range ~[-2.334e-22,2.334e-22]:
> + * |log(x*erfc(x)) + x**2 + 0.5625 - ra(x)/sa(x)| < 2**-71.860
> + */
> +ra0u = LD80C(0xa1a091e0fb4f335a, -7, -9.86494298915814308249e-3L),
> +ra1u = LD80C(0xc2b0d045ae37df6b, -1, -7.60510460864878271275e-1L),
> +ra2u = LD80C(0xf2cec3ee7da636c5, 3, -1.51754798236892278250e+1L),
> +ra3u = LD80C(0x813cc205395adc7d, 7, -1.29237335516455333420e+2L),
> +ra4u = LD80C(0x8737c8b7b4062c2f, 9, -5.40871625829510494776e+2L),
> +ra5u = LD80C(0x8ffe5383c08d4943, 10, -1.15194769466026108551e+3L),
> +ra6u = LD80C(0x983573e64d5015a9, 10, -1.21767039790249025544e+3L),
> +ra7u = LD80C(0x92a794e763a6d4db, 9, -5.86618463370624636688e+2L),
> +ra8u = LD80C(0xd5ad1fae77c3d9a3, 6, -1.06838132335777049840e+2L),
> +ra9u = LD80C(0x934c1a247807bb9c, 2, -4.60303980944467334806e+0L),
> +sa1u = LD80C(0xd342f90012bb1189, 4, 2.64077014928547064865e+1L),
> +sa2u = LD80C(0x839be13d9d5da883, 8, 2.63217811300123973067e+2L),
> +sa3u = LD80C(0x9f8cba6d1ae1b24b, 10, 1.27639775710344617587e+3L),
> +sa4u = LD80C(0xcaa83f403713e33e, 11, 3.24251544209971162003e+3L),
> +sa5u = LD80C(0x8796aff2f3c47968, 12, 4.33883591261332837874e+3L),
> +sa6u = LD80C(0xb6ef97f9c753157b, 11, 2.92697460344182158454e+3L),
> +sa7u = LD80C(0xe02aee5f83773d1c, 9, 8.96670799139389559818e+2L),
> +sa8u = LD80C(0xc82b83855b88e07e, 6, 1.00084987800048510018e+2L),
> +sa9u = LD80C(0x92f030aefadf28ad, 1, 2.29591004455459083843e+0L);
> +#define ra0 (ra0u.e)
> +#define ra1 (ra1u.e)
> +#define ra2 (ra2u.e)
> +#define ra3 (ra3u.e)
> +#define ra4 (ra4u.e)
> +#define ra5 (ra5u.e)
> +#define ra6 (ra6u.e)
> +#define ra7 (ra7u.e)
> +#define ra8 (ra8u.e)
> +#define ra9 (ra9u.e)
> +#define sa1 (sa1u.e)
> +#define sa2 (sa2u.e)
> +#define sa3 (sa3u.e)
> +#define sa4 (sa4u.e)
> +#define sa5 (sa5u.e)
> +#define sa6 (sa6u.e)
> +#define sa7 (sa7u.e)
> +#define sa8 (sa8u.e)
> +#define sa9 (sa9u.e)
> +/*
> + * Domain [2.85715,7], range ~[-8.323e-22,8.390e-22]:
> + * |log(x*erfc(x)) + x**2 + 0.5625 - rb(x)/sb(x)| < 2**-70.326
> + */
> +static const union IEEEl2bits
> +rb0u = LD80C(0xa1a091cf43abcd26, -7, -9.86494292470284646962e-3L),
> +rb1u = LD80C(0xd19d2df1cbb8da0a, -1, -8.18804618389296662837e-1L),
> +rb2u = LD80C(0x9a4dd1383e5daf5b, 4, -1.92879967111618594779e+1L),
> +rb3u = LD80C(0xbff0ae9fc0751de6, 7, -1.91940164551245394969e+2L),
> +rb4u = LD80C(0xdde08465310b472b, 9, -8.87508080766577324539e+2L),
> +rb5u = LD80C(0xe796e1d38c8c70a9, 10, -1.85271506669474503781e+3L),
> +rb6u = LD80C(0xbaf655a76e0ab3b5, 10, -1.49569795581333675349e+3L),
> +rb7u = LD80C(0x95d21e3e75503c21, 8, -2.99641547972948019157e+2L),
> +sb1u = LD80C(0x814487ed823c8cbd, 5, 3.23169247732868256569e+1L),
> +sb2u = LD80C(0xbe4bfbb1301304be, 8, 3.80593618534539961773e+2L),
> +sb3u = LD80C(0x809c4ade46b927c7, 11, 2.05776827838541292848e+3L),
> +sb4u = LD80C(0xa55284359f3395a8, 12, 5.29031455540062116327e+3L),
> +sb5u = LD80C(0xbcfa72da9b820874, 12, 6.04730608102312640462e+3L),
> +sb6u = LD80C(0x9d09a35988934631, 11, 2.51260238030767176221e+3L),
> +sb7u = LD80C(0xd675bbe542c159fa, 7, 2.14459898308561015684e+2L);
> +#define rb0 (rb0u.e)
> +#define rb1 (rb1u.e)
> +#define rb2 (rb2u.e)
> +#define rb3 (rb3u.e)
> +#define rb4 (rb4u.e)
> +#define rb5 (rb5u.e)
> +#define rb6 (rb6u.e)
> +#define rb7 (rb7u.e)
> +#define sb1 (sb1u.e)
> +#define sb2 (sb2u.e)
> +#define sb3 (sb3u.e)
> +#define sb4 (sb4u.e)
> +#define sb5 (sb5u.e)
> +#define sb6 (sb6u.e)
> +#define sb7 (sb7u.e)
> +/*
> + * Domain [7,108], range ~[-4.422e-22,4.422e-22]:
> + * |log(x*erfc(x)) + x**2 + 0.5625 - rc(x)/sc(x)| < 2**-70.938
> + */
> +static const union IEEEl2bits
> +/* err = -4.422092275318925082e-22 -70.937689 */
> +rc0u = LD80C(0xa1a091cf437a17ad, -7, -9.86494292470008707260e-3L),
> +rc1u = LD80C(0xbe79c5a978122b00, -1, -7.44045595049165939261e-1L),
> +rc2u = LD80C(0xdb26f9bbe31a2794, 3, -1.36970155085888424425e+1L),
> +rc3u = LD80C(0xb5f69a38f5747ac8, 6, -9.09816453742625888546e+1L),
> +rc4u = LD80C(0xd79676d970d0a21a, 7, -2.15587750997584074147e+2L),
> +rc5u = LD80C(0xfe528153c45ec97c, 6, -1.27161142938347796666e+2L),
> +sc1u = LD80C(0xc5e8cd46d5604a96, 4, 2.47386727842204312937e+1L),
> +sc2u = LD80C(0xc5f0f5a5484520eb, 7, 1.97941248254913378865e+2L),
> +sc3u = LD80C(0x964e3c7b34db9170, 9, 6.01222441484087787522e+2L),
> +sc4u = LD80C(0x99be1b89faa0596a, 9, 6.14970430845978077827e+2L),
> +sc5u = LD80C(0xf80dfcbf37ffc5ea, 6, 1.24027318931184605891e+2L);
> +#define rc0 (rc0u.e)
> +#define rc1 (rc1u.e)
> +#define rc2 (rc2u.e)
> +#define rc3 (rc3u.e)
> +#define rc4 (rc4u.e)
> +#define rc5 (rc5u.e)
> +#define sc1 (sc1u.e)
> +#define sc2 (sc2u.e)
> +#define sc3 (sc3u.e)
> +#define sc4 (sc4u.e)
> +#define sc5 (sc5u.e)
> +
> +long double
> +erfl(long double x)
> +{
> + long double ax,R,S,P,Q,s,y,z,r;
> + uint64_t lx;
> + int32_t i;
> + uint16_t hx;
> +
> + EXTRACT_LDBL80_WORDS(hx, lx, x);
> +
> + if((hx & 0x7fff) == 0x7fff) { /* erfl(nan)=nan */
> + i = (hx>>15)<<1;
> + return (1-i)+one/x; /* erfl(+-inf)=+-1 */
> + }
> +
> + ENTERI();
> +
> + ax = fabsl(x);
> + if(ax < 0.84375) {
> + if(ax < 0x1p-34L) {
> + if(ax < 0x1p-16373L)
> + RETURNI((8*x+efx8*x)/8); /* avoid spurious underflow */
> + RETURNI(x + efx*x);
> + }
> + z = x*x;
> + r = pp0+z*(pp1+z*(pp2+z*(pp3+z*(pp4+z*pp5))));
> + s = one+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*(qq5+z*qq6)))));
> + y = r/s;
> + RETURNI(x + x*y);
> + }
> + if(ax < 1.25) {
> + s = ax-one;
> + P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*(pa6+s*pa7))))));
> + Q = one+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*(qa6+s*qa7))))));
> + if(x>=0) RETURNI(erx + P/Q); else RETURNI(-erx - P/Q);
> + }
> + if(ax >= 7) { /* inf>|x|>= 7 */
> + if(x>=0) RETURNI(one-tiny); else RETURNI(tiny-one);
> + }
> + s = one/(ax*ax);
> + if(ax < 2.85715) { /* |x| < 2.85715 */
> + R=ra0+s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*(ra5+s*(ra6+s*(ra7+
> + s*(ra8+s*ra9))))))));
> + S=one+s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*(sa5+s*(sa6+s*(sa7+
> + s*(sa8+s*sa9))))))));
> + } else { /* |x| >= 2.85715 */
> + R=rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*(rb5+s*(rb6+s*rb7))))));
> + S=one+s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*(sb5+s*(sb6+s*sb7))))));
> + }
> + z=(float)ax;
> + r=expl(-z*z-0.5625)*expl((z-ax)*(z+ax)+R/S);
> + if(x>=0) RETURNI(one-r/ax); else RETURNI(r/ax-one);
> +}
> +
> +long double
> +erfcl(long double x)
> +{
> + long double ax,R,S,P,Q,s,y,z,r;
> + uint64_t lx;
> + uint16_t hx;
> +
> + EXTRACT_LDBL80_WORDS(hx, lx, x);
> +
> + if((hx & 0x7fff) == 0x7fff) { /* erfcl(nan)=nan */
> + /* erfcl(+-inf)=0,2 */
> + return ((hx>>15)<<1)+one/x;
> + }
> +
> + ENTERI();
> +
> + ax = fabsl(x);
> + if(ax < 0.84375L) {
> + if(ax < 0x1p-34L)
> + RETURNI(one-x);
> + z = x*x;
> + r = pp0+z*(pp1+z*(pp2+z*(pp3+z*(pp4+z*pp5))));
> + s = one+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*(qq5+z*qq6)))));
> + y = r/s;
> + if(ax < 0.25L) { /* x<1/4 */
> + RETURNI(one-(x+x*y));
> + } else {
> + r = x*y;
> + r += (x-half);
> + RETURNI(half - r);
> + }
> + }
> + if(ax < 1.25L) {
> + s = ax-one;
> + P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*(pa6+s*pa7))))));
> + Q = one+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*(qa6+s*qa7))))));
> + if(x>=0) {
> + z = one-erx; RETURNI(z - P/Q);
> + } else {
> + z = (erx+P/Q); RETURNI(one+z);
> + }
> + }
> +
> + if(ax < 108) { /* |x| < 108 */
> + s = one/(ax*ax);
> + if(ax < 2.85715) { /* |x| < 2.85715 */
> + R=ra0+s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*(ra5+s*(ra6+s*(ra7+
> + s*(ra8+s*ra9))))))));
> + S=one+s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*(sa5+s*(sa6+s*(sa7+
> + s*(sa8+s*sa9))))))));
> + } else if(ax < 7) { /* | |x| < 7 */
> + R=rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*(rb5+s*(rb6+s*rb7))))));
> + S=one+s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*(sb5+s*(sb6+s*sb7))))));
> + } else {
> + if(x < -7) RETURNI(two-tiny);/* x < -7 */
> + R=rc0+s*(rc1+s*(rc2+s*(rc3+s*(rc4+s*rc5))));
> + S=one+s*(sc1+s*(sc2+s*(sc3+s*(sc4+s*sc5))));
> + }
> + z = (float)ax;
> + r = expl(-z*z-0.5625)*expl((z-ax)*(z+ax)+R/S);
> + if(x>0) RETURNI(r/ax); else RETURNI(two-r/ax);
> + } else {
> + if(x>0) RETURNI(tiny*tiny); else RETURNI(two-tiny);
> + }
> +}
> diff --git a/newlib/libm/ld80/s_exp2l.c b/newlib/libm/ld80/s_exp2l.c
> new file mode 100644
> index 000000000..421d6e2e0
> --- /dev/null
> +++ b/newlib/libm/ld80/s_exp2l.c
> @@ -0,0 +1,290 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2005-2008 David Schultz <das@FreeBSD.ORG>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include <float.h>
> +#include <stdint.h>
> +
> +#ifdef __i386__
> +#include <ieeefp.h>
> +#endif
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +
> +#define TBLBITS 7
> +#define TBLSIZE (1 << TBLBITS)
> +
> +#define BIAS (LDBL_MAX_EXP - 1)
> +
> +static volatile long double
> + huge = 0x1p10000L,
> + twom10000 = 0x1p-10000L;
> +
> +static const union IEEEl2bits
> +P1 = LD80C(0xb17217f7d1cf79ac, -1, 6.93147180559945309429e-1L);
> +
> +static const double
> +redux = 0x1.8p63 / TBLSIZE,
> +/*
> + * Domain [-0.00390625, 0.00390625], range ~[-1.7079e-23, 1.7079e-23]
> + * |exp(x) - p(x)| < 2**-75.6
> + */
> +P2 = 2.4022650695910072e-1, /* 0x1ebfbdff82c58f.0p-55 */
> +P3 = 5.5504108664816879e-2, /* 0x1c6b08d7049e1a.0p-57 */
> +P4 = 9.6181291055695180e-3, /* 0x13b2ab6fa8321a.0p-59 */
> +P5 = 1.3333563089183052e-3, /* 0x15d8806f67f251.0p-62 */
> +P6 = 1.5413361552277414e-4; /* 0x1433ddacff3441.0p-65 */
> +
> +static const double tbl[TBLSIZE * 2] = {
> + 0x1.6a09e667f3bcdp-1, -0x1.bdd3413b2648p-55,
> + 0x1.6c012750bdabfp-1, -0x1.2895667ff0cp-57,
> + 0x1.6dfb23c651a2fp-1, -0x1.bbe3a683c88p-58,
> + 0x1.6ff7df9519484p-1, -0x1.83c0f25860fp-56,
> + 0x1.71f75e8ec5f74p-1, -0x1.16e4786887bp-56,
> + 0x1.73f9a48a58174p-1, -0x1.0a8d96c65d5p-55,
> + 0x1.75feb564267c9p-1, -0x1.0245957316ep-55,
> + 0x1.780694fde5d3fp-1, 0x1.866b80a0216p-55,
> + 0x1.7a11473eb0187p-1, -0x1.41577ee0499p-56,
> + 0x1.7c1ed0130c132p-1, 0x1.f124cd1164ep-55,
> + 0x1.7e2f336cf4e62p-1, 0x1.05d02ba157ap-57,
> + 0x1.80427543e1a12p-1, -0x1.27c86626d97p-55,
> + 0x1.82589994cce13p-1, -0x1.d4c1dd41533p-55,
> + 0x1.8471a4623c7adp-1, -0x1.8d684a341cep-56,
> + 0x1.868d99b4492edp-1, -0x1.fc6f89bd4f68p-55,
> + 0x1.88ac7d98a6699p-1, 0x1.994c2f37cb5p-55,
> + 0x1.8ace5422aa0dbp-1, 0x1.6e9f156864bp-55,
> + 0x1.8cf3216b5448cp-1, -0x1.0d55e32e9e4p-57,
> + 0x1.8f1ae99157736p-1, 0x1.5cc13a2e397p-56,
> + 0x1.9145b0b91ffc6p-1, -0x1.dd6792e5825p-55,
> + 0x1.93737b0cdc5e5p-1, -0x1.75fc781b58p-58,
> + 0x1.95a44cbc8520fp-1, -0x1.64b7c96a5fp-57,
> + 0x1.97d829fde4e5p-1, -0x1.d185b7c1b86p-55,
> + 0x1.9a0f170ca07bap-1, -0x1.173bd91cee6p-55,
> + 0x1.9c49182a3f09p-1, 0x1.c7c46b071f2p-57,
> + 0x1.9e86319e32323p-1, 0x1.824ca78e64cp-57,
> + 0x1.a0c667b5de565p-1, -0x1.359495d1cd5p-55,
> + 0x1.a309bec4a2d33p-1, 0x1.6305c7ddc368p-55,
> + 0x1.a5503b23e255dp-1, -0x1.d2f6edb8d42p-55,
> + 0x1.a799e1330b358p-1, 0x1.bcb7ecac564p-55,
> + 0x1.a9e6b5579fdbfp-1, 0x1.0fac90ef7fdp-55,
> + 0x1.ac36bbfd3f37ap-1, -0x1.f9234cae76dp-56,
> + 0x1.ae89f995ad3adp-1, 0x1.7a1cd345dcc8p-55,
> + 0x1.b0e07298db666p-1, -0x1.bdef54c80e4p-55,
> + 0x1.b33a2b84f15fbp-1, -0x1.2805e3084d8p-58,
> + 0x1.b59728de5593ap-1, -0x1.c71dfbbba6ep-55,
> + 0x1.b7f76f2fb5e47p-1, -0x1.5584f7e54acp-57,
> + 0x1.ba5b030a1064ap-1, -0x1.efcd30e5429p-55,
> + 0x1.bcc1e904bc1d2p-1, 0x1.23dd07a2d9fp-56,
> + 0x1.bf2c25bd71e09p-1, -0x1.efdca3f6b9c8p-55,
> + 0x1.c199bdd85529cp-1, 0x1.11065895049p-56,
> + 0x1.c40ab5fffd07ap-1, 0x1.b4537e083c6p-55,
> + 0x1.c67f12e57d14bp-1, 0x1.2884dff483c8p-55,
> + 0x1.c8f6d9406e7b5p-1, 0x1.1acbc48805cp-57,
> + 0x1.cb720dcef9069p-1, 0x1.503cbd1e94ap-57,
> + 0x1.cdf0b555dc3fap-1, -0x1.dd83b53829dp-56,
> + 0x1.d072d4a07897cp-1, -0x1.cbc3743797a8p-55,
> + 0x1.d2f87080d89f2p-1, -0x1.d487b719d858p-55,
> + 0x1.d5818dcfba487p-1, 0x1.2ed02d75b37p-56,
> + 0x1.d80e316c98398p-1, -0x1.11ec18bedep-55,
> + 0x1.da9e603db3285p-1, 0x1.c2300696db5p-55,
> + 0x1.dd321f301b46p-1, 0x1.2da5778f019p-55,
> + 0x1.dfc97337b9b5fp-1, -0x1.1a5cd4f184b8p-55,
> + 0x1.e264614f5a129p-1, -0x1.7b627817a148p-55,
> + 0x1.e502ee78b3ff6p-1, 0x1.39e8980a9cdp-56,
> + 0x1.e7a51fbc74c83p-1, 0x1.2d522ca0c8ep-55,
> + 0x1.ea4afa2a490dap-1, -0x1.e9c23179c288p-55,
> + 0x1.ecf482d8e67f1p-1, -0x1.c93f3b411ad8p-55,
> + 0x1.efa1bee615a27p-1, 0x1.dc7f486a4b68p-55,
> + 0x1.f252b376bba97p-1, 0x1.3a1a5bf0d8e8p-55,
> + 0x1.f50765b6e454p-1, 0x1.9d3e12dd8a18p-55,
> + 0x1.f7bfdad9cbe14p-1, -0x1.dbb12d00635p-55,
> + 0x1.fa7c1819e90d8p-1, 0x1.74853f3a593p-56,
> + 0x1.fd3c22b8f71f1p-1, 0x1.2eb74966578p-58,
> + 0x1p+0, 0x0p+0,
> + 0x1.0163da9fb3335p+0, 0x1.b61299ab8cd8p-54,
> + 0x1.02c9a3e778061p+0, -0x1.19083535b08p-56,
> + 0x1.04315e86e7f85p+0, -0x1.0a31c1977c98p-54,
> + 0x1.059b0d3158574p+0, 0x1.d73e2a475b4p-55,
> + 0x1.0706b29ddf6dep+0, -0x1.c91dfe2b13cp-55,
> + 0x1.0874518759bc8p+0, 0x1.186be4bb284p-57,
> + 0x1.09e3ecac6f383p+0, 0x1.14878183161p-54,
> + 0x1.0b5586cf9890fp+0, 0x1.8a62e4adc61p-54,
> + 0x1.0cc922b7247f7p+0, 0x1.01edc16e24f8p-54,
> + 0x1.0e3ec32d3d1a2p+0, 0x1.03a1727c58p-59,
> + 0x1.0fb66affed31bp+0, -0x1.b9bedc44ebcp-57,
> + 0x1.11301d0125b51p+0, -0x1.6c51039449bp-54,
> + 0x1.12abdc06c31ccp+0, -0x1.1b514b36ca8p-58,
> + 0x1.1429aaea92dep+0, -0x1.32fbf9af1368p-54,
> + 0x1.15a98c8a58e51p+0, 0x1.2406ab9eeabp-55,
> + 0x1.172b83c7d517bp+0, -0x1.19041b9d78ap-55,
> + 0x1.18af9388c8deap+0, -0x1.11023d1970f8p-54,
> + 0x1.1a35beb6fcb75p+0, 0x1.e5b4c7b4969p-55,
> + 0x1.1bbe084045cd4p+0, -0x1.95386352ef6p-54,
> + 0x1.1d4873168b9aap+0, 0x1.e016e00a264p-54,
> + 0x1.1ed5022fcd91dp+0, -0x1.1df98027bb78p-54,
> + 0x1.2063b88628cd6p+0, 0x1.dc775814a85p-55,
> + 0x1.21f49917ddc96p+0, 0x1.2a97e9494a6p-55,
> + 0x1.2387a6e756238p+0, 0x1.9b07eb6c7058p-54,
> + 0x1.251ce4fb2a63fp+0, 0x1.ac155bef4f5p-55,
> + 0x1.26b4565e27cddp+0, 0x1.2bd339940eap-55,
> + 0x1.284dfe1f56381p+0, -0x1.a4c3a8c3f0d8p-54,
> + 0x1.29e9df51fdee1p+0, 0x1.612e8afad12p-55,
> + 0x1.2b87fd0dad99p+0, -0x1.10adcd6382p-59,
> + 0x1.2d285a6e4030bp+0, 0x1.0024754db42p-54,
> + 0x1.2ecafa93e2f56p+0, 0x1.1ca0f45d524p-56,
> + 0x1.306fe0a31b715p+0, 0x1.6f46ad23183p-55,
> + 0x1.32170fc4cd831p+0, 0x1.a9ce78e1804p-55,
> + 0x1.33c08b26416ffp+0, 0x1.327218436598p-54,
> + 0x1.356c55f929ff1p+0, -0x1.b5cee5c4e46p-55,
> + 0x1.371a7373aa9cbp+0, -0x1.63aeabf42ebp-54,
> + 0x1.38cae6d05d866p+0, -0x1.e958d3c99048p-54,
> + 0x1.3a7db34e59ff7p+0, -0x1.5e436d661f6p-56,
> + 0x1.3c32dc313a8e5p+0, -0x1.efff8375d2ap-54,
> + 0x1.3dea64c123422p+0, 0x1.ada0911f09fp-55,
> + 0x1.3fa4504ac801cp+0, -0x1.7d023f956fap-54,
> + 0x1.4160a21f72e2ap+0, -0x1.ef3691c309p-58,
> + 0x1.431f5d950a897p+0, -0x1.1c7dde35f7ap-55,
> + 0x1.44e086061892dp+0, 0x1.89b7a04ef8p-59,
> + 0x1.46a41ed1d0057p+0, 0x1.c944bd1648a8p-54,
> + 0x1.486a2b5c13cdp+0, 0x1.3c1a3b69062p-56,
> + 0x1.4a32af0d7d3dep+0, 0x1.9cb62f3d1be8p-54,
> + 0x1.4bfdad5362a27p+0, 0x1.d4397afec42p-56,
> + 0x1.4dcb299fddd0dp+0, 0x1.8ecdbbc6a78p-54,
> + 0x1.4f9b2769d2ca7p+0, -0x1.4b309d25958p-54,
> + 0x1.516daa2cf6642p+0, -0x1.f768569bd94p-55,
> + 0x1.5342b569d4f82p+0, -0x1.07abe1db13dp-55,
> + 0x1.551a4ca5d920fp+0, -0x1.d689cefede6p-55,
> + 0x1.56f4736b527dap+0, 0x1.9bb2c011d938p-54,
> + 0x1.58d12d497c7fdp+0, 0x1.295e15b9a1ep-55,
> + 0x1.5ab07dd485429p+0, 0x1.6324c0546478p-54,
> + 0x1.5c9268a5946b7p+0, 0x1.c4b1b81698p-60,
> + 0x1.5e76f15ad2148p+0, 0x1.ba6f93080e68p-54,
> + 0x1.605e1b976dc09p+0, -0x1.3e2429b56de8p-54,
> + 0x1.6247eb03a5585p+0, -0x1.383c17e40b48p-54,
> + 0x1.6434634ccc32p+0, -0x1.c483c759d89p-55,
> + 0x1.6623882552225p+0, -0x1.bb60987591cp-54,
> + 0x1.68155d44ca973p+0, 0x1.038ae44f74p-57,
> +};
> +
> +/**
> + * Compute the base 2 exponential of x for Intel 80-bit format.
> + *
> + * Accuracy: Peak error < 0.511 ulp.
> + *
> + * Method: (equally-spaced tables)
> + *
> + * Reduce x:
> + * x = 2**k + y, for integer k and |y| <= 1/2.
> + * Thus we have exp2l(x) = 2**k * exp2(y).
> + *
> + * Reduce y:
> + * y = i/TBLSIZE + z for integer i near y * TBLSIZE.
> + * Thus we have exp2(y) = exp2(i/TBLSIZE) * exp2(z),
> + * with |z| <= 2**-(TBLBITS+1).
> + *
> + * We compute exp2(i/TBLSIZE) via table lookup and exp2(z) via a
> + * degree-6 minimax polynomial with maximum error under 2**-75.6.
> + * The table entries each have 104 bits of accuracy, encoded as
> + * a pair of double precision values.
> + */
> +long double
> +exp2l(long double x)
> +{
> + union IEEEl2bits u, v;
> + long double r, twopk, twopkp10000, z;
> + uint32_t hx, ix, i0;
> + int k;
> +
> + /* Filter out exceptional cases. */
> + u.e = x;
> + hx = u.xbits.expsign;
> + ix = hx & 0x7fff;
> + if (ix >= BIAS + 14) { /* |x| >= 16384 or x is NaN */
> + if (ix == BIAS + LDBL_MAX_EXP) {
> + if (hx & 0x8000 && u.xbits.man == 1ULL << 63)
> + return (0.0L); /* x is -Inf */
> + return (x + x); /* x is +Inf, NaN or unsupported */
> + }
> + if (x >= 16384)
> + return (huge * huge); /* overflow */
> + if (x <= -16446)
> + return (twom10000 * twom10000); /* underflow */
> + } else if (ix <= BIAS - 66) { /* |x| < 0x1p-65 (includes pseudos) */
> + return (1.0L + x); /* 1 with inexact */
> + }
> +
> + ENTERI();
> +
> + /*
> + * Reduce x, computing z, i0, and k. The low bits of x + redux
> + * contain the 16-bit integer part of the exponent (k) followed by
> + * TBLBITS fractional bits (i0). We use bit tricks to extract these
> + * as integers, then set z to the remainder.
> + *
> + * Example: Suppose x is 0xabc.123456p0 and TBLBITS is 8.
> + * Then the low-order word of x + redux is 0x000abc12,
> + * We split this into k = 0xabc and i0 = 0x12 (adjusted to
> + * index into the table), then we compute z = 0x0.003456p0.
> + *
> + * XXX If the exponent is negative, the computation of k depends on
> + * '>>' doing sign extension.
> + */
> + u.e = x + redux;
> + i0 = u.bits.manl + TBLSIZE / 2;
> + k = (int)i0 >> TBLBITS;
> + i0 = (i0 & (TBLSIZE - 1)) << 1;
> + u.e -= redux;
> + z = x - u.e;
> + v.xbits.man = 1ULL << 63;
> + if (k >= LDBL_MIN_EXP) {
> + v.xbits.expsign = BIAS + k;
> + twopk = v.e;
> + } else {
> + v.xbits.expsign = BIAS + k + 10000;
> + twopkp10000 = v.e;
> + }
> +
> + /* Compute r = exp2l(y) = exp2lt[i0] * p(z). */
> + long double t_hi = tbl[i0];
> + long double t_lo = tbl[i0 + 1];
> + r = t_lo + (t_hi + t_lo) * z * (P1.e + z * (P2 + z * (P3 + z * (P4
> + + z * (P5 + z * P6))))) + t_hi;
> +
> + /* Scale by 2**k. */
> + if (k >= LDBL_MIN_EXP) {
> + if (k == LDBL_MAX_EXP)
> + RETURNI(r * 2.0 * 0x1p16383L);
> + RETURNI(r * twopk);
> + } else {
> + RETURNI(r * twopkp10000 * twom10000);
> + }
> +}
> diff --git a/newlib/libm/ld80/s_expl.c b/newlib/libm/ld80/s_expl.c
> new file mode 100644
> index 000000000..e46e73f0c
> --- /dev/null
> +++ b/newlib/libm/ld80/s_expl.c
> @@ -0,0 +1,279 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2009-2013 Steven G. Kargl
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice unmodified, this list of conditions, and the following
> + * disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
> + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
> + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
> + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
> + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
> + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
> + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + *
> + * Optimized by Bruce D. Evans.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/**
> + * Compute the exponential of x for Intel 80-bit format. This is based on:
> + *
> + * PTP Tang, "Table-driven implementation of the exponential function
> + * in IEEE floating-point arithmetic," ACM Trans. Math. Soft., 15,
> + * 144-157 (1989).
> + *
> + * where the 32 table entries have been expanded to INTERVALS (see below).
> + */
> +
> +#include <float.h>
> +
> +#ifdef __i386__
> +#include <ieeefp.h>
> +#endif
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +#include "k_expl.h"
> +
> +/* XXX Prevent compilers from erroneously constant folding these: */
> +static const volatile long double
> +huge = 0x1p10000L,
> +tiny = 0x1p-10000L;
> +
> +static const long double
> +twom10000 = 0x1p-10000L;
> +
> +static const union IEEEl2bits
> +/* log(2**16384 - 0.5) rounded towards zero: */
> +/* log(2**16384 - 0.5 + 1) rounded towards zero for expm1l() is the same: */
> +o_thresholdu = LD80C(0xb17217f7d1cf79ab, 13, 11356.5234062941439488L),
> +#define o_threshold (o_thresholdu.e)
> +/* log(2**(-16381-64-1)) rounded towards zero: */
> +u_thresholdu = LD80C(0xb21dfe7f09e2baa9, 13, -11399.4985314888605581L);
> +#define u_threshold (u_thresholdu.e)
> +
> +long double
> +expl(long double x)
> +{
> + union IEEEl2bits u;
> + long double hi, lo, t, twopk;
> + int k;
> + uint16_t hx, ix;
> +
> + DOPRINT_START(&x);
> +
> + /* Filter out exceptional cases. */
> + u.e = x;
> + hx = u.xbits.expsign;
> + ix = hx & 0x7fff;
> + if (ix >= BIAS + 13) { /* |x| >= 8192 or x is NaN */
> + if (ix == BIAS + LDBL_MAX_EXP) {
> + if (hx & 0x8000) /* x is -Inf, -NaN or unsupported */
> + RETURNP(-1 / x);
> + RETURNP(x + x); /* x is +Inf, +NaN or unsupported */
> + }
> + if (x > o_threshold)
> + RETURNP(huge * huge);
> + if (x < u_threshold)
> + RETURNP(tiny * tiny);
> + } else if (ix < BIAS - 75) { /* |x| < 0x1p-75 (includes pseudos) */
> + RETURN2P(1, x); /* 1 with inexact iff x != 0 */
> + }
> +
> + ENTERI();
> +
> + twopk = 1;
> + __k_expl(x, &hi, &lo, &k);
> + t = SUM2P(hi, lo);
> +
> + /* Scale by 2**k. */
> + if (k >= LDBL_MIN_EXP) {
> + if (k == LDBL_MAX_EXP)
> + RETURNI(t * 2 * 0x1p16383L);
> + SET_LDBL_EXPSIGN(twopk, BIAS + k);
> + RETURNI(t * twopk);
> + } else {
> + SET_LDBL_EXPSIGN(twopk, BIAS + k + 10000);
> + RETURNI(t * twopk * twom10000);
> + }
> +}
> +
> +/**
> + * Compute expm1l(x) for Intel 80-bit format. This is based on:
> + *
> + * PTP Tang, "Table-driven implementation of the Expm1 function
> + * in IEEE floating-point arithmetic," ACM Trans. Math. Soft., 18,
> + * 211-222 (1992).
> + */
> +
> +/*
> + * Our T1 and T2 are chosen to be approximately the points where method
> + * A and method B have the same accuracy. Tang's T1 and T2 are the
> + * points where method A's accuracy changes by a full bit. For Tang,
> + * this drop in accuracy makes method A immediately less accurate than
> + * method B, but our larger INTERVALS makes method A 2 bits more
> + * accurate so it remains the most accurate method significantly
> + * closer to the origin despite losing the full bit in our extended
> + * range for it.
> + */
> +static const double
> +T1 = -0.1659, /* ~-30.625/128 * log(2) */
> +T2 = 0.1659; /* ~30.625/128 * log(2) */
> +
> +/*
> + * Domain [-0.1659, 0.1659], range ~[-2.6155e-22, 2.5507e-23]:
> + * |(exp(x)-1-x-x**2/2)/x - p(x)| < 2**-71.6
> + *
> + * XXX the coeffs aren't very carefully rounded, and I get 2.8 more bits,
> + * but unlike for ld128 we can't drop any terms.
> + */
> +static const union IEEEl2bits
> +B3 = LD80C(0xaaaaaaaaaaaaaaab, -3, 1.66666666666666666671e-1L),
> +B4 = LD80C(0xaaaaaaaaaaaaaaac, -5, 4.16666666666666666712e-2L);
> +
> +static const double
> +B5 = 8.3333333333333245e-3, /* 0x1.111111111110cp-7 */
> +B6 = 1.3888888888888861e-3, /* 0x1.6c16c16c16c0ap-10 */
> +B7 = 1.9841269841532042e-4, /* 0x1.a01a01a0319f9p-13 */
> +B8 = 2.4801587302069236e-5, /* 0x1.a01a01a03cbbcp-16 */
> +B9 = 2.7557316558468562e-6, /* 0x1.71de37fd33d67p-19 */
> +B10 = 2.7557315829785151e-7, /* 0x1.27e4f91418144p-22 */
> +B11 = 2.5063168199779829e-8, /* 0x1.ae94fabdc6b27p-26 */
> +B12 = 2.0887164654459567e-9; /* 0x1.1f122d6413fe1p-29 */
> +
> +long double
> +expm1l(long double x)
> +{
> + union IEEEl2bits u, v;
> + long double fn, hx2_hi, hx2_lo, q, r, r1, r2, t, twomk, twopk, x_hi;
> + long double x_lo, x2, z;
> + long double x4;
> + int k, n, n2;
> + uint16_t hx, ix;
> +
> + DOPRINT_START(&x);
> +
> + /* Filter out exceptional cases. */
> + u.e = x;
> + hx = u.xbits.expsign;
> + ix = hx & 0x7fff;
> + if (ix >= BIAS + 6) { /* |x| >= 64 or x is NaN */
> + if (ix == BIAS + LDBL_MAX_EXP) {
> + if (hx & 0x8000) /* x is -Inf, -NaN or unsupported */
> + RETURNP(-1 / x - 1);
> + RETURNP(x + x); /* x is +Inf, +NaN or unsupported */
> + }
> + if (x > o_threshold)
> + RETURNP(huge * huge);
> + /*
> + * expm1l() never underflows, but it must avoid
> + * unrepresentable large negative exponents. We used a
> + * much smaller threshold for large |x| above than in
> + * expl() so as to handle not so large negative exponents
> + * in the same way as large ones here.
> + */
> + if (hx & 0x8000) /* x <= -64 */
> + RETURN2P(tiny, -1); /* good for x < -65ln2 - eps */
> + }
> +
> + ENTERI();
> +
> + if (T1 < x && x < T2) {
> + if (ix < BIAS - 74) { /* |x| < 0x1p-74 (includes pseudos) */
> + /* x (rounded) with inexact if x != 0: */
> + RETURNPI(x == 0 ? x :
> + (0x1p100 * x + fabsl(x)) * 0x1p-100);
> + }
> +
> + x2 = x * x;
> + x4 = x2 * x2;
> + q = x4 * (x2 * (x4 *
> + /*
> + * XXX the number of terms is no longer good for
> + * pairwise grouping of all except B3, and the
> + * grouping is no longer from highest down.
> + */
> + (x2 * B12 + (x * B11 + B10)) +
> + (x2 * (x * B9 + B8) + (x * B7 + B6))) +
> + (x * B5 + B4.e)) + x2 * x * B3.e;
> +
> + x_hi = (float)x;
> + x_lo = x - x_hi;
> + hx2_hi = x_hi * x_hi / 2;
> + hx2_lo = x_lo * (x + x_hi) / 2;
> + if (ix >= BIAS - 7)
> + RETURN2PI(hx2_hi + x_hi, hx2_lo + x_lo + q);
> + else
> + RETURN2PI(x, hx2_lo + q + hx2_hi);
> + }
> +
> + /* Reduce x to (k*ln2 + endpoint[n2] + r1 + r2). */
> + fn = rnintl(x * INV_L);
> + n = irint(fn);
> + n2 = (unsigned)n % INTERVALS;
> + k = n >> LOG2_INTERVALS;
> + r1 = x - fn * L1;
> + r2 = fn * -L2;
> + r = r1 + r2;
> +
> + /* Prepare scale factor. */
> + v.e = 1;
> + v.xbits.expsign = BIAS + k;
> + twopk = v.e;
> +
> + /*
> + * Evaluate lower terms of
> + * expl(endpoint[n2] + r1 + r2) = tbl[n2] * expl(r1 + r2).
> + */
> + z = r * r;
> + q = r2 + z * (A2 + r * A3) + z * z * (A4 + r * A5) + z * z * z * A6;
> +
> + t = (long double)tbl[n2].lo + tbl[n2].hi;
> +
> + if (k == 0) {
> + t = SUM2P(tbl[n2].hi - 1, tbl[n2].lo * (r1 + 1) + t * q +
> + tbl[n2].hi * r1);
> + RETURNI(t);
> + }
> + if (k == -1) {
> + t = SUM2P(tbl[n2].hi - 2, tbl[n2].lo * (r1 + 1) + t * q +
> + tbl[n2].hi * r1);
> + RETURNI(t / 2);
> + }
> + if (k < -7) {
> + t = SUM2P(tbl[n2].hi, tbl[n2].lo + t * (q + r1));
> + RETURNI(t * twopk - 1);
> + }
> + if (k > 2 * LDBL_MANT_DIG - 1) {
> + t = SUM2P(tbl[n2].hi, tbl[n2].lo + t * (q + r1));
> + if (k == LDBL_MAX_EXP)
> + RETURNI(t * 2 * 0x1p16383L - 1);
> + RETURNI(t * twopk - 1);
> + }
> +
> + v.xbits.expsign = BIAS - k;
> + twomk = v.e;
> +
> + if (k > LDBL_MANT_DIG - 1)
> + t = SUM2P(tbl[n2].hi, tbl[n2].lo - twomk + t * (q + r1));
> + else
> + t = SUM2P(tbl[n2].hi - twomk, tbl[n2].lo + t * (q + r1));
> + RETURNI(t * twopk);
> +}
> diff --git a/newlib/libm/ld80/s_logl.c b/newlib/libm/ld80/s_logl.c
> new file mode 100644
> index 000000000..c74519caf
> --- /dev/null
> +++ b/newlib/libm/ld80/s_logl.c
> @@ -0,0 +1,722 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2007-2013 Bruce D. Evans
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice unmodified, this list of conditions, and the following
> + * disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
> + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
> + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
> + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
> + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
> + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
> + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/**
> + * Implementation of the natural logarithm of x for Intel 80-bit format.
> + *
> + * First decompose x into its base 2 representation:
> + *
> + * log(x) = log(X * 2**k), where X is in [1, 2)
> + * = log(X) + k * log(2).
> + *
> + * Let X = X_i + e, where X_i is the center of one of the intervals
> + * [-1.0/256, 1.0/256), [1.0/256, 3.0/256), .... [2.0-1.0/256, 2.0+1.0/256)
> + * and X is in this interval. Then
> + *
> + * log(X) = log(X_i + e)
> + * = log(X_i * (1 + e / X_i))
> + * = log(X_i) + log(1 + e / X_i).
> + *
> + * The values log(X_i) are tabulated below. Let d = e / X_i and use
> + *
> + * log(1 + d) = p(d)
> + *
> + * where p(d) = d - 0.5*d*d + ... is a special minimax polynomial of
> + * suitably high degree.
> + *
> + * To get sufficiently small roundoff errors, k * log(2), log(X_i), and
> + * sometimes (if |k| is not large) the first term in p(d) must be evaluated
> + * and added up in extra precision. Extra precision is not needed for the
> + * rest of p(d). In the worst case when k = 0 and log(X_i) is 0, the final
> + * error is controlled mainly by the error in the second term in p(d). The
> + * error in this term itself is at most 0.5 ulps from the d*d operation in
> + * it. The error in this term relative to the first term is thus at most
> + * 0.5 * |-0.5| * |d| < 1.0/1024 ulps. We aim for an accumulated error of
> + * at most twice this at the point of the final rounding step. Thus the
> + * final error should be at most 0.5 + 1.0/512 = 0.5020 ulps. Exhaustive
> + * testing of a float variant of this function showed a maximum final error
> + * of 0.5008 ulps. Non-exhaustive testing of a double variant of this
> + * function showed a maximum final error of 0.5078 ulps (near 1+1.0/256).
> + *
> + * We made the maximum of |d| (and thus the total relative error and the
> + * degree of p(d)) small by using a large number of intervals. Using
> + * centers of intervals instead of endpoints reduces this maximum by a
> + * factor of 2 for a given number of intervals. p(d) is special only
> + * in beginning with the Taylor coefficients 0 + 1*d, which tends to happen
> + * naturally. The most accurate minimax polynomial of a given degree might
> + * be different, but then we wouldn't want it since we would have to do
> + * extra work to avoid roundoff error (especially for P0*d instead of d).
> + */
> +
> +#ifdef DEBUG
> +#include <assert.h>
> +#include <fenv.h>
> +#endif
> +
> +#ifdef __i386__
> +#include <ieeefp.h>
> +#endif
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#define i386_SSE_GOOD
> +#ifndef NO_STRUCT_RETURN
> +#define STRUCT_RETURN
> +#endif
> +#include "math_private.h"
> +
> +#if !defined(NO_UTAB) && !defined(NO_UTABL)
> +#define USE_UTAB
> +#endif
> +
> +/*
> + * Domain [-0.005280, 0.004838], range ~[-5.1736e-22, 5.1738e-22]:
> + * |log(1 + d)/d - p(d)| < 2**-70.7
> + */
> +static const double
> +P2 = -0.5,
> +P3 = 3.3333333333333359e-1, /* 0x1555555555555a.0p-54 */
> +P4 = -2.5000000000004424e-1, /* -0x1000000000031d.0p-54 */
> +P5 = 1.9999999992970016e-1, /* 0x1999999972f3c7.0p-55 */
> +P6 = -1.6666666072191585e-1, /* -0x15555548912c09.0p-55 */
> +P7 = 1.4286227413310518e-1, /* 0x12494f9d9def91.0p-55 */
> +P8 = -1.2518388626763144e-1; /* -0x1006068cc0b97c.0p-55 */
> +
> +static volatile const double zero = 0;
> +
> +#define INTERVALS 128
> +#define LOG2_INTERVALS 7
> +#define TSIZE (INTERVALS + 1)
> +#define G(i) (T[(i)].G)
> +#define F_hi(i) (T[(i)].F_hi)
> +#define F_lo(i) (T[(i)].F_lo)
> +#define ln2_hi F_hi(TSIZE - 1)
> +#define ln2_lo F_lo(TSIZE - 1)
> +#define E(i) (U[(i)].E)
> +#define H(i) (U[(i)].H)
> +
> +static const struct {
> + float G; /* 1/(1 + i/128) rounded to 8/9 bits */
> + float F_hi; /* log(1 / G_i) rounded (see below) */
> + double F_lo; /* next 53 bits for log(1 / G_i) */
> +} T[TSIZE] = {
> + /*
> + * ln2_hi and each F_hi(i) are rounded to a number of bits that
> + * makes F_hi(i) + dk*ln2_hi exact for all i and all dk.
> + *
> + * The last entry (for X just below 2) is used to define ln2_hi
> + * and ln2_lo, to ensure that F_hi(i) and F_lo(i) cancel exactly
> + * with dk*ln2_hi and dk*ln2_lo, respectively, when dk = -1.
> + * This is needed for accuracy when x is just below 1. (To avoid
> + * special cases, such x are "reduced" strangely to X just below
> + * 2 and dk = -1, and then the exact cancellation is needed
> + * because any the error from any non-exactness would be too
> + * large).
> + *
> + * We want to share this table between double precision and ld80,
> + * so the relevant range of dk is the larger one of ld80
> + * ([-16445, 16383]) and the relevant exactness requirement is
> + * the stricter one of double precision. The maximum number of
> + * bits in F_hi(i) that works is very dependent on i but has
> + * a minimum of 33. We only need about 12 bits in F_hi(i) for
> + * it to provide enough extra precision in double precision (11
> + * more than that are required for ld80).
> + *
> + * We round F_hi(i) to 24 bits so that it can have type float,
> + * mainly to minimize the size of the table. Using all 24 bits
> + * in a float for it automatically satisfies the above constraints.
> + */
> + { 0x800000.0p-23, 0, 0 },
> + { 0xfe0000.0p-24, 0x8080ac.0p-30, -0x14ee431dae6675.0p-84 },
> + { 0xfc0000.0p-24, 0x8102b3.0p-29, -0x1db29ee2d83718.0p-84 },
> + { 0xfa0000.0p-24, 0xc24929.0p-29, 0x1191957d173698.0p-83 },
> + { 0xf80000.0p-24, 0x820aec.0p-28, 0x13ce8888e02e79.0p-82 },
> + { 0xf60000.0p-24, 0xa33577.0p-28, -0x17a4382ce6eb7c.0p-82 },
> + { 0xf48000.0p-24, 0xbc42cb.0p-28, -0x172a21161a1076.0p-83 },
> + { 0xf30000.0p-24, 0xd57797.0p-28, -0x1e09de07cb9589.0p-82 },
> + { 0xf10000.0p-24, 0xf7518e.0p-28, 0x1ae1eec1b036c5.0p-91 },
> + { 0xef0000.0p-24, 0x8cb9df.0p-27, -0x1d7355325d560e.0p-81 },
> + { 0xed8000.0p-24, 0x999ec0.0p-27, -0x1f9f02d256d503.0p-82 },
> + { 0xec0000.0p-24, 0xa6988b.0p-27, -0x16fc0a9d12c17a.0p-83 },
> + { 0xea0000.0p-24, 0xb80698.0p-27, 0x15d581c1e8da9a.0p-81 },
> + { 0xe80000.0p-24, 0xc99af3.0p-27, -0x1535b3ba8f150b.0p-83 },
> + { 0xe70000.0p-24, 0xd273b2.0p-27, 0x163786f5251af0.0p-85 },
> + { 0xe50000.0p-24, 0xe442c0.0p-27, 0x1bc4b2368e32d5.0p-84 },
> + { 0xe38000.0p-24, 0xf1b83f.0p-27, 0x1c6090f684e676.0p-81 },
> + { 0xe20000.0p-24, 0xff448a.0p-27, -0x1890aa69ac9f42.0p-82 },
> + { 0xe08000.0p-24, 0x8673f6.0p-26, 0x1b9985194b6b00.0p-80 },
> + { 0xdf0000.0p-24, 0x8d515c.0p-26, -0x1dc08d61c6ef1e.0p-83 },
> + { 0xdd8000.0p-24, 0x943a9e.0p-26, -0x1f72a2dac729b4.0p-82 },
> + { 0xdc0000.0p-24, 0x9b2fe6.0p-26, -0x1fd4dfd3a0afb9.0p-80 },
> + { 0xda8000.0p-24, 0xa2315d.0p-26, -0x11b26121629c47.0p-82 },
> + { 0xd90000.0p-24, 0xa93f2f.0p-26, 0x1286d633e8e569.0p-81 },
> + { 0xd78000.0p-24, 0xb05988.0p-26, 0x16128eba936770.0p-84 },
> + { 0xd60000.0p-24, 0xb78094.0p-26, 0x16ead577390d32.0p-80 },
> + { 0xd50000.0p-24, 0xbc4c6c.0p-26, 0x151131ccf7c7b7.0p-81 },
> + { 0xd38000.0p-24, 0xc3890a.0p-26, -0x115e2cd714bd06.0p-80 },
> + { 0xd20000.0p-24, 0xcad2d7.0p-26, -0x1847f406ebd3b0.0p-82 },
> + { 0xd10000.0p-24, 0xcfb620.0p-26, 0x1c2259904d6866.0p-81 },
> + { 0xcf8000.0p-24, 0xd71653.0p-26, 0x1ece57a8d5ae55.0p-80 },
> + { 0xce0000.0p-24, 0xde843a.0p-26, -0x1f109d4bc45954.0p-81 },
> + { 0xcd0000.0p-24, 0xe37fde.0p-26, 0x1bc03dc271a74d.0p-81 },
> + { 0xcb8000.0p-24, 0xeb050c.0p-26, -0x1bf2badc0df842.0p-85 },
> + { 0xca0000.0p-24, 0xf29878.0p-26, -0x18efededd89fbe.0p-87 },
> + { 0xc90000.0p-24, 0xf7ad6f.0p-26, 0x1373ff977baa69.0p-81 },
> + { 0xc80000.0p-24, 0xfcc8e3.0p-26, 0x196766f2fb3283.0p-80 },
> + { 0xc68000.0p-24, 0x823f30.0p-25, 0x19bd076f7c434e.0p-79 },
> + { 0xc58000.0p-24, 0x84d52c.0p-25, -0x1a327257af0f46.0p-79 },
> + { 0xc40000.0p-24, 0x88bc74.0p-25, 0x113f23def19c5a.0p-81 },
> + { 0xc30000.0p-24, 0x8b5ae6.0p-25, 0x1759f6e6b37de9.0p-79 },
> + { 0xc20000.0p-24, 0x8dfccb.0p-25, 0x1ad35ca6ed5148.0p-81 },
> + { 0xc10000.0p-24, 0x90a22b.0p-25, 0x1a1d71a87deba4.0p-79 },
> + { 0xbf8000.0p-24, 0x94a0d8.0p-25, -0x139e5210c2b731.0p-80 },
> + { 0xbe8000.0p-24, 0x974f16.0p-25, -0x18f6ebcff3ed73.0p-81 },
> + { 0xbd8000.0p-24, 0x9a00f1.0p-25, -0x1aa268be39aab7.0p-79 },
> + { 0xbc8000.0p-24, 0x9cb672.0p-25, -0x14c8815839c566.0p-79 },
> + { 0xbb0000.0p-24, 0xa0cda1.0p-25, 0x1eaf46390dbb24.0p-81 },
> + { 0xba0000.0p-24, 0xa38c6e.0p-25, 0x138e20d831f698.0p-81 },
> + { 0xb90000.0p-24, 0xa64f05.0p-25, -0x1e8d3c41123616.0p-82 },
> + { 0xb80000.0p-24, 0xa91570.0p-25, 0x1ce28f5f3840b2.0p-80 },
> + { 0xb70000.0p-24, 0xabdfbb.0p-25, -0x186e5c0a424234.0p-79 },
> + { 0xb60000.0p-24, 0xaeadef.0p-25, -0x14d41a0b2a08a4.0p-83 },
> + { 0xb50000.0p-24, 0xb18018.0p-25, 0x16755892770634.0p-79 },
> + { 0xb40000.0p-24, 0xb45642.0p-25, -0x16395ebe59b152.0p-82 },
> + { 0xb30000.0p-24, 0xb73077.0p-25, 0x1abc65c8595f09.0p-80 },
> + { 0xb20000.0p-24, 0xba0ec4.0p-25, -0x1273089d3dad89.0p-79 },
> + { 0xb10000.0p-24, 0xbcf133.0p-25, 0x10f9f67b1f4bbf.0p-79 },
> + { 0xb00000.0p-24, 0xbfd7d2.0p-25, -0x109fab90486409.0p-80 },
> + { 0xaf0000.0p-24, 0xc2c2ac.0p-25, -0x1124680aa43333.0p-79 },
> + { 0xae8000.0p-24, 0xc439b3.0p-25, -0x1f360cc4710fc0.0p-80 },
> + { 0xad8000.0p-24, 0xc72afd.0p-25, -0x132d91f21d89c9.0p-80 },
> + { 0xac8000.0p-24, 0xca20a2.0p-25, -0x16bf9b4d1f8da8.0p-79 },
> + { 0xab8000.0p-24, 0xcd1aae.0p-25, 0x19deb5ce6a6a87.0p-81 },
> + { 0xaa8000.0p-24, 0xd0192f.0p-25, 0x1a29fb48f7d3cb.0p-79 },
> + { 0xaa0000.0p-24, 0xd19a20.0p-25, 0x1127d3c6457f9d.0p-81 },
> + { 0xa90000.0p-24, 0xd49f6a.0p-25, -0x1ba930e486a0ac.0p-81 },
> + { 0xa80000.0p-24, 0xd7a94b.0p-25, -0x1b6e645f31549e.0p-79 },
> + { 0xa70000.0p-24, 0xdab7d0.0p-25, 0x1118a425494b61.0p-80 },
> + { 0xa68000.0p-24, 0xdc40d5.0p-25, 0x1966f24d29d3a3.0p-80 },
> + { 0xa58000.0p-24, 0xdf566d.0p-25, -0x1d8e52eb2248f1.0p-82 },
> + { 0xa48000.0p-24, 0xe270ce.0p-25, -0x1ee370f96e6b68.0p-80 },
> + { 0xa40000.0p-24, 0xe3ffce.0p-25, 0x1d155324911f57.0p-80 },
> + { 0xa30000.0p-24, 0xe72179.0p-25, -0x1fe6e2f2f867d9.0p-80 },
> + { 0xa20000.0p-24, 0xea4812.0p-25, 0x1b7be9add7f4d4.0p-80 },
> + { 0xa18000.0p-24, 0xebdd3d.0p-25, 0x1b3cfb3f7511dd.0p-79 },
> + { 0xa08000.0p-24, 0xef0b5b.0p-25, -0x1220de1f730190.0p-79 },
> + { 0xa00000.0p-24, 0xf0a451.0p-25, -0x176364c9ac81cd.0p-80 },
> + { 0x9f0000.0p-24, 0xf3da16.0p-25, 0x1eed6b9aafac8d.0p-81 },
> + { 0x9e8000.0p-24, 0xf576e9.0p-25, 0x1d593218675af2.0p-79 },
> + { 0x9d8000.0p-24, 0xf8b47c.0p-25, -0x13e8eb7da053e0.0p-84 },
> + { 0x9d0000.0p-24, 0xfa553f.0p-25, 0x1c063259bcade0.0p-79 },
> + { 0x9c0000.0p-24, 0xfd9ac5.0p-25, 0x1ef491085fa3c1.0p-79 },
> + { 0x9b8000.0p-24, 0xff3f8c.0p-25, 0x1d607a7c2b8c53.0p-79 },
> + { 0x9a8000.0p-24, 0x814697.0p-24, -0x12ad3817004f3f.0p-78 },
> + { 0x9a0000.0p-24, 0x821b06.0p-24, -0x189fc53117f9e5.0p-81 },
> + { 0x990000.0p-24, 0x83c5f8.0p-24, 0x14cf15a048907b.0p-79 },
> + { 0x988000.0p-24, 0x849c7d.0p-24, 0x1cbb1d35fb8287.0p-78 },
> + { 0x978000.0p-24, 0x864ba6.0p-24, 0x1128639b814f9c.0p-78 },
> + { 0x970000.0p-24, 0x87244c.0p-24, 0x184733853300f0.0p-79 },
> + { 0x968000.0p-24, 0x87fdaa.0p-24, 0x109d23aef77dd6.0p-80 },
> + { 0x958000.0p-24, 0x89b293.0p-24, -0x1a81ef367a59de.0p-78 },
> + { 0x950000.0p-24, 0x8a8e20.0p-24, -0x121ad3dbb2f452.0p-78 },
> + { 0x948000.0p-24, 0x8b6a6a.0p-24, -0x1cfb981628af72.0p-79 },
> + { 0x938000.0p-24, 0x8d253a.0p-24, -0x1d21730ea76cfe.0p-79 },
> + { 0x930000.0p-24, 0x8e03c2.0p-24, 0x135cc00e566f77.0p-78 },
> + { 0x928000.0p-24, 0x8ee30d.0p-24, -0x10fcb5df257a26.0p-80 },
> + { 0x918000.0p-24, 0x90a3ee.0p-24, -0x16e171b15433d7.0p-79 },
> + { 0x910000.0p-24, 0x918587.0p-24, -0x1d050da07f3237.0p-79 },
> + { 0x908000.0p-24, 0x9267e7.0p-24, 0x1be03669a5268d.0p-79 },
> + { 0x8f8000.0p-24, 0x942f04.0p-24, 0x10b28e0e26c337.0p-79 },
> + { 0x8f0000.0p-24, 0x9513c3.0p-24, 0x1a1d820da57cf3.0p-78 },
> + { 0x8e8000.0p-24, 0x95f950.0p-24, -0x19ef8f13ae3cf1.0p-79 },
> + { 0x8e0000.0p-24, 0x96dfab.0p-24, -0x109e417a6e507c.0p-78 },
> + { 0x8d0000.0p-24, 0x98aed2.0p-24, 0x10d01a2c5b0e98.0p-79 },
> + { 0x8c8000.0p-24, 0x9997a2.0p-24, -0x1d6a50d4b61ea7.0p-78 },
> + { 0x8c0000.0p-24, 0x9a8145.0p-24, 0x1b3b190b83f952.0p-78 },
> + { 0x8b8000.0p-24, 0x9b6bbf.0p-24, 0x13a69fad7e7abe.0p-78 },
> + { 0x8b0000.0p-24, 0x9c5711.0p-24, -0x11cd12316f576b.0p-78 },
> + { 0x8a8000.0p-24, 0x9d433b.0p-24, 0x1c95c444b807a2.0p-79 },
> + { 0x898000.0p-24, 0x9f1e22.0p-24, -0x1b9c224ea698c3.0p-79 },
> + { 0x890000.0p-24, 0xa00ce1.0p-24, 0x125ca93186cf0f.0p-81 },
> + { 0x888000.0p-24, 0xa0fc80.0p-24, -0x1ee38a7bc228b3.0p-79 },
> + { 0x880000.0p-24, 0xa1ed00.0p-24, -0x1a0db876613d20.0p-78 },
> + { 0x878000.0p-24, 0xa2de62.0p-24, 0x193224e8516c01.0p-79 },
> + { 0x870000.0p-24, 0xa3d0a9.0p-24, 0x1fa28b4d2541ad.0p-79 },
> + { 0x868000.0p-24, 0xa4c3d6.0p-24, 0x1c1b5760fb4572.0p-78 },
> + { 0x858000.0p-24, 0xa6acea.0p-24, 0x1fed5d0f65949c.0p-80 },
> + { 0x850000.0p-24, 0xa7a2d4.0p-24, 0x1ad270c9d74936.0p-80 },
> + { 0x848000.0p-24, 0xa899ab.0p-24, 0x199ff15ce53266.0p-79 },
> + { 0x840000.0p-24, 0xa99171.0p-24, 0x1a19e15ccc45d2.0p-79 },
> + { 0x838000.0p-24, 0xaa8a28.0p-24, -0x121a14ec532b36.0p-80 },
> + { 0x830000.0p-24, 0xab83d1.0p-24, 0x1aee319980bff3.0p-79 },
> + { 0x828000.0p-24, 0xac7e6f.0p-24, -0x18ffd9e3900346.0p-80 },
> + { 0x820000.0p-24, 0xad7a03.0p-24, -0x1e4db102ce29f8.0p-80 },
> + { 0x818000.0p-24, 0xae768f.0p-24, 0x17c35c55a04a83.0p-81 },
> + { 0x810000.0p-24, 0xaf7415.0p-24, 0x1448324047019b.0p-78 },
> + { 0x808000.0p-24, 0xb07298.0p-24, -0x1750ee3915a198.0p-78 },
> + { 0x800000.0p-24, 0xb17218.0p-24, -0x105c610ca86c39.0p-81 },
> +};
> +
> +#ifdef USE_UTAB
> +static const struct {
> + float H; /* 1 + i/INTERVALS (exact) */
> + float E; /* H(i) * G(i) - 1 (exact) */
> +} U[TSIZE] = {
> + { 0x800000.0p-23, 0 },
> + { 0x810000.0p-23, -0x800000.0p-37 },
> + { 0x820000.0p-23, -0x800000.0p-35 },
> + { 0x830000.0p-23, -0x900000.0p-34 },
> + { 0x840000.0p-23, -0x800000.0p-33 },
> + { 0x850000.0p-23, -0xc80000.0p-33 },
> + { 0x860000.0p-23, -0xa00000.0p-36 },
> + { 0x870000.0p-23, 0x940000.0p-33 },
> + { 0x880000.0p-23, 0x800000.0p-35 },
> + { 0x890000.0p-23, -0xc80000.0p-34 },
> + { 0x8a0000.0p-23, 0xe00000.0p-36 },
> + { 0x8b0000.0p-23, 0x900000.0p-33 },
> + { 0x8c0000.0p-23, -0x800000.0p-35 },
> + { 0x8d0000.0p-23, -0xe00000.0p-33 },
> + { 0x8e0000.0p-23, 0x880000.0p-33 },
> + { 0x8f0000.0p-23, -0xa80000.0p-34 },
> + { 0x900000.0p-23, -0x800000.0p-35 },
> + { 0x910000.0p-23, 0x800000.0p-37 },
> + { 0x920000.0p-23, 0x900000.0p-35 },
> + { 0x930000.0p-23, 0xd00000.0p-35 },
> + { 0x940000.0p-23, 0xe00000.0p-35 },
> + { 0x950000.0p-23, 0xc00000.0p-35 },
> + { 0x960000.0p-23, 0xe00000.0p-36 },
> + { 0x970000.0p-23, -0x800000.0p-38 },
> + { 0x980000.0p-23, -0xc00000.0p-35 },
> + { 0x990000.0p-23, -0xd00000.0p-34 },
> + { 0x9a0000.0p-23, 0x880000.0p-33 },
> + { 0x9b0000.0p-23, 0xe80000.0p-35 },
> + { 0x9c0000.0p-23, -0x800000.0p-35 },
> + { 0x9d0000.0p-23, 0xb40000.0p-33 },
> + { 0x9e0000.0p-23, 0x880000.0p-34 },
> + { 0x9f0000.0p-23, -0xe00000.0p-35 },
> + { 0xa00000.0p-23, 0x800000.0p-33 },
> + { 0xa10000.0p-23, -0x900000.0p-36 },
> + { 0xa20000.0p-23, -0xb00000.0p-33 },
> + { 0xa30000.0p-23, -0xa00000.0p-36 },
> + { 0xa40000.0p-23, 0x800000.0p-33 },
> + { 0xa50000.0p-23, -0xf80000.0p-35 },
> + { 0xa60000.0p-23, 0x880000.0p-34 },
> + { 0xa70000.0p-23, -0x900000.0p-33 },
> + { 0xa80000.0p-23, -0x800000.0p-35 },
> + { 0xa90000.0p-23, 0x900000.0p-34 },
> + { 0xaa0000.0p-23, 0xa80000.0p-33 },
> + { 0xab0000.0p-23, -0xac0000.0p-34 },
> + { 0xac0000.0p-23, -0x800000.0p-37 },
> + { 0xad0000.0p-23, 0xf80000.0p-35 },
> + { 0xae0000.0p-23, 0xf80000.0p-34 },
> + { 0xaf0000.0p-23, -0xac0000.0p-33 },
> + { 0xb00000.0p-23, -0x800000.0p-33 },
> + { 0xb10000.0p-23, -0xb80000.0p-34 },
> + { 0xb20000.0p-23, -0x800000.0p-34 },
> + { 0xb30000.0p-23, -0xb00000.0p-35 },
> + { 0xb40000.0p-23, -0x800000.0p-35 },
> + { 0xb50000.0p-23, -0xe00000.0p-36 },
> + { 0xb60000.0p-23, -0x800000.0p-35 },
> + { 0xb70000.0p-23, -0xb00000.0p-35 },
> + { 0xb80000.0p-23, -0x800000.0p-34 },
> + { 0xb90000.0p-23, -0xb80000.0p-34 },
> + { 0xba0000.0p-23, -0x800000.0p-33 },
> + { 0xbb0000.0p-23, -0xac0000.0p-33 },
> + { 0xbc0000.0p-23, 0x980000.0p-33 },
> + { 0xbd0000.0p-23, 0xbc0000.0p-34 },
> + { 0xbe0000.0p-23, 0xe00000.0p-36 },
> + { 0xbf0000.0p-23, -0xb80000.0p-35 },
> + { 0xc00000.0p-23, -0x800000.0p-33 },
> + { 0xc10000.0p-23, 0xa80000.0p-33 },
> + { 0xc20000.0p-23, 0x900000.0p-34 },
> + { 0xc30000.0p-23, -0x800000.0p-35 },
> + { 0xc40000.0p-23, -0x900000.0p-33 },
> + { 0xc50000.0p-23, 0x820000.0p-33 },
> + { 0xc60000.0p-23, 0x800000.0p-38 },
> + { 0xc70000.0p-23, -0x820000.0p-33 },
> + { 0xc80000.0p-23, 0x800000.0p-33 },
> + { 0xc90000.0p-23, -0xa00000.0p-36 },
> + { 0xca0000.0p-23, -0xb00000.0p-33 },
> + { 0xcb0000.0p-23, 0x840000.0p-34 },
> + { 0xcc0000.0p-23, -0xd00000.0p-34 },
> + { 0xcd0000.0p-23, 0x800000.0p-33 },
> + { 0xce0000.0p-23, -0xe00000.0p-35 },
> + { 0xcf0000.0p-23, 0xa60000.0p-33 },
> + { 0xd00000.0p-23, -0x800000.0p-35 },
> + { 0xd10000.0p-23, 0xb40000.0p-33 },
> + { 0xd20000.0p-23, -0x800000.0p-35 },
> + { 0xd30000.0p-23, 0xaa0000.0p-33 },
> + { 0xd40000.0p-23, -0xe00000.0p-35 },
> + { 0xd50000.0p-23, 0x880000.0p-33 },
> + { 0xd60000.0p-23, -0xd00000.0p-34 },
> + { 0xd70000.0p-23, 0x9c0000.0p-34 },
> + { 0xd80000.0p-23, -0xb00000.0p-33 },
> + { 0xd90000.0p-23, -0x800000.0p-38 },
> + { 0xda0000.0p-23, 0xa40000.0p-33 },
> + { 0xdb0000.0p-23, -0xdc0000.0p-34 },
> + { 0xdc0000.0p-23, 0xc00000.0p-35 },
> + { 0xdd0000.0p-23, 0xca0000.0p-33 },
> + { 0xde0000.0p-23, -0xb80000.0p-34 },
> + { 0xdf0000.0p-23, 0xd00000.0p-35 },
> + { 0xe00000.0p-23, 0xc00000.0p-33 },
> + { 0xe10000.0p-23, -0xf40000.0p-34 },
> + { 0xe20000.0p-23, 0x800000.0p-37 },
> + { 0xe30000.0p-23, 0x860000.0p-33 },
> + { 0xe40000.0p-23, -0xc80000.0p-33 },
> + { 0xe50000.0p-23, -0xa80000.0p-34 },
> + { 0xe60000.0p-23, 0xe00000.0p-36 },
> + { 0xe70000.0p-23, 0x880000.0p-33 },
> + { 0xe80000.0p-23, -0xe00000.0p-33 },
> + { 0xe90000.0p-23, -0xfc0000.0p-34 },
> + { 0xea0000.0p-23, -0x800000.0p-35 },
> + { 0xeb0000.0p-23, 0xe80000.0p-35 },
> + { 0xec0000.0p-23, 0x900000.0p-33 },
> + { 0xed0000.0p-23, 0xe20000.0p-33 },
> + { 0xee0000.0p-23, -0xac0000.0p-33 },
> + { 0xef0000.0p-23, -0xc80000.0p-34 },
> + { 0xf00000.0p-23, -0x800000.0p-35 },
> + { 0xf10000.0p-23, 0x800000.0p-35 },
> + { 0xf20000.0p-23, 0xb80000.0p-34 },
> + { 0xf30000.0p-23, 0x940000.0p-33 },
> + { 0xf40000.0p-23, 0xc80000.0p-33 },
> + { 0xf50000.0p-23, -0xf20000.0p-33 },
> + { 0xf60000.0p-23, -0xc80000.0p-33 },
> + { 0xf70000.0p-23, -0xa20000.0p-33 },
> + { 0xf80000.0p-23, -0x800000.0p-33 },
> + { 0xf90000.0p-23, -0xc40000.0p-34 },
> + { 0xfa0000.0p-23, -0x900000.0p-34 },
> + { 0xfb0000.0p-23, -0xc80000.0p-35 },
> + { 0xfc0000.0p-23, -0x800000.0p-35 },
> + { 0xfd0000.0p-23, -0x900000.0p-36 },
> + { 0xfe0000.0p-23, -0x800000.0p-37 },
> + { 0xff0000.0p-23, -0x800000.0p-39 },
> + { 0x800000.0p-22, 0 },
> +};
> +#endif /* USE_UTAB */
> +
> +#ifdef STRUCT_RETURN
> +#define RETURN1(rp, v) do { \
> + (rp)->hi = (v); \
> + (rp)->lo_set = 0; \
> + return; \
> +} while (0)
> +
> +#define RETURN2(rp, h, l) do { \
> + (rp)->hi = (h); \
> + (rp)->lo = (l); \
> + (rp)->lo_set = 1; \
> + return; \
> +} while (0)
> +
> +struct ld {
> + long double hi;
> + long double lo;
> + int lo_set;
> +};
> +#else
> +#define RETURN1(rp, v) RETURNF(v)
> +#define RETURN2(rp, h, l) RETURNI((h) + (l))
> +#endif
> +
> +#ifdef STRUCT_RETURN
> +static inline __always_inline void
> +k_logl(long double x, struct ld *rp)
> +#else
> +long double
> +logl(long double x)
> +#endif
> +{
> + long double d, dk, val_hi, val_lo, z;
> + uint64_t ix, lx;
> + int i, k;
> + uint16_t hx;
> +
> + EXTRACT_LDBL80_WORDS(hx, lx, x);
> + k = -16383;
> +#if 0 /* Hard to do efficiently. Don't do it until we support all modes. */
> + if (x == 1)
> + RETURN1(rp, 0); /* log(1) = +0 in all rounding modes */
> +#endif
> + if (hx == 0 || hx >= 0x8000) { /* zero, negative or subnormal? */
> + if (((hx & 0x7fff) | lx) == 0)
> + RETURN1(rp, -1 / zero); /* log(+-0) = -Inf */
> + if (hx != 0)
> + /* log(neg or [pseudo-]NaN) = qNaN: */
> + RETURN1(rp, (x - x) / zero);
> + x *= 0x1.0p65; /* subnormal; scale up x */
> + /* including pseudo-subnormals */
> + EXTRACT_LDBL80_WORDS(hx, lx, x);
> + k = -16383 - 65;
> + } else if (hx >= 0x7fff || (lx & 0x8000000000000000ULL) == 0)
> + RETURN1(rp, x + x); /* log(Inf or NaN) = Inf or qNaN */
> + /* log(pseudo-Inf) = qNaN */
> + /* log(pseudo-NaN) = qNaN */
> + /* log(unnormal) = qNaN */
> +#ifndef STRUCT_RETURN
> + ENTERI();
> +#endif
> + k += hx;
> + ix = lx & 0x7fffffffffffffffULL;
> + dk = k;
> +
> + /* Scale x to be in [1, 2). */
> + SET_LDBL_EXPSIGN(x, 0x3fff);
> +
> + /* 0 <= i <= INTERVALS: */
> +#define L2I (64 - LOG2_INTERVALS)
> + i = (ix + (1LL << (L2I - 2))) >> (L2I - 1);
> +
> + /*
> + * -0.005280 < d < 0.004838. In particular, the infinite-
> + * precision |d| is <= 2**-7. Rounding of G(i) to 8 bits
> + * ensures that d is representable without extra precision for
> + * this bound on |d| (since when this calculation is expressed
> + * as x*G(i)-1, the multiplication needs as many extra bits as
> + * G(i) has and the subtraction cancels 8 bits). But for
> + * most i (107 cases out of 129), the infinite-precision |d|
> + * is <= 2**-8. G(i) is rounded to 9 bits for such i to give
> + * better accuracy (this works by improving the bound on |d|,
> + * which in turn allows rounding to 9 bits in more cases).
> + * This is only important when the original x is near 1 -- it
> + * lets us avoid using a special method to give the desired
> + * accuracy for such x.
> + */
> + if (0)
> + d = x * G(i) - 1;
> + else {
> +#ifdef USE_UTAB
> + d = (x - H(i)) * G(i) + E(i);
> +#else
> + long double x_hi, x_lo;
> + float fx_hi;
> +
> + /*
> + * Split x into x_hi + x_lo to calculate x*G(i)-1 exactly.
> + * G(i) has at most 9 bits, so the splitting point is not
> + * critical.
> + */
> + SET_FLOAT_WORD(fx_hi, (lx >> 40) | 0x3f800000);
> + x_hi = fx_hi;
> + x_lo = x - x_hi;
> + d = x_hi * G(i) - 1 + x_lo * G(i);
> +#endif
> + }
> +
> + /*
> + * Our algorithm depends on exact cancellation of F_lo(i) and
> + * F_hi(i) with dk*ln_2_lo and dk*ln2_hi when k is -1 and i is
> + * at the end of the table. This and other technical complications
> + * make it difficult to avoid the double scaling in (dk*ln2) *
> + * log(base) for base != e without losing more accuracy and/or
> + * efficiency than is gained.
> + */
> + z = d * d;
> + val_lo = z * d * z * (z * (d * P8 + P7) + (d * P6 + P5)) +
> + (F_lo(i) + dk * ln2_lo + z * d * (d * P4 + P3)) + z * P2;
> + val_hi = d;
> +#ifdef DEBUG
> + if (fetestexcept(FE_UNDERFLOW))
> + breakpoint();
> +#endif
> +
> + _3sumF(val_hi, val_lo, F_hi(i) + dk * ln2_hi);
> + RETURN2(rp, val_hi, val_lo);
> +}
> +
> +long double
> +log1pl(long double x)
> +{
> + long double d, d_hi, d_lo, dk, f_lo, val_hi, val_lo, z;
> + long double f_hi, twopminusk;
> + uint64_t ix, lx;
> + int i, k;
> + int16_t ax, hx;
> +
> + DOPRINT_START(&x);
> + EXTRACT_LDBL80_WORDS(hx, lx, x);
> + if (hx < 0x3fff) { /* x < 1, or x neg NaN */
> + ax = hx & 0x7fff;
> + if (ax >= 0x3fff) { /* x <= -1, or x neg NaN */
> + if (ax == 0x3fff && lx == 0x8000000000000000ULL)
> + RETURNP(-1 / zero); /* log1p(-1) = -Inf */
> + /* log1p(x < 1, or x [pseudo-]NaN) = qNaN: */
> + RETURNP((x - x) / (x - x));
> + }
> + if (ax <= 0x3fbe) { /* |x| < 2**-64 */
> + if ((int)x == 0)
> + RETURNP(x); /* x with inexact if x != 0 */
> + }
> + f_hi = 1;
> + f_lo = x;
> + } else if (hx >= 0x7fff) { /* x +Inf or non-neg NaN */
> + RETURNP(x + x); /* log1p(Inf or NaN) = Inf or qNaN */
> + /* log1p(pseudo-Inf) = qNaN */
> + /* log1p(pseudo-NaN) = qNaN */
> + /* log1p(unnormal) = qNaN */
> + } else if (hx < 0x407f) { /* 1 <= x < 2**128 */
> + f_hi = x;
> + f_lo = 1;
> + } else { /* 2**128 <= x < +Inf */
> + f_hi = x;
> + f_lo = 0; /* avoid underflow of the P5 term */
> + }
> + ENTERI();
> + x = f_hi + f_lo;
> + f_lo = (f_hi - x) + f_lo;
> +
> + EXTRACT_LDBL80_WORDS(hx, lx, x);
> + k = -16383;
> +
> + k += hx;
> + ix = lx & 0x7fffffffffffffffULL;
> + dk = k;
> +
> + SET_LDBL_EXPSIGN(x, 0x3fff);
> + twopminusk = 1;
> + SET_LDBL_EXPSIGN(twopminusk, 0x7ffe - (hx & 0x7fff));
> + f_lo *= twopminusk;
> +
> + i = (ix + (1LL << (L2I - 2))) >> (L2I - 1);
> +
> + /*
> + * x*G(i)-1 (with a reduced x) can be represented exactly, as
> + * above, but now we need to evaluate the polynomial on d =
> + * (x+f_lo)*G(i)-1 and extra precision is needed for that.
> + * Since x+x_lo is a hi+lo decomposition and subtracting 1
> + * doesn't lose too many bits, an inexact calculation for
> + * f_lo*G(i) is good enough.
> + */
> + if (0)
> + d_hi = x * G(i) - 1;
> + else {
> +#ifdef USE_UTAB
> + d_hi = (x - H(i)) * G(i) + E(i);
> +#else
> + long double x_hi, x_lo;
> + float fx_hi;
> +
> + SET_FLOAT_WORD(fx_hi, (lx >> 40) | 0x3f800000);
> + x_hi = fx_hi;
> + x_lo = x - x_hi;
> + d_hi = x_hi * G(i) - 1 + x_lo * G(i);
> +#endif
> + }
> + d_lo = f_lo * G(i);
> +
> + /*
> + * This is _2sumF(d_hi, d_lo) inlined. The condition
> + * (d_hi == 0 || |d_hi| >= |d_lo|) for using _2sumF() is not
> + * always satisifed, so it is not clear that this works, but
> + * it works in practice. It works even if it gives a wrong
> + * normalized d_lo, since |d_lo| > |d_hi| implies that i is
> + * nonzero and d is tiny, so the F(i) term dominates d_lo.
> + * In float precision:
> + * (By exhaustive testing, the worst case is d_hi = 0x1.bp-25.
> + * And if d is only a little tinier than that, we would have
> + * another underflow problem for the P3 term; this is also ruled
> + * out by exhaustive testing.)
> + */
> + d = d_hi + d_lo;
> + d_lo = d_hi - d + d_lo;
> + d_hi = d;
> +
> + z = d * d;
> + val_lo = z * d * z * (z * (d * P8 + P7) + (d * P6 + P5)) +
> + (F_lo(i) + dk * ln2_lo + d_lo + z * d * (d * P4 + P3)) + z * P2;
> + val_hi = d_hi;
> +#ifdef DEBUG
> + if (fetestexcept(FE_UNDERFLOW))
> + breakpoint();
> +#endif
> +
> + _3sumF(val_hi, val_lo, F_hi(i) + dk * ln2_hi);
> + RETURN2PI(val_hi, val_lo);
> +}
> +
> +#ifdef STRUCT_RETURN
> +
> +long double
> +logl(long double x)
> +{
> + struct ld r;
> +
> + ENTERI();
> + DOPRINT_START(&x);
> + k_logl(x, &r);
> + RETURNSPI(&r);
> +}
> +
> +/* Use macros since GCC < 8 rejects static const expressions in initializers. */
> +#define invln10_hi 4.3429448190317999e-1 /* 0x1bcb7b1526e000.0p-54 */
> +#define invln10_lo 7.1842412889749798e-14 /* 0x1438ca9aadd558.0p-96 */
> +#define invln2_hi 1.4426950408887933e0 /* 0x171547652b8000.0p-52 */
> +#define invln2_lo 1.7010652264631490e-13 /* 0x17f0bbbe87fed0.0p-95 */
> +/* Let the compiler pre-calculate this sum to avoid FE_INEXACT at run time. */
> +static const double invln10_lo_plus_hi = invln10_lo + invln10_hi;
> +static const double invln2_lo_plus_hi = invln2_lo + invln2_hi;
> +
> +long double
> +log10l(long double x)
> +{
> + struct ld r;
> + long double hi, lo;
> +
> + ENTERI();
> + DOPRINT_START(&x);
> + k_logl(x, &r);
> + if (!r.lo_set)
> + RETURNPI(r.hi);
> + _2sumF(r.hi, r.lo);
> + hi = (float)r.hi;
> + lo = r.lo + (r.hi - hi);
> + RETURN2PI(invln10_hi * hi,
> + invln10_lo_plus_hi * lo + invln10_lo * hi);
> +}
> +
> +long double
> +log2l(long double x)
> +{
> + struct ld r;
> + long double hi, lo;
> +
> + ENTERI();
> + DOPRINT_START(&x);
> + k_logl(x, &r);
> + if (!r.lo_set)
> + RETURNPI(r.hi);
> + _2sumF(r.hi, r.lo);
> + hi = (float)r.hi;
> + lo = r.lo + (r.hi - hi);
> + RETURN2PI(invln2_hi * hi,
> + invln2_lo_plus_hi * lo + invln2_lo * hi);
> +}
> +
> +#endif /* STRUCT_RETURN */
> diff --git a/newlib/libm/ld80/s_sinpil.c b/newlib/libm/ld80/s_sinpil.c
> new file mode 100644
> index 000000000..4cefa9235
> --- /dev/null
> +++ b/newlib/libm/ld80/s_sinpil.c
> @@ -0,0 +1,140 @@
> +/*-
> + * Copyright (c) 2017 Steven G. Kargl
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice unmodified, this list of conditions, and the following
> + * disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
> + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
> + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
> + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
> + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
> + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
> + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +/*
> + * See ../src/s_sinpi.c for implementation details.
> + */
> +
> +#ifdef __i386__
> +#include <ieeefp.h>
> +#endif
> +#include <stdint.h>
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +
> +static const union IEEEl2bits
> +pi_hi_u = LD80C(0xc90fdaa200000000, 1, 3.14159265346825122833e+00L),
> +pi_lo_u = LD80C(0x85a308d313198a2e, -33, 1.21542010130123852029e-10L);
> +#define pi_hi (pi_hi_u.e)
> +#define pi_lo (pi_lo_u.e)
> +
> +#include "k_cospil.h"
> +#include "k_sinpil.h"
> +
> +volatile static const double vzero = 0;
> +
> +long double
> +sinpil(long double x)
> +{
> + long double ax, hi, lo, s;
> + uint64_t lx, m;
> + uint32_t j0;
> + uint16_t hx, ix;
> +
> + EXTRACT_LDBL80_WORDS(hx, lx, x);
> + ix = hx & 0x7fff;
> + INSERT_LDBL80_WORDS(ax, ix, lx);
> +
> + ENTERI();
> +
> + if (ix < 0x3fff) { /* |x| < 1 */
> + if (ix < 0x3ffd) { /* |x| < 0.25 */
> + if (ix < 0x3fdd) { /* |x| < 0x1p-34 */
> + if (x == 0)
> + RETURNI(x);
> + INSERT_LDBL80_WORDS(hi, hx,
> + lx & 0xffffffff00000000ull);
> + hi *= 0x1p63L;
> + lo = x * 0x1p63L - hi;
> + s = (pi_lo + pi_hi) * lo + pi_lo * hi +
> + pi_hi * hi;
> + RETURNI(s * 0x1p-63L);
> + }
> + s = __kernel_sinpil(ax);
> + RETURNI((hx & 0x8000) ? -s : s);
> + }
> +
> + if (ix < 0x3ffe) /* |x| < 0.5 */
> + s = __kernel_cospil(0.5 - ax);
> + else if (lx < 0xc000000000000000ull) /* |x| < 0.75 */
> + s = __kernel_cospil(ax - 0.5);
> + else
> + s = __kernel_sinpil(1 - ax);
> + RETURNI((hx & 0x8000) ? -s : s);
> + }
> +
> + if (ix < 0x403e) { /* 1 <= |x| < 0x1p63 */
> + /* Determine integer part of ax. */
> + j0 = ix - 0x3fff + 1;
> + if (j0 < 32) {
> + lx = (lx >> 32) << 32;
> + lx &= ~(((lx << 32)-1) >> j0);
> + } else {
> + m = (uint64_t)-1 >> (j0 + 1);
> + if (lx & m) lx &= ~m;
> + }
> + INSERT_LDBL80_WORDS(x, ix, lx);
> +
> + ax -= x;
> + EXTRACT_LDBL80_WORDS(ix, lx, ax);
> +
> + if (ix == 0) {
> + s = 0;
> + } else {
> + if (ix < 0x3ffe) { /* |x| < 0.5 */
> + if (ix < 0x3ffd) /* |x| < 0.25 */
> + s = __kernel_sinpil(ax);
> + else
> + s = __kernel_cospil(0.5 - ax);
> + } else {
> + /* |x| < 0.75 */
> + if (lx < 0xc000000000000000ull)
> + s = __kernel_cospil(ax - 0.5);
> + else
> + s = __kernel_sinpil(1 - ax);
> + }
> +
> + if (j0 > 40)
> + x -= 0x1p40;
> + if (j0 > 30)
> + x -= 0x1p30;
> + j0 = (uint32_t)x;
> + if (j0 & 1) s = -s;
> + }
> + RETURNI((hx & 0x8000) ? -s : s);
> + }
> +
> + /* x = +-inf or nan. */
> + if (ix >= 0x7fff)
> + RETURNI(vzero / vzero);
> +
> + /*
> + * |x| >= 0x1p63 is always an integer, so return +-0.
> + */
> + RETURNI(copysignl(0, x));
> +}
> --
> 2.31.1
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 1/3] newlib: Add FreeBSD files for non LDBL_EQ_DBL support
2023-04-24 8:51 ` Corinna Vinschen
@ 2023-04-24 12:47 ` Jennifer Averett
0 siblings, 0 replies; 9+ messages in thread
From: Jennifer Averett @ 2023-04-24 12:47 UTC (permalink / raw)
To: newlib
Sorry I didn't get those errors my builds. I'll add that into the two files.
Thanks
Jennifer
________________________________________
From: Corinna Vinschen <vinschen@redhat.com>
Sent: Monday, April 24, 2023 3:51 AM
To: Jennifer Averett
Cc: newlib@sourceware.org
Subject: Re: [PATCH v2 1/3] newlib: Add FreeBSD files for non LDBL_EQ_DBL support
Hi Jennifer,
On Apr 20 16:23, Jennifer Averett wrote:
> FreeBSD files to add long double support for i386,
> aarch64 and x86_64.
Building on Cygwin, I'm ewncountering a few errors:
newlib/libm/ld/s_ilogbl.c: In function ‘ilogbl’:
newlib/libm/ld/s_ilogbl.c:26:9: error: unknown type name ‘uint64_t’
26 | uint64_t m;
| ^~~~~~~~
newlib/libm/ld/s_ilogbl.c:21:1: note: ‘uint64_t’ is defined in header ‘<stdint.h>’; did you forget to ‘#include <stdint.h>’?
20 | #include "fpmath.h"
+++ |+#include <stdint.h>
21 |
newlib/libm/ld/s_rintl.c: In function ‘rintl’:
CC libm/complex/libm_a-creal.o
newlib/libm/ld/s_rintl.c:60:9: error: unknown type name ‘uint32_t’
60 | uint32_t expsign;
| ^~~~~~~~
newlib/libm/ld/s_rintl.c:36:1: note: ‘uint32_t’ is defined in header ‘<stdint.h>’; did you forget to ‘#include <stdint.h>’?
35 | #include "fpmath.h"
+++ |+#include <stdint.h>
36 |
newlib/libm/ld/s_ilogbl.c: In function ‘ilogbl’:
newlib/libm/ld/s_ilogbl.c:26:9: error: unknown type name ‘uint64_t’
26 | uint64_t m;
| ^~~~~~~~
newlib/libm/ld/s_ilogbl.c:21:1: note: ‘uint64_t’ is defined in header ‘<stdint.h>’; did you forget to ‘#include <stdint.h>’?
20 | #include "fpmath.h"
+++ |+#include <stdint.h>
21 |
Adding #include <stdint.h> actually fixes them.
Thanks,
Corinna
> ---
> newlib/libc/include/sys/endian.h | 177 ++++
> newlib/libc/machine/aarch64/machine/_fpmath.h | 58 ++
> newlib/libc/machine/i386/machine/_fpmath.h | 56 ++
> newlib/libc/machine/x86_64/machine/_fpmath.h | 57 ++
> newlib/libm/ld/e_acoshl.c | 89 ++
> newlib/libm/ld/e_acosl.c | 87 ++
> newlib/libm/ld/e_asinl.c | 77 ++
> newlib/libm/ld/e_atan2l.c | 120 +++
> newlib/libm/ld/e_atanhl.c | 74 ++
> newlib/libm/ld/e_coshl.c | 132 +++
> newlib/libm/ld/e_fmodl.c | 149 +++
> newlib/libm/ld/e_lgammal.c | 25 +
> newlib/libm/ld/e_remainderl.c | 40 +
> newlib/libm/ld/e_sinhl.c | 134 +++
> newlib/libm/ld/fpmath.h | 82 ++
> newlib/libm/ld/math_private.h | 924 ++++++++++++++++++
> newlib/libm/ld/s_asinhl.c | 91 ++
> newlib/libm/ld/s_atanl.c | 85 ++
> newlib/libm/ld/s_cbrtl.c | 143 +++
> newlib/libm/ld/s_ceill.c | 101 ++
> newlib/libm/ld/s_copysignl.c | 44 +
> newlib/libm/ld/s_cosl.c | 102 ++
> newlib/libm/ld/s_fabsl.c | 45 +
> newlib/libm/ld/s_fdim.c | 48 +
> newlib/libm/ld/s_floorl.c | 101 ++
> newlib/libm/ld/s_fmal.c | 274 ++++++
> newlib/libm/ld/s_fmaxl.c | 57 ++
> newlib/libm/ld/s_fminl.c | 57 ++
> newlib/libm/ld/s_frexpl.c | 64 ++
> newlib/libm/ld/s_ilogbl.c | 53 +
> newlib/libm/ld/s_llrintl.c | 9 +
> newlib/libm/ld/s_llroundl.c | 11 +
> newlib/libm/ld/s_logbl.c | 54 +
> newlib/libm/ld/s_lrint.c | 60 ++
> newlib/libm/ld/s_lrintl.c | 9 +
> newlib/libm/ld/s_lround.c | 70 ++
> newlib/libm/ld/s_lroundl.c | 11 +
> newlib/libm/ld/s_modfl.c | 103 ++
> newlib/libm/ld/s_nearbyint.c | 61 ++
> newlib/libm/ld/s_nextafterl.c | 80 ++
> newlib/libm/ld/s_nexttoward.c | 72 ++
> newlib/libm/ld/s_nexttowardf.c | 59 ++
> newlib/libm/ld/s_remquol.c | 173 ++++
> newlib/libm/ld/s_rintl.c | 92 ++
> newlib/libm/ld/s_roundl.c | 64 ++
> newlib/libm/ld/s_scalbln.c | 56 ++
> newlib/libm/ld/s_scalbnl.c | 49 +
> newlib/libm/ld/s_sinl.c | 95 ++
> newlib/libm/ld/s_tanhl.c | 174 ++++
> newlib/libm/ld/s_tanl.c | 97 ++
> newlib/libm/ld/s_truncl.c | 68 ++
> newlib/libm/ld128/b_tgammal.c | 57 ++
> newlib/libm/ld128/e_lgammal_r.c | 330 +++++++
> newlib/libm/ld128/e_powl.c | 443 +++++++++
> newlib/libm/ld128/e_rem_pio2l.h | 135 +++
> newlib/libm/ld128/invtrig.c | 102 ++
> newlib/libm/ld128/invtrig.h | 115 +++
> newlib/libm/ld128/k_cosl.c | 59 ++
> newlib/libm/ld128/k_expl.h | 324 ++++++
> newlib/libm/ld128/k_sinl.c | 59 ++
> newlib/libm/ld128/s_erfl.c | 329 +++++++
> newlib/libm/ld128/s_exp2l.c | 429 ++++++++
> newlib/libm/ld128/s_expl.c | 326 ++++++
> newlib/libm/ld128/s_logl.c | 740 ++++++++++++++
> newlib/libm/ld80/b_expl.c | 113 +++
> newlib/libm/ld80/b_logl.c | 375 +++++++
> newlib/libm/ld80/b_tgammal.c | 419 ++++++++
> newlib/libm/ld80/e_lgammal_r.c | 358 +++++++
> newlib/libm/ld80/e_powl.c | 662 +++++++++++++
> newlib/libm/ld80/e_rem_pio2l.h | 143 +++
> newlib/libm/ld80/invtrig.c | 84 ++
> newlib/libm/ld80/invtrig.h | 116 +++
> newlib/libm/ld80/k_cosl.c | 78 ++
> newlib/libm/ld80/k_cospil.h | 42 +
> newlib/libm/ld80/k_expl.h | 301 ++++++
> newlib/libm/ld80/k_sinl.c | 62 ++
> newlib/libm/ld80/k_sinpil.h | 42 +
> newlib/libm/ld80/s_cospil.c | 129 +++
> newlib/libm/ld80/s_erfl.c | 337 +++++++
> newlib/libm/ld80/s_exp2l.c | 290 ++++++
> newlib/libm/ld80/s_expl.c | 279 ++++++
> newlib/libm/ld80/s_logl.c | 722 ++++++++++++++
> newlib/libm/ld80/s_sinpil.c | 140 +++
> 83 files changed, 13153 insertions(+)
> create mode 100644 newlib/libc/include/sys/endian.h
> create mode 100644 newlib/libc/machine/aarch64/machine/_fpmath.h
> create mode 100644 newlib/libc/machine/i386/machine/_fpmath.h
> create mode 100644 newlib/libc/machine/x86_64/machine/_fpmath.h
> create mode 100644 newlib/libm/ld/e_acoshl.c
> create mode 100644 newlib/libm/ld/e_acosl.c
> create mode 100644 newlib/libm/ld/e_asinl.c
> create mode 100644 newlib/libm/ld/e_atan2l.c
> create mode 100644 newlib/libm/ld/e_atanhl.c
> create mode 100644 newlib/libm/ld/e_coshl.c
> create mode 100644 newlib/libm/ld/e_fmodl.c
> create mode 100644 newlib/libm/ld/e_lgammal.c
> create mode 100644 newlib/libm/ld/e_remainderl.c
> create mode 100644 newlib/libm/ld/e_sinhl.c
> create mode 100644 newlib/libm/ld/fpmath.h
> create mode 100644 newlib/libm/ld/math_private.h
> create mode 100644 newlib/libm/ld/s_asinhl.c
> create mode 100644 newlib/libm/ld/s_atanl.c
> create mode 100644 newlib/libm/ld/s_cbrtl.c
> create mode 100644 newlib/libm/ld/s_ceill.c
> create mode 100644 newlib/libm/ld/s_copysignl.c
> create mode 100644 newlib/libm/ld/s_cosl.c
> create mode 100644 newlib/libm/ld/s_fabsl.c
> create mode 100644 newlib/libm/ld/s_fdim.c
> create mode 100644 newlib/libm/ld/s_floorl.c
> create mode 100644 newlib/libm/ld/s_fmal.c
> create mode 100644 newlib/libm/ld/s_fmaxl.c
> create mode 100644 newlib/libm/ld/s_fminl.c
> create mode 100644 newlib/libm/ld/s_frexpl.c
> create mode 100644 newlib/libm/ld/s_ilogbl.c
> create mode 100644 newlib/libm/ld/s_llrintl.c
> create mode 100644 newlib/libm/ld/s_llroundl.c
> create mode 100644 newlib/libm/ld/s_logbl.c
> create mode 100644 newlib/libm/ld/s_lrint.c
> create mode 100644 newlib/libm/ld/s_lrintl.c
> create mode 100644 newlib/libm/ld/s_lround.c
> create mode 100644 newlib/libm/ld/s_lroundl.c
> create mode 100644 newlib/libm/ld/s_modfl.c
> create mode 100644 newlib/libm/ld/s_nearbyint.c
> create mode 100644 newlib/libm/ld/s_nextafterl.c
> create mode 100644 newlib/libm/ld/s_nexttoward.c
> create mode 100644 newlib/libm/ld/s_nexttowardf.c
> create mode 100644 newlib/libm/ld/s_remquol.c
> create mode 100644 newlib/libm/ld/s_rintl.c
> create mode 100644 newlib/libm/ld/s_roundl.c
> create mode 100644 newlib/libm/ld/s_scalbln.c
> create mode 100644 newlib/libm/ld/s_scalbnl.c
> create mode 100644 newlib/libm/ld/s_sinl.c
> create mode 100644 newlib/libm/ld/s_tanhl.c
> create mode 100644 newlib/libm/ld/s_tanl.c
> create mode 100644 newlib/libm/ld/s_truncl.c
> create mode 100644 newlib/libm/ld128/b_tgammal.c
> create mode 100644 newlib/libm/ld128/e_lgammal_r.c
> create mode 100644 newlib/libm/ld128/e_powl.c
> create mode 100644 newlib/libm/ld128/e_rem_pio2l.h
> create mode 100644 newlib/libm/ld128/invtrig.c
> create mode 100644 newlib/libm/ld128/invtrig.h
> create mode 100644 newlib/libm/ld128/k_cosl.c
> create mode 100644 newlib/libm/ld128/k_expl.h
> create mode 100644 newlib/libm/ld128/k_sinl.c
> create mode 100644 newlib/libm/ld128/s_erfl.c
> create mode 100644 newlib/libm/ld128/s_exp2l.c
> create mode 100644 newlib/libm/ld128/s_expl.c
> create mode 100644 newlib/libm/ld128/s_logl.c
> create mode 100644 newlib/libm/ld80/b_expl.c
> create mode 100644 newlib/libm/ld80/b_logl.c
> create mode 100644 newlib/libm/ld80/b_tgammal.c
> create mode 100644 newlib/libm/ld80/e_lgammal_r.c
> create mode 100644 newlib/libm/ld80/e_powl.c
> create mode 100644 newlib/libm/ld80/e_rem_pio2l.h
> create mode 100644 newlib/libm/ld80/invtrig.c
> create mode 100644 newlib/libm/ld80/invtrig.h
> create mode 100644 newlib/libm/ld80/k_cosl.c
> create mode 100644 newlib/libm/ld80/k_cospil.h
> create mode 100644 newlib/libm/ld80/k_expl.h
> create mode 100644 newlib/libm/ld80/k_sinl.c
> create mode 100644 newlib/libm/ld80/k_sinpil.h
> create mode 100644 newlib/libm/ld80/s_cospil.c
> create mode 100644 newlib/libm/ld80/s_erfl.c
> create mode 100644 newlib/libm/ld80/s_exp2l.c
> create mode 100644 newlib/libm/ld80/s_expl.c
> create mode 100644 newlib/libm/ld80/s_logl.c
> create mode 100644 newlib/libm/ld80/s_sinpil.c
>
> diff --git a/newlib/libc/include/sys/endian.h b/newlib/libc/include/sys/endian.h
> new file mode 100644
> index 000000000..d91c442e9
> --- /dev/null
> +++ b/newlib/libc/include/sys/endian.h
> @@ -0,0 +1,177 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2002 Thomas Moestl <tmm@FreeBSD.org>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + *
> + * $FreeBSD$
> + */
> +
> +#ifndef _SYS_ENDIAN_H_
> +#define _SYS_ENDIAN_H_
> +
> +#include <sys/cdefs.h>
> +#include <sys/_types.h>
> +#include <machine/endian.h>
> +
> +#ifndef _UINT8_T_DECLARED
> +typedef __uint8_t uint8_t;
> +#define _UINT8_T_DECLARED
> +#endif
> +
> +#ifndef _UINT16_T_DECLARED
> +typedef __uint16_t uint16_t;
> +#define _UINT16_T_DECLARED
> +#endif
> +
> +#ifndef _UINT32_T_DECLARED
> +typedef __uint32_t uint32_t;
> +#define _UINT32_T_DECLARED
> +#endif
> +
> +#ifndef _UINT64_T_DECLARED
> +typedef __uint64_t uint64_t;
> +#define _UINT64_T_DECLARED
> +#endif
> +
> +/*
> + * Note: While tempting to try to avoid namespace pollution from this file,
> + * several software packages assume these marcos are defined, even when it
> + * defines _POSIX_C_SOURCE to request an unpolluted namespace.
> + */
> +
> +/*
> + * General byte order swapping functions.
> + */
> +#define bswap16(x) __bswap16(x)
> +#define bswap32(x) __bswap32(x)
> +#define bswap64(x) __bswap64(x)
> +
> +/* Alignment-agnostic encode/decode bytestream to/from little/big endian. */
> +static __inline uint16_t
> +be16dec(const void *pp)
> +{
> + uint8_t const *p = (uint8_t const *)pp;
> +
> + return ((p[0] << 8) | p[1]);
> +}
> +
> +static __inline uint32_t
> +be32dec(const void *pp)
> +{
> + uint8_t const *p = (uint8_t const *)pp;
> +
> + return (((unsigned)p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]);
> +}
> +
> +static __inline uint64_t
> +be64dec(const void *pp)
> +{
> + uint8_t const *p = (uint8_t const *)pp;
> +
> + return (((uint64_t)be32dec(p) << 32) | be32dec(p + 4));
> +}
> +
> +static __inline uint16_t
> +le16dec(const void *pp)
> +{
> + uint8_t const *p = (uint8_t const *)pp;
> +
> + return ((p[1] << 8) | p[0]);
> +}
> +
> +static __inline uint32_t
> +le32dec(const void *pp)
> +{
> + uint8_t const *p = (uint8_t const *)pp;
> +
> + return (((unsigned)p[3] << 24) | (p[2] << 16) | (p[1] << 8) | p[0]);
> +}
> +
> +static __inline uint64_t
> +le64dec(const void *pp)
> +{
> + uint8_t const *p = (uint8_t const *)pp;
> +
> + return (((uint64_t)le32dec(p + 4) << 32) | le32dec(p));
> +}
> +
> +static __inline void
> +be16enc(void *pp, uint16_t u)
> +{
> + uint8_t *p = (uint8_t *)pp;
> +
> + p[0] = (u >> 8) & 0xff;
> + p[1] = u & 0xff;
> +}
> +
> +static __inline void
> +be32enc(void *pp, uint32_t u)
> +{
> + uint8_t *p = (uint8_t *)pp;
> +
> + p[0] = (u >> 24) & 0xff;
> + p[1] = (u >> 16) & 0xff;
> + p[2] = (u >> 8) & 0xff;
> + p[3] = u & 0xff;
> +}
> +
> +static __inline void
> +be64enc(void *pp, uint64_t u)
> +{
> + uint8_t *p = (uint8_t *)pp;
> +
> + be32enc(p, (uint32_t)(u >> 32));
> + be32enc(p + 4, (uint32_t)(u & 0xffffffffU));
> +}
> +
> +static __inline void
> +le16enc(void *pp, uint16_t u)
> +{
> + uint8_t *p = (uint8_t *)pp;
> +
> + p[0] = u & 0xff;
> + p[1] = (u >> 8) & 0xff;
> +}
> +
> +static __inline void
> +le32enc(void *pp, uint32_t u)
> +{
> + uint8_t *p = (uint8_t *)pp;
> +
> + p[0] = u & 0xff;
> + p[1] = (u >> 8) & 0xff;
> + p[2] = (u >> 16) & 0xff;
> + p[3] = (u >> 24) & 0xff;
> +}
> +
> +static __inline void
> +le64enc(void *pp, uint64_t u)
> +{
> + uint8_t *p = (uint8_t *)pp;
> +
> + le32enc(p, (uint32_t)(u & 0xffffffffU));
> + le32enc(p + 4, (uint32_t)(u >> 32));
> +}
> +#endif /* _SYS_ENDIAN_H_ */
> diff --git a/newlib/libc/machine/aarch64/machine/_fpmath.h b/newlib/libc/machine/aarch64/machine/_fpmath.h
> new file mode 100644
> index 000000000..71d0a7152
> --- /dev/null
> +++ b/newlib/libc/machine/aarch64/machine/_fpmath.h
> @@ -0,0 +1,58 @@
> +/*-
> + * Copyright (c) 2002, 2003 David Schultz <das@FreeBSD.ORG>
> + * Copyright (2) 2014 The FreeBSD Foundation
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + *
> + * $FreeBSD$
> + */
> +
> +union IEEEl2bits {
> + long double e;
> + struct {
> + unsigned long manl :64;
> + unsigned long manh :48;
> + unsigned int exp :15;
> + unsigned int sign :1;
> + } bits;
> + /* TODO andrew: Check the packing here */
> + struct {
> + unsigned long manl :64;
> + unsigned long manh :48;
> + unsigned int expsign :16;
> + } xbits;
> +};
> +
> +#define LDBL_NBIT 0
> +#define LDBL_IMPLICIT_NBIT
> +#define mask_nbit_l(u) ((void)0)
> +
> +#define LDBL_MANH_SIZE 48
> +#define LDBL_MANL_SIZE 64
> +
> +#define LDBL_TO_ARRAY32(u, a) do { \
> + (a)[0] = (uint32_t)(u).bits.manl; \
> + (a)[1] = (uint32_t)((u).bits.manl >> 32); \
> + (a)[2] = (uint32_t)(u).bits.manh; \
> + (a)[3] = (uint32_t)((u).bits.manh >> 32); \
> +} while(0)
> diff --git a/newlib/libc/machine/i386/machine/_fpmath.h b/newlib/libc/machine/i386/machine/_fpmath.h
> new file mode 100644
> index 000000000..874439c34
> --- /dev/null
> +++ b/newlib/libc/machine/i386/machine/_fpmath.h
> @@ -0,0 +1,56 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2002, 2003 David Schultz <das@FreeBSD.ORG>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + *
> + * $FreeBSD$
> + */
> +
> +union IEEEl2bits {
> + long double e;
> + struct {
> + unsigned int manl :32;
> + unsigned int manh :32;
> + unsigned int exp :15;
> + unsigned int sign :1;
> + unsigned int junk :16;
> + } bits;
> + struct {
> + unsigned long long man :64;
> + unsigned int expsign :16;
> + unsigned int junk :16;
> + } xbits;
> +};
> +
> +#define LDBL_NBIT 0x80000000
> +#define mask_nbit_l(u) ((u).bits.manh &= ~LDBL_NBIT)
> +
> +#define LDBL_MANH_SIZE 32
> +#define LDBL_MANL_SIZE 32
> +
> +#define LDBL_TO_ARRAY32(u, a) do { \
> + (a)[0] = (uint32_t)(u).bits.manl; \
> + (a)[1] = (uint32_t)(u).bits.manh; \
> +} while (0)
> diff --git a/newlib/libc/machine/x86_64/machine/_fpmath.h b/newlib/libc/machine/x86_64/machine/_fpmath.h
> new file mode 100644
> index 000000000..8be7b7dba
> --- /dev/null
> +++ b/newlib/libc/machine/x86_64/machine/_fpmath.h
> @@ -0,0 +1,57 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2002, 2003 David Schultz <das@FreeBSD.ORG>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + *
> + * $FreeBSD$
> + */
> +
> +union IEEEl2bits {
> + long double e;
> + struct {
> + unsigned int manl :32;
> + unsigned int manh :32;
> + unsigned int exp :15;
> + unsigned int sign :1;
> + unsigned int junkl :16;
> + unsigned int junkh :32;
> + } bits;
> + struct {
> + unsigned long man :64;
> + unsigned int expsign :16;
> + unsigned long junk :48;
> + } xbits;
> +};
> +
> +#define LDBL_NBIT 0x80000000
> +#define mask_nbit_l(u) ((u).bits.manh &= ~LDBL_NBIT)
> +
> +#define LDBL_MANH_SIZE 32
> +#define LDBL_MANL_SIZE 32
> +
> +#define LDBL_TO_ARRAY32(u, a) do { \
> + (a)[0] = (uint32_t)(u).bits.manl; \
> + (a)[1] = (uint32_t)(u).bits.manh; \
> +} while (0)
> diff --git a/newlib/libm/ld/e_acoshl.c b/newlib/libm/ld/e_acoshl.c
> new file mode 100644
> index 000000000..b9f3aed67
> --- /dev/null
> +++ b/newlib/libm/ld/e_acoshl.c
> @@ -0,0 +1,89 @@
> +/* from: FreeBSD: head/lib/msun/src/e_acosh.c 176451 2008-02-22 02:30:36Z das */
> +
> +/* @(#)e_acosh.c 1.3 95/01/18 */
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunSoft, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + *
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * See e_acosh.c for complete comments.
> + *
> + * Converted to long double by David Schultz <das@FreeBSD.ORG> and
> + * Bruce D. Evans.
> + */
> +
> +#include <float.h>
> +#ifdef __i386__
> +#include <ieeefp.h>
> +#endif
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +
> +/* EXP_LARGE is the threshold above which we use acosh(x) ~= log(2x). */
> +#if LDBL_MANT_DIG == 64
> +#define EXP_LARGE 34
> +#elif LDBL_MANT_DIG == 113
> +#define EXP_LARGE 58
> +#else
> +#error "Unsupported long double format"
> +#endif
> +
> +#if LDBL_MAX_EXP != 0x4000
> +/* We also require the usual expsign encoding. */
> +#error "Unsupported long double format"
> +#endif
> +
> +#define BIAS (LDBL_MAX_EXP - 1)
> +
> +static const double
> +one = 1.0;
> +
> +#if LDBL_MANT_DIG == 64
> +static const union IEEEl2bits
> +u_ln2 = LD80C(0xb17217f7d1cf79ac, -1, 6.93147180559945309417e-1L);
> +#define ln2 u_ln2.e
> +#elif LDBL_MANT_DIG == 113
> +static const long double
> +ln2 = 6.93147180559945309417232121458176568e-1L; /* 0x162e42fefa39ef35793c7673007e6.0p-113 */
> +#else
> +#error "Unsupported long double format"
> +#endif
> +
> +long double
> +acoshl(long double x)
> +{
> + long double t;
> + int16_t hx;
> +
> + ENTERI();
> + GET_LDBL_EXPSIGN(hx, x);
> + if (hx < 0x3fff) { /* x < 1, or misnormal */
> + RETURNI((x-x)/(x-x));
> + } else if (hx >= BIAS + EXP_LARGE) { /* x >= LARGE */
> + if (hx >= 0x7fff) { /* x is inf, NaN or misnormal */
> + RETURNI(x+x);
> + } else
> + RETURNI(logl(x)+ln2); /* acosh(huge)=log(2x), or misnormal */
> + } else if (hx == 0x3fff && x == 1) {
> + RETURNI(0.0); /* acosh(1) = 0 */
> + } else if (hx >= 0x4000) { /* LARGE > x >= 2, or misnormal */
> + t=x*x;
> + RETURNI(logl(2.0*x-one/(x+sqrtl(t-one))));
> + } else { /* 1<x<2 */
> + t = x-one;
> + RETURNI(log1pl(t+sqrtl(2.0*t+t*t)));
> + }
> +}
> diff --git a/newlib/libm/ld/e_acosl.c b/newlib/libm/ld/e_acosl.c
> new file mode 100644
> index 000000000..d33c8feda
> --- /dev/null
> +++ b/newlib/libm/ld/e_acosl.c
> @@ -0,0 +1,87 @@
> +
> +/* @(#)e_acos.c 1.3 95/01/18 */
> +/* FreeBSD: head/lib/msun/src/e_acos.c 176451 2008-02-22 02:30:36Z das */
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunSoft, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * See comments in e_acos.c.
> + * Converted to long double by David Schultz <das@FreeBSD.ORG>.
> + */
> +
> +#include <float.h>
> +
> +#include "invtrig.h"
> +#include "math.h"
> +#include "math_private.h"
> +
> +static const long double
> +one= 1.00000000000000000000e+00;
> +
> +#ifdef __i386__
> +/* XXX Work around the fact that gcc truncates long double constants on i386 */
> +static volatile double
> +pi1 = 3.14159265358979311600e+00, /* 0x1.921fb54442d18p+1 */
> +pi2 = 1.22514845490862001043e-16; /* 0x1.1a80000000000p-53 */
> +#define pi ((long double)pi1 + pi2)
> +#else
> +static const long double
> +pi = 3.14159265358979323846264338327950280e+00L;
> +#endif
> +
> +long double
> +acosl(long double x)
> +{
> + union IEEEl2bits u;
> + long double z,p,q,r,w,s,c,df;
> + int16_t expsign, expt;
> + u.e = x;
> + expsign = u.xbits.expsign;
> + expt = expsign & 0x7fff;
> + if(expt >= BIAS) { /* |x| >= 1 */
> + if(expt==BIAS && ((u.bits.manh&~LDBL_NBIT)|u.bits.manl)==0) {
> + if (expsign>0) return 0.0; /* acos(1) = 0 */
> + else return pi+2.0*pio2_lo; /* acos(-1)= pi */
> + }
> + return (x-x)/(x-x); /* acos(|x|>1) is NaN */
> + }
> + if(expt<BIAS-1) { /* |x| < 0.5 */
> + if(expt<ACOS_CONST) return pio2_hi+pio2_lo;/*x tiny: acosl=pi/2*/
> + z = x*x;
> + p = P(z);
> + q = Q(z);
> + r = p/q;
> + return pio2_hi - (x - (pio2_lo-x*r));
> + } else if (expsign<0) { /* x < -0.5 */
> + z = (one+x)*0.5;
> + p = P(z);
> + q = Q(z);
> + s = sqrtl(z);
> + r = p/q;
> + w = r*s-pio2_lo;
> + return pi - 2.0*(s+w);
> + } else { /* x > 0.5 */
> + z = (one-x)*0.5;
> + s = sqrtl(z);
> + u.e = s;
> + u.bits.manl = 0;
> + df = u.e;
> + c = (z-df*df)/(s+df);
> + p = P(z);
> + q = Q(z);
> + r = p/q;
> + w = r*s+c;
> + return 2.0*(df+w);
> + }
> +}
> diff --git a/newlib/libm/ld/e_asinl.c b/newlib/libm/ld/e_asinl.c
> new file mode 100644
> index 000000000..a85765f1b
> --- /dev/null
> +++ b/newlib/libm/ld/e_asinl.c
> @@ -0,0 +1,77 @@
> +
> +/* @(#)e_asin.c 1.3 95/01/18 */
> +/* FreeBSD: head/lib/msun/src/e_asin.c 176451 2008-02-22 02:30:36Z das */
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunSoft, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * See comments in e_asin.c.
> + * Converted to long double by David Schultz <das@FreeBSD.ORG>.
> + */
> +
> +#include <float.h>
> +
> +#include "invtrig.h"
> +#include "math.h"
> +#include "math_private.h"
> +
> +static const long double
> +one = 1.00000000000000000000e+00,
> +huge = 1.000e+300;
> +
> +long double
> +asinl(long double x)
> +{
> + union IEEEl2bits u;
> + long double t=0.0,w,p,q,c,r,s;
> + int16_t expsign, expt;
> + u.e = x;
> + expsign = u.xbits.expsign;
> + expt = expsign & 0x7fff;
> + if(expt >= BIAS) { /* |x|>= 1 */
> + if(expt==BIAS && ((u.bits.manh&~LDBL_NBIT)|u.bits.manl)==0)
> + /* asin(1)=+-pi/2 with inexact */
> + return x*pio2_hi+x*pio2_lo;
> + return (x-x)/(x-x); /* asin(|x|>1) is NaN */
> + } else if (expt<BIAS-1) { /* |x|<0.5 */
> + if(expt<ASIN_LINEAR) { /* if |x| is small, asinl(x)=x */
> + if(huge+x>one) return x;/* return x with inexact if x!=0*/
> + }
> + t = x*x;
> + p = P(t);
> + q = Q(t);
> + w = p/q;
> + return x+x*w;
> + }
> + /* 1> |x|>= 0.5 */
> + w = one-fabsl(x);
> + t = w*0.5;
> + p = P(t);
> + q = Q(t);
> + s = sqrtl(t);
> + if(u.bits.manh>=THRESH) { /* if |x| is close to 1 */
> + w = p/q;
> + t = pio2_hi-(2.0*(s+s*w)-pio2_lo);
> + } else {
> + u.e = s;
> + u.bits.manl = 0;
> + w = u.e;
> + c = (t-w*w)/(s+w);
> + r = p/q;
> + p = 2.0*s*r-(pio2_lo-2.0*c);
> + q = pio4_hi-2.0*w;
> + t = pio4_hi-(p-q);
> + }
> + if(expsign>0) return t; else return -t;
> +}
> diff --git a/newlib/libm/ld/e_atan2l.c b/newlib/libm/ld/e_atan2l.c
> new file mode 100644
> index 000000000..94ebdec54
> --- /dev/null
> +++ b/newlib/libm/ld/e_atan2l.c
> @@ -0,0 +1,120 @@
> +
> +/* @(#)e_atan2.c 1.3 95/01/18 */
> +/* FreeBSD: head/lib/msun/src/e_atan2.c 176451 2008-02-22 02:30:36Z das */
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunSoft, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + *
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * See comments in e_atan2.c.
> + * Converted to long double by David Schultz <das@FreeBSD.ORG>.
> + */
> +
> +#include <float.h>
> +
> +#include "invtrig.h"
> +#include "math.h"
> +#include "math_private.h"
> +
> +static volatile long double
> +tiny = 1.0e-300;
> +static const long double
> +zero = 0.0;
> +
> +#ifdef __i386__
> +/* XXX Work around the fact that gcc truncates long double constants on i386 */
> +static volatile double
> +pi1 = 3.14159265358979311600e+00, /* 0x1.921fb54442d18p+1 */
> +pi2 = 1.22514845490862001043e-16; /* 0x1.1a80000000000p-53 */
> +#define pi ((long double)pi1 + pi2)
> +#else
> +static const long double
> +pi = 3.14159265358979323846264338327950280e+00L;
> +#endif
> +
> +long double
> +atan2l(long double y, long double x)
> +{
> + union IEEEl2bits ux, uy;
> + long double z;
> + int32_t k,m;
> + int16_t exptx, expsignx, expty, expsigny;
> +
> + uy.e = y;
> + expsigny = uy.xbits.expsign;
> + expty = expsigny & 0x7fff;
> + ux.e = x;
> + expsignx = ux.xbits.expsign;
> + exptx = expsignx & 0x7fff;
> +
> + if ((exptx==BIAS+LDBL_MAX_EXP &&
> + ((ux.bits.manh&~LDBL_NBIT)|ux.bits.manl)!=0) || /* x is NaN */
> + (expty==BIAS+LDBL_MAX_EXP &&
> + ((uy.bits.manh&~LDBL_NBIT)|uy.bits.manl)!=0)) /* y is NaN */
> + return nan_mix(x, y);
> + if (expsignx==BIAS && ((ux.bits.manh&~LDBL_NBIT)|ux.bits.manl)==0)
> + return atanl(y); /* x=1.0 */
> + m = ((expsigny>>15)&1)|((expsignx>>14)&2); /* 2*sign(x)+sign(y) */
> +
> + /* when y = 0 */
> + if(expty==0 && ((uy.bits.manh&~LDBL_NBIT)|uy.bits.manl)==0) {
> + switch(m) {
> + case 0:
> + case 1: return y; /* atan(+-0,+anything)=+-0 */
> + case 2: return pi+tiny;/* atan(+0,-anything) = pi */
> + case 3: return -pi-tiny;/* atan(-0,-anything) =-pi */
> + }
> + }
> + /* when x = 0 */
> + if(exptx==0 && ((ux.bits.manh&~LDBL_NBIT)|ux.bits.manl)==0)
> + return (expsigny<0)? -pio2_hi-tiny: pio2_hi+tiny;
> +
> + /* when x is INF */
> + if(exptx==BIAS+LDBL_MAX_EXP) {
> + if(expty==BIAS+LDBL_MAX_EXP) {
> + switch(m) {
> + case 0: return pio2_hi*0.5+tiny;/* atan(+INF,+INF) */
> + case 1: return -pio2_hi*0.5-tiny;/* atan(-INF,+INF) */
> + case 2: return 1.5*pio2_hi+tiny;/*atan(+INF,-INF)*/
> + case 3: return -1.5*pio2_hi-tiny;/*atan(-INF,-INF)*/
> + }
> + } else {
> + switch(m) {
> + case 0: return zero ; /* atan(+...,+INF) */
> + case 1: return -zero ; /* atan(-...,+INF) */
> + case 2: return pi+tiny ; /* atan(+...,-INF) */
> + case 3: return -pi-tiny ; /* atan(-...,-INF) */
> + }
> + }
> + }
> + /* when y is INF */
> + if(expty==BIAS+LDBL_MAX_EXP)
> + return (expsigny<0)? -pio2_hi-tiny: pio2_hi+tiny;
> +
> + /* compute y/x */
> + k = expty-exptx;
> + if(k > LDBL_MANT_DIG+2) { /* |y/x| huge */
> + z=pio2_hi+pio2_lo;
> + m&=1;
> + }
> + else if(expsignx<0&&k<-LDBL_MANT_DIG-2) z=0.0; /* |y/x| tiny, x<0 */
> + else z=atanl(fabsl(y/x)); /* safe to do y/x */
> + switch (m) {
> + case 0: return z ; /* atan(+,+) */
> + case 1: return -z ; /* atan(-,+) */
> + case 2: return pi-(z-pi_lo);/* atan(+,-) */
> + default: /* case 3 */
> + return (z-pi_lo)-pi;/* atan(-,-) */
> + }
> +}
> diff --git a/newlib/libm/ld/e_atanhl.c b/newlib/libm/ld/e_atanhl.c
> new file mode 100644
> index 000000000..11d56ea52
> --- /dev/null
> +++ b/newlib/libm/ld/e_atanhl.c
> @@ -0,0 +1,74 @@
> +/* from: FreeBSD: head/lib/msun/src/e_atanh.c 176451 2008-02-22 02:30:36Z das */
> +
> +/* @(#)e_atanh.c 1.3 95/01/18 */
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunSoft, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + *
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * See e_atanh.c for complete comments.
> + *
> + * Converted to long double by David Schultz <das@FreeBSD.ORG> and
> + * Bruce D. Evans.
> + */
> +
> +#include <float.h>
> +#ifdef __i386__
> +#include <ieeefp.h>
> +#endif
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +
> +/* EXP_TINY is the threshold below which we use atanh(x) ~= x. */
> +#if LDBL_MANT_DIG == 64
> +#define EXP_TINY -34
> +#elif LDBL_MANT_DIG == 113
> +#define EXP_TINY -58
> +#else
> +#error "Unsupported long double format"
> +#endif
> +
> +#if LDBL_MAX_EXP != 0x4000
> +/* We also require the usual expsign encoding. */
> +#error "Unsupported long double format"
> +#endif
> +
> +#define BIAS (LDBL_MAX_EXP - 1)
> +
> +static const double one = 1.0, huge = 1e300;
> +static const double zero = 0.0;
> +
> +long double
> +atanhl(long double x)
> +{
> + long double t;
> + uint16_t hx, ix;
> +
> + ENTERI();
> + GET_LDBL_EXPSIGN(hx, x);
> + ix = hx & 0x7fff;
> + if (ix >= 0x3fff) /* |x| >= 1, or NaN or misnormal */
> + RETURNI(fabsl(x) == 1 ? x / zero : (x - x) / (x - x));
> + if (ix < BIAS + EXP_TINY && (huge + x) > zero)
> + RETURNI(x); /* x is tiny */
> + SET_LDBL_EXPSIGN(x, ix);
> + if (ix < 0x3ffe) { /* |x| < 0.5, or misnormal */
> + t = x+x;
> + t = 0.5*log1pl(t+t*x/(one-x));
> + } else
> + t = 0.5*log1pl((x+x)/(one-x));
> + RETURNI((hx & 0x8000) == 0 ? t : -t);
> +}
> diff --git a/newlib/libm/ld/e_coshl.c b/newlib/libm/ld/e_coshl.c
> new file mode 100644
> index 000000000..4e3b28311
> --- /dev/null
> +++ b/newlib/libm/ld/e_coshl.c
> @@ -0,0 +1,132 @@
> +/* from: FreeBSD: head/lib/msun/src/e_coshl.c XXX */
> +
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunPro, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * See e_cosh.c for complete comments.
> + *
> + * Converted to long double by Bruce D. Evans.
> + */
> +
> +#include <float.h>
> +#ifdef __i386__
> +#include <ieeefp.h>
> +#endif
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +#include "k_expl.h"
> +
> +#if LDBL_MAX_EXP != 0x4000
> +/* We also require the usual expsign encoding. */
> +#error "Unsupported long double format"
> +#endif
> +
> +#define BIAS (LDBL_MAX_EXP - 1)
> +
> +static const volatile long double huge = 0x1p10000L, tiny = 0x1p-10000L;
> +#if LDBL_MANT_DIG == 64
> +/*
> + * Domain [-1, 1], range ~[-1.8211e-21, 1.8211e-21]:
> + * |cosh(x) - c(x)| < 2**-68.8
> + */
> +static const union IEEEl2bits
> +C4u = LD80C(0xaaaaaaaaaaaaac78, -5, 4.16666666666666682297e-2L);
> +#define C4 C4u.e
> +static const double
> +C2 = 0.5,
> +C6 = 1.3888888888888616e-3, /* 0x16c16c16c16b99.0p-62 */
> +C8 = 2.4801587301767953e-5, /* 0x1a01a01a027061.0p-68 */
> +C10 = 2.7557319163300398e-7, /* 0x127e4fb6c9b55f.0p-74 */
> +C12 = 2.0876768371393075e-9, /* 0x11eed99406a3f4.0p-81 */
> +C14 = 1.1469537039374480e-11, /* 0x1938c67cd18c48.0p-89 */
> +C16 = 4.8473490896852041e-14; /* 0x1b49c429701e45.0p-97 */
> +#elif LDBL_MANT_DIG == 113
> +/*
> + * Domain [-1, 1], range ~[-2.3194e-37, 2.3194e-37]:
> + * |cosh(x) - c(x)| < 2**-121.69
> + */
> +static const long double
> +C4 = 4.16666666666666666666666666666666225e-2L, /* 0x1555555555555555555555555554e.0p-117L */
> +C6 = 1.38888888888888888888888888889434831e-3L, /* 0x16c16c16c16c16c16c16c16c1dd7a.0p-122L */
> +C8 = 2.48015873015873015873015871870962089e-5L, /* 0x1a01a01a01a01a01a01a017af2756.0p-128L */
> +C10 = 2.75573192239858906525574318600800201e-7L, /* 0x127e4fb7789f5c72ef01c8a040640.0p-134L */
> +C12 = 2.08767569878680989791444691755468269e-9L, /* 0x11eed8eff8d897b543d0679607399.0p-141L */
> +C14= 1.14707455977297247387801189650495351e-11L, /* 0x193974a8c07c9d24ae169a7fa9b54.0p-149L */
> +C16 = 4.77947733238737883626416876486279985e-14L; /* 0x1ae7f3e733b814d4e1b90f5727fe4.0p-157L */
> +static const double
> +C2 = 0.5,
> +C18 = 1.5619206968597871e-16, /* 0x16827863b9900b.0p-105 */
> +C20 = 4.1103176218528049e-19, /* 0x1e542ba3d3c269.0p-114 */
> +C22 = 8.8967926401641701e-22, /* 0x10ce399542a014.0p-122 */
> +C24 = 1.6116681626523904e-24, /* 0x1f2c981d1f0cb7.0p-132 */
> +C26 = 2.5022374732804632e-27; /* 0x18c7ecf8b2c4a0.0p-141 */
> +#else
> +#error "Unsupported long double format"
> +#endif /* LDBL_MANT_DIG == 64 */
> +
> +/* log(2**16385 - 0.5) rounded up: */
> +static const float
> +o_threshold = 1.13572168e4; /* 0xb174de.0p-10 */
> +
> +long double
> +coshl(long double x)
> +{
> + long double hi,lo,x2,x4;
> +#if LDBL_MANT_DIG == 113
> + double dx2;
> +#endif
> + uint16_t ix;
> +
> + GET_LDBL_EXPSIGN(ix,x);
> + ix &= 0x7fff;
> +
> + /* x is INF or NaN */
> + if(ix>=0x7fff) return x*x;
> +
> + ENTERI();
> +
> + /* |x| < 1, return 1 or c(x) */
> + if(ix<0x3fff) {
> + if (ix<BIAS-(LDBL_MANT_DIG+1)/2) /* |x| < TINY */
> + RETURNI(1+tiny); /* cosh(tiny) = 1(+) with inexact */
> + x2 = x*x;
> +#if LDBL_MANT_DIG == 64
> + x4 = x2*x2;
> + RETURNI(((C16*x2 + C14)*x4 + (C12*x2 + C10))*(x4*x4*x2) +
> + ((C8*x2 + C6)*x2 + C4)*x4 + C2*x2 + 1);
> +#elif LDBL_MANT_DIG == 113
> + dx2 = x2;
> + RETURNI((((((((((((C26*dx2 + C24)*dx2 + C22)*dx2 +
> + C20)*x2 + C18)*x2 +
> + C16)*x2 + C14)*x2 + C12)*x2 + C10)*x2 + C8)*x2 + C6)*x2 +
> + C4)*(x2*x2) + C2*x2 + 1);
> +#endif
> + }
> +
> + /* |x| in [1, 64), return accurate exp(|x|)/2+1/exp(|x|)/2 */
> + if (ix < 0x4005) {
> + k_hexpl(fabsl(x), &hi, &lo);
> + RETURNI(lo + 0.25/(hi + lo) + hi);
> + }
> +
> + /* |x| in [64, o_threshold], return correctly-overflowing exp(|x|)/2 */
> + if (fabsl(x) <= o_threshold)
> + RETURNI(hexpl(fabsl(x)));
> +
> + /* |x| > o_threshold, cosh(x) overflow */
> + RETURNI(huge*huge);
> +}
> diff --git a/newlib/libm/ld/e_fmodl.c b/newlib/libm/ld/e_fmodl.c
> new file mode 100644
> index 000000000..ad3bcc34c
> --- /dev/null
> +++ b/newlib/libm/ld/e_fmodl.c
> @@ -0,0 +1,149 @@
> +/* @(#)e_fmod.c 1.3 95/01/18 */
> +/*-
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunSoft, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include <float.h>
> +#include <stdint.h>
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +
> +#define BIAS (LDBL_MAX_EXP - 1)
> +
> +#if LDBL_MANL_SIZE > 32
> +typedef uint64_t manl_t;
> +#else
> +typedef uint32_t manl_t;
> +#endif
> +
> +#if LDBL_MANH_SIZE > 32
> +typedef uint64_t manh_t;
> +#else
> +typedef uint32_t manh_t;
> +#endif
> +
> +/*
> + * These macros add and remove an explicit integer bit in front of the
> + * fractional mantissa, if the architecture doesn't have such a bit by
> + * default already.
> + */
> +#ifdef LDBL_IMPLICIT_NBIT
> +#define SET_NBIT(hx) ((hx) | (1ULL << LDBL_MANH_SIZE))
> +#define HFRAC_BITS LDBL_MANH_SIZE
> +#else
> +#define SET_NBIT(hx) (hx)
> +#define HFRAC_BITS (LDBL_MANH_SIZE - 1)
> +#endif
> +
> +#define MANL_SHIFT (LDBL_MANL_SIZE - 1)
> +
> +static const long double one = 1.0, Zero[] = {0.0, -0.0,};
> +
> +/*
> + * fmodl(x,y)
> + * Return x mod y in exact arithmetic
> + * Method: shift and subtract
> + *
> + * Assumptions:
> + * - The low part of the mantissa fits in a manl_t exactly.
> + * - The high part of the mantissa fits in an int64_t with enough room
> + * for an explicit integer bit in front of the fractional bits.
> + */
> +long double
> +fmodl(long double x, long double y)
> +{
> + union IEEEl2bits ux, uy;
> + int64_t hx,hz; /* We need a carry bit even if LDBL_MANH_SIZE is 32. */
> + manh_t hy;
> + manl_t lx,ly,lz;
> + int ix,iy,n,sx;
> +
> + ux.e = x;
> + uy.e = y;
> + sx = ux.bits.sign;
> +
> + /* purge off exception values */
> + if((uy.bits.exp|uy.bits.manh|uy.bits.manl)==0 || /* y=0 */
> + (ux.bits.exp == BIAS + LDBL_MAX_EXP) || /* or x not finite */
> + (uy.bits.exp == BIAS + LDBL_MAX_EXP &&
> + ((uy.bits.manh&~LDBL_NBIT)|uy.bits.manl)!=0)) /* or y is NaN */
> + return nan_mix_op(x, y, *)/nan_mix_op(x, y, *);
> + if(ux.bits.exp<=uy.bits.exp) {
> + if((ux.bits.exp<uy.bits.exp) ||
> + (ux.bits.manh<=uy.bits.manh &&
> + (ux.bits.manh<uy.bits.manh ||
> + ux.bits.manl<uy.bits.manl))) {
> + return x; /* |x|<|y| return x or x-y */
> + }
> + if(ux.bits.manh==uy.bits.manh && ux.bits.manl==uy.bits.manl) {
> + return Zero[sx]; /* |x|=|y| return x*0*/
> + }
> + }
> +
> + /* determine ix = ilogb(x) */
> + if(ux.bits.exp == 0) { /* subnormal x */
> + ux.e *= 0x1.0p512;
> + ix = ux.bits.exp - (BIAS + 512);
> + } else {
> + ix = ux.bits.exp - BIAS;
> + }
> +
> + /* determine iy = ilogb(y) */
> + if(uy.bits.exp == 0) { /* subnormal y */
> + uy.e *= 0x1.0p512;
> + iy = uy.bits.exp - (BIAS + 512);
> + } else {
> + iy = uy.bits.exp - BIAS;
> + }
> +
> + /* set up {hx,lx}, {hy,ly} and align y to x */
> + hx = SET_NBIT(ux.bits.manh);
> + hy = SET_NBIT(uy.bits.manh);
> + lx = ux.bits.manl;
> + ly = uy.bits.manl;
> +
> + /* fix point fmod */
> + n = ix - iy;
> +
> + while(n--) {
> + hz=hx-hy;lz=lx-ly; if(lx<ly) hz -= 1;
> + if(hz<0){hx = hx+hx+(lx>>MANL_SHIFT); lx = lx+lx;}
> + else {
> + if ((hz|lz)==0) /* return sign(x)*0 */
> + return Zero[sx];
> + hx = hz+hz+(lz>>MANL_SHIFT); lx = lz+lz;
> + }
> + }
> + hz=hx-hy;lz=lx-ly; if(lx<ly) hz -= 1;
> + if(hz>=0) {hx=hz;lx=lz;}
> +
> + /* convert back to floating value and restore the sign */
> + if((hx|lx)==0) /* return sign(x)*0 */
> + return Zero[sx];
> + while(hx<(1ULL<<HFRAC_BITS)) { /* normalize x */
> + hx = hx+hx+(lx>>MANL_SHIFT); lx = lx+lx;
> + iy -= 1;
> + }
> + ux.bits.manh = hx; /* The mantissa is truncated here if needed. */
> + ux.bits.manl = lx;
> + if (iy < LDBL_MIN_EXP) {
> + ux.bits.exp = iy + (BIAS + 512);
> + ux.e *= 0x1p-512;
> + } else {
> + ux.bits.exp = iy + BIAS;
> + }
> + x = ux.e * one; /* create necessary signal */
> + return x; /* exact output */
> +}
> diff --git a/newlib/libm/ld/e_lgammal.c b/newlib/libm/ld/e_lgammal.c
> new file mode 100644
> index 000000000..ebc2fc78c
> --- /dev/null
> +++ b/newlib/libm/ld/e_lgammal.c
> @@ -0,0 +1,25 @@
> +/* @(#)e_lgamma.c 1.3 95/01/18 */
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunSoft, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include "math.h"
> +#include "math_private.h"
> +
> +extern int signgam;
> +
> +long double
> +lgammal(long double x)
> +{
> + return lgammal_r(x,&signgam);
> +}
> diff --git a/newlib/libm/ld/e_remainderl.c b/newlib/libm/ld/e_remainderl.c
> new file mode 100644
> index 000000000..4a6786309
> --- /dev/null
> +++ b/newlib/libm/ld/e_remainderl.c
> @@ -0,0 +1,40 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2008 David Schultz <das@FreeBSD.ORG>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include <math.h>
> +
> +long double
> +remainderl(long double x, long double y)
> +{
> + int quo;
> +
> + return (remquol(x, y, &quo));
> +}
> diff --git a/newlib/libm/ld/e_sinhl.c b/newlib/libm/ld/e_sinhl.c
> new file mode 100644
> index 000000000..38d3df195
> --- /dev/null
> +++ b/newlib/libm/ld/e_sinhl.c
> @@ -0,0 +1,134 @@
> +/* from: FreeBSD: head/lib/msun/src/e_sinhl.c XXX */
> +
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunPro, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * See e_sinh.c for complete comments.
> + *
> + * Converted to long double by Bruce D. Evans.
> + */
> +
> +#include <float.h>
> +#ifdef __i386__
> +#include <ieeefp.h>
> +#endif
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +#include "k_expl.h"
> +
> +#if LDBL_MAX_EXP != 0x4000
> +/* We also require the usual expsign encoding. */
> +#error "Unsupported long double format"
> +#endif
> +
> +#define BIAS (LDBL_MAX_EXP - 1)
> +
> +static const long double shuge = 0x1p16383L;
> +#if LDBL_MANT_DIG == 64
> +/*
> + * Domain [-1, 1], range ~[-6.6749e-22, 6.6749e-22]:
> + * |sinh(x)/x - s(x)| < 2**-70.3
> + */
> +static const union IEEEl2bits
> +S3u = LD80C(0xaaaaaaaaaaaaaaaa, -3, 1.66666666666666666658e-1L);
> +#define S3 S3u.e
> +static const double
> +S5 = 8.3333333333333332e-3, /* 0x11111111111111.0p-59 */
> +S7 = 1.9841269841270074e-4, /* 0x1a01a01a01a070.0p-65 */
> +S9 = 2.7557319223873889e-6, /* 0x171de3a5565fe6.0p-71 */
> +S11 = 2.5052108406704084e-8, /* 0x1ae6456857530f.0p-78 */
> +S13 = 1.6059042748655297e-10, /* 0x161245fa910697.0p-85 */
> +S15 = 7.6470006914396920e-13, /* 0x1ae7ce4eff2792.0p-93 */
> +S17 = 2.8346142308424267e-15; /* 0x19882ce789ffc6.0p-101 */
> +#elif LDBL_MANT_DIG == 113
> +/*
> + * Domain [-1, 1], range ~[-2.9673e-36, 2.9673e-36]:
> + * |sinh(x)/x - s(x)| < 2**-118.0
> + */
> +static const long double
> +S3 = 1.66666666666666666666666666666666033e-1L, /* 0x1555555555555555555555555553b.0p-115L */
> +S5 = 8.33333333333333333333333333337643193e-3L, /* 0x111111111111111111111111180f5.0p-119L */
> +S7 = 1.98412698412698412698412697391263199e-4L, /* 0x1a01a01a01a01a01a01a0176aad11.0p-125L */
> +S9 = 2.75573192239858906525574406205464218e-6L, /* 0x171de3a556c7338faac243aaa9592.0p-131L */
> +S11 = 2.50521083854417187749675637460977997e-8L, /* 0x1ae64567f544e38fe59b3380d7413.0p-138L */
> +S13 = 1.60590438368216146368737762431552702e-10L, /* 0x16124613a86d098059c7620850fc2.0p-145L */
> +S15 = 7.64716373181980539786802470969096440e-13L, /* 0x1ae7f3e733b814193af09ce723043.0p-153L */
> +S17 = 2.81145725434775409870584280722701574e-15L; /* 0x1952c77030c36898c3fd0b6dfc562.0p-161L */
> +static const double
> +S19= 8.2206352435411005e-18, /* 0x12f49b4662b86d.0p-109 */
> +S21= 1.9572943931418891e-20, /* 0x171b8f2fab9628.0p-118 */
> +S23 = 3.8679983530666939e-23, /* 0x17617002b73afc.0p-127 */
> +S25 = 6.5067867911512749e-26; /* 0x1423352626048a.0p-136 */
> +#else
> +#error "Unsupported long double format"
> +#endif /* LDBL_MANT_DIG == 64 */
> +
> +/* log(2**16385 - 0.5) rounded up: */
> +static const float
> +o_threshold = 1.13572168e4; /* 0xb174de.0p-10 */
> +
> +long double
> +sinhl(long double x)
> +{
> + long double hi,lo,x2,x4;
> +#if LDBL_MANT_DIG == 113
> + double dx2;
> +#endif
> + double s;
> + int16_t ix,jx;
> +
> + GET_LDBL_EXPSIGN(jx,x);
> + ix = jx&0x7fff;
> +
> + /* x is INF or NaN */
> + if(ix>=0x7fff) return x+x;
> +
> + ENTERI();
> +
> + s = 1;
> + if (jx<0) s = -1;
> +
> + /* |x| < 64, return x, s(x), or accurate s*(exp(|x|)/2-1/exp(|x|)/2) */
> + if (ix<0x4005) { /* |x|<64 */
> + if (ix<BIAS-(LDBL_MANT_DIG+1)/2) /* |x|<TINY */
> + if(shuge+x>1) RETURNI(x); /* sinh(tiny) = tiny with inexact */
> + if (ix<0x3fff) { /* |x|<1 */
> + x2 = x*x;
> +#if LDBL_MANT_DIG == 64
> + x4 = x2*x2;
> + RETURNI(((S17*x2 + S15)*x4 + (S13*x2 + S11))*(x2*x*x4*x4) +
> + ((S9*x2 + S7)*x2 + S5)*(x2*x*x2) + S3*(x2*x) + x);
> +#elif LDBL_MANT_DIG == 113
> + dx2 = x2;
> + RETURNI(((((((((((S25*dx2 + S23)*dx2 +
> + S21)*x2 + S19)*x2 +
> + S17)*x2 + S15)*x2 + S13)*x2 + S11)*x2 + S9)*x2 + S7)*x2 +
> + S5)* (x2*x*x2) +
> + S3*(x2*x) + x);
> +#endif
> + }
> + k_hexpl(fabsl(x), &hi, &lo);
> + RETURNI(s*(lo - 0.25/(hi + lo) + hi));
> + }
> +
> + /* |x| in [64, o_threshold], return correctly-overflowing s*exp(|x|)/2 */
> + if (fabsl(x) <= o_threshold)
> + RETURNI(s*hexpl(fabsl(x)));
> +
> + /* |x| > o_threshold, sinh(x) overflow */
> + return x*shuge;
> +}
> diff --git a/newlib/libm/ld/fpmath.h b/newlib/libm/ld/fpmath.h
> new file mode 100644
> index 000000000..ce935eb40
> --- /dev/null
> +++ b/newlib/libm/ld/fpmath.h
> @@ -0,0 +1,82 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2003 Mike Barcroft <mike@FreeBSD.org>
> + * Copyright (c) 2002 David Schultz <das@FreeBSD.ORG>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + *
> + * $FreeBSD$
> + */
> +
> +#ifndef _FPMATH_H_
> +#define _FPMATH_H_
> +
> +#include <sys/endian.h>
> +#include "_fpmath.h"
> +
> +#ifndef _IEEE_WORD_ORDER
> +#define _IEEE_WORD_ORDER _BYTE_ORDER
> +#endif
> +
> +union IEEEf2bits {
> + float f;
> + struct {
> +#if _BYTE_ORDER == _LITTLE_ENDIAN
> + unsigned int man :23;
> + unsigned int exp :8;
> + unsigned int sign :1;
> +#else /* _BIG_ENDIAN */
> + unsigned int sign :1;
> + unsigned int exp :8;
> + unsigned int man :23;
> +#endif
> + } bits;
> +};
> +
> +#define DBL_MANH_SIZE 20
> +#define DBL_MANL_SIZE 32
> +
> +union IEEEd2bits {
> + double d;
> + struct {
> +#if _BYTE_ORDER == _LITTLE_ENDIAN
> +#if _IEEE_WORD_ORDER == _LITTLE_ENDIAN
> + unsigned int manl :32;
> +#endif
> + unsigned int manh :20;
> + unsigned int exp :11;
> + unsigned int sign :1;
> +#if _IEEE_WORD_ORDER == _BIG_ENDIAN
> + unsigned int manl :32;
> +#endif
> +#else /* _BIG_ENDIAN */
> + unsigned int sign :1;
> + unsigned int exp :11;
> + unsigned int manh :20;
> + unsigned int manl :32;
> +#endif
> + } bits;
> +};
> +
> +#endif /* !_FPMATH_H */
> diff --git a/newlib/libm/ld/math_private.h b/newlib/libm/ld/math_private.h
> new file mode 100644
> index 000000000..df526e71e
> --- /dev/null
> +++ b/newlib/libm/ld/math_private.h
> @@ -0,0 +1,924 @@
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunPro, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +/*
> + * from: @(#)fdlibm.h 5.1 93/09/24
> + * $FreeBSD$
> + */
> +
> +#ifndef _MATH_PRIVATE_H_
> +#define _MATH_PRIVATE_H_
> +
> +#include <sys/types.h>
> +#include <machine/endian.h>
> +
> +/*
> + * The original fdlibm code used statements like:
> + * n0 = ((*(int*)&one)>>29)^1; * index of high word *
> + * ix0 = *(n0+(int*)&x); * high word of x *
> + * ix1 = *((1-n0)+(int*)&x); * low word of x *
> + * to dig two 32 bit words out of the 64 bit IEEE floating point
> + * value. That is non-ANSI, and, moreover, the gcc instruction
> + * scheduler gets it wrong. We instead use the following macros.
> + * Unlike the original code, we determine the endianness at compile
> + * time, not at run time; I don't see much benefit to selecting
> + * endianness at run time.
> + */
> +
> +/*
> + * A union which permits us to convert between a double and two 32 bit
> + * ints.
> + */
> +
> +#ifdef __arm__
> +#if defined(__VFP_FP__) || defined(__ARM_EABI__)
> +#define IEEE_WORD_ORDER BYTE_ORDER
> +#else
> +#define IEEE_WORD_ORDER BIG_ENDIAN
> +#endif
> +#else /* __arm__ */
> +#define IEEE_WORD_ORDER BYTE_ORDER
> +#endif
> +
> +/* A union which permits us to convert between a long double and
> + four 32 bit ints. */
> +
> +#if IEEE_WORD_ORDER == BIG_ENDIAN
> +
> +typedef union
> +{
> + long double value;
> + struct {
> + u_int32_t mswhi;
> + u_int32_t mswlo;
> + u_int32_t lswhi;
> + u_int32_t lswlo;
> + } parts32;
> + struct {
> + u_int64_t msw;
> + u_int64_t lsw;
> + } parts64;
> +} ieee_quad_shape_type;
> +
> +#endif
> +
> +#if IEEE_WORD_ORDER == LITTLE_ENDIAN
> +
> +typedef union
> +{
> + long double value;
> + struct {
> + u_int32_t lswlo;
> + u_int32_t lswhi;
> + u_int32_t mswlo;
> + u_int32_t mswhi;
> + } parts32;
> + struct {
> + u_int64_t lsw;
> + u_int64_t msw;
> + } parts64;
> +} ieee_quad_shape_type;
> +
> +#endif
> +
> +#if IEEE_WORD_ORDER == BIG_ENDIAN
> +
> +typedef union
> +{
> + double value;
> + struct
> + {
> + u_int32_t msw;
> + u_int32_t lsw;
> + } parts;
> + struct
> + {
> + u_int64_t w;
> + } xparts;
> +} ieee_double_shape_type;
> +
> +#endif
> +
> +#if IEEE_WORD_ORDER == LITTLE_ENDIAN
> +
> +typedef union
> +{
> + double value;
> + struct
> + {
> + u_int32_t lsw;
> + u_int32_t msw;
> + } parts;
> + struct
> + {
> + u_int64_t w;
> + } xparts;
> +} ieee_double_shape_type;
> +
> +#endif
> +
> +/* Get two 32 bit ints from a double. */
> +
> +#define EXTRACT_WORDS(ix0,ix1,d) \
> +do { \
> + ieee_double_shape_type ew_u; \
> + ew_u.value = (d); \
> + (ix0) = ew_u.parts.msw; \
> + (ix1) = ew_u.parts.lsw; \
> +} while (0)
> +
> +/* Get a 64-bit int from a double. */
> +#define EXTRACT_WORD64(ix,d) \
> +do { \
> + ieee_double_shape_type ew_u; \
> + ew_u.value = (d); \
> + (ix) = ew_u.xparts.w; \
> +} while (0)
> +
> +/* Get the more significant 32 bit int from a double. */
> +
> +#define GET_HIGH_WORD(i,d) \
> +do { \
> + ieee_double_shape_type gh_u; \
> + gh_u.value = (d); \
> + (i) = gh_u.parts.msw; \
> +} while (0)
> +
> +/* Get the less significant 32 bit int from a double. */
> +
> +#define GET_LOW_WORD(i,d) \
> +do { \
> + ieee_double_shape_type gl_u; \
> + gl_u.value = (d); \
> + (i) = gl_u.parts.lsw; \
> +} while (0)
> +
> +/* Set a double from two 32 bit ints. */
> +
> +#define INSERT_WORDS(d,ix0,ix1) \
> +do { \
> + ieee_double_shape_type iw_u; \
> + iw_u.parts.msw = (ix0); \
> + iw_u.parts.lsw = (ix1); \
> + (d) = iw_u.value; \
> +} while (0)
> +
> +/* Set a double from a 64-bit int. */
> +#define INSERT_WORD64(d,ix) \
> +do { \
> + ieee_double_shape_type iw_u; \
> + iw_u.xparts.w = (ix); \
> + (d) = iw_u.value; \
> +} while (0)
> +
> +/* Set the more significant 32 bits of a double from an int. */
> +
> +#define SET_HIGH_WORD(d,v) \
> +do { \
> + ieee_double_shape_type sh_u; \
> + sh_u.value = (d); \
> + sh_u.parts.msw = (v); \
> + (d) = sh_u.value; \
> +} while (0)
> +
> +/* Set the less significant 32 bits of a double from an int. */
> +
> +#define SET_LOW_WORD(d,v) \
> +do { \
> + ieee_double_shape_type sl_u; \
> + sl_u.value = (d); \
> + sl_u.parts.lsw = (v); \
> + (d) = sl_u.value; \
> +} while (0)
> +
> +/*
> + * A union which permits us to convert between a float and a 32 bit
> + * int.
> + */
> +
> +typedef union
> +{
> + float value;
> + /* FIXME: Assumes 32 bit int. */
> + unsigned int word;
> +} ieee_float_shape_type;
> +
> +/* Get a 32 bit int from a float. */
> +
> +#define GET_FLOAT_WORD(i,d) \
> +do { \
> + ieee_float_shape_type gf_u; \
> + gf_u.value = (d); \
> + (i) = gf_u.word; \
> +} while (0)
> +
> +/* Set a float from a 32 bit int. */
> +
> +#define SET_FLOAT_WORD(d,i) \
> +do { \
> + ieee_float_shape_type sf_u; \
> + sf_u.word = (i); \
> + (d) = sf_u.value; \
> +} while (0)
> +
> +/*
> + * Get expsign and mantissa as 16 bit and 64 bit ints from an 80 bit long
> + * double.
> + */
> +
> +#define EXTRACT_LDBL80_WORDS(ix0,ix1,d) \
> +do { \
> + union IEEEl2bits ew_u; \
> + ew_u.e = (d); \
> + (ix0) = ew_u.xbits.expsign; \
> + (ix1) = ew_u.xbits.man; \
> +} while (0)
> +
> +/*
> + * Get expsign and mantissa as one 16 bit and two 64 bit ints from a 128 bit
> + * long double.
> + */
> +
> +#define EXTRACT_LDBL128_WORDS(ix0,ix1,ix2,d) \
> +do { \
> + union IEEEl2bits ew_u; \
> + ew_u.e = (d); \
> + (ix0) = ew_u.xbits.expsign; \
> + (ix1) = ew_u.xbits.manh; \
> + (ix2) = ew_u.xbits.manl; \
> +} while (0)
> +
> +/* Get expsign as a 16 bit int from a long double. */
> +
> +#define GET_LDBL_EXPSIGN(i,d) \
> +do { \
> + union IEEEl2bits ge_u; \
> + ge_u.e = (d); \
> + (i) = ge_u.xbits.expsign; \
> +} while (0)
> +
> +/*
> + * Set an 80 bit long double from a 16 bit int expsign and a 64 bit int
> + * mantissa.
> + */
> +
> +#define INSERT_LDBL80_WORDS(d,ix0,ix1) \
> +do { \
> + union IEEEl2bits iw_u; \
> + iw_u.xbits.expsign = (ix0); \
> + iw_u.xbits.man = (ix1); \
> + (d) = iw_u.e; \
> +} while (0)
> +
> +/*
> + * Set a 128 bit long double from a 16 bit int expsign and two 64 bit ints
> + * comprising the mantissa.
> + */
> +
> +#define INSERT_LDBL128_WORDS(d,ix0,ix1,ix2) \
> +do { \
> + union IEEEl2bits iw_u; \
> + iw_u.xbits.expsign = (ix0); \
> + iw_u.xbits.manh = (ix1); \
> + iw_u.xbits.manl = (ix2); \
> + (d) = iw_u.e; \
> +} while (0)
> +
> +/* Set expsign of a long double from a 16 bit int. */
> +
> +#define SET_LDBL_EXPSIGN(d,v) \
> +do { \
> + union IEEEl2bits se_u; \
> + se_u.e = (d); \
> + se_u.xbits.expsign = (v); \
> + (d) = se_u.e; \
> +} while (0)
> +
> +#ifdef __i386__
> +/* Long double constants are broken on i386. */
> +#define LD80C(m, ex, v) { \
> + .xbits.man = __CONCAT(m, ULL), \
> + .xbits.expsign = (0x3fff + (ex)) | ((v) < 0 ? 0x8000 : 0), \
> +}
> +#else
> +/* The above works on non-i386 too, but we use this to check v. */
> +#define LD80C(m, ex, v) { .e = (v), }
> +#endif
> +
> +#ifdef FLT_EVAL_METHOD
> +/*
> + * Attempt to get strict C99 semantics for assignment with non-C99 compilers.
> + */
> +#if FLT_EVAL_METHOD == 0 || __GNUC__ == 0
> +#define STRICT_ASSIGN(type, lval, rval) ((lval) = (rval))
> +#else
> +#define STRICT_ASSIGN(type, lval, rval) do { \
> + volatile type __lval; \
> + \
> + if (sizeof(type) >= sizeof(long double)) \
> + (lval) = (rval); \
> + else { \
> + __lval = (rval); \
> + (lval) = __lval; \
> + } \
> +} while (0)
> +#endif
> +#endif /* FLT_EVAL_METHOD */
> +
> +/* Support switching the mode to FP_PE if necessary. */
> +#if defined(__i386__) && !defined(NO_FPSETPREC)
> +#define ENTERI() ENTERIT(long double)
> +#define ENTERIT(returntype) \
> + returntype __retval; \
> + fp_prec_t __oprec; \
> + \
> + if ((__oprec = fpgetprec()) != FP_PE) \
> + fpsetprec(FP_PE)
> +#define RETURNI(x) do { \
> + __retval = (x); \
> + if (__oprec != FP_PE) \
> + fpsetprec(__oprec); \
> + RETURNF(__retval); \
> +} while (0)
> +#define ENTERV() \
> + fp_prec_t __oprec; \
> + \
> + if ((__oprec = fpgetprec()) != FP_PE) \
> + fpsetprec(FP_PE)
> +#define RETURNV() do { \
> + if (__oprec != FP_PE) \
> + fpsetprec(__oprec); \
> + return; \
> +} while (0)
> +#else
> +#define ENTERI()
> +#define ENTERIT(x)
> +#define RETURNI(x) RETURNF(x)
> +#define ENTERV()
> +#define RETURNV() return
> +#endif
> +
> +/* Default return statement if hack*_t() is not used. */
> +#define RETURNF(v) return (v)
> +
> +/*
> + * 2sum gives the same result as 2sumF without requiring |a| >= |b| or
> + * a == 0, but is slower.
> + */
> +#define _2sum(a, b) do { \
> + __typeof(a) __s, __w; \
> + \
> + __w = (a) + (b); \
> + __s = __w - (a); \
> + (b) = ((a) - (__w - __s)) + ((b) - __s); \
> + (a) = __w; \
> +} while (0)
> +
> +/*
> + * 2sumF algorithm.
> + *
> + * "Normalize" the terms in the infinite-precision expression a + b for
> + * the sum of 2 floating point values so that b is as small as possible
> + * relative to 'a'. (The resulting 'a' is the value of the expression in
> + * the same precision as 'a' and the resulting b is the rounding error.)
> + * |a| must be >= |b| or 0, b's type must be no larger than 'a's type, and
> + * exponent overflow or underflow must not occur. This uses a Theorem of
> + * Dekker (1971). See Knuth (1981) 4.2.2 Theorem C. The name "TwoSum"
> + * is apparently due to Skewchuk (1997).
> + *
> + * For this to always work, assignment of a + b to 'a' must not retain any
> + * extra precision in a + b. This is required by C standards but broken
> + * in many compilers. The brokenness cannot be worked around using
> + * STRICT_ASSIGN() like we do elsewhere, since the efficiency of this
> + * algorithm would be destroyed by non-null strict assignments. (The
> + * compilers are correct to be broken -- the efficiency of all floating
> + * point code calculations would be destroyed similarly if they forced the
> + * conversions.)
> + *
> + * Fortunately, a case that works well can usually be arranged by building
> + * any extra precision into the type of 'a' -- 'a' should have type float_t,
> + * double_t or long double. b's type should be no larger than 'a's type.
> + * Callers should use these types with scopes as large as possible, to
> + * reduce their own extra-precision and efficiciency problems. In
> + * particular, they shouldn't convert back and forth just to call here.
> + */
> +#ifdef DEBUG
> +#define _2sumF(a, b) do { \
> + __typeof(a) __w; \
> + volatile __typeof(a) __ia, __ib, __r, __vw; \
> + \
> + __ia = (a); \
> + __ib = (b); \
> + assert(__ia == 0 || fabsl(__ia) >= fabsl(__ib)); \
> + \
> + __w = (a) + (b); \
> + (b) = ((a) - __w) + (b); \
> + (a) = __w; \
> + \
> + /* The next 2 assertions are weak if (a) is already long double. */ \
> + assert((long double)__ia + __ib == (long double)(a) + (b)); \
> + __vw = __ia + __ib; \
> + __r = __ia - __vw; \
> + __r += __ib; \
> + assert(__vw == (a) && __r == (b)); \
> +} while (0)
> +#else /* !DEBUG */
> +#define _2sumF(a, b) do { \
> + __typeof(a) __w; \
> + \
> + __w = (a) + (b); \
> + (b) = ((a) - __w) + (b); \
> + (a) = __w; \
> +} while (0)
> +#endif /* DEBUG */
> +
> +/*
> + * Set x += c, where x is represented in extra precision as a + b.
> + * x must be sufficiently normalized and sufficiently larger than c,
> + * and the result is then sufficiently normalized.
> + *
> + * The details of ordering are that |a| must be >= |c| (so that (a, c)
> + * can be normalized without extra work to swap 'a' with c). The details of
> + * the normalization are that b must be small relative to the normalized 'a'.
> + * Normalization of (a, c) makes the normalized c tiny relative to the
> + * normalized a, so b remains small relative to 'a' in the result. However,
> + * b need not ever be tiny relative to 'a'. For example, b might be about
> + * 2**20 times smaller than 'a' to give about 20 extra bits of precision.
> + * That is usually enough, and adding c (which by normalization is about
> + * 2**53 times smaller than a) cannot change b significantly. However,
> + * cancellation of 'a' with c in normalization of (a, c) may reduce 'a'
> + * significantly relative to b. The caller must ensure that significant
> + * cancellation doesn't occur, either by having c of the same sign as 'a',
> + * or by having |c| a few percent smaller than |a|. Pre-normalization of
> + * (a, b) may help.
> + *
> + * This is a variant of an algorithm of Kahan (see Knuth (1981) 4.2.2
> + * exercise 19). We gain considerable efficiency by requiring the terms to
> + * be sufficiently normalized and sufficiently increasing.
> + */
> +#define _3sumF(a, b, c) do { \
> + __typeof(a) __tmp; \
> + \
> + __tmp = (c); \
> + _2sumF(__tmp, (a)); \
> + (b) += (a); \
> + (a) = __tmp; \
> +} while (0)
> +
> +/*
> + * Common routine to process the arguments to nan(), nanf(), and nanl().
> + */
> +void _scan_nan(uint32_t *__words, int __num_words, const char *__s);
> +
> +/*
> + * Mix 0, 1 or 2 NaNs. First add 0 to each arg. This normally just turns
> + * signaling NaNs into quiet NaNs by setting a quiet bit. We do this
> + * because we want to never return a signaling NaN, and also because we
> + * don't want the quiet bit to affect the result. Then mix the converted
> + * args using the specified operation.
> + *
> + * When one arg is NaN, the result is typically that arg quieted. When both
> + * args are NaNs, the result is typically the quietening of the arg whose
> + * mantissa is largest after quietening. When neither arg is NaN, the
> + * result may be NaN because it is indeterminate, or finite for subsequent
> + * construction of a NaN as the indeterminate 0.0L/0.0L.
> + *
> + * Technical complications: the result in bits after rounding to the final
> + * precision might depend on the runtime precision and/or on compiler
> + * optimizations, especially when different register sets are used for
> + * different precisions. Try to make the result not depend on at least the
> + * runtime precision by always doing the main mixing step in long double
> + * precision. Try to reduce dependencies on optimizations by adding the
> + * the 0's in different precisions (unless everything is in long double
> + * precision).
> + */
> +#define nan_mix(x, y) (nan_mix_op((x), (y), +))
> +#define nan_mix_op(x, y, op) (((x) + 0.0L) op ((y) + 0))
> +
> +#ifdef _COMPLEX_H
> +
> +/*
> + * C99 specifies that complex numbers have the same representation as
> + * an array of two elements, where the first element is the real part
> + * and the second element is the imaginary part.
> + */
> +typedef union {
> + float complex f;
> + float a[2];
> +} float_complex;
> +typedef union {
> + double complex f;
> + double a[2];
> +} double_complex;
> +typedef union {
> + long double complex f;
> + long double a[2];
> +} long_double_complex;
> +#define REALPART(z) ((z).a[0])
> +#define IMAGPART(z) ((z).a[1])
> +
> +/*
> + * Inline functions that can be used to construct complex values.
> + *
> + * The C99 standard intends x+I*y to be used for this, but x+I*y is
> + * currently unusable in general since gcc introduces many overflow,
> + * underflow, sign and efficiency bugs by rewriting I*y as
> + * (0.0+I)*(y+0.0*I) and laboriously computing the full complex product.
> + * In particular, I*Inf is corrupted to NaN+I*Inf, and I*-0 is corrupted
> + * to -0.0+I*0.0.
> + *
> + * The C11 standard introduced the macros CMPLX(), CMPLXF() and CMPLXL()
> + * to construct complex values. Compilers that conform to the C99
> + * standard require the following functions to avoid the above issues.
> + */
> +
> +#ifndef CMPLXF
> +static __inline float complex
> +CMPLXF(float x, float y)
> +{
> + float_complex z;
> +
> + REALPART(z) = x;
> + IMAGPART(z) = y;
> + return (z.f);
> +}
> +#endif
> +
> +#ifndef CMPLX
> +static __inline double complex
> +CMPLX(double x, double y)
> +{
> + double_complex z;
> +
> + REALPART(z) = x;
> + IMAGPART(z) = y;
> + return (z.f);
> +}
> +#endif
> +
> +#ifndef CMPLXL
> +static __inline long double complex
> +CMPLXL(long double x, long double y)
> +{
> + long_double_complex z;
> +
> + REALPART(z) = x;
> + IMAGPART(z) = y;
> + return (z.f);
> +}
> +#endif
> +
> +#endif /* _COMPLEX_H */
> +
> +/*
> + * The rnint() family rounds to the nearest integer for a restricted range
> + * range of args (up to about 2**MANT_DIG). We assume that the current
> + * rounding mode is FE_TONEAREST so that this can be done efficiently.
> + * Extra precision causes more problems in practice, and we only centralize
> + * this here to reduce those problems, and have not solved the efficiency
> + * problems. The exp2() family uses a more delicate version of this that
> + * requires extracting bits from the intermediate value, so it is not
> + * centralized here and should copy any solution of the efficiency problems.
> + */
> +
> +static inline double
> +rnint(__double_t x)
> +{
> + /*
> + * This casts to double to kill any extra precision. This depends
> + * on the cast being applied to a double_t to avoid compiler bugs
> + * (this is a cleaner version of STRICT_ASSIGN()). This is
> + * inefficient if there actually is extra precision, but is hard
> + * to improve on. We use double_t in the API to minimise conversions
> + * for just calling here. Note that we cannot easily change the
> + * magic number to the one that works directly with double_t, since
> + * the rounding precision is variable at runtime on x86 so the
> + * magic number would need to be variable. Assuming that the
> + * rounding precision is always the default is too fragile. This
> + * and many other complications will move when the default is
> + * changed to FP_PE.
> + */
> + return ((double)(x + 0x1.8p52) - 0x1.8p52);
> +}
> +
> +static inline float
> +rnintf(__float_t x)
> +{
> + /*
> + * As for rnint(), except we could just call that to handle the
> + * extra precision case, usually without losing efficiency.
> + */
> + return ((float)(x + 0x1.8p23F) - 0x1.8p23F);
> +}
> +
> +#ifdef LDBL_MANT_DIG
> +/*
> + * The complications for extra precision are smaller for rnintl() since it
> + * can safely assume that the rounding precision has been increased from
> + * its default to FP_PE on x86. We don't exploit that here to get small
> + * optimizations from limiting the rangle to double. We just need it for
> + * the magic number to work with long doubles. ld128 callers should use
> + * rnint() instead of this if possible. ld80 callers should prefer
> + * rnintl() since for amd64 this avoids swapping the register set, while
> + * for i386 it makes no difference (assuming FP_PE), and for other arches
> + * it makes little difference.
> + */
> +static inline long double
> +rnintl(long double x)
> +{
> + return (x + __CONCAT(0x1.8p, LDBL_MANT_DIG) / 2 -
> + __CONCAT(0x1.8p, LDBL_MANT_DIG) / 2);
> +}
> +#endif /* LDBL_MANT_DIG */
> +
> +/*
> + * irint() and i64rint() give the same result as casting to their integer
> + * return type provided their arg is a floating point integer. They can
> + * sometimes be more efficient because no rounding is required.
> + */
> +#if defined(amd64) || defined(__i386__)
> +#define irint(x) \
> + (sizeof(x) == sizeof(float) && \
> + sizeof(__float_t) == sizeof(long double) ? irintf(x) : \
> + sizeof(x) == sizeof(double) && \
> + sizeof(__double_t) == sizeof(long double) ? irintd(x) : \
> + sizeof(x) == sizeof(long double) ? irintl(x) : (int)(x))
> +#else
> +#define irint(x) ((int)(x))
> +#endif
> +
> +#define i64rint(x) ((int64_t)(x)) /* only needed for ld128 so not opt. */
> +
> +#if defined(__i386__)
> +static __inline int
> +irintf(float x)
> +{
> + int n;
> +
> + __asm("fistl %0" : "=m" (n) : "t" (x));
> + return (n);
> +}
> +
> +static __inline int
> +irintd(double x)
> +{
> + int n;
> +
> + __asm("fistl %0" : "=m" (n) : "t" (x));
> + return (n);
> +}
> +#endif
> +
> +#if defined(__amd64__) || defined(__i386__)
> +static __inline int
> +irintl(long double x)
> +{
> + int n;
> +
> + __asm("fistl %0" : "=m" (n) : "t" (x));
> + return (n);
> +}
> +#endif
> +
> +#ifdef DEBUG
> +#if defined(__amd64__) || defined(__i386__)
> +#define breakpoint() asm("int $3")
> +#else
> +#include <signal.h>
> +
> +#define breakpoint() raise(SIGTRAP)
> +#endif
> +#endif
> +
> +/* Write a pari script to test things externally. */
> +#ifdef DOPRINT
> +#include <stdio.h>
> +
> +#ifndef DOPRINT_SWIZZLE
> +#define DOPRINT_SWIZZLE 0
> +#endif
> +
> +#ifdef DOPRINT_LD80
> +
> +#define DOPRINT_START(xp) do { \
> + uint64_t __lx; \
> + uint16_t __hx; \
> + \
> + /* Hack to give more-problematic args. */ \
> + EXTRACT_LDBL80_WORDS(__hx, __lx, *xp); \
> + __lx ^= DOPRINT_SWIZZLE; \
> + INSERT_LDBL80_WORDS(*xp, __hx, __lx); \
> + printf("x = %.21Lg; ", (long double)*xp); \
> +} while (0)
> +#define DOPRINT_END1(v) \
> + printf("y = %.21Lg; z = 0; show(x, y, z);\n", (long double)(v))
> +#define DOPRINT_END2(hi, lo) \
> + printf("y = %.21Lg; z = %.21Lg; show(x, y, z);\n", \
> + (long double)(hi), (long double)(lo))
> +
> +#elif defined(DOPRINT_D64)
> +
> +#define DOPRINT_START(xp) do { \
> + uint32_t __hx, __lx; \
> + \
> + EXTRACT_WORDS(__hx, __lx, *xp); \
> + __lx ^= DOPRINT_SWIZZLE; \
> + INSERT_WORDS(*xp, __hx, __lx); \
> + printf("x = %.21Lg; ", (long double)*xp); \
> +} while (0)
> +#define DOPRINT_END1(v) \
> + printf("y = %.21Lg; z = 0; show(x, y, z);\n", (long double)(v))
> +#define DOPRINT_END2(hi, lo) \
> + printf("y = %.21Lg; z = %.21Lg; show(x, y, z);\n", \
> + (long double)(hi), (long double)(lo))
> +
> +#elif defined(DOPRINT_F32)
> +
> +#define DOPRINT_START(xp) do { \
> + uint32_t __hx; \
> + \
> + GET_FLOAT_WORD(__hx, *xp); \
> + __hx ^= DOPRINT_SWIZZLE; \
> + SET_FLOAT_WORD(*xp, __hx); \
> + printf("x = %.21Lg; ", (long double)*xp); \
> +} while (0)
> +#define DOPRINT_END1(v) \
> + printf("y = %.21Lg; z = 0; show(x, y, z);\n", (long double)(v))
> +#define DOPRINT_END2(hi, lo) \
> + printf("y = %.21Lg; z = %.21Lg; show(x, y, z);\n", \
> + (long double)(hi), (long double)(lo))
> +
> +#else /* !DOPRINT_LD80 && !DOPRINT_D64 (LD128 only) */
> +
> +#ifndef DOPRINT_SWIZZLE_HIGH
> +#define DOPRINT_SWIZZLE_HIGH 0
> +#endif
> +
> +#define DOPRINT_START(xp) do { \
> + uint64_t __lx, __llx; \
> + uint16_t __hx; \
> + \
> + EXTRACT_LDBL128_WORDS(__hx, __lx, __llx, *xp); \
> + __llx ^= DOPRINT_SWIZZLE; \
> + __lx ^= DOPRINT_SWIZZLE_HIGH; \
> + INSERT_LDBL128_WORDS(*xp, __hx, __lx, __llx); \
> + printf("x = %.36Lg; ", (long double)*xp); \
> +} while (0)
> +#define DOPRINT_END1(v) \
> + printf("y = %.36Lg; z = 0; show(x, y, z);\n", (long double)(v))
> +#define DOPRINT_END2(hi, lo) \
> + printf("y = %.36Lg; z = %.36Lg; show(x, y, z);\n", \
> + (long double)(hi), (long double)(lo))
> +
> +#endif /* DOPRINT_LD80 */
> +
> +#else /* !DOPRINT */
> +#define DOPRINT_START(xp)
> +#define DOPRINT_END1(v)
> +#define DOPRINT_END2(hi, lo)
> +#endif /* DOPRINT */
> +
> +#define RETURNP(x) do { \
> + DOPRINT_END1(x); \
> + RETURNF(x); \
> +} while (0)
> +#define RETURNPI(x) do { \
> + DOPRINT_END1(x); \
> + RETURNI(x); \
> +} while (0)
> +#define RETURN2P(x, y) do { \
> + DOPRINT_END2((x), (y)); \
> + RETURNF((x) + (y)); \
> +} while (0)
> +#define RETURN2PI(x, y) do { \
> + DOPRINT_END2((x), (y)); \
> + RETURNI((x) + (y)); \
> +} while (0)
> +#ifdef STRUCT_RETURN
> +#define RETURNSP(rp) do { \
> + if (!(rp)->lo_set) \
> + RETURNP((rp)->hi); \
> + RETURN2P((rp)->hi, (rp)->lo); \
> +} while (0)
> +#define RETURNSPI(rp) do { \
> + if (!(rp)->lo_set) \
> + RETURNPI((rp)->hi); \
> + RETURN2PI((rp)->hi, (rp)->lo); \
> +} while (0)
> +#endif
> +#define SUM2P(x, y) ({ \
> + const __typeof (x) __x = (x); \
> + const __typeof (y) __y = (y); \
> + \
> + DOPRINT_END2(__x, __y); \
> + __x + __y; \
> +})
> +
> +/*
> + * ieee style elementary functions
> + *
> + * We rename functions here to improve other sources' diffability
> + * against fdlibm.
> + */
> +#define __ieee754_sqrt sqrt
> +#define __ieee754_acos acos
> +#define __ieee754_acosh acosh
> +#define __ieee754_log log
> +#define __ieee754_log2 log2
> +#define __ieee754_atanh atanh
> +#define __ieee754_asin asin
> +#define __ieee754_atan2 atan2
> +#define __ieee754_exp exp
> +#define __ieee754_cosh cosh
> +#define __ieee754_fmod fmod
> +#define __ieee754_pow pow
> +#define __ieee754_lgamma lgamma
> +#define __ieee754_gamma gamma
> +#define __ieee754_lgamma_r lgamma_r
> +#define __ieee754_gamma_r gamma_r
> +#define __ieee754_log10 log10
> +#define __ieee754_sinh sinh
> +#define __ieee754_hypot hypot
> +#define __ieee754_j0 j0
> +#define __ieee754_j1 j1
> +#define __ieee754_y0 y0
> +#define __ieee754_y1 y1
> +#define __ieee754_jn jn
> +#define __ieee754_yn yn
> +#define __ieee754_remainder remainder
> +#define __ieee754_scalb scalb
> +#define __ieee754_sqrtf sqrtf
> +#define __ieee754_acosf acosf
> +#define __ieee754_acoshf acoshf
> +#define __ieee754_logf logf
> +#define __ieee754_atanhf atanhf
> +#define __ieee754_asinf asinf
> +#define __ieee754_atan2f atan2f
> +#define __ieee754_expf expf
> +#define __ieee754_coshf coshf
> +#define __ieee754_fmodf fmodf
> +#define __ieee754_powf powf
> +#define __ieee754_lgammaf lgammaf
> +#define __ieee754_gammaf gammaf
> +#define __ieee754_lgammaf_r lgammaf_r
> +#define __ieee754_gammaf_r gammaf_r
> +#define __ieee754_log10f log10f
> +#define __ieee754_log2f log2f
> +#define __ieee754_sinhf sinhf
> +#define __ieee754_hypotf hypotf
> +#define __ieee754_j0f j0f
> +#define __ieee754_j1f j1f
> +#define __ieee754_y0f y0f
> +#define __ieee754_y1f y1f
> +#define __ieee754_jnf jnf
> +#define __ieee754_ynf ynf
> +#define __ieee754_remainderf remainderf
> +#define __ieee754_scalbf scalbf
> +
> +/* fdlibm kernel function */
> +int __kernel_rem_pio2(double*,double*,int,int,int);
> +
> +/* double precision kernel functions */
> +#ifndef INLINE_REM_PIO2
> +int __ieee754_rem_pio2(double,double*);
> +#endif
> +double __kernel_sin(double,double,int);
> +double __kernel_cos(double,double);
> +double __kernel_tan(double,double,int);
> +double __ldexp_exp(double,int);
> +#ifdef _COMPLEX_H
> +double complex __ldexp_cexp(double complex,int);
> +#endif
> +
> +/* float precision kernel functions */
> +#ifndef INLINE_REM_PIO2F
> +int __ieee754_rem_pio2f(float,double*);
> +#endif
> +#ifndef INLINE_KERNEL_SINDF
> +float __kernel_sindf(double);
> +#endif
> +#ifndef INLINE_KERNEL_COSDF
> +float __kernel_cosdf(double);
> +#endif
> +#ifndef INLINE_KERNEL_TANDF
> +float __kernel_tandf(double,int);
> +#endif
> +float __ldexp_expf(float,int);
> +#ifdef _COMPLEX_H
> +float complex __ldexp_cexpf(float complex,int);
> +#endif
> +
> +/* long double precision kernel functions */
> +long double __kernel_sinl(long double, long double, int);
> +long double __kernel_cosl(long double, long double);
> +long double __kernel_tanl(long double, long double, int);
> +
> +#endif /* !_MATH_PRIVATE_H_ */
> diff --git a/newlib/libm/ld/s_asinhl.c b/newlib/libm/ld/s_asinhl.c
> new file mode 100644
> index 000000000..ba28f599c
> --- /dev/null
> +++ b/newlib/libm/ld/s_asinhl.c
> @@ -0,0 +1,91 @@
> +/* from: FreeBSD: head/lib/msun/src/e_acosh.c 176451 2008-02-22 02:30:36Z das */
> +
> +/* @(#)s_asinh.c 5.1 93/09/24 */
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunPro, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * See s_asinh.c for complete comments.
> + *
> + * Converted to long double by David Schultz <das@FreeBSD.ORG> and
> + * Bruce D. Evans.
> + */
> +
> +#include <float.h>
> +#ifdef __i386__
> +#include <ieeefp.h>
> +#endif
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +
> +/* EXP_LARGE is the threshold above which we use asinh(x) ~= log(2x). */
> +/* EXP_TINY is the threshold below which we use asinh(x) ~= x. */
> +#if LDBL_MANT_DIG == 64
> +#define EXP_LARGE 34
> +#define EXP_TINY -34
> +#elif LDBL_MANT_DIG == 113
> +#define EXP_LARGE 58
> +#define EXP_TINY -58
> +#else
> +#error "Unsupported long double format"
> +#endif
> +
> +#if LDBL_MAX_EXP != 0x4000
> +/* We also require the usual expsign encoding. */
> +#error "Unsupported long double format"
> +#endif
> +
> +#define BIAS (LDBL_MAX_EXP - 1)
> +
> +static const double
> +one = 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */
> +huge= 1.00000000000000000000e+300;
> +
> +#if LDBL_MANT_DIG == 64
> +static const union IEEEl2bits
> +u_ln2 = LD80C(0xb17217f7d1cf79ac, -1, 6.93147180559945309417e-1L);
> +#define ln2 u_ln2.e
> +#elif LDBL_MANT_DIG == 113
> +static const long double
> +ln2 = 6.93147180559945309417232121458176568e-1L; /* 0x162e42fefa39ef35793c7673007e6.0p-113 */
> +#else
> +#error "Unsupported long double format"
> +#endif
> +
> +long double
> +asinhl(long double x)
> +{
> + long double t, w;
> + uint16_t hx, ix;
> +
> + ENTERI();
> + GET_LDBL_EXPSIGN(hx, x);
> + ix = hx & 0x7fff;
> + if (ix >= 0x7fff) RETURNI(x+x); /* x is inf, NaN or misnormal */
> + if (ix < BIAS + EXP_TINY) { /* |x| < TINY, or misnormal */
> + if (huge + x > one) RETURNI(x); /* return x inexact except 0 */
> + }
> + if (ix >= BIAS + EXP_LARGE) { /* |x| >= LARGE, or misnormal */
> + w = logl(fabsl(x))+ln2;
> + } else if (ix >= 0x4000) { /* LARGE > |x| >= 2.0, or misnormal */
> + t = fabsl(x);
> + w = logl(2.0*t+one/(sqrtl(x*x+one)+t));
> + } else { /* 2.0 > |x| >= TINY, or misnormal */
> + t = x*x;
> + w =log1pl(fabsl(x)+t/(one+sqrtl(one+t)));
> + }
> + RETURNI((hx & 0x8000) == 0 ? w : -w);
> +}
> diff --git a/newlib/libm/ld/s_atanl.c b/newlib/libm/ld/s_atanl.c
> new file mode 100644
> index 000000000..ff29c3ce8
> --- /dev/null
> +++ b/newlib/libm/ld/s_atanl.c
> @@ -0,0 +1,85 @@
> +/* @(#)s_atan.c 5.1 93/09/24 */
> +/* FreeBSD: head/lib/msun/src/s_atan.c 176451 2008-02-22 02:30:36Z das */
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunPro, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * See comments in s_atan.c.
> + * Converted to long double by David Schultz <das@FreeBSD.ORG>.
> + */
> +
> +#include <float.h>
> +
> +#include "invtrig.h"
> +#include "math.h"
> +#include "math_private.h"
> +
> +static const long double
> +one = 1.0,
> +huge = 1.0e300;
> +
> +long double
> +atanl(long double x)
> +{
> + union IEEEl2bits u;
> + long double w,s1,s2,z;
> + int id;
> + int16_t expsign, expt;
> + int32_t expman;
> +
> + u.e = x;
> + expsign = u.xbits.expsign;
> + expt = expsign & 0x7fff;
> + if(expt >= ATAN_CONST) { /* if |x| is large, atan(x)~=pi/2 */
> + if(expt == BIAS + LDBL_MAX_EXP &&
> + ((u.bits.manh&~LDBL_NBIT)|u.bits.manl)!=0)
> + return x+x; /* NaN */
> + if(expsign>0) return atanhi[3]+atanlo[3];
> + else return -atanhi[3]-atanlo[3];
> + }
> + /* Extract the exponent and the first few bits of the mantissa. */
> + /* XXX There should be a more convenient way to do this. */
> + expman = (expt << 8) | ((u.bits.manh >> (MANH_SIZE - 9)) & 0xff);
> + if (expman < ((BIAS - 2) << 8) + 0xc0) { /* |x| < 0.4375 */
> + if (expt < ATAN_LINEAR) { /* if |x| is small, atanl(x)~=x */
> + if(huge+x>one) return x; /* raise inexact */
> + }
> + id = -1;
> + } else {
> + x = fabsl(x);
> + if (expman < (BIAS << 8) + 0x30) { /* |x| < 1.1875 */
> + if (expman < ((BIAS - 1) << 8) + 0x60) { /* 7/16 <=|x|<11/16 */
> + id = 0; x = (2.0*x-one)/(2.0+x);
> + } else { /* 11/16<=|x|< 19/16 */
> + id = 1; x = (x-one)/(x+one);
> + }
> + } else {
> + if (expman < ((BIAS + 1) << 8) + 0x38) { /* |x| < 2.4375 */
> + id = 2; x = (x-1.5)/(one+1.5*x);
> + } else { /* 2.4375 <= |x| < 2^ATAN_CONST */
> + id = 3; x = -1.0/x;
> + }
> + }}
> + /* end of argument reduction */
> + z = x*x;
> + w = z*z;
> + /* break sum aT[i]z**(i+1) into odd and even poly */
> + s1 = z*T_even(w);
> + s2 = w*T_odd(w);
> + if (id<0) return x - x*(s1+s2);
> + else {
> + z = atanhi[id] - ((x*(s1+s2) - atanlo[id]) - x);
> + return (expsign<0)? -z:z;
> + }
> +}
> diff --git a/newlib/libm/ld/s_cbrtl.c b/newlib/libm/ld/s_cbrtl.c
> new file mode 100644
> index 000000000..b15c96ecd
> --- /dev/null
> +++ b/newlib/libm/ld/s_cbrtl.c
> @@ -0,0 +1,143 @@
> +/*-
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + * Copyright (c) 2009-2011, Bruce D. Evans, Steven G. Kargl, David Schultz.
> + *
> + * Developed at SunPro, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + *
> + * The argument reduction and testing for exceptional cases was
> + * written by Steven G. Kargl with input from Bruce D. Evans
> + * and David A. Schultz.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include <float.h>
> +#ifdef __i386__
> +#include <ieeefp.h>
> +#endif
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +
> +#define BIAS (LDBL_MAX_EXP - 1)
> +
> +static const unsigned
> + B1 = 709958130; /* B1 = (127-127.0/3-0.03306235651)*2**23 */
> +
> +long double
> +cbrtl(long double x)
> +{
> + union IEEEl2bits u, v;
> + long double r, s, t, w;
> + double dr, dt, dx;
> + float ft, fx;
> + uint32_t hx;
> + uint16_t expsign;
> + int k;
> +
> + u.e = x;
> + expsign = u.xbits.expsign;
> + k = expsign & 0x7fff;
> +
> + /*
> + * If x = +-Inf, then cbrt(x) = +-Inf.
> + * If x = NaN, then cbrt(x) = NaN.
> + */
> + if (k == BIAS + LDBL_MAX_EXP)
> + return (x + x);
> +
> + ENTERI();
> + if (k == 0) {
> + /* If x = +-0, then cbrt(x) = +-0. */
> + if ((u.bits.manh | u.bits.manl) == 0)
> + RETURNI(x);
> + /* Adjust subnormal numbers. */
> + u.e *= 0x1.0p514;
> + k = u.bits.exp;
> + k -= BIAS + 514;
> + } else
> + k -= BIAS;
> + u.xbits.expsign = BIAS;
> + v.e = 1;
> +
> + x = u.e;
> + switch (k % 3) {
> + case 1:
> + case -2:
> + x = 2*x;
> + k--;
> + break;
> + case 2:
> + case -1:
> + x = 4*x;
> + k -= 2;
> + break;
> + }
> + v.xbits.expsign = (expsign & 0x8000) | (BIAS + k / 3);
> +
> + /*
> + * The following is the guts of s_cbrtf, with the handling of
> + * special values removed and extra care for accuracy not taken,
> + * but with most of the extra accuracy not discarded.
> + */
> +
> + /* ~5-bit estimate: */
> + fx = x;
> + GET_FLOAT_WORD(hx, fx);
> + SET_FLOAT_WORD(ft, ((hx & 0x7fffffff) / 3 + B1));
> +
> + /* ~16-bit estimate: */
> + dx = x;
> + dt = ft;
> + dr = dt * dt * dt;
> + dt = dt * (dx + dx + dr) / (dx + dr + dr);
> +
> + /* ~47-bit estimate: */
> + dr = dt * dt * dt;
> + dt = dt * (dx + dx + dr) / (dx + dr + dr);
> +
> +#if LDBL_MANT_DIG == 64
> + /*
> + * dt is cbrtl(x) to ~47 bits (after x has been reduced to 1 <= x < 8).
> + * Round it away from zero to 32 bits (32 so that t*t is exact, and
> + * away from zero for technical reasons).
> + */
> + volatile double vd2 = 0x1.0p32;
> + volatile double vd1 = 0x1.0p-31;
> + #define vd ((long double)vd2 + vd1)
> +
> + t = dt + vd - 0x1.0p32;
> +#elif LDBL_MANT_DIG == 113
> + /*
> + * Round dt away from zero to 47 bits. Since we don't trust the 47,
> + * add 2 47-bit ulps instead of 1 to round up. Rounding is slow and
> + * might be avoidable in this case, since on most machines dt will
> + * have been evaluated in 53-bit precision and the technical reasons
> + * for rounding up might not apply to either case in cbrtl() since
> + * dt is much more accurate than needed.
> + */
> + t = dt + 0x2.0p-46 + 0x1.0p60L - 0x1.0p60;
> +#else
> +#error "Unsupported long double format"
> +#endif
> +
> + /*
> + * Final step Newton iteration to 64 or 113 bits with
> + * error < 0.667 ulps
> + */
> + s=t*t; /* t*t is exact */
> + r=x/s; /* error <= 0.5 ulps; |r| < |t| */
> + w=t+t; /* t+t is exact */
> + r=(r-t)/(w+r); /* r-t is exact; w+r ~= 3*t */
> + t=t+t*r; /* error <= (0.5 + 0.5/3) * ulp */
> +
> + t *= v.e;
> + RETURNI(t);
> +}
> diff --git a/newlib/libm/ld/s_ceill.c b/newlib/libm/ld/s_ceill.c
> new file mode 100644
> index 000000000..2d1045fe6
> --- /dev/null
> +++ b/newlib/libm/ld/s_ceill.c
> @@ -0,0 +1,101 @@
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunPro, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + *
> + * From: @(#)s_ceil.c 5.1 93/09/24
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * ceill(x)
> + * Return x rounded toward -inf to integral value
> + * Method:
> + * Bit twiddling.
> + * Exception:
> + * Inexact flag raised if x not equal to ceill(x).
> + */
> +
> +#include <float.h>
> +#include <math.h>
> +#include <stdint.h>
> +
> +#include "fpmath.h"
> +
> +#ifdef LDBL_IMPLICIT_NBIT
> +#define MANH_SIZE (LDBL_MANH_SIZE + 1)
> +#define INC_MANH(u, c) do { \
> + uint64_t o = u.bits.manh; \
> + u.bits.manh += (c); \
> + if (u.bits.manh < o) \
> + u.bits.exp++; \
> +} while (0)
> +#else
> +#define MANH_SIZE LDBL_MANH_SIZE
> +#define INC_MANH(u, c) do { \
> + uint64_t o = u.bits.manh; \
> + u.bits.manh += (c); \
> + if (u.bits.manh < o) { \
> + u.bits.exp++; \
> + u.bits.manh |= 1llu << (LDBL_MANH_SIZE - 1); \
> + } \
> +} while (0)
> +#endif
> +
> +static const long double huge = 1.0e300;
> +
> +long double
> +ceill(long double x)
> +{
> + union IEEEl2bits u = { .e = x };
> + int e = u.bits.exp - LDBL_MAX_EXP + 1;
> +
> + if (e < MANH_SIZE - 1) {
> + if (e < 0) { /* raise inexact if x != 0 */
> + if (huge + x > 0.0)
> + if (u.bits.exp > 0 ||
> + (u.bits.manh | u.bits.manl) != 0)
> + u.e = u.bits.sign ? -0.0 : 1.0;
> + } else {
> + uint64_t m = ((1llu << MANH_SIZE) - 1) >> (e + 1);
> + if (((u.bits.manh & m) | u.bits.manl) == 0)
> + return (x); /* x is integral */
> + if (!u.bits.sign) {
> +#ifdef LDBL_IMPLICIT_NBIT
> + if (e == 0)
> + u.bits.exp++;
> + else
> +#endif
> + INC_MANH(u, 1llu << (MANH_SIZE - e - 1));
> + }
> + if (huge + x > 0.0) { /* raise inexact flag */
> + u.bits.manh &= ~m;
> + u.bits.manl = 0;
> + }
> + }
> + } else if (e < LDBL_MANT_DIG - 1) {
> + uint64_t m = (uint64_t)-1 >> (64 - LDBL_MANT_DIG + e + 1);
> + if ((u.bits.manl & m) == 0)
> + return (x); /* x is integral */
> + if (!u.bits.sign) {
> + if (e == MANH_SIZE - 1)
> + INC_MANH(u, 1);
> + else {
> + uint64_t o = u.bits.manl;
> + u.bits.manl += 1llu << (LDBL_MANT_DIG - e - 1);
> + if (u.bits.manl < o) /* got a carry */
> + INC_MANH(u, 1);
> + }
> + }
> + if (huge + x > 0.0) /* raise inexact flag */
> + u.bits.manl &= ~m;
> + }
> + return (u.e);
> +}
> diff --git a/newlib/libm/ld/s_copysignl.c b/newlib/libm/ld/s_copysignl.c
> new file mode 100644
> index 000000000..bd6744705
> --- /dev/null
> +++ b/newlib/libm/ld/s_copysignl.c
> @@ -0,0 +1,44 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2004 Stefan Farfeleder
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + *
> + * $FreeBSD$
> + */
> +
> +#include <math.h>
> +
> +#include "fpmath.h"
> +
> +long double
> +copysignl(long double x, long double y)
> +{
> + union IEEEl2bits ux, uy;
> +
> + ux.e = x;
> + uy.e = y;
> + ux.bits.sign = uy.bits.sign;
> + return (ux.e);
> +}
> diff --git a/newlib/libm/ld/s_cosl.c b/newlib/libm/ld/s_cosl.c
> new file mode 100644
> index 000000000..3d066483f
> --- /dev/null
> +++ b/newlib/libm/ld/s_cosl.c
> @@ -0,0 +1,102 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2007 Steven G. Kargl
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice unmodified, this list of conditions, and the following
> + * disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
> + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
> + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
> + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
> + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
> + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
> + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * Limited testing on pseudorandom numbers drawn within [-2e8:4e8] shows
> + * an accuracy of <= 0.7412 ULP.
> + */
> +
> +#include <float.h>
> +#ifdef __i386__
> +#include <ieeefp.h>
> +#endif
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +#if LDBL_MANT_DIG == 64
> +#include "../ld80/e_rem_pio2l.h"
> +static const union IEEEl2bits
> +pio4u = LD80C(0xc90fdaa22168c235, -00001, 7.85398163397448309628e-01L);
> +#define pio4 (pio4u.e)
> +#elif LDBL_MANT_DIG == 113
> +#include "../ld128/e_rem_pio2l.h"
> +long double pio4 = 7.85398163397448309615660845819875721e-1L;
> +#else
> +#error "Unsupported long double format"
> +#endif
> +
> +long double
> +cosl(long double x)
> +{
> + union IEEEl2bits z;
> + int e0;
> + long double y[2];
> + long double hi, lo;
> +
> + z.e = x;
> + z.bits.sign = 0;
> +
> + /* If x = +-0 or x is a subnormal number, then cos(x) = 1 */
> + if (z.bits.exp == 0)
> + return (1.0);
> +
> + /* If x = NaN or Inf, then cos(x) = NaN. */
> + if (z.bits.exp == 32767)
> + return ((x - x) / (x - x));
> +
> + ENTERI();
> +
> + /* Optimize the case where x is already within range. */
> + if (z.e < pio4)
> + RETURNI(__kernel_cosl(z.e, 0));
> +
> + e0 = __ieee754_rem_pio2l(x, y);
> + hi = y[0];
> + lo = y[1];
> +
> + switch (e0 & 3) {
> + case 0:
> + hi = __kernel_cosl(hi, lo);
> + break;
> + case 1:
> + hi = - __kernel_sinl(hi, lo, 1);
> + break;
> + case 2:
> + hi = - __kernel_cosl(hi, lo);
> + break;
> + case 3:
> + hi = __kernel_sinl(hi, lo, 1);
> + break;
> + }
> +
> + RETURNI(hi);
> +}
> diff --git a/newlib/libm/ld/s_fabsl.c b/newlib/libm/ld/s_fabsl.c
> new file mode 100644
> index 000000000..5076d8a9b
> --- /dev/null
> +++ b/newlib/libm/ld/s_fabsl.c
> @@ -0,0 +1,45 @@
> +/*-
> + * SPDX-License-Identifier: BSD-3-Clause
> + *
> + * Copyright (c) 2003 Dag-Erling Smørgrav
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer
> + * in this position and unchanged.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + * 3. The name of the author may not be used to endorse or promote products
> + * derived from this software without specific prior written permission.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
> + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
> + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
> + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
> + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
> + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
> + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + *
> + * $FreeBSD$
> + */
> +
> +#include <math.h>
> +
> +#include "fpmath.h"
> +
> +long double
> +fabsl(long double x)
> +{
> + union IEEEl2bits u;
> +
> + u.e = x;
> + u.bits.sign = 0;
> + return (u.e);
> +}
> diff --git a/newlib/libm/ld/s_fdim.c b/newlib/libm/ld/s_fdim.c
> new file mode 100644
> index 000000000..c40c3e9d3
> --- /dev/null
> +++ b/newlib/libm/ld/s_fdim.c
> @@ -0,0 +1,48 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include <math.h>
> +
> +#define DECL(type, fn) \
> +type \
> +fn(type x, type y) \
> +{ \
> + \
> + if (isnan(x)) \
> + return (x); \
> + if (isnan(y)) \
> + return (y); \
> + return (x > y ? x - y : 0.0); \
> +}
> +
> +DECL(double, fdim)
> +DECL(float, fdimf)
> +DECL(long double, fdiml)
> diff --git a/newlib/libm/ld/s_floorl.c b/newlib/libm/ld/s_floorl.c
> new file mode 100644
> index 000000000..6cec3e781
> --- /dev/null
> +++ b/newlib/libm/ld/s_floorl.c
> @@ -0,0 +1,101 @@
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunPro, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + *
> + * From: @(#)s_floor.c 5.1 93/09/24
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * floorl(x)
> + * Return x rounded toward -inf to integral value
> + * Method:
> + * Bit twiddling.
> + * Exception:
> + * Inexact flag raised if x not equal to floorl(x).
> + */
> +
> +#include <float.h>
> +#include <math.h>
> +#include <stdint.h>
> +
> +#include "fpmath.h"
> +
> +#ifdef LDBL_IMPLICIT_NBIT
> +#define MANH_SIZE (LDBL_MANH_SIZE + 1)
> +#define INC_MANH(u, c) do { \
> + uint64_t o = u.bits.manh; \
> + u.bits.manh += (c); \
> + if (u.bits.manh < o) \
> + u.bits.exp++; \
> +} while (0)
> +#else
> +#define MANH_SIZE LDBL_MANH_SIZE
> +#define INC_MANH(u, c) do { \
> + uint64_t o = u.bits.manh; \
> + u.bits.manh += (c); \
> + if (u.bits.manh < o) { \
> + u.bits.exp++; \
> + u.bits.manh |= 1llu << (LDBL_MANH_SIZE - 1); \
> + } \
> +} while (0)
> +#endif
> +
> +static const long double huge = 1.0e300;
> +
> +long double
> +floorl(long double x)
> +{
> + union IEEEl2bits u = { .e = x };
> + int e = u.bits.exp - LDBL_MAX_EXP + 1;
> +
> + if (e < MANH_SIZE - 1) {
> + if (e < 0) { /* raise inexact if x != 0 */
> + if (huge + x > 0.0)
> + if (u.bits.exp > 0 ||
> + (u.bits.manh | u.bits.manl) != 0)
> + u.e = u.bits.sign ? -1.0 : 0.0;
> + } else {
> + uint64_t m = ((1llu << MANH_SIZE) - 1) >> (e + 1);
> + if (((u.bits.manh & m) | u.bits.manl) == 0)
> + return (x); /* x is integral */
> + if (u.bits.sign) {
> +#ifdef LDBL_IMPLICIT_NBIT
> + if (e == 0)
> + u.bits.exp++;
> + else
> +#endif
> + INC_MANH(u, 1llu << (MANH_SIZE - e - 1));
> + }
> + if (huge + x > 0.0) { /* raise inexact flag */
> + u.bits.manh &= ~m;
> + u.bits.manl = 0;
> + }
> + }
> + } else if (e < LDBL_MANT_DIG - 1) {
> + uint64_t m = (uint64_t)-1 >> (64 - LDBL_MANT_DIG + e + 1);
> + if ((u.bits.manl & m) == 0)
> + return (x); /* x is integral */
> + if (u.bits.sign) {
> + if (e == MANH_SIZE - 1)
> + INC_MANH(u, 1);
> + else {
> + uint64_t o = u.bits.manl;
> + u.bits.manl += 1llu << (LDBL_MANT_DIG - e - 1);
> + if (u.bits.manl < o) /* got a carry */
> + INC_MANH(u, 1);
> + }
> + }
> + if (huge + x > 0.0) /* raise inexact flag */
> + u.bits.manl &= ~m;
> + }
> + return (u.e);
> +}
> diff --git a/newlib/libm/ld/s_fmal.c b/newlib/libm/ld/s_fmal.c
> new file mode 100644
> index 000000000..a379346c1
> --- /dev/null
> +++ b/newlib/libm/ld/s_fmal.c
> @@ -0,0 +1,274 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2005-2011 David Schultz <das@FreeBSD.ORG>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include <fenv.h>
> +#include <float.h>
> +#include <math.h>
> +
> +#include "fpmath.h"
> +
> +/*
> + * A struct dd represents a floating-point number with twice the precision
> + * of a long double. We maintain the invariant that "hi" stores the high-order
> + * bits of the result.
> + */
> +struct dd {
> + long double hi;
> + long double lo;
> +};
> +
> +/*
> + * Compute a+b exactly, returning the exact result in a struct dd. We assume
> + * that both a and b are finite, but make no assumptions about their relative
> + * magnitudes.
> + */
> +static inline struct dd
> +dd_add(long double a, long double b)
> +{
> + struct dd ret;
> + long double s;
> +
> + ret.hi = a + b;
> + s = ret.hi - a;
> + ret.lo = (a - (ret.hi - s)) + (b - s);
> + return (ret);
> +}
> +
> +/*
> + * Compute a+b, with a small tweak: The least significant bit of the
> + * result is adjusted into a sticky bit summarizing all the bits that
> + * were lost to rounding. This adjustment negates the effects of double
> + * rounding when the result is added to another number with a higher
> + * exponent. For an explanation of round and sticky bits, see any reference
> + * on FPU design, e.g.,
> + *
> + * J. Coonen. An Implementation Guide to a Proposed Standard for
> + * Floating-Point Arithmetic. Computer, vol. 13, no. 1, Jan 1980.
> + */
> +static inline long double
> +add_adjusted(long double a, long double b)
> +{
> + struct dd sum;
> + union IEEEl2bits u;
> +
> + sum = dd_add(a, b);
> + if (sum.lo != 0) {
> + u.e = sum.hi;
> + if ((u.bits.manl & 1) == 0)
> + sum.hi = nextafterl(sum.hi, INFINITY * sum.lo);
> + }
> + return (sum.hi);
> +}
> +
> +/*
> + * Compute ldexp(a+b, scale) with a single rounding error. It is assumed
> + * that the result will be subnormal, and care is taken to ensure that
> + * double rounding does not occur.
> + */
> +static inline long double
> +add_and_denormalize(long double a, long double b, int scale)
> +{
> + struct dd sum;
> + int bits_lost;
> + union IEEEl2bits u;
> +
> + sum = dd_add(a, b);
> +
> + /*
> + * If we are losing at least two bits of accuracy to denormalization,
> + * then the first lost bit becomes a round bit, and we adjust the
> + * lowest bit of sum.hi to make it a sticky bit summarizing all the
> + * bits in sum.lo. With the sticky bit adjusted, the hardware will
> + * break any ties in the correct direction.
> + *
> + * If we are losing only one bit to denormalization, however, we must
> + * break the ties manually.
> + */
> + if (sum.lo != 0) {
> + u.e = sum.hi;
> + bits_lost = -u.bits.exp - scale + 1;
> + if ((bits_lost != 1) ^ (int)(u.bits.manl & 1))
> + sum.hi = nextafterl(sum.hi, INFINITY * sum.lo);
> + }
> + return (ldexp(sum.hi, scale));
> +}
> +
> +/*
> + * Compute a*b exactly, returning the exact result in a struct dd. We assume
> + * that both a and b are normalized, so no underflow or overflow will occur.
> + * The current rounding mode must be round-to-nearest.
> + */
> +static inline struct dd
> +dd_mul(long double a, long double b)
> +{
> +#if LDBL_MANT_DIG == 64
> + static const long double split = 0x1p32L + 1.0;
> +#elif LDBL_MANT_DIG == 113
> + static const long double split = 0x1p57L + 1.0;
> +#endif
> + struct dd ret;
> + long double ha, hb, la, lb, p, q;
> +
> + p = a * split;
> + ha = a - p;
> + ha += p;
> + la = a - ha;
> +
> + p = b * split;
> + hb = b - p;
> + hb += p;
> + lb = b - hb;
> +
> + p = ha * hb;
> + q = ha * lb + la * hb;
> +
> + ret.hi = p + q;
> + ret.lo = p - ret.hi + q + la * lb;
> + return (ret);
> +}
> +
> +/*
> + * Fused multiply-add: Compute x * y + z with a single rounding error.
> + *
> + * We use scaling to avoid overflow/underflow, along with the
> + * canonical precision-doubling technique adapted from:
> + *
> + * Dekker, T. A Floating-Point Technique for Extending the
> + * Available Precision. Numer. Math. 18, 224-242 (1971).
> + */
> +long double
> +fmal(long double x, long double y, long double z)
> +{
> + long double xs, ys, zs, adj;
> + struct dd xy, r;
> + int oround;
> + int ex, ey, ez;
> + int spread;
> +
> + /*
> + * Handle special cases. The order of operations and the particular
> + * return values here are crucial in handling special cases involving
> + * infinities, NaNs, overflows, and signed zeroes correctly.
> + */
> + if (x == 0.0 || y == 0.0)
> + return (x * y + z);
> + if (z == 0.0)
> + return (x * y);
> + if (!isfinite(x) || !isfinite(y))
> + return (x * y + z);
> + if (!isfinite(z))
> + return (z);
> +
> + xs = frexpl(x, &ex);
> + ys = frexpl(y, &ey);
> + zs = frexpl(z, &ez);
> + oround = fegetround();
> + spread = ex + ey - ez;
> +
> + /*
> + * If x * y and z are many orders of magnitude apart, the scaling
> + * will overflow, so we handle these cases specially. Rounding
> + * modes other than FE_TONEAREST are painful.
> + */
> + if (spread < -LDBL_MANT_DIG) {
> + feraiseexcept(FE_INEXACT);
> + if (!isnormal(z))
> + feraiseexcept(FE_UNDERFLOW);
> + switch (oround) {
> + case FE_TONEAREST:
> + return (z);
> + case FE_TOWARDZERO:
> + if (x > 0.0 ^ y < 0.0 ^ z < 0.0)
> + return (z);
> + else
> + return (nextafterl(z, 0));
> + case FE_DOWNWARD:
> + if (x > 0.0 ^ y < 0.0)
> + return (z);
> + else
> + return (nextafterl(z, -INFINITY));
> + default: /* FE_UPWARD */
> + if (x > 0.0 ^ y < 0.0)
> + return (nextafterl(z, INFINITY));
> + else
> + return (z);
> + }
> + }
> + if (spread <= LDBL_MANT_DIG * 2)
> + zs = ldexpl(zs, -spread);
> + else
> + zs = copysignl(LDBL_MIN, zs);
> +
> + fesetround(FE_TONEAREST);
> + /* work around clang bug 8100 */
> + volatile long double vxs = xs;
> +
> + /*
> + * Basic approach for round-to-nearest:
> + *
> + * (xy.hi, xy.lo) = x * y (exact)
> + * (r.hi, r.lo) = xy.hi + z (exact)
> + * adj = xy.lo + r.lo (inexact; low bit is sticky)
> + * result = r.hi + adj (correctly rounded)
> + */
> + xy = dd_mul(vxs, ys);
> + r = dd_add(xy.hi, zs);
> +
> + spread = ex + ey;
> +
> + if (r.hi == 0.0) {
> + /*
> + * When the addends cancel to 0, ensure that the result has
> + * the correct sign.
> + */
> + fesetround(oround);
> + volatile long double vzs = zs; /* XXX gcc CSE bug workaround */
> + return (xy.hi + vzs + ldexpl(xy.lo, spread));
> + }
> +
> + if (oround != FE_TONEAREST) {
> + /*
> + * There is no need to worry about double rounding in directed
> + * rounding modes.
> + */
> + fesetround(oround);
> + /* work around clang bug 8100 */
> + volatile long double vrlo = r.lo;
> + adj = vrlo + xy.lo;
> + return (ldexpl(r.hi + adj, spread));
> + }
> +
> + adj = add_adjusted(r.lo, xy.lo);
> + if (spread + ilogbl(r.hi) > -16383)
> + return (ldexpl(r.hi + adj, spread));
> + else
> + return (add_and_denormalize(r.hi, adj, spread));
> +}
> diff --git a/newlib/libm/ld/s_fmaxl.c b/newlib/libm/ld/s_fmaxl.c
> new file mode 100644
> index 000000000..c0d7c8832
> --- /dev/null
> +++ b/newlib/libm/ld/s_fmaxl.c
> @@ -0,0 +1,57 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include <math.h>
> +
> +#include "fpmath.h"
> +
> +long double
> +fmaxl(long double x, long double y)
> +{
> + union IEEEl2bits u[2];
> +
> + u[0].e = x;
> + mask_nbit_l(u[0]);
> + u[1].e = y;
> + mask_nbit_l(u[1]);
> +
> + /* Check for NaNs to avoid raising spurious exceptions. */
> + if (u[0].bits.exp == 32767 && (u[0].bits.manh | u[0].bits.manl) != 0)
> + return (y);
> + if (u[1].bits.exp == 32767 && (u[1].bits.manh | u[1].bits.manl) != 0)
> + return (x);
> +
> + /* Handle comparisons of signed zeroes. */
> + if (u[0].bits.sign != u[1].bits.sign)
> + return (u[0].bits.sign ? y : x);
> +
> + return (x > y ? x : y);
> +}
> diff --git a/newlib/libm/ld/s_fminl.c b/newlib/libm/ld/s_fminl.c
> new file mode 100644
> index 000000000..97604b38b
> --- /dev/null
> +++ b/newlib/libm/ld/s_fminl.c
> @@ -0,0 +1,57 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include <math.h>
> +
> +#include "fpmath.h"
> +
> +long double
> +fminl(long double x, long double y)
> +{
> + union IEEEl2bits u[2];
> +
> + u[0].e = x;
> + mask_nbit_l(u[0]);
> + u[1].e = y;
> + mask_nbit_l(u[1]);
> +
> + /* Check for NaNs to avoid raising spurious exceptions. */
> + if (u[0].bits.exp == 32767 && (u[0].bits.manh | u[0].bits.manl) != 0)
> + return (y);
> + if (u[1].bits.exp == 32767 && (u[1].bits.manh | u[1].bits.manl) != 0)
> + return (x);
> +
> + /* Handle comparisons of signed zeroes. */
> + if (u[0].bits.sign != u[1].bits.sign)
> + return (u[1].bits.sign ? y : x);
> +
> + return (x < y ? x : y);
> +}
> diff --git a/newlib/libm/ld/s_frexpl.c b/newlib/libm/ld/s_frexpl.c
> new file mode 100644
> index 000000000..66e284fdd
> --- /dev/null
> +++ b/newlib/libm/ld/s_frexpl.c
> @@ -0,0 +1,64 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2004-2005 David Schultz <das@FreeBSD.ORG>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + *
> + * $FreeBSD$
> + */
> +
> +#include <float.h>
> +#include <math.h>
> +
> +#include "fpmath.h"
> +
> +#if LDBL_MAX_EXP != 0x4000
> +#error "Unsupported long double format"
> +#endif
> +
> +long double
> +frexpl(long double x, int *ex)
> +{
> + union IEEEl2bits u;
> +
> + u.e = x;
> + switch (u.bits.exp) {
> + case 0: /* 0 or subnormal */
> + if ((u.bits.manl | u.bits.manh) == 0) {
> + *ex = 0;
> + } else {
> + u.e *= 0x1.0p514;
> + *ex = u.bits.exp - 0x4200;
> + u.bits.exp = 0x3ffe;
> + }
> + break;
> + case 0x7fff: /* infinity or NaN; value of *ex is unspecified */
> + break;
> + default: /* normal */
> + *ex = u.bits.exp - 0x3ffe;
> + u.bits.exp = 0x3ffe;
> + break;
> + }
> + return (u.e);
> +}
> diff --git a/newlib/libm/ld/s_ilogbl.c b/newlib/libm/ld/s_ilogbl.c
> new file mode 100644
> index 000000000..3211f4409
> --- /dev/null
> +++ b/newlib/libm/ld/s_ilogbl.c
> @@ -0,0 +1,53 @@
> +/*
> + * From: @(#)s_ilogb.c 5.1 93/09/24
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunPro, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include <float.h>
> +#include <limits.h>
> +#include <math.h>
> +
> +#include "fpmath.h"
> +
> +int
> +ilogbl(long double x)
> +{
> + union IEEEl2bits u;
> + unsigned long m;
> + int b;
> +
> + u.e = x;
> + if (u.bits.exp == 0) {
> + if ((u.bits.manl | u.bits.manh) == 0)
> + return (FP_ILOGB0);
> + /* denormalized */
> + if (u.bits.manh == 0) {
> + m = 1lu << (LDBL_MANL_SIZE - 1);
> + for (b = LDBL_MANH_SIZE; !(u.bits.manl & m); m >>= 1)
> + b++;
> + } else {
> + m = 1lu << (LDBL_MANH_SIZE - 1);
> + for (b = 0; !(u.bits.manh & m); m >>= 1)
> + b++;
> + }
> +#ifdef LDBL_IMPLICIT_NBIT
> + b++;
> +#endif
> + return (LDBL_MIN_EXP - b - 1);
> + } else if (u.bits.exp < (LDBL_MAX_EXP << 1) - 1)
> + return (u.bits.exp - LDBL_MAX_EXP + 1);
> + else if (u.bits.manl != 0 || u.bits.manh != 0)
> + return (FP_ILOGBNAN);
> + else
> + return (INT_MAX);
> +}
> diff --git a/newlib/libm/ld/s_llrintl.c b/newlib/libm/ld/s_llrintl.c
> new file mode 100644
> index 000000000..6ef83759c
> --- /dev/null
> +++ b/newlib/libm/ld/s_llrintl.c
> @@ -0,0 +1,9 @@
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#define type long double
> +#define roundit rintl
> +#define dtype long long
> +#define fn llrintl
> +
> +#include "s_lrint.c"
> diff --git a/newlib/libm/ld/s_llroundl.c b/newlib/libm/ld/s_llroundl.c
> new file mode 100644
> index 000000000..02c44eb4b
> --- /dev/null
> +++ b/newlib/libm/ld/s_llroundl.c
> @@ -0,0 +1,11 @@
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#define type long double
> +#define roundit roundl
> +#define dtype long long
> +#define DTYPE_MIN LLONG_MIN
> +#define DTYPE_MAX LLONG_MAX
> +#define fn llroundl
> +
> +#include "s_lround.c"
> diff --git a/newlib/libm/ld/s_logbl.c b/newlib/libm/ld/s_logbl.c
> new file mode 100644
> index 000000000..ee1a91fd8
> --- /dev/null
> +++ b/newlib/libm/ld/s_logbl.c
> @@ -0,0 +1,54 @@
> +/*
> + * From: @(#)s_ilogb.c 5.1 93/09/24
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunPro, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include <float.h>
> +#include <limits.h>
> +#include <math.h>
> +
> +#include "fpmath.h"
> +
> +long double
> +logbl(long double x)
> +{
> + union IEEEl2bits u;
> + unsigned long m;
> + int b;
> +
> + u.e = x;
> + if (u.bits.exp == 0) {
> + if ((u.bits.manl | u.bits.manh) == 0) { /* x == 0 */
> + u.bits.sign = 1;
> + return (1.0L / u.e);
> + }
> + /* denormalized */
> + if (u.bits.manh == 0) {
> + m = 1lu << (LDBL_MANL_SIZE - 1);
> + for (b = LDBL_MANH_SIZE; !(u.bits.manl & m); m >>= 1)
> + b++;
> + } else {
> + m = 1lu << (LDBL_MANH_SIZE - 1);
> + for (b = 0; !(u.bits.manh & m); m >>= 1)
> + b++;
> + }
> +#ifdef LDBL_IMPLICIT_NBIT
> + b++;
> +#endif
> + return ((long double)(LDBL_MIN_EXP - b - 1));
> + }
> + if (u.bits.exp < (LDBL_MAX_EXP << 1) - 1) /* normal */
> + return ((long double)(u.bits.exp - LDBL_MAX_EXP + 1));
> + else /* +/- inf or nan */
> + return (x * x);
> +}
> diff --git a/newlib/libm/ld/s_lrint.c b/newlib/libm/ld/s_lrint.c
> new file mode 100644
> index 000000000..ad9b978fa
> --- /dev/null
> +++ b/newlib/libm/ld/s_lrint.c
> @@ -0,0 +1,60 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2005 David Schultz <das@FreeBSD.ORG>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + */
> +
> +#include <sys/cdefs.h>
> +#include <fenv.h>
> +#include <math.h>
> +
> +#ifndef type
> +__FBSDID("$FreeBSD$");
> +#define type double
> +#define roundit rint
> +#define dtype long
> +#define fn lrint
> +#endif
> +
> +/*
> + * C99 says we should not raise a spurious inexact exception when an
> + * invalid exception is raised. Unfortunately, the set of inputs
> + * that overflows depends on the rounding mode when 'dtype' has more
> + * significant bits than 'type'. Hence, we bend over backwards for the
> + * sake of correctness; an MD implementation could be more efficient.
> + */
> +dtype
> +fn(type x)
> +{
> + fenv_t env;
> + dtype d;
> +
> + feholdexcept(&env);
> + d = (dtype)roundit(x);
> + if (fetestexcept(FE_INVALID))
> + feclearexcept(FE_INEXACT);
> + feupdateenv(&env);
> + return (d);
> +}
> diff --git a/newlib/libm/ld/s_lrintl.c b/newlib/libm/ld/s_lrintl.c
> new file mode 100644
> index 000000000..497b442f3
> --- /dev/null
> +++ b/newlib/libm/ld/s_lrintl.c
> @@ -0,0 +1,9 @@
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#define type long double
> +#define roundit rintl
> +#define dtype long
> +#define fn lrintl
> +
> +#include "s_lrint.c"
> diff --git a/newlib/libm/ld/s_lround.c b/newlib/libm/ld/s_lround.c
> new file mode 100644
> index 000000000..1dd8e697f
> --- /dev/null
> +++ b/newlib/libm/ld/s_lround.c
> @@ -0,0 +1,70 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2005 David Schultz <das@FreeBSD.ORG>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + */
> +
> +#include <sys/cdefs.h>
> +#include <sys/limits.h>
> +#include <fenv.h>
> +#include <math.h>
> +
> +#ifndef type
> +__FBSDID("$FreeBSD$");
> +#define type double
> +#define roundit round
> +#define dtype long
> +#define DTYPE_MIN LONG_MIN
> +#define DTYPE_MAX LONG_MAX
> +#define fn lround
> +#endif
> +
> +/*
> + * If type has more precision than dtype, the endpoints dtype_(min|max) are
> + * of the form xxx.5; they are "out of range" because lround() rounds away
> + * from 0. On the other hand, if type has less precision than dtype, then
> + * all values that are out of range are integral, so we might as well assume
> + * that everything is in range. At compile time, INRANGE(x) should reduce to
> + * two floating-point comparisons in the former case, or TRUE otherwise.
> + */
> +static const type type_min = (type)DTYPE_MIN;
> +static const type type_max = (type)DTYPE_MAX;
> +static const type dtype_min = (type)DTYPE_MIN - 0.5;
> +static const type dtype_max = (type)DTYPE_MAX + 0.5;
> +#define INRANGE(x) (dtype_max - type_max != 0.5 || \
> + ((x) > dtype_min && (x) < dtype_max))
> +
> +dtype
> +fn(type x)
> +{
> +
> + if (INRANGE(x)) {
> + x = roundit(x);
> + return ((dtype)x);
> + } else {
> + feraiseexcept(FE_INVALID);
> + return (DTYPE_MAX);
> + }
> +}
> diff --git a/newlib/libm/ld/s_lroundl.c b/newlib/libm/ld/s_lroundl.c
> new file mode 100644
> index 000000000..e410827e2
> --- /dev/null
> +++ b/newlib/libm/ld/s_lroundl.c
> @@ -0,0 +1,11 @@
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#define type long double
> +#define roundit roundl
> +#define dtype long
> +#define DTYPE_MIN LONG_MIN
> +#define DTYPE_MAX LONG_MAX
> +#define fn lroundl
> +
> +#include "s_lround.c"
> diff --git a/newlib/libm/ld/s_modfl.c b/newlib/libm/ld/s_modfl.c
> new file mode 100644
> index 000000000..2d83bbe33
> --- /dev/null
> +++ b/newlib/libm/ld/s_modfl.c
> @@ -0,0 +1,103 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2007 David Schultz <das@FreeBSD.ORG>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + *
> + * Derived from s_modf.c, which has the following Copyright:
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunPro, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + *
> + * $FreeBSD$
> + */
> +
> +#include <float.h>
> +#include <math.h>
> +#include <sys/types.h>
> +
> +#include "fpmath.h"
> +
> +#if LDBL_MANL_SIZE > 32
> +#define MASK ((uint64_t)-1)
> +#else
> +#define MASK ((uint32_t)-1)
> +#endif
> +/* Return the last n bits of a word, representing the fractional part. */
> +#define GETFRAC(bits, n) ((bits) & ~(MASK << (n)))
> +/* The number of fraction bits in manh, not counting the integer bit */
> +#define HIBITS (LDBL_MANT_DIG - LDBL_MANL_SIZE)
> +
> +static const long double zero[] = { 0.0L, -0.0L };
> +
> +long double
> +modfl(long double x, long double *iptr)
> +{
> + union IEEEl2bits ux;
> + int e;
> +
> + ux.e = x;
> + e = ux.bits.exp - LDBL_MAX_EXP + 1;
> + if (e < HIBITS) { /* Integer part is in manh. */
> + if (e < 0) { /* |x|<1 */
> + *iptr = zero[ux.bits.sign];
> + return (x);
> + } else {
> + if ((GETFRAC(ux.bits.manh, HIBITS - 1 - e) |
> + ux.bits.manl) == 0) { /* X is an integer. */
> + *iptr = x;
> + return (zero[ux.bits.sign]);
> + } else {
> + /* Clear all but the top e+1 bits. */
> + ux.bits.manh >>= HIBITS - 1 - e;
> + ux.bits.manh <<= HIBITS - 1 - e;
> + ux.bits.manl = 0;
> + *iptr = ux.e;
> + return (x - ux.e);
> + }
> + }
> + } else if (e >= LDBL_MANT_DIG - 1) { /* x has no fraction part. */
> + *iptr = x;
> + if (x != x) /* Handle NaNs. */
> + return (x);
> + return (zero[ux.bits.sign]);
> + } else { /* Fraction part is in manl. */
> + if (GETFRAC(ux.bits.manl, LDBL_MANT_DIG - 1 - e) == 0) {
> + /* x is integral. */
> + *iptr = x;
> + return (zero[ux.bits.sign]);
> + } else {
> + /* Clear all but the top e+1 bits. */
> + ux.bits.manl >>= LDBL_MANT_DIG - 1 - e;
> + ux.bits.manl <<= LDBL_MANT_DIG - 1 - e;
> + *iptr = ux.e;
> + return (x - ux.e);
> + }
> + }
> +}
> diff --git a/newlib/libm/ld/s_nearbyint.c b/newlib/libm/ld/s_nearbyint.c
> new file mode 100644
> index 000000000..796dbaf98
> --- /dev/null
> +++ b/newlib/libm/ld/s_nearbyint.c
> @@ -0,0 +1,61 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include <fenv.h>
> +#include <math.h>
> +
> +/*
> + * We save and restore the floating-point environment to avoid raising
> + * an inexact exception. We can get away with using fesetenv()
> + * instead of feclearexcept()/feupdateenv() to restore the environment
> + * because the only exception defined for rint() is overflow, and
> + * rounding can't overflow as long as emax >= p.
> + *
> + * The volatile keyword is needed below because clang incorrectly assumes
> + * that rint won't raise any floating-point exceptions. Declaring ret volatile
> + * is sufficient to trick the compiler into doing the right thing.
> + */
> +#define DECL(type, fn, rint) \
> +type \
> +fn(type x) \
> +{ \
> + volatile type ret; \
> + fenv_t env; \
> + \
> + fegetenv(&env); \
> + ret = rint(x); \
> + fesetenv(&env); \
> + return (ret); \
> +}
> +
> +DECL(double, nearbyint, rint)
> +DECL(float, nearbyintf, rintf)
> +DECL(long double, nearbyintl, rintl)
> diff --git a/newlib/libm/ld/s_nextafterl.c b/newlib/libm/ld/s_nextafterl.c
> new file mode 100644
> index 000000000..9c61a436a
> --- /dev/null
> +++ b/newlib/libm/ld/s_nextafterl.c
> @@ -0,0 +1,80 @@
> +/* @(#)s_nextafter.c 5.1 93/09/24 */
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunPro, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/* IEEE functions
> + * nextafter(x,y)
> + * return the next machine floating-point number of x in the
> + * direction toward y.
> + * Special cases:
> + */
> +
> +#include <float.h>
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +
> +#if LDBL_MAX_EXP != 0x4000
> +#error "Unsupported long double format"
> +#endif
> +
> +long double
> +nextafterl(long double x, long double y)
> +{
> + volatile long double t;
> + union IEEEl2bits ux, uy;
> +
> + ux.e = x;
> + uy.e = y;
> +
> + if ((ux.bits.exp == 0x7fff &&
> + ((ux.bits.manh&~LDBL_NBIT)|ux.bits.manl) != 0) ||
> + (uy.bits.exp == 0x7fff &&
> + ((uy.bits.manh&~LDBL_NBIT)|uy.bits.manl) != 0))
> + return x+y; /* x or y is nan */
> + if(x==y) return y; /* x=y, return y */
> + if(x==0.0) {
> + ux.bits.manh = 0; /* return +-minsubnormal */
> + ux.bits.manl = 1;
> + ux.bits.sign = uy.bits.sign;
> + t = ux.e*ux.e;
> + if(t==ux.e) return t; else return ux.e; /* raise underflow flag */
> + }
> + if(x>0.0 ^ x<y) { /* x -= ulp */
> + if(ux.bits.manl==0) {
> + if ((ux.bits.manh&~LDBL_NBIT)==0)
> + ux.bits.exp -= 1;
> + ux.bits.manh = (ux.bits.manh - 1) | (ux.bits.manh & LDBL_NBIT);
> + }
> + ux.bits.manl -= 1;
> + } else { /* x += ulp */
> + ux.bits.manl += 1;
> + if(ux.bits.manl==0) {
> + ux.bits.manh = (ux.bits.manh + 1) | (ux.bits.manh & LDBL_NBIT);
> + if ((ux.bits.manh&~LDBL_NBIT)==0)
> + ux.bits.exp += 1;
> + }
> + }
> + if(ux.bits.exp==0x7fff) return x+x; /* overflow */
> + if(ux.bits.exp==0) { /* underflow */
> + mask_nbit_l(ux);
> + t = ux.e * ux.e;
> + if(t!=ux.e) /* raise underflow flag */
> + return ux.e;
> + }
> + return ux.e;
> +}
> +
> +__strong_reference(nextafterl, nexttowardl);
> diff --git a/newlib/libm/ld/s_nexttoward.c b/newlib/libm/ld/s_nexttoward.c
> new file mode 100644
> index 000000000..b2a50d313
> --- /dev/null
> +++ b/newlib/libm/ld/s_nexttoward.c
> @@ -0,0 +1,72 @@
> +/* @(#)s_nextafter.c 5.1 93/09/24 */
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunPro, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * We assume that a long double has a 15-bit exponent. On systems
> + * where long double is the same as double, nexttoward() is an alias
> + * for nextafter(), so we don't use this routine.
> + */
> +
> +#include <float.h>
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +
> +#if LDBL_MAX_EXP != 0x4000
> +#error "Unsupported long double format"
> +#endif
> +
> +double
> +nexttoward(double x, long double y)
> +{
> + union IEEEl2bits uy;
> + volatile double t;
> + int32_t hx,ix;
> + u_int32_t lx;
> +
> + EXTRACT_WORDS(hx,lx,x);
> + ix = hx&0x7fffffff; /* |x| */
> + uy.e = y;
> +
> + if(((ix>=0x7ff00000)&&((ix-0x7ff00000)|lx)!=0) ||
> + (uy.bits.exp == 0x7fff &&
> + ((uy.bits.manh&~LDBL_NBIT)|uy.bits.manl) != 0))
> + return x+y; /* x or y is nan */
> + if(x==y) return (double)y; /* x=y, return y */
> + if(x==0.0) {
> + INSERT_WORDS(x,uy.bits.sign<<31,1); /* return +-minsubnormal */
> + t = x*x;
> + if(t==x) return t; else return x; /* raise underflow flag */
> + }
> + if(hx>0.0 ^ x < y) { /* x -= ulp */
> + if(lx==0) hx -= 1;
> + lx -= 1;
> + } else { /* x += ulp */
> + lx += 1;
> + if(lx==0) hx += 1;
> + }
> + ix = hx&0x7ff00000;
> + if(ix>=0x7ff00000) return x+x; /* overflow */
> + if(ix<0x00100000) { /* underflow */
> + t = x*x;
> + if(t!=x) { /* raise underflow flag */
> + INSERT_WORDS(x,hx,lx);
> + return x;
> + }
> + }
> + INSERT_WORDS(x,hx,lx);
> + return x;
> +}
> diff --git a/newlib/libm/ld/s_nexttowardf.c b/newlib/libm/ld/s_nexttowardf.c
> new file mode 100644
> index 000000000..9ddfff961
> --- /dev/null
> +++ b/newlib/libm/ld/s_nexttowardf.c
> @@ -0,0 +1,59 @@
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunPro, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include <float.h>
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +
> +#define LDBL_INFNAN_EXP (LDBL_MAX_EXP * 2 - 1)
> +
> +float
> +nexttowardf(float x, long double y)
> +{
> + union IEEEl2bits uy;
> + volatile float t;
> + int32_t hx,ix;
> +
> + GET_FLOAT_WORD(hx,x);
> + ix = hx&0x7fffffff; /* |x| */
> + uy.e = y;
> +
> + if((ix>0x7f800000) ||
> + (uy.bits.exp == LDBL_INFNAN_EXP &&
> + ((uy.bits.manh&~LDBL_NBIT)|uy.bits.manl) != 0))
> + return x+y; /* x or y is nan */
> + if(x==y) return (float)y; /* x=y, return y */
> + if(ix==0) { /* x == 0 */
> + SET_FLOAT_WORD(x,(uy.bits.sign<<31)|1);/* return +-minsubnormal */
> + t = x*x;
> + if(t==x) return t; else return x; /* raise underflow flag */
> + }
> + if(hx>=0 ^ x < y) /* x -= ulp */
> + hx -= 1;
> + else /* x += ulp */
> + hx += 1;
> + ix = hx&0x7f800000;
> + if(ix>=0x7f800000) return x+x; /* overflow */
> + if(ix<0x00800000) { /* underflow */
> + t = x*x;
> + if(t!=x) { /* raise underflow flag */
> + SET_FLOAT_WORD(x,hx);
> + return x;
> + }
> + }
> + SET_FLOAT_WORD(x,hx);
> + return x;
> +}
> diff --git a/newlib/libm/ld/s_remquol.c b/newlib/libm/ld/s_remquol.c
> new file mode 100644
> index 000000000..a9f5813d0
> --- /dev/null
> +++ b/newlib/libm/ld/s_remquol.c
> @@ -0,0 +1,173 @@
> +/* @(#)e_fmod.c 1.3 95/01/18 */
> +/*-
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunSoft, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include <float.h>
> +#include <stdint.h>
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +
> +#define BIAS (LDBL_MAX_EXP - 1)
> +
> +#if LDBL_MANL_SIZE > 32
> +typedef uint64_t manl_t;
> +#else
> +typedef uint32_t manl_t;
> +#endif
> +
> +#if LDBL_MANH_SIZE > 32
> +typedef uint64_t manh_t;
> +#else
> +typedef uint32_t manh_t;
> +#endif
> +
> +/*
> + * These macros add and remove an explicit integer bit in front of the
> + * fractional mantissa, if the architecture doesn't have such a bit by
> + * default already.
> + */
> +#ifdef LDBL_IMPLICIT_NBIT
> +#define SET_NBIT(hx) ((hx) | (1ULL << LDBL_MANH_SIZE))
> +#define HFRAC_BITS LDBL_MANH_SIZE
> +#else
> +#define SET_NBIT(hx) (hx)
> +#define HFRAC_BITS (LDBL_MANH_SIZE - 1)
> +#endif
> +
> +#define MANL_SHIFT (LDBL_MANL_SIZE - 1)
> +
> +static const long double Zero[] = {0.0L, -0.0L};
> +
> +/*
> + * Return the IEEE remainder and set *quo to the last n bits of the
> + * quotient, rounded to the nearest integer. We choose n=31 because
> + * we wind up computing all the integer bits of the quotient anyway as
> + * a side-effect of computing the remainder by the shift and subtract
> + * method. In practice, this is far more bits than are needed to use
> + * remquo in reduction algorithms.
> + *
> + * Assumptions:
> + * - The low part of the mantissa fits in a manl_t exactly.
> + * - The high part of the mantissa fits in an int64_t with enough room
> + * for an explicit integer bit in front of the fractional bits.
> + */
> +long double
> +remquol(long double x, long double y, int *quo)
> +{
> + union IEEEl2bits ux, uy;
> + int64_t hx,hz; /* We need a carry bit even if LDBL_MANH_SIZE is 32. */
> + manh_t hy;
> + manl_t lx,ly,lz;
> + int ix,iy,n,q,sx,sxy;
> +
> + ux.e = x;
> + uy.e = y;
> + sx = ux.bits.sign;
> + sxy = sx ^ uy.bits.sign;
> + ux.bits.sign = 0; /* |x| */
> + uy.bits.sign = 0; /* |y| */
> +
> + /* purge off exception values */
> + if((uy.bits.exp|uy.bits.manh|uy.bits.manl)==0 || /* y=0 */
> + (ux.bits.exp == BIAS + LDBL_MAX_EXP) || /* or x not finite */
> + (uy.bits.exp == BIAS + LDBL_MAX_EXP &&
> + ((uy.bits.manh&~LDBL_NBIT)|uy.bits.manl)!=0)) /* or y is NaN */
> + return nan_mix_op(x, y, *)/nan_mix_op(x, y, *);
> + if(ux.bits.exp<=uy.bits.exp) {
> + if((ux.bits.exp<uy.bits.exp) ||
> + (ux.bits.manh<=uy.bits.manh &&
> + (ux.bits.manh<uy.bits.manh ||
> + ux.bits.manl<uy.bits.manl))) {
> + q = 0;
> + goto fixup; /* |x|<|y| return x or x-y */
> + }
> + if(ux.bits.manh==uy.bits.manh && ux.bits.manl==uy.bits.manl) {
> + *quo = (sxy ? -1 : 1);
> + return Zero[sx]; /* |x|=|y| return x*0*/
> + }
> + }
> +
> + /* determine ix = ilogb(x) */
> + if(ux.bits.exp == 0) { /* subnormal x */
> + ux.e *= 0x1.0p512;
> + ix = ux.bits.exp - (BIAS + 512);
> + } else {
> + ix = ux.bits.exp - BIAS;
> + }
> +
> + /* determine iy = ilogb(y) */
> + if(uy.bits.exp == 0) { /* subnormal y */
> + uy.e *= 0x1.0p512;
> + iy = uy.bits.exp - (BIAS + 512);
> + } else {
> + iy = uy.bits.exp - BIAS;
> + }
> +
> + /* set up {hx,lx}, {hy,ly} and align y to x */
> + hx = SET_NBIT(ux.bits.manh);
> + hy = SET_NBIT(uy.bits.manh);
> + lx = ux.bits.manl;
> + ly = uy.bits.manl;
> +
> + /* fix point fmod */
> + n = ix - iy;
> + q = 0;
> + while(n--) {
> + hz=hx-hy;lz=lx-ly; if(lx<ly) hz -= 1;
> + if(hz<0){hx = hx+hx+(lx>>MANL_SHIFT); lx = lx+lx;}
> + else {hx = hz+hz+(lz>>MANL_SHIFT); lx = lz+lz; q++;}
> + q <<= 1;
> + }
> + hz=hx-hy;lz=lx-ly; if(lx<ly) hz -= 1;
> + if(hz>=0) {hx=hz;lx=lz;q++;}
> +
> + /* convert back to floating value and restore the sign */
> + if((hx|lx)==0) { /* return sign(x)*0 */
> + q &= 0x7fffffff;
> + *quo = (sxy ? -q : q);
> + return Zero[sx];
> + }
> + while(hx<(1ULL<<HFRAC_BITS)) { /* normalize x */
> + hx = hx+hx+(lx>>MANL_SHIFT); lx = lx+lx;
> + iy -= 1;
> + }
> + ux.bits.manh = hx; /* The integer bit is truncated here if needed. */
> + ux.bits.manl = lx;
> + if (iy < LDBL_MIN_EXP) {
> + ux.bits.exp = iy + (BIAS + 512);
> + ux.e *= 0x1p-512;
> + } else {
> + ux.bits.exp = iy + BIAS;
> + }
> +fixup:
> + x = ux.e; /* |x| */
> + y = fabsl(y);
> + if (y < LDBL_MIN * 2) {
> + if (x+x>y || (x+x==y && (q & 1))) {
> + q++;
> + x-=y;
> + }
> + } else if (x>0.5*y || (x==0.5*y && (q & 1))) {
> + q++;
> + x-=y;
> + }
> + ux.e = x;
> + ux.bits.sign ^= sx;
> + x = ux.e;
> + q &= 0x7fffffff;
> + *quo = (sxy ? -q : q);
> + return x;
> +}
> diff --git a/newlib/libm/ld/s_rintl.c b/newlib/libm/ld/s_rintl.c
> new file mode 100644
> index 000000000..1e9824d83
> --- /dev/null
> +++ b/newlib/libm/ld/s_rintl.c
> @@ -0,0 +1,92 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2008 David Schultz <das@FreeBSD.ORG>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include <float.h>
> +#include <math.h>
> +
> +#include "fpmath.h"
> +
> +#if LDBL_MAX_EXP != 0x4000
> +/* We also require the usual bias, min exp and expsign packing. */
> +#error "Unsupported long double format"
> +#endif
> +
> +#define BIAS (LDBL_MAX_EXP - 1)
> +
> +static const float
> +shift[2] = {
> +#if LDBL_MANT_DIG == 64
> + 0x1.0p63, -0x1.0p63
> +#elif LDBL_MANT_DIG == 113
> + 0x1.0p112, -0x1.0p112
> +#else
> +#error "Unsupported long double format"
> +#endif
> +};
> +static const float zero[2] = { 0.0, -0.0 };
> +
> +long double
> +rintl(long double x)
> +{
> + union IEEEl2bits u;
> + uint32_t expsign;
> + int ex, sign;
> +
> + u.e = x;
> + expsign = u.xbits.expsign;
> + ex = expsign & 0x7fff;
> +
> + if (ex >= BIAS + LDBL_MANT_DIG - 1) {
> + if (ex == BIAS + LDBL_MAX_EXP)
> + return (x + x); /* Inf, NaN, or unsupported format */
> + return (x); /* finite and already an integer */
> + }
> + sign = expsign >> 15;
> +
> + /*
> + * The following code assumes that intermediate results are
> + * evaluated in long double precision. If they are evaluated in
> + * greater precision, double rounding may occur, and if they are
> + * evaluated in less precision (as on i386), results will be
> + * wildly incorrect.
> + */
> + x += shift[sign];
> + x -= shift[sign];
> +
> + /*
> + * If the result is +-0, then it must have the same sign as x, but
> + * the above calculation doesn't always give this. Fix up the sign.
> + */
> + if (ex < BIAS && x == 0.0L)
> + return (zero[sign]);
> +
> + return (x);
> +}
> diff --git a/newlib/libm/ld/s_roundl.c b/newlib/libm/ld/s_roundl.c
> new file mode 100644
> index 000000000..8d1c02a7f
> --- /dev/null
> +++ b/newlib/libm/ld/s_roundl.c
> @@ -0,0 +1,64 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2003, Steven G. Kargl
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice unmodified, this list of conditions, and the following
> + * disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
> + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
> + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
> + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
> + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
> + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
> + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include <float.h>
> +#ifdef __i386__
> +#include <ieeefp.h>
> +#endif
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +
> +long double
> +roundl(long double x)
> +{
> + long double t;
> + uint16_t hx;
> +
> + GET_LDBL_EXPSIGN(hx, x);
> + if ((hx & 0x7fff) == 0x7fff)
> + return (x + x);
> +
> + ENTERI();
> +
> + if (!(hx & 0x8000)) {
> + t = floorl(x);
> + if (t - x <= -0.5L)
> + t += 1;
> + RETURNI(t);
> + } else {
> + t = floorl(-x);
> + if (t + x <= -0.5L)
> + t += 1;
> + RETURNI(-t);
> + }
> +}
> diff --git a/newlib/libm/ld/s_scalbln.c b/newlib/libm/ld/s_scalbln.c
> new file mode 100644
> index 000000000..c27420c92
> --- /dev/null
> +++ b/newlib/libm/ld/s_scalbln.c
> @@ -0,0 +1,56 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include <math.h>
> +
> +#define NMAX 65536
> +#define NMIN -65536
> +
> +double
> +scalbln(double x, long n)
> +{
> +
> + return (scalbn(x, (n > NMAX) ? NMAX : (n < NMIN) ? NMIN : (int)n));
> +}
> +
> +float
> +scalblnf(float x, long n)
> +{
> +
> + return (scalbnf(x, (n > NMAX) ? NMAX : (n < NMIN) ? NMIN : (int)n));
> +}
> +
> +long double
> +scalblnl(long double x, long n)
> +{
> +
> + return (scalbnl(x, (n > NMAX) ? NMAX : (n < NMIN) ? NMIN : (int)n));
> +}
> diff --git a/newlib/libm/ld/s_scalbnl.c b/newlib/libm/ld/s_scalbnl.c
> new file mode 100644
> index 000000000..6044c1b1d
> --- /dev/null
> +++ b/newlib/libm/ld/s_scalbnl.c
> @@ -0,0 +1,49 @@
> +/*
> + * Copyright (c) 2005-2020 Rich Felker, et al.
> + *
> + * SPDX-License-Identifier: MIT
> + *
> + * Please see https://git.musl-libc.org/cgit/musl/tree/COPYRIGHT
> + * for all contributors to musl.
> + */
> +#include <math.h>
> +#include <float.h>
> +#include "math_private.h"
> +#include "fpmath.h"
> +/*
> + * scalbnl (long double x, int n)
> + * scalbnl(x,n) returns x* 2**n computed by exponent
> + * manipulation rather than by actually performing an
> + * exponentiation or a multiplication.
> + */
> +#if (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
> +long double scalbnl(long double x, int n)
> +{
> + union IEEEl2bits u;
> +
> + if (n > 16383) {
> + x *= 0x1p16383L;
> + n -= 16383;
> + if (n > 16383) {
> + x *= 0x1p16383L;
> + n -= 16383;
> + if (n > 16383)
> + n = 16383;
> + }
> + } else if (n < -16382) {
> + x *= 0x1p-16382L * 0x1p113L;
> + n += 16382 - 113;
> + if (n < -16382) {
> + x *= 0x1p-16382L * 0x1p113L;
> + n += 16382 - 113;
> + if (n < -16382)
> + n = -16382;
> + }
> + }
> + u.e = 1.0;
> + u.xbits.expsign = 0x3fff + n;
> + return x * u.e;
> +}
> +__strong_reference(scalbnl, ldexpl);
> +#endif
> +
> diff --git a/newlib/libm/ld/s_sinl.c b/newlib/libm/ld/s_sinl.c
> new file mode 100644
> index 000000000..f1ef84c8c
> --- /dev/null
> +++ b/newlib/libm/ld/s_sinl.c
> @@ -0,0 +1,95 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2007 Steven G. Kargl
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice unmodified, this list of conditions, and the following
> + * disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
> + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
> + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
> + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
> + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
> + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
> + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include <float.h>
> +#ifdef __i386__
> +#include <ieeefp.h>
> +#endif
> +
> +#include "math.h"
> +#include "math_private.h"
> +#if LDBL_MANT_DIG == 64
> +#include "../ld80/e_rem_pio2l.h"
> +#elif LDBL_MANT_DIG == 113
> +#include "../ld128/e_rem_pio2l.h"
> +#else
> +#error "Unsupported long double format"
> +#endif
> +
> +long double
> +sinl(long double x)
> +{
> + union IEEEl2bits z;
> + int e0, s;
> + long double y[2];
> + long double hi, lo;
> +
> + z.e = x;
> + s = z.bits.sign;
> + z.bits.sign = 0;
> +
> + /* If x = +-0 or x is a subnormal number, then sin(x) = x */
> + if (z.bits.exp == 0)
> + return (x);
> +
> + /* If x = NaN or Inf, then sin(x) = NaN. */
> + if (z.bits.exp == 32767)
> + return ((x - x) / (x - x));
> +
> + ENTERI();
> +
> + /* Optimize the case where x is already within range. */
> + if (z.e < M_PI_4) {
> + hi = __kernel_sinl(z.e, 0, 0);
> + RETURNI(s ? -hi : hi);
> + }
> +
> + e0 = __ieee754_rem_pio2l(x, y);
> + hi = y[0];
> + lo = y[1];
> +
> + switch (e0 & 3) {
> + case 0:
> + hi = __kernel_sinl(hi, lo, 1);
> + break;
> + case 1:
> + hi = __kernel_cosl(hi, lo);
> + break;
> + case 2:
> + hi = - __kernel_sinl(hi, lo, 1);
> + break;
> + case 3:
> + hi = - __kernel_cosl(hi, lo);
> + break;
> + }
> +
> + RETURNI(hi);
> +}
> diff --git a/newlib/libm/ld/s_tanhl.c b/newlib/libm/ld/s_tanhl.c
> new file mode 100644
> index 000000000..b7531866d
> --- /dev/null
> +++ b/newlib/libm/ld/s_tanhl.c
> @@ -0,0 +1,174 @@
> +/* from: FreeBSD: head/lib/msun/src/s_tanhl.c XXX */
> +
> +/* @(#)s_tanh.c 5.1 93/09/24 */
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunPro, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * See s_tanh.c for complete comments.
> + *
> + * Converted to long double by Bruce D. Evans.
> + */
> +
> +#include <float.h>
> +#ifdef __i386__
> +#include <ieeefp.h>
> +#endif
> +
> +#include "math.h"
> +#include "math_private.h"
> +#include "fpmath.h"
> +#include "k_expl.h"
> +
> +#if LDBL_MAX_EXP != 0x4000
> +/* We also require the usual expsign encoding. */
> +#error "Unsupported long double format"
> +#endif
> +
> +#define BIAS (LDBL_MAX_EXP - 1)
> +
> +static const volatile double tiny = 1.0e-300;
> +static const double one = 1.0;
> +#if LDBL_MANT_DIG == 64
> +/*
> + * Domain [-0.25, 0.25], range ~[-1.6304e-22, 1.6304e-22]:
> + * |tanh(x)/x - t(x)| < 2**-72.3
> + */
> +static const union IEEEl2bits
> +T3u = LD80C(0xaaaaaaaaaaaaaa9f, -2, -3.33333333333333333017e-1L);
> +#define T3 T3u.e
> +static const double
> +T5 = 1.3333333333333314e-1, /* 0x1111111111110a.0p-55 */
> +T7 = -5.3968253968210485e-2, /* -0x1ba1ba1ba1a1a1.0p-57 */
> +T9 = 2.1869488531393817e-2, /* 0x1664f488172022.0p-58 */
> +T11 = -8.8632352345964591e-3, /* -0x1226e34bc138d5.0p-59 */
> +T13 = 3.5921169709993771e-3, /* 0x1d6d371d3e400f.0p-61 */
> +T15 = -1.4555786415756001e-3, /* -0x17d923aa63814d.0p-62 */
> +T17 = 5.8645267876296793e-4, /* 0x13378589b85aa7.0p-63 */
> +T19 = -2.1121033571392224e-4; /* -0x1baf0af80c4090.0p-65 */
> +#elif LDBL_MANT_DIG == 113
> +/*
> + * Domain [-0.25, 0.25], range ~[-2.4211e-37, 2.4211e-37]:
> + * |tanh(x)/x - t(x)| < 2**121.6
> + */
> +static const long double
> +T3 = -3.33333333333333333333333333333332980e-1L, /* -0x1555555555555555555555555554e.0p-114L */
> +T5 = 1.33333333333333333333333333332707260e-1L, /* 0x1111111111111111111111110ab7b.0p-115L */
> +T7 = -5.39682539682539682539682535723482314e-2L, /* -0x1ba1ba1ba1ba1ba1ba1ba17b5fc98.0p-117L */
> +T9 = 2.18694885361552028218693591149061717e-2L, /* 0x1664f4882c10f9f32d6b1a12a25e5.0p-118L */
> +T11 = -8.86323552990219656883762347736381851e-3L, /* -0x1226e355e6c23c8f5a5a0f386cb4d.0p-119L */
> +T13 = 3.59212803657248101358314398220822722e-3L, /* 0x1d6d3d0e157ddfb403ad3637442c6.0p-121L */
> +T15 = -1.45583438705131796512568010348874662e-3L; /* -0x17da36452b75e150c44cc34253b34.0p-122L */
> +static const double
> +T17 = 5.9002744094556621e-4, /* 0x1355824803668e.0p-63 */
> +T19 = -2.3912911424260516e-4, /* -0x1f57d7734c8dde.0p-65 */
> +T21 = 9.6915379535512898e-5, /* 0x1967e18ad6a6ca.0p-66 */
> +T23 = -3.9278322983156353e-5, /* -0x1497d8e6b75729.0p-67 */
> +T25 = 1.5918887220143869e-5, /* 0x10b1319998cafa.0p-68 */
> +T27 = -6.4514295231630956e-6, /* -0x1b0f2b71b218eb.0p-70 */
> +T29 = 2.6120754043964365e-6, /* 0x15e963a3cf3a39.0p-71 */
> +T31 = -1.0407567231003314e-6, /* -0x1176041e656869.0p-72 */
> +T33 = 3.4744117554063574e-7; /* 0x1750fe732cab9c.0p-74 */
> +#endif /* LDBL_MANT_DIG == 64 */
> +
> +static inline long double
> +divl(long double a, long double b, long double c, long double d,
> + long double e, long double f)
> +{
> + long double inv, r;
> + float fr, fw;
> +
> + _2sumF(a, c);
> + b = b + c;
> + _2sumF(d, f);
> + e = e + f;
> +
> + inv = 1 / (d + e);
> +
> + r = (a + b) * inv;
> + fr = r;
> + r = fr;
> +
> + fw = d + e;
> + e = d - fw + e;
> + d = fw;
> +
> + r = r + (a - d * r + b - e * r) * inv;
> +
> + return r;
> +}
> +
> +long double
> +tanhl(long double x)
> +{
> + long double hi,lo,s,x2,x4,z;
> +#if LDBL_MANT_DIG == 113
> + double dx2;
> +#endif
> + int16_t jx,ix;
> +
> + GET_LDBL_EXPSIGN(jx,x);
> + ix = jx&0x7fff;
> +
> + /* x is INF or NaN */
> + if(ix>=0x7fff) {
> + if (jx>=0) return one/x+one; /* tanh(+-inf)=+-1 */
> + else return one/x-one; /* tanh(NaN) = NaN */
> + }
> +
> + ENTERI();
> +
> + /* |x| < 40 */
> + if (ix < 0x4004 || fabsl(x) < 40) { /* |x|<40 */
> + if (__predict_false(ix<BIAS-(LDBL_MANT_DIG+1)/2)) { /* |x|<TINY */
> + /* tanh(+-0) = +0; tanh(tiny) = tiny(-+) with inexact: */
> + return (x == 0 ? x : (0x1p200 * x - x) * 0x1p-200);
> + }
> + if (ix<0x3ffd) { /* |x|<0.25 */
> + x2 = x*x;
> +#if LDBL_MANT_DIG == 64
> + x4 = x2*x2;
> + RETURNI(((T19*x2 + T17)*x4 + (T15*x2 + T13))*(x2*x*x2*x4*x4) +
> + ((T11*x2 + T9)*x4 + (T7*x2 + T5))*(x2*x*x2) +
> + T3*(x2*x) + x);
> +#elif LDBL_MANT_DIG == 113
> + dx2 = x2;
> +#if 0
> + RETURNI(((((((((((((((T33*dx2 + T31)*dx2 + T29)*dx2 + T27)*dx2 +
> + T25)*x2 + T23)*x2 + T21)*x2 + T19)*x2 + T17)*x2 +
> + T15)*x2 + T13)*x2 + T11)*x2 + T9)*x2 + T7)*x2 + T5)*
> + (x2*x*x2) +
> + T3*(x2*x) + x);
> +#else
> + long double q = ((((((((((((((T33*dx2 + T31)*dx2 + T29)*dx2 + T27)*dx2 +
> + T25)*x2 + T23)*x2 + T21)*x2 + T19)*x2 + T17)*x2 +
> + T15)*x2 + T13)*x2 + T11)*x2 + T9)*x2 + T7)*x2 + T5)*
> + (x2*x*x2);
> + RETURNI(q + T3*(x2*x) + x);
> +#endif
> +#endif
> + }
> + k_hexpl(2*fabsl(x), &hi, &lo);
> + if (ix<0x4001 && fabsl(x) < 1.5) /* |x|<1.5 */
> + z = divl(hi, lo, -0.5, hi, lo, 0.5);
> + else
> + z = one - one/(lo+0.5+hi);
> + /* |x| >= 40, return +-1 */
> + } else {
> + z = one - tiny; /* raise inexact flag */
> + }
> + s = 1;
> + if (jx<0) s = -1;
> + RETURNI(s*z);
> +}
> diff --git a/newlib/libm/ld/s_tanl.c b/newlib/libm/ld/s_tanl.c
> new file mode 100644
> index 000000000..0c5228ec8
> --- /dev/null
> +++ b/newlib/libm/ld/s_tanl.c
> @@ -0,0 +1,97 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2007 Steven G. Kargl
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice unmodified, this list of conditions, and the following
> + * disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
> + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
> + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
> + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
> + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
> + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
> + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * Limited testing on pseudorandom numbers drawn within [0:4e8] shows
> + * an accuracy of <= 1.5 ULP where 247024 values of x out of 40 million
> + * possibles resulted in tan(x) that exceeded 0.5 ULP (ie., 0.6%).
> + */
> +
> +#include <float.h>
> +#ifdef __i386__
> +#include <ieeefp.h>
> +#endif
> +
> +#include "math.h"
> +#include "math_private.h"
> +#if LDBL_MANT_DIG == 64
> +#include "../ld80/e_rem_pio2l.h"
> +#elif LDBL_MANT_DIG == 113
> +#include "../ld128/e_rem_pio2l.h"
> +#else
> +#error "Unsupported long double format"
> +#endif
> +
> +long double
> +tanl(long double x)
> +{
> + union IEEEl2bits z;
> + int e0, s;
> + long double y[2];
> + long double hi, lo;
> +
> + z.e = x;
> + s = z.bits.sign;
> + z.bits.sign = 0;
> +
> + /* If x = +-0 or x is subnormal, then tan(x) = x. */
> + if (z.bits.exp == 0)
> + return (x);
> +
> + /* If x = NaN or Inf, then tan(x) = NaN. */
> + if (z.bits.exp == 32767)
> + return ((x - x) / (x - x));
> +
> + ENTERI();
> +
> + /* Optimize the case where x is already within range. */
> + if (z.e < M_PI_4) {
> + hi = __kernel_tanl(z.e, 0, 0);
> + RETURNI(s ? -hi : hi);
> + }
> +
> + e0 = __ieee754_rem_pio2l(x, y);
> + hi = y[0];
> + lo = y[1];
> +
> + switch (e0 & 3) {
> + case 0:
> + case 2:
> + hi = __kernel_tanl(hi, lo, 0);
> + break;
> + case 1:
> + case 3:
> + hi = __kernel_tanl(hi, lo, 1);
> + break;
> + }
> +
> + RETURNI(hi);
> +}
> diff --git a/newlib/libm/ld/s_truncl.c b/newlib/libm/ld/s_truncl.c
> new file mode 100644
> index 000000000..9e2b51132
> --- /dev/null
> +++ b/newlib/libm/ld/s_truncl.c
> @@ -0,0 +1,68 @@
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunPro, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + *
> + * From: @(#)s_floor.c 5.1 93/09/24
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * truncl(x)
> + * Return x rounded toward 0 to integral value
> + * Method:
> + * Bit twiddling.
> + * Exception:
> + * Inexact flag raised if x not equal to truncl(x).
> + */
> +
> +#include <float.h>
> +#include <math.h>
> +#include <stdint.h>
> +
> +#include "fpmath.h"
> +
> +#ifdef LDBL_IMPLICIT_NBIT
> +#define MANH_SIZE (LDBL_MANH_SIZE + 1)
> +#else
> +#define MANH_SIZE LDBL_MANH_SIZE
> +#endif
> +
> +static const long double huge = 1.0e300;
> +static const float zero[] = { 0.0, -0.0 };
> +
> +long double
> +truncl(long double x)
> +{
> + union IEEEl2bits u = { .e = x };
> + int e = u.bits.exp - LDBL_MAX_EXP + 1;
> +
> + if (e < MANH_SIZE - 1) {
> + if (e < 0) { /* raise inexact if x != 0 */
> + if (huge + x > 0.0)
> + u.e = zero[u.bits.sign];
> + } else {
> + uint64_t m = ((1llu << MANH_SIZE) - 1) >> (e + 1);
> + if (((u.bits.manh & m) | u.bits.manl) == 0)
> + return (x); /* x is integral */
> + if (huge + x > 0.0) { /* raise inexact flag */
> + u.bits.manh &= ~m;
> + u.bits.manl = 0;
> + }
> + }
> + } else if (e < LDBL_MANT_DIG - 1) {
> + uint64_t m = (uint64_t)-1 >> (64 - LDBL_MANT_DIG + e + 1);
> + if ((u.bits.manl & m) == 0)
> + return (x); /* x is integral */
> + if (huge + x > 0.0) /* raise inexact flag */
> + u.bits.manl &= ~m;
> + }
> + return (u.e);
> +}
> diff --git a/newlib/libm/ld128/b_tgammal.c b/newlib/libm/ld128/b_tgammal.c
> new file mode 100644
> index 000000000..1c995ab6d
> --- /dev/null
> +++ b/newlib/libm/ld128/b_tgammal.c
> @@ -0,0 +1,57 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2013 David Chisnall
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + *
> + * $FreeBSD$
> + */
> +
> +#include <float.h>
> +#include <math.h>
> +
> +/*
> + * If long double is not the same size as double, then these will lose
> + * precision and we should emit a warning whenever something links against
> + * them.
> + */
> +#if (LDBL_MANT_DIG > 53)
> +#define WARN_IMPRECISE(x) \
> + __warn_references(x, # x " has lower than advertised precision");
> +#else
> +#define WARN_IMPRECISE(x)
> +#endif
> +/*
> + * Declare the functions as weak variants so that other libraries providing
> + * real versions can override them.
> + */
> +#define DECLARE_WEAK(x)\
> + __weak_reference(imprecise_## x, x);\
> + WARN_IMPRECISE(x)
> +
> +#define DECLARE_IMPRECISE(f) \
> + long double imprecise_ ## f ## l(long double v) { return f(v); }\
> + DECLARE_WEAK(f ## l)
> +
> +DECLARE_IMPRECISE(tgamma);
> diff --git a/newlib/libm/ld128/e_lgammal_r.c b/newlib/libm/ld128/e_lgammal_r.c
> new file mode 100644
> index 000000000..53d3af17d
> --- /dev/null
> +++ b/newlib/libm/ld128/e_lgammal_r.c
> @@ -0,0 +1,330 @@
> +/* @(#)e_lgamma_r.c 1.3 95/01/18 */
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunSoft, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * See e_lgamma_r.c for complete comments.
> + *
> + * Converted to long double by Steven G. Kargl.
> + */
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +
> +static const volatile double vzero = 0;
> +
> +static const double
> +zero= 0,
> +half= 0.5,
> +one = 1;
> +
> +static const long double
> +pi = 3.14159265358979323846264338327950288e+00L;
> +/*
> + * Domain y in [0x1p-119, 0.28], range ~[-1.4065e-36, 1.4065e-36]:
> + * |(lgamma(2 - y) + y / 2) / y - a(y)| < 2**-119.1
> + */
> +static const long double
> +a0 = 7.72156649015328606065120900824024296e-02L,
> +a1 = 3.22467033424113218236207583323018498e-01L,
> +a2 = 6.73523010531980951332460538330282217e-02L,
> +a3 = 2.05808084277845478790009252803463129e-02L,
> +a4 = 7.38555102867398526627292839296001626e-03L,
> +a5 = 2.89051033074152328576829509522483468e-03L,
> +a6 = 1.19275391170326097618357349881842913e-03L,
> +a7 = 5.09669524743042462515256340206203019e-04L,
> +a8 = 2.23154758453578096143609255559576017e-04L,
> +a9 = 9.94575127818397632126978731542755129e-05L,
> +a10 = 4.49262367375420471287545895027098145e-05L,
> +a11 = 2.05072127845117995426519671481628849e-05L,
> +a12 = 9.43948816959096748454087141447939513e-06L,
> +a13 = 4.37486780697359330303852050718287419e-06L,
> +a14 = 2.03920783892362558276037363847651809e-06L,
> +a15 = 9.55191070057967287877923073200324649e-07L,
> +a16 = 4.48993286185740853170657139487620560e-07L,
> +a17 = 2.13107543597620911675316728179563522e-07L,
> +a18 = 9.70745379855304499867546549551023473e-08L,
> +a19 = 5.61889970390290257926487734695402075e-08L,
> +a20 = 6.42739653024130071866684358960960951e-09L,
> +a21 = 3.34491062143649291746195612991870119e-08L,
> +a22 = -1.57068547394315223934653011440641472e-08L,
> +a23 = 1.30812825422415841213733487745200632e-08L;
> +/*
> + * Domain x in [tc-0.24, tc+0.28], range ~[-6.3201e-37, 6.3201e-37]:
> + * |(lgamma(x) - tf) - t(x - tc)| < 2**-120.3.
> + */
> +static const long double
> +tc = 1.46163214496836234126265954232572133e+00L,
> +tf = -1.21486290535849608095514557177691584e-01L,
> +tt = 1.57061739945077675484237837992951704e-36L,
> +t0 = -1.99238329499314692728655623767019240e-36L,
> +t1 = -6.08453430711711404116887457663281416e-35L,
> +t2 = 4.83836122723810585213722380854828904e-01L,
> +t3 = -1.47587722994530702030955093950668275e-01L,
> +t4 = 6.46249402389127526561003464202671923e-02L,
> +t5 = -3.27885410884813055008502586863748063e-02L,
> +t6 = 1.79706751152103942928638276067164935e-02L,
> +t7 = -1.03142230366363872751602029672767978e-02L,
> +t8 = 6.10053602051788840313573150785080958e-03L,
> +t9 = -3.68456960831637325470641021892968954e-03L,
> +t10 = 2.25976482322181046611440855340968560e-03L,
> +t11 = -1.40225144590445082933490395950664961e-03L,
> +t12 = 8.78232634717681264035014878172485575e-04L,
> +t13 = -5.54194952796682301220684760591403899e-04L,
> +t14 = 3.51912956837848209220421213975000298e-04L,
> +t15 = -2.24653443695947456542669289367055542e-04L,
> +t16 = 1.44070395420840737695611929680511823e-04L,
> +t17 = -9.27609865550394140067059487518862512e-05L,
> +t18 = 5.99347334438437081412945428365433073e-05L,
> +t19 = -3.88458388854572825603964274134801009e-05L,
> +t20 = 2.52476631610328129217896436186551043e-05L,
> +t21 = -1.64508584981658692556994212457518536e-05L,
> +t22 = 1.07434583475987007495523340296173839e-05L,
> +t23 = -7.03070407519397260929482550448878399e-06L,
> +t24 = 4.60968590693753579648385629003100469e-06L,
> +t25 = -3.02765473778832036018438676945512661e-06L,
> +t26 = 1.99238771545503819972741288511303401e-06L,
> +t27 = -1.31281299822614084861868817951788579e-06L,
> +t28 = 8.60844432267399655055574642052370223e-07L,
> +t29 = -5.64535486432397413273248363550536374e-07L,
> +t30 = 3.99357783676275660934903139592727737e-07L,
> +t31 = -2.95849029193433121795495215869311610e-07L,
> +t32 = 1.37790144435073124976696250804940384e-07L;
> +/*
> + * Domain y in [-0.1, 0.232], range ~[-1.4046e-37, 1.4181e-37]:
> + * |(lgamma(1 + y) + 0.5 * y) / y - u(y) / v(y)| < 2**-122.8
> + */
> +static const long double
> +u0 = -7.72156649015328606065120900824024311e-02L,
> +u1 = 4.24082772271938167430983113242482656e-01L,
> +u2 = 2.96194003481457101058321977413332171e+00L,
> +u3 = 6.49503267711258043997790983071543710e+00L,
> +u4 = 7.40090051288150177152835698948644483e+00L,
> +u5 = 4.94698036296756044610805900340723464e+00L,
> +u6 = 2.00194224610796294762469550684947768e+00L,
> +u7 = 4.82073087750608895996915051568834949e-01L,
> +u8 = 6.46694052280506568192333848437585427e-02L,
> +u9 = 4.17685526755100259316625348933108810e-03L,
> +u10 = 9.06361003550314327144119307810053410e-05L,
> +v1 = 5.15937098592887275994320496999951947e+00L,
> +v2 = 1.14068418766251486777604403304717558e+01L,
> +v3 = 1.41164839437524744055723871839748489e+01L,
> +v4 = 1.07170702656179582805791063277960532e+01L,
> +v5 = 5.14448694179047879915042998453632434e+00L,
> +v6 = 1.55210088094585540637493826431170289e+00L,
> +v7 = 2.82975732849424562719893657416365673e-01L,
> +v8 = 2.86424622754753198010525786005443539e-02L,
> +v9 = 1.35364253570403771005922441442688978e-03L,
> +v10 = 1.91514173702398375346658943749580666e-05L,
> +v11 = -3.25364686890242327944584691466034268e-08L;
> +/*
> + * Domain x in (2, 3], range ~[-1.3341e-36, 1.3536e-36]:
> + * |(lgamma(y+2) - 0.5 * y) / y - s(y)/r(y)| < 2**-120.1
> + * with y = x - 2.
> + */
> +static const long double
> +s0 = -7.72156649015328606065120900824024297e-02L,
> +s1 = 1.23221687850916448903914170805852253e-01L,
> +s2 = 5.43673188699937239808255378293820020e-01L,
> +s3 = 6.31998137119005233383666791176301800e-01L,
> +s4 = 3.75885340179479850993811501596213763e-01L,
> +s5 = 1.31572908743275052623410195011261575e-01L,
> +s6 = 2.82528453299138685507186287149699749e-02L,
> +s7 = 3.70262021550340817867688714880797019e-03L,
> +s8 = 2.83374000312371199625774129290973648e-04L,
> +s9 = 1.15091830239148290758883505582343691e-05L,
> +s10 = 2.04203474281493971326506384646692446e-07L,
> +s11 = 9.79544198078992058548607407635645763e-10L,
> +r1 = 2.58037466655605285937112832039537492e+00L,
> +r2 = 2.86289413392776399262513849911531180e+00L,
> +r3 = 1.78691044735267497452847829579514367e+00L,
> +r4 = 6.89400381446725342846854215600008055e-01L,
> +r5 = 1.70135865462567955867134197595365343e-01L,
> +r6 = 2.68794816183964420375498986152766763e-02L,
> +r7 = 2.64617234244861832870088893332006679e-03L,
> +r8 = 1.52881761239180800640068128681725702e-04L,
> +r9 = 4.63264813762296029824851351257638558e-06L,
> +r10 = 5.89461519146957343083848967333671142e-08L,
> +r11 = 1.79027678176582527798327441636552968e-10L;
> +/*
> + * Domain z in [8, 0x1p70], range ~[-9.8214e-35, 9.8214e-35]:
> + * |lgamma(x) - (x - 0.5) * (log(x) - 1) - w(1/x)| < 2**-113.0
> + */
> +static const long double
> +w0 = 4.18938533204672741780329736405617738e-01L,
> +w1 = 8.33333333333333333333333333332852026e-02L,
> +w2 = -2.77777777777777777777777727810123528e-03L,
> +w3 = 7.93650793650793650791708939493907380e-04L,
> +w4 = -5.95238095238095234390450004444370959e-04L,
> +w5 = 8.41750841750837633887817658848845695e-04L,
> +w6 = -1.91752691752396849943172337347259743e-03L,
> +w7 = 6.41025640880333069429106541459015557e-03L,
> +w8 = -2.95506530801732133437990433080327074e-02L,
> +w9 = 1.79644237328444101596766586979576927e-01L,
> +w10 = -1.39240539108367641920172649259736394e+00L,
> +w11 = 1.33987701479007233325288857758641761e+01L,
> +w12 = -1.56363596431084279780966590116006255e+02L,
> +w13 = 2.14830978044410267201172332952040777e+03L,
> +w14 = -3.28636067474227378352761516589092334e+04L,
> +w15 = 5.06201257747865138432663574251462485e+05L,
> +w16 = -6.79720123352023636706247599728048344e+06L,
> +w17 = 6.57556601705472106989497289465949255e+07L,
> +w18 = -3.26229058141181783534257632389415580e+08L;
> +
> +static long double
> +sin_pil(long double x)
> +{
> + volatile long double vz;
> + long double y,z;
> + uint64_t lx, n;
> + uint16_t hx;
> +
> + y = -x;
> +
> + vz = y+0x1.p112;
> + z = vz-0x1.p112;
> + if (z == y)
> + return zero;
> +
> + vz = y+0x1.p110;
> + EXTRACT_LDBL128_WORDS(hx,lx,n,vz);
> + z = vz-0x1.p110;
> + if (z > y) {
> + z -= 0.25;
> + n--;
> + }
> + n &= 7;
> + y = y - z + n * 0.25;
> +
> + switch (n) {
> + case 0: y = __kernel_sinl(pi*y,zero,0); break;
> + case 1:
> + case 2: y = __kernel_cosl(pi*(0.5-y),zero); break;
> + case 3:
> + case 4: y = __kernel_sinl(pi*(one-y),zero,0); break;
> + case 5:
> + case 6: y = -__kernel_cosl(pi*(y-1.5),zero); break;
> + default: y = __kernel_sinl(pi*(y-2.0),zero,0); break;
> + }
> + return -y;
> +}
> +
> +long double
> +lgammal_r(long double x, int *signgamp)
> +{
> + long double nadj,p,p1,p2,p3,q,r,t,w,y,z;
> + uint64_t llx,lx;
> + int i;
> + uint16_t hx,ix;
> +
> + EXTRACT_LDBL128_WORDS(hx,lx,llx,x);
> +
> + /* purge +-Inf and NaNs */
> + *signgamp = 1;
> + ix = hx&0x7fff;
> + if(ix==0x7fff) return x*x;
> +
> + /* purge +-0 and tiny arguments */
> + *signgamp = 1-2*(hx>>15);
> + if(ix<0x3fff-116) { /* |x|<2**-(p+3), return -log(|x|) */
> + if((ix|lx|llx)==0)
> + return one/vzero;
> + return -logl(fabsl(x));
> + }
> +
> + /* purge negative integers and start evaluation for other x < 0 */
> + if(hx&0x8000) {
> + *signgamp = 1;
> + if(ix>=0x3fff+112) /* |x|>=2**(p-1), must be -integer */
> + return one/vzero;
> + t = sin_pil(x);
> + if(t==zero) return one/vzero;
> + nadj = logl(pi/fabsl(t*x));
> + if(t<zero) *signgamp = -1;
> + x = -x;
> + }
> +
> + /* purge 1 and 2 */
> + if((ix==0x3fff || ix==0x4000) && (lx|llx)==0) r = 0;
> + /* for x < 2.0 */
> + else if(ix<0x4000) {
> + if(x<=8.9999961853027344e-01) {
> + r = -logl(x);
> + if(x>=7.3159980773925781e-01) {y = 1-x; i= 0;}
> + else if(x>=2.3163998126983643e-01) {y= x-(tc-1); i=1;}
> + else {y = x; i=2;}
> + } else {
> + r = 0;
> + if(x>=1.7316312789916992e+00) {y=2-x;i=0;}
> + else if(x>=1.2316322326660156e+00) {y=x-tc;i=1;}
> + else {y=x-1;i=2;}
> + }
> + switch(i) {
> + case 0:
> + z = y*y;
> + p1 = a0+z*(a2+z*(a4+z*(a6+z*(a8+z*(a10+z*(a12+z*(a14+z*(a16+
> + z*(a18+z*(a20+z*a22))))))))));
> + p2 = z*(a1+z*(a3+z*(a5+z*(a7+z*(a9+z*(a11+z*(a13+z*(a15+
> + z*(a17+z*(a19+z*(a21+z*a23)))))))))));
> + p = y*p1+p2;
> + r += p-y/2; break;
> + case 1:
> + p = t0+y*t1+tt+y*y*(t2+y*(t3+y*(t4+y*(t5+y*(t6+y*(t7+y*(t8+
> + y*(t9+y*(t10+y*(t11+y*(t12+y*(t13+y*(t14+y*(t15+y*(t16+
> + y*(t17+y*(t18+y*(t19+y*(t20+y*(t21+y*(t22+y*(t23+
> + y*(t24+y*(t25+y*(t26+y*(t27+y*(t28+y*(t29+y*(t30+
> + y*(t31+y*t32))))))))))))))))))))))))))))));
> + r += tf + p; break;
> + case 2:
> + p1 = y*(u0+y*(u1+y*(u2+y*(u3+y*(u4+y*(u5+y*(u6+y*(u7+
> + y*(u8+y*(u9+y*u10))))))))));
> + p2 = one+y*(v1+y*(v2+y*(v3+y*(v4+y*(v5+y*(v6+y*(v7+
> + y*(v8+y*(v9+y*(v10+y*v11))))))))));
> + r += p1/p2-y/2;
> + }
> + }
> + /* x < 8.0 */
> + else if(ix<0x4002) {
> + i = x;
> + y = x-i;
> + p = y*(s0+y*(s1+y*(s2+y*(s3+y*(s4+y*(s5+y*(s6+y*(s7+y*(s8+
> + y*(s9+y*(s10+y*s11)))))))))));
> + q = one+y*(r1+y*(r2+y*(r3+y*(r4+y*(r5+y*(r6+y*(r7+y*(r8+
> + y*(r9+y*(r10+y*r11))))))))));
> + r = y/2+p/q;
> + z = 1; /* lgamma(1+s) = log(s) + lgamma(s) */
> + switch(i) {
> + case 7: z *= (y+6); /* FALLTHRU */
> + case 6: z *= (y+5); /* FALLTHRU */
> + case 5: z *= (y+4); /* FALLTHRU */
> + case 4: z *= (y+3); /* FALLTHRU */
> + case 3: z *= (y+2); /* FALLTHRU */
> + r += logl(z); break;
> + }
> + /* 8.0 <= x < 2**(p+3) */
> + } else if (ix<0x3fff+116) {
> + t = logl(x);
> + z = one/x;
> + y = z*z;
> + w = w0+z*(w1+y*(w2+y*(w3+y*(w4+y*(w5+y*(w6+y*(w7+y*(w8+
> + y*(w9+y*(w10+y*(w11+y*(w12+y*(w13+y*(w14+y*(w15+y*(w16+
> + y*(w17+y*w18)))))))))))))))));
> + r = (x-half)*(t-one)+w;
> + /* 2**(p+3) <= x <= inf */
> + } else
> + r = x*(logl(x)-1);
> + if(hx&0x8000) r = nadj - r;
> + return r;
> +}
> diff --git a/newlib/libm/ld128/e_powl.c b/newlib/libm/ld128/e_powl.c
> new file mode 100644
> index 000000000..12b92a1a9
> --- /dev/null
> +++ b/newlib/libm/ld128/e_powl.c
> @@ -0,0 +1,443 @@
> +/*-
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunPro, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +/*
> + * Copyright (c) 2008 Stephen L. Moshier <steve@moshier.net>
> + *
> + * Permission to use, copy, modify, and distribute this software for any
> + * purpose with or without fee is hereby granted, provided that the above
> + * copyright notice and this permission notice appear in all copies.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
> + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
> + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
> + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
> + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
> + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
> + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
> + */
> +
> +/* powl(x,y) return x**y
> + *
> + * n
> + * Method: Let x = 2 * (1+f)
> + * 1. Compute and return log2(x) in two pieces:
> + * log2(x) = w1 + w2,
> + * where w1 has 113-53 = 60 bit trailing zeros.
> + * 2. Perform y*log2(x) = n+y' by simulating multi-precision
> + * arithmetic, where |y'|<=0.5.
> + * 3. Return x**y = 2**n*exp(y'*log2)
> + *
> + * Special cases:
> + * 1. (anything) ** 0 is 1
> + * 2. (anything) ** 1 is itself
> + * 3. (anything) ** NAN is NAN
> + * 4. NAN ** (anything except 0) is NAN
> + * 5. +-(|x| > 1) ** +INF is +INF
> + * 6. +-(|x| > 1) ** -INF is +0
> + * 7. +-(|x| < 1) ** +INF is +0
> + * 8. +-(|x| < 1) ** -INF is +INF
> + * 9. +-1 ** +-INF is NAN
> + * 10. +0 ** (+anything except 0, NAN) is +0
> + * 11. -0 ** (+anything except 0, NAN, odd integer) is +0
> + * 12. +0 ** (-anything except 0, NAN) is +INF
> + * 13. -0 ** (-anything except 0, NAN, odd integer) is +INF
> + * 14. -0 ** (odd integer) = -( +0 ** (odd integer) )
> + * 15. +INF ** (+anything except 0,NAN) is +INF
> + * 16. +INF ** (-anything except 0,NAN) is +0
> + * 17. -INF ** (anything) = -0 ** (-anything)
> + * 18. (-anything) ** (integer) is (-1)**(integer)*(+anything**integer)
> + * 19. (-anything except 0 and inf) ** (non-integer) is NAN
> + *
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include <float.h>
> +#include <math.h>
> +
> +#include "math_private.h"
> +
> +static const long double bp[] = {
> + 1.0L,
> + 1.5L,
> +};
> +
> +/* log_2(1.5) */
> +static const long double dp_h[] = {
> + 0.0,
> + 5.8496250072115607565592654282227158546448E-1L
> +};
> +
> +/* Low part of log_2(1.5) */
> +static const long double dp_l[] = {
> + 0.0,
> + 1.0579781240112554492329533686862998106046E-16L
> +};
> +
> +static const long double zero = 0.0L,
> + one = 1.0L,
> + two = 2.0L,
> + two113 = 1.0384593717069655257060992658440192E34L,
> + huge = 1.0e3000L,
> + tiny = 1.0e-3000L;
> +
> +/* 3/2 log x = 3 z + z^3 + z^3 (z^2 R(z^2))
> + z = (x-1)/(x+1)
> + 1 <= x <= 1.25
> + Peak relative error 2.3e-37 */
> +static const long double LN[] =
> +{
> + -3.0779177200290054398792536829702930623200E1L,
> + 6.5135778082209159921251824580292116201640E1L,
> + -4.6312921812152436921591152809994014413540E1L,
> + 1.2510208195629420304615674658258363295208E1L,
> + -9.9266909031921425609179910128531667336670E-1L
> +};
> +static const long double LD[] =
> +{
> + -5.129862866715009066465422805058933131960E1L,
> + 1.452015077564081884387441590064272782044E2L,
> + -1.524043275549860505277434040464085593165E2L,
> + 7.236063513651544224319663428634139768808E1L,
> + -1.494198912340228235853027849917095580053E1L
> + /* 1.0E0 */
> +};
> +
> +/* exp(x) = 1 + x - x / (1 - 2 / (x - x^2 R(x^2)))
> + 0 <= x <= 0.5
> + Peak relative error 5.7e-38 */
> +static const long double PN[] =
> +{
> + 5.081801691915377692446852383385968225675E8L,
> + 9.360895299872484512023336636427675327355E6L,
> + 4.213701282274196030811629773097579432957E4L,
> + 5.201006511142748908655720086041570288182E1L,
> + 9.088368420359444263703202925095675982530E-3L,
> +};
> +static const long double PD[] =
> +{
> + 3.049081015149226615468111430031590411682E9L,
> + 1.069833887183886839966085436512368982758E8L,
> + 8.259257717868875207333991924545445705394E5L,
> + 1.872583833284143212651746812884298360922E3L,
> + /* 1.0E0 */
> +};
> +
> +static const long double
> + /* ln 2 */
> + lg2 = 6.9314718055994530941723212145817656807550E-1L,
> + lg2_h = 6.9314718055994528622676398299518041312695E-1L,
> + lg2_l = 2.3190468138462996154948554638754786504121E-17L,
> + ovt = 8.0085662595372944372e-0017L,
> + /* 2/(3*log(2)) */
> + cp = 9.6179669392597560490661645400126142495110E-1L,
> + cp_h = 9.6179669392597555432899980587535537779331E-1L,
> + cp_l = 5.0577616648125906047157785230014751039424E-17L;
> +
> +long double
> +powl(long double x, long double y)
> +{
> + long double z, ax, z_h, z_l, p_h, p_l;
> + long double yy1, t1, t2, r, s, t, u, v, w;
> + long double s2, s_h, s_l, t_h, t_l;
> + int32_t i, j, k, yisint, n;
> + u_int32_t ix, iy;
> + int32_t hx, hy;
> + ieee_quad_shape_type o, p, q;
> +
> + p.value = x;
> + hx = p.parts32.mswhi;
> + ix = hx & 0x7fffffff;
> +
> + q.value = y;
> + hy = q.parts32.mswhi;
> + iy = hy & 0x7fffffff;
> +
> +
> + /* y==zero: x**0 = 1 */
> + if ((iy | q.parts32.mswlo | q.parts32.lswhi | q.parts32.lswlo) == 0)
> + return one;
> +
> + /* 1.0**y = 1; -1.0**+-Inf = 1 */
> + if (x == one)
> + return one;
> + if (x == -1.0L && iy == 0x7fff0000
> + && (q.parts32.mswlo | q.parts32.lswhi | q.parts32.lswlo) == 0)
> + return one;
> +
> + /* +-NaN return x+y */
> + if ((ix > 0x7fff0000)
> + || ((ix == 0x7fff0000)
> + && ((p.parts32.mswlo | p.parts32.lswhi | p.parts32.lswlo) != 0))
> + || (iy > 0x7fff0000)
> + || ((iy == 0x7fff0000)
> + && ((q.parts32.mswlo | q.parts32.lswhi | q.parts32.lswlo) != 0)))
> + return nan_mix(x, y);
> +
> + /* determine if y is an odd int when x < 0
> + * yisint = 0 ... y is not an integer
> + * yisint = 1 ... y is an odd int
> + * yisint = 2 ... y is an even int
> + */
> + yisint = 0;
> + if (hx < 0)
> + {
> + if (iy >= 0x40700000) /* 2^113 */
> + yisint = 2; /* even integer y */
> + else if (iy >= 0x3fff0000) /* 1.0 */
> + {
> + if (floorl (y) == y)
> + {
> + z = 0.5 * y;
> + if (floorl (z) == z)
> + yisint = 2;
> + else
> + yisint = 1;
> + }
> + }
> + }
> +
> + /* special value of y */
> + if ((q.parts32.mswlo | q.parts32.lswhi | q.parts32.lswlo) == 0)
> + {
> + if (iy == 0x7fff0000) /* y is +-inf */
> + {
> + if (((ix - 0x3fff0000) | p.parts32.mswlo | p.parts32.lswhi |
> + p.parts32.lswlo) == 0)
> + return y - y; /* +-1**inf is NaN */
> + else if (ix >= 0x3fff0000) /* (|x|>1)**+-inf = inf,0 */
> + return (hy >= 0) ? y : zero;
> + else /* (|x|<1)**-,+inf = inf,0 */
> + return (hy < 0) ? -y : zero;
> + }
> + if (iy == 0x3fff0000)
> + { /* y is +-1 */
> + if (hy < 0)
> + return one / x;
> + else
> + return x;
> + }
> + if (hy == 0x40000000)
> + return x * x; /* y is 2 */
> + if (hy == 0x3ffe0000)
> + { /* y is 0.5 */
> + if (hx >= 0) /* x >= +0 */
> + return sqrtl (x);
> + }
> + }
> +
> + ax = fabsl (x);
> + /* special value of x */
> + if ((p.parts32.mswlo | p.parts32.lswhi | p.parts32.lswlo) == 0)
> + {
> + if (ix == 0x7fff0000 || ix == 0 || ix == 0x3fff0000)
> + {
> + z = ax; /*x is +-0,+-inf,+-1 */
> + if (hy < 0)
> + z = one / z; /* z = (1/|x|) */
> + if (hx < 0)
> + {
> + if (((ix - 0x3fff0000) | yisint) == 0)
> + {
> + z = (z - z) / (z - z); /* (-1)**non-int is NaN */
> + }
> + else if (yisint == 1)
> + z = -z; /* (x<0)**odd = -(|x|**odd) */
> + }
> + return z;
> + }
> + }
> +
> + /* (x<0)**(non-int) is NaN */
> + if (((((u_int32_t) hx >> 31) - 1) | yisint) == 0)
> + return (x - x) / (x - x);
> +
> + /* |y| is huge.
> + 2^-16495 = 1/2 of smallest representable value.
> + If (1 - 1/131072)^y underflows, y > 1.4986e9 */
> + if (iy > 0x401d654b)
> + {
> + /* if (1 - 2^-113)^y underflows, y > 1.1873e38 */
> + if (iy > 0x407d654b)
> + {
> + if (ix <= 0x3ffeffff)
> + return (hy < 0) ? huge * huge : tiny * tiny;
> + if (ix >= 0x3fff0000)
> + return (hy > 0) ? huge * huge : tiny * tiny;
> + }
> + /* over/underflow if x is not close to one */
> + if (ix < 0x3ffeffff)
> + return (hy < 0) ? huge * huge : tiny * tiny;
> + if (ix > 0x3fff0000)
> + return (hy > 0) ? huge * huge : tiny * tiny;
> + }
> +
> + n = 0;
> + /* take care subnormal number */
> + if (ix < 0x00010000)
> + {
> + ax *= two113;
> + n -= 113;
> + o.value = ax;
> + ix = o.parts32.mswhi;
> + }
> + n += ((ix) >> 16) - 0x3fff;
> + j = ix & 0x0000ffff;
> + /* determine interval */
> + ix = j | 0x3fff0000; /* normalize ix */
> + if (j <= 0x3988)
> + k = 0; /* |x|<sqrt(3/2) */
> + else if (j < 0xbb67)
> + k = 1; /* |x|<sqrt(3) */
> + else
> + {
> + k = 0;
> + n += 1;
> + ix -= 0x00010000;
> + }
> +
> + o.value = ax;
> + o.parts32.mswhi = ix;
> + ax = o.value;
> +
> + /* compute s = s_h+s_l = (x-1)/(x+1) or (x-1.5)/(x+1.5) */
> + u = ax - bp[k]; /* bp[0]=1.0, bp[1]=1.5 */
> + v = one / (ax + bp[k]);
> + s = u * v;
> + s_h = s;
> +
> + o.value = s_h;
> + o.parts32.lswlo = 0;
> + o.parts32.lswhi &= 0xf8000000;
> + s_h = o.value;
> + /* t_h=ax+bp[k] High */
> + t_h = ax + bp[k];
> + o.value = t_h;
> + o.parts32.lswlo = 0;
> + o.parts32.lswhi &= 0xf8000000;
> + t_h = o.value;
> + t_l = ax - (t_h - bp[k]);
> + s_l = v * ((u - s_h * t_h) - s_h * t_l);
> + /* compute log(ax) */
> + s2 = s * s;
> + u = LN[0] + s2 * (LN[1] + s2 * (LN[2] + s2 * (LN[3] + s2 * LN[4])));
> + v = LD[0] + s2 * (LD[1] + s2 * (LD[2] + s2 * (LD[3] + s2 * (LD[4] + s2))));
> + r = s2 * s2 * u / v;
> + r += s_l * (s_h + s);
> + s2 = s_h * s_h;
> + t_h = 3.0 + s2 + r;
> + o.value = t_h;
> + o.parts32.lswlo = 0;
> + o.parts32.lswhi &= 0xf8000000;
> + t_h = o.value;
> + t_l = r - ((t_h - 3.0) - s2);
> + /* u+v = s*(1+...) */
> + u = s_h * t_h;
> + v = s_l * t_h + t_l * s;
> + /* 2/(3log2)*(s+...) */
> + p_h = u + v;
> + o.value = p_h;
> + o.parts32.lswlo = 0;
> + o.parts32.lswhi &= 0xf8000000;
> + p_h = o.value;
> + p_l = v - (p_h - u);
> + z_h = cp_h * p_h; /* cp_h+cp_l = 2/(3*log2) */
> + z_l = cp_l * p_h + p_l * cp + dp_l[k];
> + /* log2(ax) = (s+..)*2/(3*log2) = n + dp_h + z_h + z_l */
> + t = (long double) n;
> + t1 = (((z_h + z_l) + dp_h[k]) + t);
> + o.value = t1;
> + o.parts32.lswlo = 0;
> + o.parts32.lswhi &= 0xf8000000;
> + t1 = o.value;
> + t2 = z_l - (((t1 - t) - dp_h[k]) - z_h);
> +
> + /* s (sign of result -ve**odd) = -1 else = 1 */
> + s = one;
> + if (((((u_int32_t) hx >> 31) - 1) | (yisint - 1)) == 0)
> + s = -one; /* (-ve)**(odd int) */
> +
> + /* split up y into yy1+y2 and compute (yy1+y2)*(t1+t2) */
> + yy1 = y;
> + o.value = yy1;
> + o.parts32.lswlo = 0;
> + o.parts32.lswhi &= 0xf8000000;
> + yy1 = o.value;
> + p_l = (y - yy1) * t1 + y * t2;
> + p_h = yy1 * t1;
> + z = p_l + p_h;
> + o.value = z;
> + j = o.parts32.mswhi;
> + if (j >= 0x400d0000) /* z >= 16384 */
> + {
> + /* if z > 16384 */
> + if (((j - 0x400d0000) | o.parts32.mswlo | o.parts32.lswhi |
> + o.parts32.lswlo) != 0)
> + return s * huge * huge; /* overflow */
> + else
> + {
> + if (p_l + ovt > z - p_h)
> + return s * huge * huge; /* overflow */
> + }
> + }
> + else if ((j & 0x7fffffff) >= 0x400d01b9) /* z <= -16495 */
> + {
> + /* z < -16495 */
> + if (((j - 0xc00d01bc) | o.parts32.mswlo | o.parts32.lswhi |
> + o.parts32.lswlo)
> + != 0)
> + return s * tiny * tiny; /* underflow */
> + else
> + {
> + if (p_l <= z - p_h)
> + return s * tiny * tiny; /* underflow */
> + }
> + }
> + /* compute 2**(p_h+p_l) */
> + i = j & 0x7fffffff;
> + k = (i >> 16) - 0x3fff;
> + n = 0;
> + if (i > 0x3ffe0000)
> + { /* if |z| > 0.5, set n = [z+0.5] */
> + n = floorl (z + 0.5L);
> + t = n;
> + p_h -= t;
> + }
> + t = p_l + p_h;
> + o.value = t;
> + o.parts32.lswlo = 0;
> + o.parts32.lswhi &= 0xf8000000;
> + t = o.value;
> + u = t * lg2_h;
> + v = (p_l - (t - p_h)) * lg2 + t * lg2_l;
> + z = u + v;
> + w = v - (z - u);
> + /* exp(z) */
> + t = z * z;
> + u = PN[0] + t * (PN[1] + t * (PN[2] + t * (PN[3] + t * PN[4])));
> + v = PD[0] + t * (PD[1] + t * (PD[2] + t * (PD[3] + t)));
> + t1 = z - t * u / v;
> + r = (z * t1) / (t1 - two) - (w + z * w);
> + z = one - (r - z);
> + o.value = z;
> + j = o.parts32.mswhi;
> + j += (n << 16);
> + if ((j >> 16) <= 0)
> + z = scalbnl (z, n); /* subnormal output */
> + else
> + {
> + o.parts32.mswhi = j;
> + z = o.value;
> + }
> + return s * z;
> +}
> diff --git a/newlib/libm/ld128/e_rem_pio2l.h b/newlib/libm/ld128/e_rem_pio2l.h
> new file mode 100644
> index 000000000..7516ced49
> --- /dev/null
> +++ b/newlib/libm/ld128/e_rem_pio2l.h
> @@ -0,0 +1,135 @@
> +/* From: @(#)e_rem_pio2.c 1.4 95/01/18 */
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + * Copyright (c) 2008 Steven G. Kargl, David Schultz, Bruce D. Evans.
> + *
> + * Developed at SunSoft, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + *
> + * Optimized by Bruce D. Evans.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/* ld128 version of __ieee754_rem_pio2l(x,y)
> + *
> + * return the remainder of x rem pi/2 in y[0]+y[1]
> + * use __kernel_rem_pio2()
> + */
> +
> +#include <float.h>
> +
> +#include "math.h"
> +#include "math_private.h"
> +#include "../ld/fpmath.h"
> +
> +#define BIAS (LDBL_MAX_EXP - 1)
> +
> +/*
> + * XXX need to verify that nonzero integer multiples of pi/2 within the
> + * range get no closer to a long double than 2**-140, or that
> + * ilogb(x) + ilogb(min_delta) < 45 - -140.
> + */
> +/*
> + * invpio2: 113 bits of 2/pi
> + * pio2_1: first 68 bits of pi/2
> + * pio2_1t: pi/2 - pio2_1
> + * pio2_2: second 68 bits of pi/2
> + * pio2_2t: pi/2 - (pio2_1+pio2_2)
> + * pio2_3: third 68 bits of pi/2
> + * pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3)
> + */
> +
> +static const double
> +zero = 0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */
> +two24 = 1.67772160000000000000e+07; /* 0x41700000, 0x00000000 */
> +
> +static const long double
> +invpio2 = 6.3661977236758134307553505349005747e-01L, /* 0x145f306dc9c882a53f84eafa3ea6a.0p-113 */
> +pio2_1 = 1.5707963267948966192292994253909555e+00L, /* 0x1921fb54442d18469800000000000.0p-112 */
> +pio2_1t = 2.0222662487959507323996846200947577e-21L, /* 0x13198a2e03707344a4093822299f3.0p-181 */
> +pio2_2 = 2.0222662487959507323994779168837751e-21L, /* 0x13198a2e03707344a400000000000.0p-181 */
> +pio2_2t = 2.0670321098263988236496903051604844e-43L, /* 0x127044533e63a0105df531d89cd91.0p-254 */
> +pio2_3 = 2.0670321098263988236499468110329591e-43L, /* 0x127044533e63a0105e00000000000.0p-254 */
> +pio2_3t = -2.5650587247459238361625433492959285e-65L; /* -0x159c4ec64ddaeb5f78671cbfb2210.0p-327 */
> +
> +static inline __always_inline int
> +__ieee754_rem_pio2l(long double x, long double *y)
> +{
> + union IEEEl2bits u,u1;
> + long double z,w,t,r,fn;
> + double tx[5],ty[3];
> + int64_t n;
> + int e0,ex,i,j,nx;
> + int16_t expsign;
> +
> + u.e = x;
> + expsign = u.xbits.expsign;
> + ex = expsign & 0x7fff;
> + if (ex < BIAS + 45 || ex == BIAS + 45 &&
> + u.bits.manh < 0x921fb54442d1LL) {
> + /* |x| ~< 2^45*(pi/2), medium size */
> + /* TODO: use only double precision for fn, as in expl(). */
> + fn = rnintl(x * invpio2);
> + n = i64rint(fn);
> + r = x-fn*pio2_1;
> + w = fn*pio2_1t; /* 1st round good to 180 bit */
> + {
> + union IEEEl2bits u2;
> + int ex1;
> + j = ex;
> + y[0] = r-w;
> + u2.e = y[0];
> + ex1 = u2.xbits.expsign & 0x7fff;
> + i = j-ex1;
> + if(i>51) { /* 2nd iteration needed, good to 248 */
> + t = r;
> + w = fn*pio2_2;
> + r = t-w;
> + w = fn*pio2_2t-((t-r)-w);
> + y[0] = r-w;
> + u2.e = y[0];
> + ex1 = u2.xbits.expsign & 0x7fff;
> + i = j-ex1;
> + if(i>119) { /* 3rd iteration need, 316 bits acc */
> + t = r; /* will cover all possible cases */
> + w = fn*pio2_3;
> + r = t-w;
> + w = fn*pio2_3t-((t-r)-w);
> + y[0] = r-w;
> + }
> + }
> + }
> + y[1] = (r-y[0])-w;
> + return n;
> + }
> + /*
> + * all other (large) arguments
> + */
> + if(ex==0x7fff) { /* x is inf or NaN */
> + y[0]=y[1]=x-x; return 0;
> + }
> + /* set z = scalbn(|x|,ilogb(x)-23) */
> + u1.e = x;
> + e0 = ex - BIAS - 23; /* e0 = ilogb(|x|)-23; */
> + u1.xbits.expsign = ex - e0;
> + z = u1.e;
> + for(i=0;i<4;i++) {
> + tx[i] = (double)((int32_t)(z));
> + z = (z-tx[i])*two24;
> + }
> + tx[4] = z;
> + nx = 5;
> + while(tx[nx-1]==zero) nx--; /* skip zero term */
> + n = __kernel_rem_pio2(tx,ty,e0,nx,3);
> + t = (long double)ty[2] + ty[1];
> + r = t + ty[0];
> + w = ty[0] - (r - t);
> + if(expsign<0) {y[0] = -r; y[1] = -w; return -n;}
> + y[0] = r; y[1] = w; return n;
> +}
> diff --git a/newlib/libm/ld128/invtrig.c b/newlib/libm/ld128/invtrig.c
> new file mode 100644
> index 000000000..ab93732c8
> --- /dev/null
> +++ b/newlib/libm/ld128/invtrig.c
> @@ -0,0 +1,102 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2008 David Schultz <das@FreeBSD.ORG>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include "invtrig.h"
> +
> +/*
> + * asinl() and acosl()
> + */
> +const long double
> +pS0 = 1.66666666666666666666666666666700314e-01L,
> +pS1 = -7.32816946414566252574527475428622708e-01L,
> +pS2 = 1.34215708714992334609030036562143589e+00L,
> +pS3 = -1.32483151677116409805070261790752040e+00L,
> +pS4 = 7.61206183613632558824485341162121989e-01L,
> +pS5 = -2.56165783329023486777386833928147375e-01L,
> +pS6 = 4.80718586374448793411019434585413855e-02L,
> +pS7 = -4.42523267167024279410230886239774718e-03L,
> +pS8 = 1.44551535183911458253205638280410064e-04L,
> +pS9 = -2.10558957916600254061591040482706179e-07L,
> +qS1 = -4.84690167848739751544716485245697428e+00L,
> +qS2 = 9.96619113536172610135016921140206980e+00L,
> +qS3 = -1.13177895428973036660836798461641458e+01L,
> +qS4 = 7.74004374389488266169304117714658761e+00L,
> +qS5 = -3.25871986053534084709023539900339905e+00L,
> +qS6 = 8.27830318881232209752469022352928864e-01L,
> +qS7 = -1.18768052702942805423330715206348004e-01L,
> +qS8 = 8.32600764660522313269101537926539470e-03L,
> +qS9 = -1.99407384882605586705979504567947007e-04L;
> +
> +/*
> + * atanl()
> + */
> +const long double atanhi[] = {
> + 4.63647609000806116214256231461214397e-01L,
> + 7.85398163397448309615660845819875699e-01L,
> + 9.82793723247329067985710611014666038e-01L,
> + 1.57079632679489661923132169163975140e+00L,
> +};
> +
> +const long double atanlo[] = {
> + 4.89509642257333492668618435220297706e-36L,
> + 2.16795253253094525619926100651083806e-35L,
> + -2.31288434538183565909319952098066272e-35L,
> + 4.33590506506189051239852201302167613e-35L,
> +};
> +
> +const long double aT[] = {
> + 3.33333333333333333333333333333333125e-01L,
> + -1.99999999999999999999999999999180430e-01L,
> + 1.42857142857142857142857142125269827e-01L,
> + -1.11111111111111111111110834490810169e-01L,
> + 9.09090909090909090908522355708623681e-02L,
> + -7.69230769230769230696553844935357021e-02L,
> + 6.66666666666666660390096773046256096e-02L,
> + -5.88235294117646671706582985209643694e-02L,
> + 5.26315789473666478515847092020327506e-02L,
> + -4.76190476189855517021024424991436144e-02L,
> + 4.34782608678695085948531993458097026e-02L,
> + -3.99999999632663469330634215991142368e-02L,
> + 3.70370363987423702891250829918659723e-02L,
> + -3.44827496515048090726669907612335954e-02L,
> + 3.22579620681420149871973710852268528e-02L,
> + -3.03020767654269261041647570626778067e-02L,
> + 2.85641979882534783223403715930946138e-02L,
> + -2.69824879726738568189929461383741323e-02L,
> + 2.54194698498808542954187110873675769e-02L,
> + -2.35083879708189059926183138130183215e-02L,
> + 2.04832358998165364349957325067131428e-02L,
> + -1.54489555488544397858507248612362957e-02L,
> + 8.64492360989278761493037861575248038e-03L,
> + -2.58521121597609872727919154569765469e-03L,
> +};
> +
> +const long double pi_lo = 8.67181013012378102479704402604335225e-35L;
> diff --git a/newlib/libm/ld128/invtrig.h b/newlib/libm/ld128/invtrig.h
> new file mode 100644
> index 000000000..423b56847
> --- /dev/null
> +++ b/newlib/libm/ld128/invtrig.h
> @@ -0,0 +1,115 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2008 David Schultz <das@FreeBSD.ORG>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + *
> + * $FreeBSD$
> + */
> +
> +#include <float.h>
> +
> +#include "fpmath.h"
> +
> +#define BIAS (LDBL_MAX_EXP - 1)
> +#define MANH_SIZE (LDBL_MANH_SIZE + 1)
> +
> +/* Approximation thresholds. */
> +#define ASIN_LINEAR (BIAS - 56) /* 2**-56 */
> +#define ACOS_CONST (BIAS - 113) /* 2**-113 */
> +#define ATAN_CONST (BIAS + 113) /* 2**113 */
> +#define ATAN_LINEAR (BIAS - 56) /* 2**-56 */
> +
> +/* 0.95 */
> +#define THRESH ((0xe666666666666666ULL>>(64-(MANH_SIZE-1)))|LDBL_NBIT)
> +
> +/* Constants shared by the long double inverse trig functions. */
> +#define pS0 _ItL_pS0
> +#define pS1 _ItL_pS1
> +#define pS2 _ItL_pS2
> +#define pS3 _ItL_pS3
> +#define pS4 _ItL_pS4
> +#define pS5 _ItL_pS5
> +#define pS6 _ItL_pS6
> +#define pS7 _ItL_pS7
> +#define pS8 _ItL_pS8
> +#define pS9 _ItL_pS9
> +#define qS1 _ItL_qS1
> +#define qS2 _ItL_qS2
> +#define qS3 _ItL_qS3
> +#define qS4 _ItL_qS4
> +#define qS5 _ItL_qS5
> +#define qS6 _ItL_qS6
> +#define qS7 _ItL_qS7
> +#define qS8 _ItL_qS8
> +#define qS9 _ItL_qS9
> +#define atanhi _ItL_atanhi
> +#define atanlo _ItL_atanlo
> +#define aT _ItL_aT
> +#define pi_lo _ItL_pi_lo
> +
> +#define pio2_hi atanhi[3]
> +#define pio2_lo atanlo[3]
> +#define pio4_hi atanhi[1]
> +
> +/* Constants shared by the long double inverse trig functions. */
> +extern const long double pS0, pS1, pS2, pS3, pS4, pS5, pS6, pS7, pS8, pS9;
> +extern const long double qS1, qS2, qS3, qS4, qS5, qS6, qS7, qS8, qS9;
> +extern const long double atanhi[], atanlo[], aT[];
> +extern const long double pi_lo;
> +
> +static inline long double
> +P(long double x)
> +{
> +
> + return (x * (pS0 + x * (pS1 + x * (pS2 + x * (pS3 + x * \
> + (pS4 + x * (pS5 + x * (pS6 + x * (pS7 + x * (pS8 + x * \
> + pS9))))))))));
> +}
> +
> +static inline long double
> +Q(long double x)
> +{
> +
> + return (1.0 + x * (qS1 + x * (qS2 + x * (qS3 + x * (qS4 + x * \
> + (qS5 + x * (qS6 + x * (qS7 + x * (qS8 + x * qS9)))))))));
> +}
> +
> +static inline long double
> +T_even(long double x)
> +{
> +
> + return (aT[0] + x * (aT[2] + x * (aT[4] + x * (aT[6] + x * \
> + (aT[8] + x * (aT[10] + x * (aT[12] + x * (aT[14] + x * \
> + (aT[16] + x * (aT[18] + x * (aT[20] + x * aT[22])))))))))));
> +}
> +
> +static inline long double
> +T_odd(long double x)
> +{
> +
> + return (aT[1] + x * (aT[3] + x * (aT[5] + x * (aT[7] + x * \
> + (aT[9] + x * (aT[11] + x * (aT[13] + x * (aT[15] + x * \
> + (aT[17] + x * (aT[19] + x * (aT[21] + x * aT[23])))))))))));
> +}
> diff --git a/newlib/libm/ld128/k_cosl.c b/newlib/libm/ld128/k_cosl.c
> new file mode 100644
> index 000000000..422357bf8
> --- /dev/null
> +++ b/newlib/libm/ld128/k_cosl.c
> @@ -0,0 +1,59 @@
> +/* From: @(#)k_cos.c 1.3 95/01/18 */
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + * Copyright (c) 2008 Steven G. Kargl, David Schultz, Bruce D. Evans.
> + *
> + * Developed at SunSoft, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * ld128 version of k_cos.c. See ../src/k_cos.c for most comments.
> + */
> +
> +#include "math_private.h"
> +
> +/*
> + * Domain [-0.7854, 0.7854], range ~[-1.17e-39, 1.19e-39]:
> + * |cos(x) - c(x))| < 2**-129.3
> + *
> + * 113-bit precision requires more care than 64-bit precision, since
> + * simple methods give a minimax polynomial with coefficient for x^2
> + * that is 1 ulp below 0.5, but we want it to be precisely 0.5. See
> + * ../ld80/k_cosl.c for more details.
> + */
> +static const double
> +one = 1.0;
> +static const long double
> +C1 = 4.16666666666666666666666666666666667e-02L,
> +C2 = -1.38888888888888888888888888888888834e-03L,
> +C3 = 2.48015873015873015873015873015446795e-05L,
> +C4 = -2.75573192239858906525573190949988493e-07L,
> +C5 = 2.08767569878680989792098886701451072e-09L,
> +C6 = -1.14707455977297247136657111139971865e-11L,
> +C7 = 4.77947733238738518870113294139830239e-14L,
> +C8 = -1.56192069685858079920640872925306403e-16L,
> +C9 = 4.11031762320473354032038893429515732e-19L,
> +C10= -8.89679121027589608738005163931958096e-22L,
> +C11= 1.61171797801314301767074036661901531e-24L,
> +C12= -2.46748624357670948912574279501044295e-27L;
> +
> +long double
> +__kernel_cosl(long double x, long double y)
> +{
> + long double hz,z,r,w;
> +
> + z = x*x;
> + r = z*(C1+z*(C2+z*(C3+z*(C4+z*(C5+z*(C6+z*(C7+
> + z*(C8+z*(C9+z*(C10+z*(C11+z*C12)))))))))));
> + hz = 0.5*z;
> + w = one-hz;
> + return w + (((one-w)-hz) + (z*r-x*y));
> +}
> diff --git a/newlib/libm/ld128/k_expl.h b/newlib/libm/ld128/k_expl.h
> new file mode 100644
> index 000000000..159338fe3
> --- /dev/null
> +++ b/newlib/libm/ld128/k_expl.h
> @@ -0,0 +1,324 @@
> +/* from: FreeBSD: head/lib/msun/ld128/s_expl.c 251345 2013-06-03 20:09:22Z kargl */
> +
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2009-2013 Steven G. Kargl
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice unmodified, this list of conditions, and the following
> + * disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
> + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
> + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
> + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
> + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
> + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
> + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + *
> + * Optimized by Bruce D. Evans.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * ld128 version of k_expl.h. See ../ld80/s_expl.c for most comments.
> + *
> + * See ../src/e_exp.c and ../src/k_exp.h for precision-independent comments
> + * about the secondary kernels.
> + */
> +
> +#define INTERVALS 128
> +#define LOG2_INTERVALS 7
> +#define BIAS (LDBL_MAX_EXP - 1)
> +
> +static const double
> +/*
> + * ln2/INTERVALS = L1+L2 (hi+lo decomposition for multiplication). L1 must
> + * have at least 22 (= log2(|LDBL_MIN_EXP-extras|) + log2(INTERVALS)) lowest
> + * bits zero so that multiplication of it by n is exact.
> + */
> +INV_L = 1.8466496523378731e+2, /* 0x171547652b82fe.0p-45 */
> +L2 = -1.0253670638894731e-29; /* -0x1.9ff0342542fc3p-97 */
> +static const long double
> +/* 0x1.62e42fefa39ef35793c768000000p-8 */
> +L1 = 5.41521234812457272982212595914567508e-3L;
> +
> +/*
> + * XXX values in hex in comments have been lost (or were never present)
> + * from here.
> + */
> +static const long double
> +/*
> + * Domain [-0.002708, 0.002708], range ~[-2.4021e-38, 2.4234e-38]:
> + * |exp(x) - p(x)| < 2**-124.9
> + * (0.002708 is ln2/(2*INTERVALS) rounded up a little).
> + *
> + * XXX the coeffs aren't very carefully rounded, and I get 3.6 more bits.
> + */
> +A2 = 0.5,
> +A3 = 1.66666666666666666666666666651085500e-1L,
> +A4 = 4.16666666666666666666666666425885320e-2L,
> +A5 = 8.33333333333333333334522877160175842e-3L,
> +A6 = 1.38888888888888888889971139751596836e-3L;
> +
> +static const double
> +A7 = 1.9841269841269470e-4, /* 0x1.a01a01a019f91p-13 */
> +A8 = 2.4801587301585286e-5, /* 0x1.71de3ec75a967p-19 */
> +A9 = 2.7557324277411235e-6, /* 0x1.71de3ec75a967p-19 */
> +A10 = 2.7557333722375069e-7; /* 0x1.27e505ab56259p-22 */
> +
> +static const struct {
> + /*
> + * hi must be rounded to at most 106 bits so that multiplication
> + * by r1 in expm1l() is exact, but it is rounded to 88 bits due to
> + * historical accidents.
> + *
> + * XXX it is wasteful to use long double for both hi and lo. ld128
> + * exp2l() uses only float for lo (in a very differently organized
> + * table; ld80 exp2l() is different again. It uses 2 doubles in a
> + * table organized like this one. 1 double and 1 float would
> + * suffice). There are different packing/locality/alignment/caching
> + * problems with these methods.
> + *
> + * XXX C's bad %a format makes the bits unreadable. They happen
> + * to all line up for the hi values 1 before the point and 88
> + * in 22 nybbles, but for the low values the nybbles are shifted
> + * randomly.
> + */
> + long double hi;
> + long double lo;
> +} tbl[INTERVALS] = {
> + 0x1p0L, 0x0p0L,
> + 0x1.0163da9fb33356d84a66aep0L, 0x3.36dcdfa4003ec04c360be2404078p-92L,
> + 0x1.02c9a3e778060ee6f7cacap0L, 0x4.f7a29bde93d70a2cabc5cb89ba10p-92L,
> + 0x1.04315e86e7f84bd738f9a2p0L, 0xd.a47e6ed040bb4bfc05af6455e9b8p-96L,
> + 0x1.059b0d31585743ae7c548ep0L, 0xb.68ca417fe53e3495f7df4baf84a0p-92L,
> + 0x1.0706b29ddf6ddc6dc403a8p0L, 0x1.d87b27ed07cb8b092ac75e311753p-88L,
> + 0x1.0874518759bc808c35f25cp0L, 0x1.9427fa2b041b2d6829d8993a0d01p-88L,
> + 0x1.09e3ecac6f3834521e060cp0L, 0x5.84d6b74ba2e023da730e7fccb758p-92L,
> + 0x1.0b5586cf9890f6298b92b6p0L, 0x1.1842a98364291408b3ceb0a2a2bbp-88L,
> + 0x1.0cc922b7247f7407b705b8p0L, 0x9.3dc5e8aac564e6fe2ef1d431fd98p-92L,
> + 0x1.0e3ec32d3d1a2020742e4ep0L, 0x1.8af6a552ac4b358b1129e9f966a4p-88L,
> + 0x1.0fb66affed31af232091dcp0L, 0x1.8a1426514e0b627bda694a400a27p-88L,
> + 0x1.11301d0125b50a4ebbf1aep0L, 0xd.9318ceac5cc47ab166ee57427178p-92L,
> + 0x1.12abdc06c31cbfb92bad32p0L, 0x4.d68e2f7270bdf7cedf94eb1cb818p-92L,
> + 0x1.1429aaea92ddfb34101942p0L, 0x1.b2586d01844b389bea7aedd221d4p-88L,
> + 0x1.15a98c8a58e512480d573cp0L, 0x1.d5613bf92a2b618ee31b376c2689p-88L,
> + 0x1.172b83c7d517adcdf7c8c4p0L, 0x1.0eb14a792035509ff7d758693f24p-88L,
> + 0x1.18af9388c8de9bbbf70b9ap0L, 0x3.c2505c97c0102e5f1211941d2840p-92L,
> + 0x1.1a35beb6fcb753cb698f68p0L, 0x1.2d1c835a6c30724d5cfae31b84e5p-88L,
> + 0x1.1bbe084045cd39ab1e72b4p0L, 0x4.27e35f9acb57e473915519a1b448p-92L,
> + 0x1.1d4873168b9aa7805b8028p0L, 0x9.90f07a98b42206e46166cf051d70p-92L,
> + 0x1.1ed5022fcd91cb8819ff60p0L, 0x1.121d1e504d36c47474c9b7de6067p-88L,
> + 0x1.2063b88628cd63b8eeb028p0L, 0x1.50929d0fc487d21c2b84004264dep-88L,
> + 0x1.21f49917ddc962552fd292p0L, 0x9.4bdb4b61ea62477caa1dce823ba0p-92L,
> + 0x1.2387a6e75623866c1fadb0p0L, 0x1.c15cb593b0328566902df69e4de2p-88L,
> + 0x1.251ce4fb2a63f3582ab7dep0L, 0x9.e94811a9c8afdcf796934bc652d0p-92L,
> + 0x1.26b4565e27cdd257a67328p0L, 0x1.d3b249dce4e9186ddd5ff44e6b08p-92L,
> + 0x1.284dfe1f5638096cf15cf0p0L, 0x3.ca0967fdaa2e52d7c8106f2e262cp-92L,
> + 0x1.29e9df51fdee12c25d15f4p0L, 0x1.a24aa3bca890ac08d203fed80a07p-88L,
> + 0x1.2b87fd0dad98ffddea4652p0L, 0x1.8fcab88442fdc3cb6de4519165edp-88L,
> + 0x1.2d285a6e4030b40091d536p0L, 0xd.075384589c1cd1b3e4018a6b1348p-92L,
> + 0x1.2ecafa93e2f5611ca0f45cp0L, 0x1.523833af611bdcda253c554cf278p-88L,
> + 0x1.306fe0a31b7152de8d5a46p0L, 0x3.05c85edecbc27343629f502f1af2p-92L,
> + 0x1.32170fc4cd8313539cf1c2p0L, 0x1.008f86dde3220ae17a005b6412bep-88L,
> + 0x1.33c08b26416ff4c9c8610cp0L, 0x1.96696bf95d1593039539d94d662bp-88L,
> + 0x1.356c55f929ff0c94623476p0L, 0x3.73af38d6d8d6f9506c9bbc93cbc0p-92L,
> + 0x1.371a7373aa9caa7145502ep0L, 0x1.4547987e3e12516bf9c699be432fp-88L,
> + 0x1.38cae6d05d86585a9cb0d8p0L, 0x1.bed0c853bd30a02790931eb2e8f0p-88L,
> + 0x1.3a7db34e59ff6ea1bc9298p0L, 0x1.e0a1d336163fe2f852ceeb134067p-88L,
> + 0x1.3c32dc313a8e484001f228p0L, 0xb.58f3775e06ab66353001fae9fca0p-92L,
> + 0x1.3dea64c12342235b41223ep0L, 0x1.3d773fba2cb82b8244267c54443fp-92L,
> + 0x1.3fa4504ac801ba0bf701aap0L, 0x4.1832fb8c1c8dbdff2c49909e6c60p-92L,
> + 0x1.4160a21f72e29f84325b8ep0L, 0x1.3db61fb352f0540e6ba05634413ep-88L,
> + 0x1.431f5d950a896dc7044394p0L, 0x1.0ccec81e24b0caff7581ef4127f7p-92L,
> + 0x1.44e086061892d03136f408p0L, 0x1.df019fbd4f3b48709b78591d5cb5p-88L,
> + 0x1.46a41ed1d005772512f458p0L, 0x1.229d97df404ff21f39c1b594d3a8p-88L,
> + 0x1.486a2b5c13cd013c1a3b68p0L, 0x1.062f03c3dd75ce8757f780e6ec99p-88L,
> + 0x1.4a32af0d7d3de672d8bcf4p0L, 0x6.f9586461db1d878b1d148bd3ccb8p-92L,
> + 0x1.4bfdad5362a271d4397afep0L, 0xc.42e20e0363ba2e159c579f82e4b0p-92L,
> + 0x1.4dcb299fddd0d63b36ef1ap0L, 0x9.e0cc484b25a5566d0bd5f58ad238p-92L,
> + 0x1.4f9b2769d2ca6ad33d8b68p0L, 0x1.aa073ee55e028497a329a7333dbap-88L,
> + 0x1.516daa2cf6641c112f52c8p0L, 0x4.d822190e718226177d7608d20038p-92L,
> + 0x1.5342b569d4f81df0a83c48p0L, 0x1.d86a63f4e672a3e429805b049465p-88L,
> + 0x1.551a4ca5d920ec52ec6202p0L, 0x4.34ca672645dc6c124d6619a87574p-92L,
> + 0x1.56f4736b527da66ecb0046p0L, 0x1.64eb3c00f2f5ab3d801d7cc7272dp-88L,
> + 0x1.58d12d497c7fd252bc2b72p0L, 0x1.43bcf2ec936a970d9cc266f0072fp-88L,
> + 0x1.5ab07dd48542958c930150p0L, 0x1.91eb345d88d7c81280e069fbdb63p-88L,
> + 0x1.5c9268a5946b701c4b1b80p0L, 0x1.6986a203d84e6a4a92f179e71889p-88L,
> + 0x1.5e76f15ad21486e9be4c20p0L, 0x3.99766a06548a05829e853bdb2b52p-92L,
> + 0x1.605e1b976dc08b076f592ap0L, 0x4.86e3b34ead1b4769df867b9c89ccp-92L,
> + 0x1.6247eb03a5584b1f0fa06ep0L, 0x1.d2da42bb1ceaf9f732275b8aef30p-88L,
> + 0x1.6434634ccc31fc76f8714cp0L, 0x4.ed9a4e41000307103a18cf7a6e08p-92L,
> + 0x1.66238825522249127d9e28p0L, 0x1.b8f314a337f4dc0a3adf1787ff74p-88L,
> + 0x1.68155d44ca973081c57226p0L, 0x1.b9f32706bfe4e627d809a85dcc66p-88L,
> + 0x1.6a09e667f3bcc908b2fb12p0L, 0x1.66ea957d3e3adec17512775099dap-88L,
> + 0x1.6c012750bdabeed76a9980p0L, 0xf.4f33fdeb8b0ecd831106f57b3d00p-96L,
> + 0x1.6dfb23c651a2ef220e2cbep0L, 0x1.bbaa834b3f11577ceefbe6c1c411p-92L,
> + 0x1.6ff7df9519483cf87e1b4ep0L, 0x1.3e213bff9b702d5aa477c12523cep-88L,
> + 0x1.71f75e8ec5f73dd2370f2ep0L, 0xf.0acd6cb434b562d9e8a20adda648p-92L,
> + 0x1.73f9a48a58173bd5c9a4e6p0L, 0x8.ab1182ae217f3a7681759553e840p-92L,
> + 0x1.75feb564267c8bf6e9aa32p0L, 0x1.a48b27071805e61a17b954a2dad8p-88L,
> + 0x1.780694fde5d3f619ae0280p0L, 0x8.58b2bb2bdcf86cd08e35fb04c0f0p-92L,
> + 0x1.7a11473eb0186d7d51023ep0L, 0x1.6cda1f5ef42b66977960531e821bp-88L,
> + 0x1.7c1ed0130c1327c4933444p0L, 0x1.937562b2dc933d44fc828efd4c9cp-88L,
> + 0x1.7e2f336cf4e62105d02ba0p0L, 0x1.5797e170a1427f8fcdf5f3906108p-88L,
> + 0x1.80427543e1a11b60de6764p0L, 0x9.a354ea706b8e4d8b718a672bf7c8p-92L,
> + 0x1.82589994cce128acf88afap0L, 0xb.34a010f6ad65cbbac0f532d39be0p-92L,
> + 0x1.8471a4623c7acce52f6b96p0L, 0x1.c64095370f51f48817914dd78665p-88L,
> + 0x1.868d99b4492ec80e41d90ap0L, 0xc.251707484d73f136fb5779656b70p-92L,
> + 0x1.88ac7d98a669966530bcdep0L, 0x1.2d4e9d61283ef385de170ab20f96p-88L,
> + 0x1.8ace5422aa0db5ba7c55a0p0L, 0x1.92c9bb3e6ed61f2733304a346d8fp-88L,
> + 0x1.8cf3216b5448bef2aa1cd0p0L, 0x1.61c55d84a9848f8c453b3ca8c946p-88L,
> + 0x1.8f1ae991577362b982745cp0L, 0x7.2ed804efc9b4ae1458ae946099d4p-92L,
> + 0x1.9145b0b91ffc588a61b468p0L, 0x1.f6b70e01c2a90229a4c4309ea719p-88L,
> + 0x1.93737b0cdc5e4f4501c3f2p0L, 0x5.40a22d2fc4af581b63e8326efe9cp-92L,
> + 0x1.95a44cbc8520ee9b483694p0L, 0x1.a0fc6f7c7d61b2b3a22a0eab2cadp-88L,
> + 0x1.97d829fde4e4f8b9e920f8p0L, 0x1.1e8bd7edb9d7144b6f6818084cc7p-88L,
> + 0x1.9a0f170ca07b9ba3109b8cp0L, 0x4.6737beb19e1eada6825d3c557428p-92L,
> + 0x1.9c49182a3f0901c7c46b06p0L, 0x1.1f2be58ddade50c217186c90b457p-88L,
> + 0x1.9e86319e323231824ca78ep0L, 0x6.4c6e010f92c082bbadfaf605cfd4p-92L,
> + 0x1.a0c667b5de564b29ada8b8p0L, 0xc.ab349aa0422a8da7d4512edac548p-92L,
> + 0x1.a309bec4a2d3358c171f76p0L, 0x1.0daad547fa22c26d168ea762d854p-88L,
> + 0x1.a5503b23e255c8b424491cp0L, 0xa.f87bc8050a405381703ef7caff50p-92L,
> + 0x1.a799e1330b3586f2dfb2b0p0L, 0x1.58f1a98796ce8908ae852236ca94p-88L,
> + 0x1.a9e6b5579fdbf43eb243bcp0L, 0x1.ff4c4c58b571cf465caf07b4b9f5p-88L,
> + 0x1.ac36bbfd3f379c0db966a2p0L, 0x1.1265fc73e480712d20f8597a8e7bp-88L,
> + 0x1.ae89f995ad3ad5e8734d16p0L, 0x1.73205a7fbc3ae675ea440b162d6cp-88L,
> + 0x1.b0e07298db66590842acdep0L, 0x1.c6f6ca0e5dcae2aafffa7a0554cbp-88L,
> + 0x1.b33a2b84f15faf6bfd0e7ap0L, 0x1.d947c2575781dbb49b1237c87b6ep-88L,
> + 0x1.b59728de559398e3881110p0L, 0x1.64873c7171fefc410416be0a6525p-88L,
> + 0x1.b7f76f2fb5e46eaa7b081ap0L, 0xb.53c5354c8903c356e4b625aacc28p-92L,
> + 0x1.ba5b030a10649840cb3c6ap0L, 0xf.5b47f297203757e1cc6eadc8bad0p-92L,
> + 0x1.bcc1e904bc1d2247ba0f44p0L, 0x1.b3d08cd0b20287092bd59be4ad98p-88L,
> + 0x1.bf2c25bd71e088408d7024p0L, 0x1.18e3449fa073b356766dfb568ff4p-88L,
> + 0x1.c199bdd85529c2220cb12ap0L, 0x9.1ba6679444964a36661240043970p-96L,
> + 0x1.c40ab5fffd07a6d14df820p0L, 0xf.1828a5366fd387a7bdd54cdf7300p-92L,
> + 0x1.c67f12e57d14b4a2137fd2p0L, 0xf.2b301dd9e6b151a6d1f9d5d5f520p-96L,
> + 0x1.c8f6d9406e7b511acbc488p0L, 0x5.c442ddb55820171f319d9e5076a8p-96L,
> + 0x1.cb720dcef90691503cbd1ep0L, 0x9.49db761d9559ac0cb6dd3ed599e0p-92L,
> + 0x1.cdf0b555dc3f9c44f8958ep0L, 0x1.ac51be515f8c58bdfb6f5740a3a4p-88L,
> + 0x1.d072d4a07897b8d0f22f20p0L, 0x1.a158e18fbbfc625f09f4cca40874p-88L,
> + 0x1.d2f87080d89f18ade12398p0L, 0x9.ea2025b4c56553f5cdee4c924728p-92L,
> + 0x1.d5818dcfba48725da05aeap0L, 0x1.66e0dca9f589f559c0876ff23830p-88L,
> + 0x1.d80e316c98397bb84f9d04p0L, 0x8.805f84bec614de269900ddf98d28p-92L,
> + 0x1.da9e603db3285708c01a5ap0L, 0x1.6d4c97f6246f0ec614ec95c99392p-88L,
> + 0x1.dd321f301b4604b695de3cp0L, 0x6.30a393215299e30d4fb73503c348p-96L,
> + 0x1.dfc97337b9b5eb968cac38p0L, 0x1.ed291b7225a944efd5bb5524b927p-88L,
> + 0x1.e264614f5a128a12761fa0p0L, 0x1.7ada6467e77f73bf65e04c95e29dp-88L,
> + 0x1.e502ee78b3ff6273d13014p0L, 0x1.3991e8f49659e1693be17ae1d2f9p-88L,
> + 0x1.e7a51fbc74c834b548b282p0L, 0x1.23786758a84f4956354634a416cep-88L,
> + 0x1.ea4afa2a490d9858f73a18p0L, 0xf.5db301f86dea20610ceee13eb7b8p-92L,
> + 0x1.ecf482d8e67f08db0312fap0L, 0x1.949cef462010bb4bc4ce72a900dfp-88L,
> + 0x1.efa1bee615a27771fd21a8p0L, 0x1.2dac1f6dd5d229ff68e46f27e3dfp-88L,
> + 0x1.f252b376bba974e8696fc2p0L, 0x1.6390d4c6ad5476b5162f40e1d9a9p-88L,
> + 0x1.f50765b6e4540674f84b76p0L, 0x2.862baff99000dfc4352ba29b8908p-92L,
> + 0x1.f7bfdad9cbe138913b4bfep0L, 0x7.2bd95c5ce7280fa4d2344a3f5618p-92L,
> + 0x1.fa7c1819e90d82e90a7e74p0L, 0xb.263c1dc060c36f7650b4c0f233a8p-92L,
> + 0x1.fd3c22b8f71f10975ba4b2p0L, 0x1.2bcf3a5e12d269d8ad7c1a4a8875p-88L
> +};
> +
> +/*
> + * Kernel for expl(x). x must be finite and not tiny or huge.
> + * "tiny" is anything that would make us underflow (|A6*x^6| < ~LDBL_MIN).
> + * "huge" is anything that would make fn*L1 inexact (|x| > ~2**17*ln2).
> + */
> +static inline void
> +__k_expl(long double x, long double *hip, long double *lop, int *kp)
> +{
> + long double q, r, r1, t;
> + double dr, fn, r2;
> + int n, n2;
> +
> + /* Reduce x to (k*ln2 + endpoint[n2] + r1 + r2). */
> + fn = rnint((double)x * INV_L);
> + n = irint(fn);
> + n2 = (unsigned)n % INTERVALS;
> + /* Depend on the sign bit being propagated: */
> + *kp = n >> LOG2_INTERVALS;
> + r1 = x - fn * L1;
> + r2 = fn * -L2;
> + r = r1 + r2;
> +
> + /* Evaluate expl(endpoint[n2] + r1 + r2) = tbl[n2] * expl(r1 + r2). */
> + dr = r;
> + q = r2 + r * r * (A2 + r * (A3 + r * (A4 + r * (A5 + r * (A6 +
> + dr * (A7 + dr * (A8 + dr * (A9 + dr * A10))))))));
> + t = tbl[n2].lo + tbl[n2].hi;
> + *hip = tbl[n2].hi;
> + *lop = tbl[n2].lo + t * (q + r1);
> +}
> +
> +/*
> + * XXX: the rest of the functions are identical for ld80 and ld128.
> + * However, we should use scalbnl() for ld128, since long double
> + * multiplication was very slow on sparc64 and no new evaluation has
> + * been made for aarch64 and/or riscv.
> + */
> +
> +static inline void
> +k_hexpl(long double x, long double *hip, long double *lop)
> +{
> + float twopkm1;
> + int k;
> +
> + __k_expl(x, hip, lop, &k);
> + SET_FLOAT_WORD(twopkm1, 0x3f800000 + ((k - 1) << 23));
> + *hip *= twopkm1;
> + *lop *= twopkm1;
> +}
> +
> +static inline long double
> +hexpl(long double x)
> +{
> + long double hi, lo, twopkm2;
> + int k;
> +
> + twopkm2 = 1;
> + __k_expl(x, &hi, &lo, &k);
> + SET_LDBL_EXPSIGN(twopkm2, BIAS + k - 2);
> + return (lo + hi) * 2 * twopkm2;
> +}
> +
> +#ifdef _COMPLEX_H
> +/*
> + * See ../src/k_exp.c for details.
> + */
> +static inline long double complex
> +__ldexp_cexpl(long double complex z, int expt)
> +{
> + long double c, exp_x, hi, lo, s;
> + long double x, y, scale1, scale2;
> + int half_expt, k;
> +
> + x = creall(z);
> + y = cimagl(z);
> + __k_expl(x, &hi, &lo, &k);
> +
> + exp_x = (lo + hi) * 0x1p16382L;
> + expt += k - 16382;
> +
> + scale1 = 1;
> + half_expt = expt / 2;
> + SET_LDBL_EXPSIGN(scale1, BIAS + half_expt);
> + scale2 = 1;
> + SET_LDBL_EXPSIGN(scale2, BIAS + expt - half_expt);
> +
> + sincosl(y, &s, &c);
> + return (CMPLXL(c * exp_x * scale1 * scale2,
> + s * exp_x * scale1 * scale2));
> +}
> +#endif /* _COMPLEX_H */
> diff --git a/newlib/libm/ld128/k_sinl.c b/newlib/libm/ld128/k_sinl.c
> new file mode 100644
> index 000000000..09472d65f
> --- /dev/null
> +++ b/newlib/libm/ld128/k_sinl.c
> @@ -0,0 +1,59 @@
> +/* From: @(#)k_sin.c 1.3 95/01/18 */
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + * Copyright (c) 2008 Steven G. Kargl, David Schultz, Bruce D. Evans.
> + *
> + * Developed at SunSoft, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * ld128 version of k_sin.c. See ../src/k_sin.c for most comments.
> + */
> +
> +#include "math_private.h"
> +
> +static const double
> +half = 0.5;
> +
> +/*
> + * Domain [-0.7854, 0.7854], range ~[-1.53e-37, 1.659e-37]
> + * |sin(x)/x - s(x)| < 2**-122.1
> + *
> + * See ../ld80/k_cosl.c for more details about the polynomial.
> + */
> +static const long double
> +S1 = -0.16666666666666666666666666666666666606732416116558L,
> +S2 = 0.0083333333333333333333333333333331135404851288270047L,
> +S3 = -0.00019841269841269841269841269839935785325638310428717L,
> +S4 = 0.27557319223985890652557316053039946268333231205686e-5L,
> +S5 = -0.25052108385441718775048214826384312253862930064745e-7L,
> +S6 = 0.16059043836821614596571832194524392581082444805729e-9L,
> +S7 = -0.76471637318198151807063387954939213287488216303768e-12L,
> +S8 = 0.28114572543451292625024967174638477283187397621303e-14L;
> +
> +static const double
> +S9 = -0.82206352458348947812512122163446202498005154296863e-17,
> +S10 = 0.19572940011906109418080609928334380560135358385256e-19,
> +S11 = -0.38680813379701966970673724299207480965452616911420e-22,
> +S12 = 0.64038150078671872796678569586315881020659912139412e-25;
> +
> +long double
> +__kernel_sinl(long double x, long double y, int iy)
> +{
> + long double z,r,v;
> +
> + z = x*x;
> + v = z*x;
> + r = S2+z*(S3+z*(S4+z*(S5+z*(S6+z*(S7+z*(S8+
> + z*(S9+z*(S10+z*(S11+z*S12)))))))));
> + if(iy==0) return x+v*(S1+z*r);
> + else return x-((z*(half*y-v*r)-y)-v*S1);
> +}
> diff --git a/newlib/libm/ld128/s_erfl.c b/newlib/libm/ld128/s_erfl.c
> new file mode 100644
> index 000000000..e29c9691f
> --- /dev/null
> +++ b/newlib/libm/ld128/s_erfl.c
> @@ -0,0 +1,329 @@
> +/* @(#)s_erf.c 5.1 93/09/24 */
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunPro, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * See s_erf.c for complete comments.
> + *
> + * Converted to long double by Steven G. Kargl.
> + */
> +#include <float.h>
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +
> +/* XXX Prevent compilers from erroneously constant folding these: */
> +static const volatile long double tiny = 0x1p-10000L;
> +
> +static const double
> +half= 0.5,
> +one = 1,
> +two = 2;
> +/*
> + * In the domain [0, 2**-40], only the first term in the power series
> + * expansion of erf(x) is used. The magnitude of the first neglected
> + * terms is less than 2**-120.
> + */
> +static const long double
> +efx = 1.28379167095512573896158903121545167e-01L, /* 0xecbff6a7, 0x481dd788, 0xb64d21a8, 0xeb06fc3f */
> +efx8 = 1.02703333676410059116927122497236133e+00L, /* 0xecbff6a7, 0x481dd788, 0xb64d21a8, 0xeb06ff3f */
> +/*
> + * Domain [0, 0.84375], range ~[-1.919e-38, 1.919e-38]:
> + * |(erf(x) - x)/x - pp(x)/qq(x)| < 2**-125.29
> + */
> +pp0 = 1.28379167095512573896158903121545167e-01L, /* 0x3ffc06eb, 0xa8214db6, 0x88d71d48, 0xa7f6bfec */
> +pp1 = -3.14931554396568573802046931159683404e-01L, /* 0xbffd427d, 0x6ada7263, 0x547eb096, 0x95f37463 */
> +pp2 = -5.27514920282183487103576956956725309e-02L, /* 0xbffab023, 0xe5a271e3, 0xb0e79b01, 0x2f7ac962 */
> +pp3 = -1.13202828509005281355609495523452713e-02L, /* 0xbff872f1, 0x6a5023a1, 0xe08b3884, 0x326af20f */
> +pp4 = -9.18626155872522453865998391206048506e-04L, /* 0xbff4e19f, 0xea5fb024, 0x43247a37, 0xe430b06c */
> +pp5 = -7.87518862406176274922506447157284230e-05L, /* 0xbff14a4f, 0x31a85fe0, 0x7fff2204, 0x09c49b37 */
> +pp6 = -3.42357944472240436548115331090560881e-06L, /* 0xbfeccb81, 0x4b43c336, 0xcd2eb6c2, 0x903f2d87 */
> +pp7 = -1.37317432573890412634717890726745428e-07L, /* 0xbfe826e3, 0x0e915eb6, 0x42aee414, 0xf7e36805 */
> +pp8 = -2.71115170113861755855049008732113726e-09L, /* 0xbfe2749e, 0x2b94fd00, 0xecb4d166, 0x0efb91f8 */
> +pp9 = -3.37925756196555959454018189718117864e-11L, /* 0xbfdc293e, 0x1d9060cb, 0xd043204a, 0x314cd7f0 */
> +qq1 = 4.76672625471551170489978555182449450e-01L, /* 0x3ffde81c, 0xde6531f0, 0x76803bee, 0x526e29e9 */
> +qq2 = 1.06713144672281502058807525850732240e-01L, /* 0x3ffbb518, 0xd7a6bb74, 0xcd9bdd33, 0x7601eee5 */
> +qq3 = 1.47747613127513761102189201923147490e-02L, /* 0x3ff8e423, 0xae527e18, 0xf12cb447, 0x723b4749 */
> +qq4 = 1.39939377672028671891148770908874816e-03L, /* 0x3ff56ed7, 0xba055d84, 0xc21b45c4, 0x388d1812 */
> +qq5 = 9.44302939359455241271983309378738276e-05L, /* 0x3ff18c11, 0xc18c99a4, 0x86d0fe09, 0x46387b4c */
> +qq6 = 4.56199342312522842161301671745365650e-06L, /* 0x3fed3226, 0x73421d05, 0x08875300, 0x32fa1432 */
> +qq7 = 1.53019260483764773845294600092361197e-07L, /* 0x3fe8489b, 0x3a63f627, 0x2b9ad2ce, 0x26516e57 */
> +qq8 = 3.25542691121324805094777901250005508e-09L, /* 0x3fe2bf6c, 0x26d93a29, 0x9142be7c, 0x9f1dd043 */
> +qq9 = 3.37405581964478060434410167262684979e-11L; /* 0x3fdc28c8, 0xfb8fa1be, 0x10e57eec, 0xaa19e49f */
> +
> +static const long double
> +erx = 8.42700792949714894142232424201210961e-01L, /* 0x3ffeaf76, 0x7a741088, 0xb0000000, 0x00000000 */
> +/*
> + * Domain [0.84375, 1.25], range ~[-2.521e-36, 2.523e-36]:
> + * |(erf(x) - erx) - pa(x)/qa(x)| < 2**-120.15
> + */
> +pa0 = -2.48010117891186017024438233323795897e-17L, /* 0xbfc7c97f, 0x77812279, 0x6c877f22, 0xef4bfb2e */
> +pa1 = 4.15107497420594680894327969504526489e-01L, /* 0x3ffda911, 0xf096fbc2, 0x55662005, 0x2337fa64 */
> +pa2 = -3.94180628087084846724448515851892609e-02L, /* 0xbffa42e9, 0xab54528c, 0xad529da1, 0x6efc2af3 */
> +pa3 = 4.48897599625192107295954790681677462e-02L, /* 0x3ffa6fbc, 0xa65edba1, 0x0e4cbcea, 0x73ef9a31 */
> +pa4 = 8.02069252143016600110972019232995528e-02L, /* 0x3ffb4887, 0x0e8b548e, 0x3230b417, 0x11b553b3 */
> +pa5 = -1.02729816533435279443621120242391295e-02L, /* 0xbff850a0, 0x041de3ee, 0xd5bca6c9, 0x4ef5f9f2 */
> +pa6 = 5.70777694530755634864821094419982095e-03L, /* 0x3ff77610, 0x9b501e10, 0x4c978382, 0x742df68f */
> +pa7 = 1.22635150233075521018231779267077071e-03L, /* 0x3ff5417b, 0x0e623682, 0x60327da0, 0x96b9219e */
> +pa8 = 5.36100234820204569428412542856666503e-04L, /* 0x3ff41912, 0x27ceb4c1, 0x1d3298ec, 0x84ced627 */
> +pa9 = -1.97753571846365167177187858667583165e-04L, /* 0xbff29eb8, 0x23f5bcf3, 0x15c83c46, 0xe4fda98b */
> +pa10 = 6.19333039900846970674794789568415105e-05L, /* 0x3ff103c4, 0x60f88e46, 0xc0c9fb02, 0x13cc7fc1 */
> +pa11 = -5.40531400436645861492290270311751349e-06L, /* 0xbfed6abe, 0x9665f8a8, 0xdd0ad3ba, 0xe5dc0ee3 */
> +qa1 = 9.05041313265490487793231810291907851e-01L, /* 0x3ffecf61, 0x93340222, 0xe9930620, 0xc4e61168 */
> +qa2 = 6.79848064708886864767240880834868092e-01L, /* 0x3ffe5c15, 0x0ba858dc, 0xf7900ae9, 0xfea1e09a */
> +qa3 = 4.04720609926471677581066689316516445e-01L, /* 0x3ffd9e6f, 0x145e9b00, 0x6d8c1749, 0xd2928623 */
> +qa4 = 1.69183273898369996364661075664302225e-01L, /* 0x3ffc5a7c, 0xc2a363c1, 0xd6c19097, 0xef9b4063 */
> +qa5 = 7.44476185988067992342479750486764248e-02L, /* 0x3ffb30ef, 0xfc7259ef, 0x1bcbb089, 0x686dd62d */
> +qa6 = 2.02981172725892407200420389604788573e-02L, /* 0x3ff94c90, 0x7976cb0e, 0x21e1d36b, 0x0f09ca2b */
> +qa7 = 6.94281866271607668268269403102277234e-03L, /* 0x3ff7c701, 0x2b193250, 0xc5d46ecc, 0x374843d8 */
> +qa8 = 1.12952275469171559611651594706820034e-03L, /* 0x3ff52818, 0xfd2a7c06, 0xd13e38fd, 0xda4b34f5 */
> +qa9 = 3.13736683241992737197226578597710179e-04L, /* 0x3ff348fa, 0x0cb48d18, 0x051f849b, 0x135ccf74 */
> +qa10 = 1.17037675204033225470121134087771410e-05L, /* 0x3fee88b6, 0x98f47704, 0xa5d8f8f2, 0xc6422e11 */
> +qa11 = 4.61312518293853991439362806880973592e-06L, /* 0x3fed3594, 0xe31db94f, 0x3592b693, 0xed4386b4 */
> +qa12 = -1.02158572037456893687737553657431771e-06L; /* 0xbfeb123a, 0xd60d9b1e, 0x1f6fdeb9, 0x7dc8410a */
> +/*
> + * Domain [1.25,2.85715], range ~[-2.922e-37,2.922e-37]:
> + * |log(x*erfc(x)) + x**2 + 0.5625 - ra(x)/sa(x)| < 2**-121.36
> + */
> +static const long double
> +ra0 = -9.86494292470069009555706994426014461e-03L, /* 0xbff84341, 0x239e8709, 0xe941b06a, 0xcb4b6ec5 */
> +ra1 = -1.13580436992565640457579040117568870e+00L, /* 0xbfff22c4, 0x133f7c0d, 0x72d5e231, 0x2eb1ee3f */
> +ra2 = -4.89744330295291950661185707066921755e+01L, /* 0xc00487cb, 0xa38b4fc2, 0xc136695b, 0xc1df8047 */
> +ra3 = -1.10766149300215937173768072715352140e+03L, /* 0xc00914ea, 0x55e6beb3, 0xabc50e07, 0xb6e5664d */
> +ra4 = -1.49991031232170934967642795601952100e+04L, /* 0xc00cd4b8, 0xd33243e6, 0xffbf6545, 0x3c57ef6e */
> +ra5 = -1.29805749738318462882524181556996692e+05L, /* 0xc00ffb0d, 0xbfeed9b6, 0x5b2a3ff4, 0xe245bd3c */
> +ra6 = -7.42828497044940065828871976644647850e+05L, /* 0xc0126ab5, 0x8fe7caca, 0x473352d9, 0xcd4e0c90 */
> +ra7 = -2.85637299581890734287995171242421106e+06L, /* 0xc0145cad, 0xa7f76fe7, 0x3e358051, 0x1799f927 */
> +ra8 = -7.40674797129824999383748865571026084e+06L, /* 0xc015c412, 0x6fe29c02, 0x298ad158, 0x7d24e45c */
> +ra9 = -1.28653420911930973914078724204151759e+07L, /* 0xc016889e, 0x7c2eb0dc, 0x95d5863b, 0x0aa34dc3 */
> +ra10 = -1.47198163599330179552932489109452638e+07L, /* 0xc016c136, 0x90b84923, 0xf9bcb497, 0x19bbd0f5 */
> +ra11 = -1.07812992258382800318665248311522624e+07L, /* 0xc0164904, 0xe673a113, 0x35d7f079, 0xe13701f3 */
> +ra12 = -4.83545565681708642630419905537756076e+06L, /* 0xc0152721, 0xfea094a8, 0x869eb39d, 0x413d6f13 */
> +ra13 = -1.23956521201673964822976917356685286e+06L, /* 0xc0132ea0, 0xd3646baa, 0x2fe62b0d, 0xbae5ce85 */
> +ra14 = -1.62289333553652417591275333240371812e+05L, /* 0xc0103cf8, 0xaab1e2d6, 0x4c25e014, 0x248d76ab */
> +ra15 = -8.82890392601176969729168894389833110e+03L, /* 0xc00c13e7, 0x3b3d8f94, 0x6fbda6f6, 0xe7049a82 */
> +ra16 = -1.22591866337261720023681535568334619e+02L, /* 0xc005ea5e, 0x12358891, 0xcfa712c5, 0x77f050d4 */
> +sa1 = 6.44508918884710829371852723353794047e+01L, /* 0x400501cd, 0xb69a6c0f, 0x5716de14, 0x47161af6 */
> +sa2 = 1.76118475473171481523704824327358534e+03L, /* 0x4009b84b, 0xd305829f, 0xc4c771b0, 0xbf1f7f9b */
> +sa3 = 2.69448346969488374857087646131950188e+04L, /* 0x400da503, 0x56bacc05, 0x4fdba68d, 0x2cca27e6 */
> +sa4 = 2.56826633369941456778326497384543763e+05L, /* 0x4010f59d, 0x51124428, 0x69c41de6, 0xbd0d5753 */
> +sa5 = 1.60647413092257206847700054645905859e+06L, /* 0x40138834, 0xa2184244, 0x557a1bed, 0x68c9d556 */
> +sa6 = 6.76963075165099718574753447122393797e+06L, /* 0x40159d2f, 0x7b01b0cc, 0x8bac9e95, 0x5d35d56e */
> +sa7 = 1.94295690905361884290986932493647741e+07L, /* 0x40172878, 0xc1172d61, 0x3068501e, 0x2f3c71da */
> +sa8 = 3.79774781017759149060839255547073541e+07L, /* 0x401821be, 0xc30d06fe, 0x410563d7, 0x032111fd */
> +sa9 = 5.00659831846029484248302236457727397e+07L, /* 0x40187df9, 0x1f97a111, 0xc51d6ac2, 0x4b389793 */
> +sa10 = 4.36486287620506484276130525941972541e+07L, /* 0x40184d03, 0x3a618ae0, 0x2a723357, 0xfa45c60a */
> +sa11 = 2.43779678791333894255510508253951934e+07L, /* 0x401773fa, 0x6fe10ee2, 0xc467850d, 0xc6b7ff30 */
> +sa12 = 8.30732360384443202039372372212966542e+06L, /* 0x4015fb09, 0xee6a5631, 0xdd98de7e, 0x8b00461a */
> +sa13 = 1.60160846942050515734192397495105693e+06L, /* 0x40138704, 0x8782bf13, 0x5b8fb315, 0xa898abe5 */
> +sa14 = 1.54255505242533291014555153757001825e+05L, /* 0x40102d47, 0xc0abc98e, 0x843c9490, 0xb4352440 */
> +sa15 = 5.87949220002375547561467275493888824e+03L, /* 0x400b6f77, 0xe00d21d1, 0xec4d41e8, 0x2f8e1673 */
> +sa16 = 4.97272976346793193860385983372237710e+01L; /* 0x40048dd1, 0x816c1b3f, 0x24f540a6, 0x4cfe03cc */
> +/*
> + * Domain [2.85715,9], range ~[-7.886e-37,7.918e-37]:
> + * |log(x*erfc(x)) + x**2 + 0.5625 - rb(x)/sb(x)| < 2**-120
> + */
> +static const long double
> +rb0 = -9.86494292470008707171371994479162369e-3L, /* 0xbff84341, 0x239e86f4, 0x2f57e561, 0xf4469360 */
> +rb1 = -1.57047326624110727986326503729442830L, /* 0xbfff920a, 0x8935bf73, 0x8803b894, 0x4656482d */
> +rb2 = -1.03228196364885474342132255440317065e2L, /* 0xc0059ce9, 0xac4ed0ff, 0x2cff0ff7, 0x5e70d1ab */
> +rb3 = -3.74000570653418227179358710865224376e3L, /* 0xc00ad380, 0x2ebf7835, 0xf6b07ed2, 0x861242f7 */
> +rb4 = -8.35435477739098044190860390632813956e4L, /* 0xc00f4657, 0x8c3ae934, 0x3647d7b3, 0x80e76fb7 */
> +rb5 = -1.21398672055223642118716640216747152e6L, /* 0xc0132862, 0x2b8761c8, 0x27d18c0f, 0x137c9463 */
> +rb6 = -1.17669175877248796101665344873273970e7L, /* 0xc0166719, 0x0b2cea46, 0x81f14174, 0x11602ea5 */
> +rb7 = -7.66108006086998253606773064264599615e7L, /* 0xc019243f, 0x3c26f4f0, 0x1cc05241, 0x3b953728 */
> +rb8 = -3.32547117558141845968704725353130804e8L, /* 0xc01b3d24, 0x42d8ee26, 0x24ef6f3b, 0x604a8c65 */
> +rb9 = -9.41561252426350696802167711221739746e8L, /* 0xc01cc0f8, 0xad23692a, 0x8ddb2310, 0xe9937145 */
> +rb10 = -1.67157110805390944549427329626281063e9L, /* 0xc01d8e88, 0x9a903734, 0x09a55fa3, 0xd205c903 */
> +rb11 = -1.74339631004410841337645931421427373e9L, /* 0xc01d9fa8, 0x77582d2a, 0xc183b8ab, 0x7e00cb05 */
> +rb12 = -9.57655233596934915727573141357471703e8L, /* 0xc01cc8a5, 0x460cc685, 0xd0271fa0, 0x6a70e3da */
> +rb13 = -2.26320062731339353035254704082495066e8L, /* 0xc01aafab, 0xd7d76721, 0xc9720e11, 0x6a8bd489 */
> +rb14 = -1.42777302996263256686002973851837039e7L, /* 0xc016b3b8, 0xc499689f, 0x2b88d965, 0xc32414f9 */
> +sb1 = 1.08512869705594540211033733976348506e2L, /* 0x4005b20d, 0x2db7528d, 0x00d20dcb, 0x858f6191 */
> +sb2 = 5.02757713761390460534494530537572834e3L, /* 0x400b3a39, 0x3bf4a690, 0x3025d28d, 0xfd40a891 */
> +sb3 = 1.31019107205412870059331647078328430e5L, /* 0x400fffcb, 0x1b71d05e, 0x3b28361d, 0x2a3c3690 */
> +sb4 = 2.13021555152296846166736757455018030e6L, /* 0x40140409, 0x3c6984df, 0xc4491d7c, 0xb04aa08d */
> +sb5 = 2.26649105281820861953868568619768286e7L, /* 0x401759d6, 0xce8736f0, 0xf28ad037, 0x2a901e0c */
> +sb6 = 1.61071939490875921812318684143076081e8L, /* 0x401a3338, 0x686fb541, 0x6bd27d06, 0x4f95c9ac */
> +sb7 = 7.66895673844301852676056750497991966e8L, /* 0x401c6daf, 0x31cec121, 0x54699126, 0x4bd9bf9e */
> +sb8 = 2.41884450436101936436023058196042526e9L, /* 0x401e2059, 0x46b0b8d7, 0x87b64cbf, 0x78bc296d */
> +sb9 = 4.92403055884071695093305291535107666e9L, /* 0x401f257e, 0xbe5ed739, 0x39e17346, 0xcadd2e55 */
> +sb10 = 6.18627786365587486459633615573786416e9L, /* 0x401f70bb, 0x1be7a7e7, 0x6a45b5ae, 0x607c70f0 */
> +sb11 = 4.45898013426501378097430226324743199e9L, /* 0x401f09c6, 0xa32643d7, 0xf1724620, 0x9ea46c32 */
> +sb12 = 1.63006115763329848117160344854224975e9L, /* 0x401d84a3, 0x0996887f, 0x65a4f43b, 0x978c1d74 */
> +sb13 = 2.39216717012421697446304015847567721e8L, /* 0x401ac845, 0x09a065c2, 0x30095da7, 0x9d72d6ae */
> +sb14 = 7.84837329009278694937250358810225609e6L; /* 0x4015df06, 0xd5290e15, 0x63031fac, 0x4d9c894c */
> +/*
> + * Domain [9,108], range ~[-5.324e-38,5.340e-38]:
> + * |log(x*erfc(x)) + x**2 + 0.5625 - r(x)/s(x)| < 2**-124
> + */
> +static const long double
> +rc0 = -9.86494292470008707171367567652935673e-3L, /* 0xbff84341, 0x239e86f4, 0x2f57e55b, 0x1aa10fd3 */
> +rc1 = -1.26229447747315096406518846411562266L, /* 0xbfff4325, 0xbb1aab28, 0xda395cd9, 0xfb861c15 */
> +rc2 = -6.13742634438922591780742637728666162e1L, /* 0xc004eafe, 0x7dd51cd8, 0x3c7c5928, 0x751e50cf */
> +rc3 = -1.50455835478908280402912854338421517e3L, /* 0xc0097823, 0xbc15b9ab, 0x3d60745c, 0x523e80a5 */
> +rc4 = -2.04415631865861549920184039902945685e4L, /* 0xc00d3f66, 0x40b3fc04, 0x5388f2ec, 0xb009e1f0 */
> +rc5 = -1.57625662981714582753490610560037638e5L, /* 0xc01033dc, 0xd4dc95b6, 0xfd4da93b, 0xf355b4a9 */
> +rc6 = -6.73473451616752528402917538033283794e5L, /* 0xc01248d8, 0x2e73a4f9, 0xcded49c5, 0xfa3bfeb7 */
> +rc7 = -1.47433165421387483167186683764364857e6L, /* 0xc01367f1, 0xba77a8f7, 0xcfdd0dbb, 0x25d554b3 */
> +rc8 = -1.38811981807868828563794929997744139e6L, /* 0xc01352e5, 0x7d16d9ad, 0xbbdcbf38, 0x38fbc5ea */
> +rc9 = -3.59659700530831825640766479698155060e5L, /* 0xc0115f3a, 0xecd57f45, 0x21f8ad6c, 0x910a5958 */
> +sc1 = 7.72730753022908298637508998072635696e1L, /* 0x40053517, 0xa10d52bc, 0xdabb55b6, 0xbd0328cd */
> +sc2 = 2.36825757341694050500333261769082182e3L, /* 0x400a2808, 0x3e0a9b42, 0x82977842, 0x9c5de29e */
> +sc3 = 3.72210540173034735352888847134073099e4L, /* 0x400e22ca, 0x1ba827ef, 0xac8390d7, 0x1fc39a41 */
> +sc4 = 3.24136032646418336712461033591393412e5L, /* 0x40113c8a, 0x0216e100, 0xc59d1e44, 0xf0e68d9d */
> +sc5 = 1.57836135851134393802505823370009175e6L, /* 0x40138157, 0x95bc7664, 0x17575961, 0xdbe58eeb */
> +sc6 = 4.12881981392063738026679089714182355e6L, /* 0x4014f801, 0x9e82e8d2, 0xb8b3a70e, 0xfd84185d */
> +sc7 = 5.24438427289213488410596395361544142e6L, /* 0x40154017, 0x81177109, 0x2aa6c3b0, 0x1f106625 */
> +sc8 = 2.59909544563616121735963429710382149e6L, /* 0x40143d45, 0xbb90a9b1, 0x12bf9390, 0xa827a700 */
> +sc9 = 2.80930665169282501639651995082335693e5L; /* 0x40111258, 0xaa92222e, 0xa97e3216, 0xa237fa6c */
> +
> +long double
> +erfl(long double x)
> +{
> + long double ax,R,S,P,Q,s,y,z,r;
> + uint64_t lx, llx;
> + int32_t i;
> + uint16_t hx;
> +
> + EXTRACT_LDBL128_WORDS(hx, lx, llx, x);
> +
> + if((hx & 0x7fff) == 0x7fff) { /* erfl(nan)=nan */
> + i = (hx>>15)<<1;
> + return (1-i)+one/x; /* erfl(+-inf)=+-1 */
> + }
> +
> + ax = fabsl(x);
> + if(ax < 0.84375) {
> + if(ax < 0x1p-40L) {
> + if(ax < 0x1p-16373L)
> + return (8*x+efx8*x)/8; /* avoid spurious underflow */
> + return x + efx*x;
> + }
> + z = x*x;
> + r = pp0+z*(pp1+z*(pp2+z*(pp3+z*(pp4+z*(pp5+z*(pp6+z*(pp7+
> + z*(pp8+z*pp9))))))));
> + s = one+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*(qq5+z*(qq6+z*(qq7+
> + z*(qq8+z*qq9))))))));
> + y = r/s;
> + return x + x*y;
> + }
> + if(ax < 1.25) {
> + s = ax-one;
> + P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*(pa6+s*(pa7+
> + s*(pa8+s*(pa9+s*(pa10+s*pa11))))))))));
> + Q = one+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*(qa6+s*(qa7+
> + s*(qa8+s*(qa9+s*(qa10+s*(qa11+s*qa12)))))))))));
> + if(x>=0) return (erx + P/Q); else return (-erx - P/Q);
> + }
> + if (ax >= 9) { /* inf>|x|>= 9 */
> + if(x>=0) return (one-tiny); else return (tiny-one);
> + }
> + s = one/(ax*ax);
> + if(ax < 2.85715) { /* |x| < 2.85715 */
> + R=ra0+s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*(ra5+s*(ra6+s*(ra7+
> + s*(ra8+s*(ra9+s*(ra10+s*(ra11+s*(ra12+s*(ra13+s*(ra14+
> + s*(ra15+s*ra16)))))))))))))));
> + S=one+s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*(sa5+s*(sa6+s*(sa7+
> + s*(sa8+s*(sa9+s*(sa10+s*(sa11+s*(sa12+s*(sa13+s*(sa14+
> + s*(sa15+s*sa16)))))))))))))));
> + } else { /* |x| >= 2.85715 */
> + R=rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*(rb5+s*(rb6+s*(rb7+
> + s*(rb8+s*(rb9+s*(rb10+s*(rb11+s*(rb12+s*(rb13+
> + s*rb14)))))))))))));
> + S=one+s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*(sb5+s*(sb6+s*(sb7+
> + s*(sb8+s*(sb9+s*(sb10+s*(sb11+s*(sb12+s*(sb13+
> + s*sb14)))))))))))));
> + }
> + z = (float)ax;
> + r = expl(-z*z-0.5625)*expl((z-ax)*(z+ax)+R/S);
> + if(x>=0) return (one-r/ax); else return (r/ax-one);
> +}
> +
> +long double
> +erfcl(long double x)
> +{
> + long double ax,R,S,P,Q,s,y,z,r;
> + uint64_t lx, llx;
> + uint16_t hx;
> +
> + EXTRACT_LDBL128_WORDS(hx, lx, llx, x);
> +
> + if((hx & 0x7fff) == 0x7fff) { /* erfcl(nan)=nan */
> + /* erfcl(+-inf)=0,2 */
> + return ((hx>>15)<<1)+one/x;
> + }
> +
> + ax = fabsl(x);
> + if(ax < 0.84375L) {
> + if(ax < 0x1p-34L)
> + return one-x;
> + z = x*x;
> + r = pp0+z*(pp1+z*(pp2+z*(pp3+z*(pp4+z*(pp5+z*(pp6+z*(pp7+
> + z*(pp8+z*pp9))))))));
> + s = one+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*(qq5+z*(qq6+z*(qq7+
> + z*(qq8+z*qq9))))))));
> + y = r/s;
> + if(ax < 0.25L) { /* x<1/4 */
> + return one-(x+x*y);
> + } else {
> + r = x*y;
> + r += (x-half);
> + return half - r;
> + }
> + }
> + if(ax < 1.25L) {
> + s = ax-one;
> + P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*(pa6+s*(pa7+
> + s*(pa8+s*(pa9+s*(pa10+s*pa11))))))))));
> + Q = one+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*(qa6+s*(qa7+
> + s*(qa8+s*(qa9+s*(qa10+s*(qa11+s*qa12)))))))))));
> + if(x>=0) {
> + z = one-erx; return z - P/Q;
> + } else {
> + z = erx+P/Q; return one+z;
> + }
> + }
> +
> + if(ax < 108) { /* |x| < 108 */
> + s = one/(ax*ax);
> + if(ax < 2.85715) { /* |x| < 2.85715 */
> + R=ra0+s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*(ra5+s*(ra6+s*(ra7+
> + s*(ra8+s*(ra9+s*(ra10+s*(ra11+s*(ra12+s*(ra13+s*(ra14+
> + s*(ra15+s*ra16)))))))))))))));
> + S=one+s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*(sa5+s*(sa6+s*(sa7+
> + s*(sa8+s*(sa9+s*(sa10+s*(sa11+s*(sa12+s*(sa13+s*(sa14+
> + s*(sa15+s*sa16)))))))))))))));
> + } else if(ax < 9) {
> + R=rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*(rb5+s*(rb6+s*(rb7+
> + s*(rb8+s*(rb9+s*(rb10+s*(rb11+s*(rb12+s*(rb13+
> + s*rb14)))))))))))));
> + S=one+s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*(sb5+s*(sb6+s*(sb7+
> + s*(sb8+s*(sb9+s*(sb10+s*(sb11+s*(sb12+s*(sb13+
> + s*sb14)))))))))))));
> + } else {
> + if(x < -9) return two-tiny; /* x < -9 */
> + R=rc0+s*(rc1+s*(rc2+s*(rc3+s*(rc4+s*(rc5+s*(rc6+s*(rc7+
> + s*(rc8+s*rc9))))))));
> + S=one+s*(sc1+s*(sc2+s*(sc3+s*(sc4+s*(sc5+s*(sc6+s*(sc7+
> + s*(sc8+s*sc9))))))));
> + }
> + z = (float)ax;
> + r = expl(-z*z-0.5625)*expl((z-ax)*(z+ax)+R/S);
> + if(x>0) return r/ax; else return two-r/ax;
> + } else {
> + if(x>0) return tiny*tiny; else return two-tiny;
> + }
> +}
> diff --git a/newlib/libm/ld128/s_exp2l.c b/newlib/libm/ld128/s_exp2l.c
> new file mode 100644
> index 000000000..ee3d2c782
> --- /dev/null
> +++ b/newlib/libm/ld128/s_exp2l.c
> @@ -0,0 +1,429 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2005-2008 David Schultz <das@FreeBSD.ORG>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include <float.h>
> +#include <stdint.h>
> +
> +#include "fpmath.h"
> +#include "math.h"
> +
> +#define TBLBITS 7
> +#define TBLSIZE (1 << TBLBITS)
> +
> +#define BIAS (LDBL_MAX_EXP - 1)
> +#define EXPMASK (BIAS + LDBL_MAX_EXP)
> +
> +static volatile long double
> + huge = 0x1p10000L,
> + twom10000 = 0x1p-10000L;
> +
> +static const long double
> + P1 = 0x1.62e42fefa39ef35793c7673007e6p-1L,
> + P2 = 0x1.ebfbdff82c58ea86f16b06ec9736p-3L,
> + P3 = 0x1.c6b08d704a0bf8b33a762bad3459p-5L,
> + P4 = 0x1.3b2ab6fba4e7729ccbbe0b4f3fc2p-7L,
> + P5 = 0x1.5d87fe78a67311071dee13fd11d9p-10L,
> + P6 = 0x1.430912f86c7876f4b663b23c5fe5p-13L;
> +
> +static const double
> + P7 = 0x1.ffcbfc588b041p-17,
> + P8 = 0x1.62c0223a5c7c7p-20,
> + P9 = 0x1.b52541ff59713p-24,
> + P10 = 0x1.e4cf56a391e22p-28,
> + redux = 0x1.8p112 / TBLSIZE;
> +
> +static const long double tbl[TBLSIZE] = {
> + 0x1.6a09e667f3bcc908b2fb1366dfeap-1L,
> + 0x1.6c012750bdabeed76a99800f4edep-1L,
> + 0x1.6dfb23c651a2ef220e2cbe1bc0d4p-1L,
> + 0x1.6ff7df9519483cf87e1b4f3e1e98p-1L,
> + 0x1.71f75e8ec5f73dd2370f2ef0b148p-1L,
> + 0x1.73f9a48a58173bd5c9a4e68ab074p-1L,
> + 0x1.75feb564267c8bf6e9aa33a489a8p-1L,
> + 0x1.780694fde5d3f619ae02808592a4p-1L,
> + 0x1.7a11473eb0186d7d51023f6ccb1ap-1L,
> + 0x1.7c1ed0130c1327c49334459378dep-1L,
> + 0x1.7e2f336cf4e62105d02ba1579756p-1L,
> + 0x1.80427543e1a11b60de67649a3842p-1L,
> + 0x1.82589994cce128acf88afab34928p-1L,
> + 0x1.8471a4623c7acce52f6b97c6444cp-1L,
> + 0x1.868d99b4492ec80e41d90ac2556ap-1L,
> + 0x1.88ac7d98a669966530bcdf2d4cc0p-1L,
> + 0x1.8ace5422aa0db5ba7c55a192c648p-1L,
> + 0x1.8cf3216b5448bef2aa1cd161c57ap-1L,
> + 0x1.8f1ae991577362b982745c72eddap-1L,
> + 0x1.9145b0b91ffc588a61b469f6b6a0p-1L,
> + 0x1.93737b0cdc5e4f4501c3f2540ae8p-1L,
> + 0x1.95a44cbc8520ee9b483695a0e7fep-1L,
> + 0x1.97d829fde4e4f8b9e920f91e8eb6p-1L,
> + 0x1.9a0f170ca07b9ba3109b8c467844p-1L,
> + 0x1.9c49182a3f0901c7c46b071f28dep-1L,
> + 0x1.9e86319e323231824ca78e64c462p-1L,
> + 0x1.a0c667b5de564b29ada8b8cabbacp-1L,
> + 0x1.a309bec4a2d3358c171f770db1f4p-1L,
> + 0x1.a5503b23e255c8b424491caf88ccp-1L,
> + 0x1.a799e1330b3586f2dfb2b158f31ep-1L,
> + 0x1.a9e6b5579fdbf43eb243bdff53a2p-1L,
> + 0x1.ac36bbfd3f379c0db966a3126988p-1L,
> + 0x1.ae89f995ad3ad5e8734d17731c80p-1L,
> + 0x1.b0e07298db66590842acdfc6fb4ep-1L,
> + 0x1.b33a2b84f15faf6bfd0e7bd941b0p-1L,
> + 0x1.b59728de559398e3881111648738p-1L,
> + 0x1.b7f76f2fb5e46eaa7b081ab53ff6p-1L,
> + 0x1.ba5b030a10649840cb3c6af5b74cp-1L,
> + 0x1.bcc1e904bc1d2247ba0f45b3d06cp-1L,
> + 0x1.bf2c25bd71e088408d7025190cd0p-1L,
> + 0x1.c199bdd85529c2220cb12a0916bap-1L,
> + 0x1.c40ab5fffd07a6d14df820f17deap-1L,
> + 0x1.c67f12e57d14b4a2137fd20f2a26p-1L,
> + 0x1.c8f6d9406e7b511acbc48805c3f6p-1L,
> + 0x1.cb720dcef90691503cbd1e949d0ap-1L,
> + 0x1.cdf0b555dc3f9c44f8958fac4f12p-1L,
> + 0x1.d072d4a07897b8d0f22f21a13792p-1L,
> + 0x1.d2f87080d89f18ade123989ea50ep-1L,
> + 0x1.d5818dcfba48725da05aeb66dff8p-1L,
> + 0x1.d80e316c98397bb84f9d048807a0p-1L,
> + 0x1.da9e603db3285708c01a5b6d480cp-1L,
> + 0x1.dd321f301b4604b695de3c0630c0p-1L,
> + 0x1.dfc97337b9b5eb968cac39ed284cp-1L,
> + 0x1.e264614f5a128a12761fa17adc74p-1L,
> + 0x1.e502ee78b3ff6273d130153992d0p-1L,
> + 0x1.e7a51fbc74c834b548b2832378a4p-1L,
> + 0x1.ea4afa2a490d9858f73a18f5dab4p-1L,
> + 0x1.ecf482d8e67f08db0312fb949d50p-1L,
> + 0x1.efa1bee615a27771fd21a92dabb6p-1L,
> + 0x1.f252b376bba974e8696fc3638f24p-1L,
> + 0x1.f50765b6e4540674f84b762861a6p-1L,
> + 0x1.f7bfdad9cbe138913b4bfe72bd78p-1L,
> + 0x1.fa7c1819e90d82e90a7e74b26360p-1L,
> + 0x1.fd3c22b8f71f10975ba4b32bd006p-1L,
> + 0x1.0000000000000000000000000000p+0L,
> + 0x1.0163da9fb33356d84a66ae336e98p+0L,
> + 0x1.02c9a3e778060ee6f7caca4f7a18p+0L,
> + 0x1.04315e86e7f84bd738f9a20da442p+0L,
> + 0x1.059b0d31585743ae7c548eb68c6ap+0L,
> + 0x1.0706b29ddf6ddc6dc403a9d87b1ep+0L,
> + 0x1.0874518759bc808c35f25d942856p+0L,
> + 0x1.09e3ecac6f3834521e060c584d5cp+0L,
> + 0x1.0b5586cf9890f6298b92b7184200p+0L,
> + 0x1.0cc922b7247f7407b705b893dbdep+0L,
> + 0x1.0e3ec32d3d1a2020742e4f8af794p+0L,
> + 0x1.0fb66affed31af232091dd8a169ep+0L,
> + 0x1.11301d0125b50a4ebbf1aed9321cp+0L,
> + 0x1.12abdc06c31cbfb92bad324d6f84p+0L,
> + 0x1.1429aaea92ddfb34101943b2588ep+0L,
> + 0x1.15a98c8a58e512480d573dd562aep+0L,
> + 0x1.172b83c7d517adcdf7c8c50eb162p+0L,
> + 0x1.18af9388c8de9bbbf70b9a3c269cp+0L,
> + 0x1.1a35beb6fcb753cb698f692d2038p+0L,
> + 0x1.1bbe084045cd39ab1e72b442810ep+0L,
> + 0x1.1d4873168b9aa7805b8028990be8p+0L,
> + 0x1.1ed5022fcd91cb8819ff61121fbep+0L,
> + 0x1.2063b88628cd63b8eeb0295093f6p+0L,
> + 0x1.21f49917ddc962552fd29294bc20p+0L,
> + 0x1.2387a6e75623866c1fadb1c159c0p+0L,
> + 0x1.251ce4fb2a63f3582ab7de9e9562p+0L,
> + 0x1.26b4565e27cdd257a673281d3068p+0L,
> + 0x1.284dfe1f5638096cf15cf03c9fa0p+0L,
> + 0x1.29e9df51fdee12c25d15f5a25022p+0L,
> + 0x1.2b87fd0dad98ffddea46538fca24p+0L,
> + 0x1.2d285a6e4030b40091d536d0733ep+0L,
> + 0x1.2ecafa93e2f5611ca0f45d5239a4p+0L,
> + 0x1.306fe0a31b7152de8d5a463063bep+0L,
> + 0x1.32170fc4cd8313539cf1c3009330p+0L,
> + 0x1.33c08b26416ff4c9c8610d96680ep+0L,
> + 0x1.356c55f929ff0c94623476373be4p+0L,
> + 0x1.371a7373aa9caa7145502f45452ap+0L,
> + 0x1.38cae6d05d86585a9cb0d9bed530p+0L,
> + 0x1.3a7db34e59ff6ea1bc9299e0a1fep+0L,
> + 0x1.3c32dc313a8e484001f228b58cf0p+0L,
> + 0x1.3dea64c12342235b41223e13d7eep+0L,
> + 0x1.3fa4504ac801ba0bf701aa417b9cp+0L,
> + 0x1.4160a21f72e29f84325b8f3dbacap+0L,
> + 0x1.431f5d950a896dc704439410b628p+0L,
> + 0x1.44e086061892d03136f409df0724p+0L,
> + 0x1.46a41ed1d005772512f459229f0ap+0L,
> + 0x1.486a2b5c13cd013c1a3b69062f26p+0L,
> + 0x1.4a32af0d7d3de672d8bcf46f99b4p+0L,
> + 0x1.4bfdad5362a271d4397afec42e36p+0L,
> + 0x1.4dcb299fddd0d63b36ef1a9e19dep+0L,
> + 0x1.4f9b2769d2ca6ad33d8b69aa0b8cp+0L,
> + 0x1.516daa2cf6641c112f52c84d6066p+0L,
> + 0x1.5342b569d4f81df0a83c49d86bf4p+0L,
> + 0x1.551a4ca5d920ec52ec620243540cp+0L,
> + 0x1.56f4736b527da66ecb004764e61ep+0L,
> + 0x1.58d12d497c7fd252bc2b7343d554p+0L,
> + 0x1.5ab07dd48542958c93015191e9a8p+0L,
> + 0x1.5c9268a5946b701c4b1b81697ed4p+0L,
> + 0x1.5e76f15ad21486e9be4c20399d12p+0L,
> + 0x1.605e1b976dc08b076f592a487066p+0L,
> + 0x1.6247eb03a5584b1f0fa06fd2d9eap+0L,
> + 0x1.6434634ccc31fc76f8714c4ee122p+0L,
> + 0x1.66238825522249127d9e29b92ea2p+0L,
> + 0x1.68155d44ca973081c57227b9f69ep+0L,
> +};
> +
> +static const float eps[TBLSIZE] = {
> + -0x1.5c50p-101,
> + -0x1.5d00p-106,
> + 0x1.8e90p-102,
> + -0x1.5340p-103,
> + 0x1.1bd0p-102,
> + -0x1.4600p-105,
> + -0x1.7a40p-104,
> + 0x1.d590p-102,
> + -0x1.d590p-101,
> + 0x1.b100p-103,
> + -0x1.0d80p-105,
> + 0x1.6b00p-103,
> + -0x1.9f00p-105,
> + 0x1.c400p-103,
> + 0x1.e120p-103,
> + -0x1.c100p-104,
> + -0x1.9d20p-103,
> + 0x1.a800p-108,
> + 0x1.4c00p-106,
> + -0x1.9500p-106,
> + 0x1.6900p-105,
> + -0x1.29d0p-100,
> + 0x1.4c60p-103,
> + 0x1.13a0p-102,
> + -0x1.5b60p-103,
> + -0x1.1c40p-103,
> + 0x1.db80p-102,
> + 0x1.91a0p-102,
> + 0x1.dc00p-105,
> + 0x1.44c0p-104,
> + 0x1.9710p-102,
> + 0x1.8760p-103,
> + -0x1.a720p-103,
> + 0x1.ed20p-103,
> + -0x1.49c0p-102,
> + -0x1.e000p-111,
> + 0x1.86a0p-103,
> + 0x1.2b40p-103,
> + -0x1.b400p-108,
> + 0x1.1280p-99,
> + -0x1.02d8p-102,
> + -0x1.e3d0p-103,
> + -0x1.b080p-105,
> + -0x1.f100p-107,
> + -0x1.16c0p-105,
> + -0x1.1190p-103,
> + -0x1.a7d2p-100,
> + 0x1.3450p-103,
> + -0x1.67c0p-105,
> + 0x1.4b80p-104,
> + -0x1.c4e0p-103,
> + 0x1.6000p-108,
> + -0x1.3f60p-105,
> + 0x1.93f0p-104,
> + 0x1.5fe0p-105,
> + 0x1.6f80p-107,
> + -0x1.7600p-106,
> + 0x1.21e0p-106,
> + -0x1.3a40p-106,
> + -0x1.40c0p-104,
> + -0x1.9860p-105,
> + -0x1.5d40p-108,
> + -0x1.1d70p-106,
> + 0x1.2760p-105,
> + 0x0.0000p+0,
> + 0x1.21e2p-104,
> + -0x1.9520p-108,
> + -0x1.5720p-106,
> + -0x1.4810p-106,
> + -0x1.be00p-109,
> + 0x1.0080p-105,
> + -0x1.5780p-108,
> + -0x1.d460p-105,
> + -0x1.6140p-105,
> + 0x1.4630p-104,
> + 0x1.ad50p-103,
> + 0x1.82e0p-105,
> + 0x1.1d3cp-101,
> + 0x1.6100p-107,
> + 0x1.ec30p-104,
> + 0x1.f200p-108,
> + 0x1.0b40p-103,
> + 0x1.3660p-102,
> + 0x1.d9d0p-103,
> + -0x1.02d0p-102,
> + 0x1.b070p-103,
> + 0x1.b9c0p-104,
> + -0x1.01c0p-103,
> + -0x1.dfe0p-103,
> + 0x1.1b60p-104,
> + -0x1.ae94p-101,
> + -0x1.3340p-104,
> + 0x1.b3d8p-102,
> + -0x1.6e40p-105,
> + -0x1.3670p-103,
> + 0x1.c140p-104,
> + 0x1.1840p-101,
> + 0x1.1ab0p-102,
> + -0x1.a400p-104,
> + 0x1.1f00p-104,
> + -0x1.7180p-103,
> + 0x1.4ce0p-102,
> + 0x1.9200p-107,
> + -0x1.54c0p-103,
> + 0x1.1b80p-105,
> + -0x1.1828p-101,
> + 0x1.5720p-102,
> + -0x1.a060p-100,
> + 0x1.9160p-102,
> + 0x1.a280p-104,
> + 0x1.3400p-107,
> + 0x1.2b20p-102,
> + 0x1.7800p-108,
> + 0x1.cfd0p-101,
> + 0x1.2ef0p-102,
> + -0x1.2760p-99,
> + 0x1.b380p-104,
> + 0x1.0048p-101,
> + -0x1.60b0p-102,
> + 0x1.a1ccp-100,
> + -0x1.a640p-104,
> + -0x1.08a0p-101,
> + 0x1.7e60p-102,
> + 0x1.22c0p-103,
> + -0x1.7200p-106,
> + 0x1.f0f0p-102,
> + 0x1.eb4ep-99,
> + 0x1.c6e0p-103,
> +};
> +
> +/*
> + * exp2l(x): compute the base 2 exponential of x
> + *
> + * Accuracy: Peak error < 0.502 ulp.
> + *
> + * Method: (accurate tables)
> + *
> + * Reduce x:
> + * x = 2**k + y, for integer k and |y| <= 1/2.
> + * Thus we have exp2(x) = 2**k * exp2(y).
> + *
> + * Reduce y:
> + * y = i/TBLSIZE + z - eps[i] for integer i near y * TBLSIZE.
> + * Thus we have exp2(y) = exp2(i/TBLSIZE) * exp2(z - eps[i]),
> + * with |z - eps[i]| <= 2**-8 + 2**-98 for the table used.
> + *
> + * We compute exp2(i/TBLSIZE) via table lookup and exp2(z - eps[i]) via
> + * a degree-10 minimax polynomial with maximum error under 2**-120.
> + * The values in exp2t[] and eps[] are chosen such that
> + * exp2t[i] = exp2(i/TBLSIZE + eps[i]), and eps[i] is a small offset such
> + * that exp2t[i] is accurate to 2**-122.
> + *
> + * Note that the range of i is +-TBLSIZE/2, so we actually index the tables
> + * by i0 = i + TBLSIZE/2.
> + *
> + * This method is due to Gal, with many details due to Gal and Bachelis:
> + *
> + * Gal, S. and Bachelis, B. An Accurate Elementary Mathematical Library
> + * for the IEEE Floating Point Standard. TOMS 17(1), 26-46 (1991).
> + */
> +long double
> +exp2l(long double x)
> +{
> + union IEEEl2bits u, v;
> + long double r, t, twopk, twopkp10000, z;
> + uint32_t hx, ix, i0;
> + int k;
> +
> + u.e = x;
> +
> + /* Filter out exceptional cases. */
> + hx = u.xbits.expsign;
> + ix = hx & EXPMASK;
> + if (ix >= BIAS + 14) { /* |x| >= 16384 */
> + if (ix == BIAS + LDBL_MAX_EXP) {
> + if (u.xbits.manh != 0
> + || u.xbits.manl != 0
> + || (hx & 0x8000) == 0)
> + return (x + x); /* x is NaN or +Inf */
> + else
> + return (0.0); /* x is -Inf */
> + }
> + if (x >= 16384)
> + return (huge * huge); /* overflow */
> + if (x <= -16495)
> + return (twom10000 * twom10000); /* underflow */
> + } else if (ix <= BIAS - 115) { /* |x| < 0x1p-115 */
> + return (1.0 + x);
> + }
> +
> + /*
> + * Reduce x, computing z, i0, and k. The low bits of x + redux
> + * contain the 16-bit integer part of the exponent (k) followed by
> + * TBLBITS fractional bits (i0). We use bit tricks to extract these
> + * as integers, then set z to the remainder.
> + *
> + * Example: Suppose x is 0xabc.123456p0 and TBLBITS is 8.
> + * Then the low-order word of x + redux is 0x000abc12,
> + * We split this into k = 0xabc and i0 = 0x12 (adjusted to
> + * index into the table), then we compute z = 0x0.003456p0.
> + *
> + * XXX If the exponent is negative, the computation of k depends on
> + * '>>' doing sign extension.
> + */
> + u.e = x + redux;
> + i0 = (u.bits.manl & 0xffffffff) + TBLSIZE / 2;
> + k = (int)i0 >> TBLBITS;
> + i0 = i0 & (TBLSIZE - 1);
> + u.e -= redux;
> + z = x - u.e;
> + v.xbits.manh = 0;
> + v.xbits.manl = 0;
> + if (k >= LDBL_MIN_EXP) {
> + v.xbits.expsign = LDBL_MAX_EXP - 1 + k;
> + twopk = v.e;
> + } else {
> + v.xbits.expsign = LDBL_MAX_EXP - 1 + k + 10000;
> + twopkp10000 = v.e;
> + }
> +
> + /* Compute r = exp2(y) = exp2t[i0] * p(z - eps[i]). */
> + t = tbl[i0]; /* exp2t[i0] */
> + z -= eps[i0]; /* eps[i0] */
> + r = t + t * z * (P1 + z * (P2 + z * (P3 + z * (P4 + z * (P5 + z * (P6
> + + z * (P7 + z * (P8 + z * (P9 + z * P10)))))))));
> +
> + /* Scale by 2**k. */
> + if(k >= LDBL_MIN_EXP) {
> + if (k == LDBL_MAX_EXP)
> + return (r * 2.0 * 0x1p16383L);
> + return (r * twopk);
> + } else {
> + return (r * twopkp10000 * twom10000);
> + }
> +}
> diff --git a/newlib/libm/ld128/s_expl.c b/newlib/libm/ld128/s_expl.c
> new file mode 100644
> index 000000000..5b786af49
> --- /dev/null
> +++ b/newlib/libm/ld128/s_expl.c
> @@ -0,0 +1,326 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2009-2013 Steven G. Kargl
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice unmodified, this list of conditions, and the following
> + * disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
> + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
> + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
> + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
> + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
> + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
> + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + *
> + * Optimized by Bruce D. Evans.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * ld128 version of s_expl.c. See ../ld80/s_expl.c for most comments.
> + */
> +
> +#include <float.h>
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +#include "k_expl.h"
> +
> +/* XXX Prevent compilers from erroneously constant folding these: */
> +static const volatile long double
> +huge = 0x1p10000L,
> +tiny = 0x1p-10000L;
> +
> +static const long double
> +twom10000 = 0x1p-10000L;
> +
> +static const long double
> +/* log(2**16384 - 0.5) rounded towards zero: */
> +/* log(2**16384 - 0.5 + 1) rounded towards zero for expm1l() is the same: */
> +o_threshold = 11356.523406294143949491931077970763428L,
> +/* log(2**(-16381-64-1)) rounded towards zero: */
> +u_threshold = -11433.462743336297878837243843452621503L;
> +
> +long double
> +expl(long double x)
> +{
> + union IEEEl2bits u;
> + long double hi, lo, t, twopk;
> + int k;
> + uint16_t hx, ix;
> +
> + DOPRINT_START(&x);
> +
> + /* Filter out exceptional cases. */
> + u.e = x;
> + hx = u.xbits.expsign;
> + ix = hx & 0x7fff;
> + if (ix >= BIAS + 13) { /* |x| >= 8192 or x is NaN */
> + if (ix == BIAS + LDBL_MAX_EXP) {
> + if (hx & 0x8000) /* x is -Inf or -NaN */
> + RETURNP(-1 / x);
> + RETURNP(x + x); /* x is +Inf or +NaN */
> + }
> + if (x > o_threshold)
> + RETURNP(huge * huge);
> + if (x < u_threshold)
> + RETURNP(tiny * tiny);
> + } else if (ix < BIAS - 114) { /* |x| < 0x1p-114 */
> + RETURN2P(1, x); /* 1 with inexact iff x != 0 */
> + }
> +
> + ENTERI();
> +
> + twopk = 1;
> + __k_expl(x, &hi, &lo, &k);
> + t = SUM2P(hi, lo);
> +
> + /* Scale by 2**k. */
> + /*
> + * XXX sparc64 multiplication was so slow that scalbnl() is faster,
> + * but performance on aarch64 and riscv hasn't yet been quantified.
> + */
> + if (k >= LDBL_MIN_EXP) {
> + if (k == LDBL_MAX_EXP)
> + RETURNI(t * 2 * 0x1p16383L);
> + SET_LDBL_EXPSIGN(twopk, BIAS + k);
> + RETURNI(t * twopk);
> + } else {
> + SET_LDBL_EXPSIGN(twopk, BIAS + k + 10000);
> + RETURNI(t * twopk * twom10000);
> + }
> +}
> +
> +/*
> + * Our T1 and T2 are chosen to be approximately the points where method
> + * A and method B have the same accuracy. Tang's T1 and T2 are the
> + * points where method A's accuracy changes by a full bit. For Tang,
> + * this drop in accuracy makes method A immediately less accurate than
> + * method B, but our larger INTERVALS makes method A 2 bits more
> + * accurate so it remains the most accurate method significantly
> + * closer to the origin despite losing the full bit in our extended
> + * range for it.
> + *
> + * Split the interval [T1, T2] into two intervals [T1, T3] and [T3, T2].
> + * Setting T3 to 0 would require the |x| < 0x1p-113 condition to appear
> + * in both subintervals, so set T3 = 2**-5, which places the condition
> + * into the [T1, T3] interval.
> + *
> + * XXX we now do this more to (partially) balance the number of terms
> + * in the C and D polys than to avoid checking the condition in both
> + * intervals.
> + *
> + * XXX these micro-optimizations are excessive.
> + */
> +static const double
> +T1 = -0.1659, /* ~-30.625/128 * log(2) */
> +T2 = 0.1659, /* ~30.625/128 * log(2) */
> +T3 = 0.03125;
> +
> +/*
> + * Domain [-0.1659, 0.03125], range ~[2.9134e-44, 1.8404e-37]:
> + * |(exp(x)-1-x-x**2/2)/x - p(x)| < 2**-122.03
> + *
> + * XXX none of the long double C or D coeffs except C10 is correctly printed.
> + * If you re-print their values in %.35Le format, the result is always
> + * different. For example, the last 2 digits in C3 should be 59, not 67.
> + * 67 is apparently from rounding an extra-precision value to 36 decimal
> + * places.
> + */
> +static const long double
> +C3 = 1.66666666666666666666666666666666667e-1L,
> +C4 = 4.16666666666666666666666666666666645e-2L,
> +C5 = 8.33333333333333333333333333333371638e-3L,
> +C6 = 1.38888888888888888888888888891188658e-3L,
> +C7 = 1.98412698412698412698412697235950394e-4L,
> +C8 = 2.48015873015873015873015112487849040e-5L,
> +C9 = 2.75573192239858906525606685484412005e-6L,
> +C10 = 2.75573192239858906612966093057020362e-7L,
> +C11 = 2.50521083854417203619031960151253944e-8L,
> +C12 = 2.08767569878679576457272282566520649e-9L,
> +C13 = 1.60590438367252471783548748824255707e-10L;
> +
> +/*
> + * XXX this has 1 more coeff than needed.
> + * XXX can start the double coeffs but not the double mults at C10.
> + * With my coeffs (C10-C17 double; s = best_s):
> + * Domain [-0.1659, 0.03125], range ~[-1.1976e-37, 1.1976e-37]:
> + * |(exp(x)-1-x-x**2/2)/x - p(x)| ~< 2**-122.65
> + */
> +static const double
> +C14 = 1.1470745580491932e-11, /* 0x1.93974a81dae30p-37 */
> +C15 = 7.6471620181090468e-13, /* 0x1.ae7f3820adab1p-41 */
> +C16 = 4.7793721460260450e-14, /* 0x1.ae7cd18a18eacp-45 */
> +C17 = 2.8074757356658877e-15, /* 0x1.949992a1937d9p-49 */
> +C18 = 1.4760610323699476e-16; /* 0x1.545b43aabfbcdp-53 */
> +
> +/*
> + * Domain [0.03125, 0.1659], range ~[-2.7676e-37, -1.0367e-38]:
> + * |(exp(x)-1-x-x**2/2)/x - p(x)| < 2**-121.44
> + */
> +static const long double
> +D3 = 1.66666666666666666666666666666682245e-1L,
> +D4 = 4.16666666666666666666666666634228324e-2L,
> +D5 = 8.33333333333333333333333364022244481e-3L,
> +D6 = 1.38888888888888888888887138722762072e-3L,
> +D7 = 1.98412698412698412699085805424661471e-4L,
> +D8 = 2.48015873015873015687993712101479612e-5L,
> +D9 = 2.75573192239858944101036288338208042e-6L,
> +D10 = 2.75573192239853161148064676533754048e-7L,
> +D11 = 2.50521083855084570046480450935267433e-8L,
> +D12 = 2.08767569819738524488686318024854942e-9L,
> +D13 = 1.60590442297008495301927448122499313e-10L;
> +
> +/*
> + * XXX this has 1 more coeff than needed.
> + * XXX can start the double coeffs but not the double mults at D11.
> + * With my coeffs (D11-D16 double):
> + * Domain [0.03125, 0.1659], range ~[-1.1980e-37, 1.1980e-37]:
> + * |(exp(x)-1-x-x**2/2)/x - p(x)| ~< 2**-122.65
> + */
> +static const double
> +D14 = 1.1470726176204336e-11, /* 0x1.93971dc395d9ep-37 */
> +D15 = 7.6478532249581686e-13, /* 0x1.ae892e3D16fcep-41 */
> +D16 = 4.7628892832607741e-14, /* 0x1.ad00Dfe41feccp-45 */
> +D17 = 3.0524857220358650e-15; /* 0x1.D7e8d886Df921p-49 */
> +
> +long double
> +expm1l(long double x)
> +{
> + union IEEEl2bits u, v;
> + long double hx2_hi, hx2_lo, q, r, r1, t, twomk, twopk, x_hi;
> + long double x_lo, x2;
> + double dr, dx, fn, r2;
> + int k, n, n2;
> + uint16_t hx, ix;
> +
> + DOPRINT_START(&x);
> +
> + /* Filter out exceptional cases. */
> + u.e = x;
> + hx = u.xbits.expsign;
> + ix = hx & 0x7fff;
> + if (ix >= BIAS + 7) { /* |x| >= 128 or x is NaN */
> + if (ix == BIAS + LDBL_MAX_EXP) {
> + if (hx & 0x8000) /* x is -Inf or -NaN */
> + RETURNP(-1 / x - 1);
> + RETURNP(x + x); /* x is +Inf or +NaN */
> + }
> + if (x > o_threshold)
> + RETURNP(huge * huge);
> + /*
> + * expm1l() never underflows, but it must avoid
> + * unrepresentable large negative exponents. We used a
> + * much smaller threshold for large |x| above than in
> + * expl() so as to handle not so large negative exponents
> + * in the same way as large ones here.
> + */
> + if (hx & 0x8000) /* x <= -128 */
> + RETURN2P(tiny, -1); /* good for x < -114ln2 - eps */
> + }
> +
> + ENTERI();
> +
> + if (T1 < x && x < T2) {
> + x2 = x * x;
> + dx = x;
> +
> + if (x < T3) {
> + if (ix < BIAS - 113) { /* |x| < 0x1p-113 */
> + /* x (rounded) with inexact if x != 0: */
> + RETURNPI(x == 0 ? x :
> + (0x1p200 * x + fabsl(x)) * 0x1p-200);
> + }
> + q = x * x2 * C3 + x2 * x2 * (C4 + x * (C5 + x * (C6 +
> + x * (C7 + x * (C8 + x * (C9 + x * (C10 +
> + x * (C11 + x * (C12 + x * (C13 +
> + dx * (C14 + dx * (C15 + dx * (C16 +
> + dx * (C17 + dx * C18))))))))))))));
> + } else {
> + q = x * x2 * D3 + x2 * x2 * (D4 + x * (D5 + x * (D6 +
> + x * (D7 + x * (D8 + x * (D9 + x * (D10 +
> + x * (D11 + x * (D12 + x * (D13 +
> + dx * (D14 + dx * (D15 + dx * (D16 +
> + dx * D17)))))))))))));
> + }
> +
> + x_hi = (float)x;
> + x_lo = x - x_hi;
> + hx2_hi = x_hi * x_hi / 2;
> + hx2_lo = x_lo * (x + x_hi) / 2;
> + if (ix >= BIAS - 7)
> + RETURN2PI(hx2_hi + x_hi, hx2_lo + x_lo + q);
> + else
> + RETURN2PI(x, hx2_lo + q + hx2_hi);
> + }
> +
> + /* Reduce x to (k*ln2 + endpoint[n2] + r1 + r2). */
> + fn = rnint((double)x * INV_L);
> + n = irint(fn);
> + n2 = (unsigned)n % INTERVALS;
> + k = n >> LOG2_INTERVALS;
> + r1 = x - fn * L1;
> + r2 = fn * -L2;
> + r = r1 + r2;
> +
> + /* Prepare scale factor. */
> + v.e = 1;
> + v.xbits.expsign = BIAS + k;
> + twopk = v.e;
> +
> + /*
> + * Evaluate lower terms of
> + * expl(endpoint[n2] + r1 + r2) = tbl[n2] * expl(r1 + r2).
> + */
> + dr = r;
> + q = r2 + r * r * (A2 + r * (A3 + r * (A4 + r * (A5 + r * (A6 +
> + dr * (A7 + dr * (A8 + dr * (A9 + dr * A10))))))));
> +
> + t = tbl[n2].lo + tbl[n2].hi;
> +
> + if (k == 0) {
> + t = SUM2P(tbl[n2].hi - 1, tbl[n2].lo * (r1 + 1) + t * q +
> + tbl[n2].hi * r1);
> + RETURNI(t);
> + }
> + if (k == -1) {
> + t = SUM2P(tbl[n2].hi - 2, tbl[n2].lo * (r1 + 1) + t * q +
> + tbl[n2].hi * r1);
> + RETURNI(t / 2);
> + }
> + if (k < -7) {
> + t = SUM2P(tbl[n2].hi, tbl[n2].lo + t * (q + r1));
> + RETURNI(t * twopk - 1);
> + }
> + if (k > 2 * LDBL_MANT_DIG - 1) {
> + t = SUM2P(tbl[n2].hi, tbl[n2].lo + t * (q + r1));
> + if (k == LDBL_MAX_EXP)
> + RETURNI(t * 2 * 0x1p16383L - 1);
> + RETURNI(t * twopk - 1);
> + }
> +
> + v.xbits.expsign = BIAS - k;
> + twomk = v.e;
> +
> + if (k > LDBL_MANT_DIG - 1)
> + t = SUM2P(tbl[n2].hi, tbl[n2].lo - twomk + t * (q + r1));
> + else
> + t = SUM2P(tbl[n2].hi - twomk, tbl[n2].lo + t * (q + r1));
> + RETURNI(t * twopk);
> +}
> diff --git a/newlib/libm/ld128/s_logl.c b/newlib/libm/ld128/s_logl.c
> new file mode 100644
> index 000000000..4774a271e
> --- /dev/null
> +++ b/newlib/libm/ld128/s_logl.c
> @@ -0,0 +1,740 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2007-2013 Bruce D. Evans
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice unmodified, this list of conditions, and the following
> + * disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
> + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
> + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
> + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
> + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
> + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
> + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/**
> + * Implementation of the natural logarithm of x for 128-bit format.
> + *
> + * First decompose x into its base 2 representation:
> + *
> + * log(x) = log(X * 2**k), where X is in [1, 2)
> + * = log(X) + k * log(2).
> + *
> + * Let X = X_i + e, where X_i is the center of one of the intervals
> + * [-1.0/256, 1.0/256), [1.0/256, 3.0/256), .... [2.0-1.0/256, 2.0+1.0/256)
> + * and X is in this interval. Then
> + *
> + * log(X) = log(X_i + e)
> + * = log(X_i * (1 + e / X_i))
> + * = log(X_i) + log(1 + e / X_i).
> + *
> + * The values log(X_i) are tabulated below. Let d = e / X_i and use
> + *
> + * log(1 + d) = p(d)
> + *
> + * where p(d) = d - 0.5*d*d + ... is a special minimax polynomial of
> + * suitably high degree.
> + *
> + * To get sufficiently small roundoff errors, k * log(2), log(X_i), and
> + * sometimes (if |k| is not large) the first term in p(d) must be evaluated
> + * and added up in extra precision. Extra precision is not needed for the
> + * rest of p(d). In the worst case when k = 0 and log(X_i) is 0, the final
> + * error is controlled mainly by the error in the second term in p(d). The
> + * error in this term itself is at most 0.5 ulps from the d*d operation in
> + * it. The error in this term relative to the first term is thus at most
> + * 0.5 * |-0.5| * |d| < 1.0/1024 ulps. We aim for an accumulated error of
> + * at most twice this at the point of the final rounding step. Thus the
> + * final error should be at most 0.5 + 1.0/512 = 0.5020 ulps. Exhaustive
> + * testing of a float variant of this function showed a maximum final error
> + * of 0.5008 ulps. Non-exhaustive testing of a double variant of this
> + * function showed a maximum final error of 0.5078 ulps (near 1+1.0/256).
> + *
> + * We made the maximum of |d| (and thus the total relative error and the
> + * degree of p(d)) small by using a large number of intervals. Using
> + * centers of intervals instead of endpoints reduces this maximum by a
> + * factor of 2 for a given number of intervals. p(d) is special only
> + * in beginning with the Taylor coefficients 0 + 1*d, which tends to happen
> + * naturally. The most accurate minimax polynomial of a given degree might
> + * be different, but then we wouldn't want it since we would have to do
> + * extra work to avoid roundoff error (especially for P0*d instead of d).
> + */
> +
> +#ifdef DEBUG
> +#include <assert.h>
> +#include <fenv.h>
> +#endif
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#ifndef NO_STRUCT_RETURN
> +#define STRUCT_RETURN
> +#endif
> +#include "math_private.h"
> +
> +#if !defined(NO_UTAB) && !defined(NO_UTABL)
> +#define USE_UTAB
> +#endif
> +
> +/*
> + * Domain [-0.005280, 0.004838], range ~[-1.1577e-37, 1.1582e-37]:
> + * |log(1 + d)/d - p(d)| < 2**-122.7
> + */
> +static const long double
> +P2 = -0.5L,
> +P3 = 3.33333333333333333333333333333233795e-1L, /* 0x15555555555555555555555554d42.0p-114L */
> +P4 = -2.49999999999999999999999999941139296e-1L, /* -0x1ffffffffffffffffffffffdab14e.0p-115L */
> +P5 = 2.00000000000000000000000085468039943e-1L, /* 0x19999999999999999999a6d3567f4.0p-115L */
> +P6 = -1.66666666666666666666696142372698408e-1L, /* -0x15555555555555555567267a58e13.0p-115L */
> +P7 = 1.42857142857142857119522943477166120e-1L, /* 0x1249249249249248ed79a0ae434de.0p-115L */
> +P8 = -1.24999999999999994863289015033581301e-1L; /* -0x1fffffffffffffa13e91765e46140.0p-116L */
> +/* Double precision gives ~ 53 + log2(P9 * max(|d|)**8) ~= 120 bits. */
> +static const double
> +P9 = 1.1111111111111401e-1, /* 0x1c71c71c71c7ed.0p-56 */
> +P10 = -1.0000000000040135e-1, /* -0x199999999a0a92.0p-56 */
> +P11 = 9.0909090728136258e-2, /* 0x1745d173962111.0p-56 */
> +P12 = -8.3333318851855284e-2, /* -0x1555551722c7a3.0p-56 */
> +P13 = 7.6928634666404178e-2, /* 0x13b1985204a4ae.0p-56 */
> +P14 = -7.1626810078462499e-2; /* -0x12562276cdc5d0.0p-56 */
> +
> +static volatile const double zero = 0;
> +
> +#define INTERVALS 128
> +#define LOG2_INTERVALS 7
> +#define TSIZE (INTERVALS + 1)
> +#define G(i) (T[(i)].G)
> +#define F_hi(i) (T[(i)].F_hi)
> +#define F_lo(i) (T[(i)].F_lo)
> +#define ln2_hi F_hi(TSIZE - 1)
> +#define ln2_lo F_lo(TSIZE - 1)
> +#define E(i) (U[(i)].E)
> +#define H(i) (U[(i)].H)
> +
> +static const struct {
> + float G; /* 1/(1 + i/128) rounded to 8/9 bits */
> + float F_hi; /* log(1 / G_i) rounded (see below) */
> + /* The compiler will insert 8 bytes of padding here. */
> + long double F_lo; /* next 113 bits for log(1 / G_i) */
> +} T[TSIZE] = {
> + /*
> + * ln2_hi and each F_hi(i) are rounded to a number of bits that
> + * makes F_hi(i) + dk*ln2_hi exact for all i and all dk.
> + *
> + * The last entry (for X just below 2) is used to define ln2_hi
> + * and ln2_lo, to ensure that F_hi(i) and F_lo(i) cancel exactly
> + * with dk*ln2_hi and dk*ln2_lo, respectively, when dk = -1.
> + * This is needed for accuracy when x is just below 1. (To avoid
> + * special cases, such x are "reduced" strangely to X just below
> + * 2 and dk = -1, and then the exact cancellation is needed
> + * because any the error from any non-exactness would be too
> + * large).
> + *
> + * The relevant range of dk is [-16445, 16383]. The maximum number
> + * of bits in F_hi(i) that works is very dependent on i but has
> + * a minimum of 93. We only need about 12 bits in F_hi(i) for
> + * it to provide enough extra precision.
> + *
> + * We round F_hi(i) to 24 bits so that it can have type float,
> + * mainly to minimize the size of the table. Using all 24 bits
> + * in a float for it automatically satisfies the above constraints.
> + */
> + 0x800000.0p-23, 0, 0,
> + 0xfe0000.0p-24, 0x8080ac.0p-30, -0x14ee431dae6674afa0c4bfe16e8fd.0p-144L,
> + 0xfc0000.0p-24, 0x8102b3.0p-29, -0x1db29ee2d83717be918e1119642ab.0p-144L,
> + 0xfa0000.0p-24, 0xc24929.0p-29, 0x1191957d173697cf302cc9476f561.0p-143L,
> + 0xf80000.0p-24, 0x820aec.0p-28, 0x13ce8888e02e78eba9b1113bc1c18.0p-142L,
> + 0xf60000.0p-24, 0xa33577.0p-28, -0x17a4382ce6eb7bfa509bec8da5f22.0p-142L,
> + 0xf48000.0p-24, 0xbc42cb.0p-28, -0x172a21161a107674986dcdca6709c.0p-143L,
> + 0xf30000.0p-24, 0xd57797.0p-28, -0x1e09de07cb958897a3ea46e84abb3.0p-142L,
> + 0xf10000.0p-24, 0xf7518e.0p-28, 0x1ae1eec1b036c484993c549c4bf40.0p-151L,
> + 0xef0000.0p-24, 0x8cb9df.0p-27, -0x1d7355325d560d9e9ab3d6ebab580.0p-141L,
> + 0xed8000.0p-24, 0x999ec0.0p-27, -0x1f9f02d256d5037108f4ec21e48cd.0p-142L,
> + 0xec0000.0p-24, 0xa6988b.0p-27, -0x16fc0a9d12c17a70f7a684c596b12.0p-143L,
> + 0xea0000.0p-24, 0xb80698.0p-27, 0x15d581c1e8da99ded322fb08b8462.0p-141L,
> + 0xe80000.0p-24, 0xc99af3.0p-27, -0x1535b3ba8f150ae09996d7bb4653e.0p-143L,
> + 0xe70000.0p-24, 0xd273b2.0p-27, 0x163786f5251aefe0ded34c8318f52.0p-145L,
> + 0xe50000.0p-24, 0xe442c0.0p-27, 0x1bc4b2368e32d56699c1799a244d4.0p-144L,
> + 0xe38000.0p-24, 0xf1b83f.0p-27, 0x1c6090f684e6766abceccab1d7174.0p-141L,
> + 0xe20000.0p-24, 0xff448a.0p-27, -0x1890aa69ac9f4215f93936b709efb.0p-142L,
> + 0xe08000.0p-24, 0x8673f6.0p-26, 0x1b9985194b6affd511b534b72a28e.0p-140L,
> + 0xdf0000.0p-24, 0x8d515c.0p-26, -0x1dc08d61c6ef1d9b2ef7e68680598.0p-143L,
> + 0xdd8000.0p-24, 0x943a9e.0p-26, -0x1f72a2dac729b3f46662238a9425a.0p-142L,
> + 0xdc0000.0p-24, 0x9b2fe6.0p-26, -0x1fd4dfd3a0afb9691aed4d5e3df94.0p-140L,
> + 0xda8000.0p-24, 0xa2315d.0p-26, -0x11b26121629c46c186384993e1c93.0p-142L,
> + 0xd90000.0p-24, 0xa93f2f.0p-26, 0x1286d633e8e5697dc6a402a56fce1.0p-141L,
> + 0xd78000.0p-24, 0xb05988.0p-26, 0x16128eba9367707ebfa540e45350c.0p-144L,
> + 0xd60000.0p-24, 0xb78094.0p-26, 0x16ead577390d31ef0f4c9d43f79b2.0p-140L,
> + 0xd50000.0p-24, 0xbc4c6c.0p-26, 0x151131ccf7c7b75e7d900b521c48d.0p-141L,
> + 0xd38000.0p-24, 0xc3890a.0p-26, -0x115e2cd714bd06508aeb00d2ae3e9.0p-140L,
> + 0xd20000.0p-24, 0xcad2d7.0p-26, -0x1847f406ebd3af80485c2f409633c.0p-142L,
> + 0xd10000.0p-24, 0xcfb620.0p-26, 0x1c2259904d686581799fbce0b5f19.0p-141L,
> + 0xcf8000.0p-24, 0xd71653.0p-26, 0x1ece57a8d5ae54f550444ecf8b995.0p-140L,
> + 0xce0000.0p-24, 0xde843a.0p-26, -0x1f109d4bc4595412b5d2517aaac13.0p-141L,
> + 0xcd0000.0p-24, 0xe37fde.0p-26, 0x1bc03dc271a74d3a85b5b43c0e727.0p-141L,
> + 0xcb8000.0p-24, 0xeb050c.0p-26, -0x1bf2badc0df841a71b79dd5645b46.0p-145L,
> + 0xca0000.0p-24, 0xf29878.0p-26, -0x18efededd89fbe0bcfbe6d6db9f66.0p-147L,
> + 0xc90000.0p-24, 0xf7ad6f.0p-26, 0x1373ff977baa6911c7bafcb4d84fb.0p-141L,
> + 0xc80000.0p-24, 0xfcc8e3.0p-26, 0x196766f2fb328337cc050c6d83b22.0p-140L,
> + 0xc68000.0p-24, 0x823f30.0p-25, 0x19bd076f7c434e5fcf1a212e2a91e.0p-139L,
> + 0xc58000.0p-24, 0x84d52c.0p-25, -0x1a327257af0f465e5ecab5f2a6f81.0p-139L,
> + 0xc40000.0p-24, 0x88bc74.0p-25, 0x113f23def19c5a0fe396f40f1dda9.0p-141L,
> + 0xc30000.0p-24, 0x8b5ae6.0p-25, 0x1759f6e6b37de945a049a962e66c6.0p-139L,
> + 0xc20000.0p-24, 0x8dfccb.0p-25, 0x1ad35ca6ed5147bdb6ddcaf59c425.0p-141L,
> + 0xc10000.0p-24, 0x90a22b.0p-25, 0x1a1d71a87deba46bae9827221dc98.0p-139L,
> + 0xbf8000.0p-24, 0x94a0d8.0p-25, -0x139e5210c2b730e28aba001a9b5e0.0p-140L,
> + 0xbe8000.0p-24, 0x974f16.0p-25, -0x18f6ebcff3ed72e23e13431adc4a5.0p-141L,
> + 0xbd8000.0p-24, 0x9a00f1.0p-25, -0x1aa268be39aab7148e8d80caa10b7.0p-139L,
> + 0xbc8000.0p-24, 0x9cb672.0p-25, -0x14c8815839c5663663d15faed7771.0p-139L,
> + 0xbb0000.0p-24, 0xa0cda1.0p-25, 0x1eaf46390dbb2438273918db7df5c.0p-141L,
> + 0xba0000.0p-24, 0xa38c6e.0p-25, 0x138e20d831f698298adddd7f32686.0p-141L,
> + 0xb90000.0p-24, 0xa64f05.0p-25, -0x1e8d3c41123615b147a5d47bc208f.0p-142L,
> + 0xb80000.0p-24, 0xa91570.0p-25, 0x1ce28f5f3840b263acb4351104631.0p-140L,
> + 0xb70000.0p-24, 0xabdfbb.0p-25, -0x186e5c0a42423457e22d8c650b355.0p-139L,
> + 0xb60000.0p-24, 0xaeadef.0p-25, -0x14d41a0b2a08a465dc513b13f567d.0p-143L,
> + 0xb50000.0p-24, 0xb18018.0p-25, 0x16755892770633947ffe651e7352f.0p-139L,
> + 0xb40000.0p-24, 0xb45642.0p-25, -0x16395ebe59b15228bfe8798d10ff0.0p-142L,
> + 0xb30000.0p-24, 0xb73077.0p-25, 0x1abc65c8595f088b61a335f5b688c.0p-140L,
> + 0xb20000.0p-24, 0xba0ec4.0p-25, -0x1273089d3dad88e7d353e9967d548.0p-139L,
> + 0xb10000.0p-24, 0xbcf133.0p-25, 0x10f9f67b1f4bbf45de06ecebfaf6d.0p-139L,
> + 0xb00000.0p-24, 0xbfd7d2.0p-25, -0x109fab904864092b34edda19a831e.0p-140L,
> + 0xaf0000.0p-24, 0xc2c2ac.0p-25, -0x1124680aa43333221d8a9b475a6ba.0p-139L,
> + 0xae8000.0p-24, 0xc439b3.0p-25, -0x1f360cc4710fbfe24b633f4e8d84d.0p-140L,
> + 0xad8000.0p-24, 0xc72afd.0p-25, -0x132d91f21d89c89c45003fc5d7807.0p-140L,
> + 0xac8000.0p-24, 0xca20a2.0p-25, -0x16bf9b4d1f8da8002f2449e174504.0p-139L,
> + 0xab8000.0p-24, 0xcd1aae.0p-25, 0x19deb5ce6a6a8717d5626e16acc7d.0p-141L,
> + 0xaa8000.0p-24, 0xd0192f.0p-25, 0x1a29fb48f7d3ca87dabf351aa41f4.0p-139L,
> + 0xaa0000.0p-24, 0xd19a20.0p-25, 0x1127d3c6457f9d79f51dcc73014c9.0p-141L,
> + 0xa90000.0p-24, 0xd49f6a.0p-25, -0x1ba930e486a0ac42d1bf9199188e7.0p-141L,
> + 0xa80000.0p-24, 0xd7a94b.0p-25, -0x1b6e645f31549dd1160bcc45c7e2c.0p-139L,
> + 0xa70000.0p-24, 0xdab7d0.0p-25, 0x1118a425494b610665377f15625b6.0p-140L,
> + 0xa68000.0p-24, 0xdc40d5.0p-25, 0x1966f24d29d3a2d1b2176010478be.0p-140L,
> + 0xa58000.0p-24, 0xdf566d.0p-25, -0x1d8e52eb2248f0c95dd83626d7333.0p-142L,
> + 0xa48000.0p-24, 0xe270ce.0p-25, -0x1ee370f96e6b67ccb006a5b9890ea.0p-140L,
> + 0xa40000.0p-24, 0xe3ffce.0p-25, 0x1d155324911f56db28da4d629d00a.0p-140L,
> + 0xa30000.0p-24, 0xe72179.0p-25, -0x1fe6e2f2f867d8f4d60c713346641.0p-140L,
> + 0xa20000.0p-24, 0xea4812.0p-25, 0x1b7be9add7f4d3b3d406b6cbf3ce5.0p-140L,
> + 0xa18000.0p-24, 0xebdd3d.0p-25, 0x1b3cfb3f7511dd73692609040ccc2.0p-139L,
> + 0xa08000.0p-24, 0xef0b5b.0p-25, -0x1220de1f7301901b8ad85c25afd09.0p-139L,
> + 0xa00000.0p-24, 0xf0a451.0p-25, -0x176364c9ac81cc8a4dfb804de6867.0p-140L,
> + 0x9f0000.0p-24, 0xf3da16.0p-25, 0x1eed6b9aafac8d42f78d3e65d3727.0p-141L,
> + 0x9e8000.0p-24, 0xf576e9.0p-25, 0x1d593218675af269647b783d88999.0p-139L,
> + 0x9d8000.0p-24, 0xf8b47c.0p-25, -0x13e8eb7da053e063714615f7cc91d.0p-144L,
> + 0x9d0000.0p-24, 0xfa553f.0p-25, 0x1c063259bcade02951686d5373aec.0p-139L,
> + 0x9c0000.0p-24, 0xfd9ac5.0p-25, 0x1ef491085fa3c1649349630531502.0p-139L,
> + 0x9b8000.0p-24, 0xff3f8c.0p-25, 0x1d607a7c2b8c5320619fb9433d841.0p-139L,
> + 0x9a8000.0p-24, 0x814697.0p-24, -0x12ad3817004f3f0bdff99f932b273.0p-138L,
> + 0x9a0000.0p-24, 0x821b06.0p-24, -0x189fc53117f9e54e78103a2bc1767.0p-141L,
> + 0x990000.0p-24, 0x83c5f8.0p-24, 0x14cf15a048907b7d7f47ddb45c5a3.0p-139L,
> + 0x988000.0p-24, 0x849c7d.0p-24, 0x1cbb1d35fb82873b04a9af1dd692c.0p-138L,
> + 0x978000.0p-24, 0x864ba6.0p-24, 0x1128639b814f9b9770d8cb6573540.0p-138L,
> + 0x970000.0p-24, 0x87244c.0p-24, 0x184733853300f002e836dfd47bd41.0p-139L,
> + 0x968000.0p-24, 0x87fdaa.0p-24, 0x109d23aef77dd5cd7cc94306fb3ff.0p-140L,
> + 0x958000.0p-24, 0x89b293.0p-24, -0x1a81ef367a59de2b41eeebd550702.0p-138L,
> + 0x950000.0p-24, 0x8a8e20.0p-24, -0x121ad3dbb2f45275c917a30df4ac9.0p-138L,
> + 0x948000.0p-24, 0x8b6a6a.0p-24, -0x1cfb981628af71a89df4e6df2e93b.0p-139L,
> + 0x938000.0p-24, 0x8d253a.0p-24, -0x1d21730ea76cfdec367828734cae5.0p-139L,
> + 0x930000.0p-24, 0x8e03c2.0p-24, 0x135cc00e566f76b87333891e0dec4.0p-138L,
> + 0x928000.0p-24, 0x8ee30d.0p-24, -0x10fcb5df257a263e3bf446c6e3f69.0p-140L,
> + 0x918000.0p-24, 0x90a3ee.0p-24, -0x16e171b15433d723a4c7380a448d8.0p-139L,
> + 0x910000.0p-24, 0x918587.0p-24, -0x1d050da07f3236f330972da2a7a87.0p-139L,
> + 0x908000.0p-24, 0x9267e7.0p-24, 0x1be03669a5268d21148c6002becd3.0p-139L,
> + 0x8f8000.0p-24, 0x942f04.0p-24, 0x10b28e0e26c336af90e00533323ba.0p-139L,
> + 0x8f0000.0p-24, 0x9513c3.0p-24, 0x1a1d820da57cf2f105a89060046aa.0p-138L,
> + 0x8e8000.0p-24, 0x95f950.0p-24, -0x19ef8f13ae3cf162409d8ea99d4c0.0p-139L,
> + 0x8e0000.0p-24, 0x96dfab.0p-24, -0x109e417a6e507b9dc10dac743ad7a.0p-138L,
> + 0x8d0000.0p-24, 0x98aed2.0p-24, 0x10d01a2c5b0e97c4990b23d9ac1f5.0p-139L,
> + 0x8c8000.0p-24, 0x9997a2.0p-24, -0x1d6a50d4b61ea74540bdd2aa99a42.0p-138L,
> + 0x8c0000.0p-24, 0x9a8145.0p-24, 0x1b3b190b83f9527e6aba8f2d783c1.0p-138L,
> + 0x8b8000.0p-24, 0x9b6bbf.0p-24, 0x13a69fad7e7abe7ba81c664c107e0.0p-138L,
> + 0x8b0000.0p-24, 0x9c5711.0p-24, -0x11cd12316f576aad348ae79867223.0p-138L,
> + 0x8a8000.0p-24, 0x9d433b.0p-24, 0x1c95c444b807a246726b304ccae56.0p-139L,
> + 0x898000.0p-24, 0x9f1e22.0p-24, -0x1b9c224ea698c2f9b47466d6123fe.0p-139L,
> + 0x890000.0p-24, 0xa00ce1.0p-24, 0x125ca93186cf0f38b4619a2483399.0p-141L,
> + 0x888000.0p-24, 0xa0fc80.0p-24, -0x1ee38a7bc228b3597043be78eaf49.0p-139L,
> + 0x880000.0p-24, 0xa1ed00.0p-24, -0x1a0db876613d204147dc69a07a649.0p-138L,
> + 0x878000.0p-24, 0xa2de62.0p-24, 0x193224e8516c008d3602a7b41c6e8.0p-139L,
> + 0x870000.0p-24, 0xa3d0a9.0p-24, 0x1fa28b4d2541aca7d5844606b2421.0p-139L,
> + 0x868000.0p-24, 0xa4c3d6.0p-24, 0x1c1b5760fb4571acbcfb03f16daf4.0p-138L,
> + 0x858000.0p-24, 0xa6acea.0p-24, 0x1fed5d0f65949c0a345ad743ae1ae.0p-140L,
> + 0x850000.0p-24, 0xa7a2d4.0p-24, 0x1ad270c9d749362382a7688479e24.0p-140L,
> + 0x848000.0p-24, 0xa899ab.0p-24, 0x199ff15ce532661ea9643a3a2d378.0p-139L,
> + 0x840000.0p-24, 0xa99171.0p-24, 0x1a19e15ccc45d257530a682b80490.0p-139L,
> + 0x838000.0p-24, 0xaa8a28.0p-24, -0x121a14ec532b35ba3e1f868fd0b5e.0p-140L,
> + 0x830000.0p-24, 0xab83d1.0p-24, 0x1aee319980bff3303dd481779df69.0p-139L,
> + 0x828000.0p-24, 0xac7e6f.0p-24, -0x18ffd9e3900345a85d2d86161742e.0p-140L,
> + 0x820000.0p-24, 0xad7a03.0p-24, -0x1e4db102ce29f79b026b64b42caa1.0p-140L,
> + 0x818000.0p-24, 0xae768f.0p-24, 0x17c35c55a04a82ab19f77652d977a.0p-141L,
> + 0x810000.0p-24, 0xaf7415.0p-24, 0x1448324047019b48d7b98c1cf7234.0p-138L,
> + 0x808000.0p-24, 0xb07298.0p-24, -0x1750ee3915a197e9c7359dd94152f.0p-138L,
> + 0x800000.0p-24, 0xb17218.0p-24, -0x105c610ca86c3898cff81a12a17e2.0p-141L,
> +};
> +
> +#ifdef USE_UTAB
> +static const struct {
> + float H; /* 1 + i/INTERVALS (exact) */
> + float E; /* H(i) * G(i) - 1 (exact) */
> +} U[TSIZE] = {
> + 0x800000.0p-23, 0,
> + 0x810000.0p-23, -0x800000.0p-37,
> + 0x820000.0p-23, -0x800000.0p-35,
> + 0x830000.0p-23, -0x900000.0p-34,
> + 0x840000.0p-23, -0x800000.0p-33,
> + 0x850000.0p-23, -0xc80000.0p-33,
> + 0x860000.0p-23, -0xa00000.0p-36,
> + 0x870000.0p-23, 0x940000.0p-33,
> + 0x880000.0p-23, 0x800000.0p-35,
> + 0x890000.0p-23, -0xc80000.0p-34,
> + 0x8a0000.0p-23, 0xe00000.0p-36,
> + 0x8b0000.0p-23, 0x900000.0p-33,
> + 0x8c0000.0p-23, -0x800000.0p-35,
> + 0x8d0000.0p-23, -0xe00000.0p-33,
> + 0x8e0000.0p-23, 0x880000.0p-33,
> + 0x8f0000.0p-23, -0xa80000.0p-34,
> + 0x900000.0p-23, -0x800000.0p-35,
> + 0x910000.0p-23, 0x800000.0p-37,
> + 0x920000.0p-23, 0x900000.0p-35,
> + 0x930000.0p-23, 0xd00000.0p-35,
> + 0x940000.0p-23, 0xe00000.0p-35,
> + 0x950000.0p-23, 0xc00000.0p-35,
> + 0x960000.0p-23, 0xe00000.0p-36,
> + 0x970000.0p-23, -0x800000.0p-38,
> + 0x980000.0p-23, -0xc00000.0p-35,
> + 0x990000.0p-23, -0xd00000.0p-34,
> + 0x9a0000.0p-23, 0x880000.0p-33,
> + 0x9b0000.0p-23, 0xe80000.0p-35,
> + 0x9c0000.0p-23, -0x800000.0p-35,
> + 0x9d0000.0p-23, 0xb40000.0p-33,
> + 0x9e0000.0p-23, 0x880000.0p-34,
> + 0x9f0000.0p-23, -0xe00000.0p-35,
> + 0xa00000.0p-23, 0x800000.0p-33,
> + 0xa10000.0p-23, -0x900000.0p-36,
> + 0xa20000.0p-23, -0xb00000.0p-33,
> + 0xa30000.0p-23, -0xa00000.0p-36,
> + 0xa40000.0p-23, 0x800000.0p-33,
> + 0xa50000.0p-23, -0xf80000.0p-35,
> + 0xa60000.0p-23, 0x880000.0p-34,
> + 0xa70000.0p-23, -0x900000.0p-33,
> + 0xa80000.0p-23, -0x800000.0p-35,
> + 0xa90000.0p-23, 0x900000.0p-34,
> + 0xaa0000.0p-23, 0xa80000.0p-33,
> + 0xab0000.0p-23, -0xac0000.0p-34,
> + 0xac0000.0p-23, -0x800000.0p-37,
> + 0xad0000.0p-23, 0xf80000.0p-35,
> + 0xae0000.0p-23, 0xf80000.0p-34,
> + 0xaf0000.0p-23, -0xac0000.0p-33,
> + 0xb00000.0p-23, -0x800000.0p-33,
> + 0xb10000.0p-23, -0xb80000.0p-34,
> + 0xb20000.0p-23, -0x800000.0p-34,
> + 0xb30000.0p-23, -0xb00000.0p-35,
> + 0xb40000.0p-23, -0x800000.0p-35,
> + 0xb50000.0p-23, -0xe00000.0p-36,
> + 0xb60000.0p-23, -0x800000.0p-35,
> + 0xb70000.0p-23, -0xb00000.0p-35,
> + 0xb80000.0p-23, -0x800000.0p-34,
> + 0xb90000.0p-23, -0xb80000.0p-34,
> + 0xba0000.0p-23, -0x800000.0p-33,
> + 0xbb0000.0p-23, -0xac0000.0p-33,
> + 0xbc0000.0p-23, 0x980000.0p-33,
> + 0xbd0000.0p-23, 0xbc0000.0p-34,
> + 0xbe0000.0p-23, 0xe00000.0p-36,
> + 0xbf0000.0p-23, -0xb80000.0p-35,
> + 0xc00000.0p-23, -0x800000.0p-33,
> + 0xc10000.0p-23, 0xa80000.0p-33,
> + 0xc20000.0p-23, 0x900000.0p-34,
> + 0xc30000.0p-23, -0x800000.0p-35,
> + 0xc40000.0p-23, -0x900000.0p-33,
> + 0xc50000.0p-23, 0x820000.0p-33,
> + 0xc60000.0p-23, 0x800000.0p-38,
> + 0xc70000.0p-23, -0x820000.0p-33,
> + 0xc80000.0p-23, 0x800000.0p-33,
> + 0xc90000.0p-23, -0xa00000.0p-36,
> + 0xca0000.0p-23, -0xb00000.0p-33,
> + 0xcb0000.0p-23, 0x840000.0p-34,
> + 0xcc0000.0p-23, -0xd00000.0p-34,
> + 0xcd0000.0p-23, 0x800000.0p-33,
> + 0xce0000.0p-23, -0xe00000.0p-35,
> + 0xcf0000.0p-23, 0xa60000.0p-33,
> + 0xd00000.0p-23, -0x800000.0p-35,
> + 0xd10000.0p-23, 0xb40000.0p-33,
> + 0xd20000.0p-23, -0x800000.0p-35,
> + 0xd30000.0p-23, 0xaa0000.0p-33,
> + 0xd40000.0p-23, -0xe00000.0p-35,
> + 0xd50000.0p-23, 0x880000.0p-33,
> + 0xd60000.0p-23, -0xd00000.0p-34,
> + 0xd70000.0p-23, 0x9c0000.0p-34,
> + 0xd80000.0p-23, -0xb00000.0p-33,
> + 0xd90000.0p-23, -0x800000.0p-38,
> + 0xda0000.0p-23, 0xa40000.0p-33,
> + 0xdb0000.0p-23, -0xdc0000.0p-34,
> + 0xdc0000.0p-23, 0xc00000.0p-35,
> + 0xdd0000.0p-23, 0xca0000.0p-33,
> + 0xde0000.0p-23, -0xb80000.0p-34,
> + 0xdf0000.0p-23, 0xd00000.0p-35,
> + 0xe00000.0p-23, 0xc00000.0p-33,
> + 0xe10000.0p-23, -0xf40000.0p-34,
> + 0xe20000.0p-23, 0x800000.0p-37,
> + 0xe30000.0p-23, 0x860000.0p-33,
> + 0xe40000.0p-23, -0xc80000.0p-33,
> + 0xe50000.0p-23, -0xa80000.0p-34,
> + 0xe60000.0p-23, 0xe00000.0p-36,
> + 0xe70000.0p-23, 0x880000.0p-33,
> + 0xe80000.0p-23, -0xe00000.0p-33,
> + 0xe90000.0p-23, -0xfc0000.0p-34,
> + 0xea0000.0p-23, -0x800000.0p-35,
> + 0xeb0000.0p-23, 0xe80000.0p-35,
> + 0xec0000.0p-23, 0x900000.0p-33,
> + 0xed0000.0p-23, 0xe20000.0p-33,
> + 0xee0000.0p-23, -0xac0000.0p-33,
> + 0xef0000.0p-23, -0xc80000.0p-34,
> + 0xf00000.0p-23, -0x800000.0p-35,
> + 0xf10000.0p-23, 0x800000.0p-35,
> + 0xf20000.0p-23, 0xb80000.0p-34,
> + 0xf30000.0p-23, 0x940000.0p-33,
> + 0xf40000.0p-23, 0xc80000.0p-33,
> + 0xf50000.0p-23, -0xf20000.0p-33,
> + 0xf60000.0p-23, -0xc80000.0p-33,
> + 0xf70000.0p-23, -0xa20000.0p-33,
> + 0xf80000.0p-23, -0x800000.0p-33,
> + 0xf90000.0p-23, -0xc40000.0p-34,
> + 0xfa0000.0p-23, -0x900000.0p-34,
> + 0xfb0000.0p-23, -0xc80000.0p-35,
> + 0xfc0000.0p-23, -0x800000.0p-35,
> + 0xfd0000.0p-23, -0x900000.0p-36,
> + 0xfe0000.0p-23, -0x800000.0p-37,
> + 0xff0000.0p-23, -0x800000.0p-39,
> + 0x800000.0p-22, 0,
> +};
> +#endif /* USE_UTAB */
> +
> +#ifdef STRUCT_RETURN
> +#define RETURN1(rp, v) do { \
> + (rp)->hi = (v); \
> + (rp)->lo_set = 0; \
> + return; \
> +} while (0)
> +
> +#define RETURN2(rp, h, l) do { \
> + (rp)->hi = (h); \
> + (rp)->lo = (l); \
> + (rp)->lo_set = 1; \
> + return; \
> +} while (0)
> +
> +struct ld {
> + long double hi;
> + long double lo;
> + int lo_set;
> +};
> +#else
> +#define RETURN1(rp, v) RETURNF(v)
> +#define RETURN2(rp, h, l) RETURNI((h) + (l))
> +#endif
> +
> +#ifdef STRUCT_RETURN
> +static inline __always_inline void
> +k_logl(long double x, struct ld *rp)
> +#else
> +long double
> +logl(long double x)
> +#endif
> +{
> + long double d, val_hi, val_lo;
> + double dd, dk;
> + uint64_t lx, llx;
> + int i, k;
> + uint16_t hx;
> +
> + EXTRACT_LDBL128_WORDS(hx, lx, llx, x);
> + k = -16383;
> +#if 0 /* Hard to do efficiently. Don't do it until we support all modes. */
> + if (x == 1)
> + RETURN1(rp, 0); /* log(1) = +0 in all rounding modes */
> +#endif
> + if (hx == 0 || hx >= 0x8000) { /* zero, negative or subnormal? */
> + if (((hx & 0x7fff) | lx | llx) == 0)
> + RETURN1(rp, -1 / zero); /* log(+-0) = -Inf */
> + if (hx != 0)
> + /* log(neg or NaN) = qNaN: */
> + RETURN1(rp, (x - x) / zero);
> + x *= 0x1.0p113; /* subnormal; scale up x */
> + EXTRACT_LDBL128_WORDS(hx, lx, llx, x);
> + k = -16383 - 113;
> + } else if (hx >= 0x7fff)
> + RETURN1(rp, x + x); /* log(Inf or NaN) = Inf or qNaN */
> +#ifndef STRUCT_RETURN
> + ENTERI();
> +#endif
> + k += hx;
> + dk = k;
> +
> + /* Scale x to be in [1, 2). */
> + SET_LDBL_EXPSIGN(x, 0x3fff);
> +
> + /* 0 <= i <= INTERVALS: */
> +#define L2I (49 - LOG2_INTERVALS)
> + i = (lx + (1LL << (L2I - 2))) >> (L2I - 1);
> +
> + /*
> + * -0.005280 < d < 0.004838. In particular, the infinite-
> + * precision |d| is <= 2**-7. Rounding of G(i) to 8 bits
> + * ensures that d is representable without extra precision for
> + * this bound on |d| (since when this calculation is expressed
> + * as x*G(i)-1, the multiplication needs as many extra bits as
> + * G(i) has and the subtraction cancels 8 bits). But for
> + * most i (107 cases out of 129), the infinite-precision |d|
> + * is <= 2**-8. G(i) is rounded to 9 bits for such i to give
> + * better accuracy (this works by improving the bound on |d|,
> + * which in turn allows rounding to 9 bits in more cases).
> + * This is only important when the original x is near 1 -- it
> + * lets us avoid using a special method to give the desired
> + * accuracy for such x.
> + */
> + if (0)
> + d = x * G(i) - 1;
> + else {
> +#ifdef USE_UTAB
> + d = (x - H(i)) * G(i) + E(i);
> +#else
> + long double x_hi;
> + double x_lo;
> +
> + /*
> + * Split x into x_hi + x_lo to calculate x*G(i)-1 exactly.
> + * G(i) has at most 9 bits, so the splitting point is not
> + * critical.
> + */
> + INSERT_LDBL128_WORDS(x_hi, 0x3fff, lx,
> + llx & 0xffffffffff000000ULL);
> + x_lo = x - x_hi;
> + d = x_hi * G(i) - 1 + x_lo * G(i);
> +#endif
> + }
> +
> + /*
> + * Our algorithm depends on exact cancellation of F_lo(i) and
> + * F_hi(i) with dk*ln_2_lo and dk*ln2_hi when k is -1 and i is
> + * at the end of the table. This and other technical complications
> + * make it difficult to avoid the double scaling in (dk*ln2) *
> + * log(base) for base != e without losing more accuracy and/or
> + * efficiency than is gained.
> + */
> + /*
> + * Use double precision operations wherever possible, since
> + * long double operations are emulated and were very slow on
> + * the old sparc64 and unknown on the newer aarch64 and riscv
> + * machines. Also, don't try to improve parallelism by
> + * increasing the number of operations, since any parallelism
> + * on such machines is needed for the emulation. Horner's
> + * method is good for this, and is also good for accuracy.
> + * Horner's method doesn't handle the `lo' term well, either
> + * for efficiency or accuracy. However, for accuracy we
> + * evaluate d * d * P2 separately to take advantage of by P2
> + * being exact, and this gives a good place to sum the 'lo'
> + * term too.
> + */
> + dd = (double)d;
> + val_lo = d * d * d * (P3 +
> + d * (P4 + d * (P5 + d * (P6 + d * (P7 + d * (P8 +
> + dd * (P9 + dd * (P10 + dd * (P11 + dd * (P12 + dd * (P13 +
> + dd * P14))))))))))) + (F_lo(i) + dk * ln2_lo) + d * d * P2;
> + val_hi = d;
> +#ifdef DEBUG
> + if (fetestexcept(FE_UNDERFLOW))
> + breakpoint();
> +#endif
> +
> + _3sumF(val_hi, val_lo, F_hi(i) + dk * ln2_hi);
> + RETURN2(rp, val_hi, val_lo);
> +}
> +
> +long double
> +log1pl(long double x)
> +{
> + long double d, d_hi, f_lo, val_hi, val_lo;
> + long double f_hi, twopminusk;
> + double d_lo, dd, dk;
> + uint64_t lx, llx;
> + int i, k;
> + int16_t ax, hx;
> +
> + DOPRINT_START(&x);
> + EXTRACT_LDBL128_WORDS(hx, lx, llx, x);
> + if (hx < 0x3fff) { /* x < 1, or x neg NaN */
> + ax = hx & 0x7fff;
> + if (ax >= 0x3fff) { /* x <= -1, or x neg NaN */
> + if (ax == 0x3fff && (lx | llx) == 0)
> + RETURNP(-1 / zero); /* log1p(-1) = -Inf */
> + /* log1p(x < 1, or x NaN) = qNaN: */
> + RETURNP((x - x) / (x - x));
> + }
> + if (ax <= 0x3f8d) { /* |x| < 2**-113 */
> + if ((int)x == 0)
> + RETURNP(x); /* x with inexact if x != 0 */
> + }
> + f_hi = 1;
> + f_lo = x;
> + } else if (hx >= 0x7fff) { /* x +Inf or non-neg NaN */
> + RETURNP(x + x); /* log1p(Inf or NaN) = Inf or qNaN */
> + } else if (hx < 0x40e1) { /* 1 <= x < 2**226 */
> + f_hi = x;
> + f_lo = 1;
> + } else { /* 2**226 <= x < +Inf */
> + f_hi = x;
> + f_lo = 0; /* avoid underflow of the P3 term */
> + }
> + ENTERI();
> + x = f_hi + f_lo;
> + f_lo = (f_hi - x) + f_lo;
> +
> + EXTRACT_LDBL128_WORDS(hx, lx, llx, x);
> + k = -16383;
> +
> + k += hx;
> + dk = k;
> +
> + SET_LDBL_EXPSIGN(x, 0x3fff);
> + twopminusk = 1;
> + SET_LDBL_EXPSIGN(twopminusk, 0x7ffe - (hx & 0x7fff));
> + f_lo *= twopminusk;
> +
> + i = (lx + (1LL << (L2I - 2))) >> (L2I - 1);
> +
> + /*
> + * x*G(i)-1 (with a reduced x) can be represented exactly, as
> + * above, but now we need to evaluate the polynomial on d =
> + * (x+f_lo)*G(i)-1 and extra precision is needed for that.
> + * Since x+x_lo is a hi+lo decomposition and subtracting 1
> + * doesn't lose too many bits, an inexact calculation for
> + * f_lo*G(i) is good enough.
> + */
> + if (0)
> + d_hi = x * G(i) - 1;
> + else {
> +#ifdef USE_UTAB
> + d_hi = (x - H(i)) * G(i) + E(i);
> +#else
> + long double x_hi;
> + double x_lo;
> +
> + INSERT_LDBL128_WORDS(x_hi, 0x3fff, lx,
> + llx & 0xffffffffff000000ULL);
> + x_lo = x - x_hi;
> + d_hi = x_hi * G(i) - 1 + x_lo * G(i);
> +#endif
> + }
> + d_lo = f_lo * G(i);
> +
> + /*
> + * This is _2sumF(d_hi, d_lo) inlined. The condition
> + * (d_hi == 0 || |d_hi| >= |d_lo|) for using _2sumF() is not
> + * always satisifed, so it is not clear that this works, but
> + * it works in practice. It works even if it gives a wrong
> + * normalized d_lo, since |d_lo| > |d_hi| implies that i is
> + * nonzero and d is tiny, so the F(i) term dominates d_lo.
> + * In float precision:
> + * (By exhaustive testing, the worst case is d_hi = 0x1.bp-25.
> + * And if d is only a little tinier than that, we would have
> + * another underflow problem for the P3 term; this is also ruled
> + * out by exhaustive testing.)
> + */
> + d = d_hi + d_lo;
> + d_lo = d_hi - d + d_lo;
> + d_hi = d;
> +
> + dd = (double)d;
> + val_lo = d * d * d * (P3 +
> + d * (P4 + d * (P5 + d * (P6 + d * (P7 + d * (P8 +
> + dd * (P9 + dd * (P10 + dd * (P11 + dd * (P12 + dd * (P13 +
> + dd * P14))))))))))) + (F_lo(i) + dk * ln2_lo + d_lo) + d * d * P2;
> + val_hi = d_hi;
> +#ifdef DEBUG
> + if (fetestexcept(FE_UNDERFLOW))
> + breakpoint();
> +#endif
> +
> + _3sumF(val_hi, val_lo, F_hi(i) + dk * ln2_hi);
> + RETURN2PI(val_hi, val_lo);
> +}
> +
> +#ifdef STRUCT_RETURN
> +
> +long double
> +logl(long double x)
> +{
> + struct ld r;
> +
> + ENTERI();
> + DOPRINT_START(&x);
> + k_logl(x, &r);
> + RETURNSPI(&r);
> +}
> +
> +/*
> + * 29+113 bit decompositions. The bits are distributed so that the products
> + * of the hi terms are exact in double precision. The types are chosen so
> + * that the products of the hi terms are done in at least double precision,
> + * without any explicit conversions. More natural choices would require a
> + * slow long double precision multiplication.
> + */
> +static const double
> +invln10_hi = 4.3429448176175356e-1, /* 0x1bcb7b15000000.0p-54 */
> +invln2_hi = 1.4426950402557850e0; /* 0x17154765000000.0p-52 */
> +static const long double
> +invln10_lo = 1.41498268538580090791605082294397000e-10L, /* 0x137287195355baaafad33dc323ee3.0p-145L */
> +invln2_lo = 6.33178418956604368501892137426645911e-10L, /* 0x15c17f0bbbe87fed0691d3e88eb57.0p-143L */
> +invln10_lo_plus_hi = invln10_lo + invln10_hi,
> +invln2_lo_plus_hi = invln2_lo + invln2_hi;
> +
> +long double
> +log10l(long double x)
> +{
> + struct ld r;
> + long double hi, lo;
> +
> + ENTERI();
> + DOPRINT_START(&x);
> + k_logl(x, &r);
> + if (!r.lo_set)
> + RETURNPI(r.hi);
> + _2sumF(r.hi, r.lo);
> + hi = (float)r.hi;
> + lo = r.lo + (r.hi - hi);
> + RETURN2PI(invln10_hi * hi,
> + invln10_lo_plus_hi * lo + invln10_lo * hi);
> +}
> +
> +long double
> +log2l(long double x)
> +{
> + struct ld r;
> + long double hi, lo;
> +
> + ENTERI();
> + DOPRINT_START(&x);
> + k_logl(x, &r);
> + if (!r.lo_set)
> + RETURNPI(r.hi);
> + _2sumF(r.hi, r.lo);
> + hi = (float)r.hi;
> + lo = r.lo + (r.hi - hi);
> + RETURN2PI(invln2_hi * hi,
> + invln2_lo_plus_hi * lo + invln2_lo * hi);
> +}
> +
> +#endif /* STRUCT_RETURN */
> diff --git a/newlib/libm/ld80/b_expl.c b/newlib/libm/ld80/b_expl.c
> new file mode 100644
> index 000000000..21bacf449
> --- /dev/null
> +++ b/newlib/libm/ld80/b_expl.c
> @@ -0,0 +1,113 @@
> +/*-
> + * SPDX-License-Identifier: BSD-3-Clause
> + *
> + * Copyright (c) 1985, 1993
> + * The Regents of the University of California. All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + * 3. Neither the name of the University nor the names of its contributors
> + * may be used to endorse or promote products derived from this software
> + * without specific prior written permission.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + */
> +
> +/*
> + * See bsdsrc/b_exp.c for implementation details.
> + *
> + * bsdrc/b_exp.c converted to long double by Steven G. Kargl.
> + */
> +
> +#include "fpmath.h"
> +#include "math_private.h"
> +
> +static const union IEEEl2bits
> + p0u = LD80C(0xaaaaaaaaaaaaaaab, -3, 1.66666666666666666671e-01L),
> + p1u = LD80C(0xb60b60b60b60b59a, -9, -2.77777777777777775377e-03L),
> + p2u = LD80C(0x8ab355e008a3cfce, -14, 6.61375661375629297465e-05L),
> + p3u = LD80C(0xddebbc994b0c1376, -20, -1.65343915327882529784e-06L),
> + p4u = LD80C(0xb354784cb4ef4c41, -25, 4.17535101591534118469e-08L),
> + p5u = LD80C(0x913e8a718382ce75, -30, -1.05679137034774806475e-09L),
> + p6u = LD80C(0xe8f0042aa134502e, -36, 2.64819349895429516863e-11L);
> +#define p1 (p0u.e)
> +#define p2 (p1u.e)
> +#define p3 (p2u.e)
> +#define p4 (p3u.e)
> +#define p5 (p4u.e)
> +#define p6 (p5u.e)
> +#define p7 (p6u.e)
> +
> +/*
> + * lnhuge = (LDBL_MAX_EXP + 9) * log(2.)
> + * lntiny = (LDBL_MIN_EXP - 64 - 10) * log(2.)
> + * invln2 = 1 / log(2.)
> + */
> +static const union IEEEl2bits
> +ln2hiu = LD80C(0xb17217f700000000, -1, 6.93147180369123816490e-01L),
> +ln2lou = LD80C(0xd1cf79abc9e3b398, -33, 1.90821492927058781614e-10L),
> +lnhugeu = LD80C(0xb18b0c0330a8fad9, 13, 1.13627617309191834574e+04L),
> +lntinyu = LD80C(0xb236f28a68bc3bd7, 13, -1.14057368561139000667e+04L),
> +invln2u = LD80C(0xb8aa3b295c17f0bc, 0, 1.44269504088896340739e+00L);
> +#define ln2hi (ln2hiu.e)
> +#define ln2lo (ln2lou.e)
> +#define lnhuge (lnhugeu.e)
> +#define lntiny (lntinyu.e)
> +#define invln2 (invln2u.e)
> +
> +/* returns exp(r = x + c) for |c| < |x| with no overlap. */
> +
> +static long double
> +__exp__D(long double x, long double c)
> +{
> + long double hi, lo, z;
> + int k;
> +
> + if (x != x) /* x is NaN. */
> + return(x);
> +
> + if (x <= lnhuge) {
> + if (x >= lntiny) {
> + /* argument reduction: x --> x - k*ln2 */
> + z = invln2 * x;
> + k = z + copysignl(0.5L, x);
> +
> + /*
> + * Express (x + c) - k * ln2 as hi - lo.
> + * Let x = hi - lo rounded.
> + */
> + hi = x - k * ln2hi; /* Exact. */
> + lo = k * ln2lo - c;
> + x = hi - lo;
> +
> + /* Return 2^k*[1+x+x*c/(2+c)] */
> + z = x * x;
> + c = x - z * (p1 + z * (p2 + z * (p3 + z * (p4 +
> + z * (p5 + z * (p6 + z * p7))))));
> + c = (x * c) / (2 - c);
> +
> + return (ldexpl(1 + (hi - (lo - c)), k));
> + } else {
> + /* exp(-INF) is 0. exp(-big) underflows to 0. */
> + return (isfinite(x) ? ldexpl(1., -5000) : 0);
> + }
> + } else
> + /* exp(INF) is INF, exp(+big#) overflows to INF */
> + return (isfinite(x) ? ldexpl(1., 5000) : x);
> +}
> diff --git a/newlib/libm/ld80/b_logl.c b/newlib/libm/ld80/b_logl.c
> new file mode 100644
> index 000000000..b11eacbe1
> --- /dev/null
> +++ b/newlib/libm/ld80/b_logl.c
> @@ -0,0 +1,375 @@
> +/*-
> + * SPDX-License-Identifier: BSD-3-Clause
> + *
> + * Copyright (c) 1992, 1993
> + * The Regents of the University of California. All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + * 3. Neither the name of the University nor the names of its contributors
> + * may be used to endorse or promote products derived from this software
> + * without specific prior written permission.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + */
> +
> +/*
> + * See bsdsrc/b_log.c for implementation details.
> + *
> + * bsdrc/b_log.c converted to long double by Steven G. Kargl.
> + */
> +
> +#define N 128
> +
> +/*
> + * Coefficients in the polynomial approximation of log(1+f/F).
> + * Domain of x is [0,1./256] with 2**(-84.48) precision.
> + */
> +static const union IEEEl2bits
> + a1u = LD80C(0xaaaaaaaaaaaaaaab, -4, 8.33333333333333333356e-02L),
> + a2u = LD80C(0xcccccccccccccd29, -7, 1.25000000000000000781e-02L),
> + a3u = LD80C(0x9249249241ed3764, -9, 2.23214285711721994134e-03L),
> + a4u = LD80C(0xe38e959e1e7e01cf, -12, 4.34030476540000360640e-04L);
> +#define A1 (a1u.e)
> +#define A2 (a2u.e)
> +#define A3 (a3u.e)
> +#define A4 (a4u.e)
> +
> +/*
> + * Table of log(Fj) = logF_head[j] + logF_tail[j], for Fj = 1+j/128.
> + * Used for generation of extend precision logarithms.
> + * The constant 35184372088832 is 2^45, so the divide is exact.
> + * It ensures correct reading of logF_head, even for inaccurate
> + * decimal-to-binary conversion routines. (Everybody gets the
> + * right answer for integers less than 2^53.)
> + * Values for log(F) were generated using error < 10^-57 absolute
> + * with the bc -l package.
> + */
> +
> +static double logF_head[N+1] = {
> + 0.,
> + .007782140442060381246,
> + .015504186535963526694,
> + .023167059281547608406,
> + .030771658666765233647,
> + .038318864302141264488,
> + .045809536031242714670,
> + .053244514518837604555,
> + .060624621816486978786,
> + .067950661908525944454,
> + .075223421237524235039,
> + .082443669210988446138,
> + .089612158689760690322,
> + .096729626458454731618,
> + .103796793681567578460,
> + .110814366340264314203,
> + .117783035656430001836,
> + .124703478501032805070,
> + .131576357788617315236,
> + .138402322859292326029,
> + .145182009844575077295,
> + .151916042025732167530,
> + .158605030176659056451,
> + .165249572895390883786,
> + .171850256926518341060,
> + .178407657472689606947,
> + .184922338493834104156,
> + .191394852999565046047,
> + .197825743329758552135,
> + .204215541428766300668,
> + .210564769107350002741,
> + .216873938300523150246,
> + .223143551314024080056,
> + .229374101064877322642,
> + .235566071312860003672,
> + .241719936886966024758,
> + .247836163904594286577,
> + .253915209980732470285,
> + .259957524436686071567,
> + .265963548496984003577,
> + .271933715484010463114,
> + .277868451003087102435,
> + .283768173130738432519,
> + .289633292582948342896,
> + .295464212893421063199,
> + .301261330578199704177,
> + .307025035294827830512,
> + .312755710004239517729,
> + .318453731118097493890,
> + .324119468654316733591,
> + .329753286372579168528,
> + .335355541920762334484,
> + .340926586970454081892,
> + .346466767346100823488,
> + .351976423156884266063,
> + .357455888922231679316,
> + .362905493689140712376,
> + .368325561158599157352,
> + .373716409793814818840,
> + .379078352934811846353,
> + .384411698910298582632,
> + .389716751140440464951,
> + .394993808240542421117,
> + .400243164127459749579,
> + .405465108107819105498,
> + .410659924985338875558,
> + .415827895143593195825,
> + .420969294644237379543,
> + .426084395310681429691,
> + .431173464818130014464,
> + .436236766774527495726,
> + .441274560805140936281,
> + .446287102628048160113,
> + .451274644139630254358,
> + .456237433481874177232,
> + .461175715122408291790,
> + .466089729924533457960,
> + .470979715219073113985,
> + .475845904869856894947,
> + .480688529345570714212,
> + .485507815781602403149,
> + .490303988045525329653,
> + .495077266798034543171,
> + .499827869556611403822,
> + .504556010751912253908,
> + .509261901790523552335,
> + .513945751101346104405,
> + .518607764208354637958,
> + .523248143765158602036,
> + .527867089620485785417,
> + .532464798869114019908,
> + .537041465897345915436,
> + .541597282432121573947,
> + .546132437597407260909,
> + .550647117952394182793,
> + .555141507540611200965,
> + .559615787935399566777,
> + .564070138285387656651,
> + .568504735352689749561,
> + .572919753562018740922,
> + .577315365035246941260,
> + .581691739635061821900,
> + .586049045003164792433,
> + .590387446602107957005,
> + .594707107746216934174,
> + .599008189645246602594,
> + .603290851438941899687,
> + .607555250224322662688,
> + .611801541106615331955,
> + .616029877215623855590,
> + .620240409751204424537,
> + .624433288012369303032,
> + .628608659422752680256,
> + .632766669570628437213,
> + .636907462236194987781,
> + .641031179420679109171,
> + .645137961373620782978,
> + .649227946625615004450,
> + .653301272011958644725,
> + .657358072709030238911,
> + .661398482245203922502,
> + .665422632544505177065,
> + .669430653942981734871,
> + .673422675212350441142,
> + .677398823590920073911,
> + .681359224807238206267,
> + .685304003098281100392,
> + .689233281238557538017,
> + .693147180560117703862
> +};
> +
> +static double logF_tail[N+1] = {
> + 0.,
> + -.00000000000000543229938420049,
> + .00000000000000172745674997061,
> + -.00000000000001323017818229233,
> + -.00000000000001154527628289872,
> + -.00000000000000466529469958300,
> + .00000000000005148849572685810,
> + -.00000000000002532168943117445,
> + -.00000000000005213620639136504,
> + -.00000000000001819506003016881,
> + .00000000000006329065958724544,
> + .00000000000008614512936087814,
> + -.00000000000007355770219435028,
> + .00000000000009638067658552277,
> + .00000000000007598636597194141,
> + .00000000000002579999128306990,
> + -.00000000000004654729747598444,
> + -.00000000000007556920687451336,
> + .00000000000010195735223708472,
> + -.00000000000017319034406422306,
> + -.00000000000007718001336828098,
> + .00000000000010980754099855238,
> + -.00000000000002047235780046195,
> + -.00000000000008372091099235912,
> + .00000000000014088127937111135,
> + .00000000000012869017157588257,
> + .00000000000017788850778198106,
> + .00000000000006440856150696891,
> + .00000000000016132822667240822,
> + -.00000000000007540916511956188,
> + -.00000000000000036507188831790,
> + .00000000000009120937249914984,
> + .00000000000018567570959796010,
> + -.00000000000003149265065191483,
> + -.00000000000009309459495196889,
> + .00000000000017914338601329117,
> + -.00000000000001302979717330866,
> + .00000000000023097385217586939,
> + .00000000000023999540484211737,
> + .00000000000015393776174455408,
> + -.00000000000036870428315837678,
> + .00000000000036920375082080089,
> + -.00000000000009383417223663699,
> + .00000000000009433398189512690,
> + .00000000000041481318704258568,
> + -.00000000000003792316480209314,
> + .00000000000008403156304792424,
> + -.00000000000034262934348285429,
> + .00000000000043712191957429145,
> + -.00000000000010475750058776541,
> + -.00000000000011118671389559323,
> + .00000000000037549577257259853,
> + .00000000000013912841212197565,
> + .00000000000010775743037572640,
> + .00000000000029391859187648000,
> + -.00000000000042790509060060774,
> + .00000000000022774076114039555,
> + .00000000000010849569622967912,
> + -.00000000000023073801945705758,
> + .00000000000015761203773969435,
> + .00000000000003345710269544082,
> + -.00000000000041525158063436123,
> + .00000000000032655698896907146,
> + -.00000000000044704265010452446,
> + .00000000000034527647952039772,
> + -.00000000000007048962392109746,
> + .00000000000011776978751369214,
> + -.00000000000010774341461609578,
> + .00000000000021863343293215910,
> + .00000000000024132639491333131,
> + .00000000000039057462209830700,
> + -.00000000000026570679203560751,
> + .00000000000037135141919592021,
> + -.00000000000017166921336082431,
> + -.00000000000028658285157914353,
> + -.00000000000023812542263446809,
> + .00000000000006576659768580062,
> + -.00000000000028210143846181267,
> + .00000000000010701931762114254,
> + .00000000000018119346366441110,
> + .00000000000009840465278232627,
> + -.00000000000033149150282752542,
> + -.00000000000018302857356041668,
> + -.00000000000016207400156744949,
> + .00000000000048303314949553201,
> + -.00000000000071560553172382115,
> + .00000000000088821239518571855,
> + -.00000000000030900580513238244,
> + -.00000000000061076551972851496,
> + .00000000000035659969663347830,
> + .00000000000035782396591276383,
> + -.00000000000046226087001544578,
> + .00000000000062279762917225156,
> + .00000000000072838947272065741,
> + .00000000000026809646615211673,
> + -.00000000000010960825046059278,
> + .00000000000002311949383800537,
> + -.00000000000058469058005299247,
> + -.00000000000002103748251144494,
> + -.00000000000023323182945587408,
> + -.00000000000042333694288141916,
> + -.00000000000043933937969737844,
> + .00000000000041341647073835565,
> + .00000000000006841763641591466,
> + .00000000000047585534004430641,
> + .00000000000083679678674757695,
> + -.00000000000085763734646658640,
> + .00000000000021913281229340092,
> + -.00000000000062242842536431148,
> + -.00000000000010983594325438430,
> + .00000000000065310431377633651,
> + -.00000000000047580199021710769,
> + -.00000000000037854251265457040,
> + .00000000000040939233218678664,
> + .00000000000087424383914858291,
> + .00000000000025218188456842882,
> + -.00000000000003608131360422557,
> + -.00000000000050518555924280902,
> + .00000000000078699403323355317,
> + -.00000000000067020876961949060,
> + .00000000000016108575753932458,
> + .00000000000058527188436251509,
> + -.00000000000035246757297904791,
> + -.00000000000018372084495629058,
> + .00000000000088606689813494916,
> + .00000000000066486268071468700,
> + .00000000000063831615170646519,
> + .00000000000025144230728376072,
> + -.00000000000017239444525614834
> +};
> +/*
> + * Extra precision variant, returning struct {double a, b;};
> + * log(x) = a + b to 63 bits, with 'a' rounded to 24 bits.
> + */
> +static struct Double
> +__log__D(long double x)
> +{
> + int m, j;
> + long double F, f, g, q, u, v, u1, u2;
> + struct Double r;
> +
> + /*
> + * Argument reduction: 1 <= g < 2; x/2^m = g;
> + * y = F*(1 + f/F) for |f| <= 2^-8
> + */
> + g = frexpl(x, &m);
> + g *= 2;
> + m--;
> + if (m == DBL_MIN_EXP - 1) {
> + j = ilogbl(g);
> + m += j;
> + g = ldexpl(g, -j);
> + }
> + j = N * (g - 1) + 0.5L;
> + F = (1.L / N) * j + 1;
> + f = g - F;
> +
> + g = 1 / (2 * F + f);
> + u = 2 * f * g;
> + v = u * u;
> + q = u * v * (A1 + v * (A2 + v * (A3 + v * A4)));
> + if (m | j) {
> + u1 = u + 513;
> + u1 -= 513;
> + } else {
> + u1 = (float)u;
> + }
> + u2 = (2 * (f - F * u1) - u1 * f) * g;
> +
> + u1 += m * (long double)logF_head[N] + logF_head[j];
> +
> + u2 += logF_tail[j];
> + u2 += q;
> + u2 += logF_tail[N] * m;
> + r.a = (float)(u1 + u2); /* Only difference is here. */
> + r.b = (u1 - r.a) + u2;
> + return (r);
> +}
> diff --git a/newlib/libm/ld80/b_tgammal.c b/newlib/libm/ld80/b_tgammal.c
> new file mode 100644
> index 000000000..121248adb
> --- /dev/null
> +++ b/newlib/libm/ld80/b_tgammal.c
> @@ -0,0 +1,419 @@
> +/*-
> + * SPDX-License-Identifier: BSD-3-Clause
> + *
> + * Copyright (c) 1992, 1993
> + * The Regents of the University of California. All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + * 3. Neither the name of the University nor the names of its contributors
> + * may be used to endorse or promote products derived from this software
> + * without specific prior written permission.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + */
> +
> +/*
> + * The original code, FreeBSD's old svn r93211, contain the following
> + * attribution:
> + *
> + * This code by P. McIlroy, Oct 1992;
> + *
> + * The financial support of UUNET Communications Services is greatfully
> + * acknowledged.
> + *
> + * bsdrc/b_tgamma.c converted to long double by Steven G. Kargl.
> + */
> +
> +/*
> + * See bsdsrc/t_tgamma.c for implementation details.
> + */
> +
> +#include <float.h>
> +
> +#if LDBL_MAX_EXP != 0x4000
> +#error "Unsupported long double format"
> +#endif
> +
> +#ifdef __i386__
> +#include <ieeefp.h>
> +#endif
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +
> +/* Used in b_log.c and below. */
> +struct Double {
> + long double a;
> + long double b;
> +};
> +
> +#include "b_logl.c"
> +#include "b_expl.c"
> +
> +static const double zero = 0.;
> +static const volatile double tiny = 1e-300;
> +/*
> + * x >= 6
> + *
> + * Use the asymptotic approximation (Stirling's formula) adjusted for
> + * equal-ripples:
> + *
> + * log(G(x)) ~= (x-0.5)*(log(x)-1) + 0.5(log(2*pi)-1) + 1/x*P(1/(x*x))
> + *
> + * Keep extra precision in multiplying (x-.5)(log(x)-1), to avoid
> + * premature round-off.
> + *
> + * Accurate to max(ulp(1/128) absolute, 2^-66 relative) error.
> + */
> +
> +/*
> + * The following is a decomposition of 0.5 * (log(2*pi) - 1) into the
> + * first 12 bits in ln2pi_hi and the trailing 64 bits in ln2pi_lo. The
> + * variables are clearly misnamed.
> + */
> +static const union IEEEl2bits
> +ln2pi_hiu = LD80C(0xd680000000000000, -2, 4.18945312500000000000e-01L),
> +ln2pi_lou = LD80C(0xe379b414b596d687, -18, -6.77929532725821967032e-06L);
> +#define ln2pi_hi (ln2pi_hiu.e)
> +#define ln2pi_lo (ln2pi_lou.e)
> +
> +static const union IEEEl2bits
> + Pa0u = LD80C(0xaaaaaaaaaaaaaaaa, -4, 8.33333333333333333288e-02L),
> + Pa1u = LD80C(0xb60b60b60b5fcd59, -9, -2.77777777777776516326e-03L),
> + Pa2u = LD80C(0xd00d00cffbb47014, -11, 7.93650793635429639018e-04L),
> + Pa3u = LD80C(0x9c09c07c0805343e, -11, -5.95238087960599252215e-04L),
> + Pa4u = LD80C(0xdca8d31f8e6e5e8f, -11, 8.41749082509607342883e-04L),
> + Pa5u = LD80C(0xfb4d4289632f1638, -10, -1.91728055205541624556e-03L),
> + Pa6u = LD80C(0xd15a4ba04078d3f8, -8, 6.38893788027752396194e-03L),
> + Pa7u = LD80C(0xe877283110bcad95, -6, -2.83771309846297590312e-02L),
> + Pa8u = LD80C(0x8da97eed13717af8, -3, 1.38341887683837576925e-01L),
> + Pa9u = LD80C(0xf093b1c1584e30ce, -2, -4.69876818515470146031e-01L);
> +#define Pa0 (Pa0u.e)
> +#define Pa1 (Pa1u.e)
> +#define Pa2 (Pa2u.e)
> +#define Pa3 (Pa3u.e)
> +#define Pa4 (Pa4u.e)
> +#define Pa5 (Pa5u.e)
> +#define Pa6 (Pa6u.e)
> +#define Pa7 (Pa7u.e)
> +#define Pa8 (Pa8u.e)
> +#define Pa9 (Pa9u.e)
> +
> +static struct Double
> +large_gam(long double x)
> +{
> + long double p, z, thi, tlo, xhi, xlo;
> + long double logx;
> + struct Double u;
> +
> + z = 1 / (x * x);
> + p = Pa0 + z * (Pa1 + z * (Pa2 + z * (Pa3 + z * (Pa4 + z * (Pa5 +
> + z * (Pa6 + z * (Pa7 + z * (Pa8 + z * Pa9))))))));
> + p = p / x;
> +
> + u = __log__D(x);
> + u.a -= 1;
> +
> + /* Split (x - 0.5) in high and low parts. */
> + x -= 0.5L;
> + xhi = (float)x;
> + xlo = x - xhi;
> +
> + /* Compute t = (x-.5)*(log(x)-1) in extra precision. */
> + thi = xhi * u.a;
> + tlo = xlo * u.a + x * u.b;
> +
> + /* Compute thi + tlo + ln2pi_hi + ln2pi_lo + p. */
> + tlo += ln2pi_lo;
> + tlo += p;
> + u.a = ln2pi_hi + tlo;
> + u.a += thi;
> + u.b = thi - u.a;
> + u.b += ln2pi_hi;
> + u.b += tlo;
> + return (u);
> +}
> +/*
> + * Rational approximation, A0 + x * x * P(x) / Q(x), on the interval
> + * [1.066.., 2.066..] accurate to 4.25e-19.
> + *
> + * Returns r.a + r.b = a0 + (z + c)^2 * p / q, with r.a truncated.
> + */
> +static const union IEEEl2bits
> + a0_hiu = LD80C(0xe2b6e4153a57746c, -1, 8.85603194410888700265e-01L),
> + a0_lou = LD80C(0x851566d40f32c76d, -66, 1.40907742727049706207e-20L);
> +#define a0_hi (a0_hiu.e)
> +#define a0_lo (a0_lou.e)
> +
> +static const union IEEEl2bits
> +P0u = LD80C(0xdb629fb9bbdc1c1d, -2, 4.28486815855585429733e-01L),
> +P1u = LD80C(0xe6f4f9f5641aa6be, -3, 2.25543885805587730552e-01L),
> +P2u = LD80C(0xead1bd99fdaf7cc1, -6, 2.86644652514293482381e-02L),
> +P3u = LD80C(0x9ccc8b25838ab1e0, -8, 4.78512567772456362048e-03L),
> +P4u = LD80C(0x8f0c4383ef9ce72a, -9, 2.18273781132301146458e-03L),
> +P5u = LD80C(0xe732ab2c0a2778da, -13, 2.20487522485636008928e-04L),
> +P6u = LD80C(0xce70b27ca822b297, -16, 2.46095923774929264284e-05L),
> +P7u = LD80C(0xa309e2e16fb63663, -19, 2.42946473022376182921e-06L),
> +P8u = LD80C(0xaf9c110efb2c633d, -23, 1.63549217667765869987e-07L),
> +Q1u = LD80C(0xd4d7422719f48f15, -1, 8.31409582658993993626e-01L),
> +Q2u = LD80C(0xe13138ea404f1268, -5, -5.49785826915643198508e-02L),
> +Q3u = LD80C(0xd1c6cc91989352c0, -4, -1.02429960435139887683e-01L),
> +Q4u = LD80C(0xa7e9435a84445579, -7, 1.02484853505908820524e-02L),
> +Q5u = LD80C(0x83c7c34db89b7bda, -8, 4.02161632832052872697e-03L),
> +Q6u = LD80C(0xbed06bf6e1c14e5b, -11, -7.27898206351223022157e-04L),
> +Q7u = LD80C(0xef05bf841d4504c0, -18, 7.12342421869453515194e-06L),
> +Q8u = LD80C(0xf348d08a1ff53cb1, -19, 3.62522053809474067060e-06L);
> +#define P0 (P0u.e)
> +#define P1 (P1u.e)
> +#define P2 (P2u.e)
> +#define P3 (P3u.e)
> +#define P4 (P4u.e)
> +#define P5 (P5u.e)
> +#define P6 (P6u.e)
> +#define P7 (P7u.e)
> +#define P8 (P8u.e)
> +#define Q1 (Q1u.e)
> +#define Q2 (Q2u.e)
> +#define Q3 (Q3u.e)
> +#define Q4 (Q4u.e)
> +#define Q5 (Q5u.e)
> +#define Q6 (Q6u.e)
> +#define Q7 (Q7u.e)
> +#define Q8 (Q8u.e)
> +
> +static struct Double
> +ratfun_gam(long double z, long double c)
> +{
> + long double p, q, thi, tlo;
> + struct Double r;
> +
> + q = 1 + z * (Q1 + z * (Q2 + z * (Q3 + z * (Q4 + z * (Q5 +
> + z * (Q6 + z * (Q7 + z * Q8)))))));
> + p = P0 + z * (P1 + z * (P2 + z * (P3 + z * (P4 + z * (P5 +
> + z * (P6 + z * (P7 + z * P8)))))));
> + p = p / q;
> +
> + /* Split z into high and low parts. */
> + thi = (float)z;
> + tlo = (z - thi) + c;
> + tlo *= (thi + z);
> +
> + /* Split (z+c)^2 into high and low parts. */
> + thi *= thi;
> + q = thi;
> + thi = (float)thi;
> + tlo += (q - thi);
> +
> + /* Split p/q into high and low parts. */
> + r.a = (float)p;
> + r.b = p - r.a;
> +
> + tlo = tlo * p + thi * r.b + a0_lo;
> + thi *= r.a; /* t = (z+c)^2*(P/Q) */
> + r.a = (float)(thi + a0_hi);
> + r.b = ((a0_hi - r.a) + thi) + tlo;
> + return (r); /* r = a0 + t */
> +}
> +/*
> + * x < 6
> + *
> + * Use argument reduction G(x+1) = xG(x) to reach the range [1.066124,
> + * 2.066124]. Use a rational approximation centered at the minimum
> + * (x0+1) to ensure monotonicity.
> + *
> + * Good to < 1 ulp. (provably .90 ulp; .87 ulp on 1,000,000 runs.)
> + * It also has correct monotonicity.
> + */
> +static const union IEEEl2bits
> + xm1u = LD80C(0xec5b0c6ad7c7edc3, -2, 4.61632144968362341254e-01L);
> +#define x0 (xm1u.e)
> +
> +static const double
> + left = -0.3955078125; /* left boundary for rat. approx */
> +
> +static long double
> +small_gam(long double x)
> +{
> + long double t, y, ym1;
> + struct Double yy, r;
> +
> + y = x - 1;
> +
> + if (y <= 1 + (left + x0)) {
> + yy = ratfun_gam(y - x0, 0);
> + return (yy.a + yy.b);
> + }
> +
> + r.a = (float)y;
> + yy.a = r.a - 1;
> + y = y - 1 ;
> + r.b = yy.b = y - yy.a;
> +
> + /* Argument reduction: G(x+1) = x*G(x) */
> + for (ym1 = y - 1; ym1 > left + x0; y = ym1--, yy.a--) {
> + t = r.a * yy.a;
> + r.b = r.a * yy.b + y * r.b;
> + r.a = (float)t;
> + r.b += (t - r.a);
> + }
> +
> + /* Return r*tgamma(y). */
> + yy = ratfun_gam(y - x0, 0);
> + y = r.b * (yy.a + yy.b) + r.a * yy.b;
> + y += yy.a * r.a;
> + return (y);
> +}
> +/*
> + * Good on (0, 1+x0+left]. Accurate to 1 ulp.
> + */
> +static long double
> +smaller_gam(long double x)
> +{
> + long double d, rhi, rlo, t, xhi, xlo;
> + struct Double r;
> +
> + if (x < x0 + left) {
> + t = (float)x;
> + d = (t + x) * (x - t);
> + t *= t;
> + xhi = (float)(t + x);
> + xlo = x - xhi;
> + xlo += t;
> + xlo += d;
> + t = 1 - x0;
> + t += x;
> + d = 1 - x0;
> + d -= t;
> + d += x;
> + x = xhi + xlo;
> + } else {
> + xhi = (float)x;
> + xlo = x - xhi;
> + t = x - x0;
> + d = - x0 - t;
> + d += x;
> + }
> +
> + r = ratfun_gam(t, d);
> + d = (float)(r.a / x);
> + r.a -= d * xhi;
> + r.a -= d * xlo;
> + r.a += r.b;
> +
> + return (d + r.a / x);
> +}
> +/*
> + * x < 0
> + *
> + * Use reflection formula, G(x) = pi/(sin(pi*x)*x*G(x)).
> + * At negative integers, return NaN and raise invalid.
> + */
> +static const union IEEEl2bits
> +piu = LD80C(0xc90fdaa22168c235, 1, 3.14159265358979323851e+00L);
> +#define pi (piu.e)
> +
> +static long double
> +neg_gam(long double x)
> +{
> + int sgn = 1;
> + struct Double lg, lsine;
> + long double y, z;
> +
> + y = ceill(x);
> + if (y == x) /* Negative integer. */
> + return ((x - x) / zero);
> +
> + z = y - x;
> + if (z > 0.5)
> + z = 1 - z;
> +
> + y = y / 2;
> + if (y == ceill(y))
> + sgn = -1;
> +
> + if (z < 0.25)
> + z = sinpil(z);
> + else
> + z = cospil(0.5 - z);
> +
> + /* Special case: G(1-x) = Inf; G(x) may be nonzero. */
> + if (x < -1753) {
> +
> + if (x < -1760)
> + return (sgn * tiny * tiny);
> + y = expl(lgammal(x) / 2);
> + y *= y;
> + return (sgn < 0 ? -y : y);
> + }
> +
> +
> + y = 1 - x;
> + if (1 - y == x)
> + y = tgammal(y);
> + else /* 1-x is inexact */
> + y = - x * tgammal(-x);
> +
> + if (sgn < 0) y = -y;
> + return (pi / (y * z));
> +}
> +/*
> + * xmax comes from lgamma(xmax) - emax * log(2) = 0.
> + * static const float xmax = 35.040095f
> + * static const double xmax = 171.624376956302725;
> + * ld80: LD80C(0xdb718c066b352e20, 10, 1.75554834290446291689e+03L),
> + * ld128: 1.75554834290446291700388921607020320e+03L,
> + *
> + * iota is a sloppy threshold to isolate x = 0.
> + */
> +static const double xmax = 1755.54834290446291689;
> +static const double iota = 0x1p-116;
> +
> +long double
> +tgammal(long double x)
> +{
> + struct Double u;
> +
> + ENTERI();
> +
> + if (x >= 6) {
> + if (x > xmax)
> + RETURNI(x / zero);
> + u = large_gam(x);
> + RETURNI(__exp__D(u.a, u.b));
> + }
> +
> + if (x >= 1 + left + x0)
> + RETURNI(small_gam(x));
> +
> + if (x > iota)
> + RETURNI(smaller_gam(x));
> +
> + if (x > -iota) {
> + if (x != 0)
> + u.a = 1 - tiny; /* raise inexact */
> + RETURNI(1 / x);
> + }
> +
> + if (!isfinite(x))
> + RETURNI(x - x); /* x is NaN or -Inf */
> +
> + RETURNI(neg_gam(x));
> +}
> diff --git a/newlib/libm/ld80/e_lgammal_r.c b/newlib/libm/ld80/e_lgammal_r.c
> new file mode 100644
> index 000000000..f56758b18
> --- /dev/null
> +++ b/newlib/libm/ld80/e_lgammal_r.c
> @@ -0,0 +1,358 @@
> +/* @(#)e_lgamma_r.c 1.3 95/01/18 */
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunSoft, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * See e_lgamma_r.c for complete comments.
> + *
> + * Converted to long double by Steven G. Kargl.
> + */
> +
> +#ifdef __i386__
> +#include <ieeefp.h>
> +#endif
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +
> +static const volatile double vzero = 0;
> +
> +static const double
> +zero= 0,
> +half= 0.5,
> +one = 1;
> +
> +static const union IEEEl2bits
> +piu = LD80C(0xc90fdaa22168c235, 1, 3.14159265358979323851e+00L);
> +#define pi (piu.e)
> +/*
> + * Domain y in [0x1p-70, 0.27], range ~[-4.5264e-22, 4.5264e-22]:
> + * |(lgamma(2 - y) + y / 2) / y - a(y)| < 2**-70.9
> + */
> +static const union IEEEl2bits
> +a0u = LD80C(0x9e233f1bed863d26, -4, 7.72156649015328606028e-02L),
> +a1u = LD80C(0xa51a6625307d3249, -2, 3.22467033424113218889e-01L),
> +a2u = LD80C(0x89f000d2abafda8c, -4, 6.73523010531979398946e-02L),
> +a3u = LD80C(0xa8991563eca75f26, -6, 2.05808084277991211934e-02L),
> +a4u = LD80C(0xf2027e10634ce6b6, -8, 7.38555102796070454026e-03L),
> +a5u = LD80C(0xbd6eb76dd22187f4, -9, 2.89051035162703932972e-03L),
> +a6u = LD80C(0x9c562ab05e0458ed, -10, 1.19275351624639999297e-03L),
> +a7u = LD80C(0x859baed93ee48e46, -11, 5.09674593842117925320e-04L),
> +a8u = LD80C(0xe9f28a4432949af2, -13, 2.23109648015769155122e-04L),
> +a9u = LD80C(0xd12ad0d9b93c6bb0, -14, 9.97387167479808509830e-05L),
> +a10u= LD80C(0xb7522643c78a219b, -15, 4.37071076331030136818e-05L),
> +a11u= LD80C(0xca024dcdece2cb79, -16, 2.40813493372040143061e-05L),
> +a12u= LD80C(0xbb90fb6968ebdbf9, -19, 2.79495621083634031729e-06L),
> +a13u= LD80C(0xba1c9ffeeae07b37, -17, 1.10931287015513924136e-05L);
> +#define a0 (a0u.e)
> +#define a1 (a1u.e)
> +#define a2 (a2u.e)
> +#define a3 (a3u.e)
> +#define a4 (a4u.e)
> +#define a5 (a5u.e)
> +#define a6 (a6u.e)
> +#define a7 (a7u.e)
> +#define a8 (a8u.e)
> +#define a9 (a9u.e)
> +#define a10 (a10u.e)
> +#define a11 (a11u.e)
> +#define a12 (a12u.e)
> +#define a13 (a13u.e)
> +/*
> + * Domain x in [tc-0.24, tc+0.28], range ~[-6.1205e-22, 6.1205e-22]:
> + * |(lgamma(x) - tf) - t(x - tc)| < 2**-70.5
> + */
> +static const union IEEEl2bits
> +tcu = LD80C(0xbb16c31ab5f1fb71, 0, 1.46163214496836234128e+00L),
> +tfu = LD80C(0xf8cdcde61c520e0f, -4, -1.21486290535849608093e-01L),
> +ttu = LD80C(0xd46ee54b27d4de99, -69, -2.81152980996018785880e-21L),
> +t0u = LD80C(0x80b9406556a62a6b, -68, 3.40728634996055147231e-21L),
> +t1u = LD80C(0xc7e9c6f6df3f8c39, -67, -1.05833162742737073665e-20L),
> +t2u = LD80C(0xf7b95e4771c55d51, -2, 4.83836122723810583532e-01L),
> +t3u = LD80C(0x97213c6e35e119ff, -3, -1.47587722994530691476e-01L),
> +t4u = LD80C(0x845a14a6a81dc94b, -4, 6.46249402389135358063e-02L),
> +t5u = LD80C(0x864d46fa89997796, -5, -3.27885410884846056084e-02L),
> +t6u = LD80C(0x93373cbd00297438, -6, 1.79706751150707171293e-02L),
> +t7u = LD80C(0xa8fcfca7eddc8d1d, -7, -1.03142230361450732547e-02L),
> +t8u = LD80C(0xc7e7015ff4bc45af, -8, 6.10053603296546099193e-03L),
> +t9u = LD80C(0xf178d2247adc5093, -9, -3.68456964904901200152e-03L),
> +t10u = LD80C(0x94188d58f12e5e9f, -9, 2.25976420273774583089e-03L),
> +t11u = LD80C(0xb7cbaef14e1406f1, -10, -1.40224943666225639823e-03L),
> +t12u = LD80C(0xe63a671e6704ea4d, -11, 8.78250640744776944887e-04L),
> +t13u = LD80C(0x914b6c9cae61783e, -11, -5.54255012657716808811e-04L),
> +t14u = LD80C(0xb858f5bdb79276fe, -12, 3.51614951536825927370e-04L),
> +t15u = LD80C(0xea73e744c34b9591, -13, -2.23591563824520112236e-04L),
> +t16u = LD80C(0x99aeabb0d67ba835, -13, 1.46562869351659194136e-04L),
> +t17u = LD80C(0xd7c6938325db2024, -14, -1.02889866046435680588e-04L),
> +t18u = LD80C(0xe24cb1e3b0474775, -15, 5.39540265505221957652e-05L);
> +#define tc (tcu.e)
> +#define tf (tfu.e)
> +#define tt (ttu.e)
> +#define t0 (t0u.e)
> +#define t1 (t1u.e)
> +#define t2 (t2u.e)
> +#define t3 (t3u.e)
> +#define t4 (t4u.e)
> +#define t5 (t5u.e)
> +#define t6 (t6u.e)
> +#define t7 (t7u.e)
> +#define t8 (t8u.e)
> +#define t9 (t9u.e)
> +#define t10 (t10u.e)
> +#define t11 (t11u.e)
> +#define t12 (t12u.e)
> +#define t13 (t13u.e)
> +#define t14 (t14u.e)
> +#define t15 (t15u.e)
> +#define t16 (t16u.e)
> +#define t17 (t17u.e)
> +#define t18 (t18u.e)
> +/*
> + * Domain y in [-0.1, 0.232], range ~[-8.1938e-22, 8.3815e-22]:
> + * |(lgamma(1 + y) + 0.5 * y) / y - u(y) / v(y)| < 2**-71.2
> + */
> +static const union IEEEl2bits
> +u0u = LD80C(0x9e233f1bed863d27, -4, -7.72156649015328606095e-02L),
> +u1u = LD80C(0x98280ee45e4ddd3d, -1, 5.94361239198682739769e-01L),
> +u2u = LD80C(0xe330c8ead4130733, 0, 1.77492629495841234275e+00L),
> +u3u = LD80C(0xd4a213f1a002ec52, 0, 1.66119622514818078064e+00L),
> +u4u = LD80C(0xa5a9ca6f5bc62163, -1, 6.47122051417476492989e-01L),
> +u5u = LD80C(0xc980e49cd5b019e6, -4, 9.83903751718671509455e-02L),
> +u6u = LD80C(0xff636a8bdce7025b, -9, 3.89691687802305743450e-03L),
> +v1u = LD80C(0xbd109c533a19fbf5, 1, 2.95413883330948556544e+00L),
> +v2u = LD80C(0xd295cbf96f31f099, 1, 3.29039286955665403176e+00L),
> +v3u = LD80C(0xdab8bcfee40496cb, 0, 1.70876276441416471410e+00L),
> +v4u = LD80C(0xd2f2dc3638567e9f, -2, 4.12009126299534668571e-01L),
> +v5u = LD80C(0xa07d9b0851070f41, -5, 3.91822868305682491442e-02L),
> +v6u = LD80C(0xe3cd8318f7adb2c4, -11, 8.68998648222144351114e-04L);
> +#define u0 (u0u.e)
> +#define u1 (u1u.e)
> +#define u2 (u2u.e)
> +#define u3 (u3u.e)
> +#define u4 (u4u.e)
> +#define u5 (u5u.e)
> +#define u6 (u6u.e)
> +#define v1 (v1u.e)
> +#define v2 (v2u.e)
> +#define v3 (v3u.e)
> +#define v4 (v4u.e)
> +#define v5 (v5u.e)
> +#define v6 (v6u.e)
> +/*
> + * Domain x in (2, 3], range ~[-3.3648e-22, 3.4416e-22]:
> + * |(lgamma(y+2) - 0.5 * y) / y - s(y)/r(y)| < 2**-72.3
> + * with y = x - 2.
> + */
> +static const union IEEEl2bits
> +s0u = LD80C(0x9e233f1bed863d27, -4, -7.72156649015328606095e-02L),
> +s1u = LD80C(0xd3ff0dcc7fa91f94, -3, 2.07027640921219389860e-01L),
> +s2u = LD80C(0xb2bb62782478ef31, -2, 3.49085881391362090549e-01L),
> +s3u = LD80C(0xb49f7438c4611a74, -3, 1.76389518704213357954e-01L),
> +s4u = LD80C(0x9a957008fa27ecf9, -5, 3.77401710862930008071e-02L),
> +s5u = LD80C(0xda9b389a6ca7a7ac, -9, 3.33566791452943399399e-03L),
> +s6u = LD80C(0xbc7a2263faf59c14, -14, 8.98728786745638844395e-05L),
> +r1u = LD80C(0xbf5cff5b11477d4d, 0, 1.49502555796294337722e+00L),
> +r2u = LD80C(0xd9aec89de08e3da6, -1, 8.50323236984473285866e-01L),
> +r3u = LD80C(0xeab7ae5057c443f9, -3, 2.29216312078225806131e-01L),
> +r4u = LD80C(0xf29707d9bd2b1e37, -6, 2.96130326586640089145e-02L),
> +r5u = LD80C(0xd376c2f09736c5a3, -10, 1.61334161411590662495e-03L),
> +r6u = LD80C(0xc985983d0cd34e3d, -16, 2.40232770710953450636e-05L),
> +r7u = LD80C(0xe5c7a4f7fc2ef13d, -25, -5.34997929289167573510e-08L);
> +#define s0 (s0u.e)
> +#define s1 (s1u.e)
> +#define s2 (s2u.e)
> +#define s3 (s3u.e)
> +#define s4 (s4u.e)
> +#define s5 (s5u.e)
> +#define s6 (s6u.e)
> +#define r1 (r1u.e)
> +#define r2 (r2u.e)
> +#define r3 (r3u.e)
> +#define r4 (r4u.e)
> +#define r5 (r5u.e)
> +#define r6 (r6u.e)
> +#define r7 (r7u.e)
> +/*
> + * Domain z in [8, 0x1p70], range ~[-3.0235e-22, 3.0563e-22]:
> + * |lgamma(x) - (x - 0.5) * (log(x) - 1) - w(1/x)| < 2**-71.7
> + */
> +static const union IEEEl2bits
> +w0u = LD80C(0xd67f1c864beb4a69, -2, 4.18938533204672741776e-01L),
> +w1u = LD80C(0xaaaaaaaaaaaaaaa1, -4, 8.33333333333333332678e-02L),
> +w2u = LD80C(0xb60b60b60b5491c9, -9, -2.77777777777760927870e-03L),
> +w3u = LD80C(0xd00d00cf58aede4c, -11, 7.93650793490637233668e-04L),
> +w4u = LD80C(0x9c09bf626783d4a5, -11, -5.95238023926039051268e-04L),
> +w5u = LD80C(0xdca7cadc5baa517b, -11, 8.41733700408000822962e-04L),
> +w6u = LD80C(0xfb060e361e1ffd07, -10, -1.91515849570245136604e-03L),
> +w7u = LD80C(0xcbd5101bb58d1f2b, -8, 6.22046743903262649294e-03L),
> +w8u = LD80C(0xad27a668d32c821b, -6, -2.11370706734662081843e-02L);
> +#define w0 (w0u.e)
> +#define w1 (w1u.e)
> +#define w2 (w2u.e)
> +#define w3 (w3u.e)
> +#define w4 (w4u.e)
> +#define w5 (w5u.e)
> +#define w6 (w6u.e)
> +#define w7 (w7u.e)
> +#define w8 (w8u.e)
> +
> +static long double
> +sin_pil(long double x)
> +{
> + volatile long double vz;
> + long double y,z;
> + uint64_t n;
> + uint16_t hx;
> +
> + y = -x;
> +
> + vz = y+0x1p63;
> + z = vz-0x1p63;
> + if (z == y)
> + return zero;
> +
> + vz = y+0x1p61;
> + EXTRACT_LDBL80_WORDS(hx,n,vz);
> + z = vz-0x1p61;
> + if (z > y) {
> + z -= 0.25; /* adjust to round down */
> + n--;
> + }
> + n &= 7; /* octant of y mod 2 */
> + y = y - z + n * 0.25; /* y mod 2 */
> +
> + switch (n) {
> + case 0: y = __kernel_sinl(pi*y,zero,0); break;
> + case 1:
> + case 2: y = __kernel_cosl(pi*(0.5-y),zero); break;
> + case 3:
> + case 4: y = __kernel_sinl(pi*(one-y),zero,0); break;
> + case 5:
> + case 6: y = -__kernel_cosl(pi*(y-1.5),zero); break;
> + default: y = __kernel_sinl(pi*(y-2.0),zero,0); break;
> + }
> + return -y;
> +}
> +
> +long double
> +lgammal_r(long double x, int *signgamp)
> +{
> + long double nadj,p,p1,p2,q,r,t,w,y,z;
> + uint64_t lx;
> + int i;
> + uint16_t hx,ix;
> +
> + EXTRACT_LDBL80_WORDS(hx,lx,x);
> +
> + /* purge +-Inf and NaNs */
> + *signgamp = 1;
> + ix = hx&0x7fff;
> + if(ix==0x7fff) return x*x;
> +
> + ENTERI();
> +
> + /* purge +-0 and tiny arguments */
> + *signgamp = 1-2*(hx>>15);
> + if(ix<0x3fff-67) { /* |x|<2**-(p+3), return -log(|x|) */
> + if((ix|lx)==0)
> + RETURNI(one/vzero);
> + RETURNI(-logl(fabsl(x)));
> + }
> +
> + /* purge negative integers and start evaluation for other x < 0 */
> + if(hx&0x8000) {
> + *signgamp = 1;
> + if(ix>=0x3fff+63) /* |x|>=2**(p-1), must be -integer */
> + RETURNI(one/vzero);
> + t = sin_pil(x);
> + if(t==zero) RETURNI(one/vzero); /* -integer */
> + nadj = logl(pi/fabsl(t*x));
> + if(t<zero) *signgamp = -1;
> + x = -x;
> + }
> +
> + /* purge 1 and 2 */
> + if((ix==0x3fff || ix==0x4000) && lx==0x8000000000000000ULL) r = 0;
> + /* for x < 2.0 */
> + else if(ix<0x4000) {
> + /*
> + * XXX Supposedly, one can use the following information to replace the
> + * XXX FP rational expressions. A similar approach is appropriate
> + * XXX for ld128, but one (may need?) needs to consider llx, too.
> + *
> + * 8.9999961853027344e-01 3ffe e666600000000000
> + * 7.3159980773925781e-01 3ffe bb4a200000000000
> + * 2.3163998126983643e-01 3ffc ed33080000000000
> + * 1.7316312789916992e+00 3fff dda6180000000000
> + * 1.2316322326660156e+00 3fff 9da6200000000000
> + */
> + if(x<8.9999961853027344e-01) {
> + r = -logl(x);
> + if(x>=7.3159980773925781e-01) {y = 1-x; i= 0;}
> + else if(x>=2.3163998126983643e-01) {y= x-(tc-1); i=1;}
> + else {y = x; i=2;}
> + } else {
> + r = 0;
> + if(x>=1.7316312789916992e+00) {y=2-x;i=0;}
> + else if(x>=1.2316322326660156e+00) {y=x-tc;i=1;}
> + else {y=x-1;i=2;}
> + }
> + switch(i) {
> + case 0:
> + z = y*y;
> + p1 = a0+z*(a2+z*(a4+z*(a6+z*(a8+z*(a10+z*a12)))));
> + p2 = z*(a1+z*(a3+z*(a5+z*(a7+z*(a9+z*(a11+z*a13))))));
> + p = y*p1+p2;
> + r += p-y/2; break;
> + case 1:
> + p = t0+y*t1+tt+y*y*(t2+y*(t3+y*(t4+y*(t5+y*(t6+y*(t7+y*(t8+
> + y*(t9+y*(t10+y*(t11+y*(t12+y*(t13+y*(t14+y*(t15+y*(t16+
> + y*(t17+y*t18))))))))))))))));
> + r += tf + p; break;
> + case 2:
> + p1 = y*(u0+y*(u1+y*(u2+y*(u3+y*(u4+y*(u5+y*u6))))));
> + p2 = 1+y*(v1+y*(v2+y*(v3+y*(v4+y*(v5+y*v6)))));
> + r += p1/p2-y/2;
> + }
> + }
> + /* x < 8.0 */
> + else if(ix<0x4002) {
> + i = x;
> + y = x-i;
> + p = y*(s0+y*(s1+y*(s2+y*(s3+y*(s4+y*(s5+y*s6))))));
> + q = 1+y*(r1+y*(r2+y*(r3+y*(r4+y*(r5+y*(r6+y*r7))))));
> + r = y/2+p/q;
> + z = 1; /* lgamma(1+s) = log(s) + lgamma(s) */
> + switch(i) {
> + case 7: z *= (y+6); /* FALLTHRU */
> + case 6: z *= (y+5); /* FALLTHRU */
> + case 5: z *= (y+4); /* FALLTHRU */
> + case 4: z *= (y+3); /* FALLTHRU */
> + case 3: z *= (y+2); /* FALLTHRU */
> + r += logl(z); break;
> + }
> + /* 8.0 <= x < 2**(p+3) */
> + } else if (ix<0x3fff+67) {
> + t = logl(x);
> + z = one/x;
> + y = z*z;
> + w = w0+z*(w1+y*(w2+y*(w3+y*(w4+y*(w5+y*(w6+y*(w7+y*w8)))))));
> + r = (x-half)*(t-one)+w;
> + /* 2**(p+3) <= x <= inf */
> + } else
> + r = x*(logl(x)-1);
> + if(hx&0x8000) r = nadj - r;
> + RETURNI(r);
> +}
> diff --git a/newlib/libm/ld80/e_powl.c b/newlib/libm/ld80/e_powl.c
> new file mode 100644
> index 000000000..ea25354c2
> --- /dev/null
> +++ b/newlib/libm/ld80/e_powl.c
> @@ -0,0 +1,662 @@
> +/*-
> + * Copyright (c) 2008 Stephen L. Moshier <steve@moshier.net>
> + *
> + * Permission to use, copy, modify, and distribute this software for any
> + * purpose with or without fee is hereby granted, provided that the above
> + * copyright notice and this permission notice appear in all copies.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
> + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
> + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
> + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
> + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
> + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
> + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include <math.h>
> +
> +#include "math_private.h"
> +
> +/*
> + * Polynomial evaluator:
> + * P[0] x^n + P[1] x^(n-1) + ... + P[n]
> + */
> +static inline long double
> +__polevll(long double x, long double *PP, int n)
> +{
> + long double y;
> + long double *P;
> +
> + P = PP;
> + y = *P++;
> + do {
> + y = y * x + *P++;
> + } while (--n);
> +
> + return (y);
> +}
> +
> +/*
> + * Polynomial evaluator:
> + * x^n + P[0] x^(n-1) + P[1] x^(n-2) + ... + P[n]
> + */
> +static inline long double
> +__p1evll(long double x, long double *PP, int n)
> +{
> + long double y;
> + long double *P;
> +
> + P = PP;
> + n -= 1;
> + y = x + *P++;
> + do {
> + y = y * x + *P++;
> + } while (--n);
> +
> + return (y);
> +}
> +
> +/* powl.c
> + *
> + * Power function, long double precision
> + *
> + *
> + *
> + * SYNOPSIS:
> + *
> + * long double x, y, z, powl();
> + *
> + * z = powl( x, y );
> + *
> + *
> + *
> + * DESCRIPTION:
> + *
> + * Computes x raised to the yth power. Analytically,
> + *
> + * x**y = exp( y log(x) ).
> + *
> + * Following Cody and Waite, this program uses a lookup table
> + * of 2**-i/32 and pseudo extended precision arithmetic to
> + * obtain several extra bits of accuracy in both the logarithm
> + * and the exponential.
> + *
> + *
> + *
> + * ACCURACY:
> + *
> + * The relative error of pow(x,y) can be estimated
> + * by y dl ln(2), where dl is the absolute error of
> + * the internally computed base 2 logarithm. At the ends
> + * of the approximation interval the logarithm equal 1/32
> + * and its relative error is about 1 lsb = 1.1e-19. Hence
> + * the predicted relative error in the result is 2.3e-21 y .
> + *
> + * Relative error:
> + * arithmetic domain # trials peak rms
> + *
> + * IEEE +-1000 40000 2.8e-18 3.7e-19
> + * .001 < x < 1000, with log(x) uniformly distributed.
> + * -1000 < y < 1000, y uniformly distributed.
> + *
> + * IEEE 0,8700 60000 6.5e-18 1.0e-18
> + * 0.99 < x < 1.01, 0 < y < 8700, uniformly distributed.
> + *
> + *
> + * ERROR MESSAGES:
> + *
> + * message condition value returned
> + * pow overflow x**y > MAXNUM INFINITY
> + * pow underflow x**y < 1/MAXNUM 0.0
> + * pow domain x<0 and y noninteger 0.0
> + *
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include <float.h>
> +#include <math.h>
> +
> +#include "math_private.h"
> +
> +/* Table size */
> +#define NXT 32
> +/* log2(Table size) */
> +#define LNXT 5
> +
> +/* log(1+x) = x - .5x^2 + x^3 * P(z)/Q(z)
> + * on the domain 2^(-1/32) - 1 <= x <= 2^(1/32) - 1
> + */
> +static long double P[] = {
> + 8.3319510773868690346226E-4L,
> + 4.9000050881978028599627E-1L,
> + 1.7500123722550302671919E0L,
> + 1.4000100839971580279335E0L,
> +};
> +static long double Q[] = {
> +/* 1.0000000000000000000000E0L,*/
> + 5.2500282295834889175431E0L,
> + 8.4000598057587009834666E0L,
> + 4.2000302519914740834728E0L,
> +};
> +/* A[i] = 2^(-i/32), rounded to IEEE long double precision.
> + * If i is even, A[i] + B[i/2] gives additional accuracy.
> + */
> +static long double A[33] = {
> + 1.0000000000000000000000E0L,
> + 9.7857206208770013448287E-1L,
> + 9.5760328069857364691013E-1L,
> + 9.3708381705514995065011E-1L,
> + 9.1700404320467123175367E-1L,
> + 8.9735453750155359320742E-1L,
> + 8.7812608018664974155474E-1L,
> + 8.5930964906123895780165E-1L,
> + 8.4089641525371454301892E-1L,
> + 8.2287773907698242225554E-1L,
> + 8.0524516597462715409607E-1L,
> + 7.8799042255394324325455E-1L,
> + 7.7110541270397041179298E-1L,
> + 7.5458221379671136985669E-1L,
> + 7.3841307296974965571198E-1L,
> + 7.2259040348852331001267E-1L,
> + 7.0710678118654752438189E-1L,
> + 6.9195494098191597746178E-1L,
> + 6.7712777346844636413344E-1L,
> + 6.6261832157987064729696E-1L,
> + 6.4841977732550483296079E-1L,
> + 6.3452547859586661129850E-1L,
> + 6.2092890603674202431705E-1L,
> + 6.0762367999023443907803E-1L,
> + 5.9460355750136053334378E-1L,
> + 5.8186242938878875689693E-1L,
> + 5.6939431737834582684856E-1L,
> + 5.5719337129794626814472E-1L,
> + 5.4525386633262882960438E-1L,
> + 5.3357020033841180906486E-1L,
> + 5.2213689121370692017331E-1L,
> + 5.1094857432705833910408E-1L,
> + 5.0000000000000000000000E-1L,
> +};
> +static long double B[17] = {
> + 0.0000000000000000000000E0L,
> + 2.6176170809902549338711E-20L,
> +-1.0126791927256478897086E-20L,
> + 1.3438228172316276937655E-21L,
> + 1.2207982955417546912101E-20L,
> +-6.3084814358060867200133E-21L,
> + 1.3164426894366316434230E-20L,
> +-1.8527916071632873716786E-20L,
> + 1.8950325588932570796551E-20L,
> + 1.5564775779538780478155E-20L,
> + 6.0859793637556860974380E-21L,
> +-2.0208749253662532228949E-20L,
> + 1.4966292219224761844552E-20L,
> + 3.3540909728056476875639E-21L,
> +-8.6987564101742849540743E-22L,
> +-1.2327176863327626135542E-20L,
> + 0.0000000000000000000000E0L,
> +};
> +
> +/* 2^x = 1 + x P(x),
> + * on the interval -1/32 <= x <= 0
> + */
> +static long double R[] = {
> + 1.5089970579127659901157E-5L,
> + 1.5402715328927013076125E-4L,
> + 1.3333556028915671091390E-3L,
> + 9.6181291046036762031786E-3L,
> + 5.5504108664798463044015E-2L,
> + 2.4022650695910062854352E-1L,
> + 6.9314718055994530931447E-1L,
> +};
> +
> +#define douba(k) A[k]
> +#define doubb(k) B[k]
> +#define MEXP (NXT*16384.0L)
> +/* The following if denormal numbers are supported, else -MEXP: */
> +#define MNEXP (-NXT*(16384.0L+64.0L))
> +/* log2(e) - 1 */
> +#define LOG2EA 0.44269504088896340735992L
> +
> +#define F W
> +#define Fa Wa
> +#define Fb Wb
> +#define G W
> +#define Ga Wa
> +#define Gb u
> +#define H W
> +#define Ha Wb
> +#define Hb Wb
> +
> +static const long double MAXLOGL = 1.1356523406294143949492E4L;
> +static const long double MINLOGL = -1.13994985314888605586758E4L;
> +static const long double LOGE2L = 6.9314718055994530941723E-1L;
> +static volatile long double z;
> +static long double w, W, Wa, Wb, ya, yb, u;
> +static const long double huge = 0x1p10000L;
> +#if 0 /* XXX Prevent gcc from erroneously constant folding this. */
> +static const long double twom10000 = 0x1p-10000L;
> +#else
> +static volatile long double twom10000 = 0x1p-10000L;
> +#endif
> +
> +static long double reducl( long double );
> +static long double powil ( long double, int );
> +
> +long double
> +powl(long double x, long double y)
> +{
> +/* double F, Fa, Fb, G, Ga, Gb, H, Ha, Hb */
> +int i, nflg, iyflg, yoddint;
> +long e;
> +
> +if( y == 0.0L )
> + return( 1.0L );
> +
> +if( x == 1.0L )
> + return( 1.0L );
> +
> +if( isnan(x) )
> + return ( nan_mix(x, y) );
> +if( isnan(y) )
> + return ( nan_mix(x, y) );
> +
> +if( y == 1.0L )
> + return( x );
> +
> +if( !isfinite(y) && x == -1.0L )
> + return( 1.0L );
> +
> +if( y >= LDBL_MAX )
> + {
> + if( x > 1.0L )
> + return( INFINITY );
> + if( x > 0.0L && x < 1.0L )
> + return( 0.0L );
> + if( x < -1.0L )
> + return( INFINITY );
> + if( x > -1.0L && x < 0.0L )
> + return( 0.0L );
> + }
> +if( y <= -LDBL_MAX )
> + {
> + if( x > 1.0L )
> + return( 0.0L );
> + if( x > 0.0L && x < 1.0L )
> + return( INFINITY );
> + if( x < -1.0L )
> + return( 0.0L );
> + if( x > -1.0L && x < 0.0L )
> + return( INFINITY );
> + }
> +if( x >= LDBL_MAX )
> + {
> + if( y > 0.0L )
> + return( INFINITY );
> + return( 0.0L );
> + }
> +
> +w = floorl(y);
> +/* Set iyflg to 1 if y is an integer. */
> +iyflg = 0;
> +if( w == y )
> + iyflg = 1;
> +
> +/* Test for odd integer y. */
> +yoddint = 0;
> +if( iyflg )
> + {
> + ya = fabsl(y);
> + ya = floorl(0.5L * ya);
> + yb = 0.5L * fabsl(w);
> + if( ya != yb )
> + yoddint = 1;
> + }
> +
> +if( x <= -LDBL_MAX )
> + {
> + if( y > 0.0L )
> + {
> + if( yoddint )
> + return( -INFINITY );
> + return( INFINITY );
> + }
> + if( y < 0.0L )
> + {
> + if( yoddint )
> + return( -0.0L );
> + return( 0.0 );
> + }
> + }
> +
> +
> +nflg = 0; /* flag = 1 if x<0 raised to integer power */
> +if( x <= 0.0L )
> + {
> + if( x == 0.0L )
> + {
> + if( y < 0.0 )
> + {
> + if( signbit(x) && yoddint )
> + return( -INFINITY );
> + return( INFINITY );
> + }
> + if( y > 0.0 )
> + {
> + if( signbit(x) && yoddint )
> + return( -0.0L );
> + return( 0.0 );
> + }
> + if( y == 0.0L )
> + return( 1.0L ); /* 0**0 */
> + else
> + return( 0.0L ); /* 0**y */
> + }
> + else
> + {
> + if( iyflg == 0 )
> + return (x - x) / (x - x); /* (x<0)**(non-int) is NaN */
> + nflg = 1;
> + }
> + }
> +
> +/* Integer power of an integer. */
> +
> +if( iyflg )
> + {
> + i = w;
> + w = floorl(x);
> + if( (w == x) && (fabsl(y) < 32768.0) )
> + {
> + w = powil( x, (int) y );
> + return( w );
> + }
> + }
> +
> +
> +if( nflg )
> + x = fabsl(x);
> +
> +/* separate significand from exponent */
> +x = frexpl( x, &i );
> +e = i;
> +
> +/* find significand in antilog table A[] */
> +i = 1;
> +if( x <= douba(17) )
> + i = 17;
> +if( x <= douba(i+8) )
> + i += 8;
> +if( x <= douba(i+4) )
> + i += 4;
> +if( x <= douba(i+2) )
> + i += 2;
> +if( x >= douba(1) )
> + i = -1;
> +i += 1;
> +
> +
> +/* Find (x - A[i])/A[i]
> + * in order to compute log(x/A[i]):
> + *
> + * log(x) = log( a x/a ) = log(a) + log(x/a)
> + *
> + * log(x/a) = log(1+v), v = x/a - 1 = (x-a)/a
> + */
> +x -= douba(i);
> +x -= doubb(i/2);
> +x /= douba(i);
> +
> +
> +/* rational approximation for log(1+v):
> + *
> + * log(1+v) = v - v**2/2 + v**3 P(v) / Q(v)
> + */
> +z = x*x;
> +w = x * ( z * __polevll( x, P, 3 ) / __p1evll( x, Q, 3 ) );
> +w = w - ldexpl( z, -1 ); /* w - 0.5 * z */
> +
> +/* Convert to base 2 logarithm:
> + * multiply by log2(e) = 1 + LOG2EA
> + */
> +z = LOG2EA * w;
> +z += w;
> +z += LOG2EA * x;
> +z += x;
> +
> +/* Compute exponent term of the base 2 logarithm. */
> +w = -i;
> +w = ldexpl( w, -LNXT ); /* divide by NXT */
> +w += e;
> +/* Now base 2 log of x is w + z. */
> +
> +/* Multiply base 2 log by y, in extended precision. */
> +
> +/* separate y into large part ya
> + * and small part yb less than 1/NXT
> + */
> +ya = reducl(y);
> +yb = y - ya;
> +
> +/* (w+z)(ya+yb)
> + * = w*ya + w*yb + z*y
> + */
> +F = z * y + w * yb;
> +Fa = reducl(F);
> +Fb = F - Fa;
> +
> +G = Fa + w * ya;
> +Ga = reducl(G);
> +Gb = G - Ga;
> +
> +H = Fb + Gb;
> +Ha = reducl(H);
> +w = ldexpl( Ga+Ha, LNXT );
> +
> +/* Test the power of 2 for overflow */
> +if( w > MEXP )
> + return (huge * huge); /* overflow */
> +
> +if( w < MNEXP )
> + return (twom10000 * twom10000); /* underflow */
> +
> +e = w;
> +Hb = H - Ha;
> +
> +if( Hb > 0.0L )
> + {
> + e += 1;
> + Hb -= (1.0L/NXT); /*0.0625L;*/
> + }
> +
> +/* Now the product y * log2(x) = Hb + e/NXT.
> + *
> + * Compute base 2 exponential of Hb,
> + * where -0.0625 <= Hb <= 0.
> + */
> +z = Hb * __polevll( Hb, R, 6 ); /* z = 2**Hb - 1 */
> +
> +/* Express e/NXT as an integer plus a negative number of (1/NXT)ths.
> + * Find lookup table entry for the fractional power of 2.
> + */
> +if( e < 0 )
> + i = 0;
> +else
> + i = 1;
> +i = e/NXT + i;
> +e = NXT*i - e;
> +w = douba( e );
> +z = w * z; /* 2**-e * ( 1 + (2**Hb-1) ) */
> +z = z + w;
> +z = ldexpl( z, i ); /* multiply by integer power of 2 */
> +
> +if( nflg )
> + {
> +/* For negative x,
> + * find out if the integer exponent
> + * is odd or even.
> + */
> + w = ldexpl( y, -1 );
> + w = floorl(w);
> + w = ldexpl( w, 1 );
> + if( w != y )
> + z = -z; /* odd exponent */
> + }
> +
> +return( z );
> +}
> +
> +
> +/* Find a multiple of 1/NXT that is within 1/NXT of x. */
> +static inline long double
> +reducl(long double x)
> +{
> +long double t;
> +
> +t = ldexpl( x, LNXT );
> +t = floorl( t );
> +t = ldexpl( t, -LNXT );
> +return(t);
> +}
> +
> +/* powil.c
> + *
> + * Real raised to integer power, long double precision
> + *
> + *
> + *
> + * SYNOPSIS:
> + *
> + * long double x, y, powil();
> + * int n;
> + *
> + * y = powil( x, n );
> + *
> + *
> + *
> + * DESCRIPTION:
> + *
> + * Returns argument x raised to the nth power.
> + * The routine efficiently decomposes n as a sum of powers of
> + * two. The desired power is a product of two-to-the-kth
> + * powers of x. Thus to compute the 32767 power of x requires
> + * 28 multiplications instead of 32767 multiplications.
> + *
> + *
> + *
> + * ACCURACY:
> + *
> + *
> + * Relative error:
> + * arithmetic x domain n domain # trials peak rms
> + * IEEE .001,1000 -1022,1023 50000 4.3e-17 7.8e-18
> + * IEEE 1,2 -1022,1023 20000 3.9e-17 7.6e-18
> + * IEEE .99,1.01 0,8700 10000 3.6e-16 7.2e-17
> + *
> + * Returns MAXNUM on overflow, zero on underflow.
> + *
> + */
> +
> +static long double
> +powil(long double x, int nn)
> +{
> +long double ww, y;
> +long double s;
> +int n, e, sign, asign, lx;
> +
> +if( x == 0.0L )
> + {
> + if( nn == 0 )
> + return( 1.0L );
> + else if( nn < 0 )
> + return( LDBL_MAX );
> + else
> + return( 0.0L );
> + }
> +
> +if( nn == 0 )
> + return( 1.0L );
> +
> +
> +if( x < 0.0L )
> + {
> + asign = -1;
> + x = -x;
> + }
> +else
> + asign = 0;
> +
> +
> +if( nn < 0 )
> + {
> + sign = -1;
> + n = -nn;
> + }
> +else
> + {
> + sign = 1;
> + n = nn;
> + }
> +
> +/* Overflow detection */
> +
> +/* Calculate approximate logarithm of answer */
> +s = x;
> +s = frexpl( s, &lx );
> +e = (lx - 1)*n;
> +if( (e == 0) || (e > 64) || (e < -64) )
> + {
> + s = (s - 7.0710678118654752e-1L) / (s + 7.0710678118654752e-1L);
> + s = (2.9142135623730950L * s - 0.5L + lx) * nn * LOGE2L;
> + }
> +else
> + {
> + s = LOGE2L * e;
> + }
> +
> +if( s > MAXLOGL )
> + return (huge * huge); /* overflow */
> +
> +if( s < MINLOGL )
> + return (twom10000 * twom10000); /* underflow */
> +/* Handle tiny denormal answer, but with less accuracy
> + * since roundoff error in 1.0/x will be amplified.
> + * The precise demarcation should be the gradual underflow threshold.
> + */
> +if( s < (-MAXLOGL+2.0L) )
> + {
> + x = 1.0L/x;
> + sign = -sign;
> + }
> +
> +/* First bit of the power */
> +if( n & 1 )
> + y = x;
> +
> +else
> + {
> + y = 1.0L;
> + asign = 0;
> + }
> +
> +ww = x;
> +n >>= 1;
> +while( n )
> + {
> + ww = ww * ww; /* arg to the 2-to-the-kth power */
> + if( n & 1 ) /* if that bit is set, then include in product */
> + y *= ww;
> + n >>= 1;
> + }
> +
> +if( asign )
> + y = -y; /* odd power of negative number */
> +if( sign < 0 )
> + y = 1.0L/y;
> +return(y);
> +}
> diff --git a/newlib/libm/ld80/e_rem_pio2l.h b/newlib/libm/ld80/e_rem_pio2l.h
> new file mode 100644
> index 000000000..b7ef5d983
> --- /dev/null
> +++ b/newlib/libm/ld80/e_rem_pio2l.h
> @@ -0,0 +1,143 @@
> +/* From: @(#)e_rem_pio2.c 1.4 95/01/18 */
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + * Copyright (c) 2008 Steven G. Kargl, David Schultz, Bruce D. Evans.
> + *
> + * Developed at SunSoft, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + *
> + * Optimized by Bruce D. Evans.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/* ld80 version of __ieee754_rem_pio2l(x,y)
> + *
> + * return the remainder of x rem pi/2 in y[0]+y[1]
> + * use __kernel_rem_pio2()
> + */
> +
> +#include <float.h>
> +
> +#include "math.h"
> +#include "math_private.h"
> +#include "../ld/fpmath.h"
> +
> +#define BIAS (LDBL_MAX_EXP - 1)
> +
> +/*
> + * invpio2: 64 bits of 2/pi
> + * pio2_1: first 39 bits of pi/2
> + * pio2_1t: pi/2 - pio2_1
> + * pio2_2: second 39 bits of pi/2
> + * pio2_2t: pi/2 - (pio2_1+pio2_2)
> + * pio2_3: third 39 bits of pi/2
> + * pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3)
> + */
> +
> +static const double
> +zero = 0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */
> +two24 = 1.67772160000000000000e+07, /* 0x41700000, 0x00000000 */
> +pio2_1 = 1.57079632679597125389e+00, /* 0x3FF921FB, 0x54444000 */
> +pio2_2 = -1.07463465549783099519e-12, /* -0x12e7b967674000.0p-92 */
> +pio2_3 = 6.36831716351370313614e-25; /* 0x18a2e037074000.0p-133 */
> +
> +#if defined(__amd64__) || defined(__i386__)
> +/* Long double constants are slow on these arches, and broken on i386. */
> +static const volatile double
> +invpio2hi = 6.3661977236758138e-01, /* 0x145f306dc9c883.0p-53 */
> +invpio2lo = -3.9356538861223811e-17, /* -0x16b00000000000.0p-107 */
> +pio2_1thi = -1.0746346554971943e-12, /* -0x12e7b9676733af.0p-92 */
> +pio2_1tlo = 8.8451028997905949e-29, /* 0x1c080000000000.0p-146 */
> +pio2_2thi = 6.3683171635109499e-25, /* 0x18a2e03707344a.0p-133 */
> +pio2_2tlo = 2.3183081793789774e-41, /* 0x10280000000000.0p-187 */
> +pio2_3thi = -2.7529965190440717e-37, /* -0x176b7ed8fbbacc.0p-174 */
> +pio2_3tlo = -4.2006647512740502e-54; /* -0x19c00000000000.0p-230 */
> +#define invpio2 ((long double)invpio2hi + invpio2lo)
> +#define pio2_1t ((long double)pio2_1thi + pio2_1tlo)
> +#define pio2_2t ((long double)pio2_2thi + pio2_2tlo)
> +#define pio2_3t ((long double)pio2_3thi + pio2_3tlo)
> +#else
> +static const long double
> +invpio2 = 6.36619772367581343076e-01L, /* 0xa2f9836e4e44152a.0p-64 */
> +pio2_1t = -1.07463465549719416346e-12L, /* -0x973dcb3b399d747f.0p-103 */
> +pio2_2t = 6.36831716351095013979e-25L, /* 0xc51701b839a25205.0p-144 */
> +pio2_3t = -2.75299651904407171810e-37L; /* -0xbb5bf6c7ddd660ce.0p-185 */
> +#endif
> +
> +static inline __always_inline int
> +__ieee754_rem_pio2l(long double x, long double *y)
> +{
> + union IEEEl2bits u,u1;
> + long double z,w,t,r,fn;
> + double tx[3],ty[2];
> + int e0,ex,i,j,nx,n;
> + int16_t expsign;
> +
> + u.e = x;
> + expsign = u.xbits.expsign;
> + ex = expsign & 0x7fff;
> + if (ex < BIAS + 25 || (ex == BIAS + 25 && u.bits.manh < 0xc90fdaa2)) {
> + /* |x| ~< 2^25*(pi/2), medium size */
> + fn = rnintl(x*invpio2);
> + n = irint(fn);
> + r = x-fn*pio2_1;
> + w = fn*pio2_1t; /* 1st round good to 102 bit */
> + {
> + union IEEEl2bits u2;
> + int ex1;
> + j = ex;
> + y[0] = r-w;
> + u2.e = y[0];
> + ex1 = u2.xbits.expsign & 0x7fff;
> + i = j-ex1;
> + if(i>22) { /* 2nd iteration needed, good to 141 */
> + t = r;
> + w = fn*pio2_2;
> + r = t-w;
> + w = fn*pio2_2t-((t-r)-w);
> + y[0] = r-w;
> + u2.e = y[0];
> + ex1 = u2.xbits.expsign & 0x7fff;
> + i = j-ex1;
> + if(i>61) { /* 3rd iteration need, 180 bits acc */
> + t = r; /* will cover all possible cases */
> + w = fn*pio2_3;
> + r = t-w;
> + w = fn*pio2_3t-((t-r)-w);
> + y[0] = r-w;
> + }
> + }
> + }
> + y[1] = (r-y[0])-w;
> + return n;
> + }
> + /*
> + * all other (large) arguments
> + */
> + if(ex==0x7fff) { /* x is inf or NaN */
> + y[0]=y[1]=x-x; return 0;
> + }
> + /* set z = scalbn(|x|,ilogb(x)-23) */
> + u1.e = x;
> + e0 = ex - BIAS - 23; /* e0 = ilogb(|x|)-23; */
> + u1.xbits.expsign = ex - e0;
> + z = u1.e;
> + for(i=0;i<2;i++) {
> + tx[i] = (double)((int32_t)(z));
> + z = (z-tx[i])*two24;
> + }
> + tx[2] = z;
> + nx = 3;
> + while(tx[nx-1]==zero) nx--; /* skip zero term */
> + n = __kernel_rem_pio2(tx,ty,e0,nx,2);
> + r = (long double)ty[0] + ty[1];
> + w = ty[1] - (r - ty[0]);
> + if(expsign<0) {y[0] = -r; y[1] = -w; return -n;}
> + y[0] = r; y[1] = w; return n;
> +}
> diff --git a/newlib/libm/ld80/invtrig.c b/newlib/libm/ld80/invtrig.c
> new file mode 100644
> index 000000000..5c8047857
> --- /dev/null
> +++ b/newlib/libm/ld80/invtrig.c
> @@ -0,0 +1,84 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2008 David Schultz <das@FreeBSD.ORG>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include "invtrig.h"
> +
> +/*
> + * asinl() and acosl()
> + */
> +const long double
> +pS0 = 1.66666666666666666631e-01L,
> +pS1 = -4.16313987993683104320e-01L,
> +pS2 = 3.69068046323246813704e-01L,
> +pS3 = -1.36213932016738603108e-01L,
> +pS4 = 1.78324189708471965733e-02L,
> +pS5 = -2.19216428382605211588e-04L,
> +pS6 = -7.10526623669075243183e-06L,
> +qS1 = -2.94788392796209867269e+00L,
> +qS2 = 3.27309890266528636716e+00L,
> +qS3 = -1.68285799854822427013e+00L,
> +qS4 = 3.90699412641738801874e-01L,
> +qS5 = -3.14365703596053263322e-02L;
> +
> +/*
> + * atanl()
> + */
> +const long double atanhi[] = {
> + 4.63647609000806116202e-01L,
> + 7.85398163397448309628e-01L,
> + 9.82793723247329067960e-01L,
> + 1.57079632679489661926e+00L,
> +};
> +
> +const long double atanlo[] = {
> + 1.18469937025062860669e-20L,
> + -1.25413940316708300586e-20L,
> + 2.55232234165405176172e-20L,
> + -2.50827880633416601173e-20L,
> +};
> +
> +const long double aT[] = {
> + 3.33333333333333333017e-01L,
> + -1.99999999999999632011e-01L,
> + 1.42857142857046531280e-01L,
> + -1.11111111100562372733e-01L,
> + 9.09090902935647302252e-02L,
> + -7.69230552476207730353e-02L,
> + 6.66661718042406260546e-02L,
> + -5.88158892835030888692e-02L,
> + 5.25499891539726639379e-02L,
> + -4.70119845393155721494e-02L,
> + 4.03539201366454414072e-02L,
> + -2.91303858419364158725e-02L,
> + 1.24822046299269234080e-02L,
> +};
> +
> +const long double pi_lo = -5.01655761266833202345e-20L;
> diff --git a/newlib/libm/ld80/invtrig.h b/newlib/libm/ld80/invtrig.h
> new file mode 100644
> index 000000000..be06a044b
> --- /dev/null
> +++ b/newlib/libm/ld80/invtrig.h
> @@ -0,0 +1,116 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2008 David Schultz <das@FreeBSD.ORG>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + *
> + * $FreeBSD$
> + */
> +
> +#include <float.h>
> +
> +#include "fpmath.h"
> +
> +#define BIAS (LDBL_MAX_EXP - 1)
> +#define MANH_SIZE LDBL_MANH_SIZE
> +
> +/* Approximation thresholds. */
> +#define ASIN_LINEAR (BIAS - 32) /* 2**-32 */
> +#define ACOS_CONST (BIAS - 65) /* 2**-65 */
> +#define ATAN_CONST (BIAS + 65) /* 2**65 */
> +#define ATAN_LINEAR (BIAS - 32) /* 2**-32 */
> +
> +/* 0.95 */
> +#define THRESH ((0xe666666666666666ULL>>(64-(MANH_SIZE-1)))|LDBL_NBIT)
> +
> +/* Constants shared by the long double inverse trig functions. */
> +#define pS0 _ItL_pS0
> +#define pS1 _ItL_pS1
> +#define pS2 _ItL_pS2
> +#define pS3 _ItL_pS3
> +#define pS4 _ItL_pS4
> +#define pS5 _ItL_pS5
> +#define pS6 _ItL_pS6
> +#define qS1 _ItL_qS1
> +#define qS2 _ItL_qS2
> +#define qS3 _ItL_qS3
> +#define qS4 _ItL_qS4
> +#define qS5 _ItL_qS5
> +#define atanhi _ItL_atanhi
> +#define atanlo _ItL_atanlo
> +#define aT _ItL_aT
> +#define pi_lo _ItL_pi_lo
> +
> +#define pio2_hi atanhi[3]
> +#define pio2_lo atanlo[3]
> +#define pio4_hi atanhi[1]
> +
> +#ifdef STRUCT_DECLS
> +typedef struct longdouble {
> + uint64_t mant;
> + uint16_t expsign;
> +} LONGDOUBLE;
> +#else
> +typedef long double LONGDOUBLE;
> +#endif
> +
> +extern const LONGDOUBLE pS0, pS1, pS2, pS3, pS4, pS5, pS6;
> +extern const LONGDOUBLE qS1, qS2, qS3, qS4, qS5;
> +extern const LONGDOUBLE atanhi[], atanlo[], aT[];
> +extern const LONGDOUBLE pi_lo;
> +
> +#ifndef STRUCT_DECLS
> +
> +static inline long double
> +P(long double x)
> +{
> +
> + return (x * (pS0 + x * (pS1 + x * (pS2 + x * (pS3 + x * \
> + (pS4 + x * (pS5 + x * pS6)))))));
> +}
> +
> +static inline long double
> +Q(long double x)
> +{
> +
> + return (1.0 + x * (qS1 + x * (qS2 + x * (qS3 + x * (qS4 + x * qS5)))));
> +}
> +
> +static inline long double
> +T_even(long double x)
> +{
> +
> + return (aT[0] + x * (aT[2] + x * (aT[4] + x * (aT[6] + x * \
> + (aT[8] + x * (aT[10] + x * aT[12]))))));
> +}
> +
> +static inline long double
> +T_odd(long double x)
> +{
> +
> + return (aT[1] + x * (aT[3] + x * (aT[5] + x * (aT[7] + x * \
> + (aT[9] + x * aT[11])))));
> +}
> +
> +#endif
> diff --git a/newlib/libm/ld80/k_cosl.c b/newlib/libm/ld80/k_cosl.c
> new file mode 100644
> index 000000000..6dde6adad
> --- /dev/null
> +++ b/newlib/libm/ld80/k_cosl.c
> @@ -0,0 +1,78 @@
> +/* From: @(#)k_cos.c 1.3 95/01/18 */
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + * Copyright (c) 2008 Steven G. Kargl, David Schultz, Bruce D. Evans.
> + *
> + * Developed at SunSoft, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * ld80 version of k_cos.c. See ../src/k_cos.c for most comments.
> + */
> +
> +#include "math_private.h"
> +
> +/*
> + * Domain [-0.7854, 0.7854], range ~[-2.43e-23, 2.425e-23]:
> + * |cos(x) - c(x)| < 2**-75.1
> + *
> + * The coefficients of c(x) were generated by a pari-gp script using
> + * a Remez algorithm that searches for the best higher coefficients
> + * after rounding leading coefficients to a specified precision.
> + *
> + * Simpler methods like Chebyshev or basic Remez barely suffice for
> + * cos() in 64-bit precision, because we want the coefficient of x^2
> + * to be precisely -0.5 so that multiplying by it is exact, and plain
> + * rounding of the coefficients of a good polynomial approximation only
> + * gives this up to about 64-bit precision. Plain rounding also gives
> + * a mediocre approximation for the coefficient of x^4, but a rounding
> + * error of 0.5 ulps for this coefficient would only contribute ~0.01
> + * ulps to the final error, so this is unimportant. Rounding errors in
> + * higher coefficients are even less important.
> + *
> + * In fact, coefficients above the x^4 one only need to have 53-bit
> + * precision, and this is more efficient. We get this optimization
> + * almost for free from the complications needed to search for the best
> + * higher coefficients.
> + */
> +static const double
> +one = 1.0;
> +
> +#if defined(__amd64__) || defined(__i386__)
> +/* Long double constants are slow on these arches, and broken on i386. */
> +static const volatile double
> +C1hi = 0.041666666666666664, /* 0x15555555555555.0p-57 */
> +C1lo = 2.2598839032744733e-18; /* 0x14d80000000000.0p-111 */
> +#define C1 ((long double)C1hi + C1lo)
> +#else
> +static const long double
> +C1 = 0.0416666666666666666136L; /* 0xaaaaaaaaaaaaaa9b.0p-68 */
> +#endif
> +
> +static const double
> +C2 = -0.0013888888888888874, /* -0x16c16c16c16c10.0p-62 */
> +C3 = 0.000024801587301571716, /* 0x1a01a01a018e22.0p-68 */
> +C4 = -0.00000027557319215507120, /* -0x127e4fb7602f22.0p-74 */
> +C5 = 0.0000000020876754400407278, /* 0x11eed8caaeccf1.0p-81 */
> +C6 = -1.1470297442401303e-11, /* -0x19393412bd1529.0p-89 */
> +C7 = 4.7383039476436467e-14; /* 0x1aac9d9af5c43e.0p-97 */
> +
> +long double
> +__kernel_cosl(long double x, long double y)
> +{
> + long double hz,z,r,w;
> +
> + z = x*x;
> + r = z*(C1+z*(C2+z*(C3+z*(C4+z*(C5+z*(C6+z*C7))))));
> + hz = 0.5*z;
> + w = one-hz;
> + return w + (((one-w)-hz) + (z*r-x*y));
> +}
> diff --git a/newlib/libm/ld80/k_cospil.h b/newlib/libm/ld80/k_cospil.h
> new file mode 100644
> index 000000000..6e13ef02a
> --- /dev/null
> +++ b/newlib/libm/ld80/k_cospil.h
> @@ -0,0 +1,42 @@
> +/*-
> + * Copyright (c) 2017 Steven G. Kargl
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice unmodified, this list of conditions, and the following
> + * disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
> + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
> + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
> + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
> + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
> + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
> + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +/*
> + * See ../src/k_cospi.c for implementation details.
> + */
> +
> +static inline long double
> +__kernel_cospil(long double x)
> +{
> + long double hi, lo;
> +
> + hi = (float)x;
> + lo = x - hi;
> + lo = lo * (pi_lo + pi_hi) + hi * pi_lo;
> + hi *= pi_hi;
> + _2sumF(hi, lo);
> + return (__kernel_cosl(hi, lo));
> +}
> diff --git a/newlib/libm/ld80/k_expl.h b/newlib/libm/ld80/k_expl.h
> new file mode 100644
> index 000000000..a744d2d38
> --- /dev/null
> +++ b/newlib/libm/ld80/k_expl.h
> @@ -0,0 +1,301 @@
> +/* from: FreeBSD: head/lib/msun/ld80/s_expl.c 251343 2013-06-03 19:51:32Z kargl */
> +
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2009-2013 Steven G. Kargl
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice unmodified, this list of conditions, and the following
> + * disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
> + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
> + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
> + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
> + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
> + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
> + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + *
> + * Optimized by Bruce D. Evans.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * See s_expl.c for more comments about __k_expl().
> + *
> + * See ../src/e_exp.c and ../src/k_exp.h for precision-independent comments
> + * about the secondary kernels.
> + */
> +
> +#define INTERVALS 128
> +#define LOG2_INTERVALS 7
> +#define BIAS (LDBL_MAX_EXP - 1)
> +
> +static const double
> +/*
> + * ln2/INTERVALS = L1+L2 (hi+lo decomposition for multiplication). L1 must
> + * have at least 22 (= log2(|LDBL_MIN_EXP-extras|) + log2(INTERVALS)) lowest
> + * bits zero so that multiplication of it by n is exact.
> + */
> +INV_L = 1.8466496523378731e+2, /* 0x171547652b82fe.0p-45 */
> +L1 = 5.4152123484527692e-3, /* 0x162e42ff000000.0p-60 */
> +L2 = -3.2819649005320973e-13, /* -0x1718432a1b0e26.0p-94 */
> +/*
> + * Domain [-0.002708, 0.002708], range ~[-5.7136e-24, 5.7110e-24]:
> + * |exp(x) - p(x)| < 2**-77.2
> + * (0.002708 is ln2/(2*INTERVALS) rounded up a little).
> + */
> +A2 = 0.5,
> +A3 = 1.6666666666666119e-1, /* 0x15555555555490.0p-55 */
> +A4 = 4.1666666666665887e-2, /* 0x155555555554e5.0p-57 */
> +A5 = 8.3333354987869413e-3, /* 0x1111115b789919.0p-59 */
> +A6 = 1.3888891738560272e-3; /* 0x16c16c651633ae.0p-62 */
> +
> +/*
> + * 2^(i/INTERVALS) for i in [0,INTERVALS] is represented by two values where
> + * the first 53 bits of the significand are stored in hi and the next 53
> + * bits are in lo. Tang's paper states that the trailing 6 bits of hi must
> + * be zero for his algorithm in both single and double precision, because
> + * the table is re-used in the implementation of expm1() where a floating
> + * point addition involving hi must be exact. Here hi is double, so
> + * converting it to long double gives 11 trailing zero bits.
> + */
> +static const struct {
> + double hi;
> + double lo;
> +} tbl[INTERVALS] = {
> + { 0x1p+0, 0x0p+0 },
> + /*
> + * XXX hi is rounded down, and the formatting is not quite normal.
> + * But I rather like both. The 0x1.*p format is good for 4N+1
> + * mantissa bits. Rounding down makes the lo terms positive,
> + * so that the columnar formatting can be simpler.
> + */
> + { 0x1.0163da9fb3335p+0, 0x1.b61299ab8cdb7p-54 },
> + { 0x1.02c9a3e778060p+0, 0x1.dcdef95949ef4p-53 },
> + { 0x1.04315e86e7f84p+0, 0x1.7ae71f3441b49p-53 },
> + { 0x1.059b0d3158574p+0, 0x1.d73e2a475b465p-55 },
> + { 0x1.0706b29ddf6ddp+0, 0x1.8db880753b0f6p-53 },
> + { 0x1.0874518759bc8p+0, 0x1.186be4bb284ffp-57 },
> + { 0x1.09e3ecac6f383p+0, 0x1.1487818316136p-54 },
> + { 0x1.0b5586cf9890fp+0, 0x1.8a62e4adc610bp-54 },
> + { 0x1.0cc922b7247f7p+0, 0x1.01edc16e24f71p-54 },
> + { 0x1.0e3ec32d3d1a2p+0, 0x1.03a1727c57b53p-59 },
> + { 0x1.0fb66affed31ap+0, 0x1.e464123bb1428p-53 },
> + { 0x1.11301d0125b50p+0, 0x1.49d77e35db263p-53 },
> + { 0x1.12abdc06c31cbp+0, 0x1.f72575a649ad2p-53 },
> + { 0x1.1429aaea92ddfp+0, 0x1.66820328764b1p-53 },
> + { 0x1.15a98c8a58e51p+0, 0x1.2406ab9eeab0ap-55 },
> + { 0x1.172b83c7d517ap+0, 0x1.b9bef918a1d63p-53 },
> + { 0x1.18af9388c8de9p+0, 0x1.777ee1734784ap-53 },
> + { 0x1.1a35beb6fcb75p+0, 0x1.e5b4c7b4968e4p-55 },
> + { 0x1.1bbe084045cd3p+0, 0x1.3563ce56884fcp-53 },
> + { 0x1.1d4873168b9aap+0, 0x1.e016e00a2643cp-54 },
> + { 0x1.1ed5022fcd91cp+0, 0x1.71033fec2243ap-53 },
> + { 0x1.2063b88628cd6p+0, 0x1.dc775814a8495p-55 },
> + { 0x1.21f49917ddc96p+0, 0x1.2a97e9494a5eep-55 },
> + { 0x1.2387a6e756238p+0, 0x1.9b07eb6c70573p-54 },
> + { 0x1.251ce4fb2a63fp+0, 0x1.ac155bef4f4a4p-55 },
> + { 0x1.26b4565e27cddp+0, 0x1.2bd339940e9d9p-55 },
> + { 0x1.284dfe1f56380p+0, 0x1.2d9e2b9e07941p-53 },
> + { 0x1.29e9df51fdee1p+0, 0x1.612e8afad1255p-55 },
> + { 0x1.2b87fd0dad98fp+0, 0x1.fbbd48ca71f95p-53 },
> + { 0x1.2d285a6e4030bp+0, 0x1.0024754db41d5p-54 },
> + { 0x1.2ecafa93e2f56p+0, 0x1.1ca0f45d52383p-56 },
> + { 0x1.306fe0a31b715p+0, 0x1.6f46ad23182e4p-55 },
> + { 0x1.32170fc4cd831p+0, 0x1.a9ce78e18047cp-55 },
> + { 0x1.33c08b26416ffp+0, 0x1.32721843659a6p-54 },
> + { 0x1.356c55f929ff0p+0, 0x1.928c468ec6e76p-53 },
> + { 0x1.371a7373aa9cap+0, 0x1.4e28aa05e8a8fp-53 },
> + { 0x1.38cae6d05d865p+0, 0x1.0b53961b37da2p-53 },
> + { 0x1.3a7db34e59ff6p+0, 0x1.d43792533c144p-53 },
> + { 0x1.3c32dc313a8e4p+0, 0x1.08003e4516b1ep-53 },
> + { 0x1.3dea64c123422p+0, 0x1.ada0911f09ebcp-55 },
> + { 0x1.3fa4504ac801bp+0, 0x1.417ee03548306p-53 },
> + { 0x1.4160a21f72e29p+0, 0x1.f0864b71e7b6cp-53 },
> + { 0x1.431f5d950a896p+0, 0x1.b8e088728219ap-53 },
> + { 0x1.44e086061892dp+0, 0x1.89b7a04ef80d0p-59 },
> + { 0x1.46a41ed1d0057p+0, 0x1.c944bd1648a76p-54 },
> + { 0x1.486a2b5c13cd0p+0, 0x1.3c1a3b69062f0p-56 },
> + { 0x1.4a32af0d7d3dep+0, 0x1.9cb62f3d1be56p-54 },
> + { 0x1.4bfdad5362a27p+0, 0x1.d4397afec42e2p-56 },
> + { 0x1.4dcb299fddd0dp+0, 0x1.8ecdbbc6a7833p-54 },
> + { 0x1.4f9b2769d2ca6p+0, 0x1.5a67b16d3540ep-53 },
> + { 0x1.516daa2cf6641p+0, 0x1.8225ea5909b04p-53 },
> + { 0x1.5342b569d4f81p+0, 0x1.be1507893b0d5p-53 },
> + { 0x1.551a4ca5d920ep+0, 0x1.8a5d8c4048699p-53 },
> + { 0x1.56f4736b527dap+0, 0x1.9bb2c011d93adp-54 },
> + { 0x1.58d12d497c7fdp+0, 0x1.295e15b9a1de8p-55 },
> + { 0x1.5ab07dd485429p+0, 0x1.6324c054647adp-54 },
> + { 0x1.5c9268a5946b7p+0, 0x1.c4b1b816986a2p-60 },
> + { 0x1.5e76f15ad2148p+0, 0x1.ba6f93080e65ep-54 },
> + { 0x1.605e1b976dc08p+0, 0x1.60edeb25490dcp-53 },
> + { 0x1.6247eb03a5584p+0, 0x1.63e1f40dfa5b5p-53 },
> + { 0x1.6434634ccc31fp+0, 0x1.8edf0e2989db3p-53 },
> + { 0x1.6623882552224p+0, 0x1.224fb3c5371e6p-53 },
> + { 0x1.68155d44ca973p+0, 0x1.038ae44f73e65p-57 },
> + { 0x1.6a09e667f3bccp+0, 0x1.21165f626cdd5p-53 },
> + { 0x1.6c012750bdabep+0, 0x1.daed533001e9ep-53 },
> + { 0x1.6dfb23c651a2ep+0, 0x1.e441c597c3775p-53 },
> + { 0x1.6ff7df9519483p+0, 0x1.9f0fc369e7c42p-53 },
> + { 0x1.71f75e8ec5f73p+0, 0x1.ba46e1e5de15ap-53 },
> + { 0x1.73f9a48a58173p+0, 0x1.7ab9349cd1562p-53 },
> + { 0x1.75feb564267c8p+0, 0x1.7edd354674916p-53 },
> + { 0x1.780694fde5d3fp+0, 0x1.866b80a02162dp-54 },
> + { 0x1.7a11473eb0186p+0, 0x1.afaa2047ed9b4p-53 },
> + { 0x1.7c1ed0130c132p+0, 0x1.f124cd1164dd6p-54 },
> + { 0x1.7e2f336cf4e62p+0, 0x1.05d02ba15797ep-56 },
> + { 0x1.80427543e1a11p+0, 0x1.6c1bccec9346bp-53 },
> + { 0x1.82589994cce12p+0, 0x1.159f115f56694p-53 },
> + { 0x1.8471a4623c7acp+0, 0x1.9ca5ed72f8c81p-53 },
> + { 0x1.868d99b4492ecp+0, 0x1.01c83b21584a3p-53 },
> + { 0x1.88ac7d98a6699p+0, 0x1.994c2f37cb53ap-54 },
> + { 0x1.8ace5422aa0dbp+0, 0x1.6e9f156864b27p-54 },
> + { 0x1.8cf3216b5448bp+0, 0x1.de55439a2c38bp-53 },
> + { 0x1.8f1ae99157736p+0, 0x1.5cc13a2e3976cp-55 },
> + { 0x1.9145b0b91ffc5p+0, 0x1.114c368d3ed6ep-53 },
> + { 0x1.93737b0cdc5e4p+0, 0x1.e8a0387e4a814p-53 },
> + { 0x1.95a44cbc8520ep+0, 0x1.d36906d2b41f9p-53 },
> + { 0x1.97d829fde4e4fp+0, 0x1.173d241f23d18p-53 },
> + { 0x1.9a0f170ca07b9p+0, 0x1.7462137188ce7p-53 },
> + { 0x1.9c49182a3f090p+0, 0x1.c7c46b071f2bep-56 },
> + { 0x1.9e86319e32323p+0, 0x1.824ca78e64c6ep-56 },
> + { 0x1.a0c667b5de564p+0, 0x1.6535b51719567p-53 },
> + { 0x1.a309bec4a2d33p+0, 0x1.6305c7ddc36abp-54 },
> + { 0x1.a5503b23e255cp+0, 0x1.1684892395f0fp-53 },
> + { 0x1.a799e1330b358p+0, 0x1.bcb7ecac563c7p-54 },
> + { 0x1.a9e6b5579fdbfp+0, 0x1.0fac90ef7fd31p-54 },
> + { 0x1.ac36bbfd3f379p+0, 0x1.81b72cd4624ccp-53 },
> + { 0x1.ae89f995ad3adp+0, 0x1.7a1cd345dcc81p-54 },
> + { 0x1.b0e07298db665p+0, 0x1.2108559bf8deep-53 },
> + { 0x1.b33a2b84f15fap+0, 0x1.ed7fa1cf7b290p-53 },
> + { 0x1.b59728de55939p+0, 0x1.1c7102222c90ep-53 },
> + { 0x1.b7f76f2fb5e46p+0, 0x1.d54f610356a79p-53 },
> + { 0x1.ba5b030a10649p+0, 0x1.0819678d5eb69p-53 },
> + { 0x1.bcc1e904bc1d2p+0, 0x1.23dd07a2d9e84p-55 },
> + { 0x1.bf2c25bd71e08p+0, 0x1.0811ae04a31c7p-53 },
> + { 0x1.c199bdd85529cp+0, 0x1.11065895048ddp-55 },
> + { 0x1.c40ab5fffd07ap+0, 0x1.b4537e083c60ap-54 },
> + { 0x1.c67f12e57d14bp+0, 0x1.2884dff483cadp-54 },
> + { 0x1.c8f6d9406e7b5p+0, 0x1.1acbc48805c44p-56 },
> + { 0x1.cb720dcef9069p+0, 0x1.503cbd1e949dbp-56 },
> + { 0x1.cdf0b555dc3f9p+0, 0x1.889f12b1f58a3p-53 },
> + { 0x1.d072d4a07897bp+0, 0x1.1a1e45e4342b2p-53 },
> + { 0x1.d2f87080d89f1p+0, 0x1.15bc247313d44p-53 },
> + { 0x1.d5818dcfba487p+0, 0x1.2ed02d75b3707p-55 },
> + { 0x1.d80e316c98397p+0, 0x1.7709f3a09100cp-53 },
> + { 0x1.da9e603db3285p+0, 0x1.c2300696db532p-54 },
> + { 0x1.dd321f301b460p+0, 0x1.2da5778f018c3p-54 },
> + { 0x1.dfc97337b9b5ep+0, 0x1.72d195873da52p-53 },
> + { 0x1.e264614f5a128p+0, 0x1.424ec3f42f5b5p-53 },
> + { 0x1.e502ee78b3ff6p+0, 0x1.39e8980a9cc8fp-55 },
> + { 0x1.e7a51fbc74c83p+0, 0x1.2d522ca0c8de2p-54 },
> + { 0x1.ea4afa2a490d9p+0, 0x1.0b1ee7431ebb6p-53 },
> + { 0x1.ecf482d8e67f0p+0, 0x1.1b60625f7293ap-53 },
> + { 0x1.efa1bee615a27p+0, 0x1.dc7f486a4b6b0p-54 },
> + { 0x1.f252b376bba97p+0, 0x1.3a1a5bf0d8e43p-54 },
> + { 0x1.f50765b6e4540p+0, 0x1.9d3e12dd8a18bp-54 },
> + { 0x1.f7bfdad9cbe13p+0, 0x1.1227697fce57bp-53 },
> + { 0x1.fa7c1819e90d8p+0, 0x1.74853f3a5931ep-55 },
> + { 0x1.fd3c22b8f71f1p+0, 0x1.2eb74966579e7p-57 }
> +};
> +
> +/*
> + * Kernel for expl(x). x must be finite and not tiny or huge.
> + * "tiny" is anything that would make us underflow (|A6*x^6| < ~LDBL_MIN).
> + * "huge" is anything that would make fn*L1 inexact (|x| > ~2**17*ln2).
> + */
> +static inline void
> +__k_expl(long double x, long double *hip, long double *lop, int *kp)
> +{
> + long double fn, q, r, r1, r2, t, z;
> + int n, n2;
> +
> + /* Reduce x to (k*ln2 + endpoint[n2] + r1 + r2). */
> + fn = rnintl(x * INV_L);
> + r = x - fn * L1 - fn * L2; /* r = r1 + r2 done independently. */
> + n = irint(fn);
> + n2 = (unsigned)n % INTERVALS;
> + /* Depend on the sign bit being propagated: */
> + *kp = n >> LOG2_INTERVALS;
> + r1 = x - fn * L1;
> + r2 = fn * -L2;
> +
> + /* Evaluate expl(endpoint[n2] + r1 + r2) = tbl[n2] * expl(r1 + r2). */
> + z = r * r;
> +#if 0
> + q = r2 + z * (A2 + r * A3) + z * z * (A4 + r * A5) + z * z * z * A6;
> +#else
> + q = r2 + z * A2 + z * r * (A3 + r * A4 + z * (A5 + r * A6));
> +#endif
> + t = (long double)tbl[n2].lo + tbl[n2].hi;
> + *hip = tbl[n2].hi;
> + *lop = tbl[n2].lo + t * (q + r1);
> +}
> +
> +static inline void
> +k_hexpl(long double x, long double *hip, long double *lop)
> +{
> + float twopkm1;
> + int k;
> +
> + __k_expl(x, hip, lop, &k);
> + SET_FLOAT_WORD(twopkm1, 0x3f800000 + ((k - 1) << 23));
> + *hip *= twopkm1;
> + *lop *= twopkm1;
> +}
> +
> +static inline long double
> +hexpl(long double x)
> +{
> + long double hi, lo, twopkm2;
> + int k;
> +
> + twopkm2 = 1;
> + __k_expl(x, &hi, &lo, &k);
> + SET_LDBL_EXPSIGN(twopkm2, BIAS + k - 2);
> + return (lo + hi) * 2 * twopkm2;
> +}
> +
> +#ifdef _COMPLEX_H
> +/*
> + * See ../src/k_exp.c for details.
> + */
> +static inline long double complex
> +__ldexp_cexpl(long double complex z, int expt)
> +{
> + long double c, exp_x, hi, lo, s;
> + long double x, y, scale1, scale2;
> + int half_expt, k;
> +
> + x = creall(z);
> + y = cimagl(z);
> + __k_expl(x, &hi, &lo, &k);
> +
> + exp_x = (lo + hi) * 0x1p16382L;
> + expt += k - 16382;
> +
> + scale1 = 1;
> + half_expt = expt / 2;
> + SET_LDBL_EXPSIGN(scale1, BIAS + half_expt);
> + scale2 = 1;
> + SET_LDBL_EXPSIGN(scale2, BIAS + expt - half_expt);
> +
> + sincosl(y, &s, &c);
> + return (CMPLXL(c * exp_x * scale1 * scale2,
> + s * exp_x * scale1 * scale2));
> +}
> +#endif /* _COMPLEX_H */
> diff --git a/newlib/libm/ld80/k_sinl.c b/newlib/libm/ld80/k_sinl.c
> new file mode 100644
> index 000000000..af5598dba
> --- /dev/null
> +++ b/newlib/libm/ld80/k_sinl.c
> @@ -0,0 +1,62 @@
> +/* From: @(#)k_sin.c 1.3 95/01/18 */
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + * Copyright (c) 2008 Steven G. Kargl, David Schultz, Bruce D. Evans.
> + *
> + * Developed at SunSoft, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * ld80 version of k_sin.c. See ../src/k_sin.c for most comments.
> + */
> +
> +#include "math_private.h"
> +
> +static const double
> +half = 0.5;
> +
> +/*
> + * Domain [-0.7854, 0.7854], range ~[-1.89e-22, 1.915e-22]
> + * |sin(x)/x - s(x)| < 2**-72.1
> + *
> + * See ../ld80/k_cosl.c for more details about the polynomial.
> + */
> +#if defined(__amd64__) || defined(__i386__)
> +/* Long double constants are slow on these arches, and broken on i386. */
> +static const volatile double
> +S1hi = -0.16666666666666666, /* -0x15555555555555.0p-55 */
> +S1lo = -9.2563760475949941e-18; /* -0x15580000000000.0p-109 */
> +#define S1 ((long double)S1hi + S1lo)
> +#else
> +static const long double
> +S1 = -0.166666666666666666671L; /* -0xaaaaaaaaaaaaaaab.0p-66 */
> +#endif
> +
> +static const double
> +S2 = 0.0083333333333333332, /* 0x11111111111111.0p-59 */
> +S3 = -0.00019841269841269427, /* -0x1a01a01a019f81.0p-65 */
> +S4 = 0.0000027557319223597490, /* 0x171de3a55560f7.0p-71 */
> +S5 = -0.000000025052108218074604, /* -0x1ae64564f16cad.0p-78 */
> +S6 = 1.6059006598854211e-10, /* 0x161242b90243b5.0p-85 */
> +S7 = -7.6429779983024564e-13, /* -0x1ae42ebd1b2e00.0p-93 */
> +S8 = 2.6174587166648325e-15; /* 0x179372ea0b3f64.0p-101 */
> +
> +long double
> +__kernel_sinl(long double x, long double y, int iy)
> +{
> + long double z,r,v;
> +
> + z = x*x;
> + v = z*x;
> + r = S2+z*(S3+z*(S4+z*(S5+z*(S6+z*(S7+z*S8)))));
> + if(iy==0) return x+v*(S1+z*r);
> + else return x-((z*(half*y-v*r)-y)-v*S1);
> +}
> diff --git a/newlib/libm/ld80/k_sinpil.h b/newlib/libm/ld80/k_sinpil.h
> new file mode 100644
> index 000000000..00241b932
> --- /dev/null
> +++ b/newlib/libm/ld80/k_sinpil.h
> @@ -0,0 +1,42 @@
> +/*-
> + * Copyright (c) 2017 Steven G. Kargl
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice unmodified, this list of conditions, and the following
> + * disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
> + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
> + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
> + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
> + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
> + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
> + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +/*
> + * See ../src/k_sinpi.c for implementation details.
> + */
> +
> +static inline long double
> +__kernel_sinpil(long double x)
> +{
> + long double hi, lo;
> +
> + hi = (float)x;
> + lo = x - hi;
> + lo = lo * (pi_lo + pi_hi) + hi * pi_lo;
> + hi *= pi_hi;
> + _2sumF(hi, lo);
> + return (__kernel_sinl(hi, lo, 1));
> +}
> diff --git a/newlib/libm/ld80/s_cospil.c b/newlib/libm/ld80/s_cospil.c
> new file mode 100644
> index 000000000..199479e9e
> --- /dev/null
> +++ b/newlib/libm/ld80/s_cospil.c
> @@ -0,0 +1,129 @@
> +/*-
> + * Copyright (c) 2017 Steven G. Kargl
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice unmodified, this list of conditions, and the following
> + * disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
> + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
> + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
> + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
> + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
> + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
> + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +/*
> + * See ../src/s_cospi.c for implementation details.
> + */
> +
> +#ifdef __i386__
> +#include <ieeefp.h>
> +#endif
> +#include <stdint.h>
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +
> +static const double
> +pi_hi = 3.1415926814079285e+00, /* 0x400921fb 0x58000000 */
> +pi_lo =-2.7818135228334233e-08; /* 0xbe5dde97 0x3dcb3b3a */
> +
> +#include "k_cospil.h"
> +#include "k_sinpil.h"
> +
> +volatile static const double vzero = 0;
> +
> +long double
> +cospil(long double x)
> +{
> + long double ax, c;
> + uint64_t lx, m;
> + uint32_t j0;
> + uint16_t hx, ix;
> +
> + EXTRACT_LDBL80_WORDS(hx, lx, x);
> + ix = hx & 0x7fff;
> + INSERT_LDBL80_WORDS(ax, ix, lx);
> +
> + ENTERI();
> +
> + if (ix < 0x3fff) { /* |x| < 1 */
> + if (ix < 0x3ffd) { /* |x| < 0.25 */
> + if (ix < 0x3fdd) { /* |x| < 0x1p-34 */
> + if ((int)x == 0)
> + RETURNI(1);
> + }
> + RETURNI(__kernel_cospil(ax));
> + }
> +
> + if (ix < 0x3ffe) /* |x| < 0.5 */
> + c = __kernel_sinpil(0.5 - ax);
> + else if (lx < 0xc000000000000000ull) { /* |x| < 0.75 */
> + if (ax == 0.5)
> + RETURNI(0);
> + c = -__kernel_sinpil(ax - 0.5);
> + } else
> + c = -__kernel_cospil(1 - ax);
> + RETURNI(c);
> + }
> +
> + if (ix < 0x403e) { /* 1 <= |x| < 0x1p63 */
> + /* Determine integer part of ax. */
> + j0 = ix - 0x3fff + 1;
> + if (j0 < 32) {
> + lx = (lx >> 32) << 32;
> + lx &= ~(((lx << 32)-1) >> j0);
> + } else {
> + m = (uint64_t)-1 >> (j0 + 1);
> + if (lx & m) lx &= ~m;
> + }
> + INSERT_LDBL80_WORDS(x, ix, lx);
> +
> + ax -= x;
> + EXTRACT_LDBL80_WORDS(ix, lx, ax);
> +
> + if (ix < 0x3ffe) { /* |x| < 0.5 */
> + if (ix < 0x3ffd) /* |x| < 0.25 */
> + c = ix == 0 ? 1 : __kernel_cospil(ax);
> + else
> + c = __kernel_sinpil(0.5 - ax);
> +
> + } else {
> + if (lx < 0xc000000000000000ull) { /* |x| < 0.75 */
> + if (ax == 0.5)
> + RETURNI(0);
> + c = -__kernel_sinpil(ax - 0.5);
> + } else
> + c = -__kernel_cospil(1 - ax);
> + }
> +
> + if (j0 > 40)
> + x -= 0x1p40;
> + if (j0 > 30)
> + x -= 0x1p30;
> + j0 = (uint32_t)x;
> +
> + RETURNI(j0 & 1 ? -c : c);
> + }
> +
> + if (ix >= 0x7fff)
> + RETURNI(vzero / vzero);
> +
> + /*
> + * |x| >= 0x1p63 is always an even integer, so return 1.
> + */
> + RETURNI(1);
> +}
> diff --git a/newlib/libm/ld80/s_erfl.c b/newlib/libm/ld80/s_erfl.c
> new file mode 100644
> index 000000000..1ae2f9092
> --- /dev/null
> +++ b/newlib/libm/ld80/s_erfl.c
> @@ -0,0 +1,337 @@
> +/* @(#)s_erf.c 5.1 93/09/24 */
> +/*
> + * ====================================================
> + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> + *
> + * Developed at SunPro, a Sun Microsystems, Inc. business.
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/*
> + * See s_erf.c for complete comments.
> + *
> + * Converted to long double by Steven G. Kargl.
> + */
> +#include <float.h>
> +#ifdef __i386__
> +#include <ieeefp.h>
> +#endif
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +
> +/* XXX Prevent compilers from erroneously constant folding: */
> +static const volatile long double tiny = 0x1p-10000L;
> +
> +static const double
> +half= 0.5,
> +one = 1,
> +two = 2;
> +/*
> + * In the domain [0, 2**-34], only the first term in the power series
> + * expansion of erf(x) is used. The magnitude of the first neglected
> + * terms is less than 2**-102.
> + */
> +static const union IEEEl2bits
> +efxu = LD80C(0x8375d410a6db446c, -3, 1.28379167095512573902e-1L),
> +efx8u = LD80C(0x8375d410a6db446c, 0, 1.02703333676410059122e+0L),
> +/*
> + * Domain [0, 0.84375], range ~[-1.423e-22, 1.423e-22]:
> + * |(erf(x) - x)/x - pp(x)/qq(x)| < 2**-72.573
> + */
> +pp0u = LD80C(0x8375d410a6db446c, -3, 1.28379167095512573902e-1L),
> +pp1u = LD80C(0xa46c7d09ec3d0cec, -2, -3.21140201054840180596e-1L),
> +pp2u = LD80C(0x9b31e66325576f86, -5, -3.78893851760347812082e-2L),
> +pp3u = LD80C(0x804ac72c9a0b97dd, -7, -7.83032847030604679616e-3L),
> +pp4u = LD80C(0x9f42bcbc3d5a601d, -12, -3.03765663857082048459e-4L),
> +pp5u = LD80C(0x9ec4ad6193470693, -16, -1.89266527398167917502e-5L),
> +qq1u = LD80C(0xdb4b8eb713188d6b, -2, 4.28310832832310510579e-1L),
> +qq2u = LD80C(0xa5750835b2459bd1, -4, 8.07896272074540216658e-2L),
> +qq3u = LD80C(0x8b85d6bd6a90b51c, -7, 8.51579638189385354266e-3L),
> +qq4u = LD80C(0x87332f82cff4ff96, -11, 5.15746855583604912827e-4L),
> +qq5u = LD80C(0x83466cb6bf9dca00, -16, 1.56492109706256700009e-5L),
> +qq6u = LD80C(0xf5bf98c2f996bf63, -24, 1.14435527803073879724e-7L);
> +#define efx (efxu.e)
> +#define efx8 (efx8u.e)
> +#define pp0 (pp0u.e)
> +#define pp1 (pp1u.e)
> +#define pp2 (pp2u.e)
> +#define pp3 (pp3u.e)
> +#define pp4 (pp4u.e)
> +#define pp5 (pp5u.e)
> +#define qq1 (qq1u.e)
> +#define qq2 (qq2u.e)
> +#define qq3 (qq3u.e)
> +#define qq4 (qq4u.e)
> +#define qq5 (qq5u.e)
> +#define qq6 (qq6u.e)
> +static const union IEEEl2bits
> +erxu = LD80C(0xd7bb3d0000000000, -1, 8.42700779438018798828e-1L),
> +/*
> + * Domain [0.84375, 1.25], range ~[-8.132e-22, 8.113e-22]:
> + * |(erf(x) - erx) - pa(x)/qa(x)| < 2**-71.762
> + */
> +pa0u = LD80C(0xe8211158da02c692, -27, 1.35116960705131296711e-8L),
> +pa1u = LD80C(0xd488f89f36988618, -2, 4.15107507167065612570e-1L),
> +pa2u = LD80C(0xece74f8c63fa3942, -4, -1.15675565215949226989e-1L),
> +pa3u = LD80C(0xc8d31e020727c006, -4, 9.80589241379624665791e-2L),
> +pa4u = LD80C(0x985d5d5fafb0551f, -5, 3.71984145558422368847e-2L),
> +pa5u = LD80C(0xa5b6c4854d2f5452, -8, -5.05718799340957673661e-3L),
> +pa6u = LD80C(0x85c8d58fe3993a47, -8, 4.08277919612202243721e-3L),
> +pa7u = LD80C(0xddbfbc23677b35cf, -13, 2.11476292145347530794e-4L),
> +qa1u = LD80C(0xb8a977896f5eff3f, -1, 7.21335860303380361298e-1L),
> +qa2u = LD80C(0x9fcd662c3d4eac86, -1, 6.24227891731886593333e-1L),
> +qa3u = LD80C(0x9d0b618eac67ba07, -2, 3.06727455774491855801e-1L),
> +qa4u = LD80C(0x881a4293f6d6c92d, -3, 1.32912674218195890535e-1L),
> +qa5u = LD80C(0xbab144f07dea45bf, -5, 4.55792134233613027584e-2L),
> +qa6u = LD80C(0xa6c34ba438bdc900, -7, 1.01783980070527682680e-2L),
> +qa7u = LD80C(0x8fa866dc20717a91, -9, 2.19204436518951438183e-3L);
> +#define erx (erxu.e)
> +#define pa0 (pa0u.e)
> +#define pa1 (pa1u.e)
> +#define pa2 (pa2u.e)
> +#define pa3 (pa3u.e)
> +#define pa4 (pa4u.e)
> +#define pa5 (pa5u.e)
> +#define pa6 (pa6u.e)
> +#define pa7 (pa7u.e)
> +#define qa1 (qa1u.e)
> +#define qa2 (qa2u.e)
> +#define qa3 (qa3u.e)
> +#define qa4 (qa4u.e)
> +#define qa5 (qa5u.e)
> +#define qa6 (qa6u.e)
> +#define qa7 (qa7u.e)
> +static const union IEEEl2bits
> +/*
> + * Domain [1.25,2.85715], range ~[-2.334e-22,2.334e-22]:
> + * |log(x*erfc(x)) + x**2 + 0.5625 - ra(x)/sa(x)| < 2**-71.860
> + */
> +ra0u = LD80C(0xa1a091e0fb4f335a, -7, -9.86494298915814308249e-3L),
> +ra1u = LD80C(0xc2b0d045ae37df6b, -1, -7.60510460864878271275e-1L),
> +ra2u = LD80C(0xf2cec3ee7da636c5, 3, -1.51754798236892278250e+1L),
> +ra3u = LD80C(0x813cc205395adc7d, 7, -1.29237335516455333420e+2L),
> +ra4u = LD80C(0x8737c8b7b4062c2f, 9, -5.40871625829510494776e+2L),
> +ra5u = LD80C(0x8ffe5383c08d4943, 10, -1.15194769466026108551e+3L),
> +ra6u = LD80C(0x983573e64d5015a9, 10, -1.21767039790249025544e+3L),
> +ra7u = LD80C(0x92a794e763a6d4db, 9, -5.86618463370624636688e+2L),
> +ra8u = LD80C(0xd5ad1fae77c3d9a3, 6, -1.06838132335777049840e+2L),
> +ra9u = LD80C(0x934c1a247807bb9c, 2, -4.60303980944467334806e+0L),
> +sa1u = LD80C(0xd342f90012bb1189, 4, 2.64077014928547064865e+1L),
> +sa2u = LD80C(0x839be13d9d5da883, 8, 2.63217811300123973067e+2L),
> +sa3u = LD80C(0x9f8cba6d1ae1b24b, 10, 1.27639775710344617587e+3L),
> +sa4u = LD80C(0xcaa83f403713e33e, 11, 3.24251544209971162003e+3L),
> +sa5u = LD80C(0x8796aff2f3c47968, 12, 4.33883591261332837874e+3L),
> +sa6u = LD80C(0xb6ef97f9c753157b, 11, 2.92697460344182158454e+3L),
> +sa7u = LD80C(0xe02aee5f83773d1c, 9, 8.96670799139389559818e+2L),
> +sa8u = LD80C(0xc82b83855b88e07e, 6, 1.00084987800048510018e+2L),
> +sa9u = LD80C(0x92f030aefadf28ad, 1, 2.29591004455459083843e+0L);
> +#define ra0 (ra0u.e)
> +#define ra1 (ra1u.e)
> +#define ra2 (ra2u.e)
> +#define ra3 (ra3u.e)
> +#define ra4 (ra4u.e)
> +#define ra5 (ra5u.e)
> +#define ra6 (ra6u.e)
> +#define ra7 (ra7u.e)
> +#define ra8 (ra8u.e)
> +#define ra9 (ra9u.e)
> +#define sa1 (sa1u.e)
> +#define sa2 (sa2u.e)
> +#define sa3 (sa3u.e)
> +#define sa4 (sa4u.e)
> +#define sa5 (sa5u.e)
> +#define sa6 (sa6u.e)
> +#define sa7 (sa7u.e)
> +#define sa8 (sa8u.e)
> +#define sa9 (sa9u.e)
> +/*
> + * Domain [2.85715,7], range ~[-8.323e-22,8.390e-22]:
> + * |log(x*erfc(x)) + x**2 + 0.5625 - rb(x)/sb(x)| < 2**-70.326
> + */
> +static const union IEEEl2bits
> +rb0u = LD80C(0xa1a091cf43abcd26, -7, -9.86494292470284646962e-3L),
> +rb1u = LD80C(0xd19d2df1cbb8da0a, -1, -8.18804618389296662837e-1L),
> +rb2u = LD80C(0x9a4dd1383e5daf5b, 4, -1.92879967111618594779e+1L),
> +rb3u = LD80C(0xbff0ae9fc0751de6, 7, -1.91940164551245394969e+2L),
> +rb4u = LD80C(0xdde08465310b472b, 9, -8.87508080766577324539e+2L),
> +rb5u = LD80C(0xe796e1d38c8c70a9, 10, -1.85271506669474503781e+3L),
> +rb6u = LD80C(0xbaf655a76e0ab3b5, 10, -1.49569795581333675349e+3L),
> +rb7u = LD80C(0x95d21e3e75503c21, 8, -2.99641547972948019157e+2L),
> +sb1u = LD80C(0x814487ed823c8cbd, 5, 3.23169247732868256569e+1L),
> +sb2u = LD80C(0xbe4bfbb1301304be, 8, 3.80593618534539961773e+2L),
> +sb3u = LD80C(0x809c4ade46b927c7, 11, 2.05776827838541292848e+3L),
> +sb4u = LD80C(0xa55284359f3395a8, 12, 5.29031455540062116327e+3L),
> +sb5u = LD80C(0xbcfa72da9b820874, 12, 6.04730608102312640462e+3L),
> +sb6u = LD80C(0x9d09a35988934631, 11, 2.51260238030767176221e+3L),
> +sb7u = LD80C(0xd675bbe542c159fa, 7, 2.14459898308561015684e+2L);
> +#define rb0 (rb0u.e)
> +#define rb1 (rb1u.e)
> +#define rb2 (rb2u.e)
> +#define rb3 (rb3u.e)
> +#define rb4 (rb4u.e)
> +#define rb5 (rb5u.e)
> +#define rb6 (rb6u.e)
> +#define rb7 (rb7u.e)
> +#define sb1 (sb1u.e)
> +#define sb2 (sb2u.e)
> +#define sb3 (sb3u.e)
> +#define sb4 (sb4u.e)
> +#define sb5 (sb5u.e)
> +#define sb6 (sb6u.e)
> +#define sb7 (sb7u.e)
> +/*
> + * Domain [7,108], range ~[-4.422e-22,4.422e-22]:
> + * |log(x*erfc(x)) + x**2 + 0.5625 - rc(x)/sc(x)| < 2**-70.938
> + */
> +static const union IEEEl2bits
> +/* err = -4.422092275318925082e-22 -70.937689 */
> +rc0u = LD80C(0xa1a091cf437a17ad, -7, -9.86494292470008707260e-3L),
> +rc1u = LD80C(0xbe79c5a978122b00, -1, -7.44045595049165939261e-1L),
> +rc2u = LD80C(0xdb26f9bbe31a2794, 3, -1.36970155085888424425e+1L),
> +rc3u = LD80C(0xb5f69a38f5747ac8, 6, -9.09816453742625888546e+1L),
> +rc4u = LD80C(0xd79676d970d0a21a, 7, -2.15587750997584074147e+2L),
> +rc5u = LD80C(0xfe528153c45ec97c, 6, -1.27161142938347796666e+2L),
> +sc1u = LD80C(0xc5e8cd46d5604a96, 4, 2.47386727842204312937e+1L),
> +sc2u = LD80C(0xc5f0f5a5484520eb, 7, 1.97941248254913378865e+2L),
> +sc3u = LD80C(0x964e3c7b34db9170, 9, 6.01222441484087787522e+2L),
> +sc4u = LD80C(0x99be1b89faa0596a, 9, 6.14970430845978077827e+2L),
> +sc5u = LD80C(0xf80dfcbf37ffc5ea, 6, 1.24027318931184605891e+2L);
> +#define rc0 (rc0u.e)
> +#define rc1 (rc1u.e)
> +#define rc2 (rc2u.e)
> +#define rc3 (rc3u.e)
> +#define rc4 (rc4u.e)
> +#define rc5 (rc5u.e)
> +#define sc1 (sc1u.e)
> +#define sc2 (sc2u.e)
> +#define sc3 (sc3u.e)
> +#define sc4 (sc4u.e)
> +#define sc5 (sc5u.e)
> +
> +long double
> +erfl(long double x)
> +{
> + long double ax,R,S,P,Q,s,y,z,r;
> + uint64_t lx;
> + int32_t i;
> + uint16_t hx;
> +
> + EXTRACT_LDBL80_WORDS(hx, lx, x);
> +
> + if((hx & 0x7fff) == 0x7fff) { /* erfl(nan)=nan */
> + i = (hx>>15)<<1;
> + return (1-i)+one/x; /* erfl(+-inf)=+-1 */
> + }
> +
> + ENTERI();
> +
> + ax = fabsl(x);
> + if(ax < 0.84375) {
> + if(ax < 0x1p-34L) {
> + if(ax < 0x1p-16373L)
> + RETURNI((8*x+efx8*x)/8); /* avoid spurious underflow */
> + RETURNI(x + efx*x);
> + }
> + z = x*x;
> + r = pp0+z*(pp1+z*(pp2+z*(pp3+z*(pp4+z*pp5))));
> + s = one+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*(qq5+z*qq6)))));
> + y = r/s;
> + RETURNI(x + x*y);
> + }
> + if(ax < 1.25) {
> + s = ax-one;
> + P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*(pa6+s*pa7))))));
> + Q = one+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*(qa6+s*qa7))))));
> + if(x>=0) RETURNI(erx + P/Q); else RETURNI(-erx - P/Q);
> + }
> + if(ax >= 7) { /* inf>|x|>= 7 */
> + if(x>=0) RETURNI(one-tiny); else RETURNI(tiny-one);
> + }
> + s = one/(ax*ax);
> + if(ax < 2.85715) { /* |x| < 2.85715 */
> + R=ra0+s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*(ra5+s*(ra6+s*(ra7+
> + s*(ra8+s*ra9))))))));
> + S=one+s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*(sa5+s*(sa6+s*(sa7+
> + s*(sa8+s*sa9))))))));
> + } else { /* |x| >= 2.85715 */
> + R=rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*(rb5+s*(rb6+s*rb7))))));
> + S=one+s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*(sb5+s*(sb6+s*sb7))))));
> + }
> + z=(float)ax;
> + r=expl(-z*z-0.5625)*expl((z-ax)*(z+ax)+R/S);
> + if(x>=0) RETURNI(one-r/ax); else RETURNI(r/ax-one);
> +}
> +
> +long double
> +erfcl(long double x)
> +{
> + long double ax,R,S,P,Q,s,y,z,r;
> + uint64_t lx;
> + uint16_t hx;
> +
> + EXTRACT_LDBL80_WORDS(hx, lx, x);
> +
> + if((hx & 0x7fff) == 0x7fff) { /* erfcl(nan)=nan */
> + /* erfcl(+-inf)=0,2 */
> + return ((hx>>15)<<1)+one/x;
> + }
> +
> + ENTERI();
> +
> + ax = fabsl(x);
> + if(ax < 0.84375L) {
> + if(ax < 0x1p-34L)
> + RETURNI(one-x);
> + z = x*x;
> + r = pp0+z*(pp1+z*(pp2+z*(pp3+z*(pp4+z*pp5))));
> + s = one+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*(qq5+z*qq6)))));
> + y = r/s;
> + if(ax < 0.25L) { /* x<1/4 */
> + RETURNI(one-(x+x*y));
> + } else {
> + r = x*y;
> + r += (x-half);
> + RETURNI(half - r);
> + }
> + }
> + if(ax < 1.25L) {
> + s = ax-one;
> + P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*(pa6+s*pa7))))));
> + Q = one+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*(qa6+s*qa7))))));
> + if(x>=0) {
> + z = one-erx; RETURNI(z - P/Q);
> + } else {
> + z = (erx+P/Q); RETURNI(one+z);
> + }
> + }
> +
> + if(ax < 108) { /* |x| < 108 */
> + s = one/(ax*ax);
> + if(ax < 2.85715) { /* |x| < 2.85715 */
> + R=ra0+s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*(ra5+s*(ra6+s*(ra7+
> + s*(ra8+s*ra9))))))));
> + S=one+s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*(sa5+s*(sa6+s*(sa7+
> + s*(sa8+s*sa9))))))));
> + } else if(ax < 7) { /* | |x| < 7 */
> + R=rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*(rb5+s*(rb6+s*rb7))))));
> + S=one+s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*(sb5+s*(sb6+s*sb7))))));
> + } else {
> + if(x < -7) RETURNI(two-tiny);/* x < -7 */
> + R=rc0+s*(rc1+s*(rc2+s*(rc3+s*(rc4+s*rc5))));
> + S=one+s*(sc1+s*(sc2+s*(sc3+s*(sc4+s*sc5))));
> + }
> + z = (float)ax;
> + r = expl(-z*z-0.5625)*expl((z-ax)*(z+ax)+R/S);
> + if(x>0) RETURNI(r/ax); else RETURNI(two-r/ax);
> + } else {
> + if(x>0) RETURNI(tiny*tiny); else RETURNI(two-tiny);
> + }
> +}
> diff --git a/newlib/libm/ld80/s_exp2l.c b/newlib/libm/ld80/s_exp2l.c
> new file mode 100644
> index 000000000..421d6e2e0
> --- /dev/null
> +++ b/newlib/libm/ld80/s_exp2l.c
> @@ -0,0 +1,290 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2005-2008 David Schultz <das@FreeBSD.ORG>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include <float.h>
> +#include <stdint.h>
> +
> +#ifdef __i386__
> +#include <ieeefp.h>
> +#endif
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +
> +#define TBLBITS 7
> +#define TBLSIZE (1 << TBLBITS)
> +
> +#define BIAS (LDBL_MAX_EXP - 1)
> +
> +static volatile long double
> + huge = 0x1p10000L,
> + twom10000 = 0x1p-10000L;
> +
> +static const union IEEEl2bits
> +P1 = LD80C(0xb17217f7d1cf79ac, -1, 6.93147180559945309429e-1L);
> +
> +static const double
> +redux = 0x1.8p63 / TBLSIZE,
> +/*
> + * Domain [-0.00390625, 0.00390625], range ~[-1.7079e-23, 1.7079e-23]
> + * |exp(x) - p(x)| < 2**-75.6
> + */
> +P2 = 2.4022650695910072e-1, /* 0x1ebfbdff82c58f.0p-55 */
> +P3 = 5.5504108664816879e-2, /* 0x1c6b08d7049e1a.0p-57 */
> +P4 = 9.6181291055695180e-3, /* 0x13b2ab6fa8321a.0p-59 */
> +P5 = 1.3333563089183052e-3, /* 0x15d8806f67f251.0p-62 */
> +P6 = 1.5413361552277414e-4; /* 0x1433ddacff3441.0p-65 */
> +
> +static const double tbl[TBLSIZE * 2] = {
> + 0x1.6a09e667f3bcdp-1, -0x1.bdd3413b2648p-55,
> + 0x1.6c012750bdabfp-1, -0x1.2895667ff0cp-57,
> + 0x1.6dfb23c651a2fp-1, -0x1.bbe3a683c88p-58,
> + 0x1.6ff7df9519484p-1, -0x1.83c0f25860fp-56,
> + 0x1.71f75e8ec5f74p-1, -0x1.16e4786887bp-56,
> + 0x1.73f9a48a58174p-1, -0x1.0a8d96c65d5p-55,
> + 0x1.75feb564267c9p-1, -0x1.0245957316ep-55,
> + 0x1.780694fde5d3fp-1, 0x1.866b80a0216p-55,
> + 0x1.7a11473eb0187p-1, -0x1.41577ee0499p-56,
> + 0x1.7c1ed0130c132p-1, 0x1.f124cd1164ep-55,
> + 0x1.7e2f336cf4e62p-1, 0x1.05d02ba157ap-57,
> + 0x1.80427543e1a12p-1, -0x1.27c86626d97p-55,
> + 0x1.82589994cce13p-1, -0x1.d4c1dd41533p-55,
> + 0x1.8471a4623c7adp-1, -0x1.8d684a341cep-56,
> + 0x1.868d99b4492edp-1, -0x1.fc6f89bd4f68p-55,
> + 0x1.88ac7d98a6699p-1, 0x1.994c2f37cb5p-55,
> + 0x1.8ace5422aa0dbp-1, 0x1.6e9f156864bp-55,
> + 0x1.8cf3216b5448cp-1, -0x1.0d55e32e9e4p-57,
> + 0x1.8f1ae99157736p-1, 0x1.5cc13a2e397p-56,
> + 0x1.9145b0b91ffc6p-1, -0x1.dd6792e5825p-55,
> + 0x1.93737b0cdc5e5p-1, -0x1.75fc781b58p-58,
> + 0x1.95a44cbc8520fp-1, -0x1.64b7c96a5fp-57,
> + 0x1.97d829fde4e5p-1, -0x1.d185b7c1b86p-55,
> + 0x1.9a0f170ca07bap-1, -0x1.173bd91cee6p-55,
> + 0x1.9c49182a3f09p-1, 0x1.c7c46b071f2p-57,
> + 0x1.9e86319e32323p-1, 0x1.824ca78e64cp-57,
> + 0x1.a0c667b5de565p-1, -0x1.359495d1cd5p-55,
> + 0x1.a309bec4a2d33p-1, 0x1.6305c7ddc368p-55,
> + 0x1.a5503b23e255dp-1, -0x1.d2f6edb8d42p-55,
> + 0x1.a799e1330b358p-1, 0x1.bcb7ecac564p-55,
> + 0x1.a9e6b5579fdbfp-1, 0x1.0fac90ef7fdp-55,
> + 0x1.ac36bbfd3f37ap-1, -0x1.f9234cae76dp-56,
> + 0x1.ae89f995ad3adp-1, 0x1.7a1cd345dcc8p-55,
> + 0x1.b0e07298db666p-1, -0x1.bdef54c80e4p-55,
> + 0x1.b33a2b84f15fbp-1, -0x1.2805e3084d8p-58,
> + 0x1.b59728de5593ap-1, -0x1.c71dfbbba6ep-55,
> + 0x1.b7f76f2fb5e47p-1, -0x1.5584f7e54acp-57,
> + 0x1.ba5b030a1064ap-1, -0x1.efcd30e5429p-55,
> + 0x1.bcc1e904bc1d2p-1, 0x1.23dd07a2d9fp-56,
> + 0x1.bf2c25bd71e09p-1, -0x1.efdca3f6b9c8p-55,
> + 0x1.c199bdd85529cp-1, 0x1.11065895049p-56,
> + 0x1.c40ab5fffd07ap-1, 0x1.b4537e083c6p-55,
> + 0x1.c67f12e57d14bp-1, 0x1.2884dff483c8p-55,
> + 0x1.c8f6d9406e7b5p-1, 0x1.1acbc48805cp-57,
> + 0x1.cb720dcef9069p-1, 0x1.503cbd1e94ap-57,
> + 0x1.cdf0b555dc3fap-1, -0x1.dd83b53829dp-56,
> + 0x1.d072d4a07897cp-1, -0x1.cbc3743797a8p-55,
> + 0x1.d2f87080d89f2p-1, -0x1.d487b719d858p-55,
> + 0x1.d5818dcfba487p-1, 0x1.2ed02d75b37p-56,
> + 0x1.d80e316c98398p-1, -0x1.11ec18bedep-55,
> + 0x1.da9e603db3285p-1, 0x1.c2300696db5p-55,
> + 0x1.dd321f301b46p-1, 0x1.2da5778f019p-55,
> + 0x1.dfc97337b9b5fp-1, -0x1.1a5cd4f184b8p-55,
> + 0x1.e264614f5a129p-1, -0x1.7b627817a148p-55,
> + 0x1.e502ee78b3ff6p-1, 0x1.39e8980a9cdp-56,
> + 0x1.e7a51fbc74c83p-1, 0x1.2d522ca0c8ep-55,
> + 0x1.ea4afa2a490dap-1, -0x1.e9c23179c288p-55,
> + 0x1.ecf482d8e67f1p-1, -0x1.c93f3b411ad8p-55,
> + 0x1.efa1bee615a27p-1, 0x1.dc7f486a4b68p-55,
> + 0x1.f252b376bba97p-1, 0x1.3a1a5bf0d8e8p-55,
> + 0x1.f50765b6e454p-1, 0x1.9d3e12dd8a18p-55,
> + 0x1.f7bfdad9cbe14p-1, -0x1.dbb12d00635p-55,
> + 0x1.fa7c1819e90d8p-1, 0x1.74853f3a593p-56,
> + 0x1.fd3c22b8f71f1p-1, 0x1.2eb74966578p-58,
> + 0x1p+0, 0x0p+0,
> + 0x1.0163da9fb3335p+0, 0x1.b61299ab8cd8p-54,
> + 0x1.02c9a3e778061p+0, -0x1.19083535b08p-56,
> + 0x1.04315e86e7f85p+0, -0x1.0a31c1977c98p-54,
> + 0x1.059b0d3158574p+0, 0x1.d73e2a475b4p-55,
> + 0x1.0706b29ddf6dep+0, -0x1.c91dfe2b13cp-55,
> + 0x1.0874518759bc8p+0, 0x1.186be4bb284p-57,
> + 0x1.09e3ecac6f383p+0, 0x1.14878183161p-54,
> + 0x1.0b5586cf9890fp+0, 0x1.8a62e4adc61p-54,
> + 0x1.0cc922b7247f7p+0, 0x1.01edc16e24f8p-54,
> + 0x1.0e3ec32d3d1a2p+0, 0x1.03a1727c58p-59,
> + 0x1.0fb66affed31bp+0, -0x1.b9bedc44ebcp-57,
> + 0x1.11301d0125b51p+0, -0x1.6c51039449bp-54,
> + 0x1.12abdc06c31ccp+0, -0x1.1b514b36ca8p-58,
> + 0x1.1429aaea92dep+0, -0x1.32fbf9af1368p-54,
> + 0x1.15a98c8a58e51p+0, 0x1.2406ab9eeabp-55,
> + 0x1.172b83c7d517bp+0, -0x1.19041b9d78ap-55,
> + 0x1.18af9388c8deap+0, -0x1.11023d1970f8p-54,
> + 0x1.1a35beb6fcb75p+0, 0x1.e5b4c7b4969p-55,
> + 0x1.1bbe084045cd4p+0, -0x1.95386352ef6p-54,
> + 0x1.1d4873168b9aap+0, 0x1.e016e00a264p-54,
> + 0x1.1ed5022fcd91dp+0, -0x1.1df98027bb78p-54,
> + 0x1.2063b88628cd6p+0, 0x1.dc775814a85p-55,
> + 0x1.21f49917ddc96p+0, 0x1.2a97e9494a6p-55,
> + 0x1.2387a6e756238p+0, 0x1.9b07eb6c7058p-54,
> + 0x1.251ce4fb2a63fp+0, 0x1.ac155bef4f5p-55,
> + 0x1.26b4565e27cddp+0, 0x1.2bd339940eap-55,
> + 0x1.284dfe1f56381p+0, -0x1.a4c3a8c3f0d8p-54,
> + 0x1.29e9df51fdee1p+0, 0x1.612e8afad12p-55,
> + 0x1.2b87fd0dad99p+0, -0x1.10adcd6382p-59,
> + 0x1.2d285a6e4030bp+0, 0x1.0024754db42p-54,
> + 0x1.2ecafa93e2f56p+0, 0x1.1ca0f45d524p-56,
> + 0x1.306fe0a31b715p+0, 0x1.6f46ad23183p-55,
> + 0x1.32170fc4cd831p+0, 0x1.a9ce78e1804p-55,
> + 0x1.33c08b26416ffp+0, 0x1.327218436598p-54,
> + 0x1.356c55f929ff1p+0, -0x1.b5cee5c4e46p-55,
> + 0x1.371a7373aa9cbp+0, -0x1.63aeabf42ebp-54,
> + 0x1.38cae6d05d866p+0, -0x1.e958d3c99048p-54,
> + 0x1.3a7db34e59ff7p+0, -0x1.5e436d661f6p-56,
> + 0x1.3c32dc313a8e5p+0, -0x1.efff8375d2ap-54,
> + 0x1.3dea64c123422p+0, 0x1.ada0911f09fp-55,
> + 0x1.3fa4504ac801cp+0, -0x1.7d023f956fap-54,
> + 0x1.4160a21f72e2ap+0, -0x1.ef3691c309p-58,
> + 0x1.431f5d950a897p+0, -0x1.1c7dde35f7ap-55,
> + 0x1.44e086061892dp+0, 0x1.89b7a04ef8p-59,
> + 0x1.46a41ed1d0057p+0, 0x1.c944bd1648a8p-54,
> + 0x1.486a2b5c13cdp+0, 0x1.3c1a3b69062p-56,
> + 0x1.4a32af0d7d3dep+0, 0x1.9cb62f3d1be8p-54,
> + 0x1.4bfdad5362a27p+0, 0x1.d4397afec42p-56,
> + 0x1.4dcb299fddd0dp+0, 0x1.8ecdbbc6a78p-54,
> + 0x1.4f9b2769d2ca7p+0, -0x1.4b309d25958p-54,
> + 0x1.516daa2cf6642p+0, -0x1.f768569bd94p-55,
> + 0x1.5342b569d4f82p+0, -0x1.07abe1db13dp-55,
> + 0x1.551a4ca5d920fp+0, -0x1.d689cefede6p-55,
> + 0x1.56f4736b527dap+0, 0x1.9bb2c011d938p-54,
> + 0x1.58d12d497c7fdp+0, 0x1.295e15b9a1ep-55,
> + 0x1.5ab07dd485429p+0, 0x1.6324c0546478p-54,
> + 0x1.5c9268a5946b7p+0, 0x1.c4b1b81698p-60,
> + 0x1.5e76f15ad2148p+0, 0x1.ba6f93080e68p-54,
> + 0x1.605e1b976dc09p+0, -0x1.3e2429b56de8p-54,
> + 0x1.6247eb03a5585p+0, -0x1.383c17e40b48p-54,
> + 0x1.6434634ccc32p+0, -0x1.c483c759d89p-55,
> + 0x1.6623882552225p+0, -0x1.bb60987591cp-54,
> + 0x1.68155d44ca973p+0, 0x1.038ae44f74p-57,
> +};
> +
> +/**
> + * Compute the base 2 exponential of x for Intel 80-bit format.
> + *
> + * Accuracy: Peak error < 0.511 ulp.
> + *
> + * Method: (equally-spaced tables)
> + *
> + * Reduce x:
> + * x = 2**k + y, for integer k and |y| <= 1/2.
> + * Thus we have exp2l(x) = 2**k * exp2(y).
> + *
> + * Reduce y:
> + * y = i/TBLSIZE + z for integer i near y * TBLSIZE.
> + * Thus we have exp2(y) = exp2(i/TBLSIZE) * exp2(z),
> + * with |z| <= 2**-(TBLBITS+1).
> + *
> + * We compute exp2(i/TBLSIZE) via table lookup and exp2(z) via a
> + * degree-6 minimax polynomial with maximum error under 2**-75.6.
> + * The table entries each have 104 bits of accuracy, encoded as
> + * a pair of double precision values.
> + */
> +long double
> +exp2l(long double x)
> +{
> + union IEEEl2bits u, v;
> + long double r, twopk, twopkp10000, z;
> + uint32_t hx, ix, i0;
> + int k;
> +
> + /* Filter out exceptional cases. */
> + u.e = x;
> + hx = u.xbits.expsign;
> + ix = hx & 0x7fff;
> + if (ix >= BIAS + 14) { /* |x| >= 16384 or x is NaN */
> + if (ix == BIAS + LDBL_MAX_EXP) {
> + if (hx & 0x8000 && u.xbits.man == 1ULL << 63)
> + return (0.0L); /* x is -Inf */
> + return (x + x); /* x is +Inf, NaN or unsupported */
> + }
> + if (x >= 16384)
> + return (huge * huge); /* overflow */
> + if (x <= -16446)
> + return (twom10000 * twom10000); /* underflow */
> + } else if (ix <= BIAS - 66) { /* |x| < 0x1p-65 (includes pseudos) */
> + return (1.0L + x); /* 1 with inexact */
> + }
> +
> + ENTERI();
> +
> + /*
> + * Reduce x, computing z, i0, and k. The low bits of x + redux
> + * contain the 16-bit integer part of the exponent (k) followed by
> + * TBLBITS fractional bits (i0). We use bit tricks to extract these
> + * as integers, then set z to the remainder.
> + *
> + * Example: Suppose x is 0xabc.123456p0 and TBLBITS is 8.
> + * Then the low-order word of x + redux is 0x000abc12,
> + * We split this into k = 0xabc and i0 = 0x12 (adjusted to
> + * index into the table), then we compute z = 0x0.003456p0.
> + *
> + * XXX If the exponent is negative, the computation of k depends on
> + * '>>' doing sign extension.
> + */
> + u.e = x + redux;
> + i0 = u.bits.manl + TBLSIZE / 2;
> + k = (int)i0 >> TBLBITS;
> + i0 = (i0 & (TBLSIZE - 1)) << 1;
> + u.e -= redux;
> + z = x - u.e;
> + v.xbits.man = 1ULL << 63;
> + if (k >= LDBL_MIN_EXP) {
> + v.xbits.expsign = BIAS + k;
> + twopk = v.e;
> + } else {
> + v.xbits.expsign = BIAS + k + 10000;
> + twopkp10000 = v.e;
> + }
> +
> + /* Compute r = exp2l(y) = exp2lt[i0] * p(z). */
> + long double t_hi = tbl[i0];
> + long double t_lo = tbl[i0 + 1];
> + r = t_lo + (t_hi + t_lo) * z * (P1.e + z * (P2 + z * (P3 + z * (P4
> + + z * (P5 + z * P6))))) + t_hi;
> +
> + /* Scale by 2**k. */
> + if (k >= LDBL_MIN_EXP) {
> + if (k == LDBL_MAX_EXP)
> + RETURNI(r * 2.0 * 0x1p16383L);
> + RETURNI(r * twopk);
> + } else {
> + RETURNI(r * twopkp10000 * twom10000);
> + }
> +}
> diff --git a/newlib/libm/ld80/s_expl.c b/newlib/libm/ld80/s_expl.c
> new file mode 100644
> index 000000000..e46e73f0c
> --- /dev/null
> +++ b/newlib/libm/ld80/s_expl.c
> @@ -0,0 +1,279 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2009-2013 Steven G. Kargl
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice unmodified, this list of conditions, and the following
> + * disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
> + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
> + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
> + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
> + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
> + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
> + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + *
> + * Optimized by Bruce D. Evans.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/**
> + * Compute the exponential of x for Intel 80-bit format. This is based on:
> + *
> + * PTP Tang, "Table-driven implementation of the exponential function
> + * in IEEE floating-point arithmetic," ACM Trans. Math. Soft., 15,
> + * 144-157 (1989).
> + *
> + * where the 32 table entries have been expanded to INTERVALS (see below).
> + */
> +
> +#include <float.h>
> +
> +#ifdef __i386__
> +#include <ieeefp.h>
> +#endif
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +#include "k_expl.h"
> +
> +/* XXX Prevent compilers from erroneously constant folding these: */
> +static const volatile long double
> +huge = 0x1p10000L,
> +tiny = 0x1p-10000L;
> +
> +static const long double
> +twom10000 = 0x1p-10000L;
> +
> +static const union IEEEl2bits
> +/* log(2**16384 - 0.5) rounded towards zero: */
> +/* log(2**16384 - 0.5 + 1) rounded towards zero for expm1l() is the same: */
> +o_thresholdu = LD80C(0xb17217f7d1cf79ab, 13, 11356.5234062941439488L),
> +#define o_threshold (o_thresholdu.e)
> +/* log(2**(-16381-64-1)) rounded towards zero: */
> +u_thresholdu = LD80C(0xb21dfe7f09e2baa9, 13, -11399.4985314888605581L);
> +#define u_threshold (u_thresholdu.e)
> +
> +long double
> +expl(long double x)
> +{
> + union IEEEl2bits u;
> + long double hi, lo, t, twopk;
> + int k;
> + uint16_t hx, ix;
> +
> + DOPRINT_START(&x);
> +
> + /* Filter out exceptional cases. */
> + u.e = x;
> + hx = u.xbits.expsign;
> + ix = hx & 0x7fff;
> + if (ix >= BIAS + 13) { /* |x| >= 8192 or x is NaN */
> + if (ix == BIAS + LDBL_MAX_EXP) {
> + if (hx & 0x8000) /* x is -Inf, -NaN or unsupported */
> + RETURNP(-1 / x);
> + RETURNP(x + x); /* x is +Inf, +NaN or unsupported */
> + }
> + if (x > o_threshold)
> + RETURNP(huge * huge);
> + if (x < u_threshold)
> + RETURNP(tiny * tiny);
> + } else if (ix < BIAS - 75) { /* |x| < 0x1p-75 (includes pseudos) */
> + RETURN2P(1, x); /* 1 with inexact iff x != 0 */
> + }
> +
> + ENTERI();
> +
> + twopk = 1;
> + __k_expl(x, &hi, &lo, &k);
> + t = SUM2P(hi, lo);
> +
> + /* Scale by 2**k. */
> + if (k >= LDBL_MIN_EXP) {
> + if (k == LDBL_MAX_EXP)
> + RETURNI(t * 2 * 0x1p16383L);
> + SET_LDBL_EXPSIGN(twopk, BIAS + k);
> + RETURNI(t * twopk);
> + } else {
> + SET_LDBL_EXPSIGN(twopk, BIAS + k + 10000);
> + RETURNI(t * twopk * twom10000);
> + }
> +}
> +
> +/**
> + * Compute expm1l(x) for Intel 80-bit format. This is based on:
> + *
> + * PTP Tang, "Table-driven implementation of the Expm1 function
> + * in IEEE floating-point arithmetic," ACM Trans. Math. Soft., 18,
> + * 211-222 (1992).
> + */
> +
> +/*
> + * Our T1 and T2 are chosen to be approximately the points where method
> + * A and method B have the same accuracy. Tang's T1 and T2 are the
> + * points where method A's accuracy changes by a full bit. For Tang,
> + * this drop in accuracy makes method A immediately less accurate than
> + * method B, but our larger INTERVALS makes method A 2 bits more
> + * accurate so it remains the most accurate method significantly
> + * closer to the origin despite losing the full bit in our extended
> + * range for it.
> + */
> +static const double
> +T1 = -0.1659, /* ~-30.625/128 * log(2) */
> +T2 = 0.1659; /* ~30.625/128 * log(2) */
> +
> +/*
> + * Domain [-0.1659, 0.1659], range ~[-2.6155e-22, 2.5507e-23]:
> + * |(exp(x)-1-x-x**2/2)/x - p(x)| < 2**-71.6
> + *
> + * XXX the coeffs aren't very carefully rounded, and I get 2.8 more bits,
> + * but unlike for ld128 we can't drop any terms.
> + */
> +static const union IEEEl2bits
> +B3 = LD80C(0xaaaaaaaaaaaaaaab, -3, 1.66666666666666666671e-1L),
> +B4 = LD80C(0xaaaaaaaaaaaaaaac, -5, 4.16666666666666666712e-2L);
> +
> +static const double
> +B5 = 8.3333333333333245e-3, /* 0x1.111111111110cp-7 */
> +B6 = 1.3888888888888861e-3, /* 0x1.6c16c16c16c0ap-10 */
> +B7 = 1.9841269841532042e-4, /* 0x1.a01a01a0319f9p-13 */
> +B8 = 2.4801587302069236e-5, /* 0x1.a01a01a03cbbcp-16 */
> +B9 = 2.7557316558468562e-6, /* 0x1.71de37fd33d67p-19 */
> +B10 = 2.7557315829785151e-7, /* 0x1.27e4f91418144p-22 */
> +B11 = 2.5063168199779829e-8, /* 0x1.ae94fabdc6b27p-26 */
> +B12 = 2.0887164654459567e-9; /* 0x1.1f122d6413fe1p-29 */
> +
> +long double
> +expm1l(long double x)
> +{
> + union IEEEl2bits u, v;
> + long double fn, hx2_hi, hx2_lo, q, r, r1, r2, t, twomk, twopk, x_hi;
> + long double x_lo, x2, z;
> + long double x4;
> + int k, n, n2;
> + uint16_t hx, ix;
> +
> + DOPRINT_START(&x);
> +
> + /* Filter out exceptional cases. */
> + u.e = x;
> + hx = u.xbits.expsign;
> + ix = hx & 0x7fff;
> + if (ix >= BIAS + 6) { /* |x| >= 64 or x is NaN */
> + if (ix == BIAS + LDBL_MAX_EXP) {
> + if (hx & 0x8000) /* x is -Inf, -NaN or unsupported */
> + RETURNP(-1 / x - 1);
> + RETURNP(x + x); /* x is +Inf, +NaN or unsupported */
> + }
> + if (x > o_threshold)
> + RETURNP(huge * huge);
> + /*
> + * expm1l() never underflows, but it must avoid
> + * unrepresentable large negative exponents. We used a
> + * much smaller threshold for large |x| above than in
> + * expl() so as to handle not so large negative exponents
> + * in the same way as large ones here.
> + */
> + if (hx & 0x8000) /* x <= -64 */
> + RETURN2P(tiny, -1); /* good for x < -65ln2 - eps */
> + }
> +
> + ENTERI();
> +
> + if (T1 < x && x < T2) {
> + if (ix < BIAS - 74) { /* |x| < 0x1p-74 (includes pseudos) */
> + /* x (rounded) with inexact if x != 0: */
> + RETURNPI(x == 0 ? x :
> + (0x1p100 * x + fabsl(x)) * 0x1p-100);
> + }
> +
> + x2 = x * x;
> + x4 = x2 * x2;
> + q = x4 * (x2 * (x4 *
> + /*
> + * XXX the number of terms is no longer good for
> + * pairwise grouping of all except B3, and the
> + * grouping is no longer from highest down.
> + */
> + (x2 * B12 + (x * B11 + B10)) +
> + (x2 * (x * B9 + B8) + (x * B7 + B6))) +
> + (x * B5 + B4.e)) + x2 * x * B3.e;
> +
> + x_hi = (float)x;
> + x_lo = x - x_hi;
> + hx2_hi = x_hi * x_hi / 2;
> + hx2_lo = x_lo * (x + x_hi) / 2;
> + if (ix >= BIAS - 7)
> + RETURN2PI(hx2_hi + x_hi, hx2_lo + x_lo + q);
> + else
> + RETURN2PI(x, hx2_lo + q + hx2_hi);
> + }
> +
> + /* Reduce x to (k*ln2 + endpoint[n2] + r1 + r2). */
> + fn = rnintl(x * INV_L);
> + n = irint(fn);
> + n2 = (unsigned)n % INTERVALS;
> + k = n >> LOG2_INTERVALS;
> + r1 = x - fn * L1;
> + r2 = fn * -L2;
> + r = r1 + r2;
> +
> + /* Prepare scale factor. */
> + v.e = 1;
> + v.xbits.expsign = BIAS + k;
> + twopk = v.e;
> +
> + /*
> + * Evaluate lower terms of
> + * expl(endpoint[n2] + r1 + r2) = tbl[n2] * expl(r1 + r2).
> + */
> + z = r * r;
> + q = r2 + z * (A2 + r * A3) + z * z * (A4 + r * A5) + z * z * z * A6;
> +
> + t = (long double)tbl[n2].lo + tbl[n2].hi;
> +
> + if (k == 0) {
> + t = SUM2P(tbl[n2].hi - 1, tbl[n2].lo * (r1 + 1) + t * q +
> + tbl[n2].hi * r1);
> + RETURNI(t);
> + }
> + if (k == -1) {
> + t = SUM2P(tbl[n2].hi - 2, tbl[n2].lo * (r1 + 1) + t * q +
> + tbl[n2].hi * r1);
> + RETURNI(t / 2);
> + }
> + if (k < -7) {
> + t = SUM2P(tbl[n2].hi, tbl[n2].lo + t * (q + r1));
> + RETURNI(t * twopk - 1);
> + }
> + if (k > 2 * LDBL_MANT_DIG - 1) {
> + t = SUM2P(tbl[n2].hi, tbl[n2].lo + t * (q + r1));
> + if (k == LDBL_MAX_EXP)
> + RETURNI(t * 2 * 0x1p16383L - 1);
> + RETURNI(t * twopk - 1);
> + }
> +
> + v.xbits.expsign = BIAS - k;
> + twomk = v.e;
> +
> + if (k > LDBL_MANT_DIG - 1)
> + t = SUM2P(tbl[n2].hi, tbl[n2].lo - twomk + t * (q + r1));
> + else
> + t = SUM2P(tbl[n2].hi - twomk, tbl[n2].lo + t * (q + r1));
> + RETURNI(t * twopk);
> +}
> diff --git a/newlib/libm/ld80/s_logl.c b/newlib/libm/ld80/s_logl.c
> new file mode 100644
> index 000000000..c74519caf
> --- /dev/null
> +++ b/newlib/libm/ld80/s_logl.c
> @@ -0,0 +1,722 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
> + *
> + * Copyright (c) 2007-2013 Bruce D. Evans
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice unmodified, this list of conditions, and the following
> + * disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
> + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
> + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
> + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
> + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
> + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
> + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +/**
> + * Implementation of the natural logarithm of x for Intel 80-bit format.
> + *
> + * First decompose x into its base 2 representation:
> + *
> + * log(x) = log(X * 2**k), where X is in [1, 2)
> + * = log(X) + k * log(2).
> + *
> + * Let X = X_i + e, where X_i is the center of one of the intervals
> + * [-1.0/256, 1.0/256), [1.0/256, 3.0/256), .... [2.0-1.0/256, 2.0+1.0/256)
> + * and X is in this interval. Then
> + *
> + * log(X) = log(X_i + e)
> + * = log(X_i * (1 + e / X_i))
> + * = log(X_i) + log(1 + e / X_i).
> + *
> + * The values log(X_i) are tabulated below. Let d = e / X_i and use
> + *
> + * log(1 + d) = p(d)
> + *
> + * where p(d) = d - 0.5*d*d + ... is a special minimax polynomial of
> + * suitably high degree.
> + *
> + * To get sufficiently small roundoff errors, k * log(2), log(X_i), and
> + * sometimes (if |k| is not large) the first term in p(d) must be evaluated
> + * and added up in extra precision. Extra precision is not needed for the
> + * rest of p(d). In the worst case when k = 0 and log(X_i) is 0, the final
> + * error is controlled mainly by the error in the second term in p(d). The
> + * error in this term itself is at most 0.5 ulps from the d*d operation in
> + * it. The error in this term relative to the first term is thus at most
> + * 0.5 * |-0.5| * |d| < 1.0/1024 ulps. We aim for an accumulated error of
> + * at most twice this at the point of the final rounding step. Thus the
> + * final error should be at most 0.5 + 1.0/512 = 0.5020 ulps. Exhaustive
> + * testing of a float variant of this function showed a maximum final error
> + * of 0.5008 ulps. Non-exhaustive testing of a double variant of this
> + * function showed a maximum final error of 0.5078 ulps (near 1+1.0/256).
> + *
> + * We made the maximum of |d| (and thus the total relative error and the
> + * degree of p(d)) small by using a large number of intervals. Using
> + * centers of intervals instead of endpoints reduces this maximum by a
> + * factor of 2 for a given number of intervals. p(d) is special only
> + * in beginning with the Taylor coefficients 0 + 1*d, which tends to happen
> + * naturally. The most accurate minimax polynomial of a given degree might
> + * be different, but then we wouldn't want it since we would have to do
> + * extra work to avoid roundoff error (especially for P0*d instead of d).
> + */
> +
> +#ifdef DEBUG
> +#include <assert.h>
> +#include <fenv.h>
> +#endif
> +
> +#ifdef __i386__
> +#include <ieeefp.h>
> +#endif
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#define i386_SSE_GOOD
> +#ifndef NO_STRUCT_RETURN
> +#define STRUCT_RETURN
> +#endif
> +#include "math_private.h"
> +
> +#if !defined(NO_UTAB) && !defined(NO_UTABL)
> +#define USE_UTAB
> +#endif
> +
> +/*
> + * Domain [-0.005280, 0.004838], range ~[-5.1736e-22, 5.1738e-22]:
> + * |log(1 + d)/d - p(d)| < 2**-70.7
> + */
> +static const double
> +P2 = -0.5,
> +P3 = 3.3333333333333359e-1, /* 0x1555555555555a.0p-54 */
> +P4 = -2.5000000000004424e-1, /* -0x1000000000031d.0p-54 */
> +P5 = 1.9999999992970016e-1, /* 0x1999999972f3c7.0p-55 */
> +P6 = -1.6666666072191585e-1, /* -0x15555548912c09.0p-55 */
> +P7 = 1.4286227413310518e-1, /* 0x12494f9d9def91.0p-55 */
> +P8 = -1.2518388626763144e-1; /* -0x1006068cc0b97c.0p-55 */
> +
> +static volatile const double zero = 0;
> +
> +#define INTERVALS 128
> +#define LOG2_INTERVALS 7
> +#define TSIZE (INTERVALS + 1)
> +#define G(i) (T[(i)].G)
> +#define F_hi(i) (T[(i)].F_hi)
> +#define F_lo(i) (T[(i)].F_lo)
> +#define ln2_hi F_hi(TSIZE - 1)
> +#define ln2_lo F_lo(TSIZE - 1)
> +#define E(i) (U[(i)].E)
> +#define H(i) (U[(i)].H)
> +
> +static const struct {
> + float G; /* 1/(1 + i/128) rounded to 8/9 bits */
> + float F_hi; /* log(1 / G_i) rounded (see below) */
> + double F_lo; /* next 53 bits for log(1 / G_i) */
> +} T[TSIZE] = {
> + /*
> + * ln2_hi and each F_hi(i) are rounded to a number of bits that
> + * makes F_hi(i) + dk*ln2_hi exact for all i and all dk.
> + *
> + * The last entry (for X just below 2) is used to define ln2_hi
> + * and ln2_lo, to ensure that F_hi(i) and F_lo(i) cancel exactly
> + * with dk*ln2_hi and dk*ln2_lo, respectively, when dk = -1.
> + * This is needed for accuracy when x is just below 1. (To avoid
> + * special cases, such x are "reduced" strangely to X just below
> + * 2 and dk = -1, and then the exact cancellation is needed
> + * because any the error from any non-exactness would be too
> + * large).
> + *
> + * We want to share this table between double precision and ld80,
> + * so the relevant range of dk is the larger one of ld80
> + * ([-16445, 16383]) and the relevant exactness requirement is
> + * the stricter one of double precision. The maximum number of
> + * bits in F_hi(i) that works is very dependent on i but has
> + * a minimum of 33. We only need about 12 bits in F_hi(i) for
> + * it to provide enough extra precision in double precision (11
> + * more than that are required for ld80).
> + *
> + * We round F_hi(i) to 24 bits so that it can have type float,
> + * mainly to minimize the size of the table. Using all 24 bits
> + * in a float for it automatically satisfies the above constraints.
> + */
> + { 0x800000.0p-23, 0, 0 },
> + { 0xfe0000.0p-24, 0x8080ac.0p-30, -0x14ee431dae6675.0p-84 },
> + { 0xfc0000.0p-24, 0x8102b3.0p-29, -0x1db29ee2d83718.0p-84 },
> + { 0xfa0000.0p-24, 0xc24929.0p-29, 0x1191957d173698.0p-83 },
> + { 0xf80000.0p-24, 0x820aec.0p-28, 0x13ce8888e02e79.0p-82 },
> + { 0xf60000.0p-24, 0xa33577.0p-28, -0x17a4382ce6eb7c.0p-82 },
> + { 0xf48000.0p-24, 0xbc42cb.0p-28, -0x172a21161a1076.0p-83 },
> + { 0xf30000.0p-24, 0xd57797.0p-28, -0x1e09de07cb9589.0p-82 },
> + { 0xf10000.0p-24, 0xf7518e.0p-28, 0x1ae1eec1b036c5.0p-91 },
> + { 0xef0000.0p-24, 0x8cb9df.0p-27, -0x1d7355325d560e.0p-81 },
> + { 0xed8000.0p-24, 0x999ec0.0p-27, -0x1f9f02d256d503.0p-82 },
> + { 0xec0000.0p-24, 0xa6988b.0p-27, -0x16fc0a9d12c17a.0p-83 },
> + { 0xea0000.0p-24, 0xb80698.0p-27, 0x15d581c1e8da9a.0p-81 },
> + { 0xe80000.0p-24, 0xc99af3.0p-27, -0x1535b3ba8f150b.0p-83 },
> + { 0xe70000.0p-24, 0xd273b2.0p-27, 0x163786f5251af0.0p-85 },
> + { 0xe50000.0p-24, 0xe442c0.0p-27, 0x1bc4b2368e32d5.0p-84 },
> + { 0xe38000.0p-24, 0xf1b83f.0p-27, 0x1c6090f684e676.0p-81 },
> + { 0xe20000.0p-24, 0xff448a.0p-27, -0x1890aa69ac9f42.0p-82 },
> + { 0xe08000.0p-24, 0x8673f6.0p-26, 0x1b9985194b6b00.0p-80 },
> + { 0xdf0000.0p-24, 0x8d515c.0p-26, -0x1dc08d61c6ef1e.0p-83 },
> + { 0xdd8000.0p-24, 0x943a9e.0p-26, -0x1f72a2dac729b4.0p-82 },
> + { 0xdc0000.0p-24, 0x9b2fe6.0p-26, -0x1fd4dfd3a0afb9.0p-80 },
> + { 0xda8000.0p-24, 0xa2315d.0p-26, -0x11b26121629c47.0p-82 },
> + { 0xd90000.0p-24, 0xa93f2f.0p-26, 0x1286d633e8e569.0p-81 },
> + { 0xd78000.0p-24, 0xb05988.0p-26, 0x16128eba936770.0p-84 },
> + { 0xd60000.0p-24, 0xb78094.0p-26, 0x16ead577390d32.0p-80 },
> + { 0xd50000.0p-24, 0xbc4c6c.0p-26, 0x151131ccf7c7b7.0p-81 },
> + { 0xd38000.0p-24, 0xc3890a.0p-26, -0x115e2cd714bd06.0p-80 },
> + { 0xd20000.0p-24, 0xcad2d7.0p-26, -0x1847f406ebd3b0.0p-82 },
> + { 0xd10000.0p-24, 0xcfb620.0p-26, 0x1c2259904d6866.0p-81 },
> + { 0xcf8000.0p-24, 0xd71653.0p-26, 0x1ece57a8d5ae55.0p-80 },
> + { 0xce0000.0p-24, 0xde843a.0p-26, -0x1f109d4bc45954.0p-81 },
> + { 0xcd0000.0p-24, 0xe37fde.0p-26, 0x1bc03dc271a74d.0p-81 },
> + { 0xcb8000.0p-24, 0xeb050c.0p-26, -0x1bf2badc0df842.0p-85 },
> + { 0xca0000.0p-24, 0xf29878.0p-26, -0x18efededd89fbe.0p-87 },
> + { 0xc90000.0p-24, 0xf7ad6f.0p-26, 0x1373ff977baa69.0p-81 },
> + { 0xc80000.0p-24, 0xfcc8e3.0p-26, 0x196766f2fb3283.0p-80 },
> + { 0xc68000.0p-24, 0x823f30.0p-25, 0x19bd076f7c434e.0p-79 },
> + { 0xc58000.0p-24, 0x84d52c.0p-25, -0x1a327257af0f46.0p-79 },
> + { 0xc40000.0p-24, 0x88bc74.0p-25, 0x113f23def19c5a.0p-81 },
> + { 0xc30000.0p-24, 0x8b5ae6.0p-25, 0x1759f6e6b37de9.0p-79 },
> + { 0xc20000.0p-24, 0x8dfccb.0p-25, 0x1ad35ca6ed5148.0p-81 },
> + { 0xc10000.0p-24, 0x90a22b.0p-25, 0x1a1d71a87deba4.0p-79 },
> + { 0xbf8000.0p-24, 0x94a0d8.0p-25, -0x139e5210c2b731.0p-80 },
> + { 0xbe8000.0p-24, 0x974f16.0p-25, -0x18f6ebcff3ed73.0p-81 },
> + { 0xbd8000.0p-24, 0x9a00f1.0p-25, -0x1aa268be39aab7.0p-79 },
> + { 0xbc8000.0p-24, 0x9cb672.0p-25, -0x14c8815839c566.0p-79 },
> + { 0xbb0000.0p-24, 0xa0cda1.0p-25, 0x1eaf46390dbb24.0p-81 },
> + { 0xba0000.0p-24, 0xa38c6e.0p-25, 0x138e20d831f698.0p-81 },
> + { 0xb90000.0p-24, 0xa64f05.0p-25, -0x1e8d3c41123616.0p-82 },
> + { 0xb80000.0p-24, 0xa91570.0p-25, 0x1ce28f5f3840b2.0p-80 },
> + { 0xb70000.0p-24, 0xabdfbb.0p-25, -0x186e5c0a424234.0p-79 },
> + { 0xb60000.0p-24, 0xaeadef.0p-25, -0x14d41a0b2a08a4.0p-83 },
> + { 0xb50000.0p-24, 0xb18018.0p-25, 0x16755892770634.0p-79 },
> + { 0xb40000.0p-24, 0xb45642.0p-25, -0x16395ebe59b152.0p-82 },
> + { 0xb30000.0p-24, 0xb73077.0p-25, 0x1abc65c8595f09.0p-80 },
> + { 0xb20000.0p-24, 0xba0ec4.0p-25, -0x1273089d3dad89.0p-79 },
> + { 0xb10000.0p-24, 0xbcf133.0p-25, 0x10f9f67b1f4bbf.0p-79 },
> + { 0xb00000.0p-24, 0xbfd7d2.0p-25, -0x109fab90486409.0p-80 },
> + { 0xaf0000.0p-24, 0xc2c2ac.0p-25, -0x1124680aa43333.0p-79 },
> + { 0xae8000.0p-24, 0xc439b3.0p-25, -0x1f360cc4710fc0.0p-80 },
> + { 0xad8000.0p-24, 0xc72afd.0p-25, -0x132d91f21d89c9.0p-80 },
> + { 0xac8000.0p-24, 0xca20a2.0p-25, -0x16bf9b4d1f8da8.0p-79 },
> + { 0xab8000.0p-24, 0xcd1aae.0p-25, 0x19deb5ce6a6a87.0p-81 },
> + { 0xaa8000.0p-24, 0xd0192f.0p-25, 0x1a29fb48f7d3cb.0p-79 },
> + { 0xaa0000.0p-24, 0xd19a20.0p-25, 0x1127d3c6457f9d.0p-81 },
> + { 0xa90000.0p-24, 0xd49f6a.0p-25, -0x1ba930e486a0ac.0p-81 },
> + { 0xa80000.0p-24, 0xd7a94b.0p-25, -0x1b6e645f31549e.0p-79 },
> + { 0xa70000.0p-24, 0xdab7d0.0p-25, 0x1118a425494b61.0p-80 },
> + { 0xa68000.0p-24, 0xdc40d5.0p-25, 0x1966f24d29d3a3.0p-80 },
> + { 0xa58000.0p-24, 0xdf566d.0p-25, -0x1d8e52eb2248f1.0p-82 },
> + { 0xa48000.0p-24, 0xe270ce.0p-25, -0x1ee370f96e6b68.0p-80 },
> + { 0xa40000.0p-24, 0xe3ffce.0p-25, 0x1d155324911f57.0p-80 },
> + { 0xa30000.0p-24, 0xe72179.0p-25, -0x1fe6e2f2f867d9.0p-80 },
> + { 0xa20000.0p-24, 0xea4812.0p-25, 0x1b7be9add7f4d4.0p-80 },
> + { 0xa18000.0p-24, 0xebdd3d.0p-25, 0x1b3cfb3f7511dd.0p-79 },
> + { 0xa08000.0p-24, 0xef0b5b.0p-25, -0x1220de1f730190.0p-79 },
> + { 0xa00000.0p-24, 0xf0a451.0p-25, -0x176364c9ac81cd.0p-80 },
> + { 0x9f0000.0p-24, 0xf3da16.0p-25, 0x1eed6b9aafac8d.0p-81 },
> + { 0x9e8000.0p-24, 0xf576e9.0p-25, 0x1d593218675af2.0p-79 },
> + { 0x9d8000.0p-24, 0xf8b47c.0p-25, -0x13e8eb7da053e0.0p-84 },
> + { 0x9d0000.0p-24, 0xfa553f.0p-25, 0x1c063259bcade0.0p-79 },
> + { 0x9c0000.0p-24, 0xfd9ac5.0p-25, 0x1ef491085fa3c1.0p-79 },
> + { 0x9b8000.0p-24, 0xff3f8c.0p-25, 0x1d607a7c2b8c53.0p-79 },
> + { 0x9a8000.0p-24, 0x814697.0p-24, -0x12ad3817004f3f.0p-78 },
> + { 0x9a0000.0p-24, 0x821b06.0p-24, -0x189fc53117f9e5.0p-81 },
> + { 0x990000.0p-24, 0x83c5f8.0p-24, 0x14cf15a048907b.0p-79 },
> + { 0x988000.0p-24, 0x849c7d.0p-24, 0x1cbb1d35fb8287.0p-78 },
> + { 0x978000.0p-24, 0x864ba6.0p-24, 0x1128639b814f9c.0p-78 },
> + { 0x970000.0p-24, 0x87244c.0p-24, 0x184733853300f0.0p-79 },
> + { 0x968000.0p-24, 0x87fdaa.0p-24, 0x109d23aef77dd6.0p-80 },
> + { 0x958000.0p-24, 0x89b293.0p-24, -0x1a81ef367a59de.0p-78 },
> + { 0x950000.0p-24, 0x8a8e20.0p-24, -0x121ad3dbb2f452.0p-78 },
> + { 0x948000.0p-24, 0x8b6a6a.0p-24, -0x1cfb981628af72.0p-79 },
> + { 0x938000.0p-24, 0x8d253a.0p-24, -0x1d21730ea76cfe.0p-79 },
> + { 0x930000.0p-24, 0x8e03c2.0p-24, 0x135cc00e566f77.0p-78 },
> + { 0x928000.0p-24, 0x8ee30d.0p-24, -0x10fcb5df257a26.0p-80 },
> + { 0x918000.0p-24, 0x90a3ee.0p-24, -0x16e171b15433d7.0p-79 },
> + { 0x910000.0p-24, 0x918587.0p-24, -0x1d050da07f3237.0p-79 },
> + { 0x908000.0p-24, 0x9267e7.0p-24, 0x1be03669a5268d.0p-79 },
> + { 0x8f8000.0p-24, 0x942f04.0p-24, 0x10b28e0e26c337.0p-79 },
> + { 0x8f0000.0p-24, 0x9513c3.0p-24, 0x1a1d820da57cf3.0p-78 },
> + { 0x8e8000.0p-24, 0x95f950.0p-24, -0x19ef8f13ae3cf1.0p-79 },
> + { 0x8e0000.0p-24, 0x96dfab.0p-24, -0x109e417a6e507c.0p-78 },
> + { 0x8d0000.0p-24, 0x98aed2.0p-24, 0x10d01a2c5b0e98.0p-79 },
> + { 0x8c8000.0p-24, 0x9997a2.0p-24, -0x1d6a50d4b61ea7.0p-78 },
> + { 0x8c0000.0p-24, 0x9a8145.0p-24, 0x1b3b190b83f952.0p-78 },
> + { 0x8b8000.0p-24, 0x9b6bbf.0p-24, 0x13a69fad7e7abe.0p-78 },
> + { 0x8b0000.0p-24, 0x9c5711.0p-24, -0x11cd12316f576b.0p-78 },
> + { 0x8a8000.0p-24, 0x9d433b.0p-24, 0x1c95c444b807a2.0p-79 },
> + { 0x898000.0p-24, 0x9f1e22.0p-24, -0x1b9c224ea698c3.0p-79 },
> + { 0x890000.0p-24, 0xa00ce1.0p-24, 0x125ca93186cf0f.0p-81 },
> + { 0x888000.0p-24, 0xa0fc80.0p-24, -0x1ee38a7bc228b3.0p-79 },
> + { 0x880000.0p-24, 0xa1ed00.0p-24, -0x1a0db876613d20.0p-78 },
> + { 0x878000.0p-24, 0xa2de62.0p-24, 0x193224e8516c01.0p-79 },
> + { 0x870000.0p-24, 0xa3d0a9.0p-24, 0x1fa28b4d2541ad.0p-79 },
> + { 0x868000.0p-24, 0xa4c3d6.0p-24, 0x1c1b5760fb4572.0p-78 },
> + { 0x858000.0p-24, 0xa6acea.0p-24, 0x1fed5d0f65949c.0p-80 },
> + { 0x850000.0p-24, 0xa7a2d4.0p-24, 0x1ad270c9d74936.0p-80 },
> + { 0x848000.0p-24, 0xa899ab.0p-24, 0x199ff15ce53266.0p-79 },
> + { 0x840000.0p-24, 0xa99171.0p-24, 0x1a19e15ccc45d2.0p-79 },
> + { 0x838000.0p-24, 0xaa8a28.0p-24, -0x121a14ec532b36.0p-80 },
> + { 0x830000.0p-24, 0xab83d1.0p-24, 0x1aee319980bff3.0p-79 },
> + { 0x828000.0p-24, 0xac7e6f.0p-24, -0x18ffd9e3900346.0p-80 },
> + { 0x820000.0p-24, 0xad7a03.0p-24, -0x1e4db102ce29f8.0p-80 },
> + { 0x818000.0p-24, 0xae768f.0p-24, 0x17c35c55a04a83.0p-81 },
> + { 0x810000.0p-24, 0xaf7415.0p-24, 0x1448324047019b.0p-78 },
> + { 0x808000.0p-24, 0xb07298.0p-24, -0x1750ee3915a198.0p-78 },
> + { 0x800000.0p-24, 0xb17218.0p-24, -0x105c610ca86c39.0p-81 },
> +};
> +
> +#ifdef USE_UTAB
> +static const struct {
> + float H; /* 1 + i/INTERVALS (exact) */
> + float E; /* H(i) * G(i) - 1 (exact) */
> +} U[TSIZE] = {
> + { 0x800000.0p-23, 0 },
> + { 0x810000.0p-23, -0x800000.0p-37 },
> + { 0x820000.0p-23, -0x800000.0p-35 },
> + { 0x830000.0p-23, -0x900000.0p-34 },
> + { 0x840000.0p-23, -0x800000.0p-33 },
> + { 0x850000.0p-23, -0xc80000.0p-33 },
> + { 0x860000.0p-23, -0xa00000.0p-36 },
> + { 0x870000.0p-23, 0x940000.0p-33 },
> + { 0x880000.0p-23, 0x800000.0p-35 },
> + { 0x890000.0p-23, -0xc80000.0p-34 },
> + { 0x8a0000.0p-23, 0xe00000.0p-36 },
> + { 0x8b0000.0p-23, 0x900000.0p-33 },
> + { 0x8c0000.0p-23, -0x800000.0p-35 },
> + { 0x8d0000.0p-23, -0xe00000.0p-33 },
> + { 0x8e0000.0p-23, 0x880000.0p-33 },
> + { 0x8f0000.0p-23, -0xa80000.0p-34 },
> + { 0x900000.0p-23, -0x800000.0p-35 },
> + { 0x910000.0p-23, 0x800000.0p-37 },
> + { 0x920000.0p-23, 0x900000.0p-35 },
> + { 0x930000.0p-23, 0xd00000.0p-35 },
> + { 0x940000.0p-23, 0xe00000.0p-35 },
> + { 0x950000.0p-23, 0xc00000.0p-35 },
> + { 0x960000.0p-23, 0xe00000.0p-36 },
> + { 0x970000.0p-23, -0x800000.0p-38 },
> + { 0x980000.0p-23, -0xc00000.0p-35 },
> + { 0x990000.0p-23, -0xd00000.0p-34 },
> + { 0x9a0000.0p-23, 0x880000.0p-33 },
> + { 0x9b0000.0p-23, 0xe80000.0p-35 },
> + { 0x9c0000.0p-23, -0x800000.0p-35 },
> + { 0x9d0000.0p-23, 0xb40000.0p-33 },
> + { 0x9e0000.0p-23, 0x880000.0p-34 },
> + { 0x9f0000.0p-23, -0xe00000.0p-35 },
> + { 0xa00000.0p-23, 0x800000.0p-33 },
> + { 0xa10000.0p-23, -0x900000.0p-36 },
> + { 0xa20000.0p-23, -0xb00000.0p-33 },
> + { 0xa30000.0p-23, -0xa00000.0p-36 },
> + { 0xa40000.0p-23, 0x800000.0p-33 },
> + { 0xa50000.0p-23, -0xf80000.0p-35 },
> + { 0xa60000.0p-23, 0x880000.0p-34 },
> + { 0xa70000.0p-23, -0x900000.0p-33 },
> + { 0xa80000.0p-23, -0x800000.0p-35 },
> + { 0xa90000.0p-23, 0x900000.0p-34 },
> + { 0xaa0000.0p-23, 0xa80000.0p-33 },
> + { 0xab0000.0p-23, -0xac0000.0p-34 },
> + { 0xac0000.0p-23, -0x800000.0p-37 },
> + { 0xad0000.0p-23, 0xf80000.0p-35 },
> + { 0xae0000.0p-23, 0xf80000.0p-34 },
> + { 0xaf0000.0p-23, -0xac0000.0p-33 },
> + { 0xb00000.0p-23, -0x800000.0p-33 },
> + { 0xb10000.0p-23, -0xb80000.0p-34 },
> + { 0xb20000.0p-23, -0x800000.0p-34 },
> + { 0xb30000.0p-23, -0xb00000.0p-35 },
> + { 0xb40000.0p-23, -0x800000.0p-35 },
> + { 0xb50000.0p-23, -0xe00000.0p-36 },
> + { 0xb60000.0p-23, -0x800000.0p-35 },
> + { 0xb70000.0p-23, -0xb00000.0p-35 },
> + { 0xb80000.0p-23, -0x800000.0p-34 },
> + { 0xb90000.0p-23, -0xb80000.0p-34 },
> + { 0xba0000.0p-23, -0x800000.0p-33 },
> + { 0xbb0000.0p-23, -0xac0000.0p-33 },
> + { 0xbc0000.0p-23, 0x980000.0p-33 },
> + { 0xbd0000.0p-23, 0xbc0000.0p-34 },
> + { 0xbe0000.0p-23, 0xe00000.0p-36 },
> + { 0xbf0000.0p-23, -0xb80000.0p-35 },
> + { 0xc00000.0p-23, -0x800000.0p-33 },
> + { 0xc10000.0p-23, 0xa80000.0p-33 },
> + { 0xc20000.0p-23, 0x900000.0p-34 },
> + { 0xc30000.0p-23, -0x800000.0p-35 },
> + { 0xc40000.0p-23, -0x900000.0p-33 },
> + { 0xc50000.0p-23, 0x820000.0p-33 },
> + { 0xc60000.0p-23, 0x800000.0p-38 },
> + { 0xc70000.0p-23, -0x820000.0p-33 },
> + { 0xc80000.0p-23, 0x800000.0p-33 },
> + { 0xc90000.0p-23, -0xa00000.0p-36 },
> + { 0xca0000.0p-23, -0xb00000.0p-33 },
> + { 0xcb0000.0p-23, 0x840000.0p-34 },
> + { 0xcc0000.0p-23, -0xd00000.0p-34 },
> + { 0xcd0000.0p-23, 0x800000.0p-33 },
> + { 0xce0000.0p-23, -0xe00000.0p-35 },
> + { 0xcf0000.0p-23, 0xa60000.0p-33 },
> + { 0xd00000.0p-23, -0x800000.0p-35 },
> + { 0xd10000.0p-23, 0xb40000.0p-33 },
> + { 0xd20000.0p-23, -0x800000.0p-35 },
> + { 0xd30000.0p-23, 0xaa0000.0p-33 },
> + { 0xd40000.0p-23, -0xe00000.0p-35 },
> + { 0xd50000.0p-23, 0x880000.0p-33 },
> + { 0xd60000.0p-23, -0xd00000.0p-34 },
> + { 0xd70000.0p-23, 0x9c0000.0p-34 },
> + { 0xd80000.0p-23, -0xb00000.0p-33 },
> + { 0xd90000.0p-23, -0x800000.0p-38 },
> + { 0xda0000.0p-23, 0xa40000.0p-33 },
> + { 0xdb0000.0p-23, -0xdc0000.0p-34 },
> + { 0xdc0000.0p-23, 0xc00000.0p-35 },
> + { 0xdd0000.0p-23, 0xca0000.0p-33 },
> + { 0xde0000.0p-23, -0xb80000.0p-34 },
> + { 0xdf0000.0p-23, 0xd00000.0p-35 },
> + { 0xe00000.0p-23, 0xc00000.0p-33 },
> + { 0xe10000.0p-23, -0xf40000.0p-34 },
> + { 0xe20000.0p-23, 0x800000.0p-37 },
> + { 0xe30000.0p-23, 0x860000.0p-33 },
> + { 0xe40000.0p-23, -0xc80000.0p-33 },
> + { 0xe50000.0p-23, -0xa80000.0p-34 },
> + { 0xe60000.0p-23, 0xe00000.0p-36 },
> + { 0xe70000.0p-23, 0x880000.0p-33 },
> + { 0xe80000.0p-23, -0xe00000.0p-33 },
> + { 0xe90000.0p-23, -0xfc0000.0p-34 },
> + { 0xea0000.0p-23, -0x800000.0p-35 },
> + { 0xeb0000.0p-23, 0xe80000.0p-35 },
> + { 0xec0000.0p-23, 0x900000.0p-33 },
> + { 0xed0000.0p-23, 0xe20000.0p-33 },
> + { 0xee0000.0p-23, -0xac0000.0p-33 },
> + { 0xef0000.0p-23, -0xc80000.0p-34 },
> + { 0xf00000.0p-23, -0x800000.0p-35 },
> + { 0xf10000.0p-23, 0x800000.0p-35 },
> + { 0xf20000.0p-23, 0xb80000.0p-34 },
> + { 0xf30000.0p-23, 0x940000.0p-33 },
> + { 0xf40000.0p-23, 0xc80000.0p-33 },
> + { 0xf50000.0p-23, -0xf20000.0p-33 },
> + { 0xf60000.0p-23, -0xc80000.0p-33 },
> + { 0xf70000.0p-23, -0xa20000.0p-33 },
> + { 0xf80000.0p-23, -0x800000.0p-33 },
> + { 0xf90000.0p-23, -0xc40000.0p-34 },
> + { 0xfa0000.0p-23, -0x900000.0p-34 },
> + { 0xfb0000.0p-23, -0xc80000.0p-35 },
> + { 0xfc0000.0p-23, -0x800000.0p-35 },
> + { 0xfd0000.0p-23, -0x900000.0p-36 },
> + { 0xfe0000.0p-23, -0x800000.0p-37 },
> + { 0xff0000.0p-23, -0x800000.0p-39 },
> + { 0x800000.0p-22, 0 },
> +};
> +#endif /* USE_UTAB */
> +
> +#ifdef STRUCT_RETURN
> +#define RETURN1(rp, v) do { \
> + (rp)->hi = (v); \
> + (rp)->lo_set = 0; \
> + return; \
> +} while (0)
> +
> +#define RETURN2(rp, h, l) do { \
> + (rp)->hi = (h); \
> + (rp)->lo = (l); \
> + (rp)->lo_set = 1; \
> + return; \
> +} while (0)
> +
> +struct ld {
> + long double hi;
> + long double lo;
> + int lo_set;
> +};
> +#else
> +#define RETURN1(rp, v) RETURNF(v)
> +#define RETURN2(rp, h, l) RETURNI((h) + (l))
> +#endif
> +
> +#ifdef STRUCT_RETURN
> +static inline __always_inline void
> +k_logl(long double x, struct ld *rp)
> +#else
> +long double
> +logl(long double x)
> +#endif
> +{
> + long double d, dk, val_hi, val_lo, z;
> + uint64_t ix, lx;
> + int i, k;
> + uint16_t hx;
> +
> + EXTRACT_LDBL80_WORDS(hx, lx, x);
> + k = -16383;
> +#if 0 /* Hard to do efficiently. Don't do it until we support all modes. */
> + if (x == 1)
> + RETURN1(rp, 0); /* log(1) = +0 in all rounding modes */
> +#endif
> + if (hx == 0 || hx >= 0x8000) { /* zero, negative or subnormal? */
> + if (((hx & 0x7fff) | lx) == 0)
> + RETURN1(rp, -1 / zero); /* log(+-0) = -Inf */
> + if (hx != 0)
> + /* log(neg or [pseudo-]NaN) = qNaN: */
> + RETURN1(rp, (x - x) / zero);
> + x *= 0x1.0p65; /* subnormal; scale up x */
> + /* including pseudo-subnormals */
> + EXTRACT_LDBL80_WORDS(hx, lx, x);
> + k = -16383 - 65;
> + } else if (hx >= 0x7fff || (lx & 0x8000000000000000ULL) == 0)
> + RETURN1(rp, x + x); /* log(Inf or NaN) = Inf or qNaN */
> + /* log(pseudo-Inf) = qNaN */
> + /* log(pseudo-NaN) = qNaN */
> + /* log(unnormal) = qNaN */
> +#ifndef STRUCT_RETURN
> + ENTERI();
> +#endif
> + k += hx;
> + ix = lx & 0x7fffffffffffffffULL;
> + dk = k;
> +
> + /* Scale x to be in [1, 2). */
> + SET_LDBL_EXPSIGN(x, 0x3fff);
> +
> + /* 0 <= i <= INTERVALS: */
> +#define L2I (64 - LOG2_INTERVALS)
> + i = (ix + (1LL << (L2I - 2))) >> (L2I - 1);
> +
> + /*
> + * -0.005280 < d < 0.004838. In particular, the infinite-
> + * precision |d| is <= 2**-7. Rounding of G(i) to 8 bits
> + * ensures that d is representable without extra precision for
> + * this bound on |d| (since when this calculation is expressed
> + * as x*G(i)-1, the multiplication needs as many extra bits as
> + * G(i) has and the subtraction cancels 8 bits). But for
> + * most i (107 cases out of 129), the infinite-precision |d|
> + * is <= 2**-8. G(i) is rounded to 9 bits for such i to give
> + * better accuracy (this works by improving the bound on |d|,
> + * which in turn allows rounding to 9 bits in more cases).
> + * This is only important when the original x is near 1 -- it
> + * lets us avoid using a special method to give the desired
> + * accuracy for such x.
> + */
> + if (0)
> + d = x * G(i) - 1;
> + else {
> +#ifdef USE_UTAB
> + d = (x - H(i)) * G(i) + E(i);
> +#else
> + long double x_hi, x_lo;
> + float fx_hi;
> +
> + /*
> + * Split x into x_hi + x_lo to calculate x*G(i)-1 exactly.
> + * G(i) has at most 9 bits, so the splitting point is not
> + * critical.
> + */
> + SET_FLOAT_WORD(fx_hi, (lx >> 40) | 0x3f800000);
> + x_hi = fx_hi;
> + x_lo = x - x_hi;
> + d = x_hi * G(i) - 1 + x_lo * G(i);
> +#endif
> + }
> +
> + /*
> + * Our algorithm depends on exact cancellation of F_lo(i) and
> + * F_hi(i) with dk*ln_2_lo and dk*ln2_hi when k is -1 and i is
> + * at the end of the table. This and other technical complications
> + * make it difficult to avoid the double scaling in (dk*ln2) *
> + * log(base) for base != e without losing more accuracy and/or
> + * efficiency than is gained.
> + */
> + z = d * d;
> + val_lo = z * d * z * (z * (d * P8 + P7) + (d * P6 + P5)) +
> + (F_lo(i) + dk * ln2_lo + z * d * (d * P4 + P3)) + z * P2;
> + val_hi = d;
> +#ifdef DEBUG
> + if (fetestexcept(FE_UNDERFLOW))
> + breakpoint();
> +#endif
> +
> + _3sumF(val_hi, val_lo, F_hi(i) + dk * ln2_hi);
> + RETURN2(rp, val_hi, val_lo);
> +}
> +
> +long double
> +log1pl(long double x)
> +{
> + long double d, d_hi, d_lo, dk, f_lo, val_hi, val_lo, z;
> + long double f_hi, twopminusk;
> + uint64_t ix, lx;
> + int i, k;
> + int16_t ax, hx;
> +
> + DOPRINT_START(&x);
> + EXTRACT_LDBL80_WORDS(hx, lx, x);
> + if (hx < 0x3fff) { /* x < 1, or x neg NaN */
> + ax = hx & 0x7fff;
> + if (ax >= 0x3fff) { /* x <= -1, or x neg NaN */
> + if (ax == 0x3fff && lx == 0x8000000000000000ULL)
> + RETURNP(-1 / zero); /* log1p(-1) = -Inf */
> + /* log1p(x < 1, or x [pseudo-]NaN) = qNaN: */
> + RETURNP((x - x) / (x - x));
> + }
> + if (ax <= 0x3fbe) { /* |x| < 2**-64 */
> + if ((int)x == 0)
> + RETURNP(x); /* x with inexact if x != 0 */
> + }
> + f_hi = 1;
> + f_lo = x;
> + } else if (hx >= 0x7fff) { /* x +Inf or non-neg NaN */
> + RETURNP(x + x); /* log1p(Inf or NaN) = Inf or qNaN */
> + /* log1p(pseudo-Inf) = qNaN */
> + /* log1p(pseudo-NaN) = qNaN */
> + /* log1p(unnormal) = qNaN */
> + } else if (hx < 0x407f) { /* 1 <= x < 2**128 */
> + f_hi = x;
> + f_lo = 1;
> + } else { /* 2**128 <= x < +Inf */
> + f_hi = x;
> + f_lo = 0; /* avoid underflow of the P5 term */
> + }
> + ENTERI();
> + x = f_hi + f_lo;
> + f_lo = (f_hi - x) + f_lo;
> +
> + EXTRACT_LDBL80_WORDS(hx, lx, x);
> + k = -16383;
> +
> + k += hx;
> + ix = lx & 0x7fffffffffffffffULL;
> + dk = k;
> +
> + SET_LDBL_EXPSIGN(x, 0x3fff);
> + twopminusk = 1;
> + SET_LDBL_EXPSIGN(twopminusk, 0x7ffe - (hx & 0x7fff));
> + f_lo *= twopminusk;
> +
> + i = (ix + (1LL << (L2I - 2))) >> (L2I - 1);
> +
> + /*
> + * x*G(i)-1 (with a reduced x) can be represented exactly, as
> + * above, but now we need to evaluate the polynomial on d =
> + * (x+f_lo)*G(i)-1 and extra precision is needed for that.
> + * Since x+x_lo is a hi+lo decomposition and subtracting 1
> + * doesn't lose too many bits, an inexact calculation for
> + * f_lo*G(i) is good enough.
> + */
> + if (0)
> + d_hi = x * G(i) - 1;
> + else {
> +#ifdef USE_UTAB
> + d_hi = (x - H(i)) * G(i) + E(i);
> +#else
> + long double x_hi, x_lo;
> + float fx_hi;
> +
> + SET_FLOAT_WORD(fx_hi, (lx >> 40) | 0x3f800000);
> + x_hi = fx_hi;
> + x_lo = x - x_hi;
> + d_hi = x_hi * G(i) - 1 + x_lo * G(i);
> +#endif
> + }
> + d_lo = f_lo * G(i);
> +
> + /*
> + * This is _2sumF(d_hi, d_lo) inlined. The condition
> + * (d_hi == 0 || |d_hi| >= |d_lo|) for using _2sumF() is not
> + * always satisifed, so it is not clear that this works, but
> + * it works in practice. It works even if it gives a wrong
> + * normalized d_lo, since |d_lo| > |d_hi| implies that i is
> + * nonzero and d is tiny, so the F(i) term dominates d_lo.
> + * In float precision:
> + * (By exhaustive testing, the worst case is d_hi = 0x1.bp-25.
> + * And if d is only a little tinier than that, we would have
> + * another underflow problem for the P3 term; this is also ruled
> + * out by exhaustive testing.)
> + */
> + d = d_hi + d_lo;
> + d_lo = d_hi - d + d_lo;
> + d_hi = d;
> +
> + z = d * d;
> + val_lo = z * d * z * (z * (d * P8 + P7) + (d * P6 + P5)) +
> + (F_lo(i) + dk * ln2_lo + d_lo + z * d * (d * P4 + P3)) + z * P2;
> + val_hi = d_hi;
> +#ifdef DEBUG
> + if (fetestexcept(FE_UNDERFLOW))
> + breakpoint();
> +#endif
> +
> + _3sumF(val_hi, val_lo, F_hi(i) + dk * ln2_hi);
> + RETURN2PI(val_hi, val_lo);
> +}
> +
> +#ifdef STRUCT_RETURN
> +
> +long double
> +logl(long double x)
> +{
> + struct ld r;
> +
> + ENTERI();
> + DOPRINT_START(&x);
> + k_logl(x, &r);
> + RETURNSPI(&r);
> +}
> +
> +/* Use macros since GCC < 8 rejects static const expressions in initializers. */
> +#define invln10_hi 4.3429448190317999e-1 /* 0x1bcb7b1526e000.0p-54 */
> +#define invln10_lo 7.1842412889749798e-14 /* 0x1438ca9aadd558.0p-96 */
> +#define invln2_hi 1.4426950408887933e0 /* 0x171547652b8000.0p-52 */
> +#define invln2_lo 1.7010652264631490e-13 /* 0x17f0bbbe87fed0.0p-95 */
> +/* Let the compiler pre-calculate this sum to avoid FE_INEXACT at run time. */
> +static const double invln10_lo_plus_hi = invln10_lo + invln10_hi;
> +static const double invln2_lo_plus_hi = invln2_lo + invln2_hi;
> +
> +long double
> +log10l(long double x)
> +{
> + struct ld r;
> + long double hi, lo;
> +
> + ENTERI();
> + DOPRINT_START(&x);
> + k_logl(x, &r);
> + if (!r.lo_set)
> + RETURNPI(r.hi);
> + _2sumF(r.hi, r.lo);
> + hi = (float)r.hi;
> + lo = r.lo + (r.hi - hi);
> + RETURN2PI(invln10_hi * hi,
> + invln10_lo_plus_hi * lo + invln10_lo * hi);
> +}
> +
> +long double
> +log2l(long double x)
> +{
> + struct ld r;
> + long double hi, lo;
> +
> + ENTERI();
> + DOPRINT_START(&x);
> + k_logl(x, &r);
> + if (!r.lo_set)
> + RETURNPI(r.hi);
> + _2sumF(r.hi, r.lo);
> + hi = (float)r.hi;
> + lo = r.lo + (r.hi - hi);
> + RETURN2PI(invln2_hi * hi,
> + invln2_lo_plus_hi * lo + invln2_lo * hi);
> +}
> +
> +#endif /* STRUCT_RETURN */
> diff --git a/newlib/libm/ld80/s_sinpil.c b/newlib/libm/ld80/s_sinpil.c
> new file mode 100644
> index 000000000..4cefa9235
> --- /dev/null
> +++ b/newlib/libm/ld80/s_sinpil.c
> @@ -0,0 +1,140 @@
> +/*-
> + * Copyright (c) 2017 Steven G. Kargl
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice unmodified, this list of conditions, and the following
> + * disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
> + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
> + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
> + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
> + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
> + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
> + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +/*
> + * See ../src/s_sinpi.c for implementation details.
> + */
> +
> +#ifdef __i386__
> +#include <ieeefp.h>
> +#endif
> +#include <stdint.h>
> +
> +#include "fpmath.h"
> +#include "math.h"
> +#include "math_private.h"
> +
> +static const union IEEEl2bits
> +pi_hi_u = LD80C(0xc90fdaa200000000, 1, 3.14159265346825122833e+00L),
> +pi_lo_u = LD80C(0x85a308d313198a2e, -33, 1.21542010130123852029e-10L);
> +#define pi_hi (pi_hi_u.e)
> +#define pi_lo (pi_lo_u.e)
> +
> +#include "k_cospil.h"
> +#include "k_sinpil.h"
> +
> +volatile static const double vzero = 0;
> +
> +long double
> +sinpil(long double x)
> +{
> + long double ax, hi, lo, s;
> + uint64_t lx, m;
> + uint32_t j0;
> + uint16_t hx, ix;
> +
> + EXTRACT_LDBL80_WORDS(hx, lx, x);
> + ix = hx & 0x7fff;
> + INSERT_LDBL80_WORDS(ax, ix, lx);
> +
> + ENTERI();
> +
> + if (ix < 0x3fff) { /* |x| < 1 */
> + if (ix < 0x3ffd) { /* |x| < 0.25 */
> + if (ix < 0x3fdd) { /* |x| < 0x1p-34 */
> + if (x == 0)
> + RETURNI(x);
> + INSERT_LDBL80_WORDS(hi, hx,
> + lx & 0xffffffff00000000ull);
> + hi *= 0x1p63L;
> + lo = x * 0x1p63L - hi;
> + s = (pi_lo + pi_hi) * lo + pi_lo * hi +
> + pi_hi * hi;
> + RETURNI(s * 0x1p-63L);
> + }
> + s = __kernel_sinpil(ax);
> + RETURNI((hx & 0x8000) ? -s : s);
> + }
> +
> + if (ix < 0x3ffe) /* |x| < 0.5 */
> + s = __kernel_cospil(0.5 - ax);
> + else if (lx < 0xc000000000000000ull) /* |x| < 0.75 */
> + s = __kernel_cospil(ax - 0.5);
> + else
> + s = __kernel_sinpil(1 - ax);
> + RETURNI((hx & 0x8000) ? -s : s);
> + }
> +
> + if (ix < 0x403e) { /* 1 <= |x| < 0x1p63 */
> + /* Determine integer part of ax. */
> + j0 = ix - 0x3fff + 1;
> + if (j0 < 32) {
> + lx = (lx >> 32) << 32;
> + lx &= ~(((lx << 32)-1) >> j0);
> + } else {
> + m = (uint64_t)-1 >> (j0 + 1);
> + if (lx & m) lx &= ~m;
> + }
> + INSERT_LDBL80_WORDS(x, ix, lx);
> +
> + ax -= x;
> + EXTRACT_LDBL80_WORDS(ix, lx, ax);
> +
> + if (ix == 0) {
> + s = 0;
> + } else {
> + if (ix < 0x3ffe) { /* |x| < 0.5 */
> + if (ix < 0x3ffd) /* |x| < 0.25 */
> + s = __kernel_sinpil(ax);
> + else
> + s = __kernel_cospil(0.5 - ax);
> + } else {
> + /* |x| < 0.75 */
> + if (lx < 0xc000000000000000ull)
> + s = __kernel_cospil(ax - 0.5);
> + else
> + s = __kernel_sinpil(1 - ax);
> + }
> +
> + if (j0 > 40)
> + x -= 0x1p40;
> + if (j0 > 30)
> + x -= 0x1p30;
> + j0 = (uint32_t)x;
> + if (j0 & 1) s = -s;
> + }
> + RETURNI((hx & 0x8000) ? -s : s);
> + }
> +
> + /* x = +-inf or nan. */
> + if (ix >= 0x7fff)
> + RETURNI(vzero / vzero);
> +
> + /*
> + * |x| >= 0x1p63 is always an integer, so return +-0.
> + */
> + RETURNI(copysignl(0, x));
> +}
> --
> 2.31.1
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 1/3] newlib: Add FreeBSD files for non LDBL_EQ_DBL support
2023-04-20 21:23 ` [PATCH v2 1/3] newlib: Add FreeBSD files for non LDBL_EQ_DBL support Jennifer Averett
2023-04-24 8:51 ` Corinna Vinschen
@ 2023-04-24 13:03 ` Sebastian Huber
2023-04-27 11:46 ` Jennifer Averett
1 sibling, 1 reply; 9+ messages in thread
From: Sebastian Huber @ 2023-04-24 13:03 UTC (permalink / raw)
To: Jennifer Averett, newlib
On 20.04.23 23:23, Jennifer Averett wrote:
> +static __inline uint32_t
> +le32dec(const void *pp)
> +{
> + uint8_t const *p = (uint8_t const *)pp;
> +
> + return (((unsigned)p[3] << 24) | (p[2] << 16) | (p[1] << 8) | p[0]);
> +}
The <sys/endian.h> from RTEMS has some fixes for 16-bit targets.
--
embedded brains GmbH
Herr Sebastian HUBER
Dornierstr. 4
82178 Puchheim
Germany
email: sebastian.huber@embedded-brains.de
phone: +49-89-18 94 741 - 16
fax: +49-89-18 94 741 - 08
Registergericht: Amtsgericht München
Registernummer: HRB 157899
Vertretungsberechtigte Geschäftsführer: Peter Rasmussen, Thomas Dörfler
Unsere Datenschutzerklärung finden Sie hier:
https://embedded-brains.de/datenschutzerklaerung/
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 1/3] newlib: Add FreeBSD files for non LDBL_EQ_DBL support
2023-04-24 13:03 ` Sebastian Huber
@ 2023-04-27 11:46 ` Jennifer Averett
2023-04-27 11:49 ` Sebastian Huber
0 siblings, 1 reply; 9+ messages in thread
From: Jennifer Averett @ 2023-04-27 11:46 UTC (permalink / raw)
To: Sebastian Huber, newlib
I'll use the <sys/endian.h> file from RTEMS in patch 1. Patch v2- 2/3 moved <sys/endian.h> to
<endian.h> per Corinna's request. Talking with Joel, we may need to revert that change
and leave it as <sys/endian.h>.
Thanks
Jennifer
________________________________________
From: Sebastian Huber <sebastian.huber@embedded-brains.de>
Sent: Monday, April 24, 2023 8:03 AM
To: Jennifer Averett; newlib@sourceware.org
Subject: Re: [PATCH v2 1/3] newlib: Add FreeBSD files for non LDBL_EQ_DBL support
On 20.04.23 23:23, Jennifer Averett wrote:
> +static __inline uint32_t
> +le32dec(const void *pp)
> +{
> + uint8_t const *p = (uint8_t const *)pp;
> +
> + return (((unsigned)p[3] << 24) | (p[2] << 16) | (p[1] << 8) | p[0]);
> +}
The <sys/endian.h> from RTEMS has some fixes for 16-bit targets.
--
embedded brains GmbH
Herr Sebastian HUBER
Dornierstr. 4
82178 Puchheim
Germany
email: sebastian.huber@embedded-brains.de
phone: +49-89-18 94 741 - 16
fax: +49-89-18 94 741 - 08
Registergericht: Amtsgericht München
Registernummer: HRB 157899
Vertretungsberechtigte Geschäftsführer: Peter Rasmussen, Thomas Dörfler
Unsere Datenschutzerklärung finden Sie hier:
https://embedded-brains.de/datenschutzerklaerung/
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 1/3] newlib: Add FreeBSD files for non LDBL_EQ_DBL support
2023-04-27 11:46 ` Jennifer Averett
@ 2023-04-27 11:49 ` Sebastian Huber
0 siblings, 0 replies; 9+ messages in thread
From: Sebastian Huber @ 2023-04-27 11:49 UTC (permalink / raw)
To: Jennifer Averett, newlib
On 27/04/2023 13:46, Jennifer Averett wrote:
> I'll use the <sys/endian.h> file from RTEMS in patch 1. Patch v2- 2/3 moved <sys/endian.h> to
> <endian.h> per Corinna's request. Talking with Joel, we may need to revert that change
> and leave it as <sys/endian.h>.
We have a <sys/endian.h> in RTEMS which is based on the FreeBSD
<sys/endian.h>. It was slightly modified to also work on 16-bit targets.
We definitely have to keep these interfaces for RTEMS otherwise libbsd
for example will no longer work.
--
embedded brains GmbH
Herr Sebastian HUBER
Dornierstr. 4
82178 Puchheim
Germany
email: sebastian.huber@embedded-brains.de
phone: +49-89-18 94 741 - 16
fax: +49-89-18 94 741 - 08
Registergericht: Amtsgericht München
Registernummer: HRB 157899
Vertretungsberechtigte Geschäftsführer: Peter Rasmussen, Thomas Dörfler
Unsere Datenschutzerklärung finden Sie hier:
https://embedded-brains.de/datenschutzerklaerung/
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2023-04-27 11:49 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-04-20 21:23 [PATCH v2 0/3] Add math support for non LDBL_EQ_DBL architecture Jennifer Averett
2023-04-20 21:23 ` [PATCH v2 1/3] newlib: Add FreeBSD files for non LDBL_EQ_DBL support Jennifer Averett
2023-04-24 8:51 ` Corinna Vinschen
2023-04-24 12:47 ` Jennifer Averett
2023-04-24 13:03 ` Sebastian Huber
2023-04-27 11:46 ` Jennifer Averett
2023-04-27 11:49 ` Sebastian Huber
2023-04-20 21:23 ` [PATCH v2 2/3] newlib: Add non LDBL_EQ_DBL math support for aarch64, i386, and x86_64 Jennifer Averett
2023-04-20 21:23 ` [PATCH v2 3/3] Regenerated source for adding non LDBL_EQ_DBL Jennifer Averett
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).