]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/82855 (AVX512: replace OP+movemask with OP_mask+ktest)
authorJakub Jelinek <jakub@redhat.com>
Tue, 7 Nov 2017 20:49:30 +0000 (21:49 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 7 Nov 2017 20:49:30 +0000 (21:49 +0100)
PR target/82855
* config/i386/i386.md (SWI1248_AVX512BWDQ2_64): New mode iterator.
(*cmp<mode>_ccz_1): New insn with $k alternative.

* gcc.target/i386/avx512dq-pr82855.c: New test.

From-SVN: r254510

gcc/ChangeLog
gcc/config/i386/i386.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/avx512dq-pr82855.c [new file with mode: 0644]

index e387ee2cbaa885842ff73f41e2f4ce788b614c98..8b9e91a2fbaa0f01e787c805b0cc07353e8235e8 100644 (file)
@@ -1,5 +1,9 @@
 2017-11-07  Jakub Jelinek  <jakub@redhat.com>
 
+       PR target/82855
+       * config/i386/i386.md (SWI1248_AVX512BWDQ2_64): New mode iterator.
+       (*cmp<mode>_ccz_1): New insn with $k alternative.
+
        PR target/82855
        * config/i386/i386.c (ix86_swap_binary_operands_p): Treat
        RTX_COMM_COMPARE as commutative as well.
index 36061e19adb84b04da6f3eb01eaf2eac54201a7f..90e622cbaf565faba5e8452fc640964705e7ab54 100644 (file)
        (compare:CC (match_operand:SWI48 0 "nonimmediate_operand")
                    (match_operand:SWI48 1 "<general_operand>")))])
 
+(define_mode_iterator SWI1248_AVX512BWDQ2_64
+  [(QI "TARGET_AVX512DQ") (HI "TARGET_AVX512DQ")
+   (SI "TARGET_AVX512BW") (DI "TARGET_AVX512BW && TARGET_64BIT")])
+
+(define_insn "*cmp<mode>_ccz_1"
+  [(set (reg FLAGS_REG)
+       (compare (match_operand:SWI1248_AVX512BWDQ2_64 0
+                       "nonimmediate_operand" "<r>,?m<r>,$k")
+                (match_operand:SWI1248_AVX512BWDQ2_64 1 "const0_operand")))]
+  "ix86_match_ccmode (insn, CCZmode)"
+  "@
+   test{<imodesuffix>}\t%0, %0
+   cmp{<imodesuffix>}\t{%1, %0|%0, %1}
+   ktest<mskmodesuffix>\t%0, %0"
+  [(set_attr "type" "test,icmp,msklog")
+   (set_attr "length_immediate" "0,1,*")
+   (set_attr "modrm_class" "op0,unknown,*")
+   (set_attr "prefix" "*,*,vex")
+   (set_attr "mode" "<MODE>")])
+
 (define_insn "*cmp<mode>_ccno_1"
   [(set (reg FLAGS_REG)
        (compare (match_operand:SWI 0 "nonimmediate_operand" "<r>,?m<r>")
index d8a018846b8f032c6074f8796385490304a84fca..ee526bfc949843a586bc4f02aa26e6af0fd62243 100644 (file)
@@ -1,3 +1,8 @@
+2017-11-07  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/82855
+       * gcc.target/i386/avx512dq-pr82855.c: New test.
+
 2017-11-07  Uros Bizjak  <ubizjak@gmail.com>
 
        PR target/80425
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-pr82855.c b/gcc/testsuite/gcc.target/i386/avx512dq-pr82855.c
new file mode 100644 (file)
index 0000000..563454c
--- /dev/null
@@ -0,0 +1,14 @@
+/* PR target/82855 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl -mavx512dq" } */
+/* { dg-final { scan-assembler {\mktestb\M} } } */
+
+#include <immintrin.h>
+
+int
+foo (const __m256i *ptr)
+{
+  __m256i v = _mm256_loadu_si256 (ptr);
+  __mmask8 m = _mm256_cmpeq_epi32_mask (v, _mm256_setzero_si256 ());
+  return 0 == m;
+}