From e08a611849d98d2823057994190e97d1d2b4a261 Mon Sep 17 00:00:00 2001 From: Joern Rennecke Date: Mon, 24 Jun 2002 20:30:08 +0000 Subject: [PATCH] * 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. --- newlib/ChangeLog | 6 +++ newlib/libc/machine/sh/Makefile.am | 4 +- newlib/libc/machine/sh/Makefile.in | 12 ++--- newlib/libc/machine/sh/strlen.S | 87 ++++++++++++++++++++++++++++++ 4 files changed, 101 insertions(+), 8 deletions(-) create mode 100644 newlib/libc/machine/sh/strlen.S diff --git a/newlib/ChangeLog b/newlib/ChangeLog index 4f191d430..3e4ad47a2 100644 --- a/newlib/ChangeLog +++ b/newlib/ChangeLog @@ -1,3 +1,9 @@ +Mon Jun 24 21:17:02 2002 J"orn Rennecke + + * 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. + 2002-06-24 Jeff Johnston * libc/include/math.h: Remove . 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__ */