expr.c (emit_block_move_via_movmem): Only use 6 operand variant if there are exactly...
authorRichard Henderson <rth@redhat.com>
Fri, 25 Mar 2011 23:17:26 +0000 (16:17 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Fri, 25 Mar 2011 23:17:26 +0000 (16:17 -0700)
        * 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

gcc/ChangeLog
gcc/expr.c

index e7983a2fe44e060d81c2d864d63557051b4eb7ed..040a83c0416f42f59be2d0030d6b202a6924f04c 100644 (file)
@@ -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
index 4db1c776ba41c1ef32147ae17eaebc43b67bd9b5..076b8d2f0a4b1b3432a825efa23ee9867bf6e38c 100644 (file)
@@ -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;