Blame


1 a32765e3 2005-08-10 devnull /* mpvecsub(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *diff) */
2 a32765e3 2005-08-10 devnull /* diff[0:alen-1] = a[0:alen-1] - b[0:blen-1] */
3 a32765e3 2005-08-10 devnull /* prereq: alen >= blen, diff has room for alen digits */
4 a32765e3 2005-08-10 devnull /* (very old gnu assembler doesn't allow multiline comments) */
5 a32765e3 2005-08-10 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 mpvecsub
10 ac0e2db6 2004-04-21 devnull mpvecsub:
11 ac0e2db6 2004-04-21 devnull /* Prelude */
12 39ce0d58 2006-03-22 devnull pushl %ebp /* save on stack */
13 39ce0d58 2006-03-22 devnull pushl %ebx
14 39ce0d58 2006-03-22 devnull pushl %esi
15 39ce0d58 2006-03-22 devnull pushl %edi
16 ac0e2db6 2004-04-21 devnull
17 39ce0d58 2006-03-22 devnull leal 20(%esp), %ebp /* %ebp = FP for now */
18 39ce0d58 2006-03-22 devnull movl 0(%ebp), %esi /* a */
19 39ce0d58 2006-03-22 devnull movl 8(%ebp), %ebx /* b */
20 39ce0d58 2006-03-22 devnull movl 4(%ebp), %edx /* alen */
21 39ce0d58 2006-03-22 devnull movl 12(%ebp), %ecx /* blen */
22 39ce0d58 2006-03-22 devnull movl 16(%ebp), %edi /* diff */
23 39ce0d58 2006-03-22 devnull
24 ac0e2db6 2004-04-21 devnull subl %ecx,%edx
25 ac0e2db6 2004-04-21 devnull xorl %ebp,%ebp /* this also sets carry to 0 */
26 ac0e2db6 2004-04-21 devnull
27 ac0e2db6 2004-04-21 devnull /* skip subraction if b is zero */
28 ac0e2db6 2004-04-21 devnull testl %ecx,%ecx
29 ac0e2db6 2004-04-21 devnull jz _sub1
30 ac0e2db6 2004-04-21 devnull
31 ac0e2db6 2004-04-21 devnull /* diff[0:blen-1],borrow = a[0:blen-1] - b[0:blen-1] */
32 ac0e2db6 2004-04-21 devnull _subloop1:
33 ac0e2db6 2004-04-21 devnull movl (%esi, %ebp, 4), %eax
34 ac0e2db6 2004-04-21 devnull sbbl (%ebx, %ebp, 4), %eax
35 ac0e2db6 2004-04-21 devnull movl %eax, (%edi, %ebp, 4)
36 ac0e2db6 2004-04-21 devnull incl %ebp
37 ac0e2db6 2004-04-21 devnull loop _subloop1
38 ac0e2db6 2004-04-21 devnull
39 ac0e2db6 2004-04-21 devnull _sub1:
40 ac0e2db6 2004-04-21 devnull incl %edx
41 ac0e2db6 2004-04-21 devnull movl %edx,%ecx
42 ac0e2db6 2004-04-21 devnull loop _subloop2
43 ac0e2db6 2004-04-21 devnull jmp done
44 ac0e2db6 2004-04-21 devnull
45 ac0e2db6 2004-04-21 devnull /* diff[blen:alen-1] = a[blen:alen-1] - 0 */
46 ac0e2db6 2004-04-21 devnull _subloop2:
47 ac0e2db6 2004-04-21 devnull movl (%esi, %ebp, 4), %eax
48 ac0e2db6 2004-04-21 devnull sbbl $0, %eax
49 ac0e2db6 2004-04-21 devnull movl %eax, (%edi, %ebp, 4)
50 39ce0d58 2006-03-22 devnull incl %ebp
51 39ce0d58 2006-03-22 devnull loop _subloop2
52 ac0e2db6 2004-04-21 devnull
53 ac0e2db6 2004-04-21 devnull done:
54 ac0e2db6 2004-04-21 devnull /* Postlude */
55 39ce0d58 2006-03-22 devnull popl %edi
56 39ce0d58 2006-03-22 devnull popl %esi
57 39ce0d58 2006-03-22 devnull popl %ebx
58 39ce0d58 2006-03-22 devnull popl %ebp
59 ac0e2db6 2004-04-21 devnull ret
60 ac0e2db6 2004-04-21 devnull