re PR target/78243 (incorrect byte offset in vextractuh with -mcpu=power9)
authorMichael Meissner <meissner@linux.vnet.ibm.com>
Fri, 11 Nov 2016 19:12:12 +0000 (19:12 +0000)
committerMichael Meissner <meissner@gcc.gnu.org>
Fri, 11 Nov 2016 19:12:12 +0000 (19:12 +0000)
2016-11-11  Michael Meissner  <meissner@linux.vnet.ibm.com>

PR target/78243
* config/rs6000/vsx.md (vsx_extract_<mode>_p9): Correct the
element order for little endian ordering.

* config/rs6000/altivec.md (reduc_plus_scal_<mode>): Use
VECTOR_ELT_ORDER_BIG and not BYTES_BIG_ENDIAN to adjust element
number.

From-SVN: r242317

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

index 7dd5931b83910fb9d380a538a3271204795a07a9..401151205d9f02aa97fcf5d1cfc85f6b68b59ad7 100644 (file)
@@ -1,3 +1,13 @@
+2016-11-11  Michael Meissner  <meissner@linux.vnet.ibm.com>
+
+       PR target/78243
+       * config/rs6000/vsx.md (vsx_extract_<mode>_p9): Correct the
+       element order for little endian ordering.
+
+       * config/rs6000/altivec.md (reduc_plus_scal_<mode>): Use
+       VECTOR_ELT_ORDER_BIG and not BYTES_BIG_ENDIAN to adjust element
+       number.
+
 2016-11-11  Uros Bizjak  <ubizjak@gmail.com>
 
        PR target/78310
index 5cac839da28430ef8344e1c0725dc550cd5d9ec9..802aa7459af57c0cf79e6e3f86d309aab596262f 100644 (file)
   rtx vtmp1 = gen_reg_rtx (V4SImode);
   rtx vtmp2 = gen_reg_rtx (<MODE>mode);
   rtx dest = gen_lowpart (V4SImode, vtmp2);
-  int elt = BYTES_BIG_ENDIAN ? GET_MODE_NUNITS (<MODE>mode) - 1 : 0;
+  int elt = VECTOR_ELT_ORDER_BIG ? GET_MODE_NUNITS (<MODE>mode) - 1 : 0;
 
   emit_insn (gen_altivec_vspltisw (vzero, const0_rtx));
   emit_insn (gen_altivec_vsum4s<VI_char>s (vtmp1, operands[1], vzero));
index ebb0f6dc09966729d73b16238803d3e51efa203b..c5a57cbebb620993ea5a667ad20c15e1868400b4 100644 (file)
   "VECTOR_MEM_VSX_P (<MODE>mode) && TARGET_VEXTRACTUB
    && TARGET_VSX_SMALL_INTEGER"
 {
-  /* 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);
-  HOST_WIDE_INT offset = unit_size * INTVAL (operands[2]);
+  HOST_WIDE_INT elt = INTVAL (operands[2]);
+  HOST_WIDE_INT elt_adj = (!VECTOR_ELT_ORDER_BIG
+                          ? GET_MODE_NUNITS (<MODE>mode) - 1 - elt
+                          : elt);
+
+  HOST_WIDE_INT unit_size = GET_MODE_UNIT_SIZE (<MODE>mode);
+  HOST_WIDE_INT offset = unit_size * elt_adj;
 
   operands[2] = GEN_INT (offset);
   if (unit_size == 4)