diff options
Diffstat (limited to 'zap/source/amd64/mem/utf20len.S')
-rw-r--r-- | zap/source/amd64/mem/utf20len.S | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/zap/source/amd64/mem/utf20len.S b/zap/source/amd64/mem/utf20len.S index 5af352b..03f8254 100644 --- a/zap/source/amd64/mem/utf20len.S +++ b/zap/source/amd64/mem/utf20len.S @@ -5,31 +5,34 @@ .globl zap_utf20len zap_utf20len: - # rax: Address of the current character. - # rdi: Address of the first character. - # rdx: Current character. +# Address of the current character: +#define addr %rax +# Address of the first character: +#define start %rdi +# Current character: +#define chr %edx - movq %rdi,%rax + movq start,addr # Iterate over the string: .loop: # Move the character into a register: - movl (%rax),%edx + movl (addr),chr # chr = *addr # Check if we have reached the null-terminator: - testl %edx,%edx - jz .done # If so, we are done. + testl chr,chr # if (chr == 0x0) + jz .done # goto done # Continue to the next character: - addq $0x4,%rax - jmp .loop + addq $0x4,addr # addr += 0x4 + jmp .loop # goto loop # Done: .done: # Get the length: - subq %rdi,%rax - shrq $0x2,%rax # Divide by four to get the number of doublewords rather than bytes. + subq start,addr # addr -= start + shrq $0x2,addr # addr /= 0x4 // Divide by four to get the number of doublewords rather than bytes. - ret + ret # return addr |