08c3a6
commit df5de87260dba479873b2850bbe5c0b81c2376f6
08c3a6
Author: Noah Goldstein <goldstein.w.n@gmail.com>
08c3a6
Date:   Fri Apr 15 12:28:01 2022 -0500
08c3a6
08c3a6
    x86: Cleanup page cross code in memcmp-avx2-movbe.S
08c3a6
    
08c3a6
    Old code was both inefficient and wasted code size. New code (-62
08c3a6
    bytes) and comparable or better performance in the page cross case.
08c3a6
    
08c3a6
    geometric_mean(N=20) of page cross cases New / Original: 0.960
08c3a6
    
08c3a6
    size, align0, align1, ret, New Time/Old Time
08c3a6
       1,   4095,      0,   0,             1.001
08c3a6
       1,   4095,      0,   1,             0.999
08c3a6
       1,   4095,      0,  -1,               1.0
08c3a6
       2,   4094,      0,   0,               1.0
08c3a6
       2,   4094,      0,   1,               1.0
08c3a6
       2,   4094,      0,  -1,               1.0
08c3a6
       3,   4093,      0,   0,               1.0
08c3a6
       3,   4093,      0,   1,               1.0
08c3a6
       3,   4093,      0,  -1,               1.0
08c3a6
       4,   4092,      0,   0,             0.987
08c3a6
       4,   4092,      0,   1,               1.0
08c3a6
       4,   4092,      0,  -1,               1.0
08c3a6
       5,   4091,      0,   0,             0.984
08c3a6
       5,   4091,      0,   1,             1.002
08c3a6
       5,   4091,      0,  -1,             1.005
08c3a6
       6,   4090,      0,   0,             0.993
08c3a6
       6,   4090,      0,   1,             1.001
08c3a6
       6,   4090,      0,  -1,             1.003
08c3a6
       7,   4089,      0,   0,             0.991
08c3a6
       7,   4089,      0,   1,               1.0
08c3a6
       7,   4089,      0,  -1,             1.001
08c3a6
       8,   4088,      0,   0,             0.875
08c3a6
       8,   4088,      0,   1,             0.881
08c3a6
       8,   4088,      0,  -1,             0.888
08c3a6
       9,   4087,      0,   0,             0.872
08c3a6
       9,   4087,      0,   1,             0.879
08c3a6
       9,   4087,      0,  -1,             0.883
08c3a6
      10,   4086,      0,   0,             0.878
08c3a6
      10,   4086,      0,   1,             0.886
08c3a6
      10,   4086,      0,  -1,             0.873
08c3a6
      11,   4085,      0,   0,             0.878
08c3a6
      11,   4085,      0,   1,             0.881
08c3a6
      11,   4085,      0,  -1,             0.879
08c3a6
      12,   4084,      0,   0,             0.873
08c3a6
      12,   4084,      0,   1,             0.889
08c3a6
      12,   4084,      0,  -1,             0.875
08c3a6
      13,   4083,      0,   0,             0.873
08c3a6
      13,   4083,      0,   1,             0.863
08c3a6
      13,   4083,      0,  -1,             0.863
08c3a6
      14,   4082,      0,   0,             0.838
08c3a6
      14,   4082,      0,   1,             0.869
08c3a6
      14,   4082,      0,  -1,             0.877
08c3a6
      15,   4081,      0,   0,             0.841
08c3a6
      15,   4081,      0,   1,             0.869
08c3a6
      15,   4081,      0,  -1,             0.876
08c3a6
      16,   4080,      0,   0,             0.988
08c3a6
      16,   4080,      0,   1,              0.99
08c3a6
      16,   4080,      0,  -1,             0.989
08c3a6
      17,   4079,      0,   0,             0.978
08c3a6
      17,   4079,      0,   1,             0.981
08c3a6
      17,   4079,      0,  -1,              0.98
08c3a6
      18,   4078,      0,   0,             0.981
08c3a6
      18,   4078,      0,   1,              0.98
08c3a6
      18,   4078,      0,  -1,             0.985
08c3a6
      19,   4077,      0,   0,             0.977
08c3a6
      19,   4077,      0,   1,             0.979
08c3a6
      19,   4077,      0,  -1,             0.986
08c3a6
      20,   4076,      0,   0,             0.977
08c3a6
      20,   4076,      0,   1,             0.986
08c3a6
      20,   4076,      0,  -1,             0.984
08c3a6
      21,   4075,      0,   0,             0.977
08c3a6
      21,   4075,      0,   1,             0.983
08c3a6
      21,   4075,      0,  -1,             0.988
08c3a6
      22,   4074,      0,   0,             0.983
08c3a6
      22,   4074,      0,   1,             0.994
08c3a6
      22,   4074,      0,  -1,             0.993
08c3a6
      23,   4073,      0,   0,              0.98
