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 2f
31 /* sum[0:blen-1],carry = a[0:blen-1] + b[0:blen-1] */
32 1:
33 movl (%esi, %ebp, 4), %eax
34 adcl (%ebx, %ebp, 4), %eax
35 movl %eax, (%edi, %ebp, 4)
36 incl %ebp
37 loop 1b
39 2:
40 /* jump if alen > blen */
41 incl %edx
42 movl %edx, %ecx
43 loop 5f
45 /* sum[alen] = carry */
46 3:
47 jb 4f
48 movl $0, (%edi, %ebp, 4)
49 jmp 6f
51 4:
52 movl $1, (%edi, %ebp, 4)
53 jmp 6f
55 /* sum[blen:alen-1],carry = a[blen:alen-1] + 0 */
56 5:
57 movl (%esi, %ebp, 4),%eax
58 adcl $0, %eax
59 movl %eax, (%edi, %ebp, 4)
60 incl %ebp
61 loop 5b
62 jmp 3b
64 6:
65 /* Postlude */
66 popl %edi
67 popl %esi
68 popl %ebx
69 popl %ebp
70 ret