Blob


1 /*
2 * mpvecadd(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *sum)
3 *
4 * sum[0:alen] = a[0:alen-1] + b[0:blen-1]
5 *
6 * prereq: alen >= blen, sum has room for alen+1 digits
7 */
9 .text
11 .p2align 2,0x90
12 .globl mpvecadd
13 .type mpvecadd, @function
14 mpvecadd:
15 /* Prelude */
16 pushl %ebp
17 movl %ebx, -4(%esp) /* save on stack */
18 movl %esi, -8(%esp)
19 movl %edi, -12(%esp)
21 movl 12(%esp), %edx /* alen */
22 movl 20(%esp), %ecx /* blen */
23 movl 8(%esp), %esi /* a */
24 movl 16(%esp), %ebx /* b */
25 subl %ecx, %edx
26 movl 24(%esp), %edi /* sum */
27 xorl %ebp, %ebp /* this also sets carry to 0 */
29 /* skip addition if b is zero */
30 testl %ecx,%ecx
31 je _add1
33 /* sum[0:blen-1],carry = a[0:blen-1] + b[0:blen-1] */
34 _addloop1:
35 movl (%esi, %ebp, 4), %eax
36 adcl (%ebx, %ebp, 4), %eax
37 movl %eax, (%edi, %ebp, 4)
38 incl %ebp
39 loop _addloop1
41 _add1:
42 /* jump if alen > blen */
43 incl %edx
44 movl %edx, %ecx
45 loop _addloop2
47 /* sum[alen] = carry */
48 _addend:
49 jb _addcarry
50 movl $0, (%edi, %ebp, 4)
51 jmp done
53 _addcarry:
54 movl $1, (%edi, %ebp, 4)
55 jmp done
57 /* sum[blen:alen-1],carry = a[blen:alen-1] + 0 */
58 _addloop2:
59 movl (%esi, %ebp, 4),%eax
60 adcl $0, %eax
61 movl %eax, (%edi, %ebp, 4)
62 incl %ebp
63 loop _addloop2
64 jmp _addend
66 done:
67 /* Postlude */
68 movl -4(%esp), %ebx /* restore from stack */
69 movl -8(%esp), %esi
70 movl -12(%esp), %edi
71 movl %esp, %ebp
72 leave
73 ret