Blob


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