svn commit: r333324 - in head/sys: amd64/amd64 conf

Mateusz Guzik mjg at FreeBSD.org
Mon May 7 15:07:30 UTC 2018


Author: mjg
Date: Mon May  7 15:07:28 2018
New Revision: 333324
URL: https://svnweb.freebsd.org/changeset/base/333324

Log:
  amd64: replace libkern's memset and memmove with assembly variants
  
  memmove is repurposed bcopy (arguments swapped, return value added)
  The libkern variant is a wrapper around bcopy, so this is a big
  improvement.
  
  memset is repurposed memcpy. The librkern variant is doing fishy stuff,
  including branching on 0 and calling bzero.
  
  Both functions are rather crude and subject to partial depessimization.
  
  This is a soft prerequisite to adding variants utilizing the
  'Enhanced REP MOVSB/STOSB' bit and let the kernel patch at runtime.

Modified:
  head/sys/amd64/amd64/support.S
  head/sys/conf/files.amd64

Modified: head/sys/amd64/amd64/support.S
==============================================================================
--- head/sys/amd64/amd64/support.S	Mon May  7 15:07:26 2018	(r333323)
+++ head/sys/amd64/amd64/support.S	Mon May  7 15:07:28 2018	(r333324)
@@ -162,6 +162,58 @@ ENTRY(bcopy)
 END(bcopy)
 
 /*
+ * memmove(dst, src, cnt)
+ *         rdi, rsi, rdx
+ * Original by:
+ *  ws at tools.de     (Wolfgang Solfrank, TooLs GmbH) +49-228-985800
+ */
+ENTRY(memmove)
+	PUSH_FRAME_POINTER
+	movq	%rdi,%r9
+	movq	%rdx,%rcx
+
+	movq	%rdi,%rax
+	subq	%rsi,%rax
+	cmpq	%rcx,%rax			/* overlapping && src < dst? */
+	jb	1f
+
+	shrq	$3,%rcx				/* copy by 64-bit words */
+	rep
+	movsq
+	movq	%rdx,%rcx
+	andq	$7,%rcx				/* any bytes left? */
+	rep
+	movsb
+	movq	%r9,%rax
+	POP_FRAME_POINTER
+	ret
+
+	/* ALIGN_TEXT */
+1:
+	addq	%rcx,%rdi			/* copy backwards */
+	addq	%rcx,%rsi
+	decq	%rdi
+	decq	%rsi
+	andq	$7,%rcx				/* any fractional bytes? */
+	std
+	rep
+	movsb
+	movq	%rdx,%rcx			/* copy remainder by 32-bit words */
+	shrq	$3,%rcx
+	subq	$7,%rsi
+	subq	$7,%rdi
+	rep
+	movsq
+	cld
+	movq	%r9,%rax
+	POP_FRAME_POINTER
+	ret
+END(memmove)
+
+/*
+ * memcpy(dst, src, len)
+ *        rdi, rsi, rdx
+ *
  * Note: memcpy does not support overlapping copies
  */
 ENTRY(memcpy)
@@ -178,6 +230,27 @@ ENTRY(memcpy)
 	POP_FRAME_POINTER
 	ret
 END(memcpy)
+
+/*
+ * memset(dst, c,   len)
+ *        rdi, rsi, rdx
+ */
+ENTRY(memset)
+	PUSH_FRAME_POINTER
+	movq	%rdi,%r9
+	movq	%rdx,%rcx
+	movq	%rsi,%rax
+	shrq	$3,%rcx
+	rep
+	stosq
+	movq	%rdx,%rcx
+	andq	$7,%rcx
+	rep
+	stosb
+	movq	%r9,%rax
+	POP_FRAME_POINTER
+	ret
+END(memset)
 
 /*
  * pagecopy(%rdi=from, %rsi=to)

Modified: head/sys/conf/files.amd64
==============================================================================
--- head/sys/conf/files.amd64	Mon May  7 15:07:26 2018	(r333323)
+++ head/sys/conf/files.amd64	Mon May  7 15:07:28 2018	(r333324)
@@ -620,8 +620,6 @@ isa/vga_isa.c			optional	vga
 kern/kern_clocksource.c		standard
 kern/link_elf_obj.c		standard
 libkern/x86/crc32_sse42.c	standard
-libkern/memmove.c		standard
-libkern/memset.c		standard
 #
 # IA32 binary support
 #


More information about the svn-src-all mailing list