aboutsummaryrefslogtreecommitdiff
path: root/lib/libc/mips
diff options
context:
space:
mode:
authorJayachandran C. <jchandra@FreeBSD.org>2010-06-16 12:55:14 +0000
committerJayachandran C. <jchandra@FreeBSD.org>2010-06-16 12:55:14 +0000
commita7c139c0afa4e4ca5bee2fbef192942e098fe57d (patch)
treed284347736f86f7dd0b741263f711a8858174bbc /lib/libc/mips
parentfcc7888f82d9fe3386caa691071d94a553b0a8ae (diff)
downloadsrc-a7c139c0afa4e4ca5bee2fbef192942e098fe57d.tar.gz
src-a7c139c0afa4e4ca5bee2fbef192942e098fe57d.zip
Merge jmallett@'s n64 work into HEAD - changeset 1.
Update libc assembly code to use macros that work on both o32 and n64. Merge string functions from NetBSD. The changes are from http://svn.freebsd.org/base/user/jmallett/octeon Approved by: rrs (mentor), jmallett
Notes
Notes: svn path=/head/; revision=209231
Diffstat (limited to 'lib/libc/mips')
-rw-r--r--lib/libc/mips/SYS.h34
-rw-r--r--lib/libc/mips/gen/_setjmp.S113
-rw-r--r--lib/libc/mips/gen/setjmp.S138
-rw-r--r--lib/libc/mips/gen/sigsetjmp.S31
-rw-r--r--lib/libc/mips/string/bcmp.S130
-rw-r--r--lib/libc/mips/string/bcopy.S257
-rw-r--r--lib/libc/mips/string/bzero.S69
-rw-r--r--lib/libc/mips/string/ffs.S4
-rw-r--r--lib/libc/mips/string/index.S16
-rw-r--r--lib/libc/mips/string/rindex.S14
-rw-r--r--lib/libc/mips/string/strcmp.S8
-rw-r--r--lib/libc/mips/string/strlen.S16
-rw-r--r--lib/libc/mips/sys/Ovfork.S11
-rw-r--r--lib/libc/mips/sys/brk.S18
-rw-r--r--lib/libc/mips/sys/cerror.S53
-rw-r--r--lib/libc/mips/sys/exect.S11
-rw-r--r--lib/libc/mips/sys/fork.S12
-rw-r--r--lib/libc/mips/sys/pipe.S11
-rw-r--r--lib/libc/mips/sys/ptrace.S53
-rw-r--r--lib/libc/mips/sys/sbrk.S32
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)