Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/sh/lib/memcpy.S
26439 views
1
/* SPDX-License-Identifier: GPL-2.0 */
2
/* $Id: memcpy.S,v 1.3 2001/07/27 11:50:52 gniibe Exp $
3
*
4
* "memcpy" implementation of SuperH
5
*
6
* Copyright (C) 1999 Niibe Yutaka
7
*
8
*/
9
10
/*
11
* void *memcpy(void *dst, const void *src, size_t n);
12
* No overlap between the memory of DST and of SRC are assumed.
13
*/
14
15
#include <linux/linkage.h>
16
ENTRY(memcpy)
17
tst r6,r6
18
bt/s 9f ! if n=0, do nothing
19
mov r4,r0
20
sub r4,r5 ! From here, r5 has the distance to r0
21
add r6,r0 ! From here, r0 points the end of copying point
22
mov #12,r1
23
cmp/gt r6,r1
24
bt/s 7f ! if it's too small, copy a byte at once
25
add #-1,r5
26
add #1,r5
27
! From here, r6 is free
28
!
29
! r4 --> [ ... ] DST [ ... ] SRC
30
! [ ... ] [ ... ]
31
! : :
32
! r0 --> [ ... ] r0+r5 --> [ ... ]
33
!
34
!
35
mov r5,r1
36
mov #3,r2
37
and r2,r1
38
shll2 r1
39
mov r0,r3 ! Save the value on R0 to R3
40
mova jmptable,r0
41
add r1,r0
42
mov.l @r0,r1
43
jmp @r1
44
mov r3,r0 ! and back to R0
45
.balign 4
46
jmptable:
47
.long case0
48
.long case1
49
.long case2
50
.long case3
51
52
! copy a byte at once
53
7: mov r4,r2
54
add #1,r2
55
8:
56
cmp/hi r2,r0
57
mov.b @(r0,r5),r1
58
bt/s 8b ! while (r0>r2)
59
mov.b r1,@-r0
60
9:
61
rts
62
nop
63
64
case0:
65
!
66
! GHIJ KLMN OPQR --> GHIJ KLMN OPQR
67
!
68
! First, align to long word boundary
69
mov r0,r3
70
and r2,r3
71
tst r3,r3
72
bt/s 2f
73
add #-4,r5
74
add #3,r5
75
1: dt r3
76
mov.b @(r0,r5),r1
77
bf/s 1b
78
mov.b r1,@-r0
79
!
80
add #-3,r5
81
2: ! Second, copy a long word at once
82
mov r4,r2
83
add #7,r2
84
3: mov.l @(r0,r5),r1
85
cmp/hi r2,r0
86
bt/s 3b
87
mov.l r1,@-r0
88
!
89
! Third, copy a byte at once, if necessary
90
cmp/eq r4,r0
91
bt/s 9b
92
add #3,r5
93
bra 8b
94
add #-6,r2
95
96
case1:
97
!
98
! GHIJ KLMN OPQR --> ...G HIJK LMNO PQR.
99
!
100
! First, align to long word boundary
101
mov r0,r3
102
and r2,r3
103
tst r3,r3
104
bt/s 2f
105
add #-1,r5
106
1: dt r3
107
mov.b @(r0,r5),r1
108
bf/s 1b
109
mov.b r1,@-r0
110
!
111
2: ! Second, read a long word and write a long word at once
112
mov.l @(r0,r5),r1
113
add #-4,r5
114
mov r4,r2
115
add #7,r2
116
!
117
#ifdef __LITTLE_ENDIAN__
118
3: mov r1,r3 ! RQPO
119
shll16 r3
120
shll8 r3 ! Oxxx
121
mov.l @(r0,r5),r1 ! NMLK
122
mov r1,r6
123
shlr8 r6 ! xNML
124
or r6,r3 ! ONML
125
cmp/hi r2,r0
126
bt/s 3b
127
mov.l r3,@-r0
128
#else
129
3: mov r1,r3 ! OPQR
130
shlr16 r3
131
shlr8 r3 ! xxxO
132
mov.l @(r0,r5),r1 ! KLMN
133
mov r1,r6
134
shll8 r6 ! LMNx
135
or r6,r3 ! LMNO
136
cmp/hi r2,r0
137
bt/s 3b
138
mov.l r3,@-r0
139
#endif
140
!
141
! Third, copy a byte at once, if necessary
142
cmp/eq r4,r0
143
bt/s 9b
144
add #4,r5
145
bra 8b
146
add #-6,r2
147
148
case2:
149
!
150
! GHIJ KLMN OPQR --> ..GH IJKL MNOP QR..
151
!
152
! First, align to word boundary
153
tst #1,r0
154
bt/s 2f
155
add #-1,r5
156
mov.b @(r0,r5),r1
157
mov.b r1,@-r0
158
!
159
2: ! Second, read a word and write a word at once
160
add #-1,r5
161
mov r4,r2
162
add #3,r2
163
!
164
3: mov.w @(r0,r5),r1
165
cmp/hi r2,r0
166
bt/s 3b
167
mov.w r1,@-r0
168
!
169
! Third, copy a byte at once, if necessary
170
cmp/eq r4,r0
171
bt/s 9b
172
add #1,r5
173
mov.b @(r0,r5),r1
174
rts
175
mov.b r1,@-r0
176
177
case3:
178
!
179
! GHIJ KLMN OPQR --> .GHI JKLM NOPQ R...
180
!
181
! First, align to long word boundary
182
mov r0,r3
183
and r2,r3
184
tst r3,r3
185
bt/s 2f
186
add #-1,r5
187
1: dt r3
188
mov.b @(r0,r5),r1
189
bf/s 1b
190
mov.b r1,@-r0
191
!
192
2: ! Second, read a long word and write a long word at once
193
add #-2,r5
194
mov.l @(r0,r5),r1
195
add #-4,r5
196
mov r4,r2
197
add #7,r2
198
!
199
#ifdef __LITTLE_ENDIAN__
200
3: mov r1,r3 ! RQPO
201
shll8 r3 ! QPOx
202
mov.l @(r0,r5),r1 ! NMLK
203
mov r1,r6
204
shlr16 r6
205
shlr8 r6 ! xxxN
206
or r6,r3 ! QPON
207
cmp/hi r2,r0
208
bt/s 3b
209
mov.l r3,@-r0
210
#else
211
3: mov r1,r3 ! OPQR
212
shlr8 r3 ! xOPQ
213
mov.l @(r0,r5),r1 ! KLMN
214
mov r1,r6
215
shll16 r6
216
shll8 r6 ! Nxxx
217
or r6,r3 ! NOPQ
218
cmp/hi r2,r0
219
bt/s 3b
220
mov.l r3,@-r0
221
#endif
222
!
223
! Third, copy a byte at once, if necessary
224
cmp/eq r4,r0
225
bt/s 9b
226
add #6,r5
227
bra 8b
228
add #-6,r2
229
230