Blame


1 4e3a81b9 2006-04-21 devnull /* mpvecadd(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *sum) */
2 4e3a81b9 2006-04-21 devnull /* sum[0:alen] = a[0:alen-1] + b[0:blen-1] */
3 4e3a81b9 2006-04-21 devnull /* prereq: alen >= blen, sum has room for alen+1 digits */
4 4e3a81b9 2006-04-21 devnull /* (very old gnu assembler doesn't allow multiline comments) */
5 4e3a81b9 2006-04-21 devnull
6 4e3a81b9 2006-04-21 devnull .text
7 4e3a81b9 2006-04-21 devnull
8 4e3a81b9 2006-04-21 devnull .p2align 2,0x90
9 4e3a81b9 2006-04-21 devnull .globl _mpvecadd
10 4e3a81b9 2006-04-21 devnull _mpvecadd:
11 4e3a81b9 2006-04-21 devnull /* Prelude */
12 4e3a81b9 2006-04-21 devnull pushl %ebp /* save on stack */
13 4e3a81b9 2006-04-21 devnull pushl %ebx
14 4e3a81b9 2006-04-21 devnull pushl %esi
15 4e3a81b9 2006-04-21 devnull pushl %edi
16 4e3a81b9 2006-04-21 devnull
17 4e3a81b9 2006-04-21 devnull leal 20(%esp), %ebp /* %ebp = FP for now */
18 4e3a81b9 2006-04-21 devnull
19 4e3a81b9 2006-04-21 devnull movl 4(%ebp), %edx /* alen */
20 4e3a81b9 2006-04-21 devnull movl 12(%ebp), %ecx /* blen */
21 4e3a81b9 2006-04-21 devnull movl 0(%ebp), %esi /* a */
22 4e3a81b9 2006-04-21 devnull movl 8(%ebp), %ebx /* b */
23 4e3a81b9 2006-04-21 devnull subl %ecx, %edx
24 4e3a81b9 2006-04-21 devnull movl 16(%ebp), %edi /* sum */
25 4e3a81b9 2006-04-21 devnull xorl %ebp, %ebp /* this also sets carry to 0 */
26 4e3a81b9 2006-04-21 devnull
27 4e3a81b9 2006-04-21 devnull /* skip addition if b is zero */
28 4e3a81b9 2006-04-21 devnull testl %ecx,%ecx
29 4e3a81b9 2006-04-21 devnull je _add1
30 4e3a81b9 2006-04-21 devnull
31 4e3a81b9 2006-04-21 devnull /* sum[0:blen-1],carry = a[0:blen-1] + b[0:blen-1] */
32 4e3a81b9 2006-04-21 devnull _addloop1:
33 4e3a81b9 2006-04-21 devnull movl (%esi, %ebp, 4), %eax
34 4e3a81b9 2006-04-21 devnull adcl (%ebx, %ebp, 4), %eax
35 4e3a81b9 2006-04-21 devnull movl %eax, (%edi, %ebp, 4)
36 4e3a81b9 2006-04-21 devnull incl %ebp
37 4e3a81b9 2006-04-21 devnull loop _addloop1
38 4e3a81b9 2006-04-21 devnull
39 4e3a81b9 2006-04-21 devnull _add1:
40 4e3a81b9 2006-04-21 devnull /* jump if alen > blen */
41 4e3a81b9 2006-04-21 devnull incl %edx
42 4e3a81b9 2006-04-21 devnull movl %edx, %ecx
43 4e3a81b9 2006-04-21 devnull loop _addloop2
44 4e3a81b9 2006-04-21 devnull
45 4e3a81b9 2006-04-21 devnull /* sum[alen] = carry */
46 4e3a81b9 2006-04-21 devnull _addend:
47 4e3a81b9 2006-04-21 devnull jb _addcarry
48 4e3a81b9 2006-04-21 devnull movl $0, (%edi, %ebp, 4)
49 4e3a81b9 2006-04-21 devnull jmp done
50 4e3a81b9 2006-04-21 devnull
51 4e3a81b9 2006-04-21 devnull _addcarry:
52 4e3a81b9 2006-04-21 devnull movl $1, (%edi, %ebp, 4)
53 4e3a81b9 2006-04-21 devnull jmp done
54 4e3a81b9 2006-04-21 devnull
55 4e3a81b9 2006-04-21 devnull /* sum[blen:alen-1],carry = a[blen:alen-1] + 0 */
56 4e3a81b9 2006-04-21 devnull _addloop2:
57 4e3a81b9 2006-04-21 devnull movl (%esi, %ebp, 4),%eax
58 4e3a81b9 2006-04-21 devnull adcl $0, %eax
59 4e3a81b9 2006-04-21 devnull movl %eax, (%edi, %ebp, 4)
60 4e3a81b9 2006-04-21 devnull incl %ebp
61 4e3a81b9 2006-04-21 devnull loop _addloop2
62 4e3a81b9 2006-04-21 devnull jmp _addend
63 4e3a81b9 2006-04-21 devnull
64 4e3a81b9 2006-04-21 devnull done:
65 4e3a81b9 2006-04-21 devnull /* Postlude */
66 4e3a81b9 2006-04-21 devnull popl %edi
67 4e3a81b9 2006-04-21 devnull popl %esi
68 4e3a81b9 2006-04-21 devnull popl %ebx
69 4e3a81b9 2006-04-21 devnull popl %ebp
70 4e3a81b9 2006-04-21 devnull ret