Browse Source

2009-01-07 Bill Holmes <[email protected]>

	* 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
Bill Holmes 17 years ago
parent
commit
d7679a302c
3 changed files with 42 additions and 0 deletions
  1. 10 0
      mono/mini/ChangeLog
  2. 16 0
      mono/mini/exceptions-amd64.c
  3. 16 0
      mono/mini/mini-amd64.c

+ 10 - 0
mono/mini/ChangeLog

@@ -1,3 +1,13 @@
+2009-01-07  Bill Holmes  <[email protected]>
+
+	* 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  <[email protected]>
 
 	* mini-arm.c (mono_arch_flush_icache): Use __GNUC_PREREQ instead of checking

+ 16 - 0
mono/mini/exceptions-amd64.c

@@ -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);
 

+ 16 - 0
mono/mini/mini-amd64.c

@@ -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) {