Blob


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) */
6 .text
8 .p2align 2,0x90
9 .globl mpvecadd
10 .type mpvecadd, @function
11 mpvecadd:
12 /* Prelude */
13 pushl %ebp
14 movl %ebx, -4(%esp) /* save on stack */
15 movl %esi, -8(%esp)
16 movl %edi, -12(%esp)
18 movl 12(%esp), %edx /* alen */
19 movl 20(%esp), %ecx /* blen */
20 movl 8(%esp), %esi /* a */
21 movl 16(%esp), %ebx /* b */
22 subl %ecx, %edx
23 movl 24(%esp), %edi /* sum */
24 xorl %ebp, %ebp /* this also sets carry to 0 */
26 /* skip addition if b is zero */
27 testl %ecx,%ecx
28 je _add1
30 /* sum[0:blen-1],carry = a[0:blen-1] + b[0:blen-1] */
31 _addloop1:
32 movl (%esi, %ebp, 4), %eax
33 adcl (%ebx, %ebp, 4), %eax
34 movl %eax, (%edi, %ebp, 4)
35 incl %ebp
36 loop _addloop1
38 _add1:
39 /* jump if alen > blen */
40 incl %edx
41 movl %edx, %ecx
42 loop _addloop2
44 /* sum[alen] = carry */
45 _addend:
46 jb _addcarry
47 movl $0, (%edi, %ebp, 4)
48 jmp done
50 _addcarry:
51 movl $1, (%edi, %ebp, 4)
52 jmp done
54 /* sum[blen:alen-1],carry = a[blen:alen-1] + 0 */
55 _addloop2:
56 movl (%esi, %ebp, 4),%eax
57 adcl $0, %eax
58 movl %eax, (%edi, %ebp, 4)
59 incl %ebp
60 loop _addloop2
61 jmp _addend
63 done:
64 /* Postlude */
65 movl -4(%esp), %ebx /* restore from stack */
66 movl -8(%esp), %esi
67 movl -12(%esp), %edi
68 movl %esp, %ebp
69 leave
70 ret