m68hc11.md ("mulqi3"): Allow address register to avoid reload problems; define split...
authorStephane Carrez <stcarrez@nerim.fr>
Sun, 2 Mar 2003 20:19:20 +0000 (21:19 +0100)
committerStephane Carrez <ciceron@gcc.gnu.org>
Sun, 2 Mar 2003 20:19:20 +0000 (21:19 +0100)
* config/m68hc11/m68hc11.md ("mulqi3"): Allow address register to
avoid reload problems; define split for it.

From-SVN: r63680

gcc/ChangeLog
gcc/config/m68hc11/m68hc11.md

index 03eb0fac32ee455c9fbeac23dd0ac70ba734d09d..f63a647fa356819b85f7dd428737e3a760ceae6c 100644 (file)
@@ -1,3 +1,8 @@
+2003-03-02  Stephane Carrez  <stcarrez@nerim.fr>
+
+       * config/m68hc11/m68hc11.md ("mulqi3"): Allow address register to
+       avoid reload problems; define split for it.
+
 2003-03-02  Stephane Carrez  <stcarrez@nerim.fr>
 
        * config/m68hc11/m68hc11.c (m68hc11_shift_operator): New function.
index 8117d486973991b9eaec500739c1c6430f82709c..4841aebf003e1fbd675c43b53fffe4b52296cf69 100644 (file)
 }")
 
 (define_insn "mulqi3"
-  [(set (match_operand:QI 0 "register_operand" "=d")
-        (mult:QI (match_operand:QI 1 "nonimmediate_operand" "dum")
-                (match_operand:QI 2 "nonimmediate_operand" "dum")))]
+  [(set (match_operand:QI 0 "register_operand" "=d,*x,*y")
+        (mult:QI (match_operand:QI 1 "nonimmediate_operand" "%dum,0,0")
+                (match_operand:QI 2 "general_operand" "dium,*xium,*yium")))]
   ""
   "*
 {
+  if (A_REG_P (operands[0]))
+    return \"#\";
+
   if (D_REG_P (operands[1]) && D_REG_P (operands[2]))
     {
       output_asm_insn (\"tba\", operands);
   return \"mul\";
 }")
 
+(define_split
+  [(set (match_operand:QI 0 "hard_addr_reg_operand" "")
+        (mult:QI (match_operand:QI 1 "general_operand" "")
+                (match_operand:QI 2 "general_operand" "")))]
+  "z_replacement_completed == 2"
+  [(parallel [(set (reg:HI D_REGNUM) (match_dup 3))
+             (set (match_dup 3) (reg:HI D_REGNUM))])
+   (set (reg:QI D_REGNUM) (mult:QI (match_dup 5) (match_dup 6)))
+   (parallel [(set (reg:HI D_REGNUM) (match_dup 3))
+              (set (match_dup 3) (reg:HI D_REGNUM))])]
+  "
+   operands[3] = gen_rtx (REG, HImode, REGNO (operands[0]));
+   if (A_REG_P (operands[1]))
+     operands[5] = gen_rtx (REG, QImode, HARD_D_REGNUM);
+   else
+     operands[5] = operands[1];
+   if (A_REG_P (operands[2]))
+     operands[6] = gen_rtx (REG, QImode, HARD_D_REGNUM);
+   else
+     operands[6] = operands[2];
+  ")
+
 (define_insn "mulqihi3"
   [(set (match_operand:HI 0 "register_operand" "=d,d")
         (mult:HI (sign_extend:HI