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