]> git.sur5r.net Git - cc65/blob - libsrc/common/memmove.s
Removed bit opcode, not needed anymore.
[cc65] / libsrc / common / memmove.s
1 ;
2 ; 2003-08-20, Ullrich von Bassewitz
3 ; 2009-09-13, Christian Krueger -- performance increase (about 20%), 2013-07-25 improved unrolling
4 ; 2015-10-23, Greg King
5 ;
6 ; void* __fastcall__ memmove (void* dest, const void* src, size_t size);
7 ;
8 ; NOTE: This function uses entry points from memcpy!
9 ;
10
11         .export         _memmove
12         .import         memcpy_getparams, memcpy_upwards, popax
13         .importzp       ptr1, ptr2, ptr3, ptr4, tmp1
14
15         .macpack        generic
16         .macpack        longbranch
17
18 ; ----------------------------------------------------------------------
19 _memmove:
20         jsr     memcpy_getparams
21
22 ; Check for the copy direction. If dest < src, we must copy upwards (start at
23 ; low addresses and increase pointers), otherwise we must copy downwards
24 ; (start at high addresses and decrease pointers).
25
26         cmp     ptr1
27         txa
28         sbc     ptr1+1
29         jcc     memcpy_upwards  ; Branch if dest < src (upwards copy)
30
31 ; Copy downwards. Adjust the pointers to the end of the memory regions.
32
33         lda     ptr1+1
34         add     ptr3+1
35         sta     ptr1+1
36
37         lda     ptr2+1
38         add     ptr3+1
39         sta     ptr2+1
40
41 ; handle fractions of a page size first
42
43         ldy     ptr3            ; count, low byte
44         bne     @entry          ; something to copy?
45         beq     PageSizeCopy    ; here like bra...
46
47 @copyByte:
48         lda     (ptr1),y
49         sta     (ptr2),y
50 @entry:
51         dey
52         bne     @copyByte
53         lda     (ptr1),y        ; copy remaining byte
54         sta     (ptr2),y
55
56 PageSizeCopy:                   ; assert Y = 0
57         ldx     ptr3+1          ; number of pages
58         beq     done            ; none? -> done
59
60 @initBase:
61         dec     ptr1+1          ; adjust base...
62         dec     ptr2+1
63         dey                     ; in entry case: 0 -> FF
64 @copyBytes:
65         .repeat 3               ; unroll this a bit to make it faster...
66         lda     (ptr1),y        ; important: unrolling three times gives a nice
67         sta     (ptr2),y        ; 255/3 = 85 loop which ends at 0
68         dey
69         .endrepeat
70 @copyEntry:                     ; in entry case: 0 -> FF
71         bne     @copyBytes
72         lda     (ptr1),y        ; Y = 0, copy last byte
73         sta     (ptr2),y
74         dex                     ; one page to copy less
75         bne     @initBase       ; still a page to copy?
76
77 ; Done, return dest
78
79 done:   jmp     popax           ; Pop ptr and return as result