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 | |