71 lines
		
	
	
		
			789 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			789 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
/* $Id: strlen.S,v 1.2 2001/06/29 14:07:15 gniibe Exp $
 | 
						|
 *
 | 
						|
 * "strlen" implementation of SuperH
 | 
						|
 *
 | 
						|
 * Copyright (C) 1999  Kaz Kojima
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
/* size_t strlen (const char *s)  */
 | 
						|
 | 
						|
#include <linux/linkage.h>
 | 
						|
ENTRY(strlen)
 | 
						|
	mov	r4,r0
 | 
						|
	and	#3,r0
 | 
						|
	tst	r0,r0
 | 
						|
	bt/s	1f
 | 
						|
	 mov	#0,r2
 | 
						|
 | 
						|
	add	#-1,r0
 | 
						|
	shll2	r0
 | 
						|
	shll	r0
 | 
						|
	braf	r0
 | 
						|
	 nop
 | 
						|
 | 
						|
	mov.b	@r4+,r1
 | 
						|
	tst	r1,r1
 | 
						|
	bt	8f
 | 
						|
	add	#1,r2
 | 
						|
 | 
						|
	mov.b	@r4+,r1
 | 
						|
	tst	r1,r1
 | 
						|
	bt	8f
 | 
						|
	add	#1,r2
 | 
						|
 | 
						|
	mov.b	@r4+,r1
 | 
						|
	tst	r1,r1
 | 
						|
	bt	8f
 | 
						|
	add	#1,r2	
 | 
						|
 | 
						|
1:
 | 
						|
	mov	#0,r3
 | 
						|
2:
 | 
						|
	mov.l	@r4+,r1
 | 
						|
	cmp/str	r3,r1
 | 
						|
	bf/s	2b
 | 
						|
	 add	#4,r2
 | 
						|
 | 
						|
	add	#-4,r2
 | 
						|
#ifndef __LITTLE_ENDIAN__
 | 
						|
	swap.b	r1,r1
 | 
						|
	swap.w	r1,r1
 | 
						|
	swap.b	r1,r1
 | 
						|
#endif
 | 
						|
	extu.b	r1,r0
 | 
						|
	tst	r0,r0
 | 
						|
	bt/s	8f
 | 
						|
	 shlr8	r1
 | 
						|
	add	#1,r2
 | 
						|
	extu.b	r1,r0
 | 
						|
	tst	r0,r0
 | 
						|
	bt/s	8f
 | 
						|
	 shlr8	r1
 | 
						|
	add	#1,r2
 | 
						|
	extu.b	r1,r0
 | 
						|
	tst	r0,r0
 | 
						|
	bt	8f
 | 
						|
	add	#1,r2
 | 
						|
8:
 | 
						|
	rts
 | 
						|
	 mov	r2,r0
 |