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

source code of linux/arch/sh/lib/strlen.S