Blob


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