Merge tag 'led-fixes-for-4.20-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / arch / csky / abiv2 / strlen.S
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
7 ENTRY(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
97 ENDPROC(strlen)