diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6abb47ff0a7c2b694fea5d7d2dda0a8550966e1a..7a46cd22253b36cc54bef90fa85f7b1bcba450b1 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 0a6a784a9409202056737928a39db446f64f2941..9fe98b7dd6ab2ec93ae488ec95c97d0d7a8bcd5a 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 75c16252f8ca66c48e1b04f9d7716b5746f74a45..01d275d168e5a37e7438a9730260125b67ccaeda 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