DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL;)
/**
- * Transforms a Sub or xSub into Neg--Add iff OUT_REG == SRC2_REG.
+ * Transforms a Sub or xSub into Neg--Add iff OUT_REG != SRC1_REG && OUT_REG == SRC2_REG.
* THIS FUNCTIONS MUST BE CALLED AFTER REGISTER ALLOCATION.
*/
static void ia32_transform_sub_to_neg_add(ir_node *irn, ia32_code_gen_t *cg)
in2_reg = arch_get_irn_register(in2);
out_reg = arch_irn_get_register(irn, 0);
- irg = cg->irg;
- block = get_nodes_block(irn);
+ if (out_reg == in1_reg)
+ return;
/* in case of sub and OUT == SRC2 we can transform the sequence into neg src2 -- add */
if (out_reg != in2_reg)
return;
- dbg = get_irn_dbg_info(irn);
+ irg = cg->irg;
+ block = get_nodes_block(irn);
+ dbg = get_irn_dbg_info(irn);
/* generate the neg src2 */
if (is_ia32_xSub(irn)) {
for (i = 0; i < 32; ++i) {
if (other & (1U << i)) return i;
}
- assert(! "same position not found");
- return 32;
-}
-
-static inline bool is_unknown_reg(const arch_register_t *reg)
-{
- if (reg == &ia32_gp_regs[REG_GP_UKNWN]
- || reg == &ia32_xmm_regs[REG_XMM_UKNWN]
- || reg == &ia32_vfp_regs[REG_VFP_UKNWN])
- return true;
-
- return false;
+ panic("same position not found");
}
/**
/* requirement already fulfilled? */
if (in_reg == out_reg)
continue;
- /* unknowns can be changed to any register we want on emitting */
- if (is_unknown_reg(in_reg))
- continue;
cls = arch_register_get_class(in_reg);
assert(cls == arch_register_get_class(out_reg));