summaryrefslogtreecommitdiff
path: root/zap/source/amd64/mem/memfnd.S
diff options
context:
space:
mode:
Diffstat (limited to 'zap/source/amd64/mem/memfnd.S')
-rw-r--r--zap/source/amd64/mem/memfnd.S50
1 files changed, 50 insertions, 0 deletions
diff --git a/zap/source/amd64/mem/memfnd.S b/zap/source/amd64/mem/memfnd.S
new file mode 100644
index 0000000..0b5a47e
--- /dev/null
+++ b/zap/source/amd64/mem/memfnd.S
@@ -0,0 +1,50 @@
+# 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/.
+
+.globl zap_memfnd
+
+zap_memfnd:
+# Address of the current element:
+#define addr %rax
+# Address of the first element:
+#define start %rdi
+# Address of the element after the last element:
+#define afterbuf %rsi
+# Byte value:
+#define cmp %dl
+# Current byte:
+#define val %cl
+
+ movq start,addr # addr = start
+
+ addq start,afterbuf # afterbuf += start
+
+ # Iterate over the array:
+.loop:
+
+ # Check if we have reached the end of the array:
+ cmpq addr,afterbuf # if (addr == afterbuf)
+ je .nfnd # goto nfnd
+
+ # Check if we have found the byte value:
+ movb (addr),val # val = *addr
+ cmpb val,cmp # if (val == cmp)
+ je .fnd # goto fnd
+
+ # Continue to the next byte:
+ incq addr # ++addr
+ jmp .loop # goto loop
+
+ # Found:
+.fnd:
+
+ # Get the offset of the byte:
+ subq start,addr # addr -= start
+ ret # return addr
+
+ # Not found:
+.nfnd:
+
+ movq $0xFFFFFFFFFFFFFFFF,addr # addr = FFFFFFFFFFFFFFFF
+ ret # return addr