blob: cc64f855ecc9d7b07dcfd901ce179bae1315e1cb [file] [log] [blame]
/* Subroutines used for macro/preprocessor support on the ia-32.
Copyright (C) 2008-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 IN_TARGET_CODE 1
#include "config.h"
#include "system.h"
#include "coretypes.h"
#include "target.h"
#include "c-family/c-common.h"
#include "memmodel.h"
#include "tm_p.h"
#include "c-family/c-pragma.h"
static bool ix86_pragma_target_parse (tree, tree);
static void ix86_target_macros_internal
(HOST_WIDE_INT, HOST_WIDE_INT, enum processor_type, enum processor_type, enum fpmath_unit,
void (*def_or_undef) (cpp_reader *, const char *));
/* Internal function to either define or undef the appropriate system
macros. */
static void
ix86_target_macros_internal (HOST_WIDE_INT isa_flag,
HOST_WIDE_INT isa_flag2,
enum processor_type arch,
enum processor_type tune,
enum fpmath_unit fpmath,
void (*def_or_undef) (cpp_reader *,
const char *))
{
/* For some of the k6/pentium varients there weren't separate ISA bits to
identify which tune/arch flag was passed, so figure it out here. */
size_t arch_len = strlen (ix86_arch_string);
size_t tune_len = strlen (ix86_tune_string);
int last_arch_char = ix86_arch_string[arch_len - 1];
int last_tune_char = ix86_tune_string[tune_len - 1];
/* Built-ins based on -march=. */
switch (arch)
{
case PROCESSOR_I386:
break;
case PROCESSOR_I486:
def_or_undef (parse_in, "__i486");
def_or_undef (parse_in, "__i486__");
break;
case PROCESSOR_LAKEMONT:
/* Intel MCU is based on Intel Pentium CPU. */
case PROCESSOR_PENTIUM:
def_or_undef (parse_in, "__i586");
def_or_undef (parse_in, "__i586__");
def_or_undef (parse_in, "__pentium");
def_or_undef (parse_in, "__pentium__");
if (isa_flag & OPTION_MASK_ISA_MMX)
def_or_undef (parse_in, "__pentium_mmx__");
break;
case PROCESSOR_PENTIUMPRO:
def_or_undef (parse_in, "__i686");
def_or_undef (parse_in, "__i686__");
def_or_undef (parse_in, "__pentiumpro");
def_or_undef (parse_in, "__pentiumpro__");
break;
case PROCESSOR_GEODE:
def_or_undef (parse_in, "__geode");
def_or_undef (parse_in, "__geode__");
break;
case PROCESSOR_K6:
def_or_undef (parse_in, "__k6");
def_or_undef (parse_in, "__k6__");
if (last_arch_char == '2')
def_or_undef (parse_in, "__k6_2__");
else if (last_arch_char == '3')
def_or_undef (parse_in, "__k6_3__");
else if (isa_flag & OPTION_MASK_ISA_3DNOW)
def_or_undef (parse_in, "__k6_3__");
break;
case PROCESSOR_ATHLON:
def_or_undef (parse_in, "__athlon");
def_or_undef (parse_in, "__athlon__");
if (isa_flag & OPTION_MASK_ISA_SSE)
def_or_undef (parse_in, "__athlon_sse__");
break;
case PROCESSOR_K8:
def_or_undef (parse_in, "__k8");
def_or_undef (parse_in, "__k8__");
break;
case PROCESSOR_AMDFAM10:
def_or_undef (parse_in, "__amdfam10");
def_or_undef (parse_in, "__amdfam10__");
break;
case PROCESSOR_BDVER1:
def_or_undef (parse_in, "__bdver1");
def_or_undef (parse_in, "__bdver1__");
break;
case PROCESSOR_BDVER2:
def_or_undef (parse_in, "__bdver2");
def_or_undef (parse_in, "__bdver2__");
break;
case PROCESSOR_BDVER3:
def_or_undef (parse_in, "__bdver3");
def_or_undef (parse_in, "__bdver3__");
break;
case PROCESSOR_BDVER4:
def_or_undef (parse_in, "__bdver4");
def_or_undef (parse_in, "__bdver4__");
break;
case PROCESSOR_ZNVER1:
def_or_undef (parse_in, "__znver1");
def_or_undef (parse_in, "__znver1__");
break;
case PROCESSOR_ZNVER2:
def_or_undef (parse_in, "__znver2");
def_or_undef (parse_in, "__znver2__");
break;
case PROCESSOR_ZNVER3:
def_or_undef (parse_in, "__znver3");
def_or_undef (parse_in, "__znver3__");
break;
case PROCESSOR_BTVER1:
def_or_undef (parse_in, "__btver1");
def_or_undef (parse_in, "__btver1__");
break;
case PROCESSOR_BTVER2:
def_or_undef (parse_in, "__btver2");
def_or_undef (parse_in, "__btver2__");
break;
case PROCESSOR_PENTIUM4:
def_or_undef (parse_in, "__pentium4");
def_or_undef (parse_in, "__pentium4__");
break;
case PROCESSOR_NOCONA:
def_or_undef (parse_in, "__nocona");
def_or_undef (parse_in, "__nocona__");
break;
case PROCESSOR_CORE2:
def_or_undef (parse_in, "__core2");
def_or_undef (parse_in, "__core2__");
break;
case PROCESSOR_NEHALEM:
def_or_undef (parse_in, "__corei7");
def_or_undef (parse_in, "__corei7__");
def_or_undef (parse_in, "__nehalem");
def_or_undef (parse_in, "__nehalem__");
break;
case PROCESSOR_SANDYBRIDGE:
def_or_undef (parse_in, "__corei7_avx");
def_or_undef (parse_in, "__corei7_avx__");
def_or_undef (parse_in, "__sandybridge");
def_or_undef (parse_in, "__sandybridge__");
break;
case PROCESSOR_HASWELL:
def_or_undef (parse_in, "__core_avx2");
def_or_undef (parse_in, "__core_avx2__");
def_or_undef (parse_in, "__haswell");
def_or_undef (parse_in, "__haswell__");
break;
case PROCESSOR_BONNELL:
def_or_undef (parse_in, "__atom");
def_or_undef (parse_in, "__atom__");
def_or_undef (parse_in, "__bonnell");
def_or_undef (parse_in, "__bonnell__");
break;
case PROCESSOR_SILVERMONT:
def_or_undef (parse_in, "__slm");
def_or_undef (parse_in, "__slm__");
def_or_undef (parse_in, "__silvermont");
def_or_undef (parse_in, "__silvermont__");
break;
case PROCESSOR_GOLDMONT:
def_or_undef (parse_in, "__goldmont");
def_or_undef (parse_in, "__goldmont__");
break;
case PROCESSOR_GOLDMONT_PLUS:
def_or_undef (parse_in, "__goldmont_plus");
def_or_undef (parse_in, "__goldmont_plus__");
break;
case PROCESSOR_TREMONT:
def_or_undef (parse_in, "__tremont");
def_or_undef (parse_in, "__tremont__");
break;
case PROCESSOR_KNL:
def_or_undef (parse_in, "__knl");
def_or_undef (parse_in, "__knl__");
break;
case PROCESSOR_KNM:
def_or_undef (parse_in, "__knm");
def_or_undef (parse_in, "__knm__");
break;
case PROCESSOR_SKYLAKE:
def_or_undef (parse_in, "__skylake");
def_or_undef (parse_in, "__skylake__");
break;
case PROCESSOR_SKYLAKE_AVX512:
def_or_undef (parse_in, "__skylake_avx512");
def_or_undef (parse_in, "__skylake_avx512__");
break;
case PROCESSOR_CANNONLAKE:
def_or_undef (parse_in, "__cannonlake");
def_or_undef (parse_in, "__cannonlake__");
break;
case PROCESSOR_ICELAKE_CLIENT:
def_or_undef (parse_in, "__icelake_client");
def_or_undef (parse_in, "__icelake_client__");
break;
case PROCESSOR_ICELAKE_SERVER:
def_or_undef (parse_in, "__icelake_server");
def_or_undef (parse_in, "__icelake_server__");
break;
case PROCESSOR_CASCADELAKE:
def_or_undef (parse_in, "__cascadelake");
def_or_undef (parse_in, "__cascadelake__");
break;
case PROCESSOR_TIGERLAKE:
def_or_undef (parse_in, "__tigerlake");
def_or_undef (parse_in, "__tigerlake__");
break;
case PROCESSOR_COOPERLAKE:
def_or_undef (parse_in, "__cooperlake");
def_or_undef (parse_in, "__cooperlake__");
break;
case PROCESSOR_SAPPHIRERAPIDS:
def_or_undef (parse_in, "__sapphirerapids");
def_or_undef (parse_in, "__sapphirerapids__");
break;
case PROCESSOR_ALDERLAKE:
def_or_undef (parse_in, "__alderlake");
def_or_undef (parse_in, "__alderlake__");
break;
case PROCESSOR_ROCKETLAKE:
def_or_undef (parse_in, "__rocketlake");
def_or_undef (parse_in, "__rocketlake__");
break;
/* use PROCESSOR_max to not set/unset the arch macro. */
case PROCESSOR_max:
break;
case PROCESSOR_INTEL:
case PROCESSOR_GENERIC:
gcc_unreachable ();
}
/* Built-ins based on -mtune=. */
switch (tune)
{
case PROCESSOR_I386:
def_or_undef (parse_in, "__tune_i386__");
break;
case PROCESSOR_I486:
def_or_undef (parse_in, "__tune_i486__");
break;
case PROCESSOR_PENTIUM:
def_or_undef (parse_in, "__tune_i586__");
def_or_undef (parse_in, "__tune_pentium__");
if (last_tune_char == 'x')
def_or_undef (parse_in, "__tune_pentium_mmx__");
break;
case PROCESSOR_PENTIUMPRO:
def_or_undef (parse_in, "__tune_i686__");
def_or_undef (parse_in, "__tune_pentiumpro__");
switch (last_tune_char)
{
case '3':
def_or_undef (parse_in, "__tune_pentium3__");
/* FALLTHRU */
case '2':
def_or_undef (parse_in, "__tune_pentium2__");
break;
}
break;
case PROCESSOR_GEODE:
def_or_undef (parse_in, "__tune_geode__");
break;
case PROCESSOR_K6:
def_or_undef (parse_in, "__tune_k6__");
if (last_tune_char == '2')
def_or_undef (parse_in, "__tune_k6_2__");
else if (last_tune_char == '3')
def_or_undef (parse_in, "__tune_k6_3__");
else if (isa_flag & OPTION_MASK_ISA_3DNOW)
def_or_undef (parse_in, "__tune_k6_3__");
break;
case PROCESSOR_ATHLON:
def_or_undef (parse_in, "__tune_athlon__");
if (isa_flag & OPTION_MASK_ISA_SSE)
def_or_undef (parse_in, "__tune_athlon_sse__");
break;
case PROCESSOR_K8:
def_or_undef (parse_in, "__tune_k8__");
break;
case PROCESSOR_AMDFAM10:
def_or_undef (parse_in, "__tune_amdfam10__");
break;
case PROCESSOR_BDVER1:
def_or_undef (parse_in, "__tune_bdver1__");
break;
case PROCESSOR_BDVER2:
def_or_undef (parse_in, "__tune_bdver2__");
break;
case PROCESSOR_BDVER3:
def_or_undef (parse_in, "__tune_bdver3__");
break;
case PROCESSOR_BDVER4:
def_or_undef (parse_in, "__tune_bdver4__");
break;
case PROCESSOR_ZNVER1:
def_or_undef (parse_in, "__tune_znver1__");
break;
case PROCESSOR_ZNVER2:
def_or_undef (parse_in, "__tune_znver2__");
break;
case PROCESSOR_ZNVER3:
def_or_undef (parse_in, "__tune_znver3__");
break;
case PROCESSOR_BTVER1:
def_or_undef (parse_in, "__tune_btver1__");
break;
case PROCESSOR_BTVER2:
def_or_undef (parse_in, "__tune_btver2__");
break;
case PROCESSOR_PENTIUM4:
def_or_undef (parse_in, "__tune_pentium4__");
break;
case PROCESSOR_NOCONA:
def_or_undef (parse_in, "__tune_nocona__");
break;
case PROCESSOR_CORE2:
def_or_undef (parse_in, "__tune_core2__");
break;
case PROCESSOR_NEHALEM:
def_or_undef (parse_in, "__tune_corei7__");
def_or_undef (parse_in, "__tune_nehalem__");
break;
case PROCESSOR_SANDYBRIDGE:
def_or_undef (parse_in, "__tune_corei7_avx__");
def_or_undef (parse_in, "__tune_sandybridge__");
break;
case PROCESSOR_HASWELL:
def_or_undef (parse_in, "__tune_core_avx2__");
def_or_undef (parse_in, "__tune_haswell__");
break;
case PROCESSOR_BONNELL:
def_or_undef (parse_in, "__tune_atom__");
def_or_undef (parse_in, "__tune_bonnell__");
break;
case PROCESSOR_SILVERMONT:
def_or_undef (parse_in, "__tune_slm__");
def_or_undef (parse_in, "__tune_silvermont__");
break;
case PROCESSOR_GOLDMONT:
def_or_undef (parse_in, "__tune_goldmont__");
break;
case PROCESSOR_GOLDMONT_PLUS:
def_or_undef (parse_in, "__tune_goldmont_plus__");
break;
case PROCESSOR_TREMONT:
def_or_undef (parse_in, "__tune_tremont__");
break;
case PROCESSOR_KNL:
def_or_undef (parse_in, "__tune_knl__");
break;
case PROCESSOR_KNM:
def_or_undef (parse_in, "__tune_knm__");
break;
case PROCESSOR_SKYLAKE:
def_or_undef (parse_in, "__tune_skylake__");
break;
case PROCESSOR_SKYLAKE_AVX512:
def_or_undef (parse_in, "__tune_skylake_avx512__");
break;
case PROCESSOR_CANNONLAKE:
def_or_undef (parse_in, "__tune_cannonlake__");
break;
case PROCESSOR_ICELAKE_CLIENT:
def_or_undef (parse_in, "__tune_icelake_client__");
break;
case PROCESSOR_ICELAKE_SERVER:
def_or_undef (parse_in, "__tune_icelake_server__");
break;
case PROCESSOR_LAKEMONT:
def_or_undef (parse_in, "__tune_lakemont__");
break;
case PROCESSOR_CASCADELAKE:
def_or_undef (parse_in, "__tune_cascadelake__");
break;
case PROCESSOR_TIGERLAKE:
def_or_undef (parse_in, "__tune_tigerlake__");
break;
case PROCESSOR_COOPERLAKE:
def_or_undef (parse_in, "__tune_cooperlake__");
break;
case PROCESSOR_SAPPHIRERAPIDS:
def_or_undef (parse_in, "__tune_sapphirerapids__");
break;
case PROCESSOR_ALDERLAKE:
def_or_undef (parse_in, "__tune_alderlake__");
break;
case PROCESSOR_ROCKETLAKE:
def_or_undef (parse_in, "__tune_rocketlake__");
break;
case PROCESSOR_INTEL:
case PROCESSOR_GENERIC:
break;
/* use PROCESSOR_max to not set/unset the tune macro. */
case PROCESSOR_max:
break;
}
switch (ix86_cmodel)
{
case CM_SMALL:
case CM_SMALL_PIC:
def_or_undef (parse_in, "__code_model_small__");
break;
case CM_MEDIUM:
case CM_MEDIUM_PIC:
def_or_undef (parse_in, "__code_model_medium__");
break;
case CM_LARGE:
case CM_LARGE_PIC:
def_or_undef (parse_in, "__code_model_large__");
break;
case CM_32:
def_or_undef (parse_in, "__code_model_32__");
break;
case CM_KERNEL:
def_or_undef (parse_in, "__code_model_kernel__");
break;
default:
;
}
if (isa_flag2 & OPTION_MASK_ISA2_WBNOINVD)
def_or_undef (parse_in, "__WBNOINVD__");
if (isa_flag2 & OPTION_MASK_ISA2_AVX512VP2INTERSECT)
def_or_undef (parse_in, "__AVX512VP2INTERSECT__");
if (isa_flag & OPTION_MASK_ISA_MMX)
def_or_undef (parse_in, "__MMX__");
if (isa_flag & OPTION_MASK_ISA_3DNOW)
def_or_undef (parse_in, "__3dNOW__");
if (isa_flag & OPTION_MASK_ISA_3DNOW_A)
def_or_undef (parse_in, "__3dNOW_A__");
if (isa_flag & OPTION_MASK_ISA_SSE)
def_or_undef (parse_in, "__SSE__");
if (isa_flag & OPTION_MASK_ISA_SSE2)
def_or_undef (parse_in, "__SSE2__");
if (isa_flag & OPTION_MASK_ISA_SSE3)
def_or_undef (parse_in, "__SSE3__");
if (isa_flag & OPTION_MASK_ISA_SSSE3)
def_or_undef (parse_in, "__SSSE3__");
if (isa_flag & OPTION_MASK_ISA_SSE4_1)
def_or_undef (parse_in, "__SSE4_1__");
if (isa_flag & OPTION_MASK_ISA_SSE4_2)
def_or_undef (parse_in, "__SSE4_2__");
if (isa_flag & OPTION_MASK_ISA_AES)
def_or_undef (parse_in, "__AES__");
if (isa_flag & OPTION_MASK_ISA_SHA)
def_or_undef (parse_in, "__SHA__");
if (isa_flag & OPTION_MASK_ISA_PCLMUL)
def_or_undef (parse_in, "__PCLMUL__");
if (isa_flag & OPTION_MASK_ISA_AVX)
def_or_undef (parse_in, "__AVX__");
if (isa_flag & OPTION_MASK_ISA_AVX2)
def_or_undef (parse_in, "__AVX2__");
if (isa_flag & OPTION_MASK_ISA_AVX512F)
def_or_undef (parse_in, "__AVX512F__");
if (isa_flag & OPTION_MASK_ISA_AVX512ER)
def_or_undef (parse_in, "__AVX512ER__");
if (isa_flag & OPTION_MASK_ISA_AVX512CD)
def_or_undef (parse_in, "__AVX512CD__");
if (isa_flag & OPTION_MASK_ISA_AVX512PF)
def_or_undef (parse_in, "__AVX512PF__");
if (isa_flag & OPTION_MASK_ISA_AVX512DQ)
def_or_undef (parse_in, "__AVX512DQ__");
if (isa_flag & OPTION_MASK_ISA_AVX512BW)
def_or_undef (parse_in, "__AVX512BW__");
if (isa_flag & OPTION_MASK_ISA_AVX512VL)
def_or_undef (parse_in, "__AVX512VL__");
if (isa_flag & OPTION_MASK_ISA_AVX512VBMI)
def_or_undef (parse_in, "__AVX512VBMI__");
if (isa_flag & OPTION_MASK_ISA_AVX512IFMA)
def_or_undef (parse_in, "__AVX512IFMA__");
if (isa_flag2 & OPTION_MASK_ISA2_AVX5124VNNIW)
def_or_undef (parse_in, "__AVX5124VNNIW__");
if (isa_flag & OPTION_MASK_ISA_AVX512VBMI2)
def_or_undef (parse_in, "__AVX512VBMI2__");
if (isa_flag & OPTION_MASK_ISA_AVX512VNNI)
def_or_undef (parse_in, "__AVX512VNNI__");
if (isa_flag2 & OPTION_MASK_ISA2_PCONFIG)
def_or_undef (parse_in, "__PCONFIG__");
if (isa_flag2 & OPTION_MASK_ISA2_SGX)
def_or_undef (parse_in, "__SGX__");
if (isa_flag2 & OPTION_MASK_ISA2_AVX5124FMAPS)
def_or_undef (parse_in, "__AVX5124FMAPS__");
if (isa_flag & OPTION_MASK_ISA_AVX512BITALG)
def_or_undef (parse_in, "__AVX512BITALG__");
if (isa_flag & OPTION_MASK_ISA_AVX512VPOPCNTDQ)
def_or_undef (parse_in, "__AVX512VPOPCNTDQ__");
if (isa_flag & OPTION_MASK_ISA_FMA)
def_or_undef (parse_in, "__FMA__");
if (isa_flag & OPTION_MASK_ISA_RTM)
def_or_undef (parse_in, "__RTM__");
if (isa_flag & OPTION_MASK_ISA_SSE4A)
def_or_undef (parse_in, "__SSE4A__");
if (isa_flag & OPTION_MASK_ISA_FMA4)
def_or_undef (parse_in, "__FMA4__");
if (isa_flag & OPTION_MASK_ISA_XOP)
def_or_undef (parse_in, "__XOP__");
if (isa_flag & OPTION_MASK_ISA_LWP)
def_or_undef (parse_in, "__LWP__");
if (isa_flag & OPTION_MASK_ISA_ABM)
def_or_undef (parse_in, "__ABM__");
if (isa_flag & OPTION_MASK_ISA_BMI)
def_or_undef (parse_in, "__BMI__");
if (isa_flag & OPTION_MASK_ISA_BMI2)
def_or_undef (parse_in, "__BMI2__");
if (isa_flag & OPTION_MASK_ISA_LZCNT)
def_or_undef (parse_in, "__LZCNT__");
if (isa_flag & OPTION_MASK_ISA_TBM)
def_or_undef (parse_in, "__TBM__");
if (isa_flag & OPTION_MASK_ISA_CRC32)
def_or_undef (parse_in, "__CRC32__");
if (isa_flag & OPTION_MASK_ISA_POPCNT)
def_or_undef (parse_in, "__POPCNT__");
if (isa_flag & OPTION_MASK_ISA_FSGSBASE)
def_or_undef (parse_in, "__FSGSBASE__");
if (isa_flag & OPTION_MASK_ISA_RDRND)
def_or_undef (parse_in, "__RDRND__");
if (isa_flag & OPTION_MASK_ISA_F16C)
def_or_undef (parse_in, "__F16C__");
if (isa_flag & OPTION_MASK_ISA_RDSEED)
def_or_undef (parse_in, "__RDSEED__");
if (isa_flag & OPTION_MASK_ISA_PRFCHW)
def_or_undef (parse_in, "__PRFCHW__");
if (isa_flag & OPTION_MASK_ISA_ADX)
def_or_undef (parse_in, "__ADX__");
if (isa_flag & OPTION_MASK_ISA_FXSR)
def_or_undef (parse_in, "__FXSR__");
if (isa_flag & OPTION_MASK_ISA_XSAVE)
def_or_undef (parse_in, "__XSAVE__");
if (isa_flag & OPTION_MASK_ISA_XSAVEOPT)
def_or_undef (parse_in, "__XSAVEOPT__");
if (isa_flag & OPTION_MASK_ISA_PREFETCHWT1)
def_or_undef (parse_in, "__PREFETCHWT1__");
if ((fpmath & FPMATH_SSE) && (isa_flag & OPTION_MASK_ISA_SSE))
def_or_undef (parse_in, "__SSE_MATH__");
if ((fpmath & FPMATH_SSE) && (isa_flag & OPTION_MASK_ISA_SSE2))
def_or_undef (parse_in, "__SSE2_MATH__");
if (isa_flag & OPTION_MASK_ISA_CLFLUSHOPT)
def_or_undef (parse_in, "__CLFLUSHOPT__");
if (isa_flag2 & OPTION_MASK_ISA2_CLZERO)
def_or_undef (parse_in, "__CLZERO__");
if (isa_flag & OPTION_MASK_ISA_XSAVEC)
def_or_undef (parse_in, "__XSAVEC__");
if (isa_flag & OPTION_MASK_ISA_XSAVES)
def_or_undef (parse_in, "__XSAVES__");
if (isa_flag & OPTION_MASK_ISA_CLWB)
def_or_undef (parse_in, "__CLWB__");
if (isa_flag2 & OPTION_MASK_ISA2_MWAITX)
def_or_undef (parse_in, "__MWAITX__");
if (isa_flag & OPTION_MASK_ISA_PKU)
def_or_undef (parse_in, "__PKU__");
if (isa_flag2 & OPTION_MASK_ISA2_RDPID)
def_or_undef (parse_in, "__RDPID__");
if (isa_flag & OPTION_MASK_ISA_GFNI)
def_or_undef (parse_in, "__GFNI__");
if ((isa_flag & OPTION_MASK_ISA_SHSTK))
def_or_undef (parse_in, "__SHSTK__");
if (isa_flag2 & OPTION_MASK_ISA2_VAES)
def_or_undef (parse_in, "__VAES__");
if (isa_flag & OPTION_MASK_ISA_VPCLMULQDQ)
def_or_undef (parse_in, "__VPCLMULQDQ__");
if (isa_flag & OPTION_MASK_ISA_MOVDIRI)
def_or_undef (parse_in, "__MOVDIRI__");
if (isa_flag2 & OPTION_MASK_ISA2_MOVDIR64B)
def_or_undef (parse_in, "__MOVDIR64B__");
if (isa_flag2 & OPTION_MASK_ISA2_WAITPKG)
def_or_undef (parse_in, "__WAITPKG__");
if (isa_flag2 & OPTION_MASK_ISA2_CLDEMOTE)
def_or_undef (parse_in, "__CLDEMOTE__");
if (isa_flag2 & OPTION_MASK_ISA2_SERIALIZE)
def_or_undef (parse_in, "__SERIALIZE__");
if (isa_flag2 & OPTION_MASK_ISA2_PTWRITE)
def_or_undef (parse_in, "__PTWRITE__");
if (isa_flag2 & OPTION_MASK_ISA2_AVX512BF16)
def_or_undef (parse_in, "__AVX512BF16__");
if (isa_flag2 & OPTION_MASK_ISA2_AVX512FP16)
def_or_undef (parse_in, "__AVX512FP16__");
if (TARGET_MMX_WITH_SSE)
def_or_undef (parse_in, "__MMX_WITH_SSE__");
if (isa_flag2 & OPTION_MASK_ISA2_ENQCMD)
def_or_undef (parse_in, "__ENQCMD__");
if (isa_flag2 & OPTION_MASK_ISA2_TSXLDTRK)
def_or_undef (parse_in, "__TSXLDTRK__");
if (isa_flag2 & OPTION_MASK_ISA2_AMX_TILE)
def_or_undef (parse_in, "__AMX_TILE__");
if (isa_flag2 & OPTION_MASK_ISA2_AMX_INT8)
def_or_undef (parse_in, "__AMX_INT8__");
if (isa_flag2 & OPTION_MASK_ISA2_AMX_BF16)
def_or_undef (parse_in, "__AMX_BF16__");
if (isa_flag & OPTION_MASK_ISA_SAHF)
def_or_undef (parse_in, "__LAHF_SAHF__");
if (isa_flag2 & OPTION_MASK_ISA2_MOVBE)
def_or_undef (parse_in, "__MOVBE__");
if (isa_flag2 & OPTION_MASK_ISA2_UINTR)
def_or_undef (parse_in, "__UINTR__");
if (isa_flag2 & OPTION_MASK_ISA2_HRESET)
def_or_undef (parse_in, "__HRESET__");
if (isa_flag2 & OPTION_MASK_ISA2_KL)
def_or_undef (parse_in, "__KL__");
if (isa_flag2 & OPTION_MASK_ISA2_WIDEKL)
def_or_undef (parse_in, "__WIDEKL__");
if (isa_flag2 & OPTION_MASK_ISA2_AVXVNNI)
def_or_undef (parse_in, "__AVXVNNI__");
if (TARGET_IAMCU)
{
def_or_undef (parse_in, "__iamcu");
def_or_undef (parse_in, "__iamcu__");
}
}
/* Hook to validate the current #pragma GCC target and set the state, and
update the macros based on what was changed. If ARGS is NULL, then
POP_TARGET is used to reset the options. */
static bool
ix86_pragma_target_parse (tree args, tree pop_target)
{
tree prev_tree
= build_target_option_node (&global_options, &global_options_set);
tree cur_tree;
struct cl_target_option *prev_opt;
struct cl_target_option *cur_opt;
HOST_WIDE_INT prev_isa;
HOST_WIDE_INT cur_isa;
HOST_WIDE_INT diff_isa;
HOST_WIDE_INT prev_isa2;
HOST_WIDE_INT cur_isa2;
HOST_WIDE_INT diff_isa2;
enum processor_type prev_arch;
enum processor_type prev_tune;
enum processor_type cur_arch;
enum processor_type cur_tune;
if (! args)
{
cur_tree = (pop_target ? pop_target : target_option_default_node);
cl_target_option_restore (&global_options, &global_options_set,
TREE_TARGET_OPTION (cur_tree));
}
else
{
cur_tree = ix86_valid_target_attribute_tree (NULL_TREE, args,
&global_options,
&global_options_set, 0);
if (!cur_tree || cur_tree == error_mark_node)
{
cl_target_option_restore (&global_options, &global_options_set,
TREE_TARGET_OPTION (prev_tree));
return false;
}
}
target_option_current_node = cur_tree;
ix86_reset_previous_fndecl ();
/* Figure out the previous/current isa, arch, tune and the differences. */
prev_opt = TREE_TARGET_OPTION (prev_tree);
cur_opt = TREE_TARGET_OPTION (cur_tree);
prev_isa = prev_opt->x_ix86_isa_flags;
cur_isa = cur_opt->x_ix86_isa_flags;
diff_isa = (prev_isa ^ cur_isa);
prev_isa2 = prev_opt->x_ix86_isa_flags2;
cur_isa2 = cur_opt->x_ix86_isa_flags2;
diff_isa2 = (prev_isa2 ^ cur_isa2);
prev_arch = (enum processor_type) prev_opt->arch;
prev_tune = (enum processor_type) prev_opt->tune;
cur_arch = (enum processor_type) cur_opt->arch;
cur_tune = (enum processor_type) cur_opt->tune;
/* If the same processor is used for both previous and current options, don't
change the macros. */
if (cur_arch == prev_arch)
cur_arch = prev_arch = PROCESSOR_max;
if (cur_tune == prev_tune)
cur_tune = prev_tune = PROCESSOR_max;
/* Undef all of the macros for that are no longer current. */
ix86_target_macros_internal (prev_isa & diff_isa,
prev_isa2 & diff_isa2,
prev_arch,
prev_tune,
(enum fpmath_unit) prev_opt->x_ix86_fpmath,
cpp_undef);
/* For the definitions, ensure all newly defined macros are considered
as used for -Wunused-macros. There is no point warning about the
compiler predefined macros. */
cpp_options *cpp_opts = cpp_get_options (parse_in);
unsigned char saved_warn_unused_macros = cpp_opts->warn_unused_macros;
cpp_opts->warn_unused_macros = 0;
/* Define all of the macros for new options that were just turned on. */
ix86_target_macros_internal (cur_isa & diff_isa,
cur_isa2 & diff_isa2,
cur_arch,
cur_tune,
(enum fpmath_unit) cur_opt->x_ix86_fpmath,
cpp_define);
cpp_opts->warn_unused_macros = saved_warn_unused_macros;
return true;
}
/* Function to tell the preprocessor about the defines for the current target. */
void
ix86_target_macros (void)
{
/* 32/64-bit won't change with target specific options, so do the assert and
builtin_define_std calls here. */
if (TARGET_64BIT)
{
cpp_assert (parse_in, "cpu=x86_64");
cpp_assert (parse_in, "machine=x86_64");
cpp_define (parse_in, "__amd64");
cpp_define (parse_in, "__amd64__");
cpp_define (parse_in, "__x86_64");
cpp_define (parse_in, "__x86_64__");
if (TARGET_X32)
{
cpp_define (parse_in, "_ILP32");
cpp_define (parse_in, "__ILP32__");
}
}
else
{
cpp_assert (parse_in, "cpu=i386");
cpp_assert (parse_in, "machine=i386");
builtin_define_std ("i386");
cpp_define (parse_in, "_ILP32");
cpp_define (parse_in, "__ILP32__");
}
if (!TARGET_80387)
cpp_define (parse_in, "_SOFT_FLOAT");
if (TARGET_LONG_DOUBLE_64)
cpp_define (parse_in, "__LONG_DOUBLE_64__");
if (TARGET_LONG_DOUBLE_128)
cpp_define (parse_in, "__LONG_DOUBLE_128__");
cpp_define_formatted (parse_in, "__SIZEOF_FLOAT80__=%d",
GET_MODE_SIZE (XFmode));
cpp_define (parse_in, "__SIZEOF_FLOAT128__=16");
cpp_define_formatted (parse_in, "__ATOMIC_HLE_ACQUIRE=%d", IX86_HLE_ACQUIRE);
cpp_define_formatted (parse_in, "__ATOMIC_HLE_RELEASE=%d", IX86_HLE_RELEASE);
cpp_define (parse_in, "__GCC_ASM_FLAG_OUTPUTS__");
ix86_target_macros_internal (ix86_isa_flags,
ix86_isa_flags2,
ix86_arch,
ix86_tune,
ix86_fpmath,
cpp_define);
cpp_define (parse_in, "__SEG_FS");
cpp_define (parse_in, "__SEG_GS");
if (flag_cf_protection != CF_NONE)
cpp_define_formatted (parse_in, "__CET__=%d", flag_cf_protection & ~CF_SET);
}
/* Register target pragmas. We need to add the hook for parsing #pragma GCC
option here rather than in i386.c since it will pull in various preprocessor
functions, and those are not present in languages like fortran without a
preprocessor. */
void
ix86_register_pragmas (void)
{
/* Update pragma hook to allow parsing #pragma GCC target. */
targetm.target_option.pragma_parse = ix86_pragma_target_parse;
c_register_addr_space ("__seg_fs", ADDR_SPACE_SEG_FS);
c_register_addr_space ("__seg_gs", ADDR_SPACE_SEG_GS);
#ifdef REGISTER_SUBTARGET_PRAGMAS
REGISTER_SUBTARGET_PRAGMAS ();
#endif
}