]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Fix __ieee754_logl (-LDBL_MAX) in FE_DOWNWARD mode (bug 17022).
authorJoseph Myers <joseph@codesourcery.com>
Wed, 18 Jun 2014 12:32:01 +0000 (12:32 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Wed, 18 Jun 2014 12:32:01 +0000 (12:32 +0000)
This patch fixes __ieee754_logl (-LDBL_MAX) on x86_64 and x86 not to
subtract 1 from its argument and so cause spurious overflow in
FE_DOWNWARD mode.  (For any argument strictly less than -1, it doesn't
matter whether or not 1 is subtracted before computing log1p, as long
as the result doesn't overflow to -Inf.)

Tested x86_64 and x86.  (This particular case lacks test coverage,
since the testsuite doesn't cover -lieee, but it will be covered by
tests after the following patch to test pow in all rounding modes,
which was the context in which this bug was found.)

[BZ #17022]
* sysdeps/i386/fpu/e_logl.S (__ieee754_logl): Do not subtract 1
from arguments -2 or below.
* sysdeps/i386/i686/fpu/e_logl.S (__ieee754_logl): Likewise.
* sysdeps/x86_64/fpu/e_logl.S (__ieee754_logl): Likewise.

ChangeLog
NEWS
sysdeps/i386/fpu/e_logl.S
sysdeps/i386/i686/fpu/e_logl.S
sysdeps/x86_64/fpu/e_logl.S

index 997cec628a1b061ec794e9a224b68dc2818c95c6..3204c4e046c332021d5f979ea3583fd8934f8ba3 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2014-06-18  Joseph Myers  <joseph@codesourcery.com>
+
+       [BZ #17022]
+       * sysdeps/i386/fpu/e_logl.S (__ieee754_logl): Do not subtract 1
+       from arguments -2 or below.
+       * sysdeps/i386/i686/fpu/e_logl.S (__ieee754_logl): Likewise.
+       * sysdeps/x86_64/fpu/e_logl.S (__ieee754_logl): Likewise.
+
 2014-06-18  Andreas Schwab  <schwab@suse.de>
 
        [BZ #17062]
diff --git a/NEWS b/NEWS
index 429dba5f2e76a18a08b3fa7083de3e0ae4cf9b4e..0c4d8bb1840cf9845be604b4e10e13cf466c9256 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -19,8 +19,8 @@ Version 2.20
   16791, 16796, 16799, 16800, 16815, 16823, 16824, 16831, 16838, 16849,
   16854, 16876, 16877, 16878, 16882, 16885, 16888, 16890, 16912, 16915,
   16916, 16917, 16922, 16927, 16928, 16932, 16943, 16958, 16965, 16966,
-  16967, 16977, 16978, 16984, 16990, 16996, 17009, 17031, 17042, 17048,
-  17058, 17062.
+  16967, 16977, 16978, 16984, 16990, 16996, 17009, 17022, 17031, 17042,
+  17048, 17058, 17062.
 
 * The minimum Linux kernel version that this version of the GNU C Library
   can be used with is 2.6.32.
index edae1d70df8a3331d806b2cab3c528b1f4c5e77c..828e98aa8d7b5d3d7542fb4ab7ea484c8ab56142 100644 (file)
@@ -40,8 +40,11 @@ ENTRY(__ieee754_logl)
        fld     %st             // x : x : log(2)
        sahf
        jc      3f              // in case x is NaN or +-Inf
+       movzwl  4+8(%esp), %eax
+       cmpl    $0xc000, %eax
+       jae     6f              // x <= -2, avoid overflow from -LDBL_MAX - 1.
 4:     fsubl   MO(one)         // x-1 : x : log(2)
-       fld     %st             // x-1 : x-1 : x : log(2)
+6:     fld     %st             // x-1 : x-1 : x : log(2)
        fabs                    // |x-1| : x-1 : x : log(2)
        fcompl  MO(limit)       // x-1 : x : log(2)
        fnstsw                  // x-1 : x : log(2)
index a0d1107dc066e6dfd4174bd7ffeceb9d20a971a5..0ccc8fc71e314477fc42f40a2d97a6eae797b7d2 100644 (file)
@@ -39,8 +39,11 @@ ENTRY(__ieee754_logl)
        LOAD_PIC_REG (dx)
 #endif
        fld     %st             // x : x : log(2)
+       movzwl  4+8(%esp), %eax
+       cmpl    $0xc000, %eax
+       jae     5f              // x <= -2, avoid overflow from -LDBL_MAX - 1.
        fsubl   MO(one)         // x-1 : x : log(2)
-       fld     %st             // x-1 : x-1 : x : log(2)
+5:     fld     %st             // x-1 : x-1 : x : log(2)
        fabs                    // |x-1| : x-1 : x : log(2)
        fld     MO(limit)       // 0.29 : |x-1| : x-1 : x : log(2)
        fcomip  %st(1)          // |x-1| : x-1 : x : log(2)
index 315afc00338cb4b4c20fea93185ae8ab048b648f..047b8db88ae199419df12982ea5aa7d8e7abbacc 100644 (file)
@@ -38,8 +38,11 @@ ENTRY(__ieee754_logl)
        fld     %st             // x : x : log(2)
        testb   $1, %ah
        jnz     3f              // in case x is NaN or +-Inf
+       movzwl  8+8(%rsp), %eax
+       cmpl    $0xc000, %eax
+       jae     6f              // x <= -2, avoid overflow from -LDBL_MAX - 1.
 4:     fsubl   MO(one)         // x-1 : x : log(2)
-       fld     %st             // x-1 : x-1 : x : log(2)
+6:     fld     %st             // x-1 : x-1 : x : log(2)
        fabs                    // |x-1| : x-1 : x : log(2)
        fcompl  MO(limit)       // x-1 : x : log(2)
        fnstsw                  // x-1 : x : log(2)