svn commit: r357309 - head/sys/amd64/amd64
Mateusz Guzik
mjg at FreeBSD.org
Thu Jan 30 19:56:22 UTC 2020
Author: mjg
Date: Thu Jan 30 19:56:22 2020
New Revision: 357309
URL: https://svnweb.freebsd.org/changeset/base/357309
Log:
amd64: speed up failing case for memcmp
Instead of branching on up to 8 bytes, drop the size to 4.
Assorted clean ups while here.
Validated with glibc test suite.
Modified:
head/sys/amd64/amd64/support.S
Modified: head/sys/amd64/amd64/support.S
==============================================================================
--- head/sys/amd64/amd64/support.S Thu Jan 30 19:38:51 2020 (r357308)
+++ head/sys/amd64/amd64/support.S Thu Jan 30 19:56:22 2020 (r357309)
@@ -107,7 +107,7 @@ END(sse2_pagezero)
/*
* memcmpy(b1, b2, len)
- * rdi,rsi,len
+ * rdi,rsi,rdx
*/
ENTRY(memcmp)
PUSH_FRAME_POINTER
@@ -123,7 +123,7 @@ ENTRY(memcmp)
movq (%rdi),%r8
movq (%rsi),%r9
cmpq %r8,%r9
- jne 1f
+ jne 80f
movq -8(%rdi,%rdx),%r8
movq -8(%rsi,%rdx),%r9
cmpq %r8,%r9
@@ -133,25 +133,25 @@ ENTRY(memcmp)
100408:
cmpb $4,%dl
jl 100204f
- movl (%rsi),%r8d
- movl (%rdi),%r9d
+ movl (%rdi),%r8d
+ movl (%rsi),%r9d
cmpl %r8d,%r9d
- jne 1f
- movl -4(%rsi,%rdx),%r8d
- movl -4(%rdi,%rdx),%r9d
+ jne 80f
+ movl -4(%rdi,%rdx),%r8d
+ movl -4(%rsi,%rdx),%r9d
cmpl %r8d,%r9d
- jne 1f
+ jne 10040804f
POP_FRAME_POINTER
ret
100204:
cmpb $2,%dl
jl 100001f
- movzwl (%rsi),%r8d
- movzwl (%rdi),%r9d
+ movzwl (%rdi),%r8d
+ movzwl (%rsi),%r9d
cmpl %r8d,%r9d
jne 1f
- movzwl -2(%rsi,%rdx),%r8d
- movzwl -2(%rdi,%rdx),%r9d
+ movzwl -2(%rdi,%rdx),%r8d
+ movzwl -2(%rsi,%rdx),%r9d
cmpl %r8d,%r9d
jne 1f
POP_FRAME_POINTER
@@ -159,10 +159,9 @@ ENTRY(memcmp)
100001:
cmpb $1,%dl
jl 100000f
- movzbl (%rdi),%r8d
- movzbl (%rsi),%r9d
- cmpb %r8b,%r9b
- jne 1f
+ movzbl (%rdi),%eax
+ movzbl (%rsi),%r8d
+ subl %r8d,%eax
100000:
POP_FRAME_POINTER
ret
@@ -173,11 +172,11 @@ ALIGN_TEXT
movq (%rdi),%r8
movq (%rsi),%r9
cmpq %r8,%r9
- jne 1f
+ jne 80f
movq 8(%rdi),%r8
movq 8(%rsi),%r9
cmpq %r8,%r9
- jne 10163208f
+ jne 10163208f
movq -16(%rdi,%rdx),%r8
movq -16(%rsi,%rdx),%r9
cmpq %r8,%r9
@@ -194,14 +193,14 @@ ALIGN_TEXT
movq 8(%rdi),%r9
subq (%rsi),%r8
subq 8(%rsi),%r9
- or %r8,%r9
+ orq %r8,%r9
jnz 10320000f
movq 16(%rdi),%r8
movq 24(%rdi),%r9
subq 16(%rsi),%r8
subq 24(%rsi),%r9
- or %r8,%r9
+ orq %r8,%r9
jnz 10320016f
leaq 32(%rdi),%rdi
@@ -214,40 +213,57 @@ ALIGN_TEXT
POP_FRAME_POINTER
ret
+/*
+ * Mismatch was found.
+ *
+ * Before we compute it we narrow down the range (16 -> 8 -> 4 bytes).
+ */
+ALIGN_TEXT
10320016:
leaq 16(%rdi),%rdi
leaq 16(%rsi),%rsi
10320000:
-/*
- * Mismatch was found within a 16 bytes range. The part of the routine
- * which calculates it only operates on sizes up to 8 bytes. Find the
- * right part.
- */
movq (%rdi),%r8
movq (%rsi),%r9
cmpq %r8,%r9
- jne 1f
+ jne 80f
leaq 8(%rdi),%rdi
leaq 8(%rsi),%rsi
- jmp 1f
+ jmp 80f
+ALIGN_TEXT
+10081608:
10163224:
leaq -8(%rdi,%rdx),%rdi
leaq -8(%rsi,%rdx),%rsi
- jmp 1f
+ jmp 80f
+ALIGN_TEXT
10163216:
leaq -16(%rdi,%rdx),%rdi
leaq -16(%rsi,%rdx),%rsi
- jmp 1f
+ jmp 80f
+ALIGN_TEXT
10163208:
-10081608:
leaq 8(%rdi),%rdi
leaq 8(%rsi),%rsi
+ jmp 80f
+ALIGN_TEXT
+10040804:
+ leaq -4(%rdi,%rdx),%rdi
+ leaq -4(%rsi,%rdx),%rsi
jmp 1f
+ALIGN_TEXT
+80:
+ movl (%rdi),%r8d
+ movl (%rsi),%r9d
+ cmpl %r8d,%r9d
+ jne 1f
+ leaq 4(%rdi),%rdi
+ leaq 4(%rsi),%rsi
+
/*
- * Mismatch was found. We have no more than 8 bytes to inspect.
+ * We have up to 4 bytes to inspect.
*/
-ALIGN_TEXT
1:
movzbl (%rdi),%eax
movzbl (%rsi),%r8d
@@ -266,32 +282,6 @@ ALIGN_TEXT
movzbl 3(%rdi),%eax
movzbl 3(%rsi),%r8d
- cmpb %r8b,%al
- jne 2f
-
- movzbl 4(%rdi),%eax
- movzbl 4(%rsi),%r8d
- cmpb %r8b,%al
- jne 2f
-
- movzbl 5(%rdi),%eax
- movzbl 5(%rsi),%r8d
- cmpb %r8b,%al
- jne 2f
-
- movzbl 6(%rdi),%eax
- movzbl 6(%rsi),%r8d
- cmpb %r8b,%al
- jne 2f
-
- movzbl 7(%rdi),%eax
- movzbl 7(%rsi),%r8d
- cmpb %r8b,%al
- jne 2f
-
- xorl %eax,%eax
- POP_FRAME_POINTER
- ret
2:
subl %r8d,%eax
POP_FRAME_POINTER
More information about the svn-src-all
mailing list