diff options
Diffstat (limited to 'zap/src/mem/streq.S')
-rw-r--r-- | zap/src/mem/streq.S | 57 |
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 |