aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/i386
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2015-06-21 18:43:10 +0000
committerJoseph Myers <joseph@codesourcery.com>2015-06-21 18:43:10 +0000
commitcb0937b299182e78307795081489ec1f148bdbd7 (patch)
tree32137f8b8dde65185697602763252a45e40e8472 /sysdeps/i386
parentfea1d8d67363c8b675a4c2533769ae12dc86efff (diff)
downloadglibc-cb0937b299182e78307795081489ec1f148bdbd7.zip
glibc-cb0937b299182e78307795081489ec1f148bdbd7.tar.gz
glibc-cb0937b299182e78307795081489ec1f148bdbd7.tar.bz2
Fix x86_64 / x86 expm1l (-min_subnorm) result sign (bug 18569).
In the x86 / x86_64 implementations of expm1l, when expm1l's result should underflow to 0 (argument minus the least subnormal, in some rounding modes), it can be a zero of the wrong sign. This patch fixes this by returning the argument with underflow forced in that case (this is a 1ulp error relative to the correctly rounded result of -0, which is OK in terms of the documented accuracy goals, whereas a result with the wrong sign never is). Tested for x86_64 and x86. [BZ #18569] * sysdeps/i386/fpu/e_expl.S (IEEE754_EXPL) [USE_AS_EXPM1L]: Force underflow and return argument in case of subnormal argument. * sysdeps/x86_64/fpu/e_expl.S (IEEE754_EXPL) [USE_AS_EXPM1L]: Likewise. * math/auto-libm-test-in: Add more tests of expm1. * math/auto-libm-test-out: Regenerated.
Diffstat (limited to 'sysdeps/i386')
-rw-r--r--sysdeps/i386/fpu/e_expl.S6
1 files changed, 6 insertions, 0 deletions
diff --git a/sysdeps/i386/fpu/e_expl.S b/sysdeps/i386/fpu/e_expl.S
index 74968bb..711c86a 100644
--- a/sysdeps/i386/fpu/e_expl.S
+++ b/sysdeps/i386/fpu/e_expl.S
@@ -122,6 +122,12 @@ ENTRY(IEEE754_EXPL)
normal. */
cmpl $0x0001, %eax
jge 2f
+ /* Force underflow and return the argument, to avoid wrong signs
+ of zero results from the code below in some rounding modes. */
+ fld %st
+ fmul %st
+ fstp %st
+ jmp 2f
#else
movzwl 4+8(%esp), %eax
andl $0x7fff, %eax