revert between 56095 -> 55830 in arch
[AROS.git] / arch / m68k-all / exec / copymem_040.S
blob8be92e8583e18a9dc21ad598149cf6385865f05c
1 /*
2     Copyright © 2017, The AROS Development Team. All rights reserved.
3     $Id$
5     Desc: Optimized 040+ CopyMem by Matt Hey
6     Lang: english
7 */
9         #include "aros/m68k/asm.h"
11 #define SAFE_MOVE16 1
13         .text
14         .balign 4
16         .globl  AROS_SLIB_ENTRY(CopyMem_040,Exec,104)
17         .type   AROS_SLIB_ENTRY(CopyMem_040,Exec,104),@function
18 AROS_SLIB_ENTRY(CopyMem_040,Exec,104):
20         subq.l #4,%d0                   // size is 4 less than actual!
21         bls.b smallcopy                 // if size<=4 bytes
22         move.l %a1,%d1
23         btst #0,%d1
24         beq.b daligned2
25         move.b (%a0)+,(%a1)+
26         addq.l #1,%d1
27         subq.l #1,%d0
28 daligned2:                              // dest should be WORD aligned now
29         btst #1,%d1
30         beq.b daligned4
31         move.w (%a0)+,(%a1)+
32         subq.l #2,%d0
33         bcs.b last2                     // if size<0
34 daligned4:                              // dest should be LONG aligned now
35         cmp.l #512-4,%d0                // min size for move16, less than 252 is dangerous!
36         bcc.b bigmove
37 move4loop:
38         move.l (%a0)+,(%a1)+
39         subq.l #4,%d0
40         bhi.b move4loop                 // if size>0
41         bne.b last2
42 move4:
43         move.l (%a0)+,(%a1)+
44         rts
45 smallcopy:
46         beq.b move4
47 last2:
48         btst #1,%d0
49         beq.b last1
50         move.w (%a0)+,(%a1)+
51 last1:
52         btst #0,%d0
53         bne.b move1
54         rts
55 move1:
56         move.b (%a0),(%a1)
57         rts
59         .balign 4
60 bigmove:
61         sub.l #252,%d0                  // make size 256 less than actual
62         move.l %a1,%d1
63         cmp.l #3072-256,%d0
64         bcs.w bmove4loop
65         btst #2,%d1                     // destination aligned by 8 if bit3/bit#2=0
66         beq.b   disal8                  // if bit3/bit#2=0
67         move.l (%a0)+,(%a1)+
68         addq.l #4,%d1
69         subq.l #4,%d0
70 disal8:
71         btst #3,%d1                     // destination aligned by 16 if bit4/bit#3=0
72         beq.b   disal16                 // if bit4/bit#3=0
73         move.l (%a0)+,(%a1)+
74         subq.l #8,%d0
75         move.l (%a0)+,(%a1)+
76 disal16:
77         move.l %a0,%d1
78         and.w #15,%d1           // source aligned by 16 if first 4 bits=0
79         bne.b bmove4loop                // if source not aligned by 16
81 #if SAFE_MOVE16
82         cmp.l   #16777216,%a1           // destination must be in 24 bit space
83         bcs.b   bmove4loop
84         cmp.l   #16777216,%a0           // source must be in 24 bit space
85         bcs.b   bmove4loop
86 #endif
88 move16loop:
89         move16 (%a0)+,(%a1)+
90         move16 (%a0)+,(%a1)+
91         move16 (%a0)+,(%a1)+
92         move16 (%a0)+,(%a1)+
93         move16 (%a0)+,(%a1)+
94         move16 (%a0)+,(%a1)+
95         move16 (%a0)+,(%a1)+
96         move16 (%a0)+,(%a1)+
97         move16 (%a0)+,(%a1)+
98         move16 (%a0)+,(%a1)+
99         move16 (%a0)+,(%a1)+
100         move16 (%a0)+,(%a1)+
101         move16 (%a0)+,(%a1)+
102         move16 (%a0)+,(%a1)+
103         move16 (%a0)+,(%a1)+
104         sub.l   #256,%d0                // condition codes not affected by move16
105         move16 (%a0)+,(%a1)+
106         bcc.b   move16loop              // if d0>=0
107         subq.b #4,%d0
108         bcs.b l2
109 lloop:
110         move.l (%a0)+,(%a1)+
111         subq.b #4,%d0
112         bcc.b lloop
114         btst #1,%d0
115         beq.b l1
116         move.w (%a0)+,(%a1)+
118         btst #0,%d0
119         bne.b m1
120         rts
121         .balign 4
123         move.b (%a0),(%a1)
124         rts
126         .balign 4
127 bmove4loop:                             // move.l*64=64.l=256.b
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         move.l (%a0)+,(%a1)+
169         move.l (%a0)+,(%a1)+
170         move.l (%a0)+,(%a1)+
171         move.l (%a0)+,(%a1)+
172         move.l (%a0)+,(%a1)+
173         move.l (%a0)+,(%a1)+
174         move.l (%a0)+,(%a1)+
175         move.l (%a0)+,(%a1)+
176         move.l (%a0)+,(%a1)+
177         move.l (%a0)+,(%a1)+
178         move.l (%a0)+,(%a1)+
179         move.l (%a0)+,(%a1)+
180         move.l (%a0)+,(%a1)+
181         move.l (%a0)+,(%a1)+
182         move.l (%a0)+,(%a1)+
183         move.l (%a0)+,(%a1)+
184         move.l (%a0)+,(%a1)+
185         move.l (%a0)+,(%a1)+
186         move.l (%a0)+,(%a1)+
187         move.l (%a0)+,(%a1)+
188         move.l (%a0)+,(%a1)+
189         move.l (%a0)+,(%a1)+
190         move.l (%a0)+,(%a1)+
191         move.l (%a0)+,(%a1)+
192         sub.l   #256,%d0
193         bcc.w   bmove4loop              // if d0>=0
194         subq.b #4,%d0
195         bcs.b l22
196 lloop2:
197         move.l (%a0)+,(%a1)+
198         subq.b #4,%d0
199         bcc.b lloop2
200 l22:
201         btst #1,%d0
202         beq.b l12
203         move.w (%a0)+,(%a1)+
204 l12:
205         btst #0,%d0
206         bne.b m12
207         rts
208         .balign 4
209 m12:
210         move.b (%a0),(%a1)
211         rts