Linux 6.13-rc4
[linux.git] / arch / sh / lib / strlen.S
blob80ea53dd34f6dd2298b95d0610b83ffc202a2958
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  */
10 /* size_t strlen (const char *s)  */
12 #include <linux/linkage.h>
13 ENTRY(strlen)
14         mov     r4,r0
15         and     #3,r0
16         tst     r0,r0
17         bt/s    1f
18          mov    #0,r2
20         add     #-1,r0
21         shll2   r0
22         shll    r0
23         braf    r0
24          nop
26         mov.b   @r4+,r1
27         tst     r1,r1
28         bt      8f
29         add     #1,r2
31         mov.b   @r4+,r1
32         tst     r1,r1
33         bt      8f
34         add     #1,r2
36         mov.b   @r4+,r1
37         tst     r1,r1
38         bt      8f
39         add     #1,r2
42         mov     #0,r3
44         mov.l   @r4+,r1
45         cmp/str r3,r1
46         bf/s    2b
47          add    #4,r2
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
70         rts
71          mov    r2,r0