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 mpvecsub:
11 /* Prelude */
12 pushl %ebp /* save on stack */
13 pushl %ebx
14 pushl %esi
15 pushl %edi
17 leal 20(%esp), %ebp /* %ebp = FP for now */
18 movl 0(%ebp), %esi /* a */
19 movl 8(%ebp), %ebx /* b */
20 movl 4(%ebp), %edx /* alen */
21 movl 12(%ebp), %ecx /* blen */
22 movl 16(%ebp), %edi /* diff */
24 subl %ecx,%edx
25 xorl %ebp,%ebp /* this also sets carry to 0 */
27 /* skip subraction if b is zero */
28 testl %ecx,%ecx
29 jz _sub1
31 /* diff[0:blen-1],borrow = a[0:blen-1] - b[0:blen-1] */
32 _subloop1:
33 movl (%esi, %ebp, 4), %eax
34 sbbl (%ebx, %ebp, 4), %eax
35 movl %eax, (%edi, %ebp, 4)
36 incl %ebp
37 loop _subloop1
39 _sub1:
40 incl %edx
41 movl %edx,%ecx
42 loop _subloop2
43 jmp done
45 /* diff[blen:alen-1] = a[blen:alen-1] - 0 */
46 _subloop2:
47 movl (%esi, %ebp, 4), %eax
48 sbbl $0, %eax
49 movl %eax, (%edi, %ebp, 4)
50 incl %ebp
51 loop _subloop2
53 done:
54 /* Postlude */
55 popl %edi
56 popl %esi
57 popl %ebx
58 popl %ebp
59 ret