diff options
author | Richard Henderson <rth@redhat.com> | 2011-03-25 16:17:26 -0700 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2011-03-25 16:17:26 -0700 |
commit | c2654dede78617240167efedcb6cf2242c0d1d70 (patch) | |
tree | 82345cadd98ed953ce4775edcaa47dbf2d931de3 /gcc | |
parent | e3e08a1db5d35f7872683d6eb5ac8e08d9c9168c (diff) | |
download | gcc-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')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/expr.c | 16 |
2 files changed, 18 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e7983a2..040a83c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +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> * 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, 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; |