]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Fix i386/x86_64 log* (1) zero sign for -ffinite-math-only (bug 19213).
authorJoseph Myers <joseph@codesourcery.com>
Thu, 5 Nov 2015 21:56:31 +0000 (21:56 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Thu, 5 Nov 2015 21:56:31 +0000 (21:56 +0000)
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
NEWS
sysdeps/i386/fpu/e_log.S
sysdeps/i386/fpu/e_logf.S
sysdeps/i386/fpu/e_logl.S
sysdeps/i386/i686/fpu/e_logl.S
sysdeps/x86_64/fpu/e_log10l.S
sysdeps/x86_64/fpu/e_log2l.S
sysdeps/x86_64/fpu/e_logl.S

index 9c78a117221b7fff6eb20012ba061b79403494b0..95dae4bafa4896ac964880ffd66588f7a30c9678 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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].
diff --git a/NEWS b/NEWS
index b462e85ddcc2ab39ee1bd0387d0f05cd2ee8d789..4e419980fe3e28f28143dd42d5e966d4c921e937 100644 (file)
--- 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
index 3fa32aad3c0e7bfb77e37e6389c6b6aef105fcee..335df2257712b834dee7a2531e392e3acc844bab 100644 (file)
@@ -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)
index ca83d39cef3139292454a72bb464060afc63aa61..de967a31f5a0f1da998d53a710b87d2302f1c5d3 100644 (file)
@@ -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)
index 828e98aa8d7b5d3d7542fb4ab7ea484c8ab56142..7a6d370e8fc89dbe195c7da41673bf08d6349f4e 100644 (file)
@@ -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)
index 0ccc8fc71e314477fc42f40a2d97a6eae797b7d2..e9ecbcd472e1d467cdab8a50df0d6737b5609256 100644 (file)
@@ -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)
index 2607ad199b8ec49fd6b85cc2fff3422a60862900..8fa61644c1f677b48477e0cdb41bf40cb0d7be93 100644 (file)
@@ -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)
index c12906d456cb55e2883c1584edc827b689407e92..a063255dddfceb0c58e2dc1238a0d5a2025e7abb 100644 (file)
@@ -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)
index 047b8db88ae199419df12982ea5aa7d8e7abbacc..dbe6fd59dc7ec046e426e1f1f34b986e81553dc9 100644 (file)
@@ -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)