From f17ac40d7cb8e8c462476b6ab703262f6b8f6da8 Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Fri, 6 Jul 2012 11:17:41 +0000 Subject: Fix expm1 spurious underflow exceptions (bug 6778). --- sysdeps/i386/fpu/s_expm1f.S | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) (limited to 'sysdeps/i386/fpu/s_expm1f.S') diff --git a/sysdeps/i386/fpu/s_expm1f.S b/sysdeps/i386/fpu/s_expm1f.S index 45257d7524..fc82b92341 100644 --- a/sysdeps/i386/fpu/s_expm1f.S +++ b/sysdeps/i386/fpu/s_expm1f.S @@ -51,19 +51,31 @@ ENTRY(__expm1f) jae HIDDEN_JUMPTARGET (__expf) flds 4(%esp) // x - fxam // Is NaN or +-Inf? + fxam // Is NaN, +-Inf or +-0? + xorb $0x80, %ah + cmpl $0xc190, %eax // is num <= -18.0? fstsw %ax movb $0x45, %ch + jb 4f + + // Below -18.0 (may be -NaN or -Inf). + andb %ah, %ch +#ifdef PIC + LOAD_PIC_REG (dx) +#endif + cmpb $0x01, %ch + je 5f // If -NaN, jump. + jmp 2f // -large, possibly -Inf. + +4: // In range -18.0 to 88.5 (may be +-0 but not NaN or +-Inf). andb %ah, %ch cmpb $0x40, %ch je 3f // If +-0, jump. #ifdef PIC LOAD_PIC_REG (dx) #endif - cmpb $0x05, %ch - je 2f // If +-Inf, jump. - fldt MO(l2e) // log2(e) : x +5: fldt MO(l2e) // log2(e) : x fmulp // log2(e)*x fld %st // log2(e)*x : log2(e)*x frndint // int(log2(e)*x) : log2(e)*x @@ -79,9 +91,7 @@ ENTRY(__expm1f) fsubrp %st, %st(1) // 2^(log2(e)*x) ret -2: testl $0x200, %eax // Test sign. - jz 3f // If positive, jump. - fstp %st +2: fstp %st fldl MO(minus1) // Set result to -1.0. 3: ret END(__expm1f) -- cgit 1.4.1