mirror of
git://sourceware.org/git/glibc.git
synced 2025-02-23 13:09:58 +08:00
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:
parent
b3a9f56ba5
commit
4ba7a00fe3
@ -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
4
NEWS
@ -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.
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user