On Sat, Apr 10, 2021 at 5:11 PM H.J. Lu via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > Add inline_ignore_target function attribute to inform the compiler that > target specific option mismatch on functions with the always_inline > attribute may be ignored. On x86 targets, this attribute can be used on > integer functions to ignore target non-integer option mismatch.
I'm not sure I like such attribute but please adjust default_target_can_inline_p accordingly (only few targets override this hook). Richard. > gcc/c-family/ > > PR target/99744 > * c-family/c-attribs.c (c_common_attribute_table): Add > inline_ignore_target. > > gcc/ > > PR target/99744 > * common/config/i386/i386-common.c (OPTION_MASK_*) to ... > * common/config/i386/i386-common.h: Here. New file. > * config/i386/i386.c (ix86_can_inline_p): Ignore target > non-integer option mismatch if callee has inline_ignore_target > attribute. > * config/i386/i386.h: Include common/config/i386/i386-common.h. > * config/i386/ia32intrin.h (__rdtsc): Use always_inline function > with inline_ignore_target attribute. > (__rdtscp): Likewise. > * config/i386/serializeintrin.h (_serialize): Likewise. > * doc/extend.texi: Document inline_ignore_target function > attribute. > > gcc/testsuite/ > > PR target/99744 > * gcc.target/i386/pr99744-3.c: New test. > --- > gcc/c-family/c-attribs.c | 2 + > gcc/common/config/i386/i386-common.c | 297 -------------------- > gcc/common/config/i386/i386-common.h | 315 ++++++++++++++++++++++ > gcc/config/i386/i386.c | 41 ++- > gcc/config/i386/i386.h | 1 + > gcc/config/i386/ia32intrin.h | 16 +- > gcc/config/i386/serializeintrin.h | 8 +- > gcc/doc/extend.texi | 8 + > gcc/testsuite/gcc.target/i386/pr99744-3.c | 13 + > 9 files changed, 396 insertions(+), 305 deletions(-) > create mode 100644 gcc/common/config/i386/i386-common.h > create mode 100644 gcc/testsuite/gcc.target/i386/pr99744-3.c > > diff --git a/gcc/c-family/c-attribs.c b/gcc/c-family/c-attribs.c > index c1f652d1dc9..863936af7ca 100644 > --- a/gcc/c-family/c-attribs.c > +++ b/gcc/c-family/c-attribs.c > @@ -323,6 +323,8 @@ const struct attribute_spec c_common_attribute_table[] = > attr_inline_exclusions }, > { "artificial", 0, 0, true, false, false, false, > handle_artificial_attribute, NULL }, > + { "inline_ignore_target", 0, 0, true, false, false, false, > + handle_artificial_attribute, NULL }, > { "flatten", 0, 0, true, false, false, false, > handle_flatten_attribute, NULL }, > { "used", 0, 0, true, false, false, false, > diff --git a/gcc/common/config/i386/i386-common.c > b/gcc/common/config/i386/i386-common.c > index b89183b830e..5caa53ac93f 100644 > --- a/gcc/common/config/i386/i386-common.c > +++ b/gcc/common/config/i386/i386-common.c > @@ -29,303 +29,6 @@ along with GCC; see the file COPYING3. If not see > #include "opts.h" > #include "flags.h" > > -/* Define a set of ISAs which are available when a given ISA is > - enabled. MMX and SSE ISAs are handled separately. */ > - > -#define OPTION_MASK_ISA_MMX_SET OPTION_MASK_ISA_MMX > -#define OPTION_MASK_ISA_3DNOW_SET \ > - (OPTION_MASK_ISA_3DNOW | OPTION_MASK_ISA_MMX_SET) > -#define OPTION_MASK_ISA_3DNOW_A_SET \ > - (OPTION_MASK_ISA_3DNOW_A | OPTION_MASK_ISA_3DNOW_SET) > - > -#define OPTION_MASK_ISA_SSE_SET OPTION_MASK_ISA_SSE > -#define OPTION_MASK_ISA_SSE2_SET \ > - (OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_SSE_SET) > -#define OPTION_MASK_ISA_SSE3_SET \ > - (OPTION_MASK_ISA_SSE3 | OPTION_MASK_ISA_SSE2_SET) > -#define OPTION_MASK_ISA_SSSE3_SET \ > - (OPTION_MASK_ISA_SSSE3 | OPTION_MASK_ISA_SSE3_SET) > -#define OPTION_MASK_ISA_SSE4_1_SET \ > - (OPTION_MASK_ISA_SSE4_1 | OPTION_MASK_ISA_SSSE3_SET) > -#define OPTION_MASK_ISA_SSE4_2_SET \ > - (OPTION_MASK_ISA_SSE4_2 | OPTION_MASK_ISA_SSE4_1_SET) > -#define OPTION_MASK_ISA_AVX_SET \ > - (OPTION_MASK_ISA_AVX | OPTION_MASK_ISA_SSE4_2_SET \ > - | OPTION_MASK_ISA_XSAVE_SET) > -#define OPTION_MASK_ISA_FMA_SET \ > - (OPTION_MASK_ISA_FMA | OPTION_MASK_ISA_AVX_SET) > -#define OPTION_MASK_ISA_AVX2_SET \ > - (OPTION_MASK_ISA_AVX2 | OPTION_MASK_ISA_AVX_SET) > -#define OPTION_MASK_ISA_FXSR_SET OPTION_MASK_ISA_FXSR > -#define OPTION_MASK_ISA_XSAVE_SET OPTION_MASK_ISA_XSAVE > -#define OPTION_MASK_ISA_XSAVEOPT_SET \ > - (OPTION_MASK_ISA_XSAVEOPT | OPTION_MASK_ISA_XSAVE_SET) > -#define OPTION_MASK_ISA_AVX512F_SET \ > - (OPTION_MASK_ISA_AVX512F | OPTION_MASK_ISA_AVX2_SET) > -#define OPTION_MASK_ISA_AVX512CD_SET \ > - (OPTION_MASK_ISA_AVX512CD | OPTION_MASK_ISA_AVX512F_SET) > -#define OPTION_MASK_ISA_AVX512PF_SET \ > - (OPTION_MASK_ISA_AVX512PF | OPTION_MASK_ISA_AVX512F_SET) > -#define OPTION_MASK_ISA_AVX512ER_SET \ > - (OPTION_MASK_ISA_AVX512ER | OPTION_MASK_ISA_AVX512F_SET) > -#define OPTION_MASK_ISA_AVX512DQ_SET \ > - (OPTION_MASK_ISA_AVX512DQ | OPTION_MASK_ISA_AVX512F_SET) > -#define OPTION_MASK_ISA_AVX512BW_SET \ > - (OPTION_MASK_ISA_AVX512BW | OPTION_MASK_ISA_AVX512F_SET) > -#define OPTION_MASK_ISA_AVX512VL_SET \ > - (OPTION_MASK_ISA_AVX512VL | OPTION_MASK_ISA_AVX512F_SET) > -#define OPTION_MASK_ISA_AVX512IFMA_SET \ > - (OPTION_MASK_ISA_AVX512IFMA | OPTION_MASK_ISA_AVX512F_SET) > -#define OPTION_MASK_ISA_AVX512VBMI_SET \ > - (OPTION_MASK_ISA_AVX512VBMI | OPTION_MASK_ISA_AVX512BW_SET) > -#define OPTION_MASK_ISA2_AVX5124FMAPS_SET OPTION_MASK_ISA2_AVX5124FMAPS > -#define OPTION_MASK_ISA2_AVX5124VNNIW_SET OPTION_MASK_ISA2_AVX5124VNNIW > -#define OPTION_MASK_ISA_AVX512VBMI2_SET \ > - (OPTION_MASK_ISA_AVX512VBMI2 | OPTION_MASK_ISA_AVX512F_SET) > -#define OPTION_MASK_ISA_AVX512VNNI_SET \ > - (OPTION_MASK_ISA_AVX512VNNI | OPTION_MASK_ISA_AVX512F_SET) > -#define OPTION_MASK_ISA2_AVXVNNI_SET OPTION_MASK_ISA2_AVXVNNI > -#define OPTION_MASK_ISA_AVX512VPOPCNTDQ_SET \ > - (OPTION_MASK_ISA_AVX512VPOPCNTDQ | OPTION_MASK_ISA_AVX512F_SET) > -#define OPTION_MASK_ISA_AVX512BITALG_SET \ > - (OPTION_MASK_ISA_AVX512BITALG | OPTION_MASK_ISA_AVX512F_SET) > -#define OPTION_MASK_ISA2_AVX512BF16_SET OPTION_MASK_ISA2_AVX512BF16 > -#define OPTION_MASK_ISA_RTM_SET OPTION_MASK_ISA_RTM > -#define OPTION_MASK_ISA_PRFCHW_SET OPTION_MASK_ISA_PRFCHW > -#define OPTION_MASK_ISA_RDSEED_SET OPTION_MASK_ISA_RDSEED > -#define OPTION_MASK_ISA_ADX_SET OPTION_MASK_ISA_ADX > -#define OPTION_MASK_ISA_PREFETCHWT1_SET OPTION_MASK_ISA_PREFETCHWT1 > -#define OPTION_MASK_ISA_CLFLUSHOPT_SET OPTION_MASK_ISA_CLFLUSHOPT > -#define OPTION_MASK_ISA_XSAVES_SET \ > - (OPTION_MASK_ISA_XSAVES | OPTION_MASK_ISA_XSAVE_SET) > -#define OPTION_MASK_ISA_XSAVEC_SET \ > - (OPTION_MASK_ISA_XSAVEC | OPTION_MASK_ISA_XSAVE_SET) > -#define OPTION_MASK_ISA_CLWB_SET OPTION_MASK_ISA_CLWB > -#define OPTION_MASK_ISA2_AVX512VP2INTERSECT_SET > OPTION_MASK_ISA2_AVX512VP2INTERSECT > -#define OPTION_MASK_ISA2_AMX_TILE_SET OPTION_MASK_ISA2_AMX_TILE > -#define OPTION_MASK_ISA2_AMX_INT8_SET OPTION_MASK_ISA2_AMX_INT8 > -#define OPTION_MASK_ISA2_AMX_BF16_SET OPTION_MASK_ISA2_AMX_BF16 > - > -/* SSE4 includes both SSE4.1 and SSE4.2. -msse4 should be the same > - as -msse4.2. */ > -#define OPTION_MASK_ISA_SSE4_SET OPTION_MASK_ISA_SSE4_2_SET > - > -#define OPTION_MASK_ISA_SSE4A_SET \ > - (OPTION_MASK_ISA_SSE4A | OPTION_MASK_ISA_SSE3_SET) > -#define OPTION_MASK_ISA_FMA4_SET \ > - (OPTION_MASK_ISA_FMA4 | OPTION_MASK_ISA_SSE4A_SET \ > - | OPTION_MASK_ISA_AVX_SET) > -#define OPTION_MASK_ISA_XOP_SET \ > - (OPTION_MASK_ISA_XOP | OPTION_MASK_ISA_FMA4_SET) > -#define OPTION_MASK_ISA_LWP_SET \ > - OPTION_MASK_ISA_LWP > - > -/* AES, SHA and PCLMUL need SSE2 because they use xmm registers. */ > -#define OPTION_MASK_ISA_AES_SET \ > - (OPTION_MASK_ISA_AES | OPTION_MASK_ISA_SSE2_SET) > -#define OPTION_MASK_ISA_SHA_SET \ > - (OPTION_MASK_ISA_SHA | OPTION_MASK_ISA_SSE2_SET) > -#define OPTION_MASK_ISA_PCLMUL_SET \ > - (OPTION_MASK_ISA_PCLMUL | OPTION_MASK_ISA_SSE2_SET) > - > -#define OPTION_MASK_ISA_ABM_SET \ > - (OPTION_MASK_ISA_ABM | OPTION_MASK_ISA_POPCNT) > - > -#define OPTION_MASK_ISA2_PCONFIG_SET OPTION_MASK_ISA2_PCONFIG > -#define OPTION_MASK_ISA2_WBNOINVD_SET OPTION_MASK_ISA2_WBNOINVD > -#define OPTION_MASK_ISA2_SGX_SET OPTION_MASK_ISA2_SGX > -#define OPTION_MASK_ISA_BMI_SET OPTION_MASK_ISA_BMI > -#define OPTION_MASK_ISA_BMI2_SET OPTION_MASK_ISA_BMI2 > -#define OPTION_MASK_ISA_LZCNT_SET OPTION_MASK_ISA_LZCNT > -#define OPTION_MASK_ISA_TBM_SET OPTION_MASK_ISA_TBM > -#define OPTION_MASK_ISA_POPCNT_SET OPTION_MASK_ISA_POPCNT > -#define OPTION_MASK_ISA2_CX16_SET OPTION_MASK_ISA2_CX16 > -#define OPTION_MASK_ISA_SAHF_SET OPTION_MASK_ISA_SAHF > -#define OPTION_MASK_ISA2_MOVBE_SET OPTION_MASK_ISA2_MOVBE > -#define OPTION_MASK_ISA_CRC32_SET OPTION_MASK_ISA_CRC32 > - > -#define OPTION_MASK_ISA_FSGSBASE_SET OPTION_MASK_ISA_FSGSBASE > -#define OPTION_MASK_ISA_RDRND_SET OPTION_MASK_ISA_RDRND > -#define OPTION_MASK_ISA2_PTWRITE_SET OPTION_MASK_ISA2_PTWRITE > -#define OPTION_MASK_ISA_F16C_SET \ > - (OPTION_MASK_ISA_F16C | OPTION_MASK_ISA_AVX_SET) > -#define OPTION_MASK_ISA2_MWAITX_SET OPTION_MASK_ISA2_MWAITX > -#define OPTION_MASK_ISA2_CLZERO_SET OPTION_MASK_ISA2_CLZERO > -#define OPTION_MASK_ISA_PKU_SET OPTION_MASK_ISA_PKU > -#define OPTION_MASK_ISA2_RDPID_SET OPTION_MASK_ISA2_RDPID > -#define OPTION_MASK_ISA_GFNI_SET OPTION_MASK_ISA_GFNI > -#define OPTION_MASK_ISA_SHSTK_SET OPTION_MASK_ISA_SHSTK > -#define OPTION_MASK_ISA2_VAES_SET OPTION_MASK_ISA2_VAES > -#define OPTION_MASK_ISA_VPCLMULQDQ_SET OPTION_MASK_ISA_VPCLMULQDQ > -#define OPTION_MASK_ISA_MOVDIRI_SET OPTION_MASK_ISA_MOVDIRI > -#define OPTION_MASK_ISA2_MOVDIR64B_SET OPTION_MASK_ISA2_MOVDIR64B > -#define OPTION_MASK_ISA2_WAITPKG_SET OPTION_MASK_ISA2_WAITPKG > -#define OPTION_MASK_ISA2_CLDEMOTE_SET OPTION_MASK_ISA2_CLDEMOTE > -#define OPTION_MASK_ISA2_ENQCMD_SET OPTION_MASK_ISA2_ENQCMD > -#define OPTION_MASK_ISA2_SERIALIZE_SET OPTION_MASK_ISA2_SERIALIZE > -#define OPTION_MASK_ISA2_TSXLDTRK_SET OPTION_MASK_ISA2_TSXLDTRK > -#define OPTION_MASK_ISA2_UINTR_SET OPTION_MASK_ISA2_UINTR > -#define OPTION_MASK_ISA2_HRESET_SET OPTION_MASK_ISA2_HRESET > -#define OPTION_MASK_ISA2_KL_SET OPTION_MASK_ISA2_KL > -#define OPTION_MASK_ISA2_WIDEKL_SET \ > - (OPTION_MASK_ISA2_WIDEKL | OPTION_MASK_ISA2_KL_SET) > - > -/* Define a set of ISAs which aren't available when a given ISA is > - disabled. MMX and SSE ISAs are handled separately. */ > - > -#define OPTION_MASK_ISA_MMX_UNSET \ > - (OPTION_MASK_ISA_MMX | OPTION_MASK_ISA_3DNOW_UNSET) > -#define OPTION_MASK_ISA_3DNOW_UNSET \ > - (OPTION_MASK_ISA_3DNOW | OPTION_MASK_ISA_3DNOW_A_UNSET) > -#define OPTION_MASK_ISA_3DNOW_A_UNSET OPTION_MASK_ISA_3DNOW_A > - > -#define OPTION_MASK_ISA_SSE_UNSET \ > - (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_SSE2_UNSET) > -#define OPTION_MASK_ISA_SSE2_UNSET \ > - (OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_SSE3_UNSET) > -#define OPTION_MASK_ISA_SSE3_UNSET \ > - (OPTION_MASK_ISA_SSE3 \ > - | OPTION_MASK_ISA_SSSE3_UNSET \ > - | OPTION_MASK_ISA_SSE4A_UNSET ) > -#define OPTION_MASK_ISA_SSSE3_UNSET \ > - (OPTION_MASK_ISA_SSSE3 | OPTION_MASK_ISA_SSE4_1_UNSET) > -#define OPTION_MASK_ISA_SSE4_1_UNSET \ > - (OPTION_MASK_ISA_SSE4_1 | OPTION_MASK_ISA_SSE4_2_UNSET) > -#define OPTION_MASK_ISA_SSE4_2_UNSET \ > - (OPTION_MASK_ISA_SSE4_2 | OPTION_MASK_ISA_AVX_UNSET ) > -#define OPTION_MASK_ISA_AVX_UNSET \ > - (OPTION_MASK_ISA_AVX | OPTION_MASK_ISA_FMA_UNSET \ > - | OPTION_MASK_ISA_FMA4_UNSET | OPTION_MASK_ISA_F16C_UNSET \ > - | OPTION_MASK_ISA_AVX2_UNSET ) > -#define OPTION_MASK_ISA_FMA_UNSET OPTION_MASK_ISA_FMA > -#define OPTION_MASK_ISA_FXSR_UNSET OPTION_MASK_ISA_FXSR > -#define OPTION_MASK_ISA_XSAVE_UNSET \ > - (OPTION_MASK_ISA_XSAVE | OPTION_MASK_ISA_XSAVEOPT_UNSET \ > - | OPTION_MASK_ISA_XSAVES_UNSET | OPTION_MASK_ISA_XSAVEC_UNSET \ > - | OPTION_MASK_ISA_AVX_UNSET) > -#define OPTION_MASK_ISA2_XSAVE_UNSET OPTION_MASK_ISA2_AMX_TILE_UNSET > -#define OPTION_MASK_ISA_XSAVEOPT_UNSET OPTION_MASK_ISA_XSAVEOPT > -#define OPTION_MASK_ISA_AVX2_UNSET \ > - (OPTION_MASK_ISA_AVX2 | OPTION_MASK_ISA_AVX512F_UNSET) > -#define OPTION_MASK_ISA2_AVX2_UNSET \ > - (OPTION_MASK_ISA2_AVXVNNI_UNSET | OPTION_MASK_ISA2_AVX512F_UNSET) > -#define OPTION_MASK_ISA_AVX512F_UNSET \ > - (OPTION_MASK_ISA_AVX512F | OPTION_MASK_ISA_AVX512CD_UNSET \ > - | OPTION_MASK_ISA_AVX512PF_UNSET | OPTION_MASK_ISA_AVX512ER_UNSET \ > - | OPTION_MASK_ISA_AVX512DQ_UNSET | OPTION_MASK_ISA_AVX512BW_UNSET \ > - | OPTION_MASK_ISA_AVX512VL_UNSET | OPTION_MASK_ISA_AVX512IFMA_UNSET \ > - | OPTION_MASK_ISA_AVX512VBMI2_UNSET \ > - | OPTION_MASK_ISA_AVX512VNNI_UNSET \ > - | OPTION_MASK_ISA_AVX512VPOPCNTDQ_UNSET \ > - | OPTION_MASK_ISA_AVX512BITALG_UNSET) > -#define OPTION_MASK_ISA_AVX512CD_UNSET OPTION_MASK_ISA_AVX512CD > -#define OPTION_MASK_ISA_AVX512PF_UNSET OPTION_MASK_ISA_AVX512PF > -#define OPTION_MASK_ISA_AVX512ER_UNSET OPTION_MASK_ISA_AVX512ER > -#define OPTION_MASK_ISA_AVX512DQ_UNSET OPTION_MASK_ISA_AVX512DQ > -#define OPTION_MASK_ISA_AVX512BW_UNSET \ > - (OPTION_MASK_ISA_AVX512BW | OPTION_MASK_ISA_AVX512VBMI_UNSET) > -#define OPTION_MASK_ISA_AVX512VL_UNSET OPTION_MASK_ISA_AVX512VL > -#define OPTION_MASK_ISA_AVX512IFMA_UNSET OPTION_MASK_ISA_AVX512IFMA > -#define OPTION_MASK_ISA_AVX512VBMI_UNSET OPTION_MASK_ISA_AVX512VBMI > -#define OPTION_MASK_ISA2_AVX5124FMAPS_UNSET OPTION_MASK_ISA2_AVX5124FMAPS > -#define OPTION_MASK_ISA2_AVX5124VNNIW_UNSET OPTION_MASK_ISA2_AVX5124VNNIW > -#define OPTION_MASK_ISA_AVX512VBMI2_UNSET OPTION_MASK_ISA_AVX512VBMI2 > -#define OPTION_MASK_ISA_AVX512VNNI_UNSET OPTION_MASK_ISA_AVX512VNNI > -#define OPTION_MASK_ISA2_AVXVNNI_UNSET OPTION_MASK_ISA2_AVXVNNI > -#define OPTION_MASK_ISA_AVX512VPOPCNTDQ_UNSET OPTION_MASK_ISA_AVX512VPOPCNTDQ > -#define OPTION_MASK_ISA_AVX512BITALG_UNSET OPTION_MASK_ISA_AVX512BITALG > -#define OPTION_MASK_ISA2_AVX512BF16_UNSET OPTION_MASK_ISA2_AVX512BF16 > -#define OPTION_MASK_ISA_RTM_UNSET OPTION_MASK_ISA_RTM > -#define OPTION_MASK_ISA_PRFCHW_UNSET OPTION_MASK_ISA_PRFCHW > -#define OPTION_MASK_ISA_RDSEED_UNSET OPTION_MASK_ISA_RDSEED > -#define OPTION_MASK_ISA_ADX_UNSET OPTION_MASK_ISA_ADX > -#define OPTION_MASK_ISA_PREFETCHWT1_UNSET OPTION_MASK_ISA_PREFETCHWT1 > -#define OPTION_MASK_ISA_CLFLUSHOPT_UNSET OPTION_MASK_ISA_CLFLUSHOPT > -#define OPTION_MASK_ISA_XSAVEC_UNSET OPTION_MASK_ISA_XSAVEC > -#define OPTION_MASK_ISA_XSAVES_UNSET OPTION_MASK_ISA_XSAVES > -#define OPTION_MASK_ISA_CLWB_UNSET OPTION_MASK_ISA_CLWB > -#define OPTION_MASK_ISA2_MWAITX_UNSET OPTION_MASK_ISA2_MWAITX > -#define OPTION_MASK_ISA2_CLZERO_UNSET OPTION_MASK_ISA2_CLZERO > -#define OPTION_MASK_ISA_PKU_UNSET OPTION_MASK_ISA_PKU > -#define OPTION_MASK_ISA2_RDPID_UNSET OPTION_MASK_ISA2_RDPID > -#define OPTION_MASK_ISA_GFNI_UNSET OPTION_MASK_ISA_GFNI > -#define OPTION_MASK_ISA_SHSTK_UNSET OPTION_MASK_ISA_SHSTK > -#define OPTION_MASK_ISA2_VAES_UNSET OPTION_MASK_ISA2_VAES > -#define OPTION_MASK_ISA_VPCLMULQDQ_UNSET OPTION_MASK_ISA_VPCLMULQDQ > -#define OPTION_MASK_ISA_MOVDIRI_UNSET OPTION_MASK_ISA_MOVDIRI > -#define OPTION_MASK_ISA2_MOVDIR64B_UNSET OPTION_MASK_ISA2_MOVDIR64B > -#define OPTION_MASK_ISA2_WAITPKG_UNSET OPTION_MASK_ISA2_WAITPKG > -#define OPTION_MASK_ISA2_CLDEMOTE_UNSET OPTION_MASK_ISA2_CLDEMOTE > -#define OPTION_MASK_ISA2_ENQCMD_UNSET OPTION_MASK_ISA2_ENQCMD > -#define OPTION_MASK_ISA2_SERIALIZE_UNSET OPTION_MASK_ISA2_SERIALIZE > -#define OPTION_MASK_ISA2_AVX512VP2INTERSECT_UNSET > OPTION_MASK_ISA2_AVX512VP2INTERSECT > -#define OPTION_MASK_ISA2_TSXLDTRK_UNSET OPTION_MASK_ISA2_TSXLDTRK > -#define OPTION_MASK_ISA2_AMX_TILE_UNSET OPTION_MASK_ISA2_AMX_TILE > -#define OPTION_MASK_ISA2_AMX_INT8_UNSET OPTION_MASK_ISA2_AMX_INT8 > -#define OPTION_MASK_ISA2_AMX_BF16_UNSET OPTION_MASK_ISA2_AMX_BF16 > -#define OPTION_MASK_ISA2_UINTR_UNSET OPTION_MASK_ISA2_UINTR > -#define OPTION_MASK_ISA2_HRESET_UNSET OPTION_MASK_ISA2_HRESET > -#define OPTION_MASK_ISA2_KL_UNSET \ > - (OPTION_MASK_ISA2_KL | OPTION_MASK_ISA2_WIDEKL_UNSET) > -#define OPTION_MASK_ISA2_WIDEKL_UNSET OPTION_MASK_ISA2_WIDEKL > - > -/* SSE4 includes both SSE4.1 and SSE4.2. -mno-sse4 should the same > - as -mno-sse4.1. */ > -#define OPTION_MASK_ISA_SSE4_UNSET OPTION_MASK_ISA_SSE4_1_UNSET > - > -#define OPTION_MASK_ISA_SSE4A_UNSET \ > - (OPTION_MASK_ISA_SSE4A | OPTION_MASK_ISA_FMA4_UNSET) > - > -#define OPTION_MASK_ISA_FMA4_UNSET \ > - (OPTION_MASK_ISA_FMA4 | OPTION_MASK_ISA_XOP_UNSET) > -#define OPTION_MASK_ISA_XOP_UNSET OPTION_MASK_ISA_XOP > -#define OPTION_MASK_ISA_LWP_UNSET OPTION_MASK_ISA_LWP > - > -#define OPTION_MASK_ISA_AES_UNSET OPTION_MASK_ISA_AES > -#define OPTION_MASK_ISA_SHA_UNSET OPTION_MASK_ISA_SHA > -#define OPTION_MASK_ISA_PCLMUL_UNSET OPTION_MASK_ISA_PCLMUL > -#define OPTION_MASK_ISA_ABM_UNSET OPTION_MASK_ISA_ABM > -#define OPTION_MASK_ISA2_PCONFIG_UNSET OPTION_MASK_ISA2_PCONFIG > -#define OPTION_MASK_ISA2_WBNOINVD_UNSET OPTION_MASK_ISA2_WBNOINVD > -#define OPTION_MASK_ISA2_SGX_UNSET OPTION_MASK_ISA2_SGX > -#define OPTION_MASK_ISA_BMI_UNSET OPTION_MASK_ISA_BMI > -#define OPTION_MASK_ISA_BMI2_UNSET OPTION_MASK_ISA_BMI2 > -#define OPTION_MASK_ISA_LZCNT_UNSET OPTION_MASK_ISA_LZCNT > -#define OPTION_MASK_ISA_TBM_UNSET OPTION_MASK_ISA_TBM > -#define OPTION_MASK_ISA_POPCNT_UNSET OPTION_MASK_ISA_POPCNT > -#define OPTION_MASK_ISA2_CX16_UNSET OPTION_MASK_ISA2_CX16 > -#define OPTION_MASK_ISA_SAHF_UNSET OPTION_MASK_ISA_SAHF > -#define OPTION_MASK_ISA2_MOVBE_UNSET OPTION_MASK_ISA2_MOVBE > -#define OPTION_MASK_ISA_CRC32_UNSET OPTION_MASK_ISA_CRC32 > - > -#define OPTION_MASK_ISA_FSGSBASE_UNSET OPTION_MASK_ISA_FSGSBASE > -#define OPTION_MASK_ISA_RDRND_UNSET OPTION_MASK_ISA_RDRND > -#define OPTION_MASK_ISA2_PTWRITE_UNSET OPTION_MASK_ISA2_PTWRITE > -#define OPTION_MASK_ISA_F16C_UNSET OPTION_MASK_ISA_F16C > - > -#define OPTION_MASK_ISA_GENERAL_REGS_ONLY_UNSET \ > - (OPTION_MASK_ISA_MMX_UNSET \ > - | OPTION_MASK_ISA_SSE_UNSET) > - > -#define OPTION_MASK_ISA2_AVX512F_UNSET \ > - (OPTION_MASK_ISA2_AVX512BF16_UNSET \ > - | OPTION_MASK_ISA2_AVX5124FMAPS_UNSET \ > - | OPTION_MASK_ISA2_AVX5124VNNIW_UNSET \ > - | OPTION_MASK_ISA2_AVX512VP2INTERSECT_UNSET) > -#define OPTION_MASK_ISA2_GENERAL_REGS_ONLY_UNSET \ > - (OPTION_MASK_ISA2_AVX512F_UNSET) > -#define OPTION_MASK_ISA2_AVX_UNSET OPTION_MASK_ISA2_AVX2_UNSET > -#define OPTION_MASK_ISA2_SSE4_2_UNSET OPTION_MASK_ISA2_AVX_UNSET > -#define OPTION_MASK_ISA2_SSE4_1_UNSET OPTION_MASK_ISA2_SSE4_2_UNSET > -#define OPTION_MASK_ISA2_SSE4_UNSET OPTION_MASK_ISA2_SSE4_1_UNSET > -#define OPTION_MASK_ISA2_SSSE3_UNSET OPTION_MASK_ISA2_SSE4_1_UNSET > -#define OPTION_MASK_ISA2_SSE3_UNSET OPTION_MASK_ISA2_SSSE3_UNSET > -#define OPTION_MASK_ISA2_SSE2_UNSET \ > - (OPTION_MASK_ISA2_SSE3_UNSET | OPTION_MASK_ISA2_KL_UNSET) > -#define OPTION_MASK_ISA2_SSE_UNSET OPTION_MASK_ISA2_SSE2_UNSET > - > -#define OPTION_MASK_ISA2_AVX512BW_UNSET OPTION_MASK_ISA2_AVX512BF16_UNSET > - > /* Set 1 << value as value of -malign-FLAG option. */ > > static void > diff --git a/gcc/common/config/i386/i386-common.h > b/gcc/common/config/i386/i386-common.h > new file mode 100644 > index 00000000000..4a7fd290bcf > --- /dev/null > +++ b/gcc/common/config/i386/i386-common.h > @@ -0,0 +1,315 @@ > +/* IA-32 common macros. > + Copyright (C) 2021 Free Software Foundation, Inc. > + > +This file is part of GCC. > + > +GCC is free software; you can redistribute it and/or modify > +it under the terms of the GNU General Public License as published by > +the Free Software Foundation; either version 3, or (at your option) > +any later version. > + > +GCC is distributed in the hope that it will be useful, > +but WITHOUT ANY WARRANTY; without even the implied warranty of > +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +GNU General Public License for more details. > + > +You should have received a copy of the GNU General Public License > +along with GCC; see the file COPYING3. If not see > +<http://www.gnu.org/licenses/>. */ > + > +/* Define a set of ISAs which are available when a given ISA is > + enabled. MMX and SSE ISAs are handled separately. */ > + > +#define OPTION_MASK_ISA_MMX_SET OPTION_MASK_ISA_MMX > +#define OPTION_MASK_ISA_3DNOW_SET \ > + (OPTION_MASK_ISA_3DNOW | OPTION_MASK_ISA_MMX_SET) > +#define OPTION_MASK_ISA_3DNOW_A_SET \ > + (OPTION_MASK_ISA_3DNOW_A | OPTION_MASK_ISA_3DNOW_SET) > + > +#define OPTION_MASK_ISA_SSE_SET OPTION_MASK_ISA_SSE > +#define OPTION_MASK_ISA_SSE2_SET \ > + (OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_SSE_SET) > +#define OPTION_MASK_ISA_SSE3_SET \ > + (OPTION_MASK_ISA_SSE3 | OPTION_MASK_ISA_SSE2_SET) > +#define OPTION_MASK_ISA_SSSE3_SET \ > + (OPTION_MASK_ISA_SSSE3 | OPTION_MASK_ISA_SSE3_SET) > +#define OPTION_MASK_ISA_SSE4_1_SET \ > + (OPTION_MASK_ISA_SSE4_1 | OPTION_MASK_ISA_SSSE3_SET) > +#define OPTION_MASK_ISA_SSE4_2_SET \ > + (OPTION_MASK_ISA_SSE4_2 | OPTION_MASK_ISA_SSE4_1_SET) > +#define OPTION_MASK_ISA_AVX_SET \ > + (OPTION_MASK_ISA_AVX | OPTION_MASK_ISA_SSE4_2_SET \ > + | OPTION_MASK_ISA_XSAVE_SET) > +#define OPTION_MASK_ISA_FMA_SET \ > + (OPTION_MASK_ISA_FMA | OPTION_MASK_ISA_AVX_SET) > +#define OPTION_MASK_ISA_AVX2_SET \ > + (OPTION_MASK_ISA_AVX2 | OPTION_MASK_ISA_AVX_SET) > +#define OPTION_MASK_ISA_FXSR_SET OPTION_MASK_ISA_FXSR > +#define OPTION_MASK_ISA_XSAVE_SET OPTION_MASK_ISA_XSAVE > +#define OPTION_MASK_ISA_XSAVEOPT_SET \ > + (OPTION_MASK_ISA_XSAVEOPT | OPTION_MASK_ISA_XSAVE_SET) > +#define OPTION_MASK_ISA_AVX512F_SET \ > + (OPTION_MASK_ISA_AVX512F | OPTION_MASK_ISA_AVX2_SET) > +#define OPTION_MASK_ISA_AVX512CD_SET \ > + (OPTION_MASK_ISA_AVX512CD | OPTION_MASK_ISA_AVX512F_SET) > +#define OPTION_MASK_ISA_AVX512PF_SET \ > + (OPTION_MASK_ISA_AVX512PF | OPTION_MASK_ISA_AVX512F_SET) > +#define OPTION_MASK_ISA_AVX512ER_SET \ > + (OPTION_MASK_ISA_AVX512ER | OPTION_MASK_ISA_AVX512F_SET) > +#define OPTION_MASK_ISA_AVX512DQ_SET \ > + (OPTION_MASK_ISA_AVX512DQ | OPTION_MASK_ISA_AVX512F_SET) > +#define OPTION_MASK_ISA_AVX512BW_SET \ > + (OPTION_MASK_ISA_AVX512BW | OPTION_MASK_ISA_AVX512F_SET) > +#define OPTION_MASK_ISA_AVX512VL_SET \ > + (OPTION_MASK_ISA_AVX512VL | OPTION_MASK_ISA_AVX512F_SET) > +#define OPTION_MASK_ISA_AVX512IFMA_SET \ > + (OPTION_MASK_ISA_AVX512IFMA | OPTION_MASK_ISA_AVX512F_SET) > +#define OPTION_MASK_ISA_AVX512VBMI_SET \ > + (OPTION_MASK_ISA_AVX512VBMI | OPTION_MASK_ISA_AVX512BW_SET) > +#define OPTION_MASK_ISA2_AVX5124FMAPS_SET OPTION_MASK_ISA2_AVX5124FMAPS > +#define OPTION_MASK_ISA2_AVX5124VNNIW_SET OPTION_MASK_ISA2_AVX5124VNNIW > +#define OPTION_MASK_ISA_AVX512VBMI2_SET \ > + (OPTION_MASK_ISA_AVX512VBMI2 | OPTION_MASK_ISA_AVX512F_SET) > +#define OPTION_MASK_ISA_AVX512VNNI_SET \ > + (OPTION_MASK_ISA_AVX512VNNI | OPTION_MASK_ISA_AVX512F_SET) > +#define OPTION_MASK_ISA2_AVXVNNI_SET OPTION_MASK_ISA2_AVXVNNI > +#define OPTION_MASK_ISA_AVX512VPOPCNTDQ_SET \ > + (OPTION_MASK_ISA_AVX512VPOPCNTDQ | OPTION_MASK_ISA_AVX512F_SET) > +#define OPTION_MASK_ISA_AVX512BITALG_SET \ > + (OPTION_MASK_ISA_AVX512BITALG | OPTION_MASK_ISA_AVX512F_SET) > +#define OPTION_MASK_ISA2_AVX512BF16_SET OPTION_MASK_ISA2_AVX512BF16 > +#define OPTION_MASK_ISA_RTM_SET OPTION_MASK_ISA_RTM > +#define OPTION_MASK_ISA_PRFCHW_SET OPTION_MASK_ISA_PRFCHW > +#define OPTION_MASK_ISA_RDSEED_SET OPTION_MASK_ISA_RDSEED > +#define OPTION_MASK_ISA_ADX_SET OPTION_MASK_ISA_ADX > +#define OPTION_MASK_ISA_PREFETCHWT1_SET OPTION_MASK_ISA_PREFETCHWT1 > +#define OPTION_MASK_ISA_CLFLUSHOPT_SET OPTION_MASK_ISA_CLFLUSHOPT > +#define OPTION_MASK_ISA_XSAVES_SET \ > + (OPTION_MASK_ISA_XSAVES | OPTION_MASK_ISA_XSAVE_SET) > +#define OPTION_MASK_ISA_XSAVEC_SET \ > + (OPTION_MASK_ISA_XSAVEC | OPTION_MASK_ISA_XSAVE_SET) > +#define OPTION_MASK_ISA_CLWB_SET OPTION_MASK_ISA_CLWB > +#define OPTION_MASK_ISA2_AVX512VP2INTERSECT_SET > OPTION_MASK_ISA2_AVX512VP2INTERSECT > +#define OPTION_MASK_ISA2_AMX_TILE_SET OPTION_MASK_ISA2_AMX_TILE > +#define OPTION_MASK_ISA2_AMX_INT8_SET OPTION_MASK_ISA2_AMX_INT8 > +#define OPTION_MASK_ISA2_AMX_BF16_SET OPTION_MASK_ISA2_AMX_BF16 > + > +/* SSE4 includes both SSE4.1 and SSE4.2. -msse4 should be the same > + as -msse4.2. */ > +#define OPTION_MASK_ISA_SSE4_SET OPTION_MASK_ISA_SSE4_2_SET > + > +#define OPTION_MASK_ISA_SSE4A_SET \ > + (OPTION_MASK_ISA_SSE4A | OPTION_MASK_ISA_SSE3_SET) > +#define OPTION_MASK_ISA_FMA4_SET \ > + (OPTION_MASK_ISA_FMA4 | OPTION_MASK_ISA_SSE4A_SET \ > + | OPTION_MASK_ISA_AVX_SET) > +#define OPTION_MASK_ISA_XOP_SET \ > + (OPTION_MASK_ISA_XOP | OPTION_MASK_ISA_FMA4_SET) > +#define OPTION_MASK_ISA_LWP_SET \ > + OPTION_MASK_ISA_LWP > + > +/* AES, SHA and PCLMUL need SSE2 because they use xmm registers. */ > +#define OPTION_MASK_ISA_AES_SET \ > + (OPTION_MASK_ISA_AES | OPTION_MASK_ISA_SSE2_SET) > +#define OPTION_MASK_ISA_SHA_SET \ > + (OPTION_MASK_ISA_SHA | OPTION_MASK_ISA_SSE2_SET) > +#define OPTION_MASK_ISA_PCLMUL_SET \ > + (OPTION_MASK_ISA_PCLMUL | OPTION_MASK_ISA_SSE2_SET) > + > +#define OPTION_MASK_ISA_ABM_SET \ > + (OPTION_MASK_ISA_ABM | OPTION_MASK_ISA_POPCNT) > + > +#define OPTION_MASK_ISA2_PCONFIG_SET OPTION_MASK_ISA2_PCONFIG > +#define OPTION_MASK_ISA2_WBNOINVD_SET OPTION_MASK_ISA2_WBNOINVD > +#define OPTION_MASK_ISA2_SGX_SET OPTION_MASK_ISA2_SGX > +#define OPTION_MASK_ISA_BMI_SET OPTION_MASK_ISA_BMI > +#define OPTION_MASK_ISA_BMI2_SET OPTION_MASK_ISA_BMI2 > +#define OPTION_MASK_ISA_LZCNT_SET OPTION_MASK_ISA_LZCNT > +#define OPTION_MASK_ISA_TBM_SET OPTION_MASK_ISA_TBM > +#define OPTION_MASK_ISA_POPCNT_SET OPTION_MASK_ISA_POPCNT > +#define OPTION_MASK_ISA2_CX16_SET OPTION_MASK_ISA2_CX16 > +#define OPTION_MASK_ISA_SAHF_SET OPTION_MASK_ISA_SAHF > +#define OPTION_MASK_ISA2_MOVBE_SET OPTION_MASK_ISA2_MOVBE > +#define OPTION_MASK_ISA_CRC32_SET OPTION_MASK_ISA_CRC32 > + > +#define OPTION_MASK_ISA_FSGSBASE_SET OPTION_MASK_ISA_FSGSBASE > +#define OPTION_MASK_ISA_RDRND_SET OPTION_MASK_ISA_RDRND > +#define OPTION_MASK_ISA2_PTWRITE_SET OPTION_MASK_ISA2_PTWRITE > +#define OPTION_MASK_ISA_F16C_SET \ > + (OPTION_MASK_ISA_F16C | OPTION_MASK_ISA_AVX_SET) > +#define OPTION_MASK_ISA2_MWAITX_SET OPTION_MASK_ISA2_MWAITX > +#define OPTION_MASK_ISA2_CLZERO_SET OPTION_MASK_ISA2_CLZERO > +#define OPTION_MASK_ISA_PKU_SET OPTION_MASK_ISA_PKU > +#define OPTION_MASK_ISA2_RDPID_SET OPTION_MASK_ISA2_RDPID > +#define OPTION_MASK_ISA_GFNI_SET OPTION_MASK_ISA_GFNI > +#define OPTION_MASK_ISA_SHSTK_SET OPTION_MASK_ISA_SHSTK > +#define OPTION_MASK_ISA2_VAES_SET OPTION_MASK_ISA2_VAES > +#define OPTION_MASK_ISA_VPCLMULQDQ_SET OPTION_MASK_ISA_VPCLMULQDQ > +#define OPTION_MASK_ISA_MOVDIRI_SET OPTION_MASK_ISA_MOVDIRI > +#define OPTION_MASK_ISA2_MOVDIR64B_SET OPTION_MASK_ISA2_MOVDIR64B > +#define OPTION_MASK_ISA2_WAITPKG_SET OPTION_MASK_ISA2_WAITPKG > +#define OPTION_MASK_ISA2_CLDEMOTE_SET OPTION_MASK_ISA2_CLDEMOTE > +#define OPTION_MASK_ISA2_ENQCMD_SET OPTION_MASK_ISA2_ENQCMD > +#define OPTION_MASK_ISA2_SERIALIZE_SET OPTION_MASK_ISA2_SERIALIZE > +#define OPTION_MASK_ISA2_TSXLDTRK_SET OPTION_MASK_ISA2_TSXLDTRK > +#define OPTION_MASK_ISA2_UINTR_SET OPTION_MASK_ISA2_UINTR > +#define OPTION_MASK_ISA2_HRESET_SET OPTION_MASK_ISA2_HRESET > +#define OPTION_MASK_ISA2_KL_SET OPTION_MASK_ISA2_KL > +#define OPTION_MASK_ISA2_WIDEKL_SET \ > + (OPTION_MASK_ISA2_WIDEKL | OPTION_MASK_ISA2_KL_SET) > + > +/* Define a set of ISAs which aren't available when a given ISA is > + disabled. MMX and SSE ISAs are handled separately. */ > + > +#define OPTION_MASK_ISA_MMX_UNSET \ > + (OPTION_MASK_ISA_MMX | OPTION_MASK_ISA_3DNOW_UNSET) > +#define OPTION_MASK_ISA_3DNOW_UNSET \ > + (OPTION_MASK_ISA_3DNOW | OPTION_MASK_ISA_3DNOW_A_UNSET) > +#define OPTION_MASK_ISA_3DNOW_A_UNSET OPTION_MASK_ISA_3DNOW_A > + > +#define OPTION_MASK_ISA_SSE_UNSET \ > + (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_SSE2_UNSET) > +#define OPTION_MASK_ISA_SSE2_UNSET \ > + (OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_SSE3_UNSET) > +#define OPTION_MASK_ISA_SSE3_UNSET \ > + (OPTION_MASK_ISA_SSE3 \ > + | OPTION_MASK_ISA_SSSE3_UNSET \ > + | OPTION_MASK_ISA_SSE4A_UNSET ) > +#define OPTION_MASK_ISA_SSSE3_UNSET \ > + (OPTION_MASK_ISA_SSSE3 | OPTION_MASK_ISA_SSE4_1_UNSET) > +#define OPTION_MASK_ISA_SSE4_1_UNSET \ > + (OPTION_MASK_ISA_SSE4_1 | OPTION_MASK_ISA_SSE4_2_UNSET) > +#define OPTION_MASK_ISA_SSE4_2_UNSET \ > + (OPTION_MASK_ISA_SSE4_2 | OPTION_MASK_ISA_AVX_UNSET ) > +#define OPTION_MASK_ISA_AVX_UNSET \ > + (OPTION_MASK_ISA_AVX | OPTION_MASK_ISA_FMA_UNSET \ > + | OPTION_MASK_ISA_FMA4_UNSET | OPTION_MASK_ISA_F16C_UNSET \ > + | OPTION_MASK_ISA_AVX2_UNSET ) > +#define OPTION_MASK_ISA_FMA_UNSET OPTION_MASK_ISA_FMA > +#define OPTION_MASK_ISA_FXSR_UNSET OPTION_MASK_ISA_FXSR > +#define OPTION_MASK_ISA_XSAVE_UNSET \ > + (OPTION_MASK_ISA_XSAVE | OPTION_MASK_ISA_XSAVEOPT_UNSET \ > + | OPTION_MASK_ISA_XSAVES_UNSET | OPTION_MASK_ISA_XSAVEC_UNSET \ > + | OPTION_MASK_ISA_AVX_UNSET) > +#define OPTION_MASK_ISA2_XSAVE_UNSET OPTION_MASK_ISA2_AMX_TILE_UNSET > +#define OPTION_MASK_ISA_XSAVEOPT_UNSET OPTION_MASK_ISA_XSAVEOPT > +#define OPTION_MASK_ISA_AVX2_UNSET \ > + (OPTION_MASK_ISA_AVX2 | OPTION_MASK_ISA_AVX512F_UNSET) > +#define OPTION_MASK_ISA2_AVX2_UNSET \ > + (OPTION_MASK_ISA2_AVXVNNI_UNSET | OPTION_MASK_ISA2_AVX512F_UNSET) > +#define OPTION_MASK_ISA_AVX512F_UNSET \ > + (OPTION_MASK_ISA_AVX512F | OPTION_MASK_ISA_AVX512CD_UNSET \ > + | OPTION_MASK_ISA_AVX512PF_UNSET | OPTION_MASK_ISA_AVX512ER_UNSET \ > + | OPTION_MASK_ISA_AVX512DQ_UNSET | OPTION_MASK_ISA_AVX512BW_UNSET \ > + | OPTION_MASK_ISA_AVX512VL_UNSET | OPTION_MASK_ISA_AVX512IFMA_UNSET \ > + | OPTION_MASK_ISA_AVX512VBMI2_UNSET \ > + | OPTION_MASK_ISA_AVX512VNNI_UNSET \ > + | OPTION_MASK_ISA_AVX512VPOPCNTDQ_UNSET \ > + | OPTION_MASK_ISA_AVX512BITALG_UNSET) > +#define OPTION_MASK_ISA_AVX512CD_UNSET OPTION_MASK_ISA_AVX512CD > +#define OPTION_MASK_ISA_AVX512PF_UNSET OPTION_MASK_ISA_AVX512PF > +#define OPTION_MASK_ISA_AVX512ER_UNSET OPTION_MASK_ISA_AVX512ER > +#define OPTION_MASK_ISA_AVX512DQ_UNSET OPTION_MASK_ISA_AVX512DQ > +#define OPTION_MASK_ISA_AVX512BW_UNSET \ > + (OPTION_MASK_ISA_AVX512BW | OPTION_MASK_ISA_AVX512VBMI_UNSET) > +#define OPTION_MASK_ISA_AVX512VL_UNSET OPTION_MASK_ISA_AVX512VL > +#define OPTION_MASK_ISA_AVX512IFMA_UNSET OPTION_MASK_ISA_AVX512IFMA > +#define OPTION_MASK_ISA_AVX512VBMI_UNSET OPTION_MASK_ISA_AVX512VBMI > +#define OPTION_MASK_ISA2_AVX5124FMAPS_UNSET OPTION_MASK_ISA2_AVX5124FMAPS > +#define OPTION_MASK_ISA2_AVX5124VNNIW_UNSET OPTION_MASK_ISA2_AVX5124VNNIW > +#define OPTION_MASK_ISA_AVX512VBMI2_UNSET OPTION_MASK_ISA_AVX512VBMI2 > +#define OPTION_MASK_ISA_AVX512VNNI_UNSET OPTION_MASK_ISA_AVX512VNNI > +#define OPTION_MASK_ISA2_AVXVNNI_UNSET OPTION_MASK_ISA2_AVXVNNI > +#define OPTION_MASK_ISA_AVX512VPOPCNTDQ_UNSET OPTION_MASK_ISA_AVX512VPOPCNTDQ > +#define OPTION_MASK_ISA_AVX512BITALG_UNSET OPTION_MASK_ISA_AVX512BITALG > +#define OPTION_MASK_ISA2_AVX512BF16_UNSET OPTION_MASK_ISA2_AVX512BF16 > +#define OPTION_MASK_ISA_RTM_UNSET OPTION_MASK_ISA_RTM > +#define OPTION_MASK_ISA_PRFCHW_UNSET OPTION_MASK_ISA_PRFCHW > +#define OPTION_MASK_ISA_RDSEED_UNSET OPTION_MASK_ISA_RDSEED > +#define OPTION_MASK_ISA_ADX_UNSET OPTION_MASK_ISA_ADX > +#define OPTION_MASK_ISA_PREFETCHWT1_UNSET OPTION_MASK_ISA_PREFETCHWT1 > +#define OPTION_MASK_ISA_CLFLUSHOPT_UNSET OPTION_MASK_ISA_CLFLUSHOPT > +#define OPTION_MASK_ISA_XSAVEC_UNSET OPTION_MASK_ISA_XSAVEC > +#define OPTION_MASK_ISA_XSAVES_UNSET OPTION_MASK_ISA_XSAVES > +#define OPTION_MASK_ISA_CLWB_UNSET OPTION_MASK_ISA_CLWB > +#define OPTION_MASK_ISA2_MWAITX_UNSET OPTION_MASK_ISA2_MWAITX > +#define OPTION_MASK_ISA2_CLZERO_UNSET OPTION_MASK_ISA2_CLZERO > +#define OPTION_MASK_ISA_PKU_UNSET OPTION_MASK_ISA_PKU > +#define OPTION_MASK_ISA2_RDPID_UNSET OPTION_MASK_ISA2_RDPID > +#define OPTION_MASK_ISA_GFNI_UNSET OPTION_MASK_ISA_GFNI > +#define OPTION_MASK_ISA_SHSTK_UNSET OPTION_MASK_ISA_SHSTK > +#define OPTION_MASK_ISA2_VAES_UNSET OPTION_MASK_ISA2_VAES > +#define OPTION_MASK_ISA_VPCLMULQDQ_UNSET OPTION_MASK_ISA_VPCLMULQDQ > +#define OPTION_MASK_ISA_MOVDIRI_UNSET OPTION_MASK_ISA_MOVDIRI > +#define OPTION_MASK_ISA2_MOVDIR64B_UNSET OPTION_MASK_ISA2_MOVDIR64B > +#define OPTION_MASK_ISA2_WAITPKG_UNSET OPTION_MASK_ISA2_WAITPKG > +#define OPTION_MASK_ISA2_CLDEMOTE_UNSET OPTION_MASK_ISA2_CLDEMOTE > +#define OPTION_MASK_ISA2_ENQCMD_UNSET OPTION_MASK_ISA2_ENQCMD > +#define OPTION_MASK_ISA2_SERIALIZE_UNSET OPTION_MASK_ISA2_SERIALIZE > +#define OPTION_MASK_ISA2_AVX512VP2INTERSECT_UNSET > OPTION_MASK_ISA2_AVX512VP2INTERSECT > +#define OPTION_MASK_ISA2_TSXLDTRK_UNSET OPTION_MASK_ISA2_TSXLDTRK > +#define OPTION_MASK_ISA2_AMX_TILE_UNSET OPTION_MASK_ISA2_AMX_TILE > +#define OPTION_MASK_ISA2_AMX_INT8_UNSET OPTION_MASK_ISA2_AMX_INT8 > +#define OPTION_MASK_ISA2_AMX_BF16_UNSET OPTION_MASK_ISA2_AMX_BF16 > +#define OPTION_MASK_ISA2_UINTR_UNSET OPTION_MASK_ISA2_UINTR > +#define OPTION_MASK_ISA2_HRESET_UNSET OPTION_MASK_ISA2_HRESET > +#define OPTION_MASK_ISA2_KL_UNSET \ > + (OPTION_MASK_ISA2_KL | OPTION_MASK_ISA2_WIDEKL_UNSET) > +#define OPTION_MASK_ISA2_WIDEKL_UNSET OPTION_MASK_ISA2_WIDEKL > + > +/* SSE4 includes both SSE4.1 and SSE4.2. -mno-sse4 should the same > + as -mno-sse4.1. */ > +#define OPTION_MASK_ISA_SSE4_UNSET OPTION_MASK_ISA_SSE4_1_UNSET > + > +#define OPTION_MASK_ISA_SSE4A_UNSET \ > + (OPTION_MASK_ISA_SSE4A | OPTION_MASK_ISA_FMA4_UNSET) > + > +#define OPTION_MASK_ISA_FMA4_UNSET \ > + (OPTION_MASK_ISA_FMA4 | OPTION_MASK_ISA_XOP_UNSET) > +#define OPTION_MASK_ISA_XOP_UNSET OPTION_MASK_ISA_XOP > +#define OPTION_MASK_ISA_LWP_UNSET OPTION_MASK_ISA_LWP > + > +#define OPTION_MASK_ISA_AES_UNSET OPTION_MASK_ISA_AES > +#define OPTION_MASK_ISA_SHA_UNSET OPTION_MASK_ISA_SHA > +#define OPTION_MASK_ISA_PCLMUL_UNSET OPTION_MASK_ISA_PCLMUL > +#define OPTION_MASK_ISA_ABM_UNSET OPTION_MASK_ISA_ABM > +#define OPTION_MASK_ISA2_PCONFIG_UNSET OPTION_MASK_ISA2_PCONFIG > +#define OPTION_MASK_ISA2_WBNOINVD_UNSET OPTION_MASK_ISA2_WBNOINVD > +#define OPTION_MASK_ISA2_SGX_UNSET OPTION_MASK_ISA2_SGX > +#define OPTION_MASK_ISA_BMI_UNSET OPTION_MASK_ISA_BMI > +#define OPTION_MASK_ISA_BMI2_UNSET OPTION_MASK_ISA_BMI2 > +#define OPTION_MASK_ISA_LZCNT_UNSET OPTION_MASK_ISA_LZCNT > +#define OPTION_MASK_ISA_TBM_UNSET OPTION_MASK_ISA_TBM > +#define OPTION_MASK_ISA_POPCNT_UNSET OPTION_MASK_ISA_POPCNT > +#define OPTION_MASK_ISA2_CX16_UNSET OPTION_MASK_ISA2_CX16 > +#define OPTION_MASK_ISA_SAHF_UNSET OPTION_MASK_ISA_SAHF > +#define OPTION_MASK_ISA2_MOVBE_UNSET OPTION_MASK_ISA2_MOVBE > +#define OPTION_MASK_ISA_CRC32_UNSET OPTION_MASK_ISA_CRC32 > + > +#define OPTION_MASK_ISA_FSGSBASE_UNSET OPTION_MASK_ISA_FSGSBASE > +#define OPTION_MASK_ISA_RDRND_UNSET OPTION_MASK_ISA_RDRND > +#define OPTION_MASK_ISA2_PTWRITE_UNSET OPTION_MASK_ISA2_PTWRITE > +#define OPTION_MASK_ISA_F16C_UNSET OPTION_MASK_ISA_F16C > + > +#define OPTION_MASK_ISA_GENERAL_REGS_ONLY_UNSET \ > + (OPTION_MASK_ISA_MMX_UNSET \ > + | OPTION_MASK_ISA_SSE_UNSET) > + > +#define OPTION_MASK_ISA2_AVX512F_UNSET \ > + (OPTION_MASK_ISA2_AVX512BF16_UNSET \ > + | OPTION_MASK_ISA2_AVX5124FMAPS_UNSET \ > + | OPTION_MASK_ISA2_AVX5124VNNIW_UNSET \ > + | OPTION_MASK_ISA2_AVX512VP2INTERSECT_UNSET) > +#define OPTION_MASK_ISA2_GENERAL_REGS_ONLY_UNSET \ > + (OPTION_MASK_ISA2_AVX512F_UNSET) > +#define OPTION_MASK_ISA2_AVX_UNSET OPTION_MASK_ISA2_AVX2_UNSET > +#define OPTION_MASK_ISA2_SSE4_2_UNSET OPTION_MASK_ISA2_AVX_UNSET > +#define OPTION_MASK_ISA2_SSE4_1_UNSET OPTION_MASK_ISA2_SSE4_2_UNSET > +#define OPTION_MASK_ISA2_SSE4_UNSET OPTION_MASK_ISA2_SSE4_1_UNSET > +#define OPTION_MASK_ISA2_SSSE3_UNSET OPTION_MASK_ISA2_SSE4_1_UNSET > +#define OPTION_MASK_ISA2_SSE3_UNSET OPTION_MASK_ISA2_SSSE3_UNSET > +#define OPTION_MASK_ISA2_SSE2_UNSET \ > + (OPTION_MASK_ISA2_SSE3_UNSET | OPTION_MASK_ISA2_KL_UNSET) > +#define OPTION_MASK_ISA2_SSE_UNSET OPTION_MASK_ISA2_SSE2_UNSET > + > +#define OPTION_MASK_ISA2_AVX512BW_UNSET OPTION_MASK_ISA2_AVX512BF16_UNSET > diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c > index 7c41302c75b..aec6b224962 100644 > --- a/gcc/config/i386/i386.c > +++ b/gcc/config/i386/i386.c > @@ -553,7 +553,7 @@ ix86_can_inline_p (tree caller, tree callee) > > /* Changes of those flags can be tolerated for always inlines. Lets hope > user knows what he is doing. */ > - const unsigned HOST_WIDE_INT always_inline_safe_mask > + unsigned HOST_WIDE_INT always_inline_safe_mask > = (MASK_USE_8BIT_IDIV | MASK_ACCUMULATE_OUTGOING_ARGS > | MASK_NO_ALIGN_STRINGOPS | MASK_AVX256_SPLIT_UNALIGNED_LOAD > | MASK_AVX256_SPLIT_UNALIGNED_STORE | MASK_CLD > @@ -578,14 +578,45 @@ ix86_can_inline_p (tree caller, tree callee) > && lookup_attribute ("always_inline", > DECL_ATTRIBUTES (callee))); > > + /* Ignore target non-integer option mismatch if callee has > + inline_ignore_target attribute. */ > + bool inline_ignore_target > + = lookup_attribute ("inline_ignore_target", > + DECL_ATTRIBUTES (callee)); > + > cgraph_node *callee_node = cgraph_node::get (callee); > + > + if (inline_ignore_target) > + { > + /* If target vector option mismatch can be ignored, callee's > + integer ISA options should be a subset of the caller's > + integer ISA options. */ > + always_inline_safe_mask |= MASK_80387; > + HOST_WIDE_INT callee_integer_isa_flags > + = (callee_opts->x_ix86_isa_flags > + & ~OPTION_MASK_ISA_GENERAL_REGS_ONLY_UNSET); > + HOST_WIDE_INT callee_integer_isa_flags2 > + = (callee_opts->x_ix86_isa_flags2 > + & ~OPTION_MASK_ISA2_GENERAL_REGS_ONLY_UNSET); > + if (((caller_opts->x_ix86_isa_flags > + & callee_integer_isa_flags) > + != callee_integer_isa_flags) > + || ((caller_opts->x_ix86_isa_flags2 > + & callee_integer_isa_flags2) > + != callee_integer_isa_flags2)) > + return false; > + } > + > /* Callee's isa options should be a subset of the caller's, i.e. a SSE4 > function can inline a SSE2 function but a SSE2 function can't inline > a SSE4 function. */ > - if (((caller_opts->x_ix86_isa_flags & callee_opts->x_ix86_isa_flags) > - != callee_opts->x_ix86_isa_flags) > - || ((caller_opts->x_ix86_isa_flags2 & callee_opts->x_ix86_isa_flags2) > - != callee_opts->x_ix86_isa_flags2)) > + if (!inline_ignore_target > + && (((caller_opts->x_ix86_isa_flags > + & callee_opts->x_ix86_isa_flags) > + != callee_opts->x_ix86_isa_flags) > + || ((caller_opts->x_ix86_isa_flags2 > + & callee_opts->x_ix86_isa_flags2) > + != callee_opts->x_ix86_isa_flags2))) > ret = false; > > /* See if we have the same non-isa options. */ > diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h > index b4001d21b70..c07bd987fc9 100644 > --- a/gcc/config/i386/i386.h > +++ b/gcc/config/i386/i386.h > @@ -2569,6 +2569,7 @@ constexpr wide_int_bitmask PTA_KNM = PTA_KNL | > PTA_AVX5124VNNIW > > #include "insn-attr-common.h" > > +#include "common/config/i386/i386-common.h" > #include "common/config/i386/i386-cpuinfo.h" > > class pta > diff --git a/gcc/config/i386/ia32intrin.h b/gcc/config/i386/ia32intrin.h > index 591394076cc..04ed74ed01e 100644 > --- a/gcc/config/i386/ia32intrin.h > +++ b/gcc/config/i386/ia32intrin.h > @@ -107,12 +107,24 @@ __rdpmc (int __S) > #endif /* __iamcu__ */ > > /* rdtsc */ > -#define __rdtsc() __builtin_ia32_rdtsc () > +extern __inline unsigned long long > +__attribute__((__gnu_inline__, __always_inline__, __artificial__, > + __inline_ignore_target__)) > +__rdtsc (void) > +{ > + return __builtin_ia32_rdtsc (); > +} > > #ifndef __iamcu__ > > /* rdtscp */ > -#define __rdtscp(a) __builtin_ia32_rdtscp (a) > +extern __inline unsigned long long > +__attribute__((__gnu_inline__, __always_inline__, __artificial__, > + __inline_ignore_target__)) > +__rdtscp (unsigned int *__A) > +{ > + return __builtin_ia32_rdtscp (__A); > +} > > #endif /* __iamcu__ */ > > diff --git a/gcc/config/i386/serializeintrin.h > b/gcc/config/i386/serializeintrin.h > index e280250b198..d990d310b75 100644 > --- a/gcc/config/i386/serializeintrin.h > +++ b/gcc/config/i386/serializeintrin.h > @@ -34,7 +34,13 @@ > #define __DISABLE_SERIALIZE__ > #endif /* __SERIALIZE__ */ > > -#define _serialize() __builtin_ia32_serialize () > +extern __inline void > +__attribute__((__gnu_inline__, __always_inline__, __artificial__, > + __inline_ignore_target__)) > +_serialize (void) > +{ > + __builtin_ia32_serialize (); > +} > > #ifdef __DISABLE_SERIALIZE__ > #undef __DISABLE_SERIALIZE__ > diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi > index 849c8802473..a29ebd3f456 100644 > --- a/gcc/doc/extend.texi > +++ b/gcc/doc/extend.texi > @@ -3187,6 +3187,14 @@ int S::interface (int) __attribute__ ((ifunc > ("_ZN1S8resolverEv"))); > Indirect functions cannot be weak. Binutils version 2.20.1 or higher > and GNU C Library version 2.11.1 are required to use this feature. > > +@item inline_ignore_target > +@cindex @code{inline_ignore_target} function attribute > +The @code{inline_ignore_target} attribute on functions is used to > +inform the compiler that target specific option mismatch on functions > +with the @code{always_inline} attribute may be ignored. On x86 targets, > +this attribute can be used on integer functions to ignore target > +non-integer option mismatch. > + > @item interrupt > @itemx interrupt_handler > Many GCC back ends support attributes to indicate that a function is > diff --git a/gcc/testsuite/gcc.target/i386/pr99744-3.c > b/gcc/testsuite/gcc.target/i386/pr99744-3.c > new file mode 100644 > index 00000000000..5b6b1c20af7 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/i386/pr99744-3.c > @@ -0,0 +1,13 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2" } */ > + > +#include <x86intrin.h> > + > +__attribute__ ((target("general-regs-only"))) > +void > +foo1 (void) > +{ > + _serialize (); > +} > + > +/* { dg-error "target specific option mismatch" "" { target *-*-* } 0 } */ > -- > 2.30.2 >