]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Fix spurious "inexact" exceptions from x86 pow with NaN argument (bug 16167).
authorJoseph Myers <joseph@codesourcery.com>
Sat, 16 Nov 2013 12:45:11 +0000 (12:45 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Sat, 16 Nov 2013 12:45:11 +0000 (12:45 +0000)
ChangeLog
NEWS
sysdeps/i386/fpu/e_pow.S
sysdeps/i386/fpu/e_powf.S
sysdeps/i386/fpu/e_powl.S
sysdeps/x86_64/fpu/e_powl.S

index 574e07e6c3d2b00a4a039ef0939f6e571073672c..ce26384afb6d0cbd05a8292448343b98666d90f3 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2013-11-16  Joseph Myers  <joseph@codesourcery.com>
+
+       [BZ #16167]
+       * sysdeps/i386/fpu/e_pow.S (__ieee754_pow): Check for first
+       argument being NaN and avoid computations with second argument in
+       that case.
+       * sysdeps/i386/fpu/e_powf.S (__ieee754_powf): Likewise.
+       * sysdeps/i386/fpu/e_powl.S (__ieee754_powl): Likewise.
+       * sysdeps/x86_64/fpu/e_powl.S (__ieee754_powl): Likewise.
+
 2013-11-15  Arun Kumar Pyasi <arun@chitwanix.com>
 
        * locale/iso-639.def: Add Chitwani Tharu (the).
diff --git a/NEWS b/NEWS
index 37c2390b58847b379aa612c570e455380939d211..e3effb64ac95391d8875611f53017da9b2ed345c 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -18,7 +18,7 @@ Version 2.19
   15887, 15890, 15892, 15893, 15895, 15897, 15905, 15909, 15917, 15919,
   15921, 15923, 15939, 15948, 15963, 15966, 15985, 15988, 15997, 16032,
   16034, 16036, 16037, 16041, 16071, 16072, 16074, 16078, 16103, 16112,
-  16143, 16150, 16151, 16153, 16172.
+  16143, 16150, 16151, 16153, 16167, 16172.
 
 * CVE-2012-4412 The strcoll implementation caches indices and rules for
   large collation sequences to optimize multiple passes.  This cache
index 109c3959345b9be0c98087ed210ef041fe406efb..835c39b7bd8ef040c9ba13e6848020d9b8136217 100644 (file)
@@ -98,6 +98,9 @@ ENTRY(__ieee754_pow)
        cmpb    $0x05, %ah
        je      15f             // x is ±inf
 
+       cmpb    $0x01, %ah
+       je      32f             // x is NaN
+
        fxch                    // y : x
 
        /* fistpll raises invalid exception for |y| >= 1L<<63.  */
@@ -165,6 +168,12 @@ ENTRY(__ieee754_pow)
 31:    fstp    %st(1)
        ret
 
+       cfi_adjust_cfa_offset (8)
+32:    addl    $8, %esp
+       cfi_adjust_cfa_offset (-8)
+       fstp    %st(1)
+       ret
+
        cfi_adjust_cfa_offset (8)
        .align ALIGNARG(4)
 2:     // y is a large integer (absolute value at least 1L<<10), but
index 7fad90f6cb7c8d42c99472b7fc6895b5f802504e..90d3d0ca6ab8492bb3acee032bc4729e590ef4da 100644 (file)
@@ -95,6 +95,9 @@ ENTRY(__ieee754_powf)
        cmpb    $0x05, %ah
        je      15f             // x is ±inf
 
+       cmpb    $0x01, %ah
+       je      32f             // x is NaN
+
        fxch                    // y : x
 
        /* fistpl raises invalid exception for |y| >= 1L<<31.  */
@@ -180,7 +183,7 @@ ENTRY(__ieee754_powf)
        f2xm1                   // 2^fract(y*log2(x))-1 : int(y*log2(x))
        faddl   MO(one)         // 2^fract(y*log2(x)) : int(y*log2(x))
        fscale                  // 2^fract(y*log2(x))*2^int(y*log2(x)) : int(y*log2(x))
-       addl    $4, %esp
+32:    addl    $4, %esp
        cfi_adjust_cfa_offset (-4)
        fstp    %st(1)          // 2^fract(y*log2(x))*2^int(y*log2(x))
        ret
index 3c23117c39362049c017cbd89a833e622908d4ce..91e22c8a299ec68f5b2cfbb4cbcd0dfea0b4025a 100644 (file)
@@ -104,6 +104,9 @@ ENTRY(__ieee754_powl)
        cmpb    $0x05, %ah
        je      15f             // x is ±inf
 
+       cmpb    $0x01, %ah
+       je      32f             // x is NaN
+
        fxch                    // y : x
 
        /* fistpll raises invalid exception for |y| >= 1L<<63.  */
@@ -187,6 +190,12 @@ ENTRY(__ieee754_powl)
 31:    fstp    %st(1)
        ret
 
+       cfi_adjust_cfa_offset (8)
+32:    addl    $8, %esp
+       cfi_adjust_cfa_offset (-8)
+       fstp    %st(1)
+       ret
+
        cfi_adjust_cfa_offset (8)
        .align ALIGNARG(4)
 2:     // y is a large integer (absolute value at least 8), but
index e10172674e2a3a468b3dd9ba1695bba04cdf70ff..590223b60c6e221286b580b64feb88f746721c93 100644 (file)
@@ -96,6 +96,9 @@ ENTRY(__ieee754_powl)
        cmpb    $0x05, %ah
        je      15f             // x is ±inf
 
+       cmpb    $0x01, %ah
+       je      31f             // x is NaN
+
        fxch                    // y : x
 
        /* fistpll raises invalid exception for |y| >= 1L<<63.  */