[glibc] math: Fix inaccurate sin/cos/tan for large arguments (BZ 34376)

Adhemerval Zanella via Glibc-cvs <[email protected]> Fri, 17 Jul 2026 14:23:33 +0000 (GMT)
Newsgroups gmane.comp.lib.glibc.cvs
Message-ID <[email protected]>
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=5c47592adb388365312451e361eaedfa32d98d5b

commit 5c47592adb388365312451e361eaedfa32d98d5b
Author: Adhemerval Zanella <[email protected]>
Date:   Thu Jul 16 18:21:20 2026 -0300

    math: Fix inaccurate sin/cos/tan for large arguments (BZ 34376)
    
    The Payne-Hanek range reducer __branred delivers the reduced argument
    as a double-double with only about 93 significant bits.  For arguments
    extremely close to a multiple of pi/2 the true reduced argument can be
    as small as 2^-61, so most of those bits cancel and sin/cos/tan can be
    wrong by up to ~143000 ulp.  This inaccuracy used to be handled by the
    multiple-precision slow paths, which was removed by commit
    649095838b8 ("sin/cos slow paths: remove slow paths from huge range
    reduction") and commit 476d692e8a8 ("math: Remove slow paths in tan
    [BZ #15267]").
    
    Restore the e_rem_pio2.c (removed as unused by commit ca3aac57efa
    "Remove unused math files") and use __ieee754_rem_pio2 for
    the huge-argument reduction instead of __branred, which is removed.
    
    It also does not depend on precise IEEE double rounding, so the nofma
    and vector-width workarounds for branred.c are no longer needed.
    
    The file is restored trimmed to its huge-argument path, the callers
    reduce smaller arguments themselves and handle non-finite inputs, so
    only 1e8 < |x| < 2^1024 reaches __ieee754_rem_pio2.
    
    Checked on x86_64-linux-gnu, aarch64-linux-gnu, armv7a-linux-gnueabihf,
    and i686-linux-gnu.
    
    Reviewed-by: Carlos O'Donell <[email protected]>

Diff:
---
 math/Makefile                        |   2 +-
 math/auto-libm-test-in               |  17 +++
 math/auto-libm-test-out-cos          | 252 +++++++++++++++++++++++++++++++++++
 math/auto-libm-test-out-sin          | 228 +++++++++++++++++++++++++++++++
 math/auto-libm-test-out-tan          | 183 +++++++++++++++++++++++++
 sysdeps/generic/math_private.h       |   1 -
 sysdeps/ieee754/dbl-64/Makefile      |   2 -
 sysdeps/ieee754/dbl-64/branred.c     | 143 --------------------
 sysdeps/ieee754/dbl-64/branred.h     |  79 -----------
 sysdeps/ieee754/dbl-64/e_rem_pio2.c  |  76 +++++++++++
 sysdeps/ieee754/dbl-64/s_sin.c       |  14 +-
 sysdeps/ieee754/dbl-64/s_sincos.c    |  10 +-
 sysdeps/ieee754/dbl-64/s_tan.c       |  11 +-
 sysdeps/m68k/m680x0/fpu/e_rem_pio2.c |   1 +
 sysdeps/x86_64/fpu/Makefile          |  12 --
 15 files changed, 780 insertions(+), 251 deletions(-)

diff --git a/math/Makefile b/math/Makefile
index 7a9352c2cd..5b48e53300 100644
--- a/math/Makefile
+++ b/math/Makefile
@@ -358,13 +358,13 @@ type-ldouble-yes := ldouble
 # double support
 type-double-suffix :=
 type-double-routines := \
-  branred \
   e_cosh_data \
   e_coshsinh_data \
   e_exp_data \
   e_log2_data \
   e_log_data \
   e_pow_log_data \
+  e_rem_pio2 \
   e_sinh_data \
   e_tanh_data \
   k_rem_pio2 \
diff --git a/math/auto-libm-test-in b/math/auto-libm-test-in
index c2c57523e4..73737235de 100644
--- a/math/auto-libm-test-in
+++ b/math/auto-libm-test-in
@@ -5061,6 +5061,12 @@ cos -1.57079697
 cos 0x2.3c6ef4p-12
 # the next value generates larger error bounds on x86_64 (binary128)
 cos 0xe.6672d458b05edf50af4fab1a42p+40
+# Large arguments close to a multiple of pi/2, stressing the range reducer
+# (bug 34376).
+cos 0x1.69eab0985179bp+246
+cos 0x1.8577cec54ab8p+47
+cos 0x1.dbd58768f97p+45
+cos 0x1.0e826ceb0c5cp+46
 
 cospi 0
 cospi -0
@@ -9491,6 +9497,12 @@ sin 0x1.d12ed2p-12
 sin -0x6.e2368c006c018228p+16
 # the next value generates larger error bounds on x86_64 (binary128)
 sin 0x5.6a5005df4363833413fa44f74ae8p+64
+# Large arguments close to a multiple of pi/2, stressing the range reducer
+# (bug 34376).
+sin 0x1.4c96c11134d36p+578
+sin 0x1.69eab0985179bp+246
+sin 0x1.2419db13f80ap+50
+sin 0x1.0e826ceb0c5cp+47
 sin max
 sin -max
 sin min
@@ -10007,6 +10019,11 @@ tan 0x1p-60
 tan 0x1p-100
 tan 0x1p-600
 tan 0x1p-10000
+# Large arguments close to a multiple of pi/2, stressing the range reducer
+# (bug 34376).
+tan 0x1.69eab0985179bp+246
+tan 0x1.8577cec54ab8p+47
+tan 0x1.dbd58768f97p+45
 tan max
 tan -max
 tan min
diff --git a/math/auto-libm-test-out-cos b/math/auto-libm-test-out-cos
index 795a6eb447..eee17d057c 100644
--- a/math/auto-libm-test-out-cos
+++ b/math/auto-libm-test-out-cos
@@ -3389,3 +3389,255 @@ cos 0xe.6672d458b05edf50af4fab1a42p+40
 = cos tonearest ibm128 0xe.6672d458b05edf50af4fab1a4p+40 : 0x1.ff56b710bf1d3d367f604dfafap-4 : inexact-ok
 = cos towardzero ibm128 0xe.6672d458b05edf50af4fab1a4p+40 : 0x1.ff56b710bf1d3d367f604dfafap-4 : inexact-ok
 = cos upward ibm128 0xe.6672d458b05edf50af4fab1a4p+40 : 0x1.ff56b710bf1d3d367f604dfafa8p-4 : inexact-ok
+cos 0x1.69eab0985179bp+246
+= cos downward binary32 0xf.fffffp+124 : 0xd.a5f96p-4 : inexact-ok
+= cos tonearest binary32 0xf.fffffp+124 : 0xd.a5f96p-4 : inexact-ok
+= cos towardzero binary32 0xf.fffffp+124 : 0xd.a5f96p-4 : inexact-ok
+= cos upward binary32 0xf.fffffp+124 : 0xd.a5f97p-4 : inexact-ok
+= cos downward binary64 0xf.fffffp+124 : 0xd.a5f963cdefe68p-4 : inexact-ok
+= cos tonearest binary64 0xf.fffffp+124 : 0xd.a5f963cdefe7p-4 : inexact-ok
+= cos towardzero binary64 0xf.fffffp+124 : 0xd.a5f963cdefe68p-4 : inexact-ok
+= cos upward binary64 0xf.fffffp+124 : 0xd.a5f963cdefe7p-4 : inexact-ok
+= cos downward intel96 0xf.fffffp+124 : 0xd.a5f963cdefe6d52p-4 : inexact-ok
+= cos tonearest intel96 0xf.fffffp+124 : 0xd.a5f963cdefe6d53p-4 : inexact-ok
+= cos towardzero intel96 0xf.fffffp+124 : 0xd.a5f963cdefe6d52p-4 : inexact-ok
+= cos upward intel96 0xf.fffffp+124 : 0xd.a5f963cdefe6d53p-4 : inexact-ok
+= cos downward m68k96 0xf.fffffp+124 : 0xd.a5f963cdefe6d52p-4 : inexact-ok
+= cos tonearest m68k96 0xf.fffffp+124 : 0xd.a5f963cdefe6d53p-4 : inexact-ok
+= cos towardzero m68k96 0xf.fffffp+124 : 0xd.a5f963cdefe6d52p-4 : inexact-ok
+= cos upward m68k96 0xf.fffffp+124 : 0xd.a5f963cdefe6d53p-4 : inexact-ok
+= cos downward binary128 0xf.fffffp+124 : 0xd.a5f963cdefe6d529f6b6009fb2fp-4 : inexact-ok
+= cos tonearest binary128 0xf.fffffp+124 : 0xd.a5f963cdefe6d529f6b6009fb2fp-4 : inexact-ok
+= cos towardzero binary128 0xf.fffffp+124 : 0xd.a5f963cdefe6d529f6b6009fb2fp-4 : inexact-ok
+= cos upward binary128 0xf.fffffp+124 : 0xd.a5f963cdefe6d529f6b6009fb2f8p-4 : inexact-ok
+= cos downward ibm128 0xf.fffffp+124 : 0xd.a5f963cdefe6d529f6b6009fbp-4 : inexact-ok
+= cos tonearest ibm128 0xf.fffffp+124 : 0xd.a5f963cdefe6d529f6b6009fb4p-4 : inexact-ok
+= cos towardzero ibm128 0xf.fffffp+124 : 0xd.a5f963cdefe6d529f6b6009fbp-4 : inexact-ok
+= cos upward ibm128 0xf.fffffp+124 : 0xd.a5f963cdefe6d529f6b6009fb4p-4 : inexact-ok
+= cos downward binary64 0x5.a7aac26145e6cp+244 : -0x5.87b3b2715dff8p-60 : inexact-ok
+= cos tonearest binary64 0x5.a7aac26145e6cp+244 : -0x5.87b3b2715dff4p-60 : inexact-ok
+= cos towardzero binary64 0x5.a7aac26145e6cp+244 : -0x5.87b3b2715dff4p-60 : inexact-ok
+= cos upward binary64 0x5.a7aac26145e6cp+244 : -0x5.87b3b2715dff4p-60 : inexact-ok
+= cos downward intel96 0x5.a7aac26145e6cp+244 : -0x5.87b3b2715dff4fa8p-60 : inexact-ok
+= cos tonearest intel96 0x5.a7aac26145e6cp+244 : -0x5.87b3b2715dff4fa8p-60 : inexact-ok
+= cos towardzero intel96 0x5.a7aac26145e6cp+244 : -0x5.87b3b2715dff4fap-60 : inexact-ok
+= cos upward intel96 0x5.a7aac26145e6cp+244 : -0x5.87b3b2715dff4fap-60 : inexact-ok
+= cos downward m68k96 0x5.a7aac26145e6cp+244 : -0x5.87b3b2715dff4fa8p-60 : inexact-ok
+= cos tonearest m68k96 0x5.a7aac26145e6cp+244 : -0x5.87b3b2715dff4fa8p-60 : inexact-ok
+= cos towardzero m68k96 0x5.a7aac26145e6cp+244 : -0x5.87b3b2715dff4fap-60 : inexact-ok
+= cos upward m68k96 0x5.a7aac26145e6cp+244 : -0x5.87b3b2715dff4fap-60 : inexact-ok
+= cos downward binary128 0x5.a7aac26145e6cp+244 : -0x5.87b3b2715dff4fa463303df54c08p-60 : inexact-ok
+= cos tonearest binary128 0x5.a7aac26145e6cp+244 : -0x5.87b3b2715dff4fa463303df54c08p-60 : inexact-ok
+= cos towardzero binary128 0x5.a7aac26145e6cp+244 : -0x5.87b3b2715dff4fa463303df54c04p-60 : inexact-ok
+= cos upward binary128 0x5.a7aac26145e6cp+244 : -0x5.87b3b2715dff4fa463303df54c04p-60 : inexact-ok
+= cos downward ibm128 0x5.a7aac26145e6cp+244 : -0x5.87b3b2715dff4fa463303df54ep-60 : inexact-ok
+= cos tonearest ibm128 0x5.a7aac26145e6cp+244 : -0x5.87b3b2715dff4fa463303df54cp-60 : inexact-ok
+= cos towardzero ibm128 0x5.a7aac26145e6cp+244 : -0x5.87b3b2715dff4fa463303df54cp-60 : inexact-ok
+= cos upward ibm128 0x5.a7aac26145e6cp+244 : -0x5.87b3b2715dff4fa463303df54cp-60 : inexact-ok
+cos 0x1.8577cec54ab8p+47
+= cos downward binary32 0xc.2bbe8p+44 : -0x6.99b478p-4 : inexact-ok
+= cos tonearest binary32 0xc.2bbe8p+44 : -0x6.99b47p-4 : inexact-ok
+= cos towardzero binary32 0xc.2bbe8p+44 : -0x6.99b47p-4 : inexact-ok
+= cos upward binary32 0xc.2bbe8p+44 : -0x6.99b47p-4 : inexact-ok
+= cos downward binary64 0xc.2bbe8p+44 : -0x6.99b47311dbff4p-4 : inexact-ok
+= cos tonearest binary64 0xc.2bbe8p+44 : -0x6.99b47311dbff4p-4 : inexact-ok
+= cos towardzero binary64 0xc.2bbe8p+44 : -0x6.99b47311dbffp-4 : inexact-ok
+= cos upward binary64 0xc.2bbe8p+44 : -0x6.99b47311dbffp-4 : inexact-ok
+= cos downward intel96 0xc.2bbe8p+44 : -0x6.99b47311dbff313p-4 : inexact-ok
+= cos tonearest intel96 0xc.2bbe8p+44 : -0x6.99b47311dbff3128p-4 : inexact-ok
+= cos towardzero intel96 0xc.2bbe8p+44 : -0x6.99b47311dbff3128p-4 : inexact-ok
+= cos upward intel96 0xc.2bbe8p+44 : -0x6.99b47311dbff3128p-4 : inexact-ok
+= cos downward m68k96 0xc.2bbe8p+44 : -0x6.99b47311dbff313p-4 : inexact-ok
+= cos tonearest m68k96 0xc.2bbe8p+44 : -0x6.99b47311dbff3128p-4 : inexact-ok
+= cos towardzero m68k96 0xc.2bbe8p+44 : -0x6.99b47311dbff3128p-4 : inexact-ok
+= cos upward m68k96 0xc.2bbe8p+44 : -0x6.99b47311dbff3128p-4 : inexact-ok
+= cos downward binary128 0xc.2bbe8p+44 : -0x6.99b47311dbff3129fdf4b31b70ecp-4 : inexact-ok
+= cos tonearest binary128 0xc.2bbe8p+44 : -0x6.99b47311dbff3129fdf4b31b70e8p-4 : inexact-ok
+= cos towardzero binary128 0xc.2bbe8p+44 : -0x6.99b47311dbff3129fdf4b31b70e8p-4 : inexact-ok
+= cos upward binary128 0xc.2bbe8p+44 : -0x6.99b47311dbff3129fdf4b31b70e8p-4 : inexact-ok
+= cos downward ibm128 0xc.2bbe8p+44 : -0x6.99b47311dbff3129fdf4b31b72p-4 : inexact-ok
+= cos tonearest ibm128 0xc.2bbe8p+44 : -0x6.99b47311dbff3129fdf4b31b7p-4 : inexact-ok
+= cos towardzero ibm128 0xc.2bbe8p+44 : -0x6.99b47311dbff3129fdf4b31b7p-4 : inexact-ok
+= cos upward ibm128 0xc.2bbe8p+44 : -0x6.99b47311dbff3129fdf4b31b7p-4 : inexact-ok
+= cos downward binary32 0xc.2bbe7p+44 : 0x7.3a6f2p-4 : inexact-ok
+= cos tonearest binary32 0xc.2bbe7p+44 : 0x7.3a6f2p-4 : inexact-ok
+= cos towardzero binary32 0xc.2bbe7p+44 : 0x7.3a6f2p-4 : inexact-ok
+= cos upward binary32 0xc.2bbe7p+44 : 0x7.3a6f28p-4 : inexact-ok
+= cos downward binary64 0xc.2bbe7p+44 : 0x7.3a6f2368ae644p-4 : inexact-ok
+= cos tonearest binary64 0xc.2bbe7p+44 : 0x7.3a6f2368ae644p-4 : inexact-ok
+= cos towardzero binary64 0xc.2bbe7p+44 : 0x7.3a6f2368ae644p-4 : inexact-ok
+= cos upward binary64 0xc.2bbe7p+44 : 0x7.3a6f2368ae648p-4 : inexact-ok
+= cos downward intel96 0xc.2bbe7p+44 : 0x7.3a6f2368ae644188p-4 : inexact-ok
+= cos tonearest intel96 0xc.2bbe7p+44 : 0x7.3a6f2368ae64419p-4 : inexact-ok
+= cos towardzero intel96 0xc.2bbe7p+44 : 0x7.3a6f2368ae644188p-4 : inexact-ok
+= cos upward intel96 0xc.2bbe7p+44 : 0x7.3a6f2368ae64419p-4 : inexact-ok
+= cos downward m68k96 0xc.2bbe7p+44 : 0x7.3a6f2368ae644188p-4 : inexact-ok
+= cos tonearest m68k96 0xc.2bbe7p+44 : 0x7.3a6f2368ae64419p-4 : inexact-ok
+= cos towardzero m68k96 0xc.2bbe7p+44 : 0x7.3a6f2368ae644188p-4 : inexact-ok
+= cos upward m68k96 0xc.2bbe7p+44 : 0x7.3a6f2368ae64419p-4 : inexact-ok
+= cos downward binary128 0xc.2bbe7p+44 : 0x7.3a6f2368ae64418f79c248be99ccp-4 : inexact-ok
+= cos tonearest binary128 0xc.2bbe7p+44 : 0x7.3a6f2368ae64418f79c248be99ccp-4 : inexact-ok
+= cos towardzero binary128 0xc.2bbe7p+44 : 0x7.3a6f2368ae64418f79c248be99ccp-4 : inexact-ok
+= cos upward binary128 0xc.2bbe7p+44 : 0x7.3a6f2368ae64418f79c248be99dp-4 : inexact-ok
+= cos downward ibm128 0xc.2bbe7p+44 : 0x7.3a6f2368ae64418f79c248be98p-4 : inexact-ok
+= cos tonearest ibm128 0xc.2bbe7p+44 : 0x7.3a6f2368ae64418f79c248be9ap-4 : inexact-ok
+= cos towardzero ibm128 0xc.2bbe7p+44 : 0x7.3a6f2368ae64418f79c248be98p-4 : inexact-ok
+= cos upward ibm128 0xc.2bbe7p+44 : 0x7.3a6f2368ae64418f79c248be9ap-4 : inexact-ok
+= cos downward binary64 0xc.2bbe762a55cp+44 : 0x1.2b04a1af8c362p-52 : inexact-ok
+= cos tonearest binary64 0xc.2bbe762a55cp+44 : 0x1.2b04a1af8c362p-52 : inexact-ok
+= cos towardzero binary64 0xc.2bbe762a55cp+44 : 0x1.2b04a1af8c362p-52 : inexact-ok
+= cos upward binary64 0xc.2bbe762a55cp+44 : 0x1.2b04a1af8c363p-52 : inexact-ok
+= cos downward intel96 0xc.2bbe762a55cp+44 : 0x1.2b04a1af8c36204cp-52 : inexact-ok
+= cos tonearest intel96 0xc.2bbe762a55cp+44 : 0x1.2b04a1af8c36204cp-52 : inexact-ok
+= cos towardzero intel96 0xc.2bbe762a55cp+44 : 0x1.2b04a1af8c36204cp-52 : inexact-ok
+= cos upward intel96 0xc.2bbe762a55cp+44 : 0x1.2b04a1af8c36204ep-52 : inexact-ok
+= cos downward m68k96 0xc.2bbe762a55cp+44 : 0x1.2b04a1af8c36204cp-52 : inexact-ok
+= cos tonearest m68k96 0xc.2bbe762a55cp+44 : 0x1.2b04a1af8c36204cp-52 : inexact-ok
+= cos towardzero m68k96 0xc.2bbe762a55cp+44 : 0x1.2b04a1af8c36204cp-52 : inexact-ok
+= cos upward m68k96 0xc.2bbe762a55cp+44 : 0x1.2b04a1af8c36204ep-52 : inexact-ok
+= cos downward binary128 0xc.2bbe762a55cp+44 : 0x1.2b04a1af8c36204c7ee321322c97p-52 : inexact-ok
+= cos tonearest binary128 0xc.2bbe762a55cp+44 : 0x1.2b04a1af8c36204c7ee321322c97p-52 : inexact-ok
+= cos towardzero binary128 0xc.2bbe762a55cp+44 : 0x1.2b04a1af8c36204c7ee321322c97p-52 : inexact-ok
+= cos upward binary128 0xc.2bbe762a55cp+44 : 0x1.2b04a1af8c36204c7ee321322c98p-52 : inexact-ok
+= cos downward ibm128 0xc.2bbe762a55cp+44 : 0x1.2b04a1af8c36204c7ee321322c8p-52 : inexact-ok
+= cos tonearest ibm128 0xc.2bbe762a55cp+44 : 0x1.2b04a1af8c36204c7ee321322c8p-52 : inexact-ok
+= cos towardzero ibm128 0xc.2bbe762a55cp+44 : 0x1.2b04a1af8c36204c7ee321322c8p-52 : inexact-ok
+= cos upward ibm128 0xc.2bbe762a55cp+44 : 0x1.2b04a1af8c36204c7ee321322dp-52 : inexact-ok
+cos 0x1.dbd58768f97p+45
+= cos downward binary32 0x3.b7ab1p+44 : -0xe.ba3e9p-4 : inexact-ok
+= cos tonearest binary32 0x3.b7ab1p+44 : -0xe.ba3e8p-4 : inexact-ok
+= cos towardzero binary32 0x3.b7ab1p+44 : -0xe.ba3e8p-4 : inexact-ok
+= cos upward binary32 0x3.b7ab1p+44 : -0xe.ba3e8p-4 : inexact-ok
+= cos downward binary64 0x3.b7ab1p+44 : -0xe.ba3e819411018p-4 : inexact-ok
+= cos tonearest binary64 0x3.b7ab1p+44 : -0xe.ba3e81941101p-4 : inexact-ok
+= cos towardzero binary64 0x3.b7ab1p+44 : -0xe.ba3e81941101p-4 : inexact-ok
+= cos upward binary64 0x3.b7ab1p+44 : -0xe.ba3e81941101p-4 : inexact-ok
+= cos downward intel96 0x3.b7ab1p+44 : -0xe.ba3e81941101295p-4 : inexact-ok
+= cos tonearest intel96 0x3.b7ab1p+44 : -0xe.ba3e81941101294p-4 : inexact-ok
+= cos towardzero intel96 0x3.b7ab1p+44 : -0xe.ba3e81941101294p-4 : inexact-ok
+= cos upward intel96 0x3.b7ab1p+44 : -0xe.ba3e81941101294p-4 : inexact-ok
+= cos downward m68k96 0x3.b7ab1p+44 : -0xe.ba3e81941101295p-4 : inexact-ok
+= cos tonearest m68k96 0x3.b7ab1p+44 : -0xe.ba3e81941101294p-4 : inexact-ok
+= cos towardzero m68k96 0x3.b7ab1p+44 : -0xe.ba3e81941101294p-4 : inexact-ok
+= cos upward m68k96 0x3.b7ab1p+44 : -0xe.ba3e81941101294p-4 : inexact-ok
+= cos downward binary128 0x3.b7ab1p+44 : -0xe.ba3e819411012942be66959ef598p-4 : inexact-ok
+= cos tonearest binary128 0x3.b7ab1p+44 : -0xe.ba3e819411012942be66959ef598p-4 : inexact-ok
+= cos towardzero binary128 0x3.b7ab1p+44 : -0xe.ba3e819411012942be66959ef59p-4 : inexact-ok
+= cos upward binary128 0x3.b7ab1p+44 : -0xe.ba3e819411012942be66959ef59p-4 : inexact-ok
+= cos downward ibm128 0x3.b7ab1p+44 : -0xe.ba3e819411012942be66959ef8p-4 : inexact-ok
+= cos tonearest ibm128 0x3.b7ab1p+44 : -0xe.ba3e819411012942be66959ef4p-4 : inexact-ok
+= cos towardzero ibm128 0x3.b7ab1p+44 : -0xe.ba3e819411012942be66959ef4p-4 : inexact-ok
+= cos upward ibm128 0x3.b7ab1p+44 : -0xe.ba3e819411012942be66959ef4p-4 : inexact-ok
+= cos downward binary32 0x3.b7ab0cp+44 : -0x9.5c959p-4 : inexact-ok
+= cos tonearest binary32 0x3.b7ab0cp+44 : -0x9.5c959p-4 : inexact-ok
+= cos towardzero binary32 0x3.b7ab0cp+44 : -0x9.5c958p-4 : inexact-ok
+= cos upward binary32 0x3.b7ab0cp+44 : -0x9.5c958p-4 : inexact-ok
+= cos downward binary64 0x3.b7ab0cp+44 : -0x9.5c95889665228p-4 : inexact-ok
+= cos tonearest binary64 0x3.b7ab0cp+44 : -0x9.5c9588966522p-4 : inexact-ok
+= cos towardzero binary64 0x3.b7ab0cp+44 : -0x9.5c9588966522p-4 : inexact-ok
+= cos upward binary64 0x3.b7ab0cp+44 : -0x9.5c9588966522p-4 : inexact-ok
+= cos downward intel96 0x3.b7ab0cp+44 : -0x9.5c9588966522227p-4 : inexact-ok
+= cos tonearest intel96 0x3.b7ab0cp+44 : -0x9.5c9588966522226p-4 : inexact-ok
+= cos towardzero intel96 0x3.b7ab0cp+44 : -0x9.5c9588966522226p-4 : inexact-ok
+= cos upward intel96 0x3.b7ab0cp+44 : -0x9.5c9588966522226p-4 : inexact-ok
+= cos downward m68k96 0x3.b7ab0cp+44 : -0x9.5c9588966522227p-4 : inexact-ok
+= cos tonearest m68k96 0x3.b7ab0cp+44 : -0x9.5c9588966522226p-4 : inexact-ok
+= cos towardzero m68k96 0x3.b7ab0cp+44 : -0x9.5c9588966522226p-4 : inexact-ok
+= cos upward m68k96 0x3.b7ab0cp+44 : -0x9.5c9588966522226p-4 : inexact-ok
+= cos downward binary128 0x3.b7ab0cp+44 : -0x9.5c95889665222264d4becf758f28p-4 : inexact-ok
+= cos tonearest binary128 0x3.b7ab0cp+44 : -0x9.5c95889665222264d4becf758f2p-4 : inexact-ok
+= cos towardzero binary128 0x3.b7ab0cp+44 : -0x9.5c95889665222264d4becf758f2p-4 : inexact-ok
+= cos upward binary128 0x3.b7ab0cp+44 : -0x9.5c95889665222264d4becf758f2p-4 : inexact-ok
+= cos downward ibm128 0x3.b7ab0cp+44 : -0x9.5c95889665222264d4becf759p-4 : inexact-ok
+= cos tonearest ibm128 0x3.b7ab0cp+44 : -0x9.5c95889665222264d4becf759p-4 : inexact-ok
+= cos towardzero ibm128 0x3.b7ab0cp+44 : -0x9.5c95889665222264d4becf758cp-4 : inexact-ok
+= cos upward ibm128 0x3.b7ab0cp+44 : -0x9.5c95889665222264d4becf758cp-4 : inexact-ok
+= cos downward binary64 0x3.b7ab0ed1f2ep+44 : 0x4.1b9121100e10cp-48 : inexact-ok
+= cos tonearest binary64 0x3.b7ab0ed1f2ep+44 : 0x4.1b9121100e10cp-48 : inexact-ok
+= cos towardzero binary64 0x3.b7ab0ed1f2ep+44 : 0x4.1b9121100e10cp-48 : inexact-ok
+= cos upward binary64 0x3.b7ab0ed1f2ep+44 : 0x4.1b9121100e11p-48 : inexact-ok
+= cos downward intel96 0x3.b7ab0ed1f2ep+44 : 0x4.1b9121100e10cdb8p-48 : inexact-ok
+= cos tonearest intel96 0x3.b7ab0ed1f2ep+44 : 0x4.1b9121100e10cdb8p-48 : inexact-ok
+= cos towardzero intel96 0x3.b7ab0ed1f2ep+44 : 0x4.1b9121100e10cdb8p-48 : inexact-ok
+= cos upward intel96 0x3.b7ab0ed1f2ep+44 : 0x4.1b9121100e10cdcp-48 : inexact-ok
+= cos downward m68k96 0x3.b7ab0ed1f2ep+44 : 0x4.1b9121100e10cdb8p-48 : inexact-ok
+= cos tonearest m68k96 0x3.b7ab0ed1f2ep+44 : 0x4.1b9121100e10cdb8p-48 : inexact-ok
+= cos towardzero m68k96 0x3.b7ab0ed1f2ep+44 : 0x4.1b9121100e10cdb8p-48 : inexact-ok
+= cos upward m68k96 0x3.b7ab0ed1f2ep+44 : 0x4.1b9121100e10cdcp-48 : inexact-ok
+= cos downward binary128 0x3.b7ab0ed1f2ep+44 : 0x4.1b9121100e10cdb8bee1e90f7dbcp-48 : inexact-ok
+= cos tonearest binary128 0x3.b7ab0ed1f2ep+44 : 0x4.1b9121100e10cdb8bee1e90f7dcp-48 : inexact-ok
+= cos towardzero binary128 0x3.b7ab0ed1f2ep+44 : 0x4.1b9121100e10cdb8bee1e90f7dbcp-48 : inexact-ok
+= cos upward binary128 0x3.b7ab0ed1f2ep+44 : 0x4.1b9121100e10cdb8bee1e90f7dcp-48 : inexact-ok
+= cos downward ibm128 0x3.b7ab0ed1f2ep+44 : 0x4.1b9121100e10cdb8bee1e90f7cp-48 : inexact-ok
+= cos tonearest ibm128 0x3.b7ab0ed1f2ep+44 : 0x4.1b9121100e10cdb8bee1e90f7ep-48 : inexact-ok
+= cos towardzero ibm128 0x3.b7ab0ed1f2ep+44 : 0x4.1b9121100e10cdb8bee1e90f7cp-48 : inexact-ok
+= cos upward ibm128 0x3.b7ab0ed1f2ep+44 : 0x4.1b9121100e10cdb8bee1e90f7ep-48 : inexact-ok
+cos 0x1.0e826ceb0c5cp+46
+= cos downward binary32 0x4.3a09b8p+44 : -0xe.e7cd2p-4 : inexact-ok
+= cos tonearest binary32 0x4.3a09b8p+44 : -0xe.e7cd2p-4 : inexact-ok
+= cos towardzero binary32 0x4.3a09b8p+44 : -0xe.e7cd1p-4 : inexact-ok
+= cos upward binary32 0x4.3a09b8p+44 : -0xe.e7cd1p-4 : inexact-ok
+= cos downward binary64 0x4.3a09b8p+44 : -0xe.e7cd1817fc8e8p-4 : inexact-ok
+= cos tonearest binary64 0x4.3a09b8p+44 : -0xe.e7cd1817fc8ep-4 : inexact-ok
+= cos towardzero binary64 0x4.3a09b8p+44 : -0xe.e7cd1817fc8ep-4 : inexact-ok
+= cos upward binary64 0x4.3a09b8p+44 : -0xe.e7cd1817fc8ep-4 : inexact-ok
+= cos downward intel96 0x4.3a09b8p+44 : -0xe.e7cd1817fc8e21fp-4 : inexact-ok
+= cos tonearest intel96 0x4.3a09b8p+44 : -0xe.e7cd1817fc8e21fp-4 : inexact-ok
+= cos towardzero intel96 0x4.3a09b8p+44 : -0xe.e7cd1817fc8e21ep-4 : inexact-ok
+= cos upward intel96 0x4.3a09b8p+44 : -0xe.e7cd1817fc8e21ep-4 : inexact-ok
+= cos downward m68k96 0x4.3a09b8p+44 : -0xe.e7cd1817fc8e21fp-4 : inexact-ok
+= cos tonearest m68k96 0x4.3a09b8p+44 : -0xe.e7cd1817fc8e21fp-4 : inexact-ok
+= cos towardzero m68k96 0x4.3a09b8p+44 : -0xe.e7cd1817fc8e21ep-4 : inexact-ok
+= cos upward m68k96 0x4.3a09b8p+44 : -0xe.e7cd1817fc8e21ep-4 : inexact-ok
+= cos downward binary128 0x4.3a09b8p+44 : -0xe.e7cd1817fc8e21eeeeb86b21eef8p-4 : inexact-ok
+= cos tonearest binary128 0x4.3a09b8p+44 : -0xe.e7cd1817fc8e21eeeeb86b21eefp-4 : inexact-ok
+= cos towardzero binary128 0x4.3a09b8p+44 : -0xe.e7cd1817fc8e21eeeeb86b21eefp-4 : inexact-ok
+= cos upward binary128 0x4.3a09b8p+44 : -0xe.e7cd1817fc8e21eeeeb86b21eefp-4 : inexact-ok
+= cos downward ibm128 0x4.3a09b8p+44 : -0xe.e7cd1817fc8e21eeeeb86b21fp-4 : inexact-ok
+= cos tonearest ibm128 0x4.3a09b8p+44 : -0xe.e7cd1817fc8e21eeeeb86b21fp-4 : inexact-ok
+= cos towardzero ibm128 0x4.3a09b8p+44 : -0xe.e7cd1817fc8e21eeeeb86b21ecp-4 : inexact-ok
+= cos upward ibm128 0x4.3a09b8p+44 : -0xe.e7cd1817fc8e21eeeeb86b21ecp-4 : inexact-ok
+= cos downward binary32 0x4.3a09bp+44 : 0xa.ed559p-4 : inexact-ok
+= cos tonearest binary32 0x4.3a09bp+44 : 0xa.ed559p-4 : inexact-ok
+= cos towardzero binary32 0x4.3a09bp+44 : 0xa.ed559p-4 : inexact-ok
+= cos upward binary32 0x4.3a09bp+44 : 0xa.ed55ap-4 : inexact-ok
+= cos downward binary64 0x4.3a09bp+44 : 0xa.ed55933cc4ab8p-4 : inexact-ok
+= cos tonearest binary64 0x4.3a09bp+44 : 0xa.ed55933cc4acp-4 : inexact-ok
+= cos towardzero binary64 0x4.3a09bp+44 : 0xa.ed55933cc4ab8p-4 : inexact-ok
+= cos upward binary64 0x4.3a09bp+44 : 0xa.ed55933cc4acp-4 : inexact-ok
+= cos downward intel96 0x4.3a09bp+44 : 0xa.ed55933cc4abe86p-4 : inexact-ok
+= cos tonearest intel96 0x4.3a09bp+44 : 0xa.ed55933cc4abe86p-4 : inexact-ok
+= cos towardzero intel96 0x4.3a09bp+44 : 0xa.ed55933cc4abe86p-4 : inexact-ok
+= cos upward intel96 0x4.3a09bp+44 : 0xa.ed55933cc4abe87p-4 : inexact-ok
+= cos downward m68k96 0x4.3a09bp+44 : 0xa.ed55933cc4abe86p-4 : inexact-ok
+= cos tonearest m68k96 0x4.3a09bp+44 : 0xa.ed55933cc4abe86p-4 : inexact-ok
+= cos towardzero m68k96 0x4.3a09bp+44 : 0xa.ed55933cc4abe86p-4 : inexact-ok
+= cos upward m68k96 0x4.3a09bp+44 : 0xa.ed55933cc4abe87p-4 : inexact-ok
+= cos downward binary128 0x4.3a09bp+44 : 0xa.ed55933cc4abe860b7fe504ecdbp-4 : inexact-ok
+= cos tonearest binary128 0x4.3a09bp+44 : 0xa.ed55933cc4abe860b7fe504ecdb8p-4 : inexact-ok
+= cos towardzero binary128 0x4.3a09bp+44 : 0xa.ed55933cc4abe860b7fe504ecdbp-4 : inexact-ok
+= cos upward binary128 0x4.3a09bp+44 : 0xa.ed55933cc4abe860b7fe504ecdb8p-4 : inexact-ok
+= cos downward ibm128 0x4.3a09bp+44 : 0xa.ed55933cc4abe860b7fe504eccp-4 : inexact-ok
+= cos tonearest ibm128 0x4.3a09bp+44 : 0xa.ed55933cc4abe860b7fe504eccp-4 : inexact-ok
+= cos towardzero ibm128 0x4.3a09bp+44 : 0xa.ed55933cc4abe860b7fe504eccp-4 : inexact-ok
+= cos upward ibm128 0x4.3a09bp+44 : 0xa.ed55933cc4abe860b7fe504edp-4 : inexact-ok
+= cos downward binary64 0x4.3a09b3ac317p+44 : -0x2.1720b595836a2p-48 : inexact-ok
+= cos tonearest binary64 0x4.3a09b3ac317p+44 : -0x2.1720b595836a2p-48 : inexact-ok
+= cos towardzero binary64 0x4.3a09b3ac317p+44 : -0x2.1720b595836ap-48 : inexact-ok
+= cos upward binary64 0x4.3a09b3ac317p+44 : -0x2.1720b595836ap-48 : inexact-ok
+= cos downward intel96 0x4.3a09b3ac317p+44 : -0x2.1720b595836a17ep-48 : inexact-ok
+= cos tonearest intel96 0x4.3a09b3ac317p+44 : -0x2.1720b595836a17ep-48 : inexact-ok
+= cos towardzero intel96 0x4.3a09b3ac317p+44 : -0x2.1720b595836a17dcp-48 : inexact-ok
+= cos upward intel96 0x4.3a09b3ac317p+44 : -0x2.1720b595836a17dcp-48 : inexact-ok
+= cos downward m68k96 0x4.3a09b3ac317p+44 : -0x2.1720b595836a17ep-48 : inexact-ok
+= cos tonearest m68k96 0x4.3a09b3ac317p+44 : -0x2.1720b595836a17ep-48 : inexact-ok
+= cos towardzero m68k96 0x4.3a09b3ac317p+44 : -0x2.1720b595836a17dcp-48 : inexact-ok
+= cos upward m68k96 0x4.3a09b3ac317p+44 : -0x2.1720b595836a17dcp-48 : inexact-ok
+= cos downward binary128 0x4.3a09b3ac317p+44 : -0x2.1720b595836a17dec3680d95912ap-48 : inexact-ok
+= cos tonearest binary128 0x4.3a09b3ac317p+44 : -0x2.1720b595836a17dec3680d959128p-48 : inexact-ok
+= cos towardzero binary128 0x4.3a09b3ac317p+44 : -0x2.1720b595836a17dec3680d959128p-48 : inexact-ok
+= cos upward binary128 0x4.3a09b3ac317p+44 : -0x2.1720b595836a17dec3680d959128p-48 : inexact-ok
+= cos downward ibm128 0x4.3a09b3ac317p+44 : -0x2.1720b595836a17dec3680d9592p-48 : inexact-ok
+= cos tonearest ibm128 0x4.3a09b3ac317p+44 : -0x2.1720b595836a17dec3680d9591p-48 : inexact-ok
+= cos towardzero ibm128 0x4.3a09b3ac317p+44 : -0x2.1720b595836a17dec3680d9591p-48 : inexact-ok
+= cos upward ibm128 0x4.3a09b3ac317p+44 : -0x2.1720b595836a17dec3680d9591p-48 : inexact-ok
diff --git a/math/auto-libm-test-out-sin b/math/auto-libm-test-out-sin
index f1d21b179c..1181f057ce 100644
--- a/math/auto-libm-test-out-sin
+++ b/math/auto-libm-test-out-sin
@@ -3389,6 +3389,234 @@ sin 0x5.6a5005df4363833413fa44f74ae8p+64
 = sin tonearest ibm128 0x5.6a5005df4363833413fa44f74ap+64 : -0xf.fdc305247e694b390edb67a7fcp-8 : inexact-ok
 = sin towardzero ibm128 0x5.6a5005df4363833413fa44f74ap+64 : -0xf.fdc305247e694b390edb67a7f8p-8 : inexact-ok
 = sin upward ibm128 0x5.6a5005df4363833413fa44f74ap+64 : -0xf.fdc305247e694b390edb67a7f8p-8 : inexact-ok
+sin 0x1.4c96c11134d36p+578
+= sin downward binary32 0xf.fffffp+124 : -0x8.599b4p-4 : inexact-ok
+= sin tonearest binary32 0xf.fffffp+124 : -0x8.599b3p-4 : inexact-ok
+= sin towardzero binary32 0xf.fffffp+124 : -0x8.599b3p-4 : inexact-ok
+= sin upward binary32 0xf.fffffp+124 : -0x8.599b3p-4 : inexact-ok
+= sin downward binary64 0xf.fffffp+124 : -0x8.599b32844abbp-4 : inexact-ok
+= sin tonearest binary64 0xf.fffffp+124 : -0x8.599b32844aba8p-4 : inexact-ok
+= sin towardzero binary64 0xf.fffffp+124 : -0x8.599b32844aba8p-4 : inexact-ok
+= sin upward binary64 0xf.fffffp+124 : -0x8.599b32844aba8p-4 : inexact-ok
+= sin downward intel96 0xf.fffffp+124 : -0x8.599b32844aba907p-4 : inexact-ok
+= sin tonearest intel96 0xf.fffffp+124 : -0x8.599b32844aba907p-4 : inexact-ok
+= sin towardzero intel96 0xf.fffffp+124 : -0x8.599b32844aba906p-4 : inexact-ok
+= sin upward intel96 0xf.fffffp+124 : -0x8.599b32844aba906p-4 : inexact-ok
+= sin downward m68k96 0xf.fffffp+124 : -0x8.599b32844aba907p-4 : inexact-ok
+= sin tonearest m68k96 0xf.fffffp+124 : -0x8.599b32844aba907p-4 : inexact-ok
+= sin towardzero m68k96 0xf.fffffp+124 : -0x8.599b32844aba906p-4 : inexact-ok
+= sin upward m68k96 0xf.fffffp+124 : -0x8.599b32844aba906p-4 : inexact-ok
+= sin downward binary128 0xf.fffffp+124 : -0x8.599b32844aba906cee446be049ap-4 : inexact-ok
+= sin tonearest binary128 0xf.fffffp+124 : -0x8.599b32844aba906cee446be04998p-4 : inexact-ok
+= sin towardzero binary128 0xf.fffffp+124 : -0x8.599b32844aba906cee446be04998p-4 : inexact-ok
+= sin upward binary128 0xf.fffffp+124 : -0x8.599b32844aba906cee446be04998p-4 : inexact-ok
+= sin downward ibm128 0xf.fffffp+124 : -0x8.599b32844aba906cee446be04cp-4 : inexact-ok
+= sin tonearest ibm128 0xf.fffffp+124 : -0x8.599b32844aba906cee446be048p-4 : inexact-ok
+= sin towardzero ibm128 0xf.fffffp+124 : -0x8.599b32844aba906cee446be048p-4 : inexact-ok
+= sin upward ibm128 0xf.fffffp+124 : -0x8.599b32844aba906cee446be048p-4 : inexact-ok
+= sin downward binary64 0x5.325b0444d34d8p+576 : -0x5.bb19ef3ddd48cp-60 : inexact-ok
+= sin tonearest binary64 0x5.325b0444d34d8p+576 : -0x5.bb19ef3ddd488p-60 : inexact-ok
+= sin towardzero binary64 0x5.325b0444d34d8p+576 : -0x5.bb19ef3ddd488p-60 : inexact-ok
+= sin upward binary64 0x5.325b0444d34d8p+576 : -0x5.bb19ef3ddd488p-60 : inexact-ok
+= sin downward intel96 0x5.325b0444d34d8p+576 : -0x5.bb19ef3ddd4892f8p-60 : inexact-ok
+= sin tonearest intel96 0x5.325b0444d34d8p+576 : -0x5.bb19ef3ddd4892fp-60 : inexact-ok
+= sin towardzero intel96 0x5.325b0444d34d8p+576 : -0x5.bb19ef3ddd4892fp-60 : inexact-ok
+= sin upward intel96 0x5.325b0444d34d8p+576 : -0x5.bb19ef3ddd4892fp-60 : inexact-ok
+= sin downward m68k96 0x5.325b0444d34d8p+576 : -0x5.bb19ef3ddd4892f8p-60 : inexact-ok
+= sin tonearest m68k96 0x5.325b0444d34d8p+576 : -0x5.bb19ef3ddd4892fp-60 : inexact-ok
+= sin towardzero m68k96 0x5.325b0444d34d8p+576 : -0x5.bb19ef3ddd4892fp-60 : inexact-ok
+= sin upward m68k96 0x5.325b0444d34d8p+576 : -0x5.bb19ef3ddd4892fp-60 : inexact-ok
+= sin downward binary128 0x5.325b0444d34d8p+576 : -0x5.bb19ef3ddd4892f2b3c334000a84p-60 : inexact-ok
+= sin tonearest binary128 0x5.325b0444d34d8p+576 : -0x5.bb19ef3ddd4892f2b3c334000a84p-60 : inexact-ok
+= sin towardzero binary128 0x5.325b0444d34d8p+576 : -0x5.bb19ef3ddd4892f2b3c334000a8p-60 : inexact-ok
+= sin upward binary128 0x5.325b0444d34d8p+576 : -0x5.bb19ef3ddd4892f2b3c334000a8p-60 : inexact-ok
+= sin downward ibm128 0x5.325b0444d34d8p+576 : -0x5.bb19ef3ddd4892f2b3c334000cp-60 : inexact-ok
+= sin tonearest ibm128 0x5.325b0444d34d8p+576 : -0x5.bb19ef3ddd4892f2b3c334000ap-60 : inexact-ok
+= sin towardzero ibm128 0x5.325b0444d34d8p+576 : -0x5.bb19ef3ddd4892f2b3c334000ap-60 : inexact-ok
+= sin upward ibm128 0x5.325b0444d34d8p+576 : -0x5.bb19ef3ddd4892f2b3c334000ap-60 : inexact-ok
+sin 0x1.69eab0985179bp+246
+= sin downward binary32 0xf.fffffp+124 : -0x8.599b4p-4 : inexact-ok
+= sin tonearest binary32 0xf.fffffp+124 : -0x8.599b3p-4 : inexact-ok
+= sin towardzero binary32 0xf.fffffp+124 : -0x8.599b3p-4 : inexact-ok
+= sin upward binary32 0xf.fffffp+124 : -0x8.599b3p-4 : inexact-ok
+= sin downward binary64 0xf.fffffp+124 : -0x8.599b32844abbp-4 : inexact-ok
+= sin tonearest binary64 0xf.fffffp+124 : -0x8.599b32844aba8p-4 : inexact-ok
+= sin towardzero binary64 0xf.fffffp+124 : -0x8.599b32844aba8p-4 : inexact-ok
+= sin upward binary64 0xf.fffffp+124 : -0x8.599b32844aba8p-4 : inexact-ok
+= sin downward intel96 0xf.fffffp+124 : -0x8.599b32844aba907p-4 : inexact-ok
+= sin tonearest intel96 0xf.fffffp+124 : -0x8.599b32844aba907p-4 : inexact-ok
+= sin towardzero intel96 0xf.fffffp+124 : -0x8.599b32844aba906p-4 : inexact-ok
+= sin upward intel96 0xf.fffffp+124 : -0x8.599b32844aba906p-4 : inexact-ok
+= sin downward m68k96 0xf.fffffp+124 : -0x8.599b32844aba907p-4 : inexact-ok
+= sin tonearest m68k96 0xf.fffffp+124 : -0x8.599b32844aba907p-4 : inexact-ok
+= sin towardzero m68k96 0xf.fffffp+124 : -0x8.599b32844aba906p-4 : inexact-ok
+= sin upward m68k96 0xf.fffffp+124 : -0x8.599b32844aba906p-4 : inexact-ok
+= sin downward binary128 0xf.fffffp+124 : -0x8.599b32844aba906cee446be049ap-4 : inexact-ok
+= sin tonearest binary128 0xf.fffffp+124 : -0x8.599b32844aba906cee446be04998p-4 : inexact-ok
+= sin towardzero binary128 0xf.fffffp+124 : -0x8.599b32844aba906cee446be04998p-4 : inexact-ok
+= sin upward binary128 0xf.fffffp+124 : -0x8.599b32844aba906cee446be04998p-4 : inexact-ok
+= sin downward ibm128 0xf.fffffp+124 : -0x8.599b32844aba906cee446be04cp-4 : inexact-ok
+= sin tonearest ibm128 0xf.fffffp+124 : -0x8.599b32844aba906cee446be048p-4 : inexact-ok
+= sin towardzero ibm128 0xf.fffffp+124 : -0x8.599b32844aba906cee446be048p-4 : inexact-ok
+= sin upward ibm128 0xf.fffffp+124 : -0x8.599b32844aba906cee446be048p-4 : inexact-ok
+= sin downward binary64 0x5.a7aac26145e6cp+244 : -0x1p+0 : inexact-ok
+= sin tonearest binary64 0x5.a7aac26145e6cp+244 : -0x1p+0 : inexact-ok
+= sin towardzero binary64 0x5.a7aac26145e6cp+244 : -0xf.ffffffffffff8p-4 : inexact-ok
+= sin upward binary64 0x5.a7aac26145e6cp+244 : -0xf.ffffffffffff8p-4 : inexact-ok
+= sin downward intel96 0x5.a7aac26145e6cp+244 : -0x1p+0 : inexact-ok
+= sin tonearest intel96 0x5.a7aac26145e6cp+244 : -0x1p+0 : inexact-ok
+= sin towardzero intel96 0x5.a7aac26145e6cp+244 : -0xf.fffffffffffffffp-4 : inexact-ok
+= sin upward intel96 0x5.a7aac26145e6cp+244 : -0xf.fffffffffffffffp-4 : inexact-ok
+= sin downward m68k96 0x5.a7aac26145e6cp+244 : -0x1p+0 : inexact-ok
+= sin tonearest m68k96 0x5.a7aac26145e6cp+244 : -0x1p+0 : inexact-ok
+= sin towardzero m68k96 0x5.a7aac26145e6cp+244 : -0xf.fffffffffffffffp-4 : inexact-ok
+= sin upward m68k96 0x5.a7aac26145e6cp+244 : -0xf.fffffffffffffffp-4 : inexact-ok
+= sin downward binary128 0x5.a7aac26145e6cp+244 : -0x1p+0 : inexact-ok
+= sin tonearest binary128 0x5.a7aac26145e6cp+244 : -0x1p+0 : inexact-ok
+= sin towardzero binary128 0x5.a7aac26145e6cp+244 : -0xf.fffffffffffffffffffffffffff8p-4 : inexact-ok
+= sin upward binary128 0x5.a7aac26145e6cp+244 : -0xf.fffffffffffffffffffffffffff8p-4 : inexact-ok
+= sin downward ibm128 0x5.a7aac26145e6cp+244 : -0x1p+0 : inexact-ok
+= sin tonearest ibm128 0x5.a7aac26145e6cp+244 : -0x1p+0 : inexact-ok
+= sin towardzero ibm128 0x5.a7aac26145e6cp+244 : -0xf.fffffffffffffffffffffffffcp-4 : inexact-ok
+= sin upward ibm128 0x5.a7aac26145e6cp+244 : -0xf.fffffffffffffffffffffffffcp-4 : inexact-ok
+sin 0x1.2419db13f80ap+50
+= sin downward binary32 0x4.90677p+48 : 0x8.e7af1p-4 : inexact-ok
+= sin tonearest binary32 0x4.90677p+48 : 0x8.e7af1p-4 : inexact-ok
+= sin towardzero binary32 0x4.90677p+48 : 0x8.e7af1p-4 : inexact-ok
+= sin upward binary32 0x4.90677p+48 : 0x8.e7af2p-4 : inexact-ok
+= sin downward binary64 0x4.90677p+48 : 0x8.e7af14b5e0968p-4 : inexact-ok
+= sin tonearest binary64 0x4.90677p+48 : 0x8.e7af14b5e0968p-4 : inexact-ok
+= sin towardzero binary64 0x4.90677p+48 : 0x8.e7af14b5e0968p-4 : inexact-ok
+= sin upward binary64 0x4.90677p+48 : 0x8.e7af14b5e097p-4 : inexact-ok
+= sin downward intel96 0x4.90677p+48 : 0x8.e7af14b5e096b1dp-4 : inexact-ok
+= sin tonearest intel96 0x4.90677p+48 : 0x8.e7af14b5e096b1ep-4 : inexact-ok
+= sin towardzero intel96 0x4.90677p+48 : 0x8.e7af14b5e096b1dp-4 : inexact-ok
+= sin upward intel96 0x4.90677p+48 : 0x8.e7af14b5e096b1ep-4 : inexact-ok
+= sin downward m68k96 0x4.90677p+48 : 0x8.e7af14b5e096b1dp-4 : inexact-ok
+= sin tonearest m68k96 0x4.90677p+48 : 0x8.e7af14b5e096b1ep-4 : inexact-ok
+= sin towardzero m68k96 0x4.90677p+48 : 0x8.e7af14b5e096b1dp-4 : inexact-ok
+= sin upward m68k96 0x4.90677p+48 : 0x8.e7af14b5e096b1ep-4 : inexact-ok
+= sin downward binary128 0x4.90677p+48 : 0x8.e7af14b5e096b1de0542a006ca18p-4 : inexact-ok
+= sin tonearest binary128 0x4.90677p+48 : 0x8.e7af14b5e096b1de0542a006ca2p-4 : inexact-ok
+= sin towardzero binary128 0x4.90677p+48 : 0x8.e7af14b5e096b1de0542a006ca18p-4 : inexact-ok
+= sin upward binary128 0x4.90677p+48 : 0x8.e7af14b5e096b1de0542a006ca2p-4 : inexact-ok
+= sin downward ibm128 0x4.90677p+48 : 0x8.e7af14b5e096b1de0542a006c8p-4 : inexact-ok
+= sin tonearest ibm128 0x4.90677p+48 : 0x8.e7af14b5e096b1de0542a006ccp-4 : inexact-ok
+= sin towardzero ibm128 0x4.90677p+48 : 0x8.e7af14b5e096b1de0542a006c8p-4 : inexact-ok
+= sin upward ibm128 0x4.90677p+48 : 0x8.e7af14b5e096b1de0542a006ccp-4 : inexact-ok
+= sin downward binary32 0x4.906768p+48 : 0xf.e657bp-4 : inexact-ok
+= sin tonearest binary32 0x4.906768p+48 : 0xf.e657cp-4 : inexact-ok
+= sin towardzero binary32 0x4.906768p+48 : 0xf.e657bp-4 : inexact-ok
+= sin upward binary32 0x4.906768p+48 : 0xf.e657cp-4 : inexact-ok
+= sin downward binary64 0x4.906768p+48 : 0xf.e657b8243a248p-4 : inexact-ok
+= sin tonearest binary64 0x4.906768p+48 : 0xf.e657b8243a25p-4 : inexact-ok
+= sin towardzero binary64 0x4.906768p+48 : 0xf.e657b8243a248p-4 : inexact-ok
+= sin upward binary64 0x4.906768p+48 : 0xf.e657b8243a25p-4 : inexact-ok
+= sin downward intel96 0x4.906768p+48 : 0xf.e657b8243a24e71p-4 : inexact-ok
+= sin tonearest intel96 0x4.906768p+48 : 0xf.e657b8243a24e72p-4 : inexact-ok
+= sin towardzero intel96 0x4.906768p+48 : 0xf.e657b8243a24e71p-4 : inexact-ok
+= sin upward intel96 0x4.906768p+48 : 0xf.e657b8243a24e72p-4 : inexact-ok
+= sin downward m68k96 0x4.906768p+48 : 0xf.e657b8243a24e71p-4 : inexact-ok
+= sin tonearest m68k96 0x4.906768p+48 : 0xf.e657b8243a24e72p-4 : inexact-ok
+= sin towardzero m68k96 0x4.906768p+48 : 0xf.e657b8243a24e71p-4 : inexact-ok
+= sin upward m68k96 0x4.906768p+48 : 0xf.e657b8243a24e72p-4 : inexact-ok
+= sin downward binary128 0x4.906768p+48 : 0xf.e657b8243a24e71ea65806ec127p-4 : inexact-ok
+= sin tonearest binary128 0x4.906768p+48 : 0xf.e657b8243a24e71ea65806ec127p-4 : inexact-ok
+= sin towardzero binary128 0x4.906768p+48 : 0xf.e657b8243a24e71ea65806ec127p-4 : inexact-ok
+= sin upward binary128 0x4.906768p+48 : 0xf.e657b8243a24e71ea65806ec1278p-4 : inexact-ok
+= sin downward ibm128 0x4.906768p+48 : 0xf.e657b8243a24e71ea65806ec1p-4 : inexact-ok
+= sin tonearest ibm128 0x4.906768p+48 : 0xf.e657b8243a24e71ea65806ec14p-4 : inexact-ok
+= sin towardzero ibm128 0x4.906768p+48 : 0xf.e657b8243a24e71ea65806ec1p-4 : inexact-ok
+= sin upward ibm128 0x4.906768p+48 : 0xf.e657b8243a24e71ea65806ec14p-4 : inexact-ok
+= sin downward binary64 0x4.90676c4fe028p+48 : 0x7.021bca1d4944cp-52 : inexact-ok
+= sin tonearest binary64 0x4.90676c4fe028p+48 : 0x7.021bca1d4944cp-52 : inexact-ok
+= sin towardzero binary64 0x4.90676c4fe028p+48 : 0x7.021bca1d4944cp-52 : inexact-ok
+= sin upward binary64 0x4.90676c4fe028p+48 : 0x7.021bca1d4945p-52 : inexact-ok
+= sin downward intel96 0x4.90676c4fe028p+48 : 0x7.021bca1d4944c1c8p-52 : inexact-ok
+= sin tonearest intel96 0x4.90676c4fe028p+48 : 0x7.021bca1d4944c1c8p-52 : inexact-ok
+= sin towardzero intel96 0x4.90676c4fe028p+48 : 0x7.021bca1d4944c1c8p-52 : inexact-ok
+= sin upward intel96 0x4.90676c4fe028p+48 : 0x7.021bca1d4944c1dp-52 : inexact-ok
+= sin downward m68k96 0x4.90676c4fe028p+48 : 0x7.021bca1d4944c1c8p-52 : inexact-ok
+= sin tonearest m68k96 0x4.90676c4fe028p+48 : 0x7.021bca1d4944c1c8p-52 : inexact-ok
+= sin towardzero m68k96 0x4.90676c4fe028p+48 : 0x7.021bca1d4944c1c8p-52 : inexact-ok
+= sin upward m68k96 0x4.90676c4fe028p+48 : 0x7.021bca1d4944c1dp-52 : inexact-ok
+= sin downward binary128 0x4.90676c4fe028p+48 : 0x7.021bca1d4944c1caf952c72cd3c4p-52 : inexact-ok
+= sin tonearest binary128 0x4.90676c4fe028p+48 : 0x7.021bca1d4944c1caf952c72cd3c4p-52 : inexact-ok
+= sin towardzero binary128 0x4.90676c4fe028p+48 : 0x7.021bca1d4944c1caf952c72cd3c4p-52 : inexact-ok
+= sin upward binary128 0x4.90676c4fe028p+48 : 0x7.021bca1d4944c1caf952c72cd3c8p-52 : inexact-ok
+= sin downward ibm128 0x4.90676c4fe028p+48 : 0x7.021bca1d4944c1caf952c72cd2p-52 : inexact-ok
+= sin tonearest ibm128 0x4.90676c4fe028p+48 : 0x7.021bca1d4944c1caf952c72cd4p-52 : inexact-ok
+= sin towardzero ibm128 0x4.90676c4fe028p+48 : 0x7.021bca1d4944c1caf952c72cd2p-52 : inexact-ok
+= sin upward ibm128 0x4.90676c4fe028p+48 : 0x7.021bca1d4944c1caf952c72cd4p-52 : inexact-ok
+sin 0x1.0e826ceb0c5cp+47
+= sin downward binary32 0x8.74137p+44 : 0xa.d621p-4 : inexact-ok
+= sin tonearest binary32 0x8.74137p+44 : 0xa.d621p-4 : inexact-ok
+= sin towardzero binary32 0x8.74137p+44 : 0xa.d621p-4 : inexact-ok
+= sin upward binary32 0x8.74137p+44 : 0xa.d6211p-4 : inexact-ok
+= sin downward binary64 0x8.74137p+44 : 0xa.d6210085759ep-4 : inexact-ok
+= sin tonearest binary64 0x8.74137p+44 : 0xa.d6210085759ep-4 : inexact-ok
+= sin towardzero binary64 0x8.74137p+44 : 0xa.d6210085759ep-4 : inexact-ok
+= sin upward binary64 0x8.74137p+44 : 0xa.d6210085759e8p-4 : inexact-ok
+= sin downward intel96 0x8.74137p+44 : 0xa.d6210085759e2cbp-4 : inexact-ok
+= sin tonearest intel96 0x8.74137p+44 : 0xa.d6210085759e2cbp-4 : inexact-ok
+= sin towardzero intel96 0x8.74137p+44 : 0xa.d6210085759e2cbp-4 : inexact-ok
+= sin upward intel96 0x8.74137p+44 : 0xa.d6210085759e2ccp-4 : inexact-ok
+= sin downward m68k96 0x8.74137p+44 : 0xa.d6210085759e2cbp-4 : inexact-ok
+= sin tonearest m68k96 0x8.74137p+44 : 0xa.d6210085759e2cbp-4 : inexact-ok
+= sin towardzero m68k96 0x8.74137p+44 : 0xa.d6210085759e2cbp-4 : inexact-ok
+= sin upward m68k96 0x8.74137p+44 : 0xa.d6210085759e2ccp-4 : inexact-ok
+= sin downward binary128 0x8.74137p+44 : 0xa.d6210085759e2cb2d319f240e138p-4 : inexact-ok
+= sin tonearest binary128 0x8.74137p+44 : 0xa.d6210085759e2cb2d319f240e14p-4 : inexact-ok
+= sin towardzero binary128 0x8.74137p+44 : 0xa.d6210085759e2cb2d319f240e138p-4 : inexact-ok
+= sin upward binary128 0x8.74137p+44 : 0xa.d6210085759e2cb2d319f240e14p-4 : inexact-ok
+= sin downward ibm128 0x8.74137p+44 : 0xa.d6210085759e2cb2d319f240ep-4 : inexact-ok
+= sin tonearest ibm128 0x8.74137p+44 : 0xa.d6210085759e2cb2d319f240ep-4 : inexact-ok
+= sin towardzero ibm128 0x8.74137p+44 : 0xa.d6210085759e2cb2d319f240ep-4 : inexact-ok
+= sin upward ibm128 0x8.74137p+44 : 0xa.d6210085759e2cb2d319f240e4p-4 : inexact-ok
+= sin downward binary32 0x8.74136p+44 : 0xf.f6bf4p-4 : inexact-ok
+= sin tonearest binary32 0x8.74136p+44 : 0xf.f6bf5p-4 : inexact-ok
+= sin towardzero binary32 0x8.74136p+44 : 0xf.f6bf4p-4 : inexact-ok
+= sin upward binary32 0x8.74136p+44 : 0xf.f6bf5p-4 : inexact-ok
+= sin downward binary64 0x8.74136p+44 : 0xf.f6bf482d31f1p-4 : inexact-ok
+= sin tonearest binary64 0x8.74136p+44 : 0xf.f6bf482d31f18p-4 : inexact-ok
+= sin towardzero binary64 0x8.74136p+44 : 0xf.f6bf482d31f1p-4 : inexact-ok
+= sin upward binary64 0x8.74136p+44 : 0xf.f6bf482d31f18p-4 : inexact-ok
+= sin downward intel96 0x8.74136p+44 : 0xf.f6bf482d31f1417p-4 : inexact-ok
+= sin tonearest intel96 0x8.74136p+44 : 0xf.f6bf482d31f1418p-4 : inexact-ok
+= sin towardzero intel96 0x8.74136p+44 : 0xf.f6bf482d31f1417p-4 : inexact-ok
+= sin upward intel96 0x8.74136p+44 : 0xf.f6bf482d31f1418p-4 : inexact-ok
+= sin downward m68k96 0x8.74136p+44 : 0xf.f6bf482d31f1417p-4 : inexact-ok
+= sin tonearest m68k96 0x8.74136p+44 : 0xf.f6bf482d31f1418p-4 : inexact-ok
+= sin towardzero m68k96 0x8.74136p+44 : 0xf.f6bf482d31f1417p-4 : inexact-ok
+= sin upward m68k96 0x8.74136p+44 : 0xf.f6bf482d31f1418p-4 : inexact-ok
+= sin downward binary128 0x8.74136p+44 : 0xf.f6bf482d31f1417ad55755b74918p-4 : inexact-ok
+= sin tonearest binary128 0x8.74136p+44 : 0xf.f6bf482d31f1417ad55755b74918p-4 : inexact-ok
+= sin towardzero binary128 0x8.74136p+44 : 0xf.f6bf482d31f1417ad55755b74918p-4 : inexact-ok
+= sin upward binary128 0x8.74136p+44 : 0xf.f6bf482d31f1417ad55755b7492p-4 : inexact-ok
+= sin downward ibm128 0x8.74136p+44 : 0xf.f6bf482d31f1417ad55755b748p-4 : inexact-ok
+= sin tonearest ibm128 0x8.74136p+44 : 0xf.f6bf482d31f1417ad55755b748p-4 : inexact-ok
+= sin towardzero ibm128 0x8.74136p+44 : 0xf.f6bf482d31f1417ad55755b748p-4 : inexact-ok
+= sin upward ibm128 0x8.74136p+44 : 0xf.f6bf482d31f1417ad55755b74cp-4 : inexact-ok
+= sin downward binary64 0x8.7413675862ep+44 : 0x4.2e416b2b06d4p-48 : inexact-ok
+= sin tonearest binary64 0x8.7413675862ep+44 : 0x4.2e416b2b06d44p-48 : inexact-ok
+= sin towardzero binary64 0x8.7413675862ep+44 : 0x4.2e416b2b06d4p-48 : inexact-ok
+= sin upward binary64 0x8.7413675862ep+44 : 0x4.2e416b2b06d44p-48 : inexact-ok
+= sin downward intel96 0x8.7413675862ep+44 : 0x4.2e416b2b06d42fb8p-48 : inexact-ok
+= sin tonearest intel96 0x8.7413675862ep+44 : 0x4.2e416b2b06d42fcp-48 : inexact-ok
+= sin towardzero intel96 0x8.7413675862ep+44 : 0x4.2e416b2b06d42fb8p-48 : inexact-ok
+= sin upward intel96 0x8.7413675862ep+44 : 0x4.2e416b2b06d42fcp-48 : inexact-ok
+= sin downward m68k96 0x8.7413675862ep+44 : 0x4.2e416b2b06d42fb8p-48 : inexact-ok
+= sin tonearest m68k96 0x8.7413675862ep+44 : 0x4.2e416b2b06d42fcp-48 : inexact-ok
+= sin towardzero m68k96 0x8.7413675862ep+44 : 0x4.2e416b2b06d42fb8p-48 : inexact-ok
+= sin upward m68k96 0x8.7413675862ep+44 : 0x4.2e416b2b06d42fcp-48 : inexact-ok
+= sin downward binary128 0x8.7413675862ep+44 : 0x4.2e416b2b06d42fbd86d01b22000cp-48 : inexact-ok
+= sin tonearest binary128 0x8.7413675862ep+44 : 0x4.2e416b2b06d42fbd86d01b22001p-48 : inexact-ok
+= sin towardzero binary128 0x8.7413675862ep+44 : 0x4.2e416b2b06d42fbd86d01b22000cp-48 : inexact-ok
+= sin upward binary128 0x8.7413675862ep+44 : 0x4.2e416b2b06d42fbd86d01b22001p-48 : inexact-ok
+= sin downward ibm128 0x8.7413675862ep+44 : 0x4.2e416b2b06d42fbd86d01b22p-48 : inexact-ok
+= sin tonearest ibm128 0x8.7413675862ep+44 : 0x4.2e416b2b06d42fbd86d01b22p-48 : inexact-ok
+= sin towardzero ibm128 0x8.7413675862ep+44 : 0x4.2e416b2b06d42fbd86d01b22p-48 : inexact-ok
+= sin upward ibm128 0x8.7413675862ep+44 : 0x4.2e416b2b06d42fbd86d01b2202p-48 : inexact-ok
 sin max
 = sin downward binary32 0xf.fffffp+124 : -0x8.599b4p-4 : inexact-ok
 = sin tonearest binary32 0xf.fffffp+124 : -0x8.599b3p-4 : inexact-ok
diff --git a/math/auto-libm-test-out-tan b/math/auto-libm-test-out-tan
index 1d5999ab90..7da92d58e2 100644
--- a/math/auto-libm-test-out-tan
+++ b/math/auto-libm-test-out-tan
@@ -3032,6 +3032,189 @@ tan 0x1p-10000
 = tan tonearest binary128 0x1p-10000 : 0x1p-10000 : inexact-ok
 = tan towardzero binary128 0x1p-10000 : 0x1p-10000 : inexact-ok
 = tan upward binary128 0x1p-10000 : 0x1.0000000000000000000000000001p-10000 : inexact-ok
+tan 0x1.69eab0985179bp+246
+= tan downward binary32 0xf.fffffp+124 : -0x9.c9ecbp-4 : inexact-ok
+= tan tonearest binary32 0xf.fffffp+124 : -0x9.c9ecap-4 : inexact-ok
+= tan towardzero binary32 0xf.fffffp+124 : -0x9.c9ecap-4 : inexact-ok
+= tan upward binary32 0xf.fffffp+124 : -0x9.c9ecap-4 : inexact-ok
+= tan downward binary64 0xf.fffffp+124 : -0x9.c9eca5a4c461p-4 : inexact-ok
+= tan tonearest binary64 0xf.fffffp+124 : -0x9.c9eca5a4c461p-4 : inexact-ok
+= tan towardzero binary64 0xf.fffffp+124 : -0x9.c9eca5a4c4608p-4 : inexact-ok
+= tan upward binary64 0xf.fffffp+124 : -0x9.c9eca5a4c4608p-4 : inexact-ok
+= tan downward intel96 0xf.fffffp+124 : -0x9.c9eca5a4c460f93p-4 : inexact-ok
+= tan tonearest intel96 0xf.fffffp+124 : -0x9.c9eca5a4c460f93p-4 : inexact-ok
+= tan towardzero intel96 0xf.fffffp+124 : -0x9.c9eca5a4c460f92p-4 : inexact-ok
+= tan upward intel96 0xf.fffffp+124 : -0x9.c9eca5a4c460f92p-4 : inexact-ok
+= tan downward m68k96 0xf.fffffp+124 : -0x9.c9eca5a4c460f93p-4 : inexact-ok
+= tan tonearest m68k96 0xf.fffffp+124 : -0x9.c9eca5a4c460f93p-4 : inexact-ok
+= tan towardzero m68k96 0xf.fffffp+124 : -0x9.c9eca5a4c460f92p-4 : inexact-ok
+= tan upward m68k96 0xf.fffffp+124 : -0x9.c9eca5a4c460f92p-4 : inexact-ok
+= tan downward binary128 0xf.fffffp+124 : -0x9.c9eca5a4c460f92a1a2e4fbecf58p-4 : inexact-ok
+= tan tonearest binary128 0xf.fffffp+124 : -0x9.c9eca5a4c460f92a1a2e4fbecf5p-4 : inexact-ok
+= tan towardzero binary128 0xf.fffffp+124 : -0x9.c9eca5a4c460f92a1a2e4fbecf5p-4 : inexact-ok
+= tan upward binary128 0xf.fffffp+124 : -0x9.c9eca5a4c460f92a1a2e4fbecf5p-4 : inexact-ok
+= tan downward ibm128 0xf.fffffp+124 : -0x9.c9eca5a4c460f92a1a2e4fbedp-4 : inexact-ok
+= tan tonearest ibm128 0xf.fffffp+124 : -0x9.c9eca5a4c460f92a1a2e4fbedp-4 : inexact-ok
+= tan towardzero ibm128 0xf.fffffp+124 : -0x9.c9eca5a4c460f92a1a2e4fbeccp-4 : inexact-ok
+= tan upward ibm128 0xf.fffffp+124 : -0x9.c9eca5a4c460f92a1a2e4fbeccp-4 : inexact-ok
+= tan downward binary64 0x5.a7aac26145e6cp+244 : 0x2.e4acf97208f5p+56 : inexact-ok
+= tan tonearest binary64 0x5.a7aac26145e6cp+244 : 0x2.e4acf97208f52p+56 : inexact-ok
+= tan towardzero binary64 0x5.a7aac26145e6cp+244 : 0x2.e4acf97208f5p+56 : inexact-ok
+= tan upward binary64 0x5.a7aac26145e6cp+244 : 0x2.e4acf97208f52p+56 : inexact-ok
+= tan downward intel96 0x5.a7aac26145e6cp+244 : 0x2.e4acf97208f51cb4p+56 : inexact-ok
+= tan tonearest intel96 0x5.a7aac26145e6cp+244 : 0x2.e4acf97208f51cb8p+56 : inexact-ok
+= tan towardzero intel96 0x5.a7aac26145e6cp+244 : 0x2.e4acf97208f51cb4p+56 : inexact-ok
+= tan upward intel96 0x5.a7aac26145e6cp+244 : 0x2.e4acf97208f51cb8p+56 : inexact-ok
+= tan downward m68k96 0x5.a7aac26145e6cp+244 : 0x2.e4acf97208f51cb4p+56 : inexact-ok
+= tan tonearest m68k96 0x5.a7aac26145e6cp+244 : 0x2.e4acf97208f51cb8p+56 : inexact-ok
+= tan towardzero m68k96 0x5.a7aac26145e6cp+244 : 0x2.e4acf97208f51cb4p+56 : inexact-ok
+= tan upward m68k96 0x5.a7aac26145e6cp+244 : 0x2.e4acf97208f51cb8p+56 : inexact-ok
+= tan downward binary128 0x5.a7aac26145e6cp+244 : 0x2.e4acf97208f51cb67baeaee72382p+56 : inexact-ok
+= tan tonearest binary128 0x5.a7aac26145e6cp+244 : 0x2.e4acf97208f51cb67baeaee72382p+56 : inexact-ok
+= tan towardzero binary128 0x5.a7aac26145e6cp+244 : 0x2.e4acf97208f51cb67baeaee72382p+56 : inexact-ok
+= tan upward binary128 0x5.a7aac26145e6cp+244 : 0x2.e4acf97208f51cb67baeaee72384p+56 : inexact-ok
+= tan downward ibm128 0x5.a7aac26145e6cp+244 : 0x2.e4acf97208f51cb67baeaee723p+56 : inexact-ok
+= tan tonearest ibm128 0x5.a7aac26145e6cp+244 : 0x2.e4acf97208f51cb67baeaee724p+56 : inexact-ok
+= tan towardzero ibm128 0x5.a7aac26145e6cp+244 : 0x2.e4acf97208f51cb67baeaee723p+56 : inexact-ok
+= tan upward ibm128 0x5.a7aac26145e6cp+244 : 0x2.e4acf97208f51cb67baeaee724p+56 : inexact-ok
+tan 0x1.8577cec54ab8p+47
+= tan downward binary32 0xc.2bbe8p+44 : 0x2.354dbp+0 : inexact-ok
+= tan tonearest binary32 0xc.2bbe8p+44 : 0x2.354db4p+0 : inexact-ok
+= tan towardzero binary32 0xc.2bbe8p+44 : 0x2.354dbp+0 : inexact-ok
+= tan upward binary32 0xc.2bbe8p+44 : 0x2.354db4p+0 : inexact-ok
+= tan downward binary64 0xc.2bbe8p+44 : 0x2.354db38ca5852p+0 : inexact-ok
+= tan tonearest binary64 0xc.2bbe8p+44 : 0x2.354db38ca5852p+0 : inexact-ok
+= tan towardzero binary64 0xc.2bbe8p+44 : 0x2.354db38ca5852p+0 : inexact-ok
+= tan upward binary64 0xc.2bbe8p+44 : 0x2.354db38ca5854p+0 : inexact-ok
+= tan downward intel96 0xc.2bbe8p+44 : 0x2.354db38ca5852fcp+0 : inexact-ok
+= tan tonearest intel96 0xc.2bbe8p+44 : 0x2.354db38ca5852fc4p+0 : inexact-ok
+= tan towardzero intel96 0xc.2bbe8p+44 : 0x2.354db38ca5852fcp+0 : inexact-ok
+= tan upward intel96 0xc.2bbe8p+44 : 0x2.354db38ca5852fc4p+0 : inexact-ok
+= tan downward m68k96 0xc.2bbe8p+44 : 0x2.354db38ca5852fcp+0 : inexact-ok
+= tan tonearest m68k96 0xc.2bbe8p+44 : 0x2.354db38ca5852fc4p+0 : inexact-ok
+= tan towardzero m68k96 0xc.2bbe8p+44 : 0x2.354db38ca5852fcp+0 : inexact-ok
+= tan upward m68k96 0xc.2bbe8p+44 : 0x2.354db38ca5852fc4p+0 : inexact-ok
+= tan downward binary128 0xc.2bbe8p+44 : 0x2.354db38ca5852fc324d592f2dab2p+0 : inexact-ok
+= tan tonearest binary128 0xc.2bbe8p+44 : 0x2.354db38ca5852fc324d592f2dab4p+0 : inexact-ok
+= tan towardzero binary128 0xc.2bbe8p+44 : 0x2.354db38ca5852fc324d592f2dab2p+0 : inexact-ok
+= tan upward binary128 0xc.2bbe8p+44 : 0x2.354db38ca5852fc324d592f2dab4p+0 : inexact-ok
+= tan downward ibm128 0xc.2bbe8p+44 : 0x2.354db38ca5852fc324d592f2dap+0 : inexact-ok
+= tan tonearest ibm128 0xc.2bbe8p+44 : 0x2.354db38ca5852fc324d592f2dbp+0 : inexact-ok
+= tan towardzero ibm128 0xc.2bbe8p+44 : 0x2.354db38ca5852fc324d592f2dap+0 : inexact-ok
+= tan upward ibm128 0xc.2bbe8p+44 : 0x2.354db38ca5852fc324d592f2dbp+0 : inexact-ok
+= tan downward binary32 0xc.2bbe7p+44 : -0x1.f98ad8p+0 : inexact-ok
+= tan tonearest binary32 0xc.2bbe7p+44 : -0x1.f98ad8p+0 : inexact-ok
+= tan towardzero binary32 0xc.2bbe7p+44 : -0x1.f98ad6p+0 : inexact-ok
+= tan upward binary32 0xc.2bbe7p+44 : -0x1.f98ad6p+0 : inexact-ok
+= tan downward binary64 0xc.2bbe7p+44 : -0x1.f98ad7344f059p+0 : inexact-ok
+= tan tonearest binary64 0xc.2bbe7p+44 : -0x1.f98ad7344f059p+0 : inexact-ok
+= tan towardzero binary64 0xc.2bbe7p+44 : -0x1.f98ad7344f058p+0 : inexact-ok
+= tan upward binary64 0xc.2bbe7p+44 : -0x1.f98ad7344f058p+0 : inexact-ok
+= tan downward intel96 0xc.2bbe7p+44 : -0x1.f98ad7344f058d2cp+0 : inexact-ok
+= tan tonearest intel96 0xc.2bbe7p+44 : -0x1.f98ad7344f058d2ap+0 : inexact-ok
+= tan towardzero intel96 0xc.2bbe7p+44 : -0x1.f98ad7344f058d2ap+0 : inexact-ok
+= tan upward intel96 0xc.2bbe7p+44 : -0x1.f98ad7344f058d2ap+0 : inexact-ok
+= tan downward m68k96 0xc.2bbe7p+44 : -0x1.f98ad7344f058d2cp+0 : inexact-ok
+= tan tonearest m68k96 0xc.2bbe7p+44 : -0x1.f98ad7344f058d2ap+0 : inexact-ok
+= tan towardzero m68k96 0xc.2bbe7p+44 : -0x1.f98ad7344f058d2ap+0 : inexact-ok
+= tan upward m68k96 0xc.2bbe7p+44 : -0x1.f98ad7344f058d2ap+0 : inexact-ok
+= tan downward binary128 0xc.2bbe7p+44 : -0x1.f98ad7344f058d2a9d3cb9038e02p+0 : inexact-ok
+= tan tonearest binary128 0xc.2bbe7p+44 : -0x1.f98ad7344f058d2a9d3cb9038e02p+0 : inexact-ok
+= tan towardzero binary128 0xc.2bbe7p+44 : -0x1.f98ad7344f058d2a9d3cb9038e01p+0 : inexact-ok
+= tan upward binary128 0xc.2bbe7p+44 : -0x1.f98ad7344f058d2a9d3cb9038e01p+0 : inexact-ok
+= tan downward ibm128 0xc.2bbe7p+44 : -0x1.f98ad7344f058d2a9d3cb9038e8p+0 : inexact-ok
+= tan tonearest ibm128 0xc.2bbe7p+44 : -0x1.f98ad7344f058d2a9d3cb9038ep+0 : inexact-ok
+= tan towardzero ibm128 0xc.2bbe7p+44 : -0x1.f98ad7344f058d2a9d3cb9038ep+0 : inexact-ok
+= tan upward ibm128 0xc.2bbe7p+44 : -0x1.f98ad7344f058d2a9d3cb9038ep+0 : inexact-ok
+= tan downward binary64 0xc.2bbe762a55cp+44 : 0xd.b2bb1feab61dp+48 : inexact-ok
+= tan tonearest binary64 0xc.2bbe762a55cp+44 : 0xd.b2bb1feab61dp+48 : inexact-ok
+= tan towardzero binary64 0xc.2bbe762a55cp+44 : 0xd.b2bb1feab61dp+48 : inexact-ok
+= tan upward binary64 0xc.2bbe762a55cp+44 : 0xd.b2bb1feab61d8p+48 : inexact-ok
+= tan downward intel96 0xc.2bbe762a55cp+44 : 0xd.b2bb1feab61d13dp+48 : inexact-ok
+= tan tonearest intel96 0xc.2bbe762a55cp+44 : 0xd.b2bb1feab61d13ep+48 : inexact-ok
+= tan towardzero intel96 0xc.2bbe762a55cp+44 : 0xd.b2bb1feab61d13dp+48 : inexact-ok
+= tan upward intel96 0xc.2bbe762a55cp+44 : 0xd.b2bb1feab61d13ep+48 : inexact-ok
+= tan downward m68k96 0xc.2bbe762a55cp+44 : 0xd.b2bb1feab61d13dp+48 : inexact-ok
+= tan tonearest m68k96 0xc.2bbe762a55cp+44 : 0xd.b2bb1feab61d13ep+48 : inexact-ok
+= tan towardzero m68k96 0xc.2bbe762a55cp+44 : 0xd.b2bb1feab61d13dp+48 : inexact-ok
+= tan upward m68k96 0xc.2bbe762a55cp+44 : 0xd.b2bb1feab61d13ep+48 : inexact-ok
+= tan downward binary128 0xc.2bbe762a55cp+44 : 0xd.b2bb1feab61d13de3fb08287e07p+48 : inexact-ok
+= tan tonearest binary128 0xc.2bbe762a55cp+44 : 0xd.b2bb1feab61d13de3fb08287e07p+48 : inexact-ok
+= tan towardzero binary128 0xc.2bbe762a55cp+44 : 0xd.b2bb1feab61d13de3fb08287e07p+48 : inexact-ok
+= tan upward binary128 0xc.2bbe762a55cp+44 : 0xd.b2bb1feab61d13de3fb08287e078p+48 : inexact-ok
+= tan downward ibm128 0xc.2bbe762a55cp+44 : 0xd.b2bb1feab61d13de3fb08287ep+48 : inexact-ok
+= tan tonearest ibm128 0xc.2bbe762a55cp+44 : 0xd.b2bb1feab61d13de3fb08287ep+48 : inexact-ok
+= tan towardzero ibm128 0xc.2bbe762a55cp+44 : 0xd.b2bb1feab61d13de3fb08287ep+48 : inexact-ok
+= tan upward ibm128 0xc.2bbe762a55cp+44 : 0xd.b2bb1feab61d13de3fb08287e4p+48 : inexact-ok
+tan 0x1.dbd58768f97p+45
+= tan downward binary32 0x3.b7ab1p+44 : 0x6.cb1538p-4 : inexact-ok
+= tan tonearest binary32 0x3.b7ab1p+44 : 0x6.cb1538p-4 : inexact-ok
+= tan towardzero binary32 0x3.b7ab1p+44 : 0x6.cb1538p-4 : inexact-ok
+= tan upward binary32 0x3.b7ab1p+44 : 0x6.cb154p-4 : inexact-ok
+= tan downward binary64 0x3.b7ab1p+44 : 0x6.cb1538f077ba4p-4 : inexact-ok
+= tan tonearest binary64 0x3.b7ab1p+44 : 0x6.cb1538f077ba8p-4 : inexact-ok
+= tan towardzero binary64 0x3.b7ab1p+44 : 0x6.cb1538f077ba4p-4 : inexact-ok
+= tan upward binary64 0x3.b7ab1p+44 : 0x6.cb1538f077ba8p-4 : inexact-ok
+= tan downward intel96 0x3.b7ab1p+44 : 0x6.cb1538f077ba7498p-4 : inexact-ok
+= tan tonearest intel96 0x3.b7ab1p+44 : 0x6.cb1538f077ba7498p-4 : inexact-ok
+= tan towardzero intel96 0x3.b7ab1p+44 : 0x6.cb1538f077ba7498p-4 : inexact-ok
+= tan upward intel96 0x3.b7ab1p+44 : 0x6.cb1538f077ba74ap-4 : inexact-ok
+= tan downward m68k96 0x3.b7ab1p+44 : 0x6.cb1538f077ba7498p-4 : inexact-ok
+= tan tonearest m68k96 0x3.b7ab1p+44 : 0x6.cb1538f077ba7498p-4 : inexact-ok
+= tan towardzero m68k96 0x3.b7ab1p+44 : 0x6.cb1538f077ba7498p-4 : inexact-ok
+= tan upward m68k96 0x3.b7ab1p+44 : 0x6.cb1538f077ba74ap-4 : inexact-ok
+= tan downward binary128 0x3.b7ab1p+44 : 0x6.cb1538f077ba749bf017191561d4p-4 : inexact-ok
+= tan tonearest binary128 0x3.b7ab1p+44 : 0x6.cb1538f077ba749bf017191561d4p-4 : inexact-ok
+= tan towardzero binary128 0x3.b7ab1p+44 : 0x6.cb1538f077ba749bf017191561d4p-4 : inexact-ok
+= tan upward binary128 0x3.b7ab1p+44 : 0x6.cb1538f077ba749bf017191561d8p-4 : inexact-ok
+= tan downward ibm128 0x3.b7ab1p+44 : 0x6.cb1538f077ba749bf01719156p-4 : inexact-ok
+= tan tonearest ibm128 0x3.b7ab1p+44 : 0x6.cb1538f077ba749bf017191562p-4 : inexact-ok
+= tan towardzero ibm128 0x3.b7ab1p+44 : 0x6.cb1538f077ba749bf01719156p-4 : inexact-ok
+= tan upward ibm128 0x3.b7ab1p+44 : 0x6.cb1538f077ba749bf017191562p-4 : inexact-ok
+= tan downward binary32 0x3.b7ab0cp+44 : -0x1.62d178p+0 : inexact-ok
+= tan tonearest binary32 0x3.b7ab0cp+44 : -0x1.62d178p+0 : inexact-ok
+= tan towardzero binary32 0x3.b7ab0cp+44 : -0x1.62d176p+0 : inexact-ok
+= tan upward binary32 0x3.b7ab0cp+44 : -0x1.62d176p+0 : inexact-ok
+= tan downward binary64 0x3.b7ab0cp+44 : -0x1.62d177235023fp+0 : inexact-ok
+= tan tonearest binary64 0x3.b7ab0cp+44 : -0x1.62d177235023fp+0 : inexact-ok
+= tan towardzero binary64 0x3.b7ab0cp+44 : -0x1.62d177235023ep+0 : inexact-ok
+= tan upward binary64 0x3.b7ab0cp+44 : -0x1.62d177235023ep+0 : inexact-ok
+= tan downward intel96 0x3.b7ab0cp+44 : -0x1.62d177235023ec84p+0 : inexact-ok
+= tan tonearest intel96 0x3.b7ab0cp+44 : -0x1.62d177235023ec82p+0 : inexact-ok
+= tan towardzero intel96 0x3.b7ab0cp+44 : -0x1.62d177235023ec82p+0 : inexact-ok
+= tan upward intel96 0x3.b7ab0cp+44 : -0x1.62d177235023ec82p+0 : inexact-ok
+= tan downward m68k96 0x3.b7ab0cp+44 : -0x1.62d177235023ec84p+0 : inexact-ok
+= tan tonearest m68k96 0x3.b7ab0cp+44 : -0x1.62d177235023ec82p+0 : inexact-ok
+= tan towardzero m68k96 0x3.b7ab0cp+44 : -0x1.62d177235023ec82p+0 : inexact-ok
+= tan upward m68k96 0x3.b7ab0cp+44 : -0x1.62d177235023ec82p+0 : inexact-ok
+= tan downward binary128 0x3.b7ab0cp+44 : -0x1.62d177235023ec820b6bd254005bp+0 : inexact-ok
+= tan tonearest binary128 0x3.b7ab0cp+44 : -0x1.62d177235023ec820b6bd254005bp+0 : inexact-ok
+= tan towardzero binary128 0x3.b7ab0cp+44 : -0x1.62d177235023ec820b6bd254005ap+0 : inexact-ok
+= tan upward binary128 0x3.b7ab0cp+44 : -0x1.62d177235023ec820b6bd254005ap+0 : inexact-ok
+= tan downward ibm128 0x3.b7ab0cp+44 : -0x1.62d177235023ec820b6bd254008p+0 : inexact-ok
+= tan tonearest ibm128 0x3.b7ab0cp+44 : -0x1.62d177235023ec820b6bd254008p+0 : inexact-ok
+= tan towardzero ibm128 0x3.b7ab0cp+44 : -0x1.62d177235023ec820b6bd254p+0 : inexact-ok
+= tan upward ibm128 0x3.b7ab0cp+44 : -0x1.62d177235023ec820b6bd254p+0 : inexact-ok
+= tan downward binary64 0x3.b7ab0ed1f2ep+44 : -0x3.e527dfc207cap+44 : inexact-ok
+= tan tonearest binary64 0x3.b7ab0ed1f2ep+44 : -0x3.e527dfc207c9ep+44 : inexact-ok
+= tan towardzero binary64 0x3.b7ab0ed1f2ep+44 : -0x3.e527dfc207c9ep+44 : inexact-ok
+= tan upward binary64 0x3.b7ab0ed1f2ep+44 : -0x3.e527dfc207c9ep+44 : inexact-ok
+= tan downward intel96 0x3.b7ab0ed1f2ep+44 : -0x3.e527dfc207c9ea7p+44 : inexact-ok
+= tan tonearest intel96 0x3.b7ab0ed1f2ep+44 : -0x3.e527dfc207c9ea7p+44 : inexact-ok
+= tan towardzero intel96 0x3.b7ab0ed1f2ep+44 : -0x3.e527dfc207c9ea6cp+44 : inexact-ok
+= tan upward intel96 0x3.b7ab0ed1f2ep+44 : -0x3.e527dfc207c9ea6cp+44 : inexact-ok
+= tan downward m68k96 0x3.b7ab0ed1f2ep+44 : -0x3.e527dfc207c9ea7p+44 : inexact-ok
+= tan tonearest m68k96 0x3.b7ab0ed1f2ep+44 : -0x3.e527dfc207c9ea7p+44 : inexact-ok
+= tan towardzero m68k96 0x3.b7ab0ed1f2ep+44 : -0x3.e527dfc207c9ea6cp+44 : inexact-ok
+= tan upward m68k96 0x3.b7ab0ed1f2ep+44 : -0x3.e527dfc207c9ea6cp+44 : inexact-ok
+= tan downward binary128 0x3.b7ab0ed1f2ep+44 : -0x3.e527dfc207c9ea6ef715e064ae78p+44 : inexact-ok
+= tan tonearest binary128 0x3.b7ab0ed1f2ep+44 : -0x3.e527dfc207c9ea6ef715e064ae76p+44 : inexact-ok
+= tan towardzero binary128 0x3.b7ab0ed1f2ep+44 : -0x3.e527dfc207c9ea6ef715e064ae76p+44 : inexact-ok
+= tan upward binary128 0x3.b7ab0ed1f2ep+44 : -0x3.e527dfc207c9ea6ef715e064ae76p+44 : inexact-ok
+= tan downward ibm128 0x3.b7ab0ed1f2ep+44 : -0x3.e527dfc207c9ea6ef715e064afp+44 : inexact-ok
+= tan tonearest ibm128 0x3.b7ab0ed1f2ep+44 : -0x3.e527dfc207c9ea6ef715e064aep+44 : inexact-ok
+= tan towardzero ibm128 0x3.b7ab0ed1f2ep+44 : -0x3.e527dfc207c9ea6ef715e064aep+44 : inexact-ok
+= tan upward ibm128 0x3.b7ab0ed1f2ep+44 : -0x3.e527dfc207c9ea6ef715e064aep+44 : inexact-ok
 tan max
 = tan downward binary32 0xf.fffffp+124 : -0x9.c9ecbp-4 : inexact-ok
 = tan tonearest binary32 0xf.fffffp+124 : -0x9.c9ecap-4 : inexact-ok
diff --git a/sysdeps/generic/math_private.h b/sysdeps/generic/math_private.h
index 3865dcf905..34161cc2f6 100644
--- a/sysdeps/generic/math_private.h
+++ b/sysdeps/generic/math_private.h
@@ -198,6 +198,5 @@ do {								\
 /* Prototypes for functions of the IBM Accurate Mathematical Library.  */
 extern double __sin (double __x);
 extern double __cos (double __x);
-extern int __branred (double __x, double *__a, double *__aa);
 
 #endif /* _MATH_PRIVATE_H_ */
diff --git a/sysdeps/ieee754/dbl-64/Makefile b/sysdeps/ieee754/dbl-64/Makefile
index ac2e2ecc5e..f9f71b7b6f 100644
--- a/sysdeps/ieee754/dbl-64/Makefile
+++ b/sysdeps/ieee754/dbl-64/Makefile
@@ -1,6 +1,4 @@
 ifeq ($(subdir),math)
-# branred depends on precise IEEE double rounding
-CFLAGS-branred.c += $(config-cflags-nofma)
 CFLAGS-e_sqrt.c += $(config-cflags-nofma)
 
 # The symbols alias to lround
diff --git a/sysdeps/ieee754/dbl-64/branred.c b/sysdeps/ieee754/dbl-64/branred.c
deleted file mode 100644
index d78c013d5a..0000000000
--- a/sysdeps/ieee754/dbl-64/branred.c
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * IBM Accurate Mathematical Library
- * Copyright (C) 2001-2026 Free Software Foundation, Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2.1 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, see <https://www.gnu.org/licenses/>.
- */
-/*******************************************************************/
-/*                                                                 */
-/* MODULE_NAME: branred.c                                          */
-/*                                                                 */
-/* FUNCTIONS:   branred                                            */
-/*                                                                 */
-/* FILES NEEDED: branred.h mydefs.h endian.h mpa.h                 */
-/*               mha.c                                             */
-/*                                                                 */
-/* Routine  branred() performs range  reduction of a double number */
-/* x into Double length number  a+aa,such that                     */
-/* x=n*pi/2+(a+aa), abs(a+aa)<pi/4, n=0,+-1,+-2,....               */
-/* Routine returns the integer (n mod 4) of the above description  */
-/* of x.                                                           */
-/*******************************************************************/
-
-#include "endian.h"
-#include "mydefs.h"
-#include "branred.h"
-#include <math.h>
-#include <math_private.h>
-
-#ifndef SECTION
-# define SECTION
-#endif
-
-
-/*******************************************************************/
-/* Routine  branred() performs range  reduction of a double number */
-/* x into Double length number a+aa,such that                      */
-/* x=n*pi/2+(a+aa), abs(a+aa)<pi/4, n=0,+-1,+-2,....               */
-/* Routine return integer (n mod 4)                                */
-/*******************************************************************/
-int
-SECTION
-__branred(double x, double *a, double *aa)
-{
-  int i,k;
-  mynumber  u,gor;
-  double r[6],s,t,sum,b,bb,sum1,sum2,b1,bb1,b2,bb2,x1,x2,t1,t2;
-
-  x*=tm600.x;
-  t=x*split;   /* split x to two numbers */
-  x1=t-(t-x);
-  x2=x-x1;
-  sum=0;
-  u.x = x1;
-  k = (u.i[HIGH_HALF]>>20)&2047;
-  k = (k-450)/24;
-  if (k<0)
-    k=0;
-  gor.x = t576.x;
-  gor.i[HIGH_HALF] -= ((k*24)<<20);
-  for (i=0;i<6;i++)
-    { r[i] = x1*toverp[k+i]*gor.x; gor.x *= tm24.x; }
-  for (i=0;i<3;i++) {
-    s=(r[i]+big.x)-big.x;
-    sum+=s;
-    r[i]-=s;
-  }
-  t=0;
-  for (i=0;i<6;i++)
-    t+=r[5-i];
-  bb=(((((r[0]-t)+r[1])+r[2])+r[3])+r[4])+r[5];
-  s=(t+big.x)-big.x;
-  sum+=s;
-  t-=s;
-  b=t+bb;
-  bb=(t-b)+bb;
-  s=(sum+big1.x)-big1.x;
-  sum-=s;
-  b1=b;
-  bb1=bb;
-  sum1=sum;
-  sum=0;
-
-  u.x = x2;
-  k = (u.i[HIGH_HALF]>>20)&2047;
-  k = (k-450)/24;
-  if (k<0)
-    k=0;
-  gor.x = t576.x;
-  gor.i[HIGH_HALF] -= ((k*24)<<20);
-  for (i=0;i<6;i++)
-    { r[i] = x2*toverp[k+i]*gor.x; gor.x *= tm24.x; }
-  for (i=0;i<3;i++) {
-    s=(r[i]+big.x)-big.x;
-    sum+=s;
-    r[i]-=s;
-  }
-  t=0;
-  for (i=0;i<6;i++)
-    t+=r[5-i];
-  bb=(((((r[0]-t)+r[1])+r[2])+r[3])+r[4])+r[5];
-  s=(t+big.x)-big.x;
- sum+=s;
- t-=s;
- b=t+bb;
- bb=(t-b)+bb;
- s=(sum+big1.x)-big1.x;
- sum-=s;
-
- b2=b;
- bb2=bb;
- sum2=sum;
-
- sum=sum1+sum2;
- b=b1+b2;
- bb = (fabs(b1)>fabs(b2))? (b1-b)+b2 : (b2-b)+b1;
- if (b > 0.5)
-   {b-=1.0; sum+=1.0;}
- else if (b < -0.5)
-   {b+=1.0; sum-=1.0;}
- s=b+(bb+bb1+bb2);
- t=((b-s)+bb)+(bb1+bb2);
- b=s*split;
- t1=b-(b-s);
- t2=s-t1;
- b=s*hp0.x;
- bb=(((t1*mp1.x-b)+t1*mp2.x)+t2*mp1.x)+(t2*mp2.x+s*hp1.x+t*hp0.x);
- s=b+bb;
- t=(b-s)+bb;
- *a=s;
- *aa=t;
- return ((int) sum)&3; /* return quarter of unit circle */
-}
diff --git a/sysdeps/ieee754/dbl-64/branred.h b/sysdeps/ieee754/dbl-64/branred.h
deleted file mode 100644
index d34914d9c3..0000000000
--- a/sysdeps/ieee754/dbl-64/branred.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * IBM Accurate Mathematical Library
- * Copyright (C) 2001-2026 Free Software Foundation, Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2.1 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, see <https://www.gnu.org/licenses/>.
- */
-/************************************************************************/
-/*  MODULE_NAME: branred.h                                              */
-/*                                                                      */
-/*                                                                      */
-/* 	common data and variables definition for BIG or LITTLE ENDIAN   */
-/************************************************************************/
-
-#ifndef BRANRED_H
-#define BRANRED_H
-
-#include <dla.h>
-
-#ifdef BIG_ENDI
-static const mynumber
-
-/**/           t576 = {{0x63f00000, 0x00000000}}, /* 2 ^ 576  */
-/**/          tm600 = {{0x1a700000, 0x00000000}}, /* 2 ^- 600 */
-/**/           tm24 = {{0x3e700000, 0x00000000}}, /* 2 ^- 24  */
-/**/            big = {{0x43380000, 0x00000000}}, /*  6755399441055744      */
-/**/           big1 = {{0x43580000, 0x00000000}}, /* 27021597764222976      */
-/**/            hp0 = {{0x3FF921FB, 0x54442D18}} ,/* 1.5707963267948966     */
-/**/            hp1 = {{0x3C91A626, 0x33145C07}} ,/* 6.123233995736766e-17  */
-/**/            mp1 = {{0x3FF921FB, 0x58000000}}, /* 1.5707963407039642     */
-/**/            mp2 = {{0xBE4DDE97, 0x40000000}}; /*-1.3909067675399456e-08 */
-
-#else
-#ifdef LITTLE_ENDI
-static const mynumber
-
-/**/           t576 = {{0x00000000, 0x63f00000}},  /* 2 ^ 576  */
-/**/          tm600 = {{0x00000000, 0x1a700000}},  /* 2 ^- 600 */
-/**/           tm24 = {{0x00000000, 0x3e700000}},  /* 2 ^- 24  */
-/**/            big = {{0x00000000, 0x43380000}},  /*  6755399441055744      */
-/**/           big1 = {{0x00000000, 0x43580000}},  /* 27021597764222976      */
-/**/            hp0 = {{0x54442D18, 0x3FF921FB}},  /* 1.5707963267948966     */
-/**/            hp1 = {{0x33145C07, 0x3C91A626}},  /* 6.123233995736766e-17  */
-/**/            mp1 = {{0x58000000, 0x3FF921FB}},  /* 1.5707963407039642     */
-/**/            mp2 = {{0x40000000, 0xBE4DDE97}};  /*-1.3909067675399456e-08 */
-
-#endif
-#endif
-
-static const double toverp[75] = { /*  2/ PI base 24*/
-  10680707.0,  7228996.0,  1387004.0,  2578385.0, 16069853.0,
-  12639074.0,  9804092.0,  4427841.0, 16666979.0, 11263675.0,
-  12935607.0,  2387514.0,  4345298.0, 14681673.0,  3074569.0,
-  13734428.0, 16653803.0,  1880361.0, 10960616.0,  8533493.0,
-   3062596.0,  8710556.0,  7349940.0,  6258241.0,  3772886.0,
-   3769171.0,  3798172.0,  8675211.0, 12450088.0,  3874808.0,
-   9961438.0,   366607.0, 15675153.0,  9132554.0,  7151469.0,
-   3571407.0,  2607881.0, 12013382.0,  4155038.0,  6285869.0,
-   7677882.0, 13102053.0, 15825725.0,   473591.0,  9065106.0,
-  15363067.0,  6271263.0,  9264392.0,  5636912.0,  4652155.0,
-   7056368.0, 13614112.0, 10155062.0,  1944035.0,  9527646.0,
-  15080200.0,  6658437.0,  6231200.0,  6832269.0, 16767104.0,
-   5075751.0,  3212806.0,  1398474.0,  7579849.0,  6349435.0,
-  12618859.0,  4703257.0, 12806093.0, 14477321.0,  2786137.0,
-  12875403.0,  9837734.0, 14528324.0, 13719321.0,   343717.0 };
-
-static const double split =  CN;	/* 2^27 + 1 */
-
-#endif
diff --git a/sysdeps/ieee754/dbl-64/e_rem_pio2.c b/sysdeps/ieee754/dbl-64/e_rem_pio2.c
new file mode 100644
index 0000000000..9e910e6999
--- /dev/null
+++ b/sysdeps/ieee754/dbl-64/e_rem_pio2.c
@@ -0,0 +1,76 @@
+/*
+ * ====================================================
+ * 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.
+ * ====================================================
+ */
+
+/* __ieee754_rem_pio2(x,y)
+ *
+ * return the remainder of x rem pi/2 in y[0]+y[1]
+ * use __kernel_rem_pio2()
+ *
+ * The callers (sin, cos, sincos, and tan) reduce smaller arguments
+ * themselves and handle non-finite inputs, so only the huge-argument
+ * path of the original fdlibm routine is kept: the caller guarantees
+ * 1e8 < |x| < 2^1024.
+ */
+
+#include <math.h>
+#include <math_private.h>
+
+/*
+ * Table of constants for 2/pi, 396 Hex digits (476 decimal) of 2/pi
+ */
+static const int32_t two_over_pi[] = {
+0xA2F983, 0x6E4E44, 0x1529FC, 0x2757D1, 0xF534DD, 0xC0DB62,
+0x95993C, 0x439041, 0xFE5163, 0xABDEBB, 0xC561B7, 0x246E3A,
+0x424DD2, 0xE00649, 0x2EEA09, 0xD1921C, 0xFE1DEB, 0x1CB129,
+0xA73EE8, 0x8235F5, 0x2EBB44, 0x84E99C, 0x7026B4, 0x5F7E41,
+0x3991D6, 0x398353, 0x39F49C, 0x845F8B, 0xBDF928, 0x3B1FF8,
+0x97FFDE, 0x05980F, 0xEF2F11, 0x8B5A0A, 0x6D1F6D, 0x367ECF,
+0x27CB09, 0xB74F46, 0x3F669E, 0x5FEA2D, 0x7527BA, 0xC7EBE5,
+0xF17B3D, 0x0739F7, 0x8A5292, 0xEA6BFB, 0x5FB11F, 0x8D5D08,
+0x560330, 0x46FC7B, 0x6BABF0, 0xCFBC20, 0x9AF436, 0x1DA9E3,
+0x91615E, 0xE61B08, 0x659985, 0x5F14A0, 0x68408D, 0xFFD880,
+0x4D7327, 0x310606, 0x1556CA, 0x73A8C9, 0x60E27B, 0xC08C6B,
+};
+
+static const double
+  zero    = 0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */
+  two24   = 1.67772160000000000000e+07; /* 0x41700000, 0x00000000 */
+
+int32_t
+__ieee754_rem_pio2 (double x, double *y)
+{
+  double z;
+  double tx[3];
+  int32_t e0, i, nx, n, ix, hx;
+  uint32_t low;
+
+  GET_HIGH_WORD (hx, x);                /* high word of x */
+  ix = hx & 0x7fffffff;
+  /* set z = scalbn(|x|,ilogb(x)-23) */
+  GET_LOW_WORD (low, x);
+  e0 = (ix >> 20) - 1046;               /* e0 = ilogb(z)-23; */
+  INSERT_WORDS (z, ix - ((int32_t) (e0 << 20)), low);
+  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, y, e0, nx, 2, two_over_pi);
+  if (hx < 0)
+    {
+      y[0] = -y[0]; y[1] = -y[1]; return -n;
+    }
+  return n;
+}
diff --git a/sysdeps/ieee754/dbl-64/s_sin.c b/sysdeps/ieee754/dbl-64/s_sin.c
index 272d560c3e..4fe289bdd2 100644
--- a/sysdeps/ieee754/dbl-64/s_sin.c
+++ b/sysdeps/ieee754/dbl-64/s_sin.c
@@ -23,7 +23,7 @@
 /* FUNCTIONS: usin                                                          */
 /*            ucos                                                          */
 /* FILES NEEDED: dla.h endian.h mpa.h mydefs.h  usncs.h                     */
-/*		 branred.c sincos.tbl					    */
+/*		 e_rem_pio2.c sincos.tbl				    */
 /*                                                                          */
 /* An ultimate sin and cos routine. Given an IEEE double machine number x   */
 /* it computes sin(x) or cos(x) with ~0.55 ULP.				    */
@@ -90,8 +90,6 @@ static const double
   cs4 = -4.16666666666664434524222570944589E-02,
   cs6 = 1.38888874007937613028114285595617E-03;
 
-int __branred (double x, double *a, double *aa);
-
 /* Given a number partitioned into X and DX, this function computes the cosine
    of the number by combining the sin and cos of X (as computed by a variation
    of the Taylor series) with the values looked up from the sin/cos table to
@@ -239,8 +237,9 @@ __sin (double x)
 /* --------------------105414350 <|x| <2^1024------------------------------*/
   else if (k < 0x7ff00000)
     {
-      n = __branred (x, &a, &da);
-      retval = do_sincos (a, da, n);
+      double y[2];
+      n = __ieee754_rem_pio2 (x, y);
+      retval = do_sincos (y[0], y[1], n);
     }
 /*--------------------- |x| > 2^1024 ----------------------------------*/
   else
@@ -304,8 +303,9 @@ __cos (double x)
   /* 105414350 <|x| <2^1024 */
   else if (k < 0x7ff00000)
     {
-      n = __branred (x, &a, &da);
-      retval = do_sincos (a, da, n + 1);
+      double y[2];
+      n = __ieee754_rem_pio2 (x, y);
+      retval = do_sincos (y[0], y[1], n + 1);
     }
 
   else
diff --git a/sysdeps/ieee754/dbl-64/s_sincos.c b/sysdeps/ieee754/dbl-64/s_sincos.c
index 17f795fc14..501031dc37 100644
--- a/sysdeps/ieee754/dbl-64/s_sincos.c
+++ b/sysdeps/ieee754/dbl-64/s_sincos.c
@@ -78,7 +78,15 @@ __sincos (double x, double *sinx, double *cosx)
       unsigned int n;
 
       /* If |x| < 105414350 use simple range reduction.  */
-      n = k < 0x419921FB ? reduce_sincos (x, &a, &da) : __branred (x, &a, &da);
+      if (k < 0x419921FB)
+	n = reduce_sincos (x, &a, &da);
+      else
+	{
+	  double y[2];
+	  n = __ieee754_rem_pio2 (x, y);
+	  a = y[0];
+	  da = y[1];
+	}
       n = n & 3;
 
       if (n == 1 || n == 2)
diff --git a/sysdeps/ieee754/dbl-64/s_tan.c b/sysdeps/ieee754/dbl-64/s_tan.c
index 6568b1cd3c..bb949110ad 100644
--- a/sysdeps/ieee754/dbl-64/s_tan.c
+++ b/sysdeps/ieee754/dbl-64/s_tan.c
@@ -22,7 +22,7 @@
 /*  FUNCTIONS: utan                                                  */
 /*                                                                   */
 /*  FILES NEEDED:dla.h endian.h mydefs.h utan.h                      */
-/*               branred.c                                           */
+/*               e_rem_pio2.c                                        */
 /*               utan.tbl                                            */
 /*                                                                   */
 /*********************************************************************/
@@ -59,8 +59,6 @@ __tan (double x)
 
   double retval;
 
-  int __branred (double, double *, double *);
-
   SET_RESTORE_ROUND_53BIT (FE_TONEAREST);
 
   /* x=+-INF, x=NaN */
@@ -293,8 +291,11 @@ __tan (double x)
 
   /* (---) The case 1e8 < abs(x) < 2**1024 */
   /* Range reduction by algorithm iii */
-  n = (__branred (x, &a, &da)) & 0x00000001;
-  EADD (a, da, t1, t2);
+  {
+    double y[2];
+    n = __ieee754_rem_pio2 (x, y) & 0x00000001;
+    EADD (y[0], y[1], t1, t2);
+  }
   a = t1;
   da = t2;
   if (a < 0.0)
diff --git a/sysdeps/m68k/m680x0/fpu/e_rem_pio2.c b/sysdeps/m68k/m680x0/fpu/e_rem_pio2.c
new file mode 100644
index 0000000000..6e25b021ab
--- /dev/null
+++ b/sysdeps/m68k/m680x0/fpu/e_rem_pio2.c
@@ -0,0 +1 @@
+/* Empty.  */
diff --git a/sysdeps/x86_64/fpu/Makefile b/sysdeps/x86_64/fpu/Makefile
index 8af53b3075..5ad28fc5fc 100644
--- a/sysdeps/x86_64/fpu/Makefile
+++ b/sysdeps/x86_64/fpu/Makefile
@@ -67,18 +67,6 @@ CFLAGS-test-double-vlen4-avx2-wrappers.c = $(double-vlen4-arch-ext2-cflags)
 CFLAGS-test-float-vlen8-avx2-wrappers.c = $(float-vlen8-arch-ext2-cflags)
 endif
 
-ifeq ($(subdir)$(config-cflags-mprefer-vector-width),mathyes)
-# When compiled with -O3 -march=skylake, GCC 8 and 9 optimize some loops
-# in branred.c with 256-bit vector instructions, which leads to store
-# forward stall:
-#
-# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90579
-#
-# Limit vector width to 128 bits to work around this issue.  It improves
-# performance of sin and cos by more than 40% on Skylake.
-CFLAGS-branred.c = -mprefer-vector-width=128
-endif
-
 ifeq ($(subdir)$(build-mathvec),benchtestsyes)
 double-vlen4-arch-ext-cflags = -mavx
 double-vlen4-arch-ext2-cflags = -mavx2