]> sourceware.org Git - glibc.git/commitdiff
Fix powerpc64 lround, lroundf, llround, llroundf spurious "inexact" exceptions (bug...
authorJoseph Myers <joseph@codesourcery.com>
Thu, 12 Nov 2015 16:24:00 +0000 (16:24 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Thu, 12 Nov 2015 16:24:00 +0000 (16:24 +0000)
Similar to bug 19134 for powerpc32, the powerpc64 implementations of
lround, lroundf, llround, llroundf can raise spurious "inexact"
exceptions for integer arguments from adding 0.5 then converting to
integer (this does not apply to the power5+ version for double, which
uses the frin instruction which is defined never to raise "inexact"; I
don't know why power5+ doesn't use that version for float as well).

This patch fixes the bug in a similar way to the powerpc32 bug, by
testing for integers (adding and subtracting 2^52 and comparing with
the value before that addition and subtraction) and not adding 0.5 in
that case.

The powerpc maintainers may wish to look at making power5+ / power6x /
power8 use frin for float lround / llround as well as for double,
unless there's some reason I've missed that this isn't beneficial.

Tested for powerpc64.

[BZ #19235]
* sysdeps/powerpc/powerpc64/fpu/s_llround.S (__llround): Do not
add 0.5 to integer arguments.
* sysdeps/powerpc/powerpc64/fpu/s_llroundf.S (__llroundf):
Likewise.
(.LC2): New object.

ChangeLog
sysdeps/powerpc/powerpc64/fpu/s_llround.S
sysdeps/powerpc/powerpc64/fpu/s_llroundf.S

index 2e486bab41870365b57fd343fe4d919a9cacc795..e902b8125b94d97f6069f1228bb93f89fb9323cf 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2015-11-12  Joseph Myers  <joseph@codesourcery.com>
+
+       [BZ #19235]
+       * sysdeps/powerpc/powerpc64/fpu/s_llround.S (__llround): Do not
+       add 0.5 to integer arguments.
+       * sysdeps/powerpc/powerpc64/fpu/s_llroundf.S (__llroundf):
+       Likewise.
+       (.LC2): New object.
+
 2015-11-11  Mike Frysinger  <vapier@gentoo.org>
 
        * scripts/pylintrc (reports): Set to no.
index 321925ef560f1d49239eb1dda379224ca151d719..bc433bc4906fc7de06bc9334e248f2f6871b1944 100644 (file)
@@ -55,6 +55,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)  */
index fc5aa7730f0e233df8e1875f45d3c8823eb5caca..e8a8bf8da7b3dd0108f5ea7fc6114ba77bf10574 100644 (file)
@@ -23,6 +23,8 @@
        .tc FD_41600000_0[TC],0x4160000000000000
 .LC1:  /* 0.5 */
        .tc FD_3fe00000_0[TC],0x3fe0000000000000
+.LC2:  /* 2^52 */
+       .tc FD_43300000_0[TC],0x4330000000000000
        .section        ".text"
 
 /* long long [r3] llroundf (float x [fp1])
@@ -47,6 +49,7 @@ ENTRY (__llroundf)
        CALL_MCOUNT 0
        lfd     fp9,.LC0@toc(2) /* Load 2^23 into fpr9.  */
        lfd     fp10,.LC1@toc(2)/* Load 0.5 into fpr10.  */
+       lfd     fp11,.LC2@toc(2)        /* Load 2^52 into fpr11.  */
        fabs    fp2,fp1         /* Get the absolute value of x.  */
        fsub    fp12,fp10,fp10  /* Compute 0.0 into fp12.  */
        fcmpu   cr6,fp2,fp10    /* if |x| < 0.5  */
@@ -54,6 +57,11 @@ ENTRY (__llroundf)
        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^23 > x < -2^23 just convert with no bias.  */
+       /* Test whether an integer to avoid spurious "inexact".  */
+       fadd    fp3,fp2,fp11
+       fsub    fp3,fp3,fp11
+       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)  */
This page took 0.215538 seconds and 5 git commands to generate.