re PR target/78192 (extract from vector registers to int results in wrong data order)
authorMichael Meissner <meissner@linux.vnet.ibm.com>
Thu, 3 Nov 2016 23:32:07 +0000 (23:32 +0000)
committerMichael Meissner <meissner@gcc.gnu.org>
Thu, 3 Nov 2016 23:32:07 +0000 (23:32 +0000)
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

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

index b45b91ddfdba5e5de2c247baac69c62c23930ed6..9222baaa498387de6ecbfe4c1cd23a6ef906e153 100644 (file)
@@ -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.
index 505c270edfd27d1a9a77735ff90e11c558a55bf1..2c74a8ebbe2da55b7bcf49d5c3eebd35c5530890 100644 (file)
          (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)