aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2005-05-04 22:44:14 +0000
committerFariborz Jahanian <fjahanian@gcc.gnu.org>2005-05-04 22:44:14 +0000
commitbcb604b6be026c2c52ec1b3a4734d8f4ed1b91a7 (patch)
tree245efb10b106af6bb77f7147bb5cfb3faa278219
parentcc73528f07789d3453eccd695cc7703755819dad (diff)
downloadgcc-bcb604b6be026c2c52ec1b3a4734d8f4ed1b91a7.zip
gcc-bcb604b6be026c2c52ec1b3a4734d8f4ed1b91a7.tar.gz
gcc-bcb604b6be026c2c52ec1b3a4734d8f4ed1b91a7.tar.bz2
Fixed a vrsave problem in the presense of save_world call in the prologue.
Oked by Dale Johannesen. From-SVN: r99236
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/rs6000/rs6000.c19
2 files changed, 17 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index eed5263..c2624bc 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index acf6357..5779d1f 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -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)));