aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Motin <mav@FreeBSD.org>2022-06-16 18:51:50 +0000
committerAlexander Motin <mav@FreeBSD.org>2022-06-30 01:14:12 +0000
commitefd76157eff3c8f710df2ed9571d02f17729ff74 (patch)
treeed9ca301525761dadb82ae767770438e0415ea4b
parentd0303ad18ae9cb9715f168b69a3e86a2424bcfec (diff)
amd64: Stop using REP MOVSB for backward memmove()s.
Enhanced REP MOVSB feature of CPUs starting from Ivy Bridge makes REP MOVSB the fastest way to copy memory in most of cases. However Intel Optimization Reference Manual says: "setting the DF to force REP MOVSB to copy bytes from high towards low addresses will expe- rience significant performance degradation". Measurements on Intel Cascade Lake and Alder Lake, same as on AMD Zen3 show that it can drop throughput to as low as 2.5-3.5GB/s, comparing to ~10-30GB/s of REP MOVSQ or hand-rolled loop, used for non-ERMS CPUs. This patch keeps ERMS use for forward ordered memory copies, but removes it for backward overlapped moves where it does not work. This is just a cosmetic sync with kernel, since libc does not use ERMS at this time. Reviewed by: mjg MFC after: 2 weeks (cherry picked from commit f22068d91bf53696ee13a69685e809d35776ec3f)
-rw-r--r--lib/libc/amd64/string/memmove.S8
1 files changed, 0 insertions, 8 deletions
diff --git a/lib/libc/amd64/string/memmove.S b/lib/libc/amd64/string/memmove.S
index 4797140a1c16..fc4baaaa4aaa 100644
--- a/lib/libc/amd64/string/memmove.S
+++ b/lib/libc/amd64/string/memmove.S
@@ -268,13 +268,6 @@ __FBSDID("$FreeBSD$");
ALIGN_TEXT
2256:
std
-.if \erms == 1
- leaq -1(%rdi,%rcx),%rdi
- leaq -1(%rsi,%rcx),%rsi
- rep
- movsb
- cld
-.else
leaq -8(%rdi,%rcx),%rdi
leaq -8(%rsi,%rcx),%rsi
shrq $3,%rcx
@@ -284,7 +277,6 @@ __FBSDID("$FreeBSD$");
movq %rdx,%rcx
andb $7,%cl
jne 2004b
-.endif
\end
ret
.endif