Commit c2654ded by Richard Henderson Committed by Richard Henderson

expr.c (emit_block_move_via_movmem): Only use 6 operand variant if there are exactly 6 operands.

        * expr.c (emit_block_move_via_movmem): Only use 6 operand variant
        if there are exactly 6 operands.
        (set_storage_via_setmem): Similarly.

From-SVN: r171532
parent e3e08a1d
2011-03-25 Richard Henderson <rth@redhat.com>
* expr.c (emit_block_move_via_movmem): Only use 6 operand variant
if there are exactly 6 operands.
(set_storage_via_setmem): Similarly.
2011-03-25 Kai Tietz <ktietz@redhat.com> 2011-03-25 Kai Tietz <ktietz@redhat.com>
* collect2.c (write_c_file_stat): Handle backslash * collect2.c (write_c_file_stat): Handle backslash
......
...@@ -1294,16 +1294,20 @@ emit_block_move_via_movmem (rtx x, rtx y, rtx size, unsigned int align, ...@@ -1294,16 +1294,20 @@ emit_block_move_via_movmem (rtx x, rtx y, rtx size, unsigned int align,
that it doesn't fail the expansion because it thinks that it doesn't fail the expansion because it thinks
emitting the libcall would be more efficient. */ emitting the libcall would be more efficient. */
nops = insn_data[(int) code].n_operands; nops = insn_data[(int) code].n_operands;
/* ??? n_operands includes match_scratches; find some other
way to select the 6 operand variant, or force all targets
to have exactly 6 operands. */
gcc_assert (nops >= 4 && nops <= 6);
create_fixed_operand (&ops[0], x); create_fixed_operand (&ops[0], x);
create_fixed_operand (&ops[1], y); create_fixed_operand (&ops[1], y);
/* The check above guarantees that this size conversion is valid. */ /* The check above guarantees that this size conversion is valid. */
create_convert_operand_to (&ops[2], size, mode, true); create_convert_operand_to (&ops[2], size, mode, true);
create_integer_operand (&ops[3], align / BITS_PER_UNIT); create_integer_operand (&ops[3], align / BITS_PER_UNIT);
if (nops != 4) if (nops == 6)
{ {
create_integer_operand (&ops[4], expected_align / BITS_PER_UNIT); create_integer_operand (&ops[4], expected_align / BITS_PER_UNIT);
create_integer_operand (&ops[5], expected_size); create_integer_operand (&ops[5], expected_size);
nops = 6;
} }
if (maybe_expand_insn (code, nops, ops)) if (maybe_expand_insn (code, nops, ops))
{ {
...@@ -2716,16 +2720,20 @@ set_storage_via_setmem (rtx object, rtx size, rtx val, unsigned int align, ...@@ -2716,16 +2720,20 @@ set_storage_via_setmem (rtx object, rtx size, rtx val, unsigned int align,
unsigned int nops; unsigned int nops;
nops = insn_data[(int) code].n_operands; nops = insn_data[(int) code].n_operands;
/* ??? n_operands includes match_scratches; find some other
way to select the 6 operand variant, or force all targets
to have exactly 6 operands. */
gcc_assert (nops >= 4 && nops <= 6);
create_fixed_operand (&ops[0], object); create_fixed_operand (&ops[0], object);
/* The check above guarantees that this size conversion is valid. */ /* The check above guarantees that this size conversion is valid. */
create_convert_operand_to (&ops[1], size, mode, true); create_convert_operand_to (&ops[1], size, mode, true);
create_convert_operand_from (&ops[2], val, byte_mode, true); create_convert_operand_from (&ops[2], val, byte_mode, true);
create_integer_operand (&ops[3], align / BITS_PER_UNIT); create_integer_operand (&ops[3], align / BITS_PER_UNIT);
if (nops != 4) if (nops == 6)
{ {
create_integer_operand (&ops[4], expected_align / BITS_PER_UNIT); create_integer_operand (&ops[4], expected_align / BITS_PER_UNIT);
create_integer_operand (&ops[5], expected_size); create_integer_operand (&ops[5], expected_size);
nops = 6;
} }
if (maybe_expand_insn (code, nops, ops)) if (maybe_expand_insn (code, nops, ops))
return true; return true;
......
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