Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoern Rennecke <joern.rennecke@embecosm.com>2002-06-25 00:30:08 +0400
committerJoern Rennecke <joern.rennecke@embecosm.com>2002-06-25 00:30:08 +0400
commite08a611849d98d2823057994190e97d1d2b4a261 (patch)
treedccbcf280a2d2d0f5e59f110c9c6a61cb4e725df /newlib/libc
parenta5dadf33f9a936741f21b67052761ae1ab0eca73 (diff)
* libc/machine/sh/strcpy.S: New file.
* libc/machine/sh/Makefile.am (lib_a_SOURCES): Add rule for it. * libc/machine/sh/Makefile.am: Regenerate.
Diffstat (limited to 'newlib/libc')
-rw-r--r--newlib/libc/machine/sh/Makefile.am4
-rw-r--r--newlib/libc/machine/sh/Makefile.in12
-rw-r--r--newlib/libc/machine/sh/strlen.S87
3 files changed, 95 insertions, 8 deletions
diff --git a/newlib/libc/machine/sh/Makefile.am b/newlib/libc/machine/sh/Makefile.am
index 3cf7f799f..d2d496671 100644
--- a/newlib/libc/machine/sh/Makefile.am
+++ b/newlib/libc/machine/sh/Makefile.am
@@ -7,9 +7,9 @@ INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS)
noinst_LIBRARIES = lib.a
if SH64
-lib_a_SOURCES = memcpy.S memset.S setjmp.S strcpy.S
+lib_a_SOURCES = memcpy.S memset.S setjmp.S strcpy.S strlen.S
else
-lib_a_SOURCES = memcpy.S memset.S setjmp.S strcpy.S strcmp.S
+lib_a_SOURCES = memcpy.S memset.S setjmp.S strcpy.S strlen.S strcmp.S
endif
memcpy.o: asm.h
diff --git a/newlib/libc/machine/sh/Makefile.in b/newlib/libc/machine/sh/Makefile.in
index 4215cd3b4..0a6da83ce 100644
--- a/newlib/libc/machine/sh/Makefile.in
+++ b/newlib/libc/machine/sh/Makefile.in
@@ -1,6 +1,6 @@
-# Makefile.in generated automatically by automake 1.4 from Makefile.am
+# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am
-# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
@@ -88,8 +88,8 @@ AUTOMAKE_OPTIONS = cygnus
INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS)
noinst_LIBRARIES = lib.a
-@SH64_TRUE@lib_a_SOURCES = @SH64_TRUE@memcpy.S memset.S setjmp.S strcpy.S
-@SH64_FALSE@lib_a_SOURCES = @SH64_FALSE@memcpy.S memset.S setjmp.S strcpy.S strcmp.S
+@SH64_TRUE@lib_a_SOURCES = @SH64_TRUE@memcpy.S memset.S setjmp.S strcpy.S strlen.S
+@SH64_FALSE@lib_a_SOURCES = @SH64_FALSE@memcpy.S memset.S setjmp.S strcpy.S strlen.S strcmp.S
ACLOCAL_AMFLAGS = -I ../../..
CONFIG_STATUS_DEPENDENCIES = $(newlib_basedir)/configure.host
@@ -103,9 +103,9 @@ DEFS = @DEFS@ -I. -I$(srcdir)
CPPFLAGS = @CPPFLAGS@
LIBS = @LIBS@
lib_a_LIBADD =
-@SH64_TRUE@lib_a_OBJECTS = memcpy.o memset.o setjmp.o strcpy.o
+@SH64_TRUE@lib_a_OBJECTS = memcpy.o memset.o setjmp.o strcpy.o strlen.o
@SH64_FALSE@lib_a_OBJECTS = memcpy.o memset.o setjmp.o strcpy.o \
-@SH64_FALSE@strcmp.o
+@SH64_FALSE@strlen.o strcmp.o
CFLAGS = @CFLAGS@
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
CCLD = $(CC)
diff --git a/newlib/libc/machine/sh/strlen.S b/newlib/libc/machine/sh/strlen.S
new file mode 100644
index 000000000..b55b86b79
--- /dev/null
+++ b/newlib/libc/machine/sh/strlen.S
@@ -0,0 +1,87 @@
+! Entry: arg0: string start address
+! Exit: result: length
+!
+! Copyright 2002 SuperH Ltd.
+
+#include "asm.h"
+
+ENTRY(strlen)
+
+#if __SHMEDIA__
+
+ ldlo.q r2,0,r3
+ ptabs/l r18,tr0
+ pta/l loop,tr1
+ andi r2,-8,r0
+ shlli r2,3,r1
+ mcmpeq.b r3,r63,r3
+ SHHI r3,r1,r4
+ beqi/u r4,0,tr1 // loop
+#ifdef __LITTLE_ENDIAN__
+ movi -1,r2
+ addi r3,-1,r4
+ msad.ubq r3,r4,r2
+#else
+ shlri r3,1,r3
+ nsb r3,r3
+ shlri r3,3,r2
+#endif
+ blink tr0,r63
+
+loop:
+ ldlo.q r0,8,r3
+ addi r0,8,r0
+ ldlo.q r0,8,r63
+ mcmpeq.b r3,r63,r3
+ beqi/l r3,0,tr1 // loop
+ sub r0,r2,r2
+#ifdef __LITTLE_ENDIAN__
+ addi r3,-1,r4
+ addi r2,-1,r2
+ msad.ubq r3,r4,r2
+#else
+ shlri r3,1,r3
+ nsb r3,r3
+ shlri r3,3,r3
+ add r2,r3,r2
+#endif
+ blink tr0,r63
+
+#else /* ! __SHMEDIA__, i.e. SH 1..4 / SHcompact */
+
+#ifdef __SH5__
+#define STR_INIT r2
+#define STR_ORIG r0
+#define STR_COPY STR_ORIG
+#define MASK r1
+#define TMP r3
+#define RESULT r2
+! r0,r1,r3: clobbered
+#else
+#define STR_INIT r4
+#define STR_ORIG STR_INIT
+#define STR_COPY STR
+#define MASK r1
+#define TMP r3
+#define RESULT r0
+! r1,r3: clobbered
+#endif
+#define STR RESULT
+
+ mov #3,MASK
+ and STR_INIT,MASK
+ tst MASK,MASK
+ SL(bf, L_char_loop, mov STR_INIT, STR_COPY)
+L_word_loop:
+ mov.l @STR+,TMP
+ cmp/str MASK,TMP
+ bf L_word_loop
+ add #-4,STR
+L_char_loop:
+ mov.b @STR+,TMP
+ tst TMP,TMP
+ bf L_char_loop
+ add #-1,STR
+ rts
+ sub STR_ORIG,STR
+#endif /* ! __SHMEDIA__ */