xref: /aosp_15_r20/bionic/libc/arch-x86/string/sse2-strrchr-atom.S (revision 8d67ca893c1523eb926b9080dbe4e2ffd2a27ba1)
1*8d67ca89SAndroid Build Coastguard Worker/*
2*8d67ca89SAndroid Build Coastguard WorkerCopyright (c) 2011, 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 L
32*8d67ca89SAndroid Build Coastguard Worker# define L(label)	.L##label
33*8d67ca89SAndroid Build Coastguard Worker#endif
34*8d67ca89SAndroid Build Coastguard Worker
35*8d67ca89SAndroid Build Coastguard Worker#ifndef cfi_startproc
36*8d67ca89SAndroid Build Coastguard Worker# define cfi_startproc	.cfi_startproc
37*8d67ca89SAndroid Build Coastguard Worker#endif
38*8d67ca89SAndroid Build Coastguard Worker
39*8d67ca89SAndroid Build Coastguard Worker#ifndef cfi_endproc
40*8d67ca89SAndroid Build Coastguard Worker# define cfi_endproc	.cfi_endproc
41*8d67ca89SAndroid Build Coastguard Worker#endif
42*8d67ca89SAndroid Build Coastguard Worker
43*8d67ca89SAndroid Build Coastguard Worker#ifndef cfi_rel_offset
44*8d67ca89SAndroid Build Coastguard Worker# define cfi_rel_offset(reg, off)	.cfi_rel_offset reg, off
45*8d67ca89SAndroid Build Coastguard Worker#endif
46*8d67ca89SAndroid Build Coastguard Worker
47*8d67ca89SAndroid Build Coastguard Worker#ifndef cfi_restore
48*8d67ca89SAndroid Build Coastguard Worker# define cfi_restore(reg)	.cfi_restore reg
49*8d67ca89SAndroid Build Coastguard Worker#endif
50*8d67ca89SAndroid Build Coastguard Worker
51*8d67ca89SAndroid Build Coastguard Worker#ifndef cfi_adjust_cfa_offset
52*8d67ca89SAndroid Build Coastguard Worker# define cfi_adjust_cfa_offset(off)	.cfi_adjust_cfa_offset off
53*8d67ca89SAndroid Build Coastguard Worker#endif
54*8d67ca89SAndroid Build Coastguard Worker
55*8d67ca89SAndroid Build Coastguard Worker#ifndef ENTRY
56*8d67ca89SAndroid Build Coastguard Worker# define ENTRY(name)	\
57*8d67ca89SAndroid Build Coastguard Worker	.type name, @function;	\
58*8d67ca89SAndroid Build Coastguard Worker	.globl name;	\
59*8d67ca89SAndroid Build Coastguard Worker	.p2align 4;	\
60*8d67ca89SAndroid Build Coastguard Workername:	\
61*8d67ca89SAndroid Build Coastguard Worker	cfi_startproc
62*8d67ca89SAndroid Build Coastguard Worker#endif
63*8d67ca89SAndroid Build Coastguard Worker
64*8d67ca89SAndroid Build Coastguard Worker#ifndef END
65*8d67ca89SAndroid Build Coastguard Worker# define END(name)	\
66*8d67ca89SAndroid Build Coastguard Worker	cfi_endproc;	\
67*8d67ca89SAndroid Build Coastguard Worker	.size name, .-name
68*8d67ca89SAndroid Build Coastguard Worker#endif
69*8d67ca89SAndroid Build Coastguard Worker
70*8d67ca89SAndroid Build Coastguard Worker#define CFI_PUSH(REG)	\
71*8d67ca89SAndroid Build Coastguard Worker	cfi_adjust_cfa_offset (4);	\
72*8d67ca89SAndroid Build Coastguard Worker	cfi_rel_offset (REG, 0)
73*8d67ca89SAndroid Build Coastguard Worker
74*8d67ca89SAndroid Build Coastguard Worker#define CFI_POP(REG)	\
75*8d67ca89SAndroid Build Coastguard Worker	cfi_adjust_cfa_offset (-4);	\
76*8d67ca89SAndroid Build Coastguard Worker	cfi_restore (REG)
77*8d67ca89SAndroid Build Coastguard Worker
78*8d67ca89SAndroid Build Coastguard Worker#define PUSH(REG)	pushl REG; CFI_PUSH (REG)
79*8d67ca89SAndroid Build Coastguard Worker#define POP(REG)	popl REG; CFI_POP (REG)
80*8d67ca89SAndroid Build Coastguard Worker
81*8d67ca89SAndroid Build Coastguard Worker#define PARMS	8
82*8d67ca89SAndroid Build Coastguard Worker#define ENTRANCE	PUSH(%edi);
83*8d67ca89SAndroid Build Coastguard Worker#define RETURN	POP (%edi); ret; CFI_PUSH (%edi);
84*8d67ca89SAndroid Build Coastguard Worker
85*8d67ca89SAndroid Build Coastguard Worker#define STR1  PARMS
86*8d67ca89SAndroid Build Coastguard Worker#define STR2  STR1+4
87*8d67ca89SAndroid Build Coastguard Worker
88*8d67ca89SAndroid Build Coastguard Worker	.text
89*8d67ca89SAndroid Build Coastguard WorkerENTRY (strrchr)
90*8d67ca89SAndroid Build Coastguard Worker
91*8d67ca89SAndroid Build Coastguard Worker	ENTRANCE
92*8d67ca89SAndroid Build Coastguard Worker	mov	STR1(%esp), %ecx
93*8d67ca89SAndroid Build Coastguard Worker	movd	STR2(%esp), %xmm1
94*8d67ca89SAndroid Build Coastguard Worker
95*8d67ca89SAndroid Build Coastguard Worker	pxor	%xmm2, %xmm2
96*8d67ca89SAndroid Build Coastguard Worker	mov	%ecx, %edi
97*8d67ca89SAndroid Build Coastguard Worker	punpcklbw %xmm1, %xmm1
98*8d67ca89SAndroid Build Coastguard Worker	punpcklbw %xmm1, %xmm1
99*8d67ca89SAndroid Build Coastguard Worker	/* ECX has OFFSET. */
100*8d67ca89SAndroid Build Coastguard Worker	and	$63, %ecx
101*8d67ca89SAndroid Build Coastguard Worker	pshufd	$0, %xmm1, %xmm1
102*8d67ca89SAndroid Build Coastguard Worker	cmp	$48, %ecx
103*8d67ca89SAndroid Build Coastguard Worker	ja	L(crosscache)
104*8d67ca89SAndroid Build Coastguard Worker
105*8d67ca89SAndroid Build Coastguard Worker/* unaligned string. */
106*8d67ca89SAndroid Build Coastguard Worker	movdqu	(%edi), %xmm0
107*8d67ca89SAndroid Build Coastguard Worker	pcmpeqb	%xmm0, %xmm2
108*8d67ca89SAndroid Build Coastguard Worker	pcmpeqb	%xmm1, %xmm0
109*8d67ca89SAndroid Build Coastguard Worker	/* Find where NULL is.  */
110*8d67ca89SAndroid Build Coastguard Worker	pmovmskb %xmm2, %ecx
111*8d67ca89SAndroid Build Coastguard Worker	/* Check if there is a match.  */
112*8d67ca89SAndroid Build Coastguard Worker	pmovmskb %xmm0, %eax
113*8d67ca89SAndroid Build Coastguard Worker	add	$16, %edi
114*8d67ca89SAndroid Build Coastguard Worker
115*8d67ca89SAndroid Build Coastguard Worker	test	%eax, %eax
116*8d67ca89SAndroid Build Coastguard Worker	jnz	L(unaligned_match1)
117*8d67ca89SAndroid Build Coastguard Worker
118*8d67ca89SAndroid Build Coastguard Worker	test	%ecx, %ecx
119*8d67ca89SAndroid Build Coastguard Worker	jnz	L(return_null)
120*8d67ca89SAndroid Build Coastguard Worker
121*8d67ca89SAndroid Build Coastguard Worker	and	$-16, %edi
122*8d67ca89SAndroid Build Coastguard Worker
123*8d67ca89SAndroid Build Coastguard Worker	PUSH	(%esi)
124*8d67ca89SAndroid Build Coastguard Worker	PUSH	(%ebx)
125*8d67ca89SAndroid Build Coastguard Worker
126*8d67ca89SAndroid Build Coastguard Worker	xor	%ebx, %ebx
127*8d67ca89SAndroid Build Coastguard Worker	jmp	L(loop)
128*8d67ca89SAndroid Build Coastguard Worker
129*8d67ca89SAndroid Build Coastguard Worker	CFI_POP    (%esi)
130*8d67ca89SAndroid Build Coastguard Worker	CFI_POP    (%ebx)
131*8d67ca89SAndroid Build Coastguard Worker
132*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
133*8d67ca89SAndroid Build Coastguard WorkerL(unaligned_match1):
134*8d67ca89SAndroid Build Coastguard Worker	test	%ecx, %ecx
135*8d67ca89SAndroid Build Coastguard Worker	jnz	L(prolog_find_zero_1)
136*8d67ca89SAndroid Build Coastguard Worker
137*8d67ca89SAndroid Build Coastguard Worker	PUSH	(%esi)
138*8d67ca89SAndroid Build Coastguard Worker	PUSH	(%ebx)
139*8d67ca89SAndroid Build Coastguard Worker
140*8d67ca89SAndroid Build Coastguard Worker	mov	%eax, %ebx
141*8d67ca89SAndroid Build Coastguard Worker	mov	%edi, %esi
142*8d67ca89SAndroid Build Coastguard Worker	and	$-16, %edi
143*8d67ca89SAndroid Build Coastguard Worker	jmp	L(loop)
144*8d67ca89SAndroid Build Coastguard Worker
145*8d67ca89SAndroid Build Coastguard Worker	CFI_POP    (%esi)
146*8d67ca89SAndroid Build Coastguard Worker	CFI_POP    (%ebx)
147*8d67ca89SAndroid Build Coastguard Worker
148*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
149*8d67ca89SAndroid Build Coastguard WorkerL(crosscache):
150*8d67ca89SAndroid Build Coastguard Worker/* Hancle unaligned string.  */
151*8d67ca89SAndroid Build Coastguard Worker	and	$15, %ecx
152*8d67ca89SAndroid Build Coastguard Worker	and	$-16, %edi
153*8d67ca89SAndroid Build Coastguard Worker	pxor	%xmm3, %xmm3
154*8d67ca89SAndroid Build Coastguard Worker	movdqa	(%edi), %xmm0
155*8d67ca89SAndroid Build Coastguard Worker	pcmpeqb	%xmm0, %xmm3
156*8d67ca89SAndroid Build Coastguard Worker	pcmpeqb	%xmm1, %xmm0
157*8d67ca89SAndroid Build Coastguard Worker	/* Find where NULL is.  */
158*8d67ca89SAndroid Build Coastguard Worker	pmovmskb %xmm3, %edx
159*8d67ca89SAndroid Build Coastguard Worker	/* Check if there is a match.  */
160*8d67ca89SAndroid Build Coastguard Worker	pmovmskb %xmm0, %eax
161*8d67ca89SAndroid Build Coastguard Worker	/* Remove the leading bytes.  */
162*8d67ca89SAndroid Build Coastguard Worker	shr	%cl, %edx
163*8d67ca89SAndroid Build Coastguard Worker	shr	%cl, %eax
164*8d67ca89SAndroid Build Coastguard Worker	add	$16, %edi
165*8d67ca89SAndroid Build Coastguard Worker
166*8d67ca89SAndroid Build Coastguard Worker	test	%eax, %eax
167*8d67ca89SAndroid Build Coastguard Worker	jnz	L(unaligned_match)
168*8d67ca89SAndroid Build Coastguard Worker
169*8d67ca89SAndroid Build Coastguard Worker	test	%edx, %edx
170*8d67ca89SAndroid Build Coastguard Worker	jnz	L(return_null)
171*8d67ca89SAndroid Build Coastguard Worker
172*8d67ca89SAndroid Build Coastguard Worker	PUSH	(%esi)
173*8d67ca89SAndroid Build Coastguard Worker	PUSH	(%ebx)
174*8d67ca89SAndroid Build Coastguard Worker
175*8d67ca89SAndroid Build Coastguard Worker	xor	%ebx, %ebx
176*8d67ca89SAndroid Build Coastguard Worker	jmp	L(loop)
177*8d67ca89SAndroid Build Coastguard Worker
178*8d67ca89SAndroid Build Coastguard Worker	CFI_POP    (%esi)
179*8d67ca89SAndroid Build Coastguard Worker	CFI_POP    (%ebx)
180*8d67ca89SAndroid Build Coastguard Worker
181*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
182*8d67ca89SAndroid Build Coastguard WorkerL(unaligned_match):
183*8d67ca89SAndroid Build Coastguard Worker	test	%edx, %edx
184*8d67ca89SAndroid Build Coastguard Worker	jnz	L(prolog_find_zero)
185*8d67ca89SAndroid Build Coastguard Worker
186*8d67ca89SAndroid Build Coastguard Worker	PUSH	(%esi)
187*8d67ca89SAndroid Build Coastguard Worker	PUSH	(%ebx)
188*8d67ca89SAndroid Build Coastguard Worker
189*8d67ca89SAndroid Build Coastguard Worker	mov	%eax, %ebx
190*8d67ca89SAndroid Build Coastguard Worker	lea	(%edi, %ecx), %esi
191*8d67ca89SAndroid Build Coastguard Worker
192*8d67ca89SAndroid Build Coastguard Worker/* Loop start on aligned string.  */
193*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
194*8d67ca89SAndroid Build Coastguard WorkerL(loop):
195*8d67ca89SAndroid Build Coastguard Worker	movdqa	(%edi), %xmm0
196*8d67ca89SAndroid Build Coastguard Worker	pcmpeqb	%xmm0, %xmm2
197*8d67ca89SAndroid Build Coastguard Worker	add	$16, %edi
198*8d67ca89SAndroid Build Coastguard Worker	pcmpeqb	%xmm1, %xmm0
199*8d67ca89SAndroid Build Coastguard Worker	pmovmskb %xmm2, %ecx
200*8d67ca89SAndroid Build Coastguard Worker	pmovmskb %xmm0, %eax
201*8d67ca89SAndroid Build Coastguard Worker	or	%eax, %ecx
202*8d67ca89SAndroid Build Coastguard Worker	jnz	L(matches)
203*8d67ca89SAndroid Build Coastguard Worker
204*8d67ca89SAndroid Build Coastguard Worker	movdqa	(%edi), %xmm0
205*8d67ca89SAndroid Build Coastguard Worker	pcmpeqb	%xmm0, %xmm2
206*8d67ca89SAndroid Build Coastguard Worker	add	$16, %edi
207*8d67ca89SAndroid Build Coastguard Worker	pcmpeqb	%xmm1, %xmm0
208*8d67ca89SAndroid Build Coastguard Worker	pmovmskb %xmm2, %ecx
209*8d67ca89SAndroid Build Coastguard Worker	pmovmskb %xmm0, %eax
210*8d67ca89SAndroid Build Coastguard Worker	or	%eax, %ecx
211*8d67ca89SAndroid Build Coastguard Worker	jnz	L(matches)
212*8d67ca89SAndroid Build Coastguard Worker
213*8d67ca89SAndroid Build Coastguard Worker	movdqa	(%edi), %xmm0
214*8d67ca89SAndroid Build Coastguard Worker	pcmpeqb	%xmm0, %xmm2
215*8d67ca89SAndroid Build Coastguard Worker	add	$16, %edi
216*8d67ca89SAndroid Build Coastguard Worker	pcmpeqb	%xmm1, %xmm0
217*8d67ca89SAndroid Build Coastguard Worker	pmovmskb %xmm2, %ecx
218*8d67ca89SAndroid Build Coastguard Worker	pmovmskb %xmm0, %eax
219*8d67ca89SAndroid Build Coastguard Worker	or	%eax, %ecx
220*8d67ca89SAndroid Build Coastguard Worker	jnz	L(matches)
221*8d67ca89SAndroid Build Coastguard Worker
222*8d67ca89SAndroid Build Coastguard Worker	movdqa	(%edi), %xmm0
223*8d67ca89SAndroid Build Coastguard Worker	pcmpeqb	%xmm0, %xmm2
224*8d67ca89SAndroid Build Coastguard Worker	add	$16, %edi
225*8d67ca89SAndroid Build Coastguard Worker	pcmpeqb	%xmm1, %xmm0
226*8d67ca89SAndroid Build Coastguard Worker	pmovmskb %xmm2, %ecx
227*8d67ca89SAndroid Build Coastguard Worker	pmovmskb %xmm0, %eax
228*8d67ca89SAndroid Build Coastguard Worker	or	%eax, %ecx
229*8d67ca89SAndroid Build Coastguard Worker	jz	L(loop)
230*8d67ca89SAndroid Build Coastguard Worker
231*8d67ca89SAndroid Build Coastguard WorkerL(matches):
232*8d67ca89SAndroid Build Coastguard Worker	test	%eax, %eax
233*8d67ca89SAndroid Build Coastguard Worker	jnz	L(match)
234*8d67ca89SAndroid Build Coastguard WorkerL(return_value):
235*8d67ca89SAndroid Build Coastguard Worker	test	%ebx, %ebx
236*8d67ca89SAndroid Build Coastguard Worker	jz	L(return_null_1)
237*8d67ca89SAndroid Build Coastguard Worker	mov	%ebx, %eax
238*8d67ca89SAndroid Build Coastguard Worker	mov	%esi, %edi
239*8d67ca89SAndroid Build Coastguard Worker
240*8d67ca89SAndroid Build Coastguard Worker	POP	(%ebx)
241*8d67ca89SAndroid Build Coastguard Worker	POP	(%esi)
242*8d67ca89SAndroid Build Coastguard Worker
243*8d67ca89SAndroid Build Coastguard Worker	jmp	L(match_case1)
244*8d67ca89SAndroid Build Coastguard Worker
245*8d67ca89SAndroid Build Coastguard Worker	CFI_PUSH    (%ebx)
246*8d67ca89SAndroid Build Coastguard Worker	CFI_PUSH    (%esi)
247*8d67ca89SAndroid Build Coastguard Worker
248*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
249*8d67ca89SAndroid Build Coastguard WorkerL(return_null_1):
250*8d67ca89SAndroid Build Coastguard Worker	POP	(%ebx)
251*8d67ca89SAndroid Build Coastguard Worker	POP	(%esi)
252*8d67ca89SAndroid Build Coastguard Worker
253*8d67ca89SAndroid Build Coastguard Worker	xor	%eax, %eax
254*8d67ca89SAndroid Build Coastguard Worker	RETURN
255*8d67ca89SAndroid Build Coastguard Worker
256*8d67ca89SAndroid Build Coastguard Worker	CFI_PUSH    (%ebx)
257*8d67ca89SAndroid Build Coastguard Worker	CFI_PUSH    (%esi)
258*8d67ca89SAndroid Build Coastguard Worker
259*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
260*8d67ca89SAndroid Build Coastguard WorkerL(match):
261*8d67ca89SAndroid Build Coastguard Worker	pmovmskb %xmm2, %ecx
262*8d67ca89SAndroid Build Coastguard Worker	test	%ecx, %ecx
263*8d67ca89SAndroid Build Coastguard Worker	jnz	L(find_zero)
264*8d67ca89SAndroid Build Coastguard Worker	mov	%eax, %ebx
265*8d67ca89SAndroid Build Coastguard Worker	mov	%edi, %esi
266*8d67ca89SAndroid Build Coastguard Worker	jmp	L(loop)
267*8d67ca89SAndroid Build Coastguard Worker
268*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
269*8d67ca89SAndroid Build Coastguard WorkerL(find_zero):
270*8d67ca89SAndroid Build Coastguard Worker	test	%cl, %cl
271*8d67ca89SAndroid Build Coastguard Worker	jz	L(find_zero_high)
272*8d67ca89SAndroid Build Coastguard Worker	mov	%cl, %dl
273*8d67ca89SAndroid Build Coastguard Worker	and	$15, %dl
274*8d67ca89SAndroid Build Coastguard Worker	jz	L(find_zero_8)
275*8d67ca89SAndroid Build Coastguard Worker	test	$0x01, %cl
276*8d67ca89SAndroid Build Coastguard Worker	jnz	L(FindZeroExit1)
277*8d67ca89SAndroid Build Coastguard Worker	test	$0x02, %cl
278*8d67ca89SAndroid Build Coastguard Worker	jnz	L(FindZeroExit2)
279*8d67ca89SAndroid Build Coastguard Worker	test	$0x04, %cl
280*8d67ca89SAndroid Build Coastguard Worker	jnz	L(FindZeroExit3)
281*8d67ca89SAndroid Build Coastguard Worker	and	$(1 << 4) - 1, %eax
282*8d67ca89SAndroid Build Coastguard Worker	jz	L(return_value)
283*8d67ca89SAndroid Build Coastguard Worker
284*8d67ca89SAndroid Build Coastguard Worker	POP	(%ebx)
285*8d67ca89SAndroid Build Coastguard Worker	POP	(%esi)
286*8d67ca89SAndroid Build Coastguard Worker	jmp     L(match_case1)
287*8d67ca89SAndroid Build Coastguard Worker
288*8d67ca89SAndroid Build Coastguard Worker	CFI_PUSH	(%ebx)
289*8d67ca89SAndroid Build Coastguard Worker	CFI_PUSH	(%esi)
290*8d67ca89SAndroid Build Coastguard Worker
291*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
292*8d67ca89SAndroid Build Coastguard WorkerL(find_zero_8):
293*8d67ca89SAndroid Build Coastguard Worker	test	$0x10, %cl
294*8d67ca89SAndroid Build Coastguard Worker	jnz	L(FindZeroExit5)
295*8d67ca89SAndroid Build Coastguard Worker	test	$0x20, %cl
296*8d67ca89SAndroid Build Coastguard Worker	jnz	L(FindZeroExit6)
297*8d67ca89SAndroid Build Coastguard Worker	test	$0x40, %cl
298*8d67ca89SAndroid Build Coastguard Worker	jnz	L(FindZeroExit7)
299*8d67ca89SAndroid Build Coastguard Worker	and	$(1 << 8) - 1, %eax
300*8d67ca89SAndroid Build Coastguard Worker	jz	L(return_value)
301*8d67ca89SAndroid Build Coastguard Worker
302*8d67ca89SAndroid Build Coastguard Worker	POP	(%ebx)
303*8d67ca89SAndroid Build Coastguard Worker	POP	(%esi)
304*8d67ca89SAndroid Build Coastguard Worker	jmp     L(match_case1)
305*8d67ca89SAndroid Build Coastguard Worker
306*8d67ca89SAndroid Build Coastguard Worker	CFI_PUSH	(%ebx)
307*8d67ca89SAndroid Build Coastguard Worker	CFI_PUSH	(%esi)
308*8d67ca89SAndroid Build Coastguard Worker
309*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
310*8d67ca89SAndroid Build Coastguard WorkerL(find_zero_high):
311*8d67ca89SAndroid Build Coastguard Worker	mov	%ch, %dh
312*8d67ca89SAndroid Build Coastguard Worker	and	$15, %dh
313*8d67ca89SAndroid Build Coastguard Worker	jz	L(find_zero_high_8)
314*8d67ca89SAndroid Build Coastguard Worker	test	$0x01, %ch
315*8d67ca89SAndroid Build Coastguard Worker	jnz	L(FindZeroExit9)
316*8d67ca89SAndroid Build Coastguard Worker	test	$0x02, %ch
317*8d67ca89SAndroid Build Coastguard Worker	jnz	L(FindZeroExit10)
318*8d67ca89SAndroid Build Coastguard Worker	test	$0x04, %ch
319*8d67ca89SAndroid Build Coastguard Worker	jnz	L(FindZeroExit11)
320*8d67ca89SAndroid Build Coastguard Worker	and	$(1 << 12) - 1, %eax
321*8d67ca89SAndroid Build Coastguard Worker	jz	L(return_value)
322*8d67ca89SAndroid Build Coastguard Worker
323*8d67ca89SAndroid Build Coastguard Worker	POP	(%ebx)
324*8d67ca89SAndroid Build Coastguard Worker	POP	(%esi)
325*8d67ca89SAndroid Build Coastguard Worker	jmp     L(match_case1)
326*8d67ca89SAndroid Build Coastguard Worker
327*8d67ca89SAndroid Build Coastguard Worker	CFI_PUSH	(%ebx)
328*8d67ca89SAndroid Build Coastguard Worker	CFI_PUSH	(%esi)
329*8d67ca89SAndroid Build Coastguard Worker
330*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
331*8d67ca89SAndroid Build Coastguard WorkerL(find_zero_high_8):
332*8d67ca89SAndroid Build Coastguard Worker	test	$0x10, %ch
333*8d67ca89SAndroid Build Coastguard Worker	jnz	L(FindZeroExit13)
334*8d67ca89SAndroid Build Coastguard Worker	test	$0x20, %ch
335*8d67ca89SAndroid Build Coastguard Worker	jnz	L(FindZeroExit14)
336*8d67ca89SAndroid Build Coastguard Worker	test	$0x40, %ch
337*8d67ca89SAndroid Build Coastguard Worker	jnz	L(FindZeroExit15)
338*8d67ca89SAndroid Build Coastguard Worker	and	$(1 << 16) - 1, %eax
339*8d67ca89SAndroid Build Coastguard Worker	jz	L(return_value)
340*8d67ca89SAndroid Build Coastguard Worker
341*8d67ca89SAndroid Build Coastguard Worker	POP	(%ebx)
342*8d67ca89SAndroid Build Coastguard Worker	POP	(%esi)
343*8d67ca89SAndroid Build Coastguard Worker	jmp     L(match_case1)
344*8d67ca89SAndroid Build Coastguard Worker
345*8d67ca89SAndroid Build Coastguard Worker	CFI_PUSH	(%ebx)
346*8d67ca89SAndroid Build Coastguard Worker	CFI_PUSH	(%esi)
347*8d67ca89SAndroid Build Coastguard Worker
348*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
349*8d67ca89SAndroid Build Coastguard WorkerL(FindZeroExit1):
350*8d67ca89SAndroid Build Coastguard Worker	and	$1, %eax
351*8d67ca89SAndroid Build Coastguard Worker	jz	L(return_value)
352*8d67ca89SAndroid Build Coastguard Worker
353*8d67ca89SAndroid Build Coastguard Worker	POP	(%ebx)
354*8d67ca89SAndroid Build Coastguard Worker	POP	(%esi)
355*8d67ca89SAndroid Build Coastguard Worker	jmp     L(match_case1)
356*8d67ca89SAndroid Build Coastguard Worker
357*8d67ca89SAndroid Build Coastguard Worker	CFI_PUSH	(%ebx)
358*8d67ca89SAndroid Build Coastguard Worker	CFI_PUSH	(%esi)
359*8d67ca89SAndroid Build Coastguard Worker
360*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
361*8d67ca89SAndroid Build Coastguard WorkerL(FindZeroExit2):
362*8d67ca89SAndroid Build Coastguard Worker	and	$(1 << 2) - 1, %eax
363*8d67ca89SAndroid Build Coastguard Worker	jz	L(return_value)
364*8d67ca89SAndroid Build Coastguard Worker
365*8d67ca89SAndroid Build Coastguard Worker	POP	(%ebx)
366*8d67ca89SAndroid Build Coastguard Worker	POP	(%esi)
367*8d67ca89SAndroid Build Coastguard Worker	jmp     L(match_case1)
368*8d67ca89SAndroid Build Coastguard Worker
369*8d67ca89SAndroid Build Coastguard Worker	CFI_PUSH	(%ebx)
370*8d67ca89SAndroid Build Coastguard Worker	CFI_PUSH	(%esi)
371*8d67ca89SAndroid Build Coastguard Worker
372*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
373*8d67ca89SAndroid Build Coastguard WorkerL(FindZeroExit3):
374*8d67ca89SAndroid Build Coastguard Worker	and	$(1 << 3) - 1, %eax
375*8d67ca89SAndroid Build Coastguard Worker	jz	L(return_value)
376*8d67ca89SAndroid Build Coastguard Worker
377*8d67ca89SAndroid Build Coastguard Worker	POP	(%ebx)
378*8d67ca89SAndroid Build Coastguard Worker	POP	(%esi)
379*8d67ca89SAndroid Build Coastguard Worker	jmp     L(match_case1)
380*8d67ca89SAndroid Build Coastguard Worker
381*8d67ca89SAndroid Build Coastguard Worker	CFI_PUSH	(%ebx)
382*8d67ca89SAndroid Build Coastguard Worker	CFI_PUSH	(%esi)
383*8d67ca89SAndroid Build Coastguard Worker
384*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
385*8d67ca89SAndroid Build Coastguard WorkerL(FindZeroExit5):
386*8d67ca89SAndroid Build Coastguard Worker	and	$(1 << 5) - 1, %eax
387*8d67ca89SAndroid Build Coastguard Worker	jz	L(return_value)
388*8d67ca89SAndroid Build Coastguard Worker
389*8d67ca89SAndroid Build Coastguard Worker	POP	(%ebx)
390*8d67ca89SAndroid Build Coastguard Worker	POP	(%esi)
391*8d67ca89SAndroid Build Coastguard Worker	jmp     L(match_case1)
392*8d67ca89SAndroid Build Coastguard Worker
393*8d67ca89SAndroid Build Coastguard Worker	CFI_PUSH	(%ebx)
394*8d67ca89SAndroid Build Coastguard Worker	CFI_PUSH	(%esi)
395*8d67ca89SAndroid Build Coastguard Worker
396*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
397*8d67ca89SAndroid Build Coastguard WorkerL(FindZeroExit6):
398*8d67ca89SAndroid Build Coastguard Worker	and	$(1 << 6) - 1, %eax
399*8d67ca89SAndroid Build Coastguard Worker	jz	L(return_value)
400*8d67ca89SAndroid Build Coastguard Worker
401*8d67ca89SAndroid Build Coastguard Worker	POP	(%ebx)
402*8d67ca89SAndroid Build Coastguard Worker	POP	(%esi)
403*8d67ca89SAndroid Build Coastguard Worker	jmp     L(match_case1)
404*8d67ca89SAndroid Build Coastguard Worker
405*8d67ca89SAndroid Build Coastguard Worker	CFI_PUSH	(%ebx)
406*8d67ca89SAndroid Build Coastguard Worker	CFI_PUSH	(%esi)
407*8d67ca89SAndroid Build Coastguard Worker
408*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
409*8d67ca89SAndroid Build Coastguard WorkerL(FindZeroExit7):
410*8d67ca89SAndroid Build Coastguard Worker	and	$(1 << 7) - 1, %eax
411*8d67ca89SAndroid Build Coastguard Worker	jz	L(return_value)
412*8d67ca89SAndroid Build Coastguard Worker
413*8d67ca89SAndroid Build Coastguard Worker	POP	(%ebx)
414*8d67ca89SAndroid Build Coastguard Worker	POP	(%esi)
415*8d67ca89SAndroid Build Coastguard Worker	jmp     L(match_case1)
416*8d67ca89SAndroid Build Coastguard Worker
417*8d67ca89SAndroid Build Coastguard Worker	CFI_PUSH	(%ebx)
418*8d67ca89SAndroid Build Coastguard Worker	CFI_PUSH	(%esi)
419*8d67ca89SAndroid Build Coastguard Worker
420*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
421*8d67ca89SAndroid Build Coastguard WorkerL(FindZeroExit9):
422*8d67ca89SAndroid Build Coastguard Worker	and	$(1 << 9) - 1, %eax
423*8d67ca89SAndroid Build Coastguard Worker	jz	L(return_value)
424*8d67ca89SAndroid Build Coastguard Worker
425*8d67ca89SAndroid Build Coastguard Worker	POP	(%ebx)
426*8d67ca89SAndroid Build Coastguard Worker	POP	(%esi)
427*8d67ca89SAndroid Build Coastguard Worker	jmp     L(match_case1)
428*8d67ca89SAndroid Build Coastguard Worker
429*8d67ca89SAndroid Build Coastguard Worker	CFI_PUSH	(%ebx)
430*8d67ca89SAndroid Build Coastguard Worker	CFI_PUSH	(%esi)
431*8d67ca89SAndroid Build Coastguard Worker
432*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
433*8d67ca89SAndroid Build Coastguard WorkerL(FindZeroExit10):
434*8d67ca89SAndroid Build Coastguard Worker	and	$(1 << 10) - 1, %eax
435*8d67ca89SAndroid Build Coastguard Worker	jz	L(return_value)
436*8d67ca89SAndroid Build Coastguard Worker
437*8d67ca89SAndroid Build Coastguard Worker	POP	(%ebx)
438*8d67ca89SAndroid Build Coastguard Worker	POP	(%esi)
439*8d67ca89SAndroid Build Coastguard Worker	jmp     L(match_case1)
440*8d67ca89SAndroid Build Coastguard Worker
441*8d67ca89SAndroid Build Coastguard Worker	CFI_PUSH	(%ebx)
442*8d67ca89SAndroid Build Coastguard Worker	CFI_PUSH	(%esi)
443*8d67ca89SAndroid Build Coastguard Worker
444*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
445*8d67ca89SAndroid Build Coastguard WorkerL(FindZeroExit11):
446*8d67ca89SAndroid Build Coastguard Worker	and	$(1 << 11) - 1, %eax
447*8d67ca89SAndroid Build Coastguard Worker	jz	L(return_value)
448*8d67ca89SAndroid Build Coastguard Worker
449*8d67ca89SAndroid Build Coastguard Worker	POP	(%ebx)
450*8d67ca89SAndroid Build Coastguard Worker	POP	(%esi)
451*8d67ca89SAndroid Build Coastguard Worker	jmp     L(match_case1)
452*8d67ca89SAndroid Build Coastguard Worker
453*8d67ca89SAndroid Build Coastguard Worker	CFI_PUSH	(%ebx)
454*8d67ca89SAndroid Build Coastguard Worker	CFI_PUSH	(%esi)
455*8d67ca89SAndroid Build Coastguard Worker
456*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
457*8d67ca89SAndroid Build Coastguard WorkerL(FindZeroExit13):
458*8d67ca89SAndroid Build Coastguard Worker	and	$(1 << 13) - 1, %eax
459*8d67ca89SAndroid Build Coastguard Worker	jz	L(return_value)
460*8d67ca89SAndroid Build Coastguard Worker
461*8d67ca89SAndroid Build Coastguard Worker	POP	(%ebx)
462*8d67ca89SAndroid Build Coastguard Worker	POP	(%esi)
463*8d67ca89SAndroid Build Coastguard Worker	jmp     L(match_case1)
464*8d67ca89SAndroid Build Coastguard Worker
465*8d67ca89SAndroid Build Coastguard Worker	CFI_PUSH	(%ebx)
466*8d67ca89SAndroid Build Coastguard Worker	CFI_PUSH	(%esi)
467*8d67ca89SAndroid Build Coastguard Worker
468*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
469*8d67ca89SAndroid Build Coastguard WorkerL(FindZeroExit14):
470*8d67ca89SAndroid Build Coastguard Worker	and	$(1 << 14) - 1, %eax
471*8d67ca89SAndroid Build Coastguard Worker	jz	L(return_value)
472*8d67ca89SAndroid Build Coastguard Worker
473*8d67ca89SAndroid Build Coastguard Worker	POP	(%ebx)
474*8d67ca89SAndroid Build Coastguard Worker	POP	(%esi)
475*8d67ca89SAndroid Build Coastguard Worker	jmp     L(match_case1)
476*8d67ca89SAndroid Build Coastguard Worker
477*8d67ca89SAndroid Build Coastguard Worker	CFI_PUSH	(%ebx)
478*8d67ca89SAndroid Build Coastguard Worker	CFI_PUSH	(%esi)
479*8d67ca89SAndroid Build Coastguard Worker
480*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
481*8d67ca89SAndroid Build Coastguard WorkerL(FindZeroExit15):
482*8d67ca89SAndroid Build Coastguard Worker	and	$(1 << 15) - 1, %eax
483*8d67ca89SAndroid Build Coastguard Worker	jz	L(return_value)
484*8d67ca89SAndroid Build Coastguard Worker
485*8d67ca89SAndroid Build Coastguard Worker	POP	(%ebx)
486*8d67ca89SAndroid Build Coastguard Worker	POP	(%esi)
487*8d67ca89SAndroid Build Coastguard Worker
488*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
489*8d67ca89SAndroid Build Coastguard WorkerL(match_case1):
490*8d67ca89SAndroid Build Coastguard Worker	test	%ah, %ah
491*8d67ca89SAndroid Build Coastguard Worker	jnz	L(match_case1_high)
492*8d67ca89SAndroid Build Coastguard Worker	mov	%al, %dl
493*8d67ca89SAndroid Build Coastguard Worker	and	$15 << 4, %dl
494*8d67ca89SAndroid Build Coastguard Worker	jnz	L(match_case1_8)
495*8d67ca89SAndroid Build Coastguard Worker	test	$0x08, %al
496*8d67ca89SAndroid Build Coastguard Worker	jnz	L(Exit4)
497*8d67ca89SAndroid Build Coastguard Worker	test	$0x04, %al
498*8d67ca89SAndroid Build Coastguard Worker	jnz	L(Exit3)
499*8d67ca89SAndroid Build Coastguard Worker	test	$0x02, %al
500*8d67ca89SAndroid Build Coastguard Worker	jnz	L(Exit2)
501*8d67ca89SAndroid Build Coastguard Worker	lea	-16(%edi), %eax
502*8d67ca89SAndroid Build Coastguard Worker	RETURN
503*8d67ca89SAndroid Build Coastguard Worker
504*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
505*8d67ca89SAndroid Build Coastguard WorkerL(match_case1_8):
506*8d67ca89SAndroid Build Coastguard Worker	test	$0x80, %al
507*8d67ca89SAndroid Build Coastguard Worker	jnz	L(Exit8)
508*8d67ca89SAndroid Build Coastguard Worker	test	$0x40, %al
509*8d67ca89SAndroid Build Coastguard Worker	jnz	L(Exit7)
510*8d67ca89SAndroid Build Coastguard Worker	test	$0x20, %al
511*8d67ca89SAndroid Build Coastguard Worker	jnz	L(Exit6)
512*8d67ca89SAndroid Build Coastguard Worker	lea	-12(%edi), %eax
513*8d67ca89SAndroid Build Coastguard Worker	RETURN
514*8d67ca89SAndroid Build Coastguard Worker
515*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
516*8d67ca89SAndroid Build Coastguard WorkerL(match_case1_high):
517*8d67ca89SAndroid Build Coastguard Worker	mov	%ah, %dh
518*8d67ca89SAndroid Build Coastguard Worker	and	$15 << 4, %dh
519*8d67ca89SAndroid Build Coastguard Worker	jnz	L(match_case1_high_8)
520*8d67ca89SAndroid Build Coastguard Worker	test	$0x08, %ah
521*8d67ca89SAndroid Build Coastguard Worker	jnz	L(Exit12)
522*8d67ca89SAndroid Build Coastguard Worker	test	$0x04, %ah
523*8d67ca89SAndroid Build Coastguard Worker	jnz	L(Exit11)
524*8d67ca89SAndroid Build Coastguard Worker	test	$0x02, %ah
525*8d67ca89SAndroid Build Coastguard Worker	jnz	L(Exit10)
526*8d67ca89SAndroid Build Coastguard Worker	lea	-8(%edi), %eax
527*8d67ca89SAndroid Build Coastguard Worker	RETURN
528*8d67ca89SAndroid Build Coastguard Worker
529*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
530*8d67ca89SAndroid Build Coastguard WorkerL(match_case1_high_8):
531*8d67ca89SAndroid Build Coastguard Worker	test	$0x80, %ah
532*8d67ca89SAndroid Build Coastguard Worker	jnz	L(Exit16)
533*8d67ca89SAndroid Build Coastguard Worker	test	$0x40, %ah
534*8d67ca89SAndroid Build Coastguard Worker	jnz	L(Exit15)
535*8d67ca89SAndroid Build Coastguard Worker	test	$0x20, %ah
536*8d67ca89SAndroid Build Coastguard Worker	jnz	L(Exit14)
537*8d67ca89SAndroid Build Coastguard Worker	lea	-4(%edi), %eax
538*8d67ca89SAndroid Build Coastguard Worker	RETURN
539*8d67ca89SAndroid Build Coastguard Worker
540*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
541*8d67ca89SAndroid Build Coastguard WorkerL(Exit2):
542*8d67ca89SAndroid Build Coastguard Worker	lea	-15(%edi), %eax
543*8d67ca89SAndroid Build Coastguard Worker	RETURN
544*8d67ca89SAndroid Build Coastguard Worker
545*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
546*8d67ca89SAndroid Build Coastguard WorkerL(Exit3):
547*8d67ca89SAndroid Build Coastguard Worker	lea	-14(%edi), %eax
548*8d67ca89SAndroid Build Coastguard Worker	RETURN
549*8d67ca89SAndroid Build Coastguard Worker
550*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
551*8d67ca89SAndroid Build Coastguard WorkerL(Exit4):
552*8d67ca89SAndroid Build Coastguard Worker	lea	-13(%edi), %eax
553*8d67ca89SAndroid Build Coastguard Worker	RETURN
554*8d67ca89SAndroid Build Coastguard Worker
555*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
556*8d67ca89SAndroid Build Coastguard WorkerL(Exit6):
557*8d67ca89SAndroid Build Coastguard Worker	lea	-11(%edi), %eax
558*8d67ca89SAndroid Build Coastguard Worker	RETURN
559*8d67ca89SAndroid Build Coastguard Worker
560*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
561*8d67ca89SAndroid Build Coastguard WorkerL(Exit7):
562*8d67ca89SAndroid Build Coastguard Worker	lea	-10(%edi), %eax
563*8d67ca89SAndroid Build Coastguard Worker	RETURN
564*8d67ca89SAndroid Build Coastguard Worker
565*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
566*8d67ca89SAndroid Build Coastguard WorkerL(Exit8):
567*8d67ca89SAndroid Build Coastguard Worker	lea	-9(%edi), %eax
568*8d67ca89SAndroid Build Coastguard Worker	RETURN
569*8d67ca89SAndroid Build Coastguard Worker
570*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
571*8d67ca89SAndroid Build Coastguard WorkerL(Exit10):
572*8d67ca89SAndroid Build Coastguard Worker	lea	-7(%edi), %eax
573*8d67ca89SAndroid Build Coastguard Worker	RETURN
574*8d67ca89SAndroid Build Coastguard Worker
575*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
576*8d67ca89SAndroid Build Coastguard WorkerL(Exit11):
577*8d67ca89SAndroid Build Coastguard Worker	lea	-6(%edi), %eax
578*8d67ca89SAndroid Build Coastguard Worker	RETURN
579*8d67ca89SAndroid Build Coastguard Worker
580*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
581*8d67ca89SAndroid Build Coastguard WorkerL(Exit12):
582*8d67ca89SAndroid Build Coastguard Worker	lea	-5(%edi), %eax
583*8d67ca89SAndroid Build Coastguard Worker	RETURN
584*8d67ca89SAndroid Build Coastguard Worker
585*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
586*8d67ca89SAndroid Build Coastguard WorkerL(Exit14):
587*8d67ca89SAndroid Build Coastguard Worker	lea	-3(%edi), %eax
588*8d67ca89SAndroid Build Coastguard Worker	RETURN
589*8d67ca89SAndroid Build Coastguard Worker
590*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
591*8d67ca89SAndroid Build Coastguard WorkerL(Exit15):
592*8d67ca89SAndroid Build Coastguard Worker	lea	-2(%edi), %eax
593*8d67ca89SAndroid Build Coastguard Worker	RETURN
594*8d67ca89SAndroid Build Coastguard Worker
595*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
596*8d67ca89SAndroid Build Coastguard WorkerL(Exit16):
597*8d67ca89SAndroid Build Coastguard Worker	lea	-1(%edi), %eax
598*8d67ca89SAndroid Build Coastguard Worker	RETURN
599*8d67ca89SAndroid Build Coastguard Worker
600*8d67ca89SAndroid Build Coastguard Worker/* Return NULL.  */
601*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
602*8d67ca89SAndroid Build Coastguard WorkerL(return_null):
603*8d67ca89SAndroid Build Coastguard Worker	xor	%eax, %eax
604*8d67ca89SAndroid Build Coastguard Worker	RETURN
605*8d67ca89SAndroid Build Coastguard Worker
606*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
607*8d67ca89SAndroid Build Coastguard WorkerL(prolog_find_zero):
608*8d67ca89SAndroid Build Coastguard Worker	add	%ecx, %edi
609*8d67ca89SAndroid Build Coastguard Worker	mov     %edx, %ecx
610*8d67ca89SAndroid Build Coastguard WorkerL(prolog_find_zero_1):
611*8d67ca89SAndroid Build Coastguard Worker	test	%cl, %cl
612*8d67ca89SAndroid Build Coastguard Worker	jz	L(prolog_find_zero_high)
613*8d67ca89SAndroid Build Coastguard Worker	mov	%cl, %dl
614*8d67ca89SAndroid Build Coastguard Worker	and	$15, %dl
615*8d67ca89SAndroid Build Coastguard Worker	jz	L(prolog_find_zero_8)
616*8d67ca89SAndroid Build Coastguard Worker	test	$0x01, %cl
617*8d67ca89SAndroid Build Coastguard Worker	jnz	L(PrologFindZeroExit1)
618*8d67ca89SAndroid Build Coastguard Worker	test	$0x02, %cl
619*8d67ca89SAndroid Build Coastguard Worker	jnz	L(PrologFindZeroExit2)
620*8d67ca89SAndroid Build Coastguard Worker	test	$0x04, %cl
621*8d67ca89SAndroid Build Coastguard Worker	jnz	L(PrologFindZeroExit3)
622*8d67ca89SAndroid Build Coastguard Worker	and	$(1 << 4) - 1, %eax
623*8d67ca89SAndroid Build Coastguard Worker	jnz	L(match_case1)
624*8d67ca89SAndroid Build Coastguard Worker	xor	%eax, %eax
625*8d67ca89SAndroid Build Coastguard Worker	RETURN
626*8d67ca89SAndroid Build Coastguard Worker
627*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
628*8d67ca89SAndroid Build Coastguard WorkerL(prolog_find_zero_8):
629*8d67ca89SAndroid Build Coastguard Worker	test	$0x10, %cl
630*8d67ca89SAndroid Build Coastguard Worker	jnz	L(PrologFindZeroExit5)
631*8d67ca89SAndroid Build Coastguard Worker	test	$0x20, %cl
632*8d67ca89SAndroid Build Coastguard Worker	jnz	L(PrologFindZeroExit6)
633*8d67ca89SAndroid Build Coastguard Worker	test	$0x40, %cl
634*8d67ca89SAndroid Build Coastguard Worker	jnz	L(PrologFindZeroExit7)
635*8d67ca89SAndroid Build Coastguard Worker	and	$(1 << 8) - 1, %eax
636*8d67ca89SAndroid Build Coastguard Worker	jnz	L(match_case1)
637*8d67ca89SAndroid Build Coastguard Worker	xor	%eax, %eax
638*8d67ca89SAndroid Build Coastguard Worker	RETURN
639*8d67ca89SAndroid Build Coastguard Worker
640*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
641*8d67ca89SAndroid Build Coastguard WorkerL(prolog_find_zero_high):
642*8d67ca89SAndroid Build Coastguard Worker	mov	%ch, %dh
643*8d67ca89SAndroid Build Coastguard Worker	and	$15, %dh
644*8d67ca89SAndroid Build Coastguard Worker	jz	L(prolog_find_zero_high_8)
645*8d67ca89SAndroid Build Coastguard Worker	test	$0x01, %ch
646*8d67ca89SAndroid Build Coastguard Worker	jnz	L(PrologFindZeroExit9)
647*8d67ca89SAndroid Build Coastguard Worker	test	$0x02, %ch
648*8d67ca89SAndroid Build Coastguard Worker	jnz	L(PrologFindZeroExit10)
649*8d67ca89SAndroid Build Coastguard Worker	test	$0x04, %ch
650*8d67ca89SAndroid Build Coastguard Worker	jnz	L(PrologFindZeroExit11)
651*8d67ca89SAndroid Build Coastguard Worker	and	$(1 << 12) - 1, %eax
652*8d67ca89SAndroid Build Coastguard Worker	jnz	L(match_case1)
653*8d67ca89SAndroid Build Coastguard Worker	xor	%eax, %eax
654*8d67ca89SAndroid Build Coastguard Worker	RETURN
655*8d67ca89SAndroid Build Coastguard Worker
656*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
657*8d67ca89SAndroid Build Coastguard WorkerL(prolog_find_zero_high_8):
658*8d67ca89SAndroid Build Coastguard Worker	test	$0x10, %ch
659*8d67ca89SAndroid Build Coastguard Worker	jnz	L(PrologFindZeroExit13)
660*8d67ca89SAndroid Build Coastguard Worker	test	$0x20, %ch
661*8d67ca89SAndroid Build Coastguard Worker	jnz	L(PrologFindZeroExit14)
662*8d67ca89SAndroid Build Coastguard Worker	test	$0x40, %ch
663*8d67ca89SAndroid Build Coastguard Worker	jnz	L(PrologFindZeroExit15)
664*8d67ca89SAndroid Build Coastguard Worker	and	$(1 << 16) - 1, %eax
665*8d67ca89SAndroid Build Coastguard Worker	jnz	L(match_case1)
666*8d67ca89SAndroid Build Coastguard Worker	xor	%eax, %eax
667*8d67ca89SAndroid Build Coastguard Worker	RETURN
668*8d67ca89SAndroid Build Coastguard Worker
669*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
670*8d67ca89SAndroid Build Coastguard WorkerL(PrologFindZeroExit1):
671*8d67ca89SAndroid Build Coastguard Worker	and	$1, %eax
672*8d67ca89SAndroid Build Coastguard Worker	jnz	L(match_case1)
673*8d67ca89SAndroid Build Coastguard Worker	xor	%eax, %eax
674*8d67ca89SAndroid Build Coastguard Worker	RETURN
675*8d67ca89SAndroid Build Coastguard Worker
676*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
677*8d67ca89SAndroid Build Coastguard WorkerL(PrologFindZeroExit2):
678*8d67ca89SAndroid Build Coastguard Worker	and	$(1 << 2) - 1, %eax
679*8d67ca89SAndroid Build Coastguard Worker	jnz	L(match_case1)
680*8d67ca89SAndroid Build Coastguard Worker	xor	%eax, %eax
681*8d67ca89SAndroid Build Coastguard Worker	RETURN
682*8d67ca89SAndroid Build Coastguard Worker
683*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
684*8d67ca89SAndroid Build Coastguard WorkerL(PrologFindZeroExit3):
685*8d67ca89SAndroid Build Coastguard Worker	and	$(1 << 3) - 1, %eax
686*8d67ca89SAndroid Build Coastguard Worker	jnz	L(match_case1)
687*8d67ca89SAndroid Build Coastguard Worker	xor	%eax, %eax
688*8d67ca89SAndroid Build Coastguard Worker	RETURN
689*8d67ca89SAndroid Build Coastguard Worker
690*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
691*8d67ca89SAndroid Build Coastguard WorkerL(PrologFindZeroExit5):
692*8d67ca89SAndroid Build Coastguard Worker	and	$(1 << 5) - 1, %eax
693*8d67ca89SAndroid Build Coastguard Worker	jnz	L(match_case1)
694*8d67ca89SAndroid Build Coastguard Worker	xor	%eax, %eax
695*8d67ca89SAndroid Build Coastguard Worker	RETURN
696*8d67ca89SAndroid Build Coastguard Worker
697*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
698*8d67ca89SAndroid Build Coastguard WorkerL(PrologFindZeroExit6):
699*8d67ca89SAndroid Build Coastguard Worker	and	$(1 << 6) - 1, %eax
700*8d67ca89SAndroid Build Coastguard Worker	jnz	L(match_case1)
701*8d67ca89SAndroid Build Coastguard Worker	xor	%eax, %eax
702*8d67ca89SAndroid Build Coastguard Worker	RETURN
703*8d67ca89SAndroid Build Coastguard Worker
704*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
705*8d67ca89SAndroid Build Coastguard WorkerL(PrologFindZeroExit7):
706*8d67ca89SAndroid Build Coastguard Worker	and	$(1 << 7) - 1, %eax
707*8d67ca89SAndroid Build Coastguard Worker	jnz	L(match_case1)
708*8d67ca89SAndroid Build Coastguard Worker	xor	%eax, %eax
709*8d67ca89SAndroid Build Coastguard Worker	RETURN
710*8d67ca89SAndroid Build Coastguard Worker
711*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
712*8d67ca89SAndroid Build Coastguard WorkerL(PrologFindZeroExit9):
713*8d67ca89SAndroid Build Coastguard Worker	and	$(1 << 9) - 1, %eax
714*8d67ca89SAndroid Build Coastguard Worker	jnz	L(match_case1)
715*8d67ca89SAndroid Build Coastguard Worker	xor	%eax, %eax
716*8d67ca89SAndroid Build Coastguard Worker	RETURN
717*8d67ca89SAndroid Build Coastguard Worker
718*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
719*8d67ca89SAndroid Build Coastguard WorkerL(PrologFindZeroExit10):
720*8d67ca89SAndroid Build Coastguard Worker	and	$(1 << 10) - 1, %eax
721*8d67ca89SAndroid Build Coastguard Worker	jnz	L(match_case1)
722*8d67ca89SAndroid Build Coastguard Worker	xor	%eax, %eax
723*8d67ca89SAndroid Build Coastguard Worker	RETURN
724*8d67ca89SAndroid Build Coastguard Worker
725*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
726*8d67ca89SAndroid Build Coastguard WorkerL(PrologFindZeroExit11):
727*8d67ca89SAndroid Build Coastguard Worker	and	$(1 << 11) - 1, %eax
728*8d67ca89SAndroid Build Coastguard Worker	jnz	L(match_case1)
729*8d67ca89SAndroid Build Coastguard Worker	xor	%eax, %eax
730*8d67ca89SAndroid Build Coastguard Worker	RETURN
731*8d67ca89SAndroid Build Coastguard Worker
732*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
733*8d67ca89SAndroid Build Coastguard WorkerL(PrologFindZeroExit13):
734*8d67ca89SAndroid Build Coastguard Worker	and	$(1 << 13) - 1, %eax
735*8d67ca89SAndroid Build Coastguard Worker	jnz	L(match_case1)
736*8d67ca89SAndroid Build Coastguard Worker	xor	%eax, %eax
737*8d67ca89SAndroid Build Coastguard Worker	RETURN
738*8d67ca89SAndroid Build Coastguard Worker
739*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
740*8d67ca89SAndroid Build Coastguard WorkerL(PrologFindZeroExit14):
741*8d67ca89SAndroid Build Coastguard Worker	and	$(1 << 14) - 1, %eax
742*8d67ca89SAndroid Build Coastguard Worker	jnz	L(match_case1)
743*8d67ca89SAndroid Build Coastguard Worker	xor	%eax, %eax
744*8d67ca89SAndroid Build Coastguard Worker	RETURN
745*8d67ca89SAndroid Build Coastguard Worker
746*8d67ca89SAndroid Build Coastguard Worker	.p2align 4
747*8d67ca89SAndroid Build Coastguard WorkerL(PrologFindZeroExit15):
748*8d67ca89SAndroid Build Coastguard Worker	and	$(1 << 15) - 1, %eax
749*8d67ca89SAndroid Build Coastguard Worker	jnz	L(match_case1)
750*8d67ca89SAndroid Build Coastguard Worker	xor	%eax, %eax
751*8d67ca89SAndroid Build Coastguard Worker	RETURN
752*8d67ca89SAndroid Build Coastguard Worker
753*8d67ca89SAndroid Build Coastguard WorkerEND (strrchr)
754