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