powerpc: Fix llround spurious inexact on 32-bit POWER4 [BZ #22697]
authorTulio Magno Quites Machado Filho <tuliom@linux.vnet.ibm.com>
Fri, 12 Jan 2018 22:39:42 +0000 (20:39 -0200)
committerTulio Magno Quites Machado Filho <tuliom@linux.vnet.ibm.com>
Fri, 12 Jan 2018 22:39:42 +0000 (20:39 -0200)
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.

ChangeLog
sysdeps/powerpc/powerpc32/power4/fpu/s_llround.S

index e9035fe..f33212f 100644 (file)
--- 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.
index d0b00ac..5ad89a1 100644 (file)
@@ -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)  */