076f82
commit 7cb126e7e7febf9dc3e369cc3e4885e34fb9433b
076f82
Author: Noah Goldstein <goldstein.w.n@gmail.com>
076f82
Date:   Wed Nov 10 16:18:56 2021 -0600
076f82
076f82
    x86: Shrink memcmp-sse4.S code size
076f82
    
076f82
    No bug.
076f82
    
076f82
    This implementation refactors memcmp-sse4.S primarily with minimizing
076f82
    code size in mind. It does this by removing the lookup table logic and
076f82
    removing the unrolled check from (256, 512] bytes.
076f82
    
076f82
    memcmp-sse4 code size reduction : -3487 bytes
076f82
    wmemcmp-sse4 code size reduction: -1472 bytes
076f82
    
076f82
    The current memcmp-sse4.S implementation has a large code size
076f82
    cost. This has serious adverse affects on the ICache / ITLB. While
076f82
    in micro-benchmarks the implementations appears fast, traces of
076f82
    real-world code have shown that the speed in micro benchmarks does not
076f82
    translate when the ICache/ITLB are not primed, and that the cost
076f82
    of the code size has measurable negative affects on overall
076f82
    application performance.
076f82
    
076f82
    See https://research.google/pubs/pub48320/ for more details.
076f82
    
076f82
    Signed-off-by: Noah Goldstein <goldstein.w.n@gmail.com>
076f82
    Reviewed-by: H.J. Lu <hjl.tools@gmail.com>
076f82
    (cherry picked from commit 2f9062d7171850451e6044ef78d91ff8c017b9c0)
076f82
076f82
diff --git a/sysdeps/x86_64/multiarch/memcmp-sse4.S b/sysdeps/x86_64/multiarch/memcmp-sse4.S
076f82
index b7ac034569ec6178..97c102a9c5ab2b91 100644
076f82
--- a/sysdeps/x86_64/multiarch/memcmp-sse4.S
076f82
+++ b/sysdeps/x86_64/multiarch/memcmp-sse4.S
076f82
@@ -25,14 +25,14 @@
076f82
 #  define MEMCMP	__memcmp_sse4_1
076f82
 # endif
076f82
 
076f82
-# define JMPTBL(I, B)	(I - B)
076f82
+#ifdef USE_AS_WMEMCMP
076f82
+# define CMPEQ	pcmpeqd
076f82
+# define CHAR_SIZE	4
076f82
+#else
076f82
+# define CMPEQ	pcmpeqb
076f82
+# define CHAR_SIZE	1
076f82
+#endif
076f82
 
076f82
-# define BRANCH_TO_JMPTBL_ENTRY(TABLE, INDEX, SCALE)		\
076f82
-  lea		TABLE(%rip), %r11;				\
076f82
-  movslq	(%r11, INDEX, SCALE), %rcx;			\
076f82
-  add		%r11, %rcx;					\
076f82
-  _CET_NOTRACK jmp *%rcx;					\
076f82
-  ud2
076f82
 
076f82
 /* Warning!
076f82
            wmemcmp has to use SIGNED comparison for elements.
076f82
@@ -47,33 +47,253 @@ ENTRY (MEMCMP)
076f82
 	/* Clear the upper 32 bits.  */
076f82
 	mov	%edx, %edx
076f82
 # endif
076f82
-	pxor	%xmm0, %xmm0
076f82
 	cmp	$79, %RDX_LP
076f82
 	ja	L(79bytesormore)
076f82
+
076f82
+	cmp	$CHAR_SIZE, %RDX_LP
076f82
+	jbe	L(firstbyte)
076f82
+
076f82
+	/* N in (CHAR_SIZE, 79) bytes.  */
076f82
+	cmpl	$32, %edx
076f82
+	ja	L(more_32_bytes)
076f82
+
076f82
+	cmpl	$16, %edx
076f82
+	jae	L(16_to_32_bytes)
076f82
+
076f82
 # ifndef USE_AS_WMEMCMP
076f82
-	cmp	$1, %RDX_LP
076f82
-	je	L(firstbyte)
076f82
+	cmpl	$8, %edx
076f82
+	jae	L(8_to_16_bytes)
076f82
+
076f82
+	cmpl	$4, %edx
076f82
+	jb	L(2_to_3_bytes)
076f82
+
076f82
+	movl	(%rdi), %eax
076f82
+	movl	(%rsi), %ecx
076f82
+
076f82
+	bswap	%eax
076f82
+	bswap	%ecx
076f82
+
076f82
+	shlq	$32, %rax
076f82
+	shlq	$32, %rcx
076f82
+
076f82
+	movl	-4(%rdi, %rdx), %edi
076f82
+	movl	-4(%rsi, %rdx), %esi
076f82
+
076f82
+	bswap	%edi
076f82
+	bswap	%esi
076f82
+
076f82
+	orq	%rdi, %rax
076f82
+	orq	%rsi, %rcx
076f82
+	subq	%rcx, %rax
076f82
+	cmovne	%edx, %eax
076f82
+	sbbl	%ecx, %ecx
076f82
+	orl	%ecx, %eax
076f82
+	ret
076f82
+
076f82
+	.p2align 4,, 8
076f82
+L(2_to_3_bytes):
076f82
+	movzwl	(%rdi), %eax
076f82
+	movzwl	(%rsi), %ecx
076f82
+	shll	$8, %eax
076f82
+	shll	$8, %ecx
076f82
+	bswap	%eax
076f82
+	bswap	%ecx
076f82
+	movzbl	-1(%rdi, %rdx), %edi
076f82
+	movzbl	-1(%rsi, %rdx), %esi
076f82
+	orl	%edi, %eax
076f82
+	orl	%esi, %ecx
076f82
+	subl	%ecx, %eax
076f82
+	ret
076f82
+
076f82
+	.p2align 4,, 8
076f82
+L(8_to_16_bytes):
076f82
+	movq	(%rdi), %rax
076f82
+	movq	(%rsi), %rcx
076f82
+
076f82
+	bswap	%rax
076f82
+	bswap	%rcx
076f82
+
076f82
+	subq	%rcx, %rax
076f82
+	jne	L(8_to_16_bytes_done)
076f82
+
076f82
+	movq	-8(%rdi, %rdx), %rax
076f82
+	movq	-8(%rsi, %rdx), %rcx
076f82
+
076f82
+	bswap	%rax
076f82
+	bswap	%rcx
076f82
+
076f82
+	subq	%rcx, %rax
076f82
+
076f82
+L(8_to_16_bytes_done):
076f82
+	cmovne	%edx, %eax
076f82
+	sbbl	%ecx, %ecx
076f82
+	orl	%ecx, %eax
076f82
+	ret
076f82
+# else
076f82
+	xorl	%eax, %eax
076f82
+	movl	(%rdi), %ecx
076f82
+	cmpl	(%rsi), %ecx
076f82
+	jne	L(8_to_16_bytes_done)
076f82
+	movl	4(%rdi), %ecx
076f82
+	cmpl	4(%rsi), %ecx
076f82
+	jne	L(8_to_16_bytes_done)
076f82
+	movl	-4(%rdi, %rdx), %ecx
076f82
+	cmpl	-4(%rsi, %rdx), %ecx
076f82
+	jne	L(8_to_16_bytes_done)
076f82
+	ret
076f82
 # endif
076f82
-	add	%rdx, %rsi
076f82
-	add	%rdx, %rdi
076f82
-	BRANCH_TO_JMPTBL_ENTRY(L(table_64bytes), %rdx, 4)
076f82
 
076f82
-# ifndef USE_AS_WMEMCMP
076f82
-	.p2align 4
076f82
+	.p2align 4,, 3
076f82
+L(ret_zero):
076f82
+	xorl	%eax, %eax
076f82
+L(zero):
076f82
+	ret
076f82
+
076f82
+	.p2align 4,, 8
076f82
 L(firstbyte):
076f82
+	jb	L(ret_zero)
076f82
+# ifdef USE_AS_WMEMCMP
076f82
+	xorl	%eax, %eax
076f82
+	movl	(%rdi), %ecx
076f82
+	cmpl	(%rsi), %ecx
076f82
+	je	L(zero)
076f82
+L(8_to_16_bytes_done):
076f82
+	setg	%al
076f82
+	leal	-1(%rax, %rax), %eax
076f82
+# else
076f82
 	movzbl	(%rdi), %eax
076f82
 	movzbl	(%rsi), %ecx
076f82
 	sub	%ecx, %eax
076f82
+# endif
076f82
 	ret
076f82
+
076f82
+	.p2align 4
076f82
+L(vec_return_begin_48):
076f82
+	addq	$16, %rdi
076f82
+	addq	$16, %rsi
076f82
+L(vec_return_begin_32):
076f82
+	bsfl	%eax, %eax
076f82
+# ifdef USE_AS_WMEMCMP
076f82
+	movl	32(%rdi, %rax), %ecx
076f82
+	xorl	%edx, %edx
076f82
+	cmpl	32(%rsi, %rax), %ecx
076f82
+	setg	%dl
076f82
+	leal	-1(%rdx, %rdx), %eax
076f82
+# else
076f82
+	movzbl	32(%rsi, %rax), %ecx
076f82
+	movzbl	32(%rdi, %rax), %eax
076f82
+	subl	%ecx, %eax
076f82
+# endif
076f82
+	ret
076f82
+
076f82
+	.p2align 4
076f82
+L(vec_return_begin_16):
076f82
+	addq	$16, %rdi
076f82
+	addq	$16, %rsi
076f82
+L(vec_return_begin):
076f82
+	bsfl	%eax, %eax
076f82
+# ifdef USE_AS_WMEMCMP
076f82
+	movl	(%rdi, %rax), %ecx
076f82
+	xorl	%edx, %edx
076f82
+	cmpl	(%rsi, %rax), %ecx
076f82
+	setg	%dl
076f82
+	leal	-1(%rdx, %rdx), %eax
076f82
+# else
076f82
+	movzbl	(%rsi, %rax), %ecx
076f82
+	movzbl	(%rdi, %rax), %eax
076f82
+	subl	%ecx, %eax
076f82
+# endif
076f82
+	ret
076f82
+
076f82
+	.p2align 4
076f82
+L(vec_return_end_16):
076f82
+	subl	$16, %edx
076f82
+L(vec_return_end):
076f82
+	bsfl	%eax, %eax
076f82
+	addl	%edx, %eax
076f82
+# ifdef USE_AS_WMEMCMP
076f82
+	movl	-16(%rdi, %rax), %ecx
076f82
+	xorl	%edx, %edx
076f82
+	cmpl	-16(%rsi, %rax), %ecx
076f82
+	setg	%dl
076f82
+	leal	-1(%rdx, %rdx), %eax
076f82
+# else
076f82
+	movzbl	-16(%rsi, %rax), %ecx
076f82
+	movzbl	-16(%rdi, %rax), %eax
076f82
+	subl	%ecx, %eax
076f82
 # endif
