cygwin: x86_64: implement mempcpy/wmempcpy in assembler

* change memcpy to internal _memcpy not setting the return value in %rax
* implement all memcpy-like functions as caller to _memcpy, setting %rax
  to correct return value beforehand.  This is possible because _memcpy
  does not use %rax at all

Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
Corinna Vinschen 2017-11-30 10:47:38 +01:00
parent 7161622514
commit aea710b5fb
1 changed files with 44 additions and 16 deletions

View File

@ -824,16 +824,8 @@ asm volatile (" \n\
* DAMAGE. \n\ * DAMAGE. \n\
*/ \n\ */ \n\
\n\ \n\
.globl memmove \n\ .seh_proc _memcpy \n\
.seh_proc memmove \n\ _memcpy: \n\
memmove: \n\
.seh_endprologue \n\
nop /* FALLTHRU */ \n\
.seh_endproc \n\
\n\
.globl memcpy \n\
.seh_proc memcpy \n\
memcpy: \n\
movq %rsi,8(%rsp) \n\ movq %rsi,8(%rsp) \n\
movq %rdi,16(%rsp) \n\ movq %rdi,16(%rsp) \n\
.seh_endprologue \n\ .seh_endprologue \n\
@ -841,7 +833,6 @@ memcpy: \n\
movq %rdx,%rsi \n\ movq %rdx,%rsi \n\
movq %r8,%rdx \n\ movq %r8,%rdx \n\
\n\ \n\
movq %rdi,%rax /* return dst */ \n\
movq %rdx,%rcx \n\ movq %rdx,%rcx \n\
movq %rdi,%r8 \n\ movq %rdi,%r8 \n\
subq %rsi,%r8 \n\ subq %rsi,%r8 \n\
@ -873,14 +864,39 @@ memcpy: \n\
movq 16(%rsp),%rdi \n\ movq 16(%rsp),%rdi \n\
ret \n\ ret \n\
.seh_endproc \n\ .seh_endproc \n\
"); \n\
.globl memmove \n\
asm volatile (" \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 memcpy \n\
.seh_proc memcpy \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\ .globl wmemmove \n\
.seh_proc wmemmove \n\ .seh_proc wmemmove \n\
wmemmove: \n\ wmemmove: \n\
.seh_endprologue \n\ .seh_endprologue \n\
nop /* FALLTHRU */ \n\ shlq $1,%r8 /* cnt * sizeof (wchar_t) */ \n\
movq %rcx,%rax /* return dst */ \n\
jmp _memcpy \n\
.seh_endproc \n\ .seh_endproc \n\
\n\ \n\
.globl wmemcpy \n\ .globl wmemcpy \n\
@ -888,9 +904,21 @@ wmemmove: \n\
wmemcpy: \n\ wmemcpy: \n\
.seh_endprologue \n\ .seh_endprologue \n\
shlq $1,%r8 /* cnt * sizeof (wchar_t) */ \n\ shlq $1,%r8 /* cnt * sizeof (wchar_t) */ \n\
jmp memcpy \n\ movq %rcx,%rax /* return dst */ \n\
jmp _memcpy \n\
.seh_endproc \n\
\n\
.globl wmemcpy \n\
.seh_proc wmemcpy \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\ .seh_endproc \n\
"); ");
#endif #endif
/* Signal the thread name to any attached debugger /* Signal the thread name to any attached debugger