Commit 92355a9c by Paolo Bonzini Committed by Paolo Bonzini

expmed.c (emit_cstore, [...]): Accept target_mode instead of recomputing it.

2009-07-02  Paolo Bonzini  <bonzini@gnu.org>

	* expmed.c (emit_cstore, emit_store_flag_1): Accept target_mode
	instead of recomputing it.  Adjust calls.
	(emit_store_flag): Adjust recursive calls.

From-SVN: r149171
parent 91deb937
2009-07-02 Paolo Bonzini <bonzini@gnu.org>
* expmed.c (emit_cstore, emit_store_flag_1): Accept target_mode
instead of recomputing it. Adjust calls.
(emit_store_flag): Adjust recursive calls.
2009-07-02 Richard Guenther <rguenther@suse.de> 2009-07-02 Richard Guenther <rguenther@suse.de>
* tree-ssa-live.c (remove_unused_locals): Do not remove * tree-ssa-live.c (remove_unused_locals): Do not remove
......
...@@ -5128,10 +5128,10 @@ expand_and (enum machine_mode mode, rtx op0, rtx op1, rtx target) ...@@ -5128,10 +5128,10 @@ expand_and (enum machine_mode mode, rtx op0, rtx op1, rtx target)
static rtx static rtx
emit_cstore (rtx target, enum insn_code icode, enum rtx_code code, emit_cstore (rtx target, enum insn_code icode, enum rtx_code code,
enum machine_mode mode, enum machine_mode compare_mode, enum machine_mode mode, enum machine_mode compare_mode,
int unsignedp, rtx x, rtx y, int normalizep) int unsignedp, rtx x, rtx y, int normalizep,
enum machine_mode target_mode)
{ {
rtx op0, last, comparison, subtarget, pattern; rtx op0, last, comparison, subtarget, pattern;
enum machine_mode target_mode;
enum machine_mode result_mode = insn_data[(int) icode].operand[0].mode; enum machine_mode result_mode = insn_data[(int) icode].operand[0].mode;
last = get_last_insn (); last = get_last_insn ();
...@@ -5149,8 +5149,12 @@ emit_cstore (rtx target, enum insn_code icode, enum rtx_code code, ...@@ -5149,8 +5149,12 @@ emit_cstore (rtx target, enum insn_code icode, enum rtx_code code,
return NULL_RTX; return NULL_RTX;
} }
if (!target if (target_mode == VOIDmode)
|| optimize target_mode = result_mode;
if (!target)
target = gen_reg_rtx (target_mode);
if (optimize
|| !(insn_data[(int) icode].operand[0].predicate (target, result_mode))) || !(insn_data[(int) icode].operand[0].predicate (target, result_mode)))
subtarget = gen_reg_rtx (result_mode); subtarget = gen_reg_rtx (result_mode);
else else
...@@ -5161,10 +5165,6 @@ emit_cstore (rtx target, enum insn_code icode, enum rtx_code code, ...@@ -5161,10 +5165,6 @@ emit_cstore (rtx target, enum insn_code icode, enum rtx_code code,
return NULL_RTX; return NULL_RTX;
emit_insn (pattern); emit_insn (pattern);
if (!target)
target = gen_reg_rtx (GET_MODE (subtarget));
target_mode = GET_MODE (target);
/* If we are converting to a wider mode, first convert to /* If we are converting to a wider mode, first convert to
TARGET_MODE, then normalize. This produces better combining TARGET_MODE, then normalize. This produces better combining
opportunities on machines that have a SIGN_EXTRACT when we are opportunities on machines that have a SIGN_EXTRACT when we are
...@@ -5235,12 +5235,12 @@ emit_cstore (rtx target, enum insn_code icode, enum rtx_code code, ...@@ -5235,12 +5235,12 @@ emit_cstore (rtx target, enum insn_code icode, enum rtx_code code,
static rtx static rtx
emit_store_flag_1 (rtx target, enum rtx_code code, rtx op0, rtx op1, emit_store_flag_1 (rtx target, enum rtx_code code, rtx op0, rtx op1,
enum machine_mode mode, int unsignedp, int normalizep) enum machine_mode mode, int unsignedp, int normalizep,
enum machine_mode target_mode)
{ {
rtx subtarget; rtx subtarget;
enum insn_code icode; enum insn_code icode;
enum machine_mode compare_mode; enum machine_mode compare_mode;
enum machine_mode target_mode = target ? GET_MODE (target) : VOIDmode;
enum mode_class mclass; enum mode_class mclass;
enum rtx_code scode; enum rtx_code scode;
rtx tem; rtx tem;
...@@ -5337,8 +5337,10 @@ emit_store_flag_1 (rtx target, enum rtx_code code, rtx op0, rtx op1, ...@@ -5337,8 +5337,10 @@ emit_store_flag_1 (rtx target, enum rtx_code code, rtx op0, rtx op1,
if (tem) if (tem)
{ {
if (target_mode == VOIDmode) if (target_mode == VOIDmode || GET_MODE (tem) == target_mode)
return tem; return tem;
if (!target)
target = gen_reg_rtx (target_mode);
convert_move (target, tem, convert_move (target, tem,
0 == (STORE_FLAG_VALUE 0 == (STORE_FLAG_VALUE
...@@ -5404,14 +5406,14 @@ emit_store_flag_1 (rtx target, enum rtx_code code, rtx op0, rtx op1, ...@@ -5404,14 +5406,14 @@ emit_store_flag_1 (rtx target, enum rtx_code code, rtx op0, rtx op1,
{ {
do_pending_stack_adjust (); do_pending_stack_adjust ();
tem = emit_cstore (target, icode, code, mode, compare_mode, tem = emit_cstore (target, icode, code, mode, compare_mode,
unsignedp, op0, op1, normalizep); unsignedp, op0, op1, normalizep, target_mode);
if (tem) if (tem)
return tem; return tem;
if (GET_MODE_CLASS (mode) == MODE_FLOAT) if (GET_MODE_CLASS (mode) == MODE_FLOAT)
{ {
tem = emit_cstore (target, icode, scode, mode, compare_mode, tem = emit_cstore (target, icode, scode, mode, compare_mode,
unsignedp, op1, op0, normalizep); unsignedp, op1, op0, normalizep, target_mode);
if (tem) if (tem)
return tem; return tem;
} }
...@@ -5446,7 +5448,8 @@ emit_store_flag (rtx target, enum rtx_code code, rtx op0, rtx op1, ...@@ -5446,7 +5448,8 @@ emit_store_flag (rtx target, enum rtx_code code, rtx op0, rtx op1,
rtx subtarget; rtx subtarget;
rtx tem, last, trueval; rtx tem, last, trueval;
tem = emit_store_flag_1 (target, code, op0, op1, mode, unsignedp, normalizep); tem = emit_store_flag_1 (target, code, op0, op1, mode, unsignedp, normalizep,
target_mode);
if (tem) if (tem)
return tem; return tem;
...@@ -5499,7 +5502,7 @@ emit_store_flag (rtx target, enum rtx_code code, rtx op0, rtx op1, ...@@ -5499,7 +5502,7 @@ emit_store_flag (rtx target, enum rtx_code code, rtx op0, rtx op1,
|| (STORE_FLAG_VALUE == -1 && normalizep == 1)) || (STORE_FLAG_VALUE == -1 && normalizep == 1))
{ {
tem = emit_store_flag_1 (subtarget, rcode, op0, op1, mode, 0, tem = emit_store_flag_1 (subtarget, rcode, op0, op1, mode, 0,
STORE_FLAG_VALUE); STORE_FLAG_VALUE, target_mode);
if (tem) if (tem)
return expand_binop (target_mode, add_optab, tem, return expand_binop (target_mode, add_optab, tem,
GEN_INT (normalizep), GEN_INT (normalizep),
...@@ -5508,7 +5511,7 @@ emit_store_flag (rtx target, enum rtx_code code, rtx op0, rtx op1, ...@@ -5508,7 +5511,7 @@ emit_store_flag (rtx target, enum rtx_code code, rtx op0, rtx op1,
else else
{ {
tem = emit_store_flag_1 (subtarget, rcode, op0, op1, mode, 0, tem = emit_store_flag_1 (subtarget, rcode, op0, op1, mode, 0,
normalizep); normalizep, target_mode);
if (tem) if (tem)
return expand_binop (target_mode, xor_optab, tem, trueval, return expand_binop (target_mode, xor_optab, tem, trueval,
target, INTVAL (trueval) >= 0, OPTAB_WIDEN); target, INTVAL (trueval) >= 0, OPTAB_WIDEN);
...@@ -5528,13 +5531,15 @@ emit_store_flag (rtx target, enum rtx_code code, rtx op0, rtx op1, ...@@ -5528,13 +5531,15 @@ emit_store_flag (rtx target, enum rtx_code code, rtx op0, rtx op1,
if (!HONOR_NANS (mode)) if (!HONOR_NANS (mode))
{ {
gcc_assert (first_code == (and_them ? ORDERED : UNORDERED)); gcc_assert (first_code == (and_them ? ORDERED : UNORDERED));
return emit_store_flag_1 (target, code, op0, op1, mode, 0, normalizep); return emit_store_flag_1 (target, code, op0, op1, mode, 0, normalizep,
target_mode);
} }
#ifdef HAVE_conditional_move #ifdef HAVE_conditional_move
/* Try using a setcc instruction for ORDERED/UNORDERED, followed by a /* Try using a setcc instruction for ORDERED/UNORDERED, followed by a
conditional move. */ conditional move. */
tem = emit_store_flag_1 (subtarget, first_code, op0, op1, mode, 0, normalizep); tem = emit_store_flag_1 (subtarget, first_code, op0, op1, mode, 0,
normalizep, target_mode);
if (tem == 0) if (tem == 0)
return 0; return 0;
...@@ -5573,7 +5578,7 @@ emit_store_flag (rtx target, enum rtx_code code, rtx op0, rtx op1, ...@@ -5573,7 +5578,7 @@ emit_store_flag (rtx target, enum rtx_code code, rtx op0, rtx op1,
OPTAB_WIDEN); OPTAB_WIDEN);
if (tem != 0) if (tem != 0)
tem = emit_store_flag_1 (target, code, tem, const0_rtx, tem = emit_store_flag_1 (target, code, tem, const0_rtx,
mode, unsignedp, normalizep); mode, unsignedp, normalizep, target_mode);
if (tem != 0) if (tem != 0)
return tem; return tem;
...@@ -5595,7 +5600,7 @@ emit_store_flag (rtx target, enum rtx_code code, rtx op0, rtx op1, ...@@ -5595,7 +5600,7 @@ emit_store_flag (rtx target, enum rtx_code code, rtx op0, rtx op1,
|| (STORE_FLAG_VALUE == -1 && normalizep == 1)) || (STORE_FLAG_VALUE == -1 && normalizep == 1))
{ {
tem = emit_store_flag_1 (subtarget, rcode, op0, op1, mode, 0, tem = emit_store_flag_1 (subtarget, rcode, op0, op1, mode, 0,
STORE_FLAG_VALUE); STORE_FLAG_VALUE, target_mode);
if (tem != 0) if (tem != 0)
tem = expand_binop (target_mode, add_optab, tem, tem = expand_binop (target_mode, add_optab, tem,
GEN_INT (normalizep), target, 0, OPTAB_WIDEN); GEN_INT (normalizep), target, 0, OPTAB_WIDEN);
...@@ -5603,7 +5608,7 @@ emit_store_flag (rtx target, enum rtx_code code, rtx op0, rtx op1, ...@@ -5603,7 +5608,7 @@ emit_store_flag (rtx target, enum rtx_code code, rtx op0, rtx op1,
else else
{ {
tem = emit_store_flag_1 (subtarget, rcode, op0, op1, mode, 0, tem = emit_store_flag_1 (subtarget, rcode, op0, op1, mode, 0,
normalizep); normalizep, target_mode);
if (tem != 0) if (tem != 0)
tem = expand_binop (target_mode, xor_optab, tem, trueval, target, tem = expand_binop (target_mode, xor_optab, tem, trueval, target,
INTVAL (trueval) >= 0, OPTAB_WIDEN); INTVAL (trueval) >= 0, OPTAB_WIDEN);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment