summaryrefslogtreecommitdiff
path: root/gcc/config/m68k/m68k.md
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/config/m68k/m68k.md')
-rw-r--r--gcc/config/m68k/m68k.md21
1 files changed, 20 insertions, 1 deletions
diff --git a/gcc/config/m68k/m68k.md b/gcc/config/m68k/m68k.md
index 208561996e7..c6130f12386 100644
--- a/gcc/config/m68k/m68k.md
+++ b/gcc/config/m68k/m68k.md
@@ -7786,7 +7786,6 @@
operands[6] = GEN_INT (exact_log2 (INTVAL (operands[1]) + 1));
operands[7] = operands[2];
}")
-
(define_peephole2
[(set (cc0) (compare (match_operand:SI 0 "register_operand" "")
(match_operand:SI 1 "pow2_m1_operand" "")))
@@ -7804,3 +7803,23 @@
(match_dup 2) (match_dup 3)))]
"{ operands[4] = GEN_INT (exact_log2 (INTVAL (operands[1]) + 1)); }")
+;; When optimizing for size or for the original 68000 or 68010, we can
+;; improve some relational tests against 65536 (which get canonicalized
+;; internally against 65535).
+;; The rotate in the output pattern will turn into a swap.
+(define_peephole2
+ [(set (cc0) (compare (match_operand:SI 0 "register_operand" "")
+ (const_int 65535)))
+ (set (pc) (if_then_else (match_operator 1 "swap_peephole_relational_operator"
+ [(cc0) (const_int 0)])
+ (match_operand 2 "pc_or_label_operand")
+ (match_operand 3 "pc_or_label_operand")))]
+ "peep2_reg_dead_p (1, operands[0])
+ && (operands[2] == pc_rtx || operands[3] == pc_rtx)
+ && (optimize_size || TUNE_68000_10)
+ && DATA_REG_P (operands[0])"
+ [(set (match_dup 0) (rotate:SI (match_dup 0) (const_int 16)))
+ (set (cc0) (compare (subreg:HI (match_dup 0) 2) (const_int 0)))
+ (set (pc) (if_then_else (match_op_dup 1 [(cc0) (const_int 0)])
+ (match_dup 2) (match_dup 3)))]
+ "")