revert between 56095 -> 55830 in arch
[AROS.git] / arch / m68k-all / exec / copymem_020.S
blobc9c7341d8253a2b74a230510f4e7b463101deb91
1 /*
2     Copyright © 2017, The AROS Development Team. All rights reserved.
3     $Id$
5     Desc: Optimized 020+ CopyMem by Matt Hey
6     Lang: english
7 */
9         #include "aros/m68k/asm.h"
11         .text
12         .balign 4
14         .globl  AROS_SLIB_ENTRY(CopyMem_020,Exec,104)
15         .type   AROS_SLIB_ENTRY(CopyMem_020,Exec,104),@function
16 AROS_SLIB_ENTRY(CopyMem_020,Exec,104):
18         subq.l #4,%d0                   // size is 4 less than actual!
19         bls.b smallcopy                 // if size<=4 bytes
20         move.l %a1,%d1
21         btst #0,%d1
22         beq.b daligned2
23         move.b (%a0)+,(%a1)+
24         addq.l #1,%d1
25         subq.l #1,%d0
26 daligned2:                                      // dest should be WORD aligned now
27         btst #1,%d1
28         beq.b daligned4
29         move.w (%a0)+,(%a1)+
30         subq.l #2,%d0
31         bcs.b last2                             // if size<0
32 daligned4:                                      // dest should be LONG aligned now
33         cmp.l #256-4,%d0                // min size for move16, less than 252 is dangerous!
34         bcc.b bigmove
35 move4loop:
36         move.l (%a0)+,(%a1)+
37         subq.w #4,%d0
38         bhi.b move4loop         // if size>0
39 smallcopy:
40         bne.b last2
41 move4:
42         move.l (%a0),(%a1)
43         rts
45         .balign 4
46 bigmove:
47         moveq #128-4,%d1
48         sub.l %d1,%d0                   // size is now 128 less than actual
49         addq.l #4,%d1                   // d1=128=bytes to move per loop
50 bigmove4:
51         move.l (%a0)+,(%a1)+
52         move.l (%a0)+,(%a1)+
53         move.l (%a0)+,(%a1)+
54         move.l (%a0)+,(%a1)+
55         move.l (%a0)+,(%a1)+
56         move.l (%a0)+,(%a1)+
57         move.l (%a0)+,(%a1)+
58         move.l (%a0)+,(%a1)+
59         move.l (%a0)+,(%a1)+
60         move.l (%a0)+,(%a1)+
61         move.l (%a0)+,(%a1)+
62         move.l (%a0)+,(%a1)+
63         move.l (%a0)+,(%a1)+
64         move.l (%a0)+,(%a1)+
65         move.l (%a0)+,(%a1)+
66         move.l (%a0)+,(%a1)+
67         move.l (%a0)+,(%a1)+
68         move.l (%a0)+,(%a1)+
69         move.l (%a0)+,(%a1)+
70         move.l (%a0)+,(%a1)+
71         move.l (%a0)+,(%a1)+
72         move.l (%a0)+,(%a1)+
73         move.l (%a0)+,(%a1)+
74         move.l (%a0)+,(%a1)+
75         move.l (%a0)+,(%a1)+
76         move.l (%a0)+,(%a1)+
77         move.l (%a0)+,(%a1)+
78         move.l (%a0)+,(%a1)+
79         move.l (%a0)+,(%a1)+
80         move.l (%a0)+,(%a1)+
81         move.l (%a0)+,(%a1)+
82         move.l (%a0)+,(%a1)+
83         sub.l   %d1,%d0                 // d0=d0-128
84         bcc.b   bigmove4                        // if d0>=0
85         add.l %d1,%d0                   // d0=d0+128, back to positive
86         subq.l #4,%d0
87         bcs.b last2
88 lloop:
89         move.l (%a0)+,(%a1)+
90         subq.w #4,%d0
91         bcc.b lloop
92 last2:
93         btst #1,%d0
94         beq.b last1
95         move.w (%a0)+,(%a1)+
96 last1:
97         btst #0,%d0
98         bne.b move1
99         rts
101         .balign 4
102 move1:
103         move.b (%a0),(%a1)
104         rts