Blame


1 ac0e2db6 2004-04-21 devnull /*
2 ac0e2db6 2004-04-21 devnull * mpvecsub(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *diff)
3 ac0e2db6 2004-04-21 devnull *
4 ac0e2db6 2004-04-21 devnull * diff[0:alen-1] = a[0:alen-1] - b[0:blen-1]
5 ac0e2db6 2004-04-21 devnull *
6 ac0e2db6 2004-04-21 devnull * prereq: alen >= blen, diff has room for alen digits
7 ac0e2db6 2004-04-21 devnull */
8 ac0e2db6 2004-04-21 devnull .text
9 ac0e2db6 2004-04-21 devnull
10 ac0e2db6 2004-04-21 devnull .p2align 2,0x90
11 ac0e2db6 2004-04-21 devnull .globl mpvecsub
12 ac0e2db6 2004-04-21 devnull .type mpvecsub, @function
13 ac0e2db6 2004-04-21 devnull mpvecsub:
14 ac0e2db6 2004-04-21 devnull /* Prelude */
15 ac0e2db6 2004-04-21 devnull pushl %ebp
16 ac0e2db6 2004-04-21 devnull movl %ebx, -4(%esp) /* save on stack */
17 ac0e2db6 2004-04-21 devnull movl %esi, -8(%esp)
18 ac0e2db6 2004-04-21 devnull movl %edi, -12(%esp)
19 ac0e2db6 2004-04-21 devnull
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 movl 12(%esp), %edx /* alen */
23 ac0e2db6 2004-04-21 devnull movl 20(%esp), %ecx /* blen */
24 ac0e2db6 2004-04-21 devnull movl 24(%esp), %edi /* diff */
25 ac0e2db6 2004-04-21 devnull subl %ecx,%edx
26 ac0e2db6 2004-04-21 devnull xorl %ebp,%ebp /* this also sets carry to 0 */
27 ac0e2db6 2004-04-21 devnull
28 ac0e2db6 2004-04-21 devnull /* skip subraction if b is zero */
29 ac0e2db6 2004-04-21 devnull testl %ecx,%ecx
30 ac0e2db6 2004-04-21 devnull jz _sub1
31 ac0e2db6 2004-04-21 devnull
32 ac0e2db6 2004-04-21 devnull /* diff[0:blen-1],borrow = a[0:blen-1] - b[0:blen-1] */
33 ac0e2db6 2004-04-21 devnull _subloop1:
34 ac0e2db6 2004-04-21 devnull movl (%esi, %ebp, 4), %eax
35 ac0e2db6 2004-04-21 devnull sbbl (%ebx, %ebp, 4), %eax
36 ac0e2db6 2004-04-21 devnull movl %eax, (%edi, %ebp, 4)
37 ac0e2db6 2004-04-21 devnull incl %ebp
38 ac0e2db6 2004-04-21 devnull loop _subloop1
39 ac0e2db6 2004-04-21 devnull
40 ac0e2db6 2004-04-21 devnull _sub1:
41 ac0e2db6 2004-04-21 devnull incl %edx
42 ac0e2db6 2004-04-21 devnull movl %edx,%ecx
43 ac0e2db6 2004-04-21 devnull loop _subloop2
44 ac0e2db6 2004-04-21 devnull jmp done
45 ac0e2db6 2004-04-21 devnull
46 ac0e2db6 2004-04-21 devnull /* diff[blen:alen-1] = a[blen:alen-1] - 0 */
47 ac0e2db6 2004-04-21 devnull _subloop2:
48 ac0e2db6 2004-04-21 devnull movl (%esi, %ebp, 4), %eax
49 ac0e2db6 2004-04-21 devnull sbbl $0, %eax
50 ac0e2db6 2004-04-21 devnull movl %eax, (%edi, %ebp, 4)
51 ac0e2db6 2004-04-21 devnull INCL %ebp
52 ac0e2db6 2004-04-21 devnull LOOP _subloop2
53 ac0e2db6 2004-04-21 devnull
54 ac0e2db6 2004-04-21 devnull done:
55 ac0e2db6 2004-04-21 devnull /* Postlude */
56 ac0e2db6 2004-04-21 devnull movl -4(%esp), %ebx /* restore from stack */
57 ac0e2db6 2004-04-21 devnull movl -8(%esp), %esi
58 ac0e2db6 2004-04-21 devnull movl -12(%esp), %edi
59 ac0e2db6 2004-04-21 devnull movl %esp, %ebp
60 ac0e2db6 2004-04-21 devnull leave
61 ac0e2db6 2004-04-21 devnull ret
62 ac0e2db6 2004-04-21 devnull