From 2bd534943702669d478c7b74e1351504c3da56c1 Mon Sep 17 00:00:00 2001 From: mdw Date: Sun, 20 Oct 2002 01:12:31 +0000 Subject: [PATCH] Two's complement I/O fixes. --- mp-io.c | 9 ++++++--- mpx.c | 17 ++++++++++------- tests/mpx | 6 +++++- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/mp-io.c b/mp-io.c index 2f87892..0a102e9 100644 --- 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 --- 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) { diff --git a/tests/mpx b/tests/mpx index 1603838..2dccaef 100644 --- 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 --- -- 2.11.0