summaryrefslogtreecommitdiff
path: root/gcc/config/mips
diff options
context:
space:
mode:
authorJim Wilson <wilson@gcc.gnu.org>1997-06-15 17:45:02 -0700
committerJim Wilson <wilson@gcc.gnu.org>1997-06-15 17:45:02 -0700
commit119f2738a65cad2dd277c5c86cd10efb3f503d73 (patch)
tree8b6a3b9556f3b0689d15c839594f28c84bf49104 /gcc/config/mips
parentef76d03b8af2720923b55595bf516e26341d0977 (diff)
downloadgcc-119f2738a65cad2dd277c5c86cd10efb3f503d73.tar.gz
(mips_expand_prologue): If tsize_rtx is large_int...
(mips_expand_prologue): If tsize_rtx is large_int, emit two insns instead of one splitable insn, setting RTX_FRAME_RELATED_P. From-SVN: r14249
Diffstat (limited to 'gcc/config/mips')
-rw-r--r--gcc/config/mips/mips.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c
index b97e0f65710..fee0408a8d0 100644
--- a/gcc/config/mips/mips.c
+++ b/gcc/config/mips/mips.c
@@ -5443,8 +5443,25 @@ mips_expand_prologue ()
if (tsize > 32767)
{
tmp_rtx = gen_rtx (REG, Pmode, MIPS_TEMP1_REGNUM);
- insn = emit_move_insn (tmp_rtx, tsize_rtx);
- RTX_FRAME_RELATED_P (insn) = 1;
+
+ /* Instruction splitting doesn't preserve the RTX_FRAME_RELATED_P
+ bit, so make sure that we don't emit anything that can be
+ split. */
+ if (large_int (tsize_rtx))
+ {
+ insn = emit_move_insn (tmp_rtx,
+ GEN_INT (tsize & 0xffff0000));
+ RTX_FRAME_RELATED_P (insn) = 1;
+ insn = emit_insn (gen_iorsi3 (tmp_rtx, tmp_rtx,
+ GEN_INT (tsize & 0x0000ffff)));
+ RTX_FRAME_RELATED_P (insn) = 1;
+ }
+ else
+ {
+ insn = emit_move_insn (tmp_rtx, tsize_rtx);
+ RTX_FRAME_RELATED_P (insn) = 1;
+ }
+
tsize_rtx = tmp_rtx;
}