summaryrefslogtreecommitdiff
path: root/firmware/target/coldfire/memcpy-coldfire.S
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/coldfire/memcpy-coldfire.S')
-rw-r--r--firmware/target/coldfire/memcpy-coldfire.S440
1 files changed, 5 insertions, 435 deletions
diff --git a/firmware/target/coldfire/memcpy-coldfire.S b/firmware/target/coldfire/memcpy-coldfire.S
index dd1a8a66da..523e1f5ed9 100644
--- a/firmware/target/coldfire/memcpy-coldfire.S
+++ b/firmware/target/coldfire/memcpy-coldfire.S
@@ -38,8 +38,8 @@
38 * %d0 - destination address (like ANSI version) 38 * %d0 - destination address (like ANSI version)
39 * 39 *
40 * register usage: 40 * register usage:
41 * %a1 - current source address 41 * %a0 - current source address
42 * %a0 - current dest address 42 * %a1 - current dest address
43 * %a2 - source end address (in line-copy loops) 43 * %a2 - source end address (in line-copy loops)
44 * %d0 - data / scratch 44 * %d0 - data / scratch
45 * %d1 - source end address (byte and longword copy) / data / scratch 45 * %d1 - source end address (byte and longword copy) / data / scratch
@@ -52,439 +52,11 @@
52 * if FULLSPEED is undefined. 52 * if FULLSPEED is undefined.
53 */ 53 */
54memcpy: 54memcpy:
55 move.l (4, %sp), %a1 /* Destination */ 55 move.l (4,%sp),%a1 /* Destination */
56 move.l (8, %sp), %a0 /* Source */ 56 move.l (8,%sp),%a0 /* Source */
57 move.l (12, %sp), %d1 /* Length */ 57 move.l (12,%sp),%d1 /* Length */
58 58
59__memcpy_fwd_entry: 59__memcpy_fwd_entry:
60
61#if 1 /* CODE TEST */
62
63 cmp.l #5, %d1
64 bhs.b .min5
65
66 move.l %a1, %d0
67 jmp.l (2, %pc, %d1.l*4)
68.bytes_grid:
69 rts /* 0 */
70 nop
71.bytes_1:
72 move.b (%a0)+, (%a1)+ /* 1 */
73 rts
74 move.w (%a0)+, (%a1)+ /* 2 */
75 rts
76 move.w (%a0)+, (%a1)+ /* 3 */
77 bra.s .bytes_1
78 move.l (%a0)+, (%a1)+ /* 4 */
79 rts
80
81.min5:
82 move.l %a0, %d0
83 and.l #3, %d0
84 jmp.l (2, %pc, %d0.l*2)
85 bra.s .byte1_off0
86 bra.s .byte1_off1
87 bra.s .byte1_off2
88 /* last table entry coincides with target */
89
90.byte1_off3:
91 move.b (%a0)+, (%a1)+
92 subq.l #1, %d1
93 bra.s .byte1_off0
94
95.byte1_off1:
96 move.b (%a0)+, (%a1)+
97 subq.l #1, %d1
98.byte1_off2:
99 move.w (%a0)+, (%a1)+
100 subq.l #2, %d1
101.byte1_off0:
102
103 move.l %d1, %d0
104 cmp.l #16, %d0
105 bhs.b .min16
106
107.longs:
108 lsr.l #2, %d0 /* in longwords */
109 neg.l %d0
110 jmp.l (8, %pc, %d0.l*2)
111
112 move.l (%a0)+, (%a1)+
113 move.l (%a0)+, (%a1)+
114 move.l (%a0)+, (%a1)+
115 move.l (4, %sp), %d0
116 and.l #3, %d1
117 jmp.l (.bytes_grid - 2 - ., %pc, %d1.l*4)
118
119.min16:
120#if 0
121 lea.l (-44, %sp), %sp
122 movem.l %d2-%d7/%a2-%a6, (%sp)
123
124
125.main_do12_start:
126 lea.l (main_do12_loop - ., %pc), %a5
127 movem.l (%a0), %d6-%d7/%a2-%a3
128 bra.b .main_do12_headstore
129
130.main_do8_start:
131 lea.l (main_do8_loop - ., %pc), %a5
132 movem.l (%a0), %d5-%d7/%a2
133 bra.b .main_do8_headstore
134
135.main_do4_start:
136 lea.l (main_do4_loop - ., %pc), %a5
137 movem.l (%a0), %d4-%d7
138/* .main_do4_headstore: */
139 move.l %d4, (%a1)+
140.main_do8_headstore:
141 move.l %d5, (%a1)+
142.main_do12_headstore:
143 move.l %d6, (%a1)+
144 bra.b .main_bo0_check
145
146.main_do12_loop:
147 move.l %d7, %d3
148 move.l %a2, %d4
149 move.l %a3, %d5
150 movem.l (%a0), %d6-%d7/%a2-%a3
151 bra.b .main_bo0_store
152.main_do8_loop:
153 move.l %d7, %d3
154 move.l %a2, %d4
155 movem.l (%a0), %d5-%d7/%a2
156 bra.b .main_bo0_store
157.main_do4_loop:
158 move.l %d7, %d3
159 movem.l (%a0), %d4-%d7
160 bra.b .main_bo0_store
161.main_do0_loop:
162 movem.l (%a0), %d3-%d6
163.main_bo0_store:
164 lea.l (16, %a0), %a1
165 movem.l %d3-%d6, (%a1)
166 lea.l (16, %a1), %a1
167.main_do0_start:
168.main_bo0_check:
169 sub.l #16, %d1
170 blo.b .main_bo0_tail
171 jmp (%a5)
172
173.main_bo0_tail:
174
175
176
177.main_do13_start:
178 lea.l (main_do13_loop - ., %pc), %a5
179 movem.l (%a0), %d7/%a2-%a4
180 move.l %d7, %d0
181 lsr.l #8, %d0
182 swap %d0
183 move.b %d0, (%a1)+
184 swap %d0
185 move.w %d0, (%a1)+
186 bra.b .main_bo1_check
187
188.main_do9_start:
189 lea.l (main_do9_loop - ., %pc), %a5
190 movem.l (%a0), %d6-%d7/%a2-%a3
191 move.l %d6, %d0
192 lsr.l #8, %d0
193 swap %d0
194 move.b %d0, (%a1)+
195 swap %d0
196 move.w %d0, (%a1)+
197 bra.b .main_do9_headstore
198
199.main_do5_start:
200 lea.l (main_do5_loop - ., %pc), %a5
201 movem.l (%a0), %d5-%d7/%a2
202 move.l %d5, %d0
203 lsr.l #8, %d0
204 swap %d0
205 move.b %d0, (%a1)+
206 swap %d0
207 move.w %d0, (%a1)+
208 bra.b .main_do5_headstore
209
210.main_do1_start:
211 lea.l (main_do1_loop - ., %pc), %a5
212 movem.l (%a0), %d4-%d7
213 move.l %d4, %d0
214 lsr.l #8, %d0
215 swap %d0
216 move.b %d0, (%a1)+
217 swap %d0
218 move.w %d0, (%a1)+
219/* .main_do1_headstore: */
220 lsl.l %d2, %d4
221 move.l %d5, %d0
222 lsr.l #8, %d0
223 or.l %d0, %d4
224 move.l %d4, (%a1)+
225.main_do5_headstore:
226 lsl.l %d2, %d5
227 move.l %d6, %d0
228 lsr.l #8, %d0
229 or.l %d0, %d5
230 move.l %d5, (%a1)+
231.main_do9_headstore:
232 lsl.l %d2, %d6
233 move.l %d7, %d0
234 lsr.l #8, %d0
235 or.l %d0, %d6
236 move.l %d6, (%a1)+
237 bra.b .main_bo1_check
238
239.main_do13_loop:
240 move.l %d7, %d3
241 move.l %a2, %d4
242 move.l %a3, %d5
243 move.l %a4, %d6
244 movem.l (%a0), %d7/%a2-%a4
245 bra.b .main_bo1_store
246.main_do9_loop:
247 move.l %d7, %d3
248 move.l %a2, %d4
249 move.l %a3, %d5
250 movem.l (%a0), %d6-%d7/%a2-%a3
251 bra.b .main_bo1_store
252.main_do5_loop:
253 move.l %d7, %d3
254 move.l %a2, %d4
255 movem.l (%a0), %d5-%d7/%a2
256 bra.b .main_bo1_store
257.main_do1_loop:
258 move.l %d7, %d3
259 movem.l (%a0), %d4-%d7
260.main_bo1_store:
261 lea.l (16, %a0), %a1
262 lsl.l %d2, %d3
263 move.l %d4, %d0
264 lsr.l #8, %d0
265 or.l %d0, %d3
266 lsl.l %d2, %d4
267 move.l %d5, %d0
268 lsr.l #8, %d0
269 or.l %d0, %d4
270 lsl.l %d2, %d5
271 move.l %d6, %d0
272 lsr.l #8, %d0
273 or.l %d0, %d5
274 lsl.l %d2, %d6
275 move.l %d7, %d0
276 lsr.l #8, %d0
277 or.l %d0, %d6
278 movem.l %d3-%d6,(%a1)
279 lea.l (16, %a1), %a1
280.main_bo1_check:
281 sub.l #16, %d1
282 blo.b .main_bo1_tail
283 jmp (%a5)
284
285
286.main_do14_start:
287 lea.l (main_do14_loop - ., %pc), %a5
288 movem.l (%a0), %d7/%a2-%a4
289 swap %d7
290 move.w %d7, (%a1)+
291 bra.b .main_bo2_check
292
293.main_do10_start:
294 lea.l (main_do10_loop - ., %pc), %a5
295 movem.l (%a0), %d6-%d7/%a2-%a3
296 swap %d6
297 move.w %d6, (%a1)+
298 bra.b .main_do10_headstore
299
300.main_do6_start:
301 lea.l (main_do6_loop - ., %pc), %a5
302 movem.l (%a0), %d5-%d7/%a2
303 swap %d5
304 move.w %d5, (%a1)+
305 bra.b .main_do6_headstore
306
307.main_do2_start:
308 lea.l (main_do2_loop - ., %pc), %a5
309 movem.l (%a0), %d4-%d7
310 swap %d4
311 move.w %d4, (%a1)+
312/* .main_do2_headstore: */
313 swap %d5
314 move.w %d5, %d4
315 move.l %d4, (%a1)+
316.main_do6_headstore:
317 swap %d6
318 move.w %d6, %d5
319 move.l %d5, (%a1)+
320.main_do10_headstore:
321 swap %d7
322 move.w %d7, %d6
323 move.l %d6, (%a1)+
324 bra.b .main_bo2_check
325
326.main_do14_loop:
327 move.l %d7, %d3
328 move.l %a2, %d4
329 move.l %a3, %d5
330 move.l %a4, %d6
331 movem.l (%a0), %d7/%a2-%a4
332 bra.b .main_bo1_store
333.main_do10_loop:
334 move.l %d7, %d3
335 move.l %a2, %d4
336 move.l %a3, %d5
337 movem.l (%a0), %d6-%d7/%a2-%a3
338 bra.b .main_bo1_store
339.main_do6_loop:
340 move.l %d7, %d3
341 move.l %a2, %d4
342 movem.l (%a0), %d5-%d7/%a2
343 bra.b .main_bo1_store
344.main_do2_loop:
345 move.l %d7, %d3
346 movem.l (%a0), %d4-%d7
347.main_bo2_store:
348 lea.l (16, %a0), %a1
349 swap %d4
350 move.w %d4,%d3
351 swap %d5
352 move.w %d5,%d4
353 swap %d6
354 move.w %d6,%d5
355 swap %d7
356 move.w %d7,%d6
357 movem.l %d3-%d6,(%a1)
358 lea.l (16, %a1), %a1
359.main_bo2_check
360 sub.l #16, %d1
361 blo.b .main_bo2_tail
362 jmp (%a5)
363
364
365.main_do15_start:
366 lea.l (main_do15_loop - ., %pc), %a5
367 movem.l (%a0), %d7/%a2-%a4
368 move.l %d7, %d0
369 lsr.l %d2, %d0
370 move.b %d0, (%a1)+
371 bra.b .main_bo3_check
372
373.main_do11_start:
374 lea.l (main_do11_loop - ., %pc), %a5
375 movem.l (%a0), %d6-%d7/%a2-%a3
376 move.l %d6, %d0
377 lsr.l %d2, %d0
378 move.b %d0, (%a1)+
379 bra.b .main_do11_headstore
380
381.main_do7_start:
382 lea.l (main_do7_loop - ., %pc), %a5
383 movem.l (%a0), %d5-%d7/%a2
384 move.l %d5, %d0
385 lsr.l %d2, %d0
386 move.b %d0, (%a1)+
387 bra.b .main_do7_headstore
388
389.main_do3_start:
390 lea.l (main_do3_loop - ., %pc), %a5
391 movem.l (%a0), %d4-%d7
392 move.l %d4, %d0
393 lsr.l %d2, %d0
394 move.b %d0, (%a1)+
395/* .main_do3_headstore: */
396 lsl.l #8, %d4
397 move.l %d5, %d0
398 lsr.l %d2, %d0
399 or.l %d0, %d4
400 move.l %d4, (%a1)+
401.main_do7_headstore:
402 lsl.l #8, %d5
403 move.l %d6, %d0
404 lsr.l %d2, %d0
405 or.l %d0, %d5
406 move.l %d5, (%a1)+
407.main_do11_headstore:
408 lsl.l #8, %d6
409 move.l %d7, %d0
410 lsr.l %d2, %d0
411 or.l %d0, %d6
412 move.l %d6, (%a1)+
413 bra.b .main_bo3_check
414
415.main_do15_loop:
416 move.l %d7, %d3
417 move.l %a2, %d4
418 move.l %a3, %d5
419 move.l %a4, %d6
420 movem.l (%a0), %d7/%a2-%a4
421 bra.b .main_bo1_store
422.main_do11_loop:
423 move.l %d7, %d3
424 move.l %a2, %d4
425 move.l %a3, %d5
426 movem.l (%a0), %d6-%d7/%a2-%a3
427 bra.b .main_bo1_store
428.main_do7_loop:
429 move.l %d7, %d3
430 move.l %a2, %d4
431 movem.l (%a0), %d5-%d7/%a2
432 bra.b .main_bo1_store
433.main_do3_loop:
434 move.l %d7, %d3
435 movem.l (%a0), %d4-%d7
436.main_bo3_store:
437 lea.l (16, %a0), %a1
438 lsl.l #8, %d3
439 move.l %d4, %d0
440 lsr.l %d2, %d0
441 or.l %d0, %d3
442 lsl.l #8, %d4
443 move.l %d5, %d0
444 lsr.l %d2, %d0
445 or.l %d0, %d4
446 lsl.l #8, %d5
447 move.l %d6, %d0
448 lsr.l %d2, %d0
449 or.l %d0, %d5
450 lsl.l #8, %d6
451 move.l %d7, %d0
452 lsr.l %d2, %d0
453 or.l %d0, %d6
454 movem.l %d3-%d6,(%a1)
455 lea.l (16, %a1), %a1
456.main_bo3_check:
457 sub.l #16, %d1
458 blo.b .main_bo3_tail
459 jmp (%a5)
460
461
462
463 movem.l (%sp), %d2-%d7/%a2-%a6
464 lea.l (44, %sp), %sp
465#else
466 lea.l (-16, %sp), %sp
467 movem.l %d2-%d5, (%sp)
468 sub.l #16, %d1
469
470.main_loop:
471 movem.l (%a0), %d2-%d5
472 lea.l (16, %a0), %a0
473 movem.l %d2-%d5, (%a1)
474 lea.l (16, %a1), %a1
475 sub.l #16, %d1
476 bhs.b .main_loop
477
478 add.l #16, %d1
479 movem.l (%sp), %d2-%d5
480 lea.l (16, %sp), %sp
481#endif
482
483 move.l %d1, %d0
484 bra.s .longs
485
486#else /* CODE TEST */
487
488 add.l %a0,%d1 /* %d1 = source end */ 60 add.l %a0,%d1 /* %d1 = source end */
489 61
490 move.l %a0,%d0 62 move.l %a0,%d0
@@ -1103,8 +675,6 @@ __memcpy_fwd_entry:
1103.bytes2_end: 675.bytes2_end:
1104 move.l (4,%sp),%d0 /* return destination */ 676 move.l (4,%sp),%d0 /* return destination */
1105 rts 677 rts
1106
1107#endif /* CODE TEST */
1108 678
1109.end: 679.end:
1110 .size memcpy,.end-memcpy 680 .size memcpy,.end-memcpy