xref: /linux/arch/csky/abiv2/strcpy.S (revision c532de5a67a70f8533d495f8f2aaa9a0491c3ad0)
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
7ENTRY(strcpy)
8	mov	a3, a0
9	/* Check if the src addr is aligned.  */
10        andi    t0, a1, 3
11        bnez	t0, 11f
121:
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
592:
60	addi	a3, 4
61	br	9f
62
633:
64	addi	a3, 8
65	br	9f
66
674:
68	addi	a3, 12
69	br	9f
70
715:
72	addi	a3, 16
73	br	9f
74
756:
76	addi	a3, 20
77	br	9f
78
797:
80	addi	a3, 24
81	br	9f
82
838:
84	addi	a3, 28
859:
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__ */
10910:
110	jmp	lr
111
11211:
113	subi    t0, 4
11412:
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
123ENDPROC(strcpy)
124