summaryrefslogtreecommitdiff
path: root/arch/x64/linux/memory/equal.S
blob: 37a906a395e417efc364653e3b5e2401b9660098 (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
	.text

/*
 * equalMemory.
 *
 * rdi - r1 length
 * rsi - r1 data.
 * rdx - r2 length.
 * rcx - r2 data.
 */
	.globl _D5tanya6memory2op11equalMemoryFNaNbNixAvxQdZb
	.type _D5tanya6memory2op11equalMemoryFNaNbNixAvxQdZb, @function
_D5tanya6memory2op11equalMemoryFNaNbNixAvxQdZb:
		// Compare the lengths
		cmp %rdx, %rdi
		jne not_equal

		mov %rcx, %rdi

		// Check if we're aligned
		cmp $0x08, %rdx
		jc aligned_1
		test $0x07, %edi
		jz aligned_8

	naligned:
		cmpsb
		jne not_equal

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

	aligned_8:
		mov %rdx,  %rcx
		shr $0x03, %rcx

		repe cmpsq
		jne not_equal

		and $0x07, %edx
		jz equal

	aligned_1: // Compare the remaining bytes
		mov %rdx, %rcx
		cmp $0x0, %rcx

		repe cmpsb
		jne not_equal

	equal:
		mov $0x01, %rax // Return 1
		jmp end

	not_equal:
		xor %rax, %rax // Return 0

	end:
		ret