From: Kazu Hirata Date: Thu, 13 Feb 2003 16:33:00 +0000 (+0000) Subject: * config/h8300/h8300.md (a peephole2): New. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=4302db79108595d94210a96941129013edf335af;p=gcc.git * config/h8300/h8300.md (a peephole2): New. From-SVN: r62842 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index df485c494a1..4bb5a9a42f3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2003-02-13 Kazu Hirata + + * config/h8300/h8300.md (a peephole2): New. + 2003-02-13 Robert Lipe Gerald Pfeifer diff --git a/gcc/config/h8300/h8300.md b/gcc/config/h8300/h8300.md index 31454ba545c..8796dc03d00 100644 --- a/gcc/config/h8300/h8300.md +++ b/gcc/config/h8300/h8300.md @@ -3435,6 +3435,36 @@ (pc)))] "") +;; (compare:SI (reg) (const_int)) takes 6 bytes, so we try to achieve +;; the equivalent with shorter sequences. Here is the summary. +;; +;; reg const_int use insn +;; live -2 eq/ne copy and inc.l +;; live -1 eq/ne copy and inc.l +;; live 1 eq/ne copy and dec.l +;; live 2 eq/ne copy and dec.l +;; dead -6 eq/ne adds and inc.l +;; dead -5 eq/ne adds and inc.l +;; dead -4 eq/ne adds and test +;; dead -3 eq/ne adds and inc.l +;; dead -2 eq/ne inc.l +;; dead -1 eq/ne inc.l +;; dead 1 eq/ne dec.l +;; dead 2 eq/ne dec.l +;; dead 0x000000?? except 1 and 2 eq/ne xor.b and test +;; dead 0x0000??00 eq/ne xor.b and test +;; dead 0x0000ffff eq/ne not.w and test +;; dead 0xffff0000 eq/ne not.w and test +;; dead 1 geu/ltu and.b and test +;; dead 3 geu/ltu and.b and test +;; dead 7 geu/ltu and.b and test +;; dead 15 geu/ltu and.b and test +;; dead 31 geu/ltu and.b and test +;; dead 63 geu/ltu and.b and test +;; dead 127 geu/ltu and.b and test +;; dead 255 geu/ltu and.b and test +;; dead 65535 geu/ltu mov.w + ;; For a small constant, it is cheaper to actually do the subtraction ;; and then test the register. @@ -3480,6 +3510,38 @@ "operands[1] = GEN_INT (- INTVAL (operands[1])); split_adds_subs (SImode, operands, 1);") +;; For certain (in)equaltity comparisions against a constant, we can +;; XOR the register with the constant, and test the register against +;; 0. + +(define_peephole2 + [(set (cc0) + (compare:SI (match_operand:SI 0 "register_operand" "") + (match_operand:SI 1 "const_int_operand" ""))) + (set (pc) + (if_then_else (match_operator 3 "eqne_operator" + [(cc0) (const_int 0)]) + (label_ref (match_operand 2 "" "")) + (pc)))] + "(TARGET_H8300H || TARGET_H8300S) + && peep2_reg_dead_p (1, operands[0]) + && ((INTVAL (operands[1]) & 0x00ff) == INTVAL (operands[1]) + || (INTVAL (operands[1]) & 0xff00) == INTVAL (operands[1]) + || INTVAL (operands[1]) == 0x0000ffff + || INTVAL (operands[1]) == 0xffff0000) + && INTVAL (operands[1]) != 1 + && INTVAL (operands[1]) != 2" + [(set (match_dup 0) + (xor:SI (match_dup 0) + (match_dup 1))) + (set (cc0) + (match_dup 0)) + (set (pc) + (if_then_else (match_op_dup 3 [(cc0) (const_int 0)]) + (label_ref (match_dup 2)) + (pc)))] + "") + ;; Transform A <= 1 to (A & 0xfffffffe) == 0. (define_peephole2