1 /* mpvecadd(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *sum) */
2 /* sum[0:alen] = a[0:alen-1] + b[0:blen-1] */
3 /* prereq: alen >= blen, sum has room for alen+1 digits */
4 /* (very old gnu assembler doesn't allow multiline comments) */
12 pushl %ebp /* save on stack */
17 leal 20(%esp), %ebp /* %ebp = FP for now */
19 movl 4(%ebp), %edx /* alen */
20 movl 12(%ebp), %ecx /* blen */
21 movl 0(%ebp), %esi /* a */
22 movl 8(%ebp), %ebx /* b */
24 movl 16(%ebp), %edi /* sum */
25 xorl %ebp, %ebp /* this also sets carry to 0 */
27 /* skip addition if b is zero */
31 /* sum[0:blen-1],carry = a[0:blen-1] + b[0:blen-1] */
33 movl (%esi, %ebp, 4), %eax
34 adcl (%ebx, %ebp, 4), %eax
35 movl %eax, (%edi, %ebp, 4)
40 /* jump if alen > blen */
45 /* sum[alen] = carry */
48 movl $0, (%edi, %ebp, 4)
52 movl $1, (%edi, %ebp, 4)
55 /* sum[blen:alen-1],carry = a[blen:alen-1] + 0 */
57 movl (%esi, %ebp, 4),%eax
59 movl %eax, (%edi, %ebp, 4)