From 01189b083b8ce54fc568fd2ab0dd433d869ede0e Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Thu, 5 Nov 2015 21:56:31 +0000 Subject: 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. --- ChangeLog | 10 ++++++++++ NEWS | 2 +- sysdeps/i386/fpu/e_log.S | 8 +++++++- sysdeps/i386/fpu/e_logf.S | 8 +++++++- sysdeps/i386/fpu/e_logl.S | 8 +++++++- sysdeps/i386/i686/fpu/e_logl.S | 8 +++++++- sysdeps/x86_64/fpu/e_log10l.S | 8 +++++++- sysdeps/x86_64/fpu/e_log2l.S | 8 +++++++- sysdeps/x86_64/fpu/e_logl.S | 8 +++++++- 9 files changed, 60 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9c78a11722..95dae4bafa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,15 @@ 2015-11-05 Joseph Myers + [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]. diff --git a/NEWS b/NEWS index b462e85ddc..4e419980fe 100644 --- a/NEWS +++ b/NEWS @@ -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 diff --git a/sysdeps/i386/fpu/e_log.S b/sysdeps/i386/fpu/e_log.S index 3fa32aad3c..335df22577 100644 --- a/sysdeps/i386/fpu/e_log.S +++ b/sysdeps/i386/fpu/e_log.S @@ -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) diff --git a/sysdeps/i386/fpu/e_logf.S b/sysdeps/i386/fpu/e_logf.S index ca83d39cef..de967a31f5 100644 --- a/sysdeps/i386/fpu/e_logf.S +++ b/sysdeps/i386/fpu/e_logf.S @@ -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) diff --git a/sysdeps/i386/fpu/e_logl.S b/sysdeps/i386/fpu/e_logl.S index 828e98aa8d..7a6d370e8f 100644 --- a/sysdeps/i386/fpu/e_logl.S +++ b/sysdeps/i386/fpu/e_logl.S @@ -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) diff --git a/sysdeps/i386/i686/fpu/e_logl.S b/sysdeps/i386/i686/fpu/e_logl.S index 0ccc8fc71e..e9ecbcd472 100644 --- a/sysdeps/i386/i686/fpu/e_logl.S +++ b/sysdeps/i386/i686/fpu/e_logl.S @@ -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) diff --git a/sysdeps/x86_64/fpu/e_log10l.S b/sysdeps/x86_64/fpu/e_log10l.S index 2607ad199b..8fa61644c1 100644 --- a/sysdeps/x86_64/fpu/e_log10l.S +++ b/sysdeps/x86_64/fpu/e_log10l.S @@ -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) diff --git a/sysdeps/x86_64/fpu/e_log2l.S b/sysdeps/x86_64/fpu/e_log2l.S index c12906d456..a063255ddd 100644 --- a/sysdeps/x86_64/fpu/e_log2l.S +++ b/sysdeps/x86_64/fpu/e_log2l.S @@ -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) diff --git a/sysdeps/x86_64/fpu/e_logl.S b/sysdeps/x86_64/fpu/e_logl.S index 047b8db88a..dbe6fd59dc 100644 --- a/sysdeps/x86_64/fpu/e_logl.S +++ b/sysdeps/x86_64/fpu/e_logl.S @@ -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) -- cgit 1.4.1