Optimized strcpy, strcat, strncpy, strncat, strlcpy, strlcat, memchr, memrchr, strchr, strrchr, index, strnlen, strlen, wcslen, wmemcmp, wcscmp, wcschr, wcsrchr, wcscpy, wcscat Change-Id: I82b29132edf9a2e144e0bb3ee4ff5217df8d2a6d Signed-off-by: Liubov Dmitrieva <liubov.dmitrieva@intel.com>
		
			
				
	
	
		
			1063 lines
		
	
	
		
			25 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			1063 lines
		
	
	
		
			25 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
/*
 | 
						|
Copyright (c) 2011 Intel Corporation
 | 
						|
All rights reserved.
 | 
						|
 | 
						|
Redistribution and use in source and binary forms, with or without
 | 
						|
modification, are permitted provided that the following conditions are met:
 | 
						|
 | 
						|
    * Redistributions of source code must retain the above copyright notice,
 | 
						|
    * this list of conditions and the following disclaimer.
 | 
						|
 | 
						|
    * Redistributions in binary form must reproduce the above copyright notice,
 | 
						|
    * this list of conditions and the following disclaimer in the documentation
 | 
						|
    * and/or other materials provided with the distribution.
 | 
						|
 | 
						|
    * Neither the name of Intel Corporation nor the names of its contributors
 | 
						|
    * may be used to endorse or promote products derived from this software
 | 
						|
    * without specific prior written permission.
 | 
						|
 | 
						|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
						|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
						|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
						|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
 | 
						|
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
						|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
						|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
						|
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
						|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
						|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
						|
*/
 | 
						|
 | 
						|
#ifndef L
 | 
						|
# define L(label)	.L##label
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef cfi_startproc
 | 
						|
# define cfi_startproc	.cfi_startproc
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef cfi_endproc
 | 
						|
# define cfi_endproc	.cfi_endproc
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef cfi_rel_offset
 | 
						|
# define cfi_rel_offset(reg, off)	.cfi_rel_offset reg, off
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef cfi_restore
 | 
						|
# define cfi_restore(reg)	.cfi_restore reg
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef cfi_adjust_cfa_offset
 | 
						|
# define cfi_adjust_cfa_offset(off)	.cfi_adjust_cfa_offset off
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef ENTRY
 | 
						|
# define ENTRY(name)	\
 | 
						|
	.type name, @function;	\
 | 
						|
	.globl name;	\
 | 
						|
	.p2align 4;	\
 | 
						|
name:	\
 | 
						|
	cfi_startproc
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef END
 | 
						|
# define END(name)	\
 | 
						|
	cfi_endproc;	\
 | 
						|
	.size name, .-name
 | 
						|
#endif
 | 
						|
 | 
						|
#define CFI_PUSH(REG)	\
 | 
						|
	cfi_adjust_cfa_offset (4);	\
 | 
						|
	cfi_rel_offset (REG, 0)
 | 
						|
 | 
						|
#define CFI_POP(REG)	\
 | 
						|
	cfi_adjust_cfa_offset (-4);	\
 | 
						|
	cfi_restore (REG)
 | 
						|
 | 
						|
#define PUSH(REG) pushl REG; CFI_PUSH (REG)
 | 
						|
#define POP(REG) popl REG; CFI_POP (REG)
 | 
						|
 | 
						|
#define ENTRANCE PUSH(%esi); PUSH(%edi)
 | 
						|
#define RETURN  POP(%edi); POP(%esi); ret; CFI_PUSH(%esi); CFI_PUSH(%edi);
 | 
						|
#define PARMS  4
 | 
						|
#define STR1  PARMS
 | 
						|
#define STR2  STR1+4
 | 
						|
 | 
						|
	.text
 | 
						|
ENTRY (wcscmp)
 | 
						|
/*
 | 
						|
	* This implementation uses SSE to compare up to 16 bytes at a time.
 | 
						|
*/
 | 
						|
	mov	STR1(%esp), %edx
 | 
						|
	mov	STR2(%esp), %eax
 | 
						|
 | 
						|
	mov	(%eax), %ecx
 | 
						|
	cmp	%ecx, (%edx)
 | 
						|
	jne	L(neq)
 | 
						|
	test	%ecx, %ecx
 | 
						|
	jz	L(eq)
 | 
						|
 | 
						|
	mov	4(%eax), %ecx
 | 
						|
	cmp	%ecx, 4(%edx)
 | 
						|
	jne	L(neq)
 | 
						|
	test	%ecx, %ecx
 | 
						|
	jz	L(eq)
 | 
						|
 | 
						|
	mov	8(%eax), %ecx
 | 
						|
	cmp	%ecx, 8(%edx)
 | 
						|
	jne	L(neq)
 | 
						|
	test	%ecx, %ecx
 | 
						|
	jz	L(eq)
 | 
						|
 | 
						|
	mov	12(%eax), %ecx
 | 
						|
	cmp	%ecx, 12(%edx)
 | 
						|
	jne	L(neq)
 | 
						|
	test	%ecx, %ecx
 | 
						|
	jz	L(eq)
 | 
						|
 | 
						|
	ENTRANCE
 | 
						|
	add	$16, %eax
 | 
						|
	add	$16, %edx
 | 
						|
 | 
						|
	mov	%eax, %esi
 | 
						|
	mov	%edx, %edi
 | 
						|
	pxor	%xmm0, %xmm0		/* clear %xmm0 for null char checks */
 | 
						|
	mov	%al, %ch
 | 
						|
	mov	%dl, %cl
 | 
						|
	and	$63, %eax		/* esi alignment in cache line */
 | 
						|
	and	$63, %edx		/* edi alignment in cache line */
 | 
						|
	and	$15, %cl
 | 
						|
	jz	L(continue_00)
 | 
						|
	cmp	$16, %edx
 | 
						|
	jb	L(continue_0)
 | 
						|
	cmp	$32, %edx
 | 
						|
	jb	L(continue_16)
 | 
						|
	cmp	$48, %edx
 | 
						|
	jb	L(continue_32)
 | 
						|
 | 
						|
L(continue_48):
 | 
						|
	and	$15, %ch
 | 
						|
	jz	L(continue_48_00)
 | 
						|
	cmp	$16, %eax
 | 
						|
	jb	L(continue_0_48)
 | 
						|
	cmp	$32, %eax
 | 
						|
	jb	L(continue_16_48)
 | 
						|
	cmp	$48, %eax
 | 
						|
	jb	L(continue_32_48)
 | 
						|
 | 
						|
	.p2align 4
 | 
						|
