- Removed unused HandleEvent method.
[AROS.git] / arch / m68k-all / exec / copymemquick.S
blobd392f187a7edb6f75fe59047a40f5a2fd0443e14
1 /*
2     Copyright © 1995-2012, The AROS Development Team. All rights reserved.
3     $Id: $
5     Desc: Optimized CopyMemQuick by Matt Hey.
6     Lang: english
7 */
9         #include "aros/m68k/asm.h"
11 #define UNALIGNEDWARNING 1
13         .text
14         .balign 4
16         .globl  AROS_SLIB_ENTRY(CopyMemQuick,Exec,105)
17         .type   AROS_SLIB_ENTRY(CopyMemQuick,Exec,105),@function
18 AROS_SLIB_ENTRY(CopyMemQuick,Exec,105):
20 #if UNALIGNEDWARNING
21         move.w  %d0,%d1
22         and.w   #3,%d1
23         beq.s   0f
24         movem.l %d0-%d1/%a0-%a1,-(%sp)
25         move.l  %d0,-(%sp)
26         move.l  %a1,-(%sp)
27         move.l  %a0,-(%sp)
28         pea format
29         jsr kprintf
30         lea     16(%sp),%sp
31         movem.l (%sp)+,%d0-%d1/%a0-%a1
33 #endif
35         subq.l #4,%d0           // size is 4.b less than actual
36         bls.b ism4or0           // if d0<=0
37 prem4:
38         cmp.l #256-4,%d0        // min size for bigmove loop, less than 128 is dangerous!
39         bcc.b bigmov
40 m4loop:
41         move.l (%a0)+,(%a1)+
42         move.l (%a0)+,(%a1)+
43         subq.w #8,%d0                   // 8 less bytes to MOVE
44         bhi.b m4loop                    // if d0>0
45 ism4or0:
46         beq.b lastm4
47         rts
48 lastm4:
49         move.l (%a0),(%a1)
50         rts
52         .balign 4
53 lastloop:
54         move.l (%a0)+,(%a1)+
55         subq.w #4,%d0
56         bhi.b lastloop                  // if d0>=0
57         rts
59         .balign 4
60 bigmov:
61         moveq #128-4,%d1
62         sub.l %d1,%d0                           // size is now 128 less than actual
63         addq.l #4,%d1                   // d1=128=bytes to move per loop
64 bigmov4:
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         move.l (%a0)+,(%a1)+
84         move.l (%a0)+,(%a1)+
85         move.l (%a0)+,(%a1)+
86         move.l (%a0)+,(%a1)+
87         move.l (%a0)+,(%a1)+
88         move.l (%a0)+,(%a1)+
89         move.l (%a0)+,(%a1)+
90         move.l (%a0)+,(%a1)+
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         sub.l   %d1,%d0                         // d0=d0-128
98         bcc.b   bigmov4                 // if d0>=0
99         add.l %d1,%d0                           // d0=d0+128, back to positive
100         bne.b lastloop
101         rts
103 #if UNALIGNEDWARNING
104 format:
105         .string "CopyMemQuick(%p,%p,%08x) unaligned size\n"
106 #endif