diff options
| author | Jayachandran C. <jchandra@FreeBSD.org> | 2010-06-16 12:55:14 +0000 | 
|---|---|---|
| committer | Jayachandran C. <jchandra@FreeBSD.org> | 2010-06-16 12:55:14 +0000 | 
| commit | a7c139c0afa4e4ca5bee2fbef192942e098fe57d (patch) | |
| tree | d284347736f86f7dd0b741263f711a8858174bbc /lib/libc | |
| parent | fcc7888f82d9fe3386caa691071d94a553b0a8ae (diff) | |
Notes
Diffstat (limited to 'lib/libc')
| -rw-r--r-- | lib/libc/mips/SYS.h | 34 | ||||
| -rw-r--r-- | lib/libc/mips/gen/_setjmp.S | 113 | ||||
| -rw-r--r-- | lib/libc/mips/gen/setjmp.S | 138 | ||||
| -rw-r--r-- | lib/libc/mips/gen/sigsetjmp.S | 31 | ||||
| -rw-r--r-- | lib/libc/mips/string/bcmp.S | 130 | ||||
| -rw-r--r-- | lib/libc/mips/string/bcopy.S | 257 | ||||
| -rw-r--r-- | lib/libc/mips/string/bzero.S | 69 | ||||
| -rw-r--r-- | lib/libc/mips/string/ffs.S | 4 | ||||
| -rw-r--r-- | lib/libc/mips/string/index.S | 16 | ||||
| -rw-r--r-- | lib/libc/mips/string/rindex.S | 14 | ||||
| -rw-r--r-- | lib/libc/mips/string/strcmp.S | 8 | ||||
| -rw-r--r-- | lib/libc/mips/string/strlen.S | 16 | ||||
| -rw-r--r-- | lib/libc/mips/sys/Ovfork.S | 11 | ||||
| -rw-r--r-- | lib/libc/mips/sys/brk.S | 18 | ||||
| -rw-r--r-- | lib/libc/mips/sys/cerror.S | 53 | ||||
| -rw-r--r-- | lib/libc/mips/sys/exect.S | 11 | ||||
| -rw-r--r-- | lib/libc/mips/sys/fork.S | 12 | ||||
| -rw-r--r-- | lib/libc/mips/sys/pipe.S | 11 | ||||
| -rw-r--r-- | lib/libc/mips/sys/ptrace.S | 53 | ||||
| -rw-r--r-- | lib/libc/mips/sys/sbrk.S | 32 | 
20 files changed, 510 insertions, 521 deletions
diff --git a/lib/libc/mips/SYS.h b/lib/libc/mips/SYS.h index c4aad4457a1b..7f2eeff5427d 100644 --- a/lib/libc/mips/SYS.h +++ b/lib/libc/mips/SYS.h @@ -1,4 +1,4 @@ -/*	$NetBSD: SYS.h,v 1.18 2003/10/29 12:28:33 pooka Exp $ */ +/*	$NetBSD: SYS.h,v 1.19 2009/12/14 01:07:41 matt Exp $ */  /* $FreeBSD$ */  /*- @@ -79,14 +79,22 @@   */  #ifdef __ABICALLS__  	.abicalls -# define PIC_PROLOGUE(x,sr)	.set noreorder; .cpload sr; .set reorder -# define PIC_CALL(l,sr)		la sr, _C_LABEL(l); jr sr +# if defined(__mips_o32) || defined(__mips_o64) +#  define PIC_PROLOGUE(x)	SETUP_GP +#  define PIC_TAILCALL(l)	PTR_LA t9, _C_LABEL(l); jr t9 +#  define PIC_RETURN()		j ra +# else +#  define PIC_PROLOGUE(x)	SETUP_GP64(t3, x) +#  define PIC_TAILCALL(l)	PTR_LA t9, _C_LABEL(l); RESTORE_GP64; jr t9 +#  define PIC_RETURN()		RESTORE_GP64; j ra +# endif  #else -# define PIC_PROLOGUE(x,sr) -# define PIC_CALL(l,sr)		j  _C_LABEL(l) -#endif +# define PIC_PROLOGUE(x) +# define PIC_TAILCALL(l)	j  _C_LABEL(l) +# define PIC_RETURN() +#endif /* __ABICALLS__ */ -# define SYSTRAP(x)	li v0, SYS_ ## x; syscall; +# define SYSTRAP(x)	li v0,SYS_ ## x; syscall;  /*   * Do a syscall that cannot fail (sync, get{p,u,g,eu,eg)id) @@ -106,7 +114,7 @@   */  #define PSEUDO_NOERROR(x)						\  LEAF(__sys_ ## x);							\ -        .weak _C_LABEL(x);						\ +	.weak _C_LABEL(x);						\  	_C_LABEL(x) = _C_LABEL(__CONCAT(__sys_,x));			\  	.weak _C_LABEL(__CONCAT(_,x));					\  	_C_LABEL(__CONCAT(_,x)) = _C_LABEL(__CONCAT(__sys_,x));		\ @@ -116,14 +124,14 @@ LEAF(__sys_ ## x);							\  #define PSEUDO(x)							\  LEAF(__sys_ ## x);							\ -        .weak _C_LABEL(x);						\ +	.weak _C_LABEL(x);						\  	_C_LABEL(x) = _C_LABEL(__CONCAT(__sys_,x));			\  	.weak _C_LABEL(__CONCAT(_,x));					\  	_C_LABEL(__CONCAT(_,x)) = _C_LABEL(__CONCAT(__sys_,x));		\ -	PIC_PROLOGUE(x,t9);						\ +	PIC_PROLOGUE(__sys_ ## x);					\  	SYSTRAP(x);							\  	bne a3,zero,err;						\ -	j ra;								\ +	PIC_RETURN();							\  err:									\ -	PIC_CALL(__cerror,t9);						\ -	END(__sys_ ## x) +	PIC_TAILCALL(__cerror);						\ +END(__sys_ ## x) diff --git a/lib/libc/mips/gen/_setjmp.S b/lib/libc/mips/gen/_setjmp.S index 596c71200405..3918407038c6 100644 --- a/lib/libc/mips/gen/_setjmp.S +++ b/lib/libc/mips/gen/_setjmp.S @@ -1,4 +1,4 @@ -/*	$NetBSD: _setjmp.S,v 1.20 2005/10/07 17:16:40 tsutsui Exp $	*/ +/*	$NetBSD: _setjmp.S,v 1.20.34.5 2010/02/03 23:46:47 matt Exp $	*/  /*-   * Copyright (c) 1991, 1993 @@ -36,14 +36,15 @@  __FBSDID("$FreeBSD$");  #include <machine/regnum.h> -#if defined(LIBC_SCCS) && !defined(lint) -	ASMSTR("from: @(#)_setjmp.s	8.1 (Berkeley) 6/4/93") -	ASMSTR("$NetBSD: _setjmp.S,v 1.20 2005/10/07 17:16:40 tsutsui Exp $") -#endif /* LIBC_SCCS and not lint */ +#include "SYS.h" -#ifdef __ABICALLS__ -	.abicalls +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +	RCSID("from: @(#)_setjmp.s	8.1 (Berkeley) 6/4/93") +#else +	RCSID("$NetBSD: _setjmp.S,v 1.20.34.5 2010/02/03 23:46:47 matt Exp $")  #endif +#endif /* LIBC_SCCS and not lint */  /*   * C library -- _setjmp, _longjmp @@ -56,62 +57,70 @@ __FBSDID("$FreeBSD$");   * The previous signal state is NOT restored.   */ +	.set	noreorder  LEAF(_setjmp) -#ifdef __ABICALLS__  -	.set	noreorder -	.cpload t9 -	subu	sp, sp, CALLFRAME_SIZ	# allocate stack frame -	.cprestore 16 +	REG_PROLOGUE +	REG_LI	v0, _JB_MAGIC__SETJMP +	REG_S	v0, (_JB_MAGIC  * SZREG)(a0) +	REG_S	ra, (_JB_REG_RA * SZREG)(a0) +	REG_S	s0, (_JB_REG_S0 * SZREG)(a0) +	REG_S	s1, (_JB_REG_S1 * SZREG)(a0) +	REG_S	s2, (_JB_REG_S2 * SZREG)(a0) +	REG_S	s3, (_JB_REG_S3 * SZREG)(a0) +	REG_S	s4, (_JB_REG_S4 * SZREG)(a0) +	REG_S	s5, (_JB_REG_S5 * SZREG)(a0) +	REG_S	s6, (_JB_REG_S6 * SZREG)(a0) +	REG_S	s7, (_JB_REG_S7 * SZREG)(a0) +	REG_S	s8, (_JB_REG_S8 * SZREG)(a0) +#if defined(__mips_n32) || defined(__mips_n64) +	REG_S	gp, (_JB_REG_GP * SZREG)(a0)	# newabi gp is callee-saved  #endif -	li	v0, _JB_MAGIC__SETJMP -	sw	v0, (_JB_MAGIC  * SZREG)(a0) -	sw	ra, (_JB_REG_RA * SZREG)(a0) -	sw	s0, (_JB_REG_S0 * SZREG)(a0) -	sw	s1, (_JB_REG_S1 * SZREG)(a0) -	sw	s2, (_JB_REG_S2 * SZREG)(a0) -	sw	s3, (_JB_REG_S3 * SZREG)(a0) -	sw	s4, (_JB_REG_S4 * SZREG)(a0) -	sw	s5, (_JB_REG_S5 * SZREG)(a0) -	sw	s6, (_JB_REG_S6 * SZREG)(a0) -	sw	s7, (_JB_REG_S7 * SZREG)(a0) -	sw	s8, (_JB_REG_S8 * SZREG)(a0) -#ifdef __ABICALLS__ -	addu	sp, sp, CALLFRAME_SIZ	# un-allocate the stack frame -#endif	 -	sw	sp, (_JB_REG_SP * SZREG)(a0) +	REG_S	sp, (_JB_REG_SP * SZREG)(a0) +	REG_EPILOGUE +  	j	ra  	move	v0, zero  END(_setjmp)  LEAF(_longjmp) -#ifdef __ABICALLS__  -	.set	noreorder -	.cpload t9 -	subu	sp, sp, CALLFRAME_SIZ	# allocate stack frame -	.cprestore 16 -#endif   -	lw	v0, (_JB_MAGIC  * SZREG)(a0) -	lw	ra, (_JB_REG_RA * SZREG)(a0) -	li	t0, _JB_MAGIC__SETJMP -	bne	v0, t0, botch		# jump if error -	lw	s0, (_JB_REG_S0 * SZREG)(a0) -	lw	s1, (_JB_REG_S1 * SZREG)(a0) -	lw	s2, (_JB_REG_S2 * SZREG)(a0) -	lw	s3, (_JB_REG_S3 * SZREG)(a0) -	lw	s4, (_JB_REG_S4 * SZREG)(a0) -	lw	s5, (_JB_REG_S5 * SZREG)(a0) -	lw	s6, (_JB_REG_S6 * SZREG)(a0) -	lw	s7, (_JB_REG_S7 * SZREG)(a0) -	lw	sp, (_JB_REG_SP * SZREG)(a0) -	lw	s8, (_JB_REG_S8 * SZREG)(a0) +	PIC_PROLOGUE(_longjmp) +	PTR_SUBU	sp, sp, CALLFRAME_SIZ +	SAVE_GP(CALLFRAME_GP) + +	REG_PROLOGUE +	REG_L		v0, (_JB_MAGIC  * SZREG)(a0)	# get magic number +	REG_L		ra, (_JB_REG_RA * SZREG)(a0) +	REG_LI		t0, _JB_MAGIC__SETJMP +	bne		v0, t0, botch		# jump if error +	PTR_ADDU	sp, sp, CALLFRAME_SIZ	# does not matter, sanity +	REG_L		s0, (_JB_REG_S0 * SZREG)(a0) +	REG_L		s1, (_JB_REG_S1 * SZREG)(a0) +	REG_L		s2, (_JB_REG_S2 * SZREG)(a0) +	REG_L		s3, (_JB_REG_S3 * SZREG)(a0) +	REG_L		s4, (_JB_REG_S4 * SZREG)(a0) +	REG_L		s5, (_JB_REG_S5 * SZREG)(a0) +	REG_L		s6, (_JB_REG_S6 * SZREG)(a0) +	REG_L		s7, (_JB_REG_S7 * SZREG)(a0) +#if defined(__mips_n32) || defined(__mips_n64) +	REG_L		gp, (_JB_REG_GP * SZREG)(a0) +#endif +	REG_L		sp, (_JB_REG_SP * SZREG)(a0) +	REG_L		s8, (_JB_REG_S8 * SZREG)(a0) +	REG_EPILOGUE +	move	v0, a1			# get return value in 1st arg  	j	ra -	move	v0, a1 +	nop  botch: -	jal	_C_LABEL(longjmperror) -	nop -	jal	_C_LABEL(abort) +	/* +	 * We know we aren't returning so we don't care about restoring +	 * our caller's GP. +	 */ +	PTR_LA	t9, _C_LABEL(longjmperror) +	jalr	t9  	nop + +	PIC_TAILCALL(abort)  END(_longjmp) diff --git a/lib/libc/mips/gen/setjmp.S b/lib/libc/mips/gen/setjmp.S index 2abc57b02c2f..deeb8924e308 100644 --- a/lib/libc/mips/gen/setjmp.S +++ b/lib/libc/mips/gen/setjmp.S @@ -41,6 +41,8 @@ __FBSDID("$FreeBSD$");  	ASMSTR("$NetBSD: setjmp.S,v 1.17 2005/09/17 11:49:39 tsutsui Exp $")  #endif /* LIBC_SCCS and not lint */ +#include "SYS.h" +  #ifdef __ABICALLS__  	.abicalls  #endif @@ -61,100 +63,102 @@ __FBSDID("$FreeBSD$");  NESTED(setjmp, SETJMP_FRAME_SIZE, ra)  	.mask	0x80000000, (CALLFRAME_RA - CALLFRAME_SIZ) -	.set	noreorder -#ifdef __ABICALLS__ -	.cpload	t9 -#endif -	subu	sp, sp, SETJMP_FRAME_SIZE	# allocate stack frame -#ifdef __ABICALLS__ -	.cprestore 16 -#endif -	sw	ra, CALLFRAME_RA(sp)		# save RA -	sw	a0, CALLFRAME_SIZ(sp)		# store env +	SETUP_GP +	PTR_SUBU sp, sp, SETJMP_FRAME_SIZE	# allocate stack frame +	SAVE_GP(CALLFRAME_GP) +	SETUP_GP64(CALLFRAME_GP, setjmp) + +	REG_S	ra, CALLFRAME_RA(sp)		# save RA +	REG_S	a0, CALLFRAME_SIZ(sp)		# store env  	/* Get the signal mask. */ -	addu	a2, a0, _JB_SIGMASK * SZREG	# &oenv +	PTR_ADDU a2, a0, _JB_SIGMASK * SZREG	# &oenv  	li	a0, 1				# SIG_SETBLOCK  	move	a1, zero			# &env == 0 -	la	t9, _C_LABEL(sigprocmask)	# get current signal mask -	jal	t9 -	nop - -	lw	a0, CALLFRAME_SIZ(sp)		# restore env pointer -	lw	ra, CALLFRAME_RA(sp)		# restore RA -	addu	sp, sp, SETJMP_FRAME_SIZE	# pop stack frame - -	li	v0, _JB_MAGIC_SETJMP -	sw	v0, (_JB_MAGIC  * SZREG)(a0) -	sw	ra, (_JB_REG_RA * SZREG)(a0) -	sw	s0, (_JB_REG_S0 * SZREG)(a0) -	sw	s1, (_JB_REG_S1 * SZREG)(a0) -	sw	s2, (_JB_REG_S2 * SZREG)(a0) -	sw	s3, (_JB_REG_S3 * SZREG)(a0) -	sw	s4, (_JB_REG_S4 * SZREG)(a0) -	sw	s5, (_JB_REG_S5 * SZREG)(a0) -	sw	s6, (_JB_REG_S6 * SZREG)(a0) -	sw	s7, (_JB_REG_S7 * SZREG)(a0) -	sw	sp, (_JB_REG_SP * SZREG)(a0) -	sw	s8, (_JB_REG_S8 * SZREG)(a0) +	PTR_LA	t9, _C_LABEL(sigprocmask)	# get current signal mask +	jalr	t9 + +	RESTORE_GP64 +	REG_L	a0, CALLFRAME_SIZ(sp)		# restore env pointer +	REG_L	ra, CALLFRAME_RA(sp)		# restore RA +	PTR_ADDU sp, sp, SETJMP_FRAME_SIZE	# pop stack frame + +	REG_LI	v0, _JB_MAGIC_SETJMP +	REG_S	v0, (_JB_MAGIC  * SZREG)(a0) +	REG_S	ra, (_JB_REG_RA * SZREG)(a0) +	REG_S	s0, (_JB_REG_S0 * SZREG)(a0) +	REG_S	s1, (_JB_REG_S1 * SZREG)(a0) +	REG_S	s2, (_JB_REG_S2 * SZREG)(a0) +	REG_S	s3, (_JB_REG_S3 * SZREG)(a0) +	REG_S	s4, (_JB_REG_S4 * SZREG)(a0) +	REG_S	s5, (_JB_REG_S5 * SZREG)(a0) +	REG_S	s6, (_JB_REG_S6 * SZREG)(a0) +	REG_S	s7, (_JB_REG_S7 * SZREG)(a0) +	REG_S	sp, (_JB_REG_SP * SZREG)(a0) +	REG_S	s8, (_JB_REG_S8 * SZREG)(a0) +#if defined(__mips_n32) || defined(__mips_n64) +	REG_S	gp, (_JB_REG_GP * SZREG)(a0) +#endif  	move	v0, zero -	j	ra +	jr	ra  END(setjmp)  #define LONGJMP_FRAME_SIZE	(CALLFRAME_SIZ + (SZREG * 2))  NESTED(longjmp, LONGJMP_FRAME_SIZE, ra)  	.mask	0x80000000, (CALLFRAME_RA - CALLFRAME_SIZ) -	.set	noreorder -#ifdef __ABICALLS__ -	.cpload	t9 -#endif -	subu	sp, sp, LONGJMP_FRAME_SIZE	# allocate stack frame -#ifdef __ABICALLS__ -	.cprestore 16 -#endif -	sw	ra, CALLFRAME_RA(sp)		# save RA -	lw	v0, (_JB_MAGIC  * SZREG)(a0) -	li	t0, _JB_MAGIC_SETJMP +	PIC_PROLOGUE(longjmp) +	PTR_SUBU sp, sp, LONGJMP_FRAME_SIZE	# allocate stack frame +	SAVE_GP(CALLFRAME_GP) + +	REG_S	ra, CALLFRAME_RA(sp)		# save RA +	REG_L	v0, (_JB_MAGIC  * SZREG)(a0) +	REG_LI	t0, _JB_MAGIC_SETJMP  	bne	v0, t0, botch		# jump if error  	nop -	sw	a0, CALLFRAME_SIZ(sp)		# save env -	sw	a1, (CALLFRAME_SIZ + SZREG)(sp)	# save return value +	REG_S	a0, CALLFRAME_SIZ(sp)		# save env +	REG_S	a1, (CALLFRAME_SIZ + SZREG)(sp)	# save return value  	# set sigmask -	addu	a1, a0, _JB_SIGMASK * SZREG	# &set +	PTR_ADDU a1, a0, _JB_SIGMASK * SZREG	# &set  	move	a2, zero			# &oset == NULL  	li	a0, 3				# SIG_SETMASK -	la	t9,_C_LABEL(sigprocmask)	# set current signal mask +	PTR_LA	t9,_C_LABEL(sigprocmask)	# set current signal mask  	jal	t9  	nop -	lw	a0, CALLFRAME_SIZ(sp)		# restore env -	lw	a1, (CALLFRAME_SIZ + SZREG)(sp)	# restore return value - -	lw	ra, (_JB_REG_RA * SZREG)(a0) -	lw	s0, (_JB_REG_S0 * SZREG)(a0) -	lw	s1, (_JB_REG_S1 * SZREG)(a0) -	lw	s2, (_JB_REG_S2 * SZREG)(a0) -	lw	s3, (_JB_REG_S3 * SZREG)(a0) -	lw	s4, (_JB_REG_S4 * SZREG)(a0) -	lw	s5, (_JB_REG_S5 * SZREG)(a0) -	lw	s6, (_JB_REG_S6 * SZREG)(a0) -	lw	s7, (_JB_REG_S7 * SZREG)(a0) -	lw	sp, (_JB_REG_SP * SZREG)(a0) -	lw	s8, (_JB_REG_S8 * SZREG)(a0) +	REG_L	a0, CALLFRAME_SIZ(sp)		# restore env +	REG_L	a1, (CALLFRAME_SIZ + SZREG)(sp)	# restore return value + +	REG_L	ra, (_JB_REG_RA * SZREG)(a0) +	REG_L	s0, (_JB_REG_S0 * SZREG)(a0) +	REG_L	s1, (_JB_REG_S1 * SZREG)(a0) +	REG_L	s2, (_JB_REG_S2 * SZREG)(a0) +	REG_L	s3, (_JB_REG_S3 * SZREG)(a0) +	REG_L	s4, (_JB_REG_S4 * SZREG)(a0) +	REG_L	s5, (_JB_REG_S5 * SZREG)(a0) +	REG_L	s6, (_JB_REG_S6 * SZREG)(a0) +	REG_L	s7, (_JB_REG_S7 * SZREG)(a0) +	REG_L	sp, (_JB_REG_SP * SZREG)(a0) +	REG_L	s8, (_JB_REG_S8 * SZREG)(a0) +#if defined(__mips_n32) || defined(__mips_n64) +	REG_L	gp, (_JB_REG_GP * SZREG)(a0) +#endif +  	move	v0, a1  	j	ra  	nop  botch: -	la	t9, _C_LABEL(longjmperror) -	jal	t9 +	/* +	 * We know we aren't returning so we don't care about restoring +	 * our caller's GP. +	 */ +	PTR_LA	t9, _C_LABEL(longjmperror) +	jalr	t9  	nop -	la	t9, _C_LABEL(abort) -	jal	t9 -	nop +	PIC_TAILCALL(abort)  END(longjmp) diff --git a/lib/libc/mips/gen/sigsetjmp.S b/lib/libc/mips/gen/sigsetjmp.S index 4e86e28e667d..7705c29a46b1 100644 --- a/lib/libc/mips/gen/sigsetjmp.S +++ b/lib/libc/mips/gen/sigsetjmp.S @@ -40,6 +40,8 @@ __FBSDID("$FreeBSD$");  	ASMSTR("$NetBSD: sigsetjmp.S,v 1.8 2005/09/17 11:49:39 tsutsui Exp $")  #endif /* LIBC_SCCS and not lint */ +#include "SYS.h" +  #ifdef __ABICALLS__  	.abicalls  #endif @@ -57,30 +59,19 @@ __FBSDID("$FreeBSD$");   */  LEAF(sigsetjmp) -#ifdef __ABICALLS__ -	.set	noreorder -	.cpload	t9 -	.set	reorder -#endif +	PIC_PROLOGUE(sigsetjmp) +  	bne	a1, 0x0, 1f			# do saving of signal mask? -	la	t9, _setjmp -	jr t9 +	PIC_TAILCALL(_setjmp) -1:	la	t9, setjmp -	jr t9 +1:	PIC_TAILCALL(setjmp)  END(sigsetjmp)  LEAF(siglongjmp) -#ifdef __ABICALLS__ -	.set	noreorder -	.cpload	t9 -	.set	reorder -#endif -	lw	t0, (_JB_MAGIC  * SZREG)(a0) -	li	t1, _JB_MAGIC__SETJMP +	PIC_PROLOGUE(siglongjmp) +	REG_L	t0, (_JB_MAGIC  * SZREG)(a0) +	REG_LI	t1, _JB_MAGIC__SETJMP  	bne	t0, t1, 1f			# setjmp or _setjmp magic? -	la	t9, _longjmp -	jr	t9 -1:	la	t9, longjmp -	jr	t9 +	PIC_TAILCALL(_longjmp) +1:	PIC_TAILCALL(longjmp)  END(siglongjmp) diff --git a/lib/libc/mips/string/bcmp.S b/lib/libc/mips/string/bcmp.S index 7b7fa687beae..ffcaeeb1a3fa 100644 --- a/lib/libc/mips/string/bcmp.S +++ b/lib/libc/mips/string/bcmp.S @@ -1,4 +1,4 @@ -/*	$NetBSD: bcmp.S,v 1.8 2003/08/07 16:42:16 agc Exp $	*/ +/*	$NetBSD: bcmp.S,v 1.9 2009/12/14 01:07:42 matt Exp $	*/  /*-   * Copyright (c) 1991, 1993 @@ -35,9 +35,15 @@  #include <machine/asm.h>  __FBSDID("$FreeBSD$"); +#define _LOCORE		/* XXX not really, just assembly-code source */ +#include <machine/endian.h>	/* LWLO/LWHI, SWLO/SWHI */ +  #if defined(LIBC_SCCS) && !defined(lint) +#if 0  	ASMSTR("from: @(#)bcmp.s	8.1 (Berkeley) 6/4/93") -	ASMSTR("$NetBSD: bcmp.S,v 1.8 2003/08/07 16:42:16 agc Exp $") +#else +	ASMSTR("$NetBSD: bcmp.S,v 1.9 2009/12/14 01:07:42 matt Exp $") +#endif  #endif /* LIBC_SCCS and not lint */  #ifdef __ABICALLS__ @@ -49,86 +55,76 @@ __FBSDID("$FreeBSD$");  LEAF(bcmp)  	.set	noreorder -	blt	a2, 16, small		# is it worth any trouble? -	xor	v0, a0, a1		# compare low two bits of addresses -	and	v0, v0, 3 -	subu	a3, zero, a1		# compute # bytes to word align address -	bne	v0, zero, unaligned	# not possible to align addresses -	and	a3, a3, 3 +	blt		a2, 16, small	# is it worth any trouble? +	xor		v0, a0, a1	# compare low two bits of addresses +	and		v0, v0, 3 +	PTR_SUBU	a3, zero, a1	# compute # bytes to word align address +	bne		v0, zero, unaligned # not possible to align addresses +	and		a3, a3, 3 -	beq	a3, zero, 1f -	subu	a2, a2, a3		# subtract from remaining count -	move	v0, v1			# init v0,v1 so unmodified bytes match -#ifdef __MIPSEB__ -	lwl	v0, 0(a0)		# read 1, 2, or 3 bytes -	lwl	v1, 0(a1) -#else -	lwr	v0, 0(a0)		# read 1, 2, or 3 bytes -	lwr	v1, 0(a1) -#endif -	addu	a1, a1, a3 -	bne	v0, v1, nomatch -	addu	a0, a0, a3 +	beq		a3, zero, 1f +	PTR_SUBU	a2, a2, a3	# subtract from remaining count +	move		v0, v1		# init v0,v1 so unmodified bytes match +	LWHI		v0, 0(a0)	# read 1, 2, or 3 bytes +	LWHI		v1, 0(a1) +	PTR_ADDU	a1, a1, a3 +	bne		v0, v1, nomatch +	PTR_ADDU	a0, a0, a3  1: -	and	a3, a2, ~3		# compute number of whole words left -	subu	a2, a2, a3		#   which has to be >= (16-3) & ~3 -	addu	a3, a3, a0		# compute ending address +	and		a3, a2, ~3	# compute number of whole words left +	PTR_SUBU	a2, a2, a3	#   which has to be >= (16-3) & ~3 +	PTR_ADDU	a3, a3, a0	# compute ending address  2: -	lw	v0, 0(a0)		# compare words -	lw	v1, 0(a1) -	addu	a0, a0, 4 -	bne	v0, v1, nomatch -	addu	a1, a1, 4 -	bne	a0, a3, 2b +	lw		v0, 0(a0)	# compare words +	lw		v1, 0(a1) +	PTR_ADDU	a0, a0, 4 +	bne		v0, v1, nomatch +	PTR_ADDU	a1, a1, 4 +	bne		a0, a3, 2b  	nop -	b	small			# finish remainder +	b		small		# finish remainder  	nop  unaligned: -	beq	a3, zero, 2f -	subu	a2, a2, a3		# subtract from remaining count -	addu	a3, a3, a0		# compute ending address +	beq		a3, zero, 2f +	PTR_SUBU	a2, a2, a3	# subtract from remaining count +	PTR_ADDU	a3, a3, a0	# compute ending address  1: -	lbu	v0, 0(a0)		# compare bytes until a1 word aligned -	lbu	v1, 0(a1) -	addu	a0, a0, 1 -	bne	v0, v1, nomatch -	addu	a1, a1, 1 -	bne	a0, a3, 1b +	lbu		v0, 0(a0)	# compare bytes until a1 word aligned +	lbu		v1, 0(a1) +	PTR_ADDU	a0, a0, 1 +	bne		v0, v1, nomatch +	PTR_ADDU	a1, a1, 1 +	bne		a0, a3, 1b  	nop  2: -	and	a3, a2, ~3		# compute number of whole words left -	subu	a2, a2, a3		#   which has to be >= (16-3) & ~3 -	addu	a3, a3, a0		# compute ending address +	and		a3, a2, ~3	# compute number of whole words left +	PTR_SUBU	a2, a2, a3	#   which has to be >= (16-3) & ~3 +	PTR_ADDU	a3, a3, a0	# compute ending address  3: -#ifdef __MIPSEB__ -	lwl	v0, 0(a0)		# compare words a0 unaligned, a1 aligned -	lwr	v0, 3(a0) -#else -	lwr	v0, 0(a0)		# compare words a0 unaligned, a1 aligned -	lwl	v0, 3(a0) -#endif -	lw	v1, 0(a1) -	addu	a0, a0, 4 -	bne	v0, v1, nomatch -	addu	a1, a1, 4 -	bne	a0, a3, 3b +	LWHI		v0, 0(a0)	# compare words a0 unaligned, a1 aligned +	LWLO		v0, 3(a0) +	lw		v1, 0(a1) +	PTR_ADDU	a0, a0, 4 +	bne		v0, v1, nomatch +	PTR_ADDU	a1, a1, 4 +	bne		a0, a3, 3b  	nop  small: -	ble	a2, zero, match -	addu	a3, a2, a0		# compute ending address +	ble		a2, zero, match +	PTR_ADDU	a3, a2, a0		# compute ending address  1: -	lbu	v0, 0(a0) -	lbu	v1, 0(a1) -	addu	a0, a0, 1 -	bne	v0, v1, nomatch -	addu	a1, a1, 1 -	bne	a0, a3, 1b +	lbu		v0, 0(a0) +	lbu		v1, 0(a1) +	PTR_ADDU	a0, a0, 1 +	bne		v0, v1, nomatch +	PTR_ADDU	a1, a1, 1 +	bne		a0, a3, 1b  	nop  match: -	j	ra -	move	v0, zero +	j		ra +	move		v0, zero  nomatch: -	j	ra -	li	v0, 1 +	j		ra +	li		v0, 1  	.set	reorder  END(bcmp) diff --git a/lib/libc/mips/string/bcopy.S b/lib/libc/mips/string/bcopy.S index 6287d0696f00..bc227e07d662 100644 --- a/lib/libc/mips/string/bcopy.S +++ b/lib/libc/mips/string/bcopy.S @@ -1,4 +1,4 @@ -/*	$NetBSD: bcopy.S,v 1.2 2005/12/27 11:23:53 tsutsui Exp $	*/ +/*	$NetBSD: bcopy.S,v 1.3 2009/12/14 00:39:00 matt Exp $	*/  /*   * Mach Operating System @@ -38,9 +38,15 @@  #include <machine/asm.h>  __FBSDID("$FreeBSD$"); +#define _LOCORE		/* XXX not really, just assembly-code source */ +#include <machine/endian.h> +  #if defined(LIBC_SCCS) && !defined(lint) +#if 0  	ASMSTR("from: @(#)mips_bcopy.s	2.2 CMU 18/06/93") -	ASMSTR("$NetBSD: bcopy.S,v 1.2 2005/12/27 11:23:53 tsutsui Exp $") +#else +	ASMSTR("$NetBSD: bcopy.S,v 1.3 2009/12/14 00:39:00 matt Exp $") +#endif  #endif /* LIBC_SCCS and not lint */  #ifdef __ABICALLS__ @@ -99,71 +105,72 @@ LEAF(FUNCTION)  	 *	copy is alignable.  eg if src and dest are both  	 *	on a halfword boundary.  	 */ -	andi	t1,DSTREG,3		# get last 3 bits of dest -	bne	t1,zero,3f -	andi	t0,SRCREG,3		# get last 3 bits of src -	bne	t0,zero,5f +	andi		t1,DSTREG,(SZREG-1)	# get last bits of dest +	bne		t1,zero,3f		# dest unaligned +	andi		t0,SRCREG,(SZREG-1)	# get last bits of src +	bne		t0,zero,5f  	/* -	 *	Forward aligned->aligned copy, 8*4 bytes at a time. +	 *	Forward aligned->aligned copy, 8 words at a time.  	 */ -	li	AT,-32 -	and	t0,SIZEREG,AT		# count truncated to multiple of 32 */ -	addu	a3,SRCREG,t0		# run fast loop up to this address -	sltu	AT,SRCREG,a3		# any work to do? -	beq	AT,zero,2f -	subu	SIZEREG,t0 +98: +	li		AT,-(SZREG*8) +	and		t0,SIZEREG,AT		# count truncated to multiples +	PTR_ADDU	a3,SRCREG,t0		# run fast loop up to this addr +	sltu		AT,SRCREG,a3		# any work to do? +	beq		AT,zero,2f +	PTR_SUBU	SIZEREG,t0  	/*  	 *	loop body  	 */  1:	# cp -	lw	t3,0(SRCREG) -	lw	v1,4(SRCREG) -	lw	t0,8(SRCREG) -	lw	t1,12(SRCREG) -	addu	SRCREG,32 -	sw	t3,0(DSTREG) -	sw	v1,4(DSTREG) -	sw	t0,8(DSTREG) -	sw	t1,12(DSTREG) -	lw	t1,-4(SRCREG) -	lw	t0,-8(SRCREG) -	lw	v1,-12(SRCREG) -	lw	t3,-16(SRCREG) -	addu	DSTREG,32 -	sw	t1,-4(DSTREG) -	sw	t0,-8(DSTREG) -	sw	v1,-12(DSTREG) -	bne	SRCREG,a3,1b -	sw	t3,-16(DSTREG) +	REG_L		t3,(0*SZREG)(SRCREG) +	REG_L		v1,(1*SZREG)(SRCREG) +	REG_L		t0,(2*SZREG)(SRCREG) +	REG_L		t1,(3*SZREG)(SRCREG) +	PTR_ADDU	SRCREG,SZREG*8 +	REG_S		t3,(0*SZREG)(DSTREG) +	REG_S		v1,(1*SZREG)(DSTREG) +	REG_S		t0,(2*SZREG)(DSTREG) +	REG_S		t1,(3*SZREG)(DSTREG) +	REG_L		t1,(-1*SZREG)(SRCREG) +	REG_L		t0,(-2*SZREG)(SRCREG) +	REG_L		v1,(-3*SZREG)(SRCREG) +	REG_L		t3,(-4*SZREG)(SRCREG) +	PTR_ADDU	DSTREG,SZREG*8 +	REG_S		t1,(-1*SZREG)(DSTREG) +	REG_S		t0,(-2*SZREG)(DSTREG) +	REG_S		v1,(-3*SZREG)(DSTREG) +	bne		SRCREG,a3,1b +	REG_S		t3,(-4*SZREG)(DSTREG)  	/*  	 *	Copy a word at a time, no loop unrolling.  	 */  2:	# wordcopy -	andi	t2,SIZEREG,3		# get byte count / 4 -	subu	t2,SIZEREG,t2		# t2 = number of words to copy * 4 -	beq	t2,zero,3f -	addu	t0,SRCREG,t2		# stop at t0 -	subu	SIZEREG,SIZEREG,t2 +	andi		t2,SIZEREG,(SZREG-1)	# get byte count / SZREG +	PTR_SUBU	t2,SIZEREG,t2		# t2 = words to copy * SZREG +	beq		t2,zero,3f +	PTR_ADDU	t0,SRCREG,t2		# stop at t0 +	PTR_SUBU	SIZEREG,SIZEREG,t2  1: -	lw	t3,0(SRCREG) -	addu	SRCREG,4 -	sw	t3,0(DSTREG) -	bne	SRCREG,t0,1b -	addu	DSTREG,4 +	REG_L		t3,0(SRCREG) +	PTR_ADDU	SRCREG,SZREG +	REG_S		t3,0(DSTREG) +	bne		SRCREG,t0,1b +	PTR_ADDU	DSTREG,SZREG  3:	# bytecopy -	beq	SIZEREG,zero,4f	# nothing left to do? +	beq		SIZEREG,zero,4f		# nothing left to do?  	nop  1: -	lb	t3,0(SRCREG) -	addu	SRCREG,1 -	sb	t3,0(DSTREG) -	subu	SIZEREG,1 -	bgtz	SIZEREG,1b -	addu	DSTREG,1 +	lb		t3,0(SRCREG) +	PTR_ADDU	SRCREG,1 +	sb		t3,0(DSTREG) +	PTR_SUBU	SIZEREG,1 +	bgtz		SIZEREG,1b +	PTR_ADDU	DSTREG,1  4:	# copydone  	j	ra @@ -173,96 +180,91 @@ LEAF(FUNCTION)  	 *	Copy from unaligned source to aligned dest.  	 */  5:	# destaligned -	andi	t0,SIZEREG,3		# t0 = bytecount mod 4 -	subu	a3,SIZEREG,t0		# number of words to transfer -	beq	a3,zero,3b +	andi		t0,SIZEREG,(SZREG-1)	# t0 = bytecount mod SZREG +	PTR_SUBU	a3,SIZEREG,t0		# number of words to transfer +	beq		a3,zero,3b  	nop -	move	SIZEREG,t0		# this many to do after we are done -	addu	a3,SRCREG,a3		# stop point +	move		SIZEREG,t0		# this many to do after we are done +	PTR_ADDU	a3,SRCREG,a3		# stop point  1: -#ifdef __MIPSEB__ -	lwl	t3,0(SRCREG) -	lwr	t3,3(SRCREG) -#else -	lwr	t3,0(SRCREG) -	lwl	t3,3(SRCREG) -#endif -	addi	SRCREG,4 -	sw	t3,0(DSTREG) -	bne	SRCREG,a3,1b -	addi	DSTREG,4 +	REG_LHI		t3,0(SRCREG) +	REG_LLO		t3,SZREG-1(SRCREG) +	PTR_ADDI	SRCREG,SZREG +	REG_S		t3,0(DSTREG) +	bne		SRCREG,a3,1b +	PTR_ADDI	DSTREG,SZREG -	j	3b +	b		3b  	nop  6:	# backcopy -- based on above -	addu	SRCREG,SIZEREG -	addu	DSTREG,SIZEREG -	andi	t1,DSTREG,3		# get last 3 bits of dest -	bne	t1,zero,3f -	andi	t0,SRCREG,3		# get last 3 bits of src -	bne	t0,zero,5f +	PTR_ADDU	SRCREG,SIZEREG +	PTR_ADDU	DSTREG,SIZEREG +	andi		t1,DSTREG,SZREG-1	# get last 3 bits of dest +	bne		t1,zero,3f +	andi		t0,SRCREG,SZREG-1	# get last 3 bits of src +	bne		t0,zero,5f  	/*  	 *	Forward aligned->aligned copy, 8*4 bytes at a time.  	 */ -	li	AT,-32 -	and	t0,SIZEREG,AT		# count truncated to multiple of 32 -	beq	t0,zero,2f		# any work to do? -	subu	SIZEREG,t0 -	subu	a3,SRCREG,t0 +	li		AT,(-8*SZREG) +	and		t0,SIZEREG,AT		# count truncated to multiple of 32 +	beq		t0,zero,2f		# any work to do? +	PTR_SUBU	SIZEREG,t0 +	PTR_SUBU	a3,SRCREG,t0  	/*  	 *	loop body  	 */  1:	# cp -	lw	t3,-16(SRCREG) -	lw	v1,-12(SRCREG) -	lw	t0,-8(SRCREG) -	lw	t1,-4(SRCREG) -	subu	SRCREG,32 -	sw	t3,-16(DSTREG) -	sw	v1,-12(DSTREG) -	sw	t0,-8(DSTREG) -	sw	t1,-4(DSTREG) -	lw	t1,12(SRCREG) -	lw	t0,8(SRCREG) -	lw	v1,4(SRCREG) -	lw	t3,0(SRCREG) -	subu	DSTREG,32 -	sw	t1,12(DSTREG) -	sw	t0,8(DSTREG) -	sw	v1,4(DSTREG) -	bne	SRCREG,a3,1b -	sw	t3,0(DSTREG) +	REG_L		t3,(-4*SZREG)(SRCREG) +	REG_L		v1,(-3*SZREG)(SRCREG) +	REG_L		t0,(-2*SZREG)(SRCREG) +	REG_L		t1,(-1*SZREG)(SRCREG) +	PTR_SUBU	SRCREG,8*SZREG +	REG_S		t3,(-4*SZREG)(DSTREG) +	REG_S		v1,(-3*SZREG)(DSTREG) +	REG_S		t0,(-2*SZREG)(DSTREG) +	REG_S		t1,(-1*SZREG)(DSTREG) +	REG_L		t1,(3*SZREG)(SRCREG) +	REG_L		t0,(2*SZREG)(SRCREG) +	REG_L		v1,(1*SZREG)(SRCREG) +	REG_L		t3,(0*SZREG)(SRCREG) +	PTR_SUBU	DSTREG,8*SZREG +	REG_S		t1,(3*SZREG)(DSTREG) +	REG_S		t0,(2*SZREG)(DSTREG) +	REG_S		v1,(1*SZREG)(DSTREG) +	bne		SRCREG,a3,1b +	REG_S		t3,(0*SZREG)(DSTREG)  	/*  	 *	Copy a word at a time, no loop unrolling.  	 */  2:	# wordcopy -	andi	t2,SIZEREG,3		# get byte count / 4 -	subu	t2,SIZEREG,t2		# t2 = number of words to copy * 4 -	beq	t2,zero,3f -	subu	t0,SRCREG,t2		# stop at t0 -	subu	SIZEREG,SIZEREG,t2 +	andi		t2,SIZEREG,SZREG-1	# get byte count / 4 +	PTR_SUBU	t2,SIZEREG,t2		# t2 = number of words to copy +	beq		t2,zero,3f +	PTR_SUBU	t0,SRCREG,t2		# stop at t0 +	PTR_SUBU	SIZEREG,SIZEREG,t2  1: -	lw	t3,-4(SRCREG) -	subu	SRCREG,4 -	sw	t3,-4(DSTREG) -	bne	SRCREG,t0,1b -	subu	DSTREG,4 +	REG_L		t3,-SZREG(SRCREG) +	PTR_SUBU	SRCREG,SZREG +	REG_S		t3,-SZREG(DSTREG) +	bne		SRCREG,t0,1b +	PTR_SUBU	DSTREG,SZREG  3:	# bytecopy -	beq	SIZEREG,zero,4f		# nothing left to do? +	beq		SIZEREG,zero,4f		# nothing left to do?  	nop  1: -	lb	t3,-1(SRCREG) -	subu	SRCREG,1 -	sb	t3,-1(DSTREG) -	subu	SIZEREG,1 -	bgtz	SIZEREG,1b -	subu	DSTREG,1 +	lb		t3,-1(SRCREG) +	PTR_SUBU	SRCREG,1 +	sb		t3,-1(DSTREG) +	PTR_SUBU	SIZEREG,1 +	bgtz		SIZEREG,1b +	PTR_SUBU	DSTREG,1  4:	# copydone  	j	ra @@ -272,27 +274,22 @@ LEAF(FUNCTION)  	 *	Copy from unaligned source to aligned dest.  	 */  5:	# destaligned -	andi	t0,SIZEREG,3		# t0 = bytecount mod 4 -	subu	a3,SIZEREG,t0		# number of words to transfer -	beq	a3,zero,3b +	andi		t0,SIZEREG,SZREG-1	# t0 = bytecount mod 4 +	PTR_SUBU	a3,SIZEREG,t0		# number of words to transfer +	beq		a3,zero,3b  	nop -	move	SIZEREG,t0		# this many to do after we are done -	subu	a3,SRCREG,a3		# stop point +	move		SIZEREG,t0		# this many to do after we are done +	PTR_SUBU	a3,SRCREG,a3		# stop point  1: -#ifdef __MIPSEB__ -	lwl	t3,-4(SRCREG) -	lwr	t3,-1(SRCREG) -#else -	lwr	t3,-4(SRCREG) -	lwl	t3,-1(SRCREG) -#endif -	subu	SRCREG,4 -	sw	t3,-4(DSTREG) -	bne	SRCREG,a3,1b -	subu	DSTREG,4 +	REG_LHI		t3,-SZREG(SRCREG) +	REG_LLO		t3,-1(SRCREG) +	PTR_SUBU	SRCREG,SZREG +	REG_S		t3,-SZREG(DSTREG) +	bne		SRCREG,a3,1b +	PTR_SUBU	DSTREG,SZREG -	j	3b +	b		3b  	nop  	.set	reorder diff --git a/lib/libc/mips/string/bzero.S b/lib/libc/mips/string/bzero.S index 9b341302f975..66f29ddeeae8 100644 --- a/lib/libc/mips/string/bzero.S +++ b/lib/libc/mips/string/bzero.S @@ -1,4 +1,4 @@ -/*	$NetBSD: bzero.S,v 1.8 2003/08/07 16:42:16 agc Exp $	*/ +/*	$NetBSD: bzero.S,v 1.10 2009/12/14 02:53:52 matt Exp $	*/  /*-   * Copyright (c) 1991, 1993 @@ -36,10 +36,15 @@  __FBSDID("$FreeBSD$");  #if defined(LIBC_SCCS) && !defined(lint) +#if 0  	ASMSTR("from: @(#)bzero.s	8.1 (Berkeley) 6/4/93") -	ASMSTR("$NetBSD: bzero.S,v 1.8 2003/08/07 16:42:16 agc Exp $") +#else +	ASMSTR("$NetBSD: bzero.S,v 1.10 2009/12/14 02:53:52 matt Exp $") +#endif  #endif /* LIBC_SCCS and not lint */ +#define _LOCORE		/* XXX not really, just assembly-code source */ +#include <machine/endian.h>  #ifdef __ABICALLS__  	.abicalls @@ -49,34 +54,48 @@ __FBSDID("$FreeBSD$");  LEAF(bzero)  	.set	noreorder -	blt	a1, 12, smallclr	# small amount to clear? -	subu	a3, zero, a0		# compute # bytes to word align address -	and	a3, a3, 3 -	beq	a3, zero, 1f		# skip if word aligned -	subu	a1, a1, a3		# subtract from remaining count -#ifdef __MIPSEB__ -	swl	zero, 0(a0)		# clear 1, 2, or 3 bytes to align -#else -	swr	zero, 0(a0)		# clear 1, 2, or 3 bytes to align +	blt		a1, 3*SZREG, smallclr # small amount to clear? +	PTR_SUBU	a3, zero, a0	# compute # bytes to word align address +	and		a3, a3, SZREG-1 +	beq		a3, zero, 1f	# skip if word aligned +#if SZREG == 4 +	PTR_SUBU	a1, a1, a3	# subtract from remaining count +	SWHI		zero, 0(a0)	# clear 1, 2, or 3 bytes to align +	PTR_ADDU	a0, a0, a3 +#endif +#if SZREG == 8 +	PTR_SUBU	a1, a1, a3	# subtract from remaining count +	PTR_ADDU	a0, a0, a3	# align dst to next word +	sll		a3, a3, 3	# bits to bytes +	li		a2, -1		# make a mask +#if _BYTE_ORDER == _BIG_ENDIAN +	REG_SRLV	a2, a2, a3	# we want to keep the MSB bytes +#endif +#if _BYTE_ORDER == _LITTLE_ENDIAN +	REG_SLLV	a2, a2, a3	# we want to keep the LSB bytes +#endif +	nor		a2, zero, a2	# complement the mask +	REG_L		v0, -SZREG(a0)	# load the word to partially clear +	and		v0, v0, a2	# clear the bytes +	REG_S		v0, -SZREG(a0)	# store it back  #endif -	addu	a0, a0, a3  1: -	and	v0, a1, 3		# compute number of words left -	subu	a3, a1, v0 -	move	a1, v0 -	addu	a3, a3, a0		# compute ending address +	and		v0, a1, SZREG-1	# compute number of words left +	PTR_SUBU	a3, a1, v0 +	move		a1, v0 +	PTR_ADDU	a3, a3, a0	# compute ending address  2: -	addu	a0, a0, 4		# clear words -	bne	a0, a3, 2b		#   unrolling loop doesnt help -	sw	zero, -4(a0)		#   since we are limited by memory speed +	PTR_ADDU	a0, a0, SZREG	# clear words +	bne		a0, a3, 2b	#  unrolling loop doesnt help +	REG_S		zero, -SZREG(a0) # since we are limited by memory speed  smallclr: -	ble	a1, zero, 2f -	addu	a3, a1, a0		# compute ending address +	ble		a1, zero, 2f +	PTR_ADDU	a3, a1, a0	# compute ending address  1: -	addu	a0, a0, 1		# clear bytes -	bne	a0, a3, 1b -	sb	zero, -1(a0) +	PTR_ADDU	a0, a0, 1	# clear bytes +	bne		a0, a3, 1b +	sb		zero, -1(a0)  2: -	j	ra +	j		ra  	nop  END(bzero) diff --git a/lib/libc/mips/string/ffs.S b/lib/libc/mips/string/ffs.S index 8df2be311979..17e509c24637 100644 --- a/lib/libc/mips/string/ffs.S +++ b/lib/libc/mips/string/ffs.S @@ -1,4 +1,4 @@ -/*	$NetBSD: ffs.S,v 1.1 2005/12/20 19:28:49 christos Exp $	*/ +/*	$NetBSD: ffs.S,v 1.2 2009/12/14 00:39:00 matt Exp $	*/  /*-   * Copyright (c) 1991, 1993 @@ -37,7 +37,7 @@ __FBSDID("$FreeBSD$");  #if defined(LIBC_SCCS) && !defined(lint)  	ASMSTR("from: @(#)ffs.s	8.1 (Berkeley) 6/4/93") -	ASMSTR("$NetBSD: ffs.S,v 1.1 2005/12/20 19:28:49 christos Exp $") +	ASMSTR("$NetBSD: ffs.S,v 1.2 2009/12/14 00:39:00 matt Exp $")  #endif /* LIBC_SCCS and not lint */  #ifdef __ABICALLS__ diff --git a/lib/libc/mips/string/index.S b/lib/libc/mips/string/index.S index 055baacab8dc..d1df5400fc1a 100644 --- a/lib/libc/mips/string/index.S +++ b/lib/libc/mips/string/index.S @@ -46,14 +46,14 @@ __FBSDID("$FreeBSD$");  LEAF(index)  1: -	lbu	a2, 0(a0)		# get a byte -	addu	a0, a0, 1 -	beq	a2, a1, fnd -	bne	a2, zero, 1b +	lbu		a2, 0(a0)		# get a byte +	PTR_ADDU	a0, a0, 1 +	beq		a2, a1, fnd +	bne		a2, zero, 1b  notfnd: -	move	v0, zero -	j	ra +	move		v0, zero +	j		ra  fnd: -	subu	v0, a0, 1 -	j	ra +	PTR_SUBU	v0, a0, 1 +	j		ra  END(index) diff --git a/lib/libc/mips/string/rindex.S b/lib/libc/mips/string/rindex.S index 60cbb48ba63b..e50379e673a4 100644 --- a/lib/libc/mips/string/rindex.S +++ b/lib/libc/mips/string/rindex.S @@ -45,13 +45,13 @@ __FBSDID("$FreeBSD$");  #endif  LEAF(rindex) -	move	v0, zero		# default if not found +	move		v0, zero		# default if not found  1: -	lbu	a3, 0(a0)		# get a byte -	addu	a0, a0, 1 -	bne	a3, a1, 2f -	subu	v0, a0, 1		# save address of last match +	lbu		a3, 0(a0)		# get a byte +	PTR_ADDU	a0, a0, 1 +	bne		a3, a1, 2f +	PTR_SUBU	v0, a0, 1		# save address of last match  2: -	bne	a3, zero, 1b		# continue if not end -	j	ra +	bne		a3, zero, 1b		# continue if not end +	j		ra  END(rindex) diff --git a/lib/libc/mips/string/strcmp.S b/lib/libc/mips/string/strcmp.S index ce2839d62f90..8a9905630ce8 100644 --- a/lib/libc/mips/string/strcmp.S +++ b/lib/libc/mips/string/strcmp.S @@ -1,4 +1,4 @@ -/*	$NetBSD: strcmp.S,v 1.1 2005/12/20 19:28:50 christos Exp $	*/ +/*	$NetBSD: strcmp.S,v 1.2 2009/12/14 00:39:00 matt Exp $	*/  /*-   * Copyright (c) 1991, 1993 @@ -37,7 +37,7 @@ __FBSDID("$FreeBSD$");  #if defined(LIBC_SCCS) && !defined(lint)  	ASMSTR("from: @(#)strcmp.s	8.1 (Berkeley) 6/4/93") -	ASMSTR("$NetBSD: strcmp.S,v 1.1 2005/12/20 19:28:50 christos Exp $") +	ASMSTR("$NetBSD: strcmp.S,v 1.2 2009/12/14 00:39:00 matt Exp $")  #endif /* LIBC_SCCS and not lint */  #ifdef __ABICALLS__ @@ -55,9 +55,9 @@ LEAF(strcmp)  	bne	t0, t1, NotEq  	lbu	t0, 1(a0)		# unroll loop  	lbu	t1, 1(a1) -	add	a0, a0, 2 +	PTR_ADD	a0, a0, 2  	beq	t0, zero, LessOrEq	# end of first string? -	add	a1, a1, 2 +	PTR_ADD	a1, a1, 2  	beq	t0, t1, 1b  NotEq:  	subu	v0, t0, t1 diff --git a/lib/libc/mips/string/strlen.S b/lib/libc/mips/string/strlen.S index c1f302d4ca49..3b46ccceb54b 100644 --- a/lib/libc/mips/string/strlen.S +++ b/lib/libc/mips/string/strlen.S @@ -1,4 +1,4 @@ -/*	$NetBSD: strlen.S,v 1.1 2005/12/20 19:28:50 christos Exp $	*/ +/*	$NetBSD: strlen.S,v 1.2 2009/12/14 00:39:00 matt Exp $	*/  /*-   * Copyright (c) 1991, 1993 @@ -37,7 +37,7 @@ __FBSDID("$FreeBSD$");  #if defined(LIBC_SCCS) && !defined(lint)  	ASMSTR("from: @(#)strlen.s	8.1 (Berkeley) 6/4/93") -	ASMSTR("$NetBSD: strlen.S,v 1.1 2005/12/20 19:28:50 christos Exp $") +	ASMSTR("$NetBSD: strlen.S,v 1.2 2009/12/14 00:39:00 matt Exp $")  #endif /* LIBC_SCCS and not lint */  #ifdef __ABICALLS__ @@ -45,11 +45,11 @@ __FBSDID("$FreeBSD$");  #endif  LEAF(strlen) -	addu	v1, a0, 1 +	PTR_ADDU	v1, a0, 1  1: -	lb	v0, 0(a0)		# get byte from string -	addu	a0, a0, 1		# increment pointer -	bne	v0, zero, 1b		# continue if not end -	subu	v0, a0, v1		# compute length - 1 for '\0' char -	j	ra +	lb		v0, 0(a0)	# get byte from string +	PTR_ADDU	a0, a0, 1	# increment pointer +	bne		v0, zero, 1b	# continue if not end +	PTR_SUBU 	v0, a0, v1	# compute length - 1 for '\0' char +	j		ra  END(strlen) diff --git a/lib/libc/mips/sys/Ovfork.S b/lib/libc/mips/sys/Ovfork.S index 99a5526d1f45..9df93ea59e9d 100644 --- a/lib/libc/mips/sys/Ovfork.S +++ b/lib/libc/mips/sys/Ovfork.S @@ -49,21 +49,16 @@ __FBSDID("$FreeBSD$");   */  LEAF(__sys_vfork) -#ifdef __ABICALLS__ -	.set	noreorder -	.cpload	t9 -	.set	reorder -#endif  	WEAK_ALIAS(vfork, __sys_vfork)  	WEAK_ALIAS(_vfork, __sys_vfork) +	PIC_PROLOGUE(__sys_vfork)  	li	v0, SYS_vfork		# system call number for vfork  	syscall  	beq	a3, zero, 1f		# jump if no errors -	la	t9, __cerror -	jr	t9 +	PIC_TAILCALL(__cerror)  1:  	beq	v1, zero, 2f		# parent process ?  	move	v0, zero		# return zero in child  2: -	j	ra +	PIC_RETURN()  END(__sys_vfork) diff --git a/lib/libc/mips/sys/brk.S b/lib/libc/mips/sys/brk.S index aeaf7912f351..ceb29b9d587c 100644 --- a/lib/libc/mips/sys/brk.S +++ b/lib/libc/mips/sys/brk.S @@ -49,25 +49,23 @@ __FBSDID("$FreeBSD$");  _C_LABEL(minbrk):  	.word	_C_LABEL(_end) +	.text  LEAF(__sys_brk)  	WEAK_ALIAS(brk, __sys_brk)  	WEAK_ALIAS(_brk, __sys_brk) -#ifdef __ABICALLS__ -	.set	noreorder -	.cpload	t9 -	.set	reorder -#endif -	lw	v0, _C_LABEL(minbrk) +	PIC_PROLOGUE(__sys_brk) +	PTR_LA	v0, _C_LABEL(minbrk) +	PTR_L	v0, 0(v0)  	bgeu	a0, v0, 1f  	move	a0, v0		# dont allow break < minbrk  1:  	li	v0, SYS_break  	syscall  	bne	a3, zero, 2f -	sw	a0, _C_LABEL(__curbrk) +	PTR_LA	t0, _C_LABEL(__curbrk) +	PTR_S	a0, 0(t0)  	move	v0, zero -	j	ra +	PIC_RETURN()  2: -	la	t9, _C_LABEL(__cerror) -	jr	t9 +	PIC_TAILCALL(__cerror)  END(__sys_brk) diff --git a/lib/libc/mips/sys/cerror.S b/lib/libc/mips/sys/cerror.S index 535fbe063b6c..c504d73afa3f 100644 --- a/lib/libc/mips/sys/cerror.S +++ b/lib/libc/mips/sys/cerror.S @@ -1,4 +1,4 @@ -/*	$NetBSD: cerror.S,v 1.13 2003/08/07 16:42:17 agc Exp $	*/ +/*	$NetBSD: cerror.S,v 1.14 2009/12/14 01:07:42 matt Exp $	*/  /*-   * Copyright (c) 1991, 1993 @@ -37,35 +37,36 @@ __FBSDID("$FreeBSD$");  #include "SYS.h"  #if defined(LIBC_SCCS) && !defined(lint) -	ASMSTR("from: @(#)cerror.s	8.1 (Berkeley) 6/16/93") -	ASMSTR("$NetBSD: cerror.S,v 1.13 2003/08/07 16:42:17 agc Exp $") +#if 0 +	RCSID("from: @(#)cerror.s	8.1 (Berkeley) 6/16/93") +#else +	RCSID("$NetBSD: cerror.S,v 1.14 2009/12/14 01:07:42 matt Exp $") +#endif  #endif /* LIBC_SCCS and not lint */ +	.globl	_C_LABEL(__error) +NESTED_NOPROFILE(__cerror, CALLFRAME_SIZ, ra) +	.mask	0x80000000, (CALLFRAME_RA - CALLFRAME_SIZ) +	SETUP_GP +	PTR_SUBU	sp, sp, CALLFRAME_SIZ +	SETUP_GP64(CALLFRAME_GP, __cerror) +	SAVE_GP(CALLFRAME_GP) -	/* -	 * The __error() function is thread aware. For non-threaded -	 * programs and the initial threaded in threaded programs, -	 * it returns a pointer to the global errno variable. -	 */ -	.globl  _C_LABEL(__error) -	.type   _C_LABEL(__error),%function +	PTR_S		ra, CALLFRAME_RA(sp) +	REG_S		v0, CALLFRAME_S0(sp)	# save errno value -LEAF(__cerror) -	.frame sp, CALLFRAME_SIZ, ra -	PIC_PROLOGUE(__cerror, t9) -	subu	sp, sp, CALLFRAME_SIZ -	.mask	0x80000000, (CALLFRAME_RA - CALLFRAME_SIZ) -	sw	ra, CALLFRAME_RA(sp) -	sw	v0, 12(sp)		# save errno value +	PTR_LA		t9, _C_LABEL(__error)	# locate address of errno +	jalr		t9 + +	REG_L		t0, CALLFRAME_S0(sp) +	PTR_L		ra, CALLFRAME_RA(sp) +	INT_S		t0, 0(v0)		# update errno value + +	RESTORE_GP64 +	PTR_ADDU	sp, sp, CALLFRAME_SIZ -	la	t9, _C_LABEL(__error)	# locate address of errno -	jalr	t9 +	li		v0, -1 +	li		v1, -1 -	lw	t0, 12(sp) -	lw	ra, CALLFRAME_RA(sp) -	sw	t0, 0(v0)		# update errno value -	addiu	sp, sp, CALLFRAME_SIZ -	li	v0, -1 -	li	v1, -1 -	j	ra +	j		ra  END(__cerror) diff --git a/lib/libc/mips/sys/exect.S b/lib/libc/mips/sys/exect.S index 702015d96ed3..613d47c5d6d5 100644 --- a/lib/libc/mips/sys/exect.S +++ b/lib/libc/mips/sys/exect.S @@ -41,16 +41,11 @@ __FBSDID("$FreeBSD$");  #endif /* LIBC_SCCS and not lint */  LEAF(exect) -#ifdef __ABICALLS__ -	.set    noreorder -	.cpload t9 -	.set    reorder -#endif +	PIC_PROLOGUE(exect)  	li	v0, SYS_execve  	syscall  	bne	a3, zero, 1f -	j	ra +	PIC_RETURN()  1: -	la      t9, _C_LABEL(__cerror) -	jr      t9 +	PIC_TAILCALL(__cerror)  END(exect) diff --git a/lib/libc/mips/sys/fork.S b/lib/libc/mips/sys/fork.S index 2d1f14b855e7..7636bd379292 100644 --- a/lib/libc/mips/sys/fork.S +++ b/lib/libc/mips/sys/fork.S @@ -44,20 +44,14 @@ __FBSDID("$FreeBSD$");  LEAF(__sys_fork)  	WEAK_ALIAS(fork, __sys_fork)  	WEAK_ALIAS(_fork, __sys_fork) -#ifdef __ABICALLS__ -	.set    noreorder -	.cpload t9 -	.set    reorder -#endif -	fork = __sys_fork +	PIC_PROLOGUE(__sys_fork)  	li	v0, SYS_fork	# pid = fork()  	syscall  	bne	a3, zero, 2f  	beq	v1, zero, 1f	# v1 == 0 in parent, 1 in child  	move	v0, zero  1: -	j	ra +	PIC_RETURN()  2: -	la	t9, _C_LABEL(__cerror) -	jr	t9 +	PIC_TAILCALL(__cerror)  END(__sys_fork) diff --git a/lib/libc/mips/sys/pipe.S b/lib/libc/mips/sys/pipe.S index 224b78c8aafc..01465328f834 100644 --- a/lib/libc/mips/sys/pipe.S +++ b/lib/libc/mips/sys/pipe.S @@ -44,19 +44,14 @@ __FBSDID("$FreeBSD$");  LEAF(__sys_pipe)  	WEAK_ALIAS(pipe, __sys_pipe)  	WEAK_ALIAS(_pipe, __sys_pipe) -#ifdef __ABICALLS__ -	.set    noreorder -	.cpload t9 -	.set    reorder -#endif +	PIC_PROLOGUE(__sys_pipe)  	li	v0, SYS_pipe	# pipe(fildes) int fildes[2];  	syscall  	bne	a3, zero, 1f  	sw	v0, 0(a0)	# store the two file descriptors  	sw	v1, 4(a0)  	move	v0, zero -	j	ra +	PIC_RETURN()  1: -	la	t9, _C_LABEL(__cerror) -	jr	t9 +	PIC_TAILCALL(__cerror)  END(__sys_pipe) diff --git a/lib/libc/mips/sys/ptrace.S b/lib/libc/mips/sys/ptrace.S index 09b82c5255f9..8cf984a9c727 100644 --- a/lib/libc/mips/sys/ptrace.S +++ b/lib/libc/mips/sys/ptrace.S @@ -41,32 +41,31 @@ __FBSDID("$FreeBSD$");  	ASMSTR("$NetBSD: ptrace.S,v 1.9 2003/08/07 16:42:17 agc Exp $")  #endif /* LIBC_SCCS and not lint */ -LEAF(ptrace) -	.frame	sp, 40, ra -	.mask	0x80000000, -8 -#ifdef __ABICALLS__ -	.set    noreorder -	.cpload t9 -	.set    reorder -#endif -	subu	sp, sp, 40 -	sw	ra,  32(sp) -#ifdef __ABICALLS__ -	.cprestore 16 -#endif -	la	t9, _C_LABEL(__error)	# locate address of errno -	jalr	t9 -#ifdef __ABICALLS__ -	lw	gp, 16(sp) -#endif -	sw	zero, 0(v0) -	lw	ra, 32(sp) -	addu	sp, sp, 40 -	li	v0, SYS_ptrace +NESTED_NOPROFILE(ptrace, CALLFRAME_SIZ, ra) +	.mask	0x80000000, (CALLFRAME_RA - CALLFRAME_SIZ) +	SETUP_GP +	PTR_SUBU	sp, sp, CALLFRAME_SIZ +	SETUP_GP64(CALLFRAME_GP, ptrace) +	SAVE_GP(CALLFRAME_GP) + +	PTR_S		ra, CALLFRAME_RA(sp) + +	PTR_LA		t9, _C_LABEL(__error)	# locate address of errno +	jalr		t9 + +	PTR_L		ra, CALLFRAME_RA(sp) +	INT_S		zero, 0(v0)		# update errno value + +	li		v0, SYS_ptrace  	syscall -	bne	a3, zero, 1f -	j	ra -1: -	la	t9, _C_LABEL(__cerror) -	jr	t9 + +	# Load __cerror's address using our gp, then restore it. +	PTR_LA		t9, __cerror +	RESTORE_GP64 +	PTR_ADDU	sp, sp, CALLFRAME_SIZ + +	bne		a3, zero, 1f + +	j		ra +1:	j		t9  END(ptrace) diff --git a/lib/libc/mips/sys/sbrk.S b/lib/libc/mips/sys/sbrk.S index c53536010066..8ab981d740c8 100644 --- a/lib/libc/mips/sys/sbrk.S +++ b/lib/libc/mips/sys/sbrk.S @@ -52,34 +52,22 @@ _C_LABEL(__curbrk):  LEAF(__sys_sbrk)  	WEAK_ALIAS(sbrk, __sys_sbrk)  	WEAK_ALIAS(_sbrk, __sys_sbrk) -#ifdef __ABICALLS__ -	.set	noreorder -	.cpload	t9 -	.set	reorder -#endif -	addu	sp, sp, -16 -	sw	s0, 0(sp)		# Preserve s0 value in stack -					# it should be the same on return -					# We can't use v1 as temporary -					# register since syscall uses it -					# to return 64-bit values -	lw	s0, _C_LABEL(__curbrk) -	li	v0, SYS_break -	addu	a0, a0, s0		# compute current break +	PIC_PROLOGUE(__sys_sbrk) +	PTR_LA	t0, _C_LABEL(__curbrk) +	PTR_L	t0, 0(t0) +	PTR_ADDU a0, a0, t0 +	li	v0, SYS_break  	syscall  	bne	a3, zero, 1f  	nop -	move	v0, s0			# return old val of curbrk from above -	lw	s0, 0(sp) -	addu	sp, sp, 16 -	sw	a0, _C_LABEL(__curbrk)	# save current val of curbrk from above +	move	v0, t0			# return old val of curbrk from above +	PTR_LA	t0, _C_LABEL(__curbrk) +	PTR_S	a0, 0(t0)		# save current val of curbrk from above +	PIC_RETURN()  	j	ra  1: -	lw	s0, 0(sp) -	addu	sp, sp, 16 -	la	t9, _C_LABEL(__cerror) -	jr	t9 +	PIC_TAILCALL(__cerror)  END(__sys_sbrk)  | 
