aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Brook <paul@codesourcery.com>2004-08-03 14:30:46 +0000
committerPaul Brook <pbrook@gcc.gnu.org>2004-08-03 14:30:46 +0000
commit8ee6eb4e8c7bba61f471d259f84cb11f92120eb7 (patch)
tree9453fb9976a05c20f0f736b02b7b9a2a31ba2cbb
parent7a1f75f1b77d03231fe926c754bfdec890541889 (diff)
downloadgcc-8ee6eb4e8c7bba61f471d259f84cb11f92120eb7.zip
gcc-8ee6eb4e8c7bba61f471d259f84cb11f92120eb7.tar.gz
gcc-8ee6eb4e8c7bba61f471d259f84cb11f92120eb7.tar.bz2
* config/arm/arm.c (emit_sfm): Only emit a single frame adjustment.
From-SVN: r85480
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/config/arm/arm.c25
2 files changed, 19 insertions, 10 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index de1e850..68e347e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,7 @@
+2004-08-03 Paul Brook <paul@codesourcery.com>
+
+ * config/arm/arm.c (emit_sfm): Only emit a single frame adjustment.
+
2004-08-03 Jan Hubicka <jh@suse.cz>
* coverage.c (tree_coverage_counter_ref): Fix computation of the new
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index 7209896..66fc8f8 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -9911,7 +9911,7 @@ emit_sfm (int base_reg, int count)
int i;
par = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (count));
- dwarf = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (count));
+ dwarf = gen_rtx_SEQUENCE (VOIDmode, rtvec_alloc (count + 1));
reg = gen_rtx_REG (XFmode, base_reg++);
@@ -9922,13 +9922,10 @@ emit_sfm (int base_reg, int count)
gen_rtx_UNSPEC (BLKmode,
gen_rtvec (1, reg),
UNSPEC_PUSH_MULT));
- tmp
- = gen_rtx_SET (VOIDmode,
- gen_rtx_MEM (XFmode,
- gen_rtx_PRE_DEC (BLKmode, stack_pointer_rtx)),
- reg);
+ tmp = gen_rtx_SET (VOIDmode,
+ gen_rtx_MEM (XFmode, stack_pointer_rtx), reg);
RTX_FRAME_RELATED_P (tmp) = 1;
- XVECEXP (dwarf, 0, count - 1) = tmp;
+ XVECEXP (dwarf, 0, 1) = tmp;
for (i = 1; i < count; i++)
{
@@ -9937,13 +9934,21 @@ emit_sfm (int base_reg, int count)
tmp = gen_rtx_SET (VOIDmode,
gen_rtx_MEM (XFmode,
- gen_rtx_PRE_DEC (BLKmode,
- stack_pointer_rtx)),
+ plus_constant (stack_pointer_rtx,
+ i * 12)),
reg);
RTX_FRAME_RELATED_P (tmp) = 1;
- XVECEXP (dwarf, 0, count - i - 1) = tmp;
+ XVECEXP (dwarf, 0, i + 1) = tmp;
}
+ tmp = gen_rtx_SET (VOIDmode,
+ stack_pointer_rtx,
+ gen_rtx_PLUS (SImode,
+ stack_pointer_rtx,
+ GEN_INT (-12 * count)));
+ RTX_FRAME_RELATED_P (tmp) = 1;
+ XVECEXP (dwarf, 0, 0) = tmp;
+
par = emit_insn (par);
REG_NOTES (par) = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR, dwarf,
REG_NOTES (par));