m68hc11.md ("*ashlsi3"): Operand 1 can be a memory reference using the stack pointer...
authorStephane Carrez <Stephane.Carrez@worldnet.fr>
Thu, 5 Jul 2001 21:17:10 +0000 (23:17 +0200)
committerStephane Carrez <ciceron@gcc.gnu.org>
Thu, 5 Jul 2001 21:17:10 +0000 (23:17 +0200)
* config/m68hc11/m68hc11.md ("*ashlsi3"): Operand 1 can be a memory
reference using the stack pointer, adjust it since we push Y
temporarily.
("*ashrsi3"): Likewise.
("*lshrsi3"): Likewise.

From-SVN: r43791

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

index cd9975771b0a8f831324a75fda33b6eacc42f02e..03e9a4c127bf6988829ca44aee029b83681f58a0 100644 (file)
@@ -1,3 +1,11 @@
+2001-07-04  Stephane Carrez  <Stephane.Carrez@worldnet.fr>
+
+       * config/m68hc11/m68hc11.md ("*ashlsi3"): Operand 1 can be a memory 
+       reference using the stack pointer, adjust it since we push Y 
+       temporarily.
+       ("*ashrsi3"): Likewise.
+       ("*lshrsi3"): Likewise.
+
 2001-07-05  Stephane Carrez  <Stephane.Carrez@worldnet.fr>
 
        * config/m68hc11/m68hc11.h (RETURN_ADDR_RTX): Fix return address
index b7b8fe38d90da5e5fd09afcb2e80d9b612c166b5..f5992049563841354f1b6bf58e53569ad5f8999b 100644 (file)
      is true for 68hc11 only, we save temporary the value of Y.  */
   if (!Y_REG_P (operands[2]))
     {
+      rtx ops[1];
+
+      ops[0] = operands[1];
       output_asm_insn (\"pshy\", operands);
-      output_asm_insn (\"ldy\\t%1\", operands);
+      if (reg_mentioned_p (stack_pointer_rtx, operands[1]))
+       {
+         ops[0] = adjust_address (operands[1], GET_MODE (operands[1]), 2);
+       }
+      output_asm_insn (\"ldy\\t%0\", ops);
       output_asm_insn (\"bsr\\t___ashlsi3\", operands);
       return \"puly\";
     }
      is true for 68hc11 only, we save temporary the value of Y.  */
   if (!Y_REG_P (operands[2]))
     {
+      rtx ops[1];
+
+      ops[0] = operands[1];
       output_asm_insn (\"pshy\", operands);
-      output_asm_insn (\"ldy\\t%1\", operands);
+      if (reg_mentioned_p (stack_pointer_rtx, operands[1]))
+       {
+         ops[0] = adjust_address (operands[1], GET_MODE (operands[1]), 2);
+       }
+      output_asm_insn (\"ldy\\t%0\", ops);
       output_asm_insn (\"bsr\\t___ashrsi3\", operands);
       return \"puly\";
     }
      is true for 68hc11 only, we save temporary the value of Y.  */
   if (!Y_REG_P (operands[2]))
     {
+      rtx ops[1];
+
+      ops[0] = operands[1];
       output_asm_insn (\"pshy\", operands);
-      output_asm_insn (\"ldy\\t%1\", operands);
+      if (reg_mentioned_p (stack_pointer_rtx, operands[1]))
+       {
+         ops[0] = adjust_address (operands[1], GET_MODE (operands[1]), 2);
+       }
+      output_asm_insn (\"ldy\\t%0\", ops);
       output_asm_insn (\"bsr\\t___lshrsi3\", operands);
       return \"puly\";
     }