> 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.