Skip to content

Commit

Permalink
Fix i386/x86_64 log* (1) zero sign for -ffinite-math-only (bug 19213).
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Joseph Myers committed Nov 5, 2015
1 parent 939fdd1 commit 01189b0
Show file tree
Hide file tree
Showing 9 changed files with 60 additions and 8 deletions.
10 changes: 10 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,5 +1,15 @@
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]
* math/bits/math-finite.h (lgamma): Set signgam if [__USE_MISC ||
__USE_XOPEN], not if [!__USE_ISOC99].
Expand Down
2 changes: 1 addition & 1 deletion NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ Version 2.23
19003, 19007, 19012, 19016, 19018, 19032, 19046, 19048, 19049, 19050,
19059, 19071, 19074, 19076, 19077, 19078, 19079, 19085, 19086, 19088,
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
glibc 2.10 via --enable-experimental-malloc (2009), could result in the
Expand Down
8 changes: 7 additions & 1 deletion sysdeps/i386/fpu/e_log.S
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,13 @@ ENTRY(__log_finite)
fnstsw // x-1 : x : log(2)
andb $0x45, %ah
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)
ret
END(__log_finite)
8 changes: 7 additions & 1 deletion sysdeps/i386/fpu/e_logf.S
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,13 @@ ENTRY(__logf_finite)
fnstsw // x-1 : x : log(2)
andb $0x45, %ah
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)
ret
END(__logf_finite)
8 changes: 7 additions & 1 deletion sysdeps/i386/fpu/e_logl.S
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,13 @@ ENTRY(__logl_finite)
fnstsw // x-1 : x : log(2)
andb $0x45, %ah
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)
ret
END(__logl_finite)
8 changes: 7 additions & 1 deletion sysdeps/i386/i686/fpu/e_logl.S
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,13 @@ ENTRY(__logl_finite)
fcomip %st(1) // |x-1| : x-1 : x : log(2)
fstp %st(0) // x-1 : x : log(2)
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)
ret
END(__logl_finite)
8 changes: 7 additions & 1 deletion sysdeps/x86_64/fpu/e_log10l.S
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,13 @@ ENTRY(__log10l_finite)
fnstsw // x-1 : x : log10(2)
andb $0x45, %ah
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)
ret
END(__log10l_finite)
8 changes: 7 additions & 1 deletion sysdeps/x86_64/fpu/e_log2l.S
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,13 @@ ENTRY(__log2l_finite)
fnstsw // x-1 : x : 1
andb $0x45, %ah
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)
ret
END (__log2l_finite)
8 changes: 7 additions & 1 deletion sysdeps/x86_64/fpu/e_logl.S
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,13 @@ ENTRY(__logl_finite)
fnstsw // x-1 : x : log(2)
andb $0x45, %ah
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)
ret
END (__logl_finite)

0 comments on commit 01189b0

Please sign in to comment.