chiark / gitweb /
Create readable text `.bas' for each tokenized BASIC `,ffb' file.
[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