18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
38c2ecf20Sopenharmony_ci
48c2ecf20Sopenharmony_ci#include <linux/linkage.h>
58c2ecf20Sopenharmony_ci#include "sysdep.h"
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ciENTRY(strcmp)
88c2ecf20Sopenharmony_ci	mov	a3, a0
98c2ecf20Sopenharmony_ci	/* Check if the s1 addr is aligned.  */
108c2ecf20Sopenharmony_ci	xor	a2, a3, a1
118c2ecf20Sopenharmony_ci	andi	a2, 0x3
128c2ecf20Sopenharmony_ci	bnez	a2, 7f
138c2ecf20Sopenharmony_ci	andi	t1, a0, 0x3
148c2ecf20Sopenharmony_ci	bnez	t1, 5f
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_ci1:
178c2ecf20Sopenharmony_ci	/* If aligned, load word each time.  */
188c2ecf20Sopenharmony_ci	ldw	t0, (a3, 0)
198c2ecf20Sopenharmony_ci	ldw	t1, (a1, 0)
208c2ecf20Sopenharmony_ci	/* If s1[i] != s2[i], goto 2f.  */
218c2ecf20Sopenharmony_ci	cmpne   t0, t1
228c2ecf20Sopenharmony_ci	bt      2f
238c2ecf20Sopenharmony_ci	/* If s1[i] == s2[i], check if s1 or s2 is at the end.  */
248c2ecf20Sopenharmony_ci	tstnbz	t0
258c2ecf20Sopenharmony_ci	/* If at the end, goto 3f (finish comparing).  */
268c2ecf20Sopenharmony_ci	bf	3f
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_ci	ldw	t0, (a3, 4)
298c2ecf20Sopenharmony_ci	ldw	t1, (a1, 4)
308c2ecf20Sopenharmony_ci	cmpne	t0, t1
318c2ecf20Sopenharmony_ci	bt	2f
328c2ecf20Sopenharmony_ci	tstnbz	t0
338c2ecf20Sopenharmony_ci	bf	3f
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_ci	ldw	t0, (a3, 8)
368c2ecf20Sopenharmony_ci	ldw	t1, (a1, 8)
378c2ecf20Sopenharmony_ci	cmpne	t0, t1
388c2ecf20Sopenharmony_ci	bt	2f
398c2ecf20Sopenharmony_ci	tstnbz	t0
408c2ecf20Sopenharmony_ci	bf	3f
418c2ecf20Sopenharmony_ci
428c2ecf20Sopenharmony_ci	ldw	t0, (a3, 12)
438c2ecf20Sopenharmony_ci	ldw	t1, (a1, 12)
448c2ecf20Sopenharmony_ci	cmpne	t0, t1
458c2ecf20Sopenharmony_ci	bt	2f
468c2ecf20Sopenharmony_ci	tstnbz	t0
478c2ecf20Sopenharmony_ci	bf	3f
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_ci	ldw	t0, (a3, 16)
508c2ecf20Sopenharmony_ci	ldw	t1, (a1, 16)
518c2ecf20Sopenharmony_ci	cmpne	t0, t1
528c2ecf20Sopenharmony_ci	bt	2f
538c2ecf20Sopenharmony_ci	tstnbz	t0
548c2ecf20Sopenharmony_ci	bf	3f
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_ci	ldw	t0, (a3, 20)
578c2ecf20Sopenharmony_ci	ldw	t1, (a1, 20)
588c2ecf20Sopenharmony_ci	cmpne	t0, t1
598c2ecf20Sopenharmony_ci	bt	2f
608c2ecf20Sopenharmony_ci	tstnbz	t0
618c2ecf20Sopenharmony_ci	bf	3f
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_ci	ldw	t0, (a3, 24)
648c2ecf20Sopenharmony_ci	ldw	t1, (a1, 24)
658c2ecf20Sopenharmony_ci	cmpne	t0, t1
668c2ecf20Sopenharmony_ci	bt	2f
678c2ecf20Sopenharmony_ci	tstnbz	t0
688c2ecf20Sopenharmony_ci	bf	3f
698c2ecf20Sopenharmony_ci
708c2ecf20Sopenharmony_ci	ldw	t0, (a3, 28)
718c2ecf20Sopenharmony_ci	ldw	t1, (a1, 28)
728c2ecf20Sopenharmony_ci	cmpne	t0, t1
738c2ecf20Sopenharmony_ci	bt	2f
748c2ecf20Sopenharmony_ci	tstnbz	t0
758c2ecf20Sopenharmony_ci	bf	3f
768c2ecf20Sopenharmony_ci
778c2ecf20Sopenharmony_ci	addi	a3, 32
788c2ecf20Sopenharmony_ci	addi	a1, 32
798c2ecf20Sopenharmony_ci
808c2ecf20Sopenharmony_ci	br	1b
818c2ecf20Sopenharmony_ci
828c2ecf20Sopenharmony_ci# ifdef __CSKYBE__
838c2ecf20Sopenharmony_ci	/* d[i] != s[i] in word, so we check byte 0.  */
848c2ecf20Sopenharmony_ci2:
858c2ecf20Sopenharmony_ci	xtrb0   a0, t0
868c2ecf20Sopenharmony_ci	xtrb0   a2, t1
878c2ecf20Sopenharmony_ci	subu    a0, a2
888c2ecf20Sopenharmony_ci	bez     a2, 4f
898c2ecf20Sopenharmony_ci	bnez    a0, 4f
908c2ecf20Sopenharmony_ci
918c2ecf20Sopenharmony_ci	/* check byte 1 */
928c2ecf20Sopenharmony_ci	xtrb1   a0, t0
938c2ecf20Sopenharmony_ci	xtrb1   a2, t1
948c2ecf20Sopenharmony_ci	subu    a0, a2
958c2ecf20Sopenharmony_ci	bez     a2, 4f
968c2ecf20Sopenharmony_ci	bnez    a0, 4f
978c2ecf20Sopenharmony_ci
988c2ecf20Sopenharmony_ci	/* check byte 2 */
998c2ecf20Sopenharmony_ci	xtrb2   a0, t0
1008c2ecf20Sopenharmony_ci	xtrb2   a2, t1
1018c2ecf20Sopenharmony_ci	subu    a0, a2
1028c2ecf20Sopenharmony_ci	bez     a2, 4f
1038c2ecf20Sopenharmony_ci	bnez    a0, 4f
1048c2ecf20Sopenharmony_ci
1058c2ecf20Sopenharmony_ci	/* check byte 3 */
1068c2ecf20Sopenharmony_ci	xtrb3   a0, t0
1078c2ecf20Sopenharmony_ci	xtrb3   a2, t1
1088c2ecf20Sopenharmony_ci	subu    a0, a2
1098c2ecf20Sopenharmony_ci# else
1108c2ecf20Sopenharmony_ci	/* s1[i] != s2[i] in word, so we check byte 3.  */
1118c2ecf20Sopenharmony_ci2:
1128c2ecf20Sopenharmony_ci	xtrb3	a0, t0
1138c2ecf20Sopenharmony_ci	xtrb3	a2, t1
1148c2ecf20Sopenharmony_ci	subu    a0, a2
1158c2ecf20Sopenharmony_ci	bez     a2, 4f
1168c2ecf20Sopenharmony_ci	bnez    a0, 4f
1178c2ecf20Sopenharmony_ci
1188c2ecf20Sopenharmony_ci	/* check byte 2 */
1198c2ecf20Sopenharmony_ci	xtrb2	a0, t0
1208c2ecf20Sopenharmony_ci	xtrb2	a2, t1
1218c2ecf20Sopenharmony_ci	subu    a0, a2
1228c2ecf20Sopenharmony_ci	bez     a2, 4f
1238c2ecf20Sopenharmony_ci	bnez    a0, 4f
1248c2ecf20Sopenharmony_ci
1258c2ecf20Sopenharmony_ci	/* check byte 1 */
1268c2ecf20Sopenharmony_ci	xtrb1	a0, t0
1278c2ecf20Sopenharmony_ci	xtrb1	a2, t1
1288c2ecf20Sopenharmony_ci	subu	a0, a2
1298c2ecf20Sopenharmony_ci	bez	a2, 4f
1308c2ecf20Sopenharmony_ci	bnez    a0, 4f
1318c2ecf20Sopenharmony_ci
1328c2ecf20Sopenharmony_ci	/* check byte 0 */
1338c2ecf20Sopenharmony_ci	xtrb0	a0, t0
1348c2ecf20Sopenharmony_ci	xtrb0	a2, t1
1358c2ecf20Sopenharmony_ci	subu	a0, a2
1368c2ecf20Sopenharmony_ci
1378c2ecf20Sopenharmony_ci# endif /* !__CSKYBE__ */
1388c2ecf20Sopenharmony_ci	jmp     lr
1398c2ecf20Sopenharmony_ci3:
1408c2ecf20Sopenharmony_ci	movi	a0, 0
1418c2ecf20Sopenharmony_ci4:
1428c2ecf20Sopenharmony_ci	jmp     lr
1438c2ecf20Sopenharmony_ci
1448c2ecf20Sopenharmony_ci	/* Compare when s1 or s2 is not aligned.  */
1458c2ecf20Sopenharmony_ci5:
1468c2ecf20Sopenharmony_ci	subi    t1, 4
1478c2ecf20Sopenharmony_ci6:
1488c2ecf20Sopenharmony_ci	ldb	a0, (a3, 0)
1498c2ecf20Sopenharmony_ci	ldb	a2, (a1, 0)
1508c2ecf20Sopenharmony_ci	subu	a0, a2
1518c2ecf20Sopenharmony_ci	bez	a2, 4b
1528c2ecf20Sopenharmony_ci	bnez	a0, 4b
1538c2ecf20Sopenharmony_ci	addi    t1, 1
1548c2ecf20Sopenharmony_ci	addi	a1, 1
1558c2ecf20Sopenharmony_ci	addi	a3, 1
1568c2ecf20Sopenharmony_ci	bnez	t1, 6b
1578c2ecf20Sopenharmony_ci	br	1b
1588c2ecf20Sopenharmony_ci
1598c2ecf20Sopenharmony_ci7:
1608c2ecf20Sopenharmony_ci	ldb	a0, (a3, 0)
1618c2ecf20Sopenharmony_ci	addi	a3, 1
1628c2ecf20Sopenharmony_ci	ldb	a2, (a1, 0)
1638c2ecf20Sopenharmony_ci	addi	a1, 1
1648c2ecf20Sopenharmony_ci	subu    a0, a2
1658c2ecf20Sopenharmony_ci	bnez    a0, 4b
1668c2ecf20Sopenharmony_ci	bnez	a2, 7b
1678c2ecf20Sopenharmony_ci	jmp	r15
1688c2ecf20Sopenharmony_ciENDPROC(strcmp)
169