void mpsubfixfix(Mpint *a, Mpint *b) { mpnegfix(a); mpaddfixfix(a, b, 0); mpnegfix(a); }
void mpaddcfix(Mpint *a, vlong c) { Mpint b; mpmovecfix(&b, c); mpaddfixfix(a, &b, 0); }
void mpmulfixfix(Mpint *a, Mpint *b) { int i, j, na, nb; long *a1, x; Mpint s, q; if(a->ovf || b->ovf) { yyerror("ovf in mpmulfixfix"); a->ovf = 1; return; } // pick the smaller // to test for bits na = mplen(a); nb = mplen(b); if(na > nb) { mpmovefixfix(&s, a); a1 = &b->a[0]; na = nb; } else { mpmovefixfix(&s, b); a1 = &a->a[0]; } s.neg = 0; mpmovecfix(&q, 0); for(i=0; i<na; i++) { x = *a1++; for(j=0; j<Mpscale; j++) { if(x & 1) mpaddfixfix(&q, &s); mplsh(&s); x >>= 1; } } q.neg = a->neg ^ b->neg; mpmovefixfix(a, &q); if(a->ovf) yyerror("set ovf in mpmulfixfix"); }
void mpmulfract(Mpint *a, Mpint *b) { int i, j; long *a1, x; Mpint s, q; if(a->ovf || b->ovf) { yyerror("ovf in mpmulflt"); a->ovf = 1; return; } mpmovefixfix(&s, b); a1 = &a->a[Mpprec]; s.neg = 0; mpmovecfix(&q, 0); for(i=0; i<Mpprec; i++) { x = *--a1; if(x == 0) { mprshw(&s); continue; } for(j=0; j<Mpscale; j++) { x <<= 1; if(x & Mpbase) mpaddfixfix(&q, &s); mprsh(&s); } } q.neg = a->neg ^ b->neg; mpmovefixfix(a, &q); if(a->ovf) yyerror("set ovf in mpmulflt"); }