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;
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 ();
}
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);
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;
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 */
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) {