Initial revision
[ssr] / StraySrc / Libraries / Core / s / fastMove
1 ;
2 ; fastMove.s
3 ;
4 ; Fast memory manipulation (TMA)
5 ;
6 ; © 1994-1998 Straylight
7 ;
8
9 ;----- Licensing note -------------------------------------------------------
10 ;
11 ; This file is part of Straylight's core libraries (corelib).
12 ;
13 ; Corelib is free software; you can redistribute it and/or modify
14 ; it under the terms of the GNU General Public License as published by
15 ; the Free Software Foundation; either version 2, or (at your option)
16 ; any later version.
17 ;
18 ; Corelib is distributed in the hope that it will be useful,
19 ; but WITHOUT ANY WARRANTY; without even the implied warranty of
20 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 ; GNU General Public License for more details.
22 ;
23 ; You should have received a copy of the GNU General Public License
24 ; along with Corelib. If not, write to the Free Software Foundation,
25 ; 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26
27 ;----- Standard header ------------------------------------------------------
28
29 GET libs:header
30 GET libs:swis
31
32 ;----- External dependencies ------------------------------------------------
33 ;
34 ; None.
35
36 ;----- Main Code ------------------------------------------------------------
37
38 AREA |Sapphire$$Code|,CODE,READONLY
39
40 ; --- fastMove ---
41 ;
42 ; On entry: R0 == destination pointer
43 ; R1 == source pointer
44 ; R2 == number of bytes to move
45 ;
46 ; On exit: --
47 ;
48 ; Use: A very fast block moving routine. Word aligning is not
49 ; necessary, and the blocks may overlap. This is basically
50 ; the routine from PRM 2, hacked to cope with overlapping.
51
52 EXPORT fastMove
53 fastMove ROUT
54
55 ; --- Do we need to do it backwards? ---
56
57 CMP R0,R1
58 MOVEQS PC,R14
59 BGT %49fastMove
60
61 ; --- Copy downwards ---
62
63 STMFD R13!,{R0-R12,R14} ;Stack some registers
64
65 TST R0,#3 ;Is destination word aligned
66 BNE %10fastMove ;No -- word align it
67
68 00fastMove TST R1,#3 ;Is source word aligned
69 BNE %20fastMove ;No -- word align that
70
71 ; --- Source and destination are now word aligned ---
72
73 SUBS R2,R2,#16 ;4 or more words to do?
74 BLT %03fastMove
75
76 SUBS R2,R2,#16 ;8 or more words to do?
77 BLT %02fastMove
78
79 ; --- 8 words at a time ---
80
81 01fastMove LDMIA R1!,{R3-R9,R14} ;Load 8 words
82 STMIA R0!,{R3-R9,R14} ;Move them
83 SUBS R2,R2,#32 ;Decrement count
84 BGE %01fastMove ;Keep moving blocks if we can
85
86 CMP R2,#-32 ;Are we finished?
87 LDMEQFD R13!,{R0-R12,PC}^ ;Yes -- return
88
89 ; --- 4 words at a time ---
90
91 02fastMove ADDS R2,R2,#16 ;4 whole words to do?
92 BLT %03fastMove
93
94 LDMIA R1!,{R3-R6} ;Load 4 words
95 STMIA R0!,{R3-R6} ;Move them
96 LDMEQFD R13!,{R0-R12,PC}^ ;Return if finished
97 SUB R2,R2,#16
98
99 ; --- Less than 4 words left ---
100
101 03fastMove ADDS R2,R2,#8 ;2 words to do?
102 BLT %04fastMove
103
104 LDMIA R1!,{R3,R4} ;Load 2 words
105 STMIA R0!,{R3,R4} ;Move them
106 LDMEQFD R13!,{R0-R12,PC}^ ;Return if finished
107 SUB R2,R2,#8
108
109 ; --- Less than 2 words left ---
110
111 04fastMove ADDS R2,R2,#4 ;1 word to do?
112 BLT %05fastMove
113
114 LDR R3,[R1],#4 ;Load a word
115 STR R3,[R0],#4 ;Move it
116 LDMEQFD R13!,{R0-R12,PC}^ ;Return if finished
117 SUB R2,R2,#4
118
119 ; --- Less than 1 word! ---
120
121 05fastMove ADDS R2,R2,#4
122 LDMEQFD R13!,{R0-R12,PC}^ ;Pointless?
123
124 ; --- 1, 2 or 3 bytes left ---
125
126 LDR R14,[R1]
127 06fastMove STRB R14,[R0],#1
128 MOV R14,R14,LSR #8
129 SUBS R2,R2,#1
130 BGT %06fastMove
131 LDMFD R13!,{R0-R12,PC}^ ;Finished at last!
132
133 ; --- Word align destination ---
134
135 10fastMove LDRB R14,[R1],#1
136 STRB R14,[R0],#1
137 SUBS R2,R2,#1
138 LDMEQFD R13!,{R0-R12,PC}^
139
140 TST R0,#3 ;Is it word aligned?
141 BNE %10fastMove ;No -- keep going
142
143 B %00fastMove ;Move the rest
144
145 ; --- Word align source (Urggg... bloogle...) ---
146 ; --- PRM for documentation ---
147
148 20fastMove AND R11,R1,#3
149 BIC R1,R1,#3
150 MOV R11,R11,LSL #3
151 RSB R12,R11,#32
152 LDR R3,[R1],#4
153 MOV R3,R3,LSR R11
154
155 SUBS R2,R2,#16 ;4 or more words to do?
156 BLT %23fastMove
157
158 SUBS R2,R2,#16 ;8 or more words to do?
159 BLT %22fastMove
160
161 ; --- 8 words at a time ---
162
163 21fastMove LDMIA R1!,{R4-R10,R14} ;Load 8 words
164 ORR R3,R3,R4,LSL R12
165
166 MOV R4,R4,LSR R11
167 ORR R4,R4,R5,LSL R12
168
169 MOV R5,R5,LSR R11
170 ORR R5,R5,R6,LSL R12
171
172 MOV R6,R6,LSR R11
173 ORR R6,R6,R7,LSL R12
174
175 MOV R7,R7,LSR R11
176 ORR R7,R7,R8,LSL R12
177
178 MOV R8,R8,LSR R11
179 ORR R8,R8,R9,LSL R12
180
181 MOV R9,R9,LSR R11
182 ORR R9,R9,R10,LSL R12
183
184 MOV R10,R10,LSR R11
185 ORR R10,R10,R14,LSL R12
186
187 STMIA R0!,{R3-R10} ;Move them
188 MOV R3,R14,LSR R11
189 SUBS R2,R2,#32 ;Decrement count
190 BGE %21fastMove ;Keep moving blocks if we can
191
192 CMP R2,#-32 ;Are we finished?
193 LDMEQFD R13!,{R0-R12,PC}^ ;Yes -- return
194
195 ; --- 4 words at a time ---
196
197 22fastMove ADDS R2,R2,#16 ;4 whole words to do?
198 BLT %23fastMove
199
200 LDMIA R1!,{R4-R7} ;Load 4 words
201 ORR R3,R3,R4,LSL R12
202
203 MOV R4,R4,LSR R11
204 ORR R4,R4,R5,LSL R12
205
206 MOV R5,R5,LSR R11
207 ORR R5,R5,R6,LSL R12
208
209 MOV R6,R6,LSR R11
210 ORR R6,R6,R7,LSL R12
211
212 STMIA R0!,{R3-R6} ;Move them
213 LDMEQFD R13!,{R0-R12,PC}^ ;Return if finished
214 SUB R2,R2,#16
215 MOV R3,R7,LSR R11
216
217 ; --- Less than 4 words left ---
218
219 23fastMove ADDS R2,R2,#8 ;2 words to do?
220 BLT %24fastMove
221
222 LDMIA R1!,{R4,R5} ;Load 2 words
223 ORR R3,R3,R4,LSL R12
224
225 MOV R4,R4,LSR R11
226 ORR R4,R4,R5,LSL R12
227
228 STMIA R0!,{R3,R4} ;Move them
229 LDMEQFD R13!,{R0-R12,PC}^ ;Return if finished
230 SUB R2,R2,#8
231 MOV R3,R5,LSR R11
232
233 ; --- Less than 2 words left ---
234
235 24fastMove ADDS R2,R2,#4 ;1 word to do?
236 BLT %25fastMove
237
238 LDR R4,[R1],#4 ;Load a word
239 ORR R3,R3,R4,LSL R12
240
241 STR R3,[R0],#4 ;Move it
242 LDMEQFD R13!,{R0-R12,PC}^ ;Return if finished
243 SUB R2,R2,#4
244 MOV R3,R4,LSR R11
245
246 ; --- Less than 1 word! ---
247
248 25fastMove ADDS R2,R2,#4
249 LDMEQFD R13!,{R0-R12,PC}^ ;Pointless?
250
251 ; --- 1, 2 or 3 bytes left ---
252
253 LDR R14,[R1]
254 ORR R3,R3,R14,LSL R12
255 26fastMove STRB R3,[R0],#1
256 MOV R3,R3,LSR #8
257 SUBS R2,R2,#1
258 BGT %26fastMove
259
260 LDMFD R13!,{R0-R12,PC}^ ;Finished at last!
261
262 ; --- Copy upwards ---
263
264 49fastMove STMFD R13!,{R0-R12,R14} ;Stack some registers
265 ADD R0,R0,R2
266 ADD R1,R1,R2
267
268 TST R0,#3 ;Is destination word aligned
269 BNE %60fastMove ;No -- word align it
270
271 50fastMove TST R1,#3 ;Is source word aligned
272 BNE %70fastMove ;No -- word align that
273
274 ; --- Source and destination are now word aligned ---
275
276 SUBS R2,R2,#16 ;4 or more words to do?
277 BLT %53fastMove
278
279 SUBS R2,R2,#16 ;8 or more words to do?
280 BLT %52fastMove
281
282 ; --- 8 words at a time ---
283
284 51fastMove LDMDB R1!,{R3-R9,R14} ;Load 8 words
285 STMDB R0!,{R3-R9,R14} ;Move them
286 SUBS R2,R2,#32 ;Decrement count
287 BGE %51fastMove ;Keep moving blocks if we can
288
289 CMP R2,#-32 ;Are we finished?
290 LDMEQFD R13!,{R0-R12,PC}^ ;Yes -- return
291
292 ; --- 4 words at a time ---
293
294 52fastMove ADDS R2,R2,#16 ;4 whole words to do?
295 BLT %53fastMove
296
297 LDMDB R1!,{R3-R6} ;Load 4 words
298 STMDB R0!,{R3-R6} ;Move them
299 LDMEQFD R13!,{R0-R12,PC}^ ;Return if finished
300 SUB R2,R2,#16
301
302 ; --- Less than 4 words left ---
303
304 53fastMove ADDS R2,R2,#8 ;2 words to do?
305 BLT %54fastMove
306
307 LDMDB R1!,{R3,R4} ;Load 2 words
308 STMDB R0!,{R3,R4} ;Move them
309 LDMEQFD R13!,{R0-R12,PC}^ ;Return if finished
310 SUB R2,R2,#8
311
312 ; --- Less than 2 words left ---
313
314 54fastMove ADDS R2,R2,#4 ;1 word to do?
315 BLT %55fastMove
316
317 LDR R3,[R1,#-4]! ;Load a word
318 STR R3,[R0,#-4]! ;Move it
319 LDMEQFD R13!,{R0-R12,PC}^ ;Return if finished
320 SUB R2,R2,#4
321
322 ; --- Less than 1 word! ---
323
324 55fastMove ADDS R2,R2,#4
325 LDMEQFD R13!,{R0-R12,PC}^ ;Pointless?
326
327 ; --- 1, 2 or 3 bytes left ---
328
329 LDR R14,[R1,#-4]
330 56fastMove MOV R3,R14,LSR #24
331 STRB R3,[R0,#-1]!
332 MOV R14,R14,LSL #8
333 SUBS R2,R2,#1
334 BGT %56fastMove
335
336 LDMFD R13!,{R0-R12,PC}^ ;Finished at last!
337
338 ; --- Word align destination ---
339
340 60fastMove LDRB R14,[R1,#-1]!
341 STRB R14,[R0,#-1]!
342 SUBS R2,R2,#1
343 LDMEQFD R13!,{R0-R12,PC}^
344
345 TST R0,#3 ;Is it word aligned?
346 BNE %60fastMove ;No -- keep going
347
348 B %50fastMove ;Move the rest
349
350 ; --- Word align source (Urggg... bloogle...) ---
351 ;
352 ; There are several oddnesses here.
353
354 70fastMove AND R11,R1,#3
355 BIC R1,R1,#3 ;Word align source
356 MOV R11,R11,LSL #3 ;This is the right shift
357 RSB R12,R11,#32 ;This is the left shift
358 LDR R14,[R1],#-4
359 MOV R14,R14,LSL R12 ;Get the odd bit
360
361 SUBS R2,R2,#16 ;4 or more words to do?
362 BLT %73fastMove
363
364 SUBS R2,R2,#16 ;8 or more words to do?
365 BLT %72fastMove
366
367 ; --- 8 words at a time ---
368
369 71fastMove LDMDA R1!,{R3-R10} ;Load 8 words
370 ORR R14,R14,R10,LSR R11
371
372 MOV R10,R10,LSL R12
373 ORR R10,R10,R9,LSR R11
374
375 MOV R9,R9,LSL R12
376 ORR R9,R9,R8,LSR R11
377
378 MOV R8,R8,LSL R12
379 ORR R8,R8,R7,LSR R11
380
381 MOV R7,R7,LSL R12
382 ORR R7,R7,R6,LSR R11
383
384 MOV R6,R6,LSL R12
385 ORR R6,R6,R5,LSR R11
386
387 MOV R5,R5,LSL R12
388 ORR R5,R5,R4,LSR R11
389
390 MOV R4,R4,LSL R12
391 ORR R4,R4,R3,LSR R11
392
393 STMDB R0!,{R4-R10,R14} ;Move them
394 MOV R14,R3,LSL R12
395 SUBS R2,R2,#32 ;Decrement count
396 BGE %71fastMove ;Keep moving blocks if we can
397
398 CMP R2,#-32 ;Are we finished?
399 LDMEQFD R13!,{R0-R12,PC}^ ;Yes -- return
400
401 ; --- 4 words at a time ---
402
403 72fastMove ADDS R2,R2,#16 ;4 whole words to do?
404 BLT %73fastMove
405
406 LDMDA R1!,{R3-R6} ;Load 4 words
407 ORR R14,R14,R6,LSR R11
408
409 MOV R6,R6,LSL R12
410 ORR R6,R6,R5,LSR R11
411
412 MOV R5,R5,LSL R12
413 ORR R5,R5,R4,LSR R11
414
415 MOV R4,R4,LSL R12
416 ORR R4,R4,R3,LSR R11
417
418 STMDB R0!,{R4-R6,R14} ;Move them
419 LDMEQFD R13!,{R0-R12,PC}^ ;Return if finished
420 SUB R2,R2,#16
421 MOV R14,R3,LSL R12
422
423 ; --- Less than 4 words left ---
424
425 73fastMove ADDS R2,R2,#8 ;2 words to do?
426 BLT %74fastMove
427
428 LDMDA R1!,{R3,R4} ;Load 2 words
429 ORR R14,R14,R4,LSR R11
430
431 MOV R4,R4,LSL R12
432 ORR R4,R4,R3,LSR R11
433
434 STMDB R0!,{R4,R14} ;Move them
435 LDMEQFD R13!,{R0-R12,PC}^ ;Return if finished
436 SUB R2,R2,#8
437 MOV R14,R3,LSL R12
438
439 ; --- Less than 2 words left ---
440
441 74fastMove ADDS R2,R2,#4 ;1 word to do?
442 BLT %75fastMove
443
444 LDR R3,[R1],#-4 ;Load a word
445 ORR R14,R14,R3,LSR R11
446
447 STR R14,[R0,#-4]! ;Move it
448 LDMEQFD R13!,{R0-R12,PC}^ ;Return if finished
449 SUB R2,R2,#4
450 MOV R14,R3,LSL R12
451
452 ; --- Less than 1 word! ---
453
454 75fastMove ADDS R2,R2,#4
455 LDMEQFD R13!,{R0-R12,PC}^ ;Pointless?
456
457 ; --- 1, 2 or 3 bytes left ---
458
459 LDR R3,[R1],#-4
460 ORR R14,R14,R3,LSR R11
461 76fastMove MOV R3,R14,LSR #24
462 STRB R3,[R0,#-1]!
463 MOV R14,R14,LSL #8
464 SUBS R2,R2,#1
465 BGT %76fastMove
466
467 LDMFD R13!,{R0-R12,PC}^ ;Finished at last!
468
469 ;----- Workspace ------------------------------------------------------------
470 ;
471 ; None.
472
473 ;----- That's all folks -----------------------------------------------------
474
475 END