summaryrefslogtreecommitdiff
path: root/zap/src/mem/streq.S
diff options
context:
space:
mode:
Diffstat (limited to 'zap/src/mem/streq.S')
-rw-r--r--zap/src/mem/streq.S57
1 files changed, 57 insertions, 0 deletions
diff --git a/zap/src/mem/streq.S b/zap/src/mem/streq.S
new file mode 100644
index 0000000..d331e93
--- /dev/null
+++ b/zap/src/mem/streq.S
@@ -0,0 +1,57 @@
+/*
+ Copyright 2022 Gabriel Jensen.
+ This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
+ If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
+*/
+
+#include <zap/priv.h>
+
+.globl zap_streq
+
+zap_streq:
+
+ /*
+ char const * lstr
+ char const * rstr
+ */
+
+#if defined(__amd64__)
+
+ # rdi: Address of the current left character.
+ # rsi: Address of the current right character.
+ # rax: Current left character.
+ # rdx: Current right character.
+
+ # Iterate over the strings:
+.loop:
+
+ # Copy the characters into registers:
+ movb (%rdi),%al
+ movb (%rsi),%dl
+
+ # Check if the characters are equal:
+ cmpb %al,%dl
+ jne .neq # If not, the strings also aren't equal.
+
+ # Check if we have reached the null-terminator:
+ testb %al,%al
+ jz .eq # If so, all previous characters have compared equal, and the strings are equal.
+
+ # Continue to the next characters:
+ incq %rdi
+ incq %rsi
+ jmp .loop
+
+ # The strings have compared equal:
+.eq:
+
+ movb $0xFF,%al
+ ret
+
+ /* The strings have compared unequal: */
+.neq:
+
+ movb $0x0,%al
+ ret
+
+#endif