| /* i80386 __mpn_mul_1 -- Multiply a limb vector with a limb and store | 
 |    the result in a second limb vector. | 
 |    Copyright (C) 1992,1994,1997,1998,2000,2005 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, write to | 
 |    the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, | 
 |    MA 02111-1307, USA. */ | 
 |  | 
 | #include <sysdep.h> | 
 | #include "asm-syntax.h" | 
 | #include "bp-sym.h" | 
 | #include "bp-asm.h" | 
 |  | 
 | #define PARMS	LINKAGE+16	/* space for 4 saved regs */ | 
 | #define RES	PARMS | 
 | #define S1	RES+PTR_SIZE | 
 | #define SIZE	S1+PTR_SIZE | 
 | #define S2LIMB	SIZE+4 | 
 |  | 
 | #define res_ptr edi | 
 | #define s1_ptr esi | 
 | #define size ecx | 
 | #define s2_limb ebx | 
 |  | 
 | 	.text | 
 | ENTRY (BP_SYM (__mpn_mul_1)) | 
 | 	ENTER | 
 |  | 
 | 	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) | 
 | #if __BOUNDED_POINTERS__ | 
 | 	shll	$2, %size	/* convert limbs to bytes */ | 
 | 	CHECK_BOUNDS_BOTH_WIDE (%res_ptr, RES(%esp), %size) | 
 | 	CHECK_BOUNDS_BOTH_WIDE (%s1_ptr, S1(%esp), %size) | 
 | 	shrl	$2, %size | 
 | #endif | 
 | 	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): | 
 | 	movl	(%s1_ptr,%size,4), %eax | 
 | 	mull	%s2_limb | 
 | 	addl	%ebp, %eax | 
 | 	movl	%eax, (%res_ptr,%size,4) | 
 | 	adcl	$0, %edx | 
 | 	movl	%edx, %ebp | 
 |  | 
 | 	incl	%size | 
 | 	jnz	L(oop) | 
 | 	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) | 
 |  | 
 | 	LEAVE | 
 | 	ret | 
 | #undef size | 
 | END (BP_SYM (__mpn_mul_1)) |