1! Entry: arg0: string start address
2! Exit:  result: length
3!
4/* Copyright 2002 SuperH Ltd. */
5
6#include "asm.h"
7
8ENTRY(strlen)
9
10#if __SHMEDIA__
11
12	ldlo.q r2,0,r3
13	ptabs/l r18,tr0
14	pta/l loop,tr1
15	andi r2,-8,r0
16	shlli r2,3,r1
17	mcmpeq.b r3,r63,r3
18	SHHI r3,r1,r4
19	beqi/u r4,0,tr1 // loop
20#ifdef __LITTLE_ENDIAN__
21	movi -1,r2
22	addi r3,-1,r4
23	msad.ubq r3,r4,r2
24#else
25	shlri r3,1,r3
26	nsb r3,r3
27	shlri r3,3,r2
28#endif
29	blink tr0,r63
30
31loop:
32	ldlo.q r0,8,r3
33	addi r0,8,r0
34	ldlo.q r0,8,r63
35	mcmpeq.b r3,r63,r3
36	beqi/l r3,0,tr1 // loop
37	sub r0,r2,r2
38#ifdef __LITTLE_ENDIAN__
39	addi r3,-1,r4
40	addi r2,-1,r2
41	msad.ubq r3,r4,r2
42#else
43	shlri r3,1,r3
44	nsb r3,r3
45	shlri r3,3,r3
46	add r2,r3,r2
47#endif
48	blink tr0,r63
49
50#else /* ! __SHMEDIA__, i.e. SH 1..4 / SHcompact */
51
52#ifdef __SH5__
53#define STR_INIT r2
54#define STR_ORIG r0
55#define STR_COPY STR_ORIG
56#define MASK r1
57#define TMP r3
58#define RESULT r2
59!        r0,r1,r3: clobbered
60#else
61#define STR_INIT r4
62#define STR_ORIG STR_INIT
63#define STR_COPY STR
64#define MASK r1
65#define TMP r3
66#define RESULT r0
67!        r1,r3: clobbered
68#endif
69#define STR RESULT
70
71	mov #3,MASK
72	and STR_INIT,MASK
73	tst MASK,MASK
74	SL(bf, L_char_loop, mov STR_INIT, STR_COPY)
75L_word_loop:
76	mov.l @STR+,TMP
77	cmp/str MASK,TMP
78	bf L_word_loop
79	add #-4,STR
80L_char_loop:
81	mov.b @STR+,TMP
82	tst TMP,TMP
83	bf L_char_loop
84	add #-1,STR
85	rts
86	sub STR_ORIG,STR
87#endif /* ! __SHMEDIA__ */
88