[patch] h8300.md: Generalize a peephole2.

Kazu Hirata kazu@cs.umass.edu
Thu Apr 3 12:01:00 GMT 2003


Hi,

Attached is a patch to generalize two peephole2 to accept signed
comparisons.

After the generalization, the first peephole2 transforms

	cmp.w	#255,r3 ; jump if r3 <= 255
 	ble	.L7

into

	mov.b	r3h,r3h ; jump if (r3 & -256) <= 0
 	ble	.L7

A similar change is made to the second peephole2 to handle SImode.

Tested on h8300 port.  Committed.

Kazu Hirata

2003-04-03  Kazu Hirata  <kazu@cs.umass.edu>

	* config/h8300/h8300.md (a peephole2): Generalize to accept GT
	and LE.
	(another peephole2): Likewise.

Index: h8300.md
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/h8300/h8300.md,v
retrieving revision 1.212
diff -u -r1.212 h8300.md
--- h8300.md	3 Apr 2003 02:41:19 -0000	1.212
+++ h8300.md	3 Apr 2003 03:15:51 -0000
@@ -4057,7 +4057,7 @@
 	(compare (match_operand:HI 0 "register_operand" "")
 		 (const_int 255)))
    (set (pc)
-	(if_then_else (match_operator 1 "gtuleu_operator"
+	(if_then_else (match_operator 1 "gtle_operator"
 			[(cc0) (const_int 0)])
 		      (label_ref (match_operand 2 "" ""))
 		      (pc)))]
@@ -4066,12 +4066,21 @@
 	(and:HI (match_dup 0)
 		(const_int -256)))
    (set (pc)
-	(if_then_else (match_dup 4)
+	(if_then_else (match_dup 3)
 		      (label_ref (match_dup 2))
 		      (pc)))]
-  "operands[4] = ((GET_CODE (operands[1]) == GTU) ?
-		  gen_rtx_NE (VOIDmode, cc0_rtx, const0_rtx) :
-		  gen_rtx_EQ (VOIDmode, cc0_rtx, const0_rtx));")
+  "switch (GET_CODE (operands[1]))
+     {
+     case GTU:
+       operands[3] = gen_rtx_NE (VOIDmode, cc0_rtx, const0_rtx);
+       break;
+     case LEU:
+       operands[3] = gen_rtx_EQ (VOIDmode, cc0_rtx, const0_rtx);
+       break;
+     default:
+       operands[3] = operands[1];
+       break;
+     }")
 
 ;; (compare (reg:SI) (const_int)) takes 6 bytes, so we try to achieve
 ;; the equivalent with shorter sequences.  Here is the summary.  Cases
@@ -4367,7 +4376,7 @@
 	(compare (match_operand:SI 0 "register_operand" "")
 		 (const_int 65535)))
    (set (pc)
-	(if_then_else (match_operator 1 "gtuleu_operator"
+	(if_then_else (match_operator 1 "gtle_operator"
 			[(cc0) (const_int 0)])
 		      (label_ref (match_operand 2 "" ""))
 		      (pc)))]
@@ -4376,12 +4385,21 @@
 	(and:SI (match_dup 0)
 		(const_int -65536)))
    (set (pc)
-	(if_then_else (match_dup 4)
+	(if_then_else (match_dup 3)
 		      (label_ref (match_dup 2))
 		      (pc)))]
-  "operands[4] = ((GET_CODE (operands[1]) == GTU) ?
-		  gen_rtx_NE (VOIDmode, cc0_rtx, const0_rtx) :
-		  gen_rtx_EQ (VOIDmode, cc0_rtx, const0_rtx));")
+  "switch (GET_CODE (operands[1]))
+     {
+     case GTU:
+       operands[3] = gen_rtx_NE (VOIDmode, cc0_rtx, const0_rtx);
+       break;
+     case LEU:
+       operands[3] = gen_rtx_EQ (VOIDmode, cc0_rtx, const0_rtx);
+       break;
+     default:
+       operands[3] = operands[1];
+       break;
+     }")
 
 ;; For constants like -1, -2, 1, 2, it is still cheaper to make a copy
 ;; of the register being tested, do the subtraction on the copy, and



More information about the Gcc-patches mailing list