mirror of
git://sourceware.org/git/newlib-cygwin.git
synced 2025-02-21 00:07:36 +08:00
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>
This commit is contained in:
parent
4d6c88e030
commit
3e13d93554
@ -53,6 +53,12 @@ TEST_LIB_NAME=libcygwin0.a
|
|||||||
#
|
#
|
||||||
|
|
||||||
# These objects are included directly into the import library
|
# 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_FILES= \
|
||||||
lib/_cygwin_crt0_common.cc \
|
lib/_cygwin_crt0_common.cc \
|
||||||
lib/atexit.c \
|
lib/atexit.c \
|
||||||
@ -361,6 +367,7 @@ liblib_a_SOURCES= \
|
|||||||
$(LIB_FILES)
|
$(LIB_FILES)
|
||||||
|
|
||||||
libdll_a_SOURCES= \
|
libdll_a_SOURCES= \
|
||||||
|
$(TARGET_FILES) \
|
||||||
$(DLL_FILES) \
|
$(DLL_FILES) \
|
||||||
$(REGEX_FILES) \
|
$(REGEX_FILES) \
|
||||||
$(MALLOC_FILES) \
|
$(MALLOC_FILES) \
|
||||||
|
@ -705,213 +705,6 @@ err:
|
|||||||
return thread;
|
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
|
/* Signal the thread name to any attached debugger
|
||||||
|
|
||||||
(See "How to: Set a Thread Name in Native Code"
|
(See "How to: Set a Thread Name in Native Code"
|
||||||
|
131
winsup/cygwin/x86_64/memcpy.s
Normal file
131
winsup/cygwin/x86_64/memcpy.s
Normal file
@ -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
|
69
winsup/cygwin/x86_64/memset.s
Normal file
69
winsup/cygwin/x86_64/memset.s
Normal file
@ -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
|
Loading…
x
Reference in New Issue
Block a user