2 * mpvecdigmulsub(mpdigit *b, int n, mpdigit m, mpdigit *p)
6 * each step looks like:
19 * hi = R8 - constrained by hardware
20 * lo = R9 - constrained by hardware
25 TEXT mpvecdigmulsub(SB),$0
31 MOVW R0, R10 /* oldhi = 0 */
33 MOVW 0(R1), R9 /* lo = b[i] */
35 MOVW 0(R6), R11 /* tmp = p[i] */
37 MOVW HI, R8 /* hi = (b[i] * m)>>32 */
38 MOVW LO, R9 /* lo = b[i] * m */
39 ADDU R10, R9 /* lo += oldhi */
41 ADDU R2, R8 /* hi += carry */
42 SUBU R9, R11, R3 /* tmp -= lo */
44 ADDU R2, R8 /* hi += carry */
45 MOVW R3, 0(R6) /* p[i] = tmp */
47 MOVW R8, R10 /* oldhi = hi */
51 MOVW 0(R6), R11 /* tmp = p[i] */
52 SUBU R10, R11, R3 /* tmp -= oldhi */
53 MOVW R3, 0(R6) /* p[i] = tmp */
56 MOVW $1, R1 /* return +1 for positive result */
60 MOVW $-1, R1 /* return -1 for negative result */