1 /* SPDX-License-Identifier: GPL-2.0 */
2 // Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
3 
4 #include <linux/linkage.h>
5 #include "sysdep.h"
6 
7 ENTRY(strcpy)
8 	mov	a3, a0
9 	/* Check if the src addr is aligned.  */
10         andi    t0, a1, 3
11         bnez	t0, 11f
12 1:
13 	/* Check if all the bytes in the word are not zero.  */
14 	ldw	a2, (a1)
15 	tstnbz	a2
16 	bf	9f
17 	stw	a2, (a3)
18 
19 	ldw	a2, (a1, 4)
20 	tstnbz	a2
21 	bf	2f
22 	stw	a2, (a3, 4)
23 
24 	ldw	a2, (a1, 8)
25 	tstnbz	a2
26 	bf	3f
27 	stw	a2, (a3, 8)
28 
29 	ldw	a2, (a1, 12)
30 	tstnbz	a2
31 	bf	4f
32 	stw	a2, (a3, 12)
33 
34 	ldw	a2, (a1, 16)
35 	tstnbz	a2
36 	bf	5f
37 	stw	a2, (a3, 16)
38 
39 	ldw	a2, (a1, 20)
40 	tstnbz	a2
41 	bf	6f
42 	stw	a2, (a3, 20)
43 
44 	ldw	a2, (a1, 24)
45 	tstnbz	a2
46 	bf	7f
47 	stw	a2, (a3, 24)
48 
49 	ldw	a2, (a1, 28)
50 	tstnbz	a2
51 	bf	8f
52 	stw	a2, (a3, 28)
53 
54 	addi	a3, 32
55 	addi	a1, 32
56 	br	1b
57 
58 
59 2:
60 	addi	a3, 4
61 	br	9f
62 
63 3:
64 	addi	a3, 8
65 	br	9f
66 
67 4:
68 	addi	a3, 12
69 	br	9f
70 
71 5:
72 	addi	a3, 16
73 	br	9f
74 
75 6:
76 	addi	a3, 20
77 	br	9f
78 
79 7:
80 	addi	a3, 24
81 	br	9f
82 
83 8:
84 	addi	a3, 28
85 9:
86 # ifdef __CSKYBE__
87 	xtrb0	t0, a2
88 	st.b	t0, (a3)
89 	bez	t0, 10f
90 	xtrb1	t0, a2
91 	st.b	t0, (a3, 1)
92 	bez	t0, 10f
93 	xtrb2	t0, a2
94 	st.b	t0, (a3, 2)
95 	bez	t0, 10f
96 	stw	a2, (a3)
97 # else
98 	xtrb3	t0, a2
99 	st.b	t0, (a3)
100 	bez	t0, 10f
101 	xtrb2	t0, a2
102 	st.b	t0, (a3, 1)
103 	bez	t0, 10f
104 	xtrb1	t0, a2
105 	st.b	t0, (a3, 2)
106 	bez	t0, 10f
107 	stw	a2, (a3)
108 # endif	/* !__CSKYBE__ */
109 10:
110 	jmp	lr
111 
112 11:
113 	subi    t0, 4
114 12:
115         ld.b    a2, (a1)
116         st.b	a2, (a3)
117         bez	a2, 10b
118 	addi    t0, 1
119         addi    a1, a1, 1
120         addi    a3, a3, 1
121 	bnez	t0, 12b
122 	jbr	1b
123 ENDPROC(strcpy)
124