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 | |