xref: /linux/arch/csky/abiv2/strcpy.S (revision 3eb66e91a25497065c5322b1268cbc3953642227)
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(strcpy)
8*c5af58b7SGuo Ren	mov	a3, a0
9*c5af58b7SGuo Ren	/* Check if the src addr is aligned.  */
10*c5af58b7SGuo Ren        andi    t0, a1, 3
11*c5af58b7SGuo Ren        bnez	t0, 11f
12*c5af58b7SGuo Ren1:
13*c5af58b7SGuo Ren	/* Check if all the bytes in the word are not zero.  */
14*c5af58b7SGuo Ren	ldw	a2, (a1)
15*c5af58b7SGuo Ren	tstnbz	a2
16*c5af58b7SGuo Ren	bf	9f
17*c5af58b7SGuo Ren	stw	a2, (a3)
18*c5af58b7SGuo Ren
19*c5af58b7SGuo Ren	ldw	a2, (a1, 4)
20*c5af58b7SGuo Ren	tstnbz	a2
21*c5af58b7SGuo Ren	bf	2f
22*c5af58b7SGuo Ren	stw	a2, (a3, 4)
23*c5af58b7SGuo Ren
24*c5af58b7SGuo Ren	ldw	a2, (a1, 8)
25*c5af58b7SGuo Ren	tstnbz	a2
26*c5af58b7SGuo Ren	bf	3f
27*c5af58b7SGuo Ren	stw	a2, (a3, 8)
28*c5af58b7SGuo Ren
29*c5af58b7SGuo Ren	ldw	a2, (a1, 12)
30*c5af58b7SGuo Ren	tstnbz	a2
31*c5af58b7SGuo Ren	bf	4f
32*c5af58b7SGuo Ren	stw	a2, (a3, 12)
33*c5af58b7SGuo Ren
34*c5af58b7SGuo Ren	ldw	a2, (a1, 16)
35*c5af58b7SGuo Ren	tstnbz	a2
36*c5af58b7SGuo Ren	bf	5f
37*c5af58b7SGuo Ren	stw	a2, (a3, 16)
38*c5af58b7SGuo Ren
39*c5af58b7SGuo Ren	ldw	a2, (a1, 20)
40*c5af58b7SGuo Ren	tstnbz	a2
41*c5af58b7SGuo Ren	bf	6f
42*c5af58b7SGuo Ren	stw	a2, (a3, 20)
43*c5af58b7SGuo Ren
44*c5af58b7SGuo Ren	ldw	a2, (a1, 24)
45*c5af58b7SGuo Ren	tstnbz	a2
46*c5af58b7SGuo Ren	bf	7f
47*c5af58b7SGuo Ren	stw	a2, (a3, 24)
48*c5af58b7SGuo Ren
49*c5af58b7SGuo Ren	ldw	a2, (a1, 28)
50*c5af58b7SGuo Ren	tstnbz	a2
51*c5af58b7SGuo Ren	bf	8f
52*c5af58b7SGuo Ren	stw	a2, (a3, 28)
53*c5af58b7SGuo Ren
54*c5af58b7SGuo Ren	addi	a3, 32
55*c5af58b7SGuo Ren	addi	a1, 32
56*c5af58b7SGuo Ren	br	1b
57*c5af58b7SGuo Ren
58*c5af58b7SGuo Ren
59*c5af58b7SGuo Ren2:
60*c5af58b7SGuo Ren	addi	a3, 4
61*c5af58b7SGuo Ren	br	9f
62*c5af58b7SGuo Ren
63*c5af58b7SGuo Ren3:
64*c5af58b7SGuo Ren	addi	a3, 8
65*c5af58b7SGuo Ren	br	9f
66*c5af58b7SGuo Ren
67*c5af58b7SGuo Ren4:
68*c5af58b7SGuo Ren	addi	a3, 12
69*c5af58b7SGuo Ren	br	9f
70*c5af58b7SGuo Ren
71*c5af58b7SGuo Ren5:
72*c5af58b7SGuo Ren	addi	a3, 16
73*c5af58b7SGuo Ren	br	9f
74*c5af58b7SGuo Ren
75*c5af58b7SGuo Ren6:
76*c5af58b7SGuo Ren	addi	a3, 20
77*c5af58b7SGuo Ren	br	9f
78*c5af58b7SGuo Ren
79*c5af58b7SGuo Ren7:
80*c5af58b7SGuo Ren	addi	a3, 24
81*c5af58b7SGuo Ren	br	9f
82*c5af58b7SGuo Ren
83*c5af58b7SGuo Ren8:
84*c5af58b7SGuo Ren	addi	a3, 28
85*c5af58b7SGuo Ren9:
86*c5af58b7SGuo Ren# ifdef __CSKYBE__
87*c5af58b7SGuo Ren	xtrb0	t0, a2
88*c5af58b7SGuo Ren	st.b	t0, (a3)
89*c5af58b7SGuo Ren	bez	t0, 10f
90*c5af58b7SGuo Ren	xtrb1	t0, a2
91*c5af58b7SGuo Ren	st.b	t0, (a3, 1)
92*c5af58b7SGuo Ren	bez	t0, 10f
93*c5af58b7SGuo Ren	xtrb2	t0, a2
94*c5af58b7SGuo Ren	st.b	t0, (a3, 2)
95*c5af58b7SGuo Ren	bez	t0, 10f
96*c5af58b7SGuo Ren	stw	a2, (a3)
97*c5af58b7SGuo Ren# else
98*c5af58b7SGuo Ren	xtrb3	t0, a2
99*c5af58b7SGuo Ren	st.b	t0, (a3)
100*c5af58b7SGuo Ren	bez	t0, 10f
101*c5af58b7SGuo Ren	xtrb2	t0, a2
102*c5af58b7SGuo Ren	st.b	t0, (a3, 1)
103*c5af58b7SGuo Ren	bez	t0, 10f
104*c5af58b7SGuo Ren	xtrb1	t0, a2
105*c5af58b7SGuo Ren	st.b	t0, (a3, 2)
106*c5af58b7SGuo Ren	bez	t0, 10f
107*c5af58b7SGuo Ren	stw	a2, (a3)
108*c5af58b7SGuo Ren# endif	/* !__CSKYBE__ */
109*c5af58b7SGuo Ren10:
110*c5af58b7SGuo Ren	jmp	lr
111*c5af58b7SGuo Ren
112*c5af58b7SGuo Ren11:
113*c5af58b7SGuo Ren	subi    t0, 4
114*c5af58b7SGuo Ren12:
115*c5af58b7SGuo Ren        ld.b    a2, (a1)
116*c5af58b7SGuo Ren        st.b	a2, (a3)
117*c5af58b7SGuo Ren        bez	a2, 10b
118*c5af58b7SGuo Ren	addi    t0, 1
119*c5af58b7SGuo Ren        addi    a1, a1, 1
120*c5af58b7SGuo Ren        addi    a3, a3, 1
121*c5af58b7SGuo Ren	bnez	t0, 12b
122*c5af58b7SGuo Ren	jbr	1b
123*c5af58b7SGuo RenENDPROC(strcpy)
124