strlen.S revision 150875
1/*- 2 * Copyright (c) 2005 Olivier Houchard 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 16 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 20 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 23 * SUCH DAMAGE. 24 */ 25 26#include <machine/asm.h> 27__FBSDID("$FreeBSD: head/lib/libc/arm/string/strlen.S 150875 2005-10-03 14:21:49Z cognet $"); 28 29ENTRY(strlen) 30 mov r1, #0 31 /* Check that the pointer is aligned on 32 bits. */ 32 ands r3, r0, #3 33 beq .Loop 34 sub r0, r0, r3 35 ldr r2, [r0] 36 add r0, r0, #4 37 cmp r3, #2 38 blt .Ldo_3 39 bgt .Ldo_1 40 /* So that the N bit is set. */ 41 cmp r3, #0 42 b .Ldo_2 43 44.Loop: 45 ldr r2, [r0] 46 add r0, r0, #4 47#ifndef __ARMEB__ 48 ands r3, r2, #0x000000ff 49#else 50 ands r3, r2, #0xff000000 51#endif 52 addne r1, r1, #1 53.Ldo_3: 54#ifndef __ARMEB__ 55 andnes r3, r2, #0x0000ff00 56#else 57 andnes r3, r2, #0x00ff0000 58#endif 59 addne r1, r1, #1 60.Ldo_2: 61#ifndef __ARMEB__ 62 andnes r3, r2, #0x00ff0000 63#else 64 andnes r3, r2, #0x0000ff00 65#endif 66 addne r1, r1, #1 67.Ldo_1: 68#ifndef __ARMEB__ 69 andnes r3, r2, #0xff000000 70#else 71 andnes r3, r2, #0x000000ff 72#endif 73 addne r1, r1, #1 74 bne .Loop 75.Lexit: 76 mov r0, r1 77 RET 78