From a78bc6549cfedeea0828b718aca00593d8164c2b Mon Sep 17 00:00:00 2001 From: "David S. Miller" Date: Mon, 27 Feb 2012 14:51:45 -0800 Subject: Fix ldbl-128 rintl/nearbyintl just like flt-32 variants. * sysdeps/ieee754/ldbl-128/s_nearbyintl.c (__nearbyintl): Do not manipulate bits before adding and subtracting TWO112[sx]. * sysdeps/ieee754/ldbl-128/s_rintl.c (__rintl): Likewise. --- ChangeLog | 6 ++++++ sysdeps/ieee754/ldbl-128/s_nearbyintl.c | 25 +++---------------------- sysdeps/ieee754/ldbl-128/s_rintl.c | 25 +++---------------------- 3 files changed, 12 insertions(+), 44 deletions(-) diff --git a/ChangeLog b/ChangeLog index e4e48b588b..5ac7ec74c9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2012-02-27 David S. Miller + + * sysdeps/ieee754/ldbl-128/s_nearbyintl.c (__nearbyintl): Do not + manipulate bits before adding and subtracting TWO112[sx]. + * sysdeps/ieee754/ldbl-128/s_rintl.c (__rintl): Likewise. + 2012-02-27 Roland McGrath [BZ #13775] diff --git a/sysdeps/ieee754/ldbl-128/s_nearbyintl.c b/sysdeps/ieee754/ldbl-128/s_nearbyintl.c index b97c1ac403..2d9f834bab 100644 --- a/sysdeps/ieee754/ldbl-128/s_nearbyintl.c +++ b/sysdeps/ieee754/ldbl-128/s_nearbyintl.c @@ -37,18 +37,13 @@ long double __nearbyintl(long double x) { fenv_t env; int64_t i0,j0,sx; - u_int64_t i,i1; + u_int64_t i1; long double w,t; GET_LDOUBLE_WORDS64(i0,i1,x); sx = (((u_int64_t)i0)>>63); j0 = ((i0>>48)&0x7fff)-0x3fff; - if(j0<48) { + if(j0<112) { if(j0<0) { - if(((i0&0x7fffffffffffffffLL)|i1)==0) return x; - i1 |= (i0&0x0000ffffffffffffLL); - i0 &= 0xffffe00000000000ULL; - i0 |= ((i1|-i1)>>16)&0x0000800000000000LL; - SET_LDOUBLE_MSW64(x,i0); feholdexcept (&env); w = TWO112[sx]+x; t = w-TWO112[sx]; @@ -56,25 +51,11 @@ long double __nearbyintl(long double x) GET_LDOUBLE_MSW64(i0,t); SET_LDOUBLE_MSW64(t,(i0&0x7fffffffffffffffLL)|(sx<<63)); return t; - } else { - i = (0x0000ffffffffffffLL)>>j0; - if(((i0&i)|i1)==0) return x; /* x is integral */ - i>>=1; - if(((i0&i)|i1)!=0) { - if(j0==47) i1 = 0x4000000000000000ULL; else - i0 = (i0&(~i))|((0x0000200000000000LL)>>j0); - } } - } else if (j0>111) { + } else { if(j0==0x4000) return x+x; /* inf or NaN */ else return x; /* x is integral */ - } else { - i = -1ULL>>(j0-48); - if((i1&i)==0) return x; /* x is integral */ - i>>=1; - if((i1&i)!=0) i1 = (i1&(~i))|((0x4000000000000000LL)>>(j0-48)); } - SET_LDOUBLE_WORDS64(x,i0,i1); feholdexcept (&env); w = TWO112[sx]+x; t = w-TWO112[sx]; diff --git a/sysdeps/ieee754/ldbl-128/s_rintl.c b/sysdeps/ieee754/ldbl-128/s_rintl.c index 833ad42944..563b207343 100644 --- a/sysdeps/ieee754/ldbl-128/s_rintl.c +++ b/sysdeps/ieee754/ldbl-128/s_rintl.c @@ -39,42 +39,23 @@ TWO112[2]={ long double __rintl(long double x) { int64_t i0,j0,sx; - u_int64_t i,i1; + u_int64_t i1; long double w,t; GET_LDOUBLE_WORDS64(i0,i1,x); sx = (((u_int64_t)i0)>>63); j0 = ((i0>>48)&0x7fff)-0x3fff; - if(j0<48) { + if(j0<112) { if(j0<0) { - if(((i0&0x7fffffffffffffffLL)|i1)==0) return x; - i1 |= (i0&0x0000ffffffffffffLL); - i0 &= 0xffffe00000000000ULL; - i0 |= ((i1|-i1)>>16)&0x0000800000000000LL; - SET_LDOUBLE_MSW64(x,i0); w = TWO112[sx]+x; t = w-TWO112[sx]; GET_LDOUBLE_MSW64(i0,t); SET_LDOUBLE_MSW64(t,(i0&0x7fffffffffffffffLL)|(sx<<63)); return t; - } else { - i = (0x0000ffffffffffffLL)>>j0; - if(((i0&i)|i1)==0) return x; /* x is integral */ - i>>=1; - if(((i0&i)|i1)!=0) { - if(j0==47) i1 = 0x4000000000000000ULL; else - i0 = (i0&(~i))|((0x0000200000000000LL)>>j0); - } } - } else if (j0>111) { + } else { if(j0==0x4000) return x+x; /* inf or NaN */ else return x; /* x is integral */ - } else { - i = -1ULL>>(j0-48); - if((i1&i)==0) return x; /* x is integral */ - i>>=1; - if((i1&i)!=0) i1 = (i1&(~i))|((0x4000000000000000LL)>>(j0-48)); } - SET_LDOUBLE_WORDS64(x,i0,i1); w = TWO112[sx]+x; return w-TWO112[sx]; } -- cgit 1.4.1