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-03-06 13:43:18 +0300
committerJoern Rennecke <joern.rennecke@embecosm.com>2002-03-06 13:43:18 +0300
commit55f26f11945e4cbacfdaff197ff5220ee7417e9f (patch)
tree6167bc80a49aa118e2594c34a5b1c4d072209453 /newlib/libc/machine/sh/strcpy.S
parent6f6aa16f75b106a2efb470be06c6ccb0a09265cd (diff)
* Makefile.am (lib_a_SOURCES, SH64 case): Add memcpy.S, memset.S
and strcpy.S. * Makefile.in: Regenerate. * asm.h (_ENTRY): Set SH5 alignment to 8 bytes. (SHHI, SHLO): Define. * memcpy.S: Add code for SH5. * memset.S: Likewise. * strcpy.S: Likewise.
Diffstat (limited to 'newlib/libc/machine/sh/strcpy.S')
-rw-r--r--newlib/libc/machine/sh/strcpy.S132
1 files changed, 109 insertions, 23 deletions
diff --git a/newlib/libc/machine/sh/strcpy.S b/newlib/libc/machine/sh/strcpy.S
index 63aa7e75b..aab421007 100644
--- a/newlib/libc/machine/sh/strcpy.S
+++ b/newlib/libc/machine/sh/strcpy.S
@@ -1,41 +1,127 @@
-! Entry: r4: destination
-! r5: source
-! Exit: r0: destination
-! r1-r2,r5: clobbered
+! Entry: arg0: destination
+! arg1: source
+! Exit: result: destination
+!
+! SH5 code Copyright 2002 SuperH Ltd.
#include "asm.h"
ENTRY(strcpy)
- mov r4,r0
- or r5,r0
+
+#if __SHMEDIA__
+
+ pta/l shortstring,tr1
+ ldlo.q r3,0,r4
+ ptabs r18,tr4
+ shlli r3,3,r7
+ add r2,r63,r0
+ mcmpeq.b r4,r63,r6
+ SHHI r6,r7,r6
+ bnei/u r6,0,tr1 // shortstring
+ pta/l no_lddst, tr2
+ ori r3,-8,r23
+ sub r2, r23, r0
+ sub r3, r2, r21
+ addi r21, 8, r20
+ ldx.q r0, r21, r5
+ pta/l loop, tr0
+ ori r2,-8,r22
+ mcmpeq.b r5, r63, r6
+ bge/u r22, r23, tr2 // no_lddst
+
+ // r22 < r23 ; Need to do a load from the destination.
+ ldlo.q r2, 0, r9
+ movi -1, r8
+ SHLO r8, r7, r8
+ mcmv r4, r8, r9
+ stlo.q r2, 0, r9
+ beqi/l r6, 0, tr0 // loop
+
+ add r5, r63, r4
+ blink tr1, r63 // shortstring
+no_lddst:
+ stlo.q r2, 0, r4
+ SHHI r4, r7, r4
+ sthi.q r0, -1, r4
+ beqi/l r6, 0, tr0 // loop
+
+ add r5, r63, r4
+shortstring:
+#ifndef LITTLE_ENDIAN
+ pta/l shortstring2,tr1
+ byterev r4,r4
+#endif
+shortstring2:
+ st.b r0,0,r4
+ andi r4,0xff,r5
+ shlri r4,8,r4
+ addi r0,1,r0
+ bnei/l r5,0,tr1
+ blink tr4,r63 // return
+
+ .balign 8
+loop:
+ stlo.q r0, 0, r5
+ ldx.q r0, r20, r4
+ addi r0, 16, r0
+ sthi.q r0, -9, r5
+ mcmpeq.b r4, r63, r6
+ bnei/u r6, 0, tr1 // shortstring
+ ldx.q r0, r21, r5
+ stlo.q r0, -8, r4
+ sthi.q r0, -1, r4
+ mcmpeq.b r5, r63, r6
+ beqi/l r6, 0, tr0 // loop
+
+ add r5, r63, r4
+ blink tr1, r63 // shortstring
+
+#else /* ! __SHMEDIA__, i.e. SH 1..4 / SHcompact */
+
+#ifdef __SH5__
+#define DST r2
+#define SRC r3
+#define TMP r4
+#define RESULT R2
+! r0,r1,r3,r4: clobbered
+#else
+#define DST r4
+#define SRC r5
+#define TMP r2
+#define RESULT r0
+! r1-r2,r5: clobbered
+#endif
+ mov DST,r0
+ or SRC,r0
tst #3,r0
- SL(bf, L_setup_char_loop, mov r4,r0)
- mov.l @r5+,r1
- mov #0,r2
- cmp/str r2,r1
- SL(bt, Longword_loop_end, sub r5,r0)
+ SL(bf, L_setup_char_loop, mov DST,r0)
+ mov.l @SRC+,r1
+ mov #0,TMP
+ cmp/str TMP,r1
+ SL(bt, Longword_loop_end, sub SRC,r0)
.align 2
Longword_loop:
- mov.l r1,@(r0,r5)
- mov.l @r5+,r1
- cmp/str r2,r1
+ mov.l r1,@(r0,SRC)
+ mov.l @SRC+,r1
+ cmp/str TMP,r1
bt Longword_loop_end
- mov.l r1,@(r0,r5)
- mov.l @r5+,r1
- cmp/str r2,r1
+ mov.l r1,@(r0,SRC)
+ mov.l @SRC+,r1
+ cmp/str TMP,r1
bf Longword_loop
Longword_loop_end:
- add #-4,r5
+ add #-4,SRC
add #3,r0
.align 2
L_char_loop:
- mov.b @r5+,r1
+ mov.b @SRC+,r1
L_char_loop_start:
tst r1,r1
- SL(bf, L_char_loop, mov.b r1,@(r0,r5))
+ SL(bf, L_char_loop, mov.b r1,@(r0,SRC))
rts
- mov r4,r0
+ mov DST,RESULT
L_setup_char_loop:
- mov.b @r5+,r1
+ mov.b @SRC+,r1
bra L_char_loop_start
- sub r5,r0
+ sub SRC,r0
+#endif /* ! __SHMEDIA__ */