diff options
Diffstat (limited to 'gcc/config/m68k/m68k.md')
-rw-r--r-- | gcc/config/m68k/m68k.md | 21 |
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)))] + "") |