Blame


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