diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2005-05-04 22:44:14 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@gcc.gnu.org> | 2005-05-04 22:44:14 +0000 |
commit | bcb604b6be026c2c52ec1b3a4734d8f4ed1b91a7 (patch) | |
tree | 245efb10b106af6bb77f7147bb5cfb3faa278219 | |
parent | cc73528f07789d3453eccd695cc7703755819dad (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 19 |
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))); |