diff options
author | David S. Miller <davem@davemloft.net> | 2012-02-27 14:51:45 -0800 |
---|---|---|
committer | Carlos O'Donell <carlos_odonell@mentor.com> | 2012-05-01 14:21:27 -0400 |
commit | c4440594575b59affb2f6e56059d145405fc5b7d (patch) | |
tree | dea2d146cda418447c0ab509b91d92b070ece9a3 /sysdeps | |
parent | 228abdc27750245b0c7d80a4db6cf66621e657f9 (diff) | |
download | glibc-c4440594575b59affb2f6e56059d145405fc5b7d.zip glibc-c4440594575b59affb2f6e56059d145405fc5b7d.tar.gz glibc-c4440594575b59affb2f6e56059d145405fc5b7d.tar.bz2 |
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.
(cherry-picked from commit a78bc6549cfedeea0828b718aca00593d8164c2b)
Diffstat (limited to 'sysdeps')
-rw-r--r-- | sysdeps/ieee754/ldbl-128/s_nearbyintl.c | 25 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-128/s_rintl.c | 25 |
2 files changed, 6 insertions, 44 deletions
diff --git a/sysdeps/ieee754/ldbl-128/s_nearbyintl.c b/sysdeps/ieee754/ldbl-128/s_nearbyintl.c index bea3183..0019abc 100644 --- a/sysdeps/ieee754/ldbl-128/s_nearbyintl.c +++ b/sysdeps/ieee754/ldbl-128/s_nearbyintl.c @@ -46,18 +46,13 @@ TWO112[2]={ { 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]; @@ -65,25 +60,11 @@ TWO112[2]={ 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 c3fc3ba..163897f 100644 --- a/sysdeps/ieee754/ldbl-128/s_rintl.c +++ b/sysdeps/ieee754/ldbl-128/s_rintl.c @@ -48,42 +48,23 @@ TWO112[2]={ #endif { 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]; } |