From: Tejas Belagod Date: Thu, 24 Apr 2014 09:08:48 +0000 (+0100) Subject: [AArch64] Reverse TBL indices for big-endian. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=bbcc9c00015be1f7c186990f5cd35ea935452912;p=gcc.git [AArch64] Reverse TBL indices for big-endian. 2014-04-24 Tejas Belagod * config/aarch64/aarch64.c (aarch64_evpc_tbl): Reverse order of elements for big-endian. From-SVN: r209742 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 591179a50bb..9c13da00750 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2014-04-24 Tejas Belagod + + * config/aarch64/aarch64.c (aarch64_evpc_tbl): Reverse order of elements + for big-endian. + 2014-04-24 Richard Biener * expr.c (expand_expr_real_1): Avoid gimple_assign_rhs_to_tree diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index 496d1b8f041..d644f799368 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -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);