Two's complement I/O fixes.
authormdw <mdw>
Sun, 20 Oct 2002 01:12:31 +0000 (01:12 +0000)
committermdw <mdw>
Sun, 20 Oct 2002 01:12:31 +0000 (01:12 +0000)
mp-io.c
mpx.c
tests/mpx

diff --git a/mp-io.c b/mp-io.c
index 2f87892..0a102e9 100644 (file)
--- a/mp-io.c
+++ b/mp-io.c
@@ -1,6 +1,6 @@
 /* -*-c-*-
  *
- * $Id: mp-io.c,v 1.5 2002/10/06 22:52:50 mdw Exp $
+ * $Id: mp-io.c,v 1.6 2002/10/20 01:12:31 mdw Exp $
  *
  * Loading and storing of multiprecision integers
  *
@@ -30,6 +30,9 @@
 /*----- Revision history --------------------------------------------------* 
  *
  * $Log: mp-io.c,v $
+ * Revision 1.6  2002/10/20 01:12:31  mdw
+ * Two's complement I/O fixes.
+ *
  * Revision 1.5  2002/10/06 22:52:50  mdw
  * Pile of changes for supporting two's complement properly.
  *
@@ -266,10 +269,10 @@ mp *mp_loadb2c(mp *d, const void *pv, size_t sz)
   const octet *ov = pv;
   MP_DEST(d, MPW_RQ(sz), MP_UNDEF);
   if (!sz || !(ov[0] & 0x80)) {
-    mpx_loadl(d->v, d->vl, pv, sz);
+    mpx_loadb(d->v, d->vl, pv, sz);
     d->f &= ~MP_NEG;
   } else {
-    mpx_loadl2cn(d->v, d->vl, pv, sz);
+    mpx_loadb2cn(d->v, d->vl, pv, sz);
     d->f |= MP_NEG;
   }
   d->f &= ~MP_UNDEF;
diff --git a/mpx.c b/mpx.c
index d7ea70a..6375c3e 100644 (file)
--- a/mpx.c
+++ b/mpx.c
@@ -1,6 +1,6 @@
 /* -*-c-*-
  *
- * $Id: mpx.c,v 1.14 2002/10/19 18:55:08 mdw Exp $
+ * $Id: mpx.c,v 1.15 2002/10/20 01:12:31 mdw Exp $
  *
  * Low-level multiprecision arithmetic
  *
@@ -30,6 +30,9 @@
 /*----- Revision history --------------------------------------------------* 
  *
  * $Log: mpx.c,v $
+ * Revision 1.15  2002/10/20 01:12:31  mdw
+ * Two's complement I/O fixes.
+ *
  * Revision 1.14  2002/10/19 18:55:08  mdw
  * Fix overflows in shift primitives.
  *
@@ -281,12 +284,12 @@ void mpx_storel2cn(const mpw *v, const mpw *vl, void *pp, size_t sz)
       bits -= 8;
     }
     b = U8(~b + c);
-    c = !b;
+    c = c && !b;
     *p++ = b;
   }
   while (p < q) {
     b = U8(~b + c);
-    c = !b;
+    c = c && !b;
     *p++ = b;
     b = 0;
   }
@@ -318,7 +321,7 @@ void mpx_loadl2cn(mpw *v, mpw *vl, const void *pp, size_t sz)
     return;
   while (p < q) {
     n = U8(~(*p++) + c);
-    c = !n;
+    c = c && !n;
     w |= n << bits;
     bits += 8;
     if (bits >= MPW_BITS) {
@@ -371,12 +374,12 @@ void mpx_storeb2cn(const mpw *v, const mpw *vl, void *pp, size_t sz)
       bits -= 8;
     }
     b = U8(~b + c);
-    c = !b;
+    c = c && !b;
     *--q = b;
   }
   while (q > p) {
     b = ~b + c;
-    c = !(b & 0xff);
+    c = c && !(b & 0xff);
     *--q = b;
     b = 0;
   }
@@ -408,7 +411,7 @@ void mpx_loadb2cn(mpw *v, mpw *vl, const void *pp, size_t sz)
     return;
   while (q > p) {
     n = U8(~(*--q) + c);
-    c = !n;
+    c = c && !n;
     w |= n << bits;
     bits += 8;
     if (bits >= MPW_BITS) {
index 1603838..2dccaef 100644 (file)
--- a/tests/mpx
+++ b/tests/mpx
@@ -1,6 +1,6 @@
 # Test vectors for low-level MP functions
 #
-# $Id: mpx,v 1.9 2002/10/19 18:55:08 mdw Exp $
+# $Id: mpx,v 1.10 2002/10/20 01:12:31 mdw Exp $
 
 # --- Load-store tests ---
 #
@@ -30,6 +30,8 @@ load-store {
   0123456789abcdef fedcba9876543211;
   0123456789abcdef fffffffedcba9876543211;
   0100000000 ffffff00000000;
+  00000000c1a4bc4b ffffffff3e5b43b5;
+  ffffffff3e5b43b5 00000000c1a4bc4b;
 }
 
 2cl {
@@ -40,6 +42,8 @@ load-store {
   efcdab8967452301 1132547698badcfe;
   efcdab8967452301 1132547698badcfeffffffff;
   0000000001 00000000ffffffff;
+  4bbca4c100000000 b5435b3effffffff;
+  b5435b3effffffff 4bbca4c100000000;
 }
 
 # --- Shift tests ---