diff options
author | Tulio Magno Quites Machado Filho <tuliom@linux.vnet.ibm.com> | 2018-01-12 20:39:42 -0200 |
---|---|---|
committer | Tulio Magno Quites Machado Filho <tuliom@linux.vnet.ibm.com> | 2018-01-12 20:39:42 -0200 |
commit | af1e6be4ba60067907ea9e19e0cd6897d194e9cf (patch) | |
tree | 7b4980cf45cfc1f7fd95b143cbc4fd2b3929e5b4 | |
parent | 98d13ce07a6aee9efb2ef2405a95c6bb8e01dca3 (diff) | |
download | glibc-af1e6be4ba60067907ea9e19e0cd6897d194e9cf.tar.gz glibc-af1e6be4ba60067907ea9e19e0cd6897d194e9cf.tar.xz glibc-af1e6be4ba60067907ea9e19e0cd6897d194e9cf.zip |
powerpc: Fix llround spurious inexact on 32-bit POWER4 [BZ #22697]
This issue is similar to BZ #19235, where spurious exceptions are created from adding 0.5 then converting to an integer. The solution is based on Joseph's fix for BZ #19235. [BZ #22697] * sysdeps/powerpc/powerpc32/power4/fpu/s_llround.S (__llround): Do not add 0.5 to integer or out-of-range arguments.
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | sysdeps/powerpc/powerpc32/power4/fpu/s_llround.S | 5 |
2 files changed, 11 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog index e9035fe658..f33212f549 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2018-01-12 Tulio Magno Quites Machado Filho <tuliom@linux.vnet.ibm.com> + + [BZ #22697] + * sysdeps/powerpc/powerpc32/power4/fpu/s_llround.S (__llround): + Do not add 0.5 to integer or out-of-range arguments. + 2018-01-12 Dmitry V. Levin <ldv@altlinux.org> * po/bg.po: Update translations. diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/s_llround.S b/sysdeps/powerpc/powerpc32/power4/fpu/s_llround.S index d0b00ac383..5ad89a1486 100644 --- a/sysdeps/powerpc/powerpc32/power4/fpu/s_llround.S +++ b/sysdeps/powerpc/powerpc32/power4/fpu/s_llround.S @@ -71,6 +71,11 @@ ENTRY (__llround) fcmpu cr1,fp1,fp12 /* x is negative? x < 0.0 */ blt- cr6,.Lretzero /* 0.5 > x < -0.5 so just return 0. */ bge- cr7,.Lnobias /* 2^52 > x < -2^52 just convert with no bias. */ + /* Test whether an integer to avoid spurious "inexact". */ + fadd fp3,fp2,fp9 + fsub fp3,fp3,fp9 + fcmpu cr5,fp2,fp3 + beq cr5,.Lnobias fadd fp3,fp2,fp10 /* |x|+=0.5 bias to prepare to round. */ bge cr1,.Lconvert /* x is positive so don't negate x. */ fnabs fp3,fp3 /* -(|x|+=0.5) */ |