Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/csky/abiv2/strlen.S
26424 views
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)
98
99