]>
Commit | Line | Data |
---|---|---|
c5af58b7 GR |
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) |