diff options
| author | Eugen Wissner <belka@caraus.de> | 2018-10-02 08:55:29 +0200 |
|---|---|---|
| committer | Eugen Wissner <belka@caraus.de> | 2018-10-02 08:55:29 +0200 |
| commit | 772e87739c848a10a014d3118ff14bd0ca48b2d0 (patch) | |
| tree | b567a3c6fb03d45fb7048632bdb66501e42e65d8 /arch/x64/linux/memory/equal.S | |
| parent | 2a90a812db53728d29a3a821cb292c032437d806 (diff) | |
| download | tanya-772e87739c848a10a014d3118ff14bd0ca48b2d0.tar.gz | |
Replace memory.op.cmp with optimized equal version
Deprecate cmp.
Fix #68.
Diffstat (limited to 'arch/x64/linux/memory/equal.S')
| -rw-r--r-- | arch/x64/linux/memory/equal.S | 59 |
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 |
