Enable avx512 embedde broadcast for vpternlog.
authorliuhongt <hongtao.liu@intel.com>
Tue, 24 Aug 2021 10:09:33 +0000 (18:09 +0800)
committerliuhongt <hongtao.liu@intel.com>
Tue, 24 Aug 2021 10:33:02 +0000 (18:33 +0800)
gcc/ChangeLog:

PR target/101989
* config/i386/sse.md (<avx512>_vternlog<mode><sd_maskz_name>):
Enable avx512 embedded broadcast.
(*<avx512>_vternlog<mode>_all): Ditto.
(<avx512>_vternlog<mode>_mask): Ditto.

gcc/testsuite/ChangeLog:

PR target/101989
* gcc.target/i386/pr101989-broadcast-1.c: New test.

gcc/config/i386/sse.md
gcc/testsuite/gcc.target/i386/pr101989-broadcast-1.c [new file with mode: 0644]

index 25ca9a5..03fc2df 100644 (file)
        (unspec:VI48_AVX512VL
          [(match_operand:VI48_AVX512VL 1 "register_operand" "0")
           (match_operand:VI48_AVX512VL 2 "register_operand" "v")
-          (match_operand:VI48_AVX512VL 3 "nonimmediate_operand" "vm")
+          (match_operand:VI48_AVX512VL 3 "bcst_vector_operand" "vmBr")
           (match_operand:SI 4 "const_0_to_255_operand")]
          UNSPEC_VTERNLOG))]
   "TARGET_AVX512F"
        (unspec:V
          [(match_operand:V 1 "register_operand" "0")
           (match_operand:V 2 "register_operand" "v")
-          (match_operand:V 3 "nonimmediate_operand" "vm")
+          (match_operand:V 3 "bcst_vector_operand" "vmBr")
           (match_operand:SI 4 "const_0_to_255_operand")]
          UNSPEC_VTERNLOG))]
   "TARGET_AVX512F"
          (unspec:VI48_AVX512VL
            [(match_operand:VI48_AVX512VL 1 "register_operand" "0")
             (match_operand:VI48_AVX512VL 2 "register_operand" "v")
-            (match_operand:VI48_AVX512VL 3 "nonimmediate_operand" "vm")
+            (match_operand:VI48_AVX512VL 3 "bcst_vector_operand" "vmBr")
             (match_operand:SI 4 "const_0_to_255_operand")]
            UNSPEC_VTERNLOG)
          (match_dup 1)
diff --git a/gcc/testsuite/gcc.target/i386/pr101989-broadcast-1.c b/gcc/testsuite/gcc.target/i386/pr101989-broadcast-1.c
new file mode 100644 (file)
index 0000000..d03d192
--- /dev/null
@@ -0,0 +1,31 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512vl" } */
+/* { dg-final { scan-assembler-times "vpternlog" 4 } } */
+/* { dg-final { scan-assembler-times "\\\{1to4\\\}" 4 } } */
+#include<immintrin.h>
+extern long long C;
+__m256d
+copysign2_pd(__m256d from, __m256d to) {
+  __m256i a = _mm256_castpd_si256(from);
+  __m256d avx_signbit = _mm256_castsi256_pd(_mm256_slli_epi64(_mm256_cmpeq_epi64(a, a), 63));
+  /* (avx_signbit & from) | (~avx_signbit & to)  */
+  return _mm256_or_pd(_mm256_and_pd(avx_signbit, from), _mm256_andnot_pd(avx_signbit, to));
+}
+
+__m256i
+mask_pternlog (__m256i A, __m256i B, __mmask8 U)
+{
+  return _mm256_mask_ternarylogic_epi64 (A, U, B, _mm256_set1_epi64x (C) ,202);
+}
+
+__m256i
+maskz_pternlog (__m256i A, __m256i B, __mmask8 U)
+{
+  return _mm256_maskz_ternarylogic_epi64 (U, A, B, _mm256_set1_epi64x (C) ,202);
+}
+
+__m256i
+none_pternlog (__m256i A, __m256i B)
+{
+  return _mm256_ternarylogic_epi64 (A, B, _mm256_set1_epi64x (C) ,202);
+}