/* * mpvecsub(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *diff) * * diff[0:alen-1] = a[0:alen-1] - b[0:blen-1] * * prereq: alen >= blen, diff has room for alen digits */ .text .p2align 2,0x90 .globl mpvecsub .type mpvecsub, @function mpvecsub: /* Prelude */ pushl %ebp movl %ebx, -4(%esp) /* save on stack */ movl %esi, -8(%esp) movl %edi, -12(%esp) movl 8(%esp), %esi /* a */ movl 16(%esp), %ebx /* b */ movl 12(%esp), %edx /* alen */ movl 20(%esp), %ecx /* blen */ movl 24(%esp), %edi /* diff */ subl %ecx,%edx xorl %ebp,%ebp /* this also sets carry to 0 */ /* skip subraction if b is zero */ testl %ecx,%ecx jz _sub1 /* diff[0:blen-1],borrow = a[0:blen-1] - b[0:blen-1] */ _subloop1: movl (%esi, %ebp, 4), %eax sbbl (%ebx, %ebp, 4), %eax movl %eax, (%edi, %ebp, 4) incl %ebp loop _subloop1 _sub1: incl %edx movl %edx,%ecx loop _subloop2 jmp done /* diff[blen:alen-1] = a[blen:alen-1] - 0 */ _subloop2: movl (%esi, %ebp, 4), %eax sbbl $0, %eax movl %eax, (%edi, %ebp, 4) INCL %ebp LOOP _subloop2 done: /* Postlude */ movl -4(%esp), %ebx /* restore from stack */ movl -8(%esp), %esi movl -12(%esp), %edi movl %esp, %ebp leave ret