12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- #include <endian.h>
- #include <sys/syscall.h>
- .global strlen
- .set strlen,__strlen
- .text
- .global __strlen
- .hidden __strlen
- .type __strlen,%function
- .align 4
- __strlen:
- bic r1, r0, $3
- ldr r2, [r1], $4
- ands r3, r0, $3
- rsb r0, r3, $0
- beq Laligned
-
- #if __BYTE_ORDER == __BIG_ENDIAN
- orr r2, r2, $0xff000000
- subs r3, r3, $1
- orrgt r2, r2, $0x00ff0000
- subs r3, r3, $1
- orrgt r2, r2, $0x0000ff00
- #else
- orr r2, r2, $0x000000ff
- subs r3, r3, $1
- orrgt r2, r2, $0x0000ff00
- subs r3, r3, $1
- orrgt r2, r2, $0x00ff0000
- #endif
- Laligned:
- tst r2, $0x000000ff
- tstne r2, $0x0000ff00
- tstne r2, $0x00ff0000
- tstne r2, $0xff000000
- addne r0, r0, $4
- ldrne r2, [r1], $4
- bne Laligned
- Llastword:
- #if __BYTE_ORDER == __BIG_ENDIAN
- tst r2, $0xff000000
- addne r0, r0, $1
- tstne r2, $0x00ff0000
- addne r0, r0, $1
- tstne r2, $0x0000ff00
- addne r0, r0, $1
- #else
- tst r2, $0x000000ff
- addne r0, r0, $1
- tstne r2, $0x0000ff00
- addne r0, r0, $1
- tstne r2, $0x00ff0000
- addne r0, r0, $1
- #endif
- mov pc,lr
- .size __strlen,.-__strlen
|