svn commit: r338713 - in head/lib/libc: amd64/string i386/string
Mateusz Guzik
mjg at FreeBSD.org
Mon Sep 17 15:49:36 UTC 2018
Author: mjg
Date: Mon Sep 17 15:49:35 2018
New Revision: 338713
URL: https://svnweb.freebsd.org/changeset/base/338713
Log:
amd64: depessimize userspace memcpy/memmove/bcopy
The change resembles what was done in r334537 for kernel routines.
While here take care of i386 variants. Note that primitives remain
suboptimal.
Reviewed by: kib (previous version)
Approved by: re (gjb)
Differential Revision: https://reviews.freebsd.org/D17167
Modified:
head/lib/libc/amd64/string/bcopy.S
head/lib/libc/i386/string/bcopy.S
Modified: head/lib/libc/amd64/string/bcopy.S
==============================================================================
--- head/lib/libc/amd64/string/bcopy.S Mon Sep 17 15:34:19 2018 (r338712)
+++ head/lib/libc/amd64/string/bcopy.S Mon Sep 17 15:49:35 2018 (r338713)
@@ -66,6 +66,9 @@ ENTRY(bcopy)
movsq
movq %rdx,%rcx
andq $7,%rcx /* any bytes left? */
+ jne 2f
+ ret
+2:
rep
movsb
ret
@@ -73,11 +76,13 @@ ENTRY(bcopy)
addq %rcx,%rdi /* copy backwards. */
addq %rcx,%rsi
std
- andq $7,%rcx /* any fractional bytes? */
decq %rdi
decq %rsi
+ andq $7,%rcx /* any fractional bytes? */
+ je 3f
rep
movsb
+3:
movq %rdx,%rcx /* copy remainder by words */
shrq $3,%rcx
subq $7,%rsi
Modified: head/lib/libc/i386/string/bcopy.S
==============================================================================
--- head/lib/libc/i386/string/bcopy.S Mon Sep 17 15:34:19 2018 (r338712)
+++ head/lib/libc/i386/string/bcopy.S Mon Sep 17 15:49:35 2018 (r338713)
@@ -64,7 +64,7 @@ ENTRY(bcopy)
movl %edi,%edx
subl %esi,%edx
cmpl %ecx,%edx /* overlapping? */
- jb 1f
+ jb 2f
cld /* nope, copy forwards. */
movl %ecx,%edx
shrl $2,%ecx /* copy by words */
@@ -72,21 +72,28 @@ ENTRY(bcopy)
movsl
movl %edx,%ecx
andl $3,%ecx /* any bytes left? */
+ jne 1f
+ popl %edi
+ popl %esi
+ ret
+1:
rep
movsb
popl %edi
popl %esi
ret
-1:
+2:
addl %ecx,%edi /* copy backwards. */
addl %ecx,%esi
std
movl %ecx,%edx
- andl $3,%ecx /* any fractional bytes? */
decl %edi
decl %esi
+ andl $3,%ecx /* any fractional bytes? */
+ je 3f
rep
movsb
+3:
movl %edx,%ecx /* copy remainder by words */
shrl $2,%ecx
subl $3,%esi
More information about the svn-src-head
mailing list