# # mpvecdigmul(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+n = SI - can't be BP # p+n = DI - can't be BP # i-n = BP # m = BX # oldhi = CX # .text .p2align 2,0x90 .globl mpvecdigmuladd mpvecdigmuladd: # 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 movl %ecx, %ebp negl %ebp # BP = -n shll $2, %ecx addl %ecx, %esi # SI = b + n addl %ecx, %edi # DI = p + n xorl %ecx, %ecx _muladdloop: movl (%esi, %ebp, 4), %eax # lo = b[i] mull %ebx # hi, lo = b[i] * m addl %ecx,%eax # lo += oldhi jae _muladdnocarry1 incl %edx # hi += carry _muladdnocarry1: addl %eax, (%edi, %ebp, 4) # p[i] += lo jae _muladdnocarry2 incl %edx # hi += carry _muladdnocarry2: movl %edx, %ecx # oldhi = hi incl %ebp # i++ jnz _muladdloop xorl %eax, %eax addl %ecx, (%edi, %ebp, 4) # p[n] + oldhi adcl %eax, %eax # return carry out of p[n] # Postlude popl %edi popl %esi popl %ebx popl %ebp ret