[COMMITTED,2/4] alpha: Fix lround implementations
Commit Message
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.
@@ -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)
@@ -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)