[multiple changes]
authorGeoffrey Keating <geoffk@gcc.gnu.org>
Mon, 2 Jul 2001 20:02:54 +0000 (20:02 +0000)
committerGeoffrey Keating <geoffk@gcc.gnu.org>
Mon, 2 Jul 2001 20:02:54 +0000 (20:02 +0000)
2001-07-02  Geoffrey Keating  <geoffk@redhat.com>

* doc/tm.texi (Frame Layout): Document STACK_PUSH_CODE.

* expr.c (emit_move_insn_1): Deal with non-default
STACK_PUSH_CODE.

* expr.c (emit_single_push_insn): Fix warning.

2001-07-02  Toshiyasu Morita  <toshiyasu.morita@hsa.hitachi.com>

* expr.c (emit_move_insn_1): Avoid modifying
cfun->expr->x_stack_pointer when PUSH_ROUNDING is defined.

From-SVN: r43703

gcc/ChangeLog
gcc/doc/tm.texi
gcc/expr.c

index 3721aff6413b92c2f746070a246a6ffdd18741fc..0aa761dc41610f26b95855384e28eef67d6403ff 100644 (file)
@@ -1,3 +1,17 @@
+2001-07-02  Geoffrey Keating  <geoffk@redhat.com>
+
+       * doc/tm.texi (Frame Layout): Document STACK_PUSH_CODE.
+
+       * expr.c (emit_move_insn_1): Deal with non-default
+       STACK_PUSH_CODE.
+
+       * expr.c (emit_single_push_insn): Fix warning.
+
+2001-07-02  Toshiyasu Morita  <toshiyasu.morita@hsa.hitachi.com>
+
+       * expr.c (emit_move_insn_1): Avoid modifying
+       cfun->expr->x_stack_pointer when PUSH_ROUNDING is defined.
+
 Mon Jul  2 15:33:31 2001  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
 
        * emit-rtl.c (adjust_address): New function.
index 89cd1429269c3000880d33075a9b17ac1a37d5f6..81aa6b9726c568f07bc369e37792669d2f3b571c 100644 (file)
@@ -2507,6 +2507,23 @@ When we say, ``define this macro if @dots{},'' it means that the
 compiler checks this macro only with @code{#ifdef} so the precise
 definition used does not matter.
 
+@findex STACK_PUSH_CODE
+@item STACK_PUSH_CODE
+
+This macro defines the operation used when something is pushed
+on the stack.  In RTL, a push operation will be
+@code{(set (mem (STACK_PUSH_CODE (reg sp))) ...)}
+
+The choices are @code{PRE_DEC}, @code{POST_DEC}, @code{PRE_INC},
+and @code{POST_INC}.  Which of these is correct depends on
+the stack direction and on whether the stack pointer points
+to the last item on the stack or whether it points to the
+space for the next item on the stack.
+
+The default is @code{PRE_DEC} when @code{STACK_GROWS_DOWNWARD} is
+defined, which is almost always right, and @code{PRE_INC} otherwise,
+which is often wrong.
+
 @findex FRAME_GROWS_DOWNWARD
 @item FRAME_GROWS_DOWNWARD
 Define this macro if the addresses of local variable slots are at negative
index a83194a1ef991a3f9e3d34bfbb930826bb96b1cd..6eb90a643f0d77aa3e8eaacf30a7186e93ca6937 100644 (file)
@@ -2964,8 +2964,39 @@ emit_move_insn_1 (x, y)
         X with a reference to the stack pointer.  */
       if (push_operand (x, GET_MODE (x)))
        {
-         anti_adjust_stack (GEN_INT (GET_MODE_SIZE (GET_MODE (x))));
-         x = change_address (x, VOIDmode, stack_pointer_rtx);
+         rtx temp;
+         enum rtx_code code;
+         
+         /* Do not use anti_adjust_stack, since we don't want to update
+            stack_pointer_delta.  */
+         temp = expand_binop (Pmode,
+#ifdef STACK_GROWS_DOWNWARD
+                              sub_optab,
+#else
+                              add_optab,
+#endif
+                              stack_pointer_rtx,
+                              GEN_INT
+                                (PUSH_ROUNDING (GET_MODE_SIZE (GET_MODE (x)))),
+                              stack_pointer_rtx,
+                              0,
+                              OPTAB_LIB_WIDEN);
+          if (temp != stack_pointer_rtx)
+            emit_move_insn (stack_pointer_rtx, temp);
+
+         code = GET_CODE (XEXP (x, 0));
+         /* Just hope that small offsets off SP are OK.  */
+         if (code == POST_INC)
+           temp = gen_rtx_PLUS (Pmode, stack_pointer_rtx, 
+                               GEN_INT (-(HOST_WIDE_INT)
+                                          GET_MODE_SIZE (GET_MODE (x))));
+         else if (code == POST_DEC)
+           temp = gen_rtx_PLUS (Pmode, stack_pointer_rtx, 
+                               GEN_INT (GET_MODE_SIZE (GET_MODE (x))));
+         else
+           temp = stack_pointer_rtx;
+
+         x = change_address (x, VOIDmode, temp);
        }
 #endif
 
@@ -3133,7 +3164,7 @@ emit_single_push_insn (mode, x, type)
 {
 #ifdef PUSH_ROUNDING
   rtx dest_addr;
-  int rounded_size = PUSH_ROUNDING (GET_MODE_SIZE (mode));
+  unsigned rounded_size = PUSH_ROUNDING (GET_MODE_SIZE (mode));
   rtx dest;
 
   if (GET_MODE_SIZE (mode) == rounded_size)
@@ -3142,7 +3173,7 @@ emit_single_push_insn (mode, x, type)
     {
 #ifdef STACK_GROWS_DOWNWARD
       dest_addr = gen_rtx_PLUS (Pmode, stack_pointer_rtx,
-                               GEN_INT (-rounded_size));
+                               GEN_INT (-(HOST_WIDE_INT)rounded_size));
 #else
       dest_addr = gen_rtx_PLUS (Pmode, stack_pointer_rtx,
                                GEN_INT (rounded_size));