X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fia32%2Fia32_finish.c;h=45f616b2c7e1c9f8525227da29363741bf8f45fa;hb=afa44cc5648401a50c08458622b50de4256498c2;hp=f5f40e1c7c4dc4eb1e50b945949736057cc3d3a6;hpb=bf4140e693b21024de13439a55d3c92a86958a3f;p=libfirm diff --git a/ir/be/ia32/ia32_finish.c b/ir/be/ia32/ia32_finish.c index f5f40e1c7..45f616b2c 100644 --- a/ir/be/ia32/ia32_finish.c +++ b/ir/be/ia32/ia32_finish.c @@ -4,6 +4,10 @@ * $Id$ */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + #include "irnode.h" #include "ircons.h" #include "irgmod.h" @@ -33,7 +37,7 @@ static void ia32_transform_sub_to_neg_add(ir_node *irn, ia32_code_gen_t *cg) { const arch_register_t *in1_reg, *in2_reg, *out_reg, **slots; /* Return if AM node or not a Sub or xSub */ - if (get_ia32_op_type(irn) != ia32_Normal || !(is_ia32_Sub(irn) || is_ia32_xSub(irn))) + if (!(is_ia32_Sub(irn) || is_ia32_xSub(irn)) || get_ia32_op_type(irn) != ia32_Normal) return; noreg = ia32_new_NoReg_gp(cg); @@ -101,9 +105,10 @@ static void ia32_transform_lea_to_add(ir_node *irn, ia32_code_gen_t *cg) { int imm = 0; ir_node *res = NULL; ir_node *nomem, *noreg, *base, *index, *op1, *op2; - char *offs; + const char *offs = NULL; ia32_transform_env_t tenv; const arch_register_t *out_reg, *base_reg, *index_reg; + int imm_tp = ia32_ImmConst; /* must be a LEA */ if (! is_ia32_Lea(irn)) @@ -125,11 +130,20 @@ static void ia32_transform_lea_to_add(ir_node *irn, ia32_code_gen_t *cg) { base = get_irn_n(irn, 0); index = get_irn_n(irn,1); - offs = get_ia32_am_offs(irn); + if (am_flav & ia32_O) { + offs = get_ia32_am_offs(irn); + + if (! offs) { + ident *id = get_ia32_am_sc(irn); - /* offset has a explicit sign -> we need to skip + */ - if (offs && offs[0] == '+') - offs++; + assert(id != NULL); + offs = get_id_str(id); + imm_tp = ia32_ImmSymConst; + } + /* offset has a explicit sign -> we need to skip + */ + else if (offs[0] == '+') + offs++; + } out_reg = arch_get_irn_register(cg->arch_env, irn); base_reg = arch_get_irn_register(cg->arch_env, base); @@ -193,7 +207,7 @@ static void ia32_transform_lea_to_add(ir_node *irn, ia32_code_gen_t *cg) { if (imm) { set_ia32_cnst(res, offs); - set_ia32_immop_type(res, ia32_ImmConst); + set_ia32_immop_type(res, imm_tp); } SET_IA32_ORIG_NODE(res, ia32_get_old_node_name(cg, irn)); @@ -330,6 +344,7 @@ insert_copy: we have to change it, as CMP doesn't support immediate as left operands. */ +#if 0 if ((is_ia32_CondJmp(irn) || is_ia32_CmpSet(irn) || is_ia32_xCmpSet(irn)) && (is_ia32_ImmConst(irn) || is_ia32_ImmSymConst(irn)) && op_tp == ia32_AddrModeS) @@ -337,6 +352,7 @@ insert_copy: set_ia32_op_type(irn, ia32_AddrModeD); set_ia32_pncode(irn, get_inversed_pnc(get_ia32_pncode(irn))); } +#endif } end: ; } @@ -359,6 +375,9 @@ static void fix_am_source(ir_node *irn, void *env) { /* check only ia32 nodes with source address mode */ if (! is_ia32_irn(irn) || get_ia32_op_type(irn) != ia32_AddrModeS) return; + /* no need to fix unary operations */ + if (get_irn_arity(irn) == 4) + return; base = get_irn_n(irn, 0); index = get_irn_n(irn, 1); @@ -452,18 +471,14 @@ static void ia32_finish_irg_walker(ir_node *block, void *env) { for (irn = sched_first(block); ! sched_is_end(irn); irn = next) { ia32_code_gen_t *cg = env; - next = sched_next(irn); - if (is_ia32_irn(irn)) { - /* check if there is a sub which need to be transformed */ - ia32_transform_sub_to_neg_add(irn, cg); + next = sched_next(irn); - /* transform a LEA into an Add if possible */ - ia32_transform_lea_to_add(irn, cg); + /* check if there is a sub which need to be transformed */ + ia32_transform_sub_to_neg_add(irn, cg); - /* check for peephole optimization */ - ia32_peephole_optimization(irn, cg); - } + /* transform a LEA into an Add if possible */ + ia32_transform_lea_to_add(irn, cg); } /* second: insert copies and finish irg */