37 lines
537 B
ArmAsm
37 lines
537 B
ArmAsm
.global _strlen
|
|
.type _strlen, @function
|
|
|
|
_strlen:
|
|
mov r4, r0
|
|
mov #0, r2
|
|
|
|
/* Check 3 bytes to make sure we don't skip any when aligning */
|
|
mov.b @r0+, r1
|
|
tst r1, r1
|
|
bt .end
|
|
mov.b @r0+, r1
|
|
tst r1, r1
|
|
bt .end
|
|
mov.b @r0+, r1
|
|
tst r1, r1
|
|
bt .end
|
|
|
|
/* Align to a 4-byte boundary */
|
|
or #3, r0
|
|
xor #3, r0
|
|
|
|
/* Read bytes by groups of 4 */
|
|
1: mov.l @r0+, r1
|
|
cmp/str r1, r2
|
|
bf 1b
|
|
|
|
/* Go back to find out which of the last 4 bytes is the NUL */
|
|
add #-4, r0
|
|
2: mov.b @r0+, r1
|
|
tst r1, r1
|
|
bf 2b
|
|
|
|
.end: add #-1, r0
|
|
rts
|
|
sub r4, r0
|