about summary refs log tree commit diff
path: root/math
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2013-12-19 13:36:10 +0000
committerJoseph Myers <joseph@codesourcery.com>2013-12-19 13:36:10 +0000
commitf88acd39da2a509081e541b84ecbf204ef20f9e8 (patch)
tree383c0bcce4b3e74c9150d01550e7c412e47981bd /math
parentc688b4196014e0162a1ff11120f6c9516be0c6cb (diff)
downloadglibc-f88acd39da2a509081e541b84ecbf204ef20f9e8.tar.gz
glibc-f88acd39da2a509081e541b84ecbf204ef20f9e8.tar.xz
glibc-f88acd39da2a509081e541b84ecbf204ef20f9e8.zip
Fix x86/x86_64 expm1 inaccuracy near 0 in directed rounding modes (bug 16293).
Bug 16293 is inaccuracy of x86/x86_64 versions of expm1, near 0 in
directed rounding modes, that arises from frndint rounding the
exponent to 1 or -1 instead of 0, resulting in large cancellation
error.  This inaccuracy in turn affects other functions such as sinh
that use expm1.  This patch fixes the problem by setting
round-to-nearest mode temporarily around the affected calls to
frndint.  I don't think this is needed for other uses of frndint, such
as in exp itself, as only for expm1 is the cancellation error
significant.

Tested x86_64 and x86 and ulps updated accordingly.

	* sysdeps/i386/fpu/e_expl.S (IEEE754_EXPL) [USE_AS_EXPM1L]: Set
	round-to-nearest mode when using frndint.
	* sysdeps/i386/fpu/s_expm1.S (__expm1): Likewise.
	* sysdeps/i386/fpu/s_expm1f.S (__expm1f): Likewise.
	* sysdeps/x86_64/fpu/e_expl.S (IEEE754_EXPL) [USE_AS_EXPM1L]:
	Likewise.
	* math/auto-libm-test-in: Add more tests of expm1.  Do not expect
	sinh test to fail.
	* math/auto-libm-test-out: Regenerated.
	* math/libm-test.inc (TEST_COND_x86_64): Remove macro.
	(TEST_COND_x86): Likewise.
	(expm1_tonearest_test_data): New array.
	(expm1_test_tonearest): New function.
	(expm1_towardzero_test_data): New array.
	(expm1_test_towardzero): New function.
	(expm1_downward_test_data): New array.
	(expm1_test_downward): New function.
	(expm1_upward_test_data): New array.
	(expm1_test_upward): New function.
	(main): Run the new test functions.
	* sysdeps/i386/fpu/libm-test-ulps: Update.
	* sysdeps/x86_64/fpu/libm-test-ulps: Likewise.
Diffstat (limited to 'math')
-rw-r--r--math/auto-libm-test-in19
-rw-r--r--math/auto-libm-test-out450
-rw-r--r--math/libm-test.inc72
3 files changed, 502 insertions, 39 deletions
diff --git a/math/auto-libm-test-in b/math/auto-libm-test-in
index 50e0e6b628..28e9d455b6 100644
--- a/math/auto-libm-test-in
+++ b/math/auto-libm-test-in
@@ -281,6 +281,22 @@ expm1 -100000.0
 expm1 100000.0
 expm1 max
 expm1 -max
+expm1 0x1p-2
+expm1 -0x1p-2
+expm1 0x1p-10
+expm1 -0x1p-10
+expm1 0x1p-20
+expm1 -0x1p-20
+expm1 0x1p-29
+expm1 -0x1p-29
+expm1 0x1p-32
+expm1 -0x1p-32
+expm1 0x1p-50
+expm1 -0x1p-50
+expm1 0x1p-64
+expm1 -0x1p-64
+expm1 0x1p-100
+expm1 -0x1p-100
 
 hypot 0 0
 hypot 0 -0
@@ -835,8 +851,7 @@ sin 10
 sinh 0
 sinh -0
 sinh 0.75
-# Bug 16293: expm1 inaccurate in directed rounding modes.
-sinh 0x8p-32 xfail:x86_64:ldbl-96-intel xfail:x86
+sinh 0x8p-32
 sinh 22
 sinh 23
 sinh 24
diff --git a/math/auto-libm-test-out b/math/auto-libm-test-out
index e80e363380..06a7591b90 100644
--- a/math/auto-libm-test-out
+++ b/math/auto-libm-test-out
@@ -10893,6 +10893,406 @@ expm1 -max
 = expm1 tonearest ldbl-128ibm -0xf.ffffffffffffbffffffffffffcp+1020L : -0x1p+0L : inexact-ok
 = expm1 towardzero ldbl-128ibm -0xf.ffffffffffffbffffffffffffcp+1020L : -0xf.fffffffffffffffffffffffffcp-4L : inexact-ok
 = expm1 upward ldbl-128ibm -0xf.ffffffffffffbffffffffffffcp+1020L : -0xf.fffffffffffffffffffffffffcp-4L : inexact-ok
+expm1 0x1p-2
+= expm1 downward flt-32 0x4p-4f : 0x4.8b5e38p-4f : inexact-ok
+= expm1 tonearest flt-32 0x4p-4f : 0x4.8b5e4p-4f : inexact-ok
+= expm1 towardzero flt-32 0x4p-4f : 0x4.8b5e38p-4f : inexact-ok
+= expm1 upward flt-32 0x4p-4f : 0x4.8b5e4p-4f : inexact-ok
+= expm1 downward dbl-64 0x4p-4 : 0x4.8b5e3c3e81864p-4 : inexact-ok
+= expm1 tonearest dbl-64 0x4p-4 : 0x4.8b5e3c3e81868p-4 : inexact-ok
+= expm1 towardzero dbl-64 0x4p-4 : 0x4.8b5e3c3e81864p-4 : inexact-ok
+= expm1 upward dbl-64 0x4p-4 : 0x4.8b5e3c3e81868p-4 : inexact-ok
+= expm1 downward ldbl-96-intel 0x4p-4L : 0x4.8b5e3c3e8186676p-4L : inexact-ok
+= expm1 tonearest ldbl-96-intel 0x4p-4L : 0x4.8b5e3c3e81866768p-4L : inexact-ok
+= expm1 towardzero ldbl-96-intel 0x4p-4L : 0x4.8b5e3c3e8186676p-4L : inexact-ok
+= expm1 upward ldbl-96-intel 0x4p-4L : 0x4.8b5e3c3e81866768p-4L : inexact-ok
+= expm1 downward ldbl-96-m68k 0x4p-4L : 0x4.8b5e3c3e8186676p-4L : inexact-ok
+= expm1 tonearest ldbl-96-m68k 0x4p-4L : 0x4.8b5e3c3e81866768p-4L : inexact-ok
+= expm1 towardzero ldbl-96-m68k 0x4p-4L : 0x4.8b5e3c3e8186676p-4L : inexact-ok
+= expm1 upward ldbl-96-m68k 0x4p-4L : 0x4.8b5e3c3e81866768p-4L : inexact-ok
+= expm1 downward ldbl-128 0x4p-4L : 0x4.8b5e3c3e81866767bc3b69baabe4p-4L : inexact-ok
+= expm1 tonearest ldbl-128 0x4p-4L : 0x4.8b5e3c3e81866767bc3b69baabe4p-4L : inexact-ok
+= expm1 towardzero ldbl-128 0x4p-4L : 0x4.8b5e3c3e81866767bc3b69baabe4p-4L : inexact-ok
+= expm1 upward ldbl-128 0x4p-4L : 0x4.8b5e3c3e81866767bc3b69baabe8p-4L : inexact-ok
+= expm1 downward ldbl-128ibm 0x4p-4L : 0x4.8b5e3c3e81866767bc3b69baaap-4L : inexact-ok
+= expm1 tonearest ldbl-128ibm 0x4p-4L : 0x4.8b5e3c3e81866767bc3b69baacp-4L : inexact-ok
+= expm1 towardzero ldbl-128ibm 0x4p-4L : 0x4.8b5e3c3e81866767bc3b69baaap-4L : inexact-ok
+= expm1 upward ldbl-128ibm 0x4p-4L : 0x4.8b5e3c3e81866767bc3b69baacp-4L : inexact-ok
+expm1 -0x1p-2
+= expm1 downward flt-32 -0x4p-4f : -0x3.8a0834p-4f : inexact-ok
+= expm1 tonearest flt-32 -0x4p-4f : -0x3.8a083p-4f : inexact-ok
+= expm1 towardzero flt-32 -0x4p-4f : -0x3.8a083p-4f : inexact-ok
+= expm1 upward flt-32 -0x4p-4f : -0x3.8a083p-4f : inexact-ok
+= expm1 downward dbl-64 -0x4p-4 : -0x3.8a0830a9befaap-4 : inexact-ok
+= expm1 tonearest dbl-64 -0x4p-4 : -0x3.8a0830a9befa8p-4 : inexact-ok
+= expm1 towardzero dbl-64 -0x4p-4 : -0x3.8a0830a9befa8p-4 : inexact-ok
+= expm1 upward dbl-64 -0x4p-4 : -0x3.8a0830a9befa8p-4 : inexact-ok
+= expm1 downward ldbl-96-intel -0x4p-4L : -0x3.8a0830a9befa8bccp-4L : inexact-ok
+= expm1 tonearest ldbl-96-intel -0x4p-4L : -0x3.8a0830a9befa8bccp-4L : inexact-ok
+= expm1 towardzero ldbl-96-intel -0x4p-4L : -0x3.8a0830a9befa8bc8p-4L : inexact-ok
+= expm1 upward ldbl-96-intel -0x4p-4L : -0x3.8a0830a9befa8bc8p-4L : inexact-ok
+= expm1 downward ldbl-96-m68k -0x4p-4L : -0x3.8a0830a9befa8bccp-4L : inexact-ok
+= expm1 tonearest ldbl-96-m68k -0x4p-4L : -0x3.8a0830a9befa8bccp-4L : inexact-ok
+= expm1 towardzero ldbl-96-m68k -0x4p-4L : -0x3.8a0830a9befa8bc8p-4L : inexact-ok
+= expm1 upward ldbl-96-m68k -0x4p-4L : -0x3.8a0830a9befa8bc8p-4L : inexact-ok
+= expm1 downward ldbl-128 -0x4p-4L : -0x3.8a0830a9befa8bcbea343629c972p-4L : inexact-ok
+= expm1 tonearest ldbl-128 -0x4p-4L : -0x3.8a0830a9befa8bcbea343629c97p-4L : inexact-ok
+= expm1 towardzero ldbl-128 -0x4p-4L : -0x3.8a0830a9befa8bcbea343629c97p-4L : inexact-ok
+= expm1 upward ldbl-128 -0x4p-4L : -0x3.8a0830a9befa8bcbea343629c97p-4L : inexact-ok
+= expm1 downward ldbl-128ibm -0x4p-4L : -0x3.8a0830a9befa8bcbea343629cap-4L : inexact-ok
+= expm1 tonearest ldbl-128ibm -0x4p-4L : -0x3.8a0830a9befa8bcbea343629c9p-4L : inexact-ok
+= expm1 towardzero ldbl-128ibm -0x4p-4L : -0x3.8a0830a9befa8bcbea343629c9p-4L : inexact-ok
+= expm1 upward ldbl-128ibm -0x4p-4L : -0x3.8a0830a9befa8bcbea343629c9p-4L : inexact-ok
+expm1 0x1p-10
+= expm1 downward flt-32 0x4p-12f : 0x4.008008p-12f : inexact-ok
+= expm1 tonearest flt-32 0x4p-12f : 0x4.008008p-12f : inexact-ok
+= expm1 towardzero flt-32 0x4p-12f : 0x4.008008p-12f : inexact-ok
+= expm1 upward flt-32 0x4p-12f : 0x4.00801p-12f : inexact-ok
+= expm1 downward dbl-64 0x4p-12 : 0x4.00800aab555dcp-12 : inexact-ok
+= expm1 tonearest dbl-64 0x4p-12 : 0x4.00800aab555dcp-12 : inexact-ok
+= expm1 towardzero dbl-64 0x4p-12 : 0x4.00800aab555dcp-12 : inexact-ok
+= expm1 upward dbl-64 0x4p-12 : 0x4.00800aab555ep-12 : inexact-ok
+= expm1 downward ldbl-96-intel 0x4p-12L : 0x4.00800aab555dde38p-12L : inexact-ok
+= expm1 tonearest ldbl-96-intel 0x4p-12L : 0x4.00800aab555dde38p-12L : inexact-ok
+= expm1 towardzero ldbl-96-intel 0x4p-12L : 0x4.00800aab555dde38p-12L : inexact-ok
+= expm1 upward ldbl-96-intel 0x4p-12L : 0x4.00800aab555dde4p-12L : inexact-ok
+= expm1 downward ldbl-96-m68k 0x4p-12L : 0x4.00800aab555dde38p-12L : inexact-ok
+= expm1 tonearest ldbl-96-m68k 0x4p-12L : 0x4.00800aab555dde38p-12L : inexact-ok
+= expm1 towardzero ldbl-96-m68k 0x4p-12L : 0x4.00800aab555dde38p-12L : inexact-ok
+= expm1 upward ldbl-96-m68k 0x4p-12L : 0x4.00800aab555dde4p-12L : inexact-ok
+= expm1 downward ldbl-128 0x4p-12L : 0x4.00800aab555dde38e6ce86e92778p-12L : inexact-ok
+= expm1 tonearest ldbl-128 0x4p-12L : 0x4.00800aab555dde38e6ce86e9277cp-12L : inexact-ok
+= expm1 towardzero ldbl-128 0x4p-12L : 0x4.00800aab555dde38e6ce86e92778p-12L : inexact-ok
+= expm1 upward ldbl-128 0x4p-12L : 0x4.00800aab555dde38e6ce86e9277cp-12L : inexact-ok
+= expm1 downward ldbl-128ibm 0x4p-12L : 0x4.00800aab555dde38e6ce86e926p-12L : inexact-ok
+= expm1 tonearest ldbl-128ibm 0x4p-12L : 0x4.00800aab555dde38e6ce86e928p-12L : inexact-ok
+= expm1 towardzero ldbl-128ibm 0x4p-12L : 0x4.00800aab555dde38e6ce86e926p-12L : inexact-ok
+= expm1 upward ldbl-128ibm 0x4p-12L : 0x4.00800aab555dde38e6ce86e928p-12L : inexact-ok
+expm1 -0x1p-10
+= expm1 downward flt-32 -0x4p-12f : -0x3.ff800cp-12f : inexact-ok
+= expm1 tonearest flt-32 -0x4p-12f : -0x3.ff800cp-12f : inexact-ok
+= expm1 towardzero flt-32 -0x4p-12f : -0x3.ff8008p-12f : inexact-ok
+= expm1 upward flt-32 -0x4p-12f : -0x3.ff8008p-12f : inexact-ok
+= expm1 downward dbl-64 -0x4p-12 : -0x3.ff800aaa0008ap-12 : inexact-ok
+= expm1 tonearest dbl-64 -0x4p-12 : -0x3.ff800aaa00088p-12 : inexact-ok
+= expm1 towardzero dbl-64 -0x4p-12 : -0x3.ff800aaa00088p-12 : inexact-ok
+= expm1 upward dbl-64 -0x4p-12 : -0x3.ff800aaa00088p-12 : inexact-ok
+= expm1 downward ldbl-96-intel -0x4p-12L : -0x3.ff800aaa0008883p-12L : inexact-ok
+= expm1 tonearest ldbl-96-intel -0x4p-12L : -0x3.ff800aaa0008882cp-12L : inexact-ok
+= expm1 towardzero ldbl-96-intel -0x4p-12L : -0x3.ff800aaa0008882cp-12L : inexact-ok
+= expm1 upward ldbl-96-intel -0x4p-12L : -0x3.ff800aaa0008882cp-12L : inexact-ok
+= expm1 downward ldbl-96-m68k -0x4p-12L : -0x3.ff800aaa0008883p-12L : inexact-ok
+= expm1 tonearest ldbl-96-m68k -0x4p-12L : -0x3.ff800aaa0008882cp-12L : inexact-ok
+= expm1 towardzero ldbl-96-m68k -0x4p-12L : -0x3.ff800aaa0008882cp-12L : inexact-ok
+= expm1 upward ldbl-96-m68k -0x4p-12L : -0x3.ff800aaa0008882cp-12L : inexact-ok
+= expm1 downward ldbl-128 -0x4p-12L : -0x3.ff800aaa0008882d861847853132p-12L : inexact-ok
+= expm1 tonearest ldbl-128 -0x4p-12L : -0x3.ff800aaa0008882d861847853132p-12L : inexact-ok
+= expm1 towardzero ldbl-128 -0x4p-12L : -0x3.ff800aaa0008882d86184785313p-12L : inexact-ok
+= expm1 upward ldbl-128 -0x4p-12L : -0x3.ff800aaa0008882d86184785313p-12L : inexact-ok
+= expm1 downward ldbl-128ibm -0x4p-12L : -0x3.ff800aaa0008882d8618478532p-12L : inexact-ok
+= expm1 tonearest ldbl-128ibm -0x4p-12L : -0x3.ff800aaa0008882d8618478531p-12L : inexact-ok
+= expm1 towardzero ldbl-128ibm -0x4p-12L : -0x3.ff800aaa0008882d8618478531p-12L : inexact-ok
+= expm1 upward ldbl-128ibm -0x4p-12L : -0x3.ff800aaa0008882d8618478531p-12L : inexact-ok
+expm1 0x1p-20
+= expm1 downward flt-32 0x1p-20f : 0x1.000008p-20f : inexact-ok
+= expm1 tonearest flt-32 0x1p-20f : 0x1.000008p-20f : inexact-ok
+= expm1 towardzero flt-32 0x1p-20f : 0x1.000008p-20f : inexact-ok
+= expm1 upward flt-32 0x1p-20f : 0x1.00000ap-20f : inexact-ok
+= expm1 downward dbl-64 0x1p-20 : 0x1.00000800002aap-20 : inexact-ok
+= expm1 tonearest dbl-64 0x1p-20 : 0x1.00000800002abp-20 : inexact-ok
+= expm1 towardzero dbl-64 0x1p-20 : 0x1.00000800002aap-20 : inexact-ok
+= expm1 upward dbl-64 0x1p-20 : 0x1.00000800002abp-20 : inexact-ok
+= expm1 downward ldbl-96-intel 0x1p-20L : 0x1.00000800002aaaaap-20L : inexact-ok
+= expm1 tonearest ldbl-96-intel 0x1p-20L : 0x1.00000800002aaaacp-20L : inexact-ok
+= expm1 towardzero ldbl-96-intel 0x1p-20L : 0x1.00000800002aaaaap-20L : inexact-ok
+= expm1 upward ldbl-96-intel 0x1p-20L : 0x1.00000800002aaaacp-20L : inexact-ok
+= expm1 downward ldbl-96-m68k 0x1p-20L : 0x1.00000800002aaaaap-20L : inexact-ok
+= expm1 tonearest ldbl-96-m68k 0x1p-20L : 0x1.00000800002aaaacp-20L : inexact-ok
+= expm1 towardzero ldbl-96-m68k 0x1p-20L : 0x1.00000800002aaaaap-20L : inexact-ok
+= expm1 upward ldbl-96-m68k 0x1p-20L : 0x1.00000800002aaaacp-20L : inexact-ok
+= expm1 downward ldbl-128 0x1p-20L : 0x1.00000800002aaaab55555777777dp-20L : inexact-ok
+= expm1 tonearest ldbl-128 0x1p-20L : 0x1.00000800002aaaab55555777777dp-20L : inexact-ok
+= expm1 towardzero ldbl-128 0x1p-20L : 0x1.00000800002aaaab55555777777dp-20L : inexact-ok
+= expm1 upward ldbl-128 0x1p-20L : 0x1.00000800002aaaab55555777777ep-20L : inexact-ok
+= expm1 downward ldbl-128ibm 0x1p-20L : 0x1.00000800002aaaab5555577777p-20L : inexact-ok
+= expm1 tonearest ldbl-128ibm 0x1p-20L : 0x1.00000800002aaaab55555777778p-20L : inexact-ok
+= expm1 towardzero ldbl-128ibm 0x1p-20L : 0x1.00000800002aaaab5555577777p-20L : inexact-ok
+= expm1 upward ldbl-128ibm 0x1p-20L : 0x1.00000800002aaaab55555777778p-20L : inexact-ok
+expm1 -0x1p-20
+= expm1 downward flt-32 -0x1p-20f : -0xf.ffff9p-24f : inexact-ok
+= expm1 tonearest flt-32 -0x1p-20f : -0xf.ffff8p-24f : inexact-ok
+= expm1 towardzero flt-32 -0x1p-20f : -0xf.ffff8p-24f : inexact-ok
+= expm1 upward flt-32 -0x1p-20f : -0xf.ffff8p-24f : inexact-ok
+= expm1 downward dbl-64 -0x1p-20 : -0xf.ffff800002abp-24 : inexact-ok
+= expm1 tonearest dbl-64 -0x1p-20 : -0xf.ffff800002aa8p-24 : inexact-ok
+= expm1 towardzero dbl-64 -0x1p-20 : -0xf.ffff800002aa8p-24 : inexact-ok
+= expm1 upward dbl-64 -0x1p-20 : -0xf.ffff800002aa8p-24 : inexact-ok
+= expm1 downward ldbl-96-intel -0x1p-20L : -0xf.ffff800002aaaabp-24L : inexact-ok
+= expm1 tonearest ldbl-96-intel -0x1p-20L : -0xf.ffff800002aaaaap-24L : inexact-ok
+= expm1 towardzero ldbl-96-intel -0x1p-20L : -0xf.ffff800002aaaaap-24L : inexact-ok
+= expm1 upward ldbl-96-intel -0x1p-20L : -0xf.ffff800002aaaaap-24L : inexact-ok
+= expm1 downward ldbl-96-m68k -0x1p-20L : -0xf.ffff800002aaaabp-24L : inexact-ok
+= expm1 tonearest ldbl-96-m68k -0x1p-20L : -0xf.ffff800002aaaaap-24L : inexact-ok
+= expm1 towardzero ldbl-96-m68k -0x1p-20L : -0xf.ffff800002aaaaap-24L : inexact-ok
+= expm1 upward ldbl-96-m68k -0x1p-20L : -0xf.ffff800002aaaaap-24L : inexact-ok
+= expm1 downward ldbl-128 -0x1p-20L : -0xf.ffff800002aaaaa00000222221c8p-24L : inexact-ok
+= expm1 tonearest ldbl-128 -0x1p-20L : -0xf.ffff800002aaaaa00000222221c8p-24L : inexact-ok
+= expm1 towardzero ldbl-128 -0x1p-20L : -0xf.ffff800002aaaaa00000222221cp-24L : inexact-ok
+= expm1 upward ldbl-128 -0x1p-20L : -0xf.ffff800002aaaaa00000222221cp-24L : inexact-ok
+= expm1 downward ldbl-128ibm -0x1p-20L : -0xf.ffff800002aaaaa00000222224p-24L : inexact-ok
+= expm1 tonearest ldbl-128ibm -0x1p-20L : -0xf.ffff800002aaaaa0000022222p-24L : inexact-ok
+= expm1 towardzero ldbl-128ibm -0x1p-20L : -0xf.ffff800002aaaaa0000022222p-24L : inexact-ok
+= expm1 upward ldbl-128ibm -0x1p-20L : -0xf.ffff800002aaaaa0000022222p-24L : inexact-ok
+expm1 0x1p-29
+= expm1 downward flt-32 0x8p-32f : 0x8p-32f : inexact-ok
+= expm1 tonearest flt-32 0x8p-32f : 0x8p-32f : inexact-ok
+= expm1 towardzero flt-32 0x8p-32f : 0x8p-32f : inexact-ok
+= expm1 upward flt-32 0x8p-32f : 0x8.00001p-32f : inexact-ok
+= expm1 downward dbl-64 0x8p-32 : 0x8.0000002p-32 : inexact-ok
+= expm1 tonearest dbl-64 0x8p-32 : 0x8.0000002p-32 : inexact-ok
+= expm1 towardzero dbl-64 0x8p-32 : 0x8.0000002p-32 : inexact-ok
+= expm1 upward dbl-64 0x8p-32 : 0x8.0000002000008p-32 : inexact-ok
+= expm1 downward ldbl-96-intel 0x8p-32L : 0x8.000000200000005p-32L : inexact-ok
+= expm1 tonearest ldbl-96-intel 0x8p-32L : 0x8.000000200000005p-32L : inexact-ok
+= expm1 towardzero ldbl-96-intel 0x8p-32L : 0x8.000000200000005p-32L : inexact-ok
+= expm1 upward ldbl-96-intel 0x8p-32L : 0x8.000000200000006p-32L : inexact-ok
+= expm1 downward ldbl-96-m68k 0x8p-32L : 0x8.000000200000005p-32L : inexact-ok
+= expm1 tonearest ldbl-96-m68k 0x8p-32L : 0x8.000000200000005p-32L : inexact-ok
+= expm1 towardzero ldbl-96-m68k 0x8p-32L : 0x8.000000200000005p-32L : inexact-ok
+= expm1 upward ldbl-96-m68k 0x8p-32L : 0x8.000000200000006p-32L : inexact-ok
+= expm1 downward ldbl-128 0x8p-32L : 0x8.0000002000000055555556p-32L : inexact-ok
+= expm1 tonearest ldbl-128 0x8p-32L : 0x8.0000002000000055555556p-32L : inexact-ok
+= expm1 towardzero ldbl-128 0x8p-32L : 0x8.0000002000000055555556p-32L : inexact-ok
+= expm1 upward ldbl-128 0x8p-32L : 0x8.0000002000000055555556000008p-32L : inexact-ok
+= expm1 downward ldbl-128ibm 0x8p-32L : 0x8.0000002000000055555556p-32L : inexact-ok
+= expm1 tonearest ldbl-128ibm 0x8p-32L : 0x8.0000002000000055555556p-32L : inexact-ok
+= expm1 towardzero ldbl-128ibm 0x8p-32L : 0x8.0000002000000055555556p-32L : inexact-ok
+= expm1 upward ldbl-128ibm 0x8p-32L : 0x8.00000020000000555555560004p-32L : inexact-ok
+expm1 -0x1p-29
+= expm1 downward flt-32 -0x8p-32f : -0x8p-32f : inexact-ok
+= expm1 tonearest flt-32 -0x8p-32f : -0x8p-32f : inexact-ok
+= expm1 towardzero flt-32 -0x8p-32f : -0x7.fffff8p-32f : inexact-ok
+= expm1 upward flt-32 -0x8p-32f : -0x7.fffff8p-32f : inexact-ok
+= expm1 downward dbl-64 -0x8p-32 : -0x7.ffffffe000004p-32 : inexact-ok
+= expm1 tonearest dbl-64 -0x8p-32 : -0x7.ffffffep-32 : inexact-ok
+= expm1 towardzero dbl-64 -0x8p-32 : -0x7.ffffffep-32 : inexact-ok
+= expm1 upward dbl-64 -0x8p-32 : -0x7.ffffffep-32 : inexact-ok
+= expm1 downward ldbl-96-intel -0x8p-32L : -0x7.ffffffe000000058p-32L : inexact-ok
+= expm1 tonearest ldbl-96-intel -0x8p-32L : -0x7.ffffffe000000058p-32L : inexact-ok
+= expm1 towardzero ldbl-96-intel -0x8p-32L : -0x7.ffffffe00000005p-32L : inexact-ok
+= expm1 upward ldbl-96-intel -0x8p-32L : -0x7.ffffffe00000005p-32L : inexact-ok
+= expm1 downward ldbl-96-m68k -0x8p-32L : -0x7.ffffffe000000058p-32L : inexact-ok
+= expm1 tonearest ldbl-96-m68k -0x8p-32L : -0x7.ffffffe000000058p-32L : inexact-ok
+= expm1 towardzero ldbl-96-m68k -0x8p-32L : -0x7.ffffffe00000005p-32L : inexact-ok
+= expm1 upward ldbl-96-m68k -0x8p-32L : -0x7.ffffffe00000005p-32L : inexact-ok
+= expm1 downward ldbl-128 -0x8p-32L : -0x7.ffffffe000000055555554aaaaacp-32L : inexact-ok
+= expm1 tonearest ldbl-128 -0x8p-32L : -0x7.ffffffe000000055555554aaaaa8p-32L : inexact-ok
+= expm1 towardzero ldbl-128 -0x8p-32L : -0x7.ffffffe000000055555554aaaaa8p-32L : inexact-ok
+= expm1 upward ldbl-128 -0x8p-32L : -0x7.ffffffe000000055555554aaaaa8p-32L : inexact-ok
+= expm1 downward ldbl-128ibm -0x8p-32L : -0x7.ffffffe000000055555554aaacp-32L : inexact-ok
+= expm1 tonearest ldbl-128ibm -0x8p-32L : -0x7.ffffffe000000055555554aaaap-32L : inexact-ok
+= expm1 towardzero ldbl-128ibm -0x8p-32L : -0x7.ffffffe000000055555554aaaap-32L : inexact-ok
+= expm1 upward ldbl-128ibm -0x8p-32L : -0x7.ffffffe000000055555554aaaap-32L : inexact-ok
+expm1 0x1p-32
+= expm1 downward flt-32 0x1p-32f : 0x1p-32f : inexact-ok
+= expm1 tonearest flt-32 0x1p-32f : 0x1p-32f : inexact-ok
+= expm1 towardzero flt-32 0x1p-32f : 0x1p-32f : inexact-ok
+= expm1 upward flt-32 0x1p-32f : 0x1.000002p-32f : inexact-ok
+= expm1 downward dbl-64 0x1p-32 : 0x1.000000008p-32 : inexact-ok
+= expm1 tonearest dbl-64 0x1p-32 : 0x1.000000008p-32 : inexact-ok
+= expm1 towardzero dbl-64 0x1p-32 : 0x1.000000008p-32 : inexact-ok
+= expm1 upward dbl-64 0x1p-32 : 0x1.0000000080001p-32 : inexact-ok
+= expm1 downward ldbl-96-intel 0x1p-32L : 0x1.000000008p-32L : inexact-ok
+= expm1 tonearest ldbl-96-intel 0x1p-32L : 0x1.000000008p-32L : inexact-ok
+= expm1 towardzero ldbl-96-intel 0x1p-32L : 0x1.000000008p-32L : inexact-ok
+= expm1 upward ldbl-96-intel 0x1p-32L : 0x1.0000000080000002p-32L : inexact-ok
+= expm1 downward ldbl-96-m68k 0x1p-32L : 0x1.000000008p-32L : inexact-ok
+= expm1 tonearest ldbl-96-m68k 0x1p-32L : 0x1.000000008p-32L : inexact-ok
+= expm1 towardzero ldbl-96-m68k 0x1p-32L : 0x1.000000008p-32L : inexact-ok
+= expm1 upward ldbl-96-m68k 0x1p-32L : 0x1.0000000080000002p-32L : inexact-ok
+= expm1 downward ldbl-128 0x1p-32L : 0x1.00000000800000002aaaaaaab555p-32L : inexact-ok
+= expm1 tonearest ldbl-128 0x1p-32L : 0x1.00000000800000002aaaaaaab555p-32L : inexact-ok
+= expm1 towardzero ldbl-128 0x1p-32L : 0x1.00000000800000002aaaaaaab555p-32L : inexact-ok
+= expm1 upward ldbl-128 0x1p-32L : 0x1.00000000800000002aaaaaaab556p-32L : inexact-ok
+= expm1 downward ldbl-128ibm 0x1p-32L : 0x1.00000000800000002aaaaaaab5p-32L : inexact-ok
+= expm1 tonearest ldbl-128ibm 0x1p-32L : 0x1.00000000800000002aaaaaaab58p-32L : inexact-ok
+= expm1 towardzero ldbl-128ibm 0x1p-32L : 0x1.00000000800000002aaaaaaab5p-32L : inexact-ok
+= expm1 upward ldbl-128ibm 0x1p-32L : 0x1.00000000800000002aaaaaaab58p-32L : inexact-ok
+expm1 -0x1p-32
+= expm1 downward flt-32 -0x1p-32f : -0x1p-32f : inexact-ok
+= expm1 tonearest flt-32 -0x1p-32f : -0x1p-32f : inexact-ok
+= expm1 towardzero flt-32 -0x1p-32f : -0xf.fffffp-36f : inexact-ok
+= expm1 upward flt-32 -0x1p-32f : -0xf.fffffp-36f : inexact-ok
+= expm1 downward dbl-64 -0x1p-32 : -0xf.fffffff800008p-36 : inexact-ok
+= expm1 tonearest dbl-64 -0x1p-32 : -0xf.fffffff8p-36 : inexact-ok
+= expm1 towardzero dbl-64 -0x1p-32 : -0xf.fffffff8p-36 : inexact-ok
+= expm1 upward dbl-64 -0x1p-32 : -0xf.fffffff8p-36 : inexact-ok
+= expm1 downward ldbl-96-intel -0x1p-32L : -0xf.fffffff80000001p-36L : inexact-ok
+= expm1 tonearest ldbl-96-intel -0x1p-32L : -0xf.fffffff8p-36L : inexact-ok
+= expm1 towardzero ldbl-96-intel -0x1p-32L : -0xf.fffffff8p-36L : inexact-ok
+= expm1 upward ldbl-96-intel -0x1p-32L : -0xf.fffffff8p-36L : inexact-ok
+= expm1 downward ldbl-96-m68k -0x1p-32L : -0xf.fffffff80000001p-36L : inexact-ok
+= expm1 tonearest ldbl-96-m68k -0x1p-32L : -0xf.fffffff8p-36L : inexact-ok
+= expm1 towardzero ldbl-96-m68k -0x1p-32L : -0xf.fffffff8p-36L : inexact-ok
+= expm1 upward ldbl-96-m68k -0x1p-32L : -0xf.fffffff8p-36L : inexact-ok
+= expm1 downward ldbl-128 -0x1p-32L : -0xf.fffffff800000002aaaaaaaap-36L : inexact-ok
+= expm1 tonearest ldbl-128 -0x1p-32L : -0xf.fffffff800000002aaaaaaaap-36L : inexact-ok
+= expm1 towardzero ldbl-128 -0x1p-32L : -0xf.fffffff800000002aaaaaaa9fff8p-36L : inexact-ok
+= expm1 upward ldbl-128 -0x1p-32L : -0xf.fffffff800000002aaaaaaa9fff8p-36L : inexact-ok
+= expm1 downward ldbl-128ibm -0x1p-32L : -0xf.fffffff800000002aaaaaaaap-36L : inexact-ok
+= expm1 tonearest ldbl-128ibm -0x1p-32L : -0xf.fffffff800000002aaaaaaaap-36L : inexact-ok
+= expm1 towardzero ldbl-128ibm -0x1p-32L : -0xf.fffffff800000002aaaaaaa9fcp-36L : inexact-ok
+= expm1 upward ldbl-128ibm -0x1p-32L : -0xf.fffffff800000002aaaaaaa9fcp-36L : inexact-ok
+expm1 0x1p-50
+= expm1 downward flt-32 0x4p-52f : 0x4p-52f : inexact-ok
+= expm1 tonearest flt-32 0x4p-52f : 0x4p-52f : inexact-ok
+= expm1 towardzero flt-32 0x4p-52f : 0x4p-52f : inexact-ok
+= expm1 upward flt-32 0x4p-52f : 0x4.000008p-52f : inexact-ok
+= expm1 downward dbl-64 0x4p-52 : 0x4.0000000000008p-52 : inexact-ok
+= expm1 tonearest dbl-64 0x4p-52 : 0x4.0000000000008p-52 : inexact-ok
+= expm1 towardzero dbl-64 0x4p-52 : 0x4.0000000000008p-52 : inexact-ok
+= expm1 upward dbl-64 0x4p-52 : 0x4.000000000000cp-52 : inexact-ok
+= expm1 downward ldbl-96-intel 0x4p-52L : 0x4.0000000000008p-52L : inexact-ok
+= expm1 tonearest ldbl-96-intel 0x4p-52L : 0x4.0000000000008p-52L : inexact-ok
+= expm1 towardzero ldbl-96-intel 0x4p-52L : 0x4.0000000000008p-52L : inexact-ok
+= expm1 upward ldbl-96-intel 0x4p-52L : 0x4.0000000000008008p-52L : inexact-ok
+= expm1 downward ldbl-96-m68k 0x4p-52L : 0x4.0000000000008p-52L : inexact-ok
+= expm1 tonearest ldbl-96-m68k 0x4p-52L : 0x4.0000000000008p-52L : inexact-ok
+= expm1 towardzero ldbl-96-m68k 0x4p-52L : 0x4.0000000000008p-52L : inexact-ok
+= expm1 upward ldbl-96-m68k 0x4p-52L : 0x4.0000000000008008p-52L : inexact-ok
+= expm1 downward ldbl-128 0x4p-52L : 0x4.0000000000008000000000000aa8p-52L : inexact-ok
+= expm1 tonearest ldbl-128 0x4p-52L : 0x4.0000000000008000000000000aacp-52L : inexact-ok
+= expm1 towardzero ldbl-128 0x4p-52L : 0x4.0000000000008000000000000aa8p-52L : inexact-ok
+= expm1 upward ldbl-128 0x4p-52L : 0x4.0000000000008000000000000aacp-52L : inexact-ok
+= expm1 downward ldbl-128ibm 0x4p-52L : 0x4.0000000000008000000000000ap-52L : inexact-ok
+= expm1 tonearest ldbl-128ibm 0x4p-52L : 0x4.0000000000008000000000000ap-52L : inexact-ok
+= expm1 towardzero ldbl-128ibm 0x4p-52L : 0x4.0000000000008000000000000ap-52L : inexact-ok
+= expm1 upward ldbl-128ibm 0x4p-52L : 0x4.0000000000008000000000000cp-52L : inexact-ok
+expm1 -0x1p-50
+= expm1 downward flt-32 -0x4p-52f : -0x4p-52f : inexact-ok
+= expm1 tonearest flt-32 -0x4p-52f : -0x4p-52f : inexact-ok
+= expm1 towardzero flt-32 -0x4p-52f : -0x3.fffffcp-52f : inexact-ok
+= expm1 upward flt-32 -0x4p-52f : -0x3.fffffcp-52f : inexact-ok
+= expm1 downward dbl-64 -0x4p-52 : -0x3.ffffffffffffap-52 : inexact-ok
+= expm1 tonearest dbl-64 -0x4p-52 : -0x3.ffffffffffff8p-52 : inexact-ok
+= expm1 towardzero dbl-64 -0x4p-52 : -0x3.ffffffffffff8p-52 : inexact-ok
+= expm1 upward dbl-64 -0x4p-52 : -0x3.ffffffffffff8p-52 : inexact-ok
+= expm1 downward ldbl-96-intel -0x4p-52L : -0x3.ffffffffffff8004p-52L : inexact-ok
+= expm1 tonearest ldbl-96-intel -0x4p-52L : -0x3.ffffffffffff8p-52L : inexact-ok
+= expm1 towardzero ldbl-96-intel -0x4p-52L : -0x3.ffffffffffff8p-52L : inexact-ok
+= expm1 upward ldbl-96-intel -0x4p-52L : -0x3.ffffffffffff8p-52L : inexact-ok
+= expm1 downward ldbl-96-m68k -0x4p-52L : -0x3.ffffffffffff8004p-52L : inexact-ok
+= expm1 tonearest ldbl-96-m68k -0x4p-52L : -0x3.ffffffffffff8p-52L : inexact-ok
+= expm1 towardzero ldbl-96-m68k -0x4p-52L : -0x3.ffffffffffff8p-52L : inexact-ok
+= expm1 upward ldbl-96-m68k -0x4p-52L : -0x3.ffffffffffff8p-52L : inexact-ok
+= expm1 downward ldbl-128 -0x4p-52L : -0x3.ffffffffffff8000000000000aacp-52L : inexact-ok
+= expm1 tonearest ldbl-128 -0x4p-52L : -0x3.ffffffffffff8000000000000aaap-52L : inexact-ok
+= expm1 towardzero ldbl-128 -0x4p-52L : -0x3.ffffffffffff8000000000000aaap-52L : inexact-ok
+= expm1 upward ldbl-128 -0x4p-52L : -0x3.ffffffffffff8000000000000aaap-52L : inexact-ok
+= expm1 downward ldbl-128ibm -0x4p-52L : -0x3.ffffffffffff8000000000000bp-52L : inexact-ok
+= expm1 tonearest ldbl-128ibm -0x4p-52L : -0x3.ffffffffffff8000000000000bp-52L : inexact-ok
+= expm1 towardzero ldbl-128ibm -0x4p-52L : -0x3.ffffffffffff8000000000000ap-52L : inexact-ok
+= expm1 upward ldbl-128ibm -0x4p-52L : -0x3.ffffffffffff8000000000000ap-52L : inexact-ok
+expm1 0x1p-64
+= expm1 downward flt-32 0x1p-64f : 0x1p-64f : inexact-ok
+= expm1 tonearest flt-32 0x1p-64f : 0x1p-64f : inexact-ok
+= expm1 towardzero flt-32 0x1p-64f : 0x1p-64f : inexact-ok
+= expm1 upward flt-32 0x1p-64f : 0x1.000002p-64f : inexact-ok
+= expm1 downward dbl-64 0x1p-64 : 0x1p-64 : inexact-ok
+= expm1 tonearest dbl-64 0x1p-64 : 0x1p-64 : inexact-ok
+= expm1 towardzero dbl-64 0x1p-64 : 0x1p-64 : inexact-ok
+= expm1 upward dbl-64 0x1p-64 : 0x1.0000000000001p-64 : inexact-ok
+= expm1 downward ldbl-96-intel 0x1p-64L : 0x1p-64L : inexact-ok
+= expm1 tonearest ldbl-96-intel 0x1p-64L : 0x1p-64L : inexact-ok
+= expm1 towardzero ldbl-96-intel 0x1p-64L : 0x1p-64L : inexact-ok
+= expm1 upward ldbl-96-intel 0x1p-64L : 0x1.0000000000000002p-64L : inexact-ok
+= expm1 downward ldbl-96-m68k 0x1p-64L : 0x1p-64L : inexact-ok
+= expm1 tonearest ldbl-96-m68k 0x1p-64L : 0x1p-64L : inexact-ok
+= expm1 towardzero ldbl-96-m68k 0x1p-64L : 0x1p-64L : inexact-ok
+= expm1 upward ldbl-96-m68k 0x1p-64L : 0x1.0000000000000002p-64L : inexact-ok
+= expm1 downward ldbl-128 0x1p-64L : 0x1.00000000000000008p-64L : inexact-ok
+= expm1 tonearest ldbl-128 0x1p-64L : 0x1.00000000000000008p-64L : inexact-ok
+= expm1 towardzero ldbl-128 0x1p-64L : 0x1.00000000000000008p-64L : inexact-ok
+= expm1 upward ldbl-128 0x1p-64L : 0x1.0000000000000000800000000001p-64L : inexact-ok
+= expm1 downward ldbl-128ibm 0x1p-64L : 0x1.00000000000000008p-64L : inexact-ok
+= expm1 tonearest ldbl-128ibm 0x1p-64L : 0x1.00000000000000008p-64L : inexact-ok
+= expm1 towardzero ldbl-128ibm 0x1p-64L : 0x1.00000000000000008p-64L : inexact-ok
+= expm1 upward ldbl-128ibm 0x1p-64L : 0x1.000000000000000080000000008p-64L : inexact-ok
+expm1 -0x1p-64
+= expm1 downward flt-32 -0x1p-64f : -0x1p-64f : inexact-ok
+= expm1 tonearest flt-32 -0x1p-64f : -0x1p-64f : inexact-ok
+= expm1 towardzero flt-32 -0x1p-64f : -0xf.fffffp-68f : inexact-ok
+= expm1 upward flt-32 -0x1p-64f : -0xf.fffffp-68f : inexact-ok
+= expm1 downward dbl-64 -0x1p-64 : -0x1p-64 : inexact-ok
+= expm1 tonearest dbl-64 -0x1p-64 : -0x1p-64 : inexact-ok
+= expm1 towardzero dbl-64 -0x1p-64 : -0xf.ffffffffffff8p-68 : inexact-ok
+= expm1 upward dbl-64 -0x1p-64 : -0xf.ffffffffffff8p-68 : inexact-ok
+= expm1 downward ldbl-96-intel -0x1p-64L : -0x1p-64L : inexact-ok
+= expm1 tonearest ldbl-96-intel -0x1p-64L : -0xf.fffffffffffffffp-68L : inexact-ok
+= expm1 towardzero ldbl-96-intel -0x1p-64L : -0xf.fffffffffffffffp-68L : inexact-ok
+= expm1 upward ldbl-96-intel -0x1p-64L : -0xf.fffffffffffffffp-68L : inexact-ok
+= expm1 downward ldbl-96-m68k -0x1p-64L : -0x1p-64L : inexact-ok
+= expm1 tonearest ldbl-96-m68k -0x1p-64L : -0xf.fffffffffffffffp-68L : inexact-ok
+= expm1 towardzero ldbl-96-m68k -0x1p-64L : -0xf.fffffffffffffffp-68L : inexact-ok
+= expm1 upward ldbl-96-m68k -0x1p-64L : -0xf.fffffffffffffffp-68L : inexact-ok
+= expm1 downward ldbl-128 -0x1p-64L : -0xf.fffffffffffffff8p-68L : inexact-ok
+= expm1 tonearest ldbl-128 -0x1p-64L : -0xf.fffffffffffffff8p-68L : inexact-ok
+= expm1 towardzero ldbl-128 -0x1p-64L : -0xf.fffffffffffffff7fffffffffff8p-68L : inexact-ok
+= expm1 upward ldbl-128 -0x1p-64L : -0xf.fffffffffffffff7fffffffffff8p-68L : inexact-ok
+= expm1 downward ldbl-128ibm -0x1p-64L : -0xf.fffffffffffffff8p-68L : inexact-ok
+= expm1 tonearest ldbl-128ibm -0x1p-64L : -0xf.fffffffffffffff8p-68L : inexact-ok
+= expm1 towardzero ldbl-128ibm -0x1p-64L : -0xf.fffffffffffffff7fffffffffcp-68L : inexact-ok
+= expm1 upward ldbl-128ibm -0x1p-64L : -0xf.fffffffffffffff7fffffffffcp-68L : inexact-ok
+expm1 0x1p-100
+= expm1 downward flt-32 0x1p-100f : 0x1p-100f : inexact-ok
+= expm1 tonearest flt-32 0x1p-100f : 0x1p-100f : inexact-ok
+= expm1 towardzero flt-32 0x1p-100f : 0x1p-100f : inexact-ok
+= expm1 upward flt-32 0x1p-100f : 0x1.000002p-100f : inexact-ok
+= expm1 downward dbl-64 0x1p-100 : 0x1p-100 : inexact-ok
+= expm1 tonearest dbl-64 0x1p-100 : 0x1p-100 : inexact-ok
+= expm1 towardzero dbl-64 0x1p-100 : 0x1p-100 : inexact-ok
+= expm1 upward dbl-64 0x1p-100 : 0x1.0000000000001p-100 : inexact-ok
+= expm1 downward ldbl-96-intel 0x1p-100L : 0x1p-100L : inexact-ok
+= expm1 tonearest ldbl-96-intel 0x1p-100L : 0x1p-100L : inexact-ok
+= expm1 towardzero ldbl-96-intel 0x1p-100L : 0x1p-100L : inexact-ok
+= expm1 upward ldbl-96-intel 0x1p-100L : 0x1.0000000000000002p-100L : inexact-ok
+= expm1 downward ldbl-96-m68k 0x1p-100L : 0x1p-100L : inexact-ok
+= expm1 tonearest ldbl-96-m68k 0x1p-100L : 0x1p-100L : inexact-ok
+= expm1 towardzero ldbl-96-m68k 0x1p-100L : 0x1p-100L : inexact-ok
+= expm1 upward ldbl-96-m68k 0x1p-100L : 0x1.0000000000000002p-100L : inexact-ok
+= expm1 downward ldbl-128 0x1p-100L : 0x1.00000000000000000000000008p-100L : inexact-ok
+= expm1 tonearest ldbl-128 0x1p-100L : 0x1.00000000000000000000000008p-100L : inexact-ok
+= expm1 towardzero ldbl-128 0x1p-100L : 0x1.00000000000000000000000008p-100L : inexact-ok
+= expm1 upward ldbl-128 0x1p-100L : 0x1.0000000000000000000000000801p-100L : inexact-ok
+= expm1 downward ldbl-128ibm 0x1p-100L : 0x1.00000000000000000000000008p-100L : inexact-ok
+= expm1 tonearest ldbl-128ibm 0x1p-100L : 0x1.00000000000000000000000008p-100L : inexact-ok
+= expm1 towardzero ldbl-128ibm 0x1p-100L : 0x1.00000000000000000000000008p-100L : inexact-ok
+= expm1 upward ldbl-128ibm 0x1p-100L : 0x1.000000000000000000000000088p-100L : inexact-ok
+expm1 -0x1p-100
+= expm1 downward flt-32 -0x1p-100f : -0x1p-100f : inexact-ok
+= expm1 tonearest flt-32 -0x1p-100f : -0x1p-100f : inexact-ok
+= expm1 towardzero flt-32 -0x1p-100f : -0xf.fffffp-104f : inexact-ok
+= expm1 upward flt-32 -0x1p-100f : -0xf.fffffp-104f : inexact-ok
+= expm1 downward dbl-64 -0x1p-100 : -0x1p-100 : inexact-ok
+= expm1 tonearest dbl-64 -0x1p-100 : -0x1p-100 : inexact-ok
+= expm1 towardzero dbl-64 -0x1p-100 : -0xf.ffffffffffff8p-104 : inexact-ok
+= expm1 upward dbl-64 -0x1p-100 : -0xf.ffffffffffff8p-104 : inexact-ok
+= expm1 downward ldbl-96-intel -0x1p-100L : -0x1p-100L : inexact-ok
+= expm1 tonearest ldbl-96-intel -0x1p-100L : -0x1p-100L : inexact-ok
+= expm1 towardzero ldbl-96-intel -0x1p-100L : -0xf.fffffffffffffffp-104L : inexact-ok
+= expm1 upward ldbl-96-intel -0x1p-100L : -0xf.fffffffffffffffp-104L : inexact-ok
+= expm1 downward ldbl-96-m68k -0x1p-100L : -0x1p-100L : inexact-ok
+= expm1 tonearest ldbl-96-m68k -0x1p-100L : -0x1p-100L : inexact-ok
+= expm1 towardzero ldbl-96-m68k -0x1p-100L : -0xf.fffffffffffffffp-104L : inexact-ok
+= expm1 upward ldbl-96-m68k -0x1p-100L : -0xf.fffffffffffffffp-104L : inexact-ok
+= expm1 downward ldbl-128 -0x1p-100L : -0xf.ffffffffffffffffffffffff8p-104L : inexact-ok
+= expm1 tonearest ldbl-128 -0x1p-100L : -0xf.ffffffffffffffffffffffff8p-104L : inexact-ok
+= expm1 towardzero ldbl-128 -0x1p-100L : -0xf.ffffffffffffffffffffffff7ff8p-104L : inexact-ok
+= expm1 upward ldbl-128 -0x1p-100L : -0xf.ffffffffffffffffffffffff7ff8p-104L : inexact-ok
+= expm1 downward ldbl-128ibm -0x1p-100L : -0xf.ffffffffffffffffffffffff8p-104L : inexact-ok
+= expm1 tonearest ldbl-128ibm -0x1p-100L : -0xf.ffffffffffffffffffffffff8p-104L : inexact-ok
+= expm1 towardzero ldbl-128ibm -0x1p-100L : -0xf.ffffffffffffffffffffffff7cp-104L : inexact-ok
+= expm1 upward ldbl-128ibm -0x1p-100L : -0xf.ffffffffffffffffffffffff7cp-104L : inexact-ok
 hypot 0 0
 = hypot downward flt-32 0x0p+0f 0x0p+0f : 0x0p+0f : inexact-ok
 = hypot tonearest flt-32 0x0p+0f 0x0p+0f : 0x0p+0f : inexact-ok
