Commit 4f431835 by Richard Sandiford Committed by Richard Sandiford

re PR bootstrap/48332 (optabs changes (PR48263 fix) broke m68k-linux bootstrap)

gcc/
	PR rtl-optimization/48332
	* optabs.c (expand_binop_directly): Set xmodeN to the target-mandated
	mode of input operand N and modeN to its actual mode.

From-SVN: r171733
parent f72f4169
2011-03-30 Richard Sandiford <richard.sandiford@linaro.org>
PR rtl-optimization/48332
* optabs.c (expand_binop_directly): Set xmodeN to the target-mandated
mode of input operand N and modeN to its actual mode.
2011-03-30 Jeff Law <law@redhat.com> 2011-03-30 Jeff Law <law@redhat.com>
* reload.h (reg_equiv_constant): Move into new structure reg_equivs, * reload.h (reg_equiv_constant): Move into new structure reg_equivs,
......
...@@ -1243,9 +1243,9 @@ expand_binop_directly (enum machine_mode mode, optab binoptab, ...@@ -1243,9 +1243,9 @@ expand_binop_directly (enum machine_mode mode, optab binoptab,
rtx last) rtx last)
{ {
enum insn_code icode = optab_handler (binoptab, mode); enum insn_code icode = optab_handler (binoptab, mode);
enum machine_mode mode0 = insn_data[(int) icode].operand[1].mode; enum machine_mode xmode0 = insn_data[(int) icode].operand[1].mode;
enum machine_mode mode1 = insn_data[(int) icode].operand[2].mode; enum machine_mode xmode1 = insn_data[(int) icode].operand[2].mode;
enum machine_mode tmp_mode; enum machine_mode mode0, mode1, tmp_mode;
struct expand_operand ops[3]; struct expand_operand ops[3];
bool commutative_p; bool commutative_p;
rtx pat; rtx pat;
...@@ -1256,8 +1256,8 @@ expand_binop_directly (enum machine_mode mode, optab binoptab, ...@@ -1256,8 +1256,8 @@ expand_binop_directly (enum machine_mode mode, optab binoptab,
if we would swap the operands, we can save the conversions. */ if we would swap the operands, we can save the conversions. */
commutative_p = commutative_optab_p (binoptab); commutative_p = commutative_optab_p (binoptab);
if (commutative_p if (commutative_p
&& GET_MODE (xop0) != mode0 && GET_MODE (xop1) != mode1 && GET_MODE (xop0) != xmode0 && GET_MODE (xop1) != xmode1
&& GET_MODE (xop0) == mode1 && GET_MODE (xop1) == mode1) && GET_MODE (xop0) == xmode1 && GET_MODE (xop1) == xmode1)
{ {
swap = xop0; swap = xop0;
xop0 = xop1; xop0 = xop1;
...@@ -1265,9 +1265,9 @@ expand_binop_directly (enum machine_mode mode, optab binoptab, ...@@ -1265,9 +1265,9 @@ expand_binop_directly (enum machine_mode mode, optab binoptab,
} }
/* If we are optimizing, force expensive constants into a register. */ /* If we are optimizing, force expensive constants into a register. */
xop0 = avoid_expensive_constant (mode0, binoptab, xop0, unsignedp); xop0 = avoid_expensive_constant (xmode0, binoptab, xop0, unsignedp);
if (!shift_optab_p (binoptab)) if (!shift_optab_p (binoptab))
xop1 = avoid_expensive_constant (mode1, binoptab, xop1, unsignedp); xop1 = avoid_expensive_constant (xmode1, binoptab, xop1, unsignedp);
/* In case the insn wants input operands in modes different from /* In case the insn wants input operands in modes different from
those of the actual operands, convert the operands. It would those of the actual operands, convert the operands. It would
...@@ -1275,19 +1275,19 @@ expand_binop_directly (enum machine_mode mode, optab binoptab, ...@@ -1275,19 +1275,19 @@ expand_binop_directly (enum machine_mode mode, optab binoptab,
that they're properly zero-extended, sign-extended or truncated that they're properly zero-extended, sign-extended or truncated
for their mode. */ for their mode. */
if (GET_MODE (xop0) != mode0 && mode0 != VOIDmode) mode0 = GET_MODE (xop0) != VOIDmode ? GET_MODE (xop0) : mode;
xop0 = convert_modes (mode0, if (xmode0 != VOIDmode && xmode0 != mode0)
GET_MODE (xop0) != VOIDmode {
? GET_MODE (xop0) xop0 = convert_modes (xmode0, mode0, xop0, unsignedp);
: mode, mode0 = xmode0;
xop0, unsignedp); }
if (GET_MODE (xop1) != mode1 && mode1 != VOIDmode) mode1 = GET_MODE (xop1) != VOIDmode ? GET_MODE (xop1) : mode;
xop1 = convert_modes (mode1, if (xmode1 != VOIDmode && xmode1 != mode1)
GET_MODE (xop1) != VOIDmode {
? GET_MODE (xop1) xop1 = convert_modes (xmode1, mode1, xop1, unsignedp);
: mode, mode1 = xmode1;
xop1, unsignedp); }
/* If operation is commutative, /* If operation is commutative,
try to make the first operand a register. try to make the first operand a register.
......
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