]> git.ipfire.org Git - thirdparty/glibc.git/commit
Fix powerpc software sqrt (bug 17964). release/2.19/master
authorJoseph Myers <joseph@codesourcery.com>
Thu, 12 Feb 2015 23:05:37 +0000 (23:05 +0000)
committerAurelien Jarno <aurelien@aurel32.net>
Mon, 20 Feb 2017 21:04:52 +0000 (22:04 +0100)
commit0a62a5c401cf5b4e79e8290e46ce36f4c6dd08da
treed0a47ee621f3d5c49e13137cf23ca670b1786ca9
parenta0b2d5b252477b6bc374390c14c3c8ed6aae420c
Fix powerpc software sqrt (bug 17964).

As Adhemerval noted in
<https://sourceware.org/ml/libc-alpha/2015-01/msg00451.html>, the
powerpc sqrt implementation for when _ARCH_PPCSQ is not defined is
inaccurate in some cases.

The problem is that this code relies on fused multiply-add, and relies
on the compiler contracting a * b + c to get a fused operation.  But
sysdeps/ieee754/dbl-64/Makefile disables contraction for e_sqrt.c,
because the implementation in that directory relies on *not* having
contracted operations.

While it would be possible to arrange makefiles so that an earlier
sysdeps directory can disable the setting in
sysdeps/ieee754/dbl-64/Makefile, it seems a lot cleaner to make the
dependence on fused operations explicit in the .c file.  GCC 4.6
introduced support for __builtin_fma on powerpc and other
architectures with such instructions, so we can rely on that; this
patch duly makes the code use __builtin_fma for all such fused
operations.

Tested for powerpc32 (hard float).

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.

(cherry picked from commit e8bd5286c68bc35be3b41e94c15c4387dcb3bec9)
ChangeLog
NEWS
sysdeps/powerpc/fpu/e_sqrt.c