Commit dfef3500 by Michael Meissner Committed by Michael Meissner

Add support for large prefixed address in adjusting a vector address.

2020-01-06  Michael Meissner  <meissner@linux.ibm.com>

	* config/rs6000/rs6000.c (rs6000_adjust_vec_address): Add support
	for the offset being 34-bits when -mcpu=future is used.

From-SVN: r279937
parent 665e3b21
2020-01-06 Michael Meissner <meissner@linux.ibm.com>
* config/rs6000/rs6000.c (rs6000_adjust_vec_address): Add support
for the offset being 34-bits when -mcpu=future is used.
2020-01-06 John David Anglin <danglin@gcc.gnu.org> 2020-01-06 John David Anglin <danglin@gcc.gnu.org>
* config/pa/pa.md: Revert change to use ordered_comparison_operator * config/pa/pa.md: Revert change to use ordered_comparison_operator
......
...@@ -6797,11 +6797,19 @@ rs6000_adjust_vec_address (rtx scalar_reg, ...@@ -6797,11 +6797,19 @@ rs6000_adjust_vec_address (rtx scalar_reg,
HOST_WIDE_INT offset = INTVAL (op1) + INTVAL (element_offset); HOST_WIDE_INT offset = INTVAL (op1) + INTVAL (element_offset);
rtx offset_rtx = GEN_INT (offset); rtx offset_rtx = GEN_INT (offset);
if (IN_RANGE (offset, -32768, 32767) /* 16-bit offset. */
if (SIGNED_INTEGER_16BIT_P (offset)
&& (scalar_size < 8 || (offset & 0x3) == 0)) && (scalar_size < 8 || (offset & 0x3) == 0))
new_addr = gen_rtx_PLUS (Pmode, op0, offset_rtx); new_addr = gen_rtx_PLUS (Pmode, op0, offset_rtx);
/* 34-bit offset if we have prefixed addresses. */
else if (TARGET_PREFIXED_ADDR && SIGNED_INTEGER_34BIT_P (offset))
new_addr = gen_rtx_PLUS (Pmode, op0, offset_rtx);
else else
{ {
/* Offset overflowed, move offset to the temporary (which will
likely be split), and do X-FORM addressing. */
emit_move_insn (base_tmp, offset_rtx); emit_move_insn (base_tmp, offset_rtx);
new_addr = gen_rtx_PLUS (Pmode, op0, base_tmp); new_addr = gen_rtx_PLUS (Pmode, op0, base_tmp);
} }
...@@ -6830,6 +6838,12 @@ rs6000_adjust_vec_address (rtx scalar_reg, ...@@ -6830,6 +6838,12 @@ rs6000_adjust_vec_address (rtx scalar_reg,
emit_insn (insn); emit_insn (insn);
} }
/* Make sure we don't overwrite the temporary if the element being
extracted is variable, and we've put the offset into base_tmp
previously. */
else if (reg_mentioned_p (base_tmp, element_offset))
emit_insn (gen_add2_insn (base_tmp, op1));
else else
{ {
emit_move_insn (base_tmp, op1); emit_move_insn (base_tmp, op1);
......
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