public inbox for cygwin-cvs@sourceware.org
help / color / mirror / Atom feed
* [newlib-cygwin] Cygwin: split out x86_64 memset/memcpy functions
@ 2022-08-08 16:16 Corinna Vinschen
0 siblings, 0 replies; only message in thread
From: Corinna Vinschen @ 2022-08-08 16:16 UTC (permalink / raw)
To: cygwin-cvs
https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=3e13d935545f31cbd1f4871b84f5d70928c56f42
commit 3e13d935545f31cbd1f4871b84f5d70928c56f42
Author: Corinna Vinschen <corinna@vinschen.de>
Date: Mon Aug 8 16:25:41 2022 +0200
Cygwin: split out x86_64 memset/memcpy functions
move the assembler memset and memcpy functions into their own
assembler files.
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Diff:
---
winsup/cygwin/Makefile.am | 7 ++
winsup/cygwin/miscfuncs.cc | 207 ------------------------------------------
winsup/cygwin/x86_64/memcpy.s | 131 ++++++++++++++++++++++++++
winsup/cygwin/x86_64/memset.s | 69 ++++++++++++++
4 files changed, 207 insertions(+), 207 deletions(-)
diff --git a/winsup/cygwin/Makefile.am b/winsup/cygwin/Makefile.am
index c7d7a7716..6838be99a 100644
--- a/winsup/cygwin/Makefile.am
+++ b/winsup/cygwin/Makefile.am
@@ -53,6 +53,12 @@ TEST_LIB_NAME=libcygwin0.a
#
# These objects are included directly into the import library
+if TARGET_X86_64
+TARGET_FILES= \
+ x86_64/memcpy.s \
+ x86_64/memset.s
+endif
+
LIB_FILES= \
lib/_cygwin_crt0_common.cc \
lib/atexit.c \
@@ -361,6 +367,7 @@ liblib_a_SOURCES= \
$(LIB_FILES)
libdll_a_SOURCES= \
+ $(TARGET_FILES) \
$(DLL_FILES) \
$(REGEX_FILES) \
$(MALLOC_FILES) \
diff --git a/winsup/cygwin/miscfuncs.cc b/winsup/cygwin/miscfuncs.cc
index bc362e331..1513bc04e 100644
--- a/winsup/cygwin/miscfuncs.cc
+++ b/winsup/cygwin/miscfuncs.cc
@@ -705,213 +705,6 @@ err:
return thread;
}
-#ifdef __x86_64__
-/* These functions are almost verbatim FreeBSD code (even if the header of
- one file mentiones NetBSD), just wrapped in the minimum required code to
- make them work with the MS AMD64 ABI.
- See FreeBSD src/lib/libc/amd64/string/memset.S
- and FreeBSD src/lib/libc/amd64/string/bcopy.S */
-
-asm (" \n\
-/* \n\
- * Written by J.T. Conklin <jtc@NetBSD.org>. \n\
- * Public domain. \n\
- * Adapted for NetBSD/x86_64 by \n\
- * Frank van der Linden <fvdl@wasabisystems.com> \n\
- */ \n\
- \n\
- .globl memset \n\
- .seh_proc memset \n\
-memset: \n\
- movq %rsi,8(%rsp) \n\
- movq %rdi,16(%rsp) \n\
- .seh_endprologue \n\
- movq %rcx,%rdi \n\
- movq %rdx,%rsi \n\
- movq %r8,%rdx \n\
- \n\
- movq %rsi,%rax \n\
- andq $0xff,%rax \n\
- movq %rdx,%rcx \n\
- movq %rdi,%r11 \n\
- \n\
- cld /* set fill direction forward */ \n\
- \n\
- /* if the string is too short, it's really not worth the \n\
- * overhead of aligning to word boundries, etc. So we jump to \n\
- * a plain unaligned set. */ \n\
- cmpq $0x0f,%rcx \n\
- jle L1 \n\
- \n\
- movb %al,%ah /* copy char to all bytes in word */\n\
- movl %eax,%edx \n\
- sall $16,%eax \n\
- orl %edx,%eax \n\
- \n\
- movl %eax,%edx \n\
- salq $32,%rax \n\
- orq %rdx,%rax \n\
- \n\
- movq %rdi,%rdx /* compute misalignment */ \n\
- negq %rdx \n\
- andq $7,%rdx \n\
- movq %rcx,%r8 \n\
- subq %rdx,%r8 \n\
- \n\
- movq %rdx,%rcx /* set until word aligned */ \n\
- rep \n\
- stosb \n\
- \n\
- movq %r8,%rcx \n\
- shrq $3,%rcx /* set by words */ \n\
- rep \n\
- stosq \n\
- \n\
- movq %r8,%rcx /* set remainder by bytes */ \n\
- andq $7,%rcx \n\
-L1: rep \n\
- stosb \n\
- movq %r11,%rax \n\
- \n\
- movq 8(%rsp),%rsi \n\
- movq 16(%rsp),%rdi \n\
- ret \n\
- .seh_endproc \n\
-");
-
-asm (" \n\
-/*- \n\
- * Copyright (c) 1990 The Regents of the University of California. \n\
- * All rights reserved. \n\
- * \n\
- * This code is derived from locore.s. \n\
- * \n\
- * Redistribution and use in source and binary forms, with or without \n\
- * modification, are permitted provided that the following conditions \n\
- * are met: \n\
- * 1. Redistributions of source code must retain the above copyright \n\
- * notice, this list of conditions and the following disclaimer. \n\
- * 2. Redistributions in binary form must reproduce the above copyright \n\
- * notice, this list of conditions and the following disclaimer in \n\
- * the documentation and/or other materials provided with the \n\
- * distribution. \n\
- * 3. Neither the name of the University nor the names of its \n\
- * contributors may be used to endorse or promote products derived \n\
- * from this software without specific prior written permission. \n\
- * \n\
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' \n\
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n\
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A \n\
- * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR \n\
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n\
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, \n\
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR \n\
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY \n\
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \n\
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE \n\
- * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH \n\
- * DAMAGE. \n\
- */ \n\
- \n\
- .seh_proc _memcpy \n\
-_memcpy: \n\
- movq %rsi,8(%rsp) \n\
- movq %rdi,16(%rsp) \n\
- .seh_endprologue \n\
- movq %rcx,%rdi \n\
- movq %rdx,%rsi \n\
- movq %r8,%rdx \n\
- \n\
- movq %rdx,%rcx \n\
- movq %rdi,%r8 \n\
- subq %rsi,%r8 \n\
- cmpq %rcx,%r8 /* overlapping? */ \n\
- jb 1f \n\
- cld /* nope, copy forwards. */ \n\
- shrq $3,%rcx /* copy by words */ \n\
- rep movsq \n\
- movq %rdx,%rcx \n\
- andq $7,%rcx /* any bytes left? */ \n\
- rep movsb \n\
- jmp 2f \n\
-1: \n\
- addq %rcx,%rdi /* copy backwards. */ \n\
- addq %rcx,%rsi \n\
- std \n\
- andq $7,%rcx /* any fractional bytes? */ \n\
- decq %rdi \n\
- decq %rsi \n\
- rep movsb \n\
- movq %rdx,%rcx /* copy remainder by words */ \n\
- shrq $3,%rcx \n\
- subq $7,%rsi \n\
- subq $7,%rdi \n\
- rep movsq \n\
- cld \n\
-2: \n\
- movq 8(%rsp),%rsi \n\
- movq 16(%rsp),%rdi \n\
- ret \n\
- .seh_endproc \n\
- \n\
- .globl memmove \n\
- .seh_proc memmove \n\
-memmove: \n\
- .seh_endprologue \n\
- movq %rcx,%rax /* return dst */ \n\
- jmp _memcpy \n\
- .seh_endproc \n\
- \n\
- .globl memcpy \n\
- .seh_proc memcpy \n\
-memcpy: \n\
- .seh_endprologue \n\
- movq %rcx,%rax /* return dst */ \n\
- jmp _memcpy \n\
- .seh_endproc \n\
- \n\
- .globl mempcpy \n\
- .seh_proc mempcpy \n\
-mempcpy: \n\
- .seh_endprologue \n\
- movq %rcx,%rax /* return dst */ \n\
- addq %r8,%rax /* + n */ \n\
- jmp _memcpy \n\
- .seh_endproc \n\
- \n\
- .globl wmemmove \n\
- .seh_proc wmemmove \n\
-wmemmove: \n\
- .seh_endprologue \n\
- shlq $1,%r8 /* cnt * sizeof (wchar_t) */ \n\
- movq %rcx,%rax /* return dst */ \n\
- jmp _memcpy \n\
- .seh_endproc \n\
- \n\
- .globl wmemcpy \n\
- .seh_proc wmemcpy \n\
-wmemcpy: \n\
- .seh_endprologue \n\
- shlq $1,%r8 /* cnt * sizeof (wchar_t) */ \n\
- movq %rcx,%rax /* return dst */ \n\
- jmp _memcpy \n\
- .seh_endproc \n\
- \n\
- .globl wmempcpy \n\
- .seh_proc wmempcpy \n\
-wmempcpy: \n\
- .seh_endprologue \n\
- shlq $1,%r8 /* cnt * sizeof (wchar_t) */ \n\
- movq %rcx,%rax /* return dst */ \n\
- addq %r8,%rax /* + n */ \n\
- jmp _memcpy \n\
- .seh_endproc \n\
-");
-
-#else
-#error unimplemented for this target
-#endif
-
/* Signal the thread name to any attached debugger
(See "How to: Set a Thread Name in Native Code"
diff --git a/winsup/cygwin/x86_64/memcpy.s b/winsup/cygwin/x86_64/memcpy.s
new file mode 100644
index 000000000..4be7a0145
--- /dev/null
+++ b/winsup/cygwin/x86_64/memcpy.s
@@ -0,0 +1,131 @@
+/* These functions are almost verbatim FreeBSD code (even if the header of
+ one file mentiones NetBSD), just wrapped in the minimum required code to
+ make them work under the MS AMD64 ABI.
+ See FreeBSD src/lib/libc/amd64/string/bcopy.S */
+
+/*-
+ * Copyright (c) 1990 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * This code is derived from locore.s.
+ *
+ * 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.
+ * 3. Neither the name of the University nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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.
+ */
+
+ .seh_proc _memcpy
+_memcpy:
+ movq %rsi,8(%rsp)
+ movq %rdi,16(%rsp)
+ .seh_endprologue
+ movq %rcx,%rdi
+ movq %rdx,%rsi
+ movq %r8,%rdx
+
+ movq %rdx,%rcx
+ movq %rdi,%r8
+ subq %rsi,%r8
+ cmpq %rcx,%r8 /* overlapping? */
+ jb 1f
+ cld /* nope, copy forwards. */
+ shrq $3,%rcx /* copy by words */
+ rep movsq
+ movq %rdx,%rcx
+ andq $7,%rcx /* any bytes left? */
+ rep movsb
+ jmp 2f
+1:
+ addq %rcx,%rdi /* copy backwards. */
+ addq %rcx,%rsi
+ std
+ andq $7,%rcx /* any fractional bytes? */
+ decq %rdi
+ decq %rsi
+ rep movsb
+ movq %rdx,%rcx /* copy remainder by words */
+ shrq $3,%rcx
+ subq $7,%rsi
+ subq $7,%rdi
+ rep movsq
+ cld
+2:
+ movq 8(%rsp),%rsi
+ movq 16(%rsp),%rdi
+ ret
+ .seh_endproc
+
+ .globl memmove
+ .seh_proc memmove
+memmove:
+ .seh_endprologue
+ movq %rcx,%rax /* return dst */
+ jmp _memcpy
+ .seh_endproc
+
+ .globl memcpy
+ .seh_proc memcpy
+memcpy:
+ .seh_endprologue
+ movq %rcx,%rax /* return dst */
+ jmp _memcpy
+ .seh_endproc
+
+ .globl mempcpy
+ .seh_proc mempcpy
+mempcpy:
+ .seh_endprologue
+ movq %rcx,%rax /* return dst */
+ addq %r8,%rax /* + n */
+ jmp _memcpy
+ .seh_endproc
+
+ .globl wmemmove
+ .seh_proc wmemmove
+wmemmove:
+ .seh_endprologue
+ shlq $1,%r8 /* cnt * sizeof (wchar_t) */
+ movq %rcx,%rax /* return dst */
+ jmp _memcpy
+ .seh_endproc
+
+ .globl wmemcpy
+ .seh_proc wmemcpy
+wmemcpy:
+ .seh_endprologue
+ shlq $1,%r8 /* cnt * sizeof (wchar_t) */
+ movq %rcx,%rax /* return dst */
+ jmp _memcpy
+ .seh_endproc
+
+ .globl wmempcpy
+ .seh_proc wmempcpy
+wmempcpy:
+ .seh_endprologue
+ shlq $1,%r8 /* cnt * sizeof (wchar_t) */
+ movq %rcx,%rax /* return dst */
+ addq %r8,%rax /* + n */
+ jmp _memcpy
+ .seh_endproc
diff --git a/winsup/cygwin/x86_64/memset.s b/winsup/cygwin/x86_64/memset.s
new file mode 100644
index 000000000..ac73b6ace
--- /dev/null
+++ b/winsup/cygwin/x86_64/memset.s
@@ -0,0 +1,69 @@
+/* These functions are almost verbatim FreeBSD code (even if the header of
+ one file mentiones NetBSD), just wrapped in the minimum required code to
+ make them work under the MS AMD64 ABI.
+ See FreeBSD src/lib/libc/amd64/string/memset.S */
+
+/*
+ * Written by J.T. Conklin <jtc@NetBSD.org>.
+ * Public domain.
+ * Adapted for NetBSD/x86_64 by
+ * Frank van der Linden <fvdl@wasabisystems.com>
+ */
+
+ .globl memset
+ .seh_proc memset
+memset:
+ movq %rsi,8(%rsp)
+ movq %rdi,16(%rsp)
+ .seh_endprologue
+ movq %rcx,%rdi
+ movq %rdx,%rsi
+ movq %r8,%rdx
+
+ movq %rsi,%rax
+ andq $0xff,%rax
+ 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 */
+ rep
+ stosq
+
+ movq %r8,%rcx /* set remainder by bytes */
+ andq $7,%rcx
+L1: rep
+ stosb
+ movq %r11,%rax
+
+ movq 8(%rsp),%rsi
+ movq 16(%rsp),%rdi
+ ret
+ .seh_endproc
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2022-08-08 16:16 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-08-08 16:16 [newlib-cygwin] Cygwin: split out x86_64 memset/memcpy functions Corinna Vinschen
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).