summaryrefslogtreecommitdiff
path: root/arch/x64/linux/memory/equal.S
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x64/linux/memory/equal.S')
-rw-r--r--arch/x64/linux/memory/equal.S59
1 files changed, 59 insertions, 0 deletions
diff --git a/arch/x64/linux/memory/equal.S b/arch/x64/linux/memory/equal.S
new file mode 100644
index 0000000..37a906a
--- /dev/null
+++ b/arch/x64/linux/memory/equal.S
@@ -0,0 +1,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