From 9438b237abca11de201dd10483717299eafb1f0b Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Tue, 24 Feb 2015 17:30:02 +0000 Subject: 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 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. --- sysdeps/x86_64/fpu/e_scalbl.S | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'sysdeps/x86_64/fpu/e_scalbl.S') diff --git a/sysdeps/x86_64/fpu/e_scalbl.S b/sysdeps/x86_64/fpu/e_scalbl.S index c422d53b1c..331bee580c 100644 --- a/sysdeps/x86_64/fpu/e_scalbl.S +++ b/sysdeps/x86_64/fpu/e_scalbl.S @@ -61,8 +61,10 @@ ENTRY(__ieee754_scalbl) fstp %st fstp %st andl $0x8000, %edx + andl $0x0228, %eax + cmpl $0x0028, %eax + je 4f andl $8, %eax - jnz 4f shrl $11, %edx addl %edx, %eax #ifdef PIC -- cgit 1.4.1