08c3a6
      23,   4073,      0,   1,             0.992
08c3a6
      23,   4073,      0,  -1,             0.995
08c3a6
      24,   4072,      0,   0,             0.989
08c3a6
      24,   4072,      0,   1,             0.989
08c3a6
      24,   4072,      0,  -1,             0.991
08c3a6
      25,   4071,      0,   0,              0.99
08c3a6
      25,   4071,      0,   1,             0.999
08c3a6
      25,   4071,      0,  -1,             0.996
08c3a6
      26,   4070,      0,   0,             0.993
08c3a6
      26,   4070,      0,   1,             0.995
08c3a6
      26,   4070,      0,  -1,             0.998
08c3a6
      27,   4069,      0,   0,             0.993
08c3a6
      27,   4069,      0,   1,             0.999
08c3a6
      27,   4069,      0,  -1,               1.0
08c3a6
      28,   4068,      0,   0,             0.997
08c3a6
      28,   4068,      0,   1,               1.0
08c3a6
      28,   4068,      0,  -1,             0.999
08c3a6
      29,   4067,      0,   0,             0.996
08c3a6
      29,   4067,      0,   1,             0.999
08c3a6
      29,   4067,      0,  -1,             0.999
08c3a6
      30,   4066,      0,   0,             0.991
08c3a6
      30,   4066,      0,   1,             1.001
08c3a6
      30,   4066,      0,  -1,             0.999
08c3a6
      31,   4065,      0,   0,             0.988
08c3a6
      31,   4065,      0,   1,             0.998
08c3a6
      31,   4065,      0,  -1,             0.998
08c3a6
    Reviewed-by: H.J. Lu <hjl.tools@gmail.com>
08c3a6
    
08c3a6
    (cherry picked from commit 23102686ec67b856a2d4fd25ddaa1c0b8d175c4f)
08c3a6
08c3a6
diff --git a/sysdeps/x86_64/multiarch/memcmp-avx2-movbe.S b/sysdeps/x86_64/multiarch/memcmp-avx2-movbe.S
08c3a6
index 2621ec907aedb781..ec9cf0852edf216d 100644
08c3a6
--- a/sysdeps/x86_64/multiarch/memcmp-avx2-movbe.S
08c3a6
+++ b/sysdeps/x86_64/multiarch/memcmp-avx2-movbe.S
08c3a6
@@ -429,22 +429,21 @@ L(page_cross_less_vec):
08c3a6
 # ifndef USE_AS_WMEMCMP
08c3a6
 	cmpl	$8, %edx
08c3a6
 	jae	L(between_8_15)
08c3a6
+	/* Fall through for [4, 7].  */
08c3a6
 	cmpl	$4, %edx
08c3a6
-	jae	L(between_4_7)
08c3a6
+	jb	L(between_2_3)
08c3a6
 
08c3a6
-	/* Load as big endian to avoid branches.  */
08c3a6
-	movzwl	(%rdi), %eax
08c3a6
-	movzwl	(%rsi), %ecx
08c3a6
-	shll	$8, %eax
08c3a6
-	shll	$8, %ecx
08c3a6
-	bswap	%eax
08c3a6
-	bswap	%ecx
08c3a6
-	movzbl	-1(%rdi, %rdx), %edi
08c3a6
-	movzbl	-1(%rsi, %rdx), %esi
08c3a6
-	orl	%edi, %eax
08c3a6
-	orl	%esi, %ecx
08c3a6
-	/* Subtraction is okay because the upper 8 bits are zero.  */
08c3a6
-	subl	%ecx, %eax
08c3a6
+	movbe	(%rdi), %eax
08c3a6
+	movbe	(%rsi), %ecx
08c3a6
+	shlq	$32, %rax
08c3a6
+	shlq	$32, %rcx
08c3a6
+	movbe	-4(%rdi, %rdx), %edi
08c3a6
+	movbe	-4(%rsi, %rdx), %esi
08c3a6
+	orq	%rdi, %rax
08c3a6
+	orq	%rsi, %rcx
08c3a6
+	subq	%rcx, %rax
08c3a6
+	/* Fast path for return zero.  */
08c3a6
+	jnz	L(ret_nonzero)
08c3a6
 	/* No ymm register was touched.  */
08c3a6
 	ret
08c3a6
 
08c3a6
@@ -457,9 +456,33 @@ L(one_or_less):
08c3a6
 	/* No ymm register was touched.  */
08c3a6
 	ret
08c3a6
 
08c3a6
+	.p2align 4,, 5
08c3a6
+L(ret_nonzero):
08c3a6
+	sbbl	%eax, %eax
08c3a6
+	orl	$1, %eax
08c3a6
+	/* No ymm register was touched.  */
08c3a6
+	ret
08c3a6
+
08c3a6
+	.p2align 4,, 2
08c3a6
+L(zero):
08c3a6
+	xorl	%eax, %eax
08c3a6
+	/* No ymm register was touched.  */
08c3a6
+	ret
08c3a6
+
08c3a6
 	.p2align 4
