hold the register cost component of constant_pool_entries_cost.
(fold_rtx): Calculate constant_pool_entries_regcost at the same
time as constant_pool_entries_cost.
(cse_insn): Set both src_folded_cost and src_folded_regcost from
constant_pool_entries_cost and constant_pool_entries_regcost.
(cse_main): Initialize constant_pool_entries_regcost to zero.
* optabs.c (expand_unop): Attach a REG_EQUAL note describing
the semantics of the sequence of bit operations used to negate
a floating-point value.
(expand_abs_nojump): Likewise attach a REG_EQUAL note describing
the semantics of the bit operations used to abs a floating point
value.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@72326
138bc75d-0d04-0410-961f-
82ee72b054a4
+2003-10-10 Roger Sayle <roger@eyesopen.com>
+
+ * cse.c (constant_pool_entries_regcost): New global variable to
+ hold the register cost component of constant_pool_entries_cost.
+ (fold_rtx): Calculate constant_pool_entries_regcost at the same
+ time as constant_pool_entries_cost.
+ (cse_insn): Set both src_folded_cost and src_folded_regcost from
+ constant_pool_entries_cost and constant_pool_entries_regcost.
+ (cse_main): Initialize constant_pool_entries_regcost to zero.
+
+ * optabs.c (expand_unop): Attach a REG_EQUAL note describing
+ the semantics of the sequence of bit operations used to negate
+ a floating-point value.
+ (expand_abs_nojump): Likewise attach a REG_EQUAL note describing
+ the semantics of the bit operations used to abs a floating point
+ value.
+
2003-10-11 Bernardo Innocenti <bernie@develer.com>
Paul Dale <pauli@snapgear.com>
the insn. */
static int constant_pool_entries_cost;
+static int constant_pool_entries_regcost;
/* This data describes a block that will be processed by cse_basic_block. */
rtx new;
if (CONSTANT_P (constant) && GET_CODE (constant) != CONST_INT)
- constant_pool_entries_cost = COST (constant);
+ {
+ constant_pool_entries_cost = COST (constant);
+ constant_pool_entries_regcost = approx_reg_cost (constant);
+ }
/* If we are loading the full constant, we have an equivalence. */
if (offset == 0 && mode == const_mode)
src_folded_force_flag = 1;
src_folded = trial;
src_folded_cost = constant_pool_entries_cost;
+ src_folded_regcost = constant_pool_entries_regcost;
}
}
cse_jumps_altered = 0;
recorded_label_ref = 0;
constant_pool_entries_cost = 0;
+ constant_pool_entries_regcost = 0;
val.path_size = 0;
init_recog ();
immed_double_const (lo, hi, imode),
NULL_RTX, 1, OPTAB_LIB_WIDEN);
if (temp != 0)
- return gen_lowpart (mode, temp);
+ {
+ rtx insn;
+ if (target == 0)
+ target = gen_reg_rtx (mode);
+ insn = emit_move_insn (target, gen_lowpart (mode, temp));
+ set_unique_reg_note (insn, REG_EQUAL,
+ gen_rtx_fmt_e (NEG, mode,
+ copy_rtx (op0)));
+ return target;
+ }
delete_insns_since (last);
}
}
immed_double_const (~lo, ~hi, imode),
NULL_RTX, 1, OPTAB_LIB_WIDEN);
if (temp != 0)
- return gen_lowpart (mode, temp);
+ {
+ rtx insn;
+ if (target == 0)
+ target = gen_reg_rtx (mode);
+ insn = emit_move_insn (target, gen_lowpart (mode, temp));
+ set_unique_reg_note (insn, REG_EQUAL,
+ gen_rtx_fmt_e (ABS, mode,
+ copy_rtx (op0)));
+ return target;
+ }
delete_insns_since (last);
}
}