/* -*-c-*-
*
- * $Id: mp-arith.c,v 1.18 2004/04/08 01:36:15 mdw Exp $
+ * $Id$
*
* Basic arithmetic on multiprecision integers
*
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);
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);
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);
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);
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);
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);
p_bn \
} else { /* Both negative */ \
mp *t = mp_not2c(MP_NEW, a); \
- mp *d = mp_not2c(d, b); \
+ d = mp_not2c(d, b); \
d = mp_bit##abn(d, t, d); \
MP_DROP(t); \
p_abn \
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);
*/
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) {
RIG(add, mp_add)
RIG(sub, mp_sub)
RIG(mul, mp_mul)
+RIG(exp, mp_exp)
#undef RIG
{ "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 } },