10a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva/*
20a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaCopyright (c) 2011 Intel Corporation
30a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaAll rights reserved.
40a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
50a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaRedistribution and use in source and binary forms, with or without
60a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrievamodification, are permitted provided that the following conditions are met:
70a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
80a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva    * Redistributions of source code must retain the above copyright notice,
90a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva    * this list of conditions and the following disclaimer.
100a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
110a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva    * Redistributions in binary form must reproduce the above copyright notice,
120a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva    * this list of conditions and the following disclaimer in the documentation
130a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva    * and/or other materials provided with the distribution.
140a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
150a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva    * Neither the name of Intel Corporation nor the names of its contributors
160a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva    * may be used to endorse or promote products derived from this software
170a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva    * without specific prior written permission.
180a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
190a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
200a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
210a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
220a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
230a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
240a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
250a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
260a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
270a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
280a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
290a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva*/
300a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
310a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#ifndef L
320a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva# define L(label)	.L##label
330a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#endif
340a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
350a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#ifndef cfi_startproc
360a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva# define cfi_startproc	.cfi_startproc
370a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#endif
380a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
390a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#ifndef cfi_endproc
400a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva# define cfi_endproc	.cfi_endproc
410a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#endif
420a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
430a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#ifndef cfi_rel_offset
440a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva# define cfi_rel_offset(reg, off)	.cfi_rel_offset reg, off
450a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#endif
460a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
470a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#ifndef cfi_restore
480a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva# define cfi_restore(reg)	.cfi_restore reg
490a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#endif
500a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
510a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#ifndef cfi_adjust_cfa_offset
520a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva# define cfi_adjust_cfa_offset(off)	.cfi_adjust_cfa_offset off
530a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#endif
540a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
550a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#ifndef ENTRY
560a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva# define ENTRY(name)	\
570a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.type name, @function;	\
580a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.globl name;	\
590a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4;	\
600a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrievaname:	\
610a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cfi_startproc
620a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#endif
630a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
640a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#ifndef END
650a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva# define END(name)	\
660a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cfi_endproc;	\
670a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.size name, .-name
680a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#endif
690a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
700a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#define CFI_PUSH(REG)	\
710a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cfi_adjust_cfa_offset (4);	\
720a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cfi_rel_offset (REG, 0)
730a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
740a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#define CFI_POP(REG)	\
750a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cfi_adjust_cfa_offset (-4);	\
760a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cfi_restore (REG)
770a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
780a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#define PUSH(REG)	pushl REG;	CFI_PUSH (REG)
790a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#define POP(REG)	popl REG;	CFI_POP (REG)
800a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
810a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#define PARMS  8
820a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#define ENTRANCE PUSH(%edi);
830a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#define RETURN  POP(%edi);	ret;	CFI_PUSH(%edi);
840a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
850a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#define STR1  PARMS
860a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#define STR2  STR1+4
870a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
880a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.text
890a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaENTRY (wcsrchr)
900a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
910a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	ENTRANCE
920a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	mov	STR1(%esp), %ecx
930a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movd	STR2(%esp), %xmm1
940a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
950a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	mov	%ecx, %edi
960a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	punpckldq %xmm1, %xmm1
970a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	pxor	%xmm2, %xmm2
980a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	punpckldq %xmm1, %xmm1
990a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
1000a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva/* ECX has OFFSET. */
1010a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	and	$63, %ecx
1020a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$48, %ecx
1030a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	ja	L(crosscache)
1040a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
1050a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva/* unaligned string. */
1060a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movdqu	(%edi), %xmm0
1070a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	pcmpeqd	%xmm0, %xmm2
1080a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	pcmpeqd	%xmm1, %xmm0
1090a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva/* Find where NULL is.  */
1100a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	pmovmskb %xmm2, %ecx
1110a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva/* Check if there is a match.  */
1120a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	pmovmskb %xmm0, %eax
1130a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	add	$16, %edi
1140a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
1150a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	%eax, %eax
1160a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(unaligned_match1)
1170a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
1180a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	%ecx, %ecx
1190a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(return_null)
1200a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
1210a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	and	$-16, %edi
1220a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
1230a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	PUSH	(%esi)
1240a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
1250a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	xor	%edx, %edx
1260a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jmp	L(loop)
1270a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
1280a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	CFI_POP	(%esi)
1290a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
1300a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
1310a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(unaligned_match1):
1320a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	%ecx, %ecx
1330a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(prolog_find_zero_1)
1340a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
1350a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	PUSH	(%esi)
1360a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
1370a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva/* Save current match */
1380a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	mov	%eax, %edx
1390a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	mov	%edi, %esi
1400a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	and	$-16, %edi
1410a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jmp	L(loop)
1420a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
1430a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	CFI_POP	(%esi)
1440a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
1450a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
1460a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(crosscache):
1470a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva/* Hancle unaligned string.  */
1480a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	and	$15, %ecx
1490a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	and	$-16, %edi
1500a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	pxor	%xmm3, %xmm3
1510a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movdqa	(%edi), %xmm0
1520a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	pcmpeqd	%xmm0, %xmm3
1530a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	pcmpeqd	%xmm1, %xmm0
1540a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva/* Find where NULL is.  */
1550a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	pmovmskb %xmm3, %edx
1560a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva/* Check if there is a match.  */
1570a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	pmovmskb %xmm0, %eax
1580a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva/* Remove the leading bytes.  */
1590a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	shr	%cl, %edx
1600a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	shr	%cl, %eax
1610a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	add	$16, %edi
1620a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
1630a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	%eax, %eax
1640a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(unaligned_match)
1650a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
1660a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	%edx, %edx
1670a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(return_null)
1680a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
1690a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	PUSH	(%esi)
1700a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
1710a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	xor	%edx, %edx
1720a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jmp	L(loop)
1730a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
1740a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	CFI_POP	(%esi)
1750a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
1760a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
1770a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(unaligned_match):
1780a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	%edx, %edx
1790a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(prolog_find_zero)
1800a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
1810a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	PUSH	(%esi)
1820a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
1830a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	mov	%eax, %edx
1840a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	lea	(%edi, %ecx), %esi
1850a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
1860a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva/* Loop start on aligned string.  */
1870a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
1880a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(loop):
1890a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movdqa	(%edi), %xmm0
1900a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	pcmpeqd	%xmm0, %xmm2
1910a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	add	$16, %edi
1920a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	pcmpeqd	%xmm1, %xmm0
1930a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	pmovmskb %xmm2, %ecx
1940a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	pmovmskb %xmm0, %eax
1950a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	or	%eax, %ecx
1960a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(matches)
1970a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
1980a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movdqa	(%edi), %xmm3
1990a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	pcmpeqd	%xmm3, %xmm2
2000a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	add	$16, %edi
2010a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	pcmpeqd	%xmm1, %xmm3
2020a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	pmovmskb %xmm2, %ecx
2030a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	pmovmskb %xmm3, %eax
2040a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	or	%eax, %ecx
2050a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(matches)
2060a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
2070a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movdqa	(%edi), %xmm4
2080a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	pcmpeqd	%xmm4, %xmm2
2090a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	add	$16, %edi
2100a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	pcmpeqd	%xmm1, %xmm4
2110a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	pmovmskb %xmm2, %ecx
2120a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	pmovmskb %xmm4, %eax
2130a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	or	%eax, %ecx
2140a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(matches)
2150a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
2160a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movdqa	(%edi), %xmm5
2170a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	pcmpeqd	%xmm5, %xmm2
2180a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	add	$16, %edi
2190a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	pcmpeqd	%xmm1, %xmm5
2200a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	pmovmskb %xmm2, %ecx
2210a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	pmovmskb %xmm5, %eax
2220a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	or	%eax, %ecx
2230a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(loop)
2240a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
2250a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
2260a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(matches):
2270a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	%eax, %eax
2280a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(match)
2290a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(return_value):
2300a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	%edx, %edx
2310a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(return_null_1)
2320a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	mov	%edx, %eax
2330a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	mov	%esi, %edi
2340a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
2350a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	POP	(%esi)
2360a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
2370a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	%ah, %ah
2380a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(match_third_or_fourth_wchar)
2390a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	$15 << 4, %al
2400a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(match_second_wchar)
2410a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	lea	-16(%edi), %eax
2420a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	RETURN
2430a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
2440a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	CFI_PUSH	(%esi)
2450a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
2460a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
2470a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(return_null_1):
2480a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	POP	(%esi)
2490a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
2500a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	xor	%eax, %eax
2510a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	RETURN
2520a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
2530a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	CFI_PUSH	(%esi)
2540a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
2550a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
2560a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(match):
2570a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	pmovmskb %xmm2, %ecx
2580a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	%ecx, %ecx
2590a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(find_zero)
2600a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva/* save match info */
2610a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	mov	%eax, %edx
2620a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	mov	%edi, %esi
2630a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jmp	L(loop)
2640a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
2650a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
2660a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(find_zero):
2670a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	%cl, %cl
2680a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(find_zero_in_third_or_fourth_wchar)
2690a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	$15, %cl
2700a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(find_zero_in_second_wchar)
2710a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	and	$1, %eax
2720a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(return_value)
2730a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
2740a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	POP	(%esi)
2750a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
2760a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	lea	-16(%edi), %eax
2770a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	RETURN
2780a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
2790a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	CFI_PUSH	(%esi)
2800a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
2810a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
2820a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(find_zero_in_second_wchar):
283592c7b4cd72e18f2f1941df3d63026d7f94ef7ceChih-Hung Hsieh	and	$(1 << 5) - 1, %eax
2840a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(return_value)
2850a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
2860a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	POP	(%esi)
2870a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
2880a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	$15 << 4, %al
2890a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(match_second_wchar)
2900a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	lea	-16(%edi), %eax
2910a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	RETURN
2920a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
2930a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	CFI_PUSH	(%esi)
2940a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
2950a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
2960a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(find_zero_in_third_or_fourth_wchar):
2970a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	$15, %ch
2980a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(find_zero_in_fourth_wchar)
299592c7b4cd72e18f2f1941df3d63026d7f94ef7ceChih-Hung Hsieh	and	$(1 << 9) - 1, %eax
3000a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(return_value)
3010a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
3020a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	POP	(%esi)
3030a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
3040a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	%ah, %ah
3050a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(match_third_wchar)
3060a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	$15 << 4, %al
3070a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(match_second_wchar)
3080a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	lea	-16(%edi), %eax
3090a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	RETURN
3100a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
3110a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	CFI_PUSH	(%esi)
3120a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
3130a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
3140a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(find_zero_in_fourth_wchar):
3150a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
3160a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	POP	(%esi)
3170a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
3180a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	%ah, %ah
3190a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(match_third_or_fourth_wchar)
3200a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	$15 << 4, %al
3210a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(match_second_wchar)
3220a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	lea	-16(%edi), %eax
3230a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	RETURN
3240a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
3250a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	CFI_PUSH	(%esi)
3260a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
3270a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
3280a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(match_second_wchar):
3290a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	lea	-12(%edi), %eax
3300a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	RETURN
3310a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
3320a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
3330a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(match_third_or_fourth_wchar):
3340a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	$15 << 4, %ah
3350a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(match_fourth_wchar)
3360a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	lea	-8(%edi), %eax
3370a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	RETURN
3380a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
3390a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
3400a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(match_third_wchar):
3410a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	lea	-8(%edi), %eax
3420a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	RETURN
3430a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
3440a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
3450a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(match_fourth_wchar):
3460a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	lea	-4(%edi), %eax
3470a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	RETURN
3480a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
3490a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
3500a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(return_null):
3510a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	xor	%eax, %eax
3520a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	RETURN
3530a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
3540a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
3550a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(prolog_find_zero):
3560a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	add	%ecx, %edi
3570a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	mov     %edx, %ecx
3580a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(prolog_find_zero_1):
3590a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	%cl, %cl
3600a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(prolog_find_zero_in_third_or_fourth_wchar)
3610a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	$15, %cl
3620a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(prolog_find_zero_in_second_wchar)
3630a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	and	$1, %eax
3640a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(return_null)
3650a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
3660a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	lea	-16(%edi), %eax
3670a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	RETURN
3680a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
3690a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
3700a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(prolog_find_zero_in_second_wchar):
371592c7b4cd72e18f2f1941df3d63026d7f94ef7ceChih-Hung Hsieh	and	$(1 << 5) - 1, %eax
3720a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(return_null)
3730a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
3740a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	$15 << 4, %al
3750a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(match_second_wchar)
3760a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	lea	-16(%edi), %eax
3770a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	RETURN
3780a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
3790a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
3800a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(prolog_find_zero_in_third_or_fourth_wchar):
3810a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	$15, %ch
3820a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(prolog_find_zero_in_fourth_wchar)
383592c7b4cd72e18f2f1941df3d63026d7f94ef7ceChih-Hung Hsieh	and	$(1 << 9) - 1, %eax
3840a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(return_null)
3850a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
3860a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	%ah, %ah
3870a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(match_third_wchar)
3880a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	$15 << 4, %al
3890a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(match_second_wchar)
3900a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	lea	-16(%edi), %eax
3910a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	RETURN
3920a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
3930a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
3940a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(prolog_find_zero_in_fourth_wchar):
3950a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	%ah, %ah
3960a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(match_third_or_fourth_wchar)
3970a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	$15 << 4, %al
3980a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(match_second_wchar)
3990a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	lea	-16(%edi), %eax
4000a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	RETURN
4010a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
4020a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaEND (wcsrchr)
403