diff options
Diffstat (limited to 'zap/src/mem/fndbyte.S')
-rw-r--r-- | zap/src/mem/fndbyte.S | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/zap/src/mem/fndbyte.S b/zap/src/mem/fndbyte.S new file mode 100644 index 0000000..4413b42 --- /dev/null +++ b/zap/src/mem/fndbyte.S @@ -0,0 +1,59 @@ +/* + 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_fndbyte + +zap_fndbyte: + + /* + void const * ptr + zap_sz num + unsigned char byte + */ + +#if defined(__amd64__) + + # rax: Address of the current element. + # rdi: Address of the first element. + # rsi: Address of the element after the last element. + # rdx: Byte value. + # rcx: Current byte. + + movq %rdi,%rax + + addq %rdi,%rsi + + # Iterate over the array: +.loop: + + # Check if we have reached the end of the array: + cmpq %rax,%rsi + je .nfnd + + # Check if we have found the byte value: + movb (%rax),%cl + cmpb %cl,%dl + je .fnd + + # Continue to the next byte: + incq %rax + jmp .loop + + # Found: +.fnd: + + subq %rdi,%rax + ret + + # Not found: +.nfnd: + + movq $0xFFFFFFFFFFFFFFFF,%rax + ret + +#endif |