Author: jchandra
Date: Wed Jun 16 12:55:14 2010
New Revision: 209231
URL: http://svn.freebsd.org/changeset/base/209231

Log:
  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

Modified:
  head/lib/libc/mips/SYS.h
  head/lib/libc/mips/gen/_setjmp.S
  head/lib/libc/mips/gen/setjmp.S
  head/lib/libc/mips/gen/sigsetjmp.S
  head/lib/libc/mips/string/bcmp.S
  head/lib/libc/mips/string/bcopy.S
  head/lib/libc/mips/string/bzero.S
  head/lib/libc/mips/string/ffs.S
  head/lib/libc/mips/string/index.S
  head/lib/libc/mips/string/rindex.S
  head/lib/libc/mips/string/strcmp.S
  head/lib/libc/mips/string/strlen.S
  head/lib/libc/mips/sys/Ovfork.S
  head/lib/libc/mips/sys/brk.S
  head/lib/libc/mips/sys/cerror.S
  head/lib/libc/mips/sys/exect.S
  head/lib/libc/mips/sys/fork.S
  head/lib/libc/mips/sys/pipe.S
  head/lib/libc/mips/sys/ptrace.S
  head/lib/libc/mips/sys/sbrk.S

Modified: head/lib/libc/mips/SYS.h
==============================================================================
--- head/lib/libc/mips/SYS.h    Wed Jun 16 12:42:20 2010        (r209230)
+++ head/lib/libc/mips/SYS.h    Wed Jun 16 12:55:14 2010        (r209231)
@@ -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)

Modified: head/lib/libc/mips/gen/_setjmp.S
==============================================================================
--- head/lib/libc/mips/gen/_setjmp.S    Wed Jun 16 12:42:20 2010        
(r209230)
+++ head/lib/libc/mips/gen/_setjmp.S    Wed Jun 16 12:55:14 2010        
(r209231)
@@ -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)

Modified: head/lib/libc/mips/gen/setjmp.S
==============================================================================
--- head/lib/libc/mips/gen/setjmp.S     Wed Jun 16 12:42:20 2010        
(r209230)
+++ head/lib/libc/mips/gen/setjmp.S     Wed Jun 16 12:55:14 2010        
(r209231)
@@ -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
-
-       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)
+       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
+       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)

Modified: head/lib/libc/mips/gen/sigsetjmp.S
==============================================================================
--- head/lib/libc/mips/gen/sigsetjmp.S  Wed Jun 16 12:42:20 2010        
(r209230)
+++ head/lib/libc/mips/gen/sigsetjmp.S  Wed Jun 16 12:55:14 2010        
(r209231)
@@ -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)

Modified: head/lib/libc/mips/string/bcmp.S
==============================================================================
--- head/lib/libc/mips/string/bcmp.S    Wed Jun 16 12:42:20 2010        
(r209230)
+++ head/lib/libc/mips/string/bcmp.S    Wed Jun 16 12:55:14 2010        
(r209231)
@@ -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
-
-       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
+       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
+       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)

Modified: head/lib/libc/mips/string/bcopy.S
==============================================================================
--- head/lib/libc/mips/string/bcopy.S   Wed Jun 16 12:42:20 2010        
(r209230)
+++ head/lib/libc/mips/string/bcopy.S   Wed Jun 16 12:55:14 2010        
(r209231)
@@ -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

Modified: head/lib/libc/mips/string/bzero.S
==============================================================================
--- head/lib/libc/mips/string/bzero.S   Wed Jun 16 12:42:20 2010        
(r209230)
+++ head/lib/libc/mips/string/bzero.S   Wed Jun 16 12:55:14 2010        
(r209231)
@@ -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

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to