X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Farm%2Farm_transform.c;h=0921fd06b036095f98d1921f8362c1dba228f47a;hb=fcb579b8959da1d7563b1a7b9f008a423ffdf75a;hp=2be1c7b781a592ba9912fca8796a157174b9d808;hpb=e9108915391c863aec1915afc570f6937cd09526;p=libfirm diff --git a/ir/be/arm/arm_transform.c b/ir/be/arm/arm_transform.c index 2be1c7b78..0921fd06b 100644 --- a/ir/be/arm/arm_transform.c +++ b/ir/be/arm/arm_transform.c @@ -89,8 +89,7 @@ static ir_node *create_mov_node(dbg_info *dbg, ir_node *block, long value) { if (mode_needs_gp_reg(mode)) mode = mode_Iu; res = new_rd_arm_Mov_i(dbg, irg, block, mode, value); - /* ensure the const is scheduled AFTER the stack frame */ - add_irn_dep(res, get_irg_frame(irg)); + be_dep_on_frame(res); return res; } @@ -105,8 +104,7 @@ static ir_node *create_mvn_node(dbg_info *dbg, ir_node *block, long value) { if (mode_needs_gp_reg(mode)) mode = mode_Iu; res = new_rd_arm_Mvn_i(dbg, irg, block, mode, value); - /* ensure the const is scheduled AFTER the stack frame */ - add_irn_dep(res, get_irg_frame(irg)); + be_dep_on_frame(res); return res; } @@ -224,11 +222,11 @@ static ir_node *gen_Conv(ir_node *node) { } } else if (USE_VFP(env_cg->isa)) { - panic("VFP not supported yet\n"); + panic("VFP not supported yet"); return NULL; } else { - panic("Softfloat not supported yet\n"); + panic("Softfloat not supported yet"); return NULL; } } @@ -264,7 +262,7 @@ static ir_node *gen_Conv(ir_node *node) { return gen_zero_extension(dbg, block, new_op, min_bits); } } else { - panic("Cannot handle Conv %+F->%+F with %d->%d bits\n", src_mode, dst_mode, + panic("Cannot handle Conv %+F->%+F with %d->%d bits", src_mode, dst_mode, src_bits, dst_bits); return NULL; } @@ -317,11 +315,11 @@ static ir_node *gen_Add(ir_node *node) { return new_rd_arm_fpaAdf(dbg, irg, block, new_op1, new_op2, mode); } else if (USE_VFP(env_cg->isa)) { assert(mode != mode_E && "IEEE Extended FP not supported"); - panic("VFP not supported yet\n"); + panic("VFP not supported yet"); return NULL; } else { - panic("Softfloat not supported yet\n"); + panic("Softfloat not supported yet"); return NULL; } } else { @@ -393,11 +391,11 @@ static ir_node *gen_Mul(ir_node *node) { } else if (USE_VFP(env_cg->isa)) { assert(mode != mode_E && "IEEE Extended FP not supported"); - panic("VFP not supported yet\n"); + panic("VFP not supported yet"); return NULL; } else { - panic("Softfloat not supported yet\n"); + panic("Softfloat not supported yet"); return NULL; } } @@ -432,10 +430,10 @@ static ir_node *gen_Quot(ir_node *node) { return new_rd_arm_fpaDvf(dbg, current_ir_graph, block, new_op1, new_op2, mode); } else if (USE_VFP(env_cg->isa)) { assert(mode != mode_E && "IEEE Extended FP not supported"); - panic("VFP not supported yet\n"); + panic("VFP not supported yet"); } else { - panic("Softfloat not supported yet\n"); + panic("Softfloat not supported yet"); return NULL; } } @@ -526,11 +524,11 @@ static ir_node *gen_Sub(ir_node *node) { return new_rd_arm_fpaSuf(dbg, irg, block, new_op1, new_op2, mode); } else if (USE_VFP(env_cg->isa)) { assert(mode != mode_E && "IEEE Extended FP not supported"); - panic("VFP not supported yet\n"); + panic("VFP not supported yet"); return NULL; } else { - panic("Softfloat not supported yet\n"); + panic("Softfloat not supported yet"); return NULL; } } @@ -759,10 +757,10 @@ static ir_node *gen_Abs(ir_node *node) { return new_rd_arm_fpaAbs(dbg, current_ir_graph, block, new_op, mode); else if (USE_VFP(env_cg->isa)) { assert(mode != mode_E && "IEEE Extended FP not supported"); - panic("VFP not supported yet\n"); + panic("VFP not supported yet"); } else { - panic("Softfloat not supported yet\n"); + panic("Softfloat not supported yet"); } } assert(mode_is_data(mode)); @@ -788,10 +786,10 @@ static ir_node *gen_Minus(ir_node *node) { return new_rd_arm_fpaMvf(dbg, current_ir_graph, block, op, mode); else if (USE_VFP(env_cg->isa)) { assert(mode != mode_E && "IEEE Extended FP not supported"); - panic("VFP not supported yet\n"); + panic("VFP not supported yet"); } else { - panic("Softfloat not supported yet\n"); + panic("Softfloat not supported yet"); } } assert(mode_is_data(mode)); @@ -821,10 +819,10 @@ static ir_node *gen_Load(ir_node *node) { new_load = new_rd_arm_fpaLdf(dbg, irg, block, new_ptr, new_mem, mode); else if (USE_VFP(env_cg->isa)) { assert(mode != mode_E && "IEEE Extended FP not supported"); - panic("VFP not supported yet\n"); + panic("VFP not supported yet"); } else { - panic("Softfloat not supported yet\n"); + panic("Softfloat not supported yet"); } } else { @@ -843,7 +841,7 @@ static ir_node *gen_Load(ir_node *node) { new_load = new_rd_arm_Load(dbg, irg, block, new_ptr, new_mem); break; default: - panic("mode size not supported\n"); + panic("mode size not supported"); } } else { /* zero extended loads */ @@ -858,7 +856,7 @@ static ir_node *gen_Load(ir_node *node) { new_load = new_rd_arm_Load(dbg, irg, block, new_ptr, new_mem); break; default: - panic("mode size not supported\n"); + panic("mode size not supported"); } } } @@ -868,7 +866,7 @@ static ir_node *gen_Load(ir_node *node) { if (be_get_Proj_for_pn(node, pn_Load_res) == NULL) { /* add a result proj and a Keep to produce a pseudo use */ ir_node *proj = new_r_Proj(irg, block, new_load, mode_Iu, pn_arm_Load_res); - be_new_Keep(arch_get_irn_reg_class(env_cg->arch_env, proj, -1), irg, block, 1, &proj); + be_new_Keep(arch_get_irn_reg_class(proj, -1), irg, block, 1, &proj); } return new_load; @@ -898,9 +896,9 @@ static ir_node *gen_Store(ir_node *node) { new_store = new_rd_arm_fpaStf(dbg, irg, block, new_ptr, new_val, new_mem, mode); else if (USE_VFP(env_cg->isa)) { assert(mode != mode_E && "IEEE Extended FP not supported"); - panic("VFP not supported yet\n"); + panic("VFP not supported yet"); } else { - panic("Softfloat not supported yet\n"); + panic("Softfloat not supported yet"); } } else { assert(mode_is_data(mode) && "unsupported mode for Store"); @@ -935,9 +933,9 @@ static ir_node *gen_Cond(ir_node *node) { ir_node *op1 = get_Cmp_left(cmp_node); ir_node *new_op1 = be_transform_node(op1); ir_node *op2 = get_Cmp_right(cmp_node); - ir_node *new_op2 = be_transform_node(op2); if (mode_is_float(get_irn_mode(op1))) { + ir_node *new_op2 = be_transform_node(op2); /* floating point compare */ pn_Cmp pnc = get_Proj_proj(selector); @@ -947,8 +945,12 @@ static ir_node *gen_Cond(ir_node *node) { } /* Hmm: use need cmfe */ return new_rd_arm_fpaCmfeBra(dbg, irg, block, new_op1, new_op2, pnc); + } else if (is_Const(op2) && tarval_is_null(get_Const_tarval(op2))) { + /* compare with 0 */ + return new_rd_arm_TstBra(dbg, irg, block, new_op1, new_op1, get_Proj_proj(selector)); } else { /* integer compare */ + ir_node *new_op2 = be_transform_node(op2); return new_rd_arm_CmpBra(dbg, irg, block, new_op1, new_op2, get_Proj_proj(selector)); } } else { @@ -1073,16 +1075,15 @@ static ir_node *gen_Const(ir_node *node) { } else { node = new_rd_arm_fpaConst(dbg, irg, block, tv); } - /* ensure the const is scheduled AFTER the stack frame */ - add_irn_dep(node, get_irg_frame(irg)); + be_dep_on_frame(node); return node; } else if (USE_VFP(env_cg->isa)) { assert(mode != mode_E && "IEEE Extended FP not supported"); - panic("VFP not supported yet\n"); + panic("VFP not supported yet"); } else { - panic("Softfloat not supported yet\n"); + panic("Softfloat not supported yet"); } } return create_const_graph(node, block); @@ -1101,8 +1102,7 @@ static ir_node *gen_SymConst(ir_node *node) { ir_node *res; res = new_rd_arm_SymConst(dbg, irg, block, mode, get_sc_ident(node)); - /* ensure the const is scheduled AFTER the stack frame */ - add_irn_dep(res, get_irg_frame(irg)); + be_dep_on_frame(res); return res; } @@ -1319,8 +1319,7 @@ static ir_node *gen_Proj_Load(ir_node *node) { default: break; } - assert(0); - return new_rd_Unknown(irg, get_irn_mode(node)); + panic("Unsupported Proj from Load"); } /** @@ -1332,7 +1331,6 @@ static ir_node *gen_Proj_CopyB(ir_node *node) { ir_node *new_pred = be_transform_node(pred); ir_graph *irg = current_ir_graph; dbg_info *dbgi = get_irn_dbg_info(node); - ir_mode *mode = get_irn_mode(node); long proj = get_Proj_proj(node); switch(proj) { @@ -1344,8 +1342,7 @@ static ir_node *gen_Proj_CopyB(ir_node *node) { default: break; } - assert(0); - return new_rd_Unknown(irg, mode); + panic("Unsupported Proj from CopyB"); } /** @@ -1386,8 +1383,7 @@ static ir_node *gen_Proj_Quot(ir_node *node) { default: break; } - assert(0); - return new_rd_Unknown(irg, mode); + panic("Unsupported Proj from Quot"); } /** @@ -1404,7 +1400,7 @@ static ir_node *gen_Proj_be_AddSP(ir_node *node) { if (proj == pn_be_AddSP_sp) { ir_node *res = new_rd_Proj(dbgi, irg, block, new_pred, mode_Iu, pn_arm_SubSPandCopy_stack); - arch_set_irn_register(env_cg->arch_env, res, &arm_gp_regs[REG_SP]); + arch_set_irn_register(res, &arm_gp_regs[REG_SP]); return res; } else if(proj == pn_be_AddSP_res) { return new_rd_Proj(dbgi, irg, block, new_pred, mode_Iu, @@ -1412,9 +1408,7 @@ static ir_node *gen_Proj_be_AddSP(ir_node *node) { } else if (proj == pn_be_AddSP_M) { return new_rd_Proj(dbgi, irg, block, new_pred, mode_M, pn_arm_SubSPandCopy_M); } - - assert(0); - return new_rd_Unknown(irg, get_irn_mode(node)); + panic("Unsupported Proj from AddSP"); } /** @@ -1431,14 +1425,12 @@ static ir_node *gen_Proj_be_SubSP(ir_node *node) { if (proj == pn_be_SubSP_sp) { ir_node *res = new_rd_Proj(dbgi, irg, block, new_pred, mode_Iu, pn_arm_AddSP_stack); - arch_set_irn_register(env_cg->arch_env, res, &arm_gp_regs[REG_SP]); + arch_set_irn_register(res, &arm_gp_regs[REG_SP]); return res; } else if (proj == pn_be_SubSP_M) { return new_rd_Proj(dbgi, irg, block, new_pred, mode_M, pn_arm_AddSP_M); } - - assert(0); - return new_rd_Unknown(irg, get_irn_mode(node)); + panic("Unsupported Proj from SubSP"); } /** @@ -1446,7 +1438,7 @@ static ir_node *gen_Proj_be_SubSP(ir_node *node) { */ static ir_node *gen_Proj_Cmp(ir_node *node) { (void) node; - panic("Psi NYI\n"); + panic("Mux NYI"); } @@ -1474,8 +1466,7 @@ static ir_node *gen_Proj(ir_node *node) { if (proj == pn_Store_M) { return be_transform_node(pred); } else { - assert(0); - return new_r_Bad(irg); + panic("Unsupported Proj from Store"); } } else if (is_Load(pred)) { return gen_Proj_Load(node); @@ -1489,7 +1480,7 @@ static ir_node *gen_Proj(ir_node *node) { return gen_Proj_be_AddSP(node); } else if (is_Cmp(pred)) { return gen_Proj_Cmp(node); - } else if (get_irn_op(pred) == op_Start) { + } else if (is_Start(pred)) { if (proj == pn_Start_X_initial_exec) { ir_node *block = get_nodes_block(pred); ir_node *jump; @@ -1532,7 +1523,7 @@ static INLINE ir_node *create_const(ir_node **place, block = get_irg_start_block(env_cg->irg); res = func(NULL, env_cg->irg, block); - arch_set_irn_register(env_cg->arch_env, res, reg); + arch_set_irn_register(res, reg); *place = res; add_irn_dep(get_irg_end(env_cg->irg), res); @@ -1595,7 +1586,6 @@ static ir_node *gen_Phi(ir_node *node) { copy_node_attr(node, phi); be_duplicate_deps(node, phi); - be_set_transformed_node(node, phi); be_enqueue_preds(node); return phi; @@ -1615,7 +1605,7 @@ static ir_node *gen_Phi(ir_node *node) { * the BAD transformer. */ static ir_node *bad_transform(ir_node *irn) { - panic("ARM backend: Not implemented: %+F\n", irn); + panic("ARM backend: Not implemented: %+F", irn); return irn; } @@ -1668,8 +1658,7 @@ static void arm_register_transformers(void) { BAD(ASM); /* unsupported yet */ GEN(CopyB); - BAD(Mux); - BAD(Psi); /* unsupported yet */ + BAD(Mux); /* unsupported yet */ GEN(Proj); GEN(Phi); @@ -1719,8 +1708,9 @@ static void arm_register_transformers(void) { /** * Pre-transform all unknown nodes. */ -static void arm_pretransform_node(void *arch_cg) { - arm_code_gen_t *cg = arch_cg; +static void arm_pretransform_node(void) +{ + arm_code_gen_t *cg = env_cg; cg->unknown_gp = be_pre_transform_node(cg->unknown_gp); cg->unknown_fpa = be_pre_transform_node(cg->unknown_fpa); @@ -1771,7 +1761,7 @@ void arm_transform_graph(arm_code_gen_t *cg) { } arm_register_transformers(); env_cg = cg; - be_transform_graph(cg->birg, arm_pretransform_node, cg); + be_transform_graph(cg->birg, arm_pretransform_node); } void arm_init_transform(void) {