Commit 5784df0f authored by Ian Lynagh's avatar Ian Lynagh
Browse files

Fix caller/callee register saving on Win64

parent 703a30fe
......@@ -164,8 +164,10 @@
#define REG_D1 xmm5
#define REG_D2 xmm6
#if !defined(mingw32_HOST_OS)
#define CALLER_SAVES_R3
#define CALLER_SAVES_R4
#endif
#define CALLER_SAVES_R5
#define CALLER_SAVES_R6
......@@ -175,7 +177,9 @@
#define CALLER_SAVES_F4
#define CALLER_SAVES_D1
#if !defined(mingw32_HOST_OS)
#define CALLER_SAVES_D2
#endif
#define MAX_REAL_VANILLA_REG 6
#define MAX_REAL_FLOAT_REG 4
......
......@@ -247,15 +247,20 @@ StgRunIsImplementedInAssembler(void)
*/
".globl " STG_RUN "\n"
STG_RUN ":\n\t"
"subq %0, %%rsp\n\t"
"subq %1, %%rsp\n\t"
"movq %%rsp, %%rax\n\t"
"addq %0-48, %%rax\n\t"
"subq %0, %%rsp\n\t"
"movq %%rbx,0(%%rax)\n\t"
"movq %%rbp,8(%%rax)\n\t"
"movq %%r12,16(%%rax)\n\t"
"movq %%r13,24(%%rax)\n\t"
"movq %%r14,32(%%rax)\n\t"
"movq %%r15,40(%%rax)\n\t"
#if defined(mingw32_HOST_OS)
"movq %%rdi,48(%%rax)\n\t"
"movq %%rsi,56(%%rax)\n\t"
"movq %%xmm6,64(%%rax)\n\t"
#endif
/*
* Set BaseReg
*/
......@@ -282,18 +287,30 @@ StgRunIsImplementedInAssembler(void)
/*
* restore callee-saves registers. (Don't stomp on %%rax!)
*/
"addq %0, %%rsp\n\t"
"movq %%rsp, %%rdx\n\t"
"addq %0-48, %%rdx\n\t"
"addq %1, %%rsp\n\t"
"movq 0(%%rdx),%%rbx\n\t" /* restore the registers saved above */
"movq 8(%%rdx),%%rbp\n\t"
"movq 16(%%rdx),%%r12\n\t"
"movq 24(%%rdx),%%r13\n\t"
"movq 32(%%rdx),%%r14\n\t"
"movq 40(%%rdx),%%r15\n\t"
"addq %0, %%rsp\n\t"
#if defined(mingw32_HOST_OS)
"movq 48(%%rdx),%%rdi\n\t"
"movq 56(%%rdx),%%rsi\n\t"
"movq 64(%%rdx),%%xmm6\n\t"
#endif
"retq"
: : "i"(RESERVED_C_STACK_BYTES + 48 /*stack frame size*/));
:
: "i"(RESERVED_C_STACK_BYTES),
#if defined(mingw32_HOST_OS)
"i"(72 /*stack frame size*/)
#else
"i"(48 /*stack frame size*/)
#endif
);
/*
* See Note [Stack Alignment on X86]
*/
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment