1/* Copyright (C) 1998 Free Software Foundation, Inc. 2 This file is part of the GNU C Library. 3 Code contributed by Matthew Wilcox <willy@odie.barnet.ac.uk> 4 5 The GNU C Library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Lesser General Public 7 License as published by the Free Software Foundation; either 8 version 2.1 of the License, or (at your option) any later version. 9 10 The GNU C Library is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public 16 License along with the GNU C Library; if not, see 17 <http://www.gnu.org/licenses/>. */ 18 19#include <features.h> 20#include <endian.h> 21#include <bits/arm_asm.h> 22#include <bits/arm_bx.h> 23 24/* size_t strlen(const char *S) 25 * entry: r0 -> string 26 * exit: r0 = len 27 */ 28 29.text 30.global strlen 31.type strlen,%function 32.align 4 33 34#if defined(THUMB1_ONLY) 35/* A simple implementation for when the ARM implementation can't be used. */ 36.thumb_func 37strlen: 38 mov r2, #0 391: 40 ldrb r1, [r0, r2] 41 add r2, r2, #1 42 cmp r1, #0 43 bne 1b 44 sub r0, r2, #1 45 bx lr 46#else 47strlen: 48 bic r1, r0, $3 @ addr of word containing first byte 49 ldr r2, [r1], $4 @ get the first word 50 ands r3, r0, $3 @ how many bytes are duff? 51 rsb r0, r3, $0 @ get - that number into counter. 52 beq Laligned @ skip into main check routine if no 53 @ more 54#if __BYTE_ORDER == __BIG_ENDIAN 55 orr r2, r2, $0xff000000 @ set this byte to non-zero 56 subs r3, r3, $1 @ any more to do? 57 IT(t, gt) 58 orrgt r2, r2, $0x00ff0000 @ if so, set this byte 59 subs r3, r3, $1 @ more? 60 IT(t, gt) 61 orrgt r2, r2, $0x0000ff00 @ then set. 62#else 63 orr r2, r2, $0x000000ff @ set this byte to non-zero 64 subs r3, r3, $1 @ any more to do? 65 IT(t, gt) 66 orrgt r2, r2, $0x0000ff00 @ if so, set this byte 67 subs r3, r3, $1 @ more? 68 IT(t, gt) 69 orrgt r2, r2, $0x00ff0000 @ then set. 70#endif 71Laligned: @ here, we have a word in r2. Does it 72 tst r2, $0x000000ff @ contain any zeroes? 73 IT(tttt, ne) 74 tstne r2, $0x0000ff00 @ 75 tstne r2, $0x00ff0000 @ 76 tstne r2, $0xff000000 @ 77 addne r0, r0, $4 @ if not, the string is 4 bytes longer 78 IT(t, ne) 79 ldrne r2, [r1], $4 @ and we continue to the next word 80 bne Laligned @ 81Llastword: @ drop through to here once we find a 82#if __BYTE_ORDER == __BIG_ENDIAN 83 tst r2, $0xff000000 @ word that has a zero byte in it 84 IT(tttt, ne) 85 addne r0, r0, $1 @ 86 tstne r2, $0x00ff0000 @ and add up to 3 bytes on to it 87 addne r0, r0, $1 @ 88 tstne r2, $0x0000ff00 @ (if first three all non-zero, 4th 89 IT(t, ne) 90 addne r0, r0, $1 @ must be zero) 91#else 92 tst r2, $0x000000ff @ 93 IT(tttt, ne) 94 addne r0, r0, $1 @ 95 tstne r2, $0x0000ff00 @ and add up to 3 bytes on to it 96 addne r0, r0, $1 @ 97 tstne r2, $0x00ff0000 @ (if first three all non-zero, 4th 98 IT(t, ne) 99 addne r0, r0, $1 @ must be zero) 100#endif 101 BX(lr) 102#endif 103 104.size strlen,.-strlen 105 106libc_hidden_def(strlen) 107