if(mode_is_float(mode)) {
int size;
ir_entity *entity;
+ ir_mode *op_mode = get_ia32_ls_mode(irn);
res = new_rd_ia32_xXor(dbg, irg, block, noreg, noreg, in2, noreg_fp, nomem);
- size = get_mode_size_bits(mode);
+ size = get_mode_size_bits(op_mode);
entity = ia32_gen_fp_known_const(size == 32 ? ia32_SSIGN : ia32_DSIGN);
set_ia32_am_sc(res, entity);
set_ia32_op_type(res, ia32_AddrModeS);
- set_ia32_ls_mode(res, get_ia32_ls_mode(irn));
+ set_ia32_ls_mode(res, op_mode);
} else {
res = new_rd_ia32_Neg(dbg, irg, block, in2);
}
}
#endif
op1 = base;
- if(cg->isa->opt & IA32_OPT_INCDEC) {
- if(is_am_one(node)) {
- goto make_inc;
- }
- if(is_am_minus_one(node)) {
- goto make_dec;
- }
- }
- op2 = create_immediate_from_am(cg, node);
- goto make_add;
+ goto make_add_immediate;
}
if(scale == 0 && !has_immediates) {
op1 = base;
return;
} else if(out_reg == index_reg) {
if(base == NULL) {
- if(has_immediates && scale == 0) {
- op1 = index;
- if(cg->isa->opt & IA32_OPT_INCDEC) {
- if(is_am_one(node)) {
- goto make_inc;
- }
- if(is_am_minus_one(node)) {
- goto make_dec;
- }
- }
- op2 = create_immediate_from_am(cg, node);
- goto make_add;
- } else if(!has_immediates && scale > 0) {
- op1 = index;
- op2 = create_immediate_from_int(cg, scale);
- goto make_shl;
- } else if(!has_immediates) {
+ if(has_immediates && scale == 0) {
+ op1 = index;
+ goto make_add_immediate;
+ } else if(!has_immediates && scale > 0) {
+ op1 = index;
+ op2 = create_immediate_from_int(cg, scale);
+ goto make_shl;
+ } else if(!has_immediates) {
#ifdef DEBUG_libfirm
ir_fprintf(stderr, "Optimisation warning: found lea which is "
"just a copy\n");
#endif
- }
+ }
} else if(scale == 0 && !has_immediates) {
op1 = index;
op2 = base;
return;
}
+make_add_immediate:
+ if(cg->isa->opt & IA32_OPT_INCDEC) {
+ if(is_am_one(node)) {
+ dbgi = get_irn_dbg_info(node);
+ block = get_nodes_block(node);
+ res = new_rd_ia32_Inc(dbgi, irg, block, op1);
+ arch_set_irn_register(arch_env, res, out_reg);
+ goto exchange;
+ }
+ if(is_am_minus_one(node)) {
+ dbgi = get_irn_dbg_info(node);
+ block = get_nodes_block(node);
+ res = new_rd_ia32_Dec(dbgi, irg, block, op1);
+ arch_set_irn_register(arch_env, res, out_reg);
+ goto exchange;
+ }
+ }
+ op2 = create_immediate_from_am(cg, node);
+
make_add:
dbgi = get_irn_dbg_info(node);
block = get_nodes_block(node);
set_ia32_commutative(res);
goto exchange;
-make_inc:
- dbgi = get_irn_dbg_info(node);
- block = get_nodes_block(node);
- res = new_rd_ia32_Inc(dbgi, irg, block, op1);
- arch_set_irn_register(arch_env, res, out_reg);
- goto exchange;
-
-make_dec:
- dbgi = get_irn_dbg_info(node);
- block = get_nodes_block(node);
- res = new_rd_ia32_Dec(dbgi, irg, block, op1);
- arch_set_irn_register(arch_env, res, out_reg);
- goto exchange;
-
make_shl:
dbgi = get_irn_dbg_info(node);
block = get_nodes_block(node);