This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Patch to document STACK_PUSH_CODE, deal with it, and other things.
- To: gcc-patches at gcc dot gnu dot org
- Subject: Patch to document STACK_PUSH_CODE, deal with it, and other things.
- From: Geoffrey Keating <geoffk at thief dot cygnus dot com>
- Date: Mon, 2 Jul 2001 13:00:45 -0700
- CC: toshiyasu dot morita at hsa dot hitachi dot com
- Reply-To: geoffk at redhat dot com
This deals with two issues in emit_move_insn_1 in the same (rarely
used) chunk of code. The code operates only when a push insn is
generated but there is no mov* expander for the appropriate mode,
and it was wrong in a number of ways.
I'm also taking this opportunity to commit Toshi's patch.
Bootstrapped and tested on x86-linux, and also tested on the internal
Red Hat tree with a currently-confidential port.
--
Geoff Keating <geoffk@redhat.com>
===File ~/patches/gcc-stackpushcode.patch===================
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.
Index: expr.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/expr.c,v
retrieving revision 1.331
diff -p -u -p -r1.331 expr.c
--- expr.c 2001/07/01 20:49:58 1.331
+++ expr.c 2001/07/02 19:56:54
@@ -2973,8 +2973,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
@@ -3142,7 +3173,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)
@@ -3151,7 +3182,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));
Index: doc/tm.texi
===================================================================
RCS file: /cvs/gcc/gcc/gcc/doc/tm.texi,v
retrieving revision 1.20
diff -p -u -p -r1.20 tm.texi
--- tm.texi 2001/07/01 23:21:11 1.20
+++ tm.texi 2001/07/02 19:56:56
@@ -2507,6 +2507,23 @@ When we say, ``define this macro if @dot
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
============================================================