]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
PowerPC: Fix nearbyint/nearbyintf result for FE_DOWNWARD
authorAdhemerval Zanella <azanella@linux.vnet.ibm.com>
Sun, 6 Apr 2014 19:50:11 +0000 (14:50 -0500)
committerAdhemerval Zanella <azanella@linux.vnet.ibm.com>
Sun, 6 Apr 2014 20:23:50 +0000 (15:23 -0500)
This patch fixes the powerpc32 optimized nearbyint/nearbyintf bogus
results for FE_DOWNWARD rounding mode.  This is due wrong instructions
sequence used in the rounding calculation (two subtractions instead of
adition and a subtraction).

Fixes BZ#16815.

Backport of 8bd70862e11023e7f827f240a5a214f847ae982d.

ChangeLog
NEWS
sysdeps/powerpc/powerpc32/fpu/s_nearbyint.S
sysdeps/powerpc/powerpc32/fpu/s_nearbyintf.S

index 5bf3e2667ab39aaa0c1ce89ebd2abf1b004f4afe..c28708f3fd245308ad6b7fc2c7b23114537f9470 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2014-04-06  Adhemerval Zanella  <azanella@linux.vnet.ibm.com>
+
+       [BZ #16815]
+       * sysdeps/powerpc/powerpc32/fpu/s_nearbyint.S (__nearbyint): Fix
+       result for FE_DOWNWARD rounding mode.
+       * sysdeps/powerpc/powerpc32/fpu/s_nearbyintf.S (__nearbyintf):
+       Likewise.
+       * sysdeps/powerpc/fpu/libm-test-ulps: Update.
+
 2014-04-02  Alan Modra  <amodra@gmail.com>
 
        [BZ #16739]
diff --git a/NEWS b/NEWS
index 71f6fb6618ddf2c9cea468e8ae222d8858a6a207..a49629437abdd1fb5f09b8c3bcdbaadca3102278 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -9,7 +9,7 @@ Version 2.19.1
 
 * The following bugs are resolved with this release:
 
-  16545, 16683, 16689, 16701, 16706, 16707, 16739.
+  16545, 16683, 16689, 16701, 16706, 16707, 16739, 16815.
 \f
 Version 2.19
 
index 2734738d4d0e7a545ccb3e39de74cec42b09774c..05ab40ecb5134234f0cc8a4d3e1db45247858293 100644 (file)
@@ -53,17 +53,17 @@ ENTRY (__nearbyint)
        fcmpu   cr7,fp1,fp12    /* if (x > 0.0 */
        ble     cr7,L(lessthanzero)
        mtfsb0  4*cr7+lt        /* Disable FE_INEXACT exception */
-       fadd    fp0,fp1,fp13    /* x += TWO52 */
-       fsub    fp1,fp0,fp13    /* x -= TWO52 */
+       fadd    fp1,fp1,fp13    /* x += TWO52 */
+       fsub    fp1,fp1,fp13    /* x -= TWO52 */
        fabs    fp1,fp1         /* if (x == 0.0 */
        mtfsb0  4*cr1+eq        /* Clear any FE_INEXACT exception */
        blr
 L(lessthanzero):
        bgelr   cr7
        mtfsb0  4*cr7+lt        /* Disable FE_INEXACT exception */
-       fsub    fp0,fp13,fp1    /* x -= TWO52 */
-       fsub    fp0,fp0,fp13    /* x += TWO52 */
-       fneg    fp1,fp0         /* if (x == 0.0) */
+       fsub    fp1,fp1,fp13    /* x -= TWO52 */
+       fadd    fp1,fp1,fp13    /* x += TWO52 */
+       fnabs   fp1,fp1         /* if (x == 0.0) */
        mtfsb0  4*cr1+eq        /* Clear any FE_INEXACT exception */
        blr
 END (__nearbyint)
index 11bdc7737053e1aaf218778a7c1946987de5d96a..7449a5f9b79a3a628a82c93163bba47270bd62b2 100644 (file)
@@ -52,16 +52,17 @@ ENTRY (__nearbyintf)
        fcmpu   cr7,fp1,fp12            /* if (x > 0.0 */
        ble     cr7,L(lessthanzero)
        mtfsb0  4*cr7+lt                /* Disable FE_INEXACT exception */
-       fadds   fp0,fp1,fp13            /* x += TWO23 */
-       fsubs   fp1,fp0,fp13            /* x -= TWO23 */
+       fadds   fp1,fp1,fp13            /* x += TWO23 */
+       fsubs   fp1,fp1,fp13            /* x -= TWO23 */
+       fabs    fp1,fp1                 /* if (x == 0.0) */
        mtfsb0  4*cr1+eq                /* Clear any FE_INEXACT exception */
        blr
 L(lessthanzero):
        bgelr   cr7
        mtfsb0  4*cr7+lt                /* Disable FE_INEXACT exception */
-       fsubs   fp0,fp13,fp1            /* x -= TWO23 */
-       fsubs   fp0,fp0,fp13            /* x += TWO23 */
-       fneg    fp1,fp0                 /* if (x == 0.0) */
+       fsubs   fp1,fp1,fp13            /* x -= TWO23 */
+       fadds   fp1,fp1,fp13            /* x += TWO23 */
+       fnabs   fp1,fp1                 /* if (x == 0.0) */
        mtfsb0  4*cr1+eq                /* Clear any FE_INEXACT exception */
        blr
 END (__nearbyintf)