svn commit: r341364 - in head: lib/libc/amd64/string sys/amd64/amd64

Mateusz Guzik mjg at FreeBSD.org
Sat Dec 1 14:20:33 UTC 2018


Author: mjg
Date: Sat Dec  1 14:20:32 2018
New Revision: 341364
URL: https://svnweb.freebsd.org/changeset/base/341364

Log:
  amd64: align target memmove buffer to 16 bytes before using rep movs
  
  See the review for sample test results.
  
  Reviewed by:	kib (kernel part)
  Sponsored by:	The FreeBSD Foundation
  Differential Revision:	https://reviews.freebsd.org/D18401

Modified:
  head/lib/libc/amd64/string/memmove.S
  head/sys/amd64/amd64/support.S

Modified: head/lib/libc/amd64/string/memmove.S
==============================================================================
--- head/lib/libc/amd64/string/memmove.S	Sat Dec  1 12:08:16 2018	(r341363)
+++ head/lib/libc/amd64/string/memmove.S	Sat Dec  1 14:20:32 2018	(r341364)
@@ -139,6 +139,8 @@ __FBSDID("$FreeBSD$");
 
 	ALIGN_TEXT
 1256:
+	testb	$15,%dil
+	jnz	100f
 .if \erms == 1
 	rep
 	movsb
@@ -146,6 +148,34 @@ __FBSDID("$FreeBSD$");
 	shrq	$3,%rcx                         /* copy by 64-bit words */
 	rep
 	movsq
+	movq	%rdx,%rcx
+	andl	$7,%ecx                         /* any bytes left? */
+	jne	100408b
+.endif
+	\end
+	ret
+100:
+	movq	(%rsi),%r8
+	movq	8(%rsi),%r9
+	movq	%rdi,%r10
+	movq	%rdi,%rcx
+	andq	$15,%rcx
+	leaq	-16(%rdx,%rcx),%rdx
+	neg	%rcx
+	leaq	16(%rdi,%rcx),%rdi
+	leaq	16(%rsi,%rcx),%rsi
+	movq	%rdx,%rcx
+.if \erms == 1
+	rep
+	movsb
+	movq	%r8,(%r10)
+	movq	%r9,8(%r10)
+.else
+	shrq	$3,%rcx                         /* copy by 64-bit words */
+	rep
+	movsq
+	movq	%r8,(%r10)
+	movq	%r9,8(%r10)
 	movq	%rdx,%rcx
 	andl	$7,%ecx                         /* any bytes left? */
 	jne	100408b

Modified: head/sys/amd64/amd64/support.S
==============================================================================
--- head/sys/amd64/amd64/support.S	Sat Dec  1 12:08:16 2018	(r341363)
+++ head/sys/amd64/amd64/support.S	Sat Dec  1 14:20:32 2018	(r341364)
@@ -302,6 +302,8 @@ END(memcmp)
 
 	ALIGN_TEXT
 1256:
+	testb	$15,%dil
+	jnz	100f
 .if \erms == 1
 	rep
 	movsb
@@ -309,6 +311,34 @@ END(memcmp)
 	shrq	$3,%rcx                         /* copy by 64-bit words */
 	rep
 	movsq
+	movq	%rdx,%rcx
+	andl	$7,%ecx                         /* any bytes left? */
+	jne	100408b
+.endif
+	\end
+	ret
+100:
+	movq	(%rsi),%r8
+	movq	8(%rsi),%r9
+	movq	%rdi,%r10
+	movq	%rdi,%rcx
+	andq	$15,%rcx
+	leaq	-16(%rdx,%rcx),%rdx
+	neg	%rcx
+	leaq	16(%rdi,%rcx),%rdi
+	leaq	16(%rsi,%rcx),%rsi
+	movq	%rdx,%rcx
+.if \erms == 1
+	rep
+	movsb
+	movq	%r8,(%r10)
+	movq	%r9,8(%r10)
+.else
+	shrq	$3,%rcx                         /* copy by 64-bit words */
+	rep
+	movsq
+	movq	%r8,(%r10)
+	movq	%r9,8(%r10)
 	movq	%rdx,%rcx
 	andl	$7,%ecx                         /* any bytes left? */
 	jne	100408b


More information about the svn-src-all mailing list