1/* SPDX-License-Identifier: GPL-2.0 */
2// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
3
4#include <linux/linkage.h>
5#include "sysdep.h"
6
7ENTRY(strlen)
8 /* Check if the start addr is aligned. */
9 mov r3, r0
10 andi r1, r0, 3
11 movi r2, 4
12 movi r0, 0
13 bnez r1, .L_start_not_aligned
14
15 LABLE_ALIGN
16.L_start_addr_aligned:
17 /* Check if all the bytes in the word are not zero. */
18 ldw r1, (r3)
19 tstnbz r1
20 bf .L_string_tail
21
22 ldw r1, (r3, 4)
23 addi r0, 4
24 tstnbz r1
25 bf .L_string_tail
26
27 ldw r1, (r3, 8)
28 addi r0, 4
29 tstnbz r1
30 bf .L_string_tail
31
32 ldw r1, (r3, 12)
33 addi r0, 4
34 tstnbz r1
35 bf .L_string_tail
36
37 ldw r1, (r3, 16)
38 addi r0, 4
39 tstnbz r1
40 bf .L_string_tail
41
42 ldw r1, (r3, 20)
43 addi r0, 4
44 tstnbz r1
45 bf .L_string_tail
46
47 ldw r1, (r3, 24)
48 addi r0, 4
49 tstnbz r1
50 bf .L_string_tail
51
52 ldw r1, (r3, 28)
53 addi r0, 4
54 tstnbz r1
55 bf .L_string_tail
56
57 addi r0, 4
58 addi r3, 32
59 br .L_start_addr_aligned
60
61.L_string_tail:
62# ifdef __CSKYBE__
63 xtrb0 r3, r1
64 bez r3, .L_return
65 addi r0, 1
66 xtrb1 r3, r1
67 bez r3, .L_return
68 addi r0, 1
69 xtrb2 r3, r1
70 bez r3, .L_return
71 addi r0, 1
72# else
73 xtrb3 r3, r1
74 bez r3, .L_return
75 addi r0, 1
76 xtrb2 r3, r1
77 bez r3, .L_return
78 addi r0, 1
79 xtrb1 r3, r1
80 bez r3, .L_return
81 addi r0, 1
82# endif /* !__CSKYBE__ */
83
84.L_return:
85 rts
86
87.L_start_not_aligned:
88 sub r2, r2, r1
89.L_start_not_aligned_loop:
90 ldb r1, (r3)
91 PRE_BNEZAD (r2)
92 addi r3, 1
93 bez r1, .L_return
94 addi r0, 1
95 BNEZAD (r2, .L_start_not_aligned_loop)
96 br .L_start_addr_aligned
97ENDPROC(strlen)
98

source code of linux/arch/csky/abiv2/strlen.S