Use pc_or_label_operand to collapse a couple more patterns in preparation for the cc0->CC_REG transition.

* config/h8300/predicates.md (pc_or_label_operand): New predicate.
	* config/h8300/jumpcall.md (branch_true, branch_false): Consolidate
	into a single pattern using pc_or_label_operand.
	* config/h8300/combiner.md (bit branch patterns): Likewise.
	* config/h8300/peepholes.md (HImode and SImode branches): Likewise.
This commit is contained in:
Jeff Law 2020-05-17 13:20:39 -04:00
parent 266f44a91c
commit 4c1b27f961
5 changed files with 237 additions and 246 deletions

View File

@ -1,3 +1,11 @@
2020-05-17 Jeff Law <law@redhat.com>
* config/h8300/predicates.md (pc_or_label_operand): New predicate.
* config/h8300/jumpcall.md (branch_true, branch_false): Consolidate
into a single pattern using pc_or_label_operand.
* config/h8300/combiner.md (bit branch patterns): Likewise.
* config/h8300/peepholes.md (HImode and SImode branches): Likewise.
2020-05-17 H.J. Lu <hongjiu.lu@intel.com>
PR target/95021

View File

@ -740,9 +740,9 @@
(const_int 1)
(const_int 7))
(const_int 0))
(label_ref (match_operand 1 "" ""))
(pc)))]
""
(match_operand 1 "pc_or_label_operand" "")
(match_operand 2 "pc_or_label_operand" "")))]
"operands[1] == pc_rtx || operands[2] == pc_rtx"
"#"
""
[(set (cc0) (compare (match_dup 0)
@ -750,9 +750,8 @@
(set (pc)
(if_then_else (ge (cc0)
(const_int 0))
(label_ref (match_dup 1))
(pc)))]
"")
(match_dup 1)
(match_dup 2)))])
(define_insn_and_split ""
[(set (pc)
@ -760,9 +759,9 @@
(const_int 1)
(const_int 7))
(const_int 0))
(label_ref (match_operand 1 "" ""))
(pc)))]
""
(match_operand 1 "pc_or_label_operand" "")
(match_operand 2 "pc_or_label_operand" "")))]
"operands[1] == pc_rtx || operands[2] == pc_rtx"
"#"
""
[(set (cc0) (compare (match_dup 0)
@ -770,6 +769,5 @@
(set (pc)
(if_then_else (lt (cc0)
(const_int 0))
(label_ref (match_dup 1))
(pc)))]
"")
(match_dup 1)
(match_dup 2)))])

View File

@ -37,62 +37,46 @@
DONE;
})
(define_insn "branch_true"
(define_insn "branch"
[(set (pc)
(if_then_else (match_operator 1 "comparison_operator"
(if_then_else (match_operator 2 "comparison_operator"
[(cc0) (const_int 0)])
(label_ref (match_operand 0 "" ""))
(pc)))]
""
(match_operand 0 "pc_or_label_operand" "")
(match_operand 1 "pc_or_label_operand" "")))]
"operands[0] == pc_rtx || operands[1] == pc_rtx"
{
if ((cc_status.flags & CC_OVERFLOW_UNUSABLE) != 0
&& (GET_CODE (operands[1]) == GT
|| GET_CODE (operands[1]) == GE
|| GET_CODE (operands[1]) == LE
|| GET_CODE (operands[1]) == LT))
&& (GET_CODE (operands[2]) == GT
|| GET_CODE (operands[2]) == GE
|| GET_CODE (operands[2]) == LE
|| GET_CODE (operands[2]) == LT))
{
cc_status.flags &= ~CC_OVERFLOW_UNUSABLE;
return 0;
}
if (get_attr_length (insn) == 2)
return "b%j1 %l0";
else if (get_attr_length (insn) == 4)
return "b%j1 %l0:16";
if (operands[0] != pc_rtx)
{
if (get_attr_length (insn) == 2)
return "b%j2 %l0";
else if (get_attr_length (insn) == 4)
return "b%j2 %l0:16";
else
return "b%k2 .Lh8BR%=\;jmp @%l0\\n.Lh8BR%=:";
}
else
return "b%k1 .Lh8BR%=\;jmp @%l0\\n.Lh8BR%=:";
{
if (get_attr_length (insn) == 2)
return "b%k2 %l1";
else if (get_attr_length (insn) == 4)
return "b%k2 %l1:16";
else
return "b%j2 .Lh8BR%=\;jmp @%l1\\n.Lh8BR%=:";
}
}
[(set_attr "type" "branch")
(set_attr "cc" "none")])
(define_insn "branch_false"
[(set (pc)
(if_then_else (match_operator 1 "comparison_operator"
[(cc0) (const_int 0)])
(pc)
(label_ref (match_operand 0 "" ""))))]
""
{
if ((cc_status.flags & CC_OVERFLOW_UNUSABLE) != 0
&& (GET_CODE (operands[1]) == GT
|| GET_CODE (operands[1]) == GE
|| GET_CODE (operands[1]) == LE
|| GET_CODE (operands[1]) == LT))
{
cc_status.flags &= ~CC_OVERFLOW_UNUSABLE;
return 0;
}
if (get_attr_length (insn) == 2)
return "b%k1 %l0";
else if (get_attr_length (insn) == 4)
return "b%k1 %l0:16";
else
return "b%j1 .Lh8BR%=\;jmp @%l0\\n.Lh8BR%=:";
}
[(set_attr "type" "branch")
(set_attr "cc" "none")])
(define_insn "*brabc"
[(set (pc)
(if_then_else (eq (zero_extract (match_operand:QI 1 "bit_memory_operand" "WU")

View File

@ -367,10 +367,10 @@
(set (cc0) (compare (match_dup 0)
(const_int 0)))
(set (pc)
(if_then_else (match_operator 3 "eqne_operator"
(if_then_else (match_operator 4 "eqne_operator"
[(cc0) (const_int 0)])
(label_ref (match_operand 2 "" ""))
(pc)))]
(match_operand 2 "pc_or_label_operand" "")
(match_operand 3 "pc_or_label_operand" "")))]
""
[(set (match_operand:HI 0 "register_operand" "")
(unspec:HI [(match_dup 0)
@ -379,10 +379,9 @@
(set (cc0) (compare (match_dup 0)
(const_int 0)))
(set (pc)
(if_then_else (match_op_dup 3 [(cc0) (const_int 0)])
(label_ref (match_dup 2))
(pc)))]
"")
(if_then_else (match_op_dup 4 [(cc0) (const_int 0)])
(match_dup 2)
(match_dup 3)))])
;; The SImode version of the previous pattern.
@ -393,10 +392,10 @@
(set (cc0) (compare (match_dup 0)
(const_int 0)))
(set (pc)
(if_then_else (match_operator 3 "eqne_operator"
(if_then_else (match_operator 4 "eqne_operator"
[(cc0) (const_int 0)])
(label_ref (match_operand 2 "" ""))
(pc)))]
(match_operand 2 "pc_or_label_operand" "")
(match_operand 3 "pc_or_label_operand" "")))]
""
[(set (match_operand:SI 0 "register_operand" "")
(unspec:SI [(match_dup 0)
@ -405,10 +404,9 @@
(set (cc0) (compare (match_dup 0)
(const_int 0)))
(set (pc)
(if_then_else (match_op_dup 3 [(cc0) (const_int 0)])
(label_ref (match_dup 2))
(pc)))]
"")
(if_then_else (match_op_dup 4 [(cc0) (const_int 0)])
(match_dup 2)
(match_dup 3)))])
(define_peephole2
[(parallel [(set (cc0)
@ -418,19 +416,19 @@
(const_int 0)))
(clobber (scratch:QI))])
(set (pc)
(if_then_else (match_operator 1 "eqne_operator"
(if_then_else (match_operator 4 "eqne_operator"
[(cc0) (const_int 0)])
(label_ref (match_operand 2 "" ""))
(pc)))]
(match_operand 2 "pc_or_label_operand" "")
(match_operand 3 "pc_or_label_operand" "")))]
""
[(set (cc0) (compare (match_dup 0)
(const_int 0)))
(set (pc)
(if_then_else (match_op_dup 3 [(cc0) (const_int 0)])
(label_ref (match_dup 2))
(pc)))]
(if_then_else (match_op_dup 4 [(cc0) (const_int 0)])
(match_dup 2)
(match_dup 3)))]
{
operands[3] = ((GET_CODE (operands[1]) == EQ)
operands[4] = ((GET_CODE (operands[4]) == EQ)
? gen_rtx_GE (VOIDmode, cc0_rtx, const0_rtx)
: gen_rtx_LT (VOIDmode, cc0_rtx, const0_rtx));
})
@ -598,23 +596,23 @@
(compare (match_operand:HI 0 "register_operand" "")
(match_operand:HI 1 "incdec_operand" "")))
(set (pc)
(if_then_else (match_operator 3 "eqne_operator"
(if_then_else (match_operator 4 "eqne_operator"
[(cc0) (const_int 0)])
(label_ref (match_operand 2 "" ""))
(pc)))]
(match_operand 2 "pc_or_label_operand" "")
(match_operand 3 "pc_or_label_operand" "")))]
"INTVAL (operands[1]) != 0 && peep2_reg_dead_p (1, operands[0])"
[(set (match_dup 0)
(unspec:HI [(match_dup 0)
(match_dup 4)]
(match_dup 5)]
UNSPEC_INCDEC))
(set (cc0) (compare (match_dup 0)
(const_int 0)))
(set (pc)
(if_then_else (match_op_dup 3 [(cc0) (const_int 0)])
(label_ref (match_dup 2))
(pc)))]
(if_then_else (match_op_dup 4 [(cc0) (const_int 0)])
(match_dup 2)
(match_dup 3)))]
{
operands[4] = GEN_INT (- INTVAL (operands[1]));
operands[5] = GEN_INT (- INTVAL (operands[1]));
})
;; Transform
@ -632,25 +630,25 @@
(compare (match_operand:HI 0 "register_operand" "")
(match_operand:HI 1 "const_int_operand" "")))
(set (pc)
(if_then_else (match_operator 2 "gtle_operator"
(if_then_else (match_operator 4 "gtle_operator"
[(cc0) (const_int 0)])
(label_ref (match_operand 3 "" ""))
(pc)))]
(match_operand 2 "pc_or_label_operand" "")
(match_operand 3 "pc_or_label_operand" "")))]
"peep2_reg_dead_p (1, operands[0])
&& (INTVAL (operands[1]) == 1
|| (TARGET_H8300S && INTVAL (operands[1]) == 3))"
[(parallel [(set (match_dup 0)
(ashiftrt:HI (match_dup 0)
(match_dup 4)))
(match_dup 5)))
(clobber (scratch:QI))])
(set (cc0) (compare (match_dup 0)
(const_int 0)))
(set (pc)
(if_then_else (match_dup 2)
(label_ref (match_dup 3))
(pc)))]
(if_then_else (match_dup 4)
(match_dup 2)
(match_dup 3)))]
{
operands[4] = GEN_INT (exact_log2 (INTVAL (operands[1]) + 1));
operands[5] = GEN_INT (exact_log2 (INTVAL (operands[1]) + 1));
})
;; Transform
@ -668,26 +666,26 @@
(compare (match_operand:HI 0 "register_operand" "")
(match_operand:HI 1 "const_int_operand" "")))
(set (pc)
(if_then_else (match_operator 2 "gtuleu_operator"
(if_then_else (match_operator 4 "gtuleu_operator"
[(cc0) (const_int 0)])
(label_ref (match_operand 3 "" ""))
(pc)))]
(match_operand 2 "pc_or_label_operand" "")
(match_operand 3 "pc_or_label_operand" "")))]
"peep2_reg_dead_p (1, operands[0])
&& (INTVAL (operands[1]) == 1
|| (TARGET_H8300S && INTVAL (operands[1]) == 3))"
[(parallel [(set (match_dup 0)
(ashiftrt:HI (match_dup 0)
(match_dup 4)))
(match_dup 5)))
(clobber (scratch:QI))])
(set (cc0) (compare (match_dup 0)
(const_int 0)))
(set (pc)
(if_then_else (match_dup 5)
(label_ref (match_dup 3))
(pc)))]
(if_then_else (match_dup 6)
(match_dup 2)
(match_dup 3)))]
{
operands[4] = GEN_INT (exact_log2 (INTVAL (operands[1]) + 1));
operands[5] = gen_rtx_fmt_ee (GET_CODE (operands[2]) == GTU ? NE : EQ,
operands[5] = GEN_INT (exact_log2 (INTVAL (operands[1]) + 1));
operands[6] = gen_rtx_fmt_ee (GET_CODE (operands[4]) == GTU ? NE : EQ,
VOIDmode, cc0_rtx, const0_rtx);
})
@ -708,17 +706,16 @@
(set (pc)
(if_then_else (match_operator 1 "gtle_operator"
[(cc0) (const_int 0)])
(label_ref (match_operand 2 "" ""))
(pc)))]
(match_operand 2 "pc_or_label_operand" "")
(match_operand 3 "pc_or_label_operand" "")))]
""
[(set (cc0) (compare (and:HI (match_dup 0)
(const_int -256))
(const_int 0)))
(set (pc)
(if_then_else (match_dup 1)
(label_ref (match_dup 2))
(pc)))]
"")
(match_dup 2)
(match_dup 3)))])
;; Transform
;;
@ -737,18 +734,18 @@
(set (pc)
(if_then_else (match_operator 1 "gtuleu_operator"
[(cc0) (const_int 0)])
(label_ref (match_operand 2 "" ""))
(pc)))]
(match_operand 2 "pc_or_label_operand" "")
(match_operand 3 "pc_or_label_operand" "")))]
""
[(set (cc0) (compare (and:HI (match_dup 0)
(const_int -256))
(const_int 0)))
(set (pc)
(if_then_else (match_dup 3)
(label_ref (match_dup 2))
(pc)))]
(if_then_else (match_dup 4)
(match_dup 2)
(match_dup 3)))]
{
operands[3] = gen_rtx_fmt_ee (GET_CODE (operands[1]) == GTU ? NE : EQ,
operands[4] = gen_rtx_fmt_ee (GET_CODE (operands[1]) == GTU ? NE : EQ,
VOIDmode, cc0_rtx, const0_rtx);
})
@ -829,23 +826,23 @@
(compare (match_operand:SI 0 "register_operand" "")
(match_operand:SI 1 "incdec_operand" "")))
(set (pc)
(if_then_else (match_operator 3 "eqne_operator"
(if_then_else (match_operator 4 "eqne_operator"
[(cc0) (const_int 0)])
(label_ref (match_operand 2 "" ""))
(pc)))]
(match_operand 2 "pc_or_label_operand" "")
(match_operand 3 "pc_or_label_operand" "")))]
"INTVAL (operands[1]) != 0 && peep2_reg_dead_p (1, operands[0])"
[(set (match_dup 0)
(unspec:SI [(match_dup 0)
(match_dup 4)]
(match_dup 5)]
UNSPEC_INCDEC))
(set (cc0) (compare (match_dup 0)
(const_int 0)))
(set (pc)
(if_then_else (match_op_dup 3 [(cc0) (const_int 0)])
(label_ref (match_dup 2))
(pc)))]
(if_then_else (match_op_dup 4 [(cc0) (const_int 0)])
(match_dup 2)
(match_dup 3)))]
{
operands[4] = GEN_INT (- INTVAL (operands[1]));
operands[5] = GEN_INT (- INTVAL (operands[1]));
})
;; Transform
@ -863,10 +860,10 @@
(compare (match_operand:SI 0 "register_operand" "")
(match_operand:SI 1 "const_int_operand" "")))
(set (pc)
(if_then_else (match_operator 3 "eqne_operator"
(if_then_else (match_operator 4 "eqne_operator"
[(cc0) (const_int 0)])
(label_ref (match_operand 2 "" ""))
(pc)))]
(match_operand 2 "pc_or_label_operand" "")
(match_operand 3 "pc_or_label_operand" "")))]
"peep2_reg_dead_p (1, operands[0])
&& (INTVAL (operands[1]) == -131072
|| INTVAL (operands[1]) == -65536
@ -874,15 +871,15 @@
|| INTVAL (operands[1]) == 131072)"
[(set (match_dup 0)
(plus:SI (match_dup 0)
(match_dup 4)))
(match_dup 5)))
(set (cc0) (compare (match_dup 0)
(const_int 0)))
(set (pc)
(if_then_else (match_op_dup 3 [(cc0) (const_int 0)])
(label_ref (match_dup 2))
(pc)))]
(if_then_else (match_op_dup 4 [(cc0) (const_int 0)])
(match_dup 2)
(match_dup 3)))]
{
operands[4] = GEN_INT (- INTVAL (operands[1]));
operands[5] = GEN_INT (- INTVAL (operands[1]));
})
;; Transform
@ -901,10 +898,10 @@
(compare (match_operand:SI 0 "register_operand" "")
(match_operand:SI 1 "const_int_operand" "")))
(set (pc)
(if_then_else (match_operator 3 "eqne_operator"
(if_then_else (match_operator 4 "eqne_operator"
[(cc0) (const_int 0)])
(label_ref (match_operand 2 "" ""))
(pc)))]
(match_operand 2 "pc_or_label_operand" "")
(match_operand 3 "pc_or_label_operand" "")))]
"peep2_reg_dead_p (1, operands[0])
&& ((INTVAL (operands[1]) & 0x00ff) == INTVAL (operands[1])
|| (INTVAL (operands[1]) & 0xff00) == INTVAL (operands[1])
@ -918,10 +915,9 @@
(set (cc0) (compare (match_dup 0)
(const_int 0)))
(set (pc)
(if_then_else (match_op_dup 3 [(cc0) (const_int 0)])
(label_ref (match_dup 2))
(pc)))]
"")
(if_then_else (match_op_dup 4 [(cc0) (const_int 0)])
(match_dup 2)
(match_dup 3)))])
;; Transform
;;
@ -939,10 +935,10 @@
(compare (match_operand:SI 0 "register_operand" "")
(match_operand:SI 1 "const_int_operand" "")))
(set (pc)
(if_then_else (match_operator 3 "eqne_operator"
(if_then_else (match_operator 4 "eqne_operator"
[(cc0) (const_int 0)])
(label_ref (match_operand 2 "" ""))
(pc)))]
(match_operand 2 "pc_or_label_operand" "")
(match_operand 3 "pc_or_label_operand" "")))]
"peep2_reg_dead_p (1, operands[0])
&& ((INTVAL (operands[1]) | 0x00ff) == -1
|| (INTVAL (operands[1]) | 0xff00) == -1)
@ -950,17 +946,17 @@
&& INTVAL (operands[1]) != -2"
[(set (match_dup 0)
(xor:SI (match_dup 0)
(match_dup 4)))
(match_dup 5)))
(set (match_dup 0)
(not:SI (match_dup 0)))
(set (cc0) (compare (match_dup 0)
(const_int 0)))
(set (pc)
(if_then_else (match_op_dup 3 [(cc0) (const_int 0)])
(label_ref (match_dup 2))
(pc)))]
(if_then_else (match_op_dup 4 [(cc0) (const_int 0)])
(match_dup 2)
(match_dup 3)))]
{
operands[4] = GEN_INT (INTVAL (operands[1]) ^ -1);
operands[5] = GEN_INT (INTVAL (operands[1]) ^ -1);
})
;; Transform
@ -979,16 +975,16 @@
(compare (match_operand:SI 0 "register_operand" "")
(match_operand:SI 1 "const_int_operand" "")))
(set (pc)
(if_then_else (match_operator 3 "eqne_operator"
(if_then_else (match_operator 4 "eqne_operator"
[(cc0) (const_int 0)])
(label_ref (match_operand 2 "" ""))
(pc)))]
(match_operand 2 "pc_or_label_operand" "")
(match_operand 3 "pc_or_label_operand" "")))]
"peep2_reg_dead_p (1, operands[0])
&& (INTVAL (operands[1]) == -2147483647 - 1
|| (TARGET_H8300S && INTVAL (operands[1]) == 1073741824))"
[(set (match_dup 0)
(rotate:SI (match_dup 0)
(match_dup 4)))
(match_dup 5)))
(set (match_dup 0)
(unspec:SI [(match_dup 0)
(const_int -1)]
@ -996,11 +992,11 @@
(set (cc0) (compare (match_dup 0)
(const_int 0)))
(set (pc)
(if_then_else (match_op_dup 3 [(cc0) (const_int 0)])
(label_ref (match_dup 2))
(pc)))]
(if_then_else (match_op_dup 4 [(cc0) (const_int 0)])
(match_dup 2)
(match_dup 3)))]
{
operands[4] = GEN_INT (INTVAL (operands[1]) == -2147483647 - 1 ? 1 : 2);
operands[5] = GEN_INT (INTVAL (operands[1]) == -2147483647 - 1 ? 1 : 2);
})
;; Transform
@ -1018,33 +1014,33 @@
;; same compare insn immediately before this one.
(define_peephole2
[(match_scratch:SI 4 "r")
[(match_scratch:SI 5 "r")
(set (cc0)
(compare (match_operand:SI 0 "register_operand" "")
(match_operand:SI 1 "const_int_operand" "")))
(set (pc)
(if_then_else (match_operator 2 "gtle_operator"
(if_then_else (match_operator 4 "gtle_operator"
[(cc0) (const_int 0)])
(label_ref (match_operand 3 "" ""))
(pc)))]
(match_operand 2 "pc_or_label_operand" "")
(match_operand 3 "pc_or_label_operand" "")))]
"!peep2_reg_dead_p (1, operands[0])
&& (INTVAL (operands[1]) == 1
|| (TARGET_H8300S && INTVAL (operands[1]) == 3))
&& !same_cmp_preceding_p (insn)"
[(set (match_dup 4)
[(set (match_dup 5)
(match_dup 0))
(parallel [(set (match_dup 4)
(ashiftrt:SI (match_dup 4)
(match_dup 5)))
(parallel [(set (match_dup 5)
(ashiftrt:SI (match_dup 5)
(match_dup 6)))
(clobber (scratch:QI))])
(set (cc0) (compare (match_dup 4)
(set (cc0) (compare (match_dup 5)
(const_int 0)))
(set (pc)
(if_then_else (match_dup 2)
(label_ref (match_dup 3))
(pc)))]
(if_then_else (match_dup 4)
(match_dup 2)
(match_dup 3)))]
{
operands[5] = GEN_INT (exact_log2 (INTVAL (operands[1]) + 1));
operands[6] = GEN_INT (exact_log2 (INTVAL (operands[1]) + 1));
})
;; Transform
@ -1062,34 +1058,34 @@
;; same compare insn immediately before this one.
(define_peephole2
[(match_scratch:SI 4 "r")
[(match_scratch:SI 5 "r")
(set (cc0)
(compare (match_operand:SI 0 "register_operand" "")
(match_operand:SI 1 "const_int_operand" "")))
(set (pc)
(if_then_else (match_operator 2 "gtuleu_operator"
(if_then_else (match_operator 4 "gtuleu_operator"
[(cc0) (const_int 0)])
(label_ref (match_operand 3 "" ""))
(pc)))]
(match_operand 2 "pc_or_label_operand" "")
(match_operand 3 "pc_or_label_operand" "")))]
"!peep2_reg_dead_p (1, operands[0])
&& (INTVAL (operands[1]) == 1
|| (TARGET_H8300S && INTVAL (operands[1]) == 3))
&& !same_cmp_preceding_p (insn)"
[(set (match_dup 4)
[(set (match_dup 5)
(match_dup 0))
(parallel [(set (match_dup 4)
(ashiftrt:SI (match_dup 4)
(match_dup 5)))
(parallel [(set (match_dup 5)
(ashiftrt:SI (match_dup 5)
(match_dup 6)))
(clobber (scratch:QI))])
(set (cc0) (compare (match_dup 4)
(set (cc0) (compare (match_dup 5)
(const_int 0)))
(set (pc)
(if_then_else (match_dup 6)
(label_ref (match_dup 3))
(pc)))]
(if_then_else (match_dup 7)
(match_dup 2)
(match_dup 3)))]
{
operands[5] = GEN_INT (exact_log2 (INTVAL (operands[1]) + 1));
operands[6] = gen_rtx_fmt_ee (GET_CODE (operands[2]) == GTU ? NE : EQ,
operands[6] = GEN_INT (exact_log2 (INTVAL (operands[1]) + 1));
operands[7] = gen_rtx_fmt_ee (GET_CODE (operands[4]) == GTU ? NE : EQ,
VOIDmode, cc0_rtx, const0_rtx);
})
@ -1108,25 +1104,25 @@
(compare (match_operand:SI 0 "register_operand" "")
(match_operand:SI 1 "const_int_operand" "")))
(set (pc)
(if_then_else (match_operator 2 "gtle_operator"
(if_then_else (match_operator 4 "gtle_operator"
[(cc0) (const_int 0)])
(label_ref (match_operand 3 "" ""))
(pc)))]
(match_operand 2 "pc_or_label_operand" "")
(match_operand 3 "pc_or_label_operand" "")))]
"peep2_reg_dead_p (1, operands[0])
&& (INTVAL (operands[1]) == 1
|| (TARGET_H8300S && INTVAL (operands[1]) == 3))"
[(parallel [(set (match_dup 0)
(ashiftrt:SI (match_dup 0)
(match_dup 4)))
(match_dup 5)))
(clobber (scratch:QI))])
(set (cc0) (compare (match_dup 0)
(const_int 0)))
(set (pc)
(if_then_else (match_dup 2)
(label_ref (match_dup 3))
(pc)))]
(if_then_else (match_dup 4)
(match_dup 2)
(match_dup 3)))]
{
operands[4] = GEN_INT (exact_log2 (INTVAL (operands[1]) + 1));
operands[5] = GEN_INT (exact_log2 (INTVAL (operands[1]) + 1));
})
;; Transform
@ -1144,26 +1140,26 @@
(compare (match_operand:SI 0 "register_operand" "")
(match_operand:SI 1 "const_int_operand" "")))
(set (pc)
(if_then_else (match_operator 2 "gtuleu_operator"
(if_then_else (match_operator 4 "gtuleu_operator"
[(cc0) (const_int 0)])
(label_ref (match_operand 3 "" ""))
(pc)))]
(match_operand 2 "pc_or_label_operand" "")
(match_operand 3 "pc_or_label_operand" "")))]
"peep2_reg_dead_p (1, operands[0])
&& (INTVAL (operands[1]) == 1
|| (TARGET_H8300S && INTVAL (operands[1]) == 3))"
[(parallel [(set (match_dup 0)
(ashiftrt:SI (match_dup 0)
(match_dup 4)))
(match_dup 5)))
(clobber (scratch:QI))])
(set (cc0) (compare (match_dup 0)
(const_int 0)))
(set (pc)
(if_then_else (match_dup 5)
(label_ref (match_dup 3))
(pc)))]
(if_then_else (match_dup 6)
(match_dup 2)
(match_dup 3)))]
{
operands[4] = GEN_INT (exact_log2 (INTVAL (operands[1]) + 1));
operands[5] = gen_rtx_fmt_ee (GET_CODE (operands[2]) == GTU ? NE : EQ,
operands[5] = GEN_INT (exact_log2 (INTVAL (operands[1]) + 1));
operands[6] = gen_rtx_fmt_ee (GET_CODE (operands[4]) == GTU ? NE : EQ,
VOIDmode, cc0_rtx, const0_rtx);
})
@ -1183,10 +1179,10 @@
(compare (match_operand:SI 0 "register_operand" "")
(match_operand:SI 1 "const_int_operand" "")))
(set (pc)
(if_then_else (match_operator 2 "gtle_operator"
(if_then_else (match_operator 4 "gtle_operator"
[(cc0) (const_int 0)])
(label_ref (match_operand 3 "" ""))
(pc)))]
(match_operand 2 "pc_or_label_operand" "")
(match_operand 3 "pc_or_label_operand" "")))]
"peep2_reg_dead_p (1, operands[0])
&& (INTVAL (operands[1]) == 3
|| INTVAL (operands[1]) == 7
@ -1197,15 +1193,15 @@
|| INTVAL (operands[1]) == 255)"
[(set (match_dup 0)
(and:SI (match_dup 0)
(match_dup 4)))
(match_dup 5)))
(set (cc0) (compare (match_dup 0)
(const_int 0)))
(set (pc)
(if_then_else (match_dup 2)
(label_ref (match_dup 3))
(pc)))]
(if_then_else (match_dup 4)
(match_dup 2)
(match_dup 3)))]
{
operands[4] = GEN_INT (~INTVAL (operands[1]));
operands[5] = GEN_INT (~INTVAL (operands[1]));
})
;; Transform
@ -1224,10 +1220,10 @@
(compare (match_operand:SI 0 "register_operand" "")
(match_operand:SI 1 "const_int_operand" "")))
(set (pc)
(if_then_else (match_operator 2 "gtuleu_operator"
(if_then_else (match_operator 4 "gtuleu_operator"
[(cc0) (const_int 0)])
(label_ref (match_operand 3 "" ""))
(pc)))]
(match_operand 2 "pc_or_label_operand" "")
(match_operand 3 "pc_or_label_operand" "")))]
"peep2_reg_dead_p (1, operands[0])
&& ((TARGET_H8300H && INTVAL (operands[1]) == 3)
|| INTVAL (operands[1]) == 7
@ -1238,16 +1234,16 @@
|| INTVAL (operands[1]) == 255)"
[(set (match_dup 0)
(and:SI (match_dup 0)
(match_dup 4)))
(match_dup 5)))
(set (cc0) (compare (match_dup 0)
(const_int 0)))
(set (pc)
(if_then_else (match_dup 5)
(label_ref (match_dup 3))
(pc)))]
(if_then_else (match_dup 6)
(match_dup 2)
(match_dup 3)))]
{
operands[4] = GEN_INT (~INTVAL (operands[1]));
operands[5] = gen_rtx_fmt_ee (GET_CODE (operands[2]) == GTU ? NE : EQ,
operands[5] = GEN_INT (~INTVAL (operands[1]));
operands[6] = gen_rtx_fmt_ee (GET_CODE (operands[4]) == GTU ? NE : EQ,
VOIDmode, cc0_rtx, const0_rtx);
})
@ -1268,17 +1264,16 @@
(set (pc)
(if_then_else (match_operator 1 "gtle_operator"
[(cc0) (const_int 0)])
(label_ref (match_operand 2 "" ""))
(pc)))]
(match_operand 2 "pc_or_label_operand" "")
(match_operand 3 "pc_or_label_operand" "")))]
""
[(set (cc0) (compare (and:SI (match_dup 0)
(const_int -65536))
(const_int 0)))
(set (pc)
(if_then_else (match_dup 1)
(label_ref (match_dup 2))
(pc)))]
"")
(match_dup 2)
(match_dup 3)))])
;; Transform
;;
@ -1297,18 +1292,18 @@
(set (pc)
(if_then_else (match_operator 1 "gtuleu_operator"
[(cc0) (const_int 0)])
(label_ref (match_operand 2 "" ""))
(pc)))]
(match_operand 2 "pc_or_label_operand" "")
(match_operand 3 "pc_or_label_operand" "")))]
""
[(set (cc0) (compare (and:SI (match_dup 0)
(const_int -65536))
(const_int 0)))
(set (pc)
(if_then_else (match_dup 3)
(label_ref (match_dup 2))
(pc)))]
(if_then_else (match_dup 4)
(match_dup 2)
(match_dup 3)))]
{
operands[3] = gen_rtx_fmt_ee (GET_CODE (operands[1]) == GTU ? NE : EQ,
operands[4] = gen_rtx_fmt_ee (GET_CODE (operands[1]) == GTU ? NE : EQ,
VOIDmode, cc0_rtx, const0_rtx);
})
@ -1327,32 +1322,32 @@
;; same compare insn.
(define_peephole2
[(match_scratch:SI 4 "r")
[(match_scratch:SI 5 "r")
(set (cc0)
(compare (match_operand:SI 0 "register_operand" "")
(match_operand:SI 1 "incdec_operand" "")))
(set (pc)
(if_then_else (match_operator 3 "eqne_operator"
(if_then_else (match_operator 4 "eqne_operator"
[(cc0) (const_int 0)])
(label_ref (match_operand 2 "" ""))
(pc)))]
(match_operand 2 "pc_or_label_operand" "")
(match_operand 3 "pc_or_label_operand" "")))]
"INTVAL (operands[1]) != 0
&& !peep2_reg_dead_p (1, operands[0])
&& !same_cmp_following_p (insn)"
[(set (match_dup 4)
[(set (match_dup 5)
(match_dup 0))
(set (match_dup 4)
(unspec:SI [(match_dup 4)
(match_dup 5)]
(set (match_dup 5)
(unspec:SI [(match_dup 5)
(match_dup 6)]
UNSPEC_INCDEC))
(set (cc0) (compare (match_dup 4)
(set (cc0) (compare (match_dup 5)
(const_int 0)))
(set (pc)
(if_then_else (match_op_dup 3 [(cc0) (const_int 0)])
(label_ref (match_dup 2))
(pc)))]
(if_then_else (match_op_dup 4 [(cc0) (const_int 0)])
(match_dup 2)
(match_dup 3)))]
{
operands[5] = GEN_INT (- INTVAL (operands[1]));
operands[6] = GEN_INT (- INTVAL (operands[1]));
})
;; Narrow the mode of testing if possible.
@ -1364,28 +1359,28 @@
(set (cc0) (compare (match_dup 0)
(const_int 0)))
(set (pc)
(if_then_else (match_operator 3 "eqne_operator"
(if_then_else (match_operator 4 "eqne_operator"
[(cc0) (const_int 0)])
(label_ref (match_operand 2 "" ""))
(pc)))]
(match_operand 2 "pc_or_label_operand" "")
(match_operand 3 "pc_or_label_operand" "")))]
"((const_int_qi_operand (operands[1], QImode)
|| (GET_MODE (operands[0]) == SImode
&& const_int_hi_operand (operands[1], HImode)))
&& peep2_reg_dead_p (2, operands[0]))"
[(set (match_dup 4) (match_dup 6))
(set (cc0) (compare (match_dup 4)
[(set (match_dup 5) (match_dup 7))
(set (cc0) (compare (match_dup 5)
(const_int 0)))
(set (pc)
(if_then_else (match_op_dup 3 [(cc0) (const_int 0)])
(label_ref (match_dup 2))
(pc)))]
(if_then_else (match_op_dup 4 [(cc0) (const_int 0)])
(match_dup 2)
(match_dup 3)))]
{
enum machine_mode mode;
mode = const_int_qi_operand (operands[1], QImode) ? QImode : HImode;
operands[4] = gen_rtx_REG (mode, REGNO (operands[0]));
operands[5] = gen_int_mode (INTVAL (operands[1]), mode);
operands[6] = gen_rtx_AND (mode, operands[4], operands[5]);
operands[5] = gen_rtx_REG (mode, REGNO (operands[0]));
operands[6] = gen_int_mode (INTVAL (operands[1]), mode);
operands[7] = gen_rtx_AND (mode, operands[5], operands[6]);
})
;; These triggers right at the end of allocation of locals in the

View File

@ -495,3 +495,9 @@
return (code == IOR || code == XOR);
})
;; Used to detect valid targets for conditional branches
;; Used to detect (pc) or (label_ref) in some jumping patterns
(define_predicate "pc_or_label_operand"
(match_code "pc,label_ref"))