aboutsummaryrefslogtreecommitdiff
path: root/gcc/expr.c
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2011-03-25 16:17:26 -0700
committerRichard Henderson <rth@gcc.gnu.org>2011-03-25 16:17:26 -0700
commitc2654dede78617240167efedcb6cf2242c0d1d70 (patch)
tree82345cadd98ed953ce4775edcaa47dbf2d931de3 /gcc/expr.c
parente3e08a1db5d35f7872683d6eb5ac8e08d9c9168c (diff)
downloadgcc-c2654dede78617240167efedcb6cf2242c0d1d70.zip
gcc-c2654dede78617240167efedcb6cf2242c0d1d70.tar.gz
gcc-c2654dede78617240167efedcb6cf2242c0d1d70.tar.bz2
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
Diffstat (limited to 'gcc/expr.c')
-rw-r--r--gcc/expr.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/gcc/expr.c b/gcc/expr.c
index 4db1c77..076b8d2 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -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
emitting the libcall would be more efficient. */
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[1], y);
/* The check above guarantees that this size conversion is valid. */
create_convert_operand_to (&ops[2], size, mode, true);
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[5], expected_size);
- nops = 6;
}
if (maybe_expand_insn (code, nops, ops))
{
@@ -2716,16 +2720,20 @@ set_storage_via_setmem (rtx object, rtx size, rtx val, unsigned int align,
unsigned int nops;
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);
/* The check above guarantees that this size conversion is valid. */
create_convert_operand_to (&ops[1], size, mode, true);
create_convert_operand_from (&ops[2], val, byte_mode, true);
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[5], expected_size);
- nops = 6;
}
if (maybe_expand_insn (code, nops, ops))
return true;