X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fmini-hppa.c;h=036bd1cb6c554c2135ccaea716a8e0ec43a18cf7;hb=568792876151c97e32fc7facc17ec4314915008a;hp=cd996ef7fc14bfb0877bc6d8a9cb407705b59142;hpb=e9c2c148200f6e589c569c9cf9277e603520dbfe;p=mono.git diff --git a/mono/mini/mini-hppa.c b/mono/mini/mini-hppa.c index cd996ef7fc1..036bd1cb6c5 100644 --- a/mono/mini/mini-hppa.c +++ b/mono/mini/mini-hppa.c @@ -36,11 +36,9 @@ #include #include "mini-hppa.h" -#include "inssel.h" #include "trace.h" #include "cpu-hppa.h" -#define NOT_IMPLEMENTED do { g_assert_not_reached (); } while (0) #define ALIGN_TO(val,align) (((val) + ((align) - 1)) & ~((align) - 1)) #define SIGNAL_STACK_SIZE (64 * 1024) @@ -357,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 */ @@ -702,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: @@ -751,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); @@ -763,17 +777,35 @@ mono_arch_call_opcode (MonoCompile *cfg, MonoBasicBlock* bb, MonoCallInst *call, return call; } -static void -peephole_pass (MonoCompile *cfg, MonoBasicBlock *bb) +void +mono_arch_peephole_pass_1 (MonoCompile *cfg, MonoBasicBlock *bb) +{ +} + +void +mono_arch_peephole_pass_2 (MonoCompile *cfg, MonoBasicBlock *bb) { DEBUG_FUNC_ENTER(); 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 @@ -849,25 +881,21 @@ map_to_reg_reg_op (int op) * represented with very simple instructions with no register * requirements. */ -static void +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_INST_LIST_FOR_EACH_ENTRY (ins, &bb->ins_list, node) { + 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); } @@ -875,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); } @@ -900,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; @@ -913,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; @@ -955,22 +983,13 @@ 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; } -void -mono_arch_local_regalloc (MonoCompile *cfg, MonoBasicBlock *bb) -{ - DEBUG_FUNC_ENTER(); - if (MONO_INST_LIST_EMPTY (&bb->ins_list)) - return; - mono_arch_lowering_pass (cfg, bb); - mono_local_regalloc (cfg, bb); - DEBUG_FUNC_EXIT(); -} - void hppa_patch (guint32 *code, const gpointer target) { @@ -1228,12 +1247,11 @@ 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; DEBUG_FUNC_ENTER(); - if (cfg->opt & MONO_OPT_PEEPHOLE) - peephole_pass (cfg, bb); if (cfg->verbose_level > 2) g_print ("[%s::%s] Basic block %d starting at offset 0x%x\n", cfg->method->klass->name, cfg->method->name, bb->block_num, bb->native_offset); @@ -1244,7 +1262,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) NOT_IMPLEMENTED; } - MONO_INST_LIST_FOR_EACH_ENTRY (ins, &bb->ins_list, node) { + MONO_BB_FOR_EACH_INS (bb, ins) { guint8* code_start; offset = (guint8*)code - cfg->native_code; @@ -1265,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; @@ -1285,11 +1305,6 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) case OP_STOREI4_MEMBASE_REG: EMIT_STORE_MEMBASE_REG (ins, stw); break; - case CEE_LDIND_I: - case CEE_LDIND_I4: - case CEE_LDIND_U4: - NOT_IMPLEMENTED; - break; case OP_LOADU1_MEMBASE: EMIT_LOAD_MEMBASE (ins, ldb); break; @@ -1325,7 +1340,6 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) case CEE_CONV_I4: case CEE_CONV_U4: case OP_MOVE: - case OP_SETREG: if (ins->sreg1 != ins->dreg) hppa_copy (code, ins->sreg1, ins->dreg); break; @@ -1540,7 +1554,6 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) g_warning ("unimplemented opcode %s in %s()\n", mono_inst_name (ins->opcode), __FUNCTION__); NOT_IMPLEMENTED; break; - case OP_SETFREG: case OP_FMOVE: if (ins->sreg1 != ins->dreg) hppa_fcpy (code, HPPA_FP_FMT_DBL, ins->sreg1, ins->dreg); @@ -1573,7 +1586,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) case OP_LCALL: case OP_VCALL: case OP_VOIDCALL: - case CEE_CALL: + case OP_CALL: call = (MonoCallInst*)ins; if (ins->flags & MONO_INST_HAS_METHOD) mono_add_patch_info (cfg, offset, MONO_PATCH_INFO_METHOD, call->method); @@ -1711,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 { @@ -2026,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; @@ -2297,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_INST_LIST_FOR_EACH_ENTRY (ins, &bb->ins_list, node) + MONO_BB_FOR_EACH_INS (bb, ins) max_offset += ((guint8 *)ins_get_spec (ins->opcode))[MONO_INST_LEN]; } @@ -2848,20 +2864,20 @@ mono_arch_emit_this_vret_args (MonoCompile *cfg, MonoCallInst *inst, int this_re /* add the this argument */ if (this_reg != -1) { MonoInst *this; - MONO_INST_NEW (cfg, this, OP_SETREG); + 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); } if (vt_reg != -1) { MonoInst *vtarg; - MONO_INST_NEW (cfg, vtarg, OP_SETREG); + 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); } @@ -2875,14 +2891,6 @@ mono_arch_get_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethod DEBUG_FUNC_ENTER(); DEBUG_FUNC_EXIT(); -#if 0 - if (cmethod->klass == mono_defaults.thread_class && - strcmp (cmethod->name, "MemoryBarrier") == 0) { - if (sparcv9) - MONO_INST_NEW (cfg, ins, OP_MEMORY_BARRIER); - } -#endif - return ins; } @@ -2938,3 +2946,10 @@ MonoInst* mono_arch_get_thread_intrinsic (MonoCompile* cfg) { return NULL; } + +gpointer +mono_arch_context_get_int_reg (MonoContext *ctx, int reg) +{ + /* FIXME: implement */ + g_assert_not_reached (); +}