08c3a6
 L(between_8_15):
08c3a6
-# endif
08c3a6
+	movbe	(%rdi), %rax
08c3a6
+	movbe	(%rsi), %rcx
08c3a6
+	subq	%rcx, %rax
08c3a6
+	jnz	L(ret_nonzero)
08c3a6
+	movbe	-8(%rdi, %rdx), %rax
08c3a6
+	movbe	-8(%rsi, %rdx), %rcx
08c3a6
+	subq	%rcx, %rax
08c3a6
+	/* Fast path for return zero.  */
08c3a6
+	jnz	L(ret_nonzero)
08c3a6
+	/* No ymm register was touched.  */
08c3a6
+	ret
08c3a6
+# else
08c3a6
 	/* If USE_AS_WMEMCMP fall through into 8-15 byte case.  */
08c3a6
 	vmovq	(%rdi), %xmm1
08c3a6
 	vmovq	(%rsi), %xmm2
08c3a6
@@ -475,16 +498,13 @@ L(between_8_15):
08c3a6
 	VPCMPEQ	%xmm1, %xmm2, %xmm2
08c3a6
 	vpmovmskb %xmm2, %eax
08c3a6
 	subl	$0xffff, %eax
08c3a6
+	/* Fast path for return zero.  */
08c3a6
 	jnz	L(return_vec_0)
08c3a6
 	/* No ymm register was touched.  */
08c3a6
 	ret
08c3a6
+# endif
08c3a6
 
08c3a6
-	.p2align 4
08c3a6
-L(zero):
08c3a6
-	xorl	%eax, %eax
08c3a6
-	ret
08c3a6
-
08c3a6
-	.p2align 4
08c3a6
+	.p2align 4,, 10
08c3a6
 L(between_16_31):
08c3a6
 	/* From 16 to 31 bytes.  No branch when size == 16.  */
08c3a6
 	vmovdqu	(%rsi), %xmm2
08c3a6
@@ -501,11 +521,17 @@ L(between_16_31):
08c3a6
 	VPCMPEQ	(%rdi), %xmm2, %xmm2
08c3a6
 	vpmovmskb %xmm2, %eax
08c3a6
 	subl	$0xffff, %eax
08c3a6
+	/* Fast path for return zero.  */
08c3a6
 	jnz	L(return_vec_0)
08c3a6
 	/* No ymm register was touched.  */
08c3a6
 	ret
08c3a6
 
08c3a6
 # ifdef USE_AS_WMEMCMP
08c3a6
+	.p2align 4,, 2
08c3a6
+L(zero):
08c3a6
+	xorl	%eax, %eax
08c3a6
+	ret
08c3a6
+
08c3a6
 	.p2align 4
08c3a6
 L(one_or_less):
08c3a6
 	jb	L(zero)
08c3a6
@@ -520,22 +546,20 @@ L(one_or_less):
08c3a6
 # else
08c3a6
 
08c3a6
 	.p2align 4
08c3a6
-L(between_4_7):
08c3a6
-	/* Load as big endian with overlapping movbe to avoid branches.
08c3a6
-	 */
08c3a6
-	movbe	(%rdi), %eax
08c3a6
-	movbe	(%rsi), %ecx
08c3a6
-	shlq	$32, %rax
08c3a6
-	shlq	$32, %rcx
08c3a6
-	movbe	-4(%rdi, %rdx), %edi
08c3a6
-	movbe	-4(%rsi, %rdx), %esi
08c3a6
-	orq	%rdi, %rax
08c3a6
-	orq	%rsi, %rcx
08c3a6
-	subq	%rcx, %rax
08c3a6
-	jz	L(zero_4_7)
08c3a6
-	sbbl	%eax, %eax
08c3a6
-	orl	$1, %eax
08c3a6
-L(zero_4_7):
08c3a6
+L(between_2_3):
08c3a6
+	/* Load as big endian to avoid branches.  */
08c3a6
+	movzwl	(%rdi), %eax
08c3a6
+	movzwl	(%rsi), %ecx
08c3a6
+	bswap	%eax
08c3a6
+	bswap	%ecx
08c3a6
+	shrl	%eax
08c3a6
+	shrl	%ecx
08c3a6
+	movzbl	-1(%rdi, %rdx), %edi
08c3a6
+	movzbl	-1(%rsi, %rdx), %esi
08c3a6
+	orl	%edi, %eax
08c3a6
+	orl	%esi, %ecx
08c3a6
+	/* Subtraction is okay because the upper bit is zero.  */
08c3a6
+	subl	%ecx, %eax
08c3a6
 	/* No ymm register was touched.  */
08c3a6
 	ret
08c3a6
 # endif