Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/csky/abiv2/strcmp.S
26439 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(strcmp)
8
mov a3, a0
9
/* Check if the s1 addr is aligned. */
10
xor a2, a3, a1
11
andi a2, 0x3
12
bnez a2, 7f
13
andi t1, a0, 0x3
14
bnez t1, 5f
15
16
1:
17
/* If aligned, load word each time. */
18
ldw t0, (a3, 0)
19
ldw t1, (a1, 0)
20
/* If s1[i] != s2[i], goto 2f. */
21
cmpne t0, t1
22
bt 2f
23
/* If s1[i] == s2[i], check if s1 or s2 is at the end. */
24
tstnbz t0
25
/* If at the end, goto 3f (finish comparing). */
26
bf 3f
27
28
ldw t0, (a3, 4)
29
ldw t1, (a1, 4)
30
cmpne t0, t1
31
bt 2f
32
tstnbz t0
33
bf 3f
34
35
ldw t0, (a3, 8)
36
ldw t1, (a1, 8)
37
cmpne t0, t1
38
bt 2f
39
tstnbz t0
40
bf 3f
41
42
ldw t0, (a3, 12)
43
ldw t1, (a1, 12)
44
cmpne t0, t1
45
bt 2f
46
tstnbz t0
47
bf 3f
48
49
ldw t0, (a3, 16)
50
ldw t1, (a1, 16)
51
cmpne t0, t1
52
bt 2f
53
tstnbz t0
54
bf 3f
55
56
ldw t0, (a3, 20)
57
ldw t1, (a1, 20)
58
cmpne t0, t1
59
bt 2f
60
tstnbz t0
61
bf 3f
62
63
ldw t0, (a3, 24)
64
ldw t1, (a1, 24)
65
cmpne t0, t1
66
bt 2f
67
tstnbz t0
68
bf 3f
69
70
ldw t0, (a3, 28)
71
ldw t1, (a1, 28)
72
cmpne t0, t1
73
bt 2f
74
tstnbz t0
75
bf 3f
76
77
addi a3, 32
78
addi a1, 32
79
80
br 1b
81
82
# ifdef __CSKYBE__
83
/* d[i] != s[i] in word, so we check byte 0. */
84
2:
85
xtrb0 a0, t0
86
xtrb0 a2, t1
87
subu a0, a2
88
bez a2, 4f
89
bnez a0, 4f
90
91
/* check byte 1 */
92
xtrb1 a0, t0
93
xtrb1 a2, t1
94
subu a0, a2
95
bez a2, 4f
96
bnez a0, 4f
97
98
/* check byte 2 */
99
xtrb2 a0, t0
100
xtrb2 a2, t1
101
subu a0, a2
102
bez a2, 4f
103
bnez a0, 4f
104
105
/* check byte 3 */
106
xtrb3 a0, t0
107
xtrb3 a2, t1
108
subu a0, a2
109
# else
110
/* s1[i] != s2[i] in word, so we check byte 3. */
111
2:
112
xtrb3 a0, t0
113
xtrb3 a2, t1
114
subu a0, a2
115
bez a2, 4f
116
bnez a0, 4f
117
118
/* check byte 2 */
119
xtrb2 a0, t0
120
xtrb2 a2, t1
121
subu a0, a2
122
bez a2, 4f
123
bnez a0, 4f
124
125
/* check byte 1 */
126
xtrb1 a0, t0
127
xtrb1 a2, t1
128
subu a0, a2
129
bez a2, 4f
130
bnez a0, 4f
131
132
/* check byte 0 */
133
xtrb0 a0, t0
134
xtrb0 a2, t1
135
subu a0, a2
136
137
# endif /* !__CSKYBE__ */
138
jmp lr
139
3:
140
movi a0, 0
141
4:
142
jmp lr
143
144
/* Compare when s1 or s2 is not aligned. */
145
5:
146
subi t1, 4
147
6:
148
ldb a0, (a3, 0)
149
ldb a2, (a1, 0)
150
subu a0, a2
151
bez a2, 4b
152
bnez a0, 4b
153
addi t1, 1
154
addi a1, 1
155
addi a3, 1
156
bnez t1, 6b
157
br 1b
158
159
7:
160
ldb a0, (a3, 0)
161
addi a3, 1
162
ldb a2, (a1, 0)
163
addi a1, 1
164
subu a0, a2
165
bnez a0, 4b
166
bnez a2, 7b
167
jmp r15
168
ENDPROC(strcmp)
169
170