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 \
ss = 0;
else {
mpw x = *v;
- mpw mask = MPW_MAX;
- unsigned z = MPW_BITS / 2;
+ unsigned z = MPW_P2;
+ mpw mask = ((mpw)1 << z) - 1;
while (z) {
- mask >>= z;
if (!(x & mask)) {
x >>= z;
ss += z;
}
z >>= 1;
+ mask >>= z;
}
}
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 } },