diff options
author | Michael Meissner <meissner@linux.vnet.ibm.com> | 2016-11-30 18:43:17 +0000 |
---|---|---|
committer | Michael Meissner <meissner@gcc.gnu.org> | 2016-11-30 18:43:17 +0000 |
commit | bc28bbb60e30a7aeb401e8a49c73e008929d216f (patch) | |
tree | 570b8b2ab39d45e2089525d8d8300395cdae6b10 /gcc | |
parent | 630e3c3ad65617d880a5da072c0ef9a6b02a1f7a (diff) | |
download | gcc-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/ChangeLog | 14 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 4 | ||||
-rw-r--r-- | gcc/config/rs6000/vsx.md | 2 |
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 |