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

strlen.S « sh « machine « libc « newlib - cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: b55b86b79958cd451a0fedac3993cec02045bd79 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
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__ */