x86/AVX512: improve generated code for mask-to-vector-register conversions
authorJan Beulich <jbeulich@suse.com>
Tue, 23 Jul 2019 08:07:49 +0000 (08:07 +0000)
committerJan Beulich <jbeulich@gcc.gnu.org>
Tue, 23 Jul 2019 08:07:49 +0000 (08:07 +0000)
Conversion of comparison results to full vectors does, when VPMOVM2* are
unavailable, not require any intermediate VMOVDQ{A,U}*: Simply use
embedded masking on VPTERNLOG* right away, which is available with
AVX512F (while VPMOVM2{D,Q} are available only with AVX512DQ).

Note that the chosen immediate is only one of many possible ones; I was
trying to make the insn here distinguishable from the pre-existing uses
of vpternlog.

gcc/
2019-07-23  Jan Beulich  <jbeulich@suse.com>

* config/i386/sse.md (<avx512>_cvtmask2<ssemodesuffix><mode>):
Require only AVX512F.
(*<avx512>_cvtmask2<ssemodesuffix><mode>): Likewise.  Add
alternative expanding to vpternlog.

From-SVN: r273719

gcc/ChangeLog
gcc/config/i386/sse.md

index 3e8953fc09757678107a72524255e83ebffdca1b..3b39269f0857598afc905af751a39fccd42bc1ec 100644 (file)
@@ -1,3 +1,10 @@
+2019-07-23  Jan Beulich  <jbeulich@suse.com>
+
+       * config/i386/sse.md (<avx512>_cvtmask2<ssemodesuffix><mode>):
+       Require only AVX512F.
+       (*<avx512>_cvtmask2<ssemodesuffix><mode>): Likewise.  Add
+       alternative expanding to vpternlog.
+
 2019-07-23  Martin Liska  <mliska@suse.cz>
 
        * dwarf2out.c (gen_producer_string): Canonize -flto=N
index 8abd1617b6f1ccc00511603e1369bfce2cc63f48..fa8f13f5796a0c513269169f15286e528162adac 100644 (file)
          (match_dup 2)
          (match_dup 3)
          (match_operand:<avx512fmaskmode> 1 "register_operand")))]
-  "TARGET_AVX512DQ"
+  "TARGET_AVX512F"
   "{
     operands[2] = CONSTM1_RTX (<MODE>mode);
     operands[3] = CONST0_RTX (<MODE>mode);
   }")
 
 (define_insn "*<avx512>_cvtmask2<ssemodesuffix><mode>"
-  [(set (match_operand:VI48_AVX512VL 0 "register_operand" "=v")
+  [(set (match_operand:VI48_AVX512VL 0 "register_operand" "=v,v")
        (vec_merge:VI48_AVX512VL
          (match_operand:VI48_AVX512VL 2 "vector_all_ones_operand")
          (match_operand:VI48_AVX512VL 3 "const0_operand")
-         (match_operand:<avx512fmaskmode> 1 "register_operand" "k")))]
-  "TARGET_AVX512DQ"
-  "vpmovm2<ssemodesuffix>\t{%1, %0|%0, %1}"
-  [(set_attr "prefix" "evex")
+         (match_operand:<avx512fmaskmode> 1 "register_operand" "k,Yk")))]
+  "TARGET_AVX512F"
+  "@
+   vpmovm2<ssemodesuffix>\t{%1, %0|%0, %1}
+   vpternlog<ssemodesuffix>\t{$0x81, %0, %0, %0%{%1%}%{z%}|%0%{%1%}%{z%}, %0, %0, 0x81}"
+  [(set_attr "isa" "avx512dq,*")
+   (set_attr "length_immediate" "0,1")
+   (set_attr "prefix" "evex")
    (set_attr "mode" "<sseinsnmode>")])
 
 (define_insn "sse2_cvtps2pd<mask_name>"