From: Richard Henderson Date: Thu, 3 Jul 2014 15:52:45 +0000 (-0700) Subject: alpha: Fix lround implementations X-Git-Tag: glibc-2.20~150 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ca7b945c7330064f494436611bd35fce6107abf6;p=platform%2Fupstream%2Fglibc.git alpha: Fix lround implementations Use chopped rounding to add 0.5. --- diff --git a/ChangeLog b/ChangeLog index 87b7a93..017003e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2014-07-03 Richard Henderson + * 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. 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)