diff options
Diffstat (limited to 'REORG.TODO/sysdeps/i386/i586/mul_1.S')
-rw-r--r-- | REORG.TODO/sysdeps/i386/i586/mul_1.S | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/REORG.TODO/sysdeps/i386/i586/mul_1.S b/REORG.TODO/sysdeps/i386/i586/mul_1.S new file mode 100644 index 0000000000..bd3a07de90 --- /dev/null +++ b/REORG.TODO/sysdeps/i386/i586/mul_1.S @@ -0,0 +1,90 @@ +/* Pentium __mpn_mul_1 -- Multiply a limb vector with a limb and store + the result in a second limb vector. + Copyright (C) 1992-2017 Free Software Foundation, Inc. + This file is part of the GNU MP Library. + + The GNU MP Library is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or (at your + option) any later version. + + The GNU MP Library is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with the GNU MP Library; see the file COPYING.LIB. If not, + see <http://www.gnu.org/licenses/>. */ + +#include "sysdep.h" +#include "asm-syntax.h" + +#define PARMS 4+16 /* space for 4 saved regs */ +#define RES PARMS +#define S1 RES+4 +#define SIZE S1+4 +#define S2LIMB SIZE+4 + +#define res_ptr edi +#define s1_ptr esi +#define size ecx +#define s2_limb ebx + + .text +ENTRY (__mpn_mul_1) + + pushl %res_ptr + cfi_adjust_cfa_offset (4) + pushl %s1_ptr + cfi_adjust_cfa_offset (4) + pushl %ebp + cfi_adjust_cfa_offset (4) + pushl %s2_limb + cfi_adjust_cfa_offset (4) + + movl RES(%esp), %res_ptr + cfi_rel_offset (res_ptr, 12) + movl S1(%esp), %s1_ptr + cfi_rel_offset (s1_ptr, 8) + movl SIZE(%esp), %size + movl S2LIMB(%esp), %s2_limb + cfi_rel_offset (s2_limb, 0) + leal (%res_ptr,%size,4), %res_ptr + leal (%s1_ptr,%size,4), %s1_ptr + negl %size + xorl %ebp, %ebp + cfi_rel_offset (ebp, 4) + ALIGN (3) + +L(oop): adcl $0, %ebp + movl (%s1_ptr,%size,4), %eax + + mull %s2_limb + + addl %eax, %ebp + + movl %ebp, (%res_ptr,%size,4) + incl %size + + movl %edx, %ebp + jnz L(oop) + + adcl $0, %ebp + movl %ebp, %eax + popl %s2_limb + cfi_adjust_cfa_offset (-4) + cfi_restore (s2_limb) + popl %ebp + cfi_adjust_cfa_offset (-4) + cfi_restore (ebp) + popl %s1_ptr + cfi_adjust_cfa_offset (-4) + cfi_restore (s1_ptr) + popl %res_ptr + cfi_adjust_cfa_offset (-4) + cfi_restore (res_ptr) + + ret +#undef size +END (__mpn_mul_1) |