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