]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR target/51244
authorolegendo <olegendo@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 8 May 2012 21:36:30 +0000 (21:36 +0000)
committerolegendo <olegendo@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 8 May 2012 21:36:30 +0000 (21:36 +0000)
* config/sh/sh.md (*branch_true, *branch_false): New insns.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@187298 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/sh/sh.md

index a3f5a8fd9d6c4f64d1968b3c6a67c3f1ab046824..aa5537aea02dd8fd1812647c7bfa944cb49b0d74 100644 (file)
@@ -1,3 +1,8 @@
+2012-05-08  Oleg Endo  <olegendo@gcc.gnu.org>
+
+       PR target/51244
+       * config/sh/sh.md (*branch_true, *branch_false): New insns.
+
 2012-05-08   Teresa Johnson  <tejohnson@google.com>
 
        * gcov-io.h (__gcov_reset, __gcov_dump): Declare.
index 914d5bf8b924112533631d6ef287a9331db4e16b..7167b920641a213e4286580596785979fa867dbf 100644 (file)
@@ -7097,6 +7097,29 @@ label:
 }
   [(set_attr "type" "cbranch")])
 
+;; The *branch_true patterns help combine when trying to invert conditions.
+(define_insn "*branch_true"
+  [(set (pc) (if_then_else (ne (zero_extend:SI (subreg:QI (reg:SI T_REG) 0))
+                              (const_int 0))
+                          (label_ref (match_operand 0 "" ""))
+                          (pc)))]
+  "TARGET_SH1 && TARGET_LITTLE_ENDIAN"
+{
+  return output_branch (1, insn, operands);
+}
+  [(set_attr "type" "cbranch")])
+
+(define_insn "*branch_true"
+  [(set (pc) (if_then_else (ne (zero_extend:SI (subreg:QI (reg:SI T_REG) 3))
+                              (const_int 0))
+                          (label_ref (match_operand 0 "" ""))
+                          (pc)))]
+  "TARGET_SH1 && ! TARGET_LITTLE_ENDIAN"
+{
+  return output_branch (1, insn, operands);
+}
+  [(set_attr "type" "cbranch")])
+
 (define_insn "branch_false"
   [(set (pc) (if_then_else (eq (reg:SI T_REG) (const_int 0))
                           (label_ref (match_operand 0 "" ""))
@@ -7107,6 +7130,29 @@ label:
 }
   [(set_attr "type" "cbranch")])
 
+;; The *branch_false patterns help combine when trying to invert conditions.
+(define_insn "*branch_false"
+  [(set (pc) (if_then_else (eq (zero_extend:SI (subreg:QI (reg:SI T_REG) 0))
+                              (const_int 0))
+                          (label_ref (match_operand 0 "" ""))
+                          (pc)))]
+  "TARGET_SH1 && TARGET_LITTLE_ENDIAN"
+{
+  return output_branch (0, insn, operands);
+}
+  [(set_attr "type" "cbranch")])
+
+(define_insn "*branch_false"
+  [(set (pc) (if_then_else (eq (zero_extend:SI (subreg:QI (reg:SI T_REG) 3))
+                              (const_int 0))
+                          (label_ref (match_operand 0 "" ""))
+                          (pc)))]
+  "TARGET_SH1 && ! TARGET_LITTLE_ENDIAN"
+{
+  return output_branch (0, insn, operands);
+}
+  [(set_attr "type" "cbranch")])
+
 ;; Patterns to prevent reorg from re-combining a condbranch with a branch
 ;; which destination is too far away.
 ;; The const_int_operand is distinct for each branch target; it avoids
@@ -9721,7 +9767,7 @@ label:
   ""
   [(const_int 0)])
 
-;; The *movtt patterns improve code at -O1.
+;; The *movtt patterns eliminate redundant T bit to T bit moves / tests.
 (define_insn_and_split "*movtt"
   [(set (reg:SI T_REG)
        (eq:SI (zero_extend:SI (subreg:QI (reg:SI T_REG) 3))