]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Fix powerpc software sqrtf (bug 17967).
authorJoseph Myers <joseph@codesourcery.com>
Fri, 13 Feb 2015 16:20:36 +0000 (16:20 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Fri, 13 Feb 2015 16:20:36 +0000 (16:20 +0000)
Similarly to sqrt in
<https://sourceware.org/ml/libc-alpha/2015-02/msg00353.html>, the
powerpc sqrtf implementation for when _ARCH_PPCSQ is not defined also
relies on a * b + c being contracted into a fused multiply-add.
Although this contraction is not explicitly disabled for e_sqrtf.c, it
still seems appropriate to make the file explicit about its
requirements by using __builtin_fmaf; this patch does so.
Furthermore, it turns out that doing so fixes the observed inaccuracy
and missing exceptions (that is, that without explicit __builtin_fmaf
usage, it was not being compiled as intended).

Tested for powerpc32 (hard float).

[BZ #17967]
* sysdeps/powerpc/fpu/e_sqrtf.c (__slow_ieee754_sqrtf): Use
__builtin_fmaf instead of relying on contraction of a * b + c.

ChangeLog
NEWS
sysdeps/powerpc/fpu/e_sqrtf.c

index 821da1dd884e0f8dfca2a43926b4eb57b5769c05..50adb3cbb31252a90df6b2335472eeaee6b85ec0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2015-02-13  Joseph Myers  <joseph@codesourcery.com>
+
+       [BZ #17967]
+       * sysdeps/powerpc/fpu/e_sqrtf.c (__slow_ieee754_sqrtf): Use
+       __builtin_fmaf instead of relying on contraction of a * b + c.
+
 2015-02-12  J William Piggott  <elseifthen@gmx.com>
 
        [BZ #17969]
diff --git a/NEWS b/NEWS
index f6f34e8811fd009f55ebf0ccada9c561a9176e64..b95f5e6d251b3334de1bf067aca8dbbe6364b1f0 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -10,7 +10,7 @@ Version 2.22
 * The following bugs are resolved with this release:
 
   4719, 15467, 15790, 16560, 17912, 17932, 17944, 17949, 17964, 17965,
-  17969.
+  17967, 17969.
 \f
 Version 2.21
 
index 034b6f58caa6a89dba35c1a3d62f39bc2c7cc71d..a684cf977aa7621e00e57358fa6ff2e0f2b35a03 100644 (file)
@@ -87,26 +87,28 @@ __slow_ieee754_sqrtf (float x)
          /* Here we have three Newton-Raphson iterations each of a
             division and a square root and the remainder of the
             argument reduction, all interleaved.   */
-         sd = -(sg * sg - sx);
+         sd = -__builtin_fmaf (sg, sg, -sx);
          fsgi = (xi + 0x40000000) >> 1 & 0x7f800000;
          sy2 = sy + sy;
-         sg = sy * sd + sg;    /* 16-bit approximation to sqrt(sx). */
-         e = -(sy * sg - almost_half);
+         sg = __builtin_fmaf (sy, sd, sg);     /* 16-bit approximation to
+                                                  sqrt(sx). */
+         e = -__builtin_fmaf (sy, sg, -almost_half);
          SET_FLOAT_WORD (fsg, fsgi);
-         sd = -(sg * sg - sx);
-         sy = sy + e * sy2;
+         sd = -__builtin_fmaf (sg, sg, -sx);
+         sy = __builtin_fmaf (e, sy2, sy);
          if ((xi & 0x7f800000) == 0)
            goto denorm;
          shx = sx * fsg;
-         sg = sg + sy * sd;    /* 32-bit approximation to sqrt(sx),
-                                  but perhaps rounded incorrectly.  */
+         sg = __builtin_fmaf (sy, sd, sg);     /* 32-bit approximation to
+                                                  sqrt(sx), but perhaps
+                                                  rounded incorrectly.  */
          sy2 = sy + sy;
          g = sg * fsg;
-         e = -(sy * sg - almost_half);
-         d = -(g * sg - shx);
-         sy = sy + e * sy2;
+         e = -__builtin_fmaf (sy, sg, -almost_half);
+         d = -__builtin_fmaf (g, sg, -shx);
+         sy = __builtin_fmaf (e, sy2, sy);
          fesetenv_register (fe);
-         return g + sy * d;
+         return __builtin_fmaf (sy, d, g);
        denorm:
          /* For denormalised numbers, we normalise, calculate the
             square root, and return an adjusted result.  */