076f82
+	ret
076f82
+
076f82
+	.p2align 4,, 8
076f82
+L(more_32_bytes):
076f82
+	movdqu	(%rdi), %xmm0
076f82
+	movdqu	(%rsi), %xmm1
076f82
+	CMPEQ	%xmm0, %xmm1
076f82
+	pmovmskb %xmm1, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(vec_return_begin)
076f82
+
076f82
+	movdqu	16(%rdi), %xmm0
076f82
+	movdqu	16(%rsi), %xmm1
076f82
+	CMPEQ	%xmm0, %xmm1
076f82
+	pmovmskb %xmm1, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(vec_return_begin_16)
076f82
+
076f82
+	cmpl	$64, %edx
076f82
+	jbe	L(32_to_64_bytes)
076f82
+	movdqu	32(%rdi), %xmm0
076f82
+	movdqu	32(%rsi), %xmm1
076f82
+	CMPEQ	%xmm0, %xmm1
076f82
+	pmovmskb %xmm1, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(vec_return_begin_32)
076f82
+
076f82
+	.p2align 4,, 6
076f82
+L(32_to_64_bytes):
076f82
+	movdqu	-32(%rdi, %rdx), %xmm0
076f82
+	movdqu	-32(%rsi, %rdx), %xmm1
076f82
+	CMPEQ	%xmm0, %xmm1
076f82
+	pmovmskb %xmm1, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(vec_return_end_16)
076f82
+
076f82
+	movdqu	-16(%rdi, %rdx), %xmm0
076f82
+	movdqu	-16(%rsi, %rdx), %xmm1
076f82
+	CMPEQ	%xmm0, %xmm1
076f82
+	pmovmskb %xmm1, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(vec_return_end)
076f82
+	ret
076f82
+
076f82
+	.p2align 4
076f82
+L(16_to_32_bytes):
076f82
+	movdqu	(%rdi), %xmm0
076f82
+	movdqu	(%rsi), %xmm1
076f82
+	CMPEQ	%xmm0, %xmm1
076f82
+	pmovmskb %xmm1, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(vec_return_begin)
076f82
+
076f82
+	movdqu	-16(%rdi, %rdx), %xmm0
076f82
+	movdqu	-16(%rsi, %rdx), %xmm1
076f82
+	CMPEQ	%xmm0, %xmm1
076f82
+	pmovmskb %xmm1, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(vec_return_end)
076f82
+	ret
076f82
+
076f82
 
076f82
 	.p2align 4
076f82
 L(79bytesormore):
076f82
+	movdqu	(%rdi), %xmm0
076f82
 	movdqu	(%rsi), %xmm1
076f82
-	movdqu	(%rdi), %xmm2
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(16bytesin256)
076f82
+	CMPEQ	%xmm0, %xmm1
076f82
+	pmovmskb %xmm1, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(vec_return_begin)
076f82
+
076f82
+
076f82
 	mov	%rsi, %rcx
076f82
 	and	$-16, %rsi
076f82
 	add	$16, %rsi
076f82
@@ -86,1694 +306,499 @@ L(79bytesormore):
076f82
 
076f82
 	cmp	$128, %rdx
076f82
 	ja	L(128bytesormore)
