summaryrefslogtreecommitdiff
path: root/arch/x64/linux/memory/copy.S
blob: bf74e0f78e3191f97782b641e9d6e1bb06be7318 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
	.text

/*
 * copyMemory.
 *
 * rdi - source length
 * rsi - source data.
 * rdx - target length.
 * rcx - target data.
 */
	.globl _D5tanya6memory2op10copyMemoryFNaNbNixAvAvZv
	.type _D5tanya6memory2op10copyMemoryFNaNbNixAvAvZv, @function

_D5tanya6memory2op10copyMemoryFNaNbNixAvAvZv:
		mov %rdi, %rdx
		mov %rcx, %rdi

		cmp  $0x08, %rdx
		jc aligned_1
		test $0x07, %edi
		jz aligned_8

	naligned:
		movsb
		dec  %rdx
		test $0x07, %edi
		jnz naligned

	aligned_8:
		mov %rdx,  %rcx
		shr $0x03, %rcx
		rep movsq
		and $0x07, %edx
		jz end

	aligned_1:
		// Write the remaining bytes
		mov %rdx, %rcx
		rep movsb

	end:
		ret

/*
 * moveMemory.
 *
 * rdi - source length
 * rsi - source data.
 * rdx - target length.
 * rcx - target data.
 */
	.globl _D5tanya6memory2op10moveMemoryFNaNbNixAvAvZv
	.type _D5tanya6memory2op10moveMemoryFNaNbNixAvAvZv, @function

_D5tanya6memory2op10moveMemoryFNaNbNixAvAvZv:
		mov %rdi, %rdx

		lea -1(%rdx, %rsi), %rsi
		lea -1(%rdx, %rcx), %rdi
		mov %rdx, %rcx

		std // Set the direction flag

		rep movsb

		cld // Clear the direction flag
		ret