@@ -61939,31 +62339,31 @@ sinh 0.75
 = sinh tonearest ldbl-128ibm 0xcp-4L : 0xd.283596e9e347f2ee3cf47bf04cp-4L : inexact-ok
 = sinh towardzero ldbl-128ibm 0xcp-4L : 0xd.283596e9e347f2ee3cf47bf048p-4L : inexact-ok
 = sinh upward ldbl-128ibm 0xcp-4L : 0xd.283596e9e347f2ee3cf47bf04cp-4L : inexact-ok
-sinh 0x8p-32 xfail:x86_64:ldbl-96-intel xfail:x86
-= sinh downward flt-32 0x8p-32f : 0x8p-32f : xfail:x86_64:ldbl-96-intel xfail:x86 inexact-ok
-= sinh tonearest flt-32 0x8p-32f : 0x8p-32f : xfail:x86_64:ldbl-96-intel xfail:x86 inexact-ok
-= sinh towardzero flt-32 0x8p-32f : 0x8p-32f : xfail:x86_64:ldbl-96-intel xfail:x86 inexact-ok
-= sinh upward flt-32 0x8p-32f : 0x8.00001p-32f : xfail:x86_64:ldbl-96-intel xfail:x86 inexact-ok
-= sinh downward dbl-64 0x8p-32 : 0x8p-32 : xfail:x86_64:ldbl-96-intel xfail:x86 inexact-ok
-= sinh tonearest dbl-64 0x8p-32 : 0x8p-32 : xfail:x86_64:ldbl-96-intel xfail:x86 inexact-ok
-= sinh towardzero dbl-64 0x8p-32 : 0x8p-32 : xfail:x86_64:ldbl-96-intel xfail:x86 inexact-ok
-= sinh upward dbl-64 0x8p-32 : 0x8.0000000000008p-32 : xfail:x86_64:ldbl-96-intel xfail:x86 inexact-ok
-= sinh downward ldbl-96-intel 0x8p-32L : 0x8.000000000000005p-32L : xfail:x86_64:ldbl-96-intel xfail:x86 inexact-ok
-= sinh tonearest ldbl-96-intel 0x8p-32L : 0x8.000000000000005p-32L : xfail:x86_64:ldbl-96-intel xfail:x86 inexact-ok
-= sinh towardzero ldbl-96-intel 0x8p-32L : 0x8.000000000000005p-32L : xfail:x86_64:ldbl-96-intel xfail:x86 inexact-ok
-= sinh upward ldbl-96-intel 0x8p-32L : 0x8.000000000000006p-32L : xfail:x86_64:ldbl-96-intel xfail:x86 inexact-ok
-= sinh downward ldbl-96-m68k 0x8p-32L : 0x8.000000000000005p-32L : xfail:x86_64:ldbl-96-intel xfail:x86 inexact-ok
-= sinh tonearest ldbl-96-m68k 0x8p-32L : 0x8.000000000000005p-32L : xfail:x86_64:ldbl-96-intel xfail:x86 inexact-ok
-= sinh towardzero ldbl-96-m68k 0x8p-32L : 0x8.000000000000005p-32L : xfail:x86_64:ldbl-96-intel xfail:x86 inexact-ok
-= sinh upward ldbl-96-m68k 0x8p-32L : 0x8.000000000000006p-32L : xfail:x86_64:ldbl-96-intel xfail:x86 inexact-ok
-= sinh downward ldbl-128 0x8p-32L : 0x8.000000000000005555555555555p-32L : xfail:x86_64:ldbl-96-intel xfail:x86 inexact-ok
-= sinh tonearest ldbl-128 0x8p-32L : 0x8.0000000000000055555555555558p-32L : xfail:x86_64:ldbl-96-intel xfail:x86 inexact-ok
-= sinh towardzero ldbl-128 0x8p-32L : 0x8.000000000000005555555555555p-32L : xfail:x86_64:ldbl-96-intel xfail:x86 inexact-ok
-= sinh upward ldbl-128 0x8p-32L : 0x8.0000000000000055555555555558p-32L : xfail:x86_64:ldbl-96-intel xfail:x86 inexact-ok
-= sinh downward ldbl-128ibm 0x8p-32L : 0x8.00000000000000555555555554p-32L : xfail:x86_64:ldbl-96-intel xfail:x86 inexact-ok
-= sinh tonearest ldbl-128ibm 0x8p-32L : 0x8.00000000000000555555555554p-32L : xfail:x86_64:ldbl-96-intel xfail:x86 inexact-ok
-= sinh towardzero ldbl-128ibm 0x8p-32L : 0x8.00000000000000555555555554p-32L : xfail:x86_64:ldbl-96-intel xfail:x86 inexact-ok
-= sinh upward ldbl-128ibm 0x8p-32L : 0x8.00000000000000555555555558p-32L : xfail:x86_64:ldbl-96-intel xfail:x86 inexact-ok
+sinh 0x8p-32
+= sinh downward flt-32 0x8p-32f : 0x8p-32f : inexact-ok
+= sinh tonearest flt-32 0x8p-32f : 0x8p-32f : inexact-ok
+= sinh towardzero flt-32 0x8p-32f : 0x8p-32f : inexact-ok
+= sinh upward flt-32 0x8p-32f : 0x8.00001p-32f : inexact-ok
+= sinh downward dbl-64 0x8p-32 : 0x8p-32 : inexact-ok
+= sinh tonearest dbl-64 0x8p-32 : 0x8p-32 : inexact-ok
+= sinh towardzero dbl-64 0x8p-32 : 0x8p-32 : inexact-ok
+= sinh upward dbl-64 0x8p-32 : 0x8.0000000000008p-32 : inexact-ok
+= sinh downward ldbl-96-intel 0x8p-32L : 0x8.000000000000005p-32L : inexact-ok
+= sinh tonearest ldbl-96-intel 0x8p-32L : 0x8.000000000000005p-32L : inexact-ok
+= sinh towardzero ldbl-96-intel 0x8p-32L : 0x8.000000000000005p-32L : inexact-ok
+= sinh upward ldbl-96-intel 0x8p-32L : 0x8.000000000000006p-32L : inexact-ok
+= sinh downward ldbl-96-m68k 0x8p-32L : 0x8.000000000000005p-32L : inexact-ok
+= sinh tonearest ldbl-96-m68k 0x8p-32L : 0x8.000000000000005p-32L : inexact-ok
+= sinh towardzero ldbl-96-m68k 0x8p-32L : 0x8.000000000000005p-32L : inexact-ok
+= sinh upward ldbl-96-m68k 0x8p-32L : 0x8.000000000000006p-32L : inexact-ok
+= sinh downward ldbl-128 0x8p-32L : 0x8.000000000000005555555555555p-32L : inexact-ok
+= sinh tonearest ldbl-128 0x8p-32L : 0x8.0000000000000055555555555558p-32L : inexact-ok
+= sinh towardzero ldbl-128 0x8p-32L : 0x8.000000000000005555555555555p-32L : inexact-ok
+= sinh upward ldbl-128 0x8p-32L : 0x8.0000000000000055555555555558p-32L : inexact-ok
+= sinh downward ldbl-128ibm 0x8p-32L : 0x8.00000000000000555555555554p-32L : inexact-ok
+= sinh tonearest ldbl-128ibm 0x8p-32L : 0x8.00000000000000555555555554p-32L : inexact-ok
+= sinh towardzero ldbl-128ibm 0x8p-32L : 0x8.00000000000000555555555554p-32L : inexact-ok
+= sinh upward ldbl-128ibm 0x8p-32L : 0x8.00000000000000555555555558p-32L : inexact-ok
 sinh 22
 = sinh downward flt-32 0x1.6p+4f : 0x6.ad6b68p+28f : inexact-ok
 = sinh tonearest flt-32 0x1.6p+4f : 0x6.ad6b7p+28f : inexact-ok
