From: Alan Lawrence Date: Wed, 6 Aug 2014 10:17:05 +0000 (+0000) Subject: [PATCH AArch64] Prefer dup to zip for vec_perm_const; enable dup for bigendian; add... X-Git-Tag: releases/gcc-5.1.0~5635 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f901401e53769c0b0272a91417f161ad314f6c4b;p=thirdparty%2Fgcc.git [PATCH AArch64] Prefer dup to zip for vec_perm_const; enable dup for bigendian; add testcase. gcc/: * config/aarch64/aarch64.c (aarch64_evpc_dup): Enable for bigendian. (aarch64_expand_vec_perm_const): Check for dup before zip. gcc/testsuite: * gcc.target/aarch64/vdup_n_2.c: New test. From-SVN: r213659 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b0999838df78..39111746c3bf 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2014-08-06 Alan Lawrence + + * config/aarch64/aarch64.c (aarch64_evpc_dup): Enable for bigendian. + (aarch64_expand_vec_perm_const): Check for dup before zip. + 2014-08-06 Kyrylo Tkachov * config/aarch64/aarch64.c (aarch64_classify_address): Use REG_P and diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index 5ccd860e4005..116542830559 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -9378,10 +9378,6 @@ aarch64_evpc_dup (struct expand_vec_perm_d *d) unsigned int i, elt, nelt = d->nelt; rtx lane; - /* TODO: This may not be big-endian safe. */ - if (BYTES_BIG_ENDIAN) - return false; - elt = d->perm[0]; for (i = 1; i < nelt; i++) { @@ -9395,7 +9391,7 @@ aarch64_evpc_dup (struct expand_vec_perm_d *d) use d->op0 and need not do any extra arithmetic to get the correct lane number. */ in0 = d->op0; - lane = GEN_INT (elt); + lane = GEN_INT (elt); /* The pattern corrects for big-endian. */ switch (vmode) { @@ -9476,14 +9472,14 @@ aarch64_expand_vec_perm_const_1 (struct expand_vec_perm_d *d) return true; else if (aarch64_evpc_ext (d)) return true; + else if (aarch64_evpc_dup (d)) + return true; else if (aarch64_evpc_zip (d)) return true; else if (aarch64_evpc_uzp (d)) return true; else if (aarch64_evpc_trn (d)) return true; - else if (aarch64_evpc_dup (d)) - return true; return aarch64_evpc_tbl (d); } return false; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7f517fa4a622..096c489696f0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2014-08-06 Alan Lawrence + + * gcc.target/aarch64/vdup_n_2.c: New test. + 2014-08-06 Maciej W. Rozycki * gcc.dg/pr44194-1.c: Also exclude powerpc*-*-linux*, except if diff --git a/gcc/testsuite/gcc.target/aarch64/vdup_n_2.c b/gcc/testsuite/gcc.target/aarch64/vdup_n_2.c new file mode 100644 index 000000000000..660fb0faeabc --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/vdup_n_2.c @@ -0,0 +1,28 @@ +/* { dg-do run } */ +/* { dg-options "-O2 -fno-inline --save-temps" } */ + +extern void abort (void); + +typedef float float32x2_t __attribute__ ((__vector_size__ ((8)))); +typedef unsigned int uint32x2_t __attribute__ ((__vector_size__ ((8)))); + +float32x2_t +test_dup_1 (float32x2_t in) +{ + return __builtin_shuffle (in, (uint32x2_t) {1, 1}); +} + +int +main (int argc, char **argv) +{ + float32x2_t test = {2.718, 3.141}; + float32x2_t res = test_dup_1 (test); + if (res[0] != test[1] || res[1] != test[1]) + abort (); + return 0; +} + +/* { dg-final { scan-assembler-times "\[ \t\]*dup\[ \t\]+v\[0-9\]+\.2s, ?v\[0-9\]+\.s\\\[\[01\]\\\]" 1 } } */ +/* { dg-final { scan-assembler-not "zip" } } */ +/* { dg-final { cleanup-saved-temps } } */ +