X-Git-Url: https://git.distorted.org.uk/u/mdw/catacomb/blobdiff_plain/b817bfc642225b8c3c0b6a7e42d1fb949b61a606..025c5f4aa5ffbf8948482a4233318db81c2df5d2:/mp-arith.c diff --git a/mp-arith.c b/mp-arith.c index 736be2f..941b8df 100644 --- a/mp-arith.c +++ b/mp-arith.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: mp-arith.c,v 1.18 2004/04/08 01:36:15 mdw Exp $ + * $Id$ * * Basic arithmetic on multiprecision integers * @@ -90,7 +90,7 @@ mp *mp_lsr(mp *d, mp *a, size_t n) mp *mp_lsl2c(mp *d, mp *a, size_t n) { - if (!(a->f & MP_NEG)) + if (!MP_NEGP(a)) return (mp_lsl(d, a, n)); d = mp_not2c(d, a); d = mp_lslc(d, d, n); @@ -100,7 +100,7 @@ mp *mp_lsl2c(mp *d, mp *a, size_t n) mp *mp_lsr2c(mp *d, mp *a, size_t n) { - if (!(a->f & MP_NEG)) + if (!MP_NEGP(a)) return (mp_lsr(d, a, n)); d = mp_not2c(d, a); d = mp_lsr(d, d, n); @@ -135,7 +135,7 @@ int mp_testbit(mp *x, unsigned long n) int mp_testbit2c(mp *x, unsigned long n) { int r; - if (!(x->f & MP_NEG)) + if (!MP_NEGP(x)) return (mp_testbit(x, n)); x = mp_not2c(MP_NEW, x); r = !mp_testbit(x, n); @@ -192,7 +192,7 @@ mp *mp_clearbit(mp *d, mp *x, unsigned long n) mp *mp_setbit2c(mp *d, mp *x, unsigned long n) { - if (!(x->f & MP_NEG)) + if (!MP_NEGP(x)) return mp_setbit(d, x, n); d = mp_not2c(d, x); d = mp_clearbit(d, d, n); @@ -202,7 +202,7 @@ mp *mp_setbit2c(mp *d, mp *x, unsigned long n) mp *mp_clearbit2c(mp *d, mp *x, unsigned long n) { - if (!(x->f & MP_NEG)) + if (!MP_NEGP(x)) return mp_clearbit(d, x, n); d = mp_not2c(d, x); d = mp_setbit(d, d, n); @@ -229,9 +229,12 @@ int mp_eq(const mp *a, const mp *b) { return (MP_EQ(a, b)); } int mp_cmp(const mp *a, const mp *b) { - if (!((a->f ^ b->f) & MP_NEG)) - return (mpx_ucmp(a->v, a->vl, b->v, b->vl)); - else if (a->f & MP_NEG) + if (!((a->f ^ b->f) & MP_NEG)) { + if (a->f & MP_NEG) + return (-mpx_ucmp(a->v, a->vl, b->v, b->vl)); + else + return (mpx_ucmp(a->v, a->vl, b->v, b->vl)); + } else if (a->f & MP_NEG) return (-1); else return (+1); @@ -400,12 +403,12 @@ mp *mp_not2c(mp *d, mp *a) MP_DEST(d, MP_LEN(a) + 1, a->f); if (d == a) { - if (a->f & MP_NEG) + if (MP_NEGP(a)) MPX_USUBN(d->v, d->vl, 1); else MPX_UADDN(d->v, d->vl, 1); } else { - if (a->f & MP_NEG) + if (MP_NEGP(a)) mpx_usub(d->v, d->vl, a->v, a->vl, &one, &one + 1); else mpx_uadd(d->v, d->vl, a->v, a->vl, &one, &one + 1); @@ -590,7 +593,7 @@ void mp_div(mp **qq, mp **rr, mp *a, mp *b) */ q->f = ((r->f | b->f) & MP_BURN) | ((r->f ^ b->f) & MP_NEG); - if (q->f & MP_NEG) { + if (MP_NEGP(q)) { mpw *v; for (v = r->v; v < r->vl; v++) { if (*v) { @@ -723,6 +726,7 @@ RIG(lsr2c, mp_lsr2c) RIG(add, mp_add) RIG(sub, mp_sub) RIG(mul, mp_mul) +RIG(exp, mp_exp) #undef RIG @@ -908,6 +912,7 @@ static test_chunk tests[] = { { "sub", tsub, { &type_mp, &type_mp, &type_mp, 0 } }, { "mul", tmul, { &type_mp, &type_mp, &type_mp, 0 } }, { "div", tdiv, { &type_mp, &type_mp, &type_mp, &type_mp, 0 } }, + { "exp", texp, { &type_mp, &type_mp, &type_mp, 0 } }, { "bin2c", tbin, { &type_string, &type_mp, &type_mp, &type_mp, 0 } }, { "odd", todd, { &type_mp, &type_uint32, &type_mp, 0 } }, { "neg", tneg, { &type_mp, &type_mp, 0 } },