|
|
67287f |
2014-02-21 Jakub Jelinek <jakub@redhat.com>
|
|
|
67287f |
|
|
|
67287f |
* config/i386/i386.c (ix86_expand_vec_perm): Use V8SImode
|
|
|
67287f |
mode for mask of V8SFmode permutation.
|
|
|
67287f |
|
|
|
67287f |
2014-02-20 Jakub Jelinek <jakub@redhat.com>
|
|
|
67287f |
|
|
|
67287f |
PR target/57896
|
|
|
67287f |
* config/i386/i386.c (expand_vec_perm_interleave2): Don't call
|
|
|
67287f |
gen_reg_rtx if d->testing_p.
|
|
|
67287f |
(expand_vec_perm_pshufb2, expand_vec_perm_even_odd_1,
|
|
|
67287f |
expand_vec_perm_broadcast_1): Return early if d->testing_p and
|
|
|
67287f |
we will certainly return true.
|
|
|
67287f |
|
|
|
67287f |
--- gcc/config/i386/i386.c (revision 207969)
|
|
|
67287f |
+++ gcc/config/i386/i386.c (revision 207982)
|
|
|
67287f |
@@ -20460,7 +20460,7 @@ ix86_expand_vec_perm (rtx operands[])
|
|
|
67287f |
return;
|
|
|
67287f |
|
|
|
67287f |
case V8SFmode:
|
|
|
67287f |
- mask = gen_lowpart (V8SFmode, mask);
|
|
|
67287f |
+ mask = gen_lowpart (V8SImode, mask);
|
|
|
67287f |
if (one_operand_shuffle)
|
|
|
67287f |
emit_insn (gen_avx2_permvarv8sf (target, op0, mask));
|
|
|
67287f |
else
|
|
|
67287f |
@@ -39405,7 +39405,9 @@ expand_vec_perm_interleave2 (struct expa
|
|
|
67287f |
else
|
|
|
67287f |
dfinal.perm[i] = e;
|
|
|
67287f |
}
|
|
|
67287f |
- dfinal.op0 = gen_reg_rtx (dfinal.vmode);
|
|
|
67287f |
+
|
|
|
67287f |
+ if (!d->testing_p)
|
|
|
67287f |
+ dfinal.op0 = gen_reg_rtx (dfinal.vmode);
|
|
|
67287f |
dfinal.op1 = dfinal.op0;
|
|
|
67287f |
dfinal.one_operand_p = true;
|
|
|
67287f |
dremap.target = dfinal.op0;
|
|
|
67287f |
@@ -39840,6 +39842,9 @@ expand_vec_perm_pshufb2 (struct expand_v
|
|
|
67287f |
return false;
|
|
|
67287f |
gcc_assert (!d->one_operand_p);
|
|
|
67287f |
|
|
|
67287f |
+ if (d->testing_p)
|
|
|
67287f |
+ return true;
|
|
|
67287f |
+
|
|
|
67287f |
nelt = d->nelt;
|
|
|
67287f |
eltsz = GET_MODE_SIZE (GET_MODE_INNER (d->vmode));
|
|
|
67287f |
|
|
|
67287f |
@@ -40039,6 +40044,8 @@ expand_vec_perm_even_odd_1 (struct expan
|
|
|
67287f |
switch (d->vmode)
|
|
|
67287f |
{
|
|
|
67287f |
case V4DFmode:
|
|
|
67287f |
+ if (d->testing_p)
|
|
|
67287f |
+ break;
|
|
|
67287f |
t1 = gen_reg_rtx (V4DFmode);
|
|
|
67287f |
t2 = gen_reg_rtx (V4DFmode);
|
|
|
67287f |
|
|
|
67287f |
@@ -40058,6 +40065,8 @@ expand_vec_perm_even_odd_1 (struct expan
|
|
|
67287f |
{
|
|
|
67287f |
int mask = odd ? 0xdd : 0x88;
|
|
|
67287f |
|
|
|
67287f |
+ if (d->testing_p)
|
|
|
67287f |
+ break;
|
|
|
67287f |
t1 = gen_reg_rtx (V8SFmode);
|
|
|
67287f |
t2 = gen_reg_rtx (V8SFmode);
|
|
|
67287f |
t3 = gen_reg_rtx (V8SFmode);
|
|
|
67287f |
@@ -40099,6 +40108,8 @@ expand_vec_perm_even_odd_1 (struct expan
|
|
|
67287f |
return expand_vec_perm_pshufb2 (d);
|
|
|
67287f |
else
|
|
|
67287f |
{
|
|
|
67287f |
+ if (d->testing_p)
|
|
|
67287f |
+ break;
|
|
|
67287f |
/* We need 2*log2(N)-1 operations to achieve odd/even
|
|
|
67287f |
with interleave. */
|
|
|
67287f |
t1 = gen_reg_rtx (V8HImode);
|
|
|
67287f |
@@ -40120,6 +40131,8 @@ expand_vec_perm_even_odd_1 (struct expan
|
|
|
67287f |
return expand_vec_perm_pshufb2 (d);
|
|
|
67287f |
else
|
|
|
67287f |
{
|
|
|
67287f |
+ if (d->testing_p)
|
|
|
67287f |
+ break;
|
|
|
67287f |
t1 = gen_reg_rtx (V16QImode);
|
|
|
67287f |
t2 = gen_reg_rtx (V16QImode);
|
|
|
67287f |
t3 = gen_reg_rtx (V16QImode);
|
|
|
67287f |
@@ -40152,6 +40165,9 @@ expand_vec_perm_even_odd_1 (struct expan
|
|
|
67287f |
return expand_vec_perm_even_odd_1 (&d_copy, odd);
|
|
|
67287f |
}
|
|
|
67287f |
|
|
|
67287f |
+ if (d->testing_p)
|
|
|
67287f |
+ break;
|
|
|
67287f |
+
|
|
|
67287f |
t1 = gen_reg_rtx (V4DImode);
|
|
|
67287f |
t2 = gen_reg_rtx (V4DImode);
|
|
|
67287f |
|
|
|
67287f |
@@ -40178,6 +40194,9 @@ expand_vec_perm_even_odd_1 (struct expan
|
|
|
67287f |
return expand_vec_perm_even_odd_1 (&d_copy, odd);
|
|
|
67287f |
}
|
|
|
67287f |
|
|
|
67287f |
+ if (d->testing_p)
|
|
|
67287f |
+ break;
|
|
|
67287f |
+
|
|
|
67287f |
t1 = gen_reg_rtx (V8SImode);
|
|
|
67287f |
t2 = gen_reg_rtx (V8SImode);
|
|
|
67287f |
|
|
|
67287f |
@@ -40270,6 +40289,8 @@ expand_vec_perm_broadcast_1 (struct expa
|
|
|
67287f |
case V16QImode:
|
|
|
67287f |
/* These can be implemented via interleave. We save one insn by
|
|
|
67287f |
stopping once we have promoted to V4SImode and then use pshufd. */
|
|
|
67287f |
+ if (d->testing_p)
|
|
|
67287f |
+ return true;
|
|
|
67287f |
do
|
|
|
67287f |
{
|
|
|
67287f |
rtx dest;
|