summaryrefslogtreecommitdiff
path: root/rgo/src/fndchr.S
diff options
context:
space:
mode:
Diffstat (limited to 'rgo/src/fndchr.S')
-rw-r--r--rgo/src/fndchr.S30
1 files changed, 25 insertions, 5 deletions
diff --git a/rgo/src/fndchr.S b/rgo/src/fndchr.S
index 1008e52..f12f4c5 100644
--- a/rgo/src/fndchr.S
+++ b/rgo/src/fndchr.S
@@ -19,22 +19,42 @@ rgo_fndchr:
char const * str
char chr
*/
-#if defined(__x86_64__)
+#if defined(__i386__)
+ /* eax: Address of the current character. */
+ movl 0x4(%esp),%eax
+ /* ecx: Character. */
+ movb 0x8(%esp),%cl
+ /* edx: Current character. */
+.loop:
+ movb (%eax),%dl
+ cmpb %dl,%cl
+ je .fnd /* Exit loop if we have found the character. */
+ testb %dl,%dl
+ je .nfnd /* We encountered the null-terminator but not the specified character. */
+ incl %eax
+ jmp .loop
+.fnd:
+ subl 0x4(%esp),%eax
+ ret
+.nfnd:
+ movl $0xFFFFFFFF,%eax
+ ret
+#elif defined(__x86_64__)
/* rax: Address of the current character. */
movq %rdi,%rax
/* rdx: Current character. */
.loop:
movb (%rax),%dl
cmpb %dl,%sil
- je .done /* Exit loop if we have found the character. */
+ je .fnd /* Exit loop if we have found the character. */
testb %dl,%dl
- je .err /* We encountered the null-terminator but not the specified character. */
+ je .nfnd /* We encountered the null-terminator but not the specified character. */
incq %rax
jmp .loop
-.done:
+.fnd:
subq %rdi,%rax
ret
-.err:
+.nfnd:
movq $0xFFFFFFFFFFFFFFFF,%rax
ret
#endif