/* * 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