076f82
-L(less128bytes):
076f82
-	sub	$64, %rdx
076f82
-
076f82
-	movdqu	(%rdi), %xmm2
076f82
-	pxor	(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(16bytesin256)
076f82
 
076f82
-	movdqu	16(%rdi), %xmm2
076f82
-	pxor	16(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(32bytesin256)
076f82
-
076f82
-	movdqu	32(%rdi), %xmm2
076f82
-	pxor	32(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(48bytesin256)
076f82
-
076f82
-	movdqu	48(%rdi), %xmm2
076f82
-	pxor	48(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(64bytesin256)
076f82
-	cmp	$32, %rdx
076f82
-	jb	L(less32bytesin64)
076f82
-
076f82
-	movdqu	64(%rdi), %xmm2
076f82
-	pxor	64(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(80bytesin256)
076f82
-
076f82
-	movdqu	80(%rdi), %xmm2
076f82
-	pxor	80(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(96bytesin256)
076f82
-	sub	$32, %rdx
076f82
-	add	$32, %rdi
076f82
-	add	$32, %rsi
076f82
-L(less32bytesin64):
076f82
-	add	$64, %rdi
076f82
-	add	$64, %rsi
076f82
-	add	%rdx, %rsi
076f82
-	add	%rdx, %rdi
076f82
-	BRANCH_TO_JMPTBL_ENTRY(L(table_64bytes), %rdx, 4)
076f82
+	.p2align 4,, 6
076f82
+L(less128bytes):
076f82
+	movdqu	(%rdi), %xmm1
076f82
+	CMPEQ	(%rsi), %xmm1
076f82
+	pmovmskb %xmm1, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(vec_return_begin)
076f82
+
076f82
+	movdqu	16(%rdi), %xmm1
076f82
+	CMPEQ	16(%rsi), %xmm1
076f82
+	pmovmskb %xmm1, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(vec_return_begin_16)
076f82
+
076f82
+	movdqu	32(%rdi), %xmm1
076f82
+	CMPEQ	32(%rsi), %xmm1
076f82
+	pmovmskb %xmm1, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(vec_return_begin_32)
076f82
+
076f82
+	movdqu	48(%rdi), %xmm1
076f82
+	CMPEQ	48(%rsi), %xmm1
076f82
+	pmovmskb %xmm1, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(vec_return_begin_48)
076f82
+
076f82
+	cmp	$96, %rdx
076f82
+	jb	L(32_to_64_bytes)
076f82
+
076f82
+	addq	$64, %rdi
076f82
+	addq	$64, %rsi
076f82
+	subq	$64, %rdx
076f82
+
076f82
+	.p2align 4,, 6
076f82
+L(last_64_bytes):
076f82
+	movdqu	(%rdi), %xmm1
076f82
+	CMPEQ	(%rsi), %xmm1
076f82
+	pmovmskb %xmm1, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(vec_return_begin)
076f82
+
076f82
+	movdqu	16(%rdi), %xmm1
076f82
+	CMPEQ	16(%rsi), %xmm1
076f82
+	pmovmskb %xmm1, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(vec_return_begin_16)
076f82
+
076f82
+	movdqu	-32(%rdi, %rdx), %xmm0
076f82
+	movdqu	-32(%rsi, %rdx), %xmm1
076f82
+	CMPEQ	%xmm0, %xmm1
076f82
+	pmovmskb %xmm1, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(vec_return_end_16)
076f82
+
076f82
+	movdqu	-16(%rdi, %rdx), %xmm0
076f82
+	movdqu	-16(%rsi, %rdx), %xmm1
076f82
+	CMPEQ	%xmm0, %xmm1
076f82
+	pmovmskb %xmm1, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(vec_return_end)
076f82
+	ret
076f82
 
076f82
+	.p2align 4
076f82
 L(128bytesormore):
076f82
-	cmp	$512, %rdx
076f82
-	ja	L(512bytesormore)
076f82
 	cmp	$256, %rdx
076f82
-	ja	L(less512bytes)
076f82
+	ja	L(unaligned_loop)
076f82
 L(less256bytes):
076f82
-	sub	$128, %rdx
076f82
-
076f82
-	movdqu	(%rdi), %xmm2
076f82
-	pxor	(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(16bytesin256)
076f82
-
076f82
-	movdqu	16(%rdi), %xmm2
076f82
-	pxor	16(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(32bytesin256)
076f82
-
076f82
-	movdqu	32(%rdi), %xmm2
076f82
-	pxor	32(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(48bytesin256)
076f82
-
076f82
-	movdqu	48(%rdi), %xmm2
076f82
-	pxor	48(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(64bytesin256)
076f82
-
076f82
-	movdqu	64(%rdi), %xmm2
076f82
-	pxor	64(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(80bytesin256)
076f82
-
076f82
-	movdqu	80(%rdi), %xmm2
076f82
-	pxor	80(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(96bytesin256)
076f82
-
076f82
-	movdqu	96(%rdi), %xmm2
076f82
-	pxor	96(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(112bytesin256)
076f82
-
076f82
-	movdqu	112(%rdi), %xmm2
076f82
-	pxor	112(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(128bytesin256)
076f82
-
076f82
-	add	$128, %rsi
076f82
-	add	$128, %rdi
076f82
-
076f82
-	cmp	$64, %rdx
076f82
-	jae	L(less128bytes)
076f82
-
076f82
-	cmp	$32, %rdx
076f82
-	jb	L(less32bytesin128)
076f82
-
076f82
-	movdqu	(%rdi), %xmm2
076f82
-	pxor	(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(16bytesin256)
076f82
-
076f82
-	movdqu	16(%rdi), %xmm2
076f82
-	pxor	16(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(32bytesin256)
076f82
-	sub	$32, %rdx
076f82
-	add	$32, %rdi
076f82
-	add	$32, %rsi
076f82
-L(less32bytesin128):
076f82
-	add	%rdx, %rsi
076f82
-	add	%rdx, %rdi
076f82
-	BRANCH_TO_JMPTBL_ENTRY(L(table_64bytes), %rdx, 4)
076f82
-
076f82
-L(less512bytes):
076f82
-	sub	$256, %rdx
076f82
-	movdqu	(%rdi), %xmm2
076f82
-	pxor	(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(16bytesin256)
076f82
-
076f82
-	movdqu	16(%rdi), %xmm2
076f82
-	pxor	16(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(32bytesin256)
076f82
-
076f82
-	movdqu	32(%rdi), %xmm2
076f82
-	pxor	32(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(48bytesin256)
076f82
-
076f82
-	movdqu	48(%rdi), %xmm2
076f82
-	pxor	48(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(64bytesin256)
076f82
-
076f82
-	movdqu	64(%rdi), %xmm2
076f82
-	pxor	64(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(80bytesin256)
076f82
-
076f82
-	movdqu	80(%rdi), %xmm2
076f82
-	pxor	80(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(96bytesin256)
076f82
-
076f82
-	movdqu	96(%rdi), %xmm2
076f82
-	pxor	96(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(112bytesin256)
076f82
-
076f82
-	movdqu	112(%rdi), %xmm2
076f82
-	pxor	112(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(128bytesin256)
076f82
-
076f82
-	movdqu	128(%rdi), %xmm2
076f82
-	pxor	128(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(144bytesin256)
076f82
-
076f82
-	movdqu	144(%rdi), %xmm2
076f82
-	pxor	144(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(160bytesin256)
076f82
-
076f82
-	movdqu	160(%rdi), %xmm2
076f82
-	pxor	160(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(176bytesin256)
076f82
-
076f82
-	movdqu	176(%rdi), %xmm2
076f82
-	pxor	176(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(192bytesin256)
076f82
-
076f82
-	movdqu	192(%rdi), %xmm2
076f82
-	pxor	192(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(208bytesin256)
076f82
-
076f82
-	movdqu	208(%rdi), %xmm2
076f82
-	pxor	208(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(224bytesin256)
076f82
-
076f82
-	movdqu	224(%rdi), %xmm2
076f82
-	pxor	224(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(240bytesin256)
076f82
-
076f82
-	movdqu	240(%rdi), %xmm2
076f82
-	pxor	240(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(256bytesin256)
076f82
-
076f82
-	add	$256, %rsi
076f82
-	add	$256, %rdi
076f82
-
076f82
-	cmp	$128, %rdx
076f82
-	jae	L(less256bytes)
076f82
+	movdqu	(%rdi), %xmm1
076f82
+	CMPEQ	(%rsi), %xmm1
076f82
+	pmovmskb %xmm1, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(vec_return_begin)
076f82
+
076f82
+	movdqu	16(%rdi), %xmm1
076f82
+	CMPEQ	16(%rsi), %xmm1
076f82
+	pmovmskb %xmm1, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(vec_return_begin_16)
076f82
+
076f82
+	movdqu	32(%rdi), %xmm1
076f82
+	CMPEQ	32(%rsi), %xmm1
076f82
+	pmovmskb %xmm1, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(vec_return_begin_32)
076f82
+
076f82
+	movdqu	48(%rdi), %xmm1
076f82
+	CMPEQ	48(%rsi), %xmm1
076f82
+	pmovmskb %xmm1, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(vec_return_begin_48)
076f82
+
076f82
+	addq	$64, %rdi
076f82
+	addq	$64, %rsi
076f82
+
076f82
+	movdqu	(%rdi), %xmm1
076f82
+	CMPEQ	(%rsi), %xmm1
076f82
+	pmovmskb %xmm1, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(vec_return_begin)
076f82
+
076f82
+	movdqu	16(%rdi), %xmm1
076f82
+	CMPEQ	16(%rsi), %xmm1
076f82
+	pmovmskb %xmm1, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(vec_return_begin_16)
076f82
+
076f82
+	movdqu	32(%rdi), %xmm1
076f82
+	CMPEQ	32(%rsi), %xmm1
076f82
+	pmovmskb %xmm1, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(vec_return_begin_32)
076f82
+
076f82
+	movdqu	48(%rdi), %xmm1
076f82
+	CMPEQ	48(%rsi), %xmm1
076f82
+	pmovmskb %xmm1, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(vec_return_begin_48)
076f82
+
076f82
+	addq	$-128, %rdx
076f82
+	subq	$-64, %rsi
076f82
+	subq	$-64, %rdi
076f82
 
076f82
 	cmp	$64, %rdx
076f82
-	jae	L(less128bytes)
076f82
+	ja	L(less128bytes)
076f82
 
076f82
 	cmp	$32, %rdx
076f82
-	jb	L(less32bytesin256)
076f82
-
076f82
-	movdqu	(%rdi), %xmm2
076f82
-	pxor	(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(16bytesin256)
076f82
-
076f82
-	movdqu	16(%rdi), %xmm2
076f82
-	pxor	16(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(32bytesin256)
076f82
-	sub	$32, %rdx
076f82
-	add	$32, %rdi
076f82
-	add	$32, %rsi
076f82
-L(less32bytesin256):
076f82
-	add	%rdx, %rsi
076f82
-	add	%rdx, %rdi
076f82
-	BRANCH_TO_JMPTBL_ENTRY(L(table_64bytes), %rdx, 4)
076f82
+	ja	L(last_64_bytes)
076f82
+
076f82
+	movdqu	-32(%rdi, %rdx), %xmm0
076f82
+	movdqu	-32(%rsi, %rdx), %xmm1
076f82
+	CMPEQ	%xmm0, %xmm1
076f82
+	pmovmskb %xmm1, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(vec_return_end_16)
076f82
+
076f82
+	movdqu	-16(%rdi, %rdx), %xmm0
076f82
+	movdqu	-16(%rsi, %rdx), %xmm1
076f82
+	CMPEQ	%xmm0, %xmm1
076f82
+	pmovmskb %xmm1, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(vec_return_end)
076f82
+	ret
076f82
 
076f82
 	.p2align 4
076f82
-L(512bytesormore):
076f82
+L(unaligned_loop):
076f82
 # ifdef DATA_CACHE_SIZE_HALF
076f82
 	mov	$DATA_CACHE_SIZE_HALF, %R8_LP
076f82
 # else
076f82
 	mov	__x86_data_cache_size_half(%rip), %R8_LP
076f82
 # endif
076f82
-	mov	%r8, %r9
076f82
-	shr	$1, %r8
076f82
-	add	%r9, %r8
076f82
-	cmp	%r8, %rdx
076f82
-	ja	L(L2_L3_cache_unaglined)
076f82
+	movq	%r8, %r9
076f82
+	addq	%r8, %r8
076f82
+	addq	%r9, %r8
076f82
+	cmpq	%r8, %rdx
076f82
+	ja	L(L2_L3_cache_unaligned)
076f82
 	sub	$64, %rdx
076f82
 	.p2align 4
076f82
 L(64bytesormore_loop):
076f82
-	movdqu	(%rdi), %xmm2
076f82
-	pxor	(%rsi), %xmm2
076f82
-	movdqa	%xmm2, %xmm1
076f82
+	movdqu	(%rdi), %xmm0
076f82
+	movdqu	16(%rdi), %xmm1
076f82
+	movdqu	32(%rdi), %xmm2
076f82
+	movdqu	48(%rdi), %xmm3
076f82
 
076f82
-	movdqu	16(%rdi), %xmm3
076f82
-	pxor	16(%rsi), %xmm3
076f82
-	por	%xmm3, %xmm1
076f82
+	CMPEQ	(%rsi), %xmm0
076f82
+	CMPEQ	16(%rsi), %xmm1
076f82
+	CMPEQ	32(%rsi), %xmm2
076f82
+	CMPEQ	48(%rsi), %xmm3
076f82
 
076f82
-	movdqu	32(%rdi), %xmm4
076f82
-	pxor	32(%rsi), %xmm4
076f82
-	por	%xmm4, %xmm1
076f82
+	pand	%xmm0, %xmm1
076f82
+	pand	%xmm2, %xmm3
076f82
+	pand	%xmm1, %xmm3
076f82
 
076f82
-	movdqu	48(%rdi), %xmm5
076f82
-	pxor	48(%rsi), %xmm5
076f82
-	por	%xmm5, %xmm1
076f82
+	pmovmskb %xmm3, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(64bytesormore_loop_end)
076f82
 
076f82
-	ptest	%xmm1, %xmm0
076f82
-	jnc	L(64bytesormore_loop_end)
076f82
 	add	$64, %rsi
076f82
 	add	$64, %rdi
076f82
 	sub	$64, %rdx
076f82
-	jae	L(64bytesormore_loop)
076f82
+	ja	L(64bytesormore_loop)
076f82
 
076f82
-	add	$64, %rdx
076f82
-	add	%rdx, %rsi
076f82
-	add	%rdx, %rdi
076f82
-	BRANCH_TO_JMPTBL_ENTRY(L(table_64bytes), %rdx, 4)
076f82
+	.p2align 4,, 6
076f82
+L(loop_tail):
076f82
+	addq	%rdx, %rdi
076f82
+	movdqu	(%rdi), %xmm0
076f82
+	movdqu	16(%rdi), %xmm1
076f82
+	movdqu	32(%rdi), %xmm2
076f82
+	movdqu	48(%rdi), %xmm3
076f82
+
076f82
+	addq	%rdx, %rsi
076f82
+	movdqu	(%rsi), %xmm4
076f82
+	movdqu	16(%rsi), %xmm5
076f82
+	movdqu	32(%rsi), %xmm6
076f82
+	movdqu	48(%rsi), %xmm7
076f82
+
076f82
+	CMPEQ	%xmm4, %xmm0
076f82
+	CMPEQ	%xmm5, %xmm1
076f82
+	CMPEQ	%xmm6, %xmm2
076f82
+	CMPEQ	%xmm7, %xmm3
076f82
+
076f82
+	pand	%xmm0, %xmm1
076f82
+	pand	%xmm2, %xmm3
076f82
+	pand	%xmm1, %xmm3
076f82
+
076f82
+	pmovmskb %xmm3, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(64bytesormore_loop_end)
076f82
+	ret
076f82
 
076f82
-L(L2_L3_cache_unaglined):
076f82
-	sub	$64, %rdx
076f82
+L(L2_L3_cache_unaligned):
076f82
+	subq	$64, %rdx
076f82
 	.p2align 4
076f82
 L(L2_L3_unaligned_128bytes_loop):
076f82
 	prefetchnta 0x1c0(%rdi)
076f82
 	prefetchnta 0x1c0(%rsi)
076f82
-	movdqu	(%rdi), %xmm2
076f82
-	pxor	(%rsi), %xmm2
076f82
-	movdqa	%xmm2, %xmm1
076f82
 
076f82
-	movdqu	16(%rdi), %xmm3
076f82
-	pxor	16(%rsi), %xmm3
076f82
-	por	%xmm3, %xmm1
076f82
+	movdqu	(%rdi), %xmm0
076f82
+	movdqu	16(%rdi), %xmm1
076f82
+	movdqu	32(%rdi), %xmm2
076f82
+	movdqu	48(%rdi), %xmm3
076f82
+
076f82
+	CMPEQ	(%rsi), %xmm0
076f82
+	CMPEQ	16(%rsi), %xmm1
076f82
+	CMPEQ	32(%rsi), %xmm2
076f82
+	CMPEQ	48(%rsi), %xmm3
076f82
 
076f82
-	movdqu	32(%rdi), %xmm4
076f82
-	pxor	32(%rsi), %xmm4
076f82
-	por	%xmm4, %xmm1
076f82
+	pand	%xmm0, %xmm1
076f82
+	pand	%xmm2, %xmm3
076f82
+	pand	%xmm1, %xmm3
076f82
 
076f82
-	movdqu	48(%rdi), %xmm5
076f82
-	pxor	48(%rsi), %xmm5
076f82
-	por	%xmm5, %xmm1
076f82
+	pmovmskb %xmm3, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(64bytesormore_loop_end)
076f82
 
076f82
-	ptest	%xmm1, %xmm0
076f82
-	jnc	L(64bytesormore_loop_end)
076f82
 	add	$64, %rsi
076f82
 	add	$64, %rdi
076f82
 	sub	$64, %rdx
076f82
-	jae	L(L2_L3_unaligned_128bytes_loop)
076f82
+	ja	L(L2_L3_unaligned_128bytes_loop)
076f82
+	jmp	L(loop_tail)
076f82
 
076f82
-	add	$64, %rdx
076f82
-	add	%rdx, %rsi
076f82
-	add	%rdx, %rdi
076f82
-	BRANCH_TO_JMPTBL_ENTRY(L(table_64bytes), %rdx, 4)
076f82
 
076f82
-/*
076f82
- * This case is for machines which are sensitive for unaligned instructions.
076f82
- */
076f82
+	/* This case is for machines which are sensitive for unaligned
076f82
+	 * instructions.  */
076f82
 	.p2align 4
076f82
 L(2aligned):
076f82
 	cmp	$128, %rdx
076f82
 	ja	L(128bytesormorein2aligned)
076f82
 L(less128bytesin2aligned):
076f82
-	sub	$64, %rdx
076f82
-
076f82
-	movdqa	(%rdi), %xmm2
076f82
-	pxor	(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(16bytesin256)
076f82
-
076f82
-	movdqa	16(%rdi), %xmm2
076f82
-	pxor	16(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(32bytesin256)
076f82
-
076f82
-	movdqa	32(%rdi), %xmm2
076f82
-	pxor	32(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(48bytesin256)
076f82
-
076f82
-	movdqa	48(%rdi), %xmm2
076f82
-	pxor	48(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(64bytesin256)
076f82
-	cmp	$32, %rdx
076f82
-	jb	L(less32bytesin64in2alinged)
076f82
-
076f82
-	movdqa	64(%rdi), %xmm2
076f82
-	pxor	64(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(80bytesin256)
076f82
-
076f82
-	movdqa	80(%rdi), %xmm2
076f82
-	pxor	80(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(96bytesin256)
076f82
-	sub	$32, %rdx
076f82
-	add	$32, %rdi
076f82
-	add	$32, %rsi
076f82
-L(less32bytesin64in2alinged):
076f82
-	add	$64, %rdi
076f82
-	add	$64, %rsi
076f82
-	add	%rdx, %rsi
076f82
-	add	%rdx, %rdi
076f82
-	BRANCH_TO_JMPTBL_ENTRY(L(table_64bytes), %rdx, 4)
076f82
+	movdqa	(%rdi), %xmm1
076f82
+	CMPEQ	(%rsi), %xmm1
076f82
+	pmovmskb %xmm1, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(vec_return_begin)
076f82
+
076f82
+	movdqa	16(%rdi), %xmm1
076f82
+	CMPEQ	16(%rsi), %xmm1
076f82
+	pmovmskb %xmm1, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(vec_return_begin_16)
076f82
+
076f82
+	movdqa	32(%rdi), %xmm1
076f82
+	CMPEQ	32(%rsi), %xmm1
076f82
+	pmovmskb %xmm1, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(vec_return_begin_32)
076f82
+
076f82
+	movdqa	48(%rdi), %xmm1
076f82
+	CMPEQ	48(%rsi), %xmm1
076f82
+	pmovmskb %xmm1, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(vec_return_begin_48)
076f82
+
076f82
+	cmp	$96, %rdx
076f82
+	jb	L(32_to_64_bytes)
076f82
+
076f82
+	addq	$64, %rdi
076f82
+	addq	$64, %rsi
076f82
+	subq	$64, %rdx
076f82
+
076f82
+	.p2align 4,, 6
076f82
+L(aligned_last_64_bytes):
076f82
+	movdqa	(%rdi), %xmm1
076f82
+	CMPEQ	(%rsi), %xmm1
076f82
+	pmovmskb %xmm1, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(vec_return_begin)
076f82
+
076f82
+	movdqa	16(%rdi), %xmm1
076f82
+	CMPEQ	16(%rsi), %xmm1
076f82
+	pmovmskb %xmm1, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(vec_return_begin_16)
076f82
+
076f82
+	movdqu	-32(%rdi, %rdx), %xmm0
076f82
+	movdqu	-32(%rsi, %rdx), %xmm1
076f82
+	CMPEQ	%xmm0, %xmm1
076f82
+	pmovmskb %xmm1, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(vec_return_end_16)
076f82
+
076f82
+	movdqu	-16(%rdi, %rdx), %xmm0
076f82
+	movdqu	-16(%rsi, %rdx), %xmm1
076f82
+	CMPEQ	%xmm0, %xmm1
076f82
+	pmovmskb %xmm1, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(vec_return_end)
076f82
+	ret
076f82
 
076f82
 	.p2align 4
076f82
 L(128bytesormorein2aligned):
076f82
-	cmp	$512, %rdx
076f82
-	ja	L(512bytesormorein2aligned)
076f82
 	cmp	$256, %rdx
076f82
-	ja	L(256bytesormorein2aligned)
076f82
+	ja	L(aligned_loop)
076f82
 L(less256bytesin2alinged):
076f82
-	sub	$128, %rdx
076f82
-
076f82
-	movdqa	(%rdi), %xmm2
076f82
-	pxor	(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(16bytesin256)
076f82
-
076f82
-	movdqa	16(%rdi), %xmm2
076f82
-	pxor	16(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(32bytesin256)
076f82
-
076f82
-	movdqa	32(%rdi), %xmm2
076f82
-	pxor	32(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(48bytesin256)
076f82
-
076f82
-	movdqa	48(%rdi), %xmm2
076f82
-	pxor	48(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(64bytesin256)
076f82
-
076f82
-	movdqa	64(%rdi), %xmm2
076f82
-	pxor	64(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(80bytesin256)
076f82
-
076f82
-	movdqa	80(%rdi), %xmm2
076f82
-	pxor	80(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(96bytesin256)
076f82
-
076f82
-	movdqa	96(%rdi), %xmm2
076f82
-	pxor	96(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(112bytesin256)
076f82
-
076f82
-	movdqa	112(%rdi), %xmm2
076f82
-	pxor	112(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(128bytesin256)
076f82
-
076f82
-	add	$128, %rsi
076f82
-	add	$128, %rdi
076f82
+	movdqa	(%rdi), %xmm1
076f82
+	CMPEQ	(%rsi), %xmm1
076f82
+	pmovmskb %xmm1, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(vec_return_begin)
076f82
+
076f82
+	movdqa	16(%rdi), %xmm1
076f82
+	CMPEQ	16(%rsi), %xmm1
076f82
+	pmovmskb %xmm1, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(vec_return_begin_16)
076f82
+
076f82
+	movdqa	32(%rdi), %xmm1
076f82
+	CMPEQ	32(%rsi), %xmm1
076f82
+	pmovmskb %xmm1, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(vec_return_begin_32)
076f82
+
076f82
+	movdqa	48(%rdi), %xmm1
076f82
+	CMPEQ	48(%rsi), %xmm1
076f82
+	pmovmskb %xmm1, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(vec_return_begin_48)
076f82
+
076f82
+	addq	$64, %rdi
076f82
+	addq	$64, %rsi
076f82
+
076f82
+	movdqa	(%rdi), %xmm1
076f82
+	CMPEQ	(%rsi), %xmm1
076f82
+	pmovmskb %xmm1, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(vec_return_begin)
076f82
+
076f82
+	movdqa	16(%rdi), %xmm1
076f82
+	CMPEQ	16(%rsi), %xmm1
076f82
+	pmovmskb %xmm1, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(vec_return_begin_16)
076f82
+
076f82
+	movdqa	32(%rdi), %xmm1
076f82
+	CMPEQ	32(%rsi), %xmm1
076f82
+	pmovmskb %xmm1, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(vec_return_begin_32)
076f82
+
076f82
+	movdqa	48(%rdi), %xmm1
076f82
+	CMPEQ	48(%rsi), %xmm1
076f82
+	pmovmskb %xmm1, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(vec_return_begin_48)
076f82
+
076f82
+	addq	$-128, %rdx
076f82
+	subq	$-64, %rsi
076f82
+	subq	$-64, %rdi
076f82
 
076f82
 	cmp	$64, %rdx
076f82
-	jae	L(less128bytesin2aligned)
076f82
+	ja	L(less128bytesin2aligned)
076f82
 
076f82
 	cmp	$32, %rdx
076f82
-	jb	L(less32bytesin128in2aligned)
076f82
-
076f82
-	movdqu	(%rdi), %xmm2
076f82
-	pxor	(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(16bytesin256)
076f82
-
076f82
-	movdqu	16(%rdi), %xmm2
076f82
-	pxor	16(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(32bytesin256)
076f82
-	sub	$32, %rdx
076f82
-	add	$32, %rdi
076f82
-	add	$32, %rsi
076f82
-L(less32bytesin128in2aligned):
076f82
-	add	%rdx, %rsi
076f82
-	add	%rdx, %rdi
076f82
-	BRANCH_TO_JMPTBL_ENTRY(L(table_64bytes), %rdx, 4)
076f82
-
076f82
-	.p2align 4
076f82
-L(256bytesormorein2aligned):
076f82
-
076f82
-	sub	$256, %rdx
076f82
-	movdqa	(%rdi), %xmm2
076f82
-	pxor	(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(16bytesin256)
076f82
-
076f82
-	movdqa	16(%rdi), %xmm2
076f82
-	pxor	16(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(32bytesin256)
076f82
-
076f82
-	movdqa	32(%rdi), %xmm2
076f82
-	pxor	32(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(48bytesin256)
076f82
-
076f82
-	movdqa	48(%rdi), %xmm2
076f82
-	pxor	48(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(64bytesin256)
076f82
-
076f82
-	movdqa	64(%rdi), %xmm2
076f82
-	pxor	64(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(80bytesin256)
076f82
-
076f82
-	movdqa	80(%rdi), %xmm2
076f82
-	pxor	80(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(96bytesin256)
076f82
-
076f82
-	movdqa	96(%rdi), %xmm2
076f82
-	pxor	96(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(112bytesin256)
076f82
-
076f82
-	movdqa	112(%rdi), %xmm2
076f82
-	pxor	112(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(128bytesin256)
076f82
-
076f82
-	movdqa	128(%rdi), %xmm2
076f82
-	pxor	128(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(144bytesin256)
076f82
-
076f82
-	movdqa	144(%rdi), %xmm2
076f82
-	pxor	144(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(160bytesin256)
076f82
-
076f82
-	movdqa	160(%rdi), %xmm2
076f82
-	pxor	160(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(176bytesin256)
076f82
-
076f82
-	movdqa	176(%rdi), %xmm2
076f82
-	pxor	176(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(192bytesin256)
076f82
-
076f82
-	movdqa	192(%rdi), %xmm2
076f82
-	pxor	192(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(208bytesin256)
076f82
-
076f82
-	movdqa	208(%rdi), %xmm2
076f82
-	pxor	208(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(224bytesin256)
076f82
-
076f82
-	movdqa	224(%rdi), %xmm2
076f82
-	pxor	224(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(240bytesin256)
076f82
-
076f82
-	movdqa	240(%rdi), %xmm2
076f82
-	pxor	240(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(256bytesin256)
076f82
-
076f82
-	add	$256, %rsi
076f82
-	add	$256, %rdi
076f82
-
076f82
-	cmp	$128, %rdx
076f82
-	jae	L(less256bytesin2alinged)
076f82
-
076f82
-	cmp	$64, %rdx
076f82
-	jae	L(less128bytesin2aligned)
076f82
-
076f82
-	cmp	$32, %rdx
076f82
-	jb	L(less32bytesin256in2alinged)
076f82
-
076f82
-	movdqa	(%rdi), %xmm2
076f82
-	pxor	(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(16bytesin256)
076f82
-
076f82
-	movdqa	16(%rdi), %xmm2
076f82
-	pxor	16(%rsi), %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(32bytesin256)
076f82
-	sub	$32, %rdx
076f82
-	add	$32, %rdi
076f82
-	add	$32, %rsi
076f82
-L(less32bytesin256in2alinged):
076f82
-	add	%rdx, %rsi
076f82
-	add	%rdx, %rdi
076f82
-	BRANCH_TO_JMPTBL_ENTRY(L(table_64bytes), %rdx, 4)
076f82
+	ja	L(aligned_last_64_bytes)
076f82
+
076f82
+	movdqu	-32(%rdi, %rdx), %xmm0
076f82
+	movdqu	-32(%rsi, %rdx), %xmm1
076f82
+	CMPEQ	%xmm0, %xmm1
076f82
+	pmovmskb %xmm1, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(vec_return_end_16)
076f82
+
076f82
+	movdqu	-16(%rdi, %rdx), %xmm0
076f82
+	movdqu	-16(%rsi, %rdx), %xmm1
076f82
+	CMPEQ	%xmm0, %xmm1
076f82
+	pmovmskb %xmm1, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(vec_return_end)
076f82
+	ret
076f82
 
076f82
 	.p2align 4
076f82
-L(512bytesormorein2aligned):
076f82
+L(aligned_loop):
076f82
 # ifdef DATA_CACHE_SIZE_HALF
076f82
 	mov	$DATA_CACHE_SIZE_HALF, %R8_LP
076f82
 # else
076f82
 	mov	__x86_data_cache_size_half(%rip), %R8_LP
076f82
 # endif
076f82
-	mov	%r8, %r9
076f82
-	shr	$1, %r8
076f82
-	add	%r9, %r8
076f82
-	cmp	%r8, %rdx
076f82
-	ja	L(L2_L3_cache_aglined)
076f82
+	movq	%r8, %r9
076f82
+	addq	%r8, %r8
076f82
+	addq	%r9, %r8
076f82
+	cmpq	%r8, %rdx
076f82
+	ja	L(L2_L3_cache_aligned)
076f82
 
076f82
 	sub	$64, %rdx
076f82
 	.p2align 4
076f82
 L(64bytesormore_loopin2aligned):
076f82
-	movdqa	(%rdi), %xmm2
076f82
-	pxor	(%rsi), %xmm2
076f82
-	movdqa	%xmm2, %xmm1
076f82
-
076f82
-	movdqa	16(%rdi), %xmm3
076f82
-	pxor	16(%rsi), %xmm3
076f82
-	por	%xmm3, %xmm1
076f82
+	movdqa	(%rdi), %xmm0
076f82
+	movdqa	16(%rdi), %xmm1
076f82
+	movdqa	32(%rdi), %xmm2
076f82
+	movdqa	48(%rdi), %xmm3
076f82
 
076f82
-	movdqa	32(%rdi), %xmm4
076f82
-	pxor	32(%rsi), %xmm4
076f82
-	por	%xmm4, %xmm1
076f82
+	CMPEQ	(%rsi), %xmm0
076f82
+	CMPEQ	16(%rsi), %xmm1
076f82
+	CMPEQ	32(%rsi), %xmm2
076f82
+	CMPEQ	48(%rsi), %xmm3
076f82
 
076f82
-	movdqa	48(%rdi), %xmm5
076f82
-	pxor	48(%rsi), %xmm5
076f82
-	por	%xmm5, %xmm1
076f82
+	pand	%xmm0, %xmm1
076f82
+	pand	%xmm2, %xmm3
076f82
+	pand	%xmm1, %xmm3
076f82
 
076f82
-	ptest	%xmm1, %xmm0
076f82
-	jnc	L(64bytesormore_loop_end)
076f82
+	pmovmskb %xmm3, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(64bytesormore_loop_end)
076f82
 	add	$64, %rsi
076f82
 	add	$64, %rdi
076f82
 	sub	$64, %rdx
076f82
-	jae	L(64bytesormore_loopin2aligned)
076f82
-
076f82
-	add	$64, %rdx
076f82
-	add	%rdx, %rsi
076f82
-	add	%rdx, %rdi
076f82
-	BRANCH_TO_JMPTBL_ENTRY(L(table_64bytes), %rdx, 4)
076f82
-L(L2_L3_cache_aglined):
076f82
-	sub	$64, %rdx
076f82
+	ja	L(64bytesormore_loopin2aligned)
076f82
+	jmp	L(loop_tail)
076f82
 
076f82
+L(L2_L3_cache_aligned):
076f82
+	subq	$64, %rdx
076f82
 	.p2align 4
076f82
 L(L2_L3_aligned_128bytes_loop):
076f82
 	prefetchnta 0x1c0(%rdi)
076f82
 	prefetchnta 0x1c0(%rsi)
076f82
-	movdqa	(%rdi), %xmm2
076f82
-	pxor	(%rsi), %xmm2
076f82
-	movdqa	%xmm2, %xmm1
076f82
-
076f82
-	movdqa	16(%rdi), %xmm3
076f82
-	pxor	16(%rsi), %xmm3
076f82
-	por	%xmm3, %xmm1
076f82
+	movdqa	(%rdi), %xmm0
076f82
+	movdqa	16(%rdi), %xmm1
076f82
+	movdqa	32(%rdi), %xmm2
076f82
+	movdqa	48(%rdi), %xmm3
076f82
 
076f82
-	movdqa	32(%rdi), %xmm4
076f82
-	pxor	32(%rsi), %xmm4
076f82
-	por	%xmm4, %xmm1
076f82
+	CMPEQ	(%rsi), %xmm0
076f82
+	CMPEQ	16(%rsi), %xmm1
076f82
+	CMPEQ	32(%rsi), %xmm2
076f82
+	CMPEQ	48(%rsi), %xmm3
076f82
 
076f82
-	movdqa	48(%rdi), %xmm5
076f82
-	pxor	48(%rsi), %xmm5
076f82
-	por	%xmm5, %xmm1
076f82
+	pand	%xmm0, %xmm1
076f82
+	pand	%xmm2, %xmm3
076f82
+	pand	%xmm1, %xmm3
076f82
 
076f82
-	ptest	%xmm1, %xmm0
076f82
-	jnc	L(64bytesormore_loop_end)
076f82
-	add	$64, %rsi
076f82
-	add	$64, %rdi
076f82
-	sub	$64, %rdx
076f82
-	jae	L(L2_L3_aligned_128bytes_loop)
076f82
-
076f82
-	add	$64, %rdx
076f82
-	add	%rdx, %rsi
076f82
-	add	%rdx, %rdi
076f82
-	BRANCH_TO_JMPTBL_ENTRY(L(table_64bytes), %rdx, 4)
076f82
+	pmovmskb %xmm3, %eax
076f82
+	incw	%ax
076f82
+	jnz	L(64bytesormore_loop_end)
076f82
 
076f82
+	addq	$64, %rsi
076f82
+	addq	$64, %rdi
076f82
+	subq	$64, %rdx
076f82
+	ja	L(L2_L3_aligned_128bytes_loop)
076f82
+	jmp	L(loop_tail)
076f82
 
076f82
 	.p2align 4
076f82
 L(64bytesormore_loop_end):
076f82
-	add	$16, %rdi
076f82
-	add	$16, %rsi
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(16bytes)
076f82
-
076f82
-	add	$16, %rdi
076f82
-	add	$16, %rsi
076f82
-	ptest	%xmm3, %xmm0
076f82
-	jnc	L(16bytes)
076f82
-
076f82
-	add	$16, %rdi
076f82
-	add	$16, %rsi
076f82
-	ptest	%xmm4, %xmm0
076f82
-	jnc	L(16bytes)
076f82
-
076f82
-	add	$16, %rdi
076f82
-	add	$16, %rsi
076f82
-	jmp	L(16bytes)
076f82
-
076f82
-L(256bytesin256):
076f82
-	add	$256, %rdi
076f82
-	add	$256, %rsi
076f82
-	jmp	L(16bytes)
076f82
-L(240bytesin256):
076f82
-	add	$240, %rdi
076f82
-	add	$240, %rsi
076f82
-	jmp	L(16bytes)
076f82
-L(224bytesin256):
076f82
-	add	$224, %rdi
076f82
-	add	$224, %rsi
076f82
-	jmp	L(16bytes)
076f82
-L(208bytesin256):
076f82
-	add	$208, %rdi
076f82
-	add	$208, %rsi
076f82
-	jmp	L(16bytes)
076f82
-L(192bytesin256):
076f82
-	add	$192, %rdi
076f82
-	add	$192, %rsi
076f82
-	jmp	L(16bytes)
076f82
-L(176bytesin256):
076f82
-	add	$176, %rdi
076f82
-	add	$176, %rsi
076f82
-	jmp	L(16bytes)
076f82
-L(160bytesin256):
076f82
-	add	$160, %rdi
076f82
-	add	$160, %rsi
076f82
-	jmp	L(16bytes)
076f82
-L(144bytesin256):
076f82
-	add	$144, %rdi
076f82
-	add	$144, %rsi
076f82
-	jmp	L(16bytes)
076f82
-L(128bytesin256):
076f82
-	add	$128, %rdi
076f82
-	add	$128, %rsi
076f82
-	jmp	L(16bytes)
076f82
-L(112bytesin256):
076f82
-	add	$112, %rdi
076f82
-	add	$112, %rsi
076f82
-	jmp	L(16bytes)
076f82
-L(96bytesin256):
076f82
-	add	$96, %rdi
076f82
-	add	$96, %rsi
076f82
-	jmp	L(16bytes)
076f82
-L(80bytesin256):
076f82
-	add	$80, %rdi
076f82
-	add	$80, %rsi
076f82
-	jmp	L(16bytes)
076f82
-L(64bytesin256):
076f82
-	add	$64, %rdi
076f82
-	add	$64, %rsi
076f82
-	jmp	L(16bytes)
076f82
-L(48bytesin256):
076f82
-	add	$16, %rdi
076f82
-	add	$16, %rsi
076f82
-L(32bytesin256):
076f82
-	add	$16, %rdi
076f82
-	add	$16, %rsi
076f82
-L(16bytesin256):
076f82
-	add	$16, %rdi
076f82
-	add	$16, %rsi
076f82
-L(16bytes):
076f82
-	mov	-16(%rdi), %rax
076f82
-	mov	-16(%rsi), %rcx
076f82
-	cmp	%rax, %rcx
076f82
-	jne	L(diffin8bytes)
076f82
-L(8bytes):
076f82
-	mov	-8(%rdi), %rax
076f82
-	mov	-8(%rsi), %rcx
076f82
-	cmp	%rax, %rcx
076f82
-	jne	L(diffin8bytes)
076f82
-	xor	%eax, %eax
076f82
-	ret
076f82
-
076f82
-	.p2align 4
076f82
-L(12bytes):
076f82
-	mov	-12(%rdi), %rax
076f82
-	mov	-12(%rsi), %rcx
076f82
-	cmp	%rax, %rcx
076f82
-	jne	L(diffin8bytes)
076f82
-L(4bytes):
076f82
-	mov	-4(%rsi), %ecx
076f82
-# ifndef USE_AS_WMEMCMP
076f82
-	mov	-4(%rdi), %eax
076f82
-	cmp	%eax, %ecx
076f82
-# else
076f82
-	cmp	-4(%rdi), %ecx
076f82
-# endif
076f82
-	jne	L(diffin4bytes)
076f82
-L(0bytes):
076f82
-	xor	%eax, %eax
076f82
-	ret
076f82
-
076f82
-# ifndef USE_AS_WMEMCMP
076f82
-/* unreal case for wmemcmp */
076f82
-	.p2align 4
076f82
-L(65bytes):
076f82
-	movdqu	-65(%rdi), %xmm1
076f82
-	movdqu	-65(%rsi), %xmm2
076f82
-	mov	$-65, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(49bytes):
076f82
-	movdqu	-49(%rdi), %xmm1
076f82
-	movdqu	-49(%rsi), %xmm2
076f82
-	mov	$-49, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(33bytes):
076f82
-	movdqu	-33(%rdi), %xmm1
076f82
-	movdqu	-33(%rsi), %xmm2
076f82
-	mov	$-33, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(17bytes):
076f82
-	mov	-17(%rdi), %rax
076f82
-	mov	-17(%rsi), %rcx
076f82
-	cmp	%rax, %rcx
076f82
-	jne	L(diffin8bytes)
076f82
-L(9bytes):
076f82
-	mov	-9(%rdi), %rax
076f82
-	mov	-9(%rsi), %rcx
076f82
-	cmp	%rax, %rcx
076f82
-	jne	L(diffin8bytes)
076f82
-	movzbl	-1(%rdi), %eax
076f82
-	movzbl	-1(%rsi), %edx
076f82
-	sub	%edx, %eax
076f82
-	ret
076f82
-
076f82
-	.p2align 4
076f82
-L(13bytes):
076f82
-	mov	-13(%rdi), %rax
076f82
-	mov	-13(%rsi), %rcx
076f82
-	cmp	%rax, %rcx
076f82
-	jne	L(diffin8bytes)
076f82
-	mov	-8(%rdi), %rax
076f82
-	mov	-8(%rsi), %rcx
076f82
-	cmp	%rax, %rcx
076f82
-	jne	L(diffin8bytes)
076f82
-	xor	%eax, %eax
076f82
-	ret
076f82
-
076f82
-	.p2align 4
076f82
-L(5bytes):
076f82
-	mov	-5(%rdi), %eax
076f82
-	mov	-5(%rsi), %ecx
076f82
-	cmp	%eax, %ecx
076f82
-	jne	L(diffin4bytes)
076f82
-	movzbl	-1(%rdi), %eax
076f82
-	movzbl	-1(%rsi), %edx
076f82
-	sub	%edx, %eax
076f82
-	ret
076f82
-
076f82
-	.p2align 4
076f82
-L(66bytes):
076f82
-	movdqu	-66(%rdi), %xmm1
076f82
-	movdqu	-66(%rsi), %xmm2
076f82
-	mov	$-66, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(50bytes):
076f82
-	movdqu	-50(%rdi), %xmm1
076f82
-	movdqu	-50(%rsi), %xmm2
076f82
-	mov	$-50, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(34bytes):
076f82
-	movdqu	-34(%rdi), %xmm1
076f82
-	movdqu	-34(%rsi), %xmm2
076f82
-	mov	$-34, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(18bytes):
076f82
-	mov	-18(%rdi), %rax
076f82
-	mov	-18(%rsi), %rcx
076f82
-	cmp	%rax, %rcx
076f82
-	jne	L(diffin8bytes)
076f82
-L(10bytes):
076f82
-	mov	-10(%rdi), %rax
076f82
-	mov	-10(%rsi), %rcx
076f82
-	cmp	%rax, %rcx
076f82
-	jne	L(diffin8bytes)
076f82
-	movzwl	-2(%rdi), %eax
076f82
-	movzwl	-2(%rsi), %ecx
076f82
-	cmp	%cl, %al
076f82
-	jne	L(end)
076f82
-	and	$0xffff, %eax
076f82
-	and	$0xffff, %ecx
076f82
-	sub	%ecx, %eax
076f82
-	ret
076f82
-
076f82
-	.p2align 4
076f82
-L(14bytes):
076f82
-	mov	-14(%rdi), %rax
076f82
-	mov	-14(%rsi), %rcx
076f82
-	cmp	%rax, %rcx
076f82
-	jne	L(diffin8bytes)
076f82
-	mov	-8(%rdi), %rax
076f82
-	mov	-8(%rsi), %rcx
076f82
-	cmp	%rax, %rcx
076f82
-	jne	L(diffin8bytes)
076f82
-	xor	%eax, %eax
076f82
-	ret
076f82
-
076f82
-	.p2align 4
076f82
-L(6bytes):
076f82
-	mov	-6(%rdi), %eax
076f82
-	mov	-6(%rsi), %ecx
076f82
-	cmp	%eax, %ecx
076f82
-	jne	L(diffin4bytes)
076f82
-L(2bytes):
076f82
-	movzwl	-2(%rsi), %ecx
076f82
-	movzwl	-2(%rdi), %eax
076f82
-	cmp	%cl, %al
076f82
-	jne	L(end)
076f82
-	and	$0xffff, %eax
076f82
-	and	$0xffff, %ecx
076f82
-	sub	%ecx, %eax
076f82
-	ret
076f82
-
076f82
-	.p2align 4
076f82
-L(67bytes):
076f82
-	movdqu	-67(%rdi), %xmm2
076f82
-	movdqu	-67(%rsi), %xmm1
076f82
-	mov	$-67, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(51bytes):
076f82
-	movdqu	-51(%rdi), %xmm2
076f82
-	movdqu	-51(%rsi), %xmm1
076f82
-	mov	$-51, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(35bytes):
076f82
-	movdqu	-35(%rsi), %xmm1
076f82
-	movdqu	-35(%rdi), %xmm2
076f82
-	mov	$-35, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(19bytes):
076f82
-	mov	-19(%rdi), %rax
076f82
-	mov	-19(%rsi), %rcx
076f82
-	cmp	%rax, %rcx
076f82
-	jne	L(diffin8bytes)
076f82
-L(11bytes):
076f82
-	mov	-11(%rdi), %rax
076f82
-	mov	-11(%rsi), %rcx
076f82
-	cmp	%rax, %rcx
076f82
-	jne	L(diffin8bytes)
076f82
-	mov	-4(%rdi), %eax
076f82
-	mov	-4(%rsi), %ecx
076f82
-	cmp	%eax, %ecx
076f82
-	jne	L(diffin4bytes)
076f82
-	xor	%eax, %eax
076f82
-	ret
076f82
-
076f82
-	.p2align 4
076f82
-L(15bytes):
076f82
-	mov	-15(%rdi), %rax
076f82
-	mov	-15(%rsi), %rcx
076f82
-	cmp	%rax, %rcx
076f82
-	jne	L(diffin8bytes)
076f82
-	mov	-8(%rdi), %rax
076f82
-	mov	-8(%rsi), %rcx
076f82
-	cmp	%rax, %rcx
076f82
-	jne	L(diffin8bytes)
076f82
-	xor	%eax, %eax
076f82
-	ret
076f82
-
076f82
-	.p2align 4
076f82
-L(7bytes):
076f82
-	mov	-7(%rdi), %eax
076f82
-	mov	-7(%rsi), %ecx
076f82
-	cmp	%eax, %ecx
076f82
-	jne	L(diffin4bytes)
076f82
-	mov	-4(%rdi), %eax
076f82
-	mov	-4(%rsi), %ecx
076f82
-	cmp	%eax, %ecx
076f82
-	jne	L(diffin4bytes)
076f82
-	xor	%eax, %eax
076f82
-	ret
076f82
-
076f82
-	.p2align 4
076f82
-L(3bytes):
076f82
-	movzwl	-3(%rdi), %eax
076f82
-	movzwl	-3(%rsi), %ecx
076f82
-	cmp	%eax, %ecx
076f82
-	jne	L(diffin2bytes)
076f82
-L(1bytes):
076f82
-	movzbl	-1(%rdi), %eax
076f82
-	movzbl	-1(%rsi), %ecx
076f82
-	sub	%ecx, %eax
076f82
-	ret
076f82
-# endif
076f82
-
076f82
-	.p2align 4
076f82
-L(68bytes):
076f82
-	movdqu	-68(%rdi), %xmm2
076f82
-	movdqu	-68(%rsi), %xmm1
076f82
-	mov	$-68, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(52bytes):
076f82
-	movdqu	-52(%rdi), %xmm2
076f82
-	movdqu	-52(%rsi), %xmm1
076f82
-	mov	$-52, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(36bytes):
076f82
-	movdqu	-36(%rdi), %xmm2
076f82
-	movdqu	-36(%rsi), %xmm1
076f82
-	mov	$-36, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(20bytes):
076f82
-	movdqu	-20(%rdi), %xmm2
076f82
-	movdqu	-20(%rsi), %xmm1
076f82
-	mov	$-20, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-	mov	-4(%rsi), %ecx
076f82
-
076f82
-# ifndef USE_AS_WMEMCMP
076f82
-	mov	-4(%rdi), %eax
076f82
-	cmp	%eax, %ecx
076f82
-# else
076f82
-	cmp	-4(%rdi), %ecx
076f82
-# endif
076f82
-	jne	L(diffin4bytes)
076f82
-	xor	%eax, %eax
076f82
-	ret
076f82
-
076f82
-# ifndef USE_AS_WMEMCMP
076f82
-/* unreal cases for wmemcmp */
076f82
-	.p2align 4
076f82
-L(69bytes):
076f82
-	movdqu	-69(%rsi), %xmm1
076f82
-	movdqu	-69(%rdi), %xmm2
076f82
-	mov	$-69, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(53bytes):
076f82
-	movdqu	-53(%rsi), %xmm1
076f82
-	movdqu	-53(%rdi), %xmm2
076f82
-	mov	$-53, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(37bytes):
076f82
-	movdqu	-37(%rsi), %xmm1
076f82
-	movdqu	-37(%rdi), %xmm2
076f82
-	mov	$-37, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(21bytes):
076f82
-	movdqu	-21(%rsi), %xmm1
076f82
-	movdqu	-21(%rdi), %xmm2
076f82
-	mov	$-21, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-	mov	-8(%rdi), %rax
076f82
-	mov	-8(%rsi), %rcx
076f82
-	cmp	%rax, %rcx
076f82
-	jne	L(diffin8bytes)
076f82
-	xor	%eax, %eax
076f82
-	ret
076f82
-
076f82
-	.p2align 4
076f82
-L(70bytes):
076f82
-	movdqu	-70(%rsi), %xmm1
076f82
-	movdqu	-70(%rdi), %xmm2
076f82
-	mov	$-70, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(54bytes):
076f82
-	movdqu	-54(%rsi), %xmm1
076f82
-	movdqu	-54(%rdi), %xmm2
076f82
-	mov	$-54, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(38bytes):
076f82
-	movdqu	-38(%rsi), %xmm1
076f82
-	movdqu	-38(%rdi), %xmm2
076f82
-	mov	$-38, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(22bytes):
076f82
-	movdqu	-22(%rsi), %xmm1
076f82
-	movdqu	-22(%rdi), %xmm2
076f82
-	mov	$-22, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-	mov	-8(%rdi), %rax
076f82
-	mov	-8(%rsi), %rcx
076f82
-	cmp	%rax, %rcx
076f82
-	jne	L(diffin8bytes)
076f82
-	xor	%eax, %eax
076f82
-	ret
076f82
-
076f82
-	.p2align 4
076f82
-L(71bytes):
076f82
-	movdqu	-71(%rsi), %xmm1
076f82
-	movdqu	-71(%rdi), %xmm2
076f82
-	mov	$-71, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(55bytes):
076f82
-	movdqu	-55(%rdi), %xmm2
076f82
-	movdqu	-55(%rsi), %xmm1
076f82
-	mov	$-55, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(39bytes):
076f82
-	movdqu	-39(%rdi), %xmm2
076f82
-	movdqu	-39(%rsi), %xmm1
076f82
-	mov	$-39, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(23bytes):
076f82
-	movdqu	-23(%rdi), %xmm2
076f82
-	movdqu	-23(%rsi), %xmm1
076f82
-	mov	$-23, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-	mov	-8(%rdi), %rax
076f82
-	mov	-8(%rsi), %rcx
076f82
-	cmp	%rax, %rcx
076f82
-	jne	L(diffin8bytes)
076f82
-	xor	%eax, %eax
076f82
-	ret
076f82
-# endif
076f82
-
076f82
-	.p2align 4
076f82
-L(72bytes):
076f82
-	movdqu	-72(%rsi), %xmm1
076f82
-	movdqu	-72(%rdi), %xmm2
076f82
-	mov	$-72, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(56bytes):
076f82
-	movdqu	-56(%rdi), %xmm2
076f82
-	movdqu	-56(%rsi), %xmm1
076f82
-	mov	$-56, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(40bytes):
076f82
-	movdqu	-40(%rdi), %xmm2
076f82
-	movdqu	-40(%rsi), %xmm1
076f82
-	mov	$-40, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(24bytes):
076f82
-	movdqu	-24(%rdi), %xmm2
076f82
-	movdqu	-24(%rsi), %xmm1
076f82
-	mov	$-24, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-
076f82
-	mov	-8(%rsi), %rcx
076f82
-	mov	-8(%rdi), %rax
076f82
-	cmp	%rax, %rcx
076f82
-	jne	L(diffin8bytes)
076f82
-	xor	%eax, %eax
076f82
-	ret
076f82
-
076f82
-# ifndef USE_AS_WMEMCMP
076f82
-/* unreal cases for wmemcmp */
076f82
-	.p2align 4
076f82
-L(73bytes):
076f82
-	movdqu	-73(%rsi), %xmm1
076f82
-	movdqu	-73(%rdi), %xmm2
076f82
-	mov	$-73, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(57bytes):
076f82
-	movdqu	-57(%rdi), %xmm2
076f82
-	movdqu	-57(%rsi), %xmm1
076f82
-	mov	$-57, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(41bytes):
076f82
-	movdqu	-41(%rdi), %xmm2
076f82
-	movdqu	-41(%rsi), %xmm1
076f82
-	mov	$-41, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(25bytes):
076f82
-	movdqu	-25(%rdi), %xmm2
076f82
-	movdqu	-25(%rsi), %xmm1
076f82
-	mov	$-25, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-	mov	-9(%rdi), %rax
076f82
-	mov	-9(%rsi), %rcx
076f82
-	cmp	%rax, %rcx
076f82
-	jne	L(diffin8bytes)
076f82
-	movzbl	-1(%rdi), %eax
076f82
-	movzbl	-1(%rsi), %ecx
076f82
-	sub	%ecx, %eax
076f82
-	ret
076f82
-
076f82
-	.p2align 4
076f82
-L(74bytes):
076f82
-	movdqu	-74(%rsi), %xmm1
076f82
-	movdqu	-74(%rdi), %xmm2
076f82
-	mov	$-74, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(58bytes):
076f82
-	movdqu	-58(%rdi), %xmm2
076f82
-	movdqu	-58(%rsi), %xmm1
076f82
-	mov	$-58, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(42bytes):
076f82
-	movdqu	-42(%rdi), %xmm2
076f82
-	movdqu	-42(%rsi), %xmm1
076f82
-	mov	$-42, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(26bytes):
076f82
-	movdqu	-26(%rdi), %xmm2
076f82
-	movdqu	-26(%rsi), %xmm1
076f82
-	mov	$-26, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-	mov	-10(%rdi), %rax
076f82
-	mov	-10(%rsi), %rcx
076f82
-	cmp	%rax, %rcx
076f82
-	jne	L(diffin8bytes)
076f82
-	movzwl	-2(%rdi), %eax
076f82
-	movzwl	-2(%rsi), %ecx
076f82
-	jmp	L(diffin2bytes)
076f82
-
076f82
-	.p2align 4
076f82
-L(75bytes):
076f82
-	movdqu	-75(%rsi), %xmm1
076f82
-	movdqu	-75(%rdi), %xmm2
076f82
-	mov	$-75, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(59bytes):
076f82
-	movdqu	-59(%rdi), %xmm2
076f82
-	movdqu	-59(%rsi), %xmm1
076f82
-	mov	$-59, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(43bytes):
076f82
-	movdqu	-43(%rdi), %xmm2
076f82
-	movdqu	-43(%rsi), %xmm1
076f82
-	mov	$-43, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(27bytes):
076f82
-	movdqu	-27(%rdi), %xmm2
076f82
-	movdqu	-27(%rsi), %xmm1
076f82
-	mov	$-27, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-	mov	-11(%rdi), %rax
076f82
-	mov	-11(%rsi), %rcx
076f82
-	cmp	%rax, %rcx
076f82
-	jne	L(diffin8bytes)
076f82
-	mov	-4(%rdi), %eax
076f82
-	mov	-4(%rsi), %ecx
076f82
-	cmp	%eax, %ecx
076f82
-	jne	L(diffin4bytes)
076f82
-	xor	%eax, %eax
076f82
-	ret
076f82
-# endif
076f82
-	.p2align 4
076f82
-L(76bytes):
076f82
-	movdqu	-76(%rsi), %xmm1
076f82
-	movdqu	-76(%rdi), %xmm2
076f82
-	mov	$-76, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(60bytes):
076f82
-	movdqu	-60(%rdi), %xmm2
076f82
-	movdqu	-60(%rsi), %xmm1
076f82
-	mov	$-60, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(44bytes):
076f82
-	movdqu	-44(%rdi), %xmm2
076f82
-	movdqu	-44(%rsi), %xmm1
076f82
-	mov	$-44, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(28bytes):
076f82
-	movdqu	-28(%rdi), %xmm2
076f82
-	movdqu	-28(%rsi), %xmm1
076f82
-	mov	$-28, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-	mov	-12(%rdi), %rax
076f82
-	mov	-12(%rsi), %rcx
076f82
-	cmp	%rax, %rcx
076f82
-	jne	L(diffin8bytes)
076f82
-	mov	-4(%rsi), %ecx
076f82
-# ifndef USE_AS_WMEMCMP
076f82
-	mov	-4(%rdi), %eax
076f82
-	cmp	%eax, %ecx
076f82
-# else
076f82
-	cmp	-4(%rdi), %ecx
076f82
-# endif
076f82
-	jne	L(diffin4bytes)
076f82
-	xor	%eax, %eax
076f82
-	ret
076f82
-
076f82
-# ifndef USE_AS_WMEMCMP
076f82
-/* unreal cases for wmemcmp */
076f82
-	.p2align 4
076f82
-L(77bytes):
076f82
-	movdqu	-77(%rsi), %xmm1
076f82
-	movdqu	-77(%rdi), %xmm2
076f82
-	mov	$-77, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(61bytes):
076f82
-	movdqu	-61(%rdi), %xmm2
076f82
-	movdqu	-61(%rsi), %xmm1
076f82
-	mov	$-61, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(45bytes):
076f82
-	movdqu	-45(%rdi), %xmm2
076f82
-	movdqu	-45(%rsi), %xmm1
076f82
-	mov	$-45, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(29bytes):
076f82
-	movdqu	-29(%rdi), %xmm2
076f82
-	movdqu	-29(%rsi), %xmm1
076f82
-	mov	$-29, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-
076f82
-	mov	-13(%rdi), %rax
076f82
-	mov	-13(%rsi), %rcx
076f82
-	cmp	%rax, %rcx
076f82
-	jne	L(diffin8bytes)
076f82
-
076f82
-	mov	-8(%rdi), %rax
076f82
-	mov	-8(%rsi), %rcx
076f82
-	cmp	%rax, %rcx
076f82
-	jne	L(diffin8bytes)
076f82
-	xor	%eax, %eax
076f82
-	ret
076f82
-
076f82
-	.p2align 4
076f82
-L(78bytes):
076f82
-	movdqu	-78(%rsi), %xmm1
076f82
-	movdqu	-78(%rdi), %xmm2
076f82
-	mov	$-78, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(62bytes):
076f82
-	movdqu	-62(%rdi), %xmm2
076f82
-	movdqu	-62(%rsi), %xmm1
076f82
-	mov	$-62, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(46bytes):
076f82
-	movdqu	-46(%rdi), %xmm2
076f82
-	movdqu	-46(%rsi), %xmm1
076f82
-	mov	$-46, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(30bytes):
076f82
-	movdqu	-30(%rdi), %xmm2
076f82
-	movdqu	-30(%rsi), %xmm1
076f82
-	mov	$-30, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-	mov	-14(%rdi), %rax
076f82
-	mov	-14(%rsi), %rcx
076f82
-	cmp	%rax, %rcx
076f82
-	jne	L(diffin8bytes)
076f82
-	mov	-8(%rdi), %rax
076f82
-	mov	-8(%rsi), %rcx
076f82
-	cmp	%rax, %rcx
076f82
-	jne	L(diffin8bytes)
076f82
-	xor	%eax, %eax
076f82
-	ret
076f82
-
076f82
-	.p2align 4
076f82
-L(79bytes):
076f82
-	movdqu	-79(%rsi), %xmm1
076f82
-	movdqu	-79(%rdi), %xmm2
076f82
-	mov	$-79, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(63bytes):
076f82
-	movdqu	-63(%rdi), %xmm2
076f82
-	movdqu	-63(%rsi), %xmm1
076f82
-	mov	$-63, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(47bytes):
076f82
-	movdqu	-47(%rdi), %xmm2
076f82
-	movdqu	-47(%rsi), %xmm1
076f82
-	mov	$-47, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(31bytes):
076f82
-	movdqu	-31(%rdi), %xmm2
076f82
-	movdqu	-31(%rsi), %xmm1
076f82
-	mov	$-31, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-	mov	-15(%rdi), %rax
076f82
-	mov	-15(%rsi), %rcx
076f82
-	cmp	%rax, %rcx
076f82
-	jne	L(diffin8bytes)
076f82
-	mov	-8(%rdi), %rax
076f82
-	mov	-8(%rsi), %rcx
076f82
-	cmp	%rax, %rcx
076f82
-	jne	L(diffin8bytes)
076f82
-	xor	%eax, %eax
076f82
-	ret
076f82
-# endif
076f82
-	.p2align 4
076f82
-L(64bytes):
076f82
-	movdqu	-64(%rdi), %xmm2
076f82
-	movdqu	-64(%rsi), %xmm1
076f82
-	mov	$-64, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(48bytes):
076f82
-	movdqu	-48(%rdi), %xmm2
076f82
-	movdqu	-48(%rsi), %xmm1
076f82
-	mov	$-48, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-L(32bytes):
076f82
-	movdqu	-32(%rdi), %xmm2
076f82
-	movdqu	-32(%rsi), %xmm1
076f82
-	mov	$-32, %dl
076f82
-	pxor	%xmm1, %xmm2
076f82
-	ptest	%xmm2, %xmm0
076f82
-	jnc	L(less16bytes)
076f82
-
076f82
-	mov	-16(%rdi), %rax
076f82
-	mov	-16(%rsi), %rcx
076f82
-	cmp	%rax, %rcx
076f82
-	jne	L(diffin8bytes)
076f82
-
076f82
-	mov	-8(%rdi), %rax
076f82
-	mov	-8(%rsi), %rcx
076f82
-	cmp	%rax, %rcx
076f82
-	jne	L(diffin8bytes)
076f82
-	xor	%eax, %eax
076f82
-	ret
076f82
-
076f82
-/*
076f82
- * Aligned 8 bytes to avoid 2 branch "taken" in one 16 alinged code block.
076f82
- */
076f82
-	.p2align 3
076f82
-L(less16bytes):
076f82
-	movsbq	%dl, %rdx
076f82
-	mov	(%rsi, %rdx), %rcx
076f82
-	mov	(%rdi, %rdx), %rax
076f82
-	cmp	%rax, %rcx
076f82
-	jne	L(diffin8bytes)
076f82
-	mov	8(%rsi, %rdx), %rcx
076f82
-	mov	8(%rdi, %rdx), %rax
076f82
-L(diffin8bytes):
076f82
-	cmp	%eax, %ecx
076f82
-	jne	L(diffin4bytes)
076f82
-	shr	$32, %rcx
076f82
-	shr	$32, %rax
076f82
-
076f82
+	pmovmskb %xmm0, %ecx
076f82
+	incw	%cx
076f82
+	jnz	L(loop_end_ret)
076f82
+
076f82
+	pmovmskb %xmm1, %ecx
076f82
+	notw	%cx
076f82
+	sall	$16, %ecx
076f82
+	jnz	L(loop_end_ret)
076f82
+
076f82
+	pmovmskb %xmm2, %ecx
076f82
+	notw	%cx
076f82
+	shlq	$32, %rcx
076f82
+	jnz	L(loop_end_ret)
076f82
+
076f82
+	addq	$48, %rdi
076f82
+	addq	$48, %rsi
076f82
+	movq	%rax, %rcx
076f82
+
076f82
+	.p2align 4,, 6
076f82
+L(loop_end_ret):
076f82
+	bsfq	%rcx, %rcx
076f82
 # ifdef USE_AS_WMEMCMP
076f82
-/* for wmemcmp */
076f82
-	cmp	%eax, %ecx
076f82
-	jne	L(diffin4bytes)
076f82
-	xor	%eax, %eax
076f82
-	ret
076f82
-# endif
076f82
-
076f82
-L(diffin4bytes):
076f82
-# ifndef USE_AS_WMEMCMP
076f82
-	cmp	%cx, %ax
076f82
-	jne	L(diffin2bytes)
076f82
-	shr	$16, %ecx
076f82
-	shr	$16, %eax
076f82
-L(diffin2bytes):
076f82
-	cmp	%cl, %al
076f82
-	jne	L(end)
076f82
-	and	$0xffff, %eax
076f82
-	and	$0xffff, %ecx
076f82
-	sub	%ecx, %eax
076f82
-	ret
076f82
-
076f82
-	.p2align 4
076f82
-L(end):
076f82
-	and	$0xff, %eax
076f82
-	and	$0xff, %ecx
076f82
-	sub	%ecx, %eax
076f82
-	ret
076f82
+	movl	(%rdi, %rcx), %eax
076f82
+	xorl	%edx, %edx
076f82
+	cmpl	(%rsi, %rcx), %eax
076f82
+	setg	%dl
076f82
+	leal	-1(%rdx, %rdx), %eax
076f82
 # else
076f82
-
076f82
-/* for wmemcmp */
076f82
-	mov	$1, %eax
076f82
-	jl	L(nequal_bigger)
076f82
-	neg	%eax
076f82
-	ret
076f82
-
076f82
-	.p2align 4
076f82
-L(nequal_bigger):
076f82
-	ret
076f82
-
076f82
-L(unreal_case):
076f82
-	xor	%eax, %eax
076f82
-	ret
076f82
+	movzbl	(%rdi, %rcx), %eax
076f82
+	movzbl	(%rsi, %rcx), %ecx
076f82
+	subl	%ecx, %eax
076f82
 # endif
076f82
-
076f82
+	ret
076f82
 END (MEMCMP)
076f82
-
076f82
-	.section .rodata.sse4.1,"a",@progbits
076f82
-	.p2align 3
076f82
-# ifndef USE_AS_WMEMCMP
076f82
-L(table_64bytes):
076f82
-	.int	JMPTBL (L(0bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(1bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(2bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(3bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(4bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(5bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(6bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(7bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(8bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(9bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(10bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(11bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(12bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(13bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(14bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(15bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(16bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(17bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(18bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(19bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(20bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(21bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(22bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(23bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(24bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(25bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(26bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(27bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(28bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(29bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(30bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(31bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(32bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(33bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(34bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(35bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(36bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(37bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(38bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(39bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(40bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(41bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(42bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(43bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(44bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(45bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(46bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(47bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(48bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(49bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(50bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(51bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(52bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(53bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(54bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(55bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(56bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(57bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(58bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(59bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(60bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(61bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(62bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(63bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(64bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(65bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(66bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(67bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(68bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(69bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(70bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(71bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(72bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(73bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(74bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(75bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(76bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(77bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(78bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(79bytes), L(table_64bytes))
076f82
-# else
076f82
-L(table_64bytes):
076f82
-	.int	JMPTBL (L(0bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(4bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(8bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(12bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(16bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(20bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(24bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(28bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(32bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(36bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(40bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(44bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(48bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(52bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(56bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(60bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(64bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(68bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(72bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(76bytes), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-	.int	JMPTBL (L(unreal_case), L(table_64bytes))
076f82
-# endif
076f82
 #endif