Fixed a vrsave problem in the presense of save_world call in the prologue.
authorFariborz Jahanian <fjahanian@apple.com>
Wed, 4 May 2005 22:44:14 +0000 (22:44 +0000)
committerFariborz Jahanian <fjahanian@gcc.gnu.org>
Wed, 4 May 2005 22:44:14 +0000 (22:44 +0000)
Oked by Dale Johannesen.

From-SVN: r99236

gcc/ChangeLog
gcc/config/rs6000/rs6000.c

index eed5263..c2624bc 100644 (file)
@@ -1,3 +1,9 @@
+2005-05-04 Fariborz Jahanian <fjahanian@apple.com>
+
+       * config/rs6000/rs6000.c (rs6000_emit_prologue): Emit
+       setting of vrsave register for current function after
+       call to save_world is emitted.
+
 2005-05-05  Hans-Peter Nilsson  <hp@bitrange.com>
 
        * config/mmix/predicates.md: New file.
index acf6357..5779d1f 100644 (file)
@@ -13271,7 +13271,7 @@ rs6000_emit_prologue (void)
      epilogue.  */
 
   if (TARGET_ALTIVEC && TARGET_ALTIVEC_VRSAVE
-      && !WORLD_SAVE_P (info) && info->vrsave_mask != 0)
+      && info->vrsave_mask != 0)
     {
       rtx reg, mem, vrsave;
       int offset;
@@ -13286,13 +13286,16 @@ rs6000_emit_prologue (void)
       else
        emit_insn (gen_rtx_SET (VOIDmode, reg, vrsave));
 
-      /* Save VRSAVE.  */
-      offset = info->vrsave_save_offset + sp_offset;
-      mem
-       = gen_rtx_MEM (SImode,
-                      gen_rtx_PLUS (Pmode, frame_reg_rtx, GEN_INT (offset)));
-      set_mem_alias_set (mem, rs6000_sr_alias_set);
-      insn = emit_move_insn (mem, reg);
+      if (!WORLD_SAVE_P (info))
+       {
+          /* Save VRSAVE.  */
+          offset = info->vrsave_save_offset + sp_offset;
+          mem
+           = gen_rtx_MEM (SImode,
+                          gen_rtx_PLUS (Pmode, frame_reg_rtx, GEN_INT (offset)));
+          set_mem_alias_set (mem, rs6000_sr_alias_set);
+          insn = emit_move_insn (mem, reg);
+       }
 
       /* Include the registers in the mask.  */
       emit_insn (gen_iorsi3 (reg, reg, GEN_INT ((int) info->vrsave_mask)));