Fix __ieee754_logl (-LDBL_MAX) in FE_DOWNWARD mode (bug 17022).

This patch fixes __ieee754_logl (-LDBL_MAX) on x86_64 and x86 not to
subtract 1 from its argument and so cause spurious overflow in
FE_DOWNWARD mode.  (For any argument strictly less than -1, it doesn't
matter whether or not 1 is subtracted before computing log1p, as long
as the result doesn't overflow to -Inf.)

Tested x86_64 and x86.  (This particular case lacks test coverage,
since the testsuite doesn't cover -lieee, but it will be covered by
tests after the following patch to test pow in all rounding modes,
which was the context in which this bug was found.)

	[BZ #17022]
	* sysdeps/i386/fpu/e_logl.S (__ieee754_logl): Do not subtract 1
	from arguments -2 or below.
	* sysdeps/i386/i686/fpu/e_logl.S (__ieee754_logl): Likewise.
	* sysdeps/x86_64/fpu/e_logl.S (__ieee754_logl): Likewise.
This commit is contained in:
Joseph Myers 2014-06-18 12:32:01 +00:00
parent b3a9f56ba5
commit 4ba7a00fe3
5 changed files with 22 additions and 5 deletions

View File

@ -1,3 +1,11 @@
2014-06-18 Joseph Myers <joseph@codesourcery.com>
[BZ #17022]
* sysdeps/i386/fpu/e_logl.S (__ieee754_logl): Do not subtract 1
from arguments -2 or below.
* sysdeps/i386/i686/fpu/e_logl.S (__ieee754_logl): Likewise.
* sysdeps/x86_64/fpu/e_logl.S (__ieee754_logl): Likewise.
2014-06-18 Andreas Schwab <schwab@suse.de>
[BZ #17062]

4
NEWS
View File

@ -19,8 +19,8 @@ Version 2.20
16791, 16796, 16799, 16800, 16815, 16823, 16824, 16831, 16838, 16849,
16854, 16876, 16877, 16878, 16882, 16885, 16888, 16890, 16912, 16915,
16916, 16917, 16922, 16927, 16928, 16932, 16943, 16958, 16965, 16966,
16967, 16977, 16978, 16984, 16990, 16996, 17009, 17031, 17042, 17048,
17058, 17062.
16967, 16977, 16978, 16984, 16990, 16996, 17009, 17022, 17031, 17042,
17048, 17058, 17062.
* The minimum Linux kernel version that this version of the GNU C Library
can be used with is 2.6.32.

View File

@ -40,8 +40,11 @@ ENTRY(__ieee754_logl)
fld %st // x : x : log(2)
sahf
jc 3f // in case x is NaN or +-Inf
movzwl 4+8(%esp), %eax
cmpl $0xc000, %eax
jae 6f // x <= -2, avoid overflow from -LDBL_MAX - 1.
4: fsubl MO(one) // x-1 : x : log(2)
fld %st // x-1 : x-1 : x : log(2)
6: fld %st // x-1 : x-1 : x : log(2)
fabs // |x-1| : x-1 : x : log(2)
fcompl MO(limit) // x-1 : x : log(2)
fnstsw // x-1 : x : log(2)

View File

@ -39,8 +39,11 @@ ENTRY(__ieee754_logl)
LOAD_PIC_REG (dx)
#endif
fld %st // x : x : log(2)
movzwl 4+8(%esp), %eax
cmpl $0xc000, %eax
jae 5f // x <= -2, avoid overflow from -LDBL_MAX - 1.
fsubl MO(one) // x-1 : x : log(2)
fld %st // x-1 : x-1 : x : log(2)
5: fld %st // x-1 : x-1 : x : log(2)
fabs // |x-1| : x-1 : x : log(2)
fld MO(limit) // 0.29 : |x-1| : x-1 : x : log(2)
fcomip %st(1) // |x-1| : x-1 : x : log(2)

View File

@ -38,8 +38,11 @@ ENTRY(__ieee754_logl)
fld %st // x : x : log(2)
testb $1, %ah
jnz 3f // in case x is NaN or +-Inf
movzwl 8+8(%rsp), %eax
cmpl $0xc000, %eax
jae 6f // x <= -2, avoid overflow from -LDBL_MAX - 1.
4: fsubl MO(one) // x-1 : x : log(2)
fld %st // x-1 : x-1 : x : log(2)
6: fld %st // x-1 : x-1 : x : log(2)
fabs // |x-1| : x-1 : x : log(2)
fcompl MO(limit) // x-1 : x : log(2)
fnstsw // x-1 : x : log(2)