PowerPC: Fix copysignf optimization macro
authorAdhemerval Zanella <azanella@linux.vnet.ibm.com>
Tue, 20 May 2014 21:07:49 +0000 (16:07 -0500)
committerAdhemerval Zanella <azanella@linux.vnet.ibm.com>
Tue, 20 May 2014 21:07:49 +0000 (16:07 -0500)
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

ChangeLog
sysdeps/powerpc/fpu/math_private.h

index e87fc22..a6b2d94 100644 (file)
--- 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]
index dde153d..1ec4881 100644 (file)
@@ -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