[AArch64] Reverse TBL indices for big-endian.
authorbelagod <belagod@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 24 Apr 2014 09:08:48 +0000 (09:08 +0000)
committerbelagod <belagod@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 24 Apr 2014 09:08:48 +0000 (09:08 +0000)
2014-04-24  Tejas Belagod  <tejas.belagod@arm.com>

       * config/aarch64/aarch64.c (aarch64_evpc_tbl): Reverse order of elements
       for big-endian.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@209742 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/aarch64/aarch64.c

index 591179a..9c13da0 100644 (file)
@@ -1,3 +1,8 @@
+2014-04-24  Tejas Belagod  <tejas.belagod@arm.com>
+
+       * config/aarch64/aarch64.c (aarch64_evpc_tbl): Reverse order of elements
+       for big-endian.
+
 2014-04-24  Richard Biener  <rguenther@suse.de>
 
        * expr.c (expand_expr_real_1): Avoid gimple_assign_rhs_to_tree
index 496d1b8..d644f79 100644 (file)
@@ -8158,7 +8158,15 @@ aarch64_evpc_tbl (struct expand_vec_perm_d *d)
     return false;
 
   for (i = 0; i < nelt; ++i)
-    rperm[i] = GEN_INT (d->perm[i]);
+    {
+      int nunits = GET_MODE_NUNITS (vmode);
+
+      /* If big-endian and two vectors we end up with a weird mixed-endian
+        mode on NEON.  Reverse the index within each word but not the word
+        itself.  */
+      rperm[i] = GEN_INT (BYTES_BIG_ENDIAN ? d->perm[i] ^ (nunits - 1)
+                                          : d->perm[i]);
+    }
   sel = gen_rtx_CONST_VECTOR (vmode, gen_rtvec_v (nelt, rperm));
   sel = force_reg (vmode, sel);