12
12
13
13
if 1
14
14
15
- ; Optimized for the no-overlap case
15
+ ; Optimized for when src != dst
16
16
_memmove:
17
- ; no-overlap | LDIR | 32F + 12R + 1
18
- ; src > dst | LDIR | 32F + 12R + 1
19
- ; src < dst | LDDR | 36F + 9R + 2
20
- ; src = dst | LDDR | 36F + 9R + 2
21
- ; zero size | | 24F + 9R + 2
17
+ ; src > dst | LDIR | 32F + 12R + 1
18
+ ; src < dst | LDDR | 35F + 9R + 2
19
+ ; src = dst | LDDR | 35F + 9R + 2
20
+ ; zero size | | 24F + 9R + 2
22
21
23
22
ld iy, -1
24
23
add iy, sp
@@ -34,35 +33,31 @@ _memmove:
34
33
; .copy_forwards:
35
34
add hl, de
36
35
inc hl
37
- ; src > dst or no-overlap
36
+ ; src > dst
38
37
ldir
39
38
.zero:
40
39
ld hl, (iy + 4)
41
40
ret
42
41
.copy_backwards:
43
42
; move HL and DE to the end
44
- add hl, de ; HL = src - 1
45
- dec de ; DE = dst - 1
46
- add hl, bc
47
43
ex de, hl
48
44
add hl, bc
49
- ex de, hl
50
- ; HL = src + size - 1
51
- ; DE = dst + size - 1
45
+ ex de, hl ; HL = src - dst - 1, DE = dst + size
46
+ add hl, de ; HL = src + size - 1
47
+ dec de ; DE = dst + size - 1
52
48
lddr
53
49
ex de, hl
54
50
inc hl
55
51
ret
56
52
57
53
else
58
54
59
- ; Optimized for the overlapping case
55
+ ; Optimized for when src = dst
60
56
_memmove:
61
- ; no overlap | LDIR | 34F + 12R + 2
62
- ; src > dst | LDIR | 34F + 12R + 2
63
- ; src < dst | LDDR | 36F + 9R + 2
64
- ; src = dst | | 30F + 9R + 2
65
- ; zero size | | 24F + 9R + 2
57
+ ; src > dst | LDIR | 34F + 12R + 2
58
+ ; src < dst | LDDR | 36F + 9R + 2
59
+ ; src = dst | | 30F + 9R + 2
60
+ ; zero size | | 24F + 9R + 2
66
61
67
62
ld iy, -1
68
63
add iy, sp
0 commit comments