xref: /aosp_15_r20/bionic/libc/arch-x86/string/sse2-strlen-slm.S (revision 8d67ca893c1523eb926b9080dbe4e2ffd2a27ba1)
1*8d67ca89SAndroid Build Coastguard Worker/*
2*8d67ca89SAndroid Build Coastguard WorkerCopyright (c) 2014, Intel Corporation
3*8d67ca89SAndroid Build Coastguard WorkerAll rights reserved.
4*8d67ca89SAndroid Build Coastguard Worker
5*8d67ca89SAndroid Build Coastguard WorkerRedistribution and use in source and binary forms, with or without
6*8d67ca89SAndroid Build Coastguard Workermodification, are permitted provided that the following conditions are met:
7*8d67ca89SAndroid Build Coastguard Worker
8*8d67ca89SAndroid Build Coastguard Worker    * Redistributions of source code must retain the above copyright notice,
9*8d67ca89SAndroid Build Coastguard Worker    * this list of conditions and the following disclaimer.
10*8d67ca89SAndroid Build Coastguard Worker
11*8d67ca89SAndroid Build Coastguard Worker    * Redistributions in binary form must reproduce the above copyright notice,
12*8d67ca89SAndroid Build Coastguard Worker    * this list of conditions and the following disclaimer in the documentation
13*8d67ca89SAndroid Build Coastguard Worker    * and/or other materials provided with the distribution.
14*8d67ca89SAndroid Build Coastguard Worker
15*8d67ca89SAndroid Build Coastguard Worker    * Neither the name of Intel Corporation nor the names of its contributors
16*8d67ca89SAndroid Build Coastguard Worker    * may be used to endorse or promote products derived from this software
17*8d67ca89SAndroid Build Coastguard Worker    * without specific prior written permission.
18*8d67ca89SAndroid Build Coastguard Worker
19*8d67ca89SAndroid Build Coastguard WorkerTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20*8d67ca89SAndroid Build Coastguard WorkerANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21*8d67ca89SAndroid Build Coastguard WorkerWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22*8d67ca89SAndroid Build Coastguard WorkerDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
23*8d67ca89SAndroid Build Coastguard WorkerANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24*8d67ca89SAndroid Build Coastguard Worker(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25*8d67ca89SAndroid Build Coastguard WorkerLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
26*8d67ca89SAndroid Build Coastguard WorkerANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27*8d67ca89SAndroid Build Coastguard Worker(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28*8d67ca89SAndroid Build Coastguard WorkerSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29*8d67ca89SAndroid Build Coastguard Worker*/
30*8d67ca89SAndroid Build Coastguard Worker
31*8d67ca89SAndroid Build Coastguard Worker#ifndef STRLEN
32*8d67ca89SAndroid Build Coastguard Worker# define STRLEN strlen
33*8d67ca89SAndroid Build Coastguard Worker#endif
34*8d67ca89SAndroid Build Coastguard Worker
35*8d67ca89SAndroid Build Coastguard Worker#ifndef L
36*8d67ca89SAndroid Build Coastguard Worker# define L(label)	.L##label
37*8d67ca89SAndroid Build Coastguard Worker#endif
38*8d67ca89SAndroid Build Coastguard Worker
39*8d67ca89SAndroid Build Coastguard Worker#ifndef cfi_startproc
40*8d67ca89SAndroid Build Coastguard Worker# define cfi_startproc	.cfi_startproc
41*8d67ca89SAndroid Build Coastguard Worker#endif
42*8d67ca89SAndroid Build Coastguard Worker
43*8d67ca89SAndroid Build Coastguard Worker#ifndef cfi_endproc
44*8d67ca89SAndroid Build Coastguard Worker# define cfi_endproc	.cfi_endproc
45*8d67ca89SAndroid Build Coastguard Worker#endif
46*8d67ca89SAndroid Build Coastguard Worker
47*8d67ca89SAndroid Build Coastguard Worker#ifndef cfi_rel_offset
48*8d67ca89SAndroid Build Coastguard Worker# define cfi_rel_offset(reg, off)	.cfi_rel_offset reg, off
49*8d67ca89SAndroid Build Coastguard Worker#endif
50*8d67ca89SAndroid Build Coastguard Worker
51*8d67ca89SAndroid Build Coastguard Worker#ifndef cfi_restore
52*8d67ca89SAndroid Build Coastguard Worker# define cfi_restore(reg)	.cfi_restore reg
53*8d67ca89SAndroid Build Coastguard Worker#endif
54*8d67ca89SAndroid Build Coastguard Worker
55*8d67ca89SAndroid Build Coastguard Worker#ifndef cfi_adjust_cfa_offset
56*8d67ca89SAndroid Build Coastguard Worker# define cfi_adjust_cfa_offset(off)	.cfi_adjust_cfa_offset off
57*8d67ca89SAndroid Build Coastguard Worker#endif
58*8d67ca89SAndroid Build Coastguard Worker
59*8d67ca89SAndroid Build Coastguard Worker#ifndef ENTRY
60*8d67ca89SAndroid Build Coastguard Worker# define ENTRY(name)             \
61*8d67ca89SAndroid Build Coastguard Worker	.type name,  @function;  \
62*8d67ca89SAndroid Build Coastguard Worker	.globl name;             \
63*8d67ca89SAndroid Build Coastguard Worker	.p2align 4;              \
64*8d67ca89SAndroid Build Coastguard Workername:                            \
65*8d67ca89SAndroid Build Coastguard Worker	cfi_startproc
66*8d67ca89SAndroid Build Coastguard Worker#endif
67*8d67ca89SAndroid Build Coastguard Worker
68*8d67ca89SAndroid Build Coastguard Worker#ifndef END
69*8d67ca89SAndroid Build Coastguard Worker# define END(name)               \
70*8d67ca89SAndroid Build Coastguard Worker	cfi_endproc;             \
71*8d67ca89SAndroid Build Coastguard Worker	.size name,	.-name
72*8d67ca89SAndroid Build Coastguard Worker#endif
73*8d67ca89SAndroid Build Coastguard Worker
74*8d67ca89SAndroid Build Coastguard Worker#define CFI_PUSH(REG)                   \
75*8d67ca89SAndroid Build Coastguard Worker	cfi_adjust_cfa_offset (4);      \
76*8d67ca89SAndroid Build Coastguard Worker	cfi_rel_offset (REG, 0)
77*8d67ca89SAndroid Build Coastguard Worker
78*8d67ca89SAndroid Build Coastguard Worker#define CFI_POP(REG)                    \
79*8d67ca89SAndroid Build Coastguard Worker	cfi_adjust_cfa_offset (-4);     \
80*8d67ca89SAndroid Build Coastguard Worker	cfi_restore (REG)
81*8d67ca89SAndroid Build Coastguard Worker
82*8d67ca89SAndroid Build Coastguard Worker#define PUSH(REG) pushl REG; CFI_PUSH (REG)
83*8d67ca89SAndroid Build Coastguard Worker#define POP(REG) popl REG; CFI_POP (REG)
84*8d67ca89SAndroid Build Coastguard Worker
85*8d67ca89SAndroid Build Coastguard Worker	.section .text.sse2,"ax",@progbits
86*8d67ca89SAndroid Build Coastguard WorkerENTRY (STRLEN)
87*8d67ca89SAndroid Build Coastguard Worker	mov	4(%esp), %edx
88*8d67ca89SAndroid Build Coastguard Worker	mov	%edx, %ecx
89*8d67ca89SAndroid Build Coastguard Worker	and	$0x3f, %ecx
90*8d67ca89SAndroid Build Coastguard Worker	pxor	%xmm0, %xmm0
91*8d67ca89SAndroid Build Coastguard Worker	cmp	$0x30, %ecx
92*8d67ca89SAndroid Build Coastguard Worker	ja	L(next)
93*8d67ca89SAndroid Build Coastguard Worker	movdqu	(%edx), %xmm1
94*8d67ca89SAndroid Build Coastguard Worker	pcmpeqb	%xmm1, %xmm0
95*8d67ca89SAndroid Build Coastguard Worker	pmovmskb %xmm0, %ecx
96*8d67ca89SAndroid Build Coastguard Worker	test	%ecx, %ecx
97*8d67ca89SAndroid Build Coastguard Worker	jnz	L(exit_less16)
98*8d67ca89SAndroid Build Coastguard Worker	mov	%edx, %eax
99*8d67ca89SAndroid Build Coastguard Worker	and	$-16, %eax
100*8d67ca89SAndroid Build Coastguard Worker	jmp	L(align16_start)
101*8d67ca89SAndroid Build Coastguard WorkerL(next):
102*8d67ca89SAndroid Build Coastguard Worker	mov	%edx, %eax
103*8d67ca89SAndroid Build Coastguard Worker	and	$-16, %eax
104*8d67ca89SAndroid Build Coastguard Worker	PUSH	(%edi)
105*8d67ca89SAndroid Build Coastguard Worker	pcmpeqb	(%eax), %xmm0
106*8d67ca89SAndroid Build Coastguard Worker	mov	$-1, %edi
107*8d67ca89SAndroid Build Coastguard Worker	sub	%eax, %ecx
108*8d67ca89SAndroid Build Coastguard Worker	shl	%cl, %edi
109*8d67ca89SAndroid Build Coastguard Worker	pmovmskb %xmm0, %ecx
110*8d67ca89SAndroid Build Coastguard Worker	and	%edi, %ecx
111*8d67ca89SAndroid Build Coastguard Worker	POP	(%edi)
112*8d67ca89SAndroid Build Coastguard Worker	jnz	L(exit_unaligned)
113*8d67ca89SAndroid Build Coastguard Worker	pxor	%xmm0, %xmm0
114*8d67ca89SAndroid Build Coastguard WorkerL(align16_start):
115*8d67ca89SAndroid Build Coastguard Worker	pxor	%xmm1, %xmm1
116*8d67ca89SAndroid Build Coastguard Worker	pxor	%xmm2, %xmm2
117*8d67ca89SAndroid Build Coastguard Worker	pxor	%xmm3, %xmm3
118*8d67ca89SAndroid Build Coastguard Worker	pcmpeqb	16(%eax), %xmm0
119*8d67ca89SAndroid Build Coastguard Worker	pmovmskb %xmm0, %ecx
120*8d67ca89SAndroid Build Coastguard Worker	test	%ecx, %ecx
121*8d67ca89SAndroid Build Coastguard Worker	jnz	L(exit16)
122*8d67ca89SAndroid Build Coastguard Worker
123*8d67ca89SAndroid Build Coastguard Worker	pcmpeqb	32(%eax), %xmm1
124*8d67ca89SAndroid Build Coastguard Worker	pmovmskb %xmm1, %ecx
125*8d67ca89SAndroid Build Coastguard Worker	test	%ecx, %ecx
126*8d67ca89SAndroid Build Coastguard Worker	jnz	L(exit32)
127*8d67ca89SAndroid Build Coastguard Worker
128*8d67ca89SAndroid Build Coastguard Worker	pcmpeqb	48(%eax), %xmm2
129*8d67ca89SAndroid Build Coastguard Worker	pmovmskb %xmm2, %ecx
130*8d67ca89SAndroid Build Coastguard Worker	test	%ecx, %ecx
131*8d67ca89SAndroid Build Coastguard Worker	jnz	L(exit48)
132*8d67ca89SAndroid Build Coastguard Worker
133*8d67ca89SAndroid Build Coastguard Worker	pcmpeqb	64(%eax), %xmm3
134*8d67ca89SAndroid Build Coastguard Worker	pmovmskb %xmm3, %ecx
135*8d67ca89SAndroid Build Coastguard Worker	test	%ecx, %ecx
136*8d67ca89SAndroid Build Coastguard Worker	jnz	L(exit64)
137*8d67ca89SAndroid Build Coastguard Worker
138*8d67ca89SAndroid Build Coastguard Worker	pcmpeqb	80(%eax), %xmm0
139*8d67ca89SAndroid Build Coastguard Worker	add	$64, %eax
140*8d67ca89SAndroid Build Coastguard Worker	pmovmskb %xmm0, %ecx
141*8d67ca89SAndroid Build Coastguard Worker	test	%ecx, %ecx
142*8d67ca89SAndroid Build Coastguard Worker	jnz	L(exit16)
143*8d67ca89SAndroid Build Coastguard Worker
144*8d67ca89SAndroid Build Coastguard Worker	pcmpeqb	32(%eax), %xmm1
145*8d67ca89SAndroid Build Coastguard Worker	pmovmskb %xmm1, %ecx
146*8d67ca89SAndroid Build Coastguard Worker	test	%ecx, %ecx
147*8d67ca89SAndroid Build Coastguard Worker	jnz	L(exit32)
148*8d67ca89SAndroid Build Coastguard Worker
149*8d67ca89SAndroid Build Coastguard Worker	pcmpeqb	48(%eax), %xmm2
150*8d67ca89SAndroid Build Coastguard Worker	pmovmskb %xmm2, %ecx
151*8d67ca89SAndroid Build Coastguard Worker	test	%ecx, %ecx
152*8d67ca89SAndroid Build Coastguard Worker	jnz	L(exit48)
153*8d67ca89SAndroid Build Coastguard Worker
154*8d67ca89SAndroid Build Coastguard Worker	pcmpeqb	64(%eax), %xmm3
155*8d67ca89SAndroid Build Coastguard Worker	pmovmskb %xmm3, %ecx
156*8d67ca89SAndroid Build Coastguard Worker	test	%ecx, %ecx
157*8d67ca89SAndroid Build Coastguard Worker	jnz	L(exit64)
158*8d67ca89SAndroid Build Coastguard Worker
159*8d67ca89SAndroid Build Coastguard Worker	pcmpeqb	80(%eax), %xmm0
160*8d67ca89SAndroid Build Coastguard Worker	add	$64, %eax
161*8d67ca89SAndroid Build Coastguard Worker	pmovmskb %xmm0, %ecx
162*8d67ca89SAndroid Build Coastguard Worker	test	%ecx, %ecx
163*8d67ca89SAndroid Build Coastguard Worker	jnz	L(exit16)
164*8d67ca89SAndroid Build Coastguard Worker
165*8d67ca89SAndroid Build Coastguard Worker	pcmpeqb	32(%eax), %xmm1
166*8d67ca89SAndroid Build Coastguard Worker	pmovmskb %xmm1, %ecx
167*8d67ca89SAndroid Build Coastguard Worker	test	%ecx, %ecx
168*8d67ca89SAndroid Build Coastguard Worker	jnz	L(exit32)
169*8d67ca89SAndroid Build Coastguard Worker
170*8d67ca89SAndroid Build Coastguard Worker	pcmpeqb	48(%eax), %xmm2
171*8d67ca89SAndroid Build Coastguard Worker	pmovmskb %xmm2, %ecx
172*8d67ca89SAndroid Build Coastguard Worker	test	%ecx, %ecx
173*8d67ca89SAndroid Build Coastguard Worker	jnz	L(exit48)
174*8d67ca89SAndroid Build Coastguard Worker
175*8d67ca89SAndroid Build Coastguard Worker	pcmpeqb	64(%eax), %xmm3
176*8d67ca89SAndroid Build Coastguard Worker	pmovmskb %xmm3, %ecx
177*8d67ca89SAndroid Build Coastguard Worker	test	%ecx, %ecx
178*8d67ca89SAndroid Build Coastguard Worker	jnz	L(exit64)
179*8d67ca89SAndroid Build Coastguard Worker
180*8d67ca89SAndroid Build Coastguard Worker	pcmpeqb	80(%eax), %xmm0
181*8d67ca89SAndroid Build Coastguard Worker	add	$64, %eax
182*8d67ca89SAndroid Build Coastguard Worker	pmovmskb %xmm0, %ecx
183*8d67ca89SAndroid Build Coastguard Worker	test	%ecx, %ecx
184*8d67ca89SAndroid Build Coastguard Worker	jnz	L(exit16)
185*8d67ca89SAndroid Build Coastguard Worker
186*8d67ca89SAndroid Build Coastguard Worker	pcmpeqb	32(%eax), %xmm1
187*8d67ca89SAndroid Build Coastguard Worker	pmovmskb %xmm1, %ecx
188*8d67ca89SAndroid Build Coastguard Worker	test	%ecx, %ecx
189*8d67ca89SAndroid Build Coastguard Worker	jnz	L(exit32)
190*8d67ca89SAndroid Build Coastguard Worker
191*8d67ca89SAndroid Build Coastguard Worker	pcmpeqb	48(%eax), %xmm2
192*8d67ca89SAndroid Build Coastguard Worker	pmovmskb %xmm2, %ecx
193*8d67ca89SAndroid Build Coastguard Worker	test	%ecx, %ecx
194*8d67ca89SAndroid Build Coastguard Worker	jnz	L(exit48)
195*8d67ca89SAndroid Build Coastguard Worker
196*8d67ca89SAndroid Build Coastguard Worker	pcmpeqb	64(%eax), %xmm3
197*8d67ca89SAndroid Build Coastguard Worker	pmovmskb %xmm3, %ecx
198*8d67ca89SAndroid Build Coastguard Worker	test	%ecx, %ecx
199*8d67ca89SAndroid Build Coastguard Worker	jnz	L(exit64)
200*8d67ca89SAndroid Build Coastguard Worker
201*8d67ca89SAndroid Build Coastguard Worker
202*8d67ca89SAndroid Build Coastguard Worker	test	$0x3f, %eax
203*8d67ca89SAndroid Build Coastguard Worker	jz	L(align64_loop)
204*8d67ca89SAndroid Build Coastguard Worker
205*8d67ca89SAndroid Build Coastguard Worker	pcmpeqb	80(%eax), %xmm0
206*8d67ca89SAndroid Build Coastguard Worker	add	$80, %eax
207*8d67ca89SAndroid Build Coastguard Worker	pmovmskb %xmm0, %ecx
208*8d67ca89SAndroid Build Coastguard Worker	test	%ecx, %ecx
209*8d67ca89SAndroid Build Coastguard Worker	jnz	L(exit)
210*8d67ca89SAndroid Build Coastguard Worker
211*8d67ca89SAndroid Build Coastguard Worker	test	$0x3f, %eax
212*8d67ca89SAndroid Build Coastguard Worker	jz	L(align64_loop)
213*8d67ca89SAndroid Build Coastguard Worker
214*8d67ca89SAndroid Build Coastguard Worker	pcmpeqb	16(%eax), %xmm1
215*8d67ca89SAndroid Build Coastguard Worker	add	$16, %eax
216*8d67ca89SAndroid Build Coastguard Worker	pmovmskb %xmm1, %ecx
217*8d67ca89SAndroid Build Coastguard Worker	test	%ecx, %ecx
218*8d67ca89SAndroid Build Coastguard Worker	jnz	L(exit)
219*8d67ca89SAndroid Build Coastguard Worker
220*8d67ca89SAndroid Build Coastguard Worker	test	$0x3f, %eax
221*8d67ca89SAndroid Build Coastguard Worker	jz	L(align64_loop)
222*8d67ca89SAndroid Build Coastguard Worker
223*8d67ca89SAndroid Build Coastguard Worker	pcmpeqb	16(%eax), %xmm2
224*8d67ca89SAndroid Build Coastguard Worker	add	$16, %eax
225*8d67ca89SAndroid Build Coastguard Worker	pmovmskb %xmm2, %ecx
226*8d67ca89SAndroid Build Coastguard Worker	test	%ecx, %ecx
227*8d67ca89SAndroid Build Coastguard Worker	jnz	L(exit)
228*8d67ca89SAndroid Build Coastguard Worker
229*8d67ca89SAndroid Build Coastguard Worker	test	$0x3f, %eax
230*8d67ca89SAndroid Build Coastguard Worker	jz	L(align64_loop)
231*8d67ca89SAndroid Build Coastguard Worker
232*8d67ca89SAndroid Build Coastguard Worker	pcmpeqb	16(%eax), %xmm3
233*8d67ca89SAndroid Build Coastguard Worker	add	$16, %eax
234*8d67ca89SAndroid Build Coastguard Worker	pmovmskb %xmm3, %ecx
235*8d67ca89SAndroid Build Coastguard Worker	test	%ecx, %ecx
236*8d67ca89SAndroid Build Coastguard Worker	jnz	L(exit)
237*8d67ca89SAndroid Build Coastguard Worker
238*8d67ca89SAndroid Build Coastguard Worker	add	$16, %eax
239*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
240*8d67ca89SAndroid Build Coastguard WorkerL(align64_loop):
241*8d67ca89SAndroid Build Coastguard Worker	movaps	(%eax),	%xmm4
242*8d67ca89SAndroid Build Coastguard Worker	pminub	16(%eax), 	%xmm4
243*8d67ca89SAndroid Build Coastguard Worker	movaps	32(%eax), 	%xmm5
244*8d67ca89SAndroid Build Coastguard Worker	pminub	48(%eax), 	%xmm5
245*8d67ca89SAndroid Build Coastguard Worker	add	$64, 	%eax
246*8d67ca89SAndroid Build Coastguard Worker	pminub	%xmm4,	%xmm5
247*8d67ca89SAndroid Build Coastguard Worker	pcmpeqb	%xmm0,	%xmm5
248*8d67ca89SAndroid Build Coastguard Worker	pmovmskb %xmm5,	%ecx
249*8d67ca89SAndroid Build Coastguard Worker	test	%ecx,	%ecx
250*8d67ca89SAndroid Build Coastguard Worker	jz	L(align64_loop)
251*8d67ca89SAndroid Build Coastguard Worker
252*8d67ca89SAndroid Build Coastguard Worker
253*8d67ca89SAndroid Build Coastguard Worker	pcmpeqb	-64(%eax), %xmm0
254*8d67ca89SAndroid Build Coastguard Worker	sub	$80, 	%eax
255*8d67ca89SAndroid Build Coastguard Worker	pmovmskb %xmm0, %ecx
256*8d67ca89SAndroid Build Coastguard Worker	test	%ecx, %ecx
257*8d67ca89SAndroid Build Coastguard Worker	jnz	L(exit16)
258*8d67ca89SAndroid Build Coastguard Worker
259*8d67ca89SAndroid Build Coastguard Worker	pcmpeqb	32(%eax), %xmm1
260*8d67ca89SAndroid Build Coastguard Worker	pmovmskb %xmm1, %ecx
261*8d67ca89SAndroid Build Coastguard Worker	test	%ecx, %ecx
262*8d67ca89SAndroid Build Coastguard Worker	jnz	L(exit32)
263*8d67ca89SAndroid Build Coastguard Worker
264*8d67ca89SAndroid Build Coastguard Worker	pcmpeqb	48(%eax), %xmm2
265*8d67ca89SAndroid Build Coastguard Worker	pmovmskb %xmm2, %ecx
266*8d67ca89SAndroid Build Coastguard Worker	test	%ecx, %ecx
267*8d67ca89SAndroid Build Coastguard Worker	jnz	L(exit48)
268*8d67ca89SAndroid Build Coastguard Worker
269*8d67ca89SAndroid Build Coastguard Worker	pcmpeqb	64(%eax), %xmm3
270*8d67ca89SAndroid Build Coastguard Worker	pmovmskb %xmm3, %ecx
271*8d67ca89SAndroid Build Coastguard Worker	sub	%edx, %eax
272*8d67ca89SAndroid Build Coastguard Worker	bsf	%ecx, %ecx
273*8d67ca89SAndroid Build Coastguard Worker	add	%ecx, %eax
274*8d67ca89SAndroid Build Coastguard Worker	add	$64, %eax
275*8d67ca89SAndroid Build Coastguard Worker	ret
276*8d67ca89SAndroid Build Coastguard Worker
277*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
278*8d67ca89SAndroid Build Coastguard WorkerL(exit):
279*8d67ca89SAndroid Build Coastguard Worker	sub	%edx, %eax
280*8d67ca89SAndroid Build Coastguard Worker	bsf	%ecx, %ecx
281*8d67ca89SAndroid Build Coastguard Worker	add	%ecx, %eax
282*8d67ca89SAndroid Build Coastguard Worker	ret
283*8d67ca89SAndroid Build Coastguard Worker
284*8d67ca89SAndroid Build Coastguard WorkerL(exit_less16):
285*8d67ca89SAndroid Build Coastguard Worker	bsf	%ecx, %eax
286*8d67ca89SAndroid Build Coastguard Worker	ret
287*8d67ca89SAndroid Build Coastguard Worker
288*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
289*8d67ca89SAndroid Build Coastguard WorkerL(exit_unaligned):
290*8d67ca89SAndroid Build Coastguard Worker	sub	%edx, %eax
291*8d67ca89SAndroid Build Coastguard Worker	bsf	%ecx, %ecx
292*8d67ca89SAndroid Build Coastguard Worker	add	%ecx, %eax
293*8d67ca89SAndroid Build Coastguard Worker	ret
294*8d67ca89SAndroid Build Coastguard Worker
295*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
296*8d67ca89SAndroid Build Coastguard WorkerL(exit16):
297*8d67ca89SAndroid Build Coastguard Worker	sub	%edx, %eax
298*8d67ca89SAndroid Build Coastguard Worker	bsf	%ecx, %ecx
299*8d67ca89SAndroid Build Coastguard Worker	add	%ecx, %eax
300*8d67ca89SAndroid Build Coastguard Worker	add	$16, %eax
301*8d67ca89SAndroid Build Coastguard Worker	ret
302*8d67ca89SAndroid Build Coastguard Worker
303*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
304*8d67ca89SAndroid Build Coastguard WorkerL(exit32):
305*8d67ca89SAndroid Build Coastguard Worker	sub	%edx, %eax
306*8d67ca89SAndroid Build Coastguard Worker	bsf	%ecx, %ecx
307*8d67ca89SAndroid Build Coastguard Worker	add	%ecx, %eax
308*8d67ca89SAndroid Build Coastguard Worker	add	$32, %eax
309*8d67ca89SAndroid Build Coastguard Worker	ret
310*8d67ca89SAndroid Build Coastguard Worker
311*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
312*8d67ca89SAndroid Build Coastguard WorkerL(exit48):
313*8d67ca89SAndroid Build Coastguard Worker	sub	%edx, %eax
314*8d67ca89SAndroid Build Coastguard Worker	bsf	%ecx, %ecx
315*8d67ca89SAndroid Build Coastguard Worker	add	%ecx, %eax
316*8d67ca89SAndroid Build Coastguard Worker	add	$48, %eax
317*8d67ca89SAndroid Build Coastguard Worker	ret
318*8d67ca89SAndroid Build Coastguard Worker
319*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
320*8d67ca89SAndroid Build Coastguard WorkerL(exit64):
321*8d67ca89SAndroid Build Coastguard Worker	sub	%edx, %eax
322*8d67ca89SAndroid Build Coastguard Worker	bsf	%ecx, %ecx
323*8d67ca89SAndroid Build Coastguard Worker	add	%ecx, %eax
324*8d67ca89SAndroid Build Coastguard Worker	add	$64, %eax
325*8d67ca89SAndroid Build Coastguard Worker	ret
326*8d67ca89SAndroid Build Coastguard Worker
327*8d67ca89SAndroid Build Coastguard WorkerEND (STRLEN)
328*8d67ca89SAndroid Build Coastguard Worker
329