OSDN Git Service

Stop trying to represent the bfins instruction with the insv pattern,
authorwalt <walt@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 27 Aug 2012 18:18:43 +0000 (18:18 +0000)
committerwalt <walt@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 27 Aug 2012 18:18:43 +0000 (18:18 +0000)
because it causes an extra copy when bfins reuses one of its inputs.
Backport from mainline
2012-08-27  Walter Lee  <walt@tilera.com>

* config/tilegx/tilegx.md (*bfins): Rename to insn_bfins.
(insn_bfins): Delete.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@190725 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/tilegx/tilegx.md

index 7f8d73f..1987748 100644 (file)
@@ -2,6 +2,14 @@
 
        Backport from mainline
        2012-08-27  Walter Lee  <walt@tilera.com>
+       
+       * config/tilegx/tilegx.md (*bfins): Rename to insn_bfins.
+       (insn_bfins): Delete.
+
+2012-08-27  Walter Lee  <walt@tilera.com>
+
+       Backport from mainline
+       2012-08-27  Walter Lee  <walt@tilera.com>
 
        * config/tilegx/sync.md (atomic_compare_and_swap_bare<mode>,
        atomic_exchange_bare<mode>,
index 1fb6cdc..7a68a2d 100644 (file)
   "bfextu\t%0, %r1, %2, %3"
   [(set_attr "type" "X0")])
 
-(define_insn "*bfins"
+(define_insn "insn_bfins"
   [(set (match_operand:DI 0 "register_operand" "=r")
         (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "0")
                     (match_operand:DI 2 "reg_or_0_operand" "rO")
    "bfins\t%0, %r2, %3, %4"
    [(set_attr "type" "X0")])
 
-(define_expand "insn_bfins"
-  [(set (match_operand:DI 0 "register_operand" "")
-        (unspec:DI [(match_operand:DI 1 "reg_or_0_operand" "")
-                    (match_operand:DI 2 "reg_or_0_operand" "")
-                    (match_operand:DI 3 "u6bit_cint_operand" "")
-                    (match_operand:DI 4 "u6bit_cint_operand" "")]
-                   UNSPEC_INSN_BFINS))]
-  "INTVAL (operands[3]) != 64"
-{
-  HOST_WIDE_INT first = INTVAL (operands[3]);
-  HOST_WIDE_INT last = INTVAL (operands[4]);
-
-  if (last >= first)
-    {
-      /* This is not a wacky wraparound case, so we can express this
-         as a standard insv. */
-      if (operands[0] != operands[1])
-        {
-         operands[2] = make_safe_from (operands[2], operands[0]);
-         emit_move_insn (operands[0], operands[1]);
-       }
-
-      emit_insn (gen_insv (operands[0],
-                          GEN_INT (last - first + 1), operands[3],
-                          operands[2]));
-
-      DONE;
-    }
-})
-
 (define_insn "insn_cmpexch<four_if_si>"
   [(set (match_operand:I48MODE 0 "register_operand" "=r")
         (mem:I48MODE (match_operand 1 "pointer_operand" "rO")))