[COMMITTED,2/4] alpha: Fix lround implementations

Message ID 1404410446-30243-2-git-send-email-rth@twiddle.net
State Committed
Headers

Commit Message

Richard Henderson July 3, 2014, 6 p.m. UTC
  Use chopped rounding to add 0.5.
---
 ChangeLog                     | 3 +++
 sysdeps/alpha/fpu/s_lround.c  | 8 ++++----
 sysdeps/alpha/fpu/s_lroundf.c | 8 ++++----
 3 files changed, 11 insertions(+), 8 deletions(-)

	* sysdeps/alpha/fpu/s_lround.c: Add 0.5 with chopped rounding.
	* sysdeps/alpha/fpu/s_lroundf.c: Likewise.
  

Patch

diff --git a/sysdeps/alpha/fpu/s_lround.c b/sysdeps/alpha/fpu/s_lround.c
index dedb98e..52a88b6 100644
--- a/sysdeps/alpha/fpu/s_lround.c
+++ b/sysdeps/alpha/fpu/s_lround.c
@@ -25,11 +25,11 @@ 
 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)
diff --git a/sysdeps/alpha/fpu/s_lroundf.c b/sysdeps/alpha/fpu/s_lroundf.c
index 650004d..ebbb129 100644
--- a/sysdeps/alpha/fpu/s_lroundf.c
+++ b/sysdeps/alpha/fpu/s_lroundf.c
@@ -25,11 +25,11 @@ 
 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)