/* * 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)