mirror of
https://sourceware.org/git/glibc.git
synced 2025-01-03 00:10:10 +00:00
Fix i386/x86_64 log* (1) zero sign for -ffinite-math-only (bug 19213).
For the -ffinite-math-only versions of various x86_64 and x86 log* functions, a zero result from log* (1) is returned with incorrect sign in round-downward mode. This patch fixes this in a similar way to the previous fixes for the non-*_finite versions of the functions. Tested for x86_64 and x86 (including an i586 build), together with a patch that will be applied separately to enable the main libm-test.inc tests for the finite-math-only functions. [BZ #19213] * sysdeps/i386/fpu/e_log.S (__log_finite): Ensure +0 is always returned for argument 1. * sysdeps/i386/fpu/e_logf.S (__logf_finite): Likewise. * sysdeps/i386/fpu/e_logl.S (__logl_finite): Likewise. * sysdeps/i386/i686/fpu/e_logl.S (__logl_finite): Likewise. * sysdeps/x86_64/fpu/e_log10l.S (__log10l_finite): Likewise. * sysdeps/x86_64/fpu/e_log2l.S (__log2l_finite): Likewise. * sysdeps/x86_64/fpu/e_logl.S (__logl_finite): Likewise.
This commit is contained in:
parent
939fdd1c36
commit
01189b083b
10
ChangeLog
10
ChangeLog
@ -1,5 +1,15 @@
|
|||||||
2015-11-05 Joseph Myers <joseph@codesourcery.com>
|
2015-11-05 Joseph Myers <joseph@codesourcery.com>
|
||||||
|
|
||||||
|
[BZ #19213]
|
||||||
|
* sysdeps/i386/fpu/e_log.S (__log_finite): Ensure +0 is always
|
||||||
|
returned for argument 1.
|
||||||
|
* sysdeps/i386/fpu/e_logf.S (__logf_finite): Likewise.
|
||||||
|
* sysdeps/i386/fpu/e_logl.S (__logl_finite): Likewise.
|
||||||
|
* sysdeps/i386/i686/fpu/e_logl.S (__logl_finite): Likewise.
|
||||||
|
* sysdeps/x86_64/fpu/e_log10l.S (__log10l_finite): Likewise.
|
||||||
|
* sysdeps/x86_64/fpu/e_log2l.S (__log2l_finite): Likewise.
|
||||||
|
* sysdeps/x86_64/fpu/e_logl.S (__logl_finite): Likewise.
|
||||||
|
|
||||||
[BZ #19211]
|
[BZ #19211]
|
||||||
* math/bits/math-finite.h (lgamma): Set signgam if [__USE_MISC ||
|
* math/bits/math-finite.h (lgamma): Set signgam if [__USE_MISC ||
|
||||||
__USE_XOPEN], not if [!__USE_ISOC99].
|
__USE_XOPEN], not if [!__USE_ISOC99].
|
||||||
|
2
NEWS
2
NEWS
@ -22,7 +22,7 @@ Version 2.23
|
|||||||
19003, 19007, 19012, 19016, 19018, 19032, 19046, 19048, 19049, 19050,
|
19003, 19007, 19012, 19016, 19018, 19032, 19046, 19048, 19049, 19050,
|
||||||
19059, 19071, 19074, 19076, 19077, 19078, 19079, 19085, 19086, 19088,
|
19059, 19071, 19074, 19076, 19077, 19078, 19079, 19085, 19086, 19088,
|
||||||
19094, 19095, 19124, 19125, 19129, 19134, 19137, 19156, 19174, 19181,
|
19094, 19095, 19124, 19125, 19129, 19134, 19137, 19156, 19174, 19181,
|
||||||
19189, 19201, 19205, 19209, 19211, 19212.
|
19189, 19201, 19205, 19209, 19211, 19212, 19213.
|
||||||
|
|
||||||
* A defect in the malloc implementation, present since glibc 2.15 (2012) or
|
* A defect in the malloc implementation, present since glibc 2.15 (2012) or
|
||||||
glibc 2.10 via --enable-experimental-malloc (2009), could result in the
|
glibc 2.10 via --enable-experimental-malloc (2009), could result in the
|
||||||
|
@ -80,7 +80,13 @@ ENTRY(__log_finite)
|
|||||||
fnstsw // x-1 : x : log(2)
|
fnstsw // x-1 : x : log(2)
|
||||||
andb $0x45, %ah
|
andb $0x45, %ah
|
||||||
jz 2b
|
jz 2b
|
||||||
fstp %st(1) // x-1 : log(2)
|
fxam
|
||||||
|
fnstsw
|
||||||
|
andb $0x45, %ah
|
||||||
|
cmpb $0x40, %ah
|
||||||
|
jne 6f
|
||||||
|
fabs // log(1) is +0 in all rounding modes.
|
||||||
|
6: fstp %st(1) // x-1 : log(2)
|
||||||
fyl2xp1 // log(x)
|
fyl2xp1 // log(x)
|
||||||
ret
|
ret
|
||||||
END(__log_finite)
|
END(__log_finite)
|
||||||
|
@ -81,7 +81,13 @@ ENTRY(__logf_finite)
|
|||||||
fnstsw // x-1 : x : log(2)
|
fnstsw // x-1 : x : log(2)
|
||||||
andb $0x45, %ah
|
andb $0x45, %ah
|
||||||
jz 2b
|
jz 2b
|
||||||
fstp %st(1) // x-1 : log(2)
|
fxam
|
||||||
|
fnstsw
|
||||||
|
andb $0x45, %ah
|
||||||
|
cmpb $0x40, %ah
|
||||||
|
jne 6f
|
||||||
|
fabs // log(1) is +0 in all rounding modes.
|
||||||
|
6: fstp %st(1) // x-1 : log(2)
|
||||||
fyl2xp1 // log(x)
|
fyl2xp1 // log(x)
|
||||||
ret
|
ret
|
||||||
END(__logf_finite)
|
END(__logf_finite)
|
||||||
|
@ -84,7 +84,13 @@ ENTRY(__logl_finite)
|
|||||||
fnstsw // x-1 : x : log(2)
|
fnstsw // x-1 : x : log(2)
|
||||||
andb $0x45, %ah
|
andb $0x45, %ah
|
||||||
jz 2b
|
jz 2b
|
||||||
fstp %st(1) // x-1 : log(2)
|
fxam
|
||||||
|
fnstsw
|
||||||
|
andb $0x45, %ah
|
||||||
|
cmpb $0x40, %ah
|
||||||
|
jne 7f
|
||||||
|
fabs // log(1) is +0 in all rounding modes.
|
||||||
|
7: fstp %st(1) // x-1 : log(2)
|
||||||
fyl2xp1 // log(x)
|
fyl2xp1 // log(x)
|
||||||
ret
|
ret
|
||||||
END(__logl_finite)
|
END(__logl_finite)
|
||||||
|
@ -81,7 +81,13 @@ ENTRY(__logl_finite)
|
|||||||
fcomip %st(1) // |x-1| : x-1 : x : log(2)
|
fcomip %st(1) // |x-1| : x-1 : x : log(2)
|
||||||
fstp %st(0) // x-1 : x : log(2)
|
fstp %st(0) // x-1 : x : log(2)
|
||||||
jc 2b
|
jc 2b
|
||||||
fstp %st(1) // x-1 : log(2)
|
fxam
|
||||||
|
fnstsw
|
||||||
|
andb $0x45, %ah
|
||||||
|
cmpb $0x40, %ah
|
||||||
|
jne 6f
|
||||||
|
fabs // log(1) is +0 in all rounding modes.
|
||||||
|
6: fstp %st(1) // x-1 : log(2)
|
||||||
fyl2xp1 // log(x)
|
fyl2xp1 // log(x)
|
||||||
ret
|
ret
|
||||||
END(__logl_finite)
|
END(__logl_finite)
|
||||||
|
@ -79,7 +79,13 @@ ENTRY(__log10l_finite)
|
|||||||
fnstsw // x-1 : x : log10(2)
|
fnstsw // x-1 : x : log10(2)
|
||||||
andb $0x45, %ah
|
andb $0x45, %ah
|
||||||
jz 2b
|
jz 2b
|
||||||
fstp %st(1) // x-1 : log10(2)
|
fxam
|
||||||
|
fnstsw
|
||||||
|
andb $0x45, %ah
|
||||||
|
cmpb $0x40, %ah
|
||||||
|
jne 6f
|
||||||
|
fabs // log10(1) is +0 in all rounding modes.
|
||||||
|
6: fstp %st(1) // x-1 : log10(2)
|
||||||
fyl2xp1 // log10(x)
|
fyl2xp1 // log10(x)
|
||||||
ret
|
ret
|
||||||
END(__log10l_finite)
|
END(__log10l_finite)
|
||||||
|
@ -78,7 +78,13 @@ ENTRY(__log2l_finite)
|
|||||||
fnstsw // x-1 : x : 1
|
fnstsw // x-1 : x : 1
|
||||||
andb $0x45, %ah
|
andb $0x45, %ah
|
||||||
jz 2b
|
jz 2b
|
||||||
fstp %st(1) // x-1 : 1
|
fxam
|
||||||
|
fnstsw
|
||||||
|
andb $0x45, %ah
|
||||||
|
cmpb $0x40, %ah
|
||||||
|
jne 6f
|
||||||
|
fabs // log2(1) is +0 in all rounding modes.
|
||||||
|
6: fstp %st(1) // x-1 : 1
|
||||||
fyl2xp1 // log(x)
|
fyl2xp1 // log(x)
|
||||||
ret
|
ret
|
||||||
END (__log2l_finite)
|
END (__log2l_finite)
|
||||||
|
@ -81,7 +81,13 @@ ENTRY(__logl_finite)
|
|||||||
fnstsw // x-1 : x : log(2)
|
fnstsw // x-1 : x : log(2)
|
||||||
andb $0x45, %ah
|
andb $0x45, %ah
|
||||||
jz 2b
|
jz 2b
|
||||||
fstp %st(1) // x-1 : log(2)
|
fxam
|
||||||
|
fnstsw
|
||||||
|
andb $0x45, %ah
|
||||||
|
cmpb $0x40, %ah
|
||||||
|
jne 7f
|
||||||
|
fabs // log(1) is +0 in all rounding modes.
|
||||||
|
7: fstp %st(1) // x-1 : log(2)
|
||||||
fyl2xp1 // log(x)
|
fyl2xp1 // log(x)
|
||||||
ret
|
ret
|
||||||
END (__logl_finite)
|
END (__logl_finite)
|
||||||
|
Loading…
Reference in New Issue
Block a user