# # 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 .p2align 2,0x90 .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 _mulsubloop: movl (%esi, %ebp, 4),%eax # lo = b[i] mull %ebx # hi, lo = b[i] * m addl 0(%esp), %eax # lo += oldhi jae _mulsubnocarry1 incl %edx # hi += carry _mulsubnocarry1: subl %eax, (%edi, %ebp, 4) jae _mulsubnocarry2 incl %edx # hi += carry _mulsubnocarry2: movl %edx, 0(%esp) incl %ebp loop _mulsubloop popl %eax subl %eax, (%edi, %ebp, 4) jae _mulsubnocarry3 movl $-1, %eax jmp done _mulsubnocarry3: movl $1, %eax done: # Postlude popl %edi popl %esi popl %ebx popl %ebp ret