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