Linux-libre 5.3.12-gnu
[librecmc/linux-libre.git] / arch / csky / abiv2 / strcpy.S
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)