aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdhemerval Zanella <azanella@linux.vnet.ibm.com>2014-05-20 16:07:49 -0500
committerAdhemerval Zanella <azanella@linux.vnet.ibm.com>2014-05-20 16:07:49 -0500
commite13bccd3de53227dd4d6ece08873e9bcdd76b08f (patch)
tree49177b99cb7347c9625fbab5ce29cc0a640f9caf
parent4406c41c1d6088abf01c216e49700cd3f8f01fcc (diff)
downloadglibc-e13bccd3de53227dd4d6ece08873e9bcdd76b08f.zip
glibc-e13bccd3de53227dd4d6ece08873e9bcdd76b08f.tar.gz
glibc-e13bccd3de53227dd4d6ece08873e9bcdd76b08f.tar.bz2
PowerPC: Fix copysignf optimization macro
This patch fixes the __copysignf optimized macro meant to internal libm usage when used with constant value. Without the explicit cast to float, if it is used with const double value (for instance, on s_casinhf.c) double constants will be used and it may lead to precision issues in some algorithms. It fixes the following failures on PPC64/POWER7: Failure: Test: Real part of: cacos_downward (inf + 0 i) Result: is: 1.19209289550781250000e-07 0x1.00000000000000000000p-23 should be: 0.00000000000000000000e+00 0x0.00000000000000000000p+0 Failure: Test: Real part of: cacos_downward (inf - 0 i) Result: is: 1.19209289550781250000e-07 0x1.00000000000000000000p-23 should be: 0.00000000000000000000e+00 0x0.00000000000000000000p+0 Failure: Test: Real part of: cacos_downward (inf + 0.5 i) Result: is: 1.19209289550781250000e-07 0x1.00000000000000000000p-23 should be: 0.00000000000000000000e+00 0x0.00000000000000000000p+0 Failure: Test: Real part of: cacos_downward (inf - 0.5 i) Result: is: 1.19209289550781250000e-07 0x1.00000000000000000000p-23 should be: 0.00000000000000000000e+00 0x0.00000000000000000000p+0 Failure: Test: Real part of: cacos_towardzero (inf + 0 i) Result: is: 1.19209289550781250000e-07 0x1.00000000000000000000p-23 should be: 0.00000000000000000000e+00 0x0.00000000000000000000p+0 Failure: Test: Real part of: cacos_towardzero (inf - 0 i) Result: is: 1.19209289550781250000e-07 0x1.00000000000000000000p-23 should be: 0.00000000000000000000e+00 0x0.00000000000000000000p+0 Failure: Test: Real part of: cacos_towardzero (inf + 0.5 i) Result: is: 1.19209289550781250000e-07 0x1.00000000000000000000p-23 should be: 0.00000000000000000000e+00 0x0.00000000000000000000p+0 Failure: Test: Real part of: cacos_towardzero (inf - 0.5 i) Result: is: 1.19209289550781250000e-07 0x1.00000000000000000000p-23 should be: 0.00000000000000000000e+00 0x0.00000000000000000000p+0
-rw-r--r--ChangeLog5
-rw-r--r--sysdeps/powerpc/fpu/math_private.h4
2 files changed, 8 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index e87fc22..a6b2d94 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2014-05-20 Adhemerval Zanella <azanella@linux.vnet.ibm.com>
+
+ * sysdeps/powerpc/fpu/math_private.h [__copysignf]: Fix copysign macro
+ optimization when used with float constants.
+
2014-05-20 Aurelien Jarno <aurelien@aurel32.net>
[BZ #16915]
diff --git a/sysdeps/powerpc/fpu/math_private.h b/sysdeps/powerpc/fpu/math_private.h
index dde153d..1ec4881 100644
--- a/sysdeps/powerpc/fpu/math_private.h
+++ b/sysdeps/powerpc/fpu/math_private.h
@@ -166,11 +166,13 @@ __ieee754_sqrtf (float __x)
# ifndef __copysignf
# define __copysignf(x, y) \
({ float __z; \
+ float __x = x; \
+ float __y = y; \
__asm __volatile ( \
" fcpsgn %0,%1,%2\n" \
" frsp %0,%0\n" \
: "=f" (__z) \
- : "f" (y), "f" (x)); \
+ : "f" (__y), "f" (__x));\
__z; })
# endif