|  | /* SPDX-License-Identifier: GPL-2.0 */ | 
|  | /* $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 |