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(strcpy)
88c2ecf20Sopenharmony_ci	mov	a3, a0
98c2ecf20Sopenharmony_ci	/* Check if the src addr is aligned.  */
108c2ecf20Sopenharmony_ci        andi    t0, a1, 3
118c2ecf20Sopenharmony_ci        bnez	t0, 11f
128c2ecf20Sopenharmony_ci1:
138c2ecf20Sopenharmony_ci	/* Check if all the bytes in the word are not zero.  */
148c2ecf20Sopenharmony_ci	ldw	a2, (a1)
158c2ecf20Sopenharmony_ci	tstnbz	a2
168c2ecf20Sopenharmony_ci	bf	9f
178c2ecf20Sopenharmony_ci	stw	a2, (a3)
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ci	ldw	a2, (a1, 4)
208c2ecf20Sopenharmony_ci	tstnbz	a2
218c2ecf20Sopenharmony_ci	bf	2f
228c2ecf20Sopenharmony_ci	stw	a2, (a3, 4)
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_ci	ldw	a2, (a1, 8)
258c2ecf20Sopenharmony_ci	tstnbz	a2
268c2ecf20Sopenharmony_ci	bf	3f
278c2ecf20Sopenharmony_ci	stw	a2, (a3, 8)
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ci	ldw	a2, (a1, 12)
308c2ecf20Sopenharmony_ci	tstnbz	a2
318c2ecf20Sopenharmony_ci	bf	4f
328c2ecf20Sopenharmony_ci	stw	a2, (a3, 12)
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_ci	ldw	a2, (a1, 16)
358c2ecf20Sopenharmony_ci	tstnbz	a2
368c2ecf20Sopenharmony_ci	bf	5f
378c2ecf20Sopenharmony_ci	stw	a2, (a3, 16)
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci	ldw	a2, (a1, 20)
408c2ecf20Sopenharmony_ci	tstnbz	a2
418c2ecf20Sopenharmony_ci	bf	6f
428c2ecf20Sopenharmony_ci	stw	a2, (a3, 20)
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci	ldw	a2, (a1, 24)
458c2ecf20Sopenharmony_ci	tstnbz	a2
468c2ecf20Sopenharmony_ci	bf	7f
478c2ecf20Sopenharmony_ci	stw	a2, (a3, 24)
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_ci	ldw	a2, (a1, 28)
508c2ecf20Sopenharmony_ci	tstnbz	a2
518c2ecf20Sopenharmony_ci	bf	8f
528c2ecf20Sopenharmony_ci	stw	a2, (a3, 28)
538c2ecf20Sopenharmony_ci
548c2ecf20Sopenharmony_ci	addi	a3, 32
558c2ecf20Sopenharmony_ci	addi	a1, 32
568c2ecf20Sopenharmony_ci	br	1b
578c2ecf20Sopenharmony_ci
588c2ecf20Sopenharmony_ci
598c2ecf20Sopenharmony_ci2:
608c2ecf20Sopenharmony_ci	addi	a3, 4
618c2ecf20Sopenharmony_ci	br	9f
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_ci3:
648c2ecf20Sopenharmony_ci	addi	a3, 8
658c2ecf20Sopenharmony_ci	br	9f
668c2ecf20Sopenharmony_ci
678c2ecf20Sopenharmony_ci4:
688c2ecf20Sopenharmony_ci	addi	a3, 12
698c2ecf20Sopenharmony_ci	br	9f
708c2ecf20Sopenharmony_ci
718c2ecf20Sopenharmony_ci5:
728c2ecf20Sopenharmony_ci	addi	a3, 16
738c2ecf20Sopenharmony_ci	br	9f
748c2ecf20Sopenharmony_ci
758c2ecf20Sopenharmony_ci6:
768c2ecf20Sopenharmony_ci	addi	a3, 20
778c2ecf20Sopenharmony_ci	br	9f
788c2ecf20Sopenharmony_ci
798c2ecf20Sopenharmony_ci7:
808c2ecf20Sopenharmony_ci	addi	a3, 24
818c2ecf20Sopenharmony_ci	br	9f
828c2ecf20Sopenharmony_ci
838c2ecf20Sopenharmony_ci8:
848c2ecf20Sopenharmony_ci	addi	a3, 28
858c2ecf20Sopenharmony_ci9:
868c2ecf20Sopenharmony_ci# ifdef __CSKYBE__
878c2ecf20Sopenharmony_ci	xtrb0	t0, a2
888c2ecf20Sopenharmony_ci	st.b	t0, (a3)
898c2ecf20Sopenharmony_ci	bez	t0, 10f
908c2ecf20Sopenharmony_ci	xtrb1	t0, a2
918c2ecf20Sopenharmony_ci	st.b	t0, (a3, 1)
928c2ecf20Sopenharmony_ci	bez	t0, 10f
938c2ecf20Sopenharmony_ci	xtrb2	t0, a2
948c2ecf20Sopenharmony_ci	st.b	t0, (a3, 2)
958c2ecf20Sopenharmony_ci	bez	t0, 10f
968c2ecf20Sopenharmony_ci	stw	a2, (a3)
978c2ecf20Sopenharmony_ci# else
988c2ecf20Sopenharmony_ci	xtrb3	t0, a2
998c2ecf20Sopenharmony_ci	st.b	t0, (a3)
1008c2ecf20Sopenharmony_ci	bez	t0, 10f
1018c2ecf20Sopenharmony_ci	xtrb2	t0, a2
1028c2ecf20Sopenharmony_ci	st.b	t0, (a3, 1)
1038c2ecf20Sopenharmony_ci	bez	t0, 10f
1048c2ecf20Sopenharmony_ci	xtrb1	t0, a2
1058c2ecf20Sopenharmony_ci	st.b	t0, (a3, 2)
1068c2ecf20Sopenharmony_ci	bez	t0, 10f
1078c2ecf20Sopenharmony_ci	stw	a2, (a3)
1088c2ecf20Sopenharmony_ci# endif	/* !__CSKYBE__ */
1098c2ecf20Sopenharmony_ci10:
1108c2ecf20Sopenharmony_ci	jmp	lr
1118c2ecf20Sopenharmony_ci
1128c2ecf20Sopenharmony_ci11:
1138c2ecf20Sopenharmony_ci	subi    t0, 4
1148c2ecf20Sopenharmony_ci12:
1158c2ecf20Sopenharmony_ci        ld.b    a2, (a1)
1168c2ecf20Sopenharmony_ci        st.b	a2, (a3)
1178c2ecf20Sopenharmony_ci        bez	a2, 10b
1188c2ecf20Sopenharmony_ci	addi    t0, 1
1198c2ecf20Sopenharmony_ci        addi    a1, a1, 1
1208c2ecf20Sopenharmony_ci        addi    a3, a3, 1
1218c2ecf20Sopenharmony_ci	bnez	t0, 12b
1228c2ecf20Sopenharmony_ci	jbr	1b
1238c2ecf20Sopenharmony_ciENDPROC(strcpy)
124