On Wed, Mar 23, 2016 at 02:28:03PM +0300, Kirill Yukhin wrote:
> Hello,
> 
> `vpcmpeqd' insn is only available in AVX2, however
> [1] added check for AVX instead. Looks like a typo.
> 
> Patch in the bottom fixes that.
> 
> Bootstrapped, regtest still run.
> Is it ok for main trunk if pass?

??
I see
VEX.NDS.128.66.0F.WIG 76 /r     RVM     V/V     AVX     Compare packed 
doublewords in xmm3/m128 and
VPCMPEQD xmm1, xmm2, xmm3/m128                          xmm2 for equality.
and
VEX.NDS.256.66.0F.WIG 76 /r     RVM     V/V     AVX2    Compare packed 
doublewords in ymm3/m256 and
VPCMPEQD ymm1, ymm2, ymm3 /m256                         ymm2 for equality.
in the ISA pdfs.
This code is only executed if standard_sse_constant_p returns 2, which
is for 16-byte vectors and all ones for TARGET_SSE2, and for
32-byte vectors for TARGET_AVX2.
Thus, IMNSHO the patch is wrong, even for plain -mavx -mno-avx2
we want to emit vpcmpeqd %xmm?, %xmm?, %xmm?, so that we don't mix
VEX with non-VEX encoded insns.

> gcc/
>       * config/i386/i386.c (standard_sse_constant_opcode): Emit
>       vpcmpeqd if AVX2 is enabled.
> 
> [1] - https://gcc.gnu.org/ml/gcc-cvs/2011-09/msg00318.html
> 
> --
> Thanks, K
> 
> commit e30c86b06968416e7401a113b866ae353311aa10
> Author: Kirill Yukhin <kirill.yuk...@intel.com>
> Date:   Wed Mar 23 14:08:07 2016 +0300
> 
>     AVX2. Emit vpcmpeqd for const_m1 only if AVX2 is enabled.
> 
> diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
> index 1639704..7f5db75 100644
> --- a/gcc/config/i386/i386.c
> +++ b/gcc/config/i386/i386.c
> @@ -10859,7 +10859,7 @@ standard_sse_constant_opcode (rtx_insn *insn, rtx x)
>           || get_attr_mode (insn) == MODE_V8DF
>           || get_attr_mode (insn) == MODE_V16SF)
>         return "vpternlogd\t{$0xFF, %g0, %g0, %g0|%g0, %g0, %g0, 0xFF}";
> -      if (TARGET_AVX)
> +      if (TARGET_AVX2)
>         return "vpcmpeqd\t%0, %0, %0";
>        else
>         return "pcmpeqd\t%0, %0";

        Jakub

Reply via email to