diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-128ibm/e_fmodl.c | 14 |
2 files changed, 11 insertions, 9 deletions
@@ -1,5 +1,11 @@ 2016-02-18 Joseph Myers <joseph@codesourcery.com> + [BZ #19595] + * sysdeps/ieee754/ldbl-128ibm/e_fmodl.c (__ieee754_fmodl): Use + common logic for all cases of shifting subnormal results. Do not + insert sign bit in shifted mantissa. Always pass -1023 as biased + exponent to ldbl_insert_mantissa in subnormal case. + [BZ #19594] * sysdeps/ieee754/ldbl-128ibm/s_roundl.c (__roundl): Use __round on high and low parts then adjust result and use diff --git a/sysdeps/ieee754/ldbl-128ibm/e_fmodl.c b/sysdeps/ieee754/ldbl-128ibm/e_fmodl.c index 205097d..d756e3e 100644 --- a/sysdeps/ieee754/ldbl-128ibm/e_fmodl.c +++ b/sysdeps/ieee754/ldbl-128ibm/e_fmodl.c @@ -130,15 +130,11 @@ __ieee754_fmodl (long double x, long double y) x = ldbl_insert_mantissa((sx>>63), iy, hx, lx); } else { /* subnormal output */ n = -1022 - iy; - if(n<=48) { - lx = (lx>>n)|((u_int64_t)hx<<(64-n)); - hx >>= n; - } else if (n<=63) { - lx = (hx<<(64-n))|(lx>>n); hx = sx; - } else { - lx = hx>>(n-64); hx = sx; - } - x = ldbl_insert_mantissa((sx>>63), iy, hx, lx); + /* We know 1 <= N <= 52, and that there are no nonzero + bits in places below 2^-1074. */ + lx = (lx >> n) | ((u_int64_t) hx << (64 - n)); + hx >>= n; + x = ldbl_insert_mantissa((sx>>63), -1023, hx, lx); x *= one; /* create necessary signal */ } return x; /* exact output */ |