mirror of
git://sourceware.org/git/newlib-cygwin.git
synced 2025-02-18 15:09:32 +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
|
||||
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) \
|
||||
|
@ -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"
|
||||
|
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