about summary refs log tree commit diff
path: root/sysdeps
diff options
context:
space:
mode:
authorAdhemerval Zanella <azanella@linux.vnet.ibm.com>2014-03-08 11:24:32 -0600
committerAdhemerval Zanella <azanella@linux.vnet.ibm.com>2014-03-08 11:24:32 -0600
commit54b46a4b3efd179ccbbf8e342e64391e2b590f1b (patch)
tree32dfb4e2743b612727fbf3ca05bacdfe9e103bba /sysdeps
parente9996ef750d845b46bc7d743c730c73f044720af (diff)
downloadglibc-54b46a4b3efd179ccbbf8e342e64391e2b590f1b.tar.gz
glibc-54b46a4b3efd179ccbbf8e342e64391e2b590f1b.tar.xz
glibc-54b46a4b3efd179ccbbf8e342e64391e2b590f1b.zip
PowerPC: Fix modf/modff optimization return sign
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.
Diffstat (limited to 'sysdeps')
-rw-r--r--sysdeps/powerpc/power5+/fpu/s_modf.c4
-rw-r--r--sysdeps/powerpc/power5+/fpu/s_modff.c4
2 files changed, 4 insertions, 4 deletions
diff --git a/sysdeps/powerpc/power5+/fpu/s_modf.c b/sysdeps/powerpc/power5+/fpu/s_modf.c
index eb469f7647..06da3ac809 100644
--- a/sysdeps/powerpc/power5+/fpu/s_modf.c
+++ b/sysdeps/powerpc/power5+/fpu/s_modf.c
@@ -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)
diff --git a/sysdeps/powerpc/power5+/fpu/s_modff.c b/sysdeps/powerpc/power5+/fpu/s_modff.c
index e4fe857d29..af17becf13 100644
--- a/sysdeps/powerpc/power5+/fpu/s_modff.c
+++ b/sysdeps/powerpc/power5+/fpu/s_modff.c
@@ -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)