diff --git a/math/libm-test.inc b/math/libm-test.inc
index dea6c8b7ce..aab3ed2987 100644
--- a/math/libm-test.inc
+++ b/math/libm-test.inc
@@ -267,18 +267,6 @@ struct ulp_data
 #define TEST_COND_before_rounding	(!TININESS_AFTER_ROUNDING)
 #define TEST_COND_after_rounding	TININESS_AFTER_ROUNDING
 
-#ifdef __x86_64__
-# define TEST_COND_x86_64	1
-#else
-# define TEST_COND_x86_64	0
-#endif
-
-#ifdef __i386__
-# define TEST_COND_x86		1
-#else
-# define TEST_COND_x86		0
-#endif
-
 /* Various constants (we must supply them precalculated for accuracy).  */
 #define M_PI_6l			.52359877559829887307710723054658383L
 #define M_PI_34l		2.356194490192344928846982537459627163L	/* 3*pi/4 */
@@ -7845,6 +7833,62 @@ expm1_test (void)
 }
 
 
+static const struct test_f_f_data expm1_tonearest_test_data[] =
+  {
+    AUTO_TESTS_f_f (expm1, tonearest),
+  };
+
+static void
+expm1_test_tonearest (void)
+{
+  START (expm1_tonearest);
+  RUN_TEST_LOOP_f_f (expm1, expm1_tonearest_test_data, FE_TONEAREST);
+  END;
+}
+
+
+static const struct test_f_f_data expm1_towardzero_test_data[] =
+  {
+    AUTO_TESTS_f_f (expm1, towardzero),
+  };
+
+static void
+expm1_test_towardzero (void)
+{
+  START (expm1_towardzero);
+  RUN_TEST_LOOP_f_f (expm1, expm1_towardzero_test_data, FE_TOWARDZERO);
+  END;
+}
+
+
+static const struct test_f_f_data expm1_downward_test_data[] =
+  {
+    AUTO_TESTS_f_f (expm1, downward),
+  };
+
+static void
+expm1_test_downward (void)
+{
+  START (expm1_downward);
+  RUN_TEST_LOOP_f_f (expm1, expm1_downward_test_data, FE_DOWNWARD);
+  END;
+}
+
+
+static const struct test_f_f_data expm1_upward_test_data[] =
+  {
+    AUTO_TESTS_f_f (expm1, upward),
+  };
+
+static void
+expm1_test_upward (void)
+{
+  START (expm1_upward);
+  RUN_TEST_LOOP_f_f (expm1, expm1_upward_test_data, FE_UPWARD);
+  END;
+}
+
+
 static const struct test_f_f_data fabs_test_data[] =
   {
     TEST_f_f (fabs, 0, 0, NO_INEXACT_EXCEPTION),
@@ -13337,6 +13381,10 @@ main (int argc, char **argv)
   exp10_test ();
   exp2_test ();
   expm1_test ();
+  expm1_test_tonearest ();
+  expm1_test_towardzero ();
+  expm1_test_downward ();
+  expm1_test_upward ();
   frexp_test ();
   ldexp_test ();
   log_test ();