From: Adhemerval Zanella Date: Sun, 6 Apr 2014 19:50:11 +0000 (-0500) Subject: PowerPC: Fix nearbyint/nearbyintf result for FE_DOWNWARD X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=154d4d95f48061d5ab890c85b6015221c1accc6e;p=thirdparty%2Fglibc.git PowerPC: Fix nearbyint/nearbyintf result for FE_DOWNWARD 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. --- diff --git a/ChangeLog b/ChangeLog index 5bf3e2667ab..c28708f3fd2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2014-04-06 Adhemerval Zanella + + [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 [BZ #16739] diff --git a/NEWS b/NEWS index 71f6fb6618d..a49629437ab 100644 --- 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. Version 2.19 diff --git a/sysdeps/powerpc/powerpc32/fpu/s_nearbyint.S b/sysdeps/powerpc/powerpc32/fpu/s_nearbyint.S index 2734738d4d0..05ab40ecb51 100644 --- a/sysdeps/powerpc/powerpc32/fpu/s_nearbyint.S +++ b/sysdeps/powerpc/powerpc32/fpu/s_nearbyint.S @@ -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) diff --git a/sysdeps/powerpc/powerpc32/fpu/s_nearbyintf.S b/sysdeps/powerpc/powerpc32/fpu/s_nearbyintf.S index 11bdc773705..7449a5f9b79 100644 --- a/sysdeps/powerpc/powerpc32/fpu/s_nearbyintf.S +++ b/sysdeps/powerpc/powerpc32/fpu/s_nearbyintf.S @@ -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)