Commit bc28bbb6 by Michael Meissner Committed by Michael Meissner

re PR target/78602 (PowerPC vec-extract-v2df.c can fail if -mcpu=power9 -O0)

2016-11-30  Michael Meissner  <meissner@linux.vnet.ibm.com>

	PR target/78602
	* config/rs6000/rs6000.c (rs6000_expand_vector_extract): If the
	element is not a constant or in a register, force it to a
	register.

	PR target/78560
	* config/rs6000/rs6000.c (rs6000_expand_vector_set): Force value
	that will be set to a vector element to be in a register.
	* config/rs6000/vsx.md (vsx_set_<mode>_p9): Fix thinko that used
	the wrong multiplier to convert the element number to a byte
	offset.

From-SVN: r243044
parent 630e3c3a
2016-11-30 Michael Meissner <meissner@linux.vnet.ibm.com>
PR target/78602
* config/rs6000/rs6000.c (rs6000_expand_vector_extract): If the
element is not a constant or in a register, force it to a
register.
PR target/78560
* config/rs6000/rs6000.c (rs6000_expand_vector_set): Force value
that will be set to a vector element to be in a register.
* config/rs6000/vsx.md (vsx_set_<mode>_p9): Fix thinko that used
the wrong multiplier to convert the element number to a byte
offset.
2016-11-30 Vladimir Makarov <vmakarov@redhat.com> 2016-11-30 Vladimir Makarov <vmakarov@redhat.com>
PR tree-optimization/77856 PR tree-optimization/77856
...@@ -7105,6 +7105,8 @@ rs6000_expand_vector_set (rtx target, rtx val, int elt) ...@@ -7105,6 +7105,8 @@ rs6000_expand_vector_set (rtx target, rtx val, int elt)
int width = GET_MODE_SIZE (inner_mode); int width = GET_MODE_SIZE (inner_mode);
int i; int i;
val = force_reg (GET_MODE (val), val);
if (VECTOR_MEM_VSX_P (mode)) if (VECTOR_MEM_VSX_P (mode))
{ {
rtx insn = NULL_RTX; rtx insn = NULL_RTX;
...@@ -7257,6 +7259,8 @@ rs6000_expand_vector_extract (rtx target, rtx vec, rtx elt) ...@@ -7257,6 +7259,8 @@ rs6000_expand_vector_extract (rtx target, rtx vec, rtx elt)
convert_move (tmp, elt, 0); convert_move (tmp, elt, 0);
elt = tmp; elt = tmp;
} }
else if (!REG_P (elt))
elt = force_reg (DImode, elt);
switch (mode) switch (mode)
{ {
...@@ -2856,7 +2856,7 @@ ...@@ -2856,7 +2856,7 @@
if (!VECTOR_ELT_ORDER_BIG) if (!VECTOR_ELT_ORDER_BIG)
ele = nunits - 1 - ele; ele = nunits - 1 - ele;
operands[3] = GEN_INT (nunits * ele); operands[3] = GEN_INT (GET_MODE_SIZE (<VS_scalar>mode) * ele);
if (<MODE>mode == V4SImode) if (<MODE>mode == V4SImode)
return "xxinsertw %x0,%x2,%3"; return "xxinsertw %x0,%x2,%3";
else else
......
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