mpint: Fix misbehaviour on larger-than-mpw integer types.
[u/mdw/catacomb] / mpx.c
diff --git a/mpx.c b/mpx.c
index e122760..01264b1 100644 (file)
--- a/mpx.c
+++ b/mpx.c
@@ -1,6 +1,6 @@
 /* -*-c-*-
  *
- * $Id: mpx.c,v 1.20 2004/04/08 01:36:15 mdw Exp $
+ * $Id$
  *
  * Low-level multiprecision arithmetic
  *
@@ -462,11 +462,11 @@ void mpx_lsl(mpw *dv, mpw *dvl, const mpw *av, const mpw *avl, size_t n)
 
     while (avl > av) {
       mpw t = *--avl;
-      *--dvl = (t >> nr) | w;
+      *--dvl = MPW((t >> nr) | w);
       w = t << nb;
     }
 
-    *--dvl = w;
+    *--dvl = MPW(w);
     MPX_ZERO(dv, dvl);
   }
 
@@ -560,11 +560,11 @@ void mpx_lslc(mpw *dv, mpw *dvl, const mpw *av, const mpw *avl, size_t n)
 
     while (avl > av) {
       mpw t = *--avl;
-      *--dvl = (t >> nr) | w;
+      *--dvl = MPW((t >> nr) | w);
       w = t << nb;
     }
 
-    *--dvl = (MPW_MAX >> nr) | w;
+    *--dvl = MPW((MPW_MAX >> nr) | w);
     MPX_ONE(dv, dvl);
   }
 
@@ -919,7 +919,7 @@ void mpx_usubnlsl(mpw *dv, mpw *dvl, mpw a, unsigned o)
   a <<= o;
 
   if (dv < dvl) {
-    mpd x = (mpd)*dv - (mpd)a;
+    mpd x = (mpd)*dv - MPW(a);
     *dv++ = MPW(x);
     if (x >> MPW_BITS)
       b++;
@@ -995,9 +995,7 @@ void mpx_umul(mpw *dv, mpw *dvl, const mpw *av, const mpw *avl,
  */
 
 void mpx_umuln(mpw *dv, mpw *dvl, const mpw *av, const mpw *avl, mpw m)
-{
-  MPX_UMULN(dv, dvl, av, avl, m);
-}
+  { MPX_UMULN(dv, dvl, av, avl, m); }
 
 /* --- @mpx_umlan@ --- *
  *
@@ -1012,9 +1010,7 @@ void mpx_umuln(mpw *dv, mpw *dvl, const mpw *av, const mpw *avl, mpw m)
  */
 
 void mpx_umlan(mpw *dv, mpw *dvl, const mpw *av, const mpw *avl, mpw m)
-{
-  MPX_UMLAN(dv, dvl, av, avl, m);
-}
+  { MPX_UMLAN(dv, dvl, av, avl, m); }
 
 /* --- @mpx_usqr@ --- *
  *
@@ -1120,7 +1116,7 @@ void mpx_udiv(mpw *qv, mpw *qvl, mpw *rv, mpw *rvl,
     unsigned b;
 
     d = dvl[-1];
-    for (b = MPW_BITS / 2; b; b >>= 1) {
+    for (b = MPW_P2; b; b >>= 1) {
       if (d <= (MPW_MAX >> b)) {
        d <<= b;
        norm += b;
@@ -1421,7 +1417,7 @@ static int loadstore(dstr *v)
   if (!ok)
     dumpbits("input data", v->buf, v->len);
 
-  free(m);
+  xfree(m);
   dstr_destroy(&d);
   return (ok);
 }
@@ -1459,7 +1455,7 @@ static int twocl(dstr *v)
     dumpbits("neg", v[1].buf, v[1].len);
   }
 
-  free(m);
+  xfree(m);
   dstr_destroy(&d);
 
   return (ok);
@@ -1498,7 +1494,7 @@ static int twocb(dstr *v)
     dumpbits("neg", v[1].buf, v[1].len);
   }
 
-  free(m);
+  xfree(m);
   dstr_destroy(&d);
 
   return (ok);
@@ -1525,7 +1521,7 @@ static int lsl(dstr *v)
     ok = 0;
   }
 
-  free(a); free(c); free(d);
+  xfree(a); xfree(c); xfree(d);
   return (ok);
 }
 
@@ -1550,7 +1546,7 @@ static int lslc(dstr *v)
     ok = 0;
   }
 
-  free(a); free(c); free(d);
+  xfree(a); xfree(c); xfree(d);
   return (ok);
 }
 
@@ -1575,7 +1571,7 @@ static int lsr(dstr *v)
     ok = 0;
   }
 
-  free(a); free(c); free(d);
+  xfree(a); xfree(c); xfree(d);
   return (ok);
 }
 
@@ -1602,7 +1598,7 @@ static int uadd(dstr *v)
     ok = 0;
   }
 
-  free(a); free(b); free(c); free(d);
+  xfree(a); xfree(b); xfree(c); xfree(d);
   return (ok);
 }
 
@@ -1629,7 +1625,7 @@ static int usub(dstr *v)
     ok = 0;
   }
 
-  free(a); free(b); free(c); free(d);
+  xfree(a); xfree(b); xfree(c); xfree(d);
   return (ok);
 }
 
@@ -1656,7 +1652,7 @@ static int umul(dstr *v)
     ok = 0;
   }
 
-  free(a); free(b); free(c); free(d);
+  xfree(a); xfree(b); xfree(c); xfree(d);
   return (ok);
 }
 
@@ -1680,7 +1676,7 @@ static int usqr(dstr *v)
     ok = 0;
   }
 
-  free(a); free(c); free(d);
+  xfree(a); xfree(c); xfree(d);
   return (ok);
 }
 
@@ -1713,7 +1709,7 @@ static int udiv(dstr *v)
     ok = 0;
   }
 
-  free(a); free(b); free(r); free(q); free(s); free(qq);
+  xfree(a); xfree(b); xfree(r); xfree(q); xfree(s); xfree(qq);
   return (ok);
 }