Blame


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