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:
parent
7161622514
commit
aea710b5fb
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue