OSDN Git Service

New pattern for the combiner
authorbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 5 Aug 2001 16:56:47 +0000 (16:56 +0000)
committerbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 5 Aug 2001 16:56:47 +0000 (16:56 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@44648 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/ia64/ia64.c
gcc/config/ia64/ia64.h
gcc/config/ia64/ia64.md

index f81f01d..c130289 100644 (file)
        * config/ia64/ia64.c (ia64_sched_reorder): Defer scheduling of
        asms if other insns are available.
 
+       * config/ia64/ia64.c (condop_operator): New predicate.
+       * config/ia64/ia64.h (PREDICATE_CODES): Add it.
+       * config/ia64/ia64.md (cond_opsi2_internal and splitters): New
+       patterns.
+
 2001-08-04  Hans-Peter Nilsson  <hp@bitrange.com>
 
        * config/sh/sh.c (sh_asm_named_section): Fix typo in align
index 8ff1c8f..ce17c91 100644 (file)
@@ -719,6 +719,19 @@ predicate_operator (op, mode)
          && (code == EQ || code == NE));
 }
 
+/* Return 1 if this operator can be used in a conditional operation.  */
+
+int
+condop_operator (op, mode)
+    register rtx op;
+    enum machine_mode mode;
+{
+  enum rtx_code code = GET_CODE (op);
+  return ((GET_MODE (op) == mode || mode == VOIDmode)
+         && (code == PLUS || code == MINUS || code == AND
+             || code == IOR || code == XOR));
+}
+
 /* Return 1 if this is the ar.lc register.  */
 
 int
index b5fe7ef..f6b4693 100644 (file)
@@ -2664,6 +2664,7 @@ do {                                                                      \
 { "adjusted_comparison_operator", {LT, GE, LTU, GEU}},                 \
 { "signed_inequality_operator", {GE, GT, LE, LT}},                     \
 { "predicate_operator", {NE, EQ}},                                     \
+{ "condop_operator", {PLUS, MINUS, IOR, XOR, AND}},                    \
 { "ar_lc_reg_operand", {REG}},                                         \
 { "ar_ccv_reg_operand", {REG}},                                                \
 { "general_tfmode_operand", {SUBREG, REG, CONST_DOUBLE, MEM}},         \
index f40cc40..3590630 100644 (file)
                                VOIDmode, operands[1], const0_rtx);
 }")
 
+(define_insn "*cond_opsi2_internal"
+  [(set (match_operand:SI 0 "gr_register_operand" "=r")
+       (match_operator:SI 5 "condop_operator"
+         [(if_then_else:SI
+            (match_operator 6 "predicate_operator"
+              [(match_operand:BI 1 "register_operand" "c")
+               (const_int 0)])
+            (match_operand:SI 2 "gr_register_operand" "r")
+            (match_operand:SI 3 "gr_register_operand" "r"))
+          (match_operand:SI 4 "gr_register_operand" "r")]))]
+  ""
+  "#"
+  [(set_attr "itanium_class" "ialu")
+   (set_attr "predicable" "no")])
+
+(define_split
+  [(set (match_operand:SI 0 "gr_register_operand" "")
+       (match_operator:SI 5 "condop_operator"
+         [(if_then_else:SI
+            (match_operator 6 "predicate_operator"
+              [(match_operand:BI 1 "register_operand" "")
+               (const_int 0)])
+            (match_operand:SI 2 "gr_register_operand" "")
+            (match_operand:SI 3 "gr_register_operand" ""))
+          (match_operand:SI 4 "gr_register_operand" "")]))]
+  "reload_completed"
+  [(cond_exec
+     (match_dup 6)
+     (set (match_dup 0) (match_op_dup:SI 5 [(match_dup 2) (match_dup 4)])))
+   (cond_exec
+     (match_dup 7)
+     (set (match_dup 0) (match_op_dup:SI 5 [(match_dup 3) (match_dup 4)])))]
+  "
+{
+  operands[7] = gen_rtx_fmt_ee (GET_CODE (operands[6]) == NE ? EQ : NE,
+                               VOIDmode, operands[1], const0_rtx);
+}")
+
+(define_insn "*cond_opsi2_internal_b"
+  [(set (match_operand:SI 0 "gr_register_operand" "=r")
+       (match_operator:SI 5 "condop_operator"
+         [(match_operand:SI 4 "gr_register_operand" "r")
+          (if_then_else:SI
+            (match_operator 6 "predicate_operator"
+              [(match_operand:BI 1 "register_operand" "c")
+               (const_int 0)])
+            (match_operand:SI 2 "gr_register_operand" "r")
+            (match_operand:SI 3 "gr_register_operand" "r"))]))]
+  ""
+  "#"
+  [(set_attr "itanium_class" "ialu")
+   (set_attr "predicable" "no")])
+
+(define_split
+  [(set (match_operand:SI 0 "gr_register_operand" "")
+       (match_operator:SI 5 "condop_operator"
+         [(match_operand:SI 4 "gr_register_operand" "")
+          (if_then_else:SI
+            (match_operator 6 "predicate_operator"
+              [(match_operand:BI 1 "register_operand" "")
+               (const_int 0)])
+            (match_operand:SI 2 "gr_register_operand" "")
+            (match_operand:SI 3 "gr_register_operand" ""))]))]
+  "reload_completed"
+  [(cond_exec
+     (match_dup 6)
+     (set (match_dup 0) (match_op_dup:SI 5 [(match_dup 4) (match_dup 2)])))
+   (cond_exec
+     (match_dup 7)
+     (set (match_dup 0) (match_op_dup:SI 5 [(match_dup 4) (match_dup 3)])))]
+  "
+{
+  operands[7] = gen_rtx_fmt_ee (GET_CODE (operands[6]) == NE ? EQ : NE,
+                               VOIDmode, operands[1], const0_rtx);
+}")
+
 \f
 ;; ::::::::::::::::::::
 ;; ::