summaryrefslogblamecommitdiff
path: root/rgo/src/strlen.S
blob: 19cb80637af70224acfddb6ba072f75e9ce9ed7a (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
  


                                                                                                                    






                  
          
                                
          















                                                                        


                                                    
      
                       

                                                                        
                                                       

                 


                      
/*
	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 <rgo.h>

.global rgo_strlen

rgo_strlen:
	/*
		char const * str
	*/
#if defined(__i386__)
	/* eax: Address of the current character. */
	movl 0x4(%esp),%eax
	/* ecx: Address of the first character. */
	movl %eax,%ecx
	/* edx: Current character. */
.loop:
	movb (%eax),%dl
	testb %dl,%dl
	jz .done /* Exit loop if we have reached the null-terminator. */
	incl %eax /* Continue to the next character. */
	jmp .loop
.done:
	subl %ecx,%eax
	ret
#elif defined(__x86_64__)
	/* rax: Address of the current character. */
	movq %rdi,%rax
	/* rdx: Current character. */
.loop:
	movb (%rax),%dl
	testb %dl,%dl
	jz .done /* Exit loop if we have reached the null-terminator. */
	incq %rax /* Continue to the next character. */
	jmp .loop
.done:
	subq %rdi,%rax
	ret
#endif