xref: /linux/arch/sh/lib/strlen.S (revision 827634added7f38b7d724cab1dccdb2b004c13c3)
1/* $Id: strlen.S,v 1.2 2001/06/29 14:07:15 gniibe Exp $
2 *
3 * "strlen" implementation of SuperH
4 *
5 * Copyright (C) 1999  Kaz Kojima
6 *
7 */
8
9/* size_t strlen (const char *s)  */
10
11#include <linux/linkage.h>
12ENTRY(strlen)
13	mov	r4,r0
14	and	#3,r0
15	tst	r0,r0
16	bt/s	1f
17	 mov	#0,r2
18
19	add	#-1,r0
20	shll2	r0
21	shll	r0
22	braf	r0
23	 nop
24
25	mov.b	@r4+,r1
26	tst	r1,r1
27	bt	8f
28	add	#1,r2
29
30	mov.b	@r4+,r1
31	tst	r1,r1
32	bt	8f
33	add	#1,r2
34
35	mov.b	@r4+,r1
36	tst	r1,r1
37	bt	8f
38	add	#1,r2
39
401:
41	mov	#0,r3
422:
43	mov.l	@r4+,r1
44	cmp/str	r3,r1
45	bf/s	2b
46	 add	#4,r2
47
48	add	#-4,r2
49#ifndef __LITTLE_ENDIAN__
50	swap.b	r1,r1
51	swap.w	r1,r1
52	swap.b	r1,r1
53#endif
54	extu.b	r1,r0
55	tst	r0,r0
56	bt/s	8f
57	 shlr8	r1
58	add	#1,r2
59	extu.b	r1,r0
60	tst	r0,r0
61	bt/s	8f
62	 shlr8	r1
63	add	#1,r2
64	extu.b	r1,r0
65	tst	r0,r0
66	bt	8f
67	add	#1,r2
688:
69	rts
70	 mov	r2,r0
71