also adjust section type from SHT_REL to SHT_RELA
[AROS.git] / arch / m68k-all / exec / copymemquick_060.S
blobe4c70fd782a35a0a2b9146f80ff16db6d85c2f71
1 /*
2     Copyright © 2017, The AROS Development Team. All rights reserved.
3     $Id$
5     Desc: 060+ 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 16
17         .globl  AROS_SLIB_ENTRY(CopyMemQuick_060,Exec,105)
18         .type   AROS_SLIB_ENTRY(CopyMemQuick_060,Exec,105),@function
19 AROS_SLIB_ENTRY(CopyMemQuick_060,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 format060
30         jsr kprintf
31         lea     16(%sp),%sp
32         movem.l (%sp)+,%d0-%d1/%a0-%a1
34 #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 #2048-4,%d0               // min size for move16, less than 252 is dangerous!
39         bcc.b bigmov
40 m4loop:
41         move.l (%a0)+,(%a1)+
42         move.l (%a0)+,(%a1)+
43         subq.l #8,%d0                   // 8 less bytes to MOVE
44         bhi.b m4loop                    // if d0>0
45         beq.b lastm4
46         rts
47 lastm4:
48         move.l (%a0)+,(%a1)+
49         rts
50 ism4or0:
51         beq.b lastm4
52         rts
54 lastloop:
55         move.l (%a0)+,(%a1)+
56         subq.l #4,%d0
57         bhi.b lastloop                  // if d0>0
58         rts
60 bigmov:
61         move.l %a1,%d1
62         lsr.l #3,%d1                    // destination aligned by 8 if bit3/bit#2=0
63         bcc.b destisal8                 // if bit3/bit#2=0
64         move.l (%a0)+,(%a1)+
65         addq.l #1,%d1                   // addq.l #4,d1
66         subq.l #4,%d0
67 destisal8:
68         lsr.l #1,%d1                    // destination aligned by 16 if bit4/bit#3=0
69         bcc.b destisal16                // if bit4/bit#3=0
70         move.l (%a0)+,(%a1)+
71         subq.l #8,%d0
72         move.l (%a0)+,(%a1)+
73 destisal16:
74         move.l %a0,%d1
75         and.w #15,%d1
76         bne.b m4loop                    // if source not aligned by 16
78 #if SAFE_MOVE16
79         cmp.l   #16777216,%a1           // destination must be in 24 bit space
80         bcs.b   m4loop
81         moveq #128-4,%d1
82         cmp.l   #16777216,%a0           // source must be in 24 bit space
83         bcs.b   m4loop
84 #else
85         moveq #128-4,%d1        
86 #endif
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 mov16loop:
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         sub.l   %d1,%d0                 // d0=d0-128
100         bcc.b   mov16loop               // if d0>=0
101         add.l %d1,%d0                   // d0=d0+128, back to positive
102         bne.b lastloop
103         rts
105 #if UNALIGNEDWARNING
106 format060:
107         .string "CopyMemQuick060(%p,%p,%08x) unaligned size\n"
108 #endif