Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/csky/abiv2/strcpy.S
26469 views
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
125