]> 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 19:58:05 +0000 (14:58 -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.

ChangeLog
NEWS
sysdeps/powerpc/fpu/libm-test-ulps
sysdeps/powerpc/powerpc32/fpu/s_nearbyint.S
sysdeps/powerpc/powerpc32/fpu/s_nearbyintf.S

index a0bb465fa2a6d17a265c3bed44fae1631d5f49f4..faaea3ccc5564a19934238909f2af2a2a8b728eb 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-04  Chris Metcalf  <cmetcalf@tilera.com>
 
        * sysdeps/tile/dl-runtime.c (_dl_unmap): Fix cut-and-paste bug
diff --git a/NEWS b/NEWS
index c7114da7ab5f2945c4d61d72205220c5b8a4f22d..db8cc103ee4bad4d1c9148989d1a52670e0c86ae 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -14,7 +14,7 @@ Version 2.20
   16611, 16613, 16623, 16632, 16634, 16639, 16642, 16648, 16649, 16670,
   16674, 16677, 16680, 16683, 16689, 16695, 16701, 16706, 16707, 16712,
   16713, 16714, 16731, 16739, 16743, 16758, 16759, 16760, 16770, 16786,
-  16789, 16799, 16800.
+  16789, 16799, 16800, 16815.
 
 * Running the testsuite no longer terminates as soon as a test fails.
   Instead, a file tests.sum (xtests.sum from "make xcheck") is generated,
index 27f228c57a3430f054e67fa7d96c56ccfeb86b7f..33192337eb3075e0005a3592f2e1e4d3b419e957 100644 (file)
@@ -452,6 +452,54 @@ ifloat: 1
 ildouble: 1
 ldouble: 1
 
+Function: Real part of "catan_downward":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 5
+ldouble: 5
+
+Function: Imaginary part of "catan_downward":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+ildouble: 6
+ldouble: 6
+
+Function: Real part of "catan_towardzero":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 6
+ldouble: 6
+
+Function: Imaginary part of "catan_towardzero":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+ildouble: 2
+ldouble: 2
+
+Function: Real part of "catan_upward":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 3
+ldouble: 3
+
+Function: Imaginary part of "catan_upward":
+double: 3
+float: 3
+idouble: 3
+ifloat: 3
+ildouble: 5
+ldouble: 5
+
 Function: Real part of "catanh":
 double: 4
 float: 1
@@ -466,6 +514,54 @@ ifloat: 1
 ildouble: 1
 ldouble: 1
 
+Function: Real part of "catanh_downward":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+ildouble: 3
+ldouble: 3
+
+Function: Imaginary part of "catanh_downward":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+ildouble: 5
+ldouble: 5
+
+Function: Real part of "catanh_towardzero":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+ildouble: 2
+ldouble: 2
+
+Function: Imaginary part of "catanh_towardzero":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+ildouble: 6
+ldouble: 6
+
+Function: Real part of "catanh_upward":
+double: 4
+float: 3
+idouble: 4
+ifloat: 3
+ildouble: 8
+ldouble: 8
+
+Function: Imaginary part of "catanh_upward":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 3
+ldouble: 3
+
 Function: "cbrt":
 double: 1
 float: 1
@@ -672,6 +768,102 @@ ifloat: 1
 ildouble: 2
 ldouble: 2
 
+Function: Real part of "clog10_downward":
+double: 3
+float: 3
+idouble: 3
+ifloat: 3
+ildouble: 7
+ldouble: 7
+
+Function: Imaginary part of "clog10_downward":
+double: 3
+float: 2
+idouble: 3
+ifloat: 2
+ildouble: 7
+ldouble: 7
+
+Function: Real part of "clog10_towardzero":
+double: 3
+float: 2
+idouble: 3
+ifloat: 2
+ildouble: 8
+ldouble: 8
+
+Function: Imaginary part of "clog10_towardzero":
+double: 3
+float: 2
+idouble: 3
+ifloat: 2
+ildouble: 7
+ldouble: 7
+
+Function: Real part of "clog10_upward":
+double: 4
+float: 3
+idouble: 4
+ifloat: 3
+ildouble: 8
+ldouble: 8
+
+Function: Imaginary part of "clog10_upward":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+ildouble: 6
+ldouble: 6
+
+Function: Real part of "clog_downward":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+ildouble: 3
+ldouble: 3
+
+Function: Imaginary part of "clog_downward":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+ildouble: 3
+ldouble: 3
+
+Function: Real part of "clog_towardzero":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+ildouble: 3
+ldouble: 3
+
+Function: Imaginary part of "clog_towardzero":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+ildouble: 4
+ldouble: 4
+
+Function: Real part of "clog_upward":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+ildouble: 6
+ldouble: 6
+
+Function: Imaginary part of "clog_upward":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+ildouble: 3
+ldouble: 3
+
 Function: "cos":
 double: 2
 float: 1
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)