PowerPC: Fix modf/modff optimization return sign
authorAdhemerval Zanella <azanella@linux.vnet.ibm.com>
Sat, 8 Mar 2014 17:24:32 +0000 (11:24 -0600)
committerAdhemerval Zanella <azanella@linux.vnet.ibm.com>
Sat, 8 Mar 2014 17:24:32 +0000 (11:24 -0600)
This patch fix the optimized powerpc-fpu modf/modff implementation
when using in non-default rounding mode where the zero sign is not
as expected. It fixes the libm testsuite tests

  modf_downward (0)  == 0.00000000000000000000e+00
  modf_downward (20) == 0.00000000000000000000e+00
  modf_downward (21) == 0.00000000000000000000e+00

Where the sign returned was negative.

ChangeLog
sysdeps/powerpc/power5+/fpu/s_modf.c
sysdeps/powerpc/power5+/fpu/s_modff.c

index 4071f08..5266177 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2014-03-03  Adhemerval Zanella  <azanella@linux.vnet.ibm.com>
+
+       * sysdeps/powerpc/power5+/fpu/s_modf.c (__modf): Fix to return correct
+       sign in non default rounding modes.
+       * sysdeps/powerpc/power5+/fpu/s_modff.c (__modff): Likewise.
+
 2014-03-08  Joseph Myers  <joseph@codesourcery.com>
 
        * math/libm-test.inc (ALL_RM_TEST): New macro.
index eb469f7..06da3ac 100644 (file)
@@ -36,12 +36,12 @@ __modf (double x, double *iptr)
   if (x >= 0.0)
     {
       *iptr = __floor (x);
-      return (x - *iptr);
+      return __copysign (x - *iptr, x);
     }
   else
     {
       *iptr = __ceil (x);
-      return (x - *iptr);
+      return __copysign (x - *iptr, x);
     }
 }
 weak_alias (__modf, modf)
index e4fe857..af17bec 100644 (file)
@@ -35,12 +35,12 @@ __modff (float x, float *iptr)
   if (x >= 0.0)
     {
       *iptr = __floorf (x);
-      return (x - *iptr);
+      return __copysignf (x - *iptr, x);
     }
   else
     {
       *iptr = __ceilf (x);
-      return (x - *iptr);
+      return __copysignf (x - *iptr, x);
     }
 }
 weak_alias (__modff, modff)