- Removed unnecessary casts.
[AROS.git] / arch / m68k-amiga / c / copymem_040.S
blobb0253873566aa3e959d43cba809db9b919886010
1 /*
2     Copyright © 1995-2012, The AROS Development Team. All rights reserved.
3     $Id: $
5     Desc: 68040 optimized CopyMem/Quick by Matt Hey.
6     Lang: english
7 */
9         .text
10         .chip 68040
12 #define SAFE_MOVE16 0
14 /***********************************
15  *
16  * CopyMemQuick( source, dest, size )
17  *                 %a0     %a1    %d0
18  *
19  *      source & dest = long word aligned
20  *      size = in bytes (divisable by 4)
21  *
22  */
23         .globl copymemquick_040
24         .globl copymemquicke_040
25         .balign 4
26 copymemquick_040:
27         subq.l #4,%d0           // size is 4.b less than actual
28         bls.b ism4or0           // if %d0<=0
29 prem4:
30         cmp.l #512-4,%d0        // min size for move16, less than 252 is dangerous!
31         bcc.b bigmov
32 m4loop:
33         move.l (%a0)+,(%a1)+
34         move.l (%a0)+,(%a1)+
35         subq.l #8,%d0                   // 8 less bytes to MOVE
36         bhi.b m4loop                    // if %d0>0
37 ism4or0:
38         beq.b lastm4
39         rts
40 lastm4:
41         move.l (%a0),(%a1)
42         rts
44         .balign 4
45 bigmov:
46         sub.l #252,%d0                  // make size 256 less than actual
47         move.l %a1,%d1
48         cmp.l #3072-256,%d0
49         bcs.w bmov4loop
50         btst #2,%d1                             // destination aligned by 8 if bit3/bit#2=0
51         beq.b destisal8         // if bit3/bit#2=0
52         move.l (%a0)+,(%a1)+
53         addq.l #4,%d1
54         subq.l #4,%d0
55 destisal8:
56         btst #3,%d1                             // destination aligned by 16 if bit4/bit#3=0
57         beq.b destisal16                // if bit4/bit#3=0
58         move.l (%a0)+,(%a1)+
59         subq.l #8,%d0
60         move.l (%a0)+,(%a1)+
61 destisal16:
62         move.l %a0,%d1
63         and.w #15,%d1           // source aligned by 16 if first 4 bits=0
64         bne.b bmov4loop         // if source not aligned by 16
66 #if SAFE_MOVE16
67         cmp.l #$01000000,a1     ; destination must be in 24 bit space
68         bcs.b bmov4loop
69         cmp.l #$01000000,a0     ; source must be in 24 bit space
70         bcs.b bmov4loop
71 #endif
73 mov16loop:
74         move16 (%a0)+,(%a1)+
75         move16 (%a0)+,(%a1)+
76         move16 (%a0)+,(%a1)+
77         move16 (%a0)+,(%a1)+
78         move16 (%a0)+,(%a1)+
79         move16 (%a0)+,(%a1)+
80         move16 (%a0)+,(%a1)+
81         move16 (%a0)+,(%a1)+
82         move16 (%a0)+,(%a1)+
83         move16 (%a0)+,(%a1)+
84         move16 (%a0)+,(%a1)+
85         move16 (%a0)+,(%a1)+
86         move16 (%a0)+,(%a1)+
87         move16 (%a0)+,(%a1)+
88         move16 (%a0)+,(%a1)+
89         sub.l #256,%d0                  // condition codes not affected by move16
90         move16 (%a0)+,(%a1)+
91         bcc.b   mov16loop               // if %d0>=0
92         subq.b #4,%d0
93         bcc.b lastloop                  // if %d0>=0
94         rts
95         .balign 4
96 lastloop:
97         move.l (%a0)+,(%a1)+
98         subq.b #4,%d0
99         bcc.b lastloop                  // if %d0>=0
100         rts
102         .balign 4
103 bmov4loop:                                      //move.l*64=64.l=256.b
104         move.l (%a0)+,(%a1)+
105         move.l (%a0)+,(%a1)+
106         move.l (%a0)+,(%a1)+
107         move.l (%a0)+,(%a1)+
108         move.l (%a0)+,(%a1)+
109         move.l (%a0)+,(%a1)+
110         move.l (%a0)+,(%a1)+
111         move.l (%a0)+,(%a1)+
112         move.l (%a0)+,(%a1)+
113         move.l (%a0)+,(%a1)+
114         move.l (%a0)+,(%a1)+
115         move.l (%a0)+,(%a1)+
116         move.l (%a0)+,(%a1)+
117         move.l (%a0)+,(%a1)+
118         move.l (%a0)+,(%a1)+
119         move.l (%a0)+,(%a1)+
120         move.l (%a0)+,(%a1)+
121         move.l (%a0)+,(%a1)+
122         move.l (%a0)+,(%a1)+
123         move.l (%a0)+,(%a1)+
124         move.l (%a0)+,(%a1)+
125         move.l (%a0)+,(%a1)+
126         move.l (%a0)+,(%a1)+
127         move.l (%a0)+,(%a1)+
128         move.l (%a0)+,(%a1)+
129         move.l (%a0)+,(%a1)+
130         move.l (%a0)+,(%a1)+
131         move.l (%a0)+,(%a1)+
132         move.l (%a0)+,(%a1)+
133         move.l (%a0)+,(%a1)+
134         move.l (%a0)+,(%a1)+
135         move.l (%a0)+,(%a1)+
136         move.l (%a0)+,(%a1)+
137         move.l (%a0)+,(%a1)+
138         move.l (%a0)+,(%a1)+
139         move.l (%a0)+,(%a1)+
140         move.l (%a0)+,(%a1)+
141         move.l (%a0)+,(%a1)+
142         move.l (%a0)+,(%a1)+
143         move.l (%a0)+,(%a1)+
144         move.l (%a0)+,(%a1)+
145         move.l (%a0)+,(%a1)+
146         move.l (%a0)+,(%a1)+
147         move.l (%a0)+,(%a1)+
148         move.l (%a0)+,(%a1)+
149         move.l (%a0)+,(%a1)+
150         move.l (%a0)+,(%a1)+
151         move.l (%a0)+,(%a1)+
152         move.l (%a0)+,(%a1)+
153         move.l (%a0)+,(%a1)+
154         move.l (%a0)+,(%a1)+
155         move.l (%a0)+,(%a1)+
156         move.l (%a0)+,(%a1)+
157         move.l (%a0)+,(%a1)+
158         move.l (%a0)+,(%a1)+
159         move.l (%a0)+,(%a1)+
160         move.l (%a0)+,(%a1)+
161         move.l (%a0)+,(%a1)+
162         move.l (%a0)+,(%a1)+
163         move.l (%a0)+,(%a1)+
164         move.l (%a0)+,(%a1)+
165         move.l (%a0)+,(%a1)+
166         move.l (%a0)+,(%a1)+
167         move.l (%a0)+,(%a1)+
168         sub.l   #256,%d0
169         bcc.w   bmov4loop               // if %d0>=0
170         subq.b #4,%d0                   // the byte is positive
171         bcc.b lastloop2
172         rts
173         .balign 4
174 lastloop2:
175         move.l (%a0)+,(%a1)+
176         subq.b #4,%d0
177         bcc.b lastloop2
178         rts
179 copymemquicke_040:
181 /**********************************
183  * CopyMem( source, dest, size )
184  *            %a0     %a1    %d0
186  *      source & dest = any aligned
187  *      size = in bytes
189  */
191         .balign 4
192         .globl copymem_040
193         .globl copymeme_040
194 copymem_040:
195         subq.l #4,%d0                   // size is 4 less than actual!
196         bls.b smallcopy         // if size<=4 bytes
197         move.l %a1,%d1
198         btst #0,%d1
199         beq.b daligned2
200         move.b (%a0)+,(%a1)+
201         addq.l #1,%d1
202         subq.l #1,%d0
203 daligned2:                                      // dest should be WORD aligned now
204         btst #1,%d1
205         beq.b daligned4
206         move.w (%a0)+,(%a1)+
207         subq.l #2,%d0
208         bcs.b last2                             // if size<0
209 daligned4:                                      // dest should be LONG aligned now
210         cmp.l #512-4,%d0                // min size for move16, less than 252 is dangerous!
211         bcc.b bigmove
212 move4loop:
213         move.l (%a0)+,(%a1)+
214         subq.l #4,%d0
215         bhi.b move4loop         // if size>0
216         bne.b last2
217 move4:
218         move.l (%a0)+,(%a1)+
219         rts
220 smallcopy:
221         beq.b move4
222 last2:
223         btst #1,%d0
224         beq.b last1
225         move.w (%a0)+,(%a1)+
226 last1:
227         btst #0,%d0
228         bne.b move1
229         rts
230 move1:
231         move.b (%a0),(%a1)
232         rts
234         .balign 4
235 bigmove:
236         sub.l #252,%d0                  // make size 256 less than actual
237         move.l %a1,%d1
238         cmp.l #3072-256,%d0
239         bcs.w bmove4loop
240         btst #2,%d1                             // destination aligned by 8 if bit3/bit#2=0
241         beq.b   disal8                  // if bit3/bit#2=0
242         move.l (%a0)+,(%a1)+
243         addq.l #4,%d1
244         subq.l #4,%d0
245 disal8:
246         btst #3,%d1                             // destination aligned by 16 if bit4/bit#3=0
247         beq.b   disal16                 // if bit4/bit#3=0
248         move.l (%a0)+,(%a1)+
249         subq.l #8,%d0
250         move.l (%a0)+,(%a1)+
251 disal16:
252         move.l %a0,%d1
253         and.w #15,%d1           // source aligned by 16 if first 4 bits=0
254         bne.b bmove4loop                // if source not aligned by 16
256 #if SAFE_MOVE16
257         cmp.l   #$01000000,a1   ; destination must be in 24 bit space
258         bcs.b   bmove4loop
259         cmp.l   #$01000000,a0   ; source must be in 24 bit space
260         bcs.b   bmove4loop
261 #endif
263 move16loop:
264         move16 (%a0)+,(%a1)+
265         move16 (%a0)+,(%a1)+
266         move16 (%a0)+,(%a1)+
267         move16 (%a0)+,(%a1)+
268         move16 (%a0)+,(%a1)+
269         move16 (%a0)+,(%a1)+
270         move16 (%a0)+,(%a1)+
271         move16 (%a0)+,(%a1)+
272         move16 (%a0)+,(%a1)+
273         move16 (%a0)+,(%a1)+
274         move16 (%a0)+,(%a1)+
275         move16 (%a0)+,(%a1)+
276         move16 (%a0)+,(%a1)+
277         move16 (%a0)+,(%a1)+
278         move16 (%a0)+,(%a1)+
279         sub.l   #256,%d0                        // condition codes not affected by move16
280         move16 (%a0)+,(%a1)+
281         bcc.b   move16loop              // if %d0>=0
282         subq.b #4,%d0
283         bcs.b l2
284 lloop:
285         move.l (%a0)+,(%a1)+
286         subq.b #4,%d0
287         bcc.b lloop
289         btst #1,%d0
290         beq.b l1
291         move.w (%a0)+,(%a1)+
293         btst #0,%d0
294         bne.b m1
295         rts
296         .balign 4
298         move.b (%a0),(%a1)
299         rts
301         .balign 4
302 bmove4loop:                                     //move.l*64=64.l=256.b
303         move.l (%a0)+,(%a1)+
304         move.l (%a0)+,(%a1)+
305         move.l (%a0)+,(%a1)+
306         move.l (%a0)+,(%a1)+
307         move.l (%a0)+,(%a1)+
308         move.l (%a0)+,(%a1)+
309         move.l (%a0)+,(%a1)+
310         move.l (%a0)+,(%a1)+
311         move.l (%a0)+,(%a1)+
312         move.l (%a0)+,(%a1)+
313         move.l (%a0)+,(%a1)+
314         move.l (%a0)+,(%a1)+
315         move.l (%a0)+,(%a1)+
316         move.l (%a0)+,(%a1)+
317         move.l (%a0)+,(%a1)+
318         move.l (%a0)+,(%a1)+
319         move.l (%a0)+,(%a1)+
320         move.l (%a0)+,(%a1)+
321         move.l (%a0)+,(%a1)+
322         move.l (%a0)+,(%a1)+
323         move.l (%a0)+,(%a1)+
324         move.l (%a0)+,(%a1)+
325         move.l (%a0)+,(%a1)+
326         move.l (%a0)+,(%a1)+
327         move.l (%a0)+,(%a1)+
328         move.l (%a0)+,(%a1)+
329         move.l (%a0)+,(%a1)+
330         move.l (%a0)+,(%a1)+
331         move.l (%a0)+,(%a1)+
332         move.l (%a0)+,(%a1)+
333         move.l (%a0)+,(%a1)+
334         move.l (%a0)+,(%a1)+
335         move.l (%a0)+,(%a1)+
336         move.l (%a0)+,(%a1)+
337         move.l (%a0)+,(%a1)+
338         move.l (%a0)+,(%a1)+
339         move.l (%a0)+,(%a1)+
340         move.l (%a0)+,(%a1)+
341         move.l (%a0)+,(%a1)+
342         move.l (%a0)+,(%a1)+
343         move.l (%a0)+,(%a1)+
344         move.l (%a0)+,(%a1)+
345         move.l (%a0)+,(%a1)+
346         move.l (%a0)+,(%a1)+
347         move.l (%a0)+,(%a1)+
348         move.l (%a0)+,(%a1)+
349         move.l (%a0)+,(%a1)+
350         move.l (%a0)+,(%a1)+
351         move.l (%a0)+,(%a1)+
352         move.l (%a0)+,(%a1)+
353         move.l (%a0)+,(%a1)+
354         move.l (%a0)+,(%a1)+
355         move.l (%a0)+,(%a1)+
356         move.l (%a0)+,(%a1)+
357         move.l (%a0)+,(%a1)+
358         move.l (%a0)+,(%a1)+
359         move.l (%a0)+,(%a1)+
360         move.l (%a0)+,(%a1)+
361         move.l (%a0)+,(%a1)+
362         move.l (%a0)+,(%a1)+
363         move.l (%a0)+,(%a1)+
364         move.l (%a0)+,(%a1)+
365         move.l (%a0)+,(%a1)+
366         move.l (%a0)+,(%a1)+
367         sub.l   #256,%d0
368         bcc.w   bmove4loop              // if %d0>=0
369         subq.b #4,%d0
370         bcs.b l22
371 lloop2:
372         move.l (%a0)+,(%a1)+
373         subq.b #4,%d0
374         bcc.b lloop2
375 l22:
376         btst #1,%d0
377         beq.b l12
378         move.w (%a0)+,(%a1)+
379 l12:
380         btst #0,%d0
381         bne.b m12
382         rts
383         .balign 4
384 m12:
385         move.b (%a0),(%a1)
386         rts
387 copymeme_040: