summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMateusz Guzik <mjg@FreeBSD.org>2018-10-01 20:39:17 +0000
committerMateusz Guzik <mjg@FreeBSD.org>2018-10-01 20:39:17 +0000
commit7e02ad0769002c3270aa49b8a51dcf51f2d49d02 (patch)
treeac1104af7d8b9fb9afdd9aa9c6b28156859a76fe
parentaabac0c17673904e13947cc621c65898e74c3e43 (diff)
Notes
-rw-r--r--lib/libc/amd64/string/bzero.S45
-rw-r--r--lib/libc/amd64/string/memset.S112
2 files changed, 66 insertions, 91 deletions
diff --git a/lib/libc/amd64/string/bzero.S b/lib/libc/amd64/string/bzero.S
index cf46a2a317b76..123d9c4a7efbd 100644
--- a/lib/libc/amd64/string/bzero.S
+++ b/lib/libc/amd64/string/bzero.S
@@ -1,46 +1,7 @@
-/*
- * Written by J.T. Conklin <jtc@NetBSD.org>.
- * Public domain.
- * Adapted for NetBSD/x86_64 by Frank van der Linden <fvdl@wasabisystems.com>
- */
+/* $FreeBSD */
#include <machine/asm.h>
__FBSDID("$FreeBSD$");
-#if 0
- RCSID("$NetBSD: bzero.S,v 1.2 2003/07/26 19:24:38 salo Exp $")
-#endif
-
-ENTRY(bzero)
- cld /* set fill direction forward */
- xorq %rax,%rax /* set fill data to 0 */
-
- /*
- * if the string is too short, it's really not worth the overhead
- * of aligning to word boundries, etc. So we jump to a plain
- * unaligned set.
- */
- cmpq $16,%rsi
- jb L1
-
- movq %rdi,%rcx /* compute misalignment */
- negq %rcx
- andq $7,%rcx
- subq %rcx,%rsi
- rep /* zero until word aligned */
- stosb
-
- movq %rsi,%rcx /* zero by words */
- shrq $3,%rcx
- andq $7,%rsi
- rep
- stosq
-
-L1: movq %rsi,%rcx /* zero remainder by bytes */
- rep
- stosb
-
- ret
-END(bzero)
-
- .section .note.GNU-stack,"",%progbits
+#define BZERO
+#include "memset.S"
diff --git a/lib/libc/amd64/string/memset.S b/lib/libc/amd64/string/memset.S
index 84d15628766af..06c9869c2d6cc 100644
--- a/lib/libc/amd64/string/memset.S
+++ b/lib/libc/amd64/string/memset.S
@@ -1,63 +1,77 @@
-/*
- * Written by J.T. Conklin <jtc@NetBSD.org>.
- * Public domain.
- * Adapted for NetBSD/x86_64 by Frank van der Linden <fvdl@wasabisystems.com>
+/*-
+ * Copyright (c) 2018 The FreeBSD Foundation
+ *
+ * This software was developed by Mateusz Guzik <mjg@FreeBSD.org>
+ * under sponsorship from the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
*/
#include <machine/asm.h>
__FBSDID("$FreeBSD$");
-#if 0
- RCSID("$NetBSD: memset.S,v 1.3 2004/02/26 20:50:06 drochner Exp $")
-#endif
-
-ENTRY(memset)
- movq %rsi,%rax
- andq $0xff,%rax
+.macro MEMSET bzero
+.if \bzero == 1
+ movq %rsi,%rcx
+ movq %rsi,%rdx
+ xorl %eax,%eax
+.else
+ movq %rdi,%r9
movq %rdx,%rcx
- movq %rdi,%r11
-
- cld /* set fill direction forward */
-
- /*
- * if the string is too short, it's really not worth the overhead
- * of aligning to word boundries, etc. So we jump to a plain
- * unaligned set.
- */
- cmpq $0x0f,%rcx
- jle L1
-
- movb %al,%ah /* copy char to all bytes in word */
- movl %eax,%edx
- sall $16,%eax
- orl %edx,%eax
-
- movl %eax,%edx
- salq $32,%rax
- orq %rdx,%rax
-
- movq %rdi,%rdx /* compute misalignment */
- negq %rdx
- andq $7,%rdx
- movq %rcx,%r8
- subq %rdx,%r8
-
- movq %rdx,%rcx /* set until word aligned */
- rep
- stosb
-
- movq %r8,%rcx
- shrq $3,%rcx /* set by words */
+ movzbq %sil,%r8
+ movabs $0x0101010101010101,%rax
+ imulq %r8,%rax
+.endif
+ cmpq $15,%rcx
+ jbe 1f
+ shrq $3,%rcx
rep
stosq
-
- movq %r8,%rcx /* set remainder by bytes */
+ movq %rdx,%rcx
andq $7,%rcx
-L1: rep
+ jne 1f
+.if \bzero == 0
+ movq %r9,%rax
+.endif
+ ret
+1:
+ rep
stosb
- movq %r11,%rax
-
+.if \bzero == 0
+ movq %r9,%rax
+.endif
ret
+.endm
+
+#ifndef BZERO
+ENTRY(memset)
+ MEMSET bzero=0
END(memset)
+#else
+ENTRY(bzero)
+ MEMSET bzero=1
+END(bzero)
+#endif
.section .note.GNU-stack,"",%progbits