Patchwork Fix rot[hq]i3+1 patterns in m68k backend

login
register
mail settings
Submitter Andreas Schwab
Date May 15, 2013, 4:11 p.m.
Message ID <mvmli7gw7cn.fsf@hawking.suse.de>
Download mbox | patch
Permalink /patch/244127/
State New
Headers show

Comments

Andreas Schwab - May 15, 2013, 4:11 p.m.
r198864 uncovered a very old bug in the m68k backend, introduced in
1997: probably due to a copy-paste bug the rot[hq]i3+1 patterns
reference a non-existing operand.  Apparently these patterns have never
matched before.  Tested on m68k-linux and checked in.

Andreas.

	* config/m68k/m68k.md (*rotlhi3_lowpart, *rotlqi3_lowpart): Name
	for rotlhi3+1 and rotlqi3+1, resp.  Fix reference to non-existing
	third operand.

Patch

diff --git a/gcc/config/m68k/m68k.md b/gcc/config/m68k/m68k.md
index abf4b61..719b86b 100644
--- a/gcc/config/m68k/m68k.md
+++ b/gcc/config/m68k/m68k.md
@@ -5211,19 +5211,19 @@ 
     return "rol%.w %2,%0";
 })
 
-(define_insn ""
+(define_insn "*rotlhi3_lowpart"
   [(set (strict_low_part (match_operand:HI 0 "register_operand" "+d"))
 	(rotate:HI (match_dup 0)
 		   (match_operand:HI 1 "general_operand" "dIP")))]
   "!TARGET_COLDFIRE"
 {
-  if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) >= 8)
+  if (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) >= 8)
     {
-      operands[2] = GEN_INT (16 - INTVAL (operands[2]));
-      return "ror%.w %2,%0";
+      operands[1] = GEN_INT (16 - INTVAL (operands[1]));
+      return "ror%.w %1,%0";
     }
   else
-    return "rol%.w %2,%0";
+    return "rol%.w %1,%0";
 })
 
 (define_insn "rotlqi3"
@@ -5241,19 +5241,19 @@ 
     return "rol%.b %2,%0";
 })
 
-(define_insn ""
+(define_insn "*rotlqi3_lowpart"
   [(set (strict_low_part (match_operand:QI 0 "register_operand" "+d"))
 	(rotate:QI (match_dup 0)
 		   (match_operand:QI 1 "general_operand" "dI")))]
   "!TARGET_COLDFIRE"
 {
-  if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) >= 4)
+  if (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) >= 4)
     {
-      operands[2] = GEN_INT (8 - INTVAL (operands[2]));
-      return "ror%.b %2,%0";
+      operands[1] = GEN_INT (8 - INTVAL (operands[1]));
+      return "ror%.b %1,%0";
     }
   else
-    return "rol%.b %2,%0";
+    return "rol%.b %1,%0";
 })
 
 (define_insn "rotrsi3"