X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fmini-amd64.c;h=8658500c91c488a373359885ead7147bde005862;hb=e62565f1e4422c1e0057f11656720fd5eb60bb8c;hp=a2906b57c7028bbdbcfd35d1267673262569ab07;hpb=22650957a35cec304db80123bc62c22a0625b3bd;p=mono.git diff --git a/mono/mini/mini-amd64.c b/mono/mini/mini-amd64.c index a2906b57c70..8658500c91c 100644 --- a/mono/mini/mini-amd64.c +++ b/mono/mini/mini-amd64.c @@ -3812,6 +3812,7 @@ emit_setup_lmf (MonoCompile *cfg, guint8 *code, gint32 lmf_offset, int cfa_offse return code; } +#ifdef HOST_WIN32 /* * emit_push_lmf: * @@ -3820,7 +3821,6 @@ emit_setup_lmf (MonoCompile *cfg, guint8 *code, gint32 lmf_offset, int cfa_offse static guint8* emit_push_lmf (MonoCompile *cfg, guint8 *code, gint32 lmf_offset, gboolean *args_clobbered) { -#ifdef HOST_WIN32 if (jit_tls_offset != -1) { code = mono_amd64_emit_tls_get (code, AMD64_RAX, jit_tls_offset); amd64_alu_reg_imm (code, X86_ADD, AMD64_RAX, G_STRUCT_OFFSET (MonoJitTlsData, lmf)); @@ -3843,13 +3843,12 @@ emit_push_lmf (MonoCompile *cfg, guint8 *code, gint32 lmf_offset, gboolean *args /* Set new lmf */ amd64_lea_membase (code, AMD64_R11, cfg->frame_reg, lmf_offset); amd64_mov_membase_reg (code, AMD64_RAX, 0, AMD64_R11, sizeof(gpointer)); -#else - g_assert_not_reached (); -#endif return code; } +#endif +#ifdef HOST_WIN32 /* * emit_pop_lmf: * @@ -3858,17 +3857,14 @@ emit_push_lmf (MonoCompile *cfg, guint8 *code, gint32 lmf_offset, gboolean *args static guint8* emit_pop_lmf (MonoCompile *cfg, guint8 *code, gint32 lmf_offset) { -#ifdef HOST_WIN32 /* Restore previous lmf */ amd64_mov_reg_membase (code, AMD64_RCX, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, previous_lmf), sizeof(gpointer)); amd64_mov_reg_membase (code, AMD64_R11, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, lmf_addr), sizeof(gpointer)); amd64_mov_membase_reg (code, AMD64_R11, 0, AMD64_RCX, sizeof(gpointer)); -#else - g_assert_not_reached (); -#endif return code; } +#endif #define REAL_PRINT_REG(text,reg) \ mono_assert (reg >= 0); \ @@ -4815,7 +4811,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) } case OP_TAILCALL: { MonoCallInst *call = (MonoCallInst*)ins; - int pos = 0, i; + int i, save_area_offset; /* FIXME: no tracing support... */ if (cfg->prof_options & MONO_PROFILE_ENTER_LEAVE) @@ -4823,41 +4819,26 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) g_assert (!cfg->method->save_lmf); - if (cfg->arch.omit_fp) { - guint32 save_offset = 0; - /* Pop callee-saved registers */ - for (i = 0; i < AMD64_NREG; ++i) - if (AMD64_IS_CALLEE_SAVED_REG (i) && (cfg->used_int_regs & (1 << i))) { - amd64_mov_reg_membase (code, i, AMD64_RSP, save_offset, 8); - save_offset += 8; - } - amd64_alu_reg_imm (code, X86_ADD, AMD64_RSP, cfg->arch.stack_alloc_size); + /* Restore callee saved registers */ + save_area_offset = cfg->arch.reg_save_area_offset; + for (i = 0; i < AMD64_NREG; ++i) + if (AMD64_IS_CALLEE_SAVED_REG (i) && (cfg->used_int_regs & (1 << i))) { + amd64_mov_reg_membase (code, i, cfg->frame_reg, save_area_offset, 8); + save_area_offset += 8; + } + if (cfg->arch.omit_fp) { + if (cfg->arch.stack_alloc_size) + amd64_alu_reg_imm (code, X86_ADD, AMD64_RSP, cfg->arch.stack_alloc_size); // FIXME: if (call->stack_usage) NOT_IMPLEMENTED; - } - else { - for (i = 0; i < AMD64_NREG; ++i) - if (AMD64_IS_CALLEE_SAVED_REG (i) && (cfg->used_int_regs & (1 << i))) - pos -= sizeof(mgreg_t); - - /* Restore callee-saved registers */ - for (i = AMD64_NREG - 1; i > 0; --i) { - if (AMD64_IS_CALLEE_SAVED_REG (i) && (cfg->used_int_regs & (1 << i))) { - amd64_mov_reg_membase (code, i, AMD64_RBP, pos, sizeof(mgreg_t)); - pos += sizeof(mgreg_t); - } - } - + } else { /* Copy arguments on the stack to our argument area */ for (i = 0; i < call->stack_usage; i += sizeof(mgreg_t)) { amd64_mov_reg_membase (code, AMD64_RAX, AMD64_RSP, i, sizeof(mgreg_t)); amd64_mov_membase_reg (code, AMD64_RBP, 16 + i, AMD64_RAX, sizeof(mgreg_t)); } - - if (pos) - amd64_lea_membase (code, AMD64_RSP, AMD64_RBP, pos); amd64_leave (code); }