use USER_CPPFLAGS
[AROS.git] / arch / m68k-all / exec / copymemquick_040.S
blobe8ed278748293a55500da8e6bed79318179d290a
1 /*
2     Copyright © 2017, The AROS Development Team. All rights reserved.
3     $Id$
5     Desc: 040+ Optimized CopyMemQuick by Matt Hey.
6     Lang: english
7 */
9         #include "aros/m68k/asm.h"
11 #define UNALIGNEDWARNING 1
12 #define SAFE_MOVE16 1
14         .text
15         .balign 4
17         .globl  AROS_SLIB_ENTRY(CopyMemQuick_040,Exec,105)
18         .type   AROS_SLIB_ENTRY(CopyMemQuick_040,Exec,105),@function
19 AROS_SLIB_ENTRY(CopyMemQuick_040,Exec,105):
21 #if UNALIGNEDWARNING
22         move.w  %d0,%d1
23         and.w   #3,%d1
24         beq.s   0f
25         movem.l %d0-%d1/%a0-%a1,-(%sp)
26         move.l  %d0,-(%sp)
27         move.l  %a1,-(%sp)
28         move.l  %a0,-(%sp)
29         pea format040
30         jsr kprintf
31         lea     16(%sp),%sp
32         movem.l (%sp)+,%d0-%d1/%a0-%a1
34 #endif
36         subq.l #4,%d0                   // size is 4.b less than actual
37         bls.b ism4or0                   // if d0<=0
38 prem4:
39         cmp.l #512-4,%d0                // min size for move16, less than 252 is dangerous!
40         bcc.b bigmov
41 m4loop:
42         move.l (%a0)+,(%a1)+
43         move.l (%a0)+,(%a1)+
44         subq.l #8,%d0                   // 8 less bytes to MOVE
45         bhi.b m4loop                    // if d0>0
46 ism4or0:
47         beq.b lastm4
48         rts
49 lastm4:
50         move.l (%a0),(%a1)
51         rts
53         .balign 4
54 bigmov:
55         sub.l #252,%d0                  // make size 256 less than actual
56         move.l %a1,%d1
57         cmp.l #3072-256,%d0
58         bcs.w bmov4loop
59         btst #2,%d1                     // destination aligned by 8 if bit3/bit#2=0
60         beq.b destisal8                 // if bit3/bit#2=0
61         move.l (%a0)+,(%a1)+
62         addq.l #4,%d1
63         subq.l #4,%d0
64 destisal8:
65         btst #3,%d1                     // destination aligned by 16 if bit4/bit#3=0
66         beq.b destisal16                // if bit4/bit#3=0
67         move.l (%a0)+,(%a1)+
68         subq.l #8,%d0
69         move.l (%a0)+,(%a1)+
70 destisal16:
71         move.l %a0,%d1
72         and.w #15,%d1           // source aligned by 16 if first 4 bits=0
73         bne.b bmov4loop                 // if source not aligned by 16
75 #if SAFE_MOVE16
76         cmp.l #16777216,%a1             // destination must be in 24 bit space
77         bcs.b bmov4loop
78         cmp.l #16777216,%a0             // source must be in 24 bit space
79         bcs.b bmov4loop
80 #endif
82 mov16loop:
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         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         sub.l #256,%d0                  // condition codes not affected by move16
99         move16 (%a0)+,(%a1)+
100         bcc.b   mov16loop               // if d0>=0
101         subq.b #4,%d0
102         bcc.b lastloop                  // if d0>=0
103         rts
105         .balign 4
106 lastloop:
107         move.l (%a0)+,(%a1)+
108         subq.b #4,%d0
109         bcc.b lastloop                  // if d0>=0
110         rts
112         .balign 4
113 bmov4loop:                              // move.l*64=64.l=256.b
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         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         sub.l   #256,%d0
179         bcc.w   bmov4loop               // if d0>=0
180         subq.b #4,%d0                   // the byte is positive
181         bcc.b lastloop2
182         rts
184         .balign 4
185 lastloop2:
186         move.l (%a0)+,(%a1)+
187         subq.b #4,%d0
188         bcc.b lastloop2
189         rts
191 #if UNALIGNEDWARNING
192 format040:
193         .string "CopyMemQuick040(%p,%p,%08x) unaligned size\n"
194 #endif