1 /* Copyright (c) 2010-2011,2013 Linaro Limited
4 Redistribution and use in source and binary forms, with or without
5 modification, are permitted provided that the following conditions
8 * Redistributions of source code must retain the above copyright
9 notice, this list of conditions and the following disclaimer.
11 * Redistributions in binary form must reproduce the above copyright
12 notice, this list of conditions and the following disclaimer in the
13 documentation and/or other materials provided with the distribution.
15 * Neither the name of Linaro Limited nor the names of its
16 contributors may be used to endorse or promote products derived
17 from this software without specific prior written permission.
19 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38 .macro def_fn f p2align=0
54 /* This code requires Thumb. */
58 /* Parameters and result. */
62 /* Internal variables. */
68 #define tmp1 r4 /* Overlaps const_0 */
71 def_fn strlen p2align=6
73 strd r4, r5, [sp, #-8]!
76 ands tmp1, srcin, #7 /* (8 - bytes) to alignment. */
83 ldrd data1a, data1b, [src]
85 add result, result, #8
87 uadd8 data1a, data1a, const_m1 /* Saturating GE<0:3> set. */
88 sel data1a, const_0, const_m1 /* Select based on GE<0:3>. */
89 uadd8 data1b, data1b, const_m1
90 sel data1b, data1a, const_m1 /* Only used if d1a == 0. */
91 cbnz data1b, .Lnull_found
94 ldrd data1a, data1b, [src, #8]
95 uadd8 data1a, data1a, const_m1 /* Saturating GE<0:3> set. */
96 add result, result, #8
97 sel data1a, const_0, const_m1 /* Select based on GE<0:3>. */
98 uadd8 data1b, data1b, const_m1
99 sel data1b, data1a, const_m1 /* Only used if d1a == 0. */
100 cbnz data1b, .Lnull_found
103 ldrd data1a, data1b, [src, #16]
104 uadd8 data1a, data1a, const_m1 /* Saturating GE<0:3> set. */
105 add result, result, #8
106 sel data1a, const_0, const_m1 /* Select based on GE<0:3>. */
107 uadd8 data1b, data1b, const_m1
108 sel data1b, data1a, const_m1 /* Only used if d1a == 0. */
109 cbnz data1b, .Lnull_found
112 ldrd data1a, data1b, [src, #24]
114 uadd8 data1a, data1a, const_m1 /* Saturating GE<0:3> set. */
115 add result, result, #8
116 sel data1a, const_0, const_m1 /* Select based on GE<0:3>. */
117 uadd8 data1b, data1b, const_m1
118 sel data1b, data1a, const_m1 /* Only used if d1a == 0. */
125 addeq result, result, #4
131 ldrd r4, r5, [sp], #8
132 add result, result, data1a, lsr #3 /* Bits -> Bytes. */
136 ldrd data1a, data1b, [src]
139 lsl tmp2, tmp2, #3 /* Bytes -> bits. */
142 S2HI tmp2, const_m1, tmp2
143 orn data1a, data1a, tmp2
145 ornne data1b, data1b, tmp2
146 movne data1a, const_m1
149 .size strlen, . - strlen