1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- /*
- * mpvecdigmulsub(mpdigit *b, int n, mpdigit m, mpdigit *p)
- *
- * p -= b*m
- *
- * each step look like:
- * hi,lo = m*b[i]
- * lo += oldhi + carry
- * hi += carry
- * p[i] += lo
- * oldhi = hi
- *
- * the registers are:
- * hi = DX - constrained by hardware
- * lo = AX - constrained by hardware
- * b = SI - can't be BP
- * p = DI - can't be BP
- * i = BP
- * n = CX - constrained by LOOP instr
- * m = BX
- * oldhi = EX
- *
- */
- TEXT mpvecdigmulsub(SB),$0
- MOVL b+0(FP),SI
- MOVL n+4(FP),CX
- MOVL m+8(FP),BX
- MOVL p+12(FP),DI
- XORL BP,BP
- PUSHL BP
- _mulsubloop:
- MOVL (SI)(BP*4),AX /* lo = b[i] */
- MULL BX /* hi, lo = b[i] * m */
- ADDL 0(SP),AX /* lo += oldhi */
- JCC _mulsubnocarry1
- INCL DX /* hi += carry */
- _mulsubnocarry1:
- SUBL AX,(DI)(BP*4)
- JCC _mulsubnocarry2
- INCL DX /* hi += carry */
- _mulsubnocarry2:
- MOVL DX,0(SP)
- INCL BP
- LOOP _mulsubloop
- POPL AX
- SUBL AX,(DI)(BP*4)
- JCC _mulsubnocarry3
- MOVL $-1,AX
- RET
- _mulsubnocarry3:
- MOVL $1,AX
- RET
|