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