* config/arm/arm.c (emit_sfm): Only emit a single frame adjustment.
authorPaul Brook <paul@codesourcery.com>
Tue, 3 Aug 2004 14:30:46 +0000 (14:30 +0000)
committerPaul Brook <pbrook@gcc.gnu.org>
Tue, 3 Aug 2004 14:30:46 +0000 (14:30 +0000)
From-SVN: r85480

gcc/ChangeLog
gcc/config/arm/arm.c

index de1e8508b1cc890b6a1492f37fc5a774f8f7a21d..68e347e1456ab5280dac3bb4f92b58cae2141fda 100644 (file)
@@ -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
index 7209896555e01d593f707fba8f925975162badd8..66fc8f88735de37896f8453dea3af7134d4f3b1f 100644 (file)
@@ -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));