*** empty log message ***
[mono.git] / mono / jit / emit-x86.c
index 646f20de49e1a6ae0cdb1e9f7376ab78f5d83513..90930f55b6bc949b8e5ad524c82dd04a6015c984 100644 (file)
@@ -185,6 +185,9 @@ enter_method (MonoMethod *method, char *ebp)
 
        sig = method->signature;
 
+       if (method->wrapper_type == MONO_WRAPPER_MANAGED_TO_NATIVE)
+               g_assert (!sig->pinvoke);
+
        arg_info = alloca (sizeof (MonoJitArgumentInfo) * (sig->param_count + 1));
 
        arch_get_argument_info (sig, sig->param_count, arg_info);
@@ -417,31 +420,31 @@ arch_emit_prologue (MonoFlowGraph *cfg)
                x86_push_membase (cfg->code, X86_EAX, 0);
                /* *(lmf) = ESP */
                x86_mov_membase_reg (cfg->code, X86_EAX, 0, X86_ESP, 4);
-       }
+       } else {
 
 #if 0
-       /* activation frame alignment check */
-       x86_mov_reg_reg (cfg->code, X86_EAX, X86_ESP, 4);
-       x86_alu_reg_imm (cfg->code, X86_AND, X86_EAX, MONO_FRAME_ALIGNMENT - 1);
-       x86_alu_reg_imm (cfg->code, X86_CMP, X86_EAX, 0);
-       x86_branch32 (cfg->code, X86_CC_EQ, 1, FALSE);
-       x86_breakpoint (cfg->code);
-
+               /* activation frame alignment check */
+               x86_mov_reg_reg (cfg->code, X86_EAX, X86_ESP, 4);
+               x86_alu_reg_imm (cfg->code, X86_AND, X86_EAX, MONO_FRAME_ALIGNMENT - 1);
+               x86_alu_reg_imm (cfg->code, X86_CMP, X86_EAX, 0);
+               x86_branch32 (cfg->code, X86_CC_EQ, 1, FALSE);
+               x86_breakpoint (cfg->code);
 #endif
 
-       if (mono_regset_reg_used (cfg->rs, X86_EBX)) {
-               x86_push_reg (cfg->code, X86_EBX);
-               pos += 4;
-       }
+               if (mono_regset_reg_used (cfg->rs, X86_EBX)) {
+                       x86_push_reg (cfg->code, X86_EBX);
+                       pos += 4;
+               }
 
-       if (mono_regset_reg_used (cfg->rs, X86_EDI)) {
-               x86_push_reg (cfg->code, X86_EDI);
-               pos += 4;
-       }
+               if (mono_regset_reg_used (cfg->rs, X86_EDI)) {
+                       x86_push_reg (cfg->code, X86_EDI);
+                       pos += 4;
+               }
 
-       if (mono_regset_reg_used (cfg->rs, X86_ESI)) {
-               x86_push_reg (cfg->code, X86_ESI);
-               pos += 4;
+               if (mono_regset_reg_used (cfg->rs, X86_ESI)) {
+                       x86_push_reg (cfg->code, X86_ESI);
+                       pos += 4;
+               }
        }
 
        alloc_size -= pos;
@@ -605,32 +608,22 @@ arch_emit_epilogue (MonoFlowGraph *cfg)
 
        pos = 0;
        
-       if (cfg->method->save_lmf)
+       if (cfg->method->save_lmf) {
                pos = -sizeof (MonoLMF);
-       
-       if (mono_regset_reg_used (cfg->rs, X86_EBX)) {
-               pos -= 4;
-       }
-       if (mono_regset_reg_used (cfg->rs, X86_EDI)) {
-               pos -= 4;
+       } else {
+               if (mono_regset_reg_used (cfg->rs, X86_EBX)) {
+                       pos -= 4;
        }
-       if (mono_regset_reg_used (cfg->rs, X86_ESI)) {
-               pos -= 4;
+               if (mono_regset_reg_used (cfg->rs, X86_EDI)) {
+                       pos -= 4;
+               }
+               if (mono_regset_reg_used (cfg->rs, X86_ESI)) {
+                       pos -= 4;
+               }
        }
-
        if (pos)
                x86_lea_membase (cfg->code, X86_ESP, X86_EBP, pos);
 
-       if (mono_regset_reg_used (cfg->rs, X86_ESI)) {
-               x86_pop_reg (cfg->code, X86_ESI);
-       }
-       if (mono_regset_reg_used (cfg->rs, X86_EDI)) {
-               x86_pop_reg (cfg->code, X86_EDI);
-       }
-       if (mono_regset_reg_used (cfg->rs, X86_EBX)) {
-               x86_pop_reg (cfg->code, X86_EBX);
-       }
-
        if (cfg->method->save_lmf) {
                /* ebx = previous_lmf */
                x86_pop_reg (cfg->code, X86_EBX);
@@ -648,6 +641,17 @@ arch_emit_epilogue (MonoFlowGraph *cfg)
                x86_pop_reg (cfg->code, X86_EDI);
                x86_pop_reg (cfg->code, X86_EBX);
 
+       } else {
+
+               if (mono_regset_reg_used (cfg->rs, X86_ESI)) {
+                       x86_pop_reg (cfg->code, X86_ESI);
+               }
+               if (mono_regset_reg_used (cfg->rs, X86_EDI)) {
+                       x86_pop_reg (cfg->code, X86_EDI);
+               }
+               if (mono_regset_reg_used (cfg->rs, X86_EBX)) {
+                       x86_pop_reg (cfg->code, X86_EBX);
+               }
        }
 
        x86_leave (cfg->code);