[AArch64] Reverse TBL indices for big-endian.
authorTejas Belagod <tejas.belagod@arm.com>
Thu, 24 Apr 2014 09:08:48 +0000 (10:08 +0100)
committerTejas Belagod <belagod@gcc.gnu.org>
Thu, 24 Apr 2014 09:08:48 +0000 (10:08 +0100)
2014-04-24  Tejas Belagod  <tejas.belagod@arm.com>

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

From-SVN: r209742

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

index 591179a50bb6afcec5353f7d8572b583cfbfd6e3..9c13da007504a186444ca6a7b0cf9e947a07f492 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 496d1b8f041c6a85cc075b6a5ff22c04c1e8c6e0..d644f799368e83c02fd62cc1ca1a499ccb3cb386 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);