* the instruction's immediate operands.
*/
-#ifdef DEBUG
- for (i = 0, mp_scan(&sc, p); mp_step(&sc); i++) {
- switch (st | mp_bit(&sc)) {
- case Z | 1: st = Z1; break;
- case Z1 | 0: st = Z; printf("+ %lu\n", i - 1); break;
- case Z1 | 1: st = X; printf("- %lu\n", i - 1); break;
- case X | 0: st = X0; break;
- case X0 | 1: st = X; printf("- %lu\n", i - 1); break;
- case X0 | 0: st = Z; printf("+ %lu\n", i - 1); break;
- }
- }
- if (st >= X) printf("+ %lu\n", i - 1);
- st = Z;
-#endif
-
bb = MPW_BITS - (d + 1)%MPW_BITS;
for (i = 0, mp_scan(&sc, p); i < d && mp_step(&sc); i++) {
switch (st | mp_bit(&sc)) {
}
DA_DESTROY(&iv);
-#ifdef DEBUG
- mpreduce_dump(r, stdout);
-#endif
return (0);
}
mpw *v, mpw z)
{
for (; i < il; i++) {
-#ifdef DEBUG
- mp vv;
- mp_build(&vv, v - i->argx, v + 1);
- printf(" 0x"); mp_writefile(&vv, stdout, 16);
- printf(" %c (0x%lx << %u) == 0x",
- (i->op & ~1u) == MPRI_ADD ? '+' : '-',
- (unsigned long)z,
- i->argy);
-#endif
switch (i->op) {
case MPRI_ADD: MPX_UADDN(v - i->argx, v + 1, z); break;
case MPRI_ADDLSL: mpx_uaddnlsl(v - i->argx, v + 1, z, i->argy); break;
default:
abort();
}
-#ifdef DEBUG
- mp_build(&vv, v - i->argx, v + 1);
- mp_writefile(&vv, stdout, 16);
- printf("\n");
-#endif
}
}
const mpreduce_instr *il;
mpw z;
-#ifdef DEBUG
- mp *_r = 0, *_rr = 0;
-#endif
-
/* --- If source is negative, divide --- */
if (MP_NEGP(x)) {
/* --- Stage one: trim excess words from the most significant end --- */
-#ifdef DEBUG
- _r = MP_NEW;
- mp_div(0, &_r, x, r->p);
- MP_PRINTX("x", x);
- _rr = 0;
-#endif
-
il = r->iv + r->in;
if (MP_LEN(x) >= r->lim) {
v = x->v + r->lim;
z = *vl;
*vl = 0;
run(r->iv, il, vl, z);
-#ifdef DEBUG
- MP_PRINTX("x", x);
- mp_div(0, &_rr, x, r->p);
- assert(MP_EQ(_r, _rr));
-#endif
}
}
z = *vl >> r->s;
*vl &= ((1 << r->s) - 1);
run(r->iv + r->in, il + r->in, vl, z);
-#ifdef DEBUG
- MP_PRINTX("x", x);
- mp_div(0, &_rr, x, r->p);
- assert(MP_EQ(_r, _rr));
-#endif
}
}
}
/* --- Done --- */
-#ifdef DEBUG
- assert(MP_EQ(_r, x));
- mp_drop(_r);
- mp_drop(_rr);
-#endif
return (x);
}