mirror of git://gcc.gnu.org/git/gcc.git
tree-vect-data-refs.c (vect_shift_permute_load_chain): Extend shift permutations on power of 2 cases.
gcc/
* tree-vect-data-refs.c (vect_shift_permute_load_chain): Extend shift
permutations on power of 2 cases.
gcc/testsuites/
* gcc.target/i386/pr52252-atom-1.c: New.
From-SVN: r217359
This commit is contained in:
parent
febd3244c4
commit
af4c011e67
|
|
@ -1,3 +1,8 @@
|
||||||
|
2014-11-11 Evgeny Stupachenko <evstupac@gmail.com>
|
||||||
|
|
||||||
|
* tree-vect-data-refs.c (vect_shift_permute_load_chain): Extend shift
|
||||||
|
permutations on power of 2 cases.
|
||||||
|
|
||||||
2014-11-11 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
|
2014-11-11 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
|
||||||
|
|
||||||
* config/aarch64/aarch64.h (MACHMODE): Remove 'enum' keyword.
|
* config/aarch64/aarch64.h (MACHMODE): Remove 'enum' keyword.
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,7 @@
|
||||||
|
2014-11-11 Evgeny Stupachenko <evstupac@gmail.com>
|
||||||
|
|
||||||
|
* gcc.target/i386/pr52252-atom-1.c: New.
|
||||||
|
|
||||||
2014-11-11 Martin Liska <mliska@suse.cz>
|
2014-11-11 Martin Liska <mliska@suse.cz>
|
||||||
|
|
||||||
PR ipa/63622
|
PR ipa/63622
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
/* { dg-do compile } */
|
||||||
|
/* { dg-require-effective-target ssse3 } */
|
||||||
|
/* { dg-options "-O2 -ftree-vectorize -mssse3 -mtune=slm" } */
|
||||||
|
#define byte unsigned char
|
||||||
|
|
||||||
|
void
|
||||||
|
pair_mul_sum(byte *in, byte *out, int size)
|
||||||
|
{
|
||||||
|
int j;
|
||||||
|
for(j = 0; j < size; j++)
|
||||||
|
{
|
||||||
|
byte a = in[0];
|
||||||
|
byte b = in[1];
|
||||||
|
byte c = in[2];
|
||||||
|
byte d = in[3];
|
||||||
|
out[0] = (byte)(a * b) + (byte)(b * c) + (byte)(c * d) + (byte)(d * a);
|
||||||
|
in += 4;
|
||||||
|
out += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* { dg-final { scan-assembler "palignr" } } */
|
||||||
|
|
@ -5371,8 +5371,9 @@ vect_shift_permute_load_chain (vec<tree> dr_chain,
|
||||||
memcpy (result_chain->address (), dr_chain.address (),
|
memcpy (result_chain->address (), dr_chain.address (),
|
||||||
length * sizeof (tree));
|
length * sizeof (tree));
|
||||||
|
|
||||||
if (length == 2 && LOOP_VINFO_VECT_FACTOR (loop_vinfo) > 4)
|
if (exact_log2 (length) != -1 && LOOP_VINFO_VECT_FACTOR (loop_vinfo) > 4)
|
||||||
{
|
{
|
||||||
|
unsigned int j, log_length = exact_log2 (length);
|
||||||
for (i = 0; i < nelt / 2; ++i)
|
for (i = 0; i < nelt / 2; ++i)
|
||||||
sel[i] = i * 2;
|
sel[i] = i * 2;
|
||||||
for (i = 0; i < nelt / 2; ++i)
|
for (i = 0; i < nelt / 2; ++i)
|
||||||
|
|
@ -5433,37 +5434,44 @@ vect_shift_permute_load_chain (vec<tree> dr_chain,
|
||||||
select_mask = vect_gen_perm_mask (vectype, sel);
|
select_mask = vect_gen_perm_mask (vectype, sel);
|
||||||
gcc_assert (select_mask != NULL);
|
gcc_assert (select_mask != NULL);
|
||||||
|
|
||||||
first_vect = dr_chain[0];
|
for (i = 0; i < log_length; i++)
|
||||||
second_vect = dr_chain[1];
|
{
|
||||||
|
for (j = 0; j < length; j += 2)
|
||||||
|
{
|
||||||
|
first_vect = dr_chain[j];
|
||||||
|
second_vect = dr_chain[j + 1];
|
||||||
|
|
||||||
data_ref = make_temp_ssa_name (vectype, NULL, "vect_shuffle2");
|
data_ref = make_temp_ssa_name (vectype, NULL, "vect_shuffle2");
|
||||||
perm_stmt = gimple_build_assign_with_ops (VEC_PERM_EXPR, data_ref,
|
perm_stmt = gimple_build_assign_with_ops (VEC_PERM_EXPR, data_ref,
|
||||||
first_vect, first_vect,
|
first_vect, first_vect,
|
||||||
perm2_mask1);
|
perm2_mask1);
|
||||||
vect_finish_stmt_generation (stmt, perm_stmt, gsi);
|
vect_finish_stmt_generation (stmt, perm_stmt, gsi);
|
||||||
vect[0] = data_ref;
|
vect[0] = data_ref;
|
||||||
|
|
||||||
data_ref = make_temp_ssa_name (vectype, NULL, "vect_shuffle2");
|
data_ref = make_temp_ssa_name (vectype, NULL, "vect_shuffle2");
|
||||||
perm_stmt = gimple_build_assign_with_ops (VEC_PERM_EXPR, data_ref,
|
perm_stmt = gimple_build_assign_with_ops (VEC_PERM_EXPR, data_ref,
|
||||||
second_vect, second_vect,
|
second_vect, second_vect,
|
||||||
perm2_mask2);
|
perm2_mask2);
|
||||||
vect_finish_stmt_generation (stmt, perm_stmt, gsi);
|
vect_finish_stmt_generation (stmt, perm_stmt, gsi);
|
||||||
vect[1] = data_ref;
|
vect[1] = data_ref;
|
||||||
|
|
||||||
data_ref = make_temp_ssa_name (vectype, NULL, "vect_shift");
|
data_ref = make_temp_ssa_name (vectype, NULL, "vect_shift");
|
||||||
perm_stmt = gimple_build_assign_with_ops (VEC_PERM_EXPR, data_ref,
|
perm_stmt = gimple_build_assign_with_ops (VEC_PERM_EXPR, data_ref,
|
||||||
vect[0], vect[1],
|
vect[0], vect[1],
|
||||||
shift1_mask);
|
shift1_mask);
|
||||||
vect_finish_stmt_generation (stmt, perm_stmt, gsi);
|
vect_finish_stmt_generation (stmt, perm_stmt, gsi);
|
||||||
(*result_chain)[1] = data_ref;
|
(*result_chain)[j/2 + length/2] = data_ref;
|
||||||
|
|
||||||
data_ref = make_temp_ssa_name (vectype, NULL, "vect_select");
|
|
||||||
perm_stmt = gimple_build_assign_with_ops (VEC_PERM_EXPR, data_ref,
|
|
||||||
vect[0], vect[1],
|
|
||||||
select_mask);
|
|
||||||
vect_finish_stmt_generation (stmt, perm_stmt, gsi);
|
|
||||||
(*result_chain)[0] = data_ref;
|
|
||||||
|
|
||||||
|
data_ref = make_temp_ssa_name (vectype, NULL, "vect_select");
|
||||||
|
perm_stmt = gimple_build_assign_with_ops (VEC_PERM_EXPR, data_ref,
|
||||||
|
vect[0], vect[1],
|
||||||
|
select_mask);
|
||||||
|
vect_finish_stmt_generation (stmt, perm_stmt, gsi);
|
||||||
|
(*result_chain)[j/2] = data_ref;
|
||||||
|
}
|
||||||
|
memcpy (dr_chain.address (), result_chain->address (),
|
||||||
|
length * sizeof (tree));
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (length == 3 && LOOP_VINFO_VECT_FACTOR (loop_vinfo) > 2)
|
if (length == 3 && LOOP_VINFO_VECT_FACTOR (loop_vinfo) > 2)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue