/* mpvecadd(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *sum) */ /* sum[0:alen] = a[0:alen-1] + b[0:blen-1] */ /* prereq: alen >= blen, sum has room for alen+1 digits */ /* (very old gnu assembler doesn't allow multiline comments) */ .text .p2align 2,0x90 .globl mpvecadd .type mpvecadd, @function mpvecadd: /* Prelude */ pushl %ebp movl %ebx, -4(%esp) /* save on stack */ movl %esi, -8(%esp) movl %edi, -12(%esp) movl 12(%esp), %edx /* alen */ movl 20(%esp), %ecx /* blen */ movl 8(%esp), %esi /* a */ movl 16(%esp), %ebx /* b */ subl %ecx, %edx movl 24(%esp), %edi /* sum */ xorl %ebp, %ebp /* this also sets carry to 0 */ /* skip addition if b is zero */ testl %ecx,%ecx je _add1 /* sum[0:blen-1],carry = a[0:blen-1] + b[0:blen-1] */ _addloop1: movl (%esi, %ebp, 4), %eax adcl (%ebx, %ebp, 4), %eax movl %eax, (%edi, %ebp, 4) incl %ebp loop _addloop1 _add1: /* jump if alen > blen */ incl %edx movl %edx, %ecx loop _addloop2 /* sum[alen] = carry */ _addend: jb _addcarry movl $0, (%edi, %ebp, 4) jmp done _addcarry: movl $1, (%edi, %ebp, 4) jmp done /* sum[blen:alen-1],carry = a[blen:alen-1] + 0 */ _addloop2: movl (%esi, %ebp, 4),%eax adcl $0, %eax movl %eax, (%edi, %ebp, 4) incl %ebp loop _addloop2 jmp _addend done: /* Postlude */ movl -4(%esp), %ebx /* restore from stack */ movl -8(%esp), %esi movl -12(%esp), %edi movl %esp, %ebp leave ret