From c4440594575b59affb2f6e56059d145405fc5b7d Mon Sep 17 00:00:00 2001 From: "David S. Miller" Date: Mon, 27 Feb 2012 14:51:45 -0800 Subject: [PATCH] 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) --- ChangeLog | 6 ++++++ NEWS | 2 +- sysdeps/ieee754/ldbl-128/s_nearbyintl.c | 25 +++---------------------- sysdeps/ieee754/ldbl-128/s_rintl.c | 25 +++---------------------- 4 files changed, 13 insertions(+), 45 deletions(-) diff --git a/ChangeLog b/ChangeLog index 86b074bdd5b..73e2fd7bc19 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-22 Joseph Myers [BZ #2547] diff --git a/NEWS b/NEWS index a342ba8b14b..82e2b2c9378 100644 --- a/NEWS +++ b/NEWS @@ -9,7 +9,7 @@ Version 2.15.1 * The following bugs are resolved with this release: - 411, 2547, 2548, 11365, 13731, 13732, 13748 + 411, 2547, 2548, 11365, 13731, 13732, 13733, 13748 Version 2.15 diff --git a/sysdeps/ieee754/ldbl-128/s_nearbyintl.c b/sysdeps/ieee754/ldbl-128/s_nearbyintl.c index bea3183d390..0019abc06df 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 c3fc3ba193b..163897f911c 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]; } -- 2.47.2