aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMichael Meissner <meissner@linux.vnet.ibm.com>2016-11-03 23:32:07 +0000
committerMichael Meissner <meissner@gcc.gnu.org>2016-11-03 23:32:07 +0000
commitf2834ebc00d847dcac85c44640a2c7fb2cdd340e (patch)
treec9942ab81dd9456b420d9c144bde4c23c85ee2bf /gcc
parent0bc36dec0f6a5d73b79e78c549533261b76602ec (diff)
downloadgcc-f2834ebc00d847dcac85c44640a2c7fb2cdd340e.zip
gcc-f2834ebc00d847dcac85c44640a2c7fb2cdd340e.tar.gz
gcc-f2834ebc00d847dcac85c44640a2c7fb2cdd340e.tar.bz2
re PR target/78192 (extract from vector registers to int results in wrong data order)
2016-11-03 Michael Meissner <meissner@linux.vnet.ibm.com> PR target/78192 * config/rs6000/vsx.md (vsx_extract_<mode>_di): The element number has already been adjusted for endianness, so don't adjust it any further. From-SVN: r241834
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/rs6000/vsx.md7
2 files changed, 8 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b45b91d..9222baa 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,10 @@
2016-11-03 Michael Meissner <meissner@linux.vnet.ibm.com>
+ PR target/78192
+ * config/rs6000/vsx.md (vsx_extract_<mode>_di): The element number
+ has already been adjusted for endianness, so don't adjust it any
+ further.
+
PR target/77993
* config/rs6000/rs6000.h (FLOAT128_IBM_P): Do not allow IFmode or
ICmode unless we have standard PowerPC floating point.
diff --git a/gcc/config/rs6000/vsx.md b/gcc/config/rs6000/vsx.md
index 505c270..2c74a8e 100644
--- a/gcc/config/rs6000/vsx.md
+++ b/gcc/config/rs6000/vsx.md
@@ -2586,11 +2586,10 @@
(parallel [(match_operand:QI 2 "<VSX_EXTRACT_PREDICATE>" "n")]))))]
"VECTOR_MEM_VSX_P (<MODE>mode) && TARGET_VEXTRACTUB"
{
- int element = INTVAL (operands[2]);
+ /* Note, the element number has already been adjusted for endianness, so we
+ don't have to adjust it here. */
int unit_size = GET_MODE_UNIT_SIZE (<MODE>mode);
- int offset = ((VECTOR_ELT_ORDER_BIG)
- ? unit_size * element
- : unit_size * (GET_MODE_NUNITS (<MODE>mode) - 1 - element));
+ HOST_WIDE_INT offset = unit_size * INTVAL (operands[2]);
operands[2] = GEN_INT (offset);
if (unit_size == 4)