From 95a5ac17454b24780138372005a56c31d20c7c66 Mon Sep 17 00:00:00 2001 From: bde Date: Fri, 22 Feb 2008 10:04:53 +0000 Subject: Optimize the fixup for +-0 by using better classification for this case and by using a table lookup to avoid a branch when this case occurs. On i386, this saves 1-4 cycles out of about 64 for non-large args. --- lib/msun/src/s_rintl.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'lib/msun') diff --git a/lib/msun/src/s_rintl.c b/lib/msun/src/s_rintl.c index b2a85b6..7f3b444e 100644 --- a/lib/msun/src/s_rintl.c +++ b/lib/msun/src/s_rintl.c @@ -44,6 +44,7 @@ shift[2] = { #error "Unsupported long double format" #endif }; +static const float zero[2] = { 0.0, -0.0 }; long double rintl(long double x) @@ -74,7 +75,8 @@ rintl(long double x) * If the result is +-0, then it must have the same sign as x, but * the above calculation doesn't always give this. Fix up the sign. */ - if (x == 0.0L) - return (sign ? -0.0L : 0.0L); + if (u.bits.exp < BIAS && x == 0.0L) + return (zero[sign]); + return (x); } -- cgit v1.1