Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/lib/libkern/arch/sh3 new bcopy.S
details: https://anonhg.NetBSD.org/src/rev/e57dae5d3e27
branches: trunk
changeset: 487537:e57dae5d3e27
user: msaitoh <msaitoh%NetBSD.org@localhost>
date: Fri Jun 09 04:42:46 2000 +0000
description:
new bcopy.S
diffstat:
sys/lib/libkern/arch/sh3/Makefile.inc | 4 +-
sys/lib/libkern/arch/sh3/bcopy.S | 256 +++++++++++++++++++++++++++------
sys/lib/libkern/arch/sh3/memcpy.S | 5 +-
sys/lib/libkern/arch/sh3/memmove.S | 5 +-
4 files changed, 212 insertions(+), 58 deletions(-)
diffs (truncated from 309 to 300 lines):
diff -r fe15275b6a5a -r e57dae5d3e27 sys/lib/libkern/arch/sh3/Makefile.inc
--- a/sys/lib/libkern/arch/sh3/Makefile.inc Fri Jun 09 04:42:24 2000 +0000
+++ b/sys/lib/libkern/arch/sh3/Makefile.inc Fri Jun 09 04:42:46 2000 +0000
@@ -1,9 +1,9 @@
-# $NetBSD: Makefile.inc,v 1.3 2000/04/20 13:52:35 msaitoh Exp $
+# $NetBSD: Makefile.inc,v 1.4 2000/06/09 04:42:46 msaitoh Exp $
SRCS+= __main.c imax.c imin.c lmax.c lmin.c max.c min.c ulmax.c ulmin.c \
bswap64.c bcmp.c bzero.c ffs.c scanc.c skpc.c \
strcat.c strcmp.c strcpy.c strlen.c strncasecmp.c strncmp.c \
strncpy.c random.c __assert.c memchr.c memcmp.c memset.c \
bcopy.S memcpy.S memmove.S \
- ashiftrt.S ashlsi3.S ashrsi3.S lshrsi3.S movstr.S \
+ ashiftrt.S ashlsi3.S ashrsi3.S lshrsi3.S movstr.S movstrSI.S \
mulsi3.S sdivsi3.S udivsi3.S
diff -r fe15275b6a5a -r e57dae5d3e27 sys/lib/libkern/arch/sh3/bcopy.S
--- a/sys/lib/libkern/arch/sh3/bcopy.S Fri Jun 09 04:42:24 2000 +0000
+++ b/sys/lib/libkern/arch/sh3/bcopy.S Fri Jun 09 04:42:46 2000 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: bcopy.S,v 1.1 2000/04/20 13:52:35 msaitoh Exp $ */
+/* $NetBSD: bcopy.S,v 1.2 2000/06/09 04:42:46 msaitoh Exp $ */
/*
* Copyright (c) 2000 SHIMIZU Ryo <ryo%misakimix.org@localhost>
@@ -29,59 +29,219 @@
#include <machine/asm.h>
-#if defined(MEMCOPY) || defined(MEMMOVE)
-#define DST r4
-#define SRC r5
-#else
-#define SRC r4
-#define DST r5
-#endif
-#define LEN r6
+#define REG_SRC r4
+#define REG_DST r5
+#define REG_LEN r6
+
+ENTRY(memcpy)
+ALTENTRY(memmove)
+ mov r4,r0 /* memcpy(dst,src,len) -> bcopy(src,dst,len) */
+ mov r5,r4
+ mov r0,r5
+ /* fall through */
+
+ALTENTRY(bcopy)
+ cmp/eq REG_DST,REG_SRC /* if ( src == dst ) return; */
+ bt/s bcopy_return
+ cmp/hi REG_DST,REG_SRC
+ bf/s bcopy_overlap
+
+ mov REG_SRC,r0
+ xor REG_DST,r0
+ and #3,r0
+ mov r0,r1
+ tst r0,r0 /* (src ^ dst) & 3 */
+ bf/s word_align
+
+longword_align:
+ tst REG_LEN,REG_LEN /* if ( len==0 ) return; */
+ bt/s bcopy_return
+
+
+ mov REG_SRC,r0
+ tst #1,r0 /* if ( src & 1 ) */
+ bt 1f
+ mov.b @REG_SRC+,r0 /* *dst++ = *src++; */
+ add #-1,REG_LEN
+ mov.b r0,@REG_DST
+ add #1,REG_DST
+1:
+
+
+ mov #1,r0
+ cmp/hi r0,REG_LEN /* if ( (len > 1) && */
+ bf/s 1f
+ mov REG_SRC,r0
+ tst #2,r0 /* (src & 2) { */
+ bt 1f
+ mov.w @REG_SRC+,r0 /* *((unsigned short*)dst)++ = *((unsigned short*)src)++; */
+ add #-2,REG_LEN /* len -= 2; */
+ mov.w r0,@REG_DST
+ add #2,REG_DST /* } */
+1:
+
+
+ mov #3,r1
+ cmp/hi r1,REG_LEN /* while ( len > 3 ) { */
+ bf/s no_align_delay
+ tst REG_LEN,REG_LEN
+2:
+ mov.l @REG_SRC+,r0 /* *((unsigned long*)dst)++ = *((unsigned long*)src)++; */
+ add #-4,REG_LEN /* len -= 4; */
+ mov.l r0,@REG_DST
+ cmp/hi r1,REG_LEN
+ bt/s 2b
+ add #4,REG_DST /* } */
+
+ bra no_align_delay
+ tst REG_LEN,REG_LEN
+
+
+word_align:
+ mov r1,r0
+ tst #1,r0
+ bf/s no_align_delay
+ tst REG_LEN,REG_LEN /* if ( len == 0 ) return; */
+ bt bcopy_return
+
+
+ mov REG_SRC,r0 /* if ( src & 1 ) */
+ tst #1,r0
+ bt 1f
+ mov.b @REG_SRC+,r0 /* *dst++ = *src++; */
+ add #-1,REG_LEN
+ mov.b r0,@REG_DST
+ add #1,REG_DST
+1:
+
+
+ mov #1,r1
+ cmp/hi r1,REG_LEN /* while ( len > 1 ) { */
+ bf/s no_align_delay
+ tst REG_LEN,REG_LEN
+2:
+ mov.w @REG_SRC+,r0 /* *((unsigned short*)dst)++ = *((unsigned short*)src)++; */
+ add #-2,REG_LEN /* len -= 2; */
+ mov.w r0,@REG_DST
+ cmp/hi r1,REG_LEN
+ bt/s 2b
+ add #2,REG_DST /* } */
-#ifdef MEMCOPY
-ENTRY(memcpy)
-#else
-#ifdef MEMMOVE
-ENTRY(memmove)
-#else
-ENTRY(bcopy)
-#endif
-#endif
- cmp/hi DST,SRC
- bf bcopy_overlap
+no_align:
+ tst REG_LEN,REG_LEN /* while ( len!= ) { */
+no_align_delay:
+ bt bcopy_return
+1:
+ mov.b @REG_SRC+,r0 /* *dst++ = *src++; */
+ add #-1,REG_LEN /* len--; */
+ mov.b r0,@REG_DST
+ tst REG_LEN,REG_LEN
+ bf/s 1b
+ add #1,REG_DST /* } */
+bcopy_return:
+ rts
+ nop
+
+
+bcopy_overlap:
+ add REG_LEN,REG_SRC
+ add REG_LEN,REG_DST
+
+ mov REG_SRC,r0
+ xor REG_DST,r0
+ and #3,r0
+ mov r0,r1
+ tst r0,r0 /* (src ^ dst) & 3 */
+ bf/s ov_word_align
+
+ov_longword_align:
+ tst REG_LEN,REG_LEN /* if ( len==0 ) return; */
+ bt/s bcopy_return
+
+
+ mov REG_SRC,r0
+ tst #1,r0 /* if ( src & 1 ) */
+ bt 1f
+ add #-1,REG_SRC /* *--dst = *--src; */
+ mov.b @REG_SRC,r0
+ mov.b r0,@-REG_DST
+ add #-1,REG_LEN
+1:
+
- tst LEN,LEN
+ mov #1,r0
+ cmp/hi r0,REG_LEN /* if ( (len > 1) && */
+ bf/s 1f
+ mov REG_SRC,r0
+ tst #2,r0 /* (src & 2) { */
+ bt 1f
+ add #-2,REG_SRC /* *--((unsigned short*)dst) = *--((unsigned short*)src); */
+ mov.w @REG_SRC,r0
+ add #-2,REG_LEN /* len -= 2; */
+ mov.w r0,@-REG_DST /* } */
+1:
+
+
+ mov #3,r1
+ cmp/hi r1,REG_LEN /* while ( len > 3 ) { */
+ bf/s ov_no_align_delay
+ tst REG_LEN,REG_LEN
+2:
+ add #-4,REG_SRC
+ mov.l @REG_SRC,r0 /* *((unsigned long*)dst)++ = *((unsigned long*)src)++; */
+ add #-4,REG_LEN /* len -= 4; */
+ cmp/hi r1,REG_LEN
+ bt/s 2b
+ mov.l r0,@-REG_DST /* } */
+
+ bra ov_no_align_delay
+ tst REG_LEN,REG_LEN
+
+
+ov_word_align:
+ mov r1,r0
+ tst #1,r0
+ bf/s ov_no_align_delay
+ tst REG_LEN,REG_LEN /* if ( len == 0 ) return; */
+ bt bcopy_return
+
+
+ mov REG_SRC,r0 /* if ( src & 1 ) */
+ tst #1,r0
+ bt 1f
+ add #-1,REG_SRC
+ mov.b @REG_SRC,r0 /* *--dst = *--src; */
+ add #-1,REG_LEN
+ mov.b r0,@-REG_DST
+1:
+
+
+ mov #1,r1
+ cmp/hi r1,REG_LEN /* while ( len > 1 ) { */
+ bf/s ov_no_align_delay
+ tst REG_LEN,REG_LEN
+2:
+ add #-2,REG_SRC
+ mov.w @REG_SRC,r0 /* *--((unsigned short*)dst) = *--((unsigned short*)src); */
+ add #-2,REG_LEN /* len -= 2; */
+ cmp/hi r1,REG_LEN
+ bt/s 2b
+ mov.w r0,@-REG_DST /* } */
+
+
+ov_no_align:
+ tst REG_LEN,REG_LEN /* while ( len!= ) { */
+ov_no_align_delay:
bt 9f
1:
- mov.b @SRC+,r0
- mov.b r0,@DST
-
- add #-1,LEN
- tst LEN,LEN
+ add #-1,REG_SRC
+ mov.b @REG_SRC,r0 /* *--dst = *--src; */
+ add #-1,REG_LEN /* len--; */
+ tst REG_LEN,REG_LEN
bf/s 1b
- add #1,DST
-
+ mov.b r0,@-REG_DST /* } */
9:
- rts
+ rts
nop
-bcopy_overlap:
- add LEN,SRC
- add LEN,DST
-
- tst LEN,LEN
- bt 9f
-1:
- add #-1,SRC
- mov.b @SRC,r0
-
- add #-1,LEN
- tst LEN,LEN
- bf/s 1b
- mov.b r0,@-DST
-
-9:
- rts
- nop
-
diff -r fe15275b6a5a -r e57dae5d3e27 sys/lib/libkern/arch/sh3/memcpy.S
--- a/sys/lib/libkern/arch/sh3/memcpy.S Fri Jun 09 04:42:24 2000 +0000
+++ b/sys/lib/libkern/arch/sh3/memcpy.S Fri Jun 09 04:42:46 2000 +0000
@@ -1,4 +1,1 @@
-/* $NetBSD: memcpy.S,v 1.1 2000/04/20 13:52:36 msaitoh Exp $ */
-
-#define MEMCOPY
-#include "bcopy.S"
+/* On sh3, memcpy, memmove and bcopy share a single routine. */
Home |
Main Index |
Thread Index |
Old Index