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> |
13 | ENTRY(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 | |
41 | 1: |
42 | mov #0,r3 |
43 | 2: |
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 |
69 | 8: |
70 | rts |
71 | mov r2,r0 |
72 | |