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