1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- /*
- * Copyright (C) 2004-2007 Atmel Corporation
- *
- * This file is subject to the terms and conditions of the GNU Lesser General
- * Public License. See the file "COPYING.LIB" in the main directory of this
- * archive for more details.
- */
- #include <features.h>
- #define str r12
- .text
- .global strlen
- .type strlen, @function
- strlen:
- mov r11, r12
- mov r9, str
- andl r9, 3, COH
- brne .Lunaligned_str
- 1: ld.w r8, str++
- tnbz r8
- brne 1b
- sub r12, r11
- bfextu r9, r8, 24, 8
- cp.w r9, 0
- subeq r12, 4
- reteq r12
- bfextu r9, r8, 16, 8
- cp.w r9, 0
- subeq r12, 3
- reteq r12
- bfextu r9, r8, 8, 8
- cp.w r9, 0
- subeq r12, 2
- reteq r12
- sub r12, 1
- retal r12
- .Lunaligned_str:
- add pc, pc, r9 << 3
- sub r0, r0, 0 /* 4-byte nop */
- ld.ub r8, str++
- sub r8, r8, 0
- breq 1f
- ld.ub r8, str++
- sub r8, r8, 0
- breq 1f
- ld.ub r8, str++
- sub r8, r8, 0
- brne 1b
- 1: sub r12, 1
- sub r12, r11
- retal r12
- .size strlen, . - strlen
- libc_hidden_def(strlen)
|