Removed platform specific metatarget (sun4i)
[AROS.git] / arch / m68k-all / exec / copymem_.S
blob953b4ae108e869cabf3b8702b513b7492fd63d07
1 /*
2     Copyright © 1995-2012, The AROS Development Team. All rights reserved.
3     $Id$
5     Desc: CopyMem
6     Lang: english
7 */
9         #include "aros/m68k/asm.h"
11         .text
12         .balign 4
14         .globl  AROS_SLIB_ENTRY(CopyMem_000,Exec,104)
15         .type   AROS_SLIB_ENTRY(CopyMem_000,Exec,104),@function
16 AROS_SLIB_ENTRY(CopyMem_000,Exec,104):
17         moveq #64,%d1
18         cmp.l %d1,%d0
19         bcs.s copy_00_bytes
20         move.l %a0,%d1
21         btst #0,%d1
22         beq.s copy_00_salign
23         move.b (%a0)+,(%a1)+
24         subq.l #1,%d0
25 copy_00_salign:
26         move.l %a1,%d1
27         btst #0,%d1
28         // alignment mismatch?
29         bne.s copy_00_bytes
30         movem.l %d2-%d7/%a2-%a6,-(%sp)
31 copy_00_movem:
32         movem.l (%a0)+,%d1-%d7/%a2-%a6
33         movem.l %d1-%d7/%a2-%a6,(%a1)
34         moveq #12*4,%d1
35         sub.l %d1,%d0
36         add.l %d1,%a1
37         cmp.l %d1,%d0
38         bcc.s copy_00_movem
39         movem.l (%sp)+,%d2-%d7/%a2-%a6
40         // copy byte by byte
41 copy_00_bytes:
42         move.w %d0,%d1
43         swap %d0
44         bra.s copy_00_bytes2
45 copy_00_bytes_loop:
46         move.b (%a0)+,(%a1)+
47 copy_00_bytes2:
48         dbf %d1,copy_00_bytes_loop
49         dbf %d0,copy_00_bytes_loop
50         rts     
52         /* Optimized 020+ CopyMem by Matt Hey */
54         .balign 4
55         .globl  AROS_SLIB_ENTRY(CopyMem_020,Exec,104)
56         .type   AROS_SLIB_ENTRY(CopyMem_020,Exec,104),@function
57 AROS_SLIB_ENTRY(CopyMem_020,Exec,104):
58         subq.l #4,%d0                   // size is 4 less than actual!
59         bls.b smallcopy         // if size<=4 bytes
60         move.l %a1,%d1
61         btst #0,%d1
62         beq.b daligned2
63         move.b (%a0)+,(%a1)+
64         addq.l #1,%d1
65         subq.l #1,%d0
66 daligned2:                                      // dest should be WORD aligned now
67         btst #1,%d1
68         beq.b daligned4
69         move.w (%a0)+,(%a1)+
70         subq.l #2,%d0
71         bcs.b last2                             // if size<0
72 daligned4:                                      // dest should be LONG aligned now
73         cmp.l #256-4,%d0                // min size for move16, less than 252 is dangerous!
74         bcc.b bigmove
75 move4loop:
76         move.l (%a0)+,(%a1)+
77         subq.w #4,%d0
78         bhi.b move4loop         // if size>0
79 smallcopy:
80         bne.b last2
81 move4:
82         move.l (%a0),(%a1)
83         rts
85         .balign 4
86 bigmove:
87         moveq #128-4,%d1
88         sub.l %d1,%d0                           // size is now 128 less than actual
89         addq.l #4,%d1                   // d1=128=bytes to move per loop
90 bigmove4:
91         move.l (%a0)+,(%a1)+
92         move.l (%a0)+,(%a1)+
93         move.l (%a0)+,(%a1)+
94         move.l (%a0)+,(%a1)+
95         move.l (%a0)+,(%a1)+
96         move.l (%a0)+,(%a1)+
97         move.l (%a0)+,(%a1)+
98         move.l (%a0)+,(%a1)+
99         move.l (%a0)+,(%a1)+
100         move.l (%a0)+,(%a1)+
101         move.l (%a0)+,(%a1)+
102         move.l (%a0)+,(%a1)+
103         move.l (%a0)+,(%a1)+
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         sub.l   %d1,%d0                         // d0=d0-128
124         bcc.b   bigmove4                        // if d0>=0
125         add.l %d1,%d0                           // d0=d0+128, back to positive
126         subq.l #4,%d0
127         bcs.b last2
128 lloop:
129         move.l (%a0)+,(%a1)+
130         subq.w #4,%d0
131         bcc.b lloop
132 last2:
133         btst #1,%d0
134         beq.b last1
135         move.w (%a0)+,(%a1)+
136 last1:
137         btst #0,%d0
138         bne.b move1
139         rts
140         .balign 4
141 move1:
142         move.b (%a0),(%a1)
143         rts