pa.c (pa_output_move_double): Directly handle register indexed memory operand.
* config/pa/pa.c (pa_output_move_double): Directly handle register indexed memory operand. Simplify handling of scaled register indexed memory operands. From-SVN: r221835
This commit is contained in:
parent
e61ffb3b5a
commit
166d826fdc
|
@ -1,3 +1,9 @@
|
|||
2015-04-02 John David Anglin <danglin@gcc.gnu.org>
|
||||
|
||||
* config/pa/pa.c (pa_output_move_double): Directly handle register
|
||||
indexed memory operand. Simplify handling of scaled register indexed
|
||||
memory operands.
|
||||
|
||||
2015-04-02 Ilya Enkovich <ilya.enkovich@intel.com>
|
||||
|
||||
PR driver/65444
|
||||
|
|
|
@ -2595,28 +2595,29 @@ pa_output_move_double (rtx *operands)
|
|||
&& GET_CODE (XEXP (addr, 0)) == MULT)
|
||||
{
|
||||
rtx xoperands[4];
|
||||
rtx high_reg = gen_rtx_SUBREG (SImode, operands[0], 0);
|
||||
|
||||
if (!reg_overlap_mentioned_p (high_reg, addr))
|
||||
{
|
||||
xoperands[0] = high_reg;
|
||||
xoperands[1] = XEXP (addr, 1);
|
||||
xoperands[2] = XEXP (XEXP (addr, 0), 0);
|
||||
xoperands[3] = XEXP (XEXP (addr, 0), 1);
|
||||
output_asm_insn ("{sh%O3addl %2,%1,%0|shladd,l %2,%O3,%1,%0}",
|
||||
xoperands);
|
||||
return "ldw 4(%0),%R0\n\tldw 0(%0),%0";
|
||||
}
|
||||
else
|
||||
{
|
||||
xoperands[0] = high_reg;
|
||||
xoperands[1] = XEXP (addr, 1);
|
||||
xoperands[2] = XEXP (XEXP (addr, 0), 0);
|
||||
xoperands[3] = XEXP (XEXP (addr, 0), 1);
|
||||
output_asm_insn ("{sh%O3addl %2,%1,%R0|shladd,l %2,%O3,%1,%R0}",
|
||||
xoperands);
|
||||
return "ldw 0(%R0),%0\n\tldw 4(%R0),%R0";
|
||||
}
|
||||
/* Load address into left half of destination register. */
|
||||
xoperands[0] = gen_rtx_SUBREG (SImode, operands[0], 0);
|
||||
xoperands[1] = XEXP (addr, 1);
|
||||
xoperands[2] = XEXP (XEXP (addr, 0), 0);
|
||||
xoperands[3] = XEXP (XEXP (addr, 0), 1);
|
||||
output_asm_insn ("{sh%O3addl %2,%1,%0|shladd,l %2,%O3,%1,%0}",
|
||||
xoperands);
|
||||
return "ldw 4(%0),%R0\n\tldw 0(%0),%0";
|
||||
}
|
||||
else if (GET_CODE (addr) == PLUS
|
||||
&& REG_P (XEXP (addr, 0))
|
||||
&& REG_P (XEXP (addr, 1)))
|
||||
{
|
||||
rtx xoperands[3];
|
||||
|
||||
/* Load address into left half of destination register. */
|
||||
xoperands[0] = gen_rtx_SUBREG (SImode, operands[0], 0);
|
||||
xoperands[1] = XEXP (addr, 0);
|
||||
xoperands[2] = XEXP (addr, 1);
|
||||
output_asm_insn ("{addl|add,l} %1,%2,%0",
|
||||
xoperands);
|
||||
return "ldw 4(%0),%R0\n\tldw 0(%0),%0";
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue