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
This commit is contained in:
parent
9a26791248
commit
fa919cddc1
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
PTR_LA t9, _C_LABEL(sigprocmask) # get current signal mask
|
||||
jalr t9
|
||||
|
||||
lw a0, CALLFRAME_SIZ(sp) # restore env pointer
|
||||
lw ra, CALLFRAME_RA(sp) # restore RA
|
||||
addu sp, sp, SETJMP_FRAME_SIZE # pop stack frame
|
||||
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
|
||||
|
||||
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)
|
||||
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
|
||||
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
|
||||
|
||||
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)
|
||||
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)
|
||||
|
@ -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
|
||||
bne a1, 0x0, 1f # do saving of signal mask?
|
||||
la t9, _setjmp
|
||||
jr t9
|
||||
PIC_PROLOGUE(sigsetjmp)
|
||||
|
||||
1: la t9, setjmp
|
||||
jr t9
|
||||
bne a1, 0x0, 1f # do saving of signal mask?
|
||||
PIC_TAILCALL(_setjmp)
|
||||
|
||||
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)
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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__
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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 */
|
||||
|
||||
|
||||
/*
|
||||
* 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
|
||||
|
||||
LEAF(__cerror)
|
||||
.frame sp, CALLFRAME_SIZ, ra
|
||||
PIC_PROLOGUE(__cerror, t9)
|
||||
subu sp, sp, CALLFRAME_SIZ
|
||||
.globl _C_LABEL(__error)
|
||||
NESTED_NOPROFILE(__cerror, CALLFRAME_SIZ, ra)
|
||||
.mask 0x80000000, (CALLFRAME_RA - CALLFRAME_SIZ)
|
||||
sw ra, CALLFRAME_RA(sp)
|
||||
sw v0, 12(sp) # save errno value
|
||||
SETUP_GP
|
||||
PTR_SUBU sp, sp, CALLFRAME_SIZ
|
||||
SETUP_GP64(CALLFRAME_GP, __cerror)
|
||||
SAVE_GP(CALLFRAME_GP)
|
||||
|
||||
la t9, _C_LABEL(__error) # locate address of errno
|
||||
jalr t9
|
||||
PTR_S ra, CALLFRAME_RA(sp)
|
||||
REG_S v0, CALLFRAME_S0(sp) # save errno value
|
||||
|
||||
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
|
||||
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
|
||||
|
||||
li v0, -1
|
||||
li v1, -1
|
||||
|
||||
j ra
|
||||
END(__cerror)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user