aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMichael Meissner <meissner@gcc.gnu.org>1996-10-18 17:35:40 +0000
committerMichael Meissner <meissner@gcc.gnu.org>1996-10-18 17:35:40 +0000
commit170e0690ee57c42c1805f5d7e31f29c94b97ea91 (patch)
tree8a906f2d6a895a3db47771389139a716d7b9ec10 /gcc
parentf37230f0b482fc057ba2dc7d9fbdb2bec90ba19e (diff)
downloadgcc-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.md14
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\";