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:
Joseph Myers 2015-11-05 21:56:31 +00:00
parent 939fdd1c36
commit 01189b083b
9 changed files with 60 additions and 8 deletions

View File

@ -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
View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)