* sysdeps/i386/asm-syntax.h (R, MEM, MEM_DISP, MEM_INDEX,

INSN1, INSN2, TEXT, GLOBL): Remove macros. 
(ALIGN): Cleanup surrounding conditionals.
	* sysdeps/i386/addmul_1.S: Replace asm-syntax macros with gas syntax.
	Call ENTER/LEAVE macros.
	* sysdeps/i386/mul_1.S: Replace asm-syntax macros with gas syntax.
	* sysdeps/i386/submul_1.S: Likewise.

	* sysdeps/i386/i586/addmul_1.S: Replace asm-syntax macros with gas
	syntax.  Define & use symbolic argument stack offsets.  Call
	ENTER/LEAVE macros.
	* sysdeps/i386/i586/mul_1.S: Likewise.
	* sysdeps/i386/i586/submul_1.S: Likewise.
2000-06-26  Greg McGary  <greg@mcgary.org>

	* sysdeps/i386/asm-syntax.h (R, MEM, MEM_DISP, MEM_INDEX,
	INSN1, INSN2, TEXT, GLOBL): Remove macros.
	(ALIGN): Cleanup surrounding conditionals.

	* sysdeps/i386/addmul_1.S: Replace asm-syntax macros with gas syntax.
	Call ENTER/LEAVE macros.
	* sysdeps/i386/mul_1.S: Replace asm-syntax macros with gas syntax.
	* sysdeps/i386/submul_1.S: Likewise.

	* sysdeps/i386/i586/addmul_1.S: Replace asm-syntax macros with gas
	syntax.  Define & use symbolic argument stack offsets.  Call
	ENTER/LEAVE macros.
	* sysdeps/i386/i586/mul_1.S: Likewise.
	* sysdeps/i386/i586/submul_1.S: Likewise.
This commit is contained in:
Greg McGary 2000-06-26 16:48:10 +00:00
parent 1e9bbdd87f
commit 43c81906db
8 changed files with 228 additions and 248 deletions

View File

@ -1,3 +1,20 @@
2000-06-26 Greg McGary <greg@mcgary.org>
* sysdeps/i386/asm-syntax.h (R, MEM, MEM_DISP, MEM_INDEX,
INSN1, INSN2, TEXT, GLOBL): Remove macros.
(ALIGN): Cleanup surrounding conditionals.
* sysdeps/i386/addmul_1.S: Replace asm-syntax macros with gas syntax.
Call ENTER/LEAVE macros.
* sysdeps/i386/mul_1.S: Replace asm-syntax macros with gas syntax.
* sysdeps/i386/submul_1.S: Likewise.
* sysdeps/i386/i586/addmul_1.S: Replace asm-syntax macros with gas
syntax. Define & use symbolic argument stack offsets. Call
ENTER/LEAVE macros.
* sysdeps/i386/i586/mul_1.S: Likewise.
* sysdeps/i386/i586/submul_1.S: Likewise.
2000-06-25 Greg McGary <greg@mcgary.org> 2000-06-25 Greg McGary <greg@mcgary.org>
* sysdeps/i386/i586/memcpy.S: Redefine memcpy as mempcpy, * sysdeps/i386/i586/memcpy.S: Redefine memcpy as mempcpy,

View File

@ -35,38 +35,41 @@
.text .text
ENTRY(__mpn_addmul_1) ENTRY(__mpn_addmul_1)
ENTER
INSN1(push,l ,R(edi)) pushl %edi
INSN1(push,l ,R(esi)) pushl %esi
INSN1(push,l ,R(ebx)) pushl %ebx
INSN1(push,l ,R(ebp)) pushl %ebp
INSN2(mov,l ,R(res_ptr),MEM_DISP(esp,RES)) movl RES(%esp), %res_ptr
INSN2(mov,l ,R(s1_ptr),MEM_DISP(esp,S1)) movl S1(%esp), %s1_ptr
INSN2(mov,l ,R(sizeP),MEM_DISP(esp,SIZE)) movl SIZE(%esp), %sizeP
INSN2(mov,l ,R(s2_limb),MEM_DISP(esp,S2LIMB)) movl S2LIMB(%esp), %s2_limb
INSN2(lea,l ,R(res_ptr),MEM_INDEX(res_ptr,sizeP,4)) leal (%res_ptr,%sizeP,4), %res_ptr
INSN2(lea,l ,R(s1_ptr),MEM_INDEX(s1_ptr,sizeP,4)) leal (%s1_ptr,%sizeP,4), %s1_ptr
INSN1(neg,l ,R(sizeP)) negl %sizeP
INSN2(xor,l ,R(ebx),R(ebx)) xorl %ebx, %ebx
ALIGN (3) ALIGN (3)
L(oop): L(oop):
INSN2(mov,l ,R(eax),MEM_INDEX(s1_ptr,sizeP,4)) movl (%s1_ptr,%sizeP,4), %eax
INSN1(mul,l ,R(s2_limb)) mull %s2_limb
INSN2(add,l ,R(eax),R(ebx)) addl %ebx, %eax
INSN2(adc,l ,R(edx),$0) adcl $0, %edx
INSN2(add,l ,MEM_INDEX(res_ptr,sizeP,4),R(eax)) addl %eax, (%res_ptr,%sizeP,4)
INSN2(adc,l ,R(edx),$0) adcl $0, %edx
INSN2(mov,l ,R(ebx),R(edx)) movl %edx, %ebx
INSN1(inc,l ,R(sizeP)) incl %sizeP
INSN1(jnz, ,L(oop)) jnz L(oop)
INSN2(mov,l ,R(eax),R(ebx)) movl %ebx, %eax
INSN1(pop,l ,R(ebp)) popl %ebp
INSN1(pop,l ,R(ebx)) popl %ebx
INSN1(pop,l ,R(esi)) popl %esi
INSN1(pop,l ,R(edi)) popl %edi
LEAVE
ret ret
END(__mpn_addmul_1) END(__mpn_addmul_1)

View File

@ -1,5 +1,5 @@
/* Definitions for x86 syntax variations. /* Definitions for x86 syntax variations.
Copyright (C) 1992, 1994, 1995, 1997 Free Software Foundation, Inc. Copyright (C) 1992, 1994, 1995, 1997, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library. Its master source is NOT part of This file is part of the GNU C Library. Its master source is NOT part of
the C library, however. The master source lives in the GNU MP Library. the C library, however. The master source lives in the GNU MP Library.
@ -20,61 +20,23 @@
Boston, MA 02111-1307, USA. */ Boston, MA 02111-1307, USA. */
#undef ALIGN #undef ALIGN
#if defined NOLOG_ALIGN || defined HAVE_ELF
#ifdef GAS_SYNTAX # define ALIGN(log) .align 1<<log
#define R(r) %r
#define MEM(base)(base)
#define MEM_DISP(base,displacement)displacement(R(base))
#define MEM_INDEX(base,index,size)(R(base),R(index),size)
#ifdef __STDC__
#define INSN1(mnemonic,size_suffix,dst)mnemonic##size_suffix dst
#define INSN2(mnemonic,size_suffix,dst,src)mnemonic##size_suffix src,dst
#else #else
#define INSN1(mnemonic,size_suffix,dst)mnemonic/**/size_suffix dst # define ALIGN(log) .align log
#define INSN2(mnemonic,size_suffix,dst,src)mnemonic/**/size_suffix src,dst
#endif
#define TEXT .text
#define ALIGN(log) .align log
#define GLOBL .globl
#endif
#ifdef INTEL_SYNTAX
#define R(r) r
#define MEM(base)[base]
#define MEM_DISP(base,displacement)[base+(displacement)]
#define MEM_INDEX(base,index,size)[base+index*size]
#define INSN1(mnemonic,size_suffix,dst)mnemonic dst
#define INSN2(mnemonic,size_suffix,dst,src)mnemonic dst,src
#define TEXT .text
#define ALIGN(log) .align log
#define GLOBL .globl
#endif
#ifdef BROKEN_ALIGN
#undef ALIGN
#define ALIGN(log) .align log,0x90
#endif
#if !defined (NOLOG_ALIGN) && defined (HAVE_ELF)
#define NOLOG_ALIGN
#endif
#ifdef NOLOG_ALIGN
#undef ALIGN
#define ALIGN(log) .align 1<<log
#endif #endif
#undef L #undef L
#ifdef __ELF__ #ifdef __ELF__
#ifdef __STDC__ # ifdef __STDC__
#define L(body) .L##body # define L(body) .L##body
# else
# define L(body) .L/**/body
# endif
#else #else
#define L(body) .L/**/body # ifdef __STDC__
#endif # define L(body) L##body
#else # else
#ifdef __STDC__ # define L(body) L/**/body
#define L(body) L##body # endif
#else
#define L(body) L/**/body
#endif
#endif #endif

View File

@ -1,6 +1,6 @@
/* Pentium __mpn_addmul_1 -- Multiply a limb vector with a limb and add /* Pentium __mpn_addmul_1 -- Multiply a limb vector with a limb and add
the result to a second limb vector. the result to a second limb vector.
Copyright (C) 1992, 94, 96, 97, 98 Free Software Foundation, Inc. Copyright (C) 1992, 94, 96, 97, 98, 00 Free Software Foundation, Inc.
This file is part of the GNU MP Library. This file is part of the GNU MP Library.
The GNU MP Library is free software; you can redistribute it and/or modify The GNU MP Library is free software; you can redistribute it and/or modify
@ -18,16 +18,15 @@
the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA. */ MA 02111-1307, USA. */
/*
INPUT PARAMETERS
res_ptr (sp + 4)
s1_ptr (sp + 8)
size (sp + 12)
s2_limb (sp + 16)
*/
#include "sysdep.h" #include "sysdep.h"
#include "asm-syntax.h" #include "asm-syntax.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 res_ptr edi
#define s1_ptr esi #define s1_ptr esi
@ -36,46 +35,49 @@
.text .text
ENTRY(__mpn_addmul_1) ENTRY(__mpn_addmul_1)
ENTER
INSN1(push,l ,R(edi)) pushl %edi
INSN1(push,l ,R(esi)) pushl %esi
INSN1(push,l ,R(ebx)) pushl %ebx
INSN1(push,l ,R(ebp)) pushl %ebp
INSN2(mov,l ,R(res_ptr),MEM_DISP(esp,20)) movl RES(%esp), %res_ptr
INSN2(mov,l ,R(s1_ptr),MEM_DISP(esp,24)) movl S1(%esp), %s1_ptr
INSN2(mov,l ,R(size),MEM_DISP(esp,28)) movl SIZE(%esp), %size
INSN2(mov,l ,R(s2_limb),MEM_DISP(esp,32)) movl S2LIMB(%esp), %s2_limb
INSN2(lea,l ,R(res_ptr),MEM_INDEX(res_ptr,size,4)) leal (%res_ptr,%size,4), %res_ptr
INSN2(lea,l ,R(s1_ptr),MEM_INDEX(s1_ptr,size,4)) leal (%s1_ptr,%size,4), %s1_ptr
INSN1(neg,l ,R(size)) negl %size
INSN2(xor,l ,R(ebx),R(ebx)) xorl %ebx, %ebx
ALIGN (3) ALIGN (3)
L(oop): INSN2(adc,l ,R(ebx),$0) L(oop): adcl $0, %ebx
INSN2(mov,l ,R(eax),MEM_INDEX(s1_ptr,size,4)) movl (%s1_ptr,%size,4), %eax
INSN1(mul,l ,R(s2_limb)) mull %s2_limb
INSN2(add,l ,R(eax),R(ebx)) addl %ebx, %eax
INSN2(mov,l ,R(ebx),MEM_INDEX(res_ptr,size,4)) movl (%res_ptr,%size,4), %ebx
INSN2(adc,l ,R(edx),$0) adcl $0, %edx
INSN2(add,l ,R(ebx),R(eax)) addl %eax, %ebx
INSN2(mov,l ,MEM_INDEX(res_ptr,size,4),R(ebx)) movl %ebx, (%res_ptr,%size,4)
INSN1(inc,l ,R(size)) incl %size
INSN2(mov,l ,R(ebx),R(edx)) movl %edx, %ebx
INSN1(jnz, ,L(oop)) jnz L(oop)
INSN2(adc,l ,R(ebx),$0) adcl $0, %ebx
INSN2(mov,l ,R(eax),R(ebx)) movl %ebx, %eax
INSN1(pop,l ,R(ebp)) popl %ebp
INSN1(pop,l ,R(ebx)) popl %ebx
INSN1(pop,l ,R(esi)) popl %esi
INSN1(pop,l ,R(edi)) popl %edi
LEAVE
ret ret
#undef size #undef size
END(__mpn_addmul_1) END(__mpn_addmul_1)

View File

@ -1,6 +1,6 @@
/* Pentium __mpn_mul_1 -- Multiply a limb vector with a limb and store /* Pentium __mpn_mul_1 -- Multiply a limb vector with a limb and store
the result in a second limb vector. the result in a second limb vector.
Copyright (C) 1992, 94, 96, 97, 98 Free Software Foundation, Inc. Copyright (C) 1992, 94, 96, 97, 98, 00 Free Software Foundation, Inc.
This file is part of the GNU MP Library. This file is part of the GNU MP Library.
The GNU MP Library is free software; you can redistribute it and/or modify The GNU MP Library is free software; you can redistribute it and/or modify
@ -18,16 +18,15 @@
the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA. */ MA 02111-1307, USA. */
/*
INPUT PARAMETERS
res_ptr (sp + 4)
s1_ptr (sp + 8)
size (sp + 12)
s2_limb (sp + 16)
*/
#include "sysdep.h" #include "sysdep.h"
#include "asm-syntax.h" #include "asm-syntax.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 res_ptr edi
#define s1_ptr esi #define s1_ptr esi
@ -36,42 +35,45 @@
.text .text
ENTRY(__mpn_mul_1) ENTRY(__mpn_mul_1)
ENTER
INSN1(push,l ,R(edi)) pushl %edi
INSN1(push,l ,R(esi)) pushl %esi
INSN1(push,l ,R(ebx)) pushl %ebx
INSN1(push,l ,R(ebp)) pushl %ebp
INSN2(mov,l ,R(res_ptr),MEM_DISP(esp,20)) movl RES(%esp), %res_ptr
INSN2(mov,l ,R(s1_ptr),MEM_DISP(esp,24)) movl S1(%esp), %s1_ptr
INSN2(mov,l ,R(size),MEM_DISP(esp,28)) movl SIZE(%esp), %size
INSN2(mov,l ,R(s2_limb),MEM_DISP(esp,32)) movl S2LIMB(%esp), %s2_limb
INSN2(lea,l ,R(res_ptr),MEM_INDEX(res_ptr,size,4)) leal (%res_ptr,%size,4), %res_ptr
INSN2(lea,l ,R(s1_ptr),MEM_INDEX(s1_ptr,size,4)) leal (%s1_ptr,%size,4), %s1_ptr
INSN1(neg,l ,R(size)) negl %size
INSN2(xor,l ,R(ebx),R(ebx)) xorl %ebx, %ebx
ALIGN (3) ALIGN (3)
L(oop): INSN2(adc,l ,R(ebx),$0) L(oop): adcl $0, %ebx
INSN2(mov,l ,R(eax),MEM_INDEX(s1_ptr,size,4)) movl (%s1_ptr,%size,4), %eax
INSN1(mul,l ,R(s2_limb)) mull %s2_limb
INSN2(add,l ,R(ebx),R(eax)) addl %eax, %ebx
INSN2(mov,l ,MEM_INDEX(res_ptr,size,4),R(ebx)) movl %ebx, (%res_ptr,%size,4)
INSN1(inc,l ,R(size)) incl %size
INSN2(mov,l ,R(ebx),R(edx)) movl %edx, %ebx
INSN1(jnz, ,L(oop)) jnz L(oop)
INSN2(adc,l ,R(ebx),$0) adcl $0, %ebx
INSN2(mov,l ,R(eax),R(ebx)) movl %ebx, %eax
INSN1(pop,l ,R(ebp)) popl %ebp
INSN1(pop,l ,R(ebx)) popl %ebx
INSN1(pop,l ,R(esi)) popl %esi
INSN1(pop,l ,R(edi)) popl %edi
LEAVE
ret ret
#undef size #undef size
END(__mpn_mul_1) END(__mpn_mul_1)

View File

@ -1,6 +1,6 @@
/* Pentium __mpn_submul_1 -- Multiply a limb vector with a limb and subtract /* Pentium __mpn_submul_1 -- Multiply a limb vector with a limb and subtract
the result from a second limb vector. the result from a second limb vector.
Copyright (C) 1992, 94, 96, 97, 98 Free Software Foundation, Inc. Copyright (C) 1992, 94, 96, 97, 98, 00 Free Software Foundation, Inc.
This file is part of the GNU MP Library. This file is part of the GNU MP Library.
The GNU MP Library is free software; you can redistribute it and/or modify The GNU MP Library is free software; you can redistribute it and/or modify
@ -18,16 +18,15 @@
the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA. */ MA 02111-1307, USA. */
/*
INPUT PARAMETERS
res_ptr (sp + 4)
s1_ptr (sp + 8)
size (sp + 12)
s2_limb (sp + 16)
*/
#include "sysdep.h" #include "sysdep.h"
#include "asm-syntax.h" #include "asm-syntax.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 res_ptr edi
#define s1_ptr esi #define s1_ptr esi
@ -36,46 +35,49 @@
.text .text
ENTRY(__mpn_submul_1) ENTRY(__mpn_submul_1)
ENTER
INSN1(push,l ,R(edi)) pushl %edi
INSN1(push,l ,R(esi)) pushl %esi
INSN1(push,l ,R(ebx)) pushl %ebx
INSN1(push,l ,R(ebp)) pushl %ebp
INSN2(mov,l ,R(res_ptr),MEM_DISP(esp,20)) movl RES(%esp), %res_ptr
INSN2(mov,l ,R(s1_ptr),MEM_DISP(esp,24)) movl S1(%esp), %s1_ptr
INSN2(mov,l ,R(size),MEM_DISP(esp,28)) movl SIZE(%esp), %size
INSN2(mov,l ,R(s2_limb),MEM_DISP(esp,32)) movl S2LIMB(%esp), %s2_limb
INSN2(lea,l ,R(res_ptr),MEM_INDEX(res_ptr,size,4)) leal (%res_ptr,%size,4), %res_ptr
INSN2(lea,l ,R(s1_ptr),MEM_INDEX(s1_ptr,size,4)) leal (%s1_ptr,%size,4), %s1_ptr
INSN1(neg,l ,R(size)) negl %size
INSN2(xor,l ,R(ebx),R(ebx)) xorl %ebx, %ebx
ALIGN (3) ALIGN (3)
L(oop): INSN2(adc,l ,R(ebx),$0) L(oop): adcl $0, %ebx
INSN2(mov,l ,R(eax),MEM_INDEX(s1_ptr,size,4)) movl (%s1_ptr,%size,4), %eax
INSN1(mul,l ,R(s2_limb)) mull %s2_limb
INSN2(add,l ,R(eax),R(ebx)) addl %ebx, %eax
INSN2(mov,l ,R(ebx),MEM_INDEX(res_ptr,size,4)) movl (%res_ptr,%size,4), %ebx
INSN2(adc,l ,R(edx),$0) adcl $0, %edx
INSN2(sub,l ,R(ebx),R(eax)) subl %eax, %ebx
INSN2(mov,l ,MEM_INDEX(res_ptr,size,4),R(ebx)) movl %ebx, (%res_ptr,%size,4)
INSN1(inc,l ,R(size)) incl %size
INSN2(mov,l ,R(ebx),R(edx)) movl %edx, %ebx
INSN1(jnz, ,L(oop)) jnz L(oop)
INSN2(adc,l ,R(ebx),$0) adcl $0, %ebx
INSN2(mov,l ,R(eax),R(ebx)) movl %ebx, %eax
INSN1(pop,l ,R(ebp)) popl %ebp
INSN1(pop,l ,R(ebx)) popl %ebx
INSN1(pop,l ,R(esi)) popl %esi
INSN1(pop,l ,R(edi)) popl %edi
LEAVE
ret ret
#undef size #undef size
END(__mpn_submul_1) END(__mpn_submul_1)

View File

@ -18,14 +18,6 @@
the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA. */ MA 02111-1307, USA. */
/*
INPUT PARAMETERS
res_ptr (sp + 4)
s1_ptr (sp + 8)
size (sp + 12)
s2_limb (sp + 16)
*/
#include <sysdep.h> #include <sysdep.h>
#include "asm-syntax.h" #include "asm-syntax.h"
#include "bp-asm.h" #include "bp-asm.h"
@ -45,37 +37,37 @@
ENTRY(__mpn_mul_1) ENTRY(__mpn_mul_1)
ENTER ENTER
INSN1(push,l ,R(edi)) pushl %edi
INSN1(push,l ,R(esi)) pushl %esi
INSN1(push,l ,R(ebx)) pushl %ebx
INSN1(push,l ,R(ebp)) pushl %ebp
INSN2(mov,l ,R(res_ptr),MEM_DISP(esp,RES)) movl RES(%esp), %res_ptr
INSN2(mov,l ,R(s1_ptr),MEM_DISP(esp,S1)) movl S1(%esp), %s1_ptr
INSN2(mov,l ,R(size),MEM_DISP(esp,SIZE)) movl SIZE(%esp), %size
INSN2(mov,l ,R(s2_limb),MEM_DISP(esp,S2LIMB)) movl S2LIMB(%esp), %s2_limb
INSN2(lea,l ,R(res_ptr),MEM_INDEX(res_ptr,size,4)) leal (%res_ptr,%size,4), %res_ptr
INSN2(lea,l ,R(s1_ptr),MEM_INDEX(s1_ptr,size,4)) leal (%s1_ptr,%size,4), %s1_ptr
INSN1(neg,l ,R(size)) negl %size
INSN2(xor,l ,R(ebx),R(ebx)) xorl %ebx, %ebx
ALIGN (3) ALIGN (3)
L(oop): L(oop):
INSN2(mov,l ,R(eax),MEM_INDEX(s1_ptr,size,4)) movl (%s1_ptr,%size,4), %eax
INSN1(mul,l ,R(s2_limb)) mull %s2_limb
INSN2(add,l ,R(eax),R(ebx)) addl %ebx, %eax
INSN2(mov,l ,MEM_INDEX(res_ptr,size,4),R(eax)) movl %eax, (%res_ptr,%size,4)
INSN2(adc,l ,R(edx),$0) adcl $0, %edx
INSN2(mov,l ,R(ebx),R(edx)) movl %edx, %ebx
INSN1(inc,l ,R(size)) incl %size
INSN1(jnz, ,L(oop)) jnz L(oop)
INSN2(mov,l ,R(eax),R(ebx)) movl %ebx, %eax
INSN1(pop,l ,R(ebp)) popl %ebp
INSN1(pop,l ,R(ebx)) popl %ebx
INSN1(pop,l ,R(esi)) popl %esi
INSN1(pop,l ,R(edi)) popl %edi
LEAVE LEAVE
ret ret

View File

@ -37,38 +37,38 @@
ENTRY(__mpn_submul_1) ENTRY(__mpn_submul_1)
ENTER ENTER
INSN1(push,l ,R(edi)) pushl %edi
INSN1(push,l ,R(esi)) pushl %esi
INSN1(push,l ,R(ebx)) pushl %ebx
INSN1(push,l ,R(ebp)) pushl %ebp
INSN2(mov,l ,R(res_ptr),MEM_DISP(esp,RES)) movl RES(%esp), %res_ptr
INSN2(mov,l ,R(s1_ptr),MEM_DISP(esp,S1)) movl S1(%esp), %s1_ptr
INSN2(mov,l ,R(sizeP),MEM_DISP(esp,SIZE)) movl SIZE(%esp), %sizeP
INSN2(mov,l ,R(s2_limb),MEM_DISP(esp,S2LIMB)) movl S2LIMB(%esp), %s2_limb
INSN2(lea,l ,R(res_ptr),MEM_INDEX(res_ptr,sizeP,4)) leal (%res_ptr,%sizeP,4), %res_ptr
INSN2(lea,l ,R(s1_ptr),MEM_INDEX(s1_ptr,sizeP,4)) leal (%s1_ptr,%sizeP,4), %s1_ptr
INSN1(neg,l ,R(sizeP)) negl %sizeP
INSN2(xor,l ,R(ebx),R(ebx)) xorl %ebx, %ebx
ALIGN (3) ALIGN (3)
L(oop): L(oop):
INSN2(mov,l ,R(eax),MEM_INDEX(s1_ptr,sizeP,4)) movl (%s1_ptr,%sizeP,4), %eax
INSN1(mul,l ,R(s2_limb)) mull %s2_limb
INSN2(add,l ,R(eax),R(ebx)) addl %ebx, %eax
INSN2(adc,l ,R(edx),$0) adcl $0, %edx
INSN2(sub,l ,MEM_INDEX(res_ptr,sizeP,4),R(eax)) subl %eax, (%res_ptr,%sizeP,4)
INSN2(adc,l ,R(edx),$0) adcl $0, %edx
INSN2(mov,l ,R(ebx),R(edx)) movl %edx, %ebx
INSN1(inc,l ,R(sizeP)) incl %sizeP
INSN1(jnz, ,L(oop)) jnz L(oop)
INSN2(mov,l ,R(eax),R(ebx)) movl %ebx, %eax
INSN1(pop,l ,R(ebp)) popl %ebp
INSN1(pop,l ,R(ebx)) popl %ebx
INSN1(pop,l ,R(esi)) popl %esi
INSN1(pop,l ,R(edi)) popl %edi
LEAVE LEAVE
ret ret