aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Stallman <rms@gnu.org>1993-07-24 22:20:55 +0000
committerRichard Stallman <rms@gnu.org>1993-07-24 22:20:55 +0000
commitc937357e3adcea76ec866a13a6e599dda464ab48 (patch)
tree704b1fdacb764ba695b83413ae9f09b6763645d5 /gcc
parent255fccf375d17bd035295dff96cf29116a4b2b79 (diff)
downloadgcc-c937357e3adcea76ec866a13a6e599dda464ab48.zip
gcc-c937357e3adcea76ec866a13a6e599dda464ab48.tar.gz
gcc-c937357e3adcea76ec866a13a6e599dda464ab48.tar.bz2
(emit_move_insn_1): For complex stack push, don't use change_address.
From-SVN: r4983
Diffstat (limited to 'gcc')
-rw-r--r--gcc/expr.c33
1 files changed, 25 insertions, 8 deletions
diff --git a/gcc/expr.c b/gcc/expr.c
index 187b25b..b3addec 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -1648,14 +1648,31 @@ emit_move_insn_1 (x, y)
In that case, change_address is used only to convert
the mode, not to change the address. */
- emit_insn (GEN_FCN (mov_optab->handlers[(int) submode].insn_code)
- ((stack ? change_address (x, submode, (rtx) 0)
- : gen_highpart (submode, x)),
- gen_highpart (submode, y)));
- emit_insn (GEN_FCN (mov_optab->handlers[(int) submode].insn_code)
- ((stack ? change_address (x, submode, (rtx) 0)
- : gen_lowpart (submode, x)),
- gen_lowpart (submode, y)));
+ if (stack)
+ {
+#ifdef STACK_GROWS_DOWNWARD
+ emit_insn (GEN_FCN (mov_optab->handlers[(int) submode].insn_code)
+ (gen_rtx (MEM, submode, (XEXP (x, 0))),
+ gen_highpart (submode, y)));
+ emit_insn (GEN_FCN (mov_optab->handlers[(int) submode].insn_code)
+ (gen_rtx (MEM, submode, (XEXP (x, 0))),
+ gen_lowpart (submode, y)));
+#else
+ emit_insn (GEN_FCN (mov_optab->handlers[(int) submode].insn_code)
+ (gen_rtx (MEM, submode, (XEXP (x, 0))),
+ gen_lowpart (submode, y)));
+ emit_insn (GEN_FCN (mov_optab->handlers[(int) submode].insn_code)
+ (gen_rtx (MEM, submode, (XEXP (x, 0))),
+ gen_highpart (submode, y)));
+#endif
+ }
+ else
+ {
+ emit_insn (GEN_FCN (mov_optab->handlers[(int) submode].insn_code)
+ (gen_highpart (submode, x), gen_highpart (submode, y)));
+ emit_insn (GEN_FCN (mov_optab->handlers[(int) submode].insn_code)
+ (gen_lowpart (submode, x), gen_lowpart (submode, y)));
+ }
group_insns (prev);