m68hc11.c (m68hc11_gen_movhi): Optimize moves between X and Y by using sequences...
authorStephane Carrez <Stephane.Carrez@worldnet.fr>
Sat, 5 May 2001 06:59:32 +0000 (08:59 +0200)
committerStephane Carrez <ciceron@gcc.gnu.org>
Sat, 5 May 2001 06:59:32 +0000 (08:59 +0200)
* config/m68hc11/m68hc11.c (m68hc11_gen_movhi): Optimize moves
between X and Y by using sequences of xgdx and xgdy.

From-SVN: r41861

gcc/ChangeLog
gcc/config/m68hc11/m68hc11.c

index 15f07bac8e315736355b0ddca464d12f4068ef42..2692493a756d603974d10e1fa81ed7fdb9a4052c 100644 (file)
@@ -1,3 +1,8 @@
+2001-05-05  Stephane Carrez  <Stephane.Carrez@worldnet.fr>
+
+       * config/m68hc11/m68hc11.c (m68hc11_gen_movhi): Optimize moves
+       between X and Y by using sequences of xgdx and xgdy.
+
 2001-05-05  Stephane Carrez  <Stephane.Carrez@worldnet.fr>
 
        * config/m68hc11/m68hc11.md ("*logicalsi3_silshr16"): Use '?' instead
index 8aa5095ae4e39b36d42a8009b25cf9c612e36c9f..f9de2dcf6984b3d54d3e50e378701d0704bcd440 100644 (file)
@@ -3135,8 +3135,20 @@ m68hc11_gen_movhi (insn, operands)
            }
          else if (Y_REG_P (operands[1]))
            {
-             output_asm_insn ("sty\t%t1", operands);
-             output_asm_insn ("ldx\t%t1", operands);
+              /* When both D and Y are dead, use the sequence xgdy, xgdx
+                 to move Y into X.  The D and Y registers are modified.  */
+              if (optimize && find_regno_note (insn, REG_DEAD, HARD_Y_REGNUM)
+                  && dead_register_here (insn, d_reg))
+                {
+                  output_asm_insn ("xgdy", operands);
+                  output_asm_insn ("xgdx", operands);
+                  CC_STATUS_INIT;
+                }
+              else
+                {
+                  output_asm_insn ("sty\t%t1", operands);
+                  output_asm_insn ("ldx\t%t1", operands);
+                }
            }
          else if (SP_REG_P (operands[1]))
            {
@@ -3165,8 +3177,20 @@ m68hc11_gen_movhi (insn, operands)
            }
          else if (X_REG_P (operands[1]))
            {
-             output_asm_insn ("stx\t%t1", operands);
-             output_asm_insn ("ldy\t%t1", operands);
+              /* When both D and X are dead, use the sequence xgdx, xgdy
+                 to move X into Y.  The D and X registers are modified.  */
+              if (optimize && find_regno_note (insn, REG_DEAD, HARD_X_REGNUM)
+                  && dead_register_here (insn, d_reg))
+                {
+                  output_asm_insn ("xgdx", operands);
+                  output_asm_insn ("xgdy", operands);
+                  CC_STATUS_INIT;
+                }
+              else
+                {
+                  output_asm_insn ("stx\t%t1", operands);
+                  output_asm_insn ("ldy\t%t1", operands);
+                }
            }
          else if (SP_REG_P (operands[1]))
            {