X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fmini-hppa.c;h=036bd1cb6c554c2135ccaea716a8e0ec43a18cf7;hb=568792876151c97e32fc7facc17ec4314915008a;hp=0043c12f6962343aa40752695b158fdd1d398efa;hpb=cc9fa96a3163b4ac0b2df0726c72963017d802d6;p=mono.git diff --git a/mono/mini/mini-hppa.c b/mono/mini/mini-hppa.c index 0043c12f696..036bd1cb6c5 100644 --- a/mono/mini/mini-hppa.c +++ b/mono/mini/mini-hppa.c @@ -36,7 +36,6 @@ #include #include "mini-hppa.h" -#include "inssel.h" #include "trace.h" #include "cpu-hppa.h" @@ -356,7 +355,7 @@ handle_enum: case MONO_TYPE_VALUETYPE: if (type->data.klass->enumtype) { - type = type->data.klass->enum_basetype; + type = mono_class_enum_basetype (type->data.klass); goto handle_enum; } /* Fall through */ @@ -701,7 +700,10 @@ mono_arch_call_opcode (MonoCompile *cfg, MonoBasicBlock* bb, MonoCallInst *call, arg->inst_left = in; arg->inst_call = call; arg->type = in->type; - MONO_INST_LIST_ADD_TAIL (&arg->node, &call->out_args); + + /* prepend, we'll need to reverse them later */ + arg->next = call->out_args; + call->out_args = arg; switch (ainfo->storage) { case ArgInIReg: @@ -750,6 +752,19 @@ mono_arch_call_opcode (MonoCompile *cfg, MonoBasicBlock* bb, MonoCallInst *call, } } + /* + * Reverse the call->out_args list. + */ + { + MonoInst *prev = NULL, *list = call->out_args, *next; + while (list) { + next = list->next; + list->next = prev; + prev = list; + list = next; + } + call->out_args = prev; + } call->stack_usage = cinfo->stack_usage; cfg->param_area = MAX (cfg->param_area, call->stack_usage); cfg->param_area = ALIGN_TO (cfg->param_area, MONO_ARCH_FRAME_ALIGNMENT); @@ -774,10 +789,23 @@ mono_arch_peephole_pass_2 (MonoCompile *cfg, MonoBasicBlock *bb) DEBUG_FUNC_EXIT(); } -#define NEW_INS(cfg,ins,dest,op) do { \ +static void +insert_after_ins (MonoBasicBlock *bb, MonoInst *ins, MonoInst *to_insert) +{ + if (ins == NULL) { + ins = bb->code; + bb->code = to_insert; + to_insert->next = ins; + } else { + to_insert->next = ins->next; + ins->next = to_insert; + } +} + +#define NEW_INS(cfg,dest,op) do { \ (dest) = mono_mempool_alloc0 ((cfg)->mempool, sizeof (MonoInst)); \ (dest)->opcode = (op); \ - MONO_INST_LIST_ADD_TAIL (&(dest)->node, &(ins)->node); \ + insert_after_ins (bb, last_ins, (dest)); \ } while (0) static int @@ -856,22 +884,18 @@ map_to_reg_reg_op (int op) void mono_arch_lowering_pass (MonoCompile *cfg, MonoBasicBlock *bb) { - MonoInst *ins, *next, *temp, *temp2; + MonoInst *ins, *next, *temp, *last_ins = NULL; int imm; - /* setup the virtual reg allocator */ - if (bb->max_vreg > cfg->rs->next_vreg) - cfg->rs->next_vreg = bb->max_vreg; - MONO_BB_FOR_EACH_INS (bb, ins) { loop_start: switch (ins->opcode) { case OP_ADD_IMM: case OP_ADDCC_IMM: if (!hppa_check_bits (ins->inst_imm, 11)) { - NEW_INS (cfg, ins, temp, OP_ICONST); + NEW_INS (cfg, temp, OP_ICONST); temp->inst_c0 = ins->inst_imm; - temp->dreg = mono_regstate_next_int (cfg->rs); + temp->dreg = mono_alloc_ireg (cfg); ins->sreg2 = temp->dreg; ins->opcode = map_to_reg_reg_op (ins->opcode); } @@ -879,9 +903,9 @@ loop_start: case OP_SUB_IMM: case OP_SUBCC_IMM: if (!hppa_check_bits (ins->inst_imm, 11)) { - NEW_INS (cfg, ins, temp, OP_ICONST); + NEW_INS (cfg, temp, OP_ICONST); temp->inst_c0 = ins->inst_imm; - temp->dreg = mono_regstate_next_int (cfg->rs); + temp->dreg = mono_alloc_ireg (cfg); ins->sreg2 = temp->dreg; ins->opcode = map_to_reg_reg_op (ins->opcode); } @@ -904,8 +928,8 @@ loop_start: break; } else { - int tmp = mono_regstate_next_int (cfg->rs); - NEW_INS (cfg, ins, temp, OP_ICONST); + int tmp = mono_alloc_ireg (cfg); + NEW_INS (cfg, temp, OP_ICONST); temp->inst_c0 = ins->inst_c0; temp->dreg = tmp; @@ -917,38 +941,38 @@ loop_start: break; case CEE_MUL: { - int freg1 = mono_regstate_next_float (cfg->rs); - int freg2 = mono_regstate_next_float (cfg->rs); + int freg1 = mono_alloc_freg (cfg); + int freg2 = mono_alloc_freg (cfg); - NEW_INS(cfg, ins, temp, OP_STORE_MEMBASE_REG); + NEW_INS(cfg, temp, OP_STORE_MEMBASE_REG); temp->sreg1 = ins->sreg1; temp->inst_destbasereg = hppa_sp; temp->inst_offset = -16; - NEW_INS(cfg, temp, temp2, OP_LOADR4_MEMBASE); - temp2->dreg = freg1; - temp2->inst_basereg = hppa_sp; - temp2->inst_offset = -16; + NEW_INS(cfg, temp, OP_LOADR4_MEMBASE); + temp->dreg = freg1; + temp->inst_basereg = hppa_sp; + temp->inst_offset = -16; - NEW_INS(cfg, temp2, temp, OP_STORE_MEMBASE_REG); + NEW_INS(cfg, temp, OP_STORE_MEMBASE_REG); temp->sreg1 = ins->sreg2; temp->inst_destbasereg = hppa_sp; temp->inst_offset = -16; - NEW_INS(cfg, temp, temp2, OP_LOADR4_MEMBASE); - temp2->dreg = freg2; - temp2->inst_basereg = hppa_sp; - temp2->inst_offset = -16; + NEW_INS(cfg, temp, OP_LOADR4_MEMBASE); + temp->dreg = freg2; + temp->inst_basereg = hppa_sp; + temp->inst_offset = -16; - NEW_INS (cfg, temp2, temp, OP_HPPA_XMPYU); + NEW_INS (cfg, temp, OP_HPPA_XMPYU); temp->dreg = freg2; temp->sreg1 = freg1; temp->sreg2 = freg2; - NEW_INS(cfg, temp, temp2, OP_HPPA_STORER4_RIGHT); - temp2->sreg1 = freg2; - temp2->inst_destbasereg = hppa_sp; - temp2->inst_offset = -16; + NEW_INS(cfg, temp, OP_HPPA_STORER4_RIGHT); + temp->sreg1 = freg2; + temp->inst_destbasereg = hppa_sp; + temp->inst_offset = -16; ins->opcode = OP_LOAD_MEMBASE; ins->inst_basereg = hppa_sp; @@ -959,8 +983,10 @@ loop_start: default: break; } + last_ins = ins; } - bb->max_vreg = cfg->rs->next_vreg; + bb->last_ins = last_ins; + bb->max_vreg = cfg->next_vreg; } @@ -1221,6 +1247,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) MonoCallInst *call; guint offset; guint32 *code = (guint32*)(cfg->native_code + cfg->code_len); + MonoInst *last_ins = NULL; int max_len, cpos; const char *spec; @@ -1256,6 +1283,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) mono_debug_record_line_number (cfg, ins, offset); switch (ins->opcode) { + case OP_RELAXED_NOP: + break; case OP_STOREI1_MEMBASE_IMM: EMIT_STORE_MEMBASE_IMM (ins, stb); break; @@ -1695,6 +1724,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) break; case OP_BR: { guint32 target; + DEBUG (printf ("target: %p, next: %p, curr: %p, last: %p\n", ins->inst_target_bb, bb->next_bb, ins, bb->last_ins)); if (ins->flags & MONO_INST_BRLABEL) { mono_add_patch_info (cfg, offset, MONO_PATCH_INFO_LABEL, ins->inst_i0); } else { @@ -2010,6 +2040,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) } cpos += max_len; + + last_ins = ins; } cfg->code_len = (guint8*)code - cfg->native_code; @@ -2281,13 +2313,13 @@ mono_arch_emit_prolog (MonoCompile *cfg) */ max_offset = 0; for (bb = cfg->bb_entry; bb; bb = bb->next_bb) { - MonoInst *ins; + MonoInst *ins = bb->code; bb->max_offset = max_offset; if (cfg->prof_options & MONO_PROFILE_COVERAGE) max_offset += 6; - MONO_BB_FOR_EACH_INS (bb, ins) { + MONO_BB_FOR_EACH_INS (bb, ins) max_offset += ((guint8 *)ins_get_spec (ins->opcode))[MONO_INST_LEN]; } @@ -2835,7 +2867,7 @@ mono_arch_emit_this_vret_args (MonoCompile *cfg, MonoCallInst *inst, int this_re MONO_INST_NEW (cfg, this, OP_MOVE); this->type = this_type; this->sreg1 = this_reg; - this->dreg = mono_regstate_next_int (cfg->rs); + this->dreg = mono_alloc_ireg (cfg); mono_bblock_add_inst (cfg->cbb, this); mono_call_inst_add_outarg_reg (cfg, inst, this->dreg, hppa_r26, FALSE); } @@ -2845,7 +2877,7 @@ mono_arch_emit_this_vret_args (MonoCompile *cfg, MonoCallInst *inst, int this_re MONO_INST_NEW (cfg, vtarg, OP_MOVE); vtarg->type = STACK_MP; vtarg->sreg1 = vt_reg; - vtarg->dreg = mono_regstate_next_int (cfg->rs); + vtarg->dreg = mono_alloc_ireg (cfg); mono_bblock_add_inst (cfg->cbb, vtarg); mono_call_inst_add_outarg_reg (cfg, inst, vtarg->dreg, hppa_r28, FALSE); }