This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch] h8300.md: Add a new peephole2.


Hi,

Attached is a patch to add a new peephole2.

The new peephole2 transforms

	cmp.w	#1,r2 ; (compare (reg:HI) (const_int 1))
	bhi	.L8   ; jump if (reg:HI) > (const_int 1)

into

	shlr.w	r2    ; (lshiftrt (reg:HI) (const_int 1))
	bne	.L8   ; jump if nonzero

saving 2 bytes.  Similar optimization is possible for (const_int 3) on
H8S because it has 2-bit shift instructions.

Tested on h8300 port.  Committed.

Kazu Hirata

2003-03-31  Kazu Hirata  <kazu at cs dot umass dot edu>

	* config/h8300/h8300.md (a new peephole2): New.

Index: h8300.md
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/h8300/h8300.md,v
retrieving revision 1.206
diff -u -r1.206 h8300.md
--- h8300.md	30 Mar 2003 13:00:32 -0000	1.206
+++ h8300.md	30 Mar 2003 23:00:10 -0000
@@ -3955,6 +3955,50 @@
   "operands[3] = gen_lowpart (HImode, operands[0]);
    operands[4] = gen_lowpart (HImode, operands[1]);")
 
+;; (compare (reg:HI) (const_int)) takes 4 bytes, so we try to achieve
+;; the equivalent with shorter sequences.  Here is the summary.  Cases
+;; are grouped for each define_peephole2.
+;;
+;; reg  const_int                   use     insn
+;; --------------------------------------------------------
+;; 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     1                       geu/ltu shlr.l
+;; dead     3 (H8S)                 geu/ltu shlr.l
+;;
+;; dead   255                       geu/ltu mov.b
+
+(define_peephole2
+  [(set (cc0)
+	(compare (match_operand:HI 0 "register_operand" "")
+		 (match_operand:HI 1 "const_int_operand" "")))
+   (set (pc)
+	(if_then_else (match_operator 2 "gtuleu_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))"
+  [(parallel [(set (match_dup 0)
+		   (lshiftrt:HI (match_dup 0)
+				(match_dup 5)))
+	      (clobber (scratch:QI))])
+   (set (cc0)
+	(match_dup 0))
+   (set (pc)
+	(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));
+   operands[5] = GEN_INT (exact_log2 (INTVAL (operands[1]) + 1));")
+
 ;; (compare (reg:SI) (const_int)) takes 6 bytes, so we try to achieve
 ;; the equivalent with shorter sequences.  Here is the summary.  Cases
 ;; are grouped for each define_peephole2.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]