L(continue_48_48):
 | 
						|
	mov	(%esi), %ecx
 | 
						|
	cmp	%ecx, (%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	test	%ecx, %ecx
 | 
						|
	jz	L(equal)
 | 
						|
 | 
						|
	mov	4(%esi), %ecx
 | 
						|
	cmp	%ecx, 4(%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	test	%ecx, %ecx
 | 
						|
	jz	L(equal)
 | 
						|
 | 
						|
	mov	8(%esi), %ecx
 | 
						|
	cmp	%ecx, 8(%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	test	%ecx, %ecx
 | 
						|
	jz	L(equal)
 | 
						|
 | 
						|
	mov	12(%esi), %ecx
 | 
						|
	cmp	%ecx, 12(%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	test	%ecx, %ecx
 | 
						|
	jz	L(equal)
 | 
						|
 | 
						|
	movdqu	16(%edi), %xmm1
 | 
						|
	movdqu	16(%esi), %xmm2
 | 
						|
	pcmpeqd	%xmm1, %xmm0		/* Any null double_word? */
 | 
						|
	pcmpeqd	%xmm2, %xmm1		/* compare first 4 double_words for equality */
 | 
						|
	psubb	%xmm0, %xmm1		/* packed sub of comparison results*/
 | 
						|
	pmovmskb %xmm1, %edx
 | 
						|
	sub	$0xffff, %edx		/* if first 4 double_words are same, edx == 0xffff */
 | 
						|
	jnz	L(less4_double_words_16)
 | 
						|
 | 
						|
	movdqu	32(%edi), %xmm1
 | 
						|
	movdqu	32(%esi), %xmm2
 | 
						|
	pcmpeqd	%xmm1, %xmm0		/* Any null double_word? */
 | 
						|
	pcmpeqd	%xmm2, %xmm1		/* compare first 4 double_words for equality */
 | 
						|
	psubb	%xmm0, %xmm1		/* packed sub of comparison results*/
 | 
						|
	pmovmskb %xmm1, %edx
 | 
						|
	sub	$0xffff, %edx		/* if first 4 double_words are same, edx == 0xffff */
 | 
						|
	jnz	L(less4_double_words_32)
 | 
						|
 | 
						|
	movdqu	48(%edi), %xmm1
 | 
						|
	movdqu	48(%esi), %xmm2
 | 
						|
	pcmpeqd	%xmm1, %xmm0		/* Any null double_word? */
 | 
						|
	pcmpeqd	%xmm2, %xmm1		/* compare first 4 double_words for equality */
 | 
						|
	psubb	%xmm0, %xmm1		/* packed sub of comparison results*/
 | 
						|
	pmovmskb %xmm1, %edx
 | 
						|
	sub	$0xffff, %edx		/* if first 4 double_words are same, edx == 0xffff */
 | 
						|
	jnz	L(less4_double_words_48)
 | 
						|
 | 
						|
	add	$64, %esi
 | 
						|
	add	$64, %edi
 | 
						|
	jmp	L(continue_48_48)
 | 
						|
 | 
						|
L(continue_0):
 | 
						|
	and	$15, %ch
 | 
						|
	jz	L(continue_0_00)
 | 
						|
	cmp	$16, %eax
 | 
						|
	jb	L(continue_0_0)
 | 
						|
	cmp	$32, %eax
 | 
						|
	jb	L(continue_0_16)
 | 
						|
	cmp	$48, %eax
 | 
						|
	jb	L(continue_0_32)
 | 
						|
 | 
						|
	.p2align 4
 | 
						|
L(continue_0_48):
 | 
						|
	mov	(%esi), %ecx
 | 
						|
	cmp	%ecx, (%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	test	%ecx, %ecx
 | 
						|
	jz	L(equal)
 | 
						|
 | 
						|
	mov	4(%esi), %ecx
 | 
						|
	cmp	%ecx, 4(%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	test	%ecx, %ecx
 | 
						|
	jz	L(equal)
 | 
						|
 | 
						|
	mov	8(%esi), %ecx
 | 
						|
	cmp	%ecx, 8(%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	test	%ecx, %ecx
 | 
						|
	jz	L(equal)
 | 
						|
 | 
						|
	mov	12(%esi), %ecx
 | 
						|
	cmp	%ecx, 12(%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	test	%ecx, %ecx
 | 
						|
	jz	L(equal)
 | 
						|
 | 
						|
	movdqu	16(%edi), %xmm1
 | 
						|
	movdqu	16(%esi), %xmm2
 | 
						|
	pcmpeqd	%xmm1, %xmm0		/* Any null double_word? */
 | 
						|
	pcmpeqd	%xmm2, %xmm1		/* compare first 4 double_words for equality */
 | 
						|
	psubb	%xmm0, %xmm1		/* packed sub of comparison results*/
 | 
						|
	pmovmskb %xmm1, %edx
 | 
						|
	sub	$0xffff, %edx		/* if first 4 double_words are same, edx == 0xffff */
 | 
						|
	jnz	L(less4_double_words_16)
 | 
						|
 | 
						|
	movdqu	32(%edi), %xmm1
 | 
						|
	movdqu	32(%esi), %xmm2
 | 
						|
	pcmpeqd	%xmm1, %xmm0		/* Any null double_word? */
 | 
						|
	pcmpeqd	%xmm2, %xmm1		/* compare first 4 double_words for equality */
 | 
						|
	psubb	%xmm0, %xmm1		/* packed sub of comparison results*/
 | 
						|
	pmovmskb %xmm1, %edx
 | 
						|
	sub	$0xffff, %edx		/* if first 4 double_words are same, edx == 0xffff */
 | 
						|
	jnz	L(less4_double_words_32)
 | 
						|
 | 
						|
	mov	48(%esi), %ecx
 | 
						|
	cmp	%ecx, 48(%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	test	%ecx, %ecx
 | 
						|
	jz	L(equal)
 | 
						|
 | 
						|
	mov	52(%esi), %ecx
 | 
						|
	cmp	%ecx, 52(%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	test	%ecx, %ecx
 | 
						|
	jz	L(equal)
 | 
						|
 | 
						|
	mov	56(%esi), %ecx
 | 
						|
	cmp	%ecx, 56(%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	test	%ecx, %ecx
 | 
						|
	jz	L(equal)
 | 
						|
 | 
						|
	mov	60(%esi), %ecx
 | 
						|
	cmp	%ecx, 60(%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	test	%ecx, %ecx
 | 
						|
	jz	L(equal)
 | 
						|
 | 
						|
	add	$64, %esi
 | 
						|
	add	$64, %edi
 | 
						|
	jmp	L(continue_0_48)
 | 
						|
 | 
						|
	.p2align 4
 | 
						|
L(continue_00):
 | 
						|
	and	$15, %ch
 | 
						|
	jz	L(continue_00_00)
 | 
						|
	cmp	$16, %eax
 | 
						|
	jb	L(continue_00_0)
 | 
						|
	cmp	$32, %eax
 | 
						|
	jb	L(continue_00_16)
 | 
						|
	cmp	$48, %eax
 | 
						|
	jb	L(continue_00_32)
 | 
						|
 | 
						|
	.p2align 4
 | 
						|
L(continue_00_48):
 | 
						|
	pcmpeqd	(%edi), %xmm0
 | 
						|
	mov	(%edi), %eax
 | 
						|
	pmovmskb %xmm0, %ecx
 | 
						|
	test	%ecx, %ecx
 | 
						|
	jnz	L(less4_double_words1)
 | 
						|
 | 
						|
	cmp	(%esi), %eax
 | 
						|
	jne	L(nequal)
 | 
						|
 | 
						|
	mov	4(%edi), %eax
 | 
						|
	cmp	4(%esi), %eax
 | 
						|
	jne	L(nequal)
 | 
						|
 | 
						|
	mov	8(%edi), %eax
 | 
						|
	cmp	8(%esi), %eax
 | 
						|
	jne	L(nequal)
 | 
						|
 | 
						|
	mov	12(%edi), %eax
 | 
						|
	cmp	12(%esi), %eax
 | 
						|
	jne	L(nequal)
 | 
						|
 | 
						|
	movdqu	16(%esi), %xmm2
 | 
						|
	pcmpeqd	%xmm2, %xmm0		/* Any null double_word? */
 | 
						|
	pcmpeqd	16(%edi), %xmm2		/* compare first 4 double_words for equality */
 | 
						|
	psubb	%xmm0, %xmm2		/* packed sub of comparison results*/
 | 
						|
	pmovmskb %xmm2, %edx
 | 
						|
	sub	$0xffff, %edx		/* if first 4 double_words are same, edx == 0xffff */
 | 
						|
	jnz	L(less4_double_words_16)
 | 
						|
 | 
						|
	movdqu	32(%esi), %xmm2
 | 
						|
	pcmpeqd	%xmm2, %xmm0		/* Any null double_word? */
 | 
						|
	pcmpeqd	32(%edi), %xmm2		/* compare first 4 double_words for equality */
 | 
						|
	psubb	%xmm0, %xmm2		/* packed sub of comparison results*/
 | 
						|
	pmovmskb %xmm2, %edx
 | 
						|
	sub	$0xffff, %edx		/* if first 4 double_words are same, edx == 0xffff */
 | 
						|
	jnz	L(less4_double_words_32)
 | 
						|
 | 
						|
	movdqu	48(%esi), %xmm2
 | 
						|
	pcmpeqd	%xmm2, %xmm0		/* Any null double_word? */
 | 
						|
	pcmpeqd	48(%edi), %xmm2		/* compare first 4 double_words for equality */
 | 
						|
	psubb	%xmm0, %xmm2		/* packed sub of comparison results*/
 | 
						|
	pmovmskb %xmm2, %edx
 | 
						|
	sub	$0xffff, %edx		/* if first 4 double_words are same, edx == 0xffff */
 | 
						|
	jnz	L(less4_double_words_48)
 | 
						|
 | 
						|
	add	$64, %esi
 | 
						|
	add	$64, %edi
 | 
						|
	jmp	L(continue_00_48)
 | 
						|
 | 
						|
	.p2align 4
 | 
						|
L(continue_32):
 | 
						|
	and	$15, %ch
 | 
						|
	jz	L(continue_32_00)
 | 
						|
	cmp	$16, %eax
 | 
						|
	jb	L(continue_0_32)
 | 
						|
	cmp	$32, %eax
 | 
						|
	jb	L(continue_16_32)
 | 
						|
	cmp	$48, %eax
 | 
						|
	jb	L(continue_32_32)
 | 
						|
 | 
						|
	.p2align 4
 | 
						|
L(continue_32_48):
 | 
						|
	mov	(%esi), %ecx
 | 
						|
	cmp	%ecx, (%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	test	%ecx, %ecx
 | 
						|
	jz	L(equal)
 | 
						|
 | 
						|
	mov	4(%esi), %ecx
 | 
						|
	cmp	%ecx, 4(%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	test	%ecx, %ecx
 | 
						|
	jz	L(equal)
 | 
						|
 | 
						|
	mov	8(%esi), %ecx
 | 
						|
	cmp	%ecx, 8(%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	test	%ecx, %ecx
 | 
						|
	jz	L(equal)
 | 
						|
 | 
						|
	mov	12(%esi), %ecx
 | 
						|
	cmp	%ecx, 12(%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	test	%ecx, %ecx
 | 
						|
	jz	L(equal)
 | 
						|
 | 
						|
	mov	16(%esi), %ecx
 | 
						|
	cmp	%ecx, 16(%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	test	%ecx, %ecx
 | 
						|
	jz	L(equal)
 | 
						|
 | 
						|
	mov	20(%esi), %ecx
 | 
						|
	cmp	%ecx, 20(%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	test	%ecx, %ecx
 | 
						|
	jz	L(equal)
 | 
						|
 | 
						|
	mov	24(%esi), %ecx
 | 
						|
	cmp	%ecx, 24(%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	test	%ecx, %ecx
 | 
						|
	jz	L(equal)
 | 
						|
 | 
						|
	mov	28(%esi), %ecx
 | 
						|
	cmp	%ecx, 28(%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	test	%ecx, %ecx
 | 
						|
	jz	L(equal)
 | 
						|
 | 
						|
	movdqu	32(%edi), %xmm1
 | 
						|
	movdqu	32(%esi), %xmm2
 | 
						|
	pcmpeqd	%xmm1, %xmm0		/* Any null double_word? */
 | 
						|
	pcmpeqd	%xmm2, %xmm1		/* compare first 4 double_words for equality */
 | 
						|
	psubb	%xmm0, %xmm1		/* packed sub of comparison results*/
 | 
						|
	pmovmskb %xmm1, %edx
 | 
						|
	sub	$0xffff, %edx		/* if first 4 double_words are same, edx == 0xffff */
 | 
						|
	jnz	L(less4_double_words_32)
 | 
						|
 | 
						|
	movdqu	48(%edi), %xmm1
 | 
						|
	movdqu	48(%esi), %xmm2
 | 
						|
	pcmpeqd	%xmm1, %xmm0		/* Any null double_word? */
 | 
						|
	pcmpeqd	%xmm2, %xmm1		/* compare first 4 double_words for equality */
 | 
						|
	psubb	%xmm0, %xmm1		/* packed sub of comparison results*/
 | 
						|
	pmovmskb %xmm1, %edx
 | 
						|
	sub	$0xffff, %edx		/* if first 4 double_words are same, edx == 0xffff */
 | 
						|
	jnz	L(less4_double_words_48)
 | 
						|
 | 
						|
	add	$64, %esi
 | 
						|
	add	$64, %edi
 | 
						|
	jmp	L(continue_32_48)
 | 
						|
 | 
						|
	.p2align 4
 | 
						|
L(continue_16):
 | 
						|
	and	$15, %ch
 | 
						|
	jz	L(continue_16_00)
 | 
						|
	cmp	$16, %eax
 | 
						|
	jb	L(continue_0_16)
 | 
						|
	cmp	$32, %eax
 | 
						|
	jb	L(continue_16_16)
 | 
						|
	cmp	$48, %eax
 | 
						|
	jb	L(continue_16_32)
 | 
						|
 | 
						|
	.p2align 4
 | 
						|
L(continue_16_48):
 | 
						|
	mov	(%esi), %ecx
 | 
						|
	cmp	%ecx, (%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	test	%ecx, %ecx
 | 
						|
	jz	L(equal)
 | 
						|
 | 
						|
	mov	4(%esi), %ecx
 | 
						|
	cmp	%ecx, 4(%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	test	%ecx, %ecx
 | 
						|
	jz	L(equal)
 | 
						|
 | 
						|
	mov	8(%esi), %ecx
 | 
						|
	cmp	%ecx, 8(%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	test	%ecx, %ecx
 | 
						|
	jz	L(equal)
 | 
						|
 | 
						|
	mov	12(%esi), %ecx
 | 
						|
	cmp	%ecx, 12(%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	test	%ecx, %ecx
 | 
						|
	jz	L(equal)
 | 
						|
 | 
						|
	movdqu	16(%edi), %xmm1
 | 
						|
	movdqu	16(%esi), %xmm2
 | 
						|
	pcmpeqd	%xmm1, %xmm0		/* Any null double_word? */
 | 
						|
	pcmpeqd	%xmm2, %xmm1		/* compare first 4 double_words for equality */
 | 
						|
	psubb	%xmm0, %xmm1		/* packed sub of comparison results*/
 | 
						|
	pmovmskb %xmm1, %edx
 | 
						|
	sub	$0xffff, %edx		/* if first 4 double_words are same, edx == 0xffff */
 | 
						|
	jnz	L(less4_double_words_16)
 | 
						|
 | 
						|
	mov	32(%esi), %ecx
 | 
						|
	cmp	%ecx, 32(%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	test	%ecx, %ecx
 | 
						|
	jz	L(equal)
 | 
						|
 | 
						|
	mov	36(%esi), %ecx
 | 
						|
	cmp	%ecx, 36(%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	test	%ecx, %ecx
 | 
						|
	jz	L(equal)
 | 
						|
 | 
						|
	mov	40(%esi), %ecx
 | 
						|
	cmp	%ecx, 40(%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	test	%ecx, %ecx
 | 
						|
	jz	L(equal)
 | 
						|
 | 
						|
	mov	44(%esi), %ecx
 | 
						|
	cmp	%ecx, 44(%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	test	%ecx, %ecx
 | 
						|
	jz	L(equal)
 | 
						|
 | 
						|
	movdqu	48(%edi), %xmm1
 | 
						|
	movdqu	48(%esi), %xmm2
 | 
						|
	pcmpeqd	%xmm1, %xmm0		/* Any null double_word? */
 | 
						|
	pcmpeqd	%xmm2, %xmm1		/* compare first 4 double_words for equality */
 | 
						|
	psubb	%xmm0, %xmm1		/* packed sub of comparison results*/
 | 
						|
	pmovmskb %xmm1, %edx
 | 
						|
	sub	$0xffff, %edx		/* if first 4 double_words are same, edx == 0xffff */
 | 
						|
	jnz	L(less4_double_words_48)
 | 
						|
 | 
						|
	add	$64, %esi
 | 
						|
	add	$64, %edi
 | 
						|
	jmp	L(continue_16_48)
 | 
						|
 | 
						|
	.p2align 4
 | 
						|
L(continue_00_00):
 | 
						|
	movdqa	(%edi), %xmm1
 | 
						|
	pcmpeqd	%xmm1, %xmm0		/* Any null double_word? */
 | 
						|
	pcmpeqd	(%esi), %xmm1		/* compare first 4 double_words for equality */
 | 
						|
	psubb	%xmm0, %xmm1		/* packed sub of comparison results*/
 | 
						|
	pmovmskb %xmm1, %edx
 | 
						|
	sub	$0xffff, %edx		/* if first 4 double_words are same, edx == 0xffff */
 | 
						|
	jnz	L(less4_double_words)
 | 
						|
 | 
						|
	movdqa	16(%edi), %xmm3
 | 
						|
	pcmpeqd	%xmm3, %xmm0		/* Any null double_word? */
 | 
						|
	pcmpeqd	16(%esi), %xmm3		/* compare first 4 double_words for equality */
 | 
						|
	psubb	%xmm0, %xmm3		/* packed sub of comparison results*/
 | 
						|
	pmovmskb %xmm3, %edx
 | 
						|
	sub	$0xffff, %edx		/* if first 4 double_words are same, edx == 0xffff */
 | 
						|
	jnz	L(less4_double_words_16)
 | 
						|
 | 
						|
	movdqa	32(%edi), %xmm5
 | 
						|
	pcmpeqd	%xmm5, %xmm0		/* Any null double_word? */
 | 
						|
	pcmpeqd	32(%esi), %xmm5		/* compare first 4 double_words for equality */
 | 
						|
	psubb	%xmm0, %xmm5		/* packed sub of comparison results*/
 | 
						|
	pmovmskb %xmm5, %edx
 | 
						|
	sub	$0xffff, %edx		/* if first 4 double_words are same, edx == 0xffff */
 | 
						|
	jnz	L(less4_double_words_32)
 | 
						|
 | 
						|
	movdqa	48(%edi), %xmm1
 | 
						|
	pcmpeqd	%xmm1, %xmm0		/* Any null double_word? */
 | 
						|
	pcmpeqd	48(%esi), %xmm1		/* compare first 4 double_words for equality */
 | 
						|
	psubb	%xmm0, %xmm1		/* packed sub of comparison results*/
 | 
						|
	pmovmskb %xmm1, %edx
 | 
						|
	sub	$0xffff, %edx		/* if first 4 double_words are same, edx == 0xffff */
 | 
						|
	jnz	L(less4_double_words_48)
 | 
						|
 | 
						|
	add	$64, %esi
 | 
						|
	add	$64, %edi
 | 
						|
	jmp	L(continue_00_00)
 | 
						|
 | 
						|
	.p2align 4
 | 
						|
L(continue_00_32):
 | 
						|
	movdqu	(%esi), %xmm2
 | 
						|
	pcmpeqd	%xmm2, %xmm0		/* Any null double_word? */
 | 
						|
	pcmpeqd	(%edi), %xmm2		/* compare first 4 double_words for equality */
 | 
						|
	psubb	%xmm0, %xmm2		/* packed sub of comparison results*/
 | 
						|
	pmovmskb %xmm2, %edx
 | 
						|
	sub	$0xffff, %edx		/* if first 4 double_words are same, edx == 0xffff */
 | 
						|
	jnz	L(less4_double_words)
 | 
						|
 | 
						|
	add	$16, %esi
 | 
						|
	add	$16, %edi
 | 
						|
	jmp	L(continue_00_48)
 | 
						|
 | 
						|
	.p2align 4
 | 
						|
L(continue_00_16):
 | 
						|
	movdqu	(%esi), %xmm2
 | 
						|
	pcmpeqd	%xmm2, %xmm0		/* Any null double_word? */
 | 
						|
	pcmpeqd	(%edi), %xmm2		/* compare first 4 double_words for equality */
 | 
						|
	psubb	%xmm0, %xmm2		/* packed sub of comparison results*/
 | 
						|
	pmovmskb %xmm2, %edx
 | 
						|
	sub	$0xffff, %edx		/* if first 4 double_words are same, edx == 0xffff */
 | 
						|
	jnz	L(less4_double_words)
 | 
						|
 | 
						|
	movdqu	16(%esi), %xmm2
 | 
						|
	pcmpeqd	%xmm2, %xmm0		/* Any null double_word? */
 | 
						|
	pcmpeqd	16(%edi), %xmm2		/* compare first 4 double_words for equality */
 | 
						|
	psubb	%xmm0, %xmm2		/* packed sub of comparison results*/
 | 
						|
	pmovmskb %xmm2, %edx
 | 
						|
	sub	$0xffff, %edx		/* if first 4 double_words are same, edx == 0xffff */
 | 
						|
	jnz	L(less4_double_words_16)
 | 
						|
 | 
						|
	add	$32, %esi
 | 
						|
	add	$32, %edi
 | 
						|
	jmp	L(continue_00_48)
 | 
						|
 | 
						|
	.p2align 4
 | 
						|
L(continue_00_0):
 | 
						|
	movdqu	(%esi), %xmm2
 | 
						|
	pcmpeqd	%xmm2, %xmm0		/* Any null double_word? */
 | 
						|
	pcmpeqd	(%edi), %xmm2		/* compare first 4 double_words for equality */
 | 
						|
	psubb	%xmm0, %xmm2		/* packed sub of comparison results*/
 | 
						|
	pmovmskb %xmm2, %edx
 | 
						|
	sub	$0xffff, %edx		/* if first 4 double_words are same, edx == 0xffff */
 | 
						|
	jnz	L(less4_double_words)
 | 
						|
 | 
						|
	movdqu	16(%esi), %xmm2
 | 
						|
	pcmpeqd	%xmm2, %xmm0		/* Any null double_word? */
 | 
						|
	pcmpeqd	16(%edi), %xmm2		/* compare first 4 double_words for equality */
 | 
						|
	psubb	%xmm0, %xmm2		/* packed sub of comparison results*/
 | 
						|
	pmovmskb %xmm2, %edx
 | 
						|
	sub	$0xffff, %edx		/* if first 4 double_words are same, edx == 0xffff */
 | 
						|
	jnz	L(less4_double_words_16)
 | 
						|
 | 
						|
	movdqu	32(%esi), %xmm2
 | 
						|
	pcmpeqd	%xmm2, %xmm0		/* Any null double_word? */
 | 
						|
	pcmpeqd	32(%edi), %xmm2		/* compare first 4 double_words for equality */
 | 
						|
	psubb	%xmm0, %xmm2		/* packed sub of comparison results*/
 | 
						|
	pmovmskb %xmm2, %edx
 | 
						|
	sub	$0xffff, %edx		/* if first 4 double_words are same, edx == 0xffff */
 | 
						|
	jnz	L(less4_double_words_32)
 | 
						|
 | 
						|
	add	$48, %esi
 | 
						|
	add	$48, %edi
 | 
						|
	jmp	L(continue_00_48)
 | 
						|
 | 
						|
	.p2align 4
 | 
						|
L(continue_48_00):
 | 
						|
	pcmpeqd	(%esi), %xmm0
 | 
						|
	mov	(%edi), %eax
 | 
						|
	pmovmskb %xmm0, %ecx
 | 
						|
	test	%ecx, %ecx
 | 
						|
	jnz	L(less4_double_words1)
 | 
						|
 | 
						|
	cmp	(%esi), %eax
 | 
						|
	jne	L(nequal)
 | 
						|
 | 
						|
	mov	4(%edi), %eax
 | 
						|
	cmp	4(%esi), %eax
 | 
						|
	jne	L(nequal)
 | 
						|
 | 
						|
	mov	8(%edi), %eax
 | 
						|
	cmp	8(%esi), %eax
 | 
						|
	jne	L(nequal)
 | 
						|
 | 
						|
	mov	12(%edi), %eax
 | 
						|
	cmp	12(%esi), %eax
 | 
						|
	jne	L(nequal)
 | 
						|
 | 
						|
	movdqu	16(%edi), %xmm1
 | 
						|
	pcmpeqd	%xmm1, %xmm0		/* Any null double_word? */
 | 
						|
	pcmpeqd	16(%esi), %xmm1		/* compare first 4 double_words for equality */
 | 
						|
	psubb	%xmm0, %xmm1		/* packed sub of comparison results*/
 | 
						|
	pmovmskb %xmm1, %edx
 | 
						|
	sub	$0xffff, %edx		/* if first 4 double_words are same, edx == 0xffff */
 | 
						|
	jnz	L(less4_double_words_16)
 | 
						|
 | 
						|
	movdqu	32(%edi), %xmm1
 | 
						|
	pcmpeqd	%xmm1, %xmm0		/* Any null double_word? */
 | 
						|
	pcmpeqd	32(%esi), %xmm1		/* compare first 4 double_words for equality */
 | 
						|
	psubb	%xmm0, %xmm1		/* packed sub of comparison results*/
 | 
						|
	pmovmskb %xmm1, %edx
 | 
						|
	sub	$0xffff, %edx		/* if first 4 double_words are same, edx == 0xffff */
 | 
						|
	jnz	L(less4_double_words_32)
 | 
						|
 | 
						|
	movdqu	48(%edi), %xmm1
 | 
						|
	pcmpeqd	%xmm1, %xmm0		/* Any null double_word? */
 | 
						|
	pcmpeqd	48(%esi), %xmm1		/* compare first 4 double_words for equality */
 | 
						|
	psubb	%xmm0, %xmm1		/* packed sub of comparison results*/
 | 
						|
	pmovmskb %xmm1, %edx
 | 
						|
	sub	$0xffff, %edx		/* if first 4 double_words are same, edx == 0xffff */
 | 
						|
	jnz	L(less4_double_words_48)
 | 
						|
 | 
						|
	add	$64, %esi
 | 
						|
	add	$64, %edi
 | 
						|
	jmp	L(continue_48_00)
 | 
						|
 | 
						|
	.p2align 4
 | 
						|
L(continue_32_00):
 | 
						|
	movdqu	(%edi), %xmm1
 | 
						|
	pcmpeqd	%xmm1, %xmm0		/* Any null double_word? */
 | 
						|
	pcmpeqd	(%esi), %xmm1		/* compare first 4 double_words for equality */
 | 
						|
	psubb	%xmm0, %xmm1		/* packed sub of comparison results*/
 | 
						|
	pmovmskb %xmm1, %edx
 | 
						|
	sub	$0xffff, %edx		/* if first 4 double_words are same, edx == 0xffff */
 | 
						|
	jnz	L(less4_double_words)
 | 
						|
 | 
						|
	add	$16, %esi
 | 
						|
	add	$16, %edi
 | 
						|
	jmp	L(continue_48_00)
 | 
						|
 | 
						|
	.p2align 4
 | 
						|
L(continue_16_00):
 | 
						|
	movdqu	(%edi), %xmm1
 | 
						|
	pcmpeqd	%xmm1, %xmm0		/* Any null double_word? */
 | 
						|
	pcmpeqd	(%esi), %xmm1		/* compare first 4 double_words for equality */
 | 
						|
	psubb	%xmm0, %xmm1		/* packed sub of comparison results*/
 | 
						|
	pmovmskb %xmm1, %edx
 | 
						|
	sub	$0xffff, %edx		/* if first 4 double_words are same, edx == 0xffff */
 | 
						|
	jnz	L(less4_double_words)
 | 
						|
 | 
						|
	movdqu	16(%edi), %xmm1
 | 
						|
	pcmpeqd	%xmm1, %xmm0		/* Any null double_word? */
 | 
						|
	pcmpeqd	16(%esi), %xmm1		/* compare first 4 double_words for equality */
 | 
						|
	psubb	%xmm0, %xmm1		/* packed sub of comparison results*/
 | 
						|
	pmovmskb %xmm1, %edx
 | 
						|
	sub	$0xffff, %edx		/* if first 4 double_words are same, edx == 0xffff */
 | 
						|
	jnz	L(less4_double_words_16)
 | 
						|
 | 
						|
	add	$32, %esi
 | 
						|
	add	$32, %edi
 | 
						|
	jmp	L(continue_48_00)
 | 
						|
 | 
						|
	.p2align 4
 | 
						|
L(continue_0_00):
 | 
						|
	movdqu	(%edi), %xmm1
 | 
						|
	pcmpeqd	%xmm1, %xmm0		/* Any null double_word? */
 | 
						|
	pcmpeqd	(%esi), %xmm1		/* compare first 4 double_words for equality */
 | 
						|
	psubb	%xmm0, %xmm1		/* packed sub of comparison results*/
 | 
						|
	pmovmskb %xmm1, %edx
 | 
						|
	sub	$0xffff, %edx		/* if first 4 double_words are same, edx == 0xffff */
 | 
						|
	jnz	L(less4_double_words)
 | 
						|
 | 
						|
	movdqu	16(%edi), %xmm1
 | 
						|
	pcmpeqd	%xmm1, %xmm0		/* Any null double_word? */
 | 
						|
	pcmpeqd	16(%esi), %xmm1		/* compare first 4 double_words for equality */
 | 
						|
	psubb	%xmm0, %xmm1		/* packed sub of comparison results*/
 | 
						|
	pmovmskb %xmm1, %edx
 | 
						|
	sub	$0xffff, %edx		/* if first 4 double_words are same, edx == 0xffff */
 | 
						|
	jnz	L(less4_double_words_16)
 | 
						|
 | 
						|
	movdqu	32(%edi), %xmm1
 | 
						|
	pcmpeqd	%xmm1, %xmm0		/* Any null double_word? */
 | 
						|
	pcmpeqd	32(%esi), %xmm1		/* compare first 4 double_words for equality */
 | 
						|
	psubb	%xmm0, %xmm1		/* packed sub of comparison results*/
 | 
						|
	pmovmskb %xmm1, %edx
 | 
						|
	sub	$0xffff, %edx		/* if first 4 double_words are same, edx == 0xffff */
 | 
						|
	jnz	L(less4_double_words_32)
 | 
						|
 | 
						|
	add	$48, %esi
 | 
						|
	add	$48, %edi
 | 
						|
	jmp	L(continue_48_00)
 | 
						|
 | 
						|
	.p2align 4
 | 
						|
L(continue_32_32):
 | 
						|
	movdqu	(%edi), %xmm1
 | 
						|
	movdqu	(%esi), %xmm2
 | 
						|
	pcmpeqd	%xmm1, %xmm0		/* Any null double_word? */
 | 
						|
	pcmpeqd	%xmm2, %xmm1		/* compare first 4 double_words for equality */
 | 
						|
	psubb	%xmm0, %xmm1		/* packed sub of comparison results*/
 | 
						|
	pmovmskb %xmm1, %edx
 | 
						|
	sub	$0xffff, %edx		/* if first 4 double_words are same, edx == 0xffff */
 | 
						|
	jnz	L(less4_double_words)
 | 
						|
 | 
						|
	add	$16, %esi
 | 
						|
	add	$16, %edi
 | 
						|
	jmp	L(continue_48_48)
 | 
						|
 | 
						|
	.p2align 4
 | 
						|
L(continue_16_16):
 | 
						|
	movdqu	(%edi), %xmm1
 | 
						|
	movdqu	(%esi), %xmm2
 | 
						|
	pcmpeqd	%xmm1, %xmm0		/* Any null double_word? */
 | 
						|
	pcmpeqd	%xmm2, %xmm1		/* compare first 4 double_words for equality */
 | 
						|
	psubb	%xmm0, %xmm1		/* packed sub of comparison results*/
 | 
						|
	pmovmskb %xmm1, %edx
 | 
						|
	sub	$0xffff, %edx		/* if first 4 double_words are same, edx == 0xffff */
 | 
						|
	jnz	L(less4_double_words)
 | 
						|
 | 
						|
	movdqu	16(%edi), %xmm3
 | 
						|
	movdqu	16(%esi), %xmm4
 | 
						|
	pcmpeqd	%xmm3, %xmm0		/* Any null double_word? */
 | 
						|
	pcmpeqd	%xmm4, %xmm3		/* compare first 4 double_words for equality */
 | 
						|
	psubb	%xmm0, %xmm3		/* packed sub of comparison results*/
 | 
						|
	pmovmskb %xmm3, %edx
 | 
						|
	sub	$0xffff, %edx		/* if first 4 double_words are same, edx == 0xffff */
 | 
						|
	jnz	L(less4_double_words_16)
 | 
						|
 | 
						|
	add	$32, %esi
 | 
						|
	add	$32, %edi
 | 
						|
	jmp	L(continue_48_48)
 | 
						|
 | 
						|
	.p2align 4
 | 
						|
L(continue_0_0):
 | 
						|
	movdqu	(%edi), %xmm1
 | 
						|
	movdqu	(%esi), %xmm2
 | 
						|
	pcmpeqd	%xmm1, %xmm0		/* Any null double_word? */
 | 
						|
	pcmpeqd	%xmm2, %xmm1		/* compare first 4 double_words for equality */
 | 
						|
	psubb	%xmm0, %xmm1		/* packed sub of comparison results*/
 | 
						|
	pmovmskb %xmm1, %edx
 | 
						|
	sub	$0xffff, %edx		/* if first 4 double_words are same, edx == 0xffff */
 | 
						|
	jnz	L(less4_double_words)
 | 
						|
 | 
						|
	movdqu	16(%edi), %xmm3
 | 
						|
	movdqu	16(%esi), %xmm4
 | 
						|
	pcmpeqd	%xmm3, %xmm0		/* Any null double_word? */
 | 
						|
	pcmpeqd	%xmm4, %xmm3		/* compare first 4 double_words for equality */
 | 
						|
	psubb	%xmm0, %xmm3		/* packed sub of comparison results*/
 | 
						|
	pmovmskb %xmm3, %edx
 | 
						|
	sub	$0xffff, %edx		/* if first 4 double_words are same, edx == 0xffff */
 | 
						|
	jnz	L(less4_double_words_16)
 | 
						|
 | 
						|
	movdqu	32(%edi), %xmm1
 | 
						|
	movdqu	32(%esi), %xmm2
 | 
						|
	pcmpeqd	%xmm1, %xmm0		/* Any null double_word? */
 | 
						|
	pcmpeqd	%xmm2, %xmm1		/* compare first 4 double_words for equality */
 | 
						|
	psubb	%xmm0, %xmm1		/* packed sub of comparison results*/
 | 
						|
	pmovmskb %xmm1, %edx
 | 
						|
	sub	$0xffff, %edx		/* if first 4 double_words are same, edx == 0xffff */
 | 
						|
	jnz	L(less4_double_words_32)
 | 
						|
 | 
						|
	add	$48, %esi
 | 
						|
	add	$48, %edi
 | 
						|
	jmp	L(continue_48_48)
 | 
						|
 | 
						|
	.p2align 4
 | 
						|
L(continue_0_16):
 | 
						|
	movdqu	(%edi), %xmm1
 | 
						|
	movdqu	(%esi), %xmm2
 | 
						|
	pcmpeqd	%xmm1, %xmm0		/* Any null double_word? */
 | 
						|
	pcmpeqd	%xmm2, %xmm1		/* compare first 4 double_words for equality */
 | 
						|
	psubb	%xmm0, %xmm1		/* packed sub of comparison results*/
 | 
						|
	pmovmskb %xmm1, %edx
 | 
						|
	sub	$0xffff, %edx		/* if first 4 double_words are same, edx == 0xffff */
 | 
						|
	jnz	L(less4_double_words)
 | 
						|
 | 
						|
	movdqu	16(%edi), %xmm1
 | 
						|
	movdqu	16(%esi), %xmm2
 | 
						|
	pcmpeqd	%xmm1, %xmm0		/* Any null double_word? */
 | 
						|
	pcmpeqd	%xmm2, %xmm1		/* compare first 4 double_words for equality */
 | 
						|
	psubb	%xmm0, %xmm1		/* packed sub of comparison results*/
 | 
						|
	pmovmskb %xmm1, %edx
 | 
						|
	sub	$0xffff, %edx		/* if first 4 double_words are same, edx == 0xffff */
 | 
						|
	jnz	L(less4_double_words_16)
 | 
						|
 | 
						|
	add	$32, %esi
 | 
						|
	add	$32, %edi
 | 
						|
	jmp	L(continue_32_48)
 | 
						|
 | 
						|
	.p2align 4
 | 
						|
L(continue_0_32):
 | 
						|
	movdqu	(%edi), %xmm1
 | 
						|
	movdqu	(%esi), %xmm2
 | 
						|
	pcmpeqd	%xmm1, %xmm0		/* Any null double_word? */
 | 
						|
	pcmpeqd	%xmm2, %xmm1		/* compare first 4 double_words for equality */
 | 
						|
	psubb	%xmm0, %xmm1		/* packed sub of comparison results*/
 | 
						|
	pmovmskb %xmm1, %edx
 | 
						|
	sub	$0xffff, %edx		/* if first 4 double_words are same, edx == 0xffff */
 | 
						|
	jnz	L(less4_double_words)
 | 
						|
 | 
						|
	add	$16, %esi
 | 
						|
	add	$16, %edi
 | 
						|
	jmp	L(continue_16_48)
 | 
						|
 | 
						|
	.p2align 4
 | 
						|
L(continue_16_32):
 | 
						|
	movdqu	(%edi), %xmm1
 | 
						|
	movdqu	(%esi), %xmm2
 | 
						|
	pcmpeqd	%xmm1, %xmm0		/* Any null double_word? */
 | 
						|
	pcmpeqd	%xmm2, %xmm1		/* compare first 4 double_words for equality */
 | 
						|
	psubb	%xmm0, %xmm1		/* packed sub of comparison results*/
 | 
						|
	pmovmskb %xmm1, %edx
 | 
						|
	sub	$0xffff, %edx		/* if first 4 double_words are same, edx == 0xffff */
 | 
						|
	jnz	L(less4_double_words)
 | 
						|
 | 
						|
	add	$16, %esi
 | 
						|
	add	$16, %edi
 | 
						|
	jmp	L(continue_32_48)
 | 
						|
 | 
						|
	.p2align 4
 | 
						|
L(less4_double_words1):
 | 
						|
	cmp	(%esi), %eax
 | 
						|
	jne	L(nequal)
 | 
						|
	test	%eax, %eax
 | 
						|
	jz	L(equal)
 | 
						|
 | 
						|
	mov	4(%esi), %ecx
 | 
						|
	cmp	%ecx, 4(%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	test	%ecx, %ecx
 | 
						|
	jz	L(equal)
 | 
						|
 | 
						|
	mov	8(%esi), %ecx
 | 
						|
	cmp	%ecx, 8(%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	test	%ecx, %ecx
 | 
						|
	jz	L(equal)
 | 
						|
 | 
						|
	mov	12(%esi), %ecx
 | 
						|
	cmp	%ecx, 12(%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	xor	%eax, %eax
 | 
						|
	RETURN
 | 
						|
 | 
						|
	.p2align 4
 | 
						|
L(less4_double_words):
 | 
						|
	xor	%eax, %eax
 | 
						|
	test	%dl, %dl
 | 
						|
	jz	L(next_two_double_words)
 | 
						|
	and	$15, %dl
 | 
						|
	jz	L(second_double_word)
 | 
						|
	mov	(%esi), %ecx
 | 
						|
	cmp	%ecx, (%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	RETURN
 | 
						|
 | 
						|
	.p2align 4
 | 
						|
L(second_double_word):
 | 
						|
	mov	4(%esi), %ecx
 | 
						|
	cmp	%ecx, 4(%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	RETURN
 | 
						|
 | 
						|
	.p2align 4
 | 
						|
L(next_two_double_words):
 | 
						|
	and	$15, %dh
 | 
						|
	jz	L(fourth_double_word)
 | 
						|
	mov	8(%esi), %ecx
 | 
						|
	cmp	%ecx, 8(%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	RETURN
 | 
						|
 | 
						|
	.p2align 4
 | 
						|
L(fourth_double_word):
 | 
						|
	mov	12(%esi), %ecx
 | 
						|
	cmp	%ecx, 12(%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	RETURN
 | 
						|
 | 
						|
	.p2align 4
 | 
						|
L(less4_double_words_16):
 | 
						|
	xor	%eax, %eax
 | 
						|
	test	%dl, %dl
 | 
						|
	jz	L(next_two_double_words_16)
 | 
						|
	and	$15, %dl
 | 
						|
	jz	L(second_double_word_16)
 | 
						|
	mov	16(%esi), %ecx
 | 
						|
	cmp	%ecx, 16(%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	RETURN
 | 
						|
 | 
						|
	.p2align 4
 | 
						|
L(second_double_word_16):
 | 
						|
	mov	20(%esi), %ecx
 | 
						|
	cmp	%ecx, 20(%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	RETURN
 | 
						|
 | 
						|
	.p2align 4
 | 
						|
L(next_two_double_words_16):
 | 
						|
	and	$15, %dh
 | 
						|
	jz	L(fourth_double_word_16)
 | 
						|
	mov	24(%esi), %ecx
 | 
						|
	cmp	%ecx, 24(%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	RETURN
 | 
						|
 | 
						|
	.p2align 4
 | 
						|
L(fourth_double_word_16):
 | 
						|
	mov	28(%esi), %ecx
 | 
						|
	cmp	%ecx, 28(%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	RETURN
 | 
						|
 | 
						|
	.p2align 4
 | 
						|
L(less4_double_words_32):
 | 
						|
	xor	%eax, %eax
 | 
						|
	test	%dl, %dl
 | 
						|
	jz	L(next_two_double_words_32)
 | 
						|
	and	$15, %dl
 | 
						|
	jz	L(second_double_word_32)
 | 
						|
	mov	32(%esi), %ecx
 | 
						|
	cmp	%ecx, 32(%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	RETURN
 | 
						|
 | 
						|
	.p2align 4
 | 
						|
L(second_double_word_32):
 | 
						|
	mov	36(%esi), %ecx
 | 
						|
	cmp	%ecx, 36(%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	RETURN
 | 
						|
 | 
						|
	.p2align 4
 | 
						|
L(next_two_double_words_32):
 | 
						|
	and	$15, %dh
 | 
						|
	jz	L(fourth_double_word_32)
 | 
						|
	mov	40(%esi), %ecx
 | 
						|
	cmp	%ecx, 40(%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	RETURN
 | 
						|
 | 
						|
	.p2align 4
 | 
						|
L(fourth_double_word_32):
 | 
						|
	mov	44(%esi), %ecx
 | 
						|
	cmp	%ecx, 44(%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	RETURN
 | 
						|
 | 
						|
	.p2align 4
 | 
						|
L(less4_double_words_48):
 | 
						|
	xor	%eax, %eax
 | 
						|
	test	%dl, %dl
 | 
						|
	jz	L(next_two_double_words_48)
 | 
						|
	and	$15, %dl
 | 
						|
	jz	L(second_double_word_48)
 | 
						|
	mov	48(%esi), %ecx
 | 
						|
	cmp	%ecx, 48(%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	RETURN
 | 
						|
 | 
						|
	.p2align 4
 | 
						|
L(second_double_word_48):
 | 
						|
	mov	52(%esi), %ecx
 | 
						|
	cmp	%ecx, 52(%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	RETURN
 | 
						|
 | 
						|
	.p2align 4
 | 
						|
L(next_two_double_words_48):
 | 
						|
	and	$15, %dh
 | 
						|
	jz	L(fourth_double_word_48)
 | 
						|
	mov	56(%esi), %ecx
 | 
						|
	cmp	%ecx, 56(%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	RETURN
 | 
						|
 | 
						|
	.p2align 4
 | 
						|
L(fourth_double_word_48):
 | 
						|
	mov	60(%esi), %ecx
 | 
						|
	cmp	%ecx, 60(%edi)
 | 
						|
	jne	L(nequal)
 | 
						|
	RETURN
 | 
						|
 | 
						|
	.p2align 4
 | 
						|
L(nequal):
 | 
						|
	mov	$1, %eax
 | 
						|
	jg	L(return)
 | 
						|
	neg	%eax
 | 
						|
	RETURN
 | 
						|
 | 
						|
	.p2align 4
 | 
						|
L(return):
 | 
						|
	RETURN
 | 
						|
 | 
						|
	.p2align 4
 | 
						|
L(equal):
 | 
						|
	xorl	%eax, %eax
 | 
						|
	RETURN
 | 
						|
 | 
						|
	CFI_POP (%edi)
 | 
						|
	CFI_POP (%esi)
 | 
						|
 | 
						|
	.p2align 4
 | 
						|
L(neq):
 | 
						|
	mov	$1, %eax
 | 
						|
	jg	L(neq_bigger)
 | 
						|
	neg	%eax
 | 
						|
 | 
						|
L(neq_bigger):
 | 
						|
	ret
 | 
						|
 | 
						|
	.p2align 4
 | 
						|
L(eq):
 | 
						|
	xorl	%eax, %eax
 | 
						|
	ret
 | 
						|
 | 
						|
END (wcscmp)
 | 
						|
 |