;; dead 1 eq/ne dec.l
;; dead 2 eq/ne dec.l
;;
-;; dead 1 geu/ltu shlr.l
-;; dead 3 (H8S) geu/ltu shlr.l
+;; dead 1 geu/ltu shar.l
+;; dead 3 (H8S) geu/ltu shar.l
;;
;; ---- 255 geu/ltu mov.b
;;
;; into
;;
-;; shlr.w r0
+;; shar.w r0
;; bne .L1
(define_peephole2
(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 2 "gtle_operator"
[(cc0) (const_int 0)])
(label_ref (match_operand 3 "" ""))
(pc)))]
&& (INTVAL (operands[1]) == 1
|| (TARGET_H8300S && INTVAL (operands[1]) == 3))"
[(parallel [(set (match_dup 0)
- (lshiftrt:HI (match_dup 0)
+ (ashiftrt:HI (match_dup 0)
(match_dup 5)))
(clobber (scratch:QI))])
(set (cc0)
(if_then_else (match_dup 4)
(label_ref (match_dup 3))
(pc)))]
- "operands[4] = ((GET_CODE (operands[2]) == GTU) ?
- gen_rtx_NE (VOIDmode, cc0_rtx, const0_rtx) :
- gen_rtx_EQ (VOIDmode, cc0_rtx, const0_rtx));
+ "switch (GET_CODE (operands[2]))
+ {
+ case GTU:
+ operands[4] = gen_rtx_NE (VOIDmode, cc0_rtx, const0_rtx);
+ break;
+ case LEU:
+ operands[4] = gen_rtx_EQ (VOIDmode, cc0_rtx, const0_rtx);
+ break;
+ default:
+ operands[4] = operands[2];
+ break;
+ }
operands[5] = GEN_INT (exact_log2 (INTVAL (operands[1]) + 1));")
;; Transform
;; dead 0xffffff?? except -1 and -2 eq/ne xor.b and not.l
;; dead 0xffff??ff eq/ne xor.b and not.l
;;
-;; live 1 geu/ltu copy and shlr.l
-;; live 3 (H8S) geu/ltu copy and shlr.l
+;; live 1 geu/ltu copy and shar.l
+;; live 3 (H8S) geu/ltu copy and shar.l
;;
-;; dead 1 geu/ltu shlr.l
-;; dead 3 (H8S) geu/ltu shlr.l
+;; dead 1 geu/ltu shar.l
+;; dead 3 (H8S) geu/ltu shar.l
;;
;; dead 3 (H8/300H) geu/ltu and.b and test
;; dead 7 geu/ltu and.b and test
;; into
;;
;; mov.l er0,er1
-;; shlr.l er1
+;; shar.l er1
;; bne .L1
+;; We avoid this transformation if we see more than one copy of the
+;; same compare insn immediately before this one.
+
(define_peephole2
[(match_scratch:SI 4 "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 2 "gtle_operator"
[(cc0) (const_int 0)])
(label_ref (match_operand 3 "" ""))
(pc)))]
"(TARGET_H8300H || TARGET_H8300S)
&& !peep2_reg_dead_p (1, operands[0])
&& (INTVAL (operands[1]) == 1
- || (TARGET_H8300S && INTVAL (operands[1]) == 3))"
+ || (TARGET_H8300S && INTVAL (operands[1]) == 3))
+ && !same_cmp_preceding_p (insn)"
[(set (match_dup 4)
(match_dup 0))
(parallel [(set (match_dup 4)
- (lshiftrt:SI (match_dup 4)
+ (ashiftrt:SI (match_dup 4)
(match_dup 6)))
(clobber (scratch:QI))])
(set (cc0)
(if_then_else (match_dup 5)
(label_ref (match_dup 3))
(pc)))]
- "operands[5] = ((GET_CODE (operands[2]) == GTU) ?
- gen_rtx_NE (VOIDmode, cc0_rtx, const0_rtx) :
- gen_rtx_EQ (VOIDmode, cc0_rtx, const0_rtx));
+ "switch (GET_CODE (operands[2]))
+ {
+ case GTU:
+ operands[5] = gen_rtx_NE (VOIDmode, cc0_rtx, const0_rtx);
+ break;
+ case LEU:
+ operands[5] = gen_rtx_EQ (VOIDmode, cc0_rtx, const0_rtx);
+ break;
+ default:
+ operands[5] = operands[2];
+ break;
+ }
operands[6] = GEN_INT (exact_log2 (INTVAL (operands[1]) + 1));")
;; Transform
;;
;; into
;;
-;; shlr.l er0
+;; shar.l er0
;; bne .L1
(define_peephole2
(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 2 "gtle_operator"
[(cc0) (const_int 0)])
(label_ref (match_operand 3 "" ""))
(pc)))]
&& (INTVAL (operands[1]) == 1
|| (TARGET_H8300S && INTVAL (operands[1]) == 3))"
[(parallel [(set (match_dup 0)
- (lshiftrt:SI (match_dup 0)
+ (ashiftrt:SI (match_dup 0)
(match_dup 5)))
(clobber (scratch:QI))])
(set (cc0)
(if_then_else (match_dup 4)
(label_ref (match_dup 3))
(pc)))]
- "operands[4] = ((GET_CODE (operands[2]) == GTU) ?
- gen_rtx_NE (VOIDmode, cc0_rtx, const0_rtx) :
- gen_rtx_EQ (VOIDmode, cc0_rtx, const0_rtx));
+ "switch (GET_CODE (operands[2]))
+ {
+ case GTU:
+ operands[4] = gen_rtx_NE (VOIDmode, cc0_rtx, const0_rtx);
+ break;
+ case LEU:
+ operands[4] = gen_rtx_EQ (VOIDmode, cc0_rtx, const0_rtx);
+ break;
+ default:
+ operands[4] = operands[2];
+ break;
+ }
operands[5] = GEN_INT (exact_log2 (INTVAL (operands[1]) + 1));")
;; Transform