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