2009-01-07 Bill Holmes <billholmes54@gmail.com>
authorBill Holmes <holmes@mono-cvs.ximian.com>
Wed, 7 Jan 2009 22:34:17 +0000 (22:34 -0000)
committerBill Holmes <holmes@mono-cvs.ximian.com>
Wed, 7 Jan 2009 22:34:17 +0000 (22:34 -0000)
* mini-amd64.c : Adding code to save/restore non-volatile registers
  on Winx64.

* exceptions-amd64.c : Adding code to save/restore non-volatile
  registers on Winx64.

Contributed under MIT/X11 license.

svn path=/trunk/mono/; revision=122719

mono/mini/ChangeLog
mono/mini/exceptions-amd64.c
mono/mini/mini-amd64.c

index 64858f84fad4a4bf6a1fa12866e81481f6e9e9bc..2338daf92c014dddcaaf620beec2657c59fd1943 100644 (file)
@@ -1,3 +1,13 @@
+2009-01-07  Bill Holmes  <billholmes54@gmail.com>
+
+       * mini-amd64.c : Adding code to save/restore non-volatile registers
+          on Winx64.
+
+       * exceptions-amd64.c : Adding code to save/restore non-volatile 
+         registers on Winx64.
+
+       Contributed under MIT/X11 license.
+
 2009-01-07  Zoltan Varga  <vargaz@gmail.com>
 
        * mini-arm.c (mono_arch_flush_icache): Use __GNUC_PREREQ instead of checking
index d56962d12b09ae7baec775c51ffd35a0dbcd7175..e29fa319be15d025cf00e11ab1b6339986459c4a 100644 (file)
@@ -589,6 +589,10 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, MonoJitInf
                        new_ctx->r13 = lmf_addr->r13;
                        new_ctx->r14 = lmf_addr->r14;
                        new_ctx->r15 = lmf_addr->r15;
+#ifdef PLATFORM_WIN32
+                       new_ctx->rdi = lmf_addr->rdi;
+                       new_ctx->rsi = lmf_addr->rsi;
+#endif
                }
                else {
                        offset = omit_fp ? 0 : -1;
@@ -625,6 +629,14 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, MonoJitInf
                                        case AMD64_RBP:
                                                new_ctx->rbp = reg;
                                                break;
+#ifdef PLATFORM_WIN32
+                                       case AMD64_RDI:
+                                               new_ctx->rdi = reg;
+                                               break;
+                                       case AMD64_RSI:
+                                               new_ctx->rsi = reg;
+                                               break;
+#endif
                                        default:
                                                g_assert_not_reached ();
                                        }
@@ -692,6 +704,10 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, MonoJitInf
                new_ctx->r13 = (*lmf)->r13;
                new_ctx->r14 = (*lmf)->r14;
                new_ctx->r15 = (*lmf)->r15;
+#ifdef PLATFORM_WIN32
+               new_ctx->rdi = (*lmf)->rdi;
+               new_ctx->rsi = (*lmf)->rsi;
+#endif
 
                *lmf = (gpointer)(((guint64)(*lmf)->previous_lmf) & ~1);
 
index 434a279fcee756111161fea3c05dd24359ecdff4..559b06cca6173779dd4d37aca646ad756f3fec17 100644 (file)
@@ -1050,6 +1050,10 @@ mono_arch_get_global_int_regs (MonoCompile *cfg)
                regs = g_list_prepend (regs, (gpointer)AMD64_R13);
                regs = g_list_prepend (regs, (gpointer)AMD64_R14);
                regs = g_list_prepend (regs, (gpointer)AMD64_R15);
+#ifdef PLATFORM_WIN32
+               regs = g_list_prepend (regs, (gpointer)AMD64_RDI);
+               regs = g_list_prepend (regs, (gpointer)AMD64_RSI);
+#endif
        }
 
        return regs;
@@ -4537,6 +4541,10 @@ mono_arch_emit_prolog (MonoCompile *cfg)
                amd64_mov_membase_reg (code, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, r13), AMD64_R13, 8);
                amd64_mov_membase_reg (code, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, r14), AMD64_R14, 8);
                amd64_mov_membase_reg (code, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, r15), AMD64_R15, 8);
+#ifdef PLATFORM_WIN32
+               amd64_mov_membase_reg (code, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, rdi), AMD64_RDI, 8);
+               amd64_mov_membase_reg (code, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, rsi), AMD64_RSI, 8);
+#endif
        }
 
        /* Save callee saved registers */
@@ -4977,6 +4985,14 @@ mono_arch_emit_epilog (MonoCompile *cfg)
                if (cfg->used_int_regs & (1 << AMD64_R15)) {
                        amd64_mov_reg_membase (code, AMD64_R15, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, r15), 8);
                }
+#ifdef PLATFORM_WIN32
+               if (cfg->used_int_regs & (1 << AMD64_RDI)) {
+                       amd64_mov_reg_membase (code, AMD64_RDI, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, rdi), 8);
+               }
+               if (cfg->used_int_regs & (1 << AMD64_RSI)) {
+                       amd64_mov_reg_membase (code, AMD64_RSI, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, rsi), 8);
+               }
+#endif
        } else {
 
                if (cfg->arch.omit_fp) {