math: fix remquo.c when x==-y and a subnormal remainder bug as well
[musl] / src / math / remquo.c
index 79c9a55..085466e 100644 (file)
@@ -35,7 +35,6 @@ double remquo(double x, double y, int *quo)
        hy &= 0x7fffffff;       /* |y| */
 
        /* purge off exception values */
-       // FIXME: signed shift
        if ((hy|ly) == 0 || hx >= 0x7ff00000 ||  /* y = 0, or x not finite */
            (hy|((ly|-ly)>>31)) > 0x7ff00000)    /* or y is NaN */
                return (x*y)/(x*y);
@@ -45,7 +44,7 @@ double remquo(double x, double y, int *quo)
                        goto fixup;
                }
                if (lx == ly) {            /* |x| = |y| return x*0 */
-                       *quo = 1;
+                       *quo = sxy ? -1 : 1;
                        return Zero[(uint32_t)sx>>31];
                }
        }
@@ -128,6 +127,7 @@ double remquo(double x, double y, int *quo)
 
        /* convert back to floating value and restore the sign */
        if ((hx|lx) == 0) {  /* return sign(x)*0 */
+               q &= 0x7fffffff;
                *quo = sxy ? -q : q;
                return Zero[(uint32_t)sx>>31];
        }
@@ -145,10 +145,10 @@ double remquo(double x, double y, int *quo)
                        hx >>= n;
                } else if (n <= 31) {
                        lx = (hx<<(32-n))|(lx>>n);
-                       hx = sx;
+                       hx = 0;
                } else {
                        lx = hx>>(n-32);
-                       hx = sx;
+                       hx = 0;
                }
        }
 fixup: