* sysdeps/i386/bp-asm.h: New file.

* sysdeps/i386/__longjmp.S: Define & use symbolic argument stack 
offsets.  Add ENTER/LEAVE macros for optionally maintaining 
frame-pointer chain when debugging. 
* sysdeps/i386/add_n.S: Likewise. 
* sysdeps/i386/addmul_1.S: Likewise. 
* sysdeps/i386/lshift.S: Likewise. 
* sysdeps/i386/memchr.S: Likewise. 
* sysdeps/i386/memcmp.S: Likewise. 
* sysdeps/i386/mul_1.S: Likewise. 
* sysdeps/i386/rawmemchr.S: Likewise. 
* sysdeps/i386/rshift.S: Likewise. 
* sysdeps/i386/stpcpy.S: Likewise. 
* sysdeps/i386/stpncpy.S: Likewise. 
* sysdeps/i386/strchr.S: Likewise. 
* sysdeps/i386/strchrnul.S: Likewise. 
* sysdeps/i386/strcspn.S: Likewise. 
* sysdeps/i386/strpbrk.S: Likewise. 
* sysdeps/i386/strrchr.S: Likewise. 
* sysdeps/i386/strspn.S: Likewise. 
* sysdeps/i386/strtok.S: Likewise. 
* sysdeps/i386/sub_n.S: Likewise. 
* sysdeps/i386/submul_1.S: Likewise. 
* sysdeps/i386/elf/setjmp.S: Likewise. 
* sysdeps/i386/i486/strcat.S: Likewise. 
* sysdeps/i386/i486/strlen.S: Likewise. 
* sysdeps/i386/i586/add_n.S: Likewise. 
* sysdeps/i386/i586/lshift.S: Likewise. 
* sysdeps/i386/i586/memcpy.S: Likewise. 
* sysdeps/i386/i586/memset.S: Likewise. 
* sysdeps/i386/i586/rshift.S: Likewise. 
* sysdeps/i386/i586/strchr.S: Likewise. 
* sysdeps/i386/i586/strcpy.S: Likewise. 
* sysdeps/i386/i586/strlen.S: Likewise. 
* sysdeps/i386/i586/sub_n.S: Likewise. 
* sysdeps/i386/i686/add_n.S: Likewise. 
* sysdeps/i386/i686/memcpy.S: Likewise. 
* sysdeps/i386/i686/mempcpy.S: Likewise. 
* sysdeps/i386/i686/memset.S: Likewise. 
* sysdeps/i386/i686/strcmp.S: Likewise.
2000-06-08  Greg McGary  <greg@mcgary.org>

	* sysdeps/i386/bp-asm.h: New file.
	* sysdeps/i386/__longjmp.S: Define & use symbolic argument stack
	offsets.  Add ENTER/LEAVE macros for optionally maintaining
	frame-pointer chain when debugging.
	* sysdeps/i386/add_n.S: Likewise.
	* sysdeps/i386/addmul_1.S: Likewise.
	* sysdeps/i386/lshift.S: Likewise.
	* sysdeps/i386/memchr.S: Likewise.
	* sysdeps/i386/memcmp.S: Likewise.
	* sysdeps/i386/mul_1.S: Likewise.
	* sysdeps/i386/rawmemchr.S: Likewise.
	* sysdeps/i386/rshift.S: Likewise.
	* sysdeps/i386/stpcpy.S: Likewise.
	* sysdeps/i386/stpncpy.S: Likewise.
	* sysdeps/i386/strchr.S: Likewise.
	* sysdeps/i386/strchrnul.S: Likewise.
	* sysdeps/i386/strcspn.S: Likewise.
	* sysdeps/i386/strpbrk.S: Likewise.
	* sysdeps/i386/strrchr.S: Likewise.
	* sysdeps/i386/strspn.S: Likewise.
	* sysdeps/i386/strtok.S: Likewise.
	* sysdeps/i386/sub_n.S: Likewise.
	* sysdeps/i386/submul_1.S: Likewise.
	* sysdeps/i386/elf/setjmp.S: Likewise.
	* sysdeps/i386/i486/strcat.S: Likewise.
	* sysdeps/i386/i486/strlen.S: Likewise.
	* sysdeps/i386/i586/add_n.S: Likewise.
	* sysdeps/i386/i586/lshift.S: Likewise.
	* sysdeps/i386/i586/memcpy.S: Likewise.
	* sysdeps/i386/i586/memset.S: Likewise.
	* sysdeps/i386/i586/rshift.S: Likewise.
	* sysdeps/i386/i586/strchr.S: Likewise.
	* sysdeps/i386/i586/strcpy.S: Likewise.
	* sysdeps/i386/i586/strlen.S: Likewise.
	* sysdeps/i386/i586/sub_n.S: Likewise.
	* sysdeps/i386/i686/add_n.S: Likewise.
	* sysdeps/i386/i686/memcpy.S: Likewise.
	* sysdeps/i386/i686/mempcpy.S: Likewise.
	* sysdeps/i386/i686/memset.S: Likewise.
	* sysdeps/i386/i686/strcmp.S: Likewise.
This commit is contained in:
Greg McGary 2000-06-09 06:14:39 +00:00
parent a40fb915f8
commit 3f02f778cd
39 changed files with 775 additions and 420 deletions

View File

@ -1,3 +1,46 @@
2000-06-08 Greg McGary <greg@mcgary.org>
* sysdeps/i386/bp-asm.h: New file.
* sysdeps/i386/__longjmp.S: Define & use symbolic argument stack
offsets. Add ENTER/LEAVE macros for optionally maintaining
frame-pointer chain when debugging.
* sysdeps/i386/add_n.S: Likewise.
* sysdeps/i386/addmul_1.S: Likewise.
* sysdeps/i386/lshift.S: Likewise.
* sysdeps/i386/memchr.S: Likewise.
* sysdeps/i386/memcmp.S: Likewise.
* sysdeps/i386/mul_1.S: Likewise.
* sysdeps/i386/rawmemchr.S: Likewise.
* sysdeps/i386/rshift.S: Likewise.
* sysdeps/i386/stpcpy.S: Likewise.
* sysdeps/i386/stpncpy.S: Likewise.
* sysdeps/i386/strchr.S: Likewise.
* sysdeps/i386/strchrnul.S: Likewise.
* sysdeps/i386/strcspn.S: Likewise.
* sysdeps/i386/strpbrk.S: Likewise.
* sysdeps/i386/strrchr.S: Likewise.
* sysdeps/i386/strspn.S: Likewise.
* sysdeps/i386/strtok.S: Likewise.
* sysdeps/i386/sub_n.S: Likewise.
* sysdeps/i386/submul_1.S: Likewise.
* sysdeps/i386/elf/setjmp.S: Likewise.
* sysdeps/i386/i486/strcat.S: Likewise.
* sysdeps/i386/i486/strlen.S: Likewise.
* sysdeps/i386/i586/add_n.S: Likewise.
* sysdeps/i386/i586/lshift.S: Likewise.
* sysdeps/i386/i586/memcpy.S: Likewise.
* sysdeps/i386/i586/memset.S: Likewise.
* sysdeps/i386/i586/rshift.S: Likewise.
* sysdeps/i386/i586/strchr.S: Likewise.
* sysdeps/i386/i586/strcpy.S: Likewise.
* sysdeps/i386/i586/strlen.S: Likewise.
* sysdeps/i386/i586/sub_n.S: Likewise.
* sysdeps/i386/i686/add_n.S: Likewise.
* sysdeps/i386/i686/memcpy.S: Likewise.
* sysdeps/i386/i686/mempcpy.S: Likewise.
* sysdeps/i386/i686/memset.S: Likewise.
* sysdeps/i386/i686/strcmp.S: Likewise.
2000-06-08 Ulrich Drepper <drepper@redhat.com>
* sysdeps/unix/sysv/linux/getdtsz.c: New file.

View File

@ -1,5 +1,5 @@
/* longjmp for i386.
Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
Copyright (C) 1995, 1996, 1997, 1998, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -21,10 +21,19 @@
#define _ASM
#define _SETJMP_H
#include <bits/setjmp.h>
#include <bp-asm.h>
#define PARMS LINKAGE /* no space for saved regs */
#define JBUF PARMS
#define VAL JBUF+PTR_SIZE
ENTRY (__longjmp)
movl 4(%esp), %ecx /* User's jmp_buf in %ecx. */
movl 8(%esp), %eax /* Second argument is return value. */
ENTER
movl JBUF(%esp), %ecx /* User's jmp_buf in %ecx. */
LEAVE
movl VAL(%esp), %eax /* Second argument is return value. */
/* Save the return address now. */
movl (JB_PC*4)(%ecx), %edx
/* Restore registers. */

View File

@ -1,6 +1,6 @@
/* Add two limb vectors of the same length > 0 and store sum in a third
limb vector.
Copyright (C) 1992, 94, 95, 97, 98 Free Software Foundation, Inc.
Copyright (C) 1992, 94, 95, 97, 98, 2000 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
@ -18,26 +18,27 @@
the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA. */
/*
INPUT PARAMETERS
res_ptr (sp + 4)
s1_ptr (sp + 8)
s2_ptr (sp + 12)
size (sp + 16)
*/
#include "sysdep.h"
#include "asm-syntax.h"
#include "bp-asm.h"
#define PARMS LINKAGE+8 /* space for 2 saved regs */
#define RES PARMS
#define S1 RES+PTR_SIZE
#define S2 S1+PTR_SIZE
#define SIZE S2+PTR_SIZE
.text
ENTRY(__mpn_add_n)
ENTER
pushl %edi
pushl %esi
movl 12(%esp),%edi /* res_ptr */
movl 16(%esp),%esi /* s1_ptr */
movl 20(%esp),%edx /* s2_ptr */
movl 24(%esp),%ecx /* size */
movl RES(%esp),%edi
movl S1(%esp),%esi
movl S2(%esp),%edx
movl SIZE(%esp),%ecx
movl %ecx,%eax
shrl $3,%ecx /* compute count for unrolled loop */
@ -99,5 +100,7 @@ L(oop): movl (%esi),%eax
popl %esi
popl %edi
LEAVE
ret
END(__mpn_add_n)

View File

@ -1,6 +1,6 @@
/* i80386 __mpn_addmul_1 -- Multiply a limb vector with a limb and add
the result to a second limb vector.
Copyright (C) 1992, 1994, 1997, 1998 Free Software Foundation, Inc.
Copyright (C) 1992, 1994, 1997, 1998, 2000 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
@ -18,16 +18,15 @@
the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA. */
/*
INPUT PARAMETERS
res_ptr (sp + 4)
s1_ptr (sp + 8)
sizeP (sp + 12)
s2_limb (sp + 16)
*/
#include "sysdep.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 s1_ptr esi
@ -42,10 +41,10 @@ ENTRY(__mpn_addmul_1)
INSN1(push,l ,R(ebx))
INSN1(push,l ,R(ebp))
INSN2(mov,l ,R(res_ptr),MEM_DISP(esp,20))
INSN2(mov,l ,R(s1_ptr),MEM_DISP(esp,24))
INSN2(mov,l ,R(sizeP),MEM_DISP(esp,28))
INSN2(mov,l ,R(s2_limb),MEM_DISP(esp,32))
INSN2(mov,l ,R(res_ptr),MEM_DISP(esp,RES))
INSN2(mov,l ,R(s1_ptr),MEM_DISP(esp,S1))
INSN2(mov,l ,R(sizeP),MEM_DISP(esp,SIZE))
INSN2(mov,l ,R(s2_limb),MEM_DISP(esp,S2LIMB))
INSN2(lea,l ,R(res_ptr),MEM_INDEX(res_ptr,sizeP,4))
INSN2(lea,l ,R(s1_ptr),MEM_INDEX(s1_ptr,sizeP,4))

142
sysdeps/i386/bp-asm.h Normal file
View File

@ -0,0 +1,142 @@
/* Bounded-pointer definitions for x86 assembler.
Copyright (C) 2000 Free Software Foundation, Inc.
Contributed by Greg McGary <greg@mcgary.org>
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 GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C 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. */
#ifndef _bp_asm_h_
# define _bp_asm_h_ 1
# if __ASSEMBLER__
# if __BOUNDED_POINTERS__
/* Bounded pointers occupy three words. */
# define PTR_SIZE 12
/* Bounded pointer return values are passed back through a hidden
argument that points to caller-allocate space. The hidden arg
occupies one word on the stack. */
# define RTN_SIZE 4
/* Although the caller pushes the hidden arg, the callee is
responsible for popping it. */
# define RET_PTR ret $RTN_SIZE
/* Maintain frame pointer chain in leaf assembler functions for the benefit
of debugging stack traces when bounds violations occur. */
# define ENTER pushl %ebp; movl %esp, %ebp
# define LEAVE movl %ebp, %esp; popl %ebp
/* Stack space overhead of procedure-call linkage: return address and
frame pointer. */
# define LINKAGE 8
/* Int 5 is the "bound range" exception also raised by the "bound"
instruction. */
# define BOUNDS_VIOLATED int $5
# define CHECK_BOUNDS_LOW(VAL_REG, BP_MEM) \
cmpl 4+BP_MEM, VAL_REG; \
jae 0f; /* continue if value >= low */ \
BOUNDS_VIOLATED; \
0:
# define CHECK_BOUNDS_HIGH(VAL_REG, BP_MEM, Jcc) \
cmpl 8+BP_MEM, VAL_REG; \
Jcc 0f; /* continue if value < high */ \
BOUNDS_VIOLATED; \
0:
# define CHECK_BOUNDS_BOTH(VAL_REG, BP_MEM) \
cmpl 4+BP_MEM, VAL_REG; \
jb 1f; /* die if value < low */ \
cmpl 8+BP_MEM, VAL_REG; \
jb 0f; /* continue if value < high */ \
1: BOUNDS_VIOLATED; \
0:
# define CHECK_BOUNDS_BOTH_WIDE(VAL_REG, BP_MEM, LENGTH) \
CHECK_BOUNDS_LOW(VAL_REG, BP_MEM); \
addl LENGTH, VAL_REG; \
cmpl 8+BP_MEM, VAL_REG; \
jbe 0f; /* continue if value <= high */ \
BOUNDS_VIOLATED; \
0: subl LENGTH, VAL_REG /* restore value */
/* Take bounds from BP_MEM and affix them to the pointer
value in %eax, stuffing all into memory at RTN(%esp).
Use %ecx as a scratch register. */
# define RETURN_BOUNDED_POINTER(BP_MEM) \
movl RTN(%esp), %ecx; \
movl %eax, 0(%ecx); \
movl 4+BP_MEM, %eax; \
movl %eax, 4(%ecx); \
movl 8+BP_MEM, %eax; \
movl %eax, 8(%ecx)
# define RETURN_NULL_BOUNDED_POINTER \
movl RTN(%esp), %ecx; \
movl %eax, 0(%ecx); \
movl %eax, 4(%ecx); \
movl %eax, 8(%ecx)
/* The caller of __errno_location is responsible for allocating space
for the three-word BP return-value and passing pushing its address
as an implicit first argument. */
# define PUSH_ERRNO_LOCATION_RETURN \
subl $8, %esp; \
subl $4, %esp; \
pushl %esp
/* __errno_location is responsible for popping the implicit first
argument, but we must pop the space for the BP itself. We also
dereference the return value in order to dig out the pointer value. */
# define POP_ERRNO_LOCATION_RETURN \
movl (%esp), %eax; \
addl $4, %esp; \
addl $8, %esp
# else /* !__BOUNDED_POINTERS__ */
/* Unbounded pointers occupy one word. */
# define PTR_SIZE 4
/* Unbounded pointer return values are passed back in the register %eax. */
# define RTN_SIZE 0
/* Use simple return instruction for unbounded pointer values. */
# define RET_PTR ret
/* Don't maintain frame pointer chain for leaf assembler functions. */
# define ENTER
# define LEAVE
/* Stack space overhead of procedure-call linkage: return address only. */
# define LINKAGE 4
# define CHECK_BOUNDS_LOW(VAL_REG, BP_MEM)
# define CHECK_BOUNDS_HIGH(VAL_REG, BP_MEM, Jcc)
# define CHECK_BOUNDS_BOTH(VAL_REG, BP_MEM)
# define CHECK_BOUNDS_BOTH_WIDE(VAL_REG, BP_MEM, LENGTH)
# define RETURN_BOUNDED_POINTER(BP_MEM)
# define RETURN_NULL_BOUNDED_POINTER
# define PUSH_ERRNO_LOCATION_RETURN
# define POP_ERRNO_LOCATION_RETURN
# endif /* !__BOUNDED_POINTERS__ */
# endif /* __ASSEMBLER__ */
#endif /* _bp_asm_h_ */

View File

@ -21,6 +21,11 @@
#define _ASM
#define _SETJMP_H
#include <bits/setjmp.h>
#include "bp-asm.h"
#define PARMS LINKAGE /* no space for saved regs */
#define JBUF PARMS
#define SGMSK JBUF+PRT_SIZE
/* We include the BSD entry points here as well but we make
them weak. */
@ -55,7 +60,7 @@ ENTRY (__sigsetjmp)
movl %esi, (JB_SI*4)(%eax)
movl %edi, (JB_DI*4)(%eax)
movl %ebp, (JB_BP*4)(%eax)
leal 4(%esp), %ecx /* Save SP as it will be after we return. */
leal JBUF(%esp), %ecx /* Save SP as it will be after we return. */
movl %ecx, (JB_SP*4)(%eax)
movl 0(%esp), %ecx /* Save PC we are returning to now. */
movl %ecx, (JB_PC*4)(%eax)

View File

@ -1,6 +1,6 @@
/* strcat(dest, src) -- Append SRC on the end of DEST.
For Intel 80x86, x>=4.
Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
Copyright (C) 1994, 1995, 1996, 1997, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@ipd.info.uni-karlsruhe.de>.
Optimised a little by Alan Modra <Alan@SPRI.Levels.UniSA.Edu.Au>
@ -22,19 +22,21 @@
#include <sysdep.h>
#include "asm-syntax.h"
#include "bp-asm.h"
/*
INPUT PARAMETERS:
dest (sp + 4)
src (sp + 8)
*/
#define PARMS LINKAGE+4 /* space for 1 saved reg */
#define RTN PARMS
#define DEST RTN+RTN_SIZE
#define SRC DEST+PTR_SIZE
.text
ENTRY (strcat)
ENTER
pushl %edi /* Save callee-safe register. */
movl 12(%esp), %ecx /* load source pointer */
movl 8(%esp), %edx /* load destination pointer */
movl DEST(%esp), %edx
movl SRC(%esp), %ecx
testb $0xff, (%ecx) /* Is source string empty? */
jz L(8) /* yes => return */
@ -254,8 +256,9 @@ L(9): movb %al, (%ecx,%edx) /* store first byte of last word */
movb %ah, 3(%ecx,%edx) /* store fourth byte of last word */
L(8): movl 8(%esp), %eax /* start address of destination is result */
L(8): movl DEST(%esp), %eax /* start address of destination is result */
popl %edi /* restore saved register */
ret
LEAVE
RET_PTR
END (strcat)

View File

@ -1,6 +1,6 @@
/* strlen(str) -- determine the length of the string STR.
Optimized for Intel 80x86, x>=4.
Copyright (C) 1991, 92, 93, 94, 95, 96, 97 Free Software Foundation, Inc.
Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 2000 Free Software Foundation, Inc.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>.
This file is part of the GNU C Library.
@ -21,15 +21,16 @@
#include <sysdep.h>
#include "asm-syntax.h"
#include "bp-asm.h"
/*
INPUT PARAMETERS:
str (sp + 4)
*/
#define PARMS LINKAGE /* no space for saved regs */
#define STR PARMS
.text
ENTRY (strlen)
movl 4(%esp), %ecx /* get string pointer */
ENTER
movl STR(%esp), %ecx
movl %ecx, %eax /* duplicate it */
andl $3, %ecx /* mask alignment bits */
@ -127,7 +128,8 @@ L(3): testb %cl, %cl /* is first byte NUL? */
jz L(2) /* yes => return pointer */
incl %eax /* increment pointer */
L(2): subl 4(%esp), %eax /* compute difference to string start */
L(2): subl STR(%esp), %eax /* compute difference to string start */
LEAVE
ret
END (strlen)

View File

@ -1,6 +1,6 @@
/* Pentium __mpn_add_n -- Add two limb vectors of the same length > 0 and store
sum in a third limb vector.
Copyright (C) 1992, 94, 95, 96, 97, 98 Free Software Foundation, Inc.
Copyright (C) 1992, 94, 95, 96, 97, 98, 2000 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
@ -18,28 +18,29 @@
the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA. */
/*
INPUT PARAMETERS
res_ptr (sp + 4)
s1_ptr (sp + 8)
s2_ptr (sp + 12)
size (sp + 16)
*/
#include "sysdep.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 S2 S1+PTR_SIZE
#define SIZE S2+PTR_SIZE
.text
ENTRY(__mpn_add_n)
ENTER
pushl %edi
pushl %esi
pushl %ebx
pushl %ebp
movl 20(%esp),%edi /* res_ptr */
movl 24(%esp),%esi /* s1_ptr */
movl 28(%esp),%ebp /* s2_ptr */
movl 32(%esp),%ecx /* size */
movl RES(%esp),%edi
movl S1(%esp),%esi
movl S2(%esp),%ebp
movl SIZE(%esp),%ecx
movl (%ebp),%ebx
@ -123,5 +124,7 @@ L(end2):
popl %ebx
popl %esi
popl %edi
LEAVE
ret
END(__mpn_add_n)

View File

@ -1,5 +1,5 @@
/* Pentium optimized __mpn_lshift --
Copyright (C) 1992, 94, 95, 96, 97, 98 Free Software Foundation, Inc.
Copyright (C) 1992, 94, 95, 96, 97, 98, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or modify
@ -17,28 +17,29 @@
the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA. */
/*
INPUT PARAMETERS
res_ptr (sp + 4)
s_ptr (sp + 8)
size (sp + 12)
cnt (sp + 16)
*/
#include "sysdep.h"
#include "asm-syntax.h"
#include "bp-asm.h"
.text
#define PARMS LINKAGE+16 /* space for 4 saved regs */
#define RES PARMS
#define S RES+PTR_SIZE
#define SIZE S+PTR_SIZE
#define CNT SIZE+4
.text
ENTRY(__mpn_lshift)
ENTER
pushl %edi
pushl %esi
pushl %ebx
pushl %ebp
movl 20(%esp),%edi /* res_ptr */
movl 24(%esp),%esi /* s_ptr */
movl 28(%esp),%ebp /* size */
movl 32(%esp),%ecx /* cnt */
movl RES(%esp),%edi
movl S(%esp),%esi
movl SIZE(%esp),%ebp
movl CNT(%esp),%ecx
/* We can use faster code for shift-by-1 under certain conditions. */
cmp $1,%ecx
@ -127,6 +128,8 @@ L(end2):
popl %ebx
popl %esi
popl %edi
LEAVE
ret
/* We loop from least significant end of the arrays, which is only
@ -216,5 +219,7 @@ L(L1): movl %edx,(%edi) /* store last limb */
popl %ebx
popl %esi
popl %edi
LEAVE
ret
END(__mpn_lshift)

View File

@ -1,5 +1,5 @@
/* Highly optimized version for i586.
Copyright (C) 1997 Free Software Foundation, Inc.
Copyright (C) 1997, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@ -20,23 +20,31 @@
#include <sysdep.h>
#include "asm-syntax.h"
#include "bp-asm.h"
/*
INPUT PARAMETERS:
dst (sp + 4)
src (sp + 8)
len (sp + 12)
*/
/* BEWARE: `#ifdef memset' means that memset is redefined as `bzero' */
#define BCOPY_P (defined memcpy)
#define PARMS LINKAGE+8 /* space for 2 saved regs */
#if BCOPY_P
# define DEST PARMS
#else
# define RTN PARMS
# define DEST RTN+RTN_SIZE
#endif
#define SRC DEST+PTR_SIZE
#define LEN SRC+PTR_SIZE
.text
ENTRY (memcpy)
ENTER
pushl %edi
pushl %esi
movl 12(%esp), %edi /* dst */
movl 16(%esp), %esi /* src */
movl 20(%esp), %ecx /* len */
movl DEST(%esp), %edi
movl SRC(%esp), %esi
movl LEN(%esp), %ecx
movl %edi, %eax
/* We need this in any case. */
@ -91,18 +99,23 @@ L(3): movl 28(%edi), %edx
/* Correct extra loop counter modification. */
L(2): addl $32, %ecx
#ifndef memcpy
movl 12(%esp), %eax /* dst */
#if !BCOPY_P
movl DEST(%esp), %eax
#endif
L(1): rep; movsb
#ifdef memcpy
#if BCOPY_P
movl %edi, %eax
#endif
popl %esi
popl %edi
LEAVE
#if BCOPY_P
ret
#else
RET_PTR
#endif
END (memcpy)

View File

@ -1,6 +1,6 @@
/* memset/bzero -- set memory area to CH/0
Highly optimized version for ix86, x>=5.
Copyright (C) 1996, 1997 Free Software Foundation, Inc.
Copyright (C) 1996, 1997, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Torbjorn Granlund, <tege@matematik.su.se>
@ -21,27 +21,33 @@
#include <sysdep.h>
#include "asm-syntax.h"
#include "bp-asm.h"
/*
INPUT PARAMETERS:
(memset) (bzero)
dst (sp + 4) dst (sp + 4)
ch (sp + 8) len (sp + 8)
len (sp + 12)
*/
/* BEWARE: `#ifdef memset' means that memset is redefined as `bzero' */
#define BZERO_P (defined memset)
#define PARMS LINKAGE+4 /* space for 1 saved reg */
#define RTN PARMS
#define DEST RTN+RTN_SIZE
#if BZERO_P
# define LEN DEST+PTR_SIZE
#else
# define CHR DEST+PTR_SIZE
# define LEN CHR+4
#endif
.text
ENTRY (memset)
ENTER
pushl %edi
movl 8(%esp), %edi /* destination pointer */
#ifdef memset
movl DEST(%esp), %edi
movl LEN(%esp), %edx
#if BZERO_P
xorl %eax, %eax /* we fill with 0 */
movl 12(%esp), %edx /* size (in 8-bit words) */
#else
movb 12(%esp), %al /* use CH to fill */
movl 16(%esp), %edx /* size (in 8-bit words) */
movb CHR(%esp), %al
movb %al, %ah
movl %eax, %ecx
@ -93,11 +99,16 @@ L(2): shrl $2, %ecx /* convert byte count to longword count */
rep
stosb
#if !BZERO_P
/* Load result (only if used as memset). */
#ifndef memset
movl 8(%esp), %eax
movl DEST(%esp), %eax
#endif
popl %edi
LEAVE
#if BZERO_P
ret
#else
RET_PTR
#endif
END (memset)

View File

@ -1,5 +1,5 @@
/* Pentium optimized __mpn_rshift --
Copyright (C) 1992, 94, 95, 96, 97, 98 Free Software Foundation, Inc.
Copyright (C) 1992, 94, 95, 96, 97, 98, 2000 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
@ -17,28 +17,29 @@
the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA. */
/*
INPUT PARAMETERS
res_ptr (sp + 4)
s_ptr (sp + 8)
size (sp + 12)
cnt (sp + 16)
*/
#include "sysdep.h"
#include "asm-syntax.h"
#include "bp-asm.h"
.text
#define PARMS LINKAGE+16 /* space for 4 saved regs */
#define RES PARMS
#define S RES+PTR_SIZE
#define SIZE S+PTR_SIZE
#define CNT SIZE+4
.text
ENTRY(__mpn_rshift)
ENTER
pushl %edi
pushl %esi
pushl %ebx
pushl %ebp
movl 20(%esp),%edi /* res_ptr */
movl 24(%esp),%esi /* s_ptr */
movl 28(%esp),%ebp /* size */
movl 32(%esp),%ecx /* cnt */
movl RES(%esp),%edi
movl S(%esp),%esi
movl SIZE(%esp),%ebp
movl CNT(%esp),%ecx
/* We can use faster code for shift-by-1 under certain conditions. */
cmp $1,%ecx
@ -124,6 +125,8 @@ L(end2):
popl %ebx
popl %esi
popl %edi
LEAVE
ret
/* We loop from least significant end of the arrays, which is only
@ -216,5 +219,7 @@ L(L1): movl %edx,(%edi) /* store last limb */
popl %ebx
popl %esi
popl %edi
LEAVE
ret
END(__mpn_rshift)

View File

@ -1,6 +1,6 @@
/* Find character CH in a NUL terminated string.
Highly optimized version for ix85, x>=5.
Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
Copyright (C) 1995, 1996, 1997, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>.
@ -21,6 +21,7 @@
#include <sysdep.h>
#include "asm-syntax.h"
#include "bp-asm.h"
/* This version is especially optimized for the i586 (and following?)
processors. This is mainly done by using the two pipelines. The
@ -35,22 +36,23 @@
/* The magic value which is used throughout in the whole code. */
#define magic 0xfefefeff
/*
INPUT PARAMETERS:
str (sp + 4)
ch (sp + 8)
*/
#define PARMS LINKAGE+16 /* space for 4 saved regs */
#define RTN PARMS
#define STR RTN+RTN_SIZE
#define CHR STR+PTR_SIZE
.text
ENTRY (strchr)
ENTER
pushl %edi /* Save callee-safe registers. */
pushl %esi
pushl %ebx
pushl %ebp
movl 20(%esp), %eax /* get string pointer */
movl 24(%esp), %edx /* get character we are looking for */
movl STR(%esp), %eax
movl CHR(%esp), %edx
movl %eax, %edi /* duplicate string pointer for later */
xorl %ecx, %ecx /* clear %ecx */
@ -283,7 +285,8 @@ L(2): popl %ebp /* restore saved registers */
popl %esi
popl %edi
ret
LEAVE
RET_PTR
/* We know there is a NUL byte in the word. But we have to test
whether there is an C byte before it in the word. */
@ -326,7 +329,8 @@ L(3): xorl %eax, %eax /* set return value = NULL */
popl %esi
popl %edi
ret
LEAVE
RET_PTR
END (strchr)
#undef index

View File

@ -1,5 +1,5 @@
/* strcpy/stpcpy implementation for i586.
Copyright (C) 1997 Free Software Foundation, Inc.
Copyright (C) 1997, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@ -20,6 +20,12 @@
#include <sysdep.h>
#include "asm-syntax.h"
#include "bp-asm.h"
#define PARMS LINKAGE+12 /* space for 3 saved regs */
#define RTN PARMS
#define DEST RTN+RTN_SIZE
#define SRC DEST+PTR_SIZE
#ifndef USE_AS_STPCPY
# define STRCPY strcpy
@ -29,12 +35,14 @@
.text
ENTRY(STRCPY)
ENTER
pushl %edi
pushl %esi
pushl %ebx
movl 16(%esp), %edi
movl 20(%esp), %esi
movl DEST(%esp), %edi
movl SRC(%esp), %esi
xorl %eax, %eax
leal -1(%esi), %ecx
@ -136,12 +144,13 @@ L(end): movb %ah, (%edi)
L(end2):
#ifdef USE_AS_STPCPY
movl %edi, %eax
#else
movl DEST(%esp), %eax
#endif
popl %ebx
popl %esi
popl %edi
#ifndef USE_AS_STPCPY
movl 4(%esp), %eax
#endif
ret
LEAVE
RET_PTR
END(STRCPY)

View File

@ -1,6 +1,6 @@
/* strlen -- Compute length og NUL terminated string.
Highly optimized version for ix86, x>=5.
Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
Copyright (C) 1995, 1996, 1997, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>.
@ -21,6 +21,7 @@
#include <sysdep.h>
#include "asm-syntax.h"
#include "bp-asm.h"
/* This version is especially optimized for the i586 (and following?)
processors. This is mainly done by using the two pipelines. The
@ -35,14 +36,14 @@
/* The magic value which is used throughout in the whole code. */
#define magic 0xfefefeff
/*
INPUT PARAMETERS:
str (sp + 4)
*/
#define PARMS LINKAGE /* no space for saved regs */
#define STR PARMS
.text
ENTRY(strlen)
movl 4(%esp), %eax /* get string pointer */
ENTER
movl STR(%esp), %eax
movl $3, %edx /* load mask (= 3) */
andl %eax, %edx /* separate last two bits of address */
@ -176,9 +177,9 @@ L(3): subl $4, %eax /* correct too early pointer increment */
incl %eax /* increment pointer */
L(2): subl 4(%esp), %eax /* now compute the length as difference
L(2): subl STR(%esp), %eax /* now compute the length as difference
between start and terminating NUL
character */
LEAVE
ret
END (strlen)

View File

@ -1,6 +1,6 @@
/* Pentium __mpn_sub_n -- Subtract two limb vectors of the same length > 0
and store difference in a third limb vector.
Copyright (C) 1992, 94, 95, 96, 97, 98 Free Software Foundation, Inc.
Copyright (C) 1992, 94, 95, 96, 97, 98, 2000 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
@ -18,28 +18,29 @@
the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA. */
/*
INPUT PARAMETERS
res_ptr (sp + 4)
s1_ptr (sp + 8)
s2_ptr (sp + 12)
size (sp + 16)
*/
#include "sysdep.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 S2 S1+PTR_SIZE
#define SIZE S2+PTR_SIZE
.text
ENTRY(__mpn_sub_n)
ENTER
pushl %edi
pushl %esi
pushl %ebx
pushl %ebp
movl 20(%esp),%edi /* res_ptr */
movl 24(%esp),%esi /* s1_ptr */
movl 28(%esp),%ebp /* s2_ptr */
movl 32(%esp),%ecx /* size */
movl RES(%esp),%edi
movl S1(%esp),%esi
movl S2(%esp),%ebp
movl SIZE(%esp),%ecx
movl (%ebp),%ebx
@ -123,5 +124,7 @@ L(end2):
popl %ebx
popl %esi
popl %edi
LEAVE
ret
END(__mpn_sub_n)

View File

@ -18,16 +18,15 @@
the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA. */
/*
INPUT PARAMETERS
res_ptr (sp + 4)
s1_ptr (sp + 8)
s2_ptr (sp + 12)
size (sp + 16)
*/
#include "sysdep.h"
#include "asm-syntax.h"
#include "bp-asm.h"
#define PARMS LINKAGE+8 /* space for 2 saved regs */
#define RES PARMS
#define S1 RES+PTR_SIZE
#define S2 S1+PTR_SIZE
#define SIZE S2+PTR_SIZE
.text
#ifdef PIC
@ -35,13 +34,15 @@ L(1): addl (%esp), %eax
ret
#endif
ENTRY(__mpn_add_n)
ENTER
pushl %edi
pushl %esi
movl 12(%esp),%edi /* res_ptr */
movl 16(%esp),%esi /* s1_ptr */
movl 20(%esp),%edx /* s2_ptr */
movl 24(%esp),%ecx /* size */
movl RES(%esp),%edi
movl S1(%esp),%esi
movl S2(%esp),%edx
movl SIZE(%esp),%ecx
movl %ecx,%eax
shrl $3,%ecx /* compute count for unrolled loop */
@ -100,5 +101,7 @@ L(oop): movl (%esi),%eax
popl %esi
popl %edi
LEAVE
ret
END(__mpn_add_n)

View File

@ -1,7 +1,7 @@
/* Copy memory block and return pointer to beginning of destination block
For Intel 80x86, x>=6.
This file is part of the GNU C Library.
Copyright (C) 1999 Free Software Foundation, Inc.
Copyright (C) 1999, 2000 Free Software Foundation, Inc.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
The GNU C Library is free software; you can redistribute it and/or
@ -21,20 +21,23 @@
#include <sysdep.h>
#include "asm-syntax.h"
#include "bp-asm.h"
/* memcpy:
INPUT PARAMETER:
dest (sp + 4)
src (sp + 8)
len (sp + 12)
*/
#define PARMS LINKAGE /* no space for saved regs */
#define RTN PARMS
#define DEST RTN+RTN_SIZE
#define SRC DEST+PTR_SIZE
#define LEN SRC+PTR_SIZE
.text
ENTRY(memcpy)
movl 12(%esp), %ecx
ENTER
movl LEN(%esp), %ecx
movl %edi, %eax
movl 4(%esp), %edi
movl DEST(%esp), %edi
movl %esi, %edx
movl 8(%esp), %esi
movl SRC(%esp), %esi
cld
shrl $1, %ecx
jnc 1f
@ -46,6 +49,8 @@ ENTRY(memcpy)
movsl
movl %eax, %edi
movl %edx, %esi
movl 4(%esp), %eax
ret
movl DEST(%esp), %eax
LEAVE
RET_PTR
END(memcpy)

View File

@ -1,7 +1,7 @@
/* Copy memory block and return pointer to following byte.
For Intel 80x86, x>=6.
This file is part of the GNU C Library.
Copyright (C) 1998, 1999 Free Software Foundation, Inc.
Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
The GNU C Library is free software; you can redistribute it and/or
@ -21,20 +21,23 @@
#include <sysdep.h>
#include "asm-syntax.h"
#include "bp-asm.h"
/* mempcpy:
INPUT PARAMETER:
dest (sp + 4)
src (sp + 8)
len (sp + 12)
*/
#define PARMS LINKAGE /* no space for saved regs */
#define RTN PARMS
#define DEST RTN+RTN_SIZE
#define SRC DEST+PTR_SIZE
#define LEN SRC+PTR_SIZE
.text
ENTRY(__mempcpy)
movl 12(%esp), %ecx
ENTER
movl LEN(%esp), %ecx
movl %edi, %eax
movl 4(%esp), %edi
movl DEST(%esp), %edi
movl %esi, %edx
movl 8(%esp), %esi
movl SRC(%esp), %esi
cld
shrl $1, %ecx
jnc 1f
@ -46,6 +49,8 @@ ENTRY(__mempcpy)
movsl
xchgl %edi, %eax
movl %edx, %esi
ret
LEAVE
RET_PTR
END(__mempcpy)
weak_alias (__mempcpy, mempcpy)

View File

@ -1,6 +1,6 @@
/* memset/bzero -- set memory area to CH/0
Highly optimized version for ix86, x>=6.
Copyright (C) 1999 Free Software Foundation, Inc.
Copyright (C) 1999, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
@ -21,27 +21,34 @@
#include <sysdep.h>
#include "asm-syntax.h"
#include "bp-asm.h"
/*
INPUT PARAMETERS:
(memset) (bzero)
dst (sp + 4) dst (sp + 4)
ch (sp + 8) len (sp + 8)
len (sp + 12)
*/
/* BEWARE: `#ifdef memset' means that memset is redefined as `bzero' */
#define BZERO_P (defined memset)
#define PARMS LINKAGE+4 /* space for 1 saved reg */
#if BZERO_P
# define DEST PARMS
# define LEN DEST+PTR_SIZE
#else
# define RTN PARMS
# define DEST RTN+RTN_SIZE
# define CHR DEST+PTR_SIZE
# define LEN CHR+4
#endif
.text
ENTRY (memset)
ENTER
cld
pushl %edi
movl 8(%esp), %edx
#ifdef memset
movl 12(%esp), %ecx
xorl %eax, %eax
movl DEST(%esp), %edx
movl LEN(%esp), %ecx
#if BZERO_P
xorl %eax, %eax /* fill with 0 */
#else
movzbl 12(%esp), %eax
movl 16(%esp), %ecx
movzbl CHR(%esp), %eax
#endif
jecxz 1f
movl %edx, %edi
@ -61,7 +68,7 @@ ENTRY (memset)
2: movl %ecx, %edx
shrl $2, %ecx
andl $3, %edx
#ifndef memset
#if !BZERO_P
imul $0x01010101, %eax
#endif
rep
@ -71,9 +78,15 @@ ENTRY (memset)
stosb
1:
#ifndef memset
movl 8(%esp), %eax
#if !BZERO_P
movl DEST(%esp), %eax
#endif
popl %edi
LEAVE
#if BZERO_P
ret
#else
RET_PTR
#endif
END (memset)

View File

@ -1,5 +1,5 @@
/* Highly optimized version for ix86, x>=6.
Copyright (C) 1999 Free Software Foundation, Inc.
Copyright (C) 1999, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
@ -20,29 +20,34 @@
#include <sysdep.h>
#include "asm-syntax.h"
#include "bp-asm.h"
/*
INPUT PARAMETERS:
s1 (sp + 4)
s2 (sp + 8)
*/
#define PARMS LINKAGE /* no space for saved regs */
#define STR1 PARMS
#define STR2 STR1+PTR_SIZE
.text
ENTRY (strcmp)
movl 4(%esp), %ecx
movl 8(%esp), %edx
1: movb (%ecx), %al
ENTER
movl STR1(%esp), %ecx
movl STR2(%esp), %edx
L(oop): movb (%ecx), %al
incl %ecx
cmpb (%edx), %al
jne 2f
jne L(neq)
incl %edx
testb %al, %al
jnz 1b
jnz L(oop)
xorl %eax, %eax
jmp 3f
2: movl $1, %eax
ja 3f
jmp L(out)
L(neq): movl $1, %eax
ja L(out)
negl %eax
3: ret
L(out): LEAVE
ret
END (strcmp)

View File

@ -1,5 +1,5 @@
/* i80386 __mpn_lshift --
Copyright (C) 1992, 1994, 1997, 1998, 1999 Free Software Foundation, Inc.
Copyright (C) 1992, 1994, 1997, 1998, 1999, 2000 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
@ -17,27 +17,28 @@
the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA. */
/*
INPUT PARAMETERS
res_ptr (sp + 4)
s_ptr (sp + 8)
size (sp + 12)
cnt (sp + 16)
*/
#include "sysdep.h"
#include "asm-syntax.h"
#include "bp-asm.h"
#define PARMS LINKAGE+12 /* space for 3 saved regs */
#define RES PARMS
#define S RES+PTR_SIZE
#define SIZE S+PTR_SIZE
#define CNT SIZE+4
.text
ENTRY(__mpn_lshift)
ENTER
pushl %edi
pushl %esi
pushl %ebx
movl 16(%esp),%edi /* res_ptr */
movl 20(%esp),%esi /* s_ptr */
movl 24(%esp),%edx /* size */
movl 28(%esp),%ecx /* cnt */
movl RES(%esp),%edi
movl S(%esp),%esi
movl SIZE(%esp),%edx
movl CNT(%esp),%ecx
subl $4,%esi /* adjust s_ptr */
@ -70,6 +71,8 @@ L(1): movl (%esi,%edx,4),%eax
popl %ebx
popl %esi
popl %edi
LEAVE
ret
L(end): shll %cl,%ebx /* compute least significant limb */
@ -78,5 +81,7 @@ L(end): shll %cl,%ebx /* compute least significant limb */
popl %ebx
popl %esi
popl %edi
LEAVE
ret
END(__mpn_lshift)

View File

@ -1,7 +1,7 @@
/* memchr (str, ch, n) -- Return pointer to first occurrence of CH in STR less
than N.
/* memchr (str, chr, len) -- Return pointer to first occurrence of CHR in STR less
than LEN.
For Intel 80x86, x>=3.
Copyright (C) 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
Copyright (C) 1994, 1995, 1996, 1997, 1998, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>
Optimised a little by Alan Modra <Alan@SPRI.Levels.UniSA.Edu.Au>
@ -32,32 +32,34 @@
#include <sysdep.h>
#include "asm-syntax.h"
#include "bp-asm.h"
/*
INPUT PARAMETERS:
str (sp + 4)
c (sp + 8)
len (sp + 12)
*/
#define PARMS LINKAGE+8 /* space for 2 saved regs */
#define RTN PARMS
#define STR RTN+RTN_SIZE
#define CHR STR+PTR_SIZE
#define LEN CHR+4
.text
ENTRY (memchr)
ENTER
/* Save callee-safe registers used in this function. */
pushl %esi
pushl %edi
/* Load parameters into registers. */
movl 12(%esp), %eax /* str: pointer to memory block. */
movl 16(%esp), %edx /* c: byte we are looking for. */
movl 20(%esp), %esi /* len: length of memory block. */
movl STR(%esp), %eax /* str: pointer to memory block. */
movl CHR(%esp), %edx /* c: byte we are looking for. */
movl LEN(%esp), %esi /* len: length of memory block. */
/* If my must not test more than three characters test
them one by one. This is especially true for 0. */
cmpl $4, %esi
jb L(3)
/* At the moment %edx contains C. What we need for the
algorithm is C in all bytes of the dword. Avoid
/* At the moment %edx contains CHR. What we need for the
algorithm is CHR in all bytes of the dword. Avoid
operations on 16 bit words because these require an
prefix byte (and one more cycle). */
movb %dl, %dh /* Now it is 0|0|c|c */
@ -117,9 +119,9 @@ ENTRY (memchr)
into bit 32 (=carry flag), so all of the hole bits will
be changed.
3) But wait! Aren't we looking for C, not zero?
3) But wait! Aren't we looking for CHR, not zero?
Good point. So what we do is XOR LONGWORD with a longword,
each of whose bytes is C. This turns each byte that is C
each of whose bytes is CHR. This turns each byte that is CHR
into a zero. */
@ -152,7 +154,7 @@ L(1): movl (%eax), %ecx /* get word (= 4 bytes) in question */
incl %edi /* add 1: if one carry bit was *not* set
the addition will not result in 0. */
/* If at least one byte of the word is C we don't get 0 in %edi. */
/* If at least one byte of the word is CHR we don't get 0 in %edi. */
jnz L(8) /* found it => return pointer */
/* This process is unfolded four times for better performance.
@ -169,7 +171,7 @@ L(1): movl (%eax), %ecx /* get word (= 4 bytes) in question */
addl %ecx, %edi /* add the magic value to the word. We get
carry bits reported for each byte which
is *not* 0 */
jnc L(7) /* highest byte is C => return pointer */
jnc L(7) /* highest byte is CHR => return pointer */
xorl %ecx, %edi /* ((word^charmask)+magic)^(word^charmask) */
orl $0xfefefeff, %edi /* set all non-carry bits */
incl %edi /* add 1: if one carry bit was *not* set
@ -183,7 +185,7 @@ L(1): movl (%eax), %ecx /* get word (= 4 bytes) in question */
addl %ecx, %edi /* add the magic value to the word. We get
carry bits reported for each byte which
is *not* 0 */
jnc L(6) /* highest byte is C => return pointer */
jnc L(6) /* highest byte is CHR => return pointer */
xorl %ecx, %edi /* ((word^charmask)+magic)^(word^charmask) */
orl $0xfefefeff, %edi /* set all non-carry bits */
incl %edi /* add 1: if one carry bit was *not* set
@ -197,7 +199,7 @@ L(1): movl (%eax), %ecx /* get word (= 4 bytes) in question */
addl %ecx, %edi /* add the magic value to the word. We get
carry bits reported for each byte which
is *not* 0 */
jnc L(5) /* highest byte is C => return pointer */
jnc L(5) /* highest byte is CHR => return pointer */
xorl %ecx, %edi /* ((word^charmask)+magic)^(word^charmask) */
orl $0xfefefeff, %edi /* set all non-carry bits */
incl %edi /* add 1: if one carry bit was *not* set
@ -220,7 +222,7 @@ L(2): subl $16, %esi
addl %ecx, %edi /* add the magic value to the word. We get
carry bits reported for each byte which
is *not* 0 */
jnc L(8) /* highest byte is C => return pointer */
jnc L(8) /* highest byte is CHR => return pointer */
xorl %ecx, %edi /* ((word^charmask)+magic)^(word^charmask) */
orl $0xfefefeff, %edi /* set all non-carry bits */
incl %edi /* add 1: if one carry bit was *not* set
@ -238,7 +240,7 @@ L(2): subl $16, %esi
addl %ecx, %edi /* add the magic value to the word. We get
carry bits reported for each byte which
is *not* 0 */
jnc L(8) /* highest byte is C => return pointer */
jnc L(8) /* highest byte is CHR => return pointer */
xorl %ecx, %edi /* ((word^charmask)+magic)^(word^charmask) */
orl $0xfefefeff, %edi /* set all non-carry bits */
incl %edi /* add 1: if one carry bit was *not* set
@ -256,7 +258,7 @@ L(2): subl $16, %esi
addl %ecx, %edi /* add the magic value to the word. We get
carry bits reported for each byte which
is *not* 0 */
jnc L(8) /* highest byte is C => return pointer */
jnc L(8) /* highest byte is CHR => return pointer */
xorl %ecx, %edi /* ((word^charmask)+magic)^(word^charmask) */
orl $0xfefefeff, %edi /* set all non-carry bits */
incl %edi /* add 1: if one carry bit was *not* set
@ -268,19 +270,19 @@ L(2): subl $16, %esi
L(3): andl $3, %esi /* mask out uninteresting bytes */
jz L(4) /* no remaining bytes => return NULL */
cmpb %dl, (%eax) /* compare byte with C */
cmpb %dl, (%eax) /* compare byte with CHR */
je L(9) /* equal, than return pointer */
incl %eax /* increment source pointer */
decl %esi /* decrement length */
jz L(4) /* no remaining bytes => return NULL */
cmpb %dl, (%eax) /* compare byte with C */
cmpb %dl, (%eax) /* compare byte with CHR */
je L(9) /* equal, than return pointer */
incl %eax /* increment source pointer */
decl %esi /* decrement length */
jz L(4) /* no remaining bytes => return NULL */
cmpb %dl, (%eax) /* compare byte with C */
cmpb %dl, (%eax) /* compare byte with CHR */
je L(9) /* equal, than return pointer */
L(4): /* no byte found => return NULL */
@ -312,5 +314,6 @@ L(8): testb %cl, %cl /* test first byte in dword */
L(9): popl %edi /* pop saved registers */
popl %esi
ret
LEAVE
RET_PTR
END (memchr)

View File

@ -1,5 +1,5 @@
/* Compare two memory blocks for differences in the first COUNT bytes.
Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
Copyright (C) 1995, 1996, 1997, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -19,23 +19,24 @@
#include <sysdep.h>
#include "asm-syntax.h"
#include "bp-asm.h"
/*
INPUT PARAMETERS:
block1 (sp + 4)
block2 (sp + 8)
len (sp + 12)
*/
#define PARMS LINKAGE+4 /* space for 1 saved reg */
#define BLK1 PARMS
#define BLK2 BLK1+PTR_SIZE
#define LEN BLK2+PTR_SIZE
.text
ENTRY (memcmp)
ENTER
pushl %esi /* Save callee-safe registers. */
movl %edi, %edx /* Note that %edx is not used and can
so be used to save %edi. It's faster. */
movl 8(%esp), %esi /* Load address of block #1. */
movl 12(%esp), %edi /* Load address of block #2. */
movl 16(%esp), %ecx /* Load maximal length of compare area. */
movl BLK1(%esp), %esi
movl BLK2(%esp), %edi
movl LEN(%esp), %ecx
cld /* Set direction of comparison. */
@ -61,6 +62,7 @@ ENTRY (memcmp)
L(1): popl %esi /* Restore registers. */
movl %edx, %edi
LEAVE
ret
END (memcmp)

View File

@ -1,6 +1,6 @@
/* 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 Free Software Foundation, Inc.
Copyright (C) 1992, 1994, 1997, 1998, 2000 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
@ -28,6 +28,13 @@
#include <sysdep.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 s1_ptr esi
@ -36,16 +43,17 @@
.text
ENTRY(__mpn_mul_1)
ENTER
INSN1(push,l ,R(edi))
INSN1(push,l ,R(esi))
INSN1(push,l ,R(ebx))
INSN1(push,l ,R(ebp))
INSN2(mov,l ,R(res_ptr),MEM_DISP(esp,20))
INSN2(mov,l ,R(s1_ptr),MEM_DISP(esp,24))
INSN2(mov,l ,R(size),MEM_DISP(esp,28))
INSN2(mov,l ,R(s2_limb),MEM_DISP(esp,32))
INSN2(mov,l ,R(res_ptr),MEM_DISP(esp,RES))
INSN2(mov,l ,R(s1_ptr),MEM_DISP(esp,S1))
INSN2(mov,l ,R(size),MEM_DISP(esp,SIZE))
INSN2(mov,l ,R(s2_limb),MEM_DISP(esp,S2LIMB))
INSN2(lea,l ,R(res_ptr),MEM_INDEX(res_ptr,size,4))
INSN2(lea,l ,R(s1_ptr),MEM_INDEX(s1_ptr,size,4))
@ -68,6 +76,8 @@ L(oop):
INSN1(pop,l ,R(ebx))
INSN1(pop,l ,R(esi))
INSN1(pop,l ,R(edi))
LEAVE
ret
#undef size
END(__mpn_mul_1)

View File

@ -1,6 +1,6 @@
/* rawmemchr (str, ch) -- Return pointer to first occurrence of CH in STR.
For Intel 80x86, x>=3.
Copyright (C) 1994, 95, 96, 97, 98, 99 Free Software Foundation, Inc.
Copyright (C) 1994, 95, 96, 97, 98, 99, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>
Optimised a little by Alan Modra <Alan@SPRI.Levels.UniSA.Edu.Au>
@ -31,21 +31,23 @@
#include <sysdep.h>
#include "asm-syntax.h"
#include "bp-asm.h"
/*
INPUT PARAMETERS:
str (sp + 4)
c (sp + 8)
*/
#define PARMS LINKAGE+4 /* space for 1 saved reg */
#define RTN PARMS
#define STR RTN+RTN_SIZE
#define CHR STR+PTR_SIZE
.text
ENTRY (__rawmemchr)
ENTER
/* Save callee-safe register used in this function. */
pushl %edi
/* Load parameters into registers. */
movl 8(%esp), %eax /* str: pointer to memory block. */
movl 12(%esp), %edx /* c: byte we are looking for. */
movl STR(%esp), %eax
movl CHR(%esp), %edx
/* At the moment %edx contains C. What we need for the
algorithm is C in all bytes of the dword. Avoid
@ -213,6 +215,7 @@ L(8): testb %cl, %cl /* test first byte in dword */
L(9): popl %edi /* pop saved register */
LEAVE
ret
END (__rawmemchr)
weak_alias (__rawmemchr, rawmemchr)

View File

@ -1,5 +1,5 @@
/* i80386 __mpn_rshift --
Copyright (C) 1992, 1994, 1997, 1998, 1999 Free Software Foundation, Inc.
Copyright (C) 1992, 1994, 1997, 1998, 1999, 2000 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
@ -17,27 +17,28 @@
the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA. */
/*
INPUT PARAMETERS
res_ptr (sp + 4)
s_ptr (sp + 8)
size (sp + 12)
cnt (sp + 16)
*/
#include "sysdep.h"
#include "asm-syntax.h"
#include "bp-asm.h"
#define PARMS LINKAGE+12 /* space for 3 saved regs */
#define RES PARMS
#define S RES+PTR_SIZE
#define SIZE S+PTR_SIZE
#define CNT SIZE+4
.text
ENTRY(__mpn_rshift)
ENTER
pushl %edi
pushl %esi
pushl %ebx
movl 16(%esp),%edi /* res_ptr */
movl 20(%esp),%esi /* s_ptr */
movl 24(%esp),%edx /* size */
movl 28(%esp),%ecx /* cnt */
movl RES(%esp),%edi
movl S(%esp),%esi
movl SIZE(%esp),%edx
movl CNT(%esp),%ecx
leal -4(%edi,%edx,4),%edi
leal (%esi,%edx,4),%esi
@ -72,6 +73,8 @@ L(1): movl (%esi,%edx,4),%eax
popl %ebx
popl %esi
popl %edi
LEAVE
ret
L(end): shrl %cl,%ebx /* compute most significant limb */
@ -80,5 +83,7 @@ L(end): shrl %cl,%ebx /* compute most significant limb */
popl %ebx
popl %esi
popl %edi
LEAVE
ret
END(__mpn_rshift)

View File

@ -1,6 +1,6 @@
/* Copy SRC to DEST returning the address of the terminating '\0' in DEST.
For Intel 80x86, x>=3.
Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
Copyright (C) 1994, 1995, 1996, 1997, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper (drepper@gnu.ai.mit.edu).
@ -24,18 +24,19 @@
#include <sysdep.h>
#include "asm-syntax.h"
#include "bp-asm.h"
/*
INPUT PARAMETERS:
dest (sp + 4)
src (sp + 8)
*/
#define PARMS LINKAGE /* no space for saved regs */
#define RTN PARMS
#define DEST RTN+RTN_SIZE
#define SRC DEST+PTR_SIZE
.text
ENTRY (__stpcpy)
movl 4(%esp), %eax /* load destination pointer */
movl 8(%esp), %ecx /* load source pointer */
ENTER
movl DEST(%esp), %eax
movl SRC(%esp), %ecx
subl %eax, %ecx /* magic: reduce number of loop variants
to one using addressing mode */
@ -81,7 +82,9 @@ L(1): addl $4, %eax /* increment loop counter */
L(4): incl %eax
L(3): incl %eax
L(2):
ret
LEAVE
RET_PTR
END (__stpcpy)
weak_alias (__stpcpy, stpcpy)

View File

@ -1,7 +1,7 @@
/* copy no more then N bytes from SRC to DEST, returning the address of
the terminating '\0' in DEST.
For Intel 80x86, x>=3.
Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
Copyright (C) 1994, 1995, 1996, 1997, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>
Some bug fixes by Alan Modra <Alan@SPRI.Levels.UniSA.Edu.Au>
@ -26,22 +26,23 @@
#include <sysdep.h>
#include "asm-syntax.h"
#include "bp-asm.h"
/*
INPUT PARAMETERS:
dest (sp + 4)
src (sp + 8)
maxlen (sp + 12)
*/
#define PARMS LINKAGE+4 /* space for 1 saved reg */
#define RTN PARMS
#define DEST RTN+RTN_SIZE
#define SRC DEST+PTR_SIZE
#define LEN SRC+PTR_SIZE
.text
ENTRY (__stpncpy)
ENTER
pushl %esi
movl 8(%esp), %eax /* load destination pointer */
movl 12(%esp), %esi /* load source pointer */
movl 16(%esp), %ecx /* load maximal length */
movl DEST(%esp), %eax
movl SRC(%esp), %esi
movl LEN(%esp), %ecx
subl %eax, %esi /* magic: reduce number of loop variants
to one using addressing mode */
@ -138,7 +139,8 @@ L(3): decl %ecx /* all bytes written? */
L(9): popl %esi /* restore saved register content */
ret
LEAVE
RET_PTR
END (__stpncpy)
weak_alias (__stpncpy, stpncpy)

View File

@ -1,6 +1,6 @@
/* strchr (str, ch) -- Return pointer to first occurrence of CH in STR.
For Intel 80x86, x>=3.
Copyright (C) 1994, 1995, 1996, 1997, 1999 Free Software Foundation, Inc.
Copyright (C) 1994, 1995, 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>
Some optimisations by Alan Modra <Alan@SPRI.Levels.UniSA.Edu.Au>
@ -22,19 +22,20 @@
#include <sysdep.h>
#include "asm-syntax.h"
#include "bp-asm.h"
/*
INPUT PARAMETERS:
str (sp + 4)
ch (sp + 8)
*/
#define PARMS LINKAGE+4 /* space for 1 saved reg */
#define RTN PARMS
#define STR RTN+RTN_SIZE
#define CHR STR+PTR_SIZE
.text
ENTRY (strchr)
pushl %edi /* Save callee-safe registers used here. */
ENTER
movl 8(%esp), %eax /* get string pointer */
movl 12(%esp), %edx /* get character we are looking for */
pushl %edi /* Save callee-safe registers used here. */
movl STR(%esp), %eax
movl CHR(%esp), %edx
/* At the moment %edx contains C. What we need for the
algorithm is C in all bytes of the dword. Avoid
@ -240,7 +241,9 @@ L(11): movl (%eax), %ecx /* get word (= 4 bytes) in question */
L(2): /* Return NULL. */
xorl %eax, %eax /* load NULL in return value register */
popl %edi /* restore saved register content */
ret
LEAVE
RET_PTR
L(73): addl $4, %eax /* adjust pointer */
L(72): addl $4, %eax
@ -273,7 +276,8 @@ L(7): testb %cl, %cl /* is first byte C? */
L(6): popl %edi /* restore saved register content */
ret
LEAVE
RET_PTR
END (strchr)
weak_alias (strchr, index)

View File

@ -1,7 +1,7 @@
/* strchrnul (str, ch) -- Return pointer to first occurrence of CH in STR
/* strchrnul (str, chr) -- Return pointer to first occurrence of CHR in STR
or the final NUL byte.
For Intel 80x86, x>=3.
Copyright (C) 1994, 1995, 1996, 1997, 1999 Free Software Foundation, Inc.
Copyright (C) 1994, 1995, 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.org>
Some optimisations by Alan Modra <Alan@SPRI.Levels.UniSA.Edu.Au>
@ -23,22 +23,24 @@
#include <sysdep.h>
#include "asm-syntax.h"
#include "bp-asm.h"
/*
INPUT PARAMETERS:
str (sp + 4)
ch (sp + 8)
*/
#define PARMS LINKAGE+4 /* space for 1 saved reg */
#define RTN PARMS
#define STR RTN+RTN_SIZE
#define CHR STR+PTR_SIZE
.text
ENTRY (__strchrnul)
ENTER
pushl %edi /* Save callee-safe registers used here. */
movl 8(%esp), %eax /* get string pointer */
movl 12(%esp), %edx /* get character we are looking for */
movl STR(%esp), %eax
movl CHR(%esp), %edx
/* At the moment %edx contains C. What we need for the
algorithm is C in all bytes of the dword. Avoid
/* At the moment %edx contains CHR. What we need for the
algorithm is CHR in all bytes of the dword. Avoid
operations on 16 bit words because these require an
prefix byte (and one more cycle). */
movb %dl, %dh /* now it is 0|0|c|c */
@ -108,9 +110,9 @@ ENTRY (__strchrnul)
into bit 32 (=carry flag), so all of the hole bits will
be changed.
3) But wait! Aren't we looking for C, not zero?
3) But wait! Aren't we looking for CHR, not zero?
Good point. So what we do is XOR LONGWORD with a longword,
each of whose bytes is C. This turns each byte that is C
each of whose bytes is CHR. This turns each byte that is CHR
into a zero. */
/* Each round the main loop processes 16 bytes. */
@ -125,7 +127,7 @@ L(11): movl (%eax), %ecx /* get word (= 4 bytes) in question */
movl $0xfefefeff, %edi /* magic value */
addl %ecx, %edi /* add the magic value to the word. We get
carry bits reported for each byte which
is *not* C */
is *not* CHR */
/* According to the algorithm we had to reverse the effect of the
XOR first and then test the overflow bits. But because the
@ -144,7 +146,7 @@ L(11): movl (%eax), %ecx /* get word (= 4 bytes) in question */
incl %edi /* add 1: if one carry bit was *not* set
the addition will not result in 0. */
/* If at least one byte of the word is C we don't get 0 in %edi. */
/* If at least one byte of the word is CHR we don't get 0 in %edi. */
jnz L(7) /* found it => return pointer */
/* Now we made sure the dword does not contain the character we are
@ -169,8 +171,8 @@ L(11): movl (%eax), %ecx /* get word (= 4 bytes) in question */
movl $0xfefefeff, %edi /* magic value */
addl %ecx, %edi /* add the magic value to the word. We get
carry bits reported for each byte which
is *not* C */
jnc L(71) /* highest byte is C => return pointer */
is *not* CHR */
jnc L(71) /* highest byte is CHR => return pointer */
xorl %ecx, %edi /* ((word^charmask)+magic)^(word^charmask) */
orl $0xfefefeff, %edi /* set all non-carry bits */
incl %edi /* add 1: if one carry bit was *not* set
@ -194,8 +196,8 @@ L(11): movl (%eax), %ecx /* get word (= 4 bytes) in question */
movl $0xfefefeff, %edi /* magic value */
addl %ecx, %edi /* add the magic value to the word. We get
carry bits reported for each byte which
is *not* C */
jnc L(72) /* highest byte is C => return pointer */
is *not* CHR */
jnc L(72) /* highest byte is CHR => return pointer */
xorl %ecx, %edi /* ((word^charmask)+magic)^(word^charmask) */
orl $0xfefefeff, %edi /* set all non-carry bits */
incl %edi /* add 1: if one carry bit was *not* set
@ -219,8 +221,8 @@ L(11): movl (%eax), %ecx /* get word (= 4 bytes) in question */
movl $0xfefefeff, %edi /* magic value */
addl %ecx, %edi /* add the magic value to the word. We get
carry bits reported for each byte which
is *not* C */
jnc L(73) /* highest byte is C => return pointer */
is *not* CHR */
jnc L(73) /* highest byte is CHR => return pointer */
xorl %ecx, %edi /* ((word^charmask)+magic)^(word^charmask) */
orl $0xfefefeff, %edi /* set all non-carry bits */
incl %edi /* add 1: if one carry bit was *not* set
@ -246,20 +248,20 @@ L(71): addl $4, %eax
But we have to take care of the case that a NUL char is
found before this in the dword. */
L(7): testb %cl, %cl /* is first byte C? */
L(7): testb %cl, %cl /* is first byte CHR? */
jz L(6) /* yes => return pointer */
cmpb %dl, %cl /* is first byte NUL? */
je L(6) /* yes => return NULL */
incl %eax /* it's not in the first byte */
testb %ch, %ch /* is second byte C? */
testb %ch, %ch /* is second byte CHR? */
jz L(6) /* yes => return pointer */
cmpb %dl, %ch /* is second byte NUL? */
je L(6) /* yes => return NULL? */
incl %eax /* it's not in the second byte */
shrl $16, %ecx /* make upper byte accessible */
testb %cl, %cl /* is third byte C? */
testb %cl, %cl /* is third byte CHR? */
jz L(6) /* yes => return pointer */
cmpb %dl, %cl /* is third byte NUL? */
je L(6) /* yes => return NULL */
@ -269,7 +271,8 @@ L(7): testb %cl, %cl /* is first byte C? */
L(6): popl %edi /* restore saved register content */
ret
LEAVE
RET_PTR
END (__strchrnul)
weak_alias (__strchrnul, strchrnul)

View File

@ -1,7 +1,7 @@
/* strcspn (str, ss) -- Return the length of the initial segment of STR
which contains no characters from SS.
For Intel 80x86, x>=3.
Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
Copyright (C) 1994, 1995, 1996, 1997, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>
Bug fixes by Alan Modra <Alan@SPRI.Levels.UniSA.Edu.Au>
@ -23,17 +23,18 @@
#include <sysdep.h>
#include "asm-syntax.h"
#include "bp-asm.h"
/*
INPUT PARAMETERS:
str (sp + 4)
stopset (sp + 8)
*/
#define PARMS LINKAGE /* no space for saved regs */
#define STR PARMS
#define STOP STR+PTR_SIZE
.text
ENTRY (strcspn)
movl 4(%esp), %edx /* get string pointer */
movl 8(%esp), %eax /* get stopset pointer */
ENTER
movl STR(%esp), %edx
movl STOP(%esp), %eax
/* First we create a table with flags for all possible characters.
For the ASCII (7bit/8bit) or ISO-8859-X character sets which are
@ -173,5 +174,6 @@ L(4): subl %edx, %eax /* we have to return the number of valid
non-valid character */
addl $256, %esp /* remove stopset */
LEAVE
ret
END (strcspn)

View File

@ -1,7 +1,7 @@
/* strcspn (str, ss) -- Return the length of the initial segement of STR
which contains no characters from SS.
For Intel 80x86, x>=3.
Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
Copyright (C) 1994, 1995, 1996, 1997, 2000 Free Software Foundation, Inc.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>
Bug fixes by Alan Modra <Alan@SPRI.Levels.UniSA.Edu.Au>
This file is part of the GNU C Library.
@ -23,17 +23,19 @@
#include <sysdep.h>
#include "asm-syntax.h"
#include "bp-asm.h"
/*
INPUT PARAMETERS:
str (sp + 4)
stopset (sp + 8)
*/
#define PARMS LINKAGE /* no space for saved regs */
#define RTN PARMS
#define STR RTN+RTN_SIZE
#define STOP STR+PTR_SIZE
.text
ENTRY (strpbrk)
movl 4(%esp), %edx /* get string pointer */
movl 8(%esp), %eax /* get stopset pointer */
ENTER
movl STR(%esp), %edx
movl STOP(%esp), %eax
/* First we create a table with flags for all possible characters.
For the ASCII (7bit/8bit) or ISO-8859-X character sets which are
@ -174,5 +176,6 @@ L(4): addl $256, %esp /* remove stopset */
jnz L(7) /* no => return pointer */
xorl %eax, %eax /* return NULL */
L(7): ret
L(7): LEAVE
RET_PTR
END (strpbrk)

View File

@ -1,6 +1,6 @@
/* strrchr (str, ch) -- Return pointer to last occurrence of CH in STR.
For Intel 80x86, x>=3.
Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
Copyright (C) 1994, 1995, 1996, 1997, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>
Some optimisations by Alan Modra <Alan@SPRI.Levels.UniSA.Edu.Au>
@ -22,21 +22,23 @@
#include <sysdep.h>
#include "asm-syntax.h"
#include "bp-asm.h"
/*
INPUT PARAMETERS:
str (sp + 4)
ch (sp + 8)
*/
#define PARMS LINKAGE+8 /* space for 2 saved regs */
#define RTN PARMS
#define STR RTN+RTN_SIZE
#define CHR STR+PTR_SIZE
.text
ENTRY (strrchr)
ENTER
pushl %edi /* Save callee-safe registers used here. */
pushl %esi
xorl %eax, %eax
movl 12(%esp), %esi /* get string pointer */
movl 16(%esp), %ecx /* get character we are looking for */
movl STR(%esp), %esi
movl CHR(%esp), %ecx
/* At the moment %ecx contains C. What we need for the
algorithm is C in all bytes of the dword. Avoid
@ -320,7 +322,8 @@ L(26): testb %dl, %dl /* is third byte == NUL */
L(2): popl %esi /* restore saved register content */
popl %edi
ret
LEAVE
RET_PTR
END (strrchr)
weak_alias (strrchr, rindex)

View File

@ -1,7 +1,7 @@
/* strcspn (str, ss) -- Return the length of the initial segment of STR
which contains only characters from SS.
For Intel 80x86, x>=3.
Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
Copyright (C) 1994, 1995, 1996, 1997, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>
Bug fixes by Alan Modra <Alan@SPRI.Levels.UniSA.Edu.Au>
@ -23,17 +23,18 @@
#include <sysdep.h>
#include "asm-syntax.h"
#include "bp-asm.h"
/*
INPUT PARAMETERS:
str (sp + 4)
skipset (sp + 8)
*/
#define PARMS LINKAGE /* no space for saved regs */
#define STR PARMS
#define SKIP STR+PTR_SIZE
.text
ENTRY (strspn)
movl 4(%esp), %edx /* get string pointer */
movl 8(%esp), %eax /* get skipset pointer */
ENTER
movl STR(%esp), %edx
movl SKIP(%esp), %eax
/* First we create a table with flags for all possible characters.
For the ASCII (7bit/8bit) or ISO-8859-X character sets which are
@ -173,5 +174,6 @@ L(4): subl %edx, %eax /* we have to return the number of valid
non-valid character */
addl $256, %esp /* remove stopset */
LEAVE
ret
END (strspn)

View File

@ -1,6 +1,6 @@
/* strtok (str, delim) -- Return next DELIM separated token from STR.
For Intel 80x86, x>=3.
Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
Copyright (C) 1996, 1997, 1998, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
@ -21,6 +21,7 @@
#include <sysdep.h>
#include "asm-syntax.h"
#include "bp-asm.h"
/* This file can be used for three variants of the strtok function:
@ -48,12 +49,19 @@ save_ptr:
#define FUNCTION strtok
#endif
#define PARMS LINKAGE /* no space for saved regs */
#define RTN PARMS
#define STR RTN+RTN_SIZE
#define DELIM STR+PTR_SIZE
#define SAVE DELIM+PTR_SIZE
.text
ENTRY (FUNCTION)
ENTER
movl 4(%esp), %edx /* Get start of string. */
movl 8(%esp), %eax /* Get start of delimiter set. */
movl STR(%esp), %edx
movl DELIM(%esp), %eax
#if !defined (USE_AS_STRTOK_R) && defined (PIC)
pushl %ebx /* Save PIC register. */
@ -70,7 +78,7 @@ L(here):
#ifdef USE_AS_STRTOK_R
/* The value is stored in the third argument. */
movl 12(%esp), %edx
movl SAVE(%esp), %edx
movl (%edx), %edx
#else
/* The value is in the local variable defined above. But
@ -257,7 +265,7 @@ L(11):
L(return):
/* Store the pointer to the next character. */
#ifdef USE_AS_STRTOK_R
movl 12(%esp), %ecx
movl SAVE(%esp), %ecx
movl %edx, (%ecx)
#else
# ifndef PIC
@ -267,7 +275,8 @@ L(return):
popl %ebx
# endif
#endif
ret
LEAVE
RET_PTR
L(returnNULL):
xorl %eax, %eax

View File

@ -1,6 +1,6 @@
/* i80386 __mpn_sub_n -- Add two limb vectors of the same length > 0 and store
sum in a third limb vector.
Copyright (C) 1992, 1994, 1995, 1997, 1998 Free Software Foundation, Inc.
Copyright (C) 1992, 1994, 1995, 1997, 1998, 2000 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
@ -18,26 +18,27 @@
the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA. */
/*
INPUT PARAMETERS
res_ptr (sp + 4)
s1_ptr (sp + 8)
s2_ptr (sp + 12)
size (sp + 16)
*/
#include "sysdep.h"
#include "asm-syntax.h"
#include "bp-asm.h"
#define PARMS LINKAGE+8 /* space for 2 saved regs */
#define RES PARMS
#define S1 RES+PTR_SIZE
#define S2 S1+PTR_SIZE
#define SIZE S2+PTR_SIZE
.text
ENTRY(__mpn_sub_n)
ENTER
pushl %edi
pushl %esi
movl 12(%esp),%edi /* res_ptr */
movl 16(%esp),%esi /* s1_ptr */
movl 20(%esp),%edx /* s2_ptr */
movl 24(%esp),%ecx /* size */
movl RES(%esp),%edi
movl S1(%esp),%esi
movl S2(%esp),%edx
movl SIZE(%esp),%ecx
movl %ecx,%eax
shrl $3,%ecx /* compute count for unrolled loop */
@ -99,5 +100,7 @@ L(oop): movl (%esi),%eax
popl %esi
popl %edi
LEAVE
ret
END(__mpn_sub_n)

View File

@ -1,6 +1,6 @@
/* i80386 __mpn_submul_1 -- Multiply a limb vector with a limb and subtract
the result from a second limb vector.
Copyright (C) 1992, 1994, 1997, 1998 Free Software Foundation, Inc.
Copyright (C) 1992, 1994, 1997, 1998, 2000 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
@ -18,16 +18,15 @@
the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA. */
/*
INPUT PARAMETERS
res_ptr (sp + 4)
s1_ptr (sp + 8)
sizeP (sp + 12)
s2_limb (sp + 16)
*/
#include "sysdep.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 s1_ptr esi
@ -36,16 +35,17 @@
.text
ENTRY(__mpn_submul_1)
ENTER
INSN1(push,l ,R(edi))
INSN1(push,l ,R(esi))
INSN1(push,l ,R(ebx))
INSN1(push,l ,R(ebp))
INSN2(mov,l ,R(res_ptr),MEM_DISP(esp,20))
INSN2(mov,l ,R(s1_ptr),MEM_DISP(esp,24))
INSN2(mov,l ,R(sizeP),MEM_DISP(esp,28))
INSN2(mov,l ,R(s2_limb),MEM_DISP(esp,32))
INSN2(mov,l ,R(res_ptr),MEM_DISP(esp,RES))
INSN2(mov,l ,R(s1_ptr),MEM_DISP(esp,S1))
INSN2(mov,l ,R(sizeP),MEM_DISP(esp,SIZE))
INSN2(mov,l ,R(s2_limb),MEM_DISP(esp,S2LIMB))
INSN2(lea,l ,R(res_ptr),MEM_INDEX(res_ptr,sizeP,4))
INSN2(lea,l ,R(s1_ptr),MEM_INDEX(s1_ptr,sizeP,4))
@ -69,5 +69,7 @@ L(oop):
INSN1(pop,l ,R(ebx))
INSN1(pop,l ,R(esi))
INSN1(pop,l ,R(edi))
LEAVE
ret
END(__mpn_submul_1)