aboutsummaryrefslogtreecommitdiff
path: root/gcc/expr.c
diff options
context:
space:
mode:
authorGeoffrey Keating <geoffk@gcc.gnu.org>2001-07-02 20:02:54 +0000
committerGeoffrey Keating <geoffk@gcc.gnu.org>2001-07-02 20:02:54 +0000
commit918a61248dc591d88ca58507f8bdbad20edbe404 (patch)
treecae74d78e3737ad33b64159b25467f53d8953b26 /gcc/expr.c
parentf4ef873c3108a163d7789b137b391c3853c25011 (diff)
downloadgcc-918a61248dc591d88ca58507f8bdbad20edbe404.zip
gcc-918a61248dc591d88ca58507f8bdbad20edbe404.tar.gz
gcc-918a61248dc591d88ca58507f8bdbad20edbe404.tar.bz2
[multiple changes]
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
Diffstat (limited to 'gcc/expr.c')
-rw-r--r--gcc/expr.c39
1 files changed, 35 insertions, 4 deletions
diff --git a/gcc/expr.c b/gcc/expr.c
index a83194a..6eb90a6 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -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));