88 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
| ! 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__ */
 |