Commit 668c901b by John David Anglin

pa.c (pa_emit_move_sequence): Handle floating point reloads for other unsupported memory operands.

	* config/pa/pa.c (pa_emit_move_sequence): Handle floating point
	reloads for other unsupported memory operands.

From-SVN: r232253
parent 27b1820a
2016-01-11 John David Anglin <danglin@gcc.gnu.org>
* config/pa/pa.c (pa_emit_move_sequence): Handle floating point
reloads for other unsupported memory operands.
2016-01-12 Kugan Vivekanandarajah <kuganv@linaro.org> 2016-01-12 Kugan Vivekanandarajah <kuganv@linaro.org>
Jim Wilson <jim.wilson@linaro.org> Jim Wilson <jim.wilson@linaro.org>
......
...@@ -1681,7 +1681,8 @@ pa_emit_move_sequence (rtx *operands, machine_mode mode, rtx scratch_reg) ...@@ -1681,7 +1681,8 @@ pa_emit_move_sequence (rtx *operands, machine_mode mode, rtx scratch_reg)
/* Handle secondary reloads for loads/stores of FP registers from /* Handle secondary reloads for loads/stores of FP registers from
REG+D addresses where D does not fit in 5 or 14 bits, including REG+D addresses where D does not fit in 5 or 14 bits, including
(subreg (mem (addr))) cases. */ (subreg (mem (addr))) cases, and reloads for other unsupported
memory operands. */
if (scratch_reg if (scratch_reg
&& FP_REG_P (operand0) && FP_REG_P (operand0)
&& (MEM_P (operand1) && (MEM_P (operand1)
...@@ -1693,30 +1694,43 @@ pa_emit_move_sequence (rtx *operands, machine_mode mode, rtx scratch_reg) ...@@ -1693,30 +1694,43 @@ pa_emit_move_sequence (rtx *operands, machine_mode mode, rtx scratch_reg)
if (GET_CODE (op1) == SUBREG) if (GET_CODE (op1) == SUBREG)
op1 = XEXP (op1, 0); op1 = XEXP (op1, 0);
if (reg_plus_base_memory_operand (op1, GET_MODE (op1)) if (reg_plus_base_memory_operand (op1, GET_MODE (op1)))
&& !(TARGET_PA_20
&& !TARGET_ELF32
&& INT_14_BITS (XEXP (XEXP (op1, 0), 1)))
&& !INT_5_BITS (XEXP (XEXP (op1, 0), 1)))
{ {
/* SCRATCH_REG will hold an address and maybe the actual data. if (!(TARGET_PA_20
We want it in WORD_MODE regardless of what mode it was && !TARGET_ELF32
originally given to us. */ && INT_14_BITS (XEXP (XEXP (op1, 0), 1)))
scratch_reg = force_mode (word_mode, scratch_reg); && !INT_5_BITS (XEXP (XEXP (op1, 0), 1)))
/* D might not fit in 14 bits either; for such cases load D into
scratch reg. */
if (!INT_14_BITS (XEXP (XEXP (op1, 0), 1)))
{ {
emit_move_insn (scratch_reg, XEXP (XEXP (op1, 0), 1)); /* SCRATCH_REG will hold an address and maybe the actual data.
emit_move_insn (scratch_reg, We want it in WORD_MODE regardless of what mode it was
gen_rtx_fmt_ee (GET_CODE (XEXP (op1, 0)), originally given to us. */
Pmode, scratch_reg = force_mode (word_mode, scratch_reg);
XEXP (XEXP (op1, 0), 0),
scratch_reg)); /* D might not fit in 14 bits either; for such cases load D
into scratch reg. */
if (!INT_14_BITS (XEXP (XEXP (op1, 0), 1)))
{
emit_move_insn (scratch_reg, XEXP (XEXP (op1, 0), 1));
emit_move_insn (scratch_reg,
gen_rtx_fmt_ee (GET_CODE (XEXP (op1, 0)),
Pmode,
XEXP (XEXP (op1, 0), 0),
scratch_reg));
}
else
emit_move_insn (scratch_reg, XEXP (op1, 0));
emit_insn (gen_rtx_SET (operand0,
replace_equiv_address (op1, scratch_reg)));
return 1;
} }
else }
emit_move_insn (scratch_reg, XEXP (op1, 0)); else if ((!INT14_OK_STRICT && symbolic_memory_operand (op1, VOIDmode))
|| IS_LO_SUM_DLT_ADDR_P (XEXP (op1, 0))
|| IS_INDEX_ADDR_P (XEXP (op1, 0)))
{
/* Load memory address into SCRATCH_REG. */
scratch_reg = force_mode (word_mode, scratch_reg);
emit_move_insn (scratch_reg, XEXP (op1, 0));
emit_insn (gen_rtx_SET (operand0, emit_insn (gen_rtx_SET (operand0,
replace_equiv_address (op1, scratch_reg))); replace_equiv_address (op1, scratch_reg)));
return 1; return 1;
...@@ -1733,30 +1747,43 @@ pa_emit_move_sequence (rtx *operands, machine_mode mode, rtx scratch_reg) ...@@ -1733,30 +1747,43 @@ pa_emit_move_sequence (rtx *operands, machine_mode mode, rtx scratch_reg)
if (GET_CODE (op0) == SUBREG) if (GET_CODE (op0) == SUBREG)
op0 = XEXP (op0, 0); op0 = XEXP (op0, 0);
if (reg_plus_base_memory_operand (op0, GET_MODE (op0)) if (reg_plus_base_memory_operand (op0, GET_MODE (op0)))
&& !(TARGET_PA_20
&& !TARGET_ELF32
&& INT_14_BITS (XEXP (XEXP (op0, 0), 1)))
&& !INT_5_BITS (XEXP (XEXP (op0, 0), 1)))
{ {
/* SCRATCH_REG will hold an address and maybe the actual data. if (!(TARGET_PA_20
We want it in WORD_MODE regardless of what mode it was && !TARGET_ELF32
originally given to us. */ && INT_14_BITS (XEXP (XEXP (op0, 0), 1)))
scratch_reg = force_mode (word_mode, scratch_reg); && !INT_5_BITS (XEXP (XEXP (op0, 0), 1)))
/* D might not fit in 14 bits either; for such cases load D into
scratch reg. */
if (!INT_14_BITS (XEXP (XEXP (op0, 0), 1)))
{ {
emit_move_insn (scratch_reg, XEXP (XEXP (op0, 0), 1)); /* SCRATCH_REG will hold an address and maybe the actual data.
emit_move_insn (scratch_reg, We want it in WORD_MODE regardless of what mode it was
gen_rtx_fmt_ee (GET_CODE (XEXP (op0, 0)), originally given to us. */
Pmode, scratch_reg = force_mode (word_mode, scratch_reg);
XEXP (XEXP (op0, 0), 0),
scratch_reg)); /* D might not fit in 14 bits either; for such cases load D
into scratch reg. */
if (!INT_14_BITS (XEXP (XEXP (op0, 0), 1)))
{
emit_move_insn (scratch_reg, XEXP (XEXP (op0, 0), 1));
emit_move_insn (scratch_reg,
gen_rtx_fmt_ee (GET_CODE (XEXP (op0, 0)),
Pmode,
XEXP (XEXP (op0, 0), 0),
scratch_reg));
}
else
emit_move_insn (scratch_reg, XEXP (op0, 0));
emit_insn (gen_rtx_SET (replace_equiv_address (op0, scratch_reg),
operand1));
return 1;
} }
else }
emit_move_insn (scratch_reg, XEXP (op0, 0)); else if ((!INT14_OK_STRICT && symbolic_memory_operand (op0, VOIDmode))
|| IS_LO_SUM_DLT_ADDR_P (XEXP (op0, 0))
|| IS_INDEX_ADDR_P (XEXP (op0, 0)))
{
/* Load memory address into SCRATCH_REG. */
scratch_reg = force_mode (word_mode, scratch_reg);
emit_move_insn (scratch_reg, XEXP (op0, 0));
emit_insn (gen_rtx_SET (replace_equiv_address (op0, scratch_reg), emit_insn (gen_rtx_SET (replace_equiv_address (op0, scratch_reg),
operand1)); operand1));
return 1; return 1;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment