alpha: Fix lround implementations
authorRichard Henderson <rth@twiddle.net>
Thu, 3 Jul 2014 15:52:45 +0000 (08:52 -0700)
committerRichard Henderson <rth@twiddle.net>
Thu, 3 Jul 2014 15:52:45 +0000 (08:52 -0700)
Use chopped rounding to add 0.5.

ChangeLog
sysdeps/alpha/fpu/s_lround.c
sysdeps/alpha/fpu/s_lroundf.c

index 87b7a93..017003e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2014-07-03  Richard Henderson  <rth@redhat.com>
 
+       * sysdeps/alpha/fpu/s_lround.c: Add 0.5 with chopped rounding.
+       * sysdeps/alpha/fpu/s_lroundf.c: Likewise.
+
        * sysdeps/alpha/fpu/s_round.c: Remove file.
        * sysdeps/alpha/fpu/s_roundf.c: Remove file.
 
index dedb98e..52a88b6 100644 (file)
 long int
 __lround (double x)
 {
-  double adj;
+  double adj, y;
 
-  adj = 0x1.fffffffffffffp-2;  /* nextafter (0.5, 0.0) */
-  adj = copysign (adj, x);
-  return x + adj;
+  adj = copysign (0.5, x);
+  asm("addt/suc %1,%2,%0" : "=&f"(y) : "f"(x), "f"(adj));
+  return y;
 }
 
 strong_alias (__lround, __llround)
index 650004d..ebbb129 100644 (file)
 long int
 __lroundf (float x)
 {
-  float adj;
+  float adj, y;
 
-  adj = 0x1.fffffep-2;         /* nextafterf (0.5f, 0.0f) */
-  adj = copysignf (adj, x);
-  return x + adj;
+  adj = copysignf (0.5f, x);
+  asm("adds/suc %1,%2,%0" : "=&f"(y) : "f"(x), "f"(adj));
+  return y;
 }
 
 strong_alias (__lroundf, __llroundf)