Fix caller/callee register saving on Win64
authorIan Lynagh <igloo@earth.li>
Fri, 23 Mar 2012 21:08:53 +0000 (21:08 +0000)
committerIan Lynagh <igloo@earth.li>
Fri, 23 Mar 2012 23:06:27 +0000 (23:06 +0000)
includes/stg/MachRegs.h
rts/StgCRun.c

index 34685a3..ee03b56 100644 (file)
 #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
 
 #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
index 15f9fd2..35c04f7 100644 (file)
@@ -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]
          */