]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/blob - arch/csky/abiv2/strlen.S
Merge tag 'tee-optee-for-5.4' of git://git.linaro.org/people/jens.wiklander/linux...
[mirror_ubuntu-focal-kernel.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)