Fix the pp64 build.
[mono.git] / mono / mini / mini-amd64.c
index a2906b57c7028bbdbcfd35d1267673262569ab07..8658500c91c488a373359885ead7147bde005862 100644 (file)
@@ -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);
                        }