diff options
Diffstat (limited to 'rgo/src/fndchr.S')
-rw-r--r-- | rgo/src/fndchr.S | 30 |
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 |