]> gcc.gnu.org Git - gcc.git/commitdiff
rs6000.c (rs6000_expand_vec_perm_const_1): Correct for little endian.
authorBill Schmidt <wschmidt@linux.vnet.ibm.com>
Sun, 24 Nov 2013 14:23:54 +0000 (14:23 +0000)
committerWilliam Schmidt <wschmidt@gcc.gnu.org>
Sun, 24 Nov 2013 14:23:54 +0000 (14:23 +0000)
2013-11-24  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>

* config/rs6000/rs6000.c (rs6000_expand_vec_perm_const_1): Correct
for little endian.

From-SVN: r205333

gcc/ChangeLog
gcc/config/rs6000/rs6000.c

index 4d20aefed71961b27a8e89f0078beee5e73e1436..126109e7a88a469fbb31b42fc1074b7da1683929 100644 (file)
@@ -1,3 +1,8 @@
+2013-11-24  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
+
+       * config/rs6000/rs6000.c (rs6000_expand_vec_perm_const_1): Correct
+       for little endian.
+
 2013-11-24  H.J. Lu  <hongjiu.lu@intel.com>
 
        * graphite-sese-to-poly.c: Don't include extra "expr.h".
index 7ada5d231cfc0525739ccc0ea452003a3015401b..599cf49570f382966f05835500e913e914bf69dc 100644 (file)
@@ -30046,6 +30046,21 @@ rs6000_expand_vec_perm_const_1 (rtx target, rtx op0, rtx op1,
       gcc_assert (GET_MODE_NUNITS (vmode) == 2);
       dmode = mode_for_vector (GET_MODE_INNER (vmode), 4);
 
+      /* For little endian, swap operands and invert/swap selectors
+        to get the correct xxpermdi.  The operand swap sets up the
+        inputs as a little endian array.  The selectors are swapped
+        because they are defined to use big endian ordering.  The
+        selectors are inverted to get the correct doublewords for
+        little endian ordering.  */
+      if (!BYTES_BIG_ENDIAN)
+       {
+         int n;
+         perm0 = 3 - perm0;
+         perm1 = 3 - perm1;
+         n = perm0, perm0 = perm1, perm1 = n;
+         x = op0, op0 = op1, op1 = x;
+       }
+
       x = gen_rtx_VEC_CONCAT (dmode, op0, op1);
       v = gen_rtvec (2, GEN_INT (perm0), GEN_INT (perm1));
       x = gen_rtx_VEC_SELECT (vmode, x, gen_rtx_PARALLEL (VOIDmode, v));
This page took 0.111552 seconds and 5 git commands to generate.