aboutsummaryrefslogtreecommitdiff
path: root/ChangeLog
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2015-11-12 19:00:06 +0000
committerJoseph Myers <joseph@codesourcery.com>2015-11-12 19:00:06 +0000
commit21378ae0d390c45ef382e8c95cc3593845ebb6ea (patch)
treee6ade7a9a3cb11427c102f106770184a383f0000 /ChangeLog
parent32b71ad358a949cbfe16d527f9a1015b95bb9baf (diff)
downloadglibc-21378ae0d390c45ef382e8c95cc3593845ebb6ea.zip
glibc-21378ae0d390c45ef382e8c95cc3593845ebb6ea.tar.gz
glibc-21378ae0d390c45ef382e8c95cc3593845ebb6ea.tar.bz2
Fix powerpc round, roundf spurious "inexact" (bug 19238).
The powerpc hard-float round and roundf functions, both 32-bit and 64-bit, raise spurious "inexact" exceptions for integer arguments from adding 0.5 and rounding to integer toward zero. Since these functions already save and restore the rounding mode, it's natural to make them restore the full floating-point state instead to fix this bug, which this patch does. The save of the state is moved after the first floating-point operation on the input so that any "invalid" exceptions from signaling NaN inputs are properly preserved. As a consequence of this approach to the fix, "inexact" for noninteger arguments (disallowed by TS 18661-1 but not by C99/C11, see bug 15479) is also avoided for these implementations; this is *not* a general fix for bug 15479 since plenty of other implementations of various functions still raise spurious "inexact" for noninteger arguments. This issue and fix do not apply to builds using power5+ versions of round and roundf, which use the frin instruction and avoid "inexact" exceptions that way. This patch should get hard-float powerpc32 and powerpc64 (default function implementations) back to a state where test-float and test-double will pass after ulps regeneration. Tested for powerpc32 and powerpc64. [BZ #15479] [BZ #19238] * sysdeps/powerpc/powerpc32/fpu/s_round.S (__round): Save floating-point state after first operation on input. Restore full state rather than just rounding mode. * sysdeps/powerpc/powerpc32/fpu/s_roundf.S (__roundf): Likewise. * sysdeps/powerpc/powerpc64/fpu/s_round.S (__round): Likewise. * sysdeps/powerpc/powerpc64/fpu/s_roundf.S (__roundf): Likewise.
Diffstat (limited to 'ChangeLog')
-rw-r--r--ChangeLog9
1 files changed, 9 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index e902b81..ff18106 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,14 @@
2015-11-12 Joseph Myers <joseph@codesourcery.com>
+ [BZ #15479]
+ [BZ #19238]
+ * sysdeps/powerpc/powerpc32/fpu/s_round.S (__round): Save
+ floating-point state after first operation on input. Restore full
+ state rather than just rounding mode.
+ * sysdeps/powerpc/powerpc32/fpu/s_roundf.S (__roundf): Likewise.
+ * sysdeps/powerpc/powerpc64/fpu/s_round.S (__round): Likewise.
+ * sysdeps/powerpc/powerpc64/fpu/s_roundf.S (__roundf): Likewise.
+
[BZ #19235]
* sysdeps/powerpc/powerpc64/fpu/s_llround.S (__llround): Do not
add 0.5 to integer arguments.