1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-30 22:43:12 +03:00

Fix x86/x86_64 scalb (qNaN, -Inf) (bug 16783).

Various x86 / x86_64 versions of scalb / scalbf / scalbl produce
spurious "invalid" exceptions for (qNaN, -Inf) arguments, because this
is wrongly handled like (+/-Inf, -Inf) which *should* raise such an
exception.  (In fact the NaN case of the code determining whether to
quietly return a zero or a NaN for second argument -Inf was
accidentally dead since the code had been made to return a NaN with
exception.)  This patch fixes the code to do the proper test for an
infinity as distinct from a NaN.

(Since the existing code does nothing to distinguish qNaNs and sNaNs
here, this patch doesn't either.  If in future we systematically
implement proper sNaN semantics following TS 18661-1:2014, there will
be lots of bugs to address - Thomas found lots of issues with his
patch <https://sourceware.org/ml/libc-ports/2013-04/msg00008.html> to
add SNaN tests (which never went in and would now require significant
reworking).)

Tested for x86_64 and x86.  Committed.

	[BZ #16783]
	* sysdeps/i386/fpu/e_scalb.S (__ieee754_scalb): Do not handle
	arguments (NaN, -Inf) the same as (+/-Inf, -Inf).
	* sysdeps/i386/fpu/e_scalbf.S (__ieee754_scalbf): Likewise.
	* sysdeps/i386/fpu/e_scalbl.S (__ieee754_scalbl): Likewise.
	* sysdeps/x86_64/fpu/e_scalbl.S (__ieee754_scalbl): Likewise.
	* math/libm-test.inc (scalb_test_data): Add more tests.
This commit is contained in:
Joseph Myers
2015-02-24 17:30:02 +00:00
parent 6909d27675
commit 9438b237ab
7 changed files with 27 additions and 7 deletions

View File

@ -1,3 +1,13 @@
2015-02-24 Joseph Myers <joseph@codesourcery.com>
[BZ #16783]
* sysdeps/i386/fpu/e_scalb.S (__ieee754_scalb): Do not handle
arguments (NaN, -Inf) the same as (+/-Inf, -Inf).
* sysdeps/i386/fpu/e_scalbf.S (__ieee754_scalbf): Likewise.
* sysdeps/i386/fpu/e_scalbl.S (__ieee754_scalbl): Likewise.
* sysdeps/x86_64/fpu/e_scalbl.S (__ieee754_scalbl): Likewise.
* math/libm-test.inc (scalb_test_data): Add more tests.
2015-02-24 Paul Pluzhnikov <ppluzhnikov@google.com> 2015-02-24 Paul Pluzhnikov <ppluzhnikov@google.com>
[BZ #17916] [BZ #17916]

6
NEWS
View File

@ -9,9 +9,9 @@ Version 2.22
* The following bugs are resolved with this release: * The following bugs are resolved with this release:
4719, 14841, 13064, 14094, 15319, 15467, 15790, 16560, 17269, 17523, 4719, 14841, 13064, 14094, 15319, 15467, 15790, 16560, 16783, 17269,
17569, 17588, 17792, 17836, 17912, 17916, 17932, 17944, 17949, 17964, 17523, 17569, 17588, 17792, 17836, 17912, 17916, 17932, 17944, 17949,
17965, 17967, 17969, 17978, 17987, 17991, 17996, 17998, 17999. 17964, 17965, 17967, 17969, 17978, 17987, 17991, 17996, 17998, 17999.
* Character encoding and ctype tables were updated to Unicode 7.0.0, using * Character encoding and ctype tables were updated to Unicode 7.0.0, using
new generator scripts contributed by Pravin Satpute and Mike FABIAN (Red new generator scripts contributed by Pravin Satpute and Mike FABIAN (Red

View File

@ -9139,6 +9139,8 @@ static const struct test_ff_f_data scalb_test_data[] =
TEST_ff_f (scalb, 0, qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), TEST_ff_f (scalb, 0, qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_f (scalb, qnan_value, plus_infty, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), TEST_ff_f (scalb, qnan_value, plus_infty, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_f (scalb, plus_infty, qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), TEST_ff_f (scalb, plus_infty, qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_f (scalb, qnan_value, minus_infty, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_f (scalb, minus_infty, qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_f (scalb, qnan_value, qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), TEST_ff_f (scalb, qnan_value, qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_f (scalb, max_value, max_value, plus_oflow, OVERFLOW_EXCEPTION|ERRNO_PLUS_OFLOW), TEST_ff_f (scalb, max_value, max_value, plus_oflow, OVERFLOW_EXCEPTION|ERRNO_PLUS_OFLOW),

View File

@ -65,8 +65,10 @@ ENTRY(__ieee754_scalb)
fstp %st fstp %st
fstp %st fstp %st
andl $0x80000000, %edx andl $0x80000000, %edx
andl $0x0228, %eax
cmpl $0x0028, %eax
je 4f
andl $8, %eax andl $8, %eax
jnz 4f
shrl $27, %edx shrl $27, %edx
addl %edx, %eax addl %edx, %eax
fldl MOX(zero_nan, %eax, 1) fldl MOX(zero_nan, %eax, 1)

View File

@ -67,8 +67,10 @@ ENTRY(__ieee754_scalbf)
fstp %st fstp %st
fstp %st fstp %st
andl $0x80000000, %edx andl $0x80000000, %edx
andl $0x0228, %eax
cmpl $0x0028, %eax
je 4f
andl $8, %eax andl $8, %eax
jnz 4f
shrl $27, %edx shrl $27, %edx
addl %edx, %eax addl %edx, %eax
fldl MOX(zero_nan, %eax, 1) fldl MOX(zero_nan, %eax, 1)

View File

@ -67,8 +67,10 @@ ENTRY(__ieee754_scalbl)
fstp %st fstp %st
fstp %st fstp %st
andl $0x8000, %edx andl $0x8000, %edx
andl $0x0228, %eax
cmpl $0x0028, %eax
je 4f
andl $8, %eax andl $8, %eax
jnz 4f
shrl $11, %edx shrl $11, %edx
addl %edx, %eax addl %edx, %eax
fldl MOX(zero_nan, %eax, 1) fldl MOX(zero_nan, %eax, 1)

View File

@ -61,8 +61,10 @@ ENTRY(__ieee754_scalbl)
fstp %st fstp %st
fstp %st fstp %st
andl $0x8000, %edx andl $0x8000, %edx
andl $0x0228, %eax
cmpl $0x0028, %eax
je 4f
andl $8, %eax andl $8, %eax
jnz 4f
shrl $11, %edx shrl $11, %edx
addl %edx, %eax addl %edx, %eax
#ifdef PIC #ifdef PIC