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)
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\";
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\";
if (rs6000_fpmem_offset > 32760)
{
indx = operands[1];
- offset &= 0xffff;
+ offset = (((offset & 0xffff) ^ 0x8000) - 0x8000);
}
else if (frame_pointer_needed)
indx = frame_pointer_rtx;
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")])
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\";