#include "jit.h"
#include "helpers.h"
#include "codegen.h"
-#include "debug.h"
//#define DEBUG_REGALLOC
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);
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;
x86_pop_reg (cfg->code, X86_EAX);
}
+ pos = 0;
+
if (cfg->method->save_lmf) {
- pos = -sizeof (MonoLMF) - 4;
- } else
- pos = -4;
-
- if (mono_regset_reg_used (cfg->rs, X86_EBX)) {
- x86_mov_reg_membase (cfg->code, X86_EBX, X86_EBP, pos, 4);
- pos -= 4;
- }
- if (mono_regset_reg_used (cfg->rs, X86_EDI)) {
- x86_mov_reg_membase (cfg->code, X86_EDI, X86_EBP, pos, 4);
- pos -= 4;
+ pos = -sizeof (MonoLMF);
+ } else {
+ if (mono_regset_reg_used (cfg->rs, X86_EBX)) {
+ pos -= 4;
}
- if (mono_regset_reg_used (cfg->rs, X86_ESI)) {
- x86_mov_reg_membase (cfg->code, X86_ESI, X86_EBP, pos, 4);
- 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 (cfg->method->save_lmf) {
- pos = -sizeof (MonoLMF);
-
+ if (pos)
x86_lea_membase (cfg->code, X86_ESP, X86_EBP, pos);
+ if (cfg->method->save_lmf) {
/* ebx = previous_lmf */
x86_pop_reg (cfg->code, X86_EBX);
/* edi = lmf */
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);
mbstate = mono_burg_label (t1, cfg);
if (!mbstate) {
- if (mono_debug_format != MONO_DEBUG_FORMAT_NONE)
- return FALSE;
g_warning ("tree does not match in %s: 0x%04x",
mono_method_full_name (cfg->method, TRUE), t1->cli_addr);
mono_print_ctree (cfg, t1); printf ("\n\n");
offset = cfg->code - cfg->start;
gap = cfg->code_size - offset;
if (gap > 0) {
+ char *org = cfg->start;
+#if 0
cfg->start = g_realloc (cfg->start, offset);
+#else
+ cfg->start = mono_mempool_alloc (target_domain->code_mp, offset);
+ memcpy (cfg->start, org, offset);
+ g_free (org);
+#endif
cfg->code_size = offset;
cfg->code = cfg->start + offset;
}