aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMichael Meissner <meissner@linux.vnet.ibm.com>2016-11-30 18:43:17 +0000
committerMichael Meissner <meissner@gcc.gnu.org>2016-11-30 18:43:17 +0000
commitbc28bbb60e30a7aeb401e8a49c73e008929d216f (patch)
tree570b8b2ab39d45e2089525d8d8300395cdae6b10 /gcc
parent630e3c3ad65617d880a5da072c0ef9a6b02a1f7a (diff)
downloadgcc-bc28bbb60e30a7aeb401e8a49c73e008929d216f.zip
gcc-bc28bbb60e30a7aeb401e8a49c73e008929d216f.tar.gz
gcc-bc28bbb60e30a7aeb401e8a49c73e008929d216f.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog14
-rw-r--r--gcc/config/rs6000/rs6000.c4
-rw-r--r--gcc/config/rs6000/vsx.md2
3 files changed, 19 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6abb47f..7a46cd2 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 0a6a784..9fe98b7 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -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)
{
diff --git a/gcc/config/rs6000/vsx.md b/gcc/config/rs6000/vsx.md
index 75c1625..01d275d 100644
--- a/gcc/config/rs6000/vsx.md
+++ b/gcc/config/rs6000/vsx.md
@@ -2856,7 +2856,7 @@
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