diff options
author | David S. Miller <davem@davemloft.net> | 2012-02-27 14:51:45 -0800 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-02-27 14:51:45 -0800 |
commit | a78bc6549cfedeea0828b718aca00593d8164c2b (patch) | |
tree | 6978f1ad4e74b7ae1cf92d4d78634440e43fb217 | |
parent | 36c8acb4f8383a52ba0f25a99276ebec31f8c281 (diff) | |
download | glibc-a78bc6549cfedeea0828b718aca00593d8164c2b.tar glibc-a78bc6549cfedeea0828b718aca00593d8164c2b.tar.gz glibc-a78bc6549cfedeea0828b718aca00593d8164c2b.tar.bz2 glibc-a78bc6549cfedeea0828b718aca00593d8164c2b.zip |
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.
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-128/s_nearbyintl.c | 25 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-128/s_rintl.c | 25 |
3 files changed, 12 insertions, 44 deletions
@@ -1,3 +1,9 @@ +2012-02-27 David S. Miller <davem@davemloft.net> + + * 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 <roland@hack.frob.com> [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]; } |