[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
This commit is contained in:
parent
06e105fc9b
commit
f901401e53
@ -1,3 +1,8 @@
|
||||
2014-08-06 Alan Lawrence <alan.lawrence@arm.com>
|
||||
|
||||
* 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 <kyrylo.tkachov@arm.com>
|
||||
|
||||
* config/aarch64/aarch64.c (aarch64_classify_address): Use REG_P and
|
||||
|
@ -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;
|
||||
|
@ -1,3 +1,7 @@
|
||||
2014-08-06 Alan Lawrence <alan.lawrence@arm.com>
|
||||
|
||||
* gcc.target/aarch64/vdup_n_2.c: New test.
|
||||
|
||||
2014-08-06 Maciej W. Rozycki <macro@codesourcery.com>
|
||||
|
||||
* gcc.dg/pr44194-1.c: Also exclude powerpc*-*-linux*, except if
|
||||
|
28
gcc/testsuite/gcc.target/aarch64/vdup_n_2.c
Normal file
28
gcc/testsuite/gcc.target/aarch64/vdup_n_2.c
Normal file
@ -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 } } */
|
||||
|
Loading…
x
Reference in New Issue
Block a user