]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Fix ldbl-128ibm fmodl handling of subnormal results (bug 19595).
authorJoseph Myers <joseph@codesourcery.com>
Thu, 18 Feb 2016 22:42:06 +0000 (22:42 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Thu, 18 Feb 2016 22:42:06 +0000 (22:42 +0000)
The ldbl-128ibm implementation of fmodl has completely bogus logic for
subnormal results (in this context, that means results for which the
result is in the subnormal range for double, not results with absolute
value below LDBL_MIN), based on code used for ldbl-128 that is correct
in that case but incorrect in the ldbl-128ibm use.  This patch fixes
it to convert the mantissa into the correct form expected by
ldbl_insert_mantissa, removing the other cases of the code that were
incorrect and in one case unreachable for ldbl-128ibm.  A correct
exponent value is then passed to ldbl_insert_mantissa to reflect the
shifted result.

Tested for powerpc.

[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.

ChangeLog
sysdeps/ieee754/ldbl-128ibm/e_fmodl.c

index f9c3118def08af00517194374dfcc1abbd1eac2c..48d800c88554949597e9b8bfef95e73780af8ab4 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
index 205097d38f2154edb2379e9cc729e5f4e392ff4e..d756e3e2a668aef87f0021e72d89e44b4ab2cb85 100644 (file)
@@ -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 */