> This patch is about to support Intel AVX-VNNI instructions.
>
> AVX-VNNI is an equivalent to AVX512-VNNI with VEX encoding. The instructions
> are same, but with extra {vex} prefix to distinguish from AVX512-VNNI 
> instructions
> in assembler.
>
> For more details, please refer to 
> https://software.intel.com/content/dam/develop
> /external/us/en/documents/architecture-instruction-set-extensions-programming-
> reference.pdf
>
> Bootstrap ok, regression test on i386/x86 backend is ok.
>
> OK for master?
>
> 2020-10-13  Hongtao Liu  <hongtao....@intel.com>
>         Hongyu Wang  <hongyu.w...@intel.com>
>
> gcc/
>     * common/config/i386/cpuinfo.h (get_available_features):
>     Detect AVXVNNI.
>     * common/config/i386/i386-common.c
>     (OPTION_MASK_ISA2_AVXVNNI_SET,
>     OPTION_MASK_ISA2_AVXVNNI_UNSET, OPTION_MASK_ISA2_AVX2_UNSET):
>     New.
>     (ix86_hanlde_option): Handle -mavxvnni, unset avxvnni when
>     avx2 is disabled.
>     * common/config/i386/i386-cpuinfo.h (enum processor_features):
>     Add FEATURE_AVXVNNI.
>     * common/config/i386/i386-isas.h: Add ISA_NAMES_TABLE_ENTRY
>     for avxvnni.
>     * config.gcc: Add avxvnniintrin.h.
>     * config/i386/avx512vnniintrin.h: Remove 128/256 bit non-mask
>     intrinsics.
>     * config/i386/avxvnniintrin.h: New header file.
>     * config/i386/cpuid.h (bit_AVXVNNI): New.
>     * config/i386/i386-builtins.c (def_builtin): Handle AVXVNNI mask
>     for unified builtin.
>     * config/i386/i386-builtin.def (BDESC): Adjust AVX512VNNI
>     builtins for AVXVNNI.
>     * config/i386/i386-c.c (ix86_target_macros_internal): Define
>     __AVXVNNI__.
>     * config/i386/i386-expand.c (ix86_expand_builtin): Handle bisa
>     for AVXVNNI to support unified intrinsic name, since there is no
>     dependency between AVX512VNNI and AVXVNNI.
>     * config/i386/i386-options.c (isa2_opts): Add -mavxvnni.
>     (ix86_valid_target_attribute_inner_p): Handle avxnnni.
>     (ix86_valid_target_attribute_inner_p): Ditto.
>     * config/i386/i386.h (TARGET_AVXVNNI, TARGET_AVXVNNI_P,
>     TARGET_AVXVNNI_P, PTA_AVXVNNI): New.
>     (PTA_SAPPHIRERAPIDS): Add AVX_VNNI.
>     (PTA_ALDERLAKE): Likewise.
>     * config/i386/i386.md ("isa"): Add avxvnni, avx512vnnivl.
>     ("enabled"): Adjust for avxvnni and avx512vnnivl.
>     * config/i386/i386.opt: Add option -mavxvnni.
>     * config/i386/immintrin.h: Include avxvnniintrin.h.
>     * config/i386/sse.md (vpdpbusd_<mode>): Adjust for AVXVNNI.
>     (vpdpbusds_<mode>): Likewise.
>     (vpdpwssd_<mode>): Likewise.
>     (vpdpwssds_<mode>): Likewise.
>     (vpdpbusd_v16si): New.
>     (vpdpbusds_v16si): Likewise.
>     (vpdpwssd_v16si): Likewise.
>     (vpdpwssds_v16si): Likewise.
>     * doc/invoke.texi: Document -mavxvnni.
>     * doc/extend.texi: Document avxvnni.
>     * doc/sourcebuild.texi: Document target avxvnni.
>
> gcc/testsuite/
>
>     * gcc.target/i386/avx512vl-vnni-1.c: Rename..
>     * gcc.target/i386/avx512vl-vnni-1a.c: To This.
>     * gcc.target/i386/avx512vl-vnni-1b.c: New test.
>     * gcc.target/i386/avx512vl-vnni-2.c: Ditto.
>     * gcc.target/i386/avx512vl-vnni-3.c: Ditto.
>     * gcc.target/i386/avx-vnni-1.c: Ditto.
>     * gcc.target/i386/avx-vnni-2.c: Ditto.
>     * gcc.target/i386/avx-vnni-3.c: Ditto.
>     * gcc.target/i386/avx-vnni-4.c: Ditto.
>     * gcc.target/i386/avx-vnni-5.c: Ditto.
>     * gcc.target/i386/avx-vnni-6.c: Ditto.
>     * gcc.target/i386/avx-vpdpbusd-2.c: Ditto.
>     * gcc.target/i386/avx-vpdpbusds-2.c: Ditto.
>     * gcc.target/i386/avx-vpdpwssd-2.c: Ditto.
>     * gcc.target/i386/avx-vpdpwssds-2.c: Ditto.
>     * gcc.target/i386/vnni_inline_error.c: Ditto.
>     * gcc.target/i386/avx512vnnivl-builtin.c: Ditto.
>     * gcc.target/i386/avxvnni-builtin.c: Ditto.
>     * gcc.target/i386/funcspec-56.inc: Add new target attribute.
>     * gcc.target/i386/pr83488-3.c: Adjust.
>     * gcc.target/i386/sse-12.c: Add -mavxvnni.
>     * gcc.target/i386/sse-13.c: Ditto.
>     * gcc.target/i386/sse-14.c: Ditto.
>     * gcc.target/i386/sse-22.c: Ditto.
>     * gcc.target/i386/sse-23.c: Ditto.
>     * g++.dg/other/i386-2.C: Ditto.
>     * g++.dg/other/i386-3.C: Ditto.
>     * lib/target-supports.exp (check_effective_target_avxvnni):
>     New proc.

+      /* Support unified builtin.  */
+      || (mask2 == OPTION_MASK_ISA2_AVXVNNI)

I don't think we gain anything with unified builtins. Better, just
introduce separate builtins, e.g for

-BDESC (OPTION_MASK_ISA_AVX512VNNI | OPTION_MASK_ISA_AVX512VL, 0,
CODE_FOR_vpdpbusd_v8si, "__builtin_ia32_vpdpbusd_v8si",
IX86_BUILTIN_VPDPBUSDV8SI, UNKNOWN, (int) V8SI_FTYPE_V8SI_V8SI_V8SI)
+BDESC (OPTION_MASK_ISA_AVX512VNNI | OPTION_MASK_ISA_AVX512VL,
OPTION_MASK_ISA2_AVXVNNI, CODE_FOR_vpdpbusd_v8si,
"__builtin_ia32_vpdpbusd_v8si", IX86_BUILTIN_VPDPBUSDV8SI, UNKNOWN,
(int) V8SI_FTYPE_V8SI_V8SI_V8SI)

add __builtin_ia32_vpdbusd_avx_v8si with the same CODE_FOR.

This will remove the need for:

+  if ((((bisa & (OPTION_MASK_ISA_AVX512VNNI | OPTION_MASK_ISA_AVX512VL))
+    == (OPTION_MASK_ISA_AVX512VNNI | OPTION_MASK_ISA_AVX512VL))
+       || (bisa2 & OPTION_MASK_ISA2_AVXVNNI) != 0)
+      && (((isa & (OPTION_MASK_ISA_AVX512VNNI | OPTION_MASK_ISA_AVX512VL))
+       == (OPTION_MASK_ISA_AVX512VNNI | OPTION_MASK_ISA_AVX512VL))
+      || (isa2 & OPTION_MASK_ISA2_AVXVNNI) != 0))
+    {
+      isa |= OPTION_MASK_ISA_AVX512VNNI | OPTION_MASK_ISA_AVX512VL;
+      isa2 |= OPTION_MASK_ISA2_AVXVNNI;
+    }

which is already complex with AVX512VL processing.

+#ifdef __AVXVNNI__
+#define _mm256_dpbusd_avx_epi32(A, B, C) \
+  _mm256_dpbusd_epi32((A), (B), (C))
+#define _mm_dpbusd_avx_epi32(A, B, C) \
+  _mm_dpbusd_epi32((A), (B), (C))
+#define _mm256_dpbusds_avx_epi32(A, B, C) \
+  _mm256_dpbusds_epi32((A), (B), (C))
+#define _mm_dpbusds_avx_epi32(A, B, C) \
+  _mm_dpbusds_epi32((A), (B), (C))
+#define _mm256_dpwssd_avx_epi32(A, B, C) \
+  _mm256_dpwssd_epi32((A), (B), (C))
+#define _mm_dpwssd_avx_epi32(A, B, C) \
+  _mm_dpwssd_epi32((A), (B), (C))
+#define _mm256_dpwssds_avx_epi32(A, B, C) \
+  _mm256_dpwssds_epi32((A), (B), (C))
+#define _mm_dpwssds_avx_epi32(A, B, C) \
+  _mm_dpwssds_epi32((A), (B), (C))
+#endif /* __AVXVNNI__ */
+

The above won't be needed with separate builtins.

Please repost the patch, I think that the following part(s) of the
patch were already committed via another patch:

@@ -399,8 +403,8 @@ ix86_handle_option (struct gcc_options *opts,
     {
       opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE_UNSET;
       opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE_UNSET;
-      opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA2_AVX512F_UNSET;
-      opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_AVX512F_UNSET;
+      opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA2_AVX2_UNSET;
+      opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_AVX2_UNSET;
     }
       return true;

No review for the sse.md and for testcases.

Uros.

Reply via email to