| /* |
| * 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 |
| |
| .globl _mpvecdigmulsub |
| _mpvecdigmulsub: |
| /* Prelude */ |
| pushl %ebp /* save on stack */ |
| pushl %ebx |
| pushl %esi |
| pushl %edi |
| |
| leal 20(%esp), %ebp /* %ebp = FP for now */ |
| movl 0(%ebp), %esi /* b */ |
| movl 4(%ebp), %ecx /* n */ |
| movl 8(%ebp), %ebx /* m */ |
| movl 12(%ebp), %edi /* p */ |
| xorl %ebp, %ebp |
| pushl %ebp |
| 1: |
| movl (%esi, %ebp, 4),%eax /* lo = b[i] */ |
| mull %ebx /* hi, lo = b[i] * m */ |
| addl 0(%esp), %eax /* lo += oldhi */ |
| jae 2f |
| incl %edx /* hi += carry */ |
| 2: |
| subl %eax, (%edi, %ebp, 4) |
| jae 3f |
| incl %edx /* hi += carry */ |
| 3: |
| movl %edx, 0(%esp) |
| incl %ebp |
| loop 1b |
| popl %eax |
| subl %eax, (%edi, %ebp, 4) |
| jae 4f |
| movl $-1, %eax |
| jmp 5f |
| 4: |
| movl $1, %eax |
| 5: |
| /* Postlude */ |
| popl %edi |
| popl %esi |
| popl %ebx |
| popl %ebp |
| ret |
| |