]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/uclibc/lib/contrib/uclibc/libc/string/arm/strlen.S
Inital import
[l4.git] / l4 / pkg / uclibc / lib / contrib / uclibc / libc / string / arm / strlen.S
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, write to the Free
17    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18    02111-1307 USA.  */
19
20 #include <features.h>
21 #include <endian.h>
22 #include <sys/syscall.h>
23 #include <bits/arm_asm.h>
24
25 /* size_t strlen(const char *S)
26  * entry: r0 -> string
27  * exit: r0 = len
28  */
29
30 .text
31 .global strlen
32 .type strlen,%function
33 .align 4
34
35 #if defined(THUMB1_ONLY)
36 /* A simple implementation for when the ARM implementation can't be used.  */
37 .thumb_func
38 strlen:
39         mov r2, #0
40 1:
41         ldrb    r1, [r0, r2]
42         add     r2, r2, #1
43         cmp     r1, #0
44         bne     1b
45         sub     r0, r2, #1
46         bx lr
47 #else
48 strlen:
49         bic     r1, r0, $3              @ addr of word containing first byte
50         ldr     r2, [r1], $4            @ get the first word
51         ands    r3, r0, $3              @ how many bytes are duff?
52         rsb     r0, r3, $0              @ get - that number into counter.
53         beq     Laligned                @ skip into main check routine if no
54                                         @ more
55 #if __BYTE_ORDER == __BIG_ENDIAN
56         orr     r2, r2, $0xff000000     @ set this byte to non-zero
57         subs    r3, r3, $1              @ any more to do?
58         IT(t, gt)
59         orrgt   r2, r2, $0x00ff0000     @ if so, set this byte
60         subs    r3, r3, $1              @ more?
61         IT(t, gt)
62         orrgt   r2, r2, $0x0000ff00     @ then set.
63 #else
64         orr     r2, r2, $0x000000ff     @ set this byte to non-zero
65         subs    r3, r3, $1              @ any more to do?
66         IT(t, gt)
67         orrgt   r2, r2, $0x0000ff00     @ if so, set this byte
68         subs    r3, r3, $1              @ more?
69         IT(t, gt)
70         orrgt   r2, r2, $0x00ff0000     @ then set.
71 #endif
72 Laligned:                               @ here, we have a word in r2.  Does it
73         tst     r2, $0x000000ff         @ contain any zeroes?
74         IT(tttt, ne)
75         tstne   r2, $0x0000ff00         @
76         tstne   r2, $0x00ff0000         @
77         tstne   r2, $0xff000000         @
78         addne   r0, r0, $4              @ if not, the string is 4 bytes longer
79         IT(t, ne)
80         ldrne   r2, [r1], $4            @ and we continue to the next word
81         bne     Laligned                @
82 Llastword:                              @ drop through to here once we find a
83 #if __BYTE_ORDER == __BIG_ENDIAN
84         tst     r2, $0xff000000         @ word that has a zero byte in it
85         IT(tttt, ne)
86         addne   r0, r0, $1              @
87         tstne   r2, $0x00ff0000         @ and add up to 3 bytes on to it
88         addne   r0, r0, $1              @
89         tstne   r2, $0x0000ff00         @ (if first three all non-zero, 4th
90         IT(t, ne)
91         addne   r0, r0, $1              @  must be zero)
92 #else
93         tst     r2, $0x000000ff         @
94         IT(tttt, ne)
95         addne   r0, r0, $1              @
96         tstne   r2, $0x0000ff00         @ and add up to 3 bytes on to it
97         addne   r0, r0, $1              @
98         tstne   r2, $0x00ff0000         @ (if first three all non-zero, 4th
99         IT(t, ne)
100         addne   r0, r0, $1              @  must be zero)
101 #endif
102 #if defined(__USE_BX__)
103         bx      lr
104 #else
105         mov     pc,lr
106 #endif
107 #endif
108
109 .size strlen,.-strlen
110
111 libc_hidden_def(strlen)