On 23 Mar 12:55, Jakub Jelinek wrote:
> On Wed, Mar 23, 2016 at 02:47:54PM +0300, Kirill Yukhin wrote:
> > > 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.
> > You're right. I've updated the patch to check mode size as well.
> 
> That is also wrong, you will then emit vpcmpeqd even for -msse2 -mno-avx.
> 
> There is really nothing wrong in what is on the trunk, no reason to patch
> anything.  What the trunk does is, if you have AVX, you emit VEX encoded
> insn, if you don't have AVX, you emit normally encoded insn.
> And whether there is support to get cheap all ones is the business of
> standard_sse_constant_p function, which DTRT.
Probably, yes. But this just look pretty strange at first glance.
Something like this looks much more straightforward to me:
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 963cc3d..4aff647 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_AVX2 || get_attr_mode (insn) == 16)
+      if ((TARGET_AVX2 && get_attr_mode (insn) == 32) || TARGET_AVX)
        return "vpcmpeqd\t%0, %0, %0";
       else
        return "pcmpeqd\t%0, %0";

But yes, if standard_sse_constant_p () is used properly there's no need for
the change.

--
Thanks, K

Reply via email to