re PR target/78602 (PowerPC vec-extract-v2df.c can fail if -mcpu=power9 -O0)
authorMichael Meissner <meissner@linux.vnet.ibm.com>
Wed, 30 Nov 2016 18:43:17 +0000 (18:43 +0000)
committerMichael Meissner <meissner@gcc.gnu.org>
Wed, 30 Nov 2016 18:43:17 +0000 (18:43 +0000)
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

gcc/ChangeLog
gcc/config/rs6000/rs6000.c
gcc/config/rs6000/vsx.md

index 6abb47ff0a7c2b694fea5d7d2dda0a8550966e1a..7a46cd22253b36cc54bef90fa85f7b1bcba450b1 100644 (file)
@@ -1,3 +1,17 @@
+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>
 
        PR tree-optimization/77856
index 0a6a784a9409202056737928a39db446f64f2941..9fe98b7dd6ab2ec93ae488ec95c97d0d7a8bcd5a 100644 (file)
@@ -7105,6 +7105,8 @@ rs6000_expand_vector_set (rtx target, rtx val, int elt)
   int width = GET_MODE_SIZE (inner_mode);
   int i;
 
+  val = force_reg (GET_MODE (val), val);
+
   if (VECTOR_MEM_VSX_P (mode))
     {
       rtx insn = NULL_RTX;
@@ -7257,6 +7259,8 @@ rs6000_expand_vector_extract (rtx target, rtx vec, rtx elt)
          convert_move (tmp, elt, 0);
          elt = tmp;
        }
+      else if (!REG_P (elt))
+       elt = force_reg (DImode, elt);
 
       switch (mode)
        {
index 75c16252f8ca66c48e1b04f9d7716b5746f74a45..01d275d168e5a37e7438a9730260125b67ccaeda 100644 (file)
   if (!VECTOR_ELT_ORDER_BIG)
     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)
     return "xxinsertw %x0,%x2,%3";
   else