b14233f462
- aarch64-sigstksz.patch: Increase MINSIGSTKSZ and SIGSTKSZ (BZ #16850) (forwarded request 294121 from Andreas_Schwab) OBS-URL: https://build.opensuse.org/request/show/294122 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/glibc?expand=0&rev=188
118 lines
4.3 KiB
Diff
118 lines
4.3 KiB
Diff
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 Joseph Myers <joseph@codesourcery.com>
|
|
|
|
[BZ #17964]
|
|
* sysdeps/powerpc/fpu/e_sqrt.c (__slow_ieee754_sqrt): Use
|
|
__builtin_fma instead of relying on contraction of a * b + c.
|
|
|
|
Index: glibc-2.21/sysdeps/powerpc/fpu/e_sqrt.c
|
|
===================================================================
|
|
--- glibc-2.21.orig/sysdeps/powerpc/fpu/e_sqrt.c
|
|
+++ glibc-2.21/sysdeps/powerpc/fpu/e_sqrt.c
|
|
@@ -99,38 +99,41 @@ __slow_ieee754_sqrt (double 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_fma (sg, sg, -sx);
|
|
fsgi = (xi0 + 0x40000000) >> 1 & 0x7ff00000;
|
|
sy2 = sy + sy;
|
|
- sg = sy * sd + sg; /* 16-bit approximation to sqrt(sx). */
|
|
+ sg = __builtin_fma (sy, sd, sg); /* 16-bit approximation to
|
|
+ sqrt(sx). */
|
|
|
|
/* schedule the INSERT_WORDS (fsg, fsgi, 0) to get separation
|
|
between the store and the load. */
|
|
INSERT_WORDS (fsg, fsgi, 0);
|
|
iw_u.parts.msw = fsgi;
|
|
iw_u.parts.lsw = (0);
|
|
- e = -(sy * sg - almost_half);
|
|
- sd = -(sg * sg - sx);
|
|
+ e = -__builtin_fma (sy, sg, -almost_half);
|
|
+ sd = -__builtin_fma (sg, sg, -sx);
|
|
if ((xi0 & 0x7ff00000) == 0)
|
|
goto denorm;
|
|
- sy = sy + e * sy2;
|
|
- sg = sg + sy * sd; /* 32-bit approximation to sqrt(sx). */
|
|
+ sy = __builtin_fma (e, sy2, sy);
|
|
+ sg = __builtin_fma (sy, sd, sg); /* 32-bit approximation to
|
|
+ sqrt(sx). */
|
|
sy2 = sy + sy;
|
|
/* complete the INSERT_WORDS (fsg, fsgi, 0) operation. */
|
|
fsg = iw_u.value;
|
|
- e = -(sy * sg - almost_half);
|
|
- sd = -(sg * sg - sx);
|
|
- sy = sy + e * sy2;
|
|
+ e = -__builtin_fma (sy, sg, -almost_half);
|
|
+ sd = -__builtin_fma (sg, sg, -sx);
|
|
+ sy = __builtin_fma (e, sy2, sy);
|
|
shx = sx * fsg;
|
|
- sg = sg + sy * sd; /* 64-bit approximation to sqrt(sx),
|
|
- but perhaps rounded incorrectly. */
|
|
+ sg = __builtin_fma (sy, sd, sg); /* 64-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_fma (sy, sg, -almost_half);
|
|
+ d = -__builtin_fma (g, sg, -shx);
|
|
+ sy = __builtin_fma (e, sy2, sy);
|
|
fesetenv_register (fe);
|
|
- return g + sy * d;
|
|
+ return __builtin_fma (sy, d, g);
|
|
denorm:
|
|
/* For denormalised numbers, we normalise, calculate the
|
|
square root, and return an adjusted result. */
|
|
Index: glibc-2.21/sysdeps/powerpc/fpu/e_sqrtf.c
|
|
===================================================================
|
|
--- glibc-2.21.orig/sysdeps/powerpc/fpu/e_sqrtf.c
|
|
+++ glibc-2.21/sysdeps/powerpc/fpu/e_sqrtf.c
|
|
@@ -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. */
|