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 _mpvecadd:
11 /* Prelude */
12 pushl %ebp /* save on stack */
13 pushl %ebx
14 pushl %esi
15 pushl %edi
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 */
23 subl %ecx, %edx
24 movl 16(%ebp), %edi /* sum */
25 xorl %ebp, %ebp /* this also sets carry to 0 */
27 /* skip addition if b is zero */
28 testl %ecx,%ecx
29 je _add1
31 /* sum[0:blen-1],carry = a[0:blen-1] + b[0:blen-1] */
32 _addloop1:
33 movl (%esi, %ebp, 4), %eax
34 adcl (%ebx, %ebp, 4), %eax
35 movl %eax, (%edi, %ebp, 4)
36 incl %ebp
37 loop _addloop1
39 _add1:
40 /* jump if alen > blen */
41 incl %edx
42 movl %edx, %ecx
43 loop _addloop2
45 /* sum[alen] = carry */
46 _addend:
47 jb _addcarry
48 movl $0, (%edi, %ebp, 4)
49 jmp done
51 _addcarry:
52 movl $1, (%edi, %ebp, 4)
53 jmp done
55 /* sum[blen:alen-1],carry = a[blen:alen-1] + 0 */
56 _addloop2:
57 movl (%esi, %ebp, 4),%eax
58 adcl $0, %eax
59 movl %eax, (%edi, %ebp, 4)
60 incl %ebp
61 loop _addloop2
62 jmp _addend
64 done:
65 /* Postlude */
66 popl %edi
67 popl %esi
68 popl %ebx
69 popl %ebp
70 ret