diff options
author | Michael Meissner <meissner@gcc.gnu.org> | 1996-10-18 17:35:40 +0000 |
---|---|---|
committer | Michael Meissner <meissner@gcc.gnu.org> | 1996-10-18 17:35:40 +0000 |
commit | 170e0690ee57c42c1805f5d7e31f29c94b97ea91 (patch) | |
tree | 8a906f2d6a895a3db47771389139a716d7b9ec10 /gcc | |
parent | f37230f0b482fc057ba2dc7d9fbdb2bec90ba19e (diff) | |
download | gcc-170e0690ee57c42c1805f5d7e31f29c94b97ea91.zip gcc-170e0690ee57c42c1805f5d7e31f29c94b97ea91.tar.gz gcc-170e0690ee57c42c1805f5d7e31f29c94b97ea91.tar.bz2 |
Fix float conversions if sign extension in offset would occur
From-SVN: r12977
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/config/rs6000/rs6000.md | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index 9c93f9b..382a0a7 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -3670,7 +3670,7 @@ xop[0] = operands[0]; xop[1] = (frame_pointer_needed) ? frame_pointer_rtx : stack_pointer_rtx; - xop[2] = GEN_INT ((rs6000_fpmem_offset >> 16) & 0xffff); + xop[2] = GEN_INT ((rs6000_fpmem_offset >> 16) + ((rs6000_fpmem_offset & 0x8000) >> 15)); output_asm_insn (\"{cau %0,%2(%1)|addis %0,%1,%2}\", xop); } else if (rs6000_fpmem_offset < 0) @@ -3699,7 +3699,7 @@ operands[2] = gen_rtx (MEM, SImode, gen_rtx (PLUS, Pmode, indx, - GEN_INT ((rs6000_fpmem_offset & 0xffff) + GEN_INT ((((rs6000_fpmem_offset & 0xffff) ^ 0x8000) - 0x8000) + ((WORDS_BIG_ENDIAN != 0) * 4)))); return \"{st|stw} %0,%2\"; @@ -3726,7 +3726,7 @@ operands[2] = gen_rtx (MEM, SImode, gen_rtx (PLUS, Pmode, indx, - GEN_INT ((rs6000_fpmem_offset & 0xffff) + GEN_INT ((((rs6000_fpmem_offset & 0xffff) ^ 0x8000) - 0x8000) + ((WORDS_BIG_ENDIAN == 0) * 4)))); return \"{st|stw} %0,%2\"; @@ -3746,7 +3746,7 @@ if (rs6000_fpmem_offset > 32760) { indx = operands[1]; - offset &= 0xffff; + offset = (((offset & 0xffff) ^ 0x8000) - 0x8000); } else if (frame_pointer_needed) indx = frame_pointer_rtx; @@ -3836,9 +3836,9 @@ operands[2] = gen_rtx (MEM, DFmode, gen_rtx (PLUS, Pmode, indx, - GEN_INT ((rs6000_fpmem_offset & 0xffff)))); + GEN_INT (rs6000_fpmem_offset))); - return \"stfd %0,%2\"; + return \"stfd %0,%w2\"; }" [(set_attr "type" "fpstore")]) @@ -3861,7 +3861,7 @@ operands[2] = gen_rtx (MEM, DFmode, gen_rtx (PLUS, Pmode, indx, - GEN_INT ((rs6000_fpmem_offset & 0xffff) + GEN_INT ((((rs6000_fpmem_offset & 0xffff) ^ 0x8000) - 0x8000) + ((WORDS_BIG_ENDIAN) ? 4 : 0)))); return \"{l|lwz} %0,%2\"; |