X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fmini-codegen.c;h=4482640343b38ca252d75d3e0665ceeea4de7caa;hb=20eef073b5fe81365d79c38ccc49c76aa2417a1d;hp=db26f1b5c523fb34ec53fe186b302ffbcbd4c2d3;hpb=4ba928c1af3011e87cd5ce7812132a675c8a404d;p=mono.git diff --git a/mono/mini/mini-codegen.c b/mono/mini/mini-codegen.c index db26f1b5c52..4482640343b 100644 --- a/mono/mini/mini-codegen.c +++ b/mono/mini/mini-codegen.c @@ -1,9 +1,12 @@ -/* - * mini-codegen.c: Arch independent code generation functionality +/** + * \file + * Arch independent code generation functionality * * (C) 2003 Ximian, Inc. */ +#include "config.h" + #include #include #ifdef HAVE_UNISTD_H @@ -21,6 +24,8 @@ #include "trace.h" #include "mini-arch.h" +#ifndef DISABLE_JIT + #ifndef MONO_MAX_XREGS #define MONO_MAX_XREGS 0 @@ -28,7 +33,6 @@ #define MONO_ARCH_CALLEE_XREGS 0 #endif - #define MONO_ARCH_BANK_MIRRORED -2 @@ -411,47 +415,7 @@ typedef struct { regmask_t preferred_mask; /* the hreg where the register should be allocated, or 0 */ } RegTrack; -#if !defined(DISABLE_LOGGING) && !defined(DISABLE_JIT) - -static const char* const patch_info_str[] = { -#define PATCH_INFO(a,b) "" #a, -#include "patch-info.h" -#undef PATCH_INFO -}; - -const char* -mono_ji_type_to_string (MonoJumpInfoType type) -{ - return patch_info_str [type]; -} - -void -mono_print_ji (const MonoJumpInfo *ji) -{ - switch (ji->type) { - case MONO_PATCH_INFO_RGCTX_FETCH: { - MonoJumpInfoRgctxEntry *entry = ji->data.rgctx_entry; - - printf ("[RGCTX_FETCH "); - mono_print_ji (entry->data); - printf (" - %s]", mono_rgctx_info_type_to_str (entry->info_type)); - break; - } - case MONO_PATCH_INFO_METHODCONST: { - char *s = mono_method_full_name (ji->data.method, TRUE); - printf ("[METHODCONST - %s]", s); - g_free (s); - break; - } - case MONO_PATCH_INFO_INTERNAL_METHOD: { - printf ("[INTERNAL_METHOD - %s]", ji->data.name); - break; - } - default: - printf ("[%s]", patch_info_str [ji->type]); - break; - } -} +#if !defined(DISABLE_LOGGING) void mono_print_ins_index (int i, MonoInst *ins) @@ -535,6 +499,10 @@ mono_print_ins_index_strbuf (int i, MonoInst *ins) case OP_GSHAREDVT_ARG_REGOFFSET: g_string_append_printf (sbuf, " + 0x%lx", (long)ins->inst_offset); break; + case OP_ISINST: + case OP_CASTCLASS: + g_string_append_printf (sbuf, " %s", ins->klass->name); + break; default: break; } @@ -722,6 +690,36 @@ mono_print_ins_index_strbuf (int i, MonoInst *ins) case OP_SEQ_POINT: g_string_append_printf (sbuf, " il: 0x%x%s", (int)ins->inst_imm, ins->flags & MONO_INST_NONEMPTY_STACK ? ", nonempty-stack" : ""); break; + case OP_COND_EXC_EQ: + case OP_COND_EXC_GE: + case OP_COND_EXC_GT: + case OP_COND_EXC_LE: + case OP_COND_EXC_LT: + case OP_COND_EXC_NE_UN: + case OP_COND_EXC_GE_UN: + case OP_COND_EXC_GT_UN: + case OP_COND_EXC_LE_UN: + case OP_COND_EXC_LT_UN: + case OP_COND_EXC_OV: + case OP_COND_EXC_NO: + case OP_COND_EXC_C: + case OP_COND_EXC_NC: + case OP_COND_EXC_IEQ: + case OP_COND_EXC_IGE: + case OP_COND_EXC_IGT: + case OP_COND_EXC_ILE: + case OP_COND_EXC_ILT: + case OP_COND_EXC_INE_UN: + case OP_COND_EXC_IGE_UN: + case OP_COND_EXC_IGT_UN: + case OP_COND_EXC_ILE_UN: + case OP_COND_EXC_ILT_UN: + case OP_COND_EXC_IOV: + case OP_COND_EXC_INO: + case OP_COND_EXC_IC: + case OP_COND_EXC_INC: + g_string_append_printf (sbuf, " %s", ins->inst_p1); + break; default: break; } @@ -751,22 +749,11 @@ print_regtrack (RegTrack *t, int num) } #else -const char* -mono_ji_type_to_string (MonoJumpInfoType type) -{ - return ""; -} - -void -mono_print_ji (const MonoJumpInfo *ji) -{ -} - void mono_print_ins_index (int i, MonoInst *ins) { } -#endif /* !defined(DISABLE_LOGGING) && !defined(DISABLE_JIT) */ +#endif /* !defined(DISABLE_LOGGING) */ void mono_print_ins (MonoInst *ins) @@ -851,11 +838,6 @@ spill_vreg (MonoCompile *cfg, MonoBasicBlock *bb, MonoInst **last, MonoInst *ins mono_regstate_free_int (rs, sel); } -/* This isn't defined on older glib versions and on some platforms */ -#ifndef G_GUINT64_FORMAT -#define G_GUINT64_FORMAT "ul" -#endif - static int get_register_spilling (MonoCompile *cfg, MonoBasicBlock *bb, MonoInst **last, MonoInst *ins, regmask_t regmask, int reg, int bank) { @@ -1122,8 +1104,6 @@ get_callee_mask (const char spec) static gint8 desc_to_fixed_reg [256]; static gboolean desc_to_fixed_reg_inited = FALSE; -#ifndef DISABLE_JIT - /* * Local register allocation. * We first scan the list of instructions and we save the liveness info of @@ -2525,47 +2505,6 @@ mono_opcode_to_type (int opcode, int cmp_opcode) } } -#endif /* DISABLE_JIT */ - -gboolean -mono_is_regsize_var (MonoType *t) -{ - t = mini_get_underlying_type (t); - switch (t->type) { - case MONO_TYPE_I1: - case MONO_TYPE_U1: - case MONO_TYPE_I2: - case MONO_TYPE_U2: - case MONO_TYPE_I4: - case MONO_TYPE_U4: - case MONO_TYPE_I: - case MONO_TYPE_U: - case MONO_TYPE_PTR: - case MONO_TYPE_FNPTR: -#if SIZEOF_REGISTER == 8 - case MONO_TYPE_I8: - case MONO_TYPE_U8: -#endif - return TRUE; - case MONO_TYPE_OBJECT: - case MONO_TYPE_STRING: - case MONO_TYPE_CLASS: - case MONO_TYPE_SZARRAY: - case MONO_TYPE_ARRAY: - return TRUE; - case MONO_TYPE_GENERICINST: - if (!mono_type_generic_inst_is_valuetype (t)) - return TRUE; - return FALSE; - case MONO_TYPE_VALUETYPE: - return FALSE; - default: - return FALSE; - } -} - -#ifndef DISABLE_JIT - /* * mono_peephole_ins: * @@ -2697,6 +2636,19 @@ mono_peephole_ins (MonoBasicBlock *bb, MonoInst *ins) ins->sreg1 = last_ins->sreg1; } break; + case OP_LOADX_MEMBASE: + if (last_ins && last_ins->opcode == OP_STOREX_MEMBASE && + ins->inst_basereg == last_ins->inst_destbasereg && + ins->inst_offset == last_ins->inst_offset) { + if (ins->dreg == last_ins->sreg1) { + MONO_DELETE_INS (bb, ins); + break; + } else { + ins->opcode = OP_XMOVE; + ins->sreg1 = last_ins->sreg1; + } + } + break; case OP_MOVE: case OP_FMOVE: /* @@ -2815,3 +2767,40 @@ mono_regstate_free (MonoRegState *rs) { } #endif /* DISABLE_JIT */ + +gboolean +mono_is_regsize_var (MonoType *t) +{ + t = mini_get_underlying_type (t); + switch (t->type) { + case MONO_TYPE_I1: + case MONO_TYPE_U1: + case MONO_TYPE_I2: + case MONO_TYPE_U2: + case MONO_TYPE_I4: + case MONO_TYPE_U4: + case MONO_TYPE_I: + case MONO_TYPE_U: + case MONO_TYPE_PTR: + case MONO_TYPE_FNPTR: +#if SIZEOF_REGISTER == 8 + case MONO_TYPE_I8: + case MONO_TYPE_U8: +#endif + return TRUE; + case MONO_TYPE_OBJECT: + case MONO_TYPE_STRING: + case MONO_TYPE_CLASS: + case MONO_TYPE_SZARRAY: + case MONO_TYPE_ARRAY: + return TRUE; + case MONO_TYPE_GENERICINST: + if (!mono_type_generic_inst_is_valuetype (t)) + return TRUE; + return FALSE; + case MONO_TYPE_VALUETYPE: + return FALSE; + default: + return FALSE; + } +}