Home | History | Annotate | Line # | Download | only in i386
      1  1.1  mrg /* Copyright (C) 1988-2022 Free Software Foundation, Inc.
      2  1.1  mrg 
      3  1.1  mrg This file is part of GCC.
      4  1.1  mrg 
      5  1.1  mrg GCC is free software; you can redistribute it and/or modify
      6  1.1  mrg it under the terms of the GNU General Public License as published by
      7  1.1  mrg the Free Software Foundation; either version 3, or (at your option)
      8  1.1  mrg any later version.
      9  1.1  mrg 
     10  1.1  mrg GCC is distributed in the hope that it will be useful,
     11  1.1  mrg but WITHOUT ANY WARRANTY; without even the implied warranty of
     12  1.1  mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     13  1.1  mrg GNU General Public License for more details.
     14  1.1  mrg 
     15  1.1  mrg You should have received a copy of the GNU General Public License
     16  1.1  mrg along with GCC; see the file COPYING3.  If not see
     17  1.1  mrg <http://www.gnu.org/licenses/>.  */
     18  1.1  mrg 
     19  1.1  mrg #define IN_TARGET_CODE 1
     20  1.1  mrg 
     21  1.1  mrg #include "config.h"
     22  1.1  mrg #include "system.h"
     23  1.1  mrg #include "coretypes.h"
     24  1.1  mrg #include "backend.h"
     25  1.1  mrg #include "rtl.h"
     26  1.1  mrg #include "tree.h"
     27  1.1  mrg #include "memmodel.h"
     28  1.1  mrg #include "gimple.h"
     29  1.1  mrg #include "cfghooks.h"
     30  1.1  mrg #include "cfgloop.h"
     31  1.1  mrg #include "df.h"
     32  1.1  mrg #include "tm_p.h"
     33  1.1  mrg #include "stringpool.h"
     34  1.1  mrg #include "expmed.h"
     35  1.1  mrg #include "optabs.h"
     36  1.1  mrg #include "regs.h"
     37  1.1  mrg #include "emit-rtl.h"
     38  1.1  mrg #include "recog.h"
     39  1.1  mrg #include "cgraph.h"
     40  1.1  mrg #include "diagnostic.h"
     41  1.1  mrg #include "cfgbuild.h"
     42  1.1  mrg #include "alias.h"
     43  1.1  mrg #include "fold-const.h"
     44  1.1  mrg #include "attribs.h"
     45  1.1  mrg #include "calls.h"
     46  1.1  mrg #include "stor-layout.h"
     47  1.1  mrg #include "varasm.h"
     48  1.1  mrg #include "output.h"
     49  1.1  mrg #include "insn-attr.h"
     50  1.1  mrg #include "flags.h"
     51  1.1  mrg #include "except.h"
     52  1.1  mrg #include "explow.h"
     53  1.1  mrg #include "expr.h"
     54  1.1  mrg #include "cfgrtl.h"
     55  1.1  mrg #include "common/common-target.h"
     56  1.1  mrg #include "langhooks.h"
     57  1.1  mrg #include "reload.h"
     58  1.1  mrg #include "gimplify.h"
     59  1.1  mrg #include "dwarf2.h"
     60  1.1  mrg #include "tm-constrs.h"
     61  1.1  mrg #include "cselib.h"
     62  1.1  mrg #include "sched-int.h"
     63  1.1  mrg #include "opts.h"
     64  1.1  mrg #include "tree-pass.h"
     65  1.1  mrg #include "context.h"
     66  1.1  mrg #include "pass_manager.h"
     67  1.1  mrg #include "target-globals.h"
     68  1.1  mrg #include "gimple-iterator.h"
     69  1.1  mrg #include "tree-vectorizer.h"
     70  1.1  mrg #include "shrink-wrap.h"
     71  1.1  mrg #include "builtins.h"
     72  1.1  mrg #include "rtl-iter.h"
     73  1.1  mrg #include "tree-iterator.h"
     74  1.1  mrg #include "dbgcnt.h"
     75  1.1  mrg #include "case-cfn-macros.h"
     76  1.1  mrg #include "dojump.h"
     77  1.1  mrg #include "fold-const-call.h"
     78  1.1  mrg #include "tree-vrp.h"
     79  1.1  mrg #include "tree-ssanames.h"
     80  1.1  mrg #include "selftest.h"
     81  1.1  mrg #include "selftest-rtl.h"
     82  1.1  mrg #include "print-rtl.h"
     83  1.1  mrg #include "intl.h"
     84  1.1  mrg #include "ifcvt.h"
     85  1.1  mrg #include "symbol-summary.h"
     86  1.1  mrg #include "ipa-prop.h"
     87  1.1  mrg #include "ipa-fnsummary.h"
     88  1.1  mrg #include "wide-int-bitmask.h"
     89  1.1  mrg #include "tree-vector-builder.h"
     90  1.1  mrg #include "debug.h"
     91  1.1  mrg #include "dwarf2out.h"
     92  1.1  mrg #include "i386-options.h"
     93  1.1  mrg 
     94  1.1  mrg #include "x86-tune-costs.h"
     95  1.1  mrg 
     96  1.1  mrg #ifndef SUBTARGET32_DEFAULT_CPU
     97  1.1  mrg #define SUBTARGET32_DEFAULT_CPU "i386"
     98  1.1  mrg #endif
     99  1.1  mrg 
    100  1.1  mrg /* Processor feature/optimization bitmasks.  */
    101  1.1  mrg #define m_NONE HOST_WIDE_INT_0U
    102  1.1  mrg #define m_ALL (~HOST_WIDE_INT_0U)
    103  1.1  mrg #define m_386 (HOST_WIDE_INT_1U<<PROCESSOR_I386)
    104  1.1  mrg #define m_486 (HOST_WIDE_INT_1U<<PROCESSOR_I486)
    105  1.1  mrg #define m_PENT (HOST_WIDE_INT_1U<<PROCESSOR_PENTIUM)
    106  1.1  mrg #define m_LAKEMONT (HOST_WIDE_INT_1U<<PROCESSOR_LAKEMONT)
    107  1.1  mrg #define m_PPRO (HOST_WIDE_INT_1U<<PROCESSOR_PENTIUMPRO)
    108  1.1  mrg #define m_PENT4 (HOST_WIDE_INT_1U<<PROCESSOR_PENTIUM4)
    109  1.1  mrg #define m_NOCONA (HOST_WIDE_INT_1U<<PROCESSOR_NOCONA)
    110  1.1  mrg #define m_P4_NOCONA (m_PENT4 | m_NOCONA)
    111  1.1  mrg #define m_CORE2 (HOST_WIDE_INT_1U<<PROCESSOR_CORE2)
    112  1.1  mrg #define m_NEHALEM (HOST_WIDE_INT_1U<<PROCESSOR_NEHALEM)
    113  1.1  mrg #define m_SANDYBRIDGE (HOST_WIDE_INT_1U<<PROCESSOR_SANDYBRIDGE)
    114  1.1  mrg #define m_HASWELL (HOST_WIDE_INT_1U<<PROCESSOR_HASWELL)
    115  1.1  mrg #define m_BONNELL (HOST_WIDE_INT_1U<<PROCESSOR_BONNELL)
    116  1.1  mrg #define m_SILVERMONT (HOST_WIDE_INT_1U<<PROCESSOR_SILVERMONT)
    117  1.1  mrg #define m_KNL (HOST_WIDE_INT_1U<<PROCESSOR_KNL)
    118  1.1  mrg #define m_KNM (HOST_WIDE_INT_1U<<PROCESSOR_KNM)
    119  1.1  mrg #define m_SKYLAKE (HOST_WIDE_INT_1U<<PROCESSOR_SKYLAKE)
    120  1.1  mrg #define m_SKYLAKE_AVX512 (HOST_WIDE_INT_1U<<PROCESSOR_SKYLAKE_AVX512)
    121  1.1  mrg #define m_CANNONLAKE (HOST_WIDE_INT_1U<<PROCESSOR_CANNONLAKE)
    122  1.1  mrg #define m_ICELAKE_CLIENT (HOST_WIDE_INT_1U<<PROCESSOR_ICELAKE_CLIENT)
    123  1.1  mrg #define m_ICELAKE_SERVER (HOST_WIDE_INT_1U<<PROCESSOR_ICELAKE_SERVER)
    124  1.1  mrg #define m_CASCADELAKE (HOST_WIDE_INT_1U<<PROCESSOR_CASCADELAKE)
    125  1.1  mrg #define m_TIGERLAKE (HOST_WIDE_INT_1U<<PROCESSOR_TIGERLAKE)
    126  1.1  mrg #define m_COOPERLAKE (HOST_WIDE_INT_1U<<PROCESSOR_COOPERLAKE)
    127  1.1  mrg #define m_SAPPHIRERAPIDS (HOST_WIDE_INT_1U<<PROCESSOR_SAPPHIRERAPIDS)
    128  1.1  mrg #define m_ALDERLAKE (HOST_WIDE_INT_1U<<PROCESSOR_ALDERLAKE)
    129  1.1  mrg #define m_ROCKETLAKE (HOST_WIDE_INT_1U<<PROCESSOR_ROCKETLAKE)
    130  1.1  mrg #define m_CORE_AVX512 (m_SKYLAKE_AVX512 | m_CANNONLAKE \
    131  1.1  mrg 		       | m_ICELAKE_CLIENT | m_ICELAKE_SERVER | m_CASCADELAKE \
    132  1.1  mrg 		       | m_TIGERLAKE | m_COOPERLAKE | m_SAPPHIRERAPIDS \
    133  1.1  mrg 		       | m_ROCKETLAKE)
    134  1.1  mrg #define m_CORE_AVX2 (m_HASWELL | m_SKYLAKE | m_CORE_AVX512)
    135  1.1  mrg #define m_CORE_ALL (m_CORE2 | m_NEHALEM  | m_SANDYBRIDGE | m_CORE_AVX2)
    136  1.1  mrg #define m_GOLDMONT (HOST_WIDE_INT_1U<<PROCESSOR_GOLDMONT)
    137  1.1  mrg #define m_GOLDMONT_PLUS (HOST_WIDE_INT_1U<<PROCESSOR_GOLDMONT_PLUS)
    138  1.1  mrg #define m_TREMONT (HOST_WIDE_INT_1U<<PROCESSOR_TREMONT)
    139  1.1  mrg #define m_INTEL (HOST_WIDE_INT_1U<<PROCESSOR_INTEL)
    140  1.1  mrg /* Gather Data Sampling / CVE-2022-40982 / INTEL-SA-00828.
    141  1.1  mrg    Software mitigation.  */
    142  1.1  mrg #define m_GDS (m_SKYLAKE | m_SKYLAKE_AVX512 | m_CANNONLAKE \
    143  1.1  mrg 	       | m_ICELAKE_CLIENT | m_ICELAKE_SERVER | m_CASCADELAKE \
    144  1.1  mrg 	       | m_TIGERLAKE | m_COOPERLAKE | m_ROCKETLAKE)
    145  1.1  mrg 
    146  1.1  mrg #define m_GEODE (HOST_WIDE_INT_1U<<PROCESSOR_GEODE)
    147  1.1  mrg #define m_K6 (HOST_WIDE_INT_1U<<PROCESSOR_K6)
    148  1.1  mrg #define m_K6_GEODE (m_K6 | m_GEODE)
    149  1.1  mrg #define m_K8 (HOST_WIDE_INT_1U<<PROCESSOR_K8)
    150  1.1  mrg #define m_ATHLON (HOST_WIDE_INT_1U<<PROCESSOR_ATHLON)
    151  1.1  mrg #define m_ATHLON_K8 (m_K8 | m_ATHLON)
    152  1.1  mrg #define m_AMDFAM10 (HOST_WIDE_INT_1U<<PROCESSOR_AMDFAM10)
    153  1.1  mrg #define m_BDVER1 (HOST_WIDE_INT_1U<<PROCESSOR_BDVER1)
    154  1.1  mrg #define m_BDVER2 (HOST_WIDE_INT_1U<<PROCESSOR_BDVER2)
    155  1.1  mrg #define m_BDVER3 (HOST_WIDE_INT_1U<<PROCESSOR_BDVER3)
    156  1.1  mrg #define m_BDVER4 (HOST_WIDE_INT_1U<<PROCESSOR_BDVER4)
    157  1.1  mrg #define m_ZNVER1 (HOST_WIDE_INT_1U<<PROCESSOR_ZNVER1)
    158  1.1  mrg #define m_ZNVER2 (HOST_WIDE_INT_1U<<PROCESSOR_ZNVER2)
    159  1.1  mrg #define m_ZNVER3 (HOST_WIDE_INT_1U<<PROCESSOR_ZNVER3)
    160  1.1  mrg #define m_ZNVER4 (HOST_WIDE_INT_1U<<PROCESSOR_ZNVER4)
    161  1.1  mrg #define m_ZNVER5 (HOST_WIDE_INT_1U<<PROCESSOR_ZNVER5)
    162  1.1  mrg #define m_BTVER1 (HOST_WIDE_INT_1U<<PROCESSOR_BTVER1)
    163  1.1  mrg #define m_BTVER2 (HOST_WIDE_INT_1U<<PROCESSOR_BTVER2)
    164  1.1  mrg #define m_BDVER	(m_BDVER1 | m_BDVER2 | m_BDVER3 | m_BDVER4)
    165  1.1  mrg #define m_BTVER (m_BTVER1 | m_BTVER2)
    166  1.1  mrg #define m_ZNVER (m_ZNVER1 | m_ZNVER2 | m_ZNVER3 | m_ZNVER4 | m_ZNVER5)
    167  1.1  mrg #define m_AMD_MULTIPLE (m_ATHLON_K8 | m_AMDFAM10 | m_BDVER | m_BTVER \
    168  1.1  mrg 			| m_ZNVER)
    169  1.1  mrg 
    170  1.1  mrg #define m_GENERIC (HOST_WIDE_INT_1U<<PROCESSOR_GENERIC)
    171  1.1  mrg 
    172  1.1  mrg const char* ix86_tune_feature_names[X86_TUNE_LAST] = {
    173  1.1  mrg #undef DEF_TUNE
    174  1.1  mrg #define DEF_TUNE(tune, name, selector) name,
    175  1.1  mrg #include "x86-tune.def"
    176  1.1  mrg #undef DEF_TUNE
    177  1.1  mrg };
    178  1.1  mrg 
    179  1.1  mrg /* Feature tests against the various tunings.  */
    180  1.1  mrg unsigned char ix86_tune_features[X86_TUNE_LAST];
    181  1.1  mrg 
    182  1.1  mrg /* Feature tests against the various tunings used to create ix86_tune_features
    183  1.1  mrg    based on the processor mask.  */
    184  1.1  mrg static unsigned HOST_WIDE_INT initial_ix86_tune_features[X86_TUNE_LAST] = {
    185  1.1  mrg #undef DEF_TUNE
    186  1.1  mrg #define DEF_TUNE(tune, name, selector) selector,
    187  1.1  mrg #include "x86-tune.def"
    188  1.1  mrg #undef DEF_TUNE
    189  1.1  mrg };
    190  1.1  mrg 
    191  1.1  mrg /* Feature tests against the various architecture variations.  */
    192  1.1  mrg unsigned char ix86_arch_features[X86_ARCH_LAST];
    193  1.1  mrg 
    194  1.1  mrg struct ix86_target_opts
    195  1.1  mrg {
    196  1.1  mrg   const char *option;		/* option string */
    197  1.1  mrg   HOST_WIDE_INT mask;		/* isa mask options */
    198  1.1  mrg };
    199  1.1  mrg 
    200  1.1  mrg /* This table is ordered so that options like -msse4.2 that imply other
    201  1.1  mrg    ISAs come first.  Target string will be displayed in the same order.  */
    202  1.1  mrg static struct ix86_target_opts isa2_opts[] =
    203  1.1  mrg {
    204  1.1  mrg   { "-mcx16",		OPTION_MASK_ISA2_CX16 },
    205  1.1  mrg   { "-mvaes",		OPTION_MASK_ISA2_VAES },
    206  1.1  mrg   { "-mrdpid",		OPTION_MASK_ISA2_RDPID },
    207  1.1  mrg   { "-mpconfig",	OPTION_MASK_ISA2_PCONFIG },
    208  1.1  mrg   { "-mwbnoinvd",	OPTION_MASK_ISA2_WBNOINVD },
    209  1.1  mrg   { "-mavx512vp2intersect", OPTION_MASK_ISA2_AVX512VP2INTERSECT },
    210  1.1  mrg   { "-msgx",		OPTION_MASK_ISA2_SGX },
    211  1.1  mrg   { "-mavx5124vnniw",	OPTION_MASK_ISA2_AVX5124VNNIW },
    212  1.1  mrg   { "-mavx5124fmaps",	OPTION_MASK_ISA2_AVX5124FMAPS },
    213  1.1  mrg   { "-mhle",		OPTION_MASK_ISA2_HLE },
    214  1.1  mrg   { "-mmovbe",		OPTION_MASK_ISA2_MOVBE },
    215  1.1  mrg   { "-mclzero",		OPTION_MASK_ISA2_CLZERO },
    216  1.1  mrg   { "-mmwaitx",		OPTION_MASK_ISA2_MWAITX },
    217  1.1  mrg   { "-mmwait",		OPTION_MASK_ISA2_MWAIT },
    218  1.1  mrg   { "-mmovdir64b",	OPTION_MASK_ISA2_MOVDIR64B },
    219  1.1  mrg   { "-mwaitpkg",	OPTION_MASK_ISA2_WAITPKG },
    220  1.1  mrg   { "-mcldemote",	OPTION_MASK_ISA2_CLDEMOTE },
    221  1.1  mrg   { "-mptwrite",	OPTION_MASK_ISA2_PTWRITE },
    222  1.1  mrg   { "-mavx512bf16",	OPTION_MASK_ISA2_AVX512BF16 },
    223  1.1  mrg   { "-menqcmd",		OPTION_MASK_ISA2_ENQCMD },
    224  1.1  mrg   { "-mserialize",	OPTION_MASK_ISA2_SERIALIZE },
    225  1.1  mrg   { "-mtsxldtrk",	OPTION_MASK_ISA2_TSXLDTRK },
    226  1.1  mrg   { "-mamx-tile",	OPTION_MASK_ISA2_AMX_TILE },
    227  1.1  mrg   { "-mamx-int8",	OPTION_MASK_ISA2_AMX_INT8 },
    228  1.1  mrg   { "-mamx-bf16",	OPTION_MASK_ISA2_AMX_BF16 },
    229  1.1  mrg   { "-muintr",		OPTION_MASK_ISA2_UINTR },
    230  1.1  mrg   { "-mhreset",		OPTION_MASK_ISA2_HRESET },
    231  1.1  mrg   { "-mkl",		OPTION_MASK_ISA2_KL },
    232  1.1  mrg   { "-mwidekl", 	OPTION_MASK_ISA2_WIDEKL },
    233  1.1  mrg   { "-mavxvnni",	OPTION_MASK_ISA2_AVXVNNI },
    234  1.1  mrg   { "-mavx512fp16",	OPTION_MASK_ISA2_AVX512FP16 }
    235  1.1  mrg };
    236  1.1  mrg static struct ix86_target_opts isa_opts[] =
    237  1.1  mrg {
    238  1.1  mrg   { "-mavx512vpopcntdq", OPTION_MASK_ISA_AVX512VPOPCNTDQ },
    239  1.1  mrg   { "-mavx512bitalg",	OPTION_MASK_ISA_AVX512BITALG },
    240  1.1  mrg   { "-mvpclmulqdq",	OPTION_MASK_ISA_VPCLMULQDQ },
    241  1.1  mrg   { "-mgfni",		OPTION_MASK_ISA_GFNI },
    242  1.1  mrg   { "-mavx512vnni",	OPTION_MASK_ISA_AVX512VNNI },
    243  1.1  mrg   { "-mavx512vbmi2",	OPTION_MASK_ISA_AVX512VBMI2 },
    244  1.1  mrg   { "-mavx512vbmi",	OPTION_MASK_ISA_AVX512VBMI },
    245  1.1  mrg   { "-mavx512ifma",	OPTION_MASK_ISA_AVX512IFMA },
    246  1.1  mrg   { "-mavx512vl",	OPTION_MASK_ISA_AVX512VL },
    247  1.1  mrg   { "-mavx512bw",	OPTION_MASK_ISA_AVX512BW },
    248  1.1  mrg   { "-mavx512dq",	OPTION_MASK_ISA_AVX512DQ },
    249  1.1  mrg   { "-mavx512er",	OPTION_MASK_ISA_AVX512ER },
    250  1.1  mrg   { "-mavx512pf",	OPTION_MASK_ISA_AVX512PF },
    251  1.1  mrg   { "-mavx512cd",	OPTION_MASK_ISA_AVX512CD },
    252  1.1  mrg   { "-mavx512f",	OPTION_MASK_ISA_AVX512F },
    253  1.1  mrg   { "-mavx2",		OPTION_MASK_ISA_AVX2 },
    254  1.1  mrg   { "-mfma",		OPTION_MASK_ISA_FMA },
    255  1.1  mrg   { "-mxop",		OPTION_MASK_ISA_XOP },
    256  1.1  mrg   { "-mfma4",		OPTION_MASK_ISA_FMA4 },
    257  1.1  mrg   { "-mf16c",		OPTION_MASK_ISA_F16C },
    258  1.1  mrg   { "-mavx",		OPTION_MASK_ISA_AVX },
    259  1.1  mrg /*{ "-msse4"		OPTION_MASK_ISA_SSE4 }, */
    260  1.1  mrg   { "-msse4.2",		OPTION_MASK_ISA_SSE4_2 },
    261  1.1  mrg   { "-msse4.1",		OPTION_MASK_ISA_SSE4_1 },
    262  1.1  mrg   { "-msse4a",		OPTION_MASK_ISA_SSE4A },
    263  1.1  mrg   { "-mssse3",		OPTION_MASK_ISA_SSSE3 },
    264  1.1  mrg   { "-msse3",		OPTION_MASK_ISA_SSE3 },
    265  1.1  mrg   { "-maes",		OPTION_MASK_ISA_AES },
    266  1.1  mrg   { "-msha",		OPTION_MASK_ISA_SHA },
    267  1.1  mrg   { "-mpclmul",		OPTION_MASK_ISA_PCLMUL },
    268  1.1  mrg   { "-msse2",		OPTION_MASK_ISA_SSE2 },
    269  1.1  mrg   { "-msse",		OPTION_MASK_ISA_SSE },
    270  1.1  mrg   { "-m3dnowa",		OPTION_MASK_ISA_3DNOW_A },
    271  1.1  mrg   { "-m3dnow",		OPTION_MASK_ISA_3DNOW },
    272  1.1  mrg   { "-mmmx",		OPTION_MASK_ISA_MMX },
    273  1.1  mrg   { "-mrtm",		OPTION_MASK_ISA_RTM },
    274  1.1  mrg   { "-mprfchw",		OPTION_MASK_ISA_PRFCHW },
    275  1.1  mrg   { "-mrdseed",		OPTION_MASK_ISA_RDSEED },
    276  1.1  mrg   { "-madx",		OPTION_MASK_ISA_ADX },
    277  1.1  mrg   { "-mprefetchwt1",	OPTION_MASK_ISA_PREFETCHWT1 },
    278  1.1  mrg   { "-mclflushopt",	OPTION_MASK_ISA_CLFLUSHOPT },
    279  1.1  mrg   { "-mxsaves",		OPTION_MASK_ISA_XSAVES },
    280  1.1  mrg   { "-mxsavec",		OPTION_MASK_ISA_XSAVEC },
    281  1.1  mrg   { "-mxsaveopt",	OPTION_MASK_ISA_XSAVEOPT },
    282  1.1  mrg   { "-mxsave",		OPTION_MASK_ISA_XSAVE },
    283  1.1  mrg   { "-mabm",		OPTION_MASK_ISA_ABM },
    284  1.1  mrg   { "-mbmi",		OPTION_MASK_ISA_BMI },
    285  1.1  mrg   { "-mbmi2",		OPTION_MASK_ISA_BMI2 },
    286  1.1  mrg   { "-mlzcnt",		OPTION_MASK_ISA_LZCNT },
    287  1.1  mrg   { "-mtbm",		OPTION_MASK_ISA_TBM },
    288  1.1  mrg   { "-mpopcnt",		OPTION_MASK_ISA_POPCNT },
    289  1.1  mrg   { "-msahf",		OPTION_MASK_ISA_SAHF },
    290  1.1  mrg   { "-mcrc32",		OPTION_MASK_ISA_CRC32 },
    291  1.1  mrg   { "-mfsgsbase",	OPTION_MASK_ISA_FSGSBASE },
    292  1.1  mrg   { "-mrdrnd",		OPTION_MASK_ISA_RDRND },
    293  1.1  mrg   { "-mpku",		OPTION_MASK_ISA_PKU },
    294  1.1  mrg   { "-mlwp",		OPTION_MASK_ISA_LWP },
    295  1.1  mrg   { "-mfxsr",		OPTION_MASK_ISA_FXSR },
    296  1.1  mrg   { "-mclwb",		OPTION_MASK_ISA_CLWB },
    297  1.1  mrg   { "-mshstk",		OPTION_MASK_ISA_SHSTK },
    298  1.1  mrg   { "-mmovdiri",	OPTION_MASK_ISA_MOVDIRI }
    299  1.1  mrg };
    300  1.1  mrg 
    301  1.1  mrg /* Return 1 if TRAIT NAME is present in the OpenMP context's
    302  1.1  mrg    device trait set, return 0 if not present in any OpenMP context in the
    303  1.1  mrg    whole translation unit, or -1 if not present in the current OpenMP context
    304  1.1  mrg    but might be present in another OpenMP context in the same TU.  */
    305  1.1  mrg 
    306  1.1  mrg int
    307  1.1  mrg ix86_omp_device_kind_arch_isa (enum omp_device_kind_arch_isa trait,
    308  1.1  mrg 			       const char *name)
    309  1.1  mrg {
    310  1.1  mrg   switch (trait)
    311  1.1  mrg     {
    312  1.1  mrg     case omp_device_kind:
    313  1.1  mrg       return strcmp (name, "cpu") == 0;
    314  1.1  mrg     case omp_device_arch:
    315  1.1  mrg #ifdef ACCEL_COMPILER
    316  1.1  mrg       if (strcmp (name, "intel_mic") == 0)
    317  1.1  mrg 	return 1;
    318  1.1  mrg #endif
    319  1.1  mrg       if (strcmp (name, "x86") == 0)
    320  1.1  mrg 	return 1;
    321  1.1  mrg       if (TARGET_64BIT)
    322  1.1  mrg 	{
    323  1.1  mrg 	  if (TARGET_X32)
    324  1.1  mrg 	    return strcmp (name, "x32") == 0;
    325  1.1  mrg 	  else
    326  1.1  mrg 	    return strcmp (name, "x86_64") == 0;
    327  1.1  mrg 	}
    328  1.1  mrg       if (strcmp (name, "ia32") == 0 || strcmp (name, "i386") == 0)
    329  1.1  mrg 	return 1;
    330  1.1  mrg       if (strcmp (name, "i486") == 0)
    331  1.1  mrg 	return ix86_arch != PROCESSOR_I386 ? 1 : -1;
    332  1.1  mrg       if (strcmp (name, "i586") == 0)
    333  1.1  mrg 	return (ix86_arch != PROCESSOR_I386
    334  1.1  mrg 		&& ix86_arch != PROCESSOR_I486) ? 1 : -1;
    335  1.1  mrg       if (strcmp (name, "i686") == 0)
    336  1.1  mrg 	return (ix86_arch != PROCESSOR_I386
    337  1.1  mrg 		&& ix86_arch != PROCESSOR_I486
    338  1.1  mrg 		&& ix86_arch != PROCESSOR_LAKEMONT
    339  1.1  mrg 		&& ix86_arch != PROCESSOR_PENTIUM) ? 1 : -1;
    340  1.1  mrg       return 0;
    341  1.1  mrg     case omp_device_isa:
    342  1.1  mrg       for (int i = 0; i < 2; i++)
    343  1.1  mrg 	{
    344  1.1  mrg 	  struct ix86_target_opts *opts = i ? isa2_opts : isa_opts;
    345  1.1  mrg 	  size_t nopts = i ? ARRAY_SIZE (isa2_opts) : ARRAY_SIZE (isa_opts);
    346  1.1  mrg 	  HOST_WIDE_INT mask = i ? ix86_isa_flags2 : ix86_isa_flags;
    347  1.1  mrg 	  for (size_t n = 0; n < nopts; n++)
    348  1.1  mrg 	    {
    349  1.1  mrg 	      /* Handle sse4 as an alias to sse4.2.  */
    350  1.1  mrg 	      if (opts[n].mask == OPTION_MASK_ISA_SSE4_2)
    351  1.1  mrg 		{
    352  1.1  mrg 		  if (strcmp (name, "sse4") == 0)
    353  1.1  mrg 		    return (mask & opts[n].mask) != 0 ? 1 : -1;
    354  1.1  mrg 		}
    355  1.1  mrg 	      if (strcmp (name, opts[n].option + 2) == 0)
    356  1.1  mrg 		return (mask & opts[n].mask) != 0 ? 1 : -1;
    357  1.1  mrg 	    }
    358  1.1  mrg 	}
    359  1.1  mrg       return 0;
    360  1.1  mrg     default:
    361  1.1  mrg       gcc_unreachable ();
    362  1.1  mrg     }
    363  1.1  mrg }
    364  1.1  mrg 
    365  1.1  mrg /* Return a string that documents the current -m options.  The caller is
    366  1.1  mrg    responsible for freeing the string.  */
    367  1.1  mrg 
    368  1.1  mrg char *
    369  1.1  mrg ix86_target_string (HOST_WIDE_INT isa, HOST_WIDE_INT isa2,
    370  1.1  mrg 		    int flags, int flags2,
    371  1.1  mrg 		    const char *arch, const char *tune,
    372  1.1  mrg 		    enum fpmath_unit fpmath,
    373  1.1  mrg 		    enum prefer_vector_width pvw,
    374  1.1  mrg 		    enum prefer_vector_width move_max,
    375  1.1  mrg 		    enum prefer_vector_width store_max,
    376  1.1  mrg 		    bool add_nl_p, bool add_abi_p)
    377  1.1  mrg {
    378  1.1  mrg   /* Flag options.  */
    379  1.1  mrg   static struct ix86_target_opts flag_opts[] =
    380  1.1  mrg   {
    381  1.1  mrg     { "-m128bit-long-double",		MASK_128BIT_LONG_DOUBLE },
    382  1.1  mrg     { "-mlong-double-128",		MASK_LONG_DOUBLE_128 },
    383  1.1  mrg     { "-mlong-double-64",		MASK_LONG_DOUBLE_64 },
    384  1.1  mrg     { "-m80387",			MASK_80387 },
    385  1.1  mrg     { "-maccumulate-outgoing-args",	MASK_ACCUMULATE_OUTGOING_ARGS },
    386  1.1  mrg     { "-malign-double",			MASK_ALIGN_DOUBLE },
    387  1.1  mrg     { "-mcld",				MASK_CLD },
    388  1.1  mrg     { "-mfp-ret-in-387",		MASK_FLOAT_RETURNS },
    389  1.1  mrg     { "-mieee-fp",			MASK_IEEE_FP },
    390  1.1  mrg     { "-minline-all-stringops",		MASK_INLINE_ALL_STRINGOPS },
    391  1.1  mrg     { "-minline-stringops-dynamically",	MASK_INLINE_STRINGOPS_DYNAMICALLY },
    392  1.1  mrg     { "-mms-bitfields",			MASK_MS_BITFIELD_LAYOUT },
    393  1.1  mrg     { "-mno-align-stringops",		MASK_NO_ALIGN_STRINGOPS },
    394  1.1  mrg     { "-mno-fancy-math-387",		MASK_NO_FANCY_MATH_387 },
    395  1.1  mrg     { "-mno-push-args",			MASK_NO_PUSH_ARGS },
    396  1.1  mrg     { "-mno-red-zone",			MASK_NO_RED_ZONE },
    397  1.1  mrg     { "-momit-leaf-frame-pointer",	MASK_OMIT_LEAF_FRAME_POINTER },
    398  1.1  mrg     { "-mrecip",			MASK_RECIP },
    399  1.1  mrg     { "-mrtd",				MASK_RTD },
    400  1.1  mrg     { "-msseregparm",			MASK_SSEREGPARM },
    401  1.1  mrg     { "-mstack-arg-probe",		MASK_STACK_PROBE },
    402  1.1  mrg     { "-mtls-direct-seg-refs",		MASK_TLS_DIRECT_SEG_REFS },
    403  1.1  mrg     { "-mvect8-ret-in-mem",		MASK_VECT8_RETURNS },
    404  1.1  mrg     { "-m8bit-idiv",			MASK_USE_8BIT_IDIV },
    405  1.1  mrg     { "-mvzeroupper",			MASK_VZEROUPPER },
    406  1.1  mrg     { "-mstv",				MASK_STV },
    407  1.1  mrg     { "-mavx256-split-unaligned-load",	MASK_AVX256_SPLIT_UNALIGNED_LOAD },
    408  1.1  mrg     { "-mavx256-split-unaligned-store",	MASK_AVX256_SPLIT_UNALIGNED_STORE },
    409  1.1  mrg     { "-mcall-ms2sysv-xlogues",		MASK_CALL_MS2SYSV_XLOGUES },
    410  1.1  mrg     { "-mrelax-cmpxchg-loop",		MASK_RELAX_CMPXCHG_LOOP }
    411  1.1  mrg   };
    412  1.1  mrg 
    413  1.1  mrg   /* Additional flag options.  */
    414  1.1  mrg   static struct ix86_target_opts flag2_opts[] =
    415  1.1  mrg   {
    416  1.1  mrg     { "-mgeneral-regs-only",		OPTION_MASK_GENERAL_REGS_ONLY }
    417  1.1  mrg   };
    418  1.1  mrg 
    419  1.1  mrg   const char *opts[ARRAY_SIZE (isa_opts) + ARRAY_SIZE (isa2_opts)
    420  1.1  mrg 		   + ARRAY_SIZE (flag_opts) + ARRAY_SIZE (flag2_opts) + 6][2];
    421  1.1  mrg 
    422  1.1  mrg   char isa_other[40];
    423  1.1  mrg   char isa2_other[40];
    424  1.1  mrg   char flags_other[40];
    425  1.1  mrg   char flags2_other[40];
    426  1.1  mrg   unsigned num = 0;
    427  1.1  mrg   unsigned i, j;
    428  1.1  mrg   char *ret;
    429  1.1  mrg   char *ptr;
    430  1.1  mrg   size_t len;
    431  1.1  mrg   size_t line_len;
    432  1.1  mrg   size_t sep_len;
    433  1.1  mrg   const char *abi;
    434  1.1  mrg 
    435  1.1  mrg   memset (opts, '\0', sizeof (opts));
    436  1.1  mrg 
    437  1.1  mrg   /* Add -march= option.  */
    438  1.1  mrg   if (arch)
    439  1.1  mrg     {
    440  1.1  mrg       opts[num][0] = "-march=";
    441  1.1  mrg       opts[num++][1] = arch;
    442  1.1  mrg     }
    443  1.1  mrg 
    444  1.1  mrg   /* Add -mtune= option.  */
    445  1.1  mrg   if (tune)
    446  1.1  mrg     {
    447  1.1  mrg       opts[num][0] = "-mtune=";
    448  1.1  mrg       opts[num++][1] = tune;
    449  1.1  mrg     }
    450  1.1  mrg 
    451  1.1  mrg   /* Add -m32/-m64/-mx32.  */
    452  1.1  mrg   if (add_abi_p)
    453  1.1  mrg     {
    454  1.1  mrg       if ((isa & OPTION_MASK_ISA_64BIT) != 0)
    455  1.1  mrg 	{
    456  1.1  mrg 	  if ((isa & OPTION_MASK_ABI_64) != 0)
    457  1.1  mrg 	    abi = "-m64";
    458  1.1  mrg 	  else
    459  1.1  mrg 	    abi = "-mx32";
    460  1.1  mrg 	}
    461  1.1  mrg       else
    462  1.1  mrg 	abi = "-m32";
    463  1.1  mrg       opts[num++][0] = abi;
    464  1.1  mrg     }
    465  1.1  mrg   isa &= ~(OPTION_MASK_ISA_64BIT | OPTION_MASK_ABI_64 | OPTION_MASK_ABI_X32);
    466  1.1  mrg 
    467  1.1  mrg   /* Pick out the options in isa2 options.  */
    468  1.1  mrg   for (i = 0; i < ARRAY_SIZE (isa2_opts); i++)
    469  1.1  mrg     {
    470  1.1  mrg       if ((isa2 & isa2_opts[i].mask) != 0)
    471  1.1  mrg 	{
    472  1.1  mrg 	  opts[num++][0] = isa2_opts[i].option;
    473  1.1  mrg 	  isa2 &= ~ isa2_opts[i].mask;
    474  1.1  mrg 	}
    475  1.1  mrg     }
    476  1.1  mrg 
    477  1.1  mrg   if (isa2 && add_nl_p)
    478  1.1  mrg     {
    479  1.1  mrg       opts[num++][0] = isa2_other;
    480  1.1  mrg       sprintf (isa2_other, "(other isa2: %#" HOST_WIDE_INT_PRINT "x)", isa2);
    481  1.1  mrg     }
    482  1.1  mrg 
    483  1.1  mrg   /* Pick out the options in isa options.  */
    484  1.1  mrg   for (i = 0; i < ARRAY_SIZE (isa_opts); i++)
    485  1.1  mrg     {
    486  1.1  mrg       if ((isa & isa_opts[i].mask) != 0)
    487  1.1  mrg 	{
    488  1.1  mrg 	  opts[num++][0] = isa_opts[i].option;
    489  1.1  mrg 	  isa &= ~ isa_opts[i].mask;
    490  1.1  mrg 	}
    491  1.1  mrg     }
    492  1.1  mrg 
    493  1.1  mrg   if (isa && add_nl_p)
    494  1.1  mrg     {
    495  1.1  mrg       opts[num++][0] = isa_other;
    496  1.1  mrg       sprintf (isa_other, "(other isa: %#" HOST_WIDE_INT_PRINT "x)", isa);
    497  1.1  mrg     }
    498  1.1  mrg 
    499  1.1  mrg   /* Add flag options.  */
    500  1.1  mrg   for (i = 0; i < ARRAY_SIZE (flag_opts); i++)
    501  1.1  mrg     {
    502  1.1  mrg       if ((flags & flag_opts[i].mask) != 0)
    503  1.1  mrg 	{
    504  1.1  mrg 	  opts[num++][0] = flag_opts[i].option;
    505  1.1  mrg 	  flags &= ~ flag_opts[i].mask;
    506  1.1  mrg 	}
    507  1.1  mrg     }
    508  1.1  mrg 
    509  1.1  mrg   if (flags && add_nl_p)
    510  1.1  mrg     {
    511  1.1  mrg       opts[num++][0] = flags_other;
    512  1.1  mrg       sprintf (flags_other, "(other flags: %#x)", flags);
    513  1.1  mrg     }
    514  1.1  mrg 
    515  1.1  mrg     /* Add additional flag options.  */
    516  1.1  mrg   for (i = 0; i < ARRAY_SIZE (flag2_opts); i++)
    517  1.1  mrg     {
    518  1.1  mrg       if ((flags2 & flag2_opts[i].mask) != 0)
    519  1.1  mrg 	{
    520  1.1  mrg 	  opts[num++][0] = flag2_opts[i].option;
    521  1.1  mrg 	  flags2 &= ~ flag2_opts[i].mask;
    522  1.1  mrg 	}
    523  1.1  mrg     }
    524  1.1  mrg 
    525  1.1  mrg   if (flags2 && add_nl_p)
    526  1.1  mrg     {
    527  1.1  mrg       opts[num++][0] = flags2_other;
    528  1.1  mrg       sprintf (flags2_other, "(other flags2: %#x)", flags2);
    529  1.1  mrg     }
    530  1.1  mrg 
    531  1.1  mrg   /* Add -mfpmath= option.  */
    532  1.1  mrg   if (fpmath)
    533  1.1  mrg     {
    534  1.1  mrg       opts[num][0] = "-mfpmath=";
    535  1.1  mrg       switch ((int) fpmath)
    536  1.1  mrg 	{
    537  1.1  mrg 	case FPMATH_387:
    538  1.1  mrg 	  opts[num++][1] = "387";
    539  1.1  mrg 	  break;
    540  1.1  mrg 
    541  1.1  mrg 	case FPMATH_SSE:
    542  1.1  mrg 	  opts[num++][1] = "sse";
    543  1.1  mrg 	  break;
    544  1.1  mrg 
    545  1.1  mrg 	case FPMATH_387 | FPMATH_SSE:
    546  1.1  mrg 	  opts[num++][1] = "sse+387";
    547  1.1  mrg 	  break;
    548  1.1  mrg 
    549  1.1  mrg 	default:
    550  1.1  mrg 	  gcc_unreachable ();
    551  1.1  mrg 	}
    552  1.1  mrg     }
    553  1.1  mrg 
    554  1.1  mrg   auto add_vector_width = [&opts, &num] (prefer_vector_width pvw,
    555  1.1  mrg 					 const char *cmd)
    556  1.1  mrg     {
    557  1.1  mrg       opts[num][0] = cmd;
    558  1.1  mrg       switch ((int) pvw)
    559  1.1  mrg 	{
    560  1.1  mrg 	case PVW_AVX128:
    561  1.1  mrg 	  opts[num++][1] = "128";
    562  1.1  mrg 	  break;
    563  1.1  mrg 
    564  1.1  mrg 	case PVW_AVX256:
    565  1.1  mrg 	  opts[num++][1] = "256";
    566  1.1  mrg 	  break;
    567  1.1  mrg 
    568  1.1  mrg 	case PVW_AVX512:
    569  1.1  mrg 	  opts[num++][1] = "512";
    570  1.1  mrg 	  break;
    571  1.1  mrg 
    572  1.1  mrg 	default:
    573  1.1  mrg 	  gcc_unreachable ();
    574  1.1  mrg 	}
    575  1.1  mrg     };
    576  1.1  mrg 
    577  1.1  mrg   /* Add -mprefer-vector-width= option.  */
    578  1.1  mrg   if (pvw)
    579  1.1  mrg     add_vector_width (pvw, "-mprefer-vector-width=");
    580  1.1  mrg 
    581  1.1  mrg   /* Add -mmove-max= option.  */
    582  1.1  mrg   if (move_max)
    583  1.1  mrg     add_vector_width (move_max, "-mmove-max=");
    584  1.1  mrg 
    585  1.1  mrg   /* Add -mstore-max= option.  */
    586  1.1  mrg   if (store_max)
    587  1.1  mrg     add_vector_width (store_max, "-mstore-max=");
    588  1.1  mrg 
    589  1.1  mrg   /* Any options?  */
    590  1.1  mrg   if (num == 0)
    591  1.1  mrg     return NULL;
    592  1.1  mrg 
    593  1.1  mrg   gcc_assert (num < ARRAY_SIZE (opts));
    594  1.1  mrg 
    595  1.1  mrg   /* Size the string.  */
    596  1.1  mrg   len = 0;
    597  1.1  mrg   sep_len = (add_nl_p) ? 3 : 1;
    598  1.1  mrg   for (i = 0; i < num; i++)
    599  1.1  mrg     {
    600  1.1  mrg       len += sep_len;
    601  1.1  mrg       for (j = 0; j < 2; j++)
    602  1.1  mrg 	if (opts[i][j])
    603  1.1  mrg 	  len += strlen (opts[i][j]);
    604  1.1  mrg     }
    605  1.1  mrg 
    606  1.1  mrg   /* Build the string.  */
    607  1.1  mrg   ret = ptr = (char *) xmalloc (len);
    608  1.1  mrg   line_len = 0;
    609  1.1  mrg 
    610  1.1  mrg   for (i = 0; i < num; i++)
    611  1.1  mrg     {
    612  1.1  mrg       size_t len2[2];
    613  1.1  mrg 
    614  1.1  mrg       for (j = 0; j < 2; j++)
    615  1.1  mrg 	len2[j] = (opts[i][j]) ? strlen (opts[i][j]) : 0;
    616  1.1  mrg 
    617  1.1  mrg       if (i != 0)
    618  1.1  mrg 	{
    619  1.1  mrg 	  *ptr++ = ' ';
    620  1.1  mrg 	  line_len++;
    621  1.1  mrg 
    622  1.1  mrg 	  if (add_nl_p && line_len + len2[0] + len2[1] > 70)
    623  1.1  mrg 	    {
    624  1.1  mrg 	      *ptr++ = '\\';
    625  1.1  mrg 	      *ptr++ = '\n';
    626  1.1  mrg 	      line_len = 0;
    627  1.1  mrg 	    }
    628  1.1  mrg 	}
    629  1.1  mrg 
    630  1.1  mrg       for (j = 0; j < 2; j++)
    631  1.1  mrg 	if (opts[i][j])
    632  1.1  mrg 	  {
    633  1.1  mrg 	    memcpy (ptr, opts[i][j], len2[j]);
    634  1.1  mrg 	    ptr += len2[j];
    635  1.1  mrg 	    line_len += len2[j];
    636  1.1  mrg 	  }
    637  1.1  mrg     }
    638  1.1  mrg 
    639  1.1  mrg   *ptr = '\0';
    640  1.1  mrg   gcc_assert (ret + len >= ptr);
    641  1.1  mrg 
    642  1.1  mrg   return ret;
    643  1.1  mrg }
    644  1.1  mrg 
    645  1.1  mrg /* Function that is callable from the debugger to print the current
    646  1.1  mrg    options.  */
    647  1.1  mrg void ATTRIBUTE_UNUSED
    648  1.1  mrg ix86_debug_options (void)
    649  1.1  mrg {
    650  1.1  mrg   char *opts = ix86_target_string (ix86_isa_flags, ix86_isa_flags2,
    651  1.1  mrg 				   target_flags, ix86_target_flags,
    652  1.1  mrg 				   ix86_arch_string, ix86_tune_string,
    653  1.1  mrg 				   ix86_fpmath, prefer_vector_width_type,
    654  1.1  mrg 				   ix86_move_max, ix86_store_max,
    655  1.1  mrg 				   true, true);
    656  1.1  mrg 
    657  1.1  mrg   if (opts)
    658  1.1  mrg     {
    659  1.1  mrg       fprintf (stderr, "%s\n\n", opts);
    660  1.1  mrg       free (opts);
    661  1.1  mrg     }
    662  1.1  mrg   else
    663  1.1  mrg     fputs ("<no options>\n\n", stderr);
    664  1.1  mrg 
    665  1.1  mrg   return;
    666  1.1  mrg }
    667  1.1  mrg 
    668  1.1  mrg /* Save the current options */
    669  1.1  mrg 
    670  1.1  mrg void
    671  1.1  mrg ix86_function_specific_save (struct cl_target_option *ptr,
    672  1.1  mrg 			     struct gcc_options *opts,
    673  1.1  mrg 			     struct gcc_options */* opts_set */)
    674  1.1  mrg {
    675  1.1  mrg   ptr->arch = ix86_arch;
    676  1.1  mrg   ptr->schedule = ix86_schedule;
    677  1.1  mrg   ptr->prefetch_sse = ix86_prefetch_sse;
    678  1.1  mrg   ptr->tune = ix86_tune;
    679  1.1  mrg   ptr->branch_cost = ix86_branch_cost;
    680  1.1  mrg   ptr->tune_defaulted = ix86_tune_defaulted;
    681  1.1  mrg   ptr->arch_specified = ix86_arch_specified;
    682  1.1  mrg   ptr->x_ix86_isa_flags_explicit = opts->x_ix86_isa_flags_explicit;
    683  1.1  mrg   ptr->x_ix86_isa_flags2_explicit = opts->x_ix86_isa_flags2_explicit;
    684  1.1  mrg   ptr->x_recip_mask_explicit = opts->x_recip_mask_explicit;
    685  1.1  mrg   ptr->x_ix86_arch_string = opts->x_ix86_arch_string;
    686  1.1  mrg   ptr->x_ix86_tune_string = opts->x_ix86_tune_string;
    687  1.1  mrg   ptr->x_ix86_asm_dialect = opts->x_ix86_asm_dialect;
    688  1.1  mrg   ptr->x_ix86_branch_cost = opts->x_ix86_branch_cost;
    689  1.1  mrg   ptr->x_ix86_dump_tunes = opts->x_ix86_dump_tunes;
    690  1.1  mrg   ptr->x_ix86_force_align_arg_pointer = opts->x_ix86_force_align_arg_pointer;
    691  1.1  mrg   ptr->x_ix86_force_drap = opts->x_ix86_force_drap;
    692  1.1  mrg   ptr->x_ix86_recip_name = opts->x_ix86_recip_name;
    693  1.1  mrg   ptr->x_ix86_section_threshold = opts->x_ix86_section_threshold;
    694  1.1  mrg   ptr->x_ix86_sse2avx = opts->x_ix86_sse2avx;
    695  1.1  mrg   ptr->x_ix86_stack_protector_guard = opts->x_ix86_stack_protector_guard;
    696  1.1  mrg   ptr->x_ix86_stringop_alg = opts->x_ix86_stringop_alg;
    697  1.1  mrg   ptr->x_ix86_tls_dialect = opts->x_ix86_tls_dialect;
    698  1.1  mrg   ptr->x_ix86_tune_ctrl_string = opts->x_ix86_tune_ctrl_string;
    699  1.1  mrg   ptr->x_ix86_tune_memcpy_strategy = opts->x_ix86_tune_memcpy_strategy;
    700  1.1  mrg   ptr->x_ix86_tune_memset_strategy = opts->x_ix86_tune_memset_strategy;
    701  1.1  mrg   ptr->x_ix86_tune_no_default = opts->x_ix86_tune_no_default;
    702  1.1  mrg 
    703  1.1  mrg   /* The fields are char but the variables are not; make sure the
    704  1.1  mrg      values fit in the fields.  */
    705  1.1  mrg   gcc_assert (ptr->arch == ix86_arch);
    706  1.1  mrg   gcc_assert (ptr->schedule == ix86_schedule);
    707  1.1  mrg   gcc_assert (ptr->tune == ix86_tune);
    708  1.1  mrg   gcc_assert (ptr->branch_cost == ix86_branch_cost);
    709  1.1  mrg }
    710  1.1  mrg 
    711  1.1  mrg /* Feature tests against the various architecture variations, used to create
    712  1.1  mrg    ix86_arch_features based on the processor mask.  */
    713  1.1  mrg static unsigned HOST_WIDE_INT initial_ix86_arch_features[X86_ARCH_LAST] = {
    714  1.1  mrg   /* X86_ARCH_CMOV: Conditional move was added for pentiumpro.  */
    715  1.1  mrg   ~(m_386 | m_486 | m_PENT | m_LAKEMONT | m_K6),
    716  1.1  mrg 
    717  1.1  mrg   /* X86_ARCH_CMPXCHG: Compare and exchange was added for 80486.  */
    718  1.1  mrg   ~m_386,
    719  1.1  mrg 
    720  1.1  mrg   /* X86_ARCH_CMPXCHG8B: Compare and exchange 8 bytes was added for pentium. */
    721  1.1  mrg   ~(m_386 | m_486),
    722  1.1  mrg 
    723  1.1  mrg   /* X86_ARCH_XADD: Exchange and add was added for 80486.  */
    724  1.1  mrg   ~m_386,
    725  1.1  mrg 
    726  1.1  mrg   /* X86_ARCH_BSWAP: Byteswap was added for 80486.  */
    727  1.1  mrg   ~m_386,
    728  1.1  mrg };
    729  1.1  mrg 
    730  1.1  mrg /* This table must be in sync with enum processor_type in i386.h.  */
    731  1.1  mrg static const struct processor_costs *processor_cost_table[] =
    732  1.1  mrg {
    733  1.1  mrg   &generic_cost,
    734  1.1  mrg   &i386_cost,
    735  1.1  mrg   &i486_cost,
    736  1.1  mrg   &pentium_cost,
    737  1.1  mrg   &lakemont_cost,
    738  1.1  mrg   &pentiumpro_cost,
    739  1.1  mrg   &pentium4_cost,
    740  1.1  mrg   &nocona_cost,
    741  1.1  mrg   &core_cost,
    742  1.1  mrg   &core_cost,
    743  1.1  mrg   &core_cost,
    744  1.1  mrg   &core_cost,
    745  1.1  mrg   &atom_cost,
    746  1.1  mrg   &slm_cost,
    747  1.1  mrg   &slm_cost,
    748  1.1  mrg   &slm_cost,
    749  1.1  mrg   &tremont_cost,
    750  1.1  mrg   &slm_cost,
    751  1.1  mrg   &slm_cost,
    752  1.1  mrg   &skylake_cost,
    753  1.1  mrg   &skylake_cost,
    754  1.1  mrg   &icelake_cost,
    755  1.1  mrg   &icelake_cost,
    756  1.1  mrg   &icelake_cost,
    757  1.1  mrg   &skylake_cost,
    758  1.1  mrg   &icelake_cost,
    759  1.1  mrg   &skylake_cost,
    760  1.1  mrg   &icelake_cost,
    761  1.1  mrg   &alderlake_cost,
    762  1.1  mrg   &icelake_cost,
    763  1.1  mrg   &intel_cost,
    764  1.1  mrg   &geode_cost,
    765  1.1  mrg   &k6_cost,
    766  1.1  mrg   &athlon_cost,
    767  1.1  mrg   &k8_cost,
    768  1.1  mrg   &amdfam10_cost,
    769  1.1  mrg   &bdver_cost,
    770  1.1  mrg   &bdver_cost,
    771  1.1  mrg   &bdver_cost,
    772  1.1  mrg   &bdver_cost,
    773  1.1  mrg   &btver1_cost,
    774  1.1  mrg   &btver2_cost,
    775  1.1  mrg   &znver1_cost,
    776  1.1  mrg   &znver2_cost,
    777  1.1  mrg   &znver3_cost,
    778  1.1  mrg   &znver4_cost,
    779  1.1  mrg   &znver5_cost
    780  1.1  mrg };
    781  1.1  mrg 
    782  1.1  mrg /* Guarantee that the array is aligned with enum processor_type.  */
    783  1.1  mrg STATIC_ASSERT (ARRAY_SIZE (processor_cost_table) == PROCESSOR_max);
    784  1.1  mrg 
    785  1.1  mrg static bool
    786  1.1  mrg ix86_option_override_internal (bool main_args_p,
    787  1.1  mrg 			       struct gcc_options *opts,
    788  1.1  mrg 			       struct gcc_options *opts_set);
    789  1.1  mrg static void
    790  1.1  mrg set_ix86_tune_features (struct gcc_options *opts,
    791  1.1  mrg 			enum processor_type ix86_tune, bool dump);
    792  1.1  mrg 
    793  1.1  mrg /* Restore the current options */
    794  1.1  mrg 
    795  1.1  mrg void
    796  1.1  mrg ix86_function_specific_restore (struct gcc_options *opts,
    797  1.1  mrg 				struct gcc_options */* opts_set */,
    798  1.1  mrg 				struct cl_target_option *ptr)
    799  1.1  mrg {
    800  1.1  mrg   enum processor_type old_tune = ix86_tune;
    801  1.1  mrg   enum processor_type old_arch = ix86_arch;
    802  1.1  mrg   unsigned HOST_WIDE_INT ix86_arch_mask;
    803  1.1  mrg   int i;
    804  1.1  mrg 
    805  1.1  mrg   /* We don't change -fPIC.  */
    806  1.1  mrg   opts->x_flag_pic = flag_pic;
    807  1.1  mrg 
    808  1.1  mrg   ix86_arch = (enum processor_type) ptr->arch;
    809  1.1  mrg   ix86_schedule = (enum attr_cpu) ptr->schedule;
    810  1.1  mrg   ix86_tune = (enum processor_type) ptr->tune;
    811  1.1  mrg   ix86_prefetch_sse = ptr->prefetch_sse;
    812  1.1  mrg   ix86_tune_defaulted = ptr->tune_defaulted;
    813  1.1  mrg   ix86_arch_specified = ptr->arch_specified;
    814  1.1  mrg   opts->x_ix86_isa_flags_explicit = ptr->x_ix86_isa_flags_explicit;
    815  1.1  mrg   opts->x_ix86_isa_flags2_explicit = ptr->x_ix86_isa_flags2_explicit;
    816  1.1  mrg   opts->x_recip_mask_explicit = ptr->x_recip_mask_explicit;
    817  1.1  mrg   opts->x_ix86_arch_string = ptr->x_ix86_arch_string;
    818  1.1  mrg   opts->x_ix86_tune_string = ptr->x_ix86_tune_string;
    819  1.1  mrg   opts->x_ix86_asm_dialect = ptr->x_ix86_asm_dialect;
    820  1.1  mrg   opts->x_ix86_branch_cost = ptr->x_ix86_branch_cost;
    821  1.1  mrg   opts->x_ix86_dump_tunes = ptr->x_ix86_dump_tunes;
    822  1.1  mrg   opts->x_ix86_force_align_arg_pointer = ptr->x_ix86_force_align_arg_pointer;
    823  1.1  mrg   opts->x_ix86_force_drap = ptr->x_ix86_force_drap;
    824  1.1  mrg   opts->x_ix86_recip_name = ptr->x_ix86_recip_name;
    825  1.1  mrg   opts->x_ix86_section_threshold = ptr->x_ix86_section_threshold;
    826  1.1  mrg   opts->x_ix86_sse2avx = ptr->x_ix86_sse2avx;
    827  1.1  mrg   opts->x_ix86_stack_protector_guard = ptr->x_ix86_stack_protector_guard;
    828  1.1  mrg   opts->x_ix86_stringop_alg = ptr->x_ix86_stringop_alg;
    829  1.1  mrg   opts->x_ix86_tls_dialect = ptr->x_ix86_tls_dialect;
    830  1.1  mrg   opts->x_ix86_tune_ctrl_string = ptr->x_ix86_tune_ctrl_string;
    831  1.1  mrg   opts->x_ix86_tune_memcpy_strategy = ptr->x_ix86_tune_memcpy_strategy;
    832  1.1  mrg   opts->x_ix86_tune_memset_strategy = ptr->x_ix86_tune_memset_strategy;
    833  1.1  mrg   opts->x_ix86_tune_no_default = ptr->x_ix86_tune_no_default;
    834  1.1  mrg   ix86_tune_cost = processor_cost_table[ix86_tune];
    835  1.1  mrg   /* TODO: ix86_cost should be chosen at instruction or function granuality
    836  1.1  mrg      so for cold code we use size_cost even in !optimize_size compilation.  */
    837  1.1  mrg   if (opts->x_optimize_size)
    838  1.1  mrg     ix86_cost = &ix86_size_cost;
    839  1.1  mrg   else
    840  1.1  mrg     ix86_cost = ix86_tune_cost;
    841  1.1  mrg 
    842  1.1  mrg   /* Recreate the arch feature tests if the arch changed */
    843  1.1  mrg   if (old_arch != ix86_arch)
    844  1.1  mrg     {
    845  1.1  mrg       ix86_arch_mask = HOST_WIDE_INT_1U << ix86_arch;
    846  1.1  mrg       for (i = 0; i < X86_ARCH_LAST; ++i)
    847  1.1  mrg 	ix86_arch_features[i]
    848  1.1  mrg 	  = !!(initial_ix86_arch_features[i] & ix86_arch_mask);
    849  1.1  mrg     }
    850  1.1  mrg 
    851  1.1  mrg   /* Recreate the tune optimization tests */
    852  1.1  mrg   if (old_tune != ix86_tune)
    853  1.1  mrg     set_ix86_tune_features (opts, ix86_tune, false);
    854  1.1  mrg }
    855  1.1  mrg 
    856  1.1  mrg /* Adjust target options after streaming them in.  This is mainly about
    857  1.1  mrg    reconciling them with global options.  */
    858  1.1  mrg 
    859  1.1  mrg void
    860  1.1  mrg ix86_function_specific_post_stream_in (struct cl_target_option *ptr)
    861  1.1  mrg {
    862  1.1  mrg   /* flag_pic is a global option, but ix86_cmodel is target saved option
    863  1.1  mrg      partly computed from flag_pic.  If flag_pic is on, adjust x_ix86_cmodel
    864  1.1  mrg      for PIC, or error out.  */
    865  1.1  mrg   if (flag_pic)
    866  1.1  mrg     switch (ptr->x_ix86_cmodel)
    867  1.1  mrg       {
    868  1.1  mrg       case CM_SMALL:
    869  1.1  mrg 	ptr->x_ix86_cmodel = CM_SMALL_PIC;
    870  1.1  mrg 	break;
    871  1.1  mrg 
    872  1.1  mrg       case CM_MEDIUM:
    873  1.1  mrg 	ptr->x_ix86_cmodel = CM_MEDIUM_PIC;
    874  1.1  mrg 	break;
    875  1.1  mrg 
    876  1.1  mrg       case CM_LARGE:
    877  1.1  mrg 	ptr->x_ix86_cmodel = CM_LARGE_PIC;
    878  1.1  mrg 	break;
    879  1.1  mrg 
    880  1.1  mrg       case CM_KERNEL:
    881  1.1  mrg 	error ("code model %s does not support PIC mode", "kernel");
    882  1.1  mrg 	break;
    883  1.1  mrg 
    884  1.1  mrg       default:
    885  1.1  mrg 	break;
    886  1.1  mrg       }
    887  1.1  mrg   else
    888  1.1  mrg     switch (ptr->x_ix86_cmodel)
    889  1.1  mrg       {
    890  1.1  mrg       case CM_SMALL_PIC:
    891  1.1  mrg 	ptr->x_ix86_cmodel = CM_SMALL;
    892  1.1  mrg 	break;
    893  1.1  mrg 
    894  1.1  mrg       case CM_MEDIUM_PIC:
    895  1.1  mrg 	ptr->x_ix86_cmodel = CM_MEDIUM;
    896  1.1  mrg 	break;
    897  1.1  mrg 
    898  1.1  mrg       case CM_LARGE_PIC:
    899  1.1  mrg 	ptr->x_ix86_cmodel = CM_LARGE;
    900  1.1  mrg 	break;
    901  1.1  mrg 
    902  1.1  mrg       default:
    903  1.1  mrg 	break;
    904  1.1  mrg       }
    905  1.1  mrg }
    906  1.1  mrg 
    907  1.1  mrg /* Print the current options */
    908  1.1  mrg 
    909  1.1  mrg void
    910  1.1  mrg ix86_function_specific_print (FILE *file, int indent,
    911  1.1  mrg 			      struct cl_target_option *ptr)
    912  1.1  mrg {
    913  1.1  mrg   char *target_string
    914  1.1  mrg     = ix86_target_string (ptr->x_ix86_isa_flags, ptr->x_ix86_isa_flags2,
    915  1.1  mrg 			  ptr->x_target_flags, ptr->x_ix86_target_flags,
    916  1.1  mrg 			  NULL, NULL, ptr->x_ix86_fpmath,
    917  1.1  mrg 			  ptr->x_prefer_vector_width_type,
    918  1.1  mrg 			  ptr->x_ix86_move_max, ptr->x_ix86_store_max,
    919  1.1  mrg 			  false, true);
    920  1.1  mrg 
    921  1.1  mrg   gcc_assert (ptr->arch < PROCESSOR_max);
    922  1.1  mrg   fprintf (file, "%*sarch = %d (%s)\n",
    923  1.1  mrg 	   indent, "",
    924  1.1  mrg 	   ptr->arch, processor_names[ptr->arch]);
    925  1.1  mrg 
    926  1.1  mrg   gcc_assert (ptr->tune < PROCESSOR_max);
    927  1.1  mrg   fprintf (file, "%*stune = %d (%s)\n",
    928  1.1  mrg 	   indent, "",
    929  1.1  mrg 	   ptr->tune, processor_names[ptr->tune]);
    930  1.1  mrg 
    931  1.1  mrg   fprintf (file, "%*sbranch_cost = %d\n", indent, "", ptr->branch_cost);
    932  1.1  mrg 
    933  1.1  mrg   if (target_string)
    934  1.1  mrg     {
    935  1.1  mrg       fprintf (file, "%*s%s\n", indent, "", target_string);
    936  1.1  mrg       free (target_string);
    937  1.1  mrg     }
    938  1.1  mrg }
    939  1.1  mrg 
    940  1.1  mrg 
    941  1.1  mrg /* Inner function to process the attribute((target(...))), take an argument and
    943  1.1  mrg    set the current options from the argument. If we have a list, recursively go
    944  1.1  mrg    over the list.  */
    945  1.1  mrg 
    946  1.1  mrg static bool
    947  1.1  mrg ix86_valid_target_attribute_inner_p (tree fndecl, tree args, char *p_strings[],
    948  1.1  mrg 				     struct gcc_options *opts,
    949  1.1  mrg 				     struct gcc_options *opts_set,
    950  1.1  mrg 				     struct gcc_options *enum_opts_set,
    951  1.1  mrg 				     bool target_clone_attr)
    952  1.1  mrg {
    953  1.1  mrg   char *next_optstr;
    954  1.1  mrg   bool ret = true;
    955  1.1  mrg 
    956  1.1  mrg #define IX86_ATTR_ISA(S,O)   { S, sizeof (S)-1, ix86_opt_isa, O, 0 }
    957  1.1  mrg #define IX86_ATTR_STR(S,O)   { S, sizeof (S)-1, ix86_opt_str, O, 0 }
    958  1.1  mrg #define IX86_ATTR_ENUM(S,O)  { S, sizeof (S)-1, ix86_opt_enum, O, 0 }
    959  1.1  mrg #define IX86_ATTR_YES(S,O,M) { S, sizeof (S)-1, ix86_opt_yes, O, M }
    960  1.1  mrg #define IX86_ATTR_NO(S,O,M)  { S, sizeof (S)-1, ix86_opt_no,  O, M }
    961  1.1  mrg #define IX86_ATTR_IX86_YES(S,O,M) \
    962  1.1  mrg   { S, sizeof (S)-1, ix86_opt_ix86_yes, O, M }
    963  1.1  mrg #define IX86_ATTR_IX86_NO(S,O,M) \
    964  1.1  mrg   { S, sizeof (S)-1, ix86_opt_ix86_no,  O, M }
    965  1.1  mrg 
    966  1.1  mrg   enum ix86_opt_type
    967  1.1  mrg   {
    968  1.1  mrg     ix86_opt_unknown,
    969  1.1  mrg     ix86_opt_yes,
    970  1.1  mrg     ix86_opt_no,
    971  1.1  mrg     ix86_opt_ix86_yes,
    972  1.1  mrg     ix86_opt_ix86_no,
    973  1.1  mrg     ix86_opt_str,
    974  1.1  mrg     ix86_opt_enum,
    975  1.1  mrg     ix86_opt_isa
    976  1.1  mrg   };
    977  1.1  mrg 
    978  1.1  mrg   static const struct
    979  1.1  mrg   {
    980  1.1  mrg     const char *string;
    981  1.1  mrg     size_t len;
    982  1.1  mrg     enum ix86_opt_type type;
    983  1.1  mrg     int opt;
    984  1.1  mrg     int mask;
    985  1.1  mrg   } attrs[] = {
    986  1.1  mrg     /* isa options */
    987  1.1  mrg     IX86_ATTR_ISA ("pconfig",	OPT_mpconfig),
    988  1.1  mrg     IX86_ATTR_ISA ("wbnoinvd",	OPT_mwbnoinvd),
    989  1.1  mrg     IX86_ATTR_ISA ("sgx",	OPT_msgx),
    990  1.1  mrg     IX86_ATTR_ISA ("avx5124fmaps", OPT_mavx5124fmaps),
    991  1.1  mrg     IX86_ATTR_ISA ("avx5124vnniw", OPT_mavx5124vnniw),
    992  1.1  mrg     IX86_ATTR_ISA ("avx512vpopcntdq", OPT_mavx512vpopcntdq),
    993  1.1  mrg     IX86_ATTR_ISA ("avx512vbmi2", OPT_mavx512vbmi2),
    994  1.1  mrg     IX86_ATTR_ISA ("avx512vnni", OPT_mavx512vnni),
    995  1.1  mrg     IX86_ATTR_ISA ("avx512bitalg", OPT_mavx512bitalg),
    996  1.1  mrg     IX86_ATTR_ISA ("avx512vp2intersect", OPT_mavx512vp2intersect),
    997  1.1  mrg 
    998  1.1  mrg     IX86_ATTR_ISA ("avx512vbmi", OPT_mavx512vbmi),
    999  1.1  mrg     IX86_ATTR_ISA ("avx512ifma", OPT_mavx512ifma),
   1000  1.1  mrg     IX86_ATTR_ISA ("avx512vl",	OPT_mavx512vl),
   1001  1.1  mrg     IX86_ATTR_ISA ("avx512bw",	OPT_mavx512bw),
   1002  1.1  mrg     IX86_ATTR_ISA ("avx512dq",	OPT_mavx512dq),
   1003  1.1  mrg     IX86_ATTR_ISA ("avx512er",	OPT_mavx512er),
   1004  1.1  mrg     IX86_ATTR_ISA ("avx512pf",	OPT_mavx512pf),
   1005  1.1  mrg     IX86_ATTR_ISA ("avx512cd",	OPT_mavx512cd),
   1006  1.1  mrg     IX86_ATTR_ISA ("avx512f",	OPT_mavx512f),
   1007  1.1  mrg     IX86_ATTR_ISA ("avx2",	OPT_mavx2),
   1008  1.1  mrg     IX86_ATTR_ISA ("fma",	OPT_mfma),
   1009  1.1  mrg     IX86_ATTR_ISA ("xop",	OPT_mxop),
   1010  1.1  mrg     IX86_ATTR_ISA ("fma4",	OPT_mfma4),
   1011  1.1  mrg     IX86_ATTR_ISA ("f16c",	OPT_mf16c),
   1012  1.1  mrg     IX86_ATTR_ISA ("avx",	OPT_mavx),
   1013  1.1  mrg     IX86_ATTR_ISA ("sse4",	OPT_msse4),
   1014  1.1  mrg     IX86_ATTR_ISA ("sse4.2",	OPT_msse4_2),
   1015  1.1  mrg     IX86_ATTR_ISA ("sse4.1",	OPT_msse4_1),
   1016  1.1  mrg     IX86_ATTR_ISA ("sse4a",	OPT_msse4a),
   1017  1.1  mrg     IX86_ATTR_ISA ("ssse3",	OPT_mssse3),
   1018  1.1  mrg     IX86_ATTR_ISA ("sse3",	OPT_msse3),
   1019  1.1  mrg     IX86_ATTR_ISA ("aes",	OPT_maes),
   1020  1.1  mrg     IX86_ATTR_ISA ("sha",	OPT_msha),
   1021  1.1  mrg     IX86_ATTR_ISA ("pclmul",	OPT_mpclmul),
   1022  1.1  mrg     IX86_ATTR_ISA ("sse2",	OPT_msse2),
   1023  1.1  mrg     IX86_ATTR_ISA ("sse",	OPT_msse),
   1024  1.1  mrg     IX86_ATTR_ISA ("3dnowa",	OPT_m3dnowa),
   1025  1.1  mrg     IX86_ATTR_ISA ("3dnow",	OPT_m3dnow),
   1026  1.1  mrg     IX86_ATTR_ISA ("mmx",	OPT_mmmx),
   1027  1.1  mrg     IX86_ATTR_ISA ("rtm",	OPT_mrtm),
   1028  1.1  mrg     IX86_ATTR_ISA ("prfchw",	OPT_mprfchw),
   1029  1.1  mrg     IX86_ATTR_ISA ("rdseed",	OPT_mrdseed),
   1030  1.1  mrg     IX86_ATTR_ISA ("adx",	OPT_madx),
   1031  1.1  mrg     IX86_ATTR_ISA ("prefetchwt1", OPT_mprefetchwt1),
   1032  1.1  mrg     IX86_ATTR_ISA ("clflushopt", OPT_mclflushopt),
   1033  1.1  mrg     IX86_ATTR_ISA ("xsaves",	OPT_mxsaves),
   1034  1.1  mrg     IX86_ATTR_ISA ("xsavec",	OPT_mxsavec),
   1035  1.1  mrg     IX86_ATTR_ISA ("xsaveopt",	OPT_mxsaveopt),
   1036  1.1  mrg     IX86_ATTR_ISA ("xsave",	OPT_mxsave),
   1037  1.1  mrg     IX86_ATTR_ISA ("abm",	OPT_mabm),
   1038  1.1  mrg     IX86_ATTR_ISA ("bmi",	OPT_mbmi),
   1039  1.1  mrg     IX86_ATTR_ISA ("bmi2",	OPT_mbmi2),
   1040  1.1  mrg     IX86_ATTR_ISA ("lzcnt",	OPT_mlzcnt),
   1041  1.1  mrg     IX86_ATTR_ISA ("tbm",	OPT_mtbm),
   1042  1.1  mrg     IX86_ATTR_ISA ("popcnt",	OPT_mpopcnt),
   1043  1.1  mrg     IX86_ATTR_ISA ("cx16",	OPT_mcx16),
   1044  1.1  mrg     IX86_ATTR_ISA ("sahf",	OPT_msahf),
   1045  1.1  mrg     IX86_ATTR_ISA ("movbe",	OPT_mmovbe),
   1046  1.1  mrg     IX86_ATTR_ISA ("crc32",	OPT_mcrc32),
   1047  1.1  mrg     IX86_ATTR_ISA ("fsgsbase",	OPT_mfsgsbase),
   1048  1.1  mrg     IX86_ATTR_ISA ("rdrnd",	OPT_mrdrnd),
   1049  1.1  mrg     IX86_ATTR_ISA ("mwaitx",	OPT_mmwaitx),
   1050  1.1  mrg     IX86_ATTR_ISA ("mwait",	OPT_mmwait),
   1051  1.1  mrg     IX86_ATTR_ISA ("clzero",	OPT_mclzero),
   1052  1.1  mrg     IX86_ATTR_ISA ("pku",	OPT_mpku),
   1053  1.1  mrg     IX86_ATTR_ISA ("lwp",	OPT_mlwp),
   1054  1.1  mrg     IX86_ATTR_ISA ("hle",	OPT_mhle),
   1055  1.1  mrg     IX86_ATTR_ISA ("fxsr",	OPT_mfxsr),
   1056  1.1  mrg     IX86_ATTR_ISA ("clwb",	OPT_mclwb),
   1057  1.1  mrg     IX86_ATTR_ISA ("rdpid",	OPT_mrdpid),
   1058  1.1  mrg     IX86_ATTR_ISA ("gfni",	OPT_mgfni),
   1059  1.1  mrg     IX86_ATTR_ISA ("shstk",	OPT_mshstk),
   1060  1.1  mrg     IX86_ATTR_ISA ("vaes",	OPT_mvaes),
   1061  1.1  mrg     IX86_ATTR_ISA ("vpclmulqdq", OPT_mvpclmulqdq),
   1062  1.1  mrg     IX86_ATTR_ISA ("movdiri", OPT_mmovdiri),
   1063  1.1  mrg     IX86_ATTR_ISA ("movdir64b", OPT_mmovdir64b),
   1064  1.1  mrg     IX86_ATTR_ISA ("waitpkg", OPT_mwaitpkg),
   1065  1.1  mrg     IX86_ATTR_ISA ("cldemote", OPT_mcldemote),
   1066  1.1  mrg     IX86_ATTR_ISA ("uintr", OPT_muintr),
   1067  1.1  mrg     IX86_ATTR_ISA ("ptwrite",   OPT_mptwrite),
   1068  1.1  mrg     IX86_ATTR_ISA ("kl", OPT_mkl),
   1069  1.1  mrg     IX86_ATTR_ISA ("widekl",	OPT_mwidekl),
   1070  1.1  mrg     IX86_ATTR_ISA ("avx512bf16",   OPT_mavx512bf16),
   1071  1.1  mrg     IX86_ATTR_ISA ("enqcmd", OPT_menqcmd),
   1072  1.1  mrg     IX86_ATTR_ISA ("serialize", OPT_mserialize),
   1073  1.1  mrg     IX86_ATTR_ISA ("tsxldtrk", OPT_mtsxldtrk),
   1074  1.1  mrg     IX86_ATTR_ISA ("amx-tile", OPT_mamx_tile),
   1075  1.1  mrg     IX86_ATTR_ISA ("amx-int8", OPT_mamx_int8),
   1076  1.1  mrg     IX86_ATTR_ISA ("amx-bf16", OPT_mamx_bf16),
   1077  1.1  mrg     IX86_ATTR_ISA ("hreset", OPT_mhreset),
   1078  1.1  mrg     IX86_ATTR_ISA ("avxvnni",   OPT_mavxvnni),
   1079  1.1  mrg     IX86_ATTR_ISA ("avx512fp16", OPT_mavx512fp16),
   1080  1.1  mrg 
   1081  1.1  mrg     /* enum options */
   1082  1.1  mrg     IX86_ATTR_ENUM ("fpmath=",	OPT_mfpmath_),
   1083  1.1  mrg     IX86_ATTR_ENUM ("prefer-vector-width=", OPT_mprefer_vector_width_),
   1084  1.1  mrg 
   1085  1.1  mrg     /* string options */
   1086  1.1  mrg     IX86_ATTR_STR ("arch=",	IX86_FUNCTION_SPECIFIC_ARCH),
   1087  1.1  mrg     IX86_ATTR_STR ("tune=",	IX86_FUNCTION_SPECIFIC_TUNE),
   1088  1.1  mrg 
   1089  1.1  mrg     /* flag options */
   1090  1.1  mrg     IX86_ATTR_YES ("cld",
   1091  1.1  mrg 		   OPT_mcld,
   1092  1.1  mrg 		   MASK_CLD),
   1093  1.1  mrg 
   1094  1.1  mrg     IX86_ATTR_NO ("fancy-math-387",
   1095  1.1  mrg 		  OPT_mfancy_math_387,
   1096  1.1  mrg 		  MASK_NO_FANCY_MATH_387),
   1097  1.1  mrg 
   1098  1.1  mrg     IX86_ATTR_YES ("ieee-fp",
   1099  1.1  mrg 		   OPT_mieee_fp,
   1100  1.1  mrg 		   MASK_IEEE_FP),
   1101  1.1  mrg 
   1102  1.1  mrg     IX86_ATTR_YES ("inline-all-stringops",
   1103  1.1  mrg 		   OPT_minline_all_stringops,
   1104  1.1  mrg 		   MASK_INLINE_ALL_STRINGOPS),
   1105  1.1  mrg 
   1106  1.1  mrg     IX86_ATTR_YES ("inline-stringops-dynamically",
   1107  1.1  mrg 		   OPT_minline_stringops_dynamically,
   1108  1.1  mrg 		   MASK_INLINE_STRINGOPS_DYNAMICALLY),
   1109  1.1  mrg 
   1110  1.1  mrg     IX86_ATTR_NO ("align-stringops",
   1111  1.1  mrg 		  OPT_mno_align_stringops,
   1112  1.1  mrg 		  MASK_NO_ALIGN_STRINGOPS),
   1113  1.1  mrg 
   1114  1.1  mrg     IX86_ATTR_YES ("recip",
   1115  1.1  mrg 		   OPT_mrecip,
   1116  1.1  mrg 		   MASK_RECIP),
   1117  1.1  mrg 
   1118  1.1  mrg     IX86_ATTR_IX86_YES ("general-regs-only",
   1119  1.1  mrg 			OPT_mgeneral_regs_only,
   1120  1.1  mrg 			OPTION_MASK_GENERAL_REGS_ONLY),
   1121  1.1  mrg 
   1122  1.1  mrg     IX86_ATTR_YES ("relax-cmpxchg-loop",
   1123  1.1  mrg 		   OPT_mrelax_cmpxchg_loop,
   1124  1.1  mrg 		   MASK_RELAX_CMPXCHG_LOOP),
   1125  1.1  mrg   };
   1126  1.1  mrg 
   1127  1.1  mrg   location_t loc
   1128  1.1  mrg     = fndecl == NULL ? UNKNOWN_LOCATION : DECL_SOURCE_LOCATION (fndecl);
   1129  1.1  mrg   const char *attr_name = target_clone_attr ? "target_clone" : "target";
   1130  1.1  mrg 
   1131  1.1  mrg   /* If this is a list, recurse to get the options.  */
   1132  1.1  mrg   if (TREE_CODE (args) == TREE_LIST)
   1133  1.1  mrg     {
   1134  1.1  mrg       for (; args; args = TREE_CHAIN (args))
   1135  1.1  mrg 	if (TREE_VALUE (args)
   1136  1.1  mrg 	    && !ix86_valid_target_attribute_inner_p (fndecl, TREE_VALUE (args),
   1137  1.1  mrg 						     p_strings, opts, opts_set,
   1138  1.1  mrg 						     enum_opts_set,
   1139  1.1  mrg 						     target_clone_attr))
   1140  1.1  mrg 	  ret = false;
   1141  1.1  mrg 
   1142  1.1  mrg       return ret;
   1143  1.1  mrg     }
   1144  1.1  mrg 
   1145  1.1  mrg   else if (TREE_CODE (args) != STRING_CST)
   1146  1.1  mrg     {
   1147  1.1  mrg       error_at (loc, "attribute %qs argument is not a string", attr_name);
   1148  1.1  mrg       return false;
   1149  1.1  mrg     }
   1150  1.1  mrg 
   1151  1.1  mrg   /* Handle multiple arguments separated by commas.  */
   1152  1.1  mrg   next_optstr = ASTRDUP (TREE_STRING_POINTER (args));
   1153  1.1  mrg 
   1154  1.1  mrg   while (next_optstr && *next_optstr != '\0')
   1155  1.1  mrg     {
   1156  1.1  mrg       char *p = next_optstr;
   1157  1.1  mrg       char *orig_p = p;
   1158  1.1  mrg       char *comma = strchr (next_optstr, ',');
   1159  1.1  mrg       size_t len, opt_len;
   1160  1.1  mrg       int opt;
   1161  1.1  mrg       bool opt_set_p;
   1162  1.1  mrg       char ch;
   1163  1.1  mrg       unsigned i;
   1164  1.1  mrg       enum ix86_opt_type type = ix86_opt_unknown;
   1165  1.1  mrg       int mask = 0;
   1166  1.1  mrg 
   1167  1.1  mrg       if (comma)
   1168  1.1  mrg 	{
   1169  1.1  mrg 	  *comma = '\0';
   1170  1.1  mrg 	  len = comma - next_optstr;
   1171  1.1  mrg 	  next_optstr = comma + 1;
   1172  1.1  mrg 	}
   1173  1.1  mrg       else
   1174  1.1  mrg 	{
   1175  1.1  mrg 	  len = strlen (p);
   1176  1.1  mrg 	  next_optstr = NULL;
   1177  1.1  mrg 	}
   1178  1.1  mrg 
   1179  1.1  mrg       /* Recognize no-xxx.  */
   1180  1.1  mrg       if (len > 3 && p[0] == 'n' && p[1] == 'o' && p[2] == '-')
   1181  1.1  mrg 	{
   1182  1.1  mrg 	  opt_set_p = false;
   1183  1.1  mrg 	  p += 3;
   1184  1.1  mrg 	  len -= 3;
   1185  1.1  mrg 	}
   1186  1.1  mrg       else
   1187  1.1  mrg 	opt_set_p = true;
   1188  1.1  mrg 
   1189  1.1  mrg       /* Find the option.  */
   1190  1.1  mrg       ch = *p;
   1191  1.1  mrg       opt = N_OPTS;
   1192  1.1  mrg       for (i = 0; i < ARRAY_SIZE (attrs); i++)
   1193  1.1  mrg 	{
   1194  1.1  mrg 	  type = attrs[i].type;
   1195  1.1  mrg 	  opt_len = attrs[i].len;
   1196  1.1  mrg 	  if (ch == attrs[i].string[0]
   1197  1.1  mrg 	      && ((type != ix86_opt_str && type != ix86_opt_enum)
   1198  1.1  mrg 		  ? len == opt_len
   1199  1.1  mrg 		  : len > opt_len)
   1200  1.1  mrg 	      && memcmp (p, attrs[i].string, opt_len) == 0)
   1201  1.1  mrg 	    {
   1202  1.1  mrg 	      opt = attrs[i].opt;
   1203  1.1  mrg 	      mask = attrs[i].mask;
   1204  1.1  mrg 	      break;
   1205  1.1  mrg 	    }
   1206  1.1  mrg 	}
   1207  1.1  mrg 
   1208  1.1  mrg       /* Process the option.  */
   1209  1.1  mrg       if (opt == N_OPTS)
   1210  1.1  mrg 	{
   1211  1.1  mrg 	  error_at (loc, "attribute %qs argument %qs is unknown",
   1212  1.1  mrg 		    attr_name, orig_p);
   1213  1.1  mrg 	  ret = false;
   1214  1.1  mrg 	}
   1215  1.1  mrg 
   1216  1.1  mrg       else if (type == ix86_opt_isa)
   1217  1.1  mrg 	{
   1218  1.1  mrg 	  struct cl_decoded_option decoded;
   1219  1.1  mrg 
   1220  1.1  mrg 	  generate_option (opt, NULL, opt_set_p, CL_TARGET, &decoded);
   1221  1.1  mrg 	  ix86_handle_option (opts, opts_set,
   1222  1.1  mrg 			      &decoded, input_location);
   1223  1.1  mrg 	}
   1224  1.1  mrg 
   1225  1.1  mrg       else if (type == ix86_opt_yes || type == ix86_opt_no)
   1226  1.1  mrg 	{
   1227  1.1  mrg 	  if (type == ix86_opt_no)
   1228  1.1  mrg 	    opt_set_p = !opt_set_p;
   1229  1.1  mrg 
   1230  1.1  mrg 	  if (opt_set_p)
   1231  1.1  mrg 	    opts->x_target_flags |= mask;
   1232  1.1  mrg 	  else
   1233  1.1  mrg 	    opts->x_target_flags &= ~mask;
   1234  1.1  mrg 	}
   1235  1.1  mrg 
   1236  1.1  mrg       else if (type == ix86_opt_ix86_yes || type == ix86_opt_ix86_no)
   1237  1.1  mrg 	{
   1238  1.1  mrg 	  if (mask == OPTION_MASK_GENERAL_REGS_ONLY)
   1239  1.1  mrg 	    {
   1240  1.1  mrg 	      if (!opt_set_p)
   1241  1.1  mrg 		{
   1242  1.1  mrg 		  error_at (loc, "pragma or attribute %<target(\"%s\")%> "
   1243  1.1  mrg 			    "does not allow a negated form", p);
   1244  1.1  mrg 		  return false;
   1245  1.1  mrg 		}
   1246  1.1  mrg 
   1247  1.1  mrg 	      if (type != ix86_opt_ix86_yes)
   1248  1.1  mrg 		gcc_unreachable ();
   1249  1.1  mrg 
   1250  1.1  mrg 	      opts->x_ix86_target_flags |= mask;
   1251  1.1  mrg 
   1252  1.1  mrg 	      struct cl_decoded_option decoded;
   1253  1.1  mrg 	      generate_option (opt, NULL, opt_set_p, CL_TARGET,
   1254  1.1  mrg 			       &decoded);
   1255  1.1  mrg 	      ix86_handle_option (opts, opts_set, &decoded,
   1256  1.1  mrg 				  input_location);
   1257  1.1  mrg 	    }
   1258  1.1  mrg 	  else
   1259  1.1  mrg 	    {
   1260  1.1  mrg 	      if (type == ix86_opt_ix86_no)
   1261  1.1  mrg 		opt_set_p = !opt_set_p;
   1262  1.1  mrg 
   1263  1.1  mrg 	      if (opt_set_p)
   1264  1.1  mrg 		opts->x_ix86_target_flags |= mask;
   1265  1.1  mrg 	      else
   1266  1.1  mrg 		opts->x_ix86_target_flags &= ~mask;
   1267  1.1  mrg 	    }
   1268  1.1  mrg 	}
   1269  1.1  mrg 
   1270  1.1  mrg       else if (type == ix86_opt_str)
   1271  1.1  mrg 	{
   1272  1.1  mrg 	  if (p_strings[opt])
   1273  1.1  mrg 	    {
   1274  1.1  mrg 	      error_at (loc, "attribute value %qs was already specified "
   1275  1.1  mrg 			"in %qs attribute", orig_p, attr_name);
   1276  1.1  mrg 	      ret = false;
   1277  1.1  mrg 	    }
   1278  1.1  mrg 	  else
   1279  1.1  mrg 	    {
   1280  1.1  mrg 	      p_strings[opt] = xstrdup (p + opt_len);
   1281  1.1  mrg 	      if (opt == IX86_FUNCTION_SPECIFIC_ARCH)
   1282  1.1  mrg 		{
   1283  1.1  mrg 		  /* If arch= is set,  clear all bits in x_ix86_isa_flags,
   1284  1.1  mrg 		     except for ISA_64BIT, ABI_64, ABI_X32, and CODE16
   1285  1.1  mrg 		     and all bits in x_ix86_isa_flags2.  */
   1286  1.1  mrg 		  opts->x_ix86_isa_flags &= (OPTION_MASK_ISA_64BIT
   1287  1.1  mrg 					     | OPTION_MASK_ABI_64
   1288  1.1  mrg 					     | OPTION_MASK_ABI_X32
   1289  1.1  mrg 					     | OPTION_MASK_CODE16);
   1290  1.1  mrg 		  opts->x_ix86_isa_flags_explicit &= (OPTION_MASK_ISA_64BIT
   1291  1.1  mrg 						      | OPTION_MASK_ABI_64
   1292  1.1  mrg 						      | OPTION_MASK_ABI_X32
   1293  1.1  mrg 						      | OPTION_MASK_CODE16);
   1294  1.1  mrg 		  opts->x_ix86_isa_flags2 = 0;
   1295  1.1  mrg 		  opts->x_ix86_isa_flags2_explicit = 0;
   1296  1.1  mrg 		}
   1297  1.1  mrg 	    }
   1298  1.1  mrg 	}
   1299  1.1  mrg 
   1300  1.1  mrg       else if (type == ix86_opt_enum)
   1301  1.1  mrg 	{
   1302  1.1  mrg 	  bool arg_ok;
   1303  1.1  mrg 	  int value;
   1304  1.1  mrg 
   1305  1.1  mrg 	  arg_ok = opt_enum_arg_to_value (opt, p + opt_len, &value, CL_TARGET);
   1306  1.1  mrg 	  if (arg_ok)
   1307  1.1  mrg 	    set_option (opts, enum_opts_set, opt, value,
   1308  1.1  mrg 			p + opt_len, DK_UNSPECIFIED, input_location,
   1309  1.1  mrg 			global_dc);
   1310  1.1  mrg 	  else
   1311  1.1  mrg 	    {
   1312  1.1  mrg 	      error_at (loc, "attribute value %qs is unknown in %qs attribute",
   1313  1.1  mrg 			orig_p, attr_name);
   1314  1.1  mrg 	      ret = false;
   1315  1.1  mrg 	    }
   1316  1.1  mrg 	}
   1317  1.1  mrg 
   1318  1.1  mrg       else
   1319  1.1  mrg 	gcc_unreachable ();
   1320  1.1  mrg     }
   1321  1.1  mrg 
   1322  1.1  mrg   return ret;
   1323  1.1  mrg }
   1324  1.1  mrg 
   1325  1.1  mrg /* Release allocated strings.  */
   1326  1.1  mrg static void
   1327  1.1  mrg release_options_strings (char **option_strings)
   1328  1.1  mrg {
   1329  1.1  mrg   /* Free up memory allocated to hold the strings */
   1330  1.1  mrg   for (unsigned i = 0; i < IX86_FUNCTION_SPECIFIC_MAX; i++)
   1331  1.1  mrg     free (option_strings[i]);
   1332  1.1  mrg }
   1333  1.1  mrg 
   1334  1.1  mrg /* Return a TARGET_OPTION_NODE tree of the target options listed or NULL.  */
   1335  1.1  mrg 
   1336  1.1  mrg tree
   1337  1.1  mrg ix86_valid_target_attribute_tree (tree fndecl, tree args,
   1338  1.1  mrg 				  struct gcc_options *opts,
   1339  1.1  mrg 				  struct gcc_options *opts_set,
   1340  1.1  mrg 				  bool target_clone_attr)
   1341  1.1  mrg {
   1342  1.1  mrg   const char *orig_arch_string = opts->x_ix86_arch_string;
   1343  1.1  mrg   const char *orig_tune_string = opts->x_ix86_tune_string;
   1344  1.1  mrg   enum fpmath_unit orig_fpmath_set = opts_set->x_ix86_fpmath;
   1345  1.1  mrg   enum prefer_vector_width orig_pvw_set = opts_set->x_prefer_vector_width_type;
   1346  1.1  mrg   enum prefer_vector_width orig_ix86_move_max_set
   1347  1.1  mrg     = opts_set->x_ix86_move_max;
   1348  1.1  mrg   enum prefer_vector_width orig_ix86_store_max_set
   1349  1.1  mrg     = opts_set->x_ix86_store_max;
   1350  1.1  mrg   int orig_tune_defaulted = ix86_tune_defaulted;
   1351  1.1  mrg   int orig_arch_specified = ix86_arch_specified;
   1352  1.1  mrg   char *option_strings[IX86_FUNCTION_SPECIFIC_MAX] = { NULL, NULL };
   1353  1.1  mrg   tree t = NULL_TREE;
   1354  1.1  mrg   struct cl_target_option *def
   1355  1.1  mrg     = TREE_TARGET_OPTION (target_option_default_node);
   1356  1.1  mrg   struct gcc_options enum_opts_set;
   1357  1.1  mrg 
   1358  1.1  mrg   memset (&enum_opts_set, 0, sizeof (enum_opts_set));
   1359  1.1  mrg 
   1360  1.1  mrg   /* Process each of the options on the chain.  */
   1361  1.1  mrg   if (!ix86_valid_target_attribute_inner_p (fndecl, args, option_strings, opts,
   1362  1.1  mrg 					    opts_set, &enum_opts_set,
   1363  1.1  mrg 					    target_clone_attr))
   1364  1.1  mrg     return error_mark_node;
   1365  1.1  mrg 
   1366  1.1  mrg   /* If the changed options are different from the default, rerun
   1367  1.1  mrg      ix86_option_override_internal, and then save the options away.
   1368  1.1  mrg      The string options are attribute options, and will be undone
   1369  1.1  mrg      when we copy the save structure.  */
   1370  1.1  mrg   if (opts->x_ix86_isa_flags != def->x_ix86_isa_flags
   1371  1.1  mrg       || opts->x_ix86_isa_flags2 != def->x_ix86_isa_flags2
   1372  1.1  mrg       || opts->x_target_flags != def->x_target_flags
   1373  1.1  mrg       || option_strings[IX86_FUNCTION_SPECIFIC_ARCH]
   1374  1.1  mrg       || option_strings[IX86_FUNCTION_SPECIFIC_TUNE]
   1375  1.1  mrg       || enum_opts_set.x_ix86_fpmath
   1376  1.1  mrg       || enum_opts_set.x_prefer_vector_width_type)
   1377  1.1  mrg     {
   1378  1.1  mrg       /* If we are using the default tune= or arch=, undo the string assigned,
   1379  1.1  mrg 	 and use the default.  */
   1380  1.1  mrg       if (option_strings[IX86_FUNCTION_SPECIFIC_ARCH])
   1381  1.1  mrg 	opts->x_ix86_arch_string
   1382  1.1  mrg 	  = ggc_strdup (option_strings[IX86_FUNCTION_SPECIFIC_ARCH]);
   1383  1.1  mrg       else if (!orig_arch_specified)
   1384  1.1  mrg 	opts->x_ix86_arch_string = NULL;
   1385  1.1  mrg 
   1386  1.1  mrg       if (option_strings[IX86_FUNCTION_SPECIFIC_TUNE])
   1387  1.1  mrg 	opts->x_ix86_tune_string
   1388  1.1  mrg 	  = ggc_strdup (option_strings[IX86_FUNCTION_SPECIFIC_TUNE]);
   1389  1.1  mrg       /* If we have explicit arch string and no tune string specified, set
   1390  1.1  mrg 	 tune_string to NULL and later it will be overriden by arch_string
   1391  1.1  mrg 	 so target clones can get proper optimization.  */
   1392  1.1  mrg       else if (option_strings[IX86_FUNCTION_SPECIFIC_ARCH]
   1393  1.1  mrg 	       || orig_tune_defaulted)
   1394  1.1  mrg 	opts->x_ix86_tune_string = NULL;
   1395  1.1  mrg 
   1396  1.1  mrg       /* If fpmath= is not set, and we now have sse2 on 32-bit, use it.  */
   1397  1.1  mrg       if (enum_opts_set.x_ix86_fpmath)
   1398  1.1  mrg 	opts_set->x_ix86_fpmath = (enum fpmath_unit) 1;
   1399  1.1  mrg       if (enum_opts_set.x_prefer_vector_width_type)
   1400  1.1  mrg 	opts_set->x_prefer_vector_width_type = (enum prefer_vector_width) 1;
   1401  1.1  mrg 
   1402  1.1  mrg       /* Do any overrides, such as arch=xxx, or tune=xxx support.  */
   1403  1.1  mrg       bool r = ix86_option_override_internal (false, opts, opts_set);
   1404  1.1  mrg       if (!r)
   1405  1.1  mrg 	{
   1406  1.1  mrg 	  release_options_strings (option_strings);
   1407  1.1  mrg 	  return error_mark_node;
   1408  1.1  mrg 	}
   1409  1.1  mrg 
   1410  1.1  mrg       /* Add any builtin functions with the new isa if any.  */
   1411  1.1  mrg       ix86_add_new_builtins (opts->x_ix86_isa_flags, opts->x_ix86_isa_flags2);
   1412  1.1  mrg 
   1413  1.1  mrg       enum excess_precision orig_ix86_excess_precision
   1414  1.1  mrg 	= opts->x_ix86_excess_precision;
   1415  1.1  mrg       bool orig_ix86_unsafe_math_optimizations
   1416  1.1  mrg 	= opts->x_ix86_unsafe_math_optimizations;
   1417  1.1  mrg       opts->x_ix86_excess_precision = opts->x_flag_excess_precision;
   1418  1.1  mrg       opts->x_ix86_unsafe_math_optimizations
   1419  1.1  mrg 	= opts->x_flag_unsafe_math_optimizations;
   1420  1.1  mrg 
   1421  1.1  mrg       /* Save the current options unless we are validating options for
   1422  1.1  mrg 	 #pragma.  */
   1423  1.1  mrg       t = build_target_option_node (opts, opts_set);
   1424  1.1  mrg 
   1425  1.1  mrg       opts->x_ix86_arch_string = orig_arch_string;
   1426  1.1  mrg       opts->x_ix86_tune_string = orig_tune_string;
   1427  1.1  mrg       opts_set->x_ix86_fpmath = orig_fpmath_set;
   1428  1.1  mrg       opts_set->x_prefer_vector_width_type = orig_pvw_set;
   1429  1.1  mrg       opts_set->x_ix86_move_max = orig_ix86_move_max_set;
   1430  1.1  mrg       opts_set->x_ix86_store_max = orig_ix86_store_max_set;
   1431  1.1  mrg       opts->x_ix86_excess_precision = orig_ix86_excess_precision;
   1432  1.1  mrg       opts->x_ix86_unsafe_math_optimizations
   1433  1.1  mrg 	= orig_ix86_unsafe_math_optimizations;
   1434  1.1  mrg 
   1435  1.1  mrg       release_options_strings (option_strings);
   1436  1.1  mrg     }
   1437  1.1  mrg 
   1438  1.1  mrg   return t;
   1439  1.1  mrg }
   1440  1.1  mrg 
   1441  1.1  mrg static GTY(()) tree target_attribute_cache[3];
   1442  1.1  mrg 
   1443  1.1  mrg /* Hook to validate attribute((target("string"))).  */
   1444  1.1  mrg 
   1445  1.1  mrg bool
   1446  1.1  mrg ix86_valid_target_attribute_p (tree fndecl,
   1447  1.1  mrg 			       tree ARG_UNUSED (name),
   1448  1.1  mrg 			       tree args,
   1449  1.1  mrg 			       int flags)
   1450  1.1  mrg {
   1451  1.1  mrg   struct gcc_options func_options, func_options_set;
   1452  1.1  mrg   tree new_target, new_optimize;
   1453  1.1  mrg   bool ret = true;
   1454  1.1  mrg 
   1455  1.1  mrg   /* attribute((target("default"))) does nothing, beyond
   1456  1.1  mrg      affecting multi-versioning.  */
   1457  1.1  mrg   if (TREE_VALUE (args)
   1458  1.1  mrg       && TREE_CODE (TREE_VALUE (args)) == STRING_CST
   1459  1.1  mrg       && TREE_CHAIN (args) == NULL_TREE
   1460  1.1  mrg       && strcmp (TREE_STRING_POINTER (TREE_VALUE (args)), "default") == 0)
   1461  1.1  mrg     return true;
   1462  1.1  mrg 
   1463  1.1  mrg   if ((DECL_FUNCTION_SPECIFIC_TARGET (fndecl) == target_attribute_cache[1]
   1464  1.1  mrg        || DECL_FUNCTION_SPECIFIC_TARGET (fndecl) == NULL_TREE)
   1465  1.1  mrg       && (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl)
   1466  1.1  mrg 	  == target_attribute_cache[2]
   1467  1.1  mrg 	  || DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl) == NULL_TREE)
   1468  1.1  mrg       && simple_cst_list_equal (args, target_attribute_cache[0]))
   1469  1.1  mrg     {
   1470  1.1  mrg       DECL_FUNCTION_SPECIFIC_TARGET (fndecl) = target_attribute_cache[1];
   1471  1.1  mrg       DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl)
   1472  1.1  mrg 	= target_attribute_cache[2];
   1473  1.1  mrg       return true;
   1474  1.1  mrg     }
   1475  1.1  mrg 
   1476  1.1  mrg   tree old_optimize = build_optimization_node (&global_options,
   1477  1.1  mrg 					       &global_options_set);
   1478  1.1  mrg 
   1479  1.1  mrg   /* Get the optimization options of the current function.  */
   1480  1.1  mrg   tree func_optimize = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl);
   1481  1.1  mrg 
   1482  1.1  mrg   if (!func_optimize)
   1483  1.1  mrg     func_optimize = old_optimize;
   1484  1.1  mrg 
   1485  1.1  mrg   /* Init func_options.  */
   1486  1.1  mrg   memset (&func_options, 0, sizeof (func_options));
   1487  1.1  mrg   init_options_struct (&func_options, NULL);
   1488  1.1  mrg   lang_hooks.init_options_struct (&func_options);
   1489  1.1  mrg   memset (&func_options_set, 0, sizeof (func_options_set));
   1490  1.1  mrg 
   1491  1.1  mrg   cl_optimization_restore (&func_options, &func_options_set,
   1492  1.1  mrg 			   TREE_OPTIMIZATION (func_optimize));
   1493  1.1  mrg 
   1494  1.1  mrg   /* Initialize func_options to the default before its target options can
   1495  1.1  mrg      be set.  */
   1496  1.1  mrg   tree old_target = DECL_FUNCTION_SPECIFIC_TARGET (fndecl);
   1497  1.1  mrg   if (old_target == NULL_TREE)
   1498  1.1  mrg     old_target = target_option_default_node;
   1499  1.1  mrg   cl_target_option_restore (&func_options, &func_options_set,
   1500  1.1  mrg 			    TREE_TARGET_OPTION (old_target));
   1501  1.1  mrg 
   1502  1.1  mrg   /* FLAGS == 1 is used for target_clones attribute.  */
   1503  1.1  mrg   new_target
   1504  1.1  mrg     = ix86_valid_target_attribute_tree (fndecl, args, &func_options,
   1505  1.1  mrg 					&func_options_set, flags == 1);
   1506  1.1  mrg 
   1507  1.1  mrg   new_optimize = build_optimization_node (&func_options, &func_options_set);
   1508  1.1  mrg 
   1509  1.1  mrg   if (new_target == error_mark_node)
   1510  1.1  mrg     ret = false;
   1511  1.1  mrg 
   1512  1.1  mrg   else if (new_target)
   1513  1.1  mrg     {
   1514  1.1  mrg       if (DECL_FUNCTION_SPECIFIC_TARGET (fndecl) == NULL_TREE
   1515  1.1  mrg 	  && DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl) == NULL_TREE)
   1516  1.1  mrg 	{
   1517  1.1  mrg 	  target_attribute_cache[0] = copy_list (args);
   1518  1.1  mrg 	  target_attribute_cache[1] = new_target;
   1519  1.1  mrg 	  target_attribute_cache[2]
   1520  1.1  mrg 	    = old_optimize != new_optimize ? new_optimize : NULL_TREE;
   1521  1.1  mrg 	}
   1522  1.1  mrg 
   1523  1.1  mrg       DECL_FUNCTION_SPECIFIC_TARGET (fndecl) = new_target;
   1524  1.1  mrg 
   1525  1.1  mrg       if (old_optimize != new_optimize)
   1526  1.1  mrg 	DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl) = new_optimize;
   1527  1.1  mrg     }
   1528  1.1  mrg 
   1529  1.1  mrg   return ret;
   1530  1.1  mrg }
   1531  1.1  mrg 
   1532  1.1  mrg const char *stringop_alg_names[] = {
   1533  1.1  mrg #define DEF_ALG(alg, name) #name,
   1534  1.1  mrg #include "stringop.def"
   1535  1.1  mrg #undef DEF_ALG
   1536  1.1  mrg };
   1537  1.1  mrg 
   1538  1.1  mrg /* Parse parameter string passed to -mmemcpy-strategy= or -mmemset-strategy=.
   1539  1.1  mrg    The string is of the following form (or comma separated list of it):
   1540  1.1  mrg 
   1541  1.1  mrg      strategy_alg:max_size:[align|noalign]
   1542  1.1  mrg 
   1543  1.1  mrg    where the full size range for the strategy is either [0, max_size] or
   1544  1.1  mrg    [min_size, max_size], in which min_size is the max_size + 1 of the
   1545  1.1  mrg    preceding range.  The last size range must have max_size == -1.
   1546  1.1  mrg 
   1547  1.1  mrg    Examples:
   1548  1.1  mrg 
   1549  1.1  mrg     1.
   1550  1.1  mrg        -mmemcpy-strategy=libcall:-1:noalign
   1551  1.1  mrg 
   1552  1.1  mrg       this is equivalent to (for known size memcpy) -mstringop-strategy=libcall
   1553  1.1  mrg 
   1554  1.1  mrg 
   1555  1.1  mrg    2.
   1556  1.1  mrg       -mmemset-strategy=rep_8byte:16:noalign,vector_loop:2048:align,libcall:-1:noalign
   1557  1.1  mrg 
   1558  1.1  mrg       This is to tell the compiler to use the following strategy for memset
   1559  1.1  mrg       1) when the expected size is between [1, 16], use rep_8byte strategy;
   1560  1.1  mrg       2) when the size is between [17, 2048], use vector_loop;
   1561  1.1  mrg       3) when the size is > 2048, use libcall.  */
   1562  1.1  mrg 
   1563  1.1  mrg struct stringop_size_range
   1564  1.1  mrg {
   1565  1.1  mrg   int max;
   1566  1.1  mrg   stringop_alg alg;
   1567  1.1  mrg   bool noalign;
   1568  1.1  mrg };
   1569  1.1  mrg 
   1570  1.1  mrg static void
   1571  1.1  mrg ix86_parse_stringop_strategy_string (char *strategy_str, bool is_memset)
   1572  1.1  mrg {
   1573  1.1  mrg   const struct stringop_algs *default_algs;
   1574  1.1  mrg   stringop_size_range input_ranges[MAX_STRINGOP_ALGS];
   1575  1.1  mrg   char *curr_range_str, *next_range_str;
   1576  1.1  mrg   const char *opt = is_memset ? "-mmemset_strategy=" : "-mmemcpy_strategy=";
   1577  1.1  mrg   int i = 0, n = 0;
   1578  1.1  mrg 
   1579  1.1  mrg   if (is_memset)
   1580  1.1  mrg     default_algs = &ix86_cost->memset[TARGET_64BIT != 0];
   1581  1.1  mrg   else
   1582  1.1  mrg     default_algs = &ix86_cost->memcpy[TARGET_64BIT != 0];
   1583  1.1  mrg 
   1584  1.1  mrg   curr_range_str = strategy_str;
   1585  1.1  mrg 
   1586  1.1  mrg   do
   1587  1.1  mrg     {
   1588  1.1  mrg       int maxs;
   1589  1.1  mrg       char alg_name[128];
   1590  1.1  mrg       char align[16];
   1591  1.1  mrg       next_range_str = strchr (curr_range_str, ',');
   1592  1.1  mrg       if (next_range_str)
   1593  1.1  mrg         *next_range_str++ = '\0';
   1594  1.1  mrg 
   1595  1.1  mrg       if (sscanf (curr_range_str, "%20[^:]:%d:%10s", alg_name, &maxs,
   1596  1.1  mrg 		  align) != 3)
   1597  1.1  mrg         {
   1598  1.1  mrg 	  error ("wrong argument %qs to option %qs", curr_range_str, opt);
   1599  1.1  mrg           return;
   1600  1.1  mrg         }
   1601  1.1  mrg 
   1602  1.1  mrg       if (n > 0 && (maxs < (input_ranges[n - 1].max + 1) && maxs != -1))
   1603  1.1  mrg         {
   1604  1.1  mrg 	  error ("size ranges of option %qs should be increasing", opt);
   1605  1.1  mrg           return;
   1606  1.1  mrg         }
   1607  1.1  mrg 
   1608  1.1  mrg       for (i = 0; i < last_alg; i++)
   1609  1.1  mrg 	if (!strcmp (alg_name, stringop_alg_names[i]))
   1610  1.1  mrg 	  break;
   1611  1.1  mrg 
   1612  1.1  mrg       if (i == last_alg)
   1613  1.1  mrg         {
   1614  1.1  mrg 	  error ("wrong strategy name %qs specified for option %qs",
   1615  1.1  mrg 		 alg_name, opt);
   1616  1.1  mrg 
   1617  1.1  mrg 	  auto_vec <const char *> candidates;
   1618  1.1  mrg 	  for (i = 0; i < last_alg; i++)
   1619  1.1  mrg 	    if ((stringop_alg) i != rep_prefix_8_byte || TARGET_64BIT)
   1620  1.1  mrg 	      candidates.safe_push (stringop_alg_names[i]);
   1621  1.1  mrg 
   1622  1.1  mrg 	  char *s;
   1623  1.1  mrg 	  const char *hint
   1624  1.1  mrg 	    = candidates_list_and_hint (alg_name, s, candidates);
   1625  1.1  mrg 	  if (hint)
   1626  1.1  mrg 	    inform (input_location,
   1627  1.1  mrg 		    "valid arguments to %qs are: %s; did you mean %qs?",
   1628  1.1  mrg 		    opt, s, hint);
   1629  1.1  mrg 	  else
   1630  1.1  mrg 	    inform (input_location, "valid arguments to %qs are: %s",
   1631  1.1  mrg 		    opt, s);
   1632  1.1  mrg 	  XDELETEVEC (s);
   1633  1.1  mrg           return;
   1634  1.1  mrg         }
   1635  1.1  mrg 
   1636  1.1  mrg       if ((stringop_alg) i == rep_prefix_8_byte
   1637  1.1  mrg 	  && !TARGET_64BIT)
   1638  1.1  mrg 	{
   1639  1.1  mrg 	  /* rep; movq isn't available in 32-bit code.  */
   1640  1.1  mrg 	  error ("strategy name %qs specified for option %qs "
   1641  1.1  mrg 		 "not supported for 32-bit code", alg_name, opt);
   1642  1.1  mrg 	  return;
   1643  1.1  mrg 	}
   1644  1.1  mrg 
   1645  1.1  mrg       input_ranges[n].max = maxs;
   1646  1.1  mrg       input_ranges[n].alg = (stringop_alg) i;
   1647  1.1  mrg       if (!strcmp (align, "align"))
   1648  1.1  mrg         input_ranges[n].noalign = false;
   1649  1.1  mrg       else if (!strcmp (align, "noalign"))
   1650  1.1  mrg         input_ranges[n].noalign = true;
   1651  1.1  mrg       else
   1652  1.1  mrg         {
   1653  1.1  mrg 	  error ("unknown alignment %qs specified for option %qs", align, opt);
   1654  1.1  mrg           return;
   1655  1.1  mrg         }
   1656  1.1  mrg       n++;
   1657  1.1  mrg       curr_range_str = next_range_str;
   1658  1.1  mrg     }
   1659  1.1  mrg   while (curr_range_str);
   1660  1.1  mrg 
   1661  1.1  mrg   if (input_ranges[n - 1].max != -1)
   1662  1.1  mrg     {
   1663  1.1  mrg       error ("the max value for the last size range should be -1"
   1664  1.1  mrg              " for option %qs", opt);
   1665  1.1  mrg       return;
   1666  1.1  mrg     }
   1667  1.1  mrg 
   1668  1.1  mrg   if (n > MAX_STRINGOP_ALGS)
   1669  1.1  mrg     {
   1670  1.1  mrg       error ("too many size ranges specified in option %qs", opt);
   1671  1.1  mrg       return;
   1672  1.1  mrg     }
   1673  1.1  mrg 
   1674  1.1  mrg   /* Now override the default algs array.  */
   1675  1.1  mrg   for (i = 0; i < n; i++)
   1676  1.1  mrg     {
   1677  1.1  mrg       *const_cast<int *>(&default_algs->size[i].max) = input_ranges[i].max;
   1678  1.1  mrg       *const_cast<stringop_alg *>(&default_algs->size[i].alg)
   1679  1.1  mrg           = input_ranges[i].alg;
   1680  1.1  mrg       *const_cast<int *>(&default_algs->size[i].noalign)
   1681  1.1  mrg           = input_ranges[i].noalign;
   1682  1.1  mrg     }
   1683  1.1  mrg }
   1684  1.1  mrg 
   1685  1.1  mrg 
   1686  1.1  mrg /* parse -mtune-ctrl= option. When DUMP is true,
   1688  1.1  mrg    print the features that are explicitly set.  */
   1689  1.1  mrg 
   1690  1.1  mrg static void
   1691  1.1  mrg parse_mtune_ctrl_str (struct gcc_options *opts, bool dump)
   1692  1.1  mrg {
   1693  1.1  mrg   if (!opts->x_ix86_tune_ctrl_string)
   1694  1.1  mrg     return;
   1695  1.1  mrg 
   1696  1.1  mrg   char *next_feature_string = NULL;
   1697  1.1  mrg   char *curr_feature_string = xstrdup (opts->x_ix86_tune_ctrl_string);
   1698  1.1  mrg   char *orig = curr_feature_string;
   1699  1.1  mrg   int i;
   1700  1.1  mrg   do
   1701  1.1  mrg     {
   1702  1.1  mrg       bool clear = false;
   1703  1.1  mrg 
   1704  1.1  mrg       next_feature_string = strchr (curr_feature_string, ',');
   1705  1.1  mrg       if (next_feature_string)
   1706  1.1  mrg         *next_feature_string++ = '\0';
   1707  1.1  mrg       if (*curr_feature_string == '^')
   1708  1.1  mrg         {
   1709  1.1  mrg           curr_feature_string++;
   1710  1.1  mrg           clear = true;
   1711  1.1  mrg         }
   1712  1.1  mrg 
   1713  1.1  mrg       if (!strcmp (curr_feature_string, "use_gather"))
   1714  1.1  mrg 	{
   1715  1.1  mrg 	  ix86_tune_features[X86_TUNE_USE_GATHER_2PARTS] = !clear;
   1716  1.1  mrg 	  ix86_tune_features[X86_TUNE_USE_GATHER_4PARTS] = !clear;
   1717  1.1  mrg 	  ix86_tune_features[X86_TUNE_USE_GATHER_8PARTS] = !clear;
   1718  1.1  mrg 	  if (dump)
   1719  1.1  mrg 	    fprintf (stderr, "Explicitly %s features use_gather_2parts,"
   1720  1.1  mrg 		     " use_gather_4parts, use_gather_8parts\n",
   1721  1.1  mrg 		     clear ? "clear" : "set");
   1722  1.1  mrg 
   1723  1.1  mrg 	}
   1724  1.1  mrg       else if (!strcmp (curr_feature_string, "use_scatter"))
   1725  1.1  mrg 	{
   1726  1.1  mrg 	  ix86_tune_features[X86_TUNE_USE_SCATTER_2PARTS] = !clear;
   1727  1.1  mrg 	  ix86_tune_features[X86_TUNE_USE_SCATTER_4PARTS] = !clear;
   1728  1.1  mrg 	  ix86_tune_features[X86_TUNE_USE_SCATTER_8PARTS] = !clear;
   1729  1.1  mrg 	  if (dump)
   1730  1.1  mrg 	    fprintf (stderr, "Explicitly %s features use_scatter_2parts,"
   1731  1.1  mrg 		     " use_scatter_4parts, use_scatter_8parts\n",
   1732  1.1  mrg 		     clear ? "clear" : "set");
   1733  1.1  mrg 	}
   1734  1.1  mrg       else
   1735  1.1  mrg 	{
   1736  1.1  mrg 	  for (i = 0; i < X86_TUNE_LAST; i++)
   1737  1.1  mrg 	    {
   1738  1.1  mrg 	      if (!strcmp (curr_feature_string, ix86_tune_feature_names[i]))
   1739  1.1  mrg 		{
   1740  1.1  mrg 		  ix86_tune_features[i] = !clear;
   1741  1.1  mrg 		  if (dump)
   1742  1.1  mrg 		    fprintf (stderr, "Explicitly %s feature %s\n",
   1743  1.1  mrg 			     clear ? "clear" : "set", ix86_tune_feature_names[i]);
   1744  1.1  mrg 		  break;
   1745  1.1  mrg 		}
   1746  1.1  mrg 	    }
   1747  1.1  mrg 
   1748  1.1  mrg 	  if (i == X86_TUNE_LAST)
   1749  1.1  mrg 	    error ("unknown parameter to option %<-mtune-ctrl%>: %s",
   1750  1.1  mrg 		   clear ? curr_feature_string - 1 : curr_feature_string);
   1751  1.1  mrg 	}
   1752  1.1  mrg       curr_feature_string = next_feature_string;
   1753  1.1  mrg     }
   1754  1.1  mrg   while (curr_feature_string);
   1755  1.1  mrg   free (orig);
   1756  1.1  mrg }
   1757  1.1  mrg 
   1758  1.1  mrg /* Helper function to set ix86_tune_features. IX86_TUNE is the
   1759  1.1  mrg    processor type.  */
   1760  1.1  mrg 
   1761  1.1  mrg static void
   1762  1.1  mrg set_ix86_tune_features (struct gcc_options *opts,
   1763  1.1  mrg 			enum processor_type ix86_tune, bool dump)
   1764  1.1  mrg {
   1765  1.1  mrg   unsigned HOST_WIDE_INT ix86_tune_mask = HOST_WIDE_INT_1U << ix86_tune;
   1766  1.1  mrg   int i;
   1767  1.1  mrg 
   1768  1.1  mrg   for (i = 0; i < X86_TUNE_LAST; ++i)
   1769  1.1  mrg     {
   1770  1.1  mrg       if (ix86_tune_no_default)
   1771  1.1  mrg         ix86_tune_features[i] = 0;
   1772  1.1  mrg       else
   1773  1.1  mrg 	ix86_tune_features[i]
   1774  1.1  mrg 	  = !!(initial_ix86_tune_features[i] & ix86_tune_mask);
   1775  1.1  mrg     }
   1776  1.1  mrg 
   1777  1.1  mrg   if (dump)
   1778  1.1  mrg     {
   1779  1.1  mrg       fprintf (stderr, "List of x86 specific tuning parameter names:\n");
   1780  1.1  mrg       for (i = 0; i < X86_TUNE_LAST; i++)
   1781  1.1  mrg         fprintf (stderr, "%s : %s\n", ix86_tune_feature_names[i],
   1782  1.1  mrg                  ix86_tune_features[i] ? "on" : "off");
   1783  1.1  mrg     }
   1784  1.1  mrg 
   1785  1.1  mrg   parse_mtune_ctrl_str (opts, dump);
   1786  1.1  mrg }
   1787  1.1  mrg 
   1788  1.1  mrg 
   1789  1.1  mrg /* Default align_* from the processor table.  */
   1790  1.1  mrg 
   1791  1.1  mrg static void
   1792  1.1  mrg ix86_default_align (struct gcc_options *opts)
   1793  1.1  mrg {
   1794  1.1  mrg   /* -falign-foo without argument: supply one.  */
   1795  1.1  mrg   if (opts->x_flag_align_loops && !opts->x_str_align_loops)
   1796  1.1  mrg     opts->x_str_align_loops = processor_cost_table[ix86_tune]->align_loop;
   1797  1.1  mrg   if (opts->x_flag_align_jumps && !opts->x_str_align_jumps)
   1798  1.1  mrg     opts->x_str_align_jumps = processor_cost_table[ix86_tune]->align_jump;
   1799  1.1  mrg   if (opts->x_flag_align_labels && !opts->x_str_align_labels)
   1800  1.1  mrg     opts->x_str_align_labels = processor_cost_table[ix86_tune]->align_label;
   1801  1.1  mrg   if (opts->x_flag_align_functions && !opts->x_str_align_functions)
   1802  1.1  mrg     opts->x_str_align_functions = processor_cost_table[ix86_tune]->align_func;
   1803  1.1  mrg }
   1804  1.1  mrg 
   1805  1.1  mrg #ifndef USE_IX86_FRAME_POINTER
   1806  1.1  mrg #define USE_IX86_FRAME_POINTER 0
   1807  1.1  mrg #endif
   1808  1.1  mrg 
   1809  1.1  mrg /* (Re)compute option overrides affected by optimization levels in
   1810  1.1  mrg    target-specific ways.  */
   1811  1.1  mrg 
   1812  1.1  mrg static void
   1813  1.1  mrg ix86_recompute_optlev_based_flags (struct gcc_options *opts,
   1814  1.1  mrg 				   struct gcc_options *opts_set)
   1815  1.1  mrg {
   1816  1.1  mrg   /* Set the default values for switches whose default depends on TARGET_64BIT
   1817  1.1  mrg      in case they weren't overwritten by command line options.  */
   1818  1.1  mrg   if (TARGET_64BIT_P (opts->x_ix86_isa_flags))
   1819  1.1  mrg     {
   1820  1.1  mrg       if (opts->x_optimize >= 1)
   1821  1.1  mrg 	SET_OPTION_IF_UNSET (opts, opts_set, flag_omit_frame_pointer,
   1822  1.1  mrg 			     !USE_IX86_FRAME_POINTER);
   1823  1.1  mrg       if (opts->x_flag_asynchronous_unwind_tables
   1824  1.1  mrg 	  && TARGET_64BIT_MS_ABI)
   1825  1.1  mrg 	SET_OPTION_IF_UNSET (opts, opts_set, flag_unwind_tables, 1);
   1826  1.1  mrg       if (opts->x_flag_asynchronous_unwind_tables == 2)
   1827  1.1  mrg 	opts->x_flag_unwind_tables
   1828  1.1  mrg 	  = opts->x_flag_asynchronous_unwind_tables = 1;
   1829  1.1  mrg       if (opts->x_flag_pcc_struct_return == 2)
   1830  1.1  mrg 	opts->x_flag_pcc_struct_return = 0;
   1831  1.1  mrg     }
   1832  1.1  mrg   else
   1833  1.1  mrg     {
   1834  1.1  mrg       if (opts->x_optimize >= 1)
   1835  1.1  mrg 	  SET_OPTION_IF_UNSET (opts, opts_set, flag_omit_frame_pointer,
   1836  1.1  mrg 			       !(USE_IX86_FRAME_POINTER || opts->x_optimize_size));
   1837  1.1  mrg       if (opts->x_flag_asynchronous_unwind_tables == 2)
   1838  1.1  mrg 	opts->x_flag_asynchronous_unwind_tables = !USE_IX86_FRAME_POINTER;
   1839  1.1  mrg       if (opts->x_flag_pcc_struct_return == 2)
   1840  1.1  mrg 	{
   1841  1.1  mrg 	  /* Intel MCU psABI specifies that -freg-struct-return should
   1842  1.1  mrg 	     be on.  Instead of setting DEFAULT_PCC_STRUCT_RETURN to 0,
   1843  1.1  mrg 	     we check -miamcu so that -freg-struct-return is always
   1844  1.1  mrg 	     turned on if -miamcu is used.  */
   1845  1.1  mrg 	  if (TARGET_IAMCU_P (opts->x_target_flags))
   1846  1.1  mrg 	    opts->x_flag_pcc_struct_return = 0;
   1847  1.1  mrg 	  else
   1848  1.1  mrg 	    opts->x_flag_pcc_struct_return = DEFAULT_PCC_STRUCT_RETURN;
   1849  1.1  mrg 	}
   1850  1.1  mrg     }
   1851  1.1  mrg }
   1852  1.1  mrg 
   1853  1.1  mrg /* Implement TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE hook.  */
   1854  1.1  mrg 
   1855  1.1  mrg void
   1856  1.1  mrg ix86_override_options_after_change (void)
   1857  1.1  mrg {
   1858  1.1  mrg   ix86_default_align (&global_options);
   1859  1.1  mrg   ix86_recompute_optlev_based_flags (&global_options, &global_options_set);
   1860  1.1  mrg }
   1861  1.1  mrg 
   1862  1.1  mrg /* Clear stack slot assignments remembered from previous functions.
   1863  1.1  mrg    This is called from INIT_EXPANDERS once before RTL is emitted for each
   1864  1.1  mrg    function.  */
   1865  1.1  mrg 
   1866  1.1  mrg static struct machine_function *
   1867  1.1  mrg ix86_init_machine_status (void)
   1868  1.1  mrg {
   1869  1.1  mrg   struct machine_function *f;
   1870  1.1  mrg 
   1871  1.1  mrg   f = ggc_cleared_alloc<machine_function> ();
   1872  1.1  mrg   f->call_abi = ix86_abi;
   1873  1.1  mrg   f->stack_frame_required = true;
   1874  1.1  mrg   f->silent_p = true;
   1875  1.1  mrg 
   1876  1.1  mrg   return f;
   1877  1.1  mrg }
   1878  1.1  mrg 
   1879  1.1  mrg /* Override various settings based on options.  If MAIN_ARGS_P, the
   1880  1.1  mrg    options are from the command line, otherwise they are from
   1881  1.1  mrg    attributes.  Return true if there's an error related to march
   1882  1.1  mrg    option.  */
   1883  1.1  mrg 
   1884  1.1  mrg static bool
   1885  1.1  mrg ix86_option_override_internal (bool main_args_p,
   1886  1.1  mrg 			       struct gcc_options *opts,
   1887  1.1  mrg 			       struct gcc_options *opts_set)
   1888  1.1  mrg {
   1889  1.1  mrg   unsigned int i;
   1890  1.1  mrg   unsigned HOST_WIDE_INT ix86_arch_mask;
   1891  1.1  mrg   const bool ix86_tune_specified = (opts->x_ix86_tune_string != NULL);
   1892  1.1  mrg 
   1893  1.1  mrg   /* -mrecip options.  */
   1894  1.1  mrg   static struct
   1895  1.1  mrg     {
   1896  1.1  mrg       const char *string;           /* option name */
   1897  1.1  mrg       unsigned int mask;            /* mask bits to set */
   1898  1.1  mrg     }
   1899  1.1  mrg   const recip_options[] =
   1900  1.1  mrg     {
   1901  1.1  mrg       { "all",       RECIP_MASK_ALL },
   1902  1.1  mrg       { "none",      RECIP_MASK_NONE },
   1903  1.1  mrg       { "div",       RECIP_MASK_DIV },
   1904  1.1  mrg       { "sqrt",      RECIP_MASK_SQRT },
   1905  1.1  mrg       { "vec-div",   RECIP_MASK_VEC_DIV },
   1906  1.1  mrg       { "vec-sqrt",  RECIP_MASK_VEC_SQRT },
   1907  1.1  mrg     };
   1908  1.1  mrg 
   1909  1.1  mrg 
   1910  1.1  mrg   /* Turn off both OPTION_MASK_ABI_64 and OPTION_MASK_ABI_X32 if
   1911  1.1  mrg      TARGET_64BIT_DEFAULT is true and TARGET_64BIT is false.  */
   1912  1.1  mrg   if (TARGET_64BIT_DEFAULT && !TARGET_64BIT_P (opts->x_ix86_isa_flags))
   1913  1.1  mrg     opts->x_ix86_isa_flags &= ~(OPTION_MASK_ABI_64 | OPTION_MASK_ABI_X32);
   1914  1.1  mrg #ifdef TARGET_BI_ARCH
   1915  1.1  mrg   else
   1916  1.1  mrg     {
   1917  1.1  mrg #if TARGET_BI_ARCH == 1
   1918  1.1  mrg       /* When TARGET_BI_ARCH == 1, by default, OPTION_MASK_ABI_64
   1919  1.1  mrg 	 is on and OPTION_MASK_ABI_X32 is off.  We turn off
   1920  1.1  mrg 	 OPTION_MASK_ABI_64 if OPTION_MASK_ABI_X32 is turned on by
   1921  1.1  mrg 	 -mx32.  */
   1922  1.1  mrg       if (TARGET_X32_P (opts->x_ix86_isa_flags))
   1923  1.1  mrg 	opts->x_ix86_isa_flags &= ~OPTION_MASK_ABI_64;
   1924  1.1  mrg #else
   1925  1.1  mrg       /* When TARGET_BI_ARCH == 2, by default, OPTION_MASK_ABI_X32 is
   1926  1.1  mrg 	 on and OPTION_MASK_ABI_64 is off.  We turn off
   1927  1.1  mrg 	 OPTION_MASK_ABI_X32 if OPTION_MASK_ABI_64 is turned on by
   1928  1.1  mrg 	 -m64 or OPTION_MASK_CODE16 is turned on by -m16.  */
   1929  1.1  mrg       if (TARGET_LP64_P (opts->x_ix86_isa_flags)
   1930  1.1  mrg 	  || TARGET_16BIT_P (opts->x_ix86_isa_flags))
   1931  1.1  mrg 	opts->x_ix86_isa_flags &= ~OPTION_MASK_ABI_X32;
   1932  1.1  mrg #endif
   1933  1.1  mrg       if (TARGET_64BIT_P (opts->x_ix86_isa_flags)
   1934  1.1  mrg 	  && TARGET_IAMCU_P (opts->x_target_flags))
   1935  1.1  mrg 	sorry ("Intel MCU psABI isn%'t supported in %s mode",
   1936  1.1  mrg 	       TARGET_X32_P (opts->x_ix86_isa_flags) ? "x32" : "64-bit");
   1937  1.1  mrg     }
   1938  1.1  mrg #endif
   1939  1.1  mrg 
   1940  1.1  mrg   if (TARGET_X32_P (opts->x_ix86_isa_flags))
   1941  1.1  mrg     {
   1942  1.1  mrg       /* Always turn on OPTION_MASK_ISA_64BIT and turn off
   1943  1.1  mrg 	 OPTION_MASK_ABI_64 for TARGET_X32.  */
   1944  1.1  mrg       opts->x_ix86_isa_flags |= OPTION_MASK_ISA_64BIT;
   1945  1.1  mrg       opts->x_ix86_isa_flags &= ~OPTION_MASK_ABI_64;
   1946  1.1  mrg     }
   1947  1.1  mrg   else if (TARGET_16BIT_P (opts->x_ix86_isa_flags))
   1948  1.1  mrg     opts->x_ix86_isa_flags &= ~(OPTION_MASK_ISA_64BIT
   1949  1.1  mrg 				| OPTION_MASK_ABI_X32
   1950  1.1  mrg 				| OPTION_MASK_ABI_64);
   1951  1.1  mrg   else if (TARGET_LP64_P (opts->x_ix86_isa_flags))
   1952  1.1  mrg     {
   1953  1.1  mrg       /* Always turn on OPTION_MASK_ISA_64BIT and turn off
   1954  1.1  mrg 	 OPTION_MASK_ABI_X32 for TARGET_LP64.  */
   1955  1.1  mrg       opts->x_ix86_isa_flags |= OPTION_MASK_ISA_64BIT;
   1956  1.1  mrg       opts->x_ix86_isa_flags &= ~OPTION_MASK_ABI_X32;
   1957  1.1  mrg     }
   1958  1.1  mrg 
   1959  1.1  mrg #ifdef SUBTARGET_OVERRIDE_OPTIONS
   1960  1.1  mrg   SUBTARGET_OVERRIDE_OPTIONS;
   1961  1.1  mrg #endif
   1962  1.1  mrg 
   1963  1.1  mrg #ifdef SUBSUBTARGET_OVERRIDE_OPTIONS
   1964  1.1  mrg   SUBSUBTARGET_OVERRIDE_OPTIONS;
   1965  1.1  mrg #endif
   1966  1.1  mrg 
   1967  1.1  mrg #ifdef HAVE_LD_BROKEN_PE_DWARF5
   1968  1.1  mrg   /* If the PE linker has broken DWARF 5 support, make
   1969  1.1  mrg      DWARF 4 the default.  */
   1970  1.1  mrg   if (TARGET_PECOFF)
   1971  1.1  mrg     SET_OPTION_IF_UNSET (opts, opts_set, dwarf_version, 4);
   1972  1.1  mrg #endif
   1973  1.1  mrg 
   1974  1.1  mrg   /* -fPIC is the default for x86_64.  */
   1975  1.1  mrg   if (TARGET_MACHO && TARGET_64BIT_P (opts->x_ix86_isa_flags))
   1976  1.1  mrg     opts->x_flag_pic = 2;
   1977  1.1  mrg 
   1978  1.1  mrg   /* Need to check -mtune=generic first.  */
   1979  1.1  mrg   if (opts->x_ix86_tune_string)
   1980  1.1  mrg     {
   1981  1.1  mrg       /* As special support for cross compilers we read -mtune=native
   1982  1.1  mrg 	     as -mtune=generic.  With native compilers we won't see the
   1983  1.1  mrg 	     -mtune=native, as it was changed by the driver.  */
   1984  1.1  mrg       if (!strcmp (opts->x_ix86_tune_string, "native"))
   1985  1.1  mrg 	opts->x_ix86_tune_string = "generic";
   1986  1.1  mrg       else if (!strcmp (opts->x_ix86_tune_string, "x86-64"))
   1987  1.1  mrg         warning (OPT_Wdeprecated,
   1988  1.1  mrg 		 main_args_p
   1989  1.1  mrg 		 ? G_("%<-mtune=x86-64%> is deprecated; use %<-mtune=k8%> "
   1990  1.1  mrg 		      "or %<-mtune=generic%> instead as appropriate")
   1991  1.1  mrg 		 : G_("%<target(\"tune=x86-64\")%> is deprecated; use "
   1992  1.1  mrg 		      "%<target(\"tune=k8\")%> or %<target(\"tune=generic\")%>"
   1993  1.1  mrg 		      " instead as appropriate"));
   1994  1.1  mrg     }
   1995  1.1  mrg   else
   1996  1.1  mrg     {
   1997  1.1  mrg       if (opts->x_ix86_arch_string)
   1998  1.1  mrg 	opts->x_ix86_tune_string = opts->x_ix86_arch_string;
   1999  1.1  mrg       if (!opts->x_ix86_tune_string)
   2000  1.1  mrg 	{
   2001  1.1  mrg 	  opts->x_ix86_tune_string = processor_names[TARGET_CPU_DEFAULT];
   2002  1.1  mrg 	  ix86_tune_defaulted = 1;
   2003  1.1  mrg 	}
   2004  1.1  mrg 
   2005  1.1  mrg       /* opts->x_ix86_tune_string is set to opts->x_ix86_arch_string
   2006  1.1  mrg 	 or defaulted.  We need to use a sensible tune option.  */
   2007  1.1  mrg       if (startswith (opts->x_ix86_tune_string, "x86-64")
   2008  1.1  mrg 	  && (opts->x_ix86_tune_string[6] == '\0'
   2009  1.1  mrg 	      || (!strcmp (opts->x_ix86_tune_string + 6, "-v2")
   2010  1.1  mrg 		  || !strcmp (opts->x_ix86_tune_string + 6, "-v3")
   2011  1.1  mrg 		  || !strcmp (opts->x_ix86_tune_string + 6, "-v4"))))
   2012  1.1  mrg 	opts->x_ix86_tune_string = "generic";
   2013  1.1  mrg     }
   2014  1.1  mrg 
   2015  1.1  mrg   if (opts->x_ix86_stringop_alg == rep_prefix_8_byte
   2016  1.1  mrg       && !TARGET_64BIT_P (opts->x_ix86_isa_flags))
   2017  1.1  mrg     {
   2018  1.1  mrg       /* rep; movq isn't available in 32-bit code.  */
   2019  1.1  mrg       error ("%<-mstringop-strategy=rep_8byte%> not supported for 32-bit code");
   2020  1.1  mrg       opts->x_ix86_stringop_alg = no_stringop;
   2021  1.1  mrg     }
   2022  1.1  mrg 
   2023  1.1  mrg   if (TARGET_UINTR && !TARGET_64BIT)
   2024  1.1  mrg     error ("%<-muintr%> not supported for 32-bit code");
   2025  1.1  mrg 
   2026  1.1  mrg   if (!opts->x_ix86_arch_string)
   2027  1.1  mrg     opts->x_ix86_arch_string
   2028  1.1  mrg       = TARGET_64BIT_P (opts->x_ix86_isa_flags)
   2029  1.1  mrg 	? "x86-64" : SUBTARGET32_DEFAULT_CPU;
   2030  1.1  mrg   else
   2031  1.1  mrg     ix86_arch_specified = 1;
   2032  1.1  mrg 
   2033  1.1  mrg   if (opts_set->x_ix86_pmode)
   2034  1.1  mrg     {
   2035  1.1  mrg       if ((TARGET_LP64_P (opts->x_ix86_isa_flags)
   2036  1.1  mrg 	   && opts->x_ix86_pmode == PMODE_SI)
   2037  1.1  mrg 	  || (!TARGET_64BIT_P (opts->x_ix86_isa_flags)
   2038  1.1  mrg 	       && opts->x_ix86_pmode == PMODE_DI))
   2039  1.1  mrg 	error ("address mode %qs not supported in the %s bit mode",
   2040  1.1  mrg 	       TARGET_64BIT_P (opts->x_ix86_isa_flags) ? "short" : "long",
   2041  1.1  mrg 	       TARGET_64BIT_P (opts->x_ix86_isa_flags) ? "64" : "32");
   2042  1.1  mrg     }
   2043  1.1  mrg   else
   2044  1.1  mrg     opts->x_ix86_pmode = TARGET_LP64_P (opts->x_ix86_isa_flags)
   2045  1.1  mrg 			 ? PMODE_DI : PMODE_SI;
   2046  1.1  mrg 
   2047  1.1  mrg   SET_OPTION_IF_UNSET (opts, opts_set, ix86_abi, DEFAULT_ABI);
   2048  1.1  mrg 
   2049  1.1  mrg   if (opts->x_ix86_abi == MS_ABI && TARGET_X32_P (opts->x_ix86_isa_flags))
   2050  1.1  mrg     error ("%<-mabi=ms%> not supported with X32 ABI");
   2051  1.1  mrg   gcc_assert (opts->x_ix86_abi == SYSV_ABI || opts->x_ix86_abi == MS_ABI);
   2052  1.1  mrg 
   2053  1.1  mrg   const char *abi_name = opts->x_ix86_abi == MS_ABI ? "ms" : "sysv";
   2054  1.1  mrg   if ((opts->x_flag_sanitize & SANITIZE_USER_ADDRESS)
   2055  1.1  mrg       && opts->x_ix86_abi != DEFAULT_ABI)
   2056  1.1  mrg     error ("%<-mabi=%s%> not supported with %<-fsanitize=address%>", abi_name);
   2057  1.1  mrg   if ((opts->x_flag_sanitize & SANITIZE_KERNEL_ADDRESS)
   2058  1.1  mrg       && opts->x_ix86_abi != DEFAULT_ABI)
   2059  1.1  mrg     error ("%<-mabi=%s%> not supported with %<-fsanitize=kernel-address%>",
   2060  1.1  mrg 	   abi_name);
   2061  1.1  mrg   if ((opts->x_flag_sanitize & SANITIZE_THREAD)
   2062  1.1  mrg       && opts->x_ix86_abi != DEFAULT_ABI)
   2063  1.1  mrg     error ("%<-mabi=%s%> not supported with %<-fsanitize=thread%>", abi_name);
   2064  1.1  mrg 
   2065  1.1  mrg   /* For targets using ms ABI enable ms-extensions, if not
   2066  1.1  mrg      explicit turned off.  For non-ms ABI we turn off this
   2067  1.1  mrg      option.  */
   2068  1.1  mrg   SET_OPTION_IF_UNSET (opts, opts_set, flag_ms_extensions,
   2069  1.1  mrg 		       (MS_ABI == DEFAULT_ABI));
   2070  1.1  mrg 
   2071  1.1  mrg   if (opts_set->x_ix86_cmodel)
   2072  1.1  mrg     {
   2073  1.1  mrg       switch (opts->x_ix86_cmodel)
   2074  1.1  mrg 	{
   2075  1.1  mrg 	case CM_SMALL:
   2076  1.1  mrg 	case CM_SMALL_PIC:
   2077  1.1  mrg 	  if (opts->x_flag_pic)
   2078  1.1  mrg 	    opts->x_ix86_cmodel = CM_SMALL_PIC;
   2079  1.1  mrg 	  if (!TARGET_64BIT_P (opts->x_ix86_isa_flags))
   2080  1.1  mrg 	    error ("code model %qs not supported in the %s bit mode",
   2081  1.1  mrg 		   "small", "32");
   2082  1.1  mrg 	  break;
   2083  1.1  mrg 
   2084  1.1  mrg 	case CM_MEDIUM:
   2085  1.1  mrg 	case CM_MEDIUM_PIC:
   2086  1.1  mrg 	  if (opts->x_flag_pic)
   2087  1.1  mrg 	    opts->x_ix86_cmodel = CM_MEDIUM_PIC;
   2088  1.1  mrg 	  if (!TARGET_64BIT_P (opts->x_ix86_isa_flags))
   2089  1.1  mrg 	    error ("code model %qs not supported in the %s bit mode",
   2090  1.1  mrg 		   "medium", "32");
   2091  1.1  mrg 	  else if (TARGET_X32_P (opts->x_ix86_isa_flags))
   2092  1.1  mrg 	    error ("code model %qs not supported in x32 mode",
   2093  1.1  mrg 		   "medium");
   2094  1.1  mrg 	  break;
   2095  1.1  mrg 
   2096  1.1  mrg 	case CM_LARGE:
   2097  1.1  mrg 	case CM_LARGE_PIC:
   2098  1.1  mrg 	  if (opts->x_flag_pic)
   2099  1.1  mrg 	    opts->x_ix86_cmodel = CM_LARGE_PIC;
   2100  1.1  mrg 	  if (!TARGET_64BIT_P (opts->x_ix86_isa_flags))
   2101  1.1  mrg 	    error ("code model %qs not supported in the %s bit mode",
   2102  1.1  mrg 		   "large", "32");
   2103  1.1  mrg 	  else if (TARGET_X32_P (opts->x_ix86_isa_flags))
   2104  1.1  mrg 	    error ("code model %qs not supported in x32 mode",
   2105  1.1  mrg 		   "large");
   2106  1.1  mrg 	  break;
   2107  1.1  mrg 
   2108  1.1  mrg 	case CM_32:
   2109  1.1  mrg 	  if (opts->x_flag_pic)
   2110  1.1  mrg 	    error ("code model %s does not support PIC mode", "32");
   2111  1.1  mrg 	  if (TARGET_64BIT_P (opts->x_ix86_isa_flags))
   2112  1.1  mrg 	    error ("code model %qs not supported in the %s bit mode",
   2113  1.1  mrg 		   "32", "64");
   2114  1.1  mrg 	  break;
   2115  1.1  mrg 
   2116  1.1  mrg 	case CM_KERNEL:
   2117  1.1  mrg 	  if (opts->x_flag_pic)
   2118  1.1  mrg 	    {
   2119  1.1  mrg 	      error ("code model %s does not support PIC mode", "kernel");
   2120  1.1  mrg 	      opts->x_ix86_cmodel = CM_32;
   2121  1.1  mrg 	    }
   2122  1.1  mrg 	  if (!TARGET_64BIT_P (opts->x_ix86_isa_flags))
   2123  1.1  mrg 	    error ("code model %qs not supported in the %s bit mode",
   2124  1.1  mrg 		   "kernel", "32");
   2125  1.1  mrg 	  break;
   2126  1.1  mrg 
   2127  1.1  mrg 	default:
   2128  1.1  mrg 	  gcc_unreachable ();
   2129  1.1  mrg 	}
   2130  1.1  mrg     }
   2131  1.1  mrg   else
   2132  1.1  mrg     {
   2133  1.1  mrg       /* For TARGET_64BIT and MS_ABI, force pic on, in order to enable the
   2134  1.1  mrg 	 use of rip-relative addressing.  This eliminates fixups that
   2135  1.1  mrg 	 would otherwise be needed if this object is to be placed in a
   2136  1.1  mrg 	 DLL, and is essentially just as efficient as direct addressing.  */
   2137  1.1  mrg       if (TARGET_64BIT_P (opts->x_ix86_isa_flags)
   2138  1.1  mrg 	  && (TARGET_RDOS || TARGET_PECOFF))
   2139  1.1  mrg 	opts->x_ix86_cmodel = CM_MEDIUM_PIC, opts->x_flag_pic = 1;
   2140  1.1  mrg       else if (TARGET_64BIT_P (opts->x_ix86_isa_flags))
   2141  1.1  mrg 	opts->x_ix86_cmodel = opts->x_flag_pic ? CM_SMALL_PIC : CM_SMALL;
   2142  1.1  mrg       else
   2143  1.1  mrg 	opts->x_ix86_cmodel = CM_32;
   2144  1.1  mrg     }
   2145  1.1  mrg   if (TARGET_MACHO && opts->x_ix86_asm_dialect == ASM_INTEL)
   2146  1.1  mrg     {
   2147  1.1  mrg       error ("%<-masm=intel%> not supported in this configuration");
   2148  1.1  mrg       opts->x_ix86_asm_dialect = ASM_ATT;
   2149  1.1  mrg     }
   2150  1.1  mrg   if ((TARGET_64BIT_P (opts->x_ix86_isa_flags) != 0)
   2151  1.1  mrg       != ((opts->x_ix86_isa_flags & OPTION_MASK_ISA_64BIT) != 0))
   2152  1.1  mrg     sorry ("%i-bit mode not compiled in",
   2153  1.1  mrg 	   (opts->x_ix86_isa_flags & OPTION_MASK_ISA_64BIT) ? 64 : 32);
   2154  1.1  mrg 
   2155  1.1  mrg   /* Last processor_alias_table must point to "generic" entry.  */
   2156  1.1  mrg   gcc_checking_assert (strcmp (processor_alias_table[pta_size - 1].name,
   2157  1.1  mrg 			       "generic") == 0);
   2158  1.1  mrg   for (i = 0; i < pta_size; i++)
   2159  1.1  mrg     if (! strcmp (opts->x_ix86_arch_string, processor_alias_table[i].name))
   2160  1.1  mrg       {
   2161  1.1  mrg 	if (!strcmp (opts->x_ix86_arch_string, "generic"))
   2162  1.1  mrg 	  {
   2163  1.1  mrg 	    error (main_args_p
   2164  1.1  mrg 		   ? G_("%<generic%> CPU can be used only for %<-mtune=%> "
   2165  1.1  mrg 			"switch")
   2166  1.1  mrg 		   : G_("%<generic%> CPU can be used only for "
   2167  1.1  mrg 			"%<target(\"tune=\")%> attribute"));
   2168  1.1  mrg 	    return false;
   2169  1.1  mrg 	  }
   2170  1.1  mrg 	else if (!strcmp (opts->x_ix86_arch_string, "intel"))
   2171  1.1  mrg 	  {
   2172  1.1  mrg 	    error (main_args_p
   2173  1.1  mrg 		   ? G_("%<intel%> CPU can be used only for %<-mtune=%> "
   2174  1.1  mrg 			"switch")
   2175  1.1  mrg 		   : G_("%<intel%> CPU can be used only for "
   2176  1.1  mrg 			"%<target(\"tune=\")%> attribute"));
   2177  1.1  mrg 	    return false;
   2178  1.1  mrg 	  }
   2179  1.1  mrg 
   2180  1.1  mrg 	if (TARGET_64BIT_P (opts->x_ix86_isa_flags)
   2181  1.1  mrg 	    && !((processor_alias_table[i].flags & PTA_64BIT) != 0))
   2182  1.1  mrg 	  {
   2183  1.1  mrg 	    error ("CPU you selected does not support x86-64 "
   2184  1.1  mrg 		   "instruction set");
   2185  1.1  mrg 	    return false;
   2186  1.1  mrg 	  }
   2187  1.1  mrg 
   2188  1.1  mrg 	ix86_schedule = processor_alias_table[i].schedule;
   2189  1.1  mrg 	ix86_arch = processor_alias_table[i].processor;
   2190  1.1  mrg 
   2191  1.1  mrg 	/* Default cpu tuning to the architecture, unless the table
   2192  1.1  mrg 	   entry requests not to do this.  Used by the x86-64 psABI
   2193  1.1  mrg 	   micro-architecture levels.  */
   2194  1.1  mrg 	if ((processor_alias_table[i].flags & PTA_NO_TUNE) == 0)
   2195  1.1  mrg 	  ix86_tune = ix86_arch;
   2196  1.1  mrg 	else
   2197  1.1  mrg 	  ix86_tune = PROCESSOR_GENERIC;
   2198  1.1  mrg 
   2199  1.1  mrg 	/* Enable PTA flags that are enabled by default by a -march option.  */
   2200  1.1  mrg #define TARGET_EXPLICIT_NO_SAHF_P(opts) (false)
   2201  1.1  mrg #define SET_TARGET_NO_SAHF(opts) {}
   2202  1.1  mrg #define TARGET_EXPLICIT_PREFETCH_SSE_P(opts) (false)
   2203  1.1  mrg #define SET_TARGET_PREFETCH_SSE(opts) {}
   2204  1.1  mrg #define TARGET_EXPLICIT_NO_TUNE_P(opts) (false)
   2205  1.1  mrg #define SET_TARGET_NO_TUNE(opts) {}
   2206  1.1  mrg #define TARGET_EXPLICIT_NO_80387_P(opts) (false)
   2207  1.1  mrg #define SET_TARGET_NO_80387(opts) {}
   2208  1.1  mrg 
   2209  1.1  mrg #define DEF_PTA(NAME) \
   2210  1.1  mrg 	if (((processor_alias_table[i].flags & PTA_ ## NAME) != 0) \
   2211  1.1  mrg 	    && PTA_ ## NAME != PTA_64BIT \
   2212  1.1  mrg 	    && (TARGET_64BIT || PTA_ ## NAME != PTA_UINTR) \
   2213  1.1  mrg 	    && !TARGET_EXPLICIT_ ## NAME ## _P (opts)) \
   2214  1.1  mrg 	  SET_TARGET_ ## NAME (opts);
   2215  1.1  mrg #include "i386-isa.def"
   2216  1.1  mrg #undef DEF_PTA
   2217  1.1  mrg 
   2218  1.1  mrg 
   2219  1.1  mrg        if (!(TARGET_64BIT_P (opts->x_ix86_isa_flags)
   2220  1.1  mrg 	     && ((processor_alias_table[i].flags & PTA_NO_SAHF) != 0))
   2221  1.1  mrg 	   && !TARGET_EXPLICIT_SAHF_P (opts))
   2222  1.1  mrg 	    SET_TARGET_SAHF (opts);
   2223  1.1  mrg 
   2224  1.1  mrg 	if (((processor_alias_table[i].flags & PTA_ABM) != 0)
   2225  1.1  mrg 	    && !TARGET_EXPLICIT_ABM_P (opts))
   2226  1.1  mrg 	  {
   2227  1.1  mrg 	    if (!TARGET_EXPLICIT_LZCNT_P (opts))
   2228  1.1  mrg 	      SET_TARGET_LZCNT (opts);
   2229  1.1  mrg 	    if (!TARGET_EXPLICIT_POPCNT_P (opts))
   2230  1.1  mrg 	      SET_TARGET_POPCNT (opts);
   2231  1.1  mrg 	  }
   2232  1.1  mrg 
   2233  1.1  mrg 	if ((processor_alias_table[i].flags
   2234  1.1  mrg 	   & (PTA_PREFETCH_SSE | PTA_SSE)) != 0)
   2235  1.1  mrg 	  ix86_prefetch_sse = true;
   2236  1.1  mrg 
   2237  1.1  mrg 	/* Don't enable x87 instructions if only general registers are
   2238  1.1  mrg 	   allowed by target("general-regs-only") function attribute or
   2239  1.1  mrg 	   -mgeneral-regs-only.  */
   2240  1.1  mrg 	if (!(opts->x_ix86_target_flags & OPTION_MASK_GENERAL_REGS_ONLY)
   2241  1.1  mrg 	    && !(opts_set->x_target_flags & MASK_80387))
   2242  1.1  mrg 	  {
   2243  1.1  mrg 	    if (((processor_alias_table[i].flags & PTA_NO_80387) != 0))
   2244  1.1  mrg 	      opts->x_target_flags &= ~MASK_80387;
   2245  1.1  mrg 	    else
   2246  1.1  mrg 	      opts->x_target_flags |= MASK_80387;
   2247  1.1  mrg 	  }
   2248  1.1  mrg 	break;
   2249  1.1  mrg       }
   2250  1.1  mrg 
   2251  1.1  mrg   if (i == pta_size)
   2252  1.1  mrg     {
   2253  1.1  mrg       error (main_args_p
   2254  1.1  mrg 	     ? G_("bad value %qs for %<-march=%> switch")
   2255  1.1  mrg 	     : G_("bad value %qs for %<target(\"arch=\")%> attribute"),
   2256  1.1  mrg 	     opts->x_ix86_arch_string);
   2257  1.1  mrg 
   2258  1.1  mrg       auto_vec <const char *> candidates;
   2259  1.1  mrg       for (i = 0; i < pta_size; i++)
   2260  1.1  mrg 	if (strcmp (processor_alias_table[i].name, "generic")
   2261  1.1  mrg 	    && strcmp (processor_alias_table[i].name, "intel")
   2262  1.1  mrg 	    && (!TARGET_64BIT_P (opts->x_ix86_isa_flags)
   2263  1.1  mrg 		|| ((processor_alias_table[i].flags & PTA_64BIT) != 0)))
   2264  1.1  mrg 	  candidates.safe_push (processor_alias_table[i].name);
   2265  1.1  mrg 
   2266  1.1  mrg #ifdef HAVE_LOCAL_CPU_DETECT
   2267  1.1  mrg       /* Add also "native" as possible value.  */
   2268  1.1  mrg       candidates.safe_push ("native");
   2269  1.1  mrg #endif
   2270  1.1  mrg 
   2271  1.1  mrg       char *s;
   2272  1.1  mrg       const char *hint
   2273  1.1  mrg 	= candidates_list_and_hint (opts->x_ix86_arch_string, s, candidates);
   2274  1.1  mrg       if (hint)
   2275  1.1  mrg 	inform (input_location,
   2276  1.1  mrg 		main_args_p
   2277  1.1  mrg 		? G_("valid arguments to %<-march=%> switch are: "
   2278  1.1  mrg 		     "%s; did you mean %qs?")
   2279  1.1  mrg 		: G_("valid arguments to %<target(\"arch=\")%> attribute are: "
   2280  1.1  mrg 		     "%s; did you mean %qs?"), s, hint);
   2281  1.1  mrg       else
   2282  1.1  mrg 	inform (input_location,
   2283  1.1  mrg 		main_args_p
   2284  1.1  mrg 		? G_("valid arguments to %<-march=%> switch are: %s")
   2285  1.1  mrg 		: G_("valid arguments to %<target(\"arch=\")%> attribute "
   2286  1.1  mrg 		     "are: %s"), s);
   2287  1.1  mrg       XDELETEVEC (s);
   2288  1.1  mrg     }
   2289  1.1  mrg 
   2290  1.1  mrg   ix86_arch_mask = HOST_WIDE_INT_1U << ix86_arch;
   2291  1.1  mrg   for (i = 0; i < X86_ARCH_LAST; ++i)
   2292  1.1  mrg     ix86_arch_features[i] = !!(initial_ix86_arch_features[i] & ix86_arch_mask);
   2293  1.1  mrg 
   2294  1.1  mrg   for (i = 0; i < pta_size; i++)
   2295  1.1  mrg     if (! strcmp (opts->x_ix86_tune_string, processor_alias_table[i].name)
   2296  1.1  mrg 	&& (processor_alias_table[i].flags & PTA_NO_TUNE) == 0)
   2297  1.1  mrg       {
   2298  1.1  mrg 	ix86_schedule = processor_alias_table[i].schedule;
   2299  1.1  mrg 	ix86_tune = processor_alias_table[i].processor;
   2300  1.1  mrg 	if (TARGET_64BIT_P (opts->x_ix86_isa_flags))
   2301  1.1  mrg 	  {
   2302  1.1  mrg 	    if (!((processor_alias_table[i].flags & PTA_64BIT) != 0))
   2303  1.1  mrg 	      {
   2304  1.1  mrg 		if (ix86_tune_defaulted)
   2305  1.1  mrg 		  {
   2306  1.1  mrg 		    opts->x_ix86_tune_string = "x86-64";
   2307  1.1  mrg 		    for (i = 0; i < pta_size; i++)
   2308  1.1  mrg 		      if (! strcmp (opts->x_ix86_tune_string,
   2309  1.1  mrg 				    processor_alias_table[i].name))
   2310  1.1  mrg 			break;
   2311  1.1  mrg 		    ix86_schedule = processor_alias_table[i].schedule;
   2312  1.1  mrg 		    ix86_tune = processor_alias_table[i].processor;
   2313  1.1  mrg 		  }
   2314  1.1  mrg 		else
   2315  1.1  mrg 		  error ("CPU you selected does not support x86-64 "
   2316  1.1  mrg 			 "instruction set");
   2317  1.1  mrg 	      }
   2318  1.1  mrg 	  }
   2319  1.1  mrg 	/* Intel CPUs have always interpreted SSE prefetch instructions as
   2320  1.1  mrg 	   NOPs; so, we can enable SSE prefetch instructions even when
   2321  1.1  mrg 	   -mtune (rather than -march) points us to a processor that has them.
   2322  1.1  mrg 	   However, the VIA C3 gives a SIGILL, so we only do that for i686 and
   2323  1.1  mrg 	   higher processors.  */
   2324  1.1  mrg 	if (TARGET_CMOV
   2325  1.1  mrg 	    && ((processor_alias_table[i].flags
   2326  1.1  mrg 	      & (PTA_PREFETCH_SSE | PTA_SSE)) != 0))
   2327  1.1  mrg 	  ix86_prefetch_sse = true;
   2328  1.1  mrg 	break;
   2329  1.1  mrg       }
   2330  1.1  mrg 
   2331  1.1  mrg   if (ix86_tune_specified && i == pta_size)
   2332  1.1  mrg     {
   2333  1.1  mrg       error (main_args_p
   2334  1.1  mrg 	     ? G_("bad value %qs for %<-mtune=%> switch")
   2335  1.1  mrg 	     : G_("bad value %qs for %<target(\"tune=\")%> attribute"),
   2336  1.1  mrg 	     opts->x_ix86_tune_string);
   2337  1.1  mrg 
   2338  1.1  mrg       auto_vec <const char *> candidates;
   2339  1.1  mrg       for (i = 0; i < pta_size; i++)
   2340  1.1  mrg 	if ((!TARGET_64BIT_P (opts->x_ix86_isa_flags)
   2341  1.1  mrg 	     || ((processor_alias_table[i].flags & PTA_64BIT) != 0))
   2342  1.1  mrg 	    && (processor_alias_table[i].flags & PTA_NO_TUNE) == 0)
   2343  1.1  mrg 	  candidates.safe_push (processor_alias_table[i].name);
   2344  1.1  mrg 
   2345  1.1  mrg #ifdef HAVE_LOCAL_CPU_DETECT
   2346  1.1  mrg       /* Add also "native" as possible value.  */
   2347  1.1  mrg       candidates.safe_push ("native");
   2348  1.1  mrg #endif
   2349  1.1  mrg 
   2350  1.1  mrg       char *s;
   2351  1.1  mrg       const char *hint
   2352  1.1  mrg 	= candidates_list_and_hint (opts->x_ix86_tune_string, s, candidates);
   2353  1.1  mrg       if (hint)
   2354  1.1  mrg 	inform (input_location,
   2355  1.1  mrg 		main_args_p
   2356  1.1  mrg 		? G_("valid arguments to %<-mtune=%> switch are: "
   2357  1.1  mrg 		     "%s; did you mean %qs?")
   2358  1.1  mrg 		: G_("valid arguments to %<target(\"tune=\")%> attribute are: "
   2359  1.1  mrg 		     "%s; did you mean %qs?"), s, hint);
   2360  1.1  mrg       else
   2361  1.1  mrg 	inform (input_location,
   2362  1.1  mrg 		main_args_p
   2363  1.1  mrg 		? G_("valid arguments to %<-mtune=%> switch are: %s")
   2364  1.1  mrg 		: G_("valid arguments to %<target(\"tune=\")%> attribute "
   2365  1.1  mrg 		     "are: %s"), s);
   2366  1.1  mrg       XDELETEVEC (s);
   2367  1.1  mrg     }
   2368  1.1  mrg 
   2369  1.1  mrg   set_ix86_tune_features (opts, ix86_tune, opts->x_ix86_dump_tunes);
   2370  1.1  mrg 
   2371  1.1  mrg   ix86_recompute_optlev_based_flags (opts, opts_set);
   2372  1.1  mrg 
   2373  1.1  mrg   ix86_tune_cost = processor_cost_table[ix86_tune];
   2374  1.1  mrg   /* TODO: ix86_cost should be chosen at instruction or function granuality
   2375  1.1  mrg      so for cold code we use size_cost even in !optimize_size compilation.  */
   2376  1.1  mrg   if (opts->x_optimize_size)
   2377  1.1  mrg     ix86_cost = &ix86_size_cost;
   2378  1.1  mrg   else
   2379  1.1  mrg     ix86_cost = ix86_tune_cost;
   2380  1.1  mrg 
   2381  1.1  mrg   /* Arrange to set up i386_stack_locals for all functions.  */
   2382  1.1  mrg   init_machine_status = ix86_init_machine_status;
   2383  1.1  mrg 
   2384  1.1  mrg   /* Validate -mregparm= value.  */
   2385  1.1  mrg   if (opts_set->x_ix86_regparm)
   2386  1.1  mrg     {
   2387  1.1  mrg       if (TARGET_64BIT_P (opts->x_ix86_isa_flags))
   2388  1.1  mrg 	warning (0, "%<-mregparm%> is ignored in 64-bit mode");
   2389  1.1  mrg       else if (TARGET_IAMCU_P (opts->x_target_flags))
   2390  1.1  mrg 	warning (0, "%<-mregparm%> is ignored for Intel MCU psABI");
   2391  1.1  mrg       if (opts->x_ix86_regparm > REGPARM_MAX)
   2392  1.1  mrg 	{
   2393  1.1  mrg 	  error ("%<-mregparm=%d%> is not between 0 and %d",
   2394  1.1  mrg 		 opts->x_ix86_regparm, REGPARM_MAX);
   2395  1.1  mrg 	  opts->x_ix86_regparm = 0;
   2396  1.1  mrg 	}
   2397  1.1  mrg     }
   2398  1.1  mrg   if (TARGET_IAMCU_P (opts->x_target_flags)
   2399  1.1  mrg       || TARGET_64BIT_P (opts->x_ix86_isa_flags))
   2400  1.1  mrg     opts->x_ix86_regparm = REGPARM_MAX;
   2401  1.1  mrg 
   2402  1.1  mrg   /* Default align_* from the processor table.  */
   2403  1.1  mrg   ix86_default_align (opts);
   2404  1.1  mrg 
   2405  1.1  mrg   /* Provide default for -mbranch-cost= value.  */
   2406  1.1  mrg   SET_OPTION_IF_UNSET (opts, opts_set, ix86_branch_cost,
   2407  1.1  mrg 		       ix86_tune_cost->branch_cost);
   2408  1.1  mrg 
   2409  1.1  mrg   if (TARGET_64BIT_P (opts->x_ix86_isa_flags))
   2410  1.1  mrg     {
   2411  1.1  mrg       opts->x_target_flags
   2412  1.1  mrg 	|= TARGET_SUBTARGET64_DEFAULT & ~opts_set->x_target_flags;
   2413  1.1  mrg 
   2414  1.1  mrg       if (!ix86_arch_specified)
   2415  1.1  mrg 	opts->x_ix86_isa_flags
   2416  1.1  mrg 	  |= TARGET_SUBTARGET64_ISA_DEFAULT & ~opts->x_ix86_isa_flags_explicit;
   2417  1.1  mrg 
   2418  1.1  mrg       if (!TARGET_128BIT_LONG_DOUBLE_P (opts->x_target_flags))
   2419  1.1  mrg 	error ("%<-m96bit-long-double%> is not compatible with this target");
   2420  1.1  mrg 
   2421  1.1  mrg       if (TARGET_RTD_P (opts->x_target_flags))
   2422  1.1  mrg 	warning (0,
   2423  1.1  mrg 		 main_args_p
   2424  1.1  mrg 		 ? G_("%<-mrtd%> is ignored in 64bit mode")
   2425  1.1  mrg 		 : G_("%<target(\"rtd\")%> is ignored in 64bit mode"));
   2426  1.1  mrg     }
   2427  1.1  mrg   else
   2428  1.1  mrg     {
   2429  1.1  mrg       opts->x_target_flags
   2430  1.1  mrg 	|= TARGET_SUBTARGET32_DEFAULT & ~opts_set->x_target_flags;
   2431  1.1  mrg 
   2432  1.1  mrg       if (!ix86_arch_specified)
   2433  1.1  mrg         opts->x_ix86_isa_flags
   2434  1.1  mrg 	  |= TARGET_SUBTARGET32_ISA_DEFAULT & ~opts->x_ix86_isa_flags_explicit;
   2435  1.1  mrg 
   2436  1.1  mrg       /* i386 ABI does not specify red zone.  It still makes sense to use it
   2437  1.1  mrg          when programmer takes care to stack from being destroyed.  */
   2438  1.1  mrg       if (!(opts_set->x_target_flags & MASK_NO_RED_ZONE))
   2439  1.1  mrg         opts->x_target_flags |= MASK_NO_RED_ZONE;
   2440  1.1  mrg     }
   2441  1.1  mrg 
   2442  1.1  mrg   /* Keep nonleaf frame pointers.  */
   2443  1.1  mrg   if (opts->x_flag_omit_frame_pointer)
   2444  1.1  mrg     opts->x_target_flags &= ~MASK_OMIT_LEAF_FRAME_POINTER;
   2445  1.1  mrg   else if (TARGET_OMIT_LEAF_FRAME_POINTER_P (opts->x_target_flags))
   2446  1.1  mrg     opts->x_flag_omit_frame_pointer = 1;
   2447  1.1  mrg 
   2448  1.1  mrg   /* If we're doing fast math, we don't care about comparison order
   2449  1.1  mrg      wrt NaNs.  This lets us use a shorter comparison sequence.  */
   2450  1.1  mrg   if (opts->x_flag_finite_math_only)
   2451  1.1  mrg     opts->x_target_flags &= ~MASK_IEEE_FP;
   2452  1.1  mrg 
   2453  1.1  mrg   /* If the architecture always has an FPU, turn off NO_FANCY_MATH_387,
   2454  1.1  mrg      since the insns won't need emulation.  */
   2455  1.1  mrg   if (ix86_tune_features [X86_TUNE_ALWAYS_FANCY_MATH_387])
   2456  1.1  mrg     opts->x_target_flags &= ~MASK_NO_FANCY_MATH_387;
   2457  1.1  mrg 
   2458  1.1  mrg   /* Likewise, if the target doesn't have a 387, or we've specified
   2459  1.1  mrg      software floating point, don't use 387 inline intrinsics.  */
   2460  1.1  mrg   if (!TARGET_80387_P (opts->x_target_flags))
   2461  1.1  mrg     opts->x_target_flags |= MASK_NO_FANCY_MATH_387;
   2462  1.1  mrg 
   2463  1.1  mrg   /* Turn on MMX builtins for -msse.  */
   2464  1.1  mrg   if (TARGET_SSE_P (opts->x_ix86_isa_flags))
   2465  1.1  mrg     opts->x_ix86_isa_flags
   2466  1.1  mrg       |= OPTION_MASK_ISA_MMX & ~opts->x_ix86_isa_flags_explicit;
   2467  1.1  mrg 
   2468  1.1  mrg   /* Enable SSE prefetch.  */
   2469  1.1  mrg   if (TARGET_SSE_P (opts->x_ix86_isa_flags)
   2470  1.1  mrg       || (TARGET_PRFCHW_P (opts->x_ix86_isa_flags)
   2471  1.1  mrg 	  && !TARGET_3DNOW_P (opts->x_ix86_isa_flags))
   2472  1.1  mrg       || TARGET_PREFETCHWT1_P (opts->x_ix86_isa_flags))
   2473  1.1  mrg     ix86_prefetch_sse = true;
   2474  1.1  mrg 
   2475  1.1  mrg   /* Enable mwait/monitor instructions for -msse3.  */
   2476  1.1  mrg   if (TARGET_SSE3_P (opts->x_ix86_isa_flags))
   2477  1.1  mrg     opts->x_ix86_isa_flags2
   2478  1.1  mrg       |= OPTION_MASK_ISA2_MWAIT & ~opts->x_ix86_isa_flags2_explicit;
   2479  1.1  mrg 
   2480  1.1  mrg   /* Enable popcnt instruction for -msse4.2 or -mabm.  */
   2481  1.1  mrg   if (TARGET_SSE4_2_P (opts->x_ix86_isa_flags)
   2482  1.1  mrg       || TARGET_ABM_P (opts->x_ix86_isa_flags))
   2483  1.1  mrg     opts->x_ix86_isa_flags
   2484  1.1  mrg       |= OPTION_MASK_ISA_POPCNT & ~opts->x_ix86_isa_flags_explicit;
   2485  1.1  mrg 
   2486  1.1  mrg   /* Enable crc32 instruction for -msse4.2.  */
   2487  1.1  mrg   if (TARGET_SSE4_2_P (opts->x_ix86_isa_flags))
   2488  1.1  mrg     opts->x_ix86_isa_flags
   2489  1.1  mrg       |= OPTION_MASK_ISA_CRC32 & ~opts->x_ix86_isa_flags_explicit;
   2490  1.1  mrg 
   2491  1.1  mrg   /* Enable lzcnt instruction for -mabm.  */
   2492  1.1  mrg   if (TARGET_ABM_P(opts->x_ix86_isa_flags))
   2493  1.1  mrg     opts->x_ix86_isa_flags
   2494  1.1  mrg       |= OPTION_MASK_ISA_LZCNT & ~opts->x_ix86_isa_flags_explicit;
   2495  1.1  mrg 
   2496  1.1  mrg   /* Disable BMI, BMI2 and TBM instructions for -m16.  */
   2497  1.1  mrg   if (TARGET_16BIT_P(opts->x_ix86_isa_flags))
   2498  1.1  mrg     opts->x_ix86_isa_flags
   2499  1.1  mrg       &= ~((OPTION_MASK_ISA_BMI | OPTION_MASK_ISA_BMI2 | OPTION_MASK_ISA_TBM)
   2500  1.1  mrg 	   & ~opts->x_ix86_isa_flags_explicit);
   2501  1.1  mrg 
   2502  1.1  mrg   /* Validate -mpreferred-stack-boundary= value or default it to
   2503  1.1  mrg      PREFERRED_STACK_BOUNDARY_DEFAULT.  */
   2504  1.1  mrg   ix86_preferred_stack_boundary = PREFERRED_STACK_BOUNDARY_DEFAULT;
   2505  1.1  mrg   if (opts_set->x_ix86_preferred_stack_boundary_arg)
   2506  1.1  mrg     {
   2507  1.1  mrg       int min = TARGET_64BIT_P (opts->x_ix86_isa_flags)? 3 : 2;
   2508  1.1  mrg       int max = TARGET_SEH ? 4 : 12;
   2509  1.1  mrg 
   2510  1.1  mrg       if (opts->x_ix86_preferred_stack_boundary_arg < min
   2511  1.1  mrg 	  || opts->x_ix86_preferred_stack_boundary_arg > max)
   2512  1.1  mrg 	{
   2513  1.1  mrg 	  if (min == max)
   2514  1.1  mrg 	    error ("%<-mpreferred-stack-boundary%> is not supported "
   2515  1.1  mrg 		   "for this target");
   2516  1.1  mrg 	  else
   2517  1.1  mrg 	    error ("%<-mpreferred-stack-boundary=%d%> is not between %d and %d",
   2518  1.1  mrg 		   opts->x_ix86_preferred_stack_boundary_arg, min, max);
   2519  1.1  mrg 	}
   2520  1.1  mrg       else
   2521  1.1  mrg 	ix86_preferred_stack_boundary
   2522  1.1  mrg 	  = (1 << opts->x_ix86_preferred_stack_boundary_arg) * BITS_PER_UNIT;
   2523  1.1  mrg     }
   2524  1.1  mrg 
   2525  1.1  mrg   /* Set the default value for -mstackrealign.  */
   2526  1.1  mrg   SET_OPTION_IF_UNSET (opts, opts_set, ix86_force_align_arg_pointer,
   2527  1.1  mrg 		       STACK_REALIGN_DEFAULT);
   2528  1.1  mrg 
   2529  1.1  mrg   ix86_default_incoming_stack_boundary = PREFERRED_STACK_BOUNDARY;
   2530  1.1  mrg 
   2531  1.1  mrg   /* Validate -mincoming-stack-boundary= value or default it to
   2532  1.1  mrg      MIN_STACK_BOUNDARY/PREFERRED_STACK_BOUNDARY.  */
   2533  1.1  mrg   ix86_incoming_stack_boundary = ix86_default_incoming_stack_boundary;
   2534  1.1  mrg   if (opts_set->x_ix86_incoming_stack_boundary_arg)
   2535  1.1  mrg     {
   2536  1.1  mrg       int min = TARGET_64BIT_P (opts->x_ix86_isa_flags) ? 3 : 2;
   2537  1.1  mrg 
   2538  1.1  mrg       if (opts->x_ix86_incoming_stack_boundary_arg < min
   2539  1.1  mrg 	  || opts->x_ix86_incoming_stack_boundary_arg > 12)
   2540  1.1  mrg 	error ("%<-mincoming-stack-boundary=%d%> is not between %d and 12",
   2541  1.1  mrg 	       opts->x_ix86_incoming_stack_boundary_arg, min);
   2542  1.1  mrg       else
   2543  1.1  mrg 	{
   2544  1.1  mrg 	  ix86_user_incoming_stack_boundary
   2545  1.1  mrg 	    = (1 << opts->x_ix86_incoming_stack_boundary_arg) * BITS_PER_UNIT;
   2546  1.1  mrg 	  ix86_incoming_stack_boundary
   2547  1.1  mrg 	    = ix86_user_incoming_stack_boundary;
   2548  1.1  mrg 	}
   2549  1.1  mrg     }
   2550  1.1  mrg 
   2551  1.1  mrg #ifndef NO_PROFILE_COUNTERS
   2552  1.1  mrg   if (flag_nop_mcount)
   2553  1.1  mrg     error ("%<-mnop-mcount%> is not compatible with this target");
   2554  1.1  mrg #endif
   2555  1.1  mrg   if (flag_nop_mcount && flag_pic)
   2556  1.1  mrg     error ("%<-mnop-mcount%> is not implemented for %<-fPIC%>");
   2557  1.1  mrg 
   2558  1.1  mrg   /* Accept -msseregparm only if at least SSE support is enabled.  */
   2559  1.1  mrg   if (TARGET_SSEREGPARM_P (opts->x_target_flags)
   2560  1.1  mrg       && ! TARGET_SSE_P (opts->x_ix86_isa_flags))
   2561  1.1  mrg     error (main_args_p
   2562  1.1  mrg 	   ? G_("%<-msseregparm%> used without SSE enabled")
   2563  1.1  mrg 	   : G_("%<target(\"sseregparm\")%> used without SSE enabled"));
   2564  1.1  mrg 
   2565  1.1  mrg   if (opts_set->x_ix86_fpmath)
   2566  1.1  mrg     {
   2567  1.1  mrg       if (opts->x_ix86_fpmath & FPMATH_SSE)
   2568  1.1  mrg 	{
   2569  1.1  mrg 	  if (!TARGET_SSE_P (opts->x_ix86_isa_flags))
   2570  1.1  mrg 	    {
   2571  1.1  mrg 	      if (TARGET_80387_P (opts->x_target_flags))
   2572  1.1  mrg 		{
   2573  1.1  mrg 		  warning (0, "SSE instruction set disabled, using 387 arithmetics");
   2574  1.1  mrg 		  opts->x_ix86_fpmath = FPMATH_387;
   2575  1.1  mrg 		}
   2576  1.1  mrg 	    }
   2577  1.1  mrg 	  else if ((opts->x_ix86_fpmath & FPMATH_387)
   2578  1.1  mrg 		   && !TARGET_80387_P (opts->x_target_flags))
   2579  1.1  mrg 	    {
   2580  1.1  mrg 	      warning (0, "387 instruction set disabled, using SSE arithmetics");
   2581  1.1  mrg 	      opts->x_ix86_fpmath = FPMATH_SSE;
   2582  1.1  mrg 	    }
   2583  1.1  mrg 	}
   2584  1.1  mrg     }
   2585  1.1  mrg   /* For all chips supporting SSE2, -mfpmath=sse performs better than
   2586  1.1  mrg      fpmath=387.  The second is however default at many targets since the
   2587  1.1  mrg      extra 80bit precision of temporaries is considered to be part of ABI.
   2588  1.1  mrg      Overwrite the default at least for -ffast-math.
   2589  1.1  mrg      TODO: -mfpmath=both seems to produce same performing code with bit
   2590  1.1  mrg      smaller binaries.  It is however not clear if register allocation is
   2591  1.1  mrg      ready for this setting.
   2592  1.1  mrg      Also -mfpmath=387 is overall a lot more compact (bout 4-5%) than SSE
   2593  1.1  mrg      codegen.  We may switch to 387 with -ffast-math for size optimized
   2594  1.1  mrg      functions. */
   2595  1.1  mrg   else if (fast_math_flags_set_p (&global_options)
   2596  1.1  mrg 	   && TARGET_SSE2_P (opts->x_ix86_isa_flags))
   2597  1.1  mrg     opts->x_ix86_fpmath = FPMATH_SSE;
   2598  1.1  mrg   else
   2599  1.1  mrg     opts->x_ix86_fpmath = TARGET_FPMATH_DEFAULT_P (opts->x_ix86_isa_flags);
   2600  1.1  mrg 
   2601  1.1  mrg   /* Use external vectorized library in vectorizing intrinsics.  */
   2602  1.1  mrg   if (opts_set->x_ix86_veclibabi_type)
   2603  1.1  mrg     switch (opts->x_ix86_veclibabi_type)
   2604  1.1  mrg       {
   2605  1.1  mrg       case ix86_veclibabi_type_svml:
   2606  1.1  mrg 	ix86_veclib_handler = &ix86_veclibabi_svml;
   2607  1.1  mrg 	break;
   2608  1.1  mrg 
   2609  1.1  mrg       case ix86_veclibabi_type_acml:
   2610  1.1  mrg 	ix86_veclib_handler = &ix86_veclibabi_acml;
   2611  1.1  mrg 	break;
   2612  1.1  mrg 
   2613  1.1  mrg       default:
   2614  1.1  mrg 	gcc_unreachable ();
   2615  1.1  mrg       }
   2616  1.1  mrg 
   2617  1.1  mrg   if (ix86_tune_features [X86_TUNE_ACCUMULATE_OUTGOING_ARGS]
   2618  1.1  mrg       && !(opts_set->x_target_flags & MASK_ACCUMULATE_OUTGOING_ARGS))
   2619  1.1  mrg     opts->x_target_flags |= MASK_ACCUMULATE_OUTGOING_ARGS;
   2620  1.1  mrg 
   2621  1.1  mrg   /* If stack probes are required, the space used for large function
   2622  1.1  mrg      arguments on the stack must also be probed, so enable
   2623  1.1  mrg      -maccumulate-outgoing-args so this happens in the prologue.  */
   2624  1.1  mrg   if (TARGET_STACK_PROBE_P (opts->x_target_flags)
   2625  1.1  mrg       && !(opts->x_target_flags & MASK_ACCUMULATE_OUTGOING_ARGS))
   2626  1.1  mrg     {
   2627  1.1  mrg       if (opts_set->x_target_flags & MASK_ACCUMULATE_OUTGOING_ARGS)
   2628  1.1  mrg 	warning (0,
   2629  1.1  mrg 		 main_args_p
   2630  1.1  mrg 		 ? G_("stack probing requires %<-maccumulate-outgoing-args%> "
   2631  1.1  mrg 		      "for correctness")
   2632  1.1  mrg 		 : G_("stack probing requires "
   2633  1.1  mrg 		      "%<target(\"accumulate-outgoing-args\")%> for "
   2634  1.1  mrg 		      "correctness"));
   2635  1.1  mrg       opts->x_target_flags |= MASK_ACCUMULATE_OUTGOING_ARGS;
   2636  1.1  mrg     }
   2637  1.1  mrg 
   2638  1.1  mrg   /* Stack realignment without -maccumulate-outgoing-args requires %ebp,
   2639  1.1  mrg      so enable -maccumulate-outgoing-args when %ebp is fixed.  */
   2640  1.1  mrg   if (fixed_regs[BP_REG]
   2641  1.1  mrg       && !(opts->x_target_flags & MASK_ACCUMULATE_OUTGOING_ARGS))
   2642  1.1  mrg     {
   2643  1.1  mrg       if (opts_set->x_target_flags & MASK_ACCUMULATE_OUTGOING_ARGS)
   2644  1.1  mrg 	warning (0,
   2645  1.1  mrg 		 main_args_p
   2646  1.1  mrg 		 ? G_("fixed ebp register requires "
   2647  1.1  mrg 		      "%<-maccumulate-outgoing-args%>")
   2648  1.1  mrg 		 : G_("fixed ebp register requires "
   2649  1.1  mrg 		      "%<target(\"accumulate-outgoing-args\")%>"));
   2650  1.1  mrg       opts->x_target_flags |= MASK_ACCUMULATE_OUTGOING_ARGS;
   2651  1.1  mrg     }
   2652  1.1  mrg 
   2653  1.1  mrg   /* Figure out what ASM_GENERATE_INTERNAL_LABEL builds as a prefix.  */
   2654  1.1  mrg   {
   2655  1.1  mrg     char *p;
   2656  1.1  mrg     ASM_GENERATE_INTERNAL_LABEL (internal_label_prefix, "LX", 0);
   2657  1.1  mrg     p = strchr (internal_label_prefix, 'X');
   2658  1.1  mrg     internal_label_prefix_len = p - internal_label_prefix;
   2659  1.1  mrg     *p = '\0';
   2660  1.1  mrg   }
   2661  1.1  mrg 
   2662  1.1  mrg   /* When scheduling description is not available, disable scheduler pass
   2663  1.1  mrg      so it won't slow down the compilation and make x87 code slower.  */
   2664  1.1  mrg   if (!TARGET_SCHEDULE)
   2665  1.1  mrg     opts->x_flag_schedule_insns_after_reload = opts->x_flag_schedule_insns = 0;
   2666  1.1  mrg 
   2667  1.1  mrg   SET_OPTION_IF_UNSET (opts, opts_set, param_simultaneous_prefetches,
   2668  1.1  mrg 		       ix86_tune_cost->simultaneous_prefetches);
   2669  1.1  mrg   SET_OPTION_IF_UNSET (opts, opts_set, param_l1_cache_line_size,
   2670  1.1  mrg 		       ix86_tune_cost->prefetch_block);
   2671  1.1  mrg   SET_OPTION_IF_UNSET (opts, opts_set, param_l1_cache_size,
   2672  1.1  mrg 		       ix86_tune_cost->l1_cache_size);
   2673  1.1  mrg   SET_OPTION_IF_UNSET (opts, opts_set, param_l2_cache_size,
   2674  1.1  mrg 		       ix86_tune_cost->l2_cache_size);
   2675  1.1  mrg 
   2676  1.1  mrg   /* 64B is the accepted value for these for all x86.  */
   2677  1.1  mrg   SET_OPTION_IF_UNSET (&global_options, &global_options_set,
   2678  1.1  mrg 		       param_destruct_interfere_size, 64);
   2679  1.1  mrg   SET_OPTION_IF_UNSET (&global_options, &global_options_set,
   2680  1.1  mrg 		       param_construct_interfere_size, 64);
   2681  1.1  mrg 
   2682  1.1  mrg   /* Enable sw prefetching at -O3 for CPUS that prefetching is helpful.  */
   2683  1.1  mrg   if (opts->x_flag_prefetch_loop_arrays < 0
   2684  1.1  mrg       && HAVE_prefetch
   2685  1.1  mrg       && (opts->x_optimize >= 3 || opts->x_flag_profile_use)
   2686  1.1  mrg       && !opts->x_optimize_size
   2687  1.1  mrg       && TARGET_SOFTWARE_PREFETCHING_BENEFICIAL)
   2688  1.1  mrg     opts->x_flag_prefetch_loop_arrays = 1;
   2689  1.1  mrg 
   2690  1.1  mrg   /* If using typedef char *va_list, signal that __builtin_va_start (&ap, 0)
   2691  1.1  mrg      can be opts->x_optimized to ap = __builtin_next_arg (0).  */
   2692  1.1  mrg   if (!TARGET_64BIT_P (opts->x_ix86_isa_flags) && !opts->x_flag_split_stack)
   2693  1.1  mrg     targetm.expand_builtin_va_start = NULL;
   2694  1.1  mrg 
   2695  1.1  mrg #ifdef USE_IX86_CLD
   2696  1.1  mrg   /* Use -mcld by default for 32-bit code if configured with --enable-cld.  */
   2697  1.1  mrg   if (!TARGET_64BIT_P (opts->x_ix86_isa_flags))
   2698  1.1  mrg     opts->x_target_flags |= MASK_CLD & ~opts_set->x_target_flags;
   2699  1.1  mrg #endif
   2700  1.1  mrg 
   2701  1.1  mrg   /* Set the default value for -mfentry.  */
   2702  1.1  mrg   if (!opts_set->x_flag_fentry)
   2703  1.1  mrg     opts->x_flag_fentry = TARGET_SEH;
   2704  1.1  mrg   else
   2705  1.1  mrg     {
   2706  1.1  mrg       if (!TARGET_64BIT_P (opts->x_ix86_isa_flags) && opts->x_flag_pic
   2707  1.1  mrg 	  && opts->x_flag_fentry)
   2708  1.1  mrg 	sorry ("%<-mfentry%> isn%'t supported for 32-bit in combination "
   2709  1.1  mrg 	       "with %<-fpic%>");
   2710  1.1  mrg       else if (TARGET_SEH && !opts->x_flag_fentry)
   2711  1.1  mrg 	sorry ("%<-mno-fentry%> isn%'t compatible with SEH");
   2712  1.1  mrg     }
   2713  1.1  mrg 
   2714  1.1  mrg   if (TARGET_SEH && TARGET_CALL_MS2SYSV_XLOGUES)
   2715  1.1  mrg     sorry ("%<-mcall-ms2sysv-xlogues%> isn%'t currently supported with SEH");
   2716  1.1  mrg 
   2717  1.1  mrg   if (!(opts_set->x_target_flags & MASK_VZEROUPPER)
   2718  1.1  mrg       && TARGET_EMIT_VZEROUPPER
   2719  1.1  mrg       && flag_expensive_optimizations
   2720  1.1  mrg       && !optimize_size)
   2721  1.1  mrg     opts->x_target_flags |= MASK_VZEROUPPER;
   2722  1.1  mrg   if (!(opts_set->x_target_flags & MASK_STV))
   2723  1.1  mrg     opts->x_target_flags |= MASK_STV;
   2724  1.1  mrg   /* Disable STV if -mpreferred-stack-boundary={2,3} or
   2725  1.1  mrg      -mincoming-stack-boundary={2,3} or -mstackrealign - the needed
   2726  1.1  mrg      stack realignment will be extra cost the pass doesn't take into
   2727  1.1  mrg      account and the pass can't realign the stack.  */
   2728  1.1  mrg   if (ix86_preferred_stack_boundary < 128
   2729  1.1  mrg       || ix86_incoming_stack_boundary < 128
   2730  1.1  mrg       || opts->x_ix86_force_align_arg_pointer)
   2731  1.1  mrg     opts->x_target_flags &= ~MASK_STV;
   2732  1.1  mrg   if (!ix86_tune_features[X86_TUNE_AVX256_UNALIGNED_LOAD_OPTIMAL]
   2733  1.1  mrg       && !(opts_set->x_target_flags & MASK_AVX256_SPLIT_UNALIGNED_LOAD))
   2734  1.1  mrg     opts->x_target_flags |= MASK_AVX256_SPLIT_UNALIGNED_LOAD;
   2735  1.1  mrg   else if (!main_args_p
   2736  1.1  mrg 	   && ix86_tune_features[X86_TUNE_AVX256_UNALIGNED_LOAD_OPTIMAL])
   2737  1.1  mrg     opts->x_target_flags &= ~MASK_AVX256_SPLIT_UNALIGNED_LOAD;
   2738  1.1  mrg 
   2739  1.1  mrg   if (!ix86_tune_features[X86_TUNE_AVX256_UNALIGNED_STORE_OPTIMAL]
   2740  1.1  mrg       && !(opts_set->x_target_flags & MASK_AVX256_SPLIT_UNALIGNED_STORE))
   2741  1.1  mrg     opts->x_target_flags |= MASK_AVX256_SPLIT_UNALIGNED_STORE;
   2742  1.1  mrg   else if (!main_args_p
   2743  1.1  mrg 	   && ix86_tune_features[X86_TUNE_AVX256_UNALIGNED_STORE_OPTIMAL])
   2744  1.1  mrg     opts->x_target_flags &= ~MASK_AVX256_SPLIT_UNALIGNED_STORE;
   2745  1.1  mrg 
   2746  1.1  mrg   /* Enable 128-bit AVX instruction generation
   2747  1.1  mrg      for the auto-vectorizer.  */
   2748  1.1  mrg   if (ix86_tune_features[X86_TUNE_AVX128_OPTIMAL]
   2749  1.1  mrg       && (opts_set->x_prefer_vector_width_type == PVW_NONE))
   2750  1.1  mrg     opts->x_prefer_vector_width_type = PVW_AVX128;
   2751  1.1  mrg 
   2752  1.1  mrg   /* Use 256-bit AVX instruction generation
   2753  1.1  mrg      in the auto-vectorizer.  */
   2754  1.1  mrg   if (ix86_tune_features[X86_TUNE_AVX256_OPTIMAL]
   2755  1.1  mrg       && (opts_set->x_prefer_vector_width_type == PVW_NONE))
   2756  1.1  mrg     opts->x_prefer_vector_width_type = PVW_AVX256;
   2757  1.1  mrg 
   2758  1.1  mrg   if (opts_set->x_ix86_move_max == PVW_NONE)
   2759  1.1  mrg     {
   2760  1.1  mrg       /* Set the maximum number of bits can be moved from memory to
   2761  1.1  mrg 	 memory efficiently.  */
   2762  1.1  mrg       if (ix86_tune_features[X86_TUNE_AVX512_MOVE_BY_PIECES])
   2763  1.1  mrg 	opts->x_ix86_move_max = PVW_AVX512;
   2764  1.1  mrg       else if (ix86_tune_features[X86_TUNE_AVX256_MOVE_BY_PIECES])
   2765  1.1  mrg 	opts->x_ix86_move_max = PVW_AVX256;
   2766  1.1  mrg       else
   2767  1.1  mrg 	{
   2768  1.1  mrg 	  opts->x_ix86_move_max = opts->x_prefer_vector_width_type;
   2769  1.1  mrg 	  if (opts_set->x_ix86_move_max == PVW_NONE)
   2770  1.1  mrg 	    {
   2771  1.1  mrg 	      if (TARGET_AVX512F_P (opts->x_ix86_isa_flags))
   2772  1.1  mrg 		opts->x_ix86_move_max = PVW_AVX512;
   2773  1.1  mrg 	      /* Align with vectorizer to avoid potential STLF issue.  */
   2774  1.1  mrg 	      else if (TARGET_AVX_P (opts->x_ix86_isa_flags))
   2775  1.1  mrg 		opts->x_ix86_move_max = PVW_AVX256;
   2776  1.1  mrg 	      else
   2777  1.1  mrg 		opts->x_ix86_move_max = PVW_AVX128;
   2778  1.1  mrg 	    }
   2779  1.1  mrg 	}
   2780  1.1  mrg     }
   2781  1.1  mrg 
   2782  1.1  mrg   if (opts_set->x_ix86_store_max == PVW_NONE)
   2783  1.1  mrg     {
   2784  1.1  mrg       /* Set the maximum number of bits can be stored to memory
   2785  1.1  mrg 	 efficiently.  */
   2786  1.1  mrg       if (ix86_tune_features[X86_TUNE_AVX512_STORE_BY_PIECES])
   2787  1.1  mrg 	opts->x_ix86_store_max = PVW_AVX512;
   2788  1.1  mrg       else if (ix86_tune_features[X86_TUNE_AVX256_STORE_BY_PIECES])
   2789  1.1  mrg 	opts->x_ix86_store_max = PVW_AVX256;
   2790  1.1  mrg       else
   2791  1.1  mrg 	{
   2792  1.1  mrg 	  opts->x_ix86_store_max = opts->x_prefer_vector_width_type;
   2793  1.1  mrg 	  if (opts_set->x_ix86_store_max == PVW_NONE)
   2794  1.1  mrg 	    {
   2795  1.1  mrg 	      if (TARGET_AVX512F_P (opts->x_ix86_isa_flags))
   2796  1.1  mrg 		opts->x_ix86_store_max = PVW_AVX512;
   2797  1.1  mrg 	      /* Align with vectorizer to avoid potential STLF issue.  */
   2798  1.1  mrg 	      else if (TARGET_AVX_P (opts->x_ix86_isa_flags))
   2799  1.1  mrg 		opts->x_ix86_store_max = PVW_AVX256;
   2800  1.1  mrg 	      else
   2801  1.1  mrg 		opts->x_ix86_store_max = PVW_AVX128;
   2802  1.1  mrg 	    }
   2803  1.1  mrg 	}
   2804  1.1  mrg     }
   2805  1.1  mrg 
   2806  1.1  mrg   if (opts->x_ix86_recip_name)
   2807  1.1  mrg     {
   2808  1.1  mrg       char *p = ASTRDUP (opts->x_ix86_recip_name);
   2809  1.1  mrg       char *q;
   2810  1.1  mrg       unsigned int mask;
   2811  1.1  mrg       bool invert;
   2812  1.1  mrg 
   2813  1.1  mrg       while ((q = strtok (p, ",")) != NULL)
   2814  1.1  mrg 	{
   2815  1.1  mrg 	  p = NULL;
   2816  1.1  mrg 	  if (*q == '!')
   2817  1.1  mrg 	    {
   2818  1.1  mrg 	      invert = true;
   2819  1.1  mrg 	      q++;
   2820  1.1  mrg 	    }
   2821  1.1  mrg 	  else
   2822  1.1  mrg 	    invert = false;
   2823  1.1  mrg 
   2824  1.1  mrg 	  if (!strcmp (q, "default"))
   2825  1.1  mrg 	    mask = RECIP_MASK_ALL;
   2826  1.1  mrg 	  else
   2827  1.1  mrg 	    {
   2828  1.1  mrg 	      for (i = 0; i < ARRAY_SIZE (recip_options); i++)
   2829  1.1  mrg 		if (!strcmp (q, recip_options[i].string))
   2830  1.1  mrg 		  {
   2831  1.1  mrg 		    mask = recip_options[i].mask;
   2832  1.1  mrg 		    break;
   2833  1.1  mrg 		  }
   2834  1.1  mrg 
   2835  1.1  mrg 	      if (i == ARRAY_SIZE (recip_options))
   2836  1.1  mrg 		{
   2837  1.1  mrg 		  error ("unknown option for %<-mrecip=%s%>", q);
   2838  1.1  mrg 		  invert = false;
   2839  1.1  mrg 		  mask = RECIP_MASK_NONE;
   2840  1.1  mrg 		}
   2841  1.1  mrg 	    }
   2842  1.1  mrg 
   2843  1.1  mrg 	  opts->x_recip_mask_explicit |= mask;
   2844  1.1  mrg 	  if (invert)
   2845  1.1  mrg 	    opts->x_recip_mask &= ~mask;
   2846  1.1  mrg 	  else
   2847  1.1  mrg 	    opts->x_recip_mask |= mask;
   2848  1.1  mrg 	}
   2849  1.1  mrg     }
   2850  1.1  mrg 
   2851  1.1  mrg   if (TARGET_RECIP_P (opts->x_target_flags))
   2852  1.1  mrg     opts->x_recip_mask |= RECIP_MASK_ALL & ~opts->x_recip_mask_explicit;
   2853  1.1  mrg   else if (opts_set->x_target_flags & MASK_RECIP)
   2854  1.1  mrg     opts->x_recip_mask &= ~(RECIP_MASK_ALL & ~opts->x_recip_mask_explicit);
   2855  1.1  mrg 
   2856  1.1  mrg   /* Default long double to 64-bit for 32-bit Bionic and to __float128
   2857  1.1  mrg      for 64-bit Bionic.  Also default long double to 64-bit for Intel
   2858  1.1  mrg      MCU psABI.  */
   2859  1.1  mrg   if ((TARGET_HAS_BIONIC || TARGET_IAMCU)
   2860  1.1  mrg       && !(opts_set->x_target_flags
   2861  1.1  mrg 	   & (MASK_LONG_DOUBLE_64 | MASK_LONG_DOUBLE_128)))
   2862  1.1  mrg     opts->x_target_flags |= (TARGET_64BIT
   2863  1.1  mrg 			     ? MASK_LONG_DOUBLE_128
   2864  1.1  mrg 			     : MASK_LONG_DOUBLE_64);
   2865  1.1  mrg 
   2866  1.1  mrg   /* Only one of them can be active.  */
   2867  1.1  mrg   gcc_assert ((opts->x_target_flags & MASK_LONG_DOUBLE_64) == 0
   2868  1.1  mrg 	      || (opts->x_target_flags & MASK_LONG_DOUBLE_128) == 0);
   2869  1.1  mrg 
   2870  1.1  mrg   /* Handle stack protector */
   2871  1.1  mrg   if (!opts_set->x_ix86_stack_protector_guard)
   2872  1.1  mrg     {
   2873  1.1  mrg #ifdef TARGET_THREAD_SSP_OFFSET
   2874  1.1  mrg       if (!TARGET_HAS_BIONIC)
   2875  1.1  mrg 	opts->x_ix86_stack_protector_guard = SSP_TLS;
   2876  1.1  mrg       else
   2877  1.1  mrg #endif
   2878  1.1  mrg 	opts->x_ix86_stack_protector_guard = SSP_GLOBAL;
   2879  1.1  mrg     }
   2880  1.1  mrg 
   2881  1.1  mrg   if (opts_set->x_ix86_stack_protector_guard_offset_str)
   2882  1.1  mrg     {
   2883  1.1  mrg       char *endp;
   2884  1.1  mrg       const char *str = opts->x_ix86_stack_protector_guard_offset_str;
   2885  1.1  mrg 
   2886  1.1  mrg       errno = 0;
   2887  1.1  mrg       int64_t offset;
   2888  1.1  mrg 
   2889  1.1  mrg #if defined(INT64_T_IS_LONG)
   2890  1.1  mrg       offset = strtol (str, &endp, 0);
   2891  1.1  mrg #else
   2892  1.1  mrg       offset = strtoll (str, &endp, 0);
   2893  1.1  mrg #endif
   2894  1.1  mrg 
   2895  1.1  mrg       if (!*str || *endp || errno)
   2896  1.1  mrg 	error ("%qs is not a valid number "
   2897  1.1  mrg 	       "in %<-mstack-protector-guard-offset=%>", str);
   2898  1.1  mrg 
   2899  1.1  mrg       if (!IN_RANGE (offset, HOST_WIDE_INT_C (-0x80000000),
   2900  1.1  mrg 		     HOST_WIDE_INT_C (0x7fffffff)))
   2901  1.1  mrg 	error ("%qs is not a valid offset "
   2902  1.1  mrg 	       "in %<-mstack-protector-guard-offset=%>", str);
   2903  1.1  mrg 
   2904  1.1  mrg       opts->x_ix86_stack_protector_guard_offset = offset;
   2905  1.1  mrg     }
   2906  1.1  mrg #ifdef TARGET_THREAD_SSP_OFFSET
   2907  1.1  mrg   else
   2908  1.1  mrg     opts->x_ix86_stack_protector_guard_offset = TARGET_THREAD_SSP_OFFSET;
   2909  1.1  mrg #endif
   2910  1.1  mrg 
   2911  1.1  mrg   if (opts_set->x_ix86_stack_protector_guard_reg_str)
   2912  1.1  mrg     {
   2913  1.1  mrg       const char *str = opts->x_ix86_stack_protector_guard_reg_str;
   2914  1.1  mrg       addr_space_t seg = ADDR_SPACE_GENERIC;
   2915  1.1  mrg 
   2916  1.1  mrg       /* Discard optional register prefix.  */
   2917  1.1  mrg       if (str[0] == '%')
   2918  1.1  mrg 	str++;
   2919  1.1  mrg 
   2920  1.1  mrg       if (strlen (str) == 2 && str[1] == 's')
   2921  1.1  mrg 	{
   2922  1.1  mrg 	  if (str[0] == 'f')
   2923  1.1  mrg 	    seg = ADDR_SPACE_SEG_FS;
   2924  1.1  mrg 	  else if (str[0] == 'g')
   2925  1.1  mrg 	    seg = ADDR_SPACE_SEG_GS;
   2926  1.1  mrg 	}
   2927  1.1  mrg 
   2928  1.1  mrg       if (seg == ADDR_SPACE_GENERIC)
   2929  1.1  mrg 	error ("%qs is not a valid base register "
   2930  1.1  mrg 	       "in %<-mstack-protector-guard-reg=%>",
   2931  1.1  mrg 	       opts->x_ix86_stack_protector_guard_reg_str);
   2932  1.1  mrg 
   2933  1.1  mrg       opts->x_ix86_stack_protector_guard_reg = seg;
   2934  1.1  mrg     }
   2935  1.1  mrg   else
   2936  1.1  mrg     {
   2937  1.1  mrg       opts->x_ix86_stack_protector_guard_reg = DEFAULT_TLS_SEG_REG;
   2938  1.1  mrg 
   2939  1.1  mrg       /* The kernel uses a different segment register for performance
   2940  1.1  mrg 	 reasons; a system call would not have to trash the userspace
   2941  1.1  mrg 	 segment register, which would be expensive.  */
   2942  1.1  mrg       if (opts->x_ix86_cmodel == CM_KERNEL)
   2943  1.1  mrg 	opts->x_ix86_stack_protector_guard_reg = ADDR_SPACE_SEG_GS;
   2944  1.1  mrg     }
   2945  1.1  mrg 
   2946  1.1  mrg   /* Handle -mmemcpy-strategy= and -mmemset-strategy=  */
   2947  1.1  mrg   if (opts->x_ix86_tune_memcpy_strategy)
   2948  1.1  mrg     {
   2949  1.1  mrg       char *str = xstrdup (opts->x_ix86_tune_memcpy_strategy);
   2950  1.1  mrg       ix86_parse_stringop_strategy_string (str, false);
   2951  1.1  mrg       free (str);
   2952  1.1  mrg     }
   2953  1.1  mrg 
   2954  1.1  mrg   if (opts->x_ix86_tune_memset_strategy)
   2955  1.1  mrg     {
   2956  1.1  mrg       char *str = xstrdup (opts->x_ix86_tune_memset_strategy);
   2957  1.1  mrg       ix86_parse_stringop_strategy_string (str, true);
   2958  1.1  mrg       free (str);
   2959  1.1  mrg     }
   2960  1.1  mrg 
   2961  1.1  mrg   /* Save the initial options in case the user does function specific
   2962  1.1  mrg      options.  */
   2963  1.1  mrg   if (main_args_p)
   2964  1.1  mrg     {
   2965  1.1  mrg       opts->x_ix86_excess_precision
   2966  1.1  mrg 	= opts->x_flag_excess_precision;
   2967  1.1  mrg       opts->x_ix86_unsafe_math_optimizations
   2968  1.1  mrg 	= opts->x_flag_unsafe_math_optimizations;
   2969  1.1  mrg       target_option_default_node = target_option_current_node
   2970  1.1  mrg         = build_target_option_node (opts, opts_set);
   2971  1.1  mrg     }
   2972  1.1  mrg 
   2973  1.1  mrg   if (opts->x_flag_cf_protection != CF_NONE)
   2974  1.1  mrg     {
   2975  1.1  mrg       if ((opts->x_flag_cf_protection & CF_BRANCH) == CF_BRANCH
   2976  1.1  mrg 	  && !TARGET_64BIT && !TARGET_CMOV)
   2977  1.1  mrg 	error ("%<-fcf-protection%> is not compatible with this target");
   2978  1.1  mrg 
   2979  1.1  mrg       opts->x_flag_cf_protection
   2980  1.1  mrg       = (cf_protection_level) (opts->x_flag_cf_protection | CF_SET);
   2981  1.1  mrg     }
   2982  1.1  mrg 
   2983  1.1  mrg   if (ix86_tune_features [X86_TUNE_AVOID_256FMA_CHAINS])
   2984  1.1  mrg     SET_OPTION_IF_UNSET (opts, opts_set, param_avoid_fma_max_bits, 512);
   2985  1.1  mrg   else if (ix86_tune_features [X86_TUNE_AVOID_256FMA_CHAINS])
   2986  1.1  mrg     SET_OPTION_IF_UNSET (opts, opts_set, param_avoid_fma_max_bits, 256);
   2987  1.1  mrg   else if (ix86_tune_features [X86_TUNE_AVOID_128FMA_CHAINS])
   2988  1.1  mrg     SET_OPTION_IF_UNSET (opts, opts_set, param_avoid_fma_max_bits, 128);
   2989  1.1  mrg 
   2990  1.1  mrg   /* PR86952: jump table usage with retpolines is slow.
   2991  1.1  mrg      The PR provides some numbers about the slowness.  */
   2992  1.1  mrg   if (ix86_indirect_branch != indirect_branch_keep)
   2993  1.1  mrg     SET_OPTION_IF_UNSET (opts, opts_set, flag_jump_tables, 0);
   2994  1.1  mrg 
   2995  1.1  mrg   SET_OPTION_IF_UNSET (opts, opts_set, param_ira_consider_dup_in_all_alts, 0);
   2996  1.1  mrg 
   2997  1.1  mrg   /* Fully masking the main or the epilogue vectorized loop is not
   2998  1.1  mrg      profitable generally so leave it disabled until we get more
   2999  1.1  mrg      fine grained control & costing.  */
   3000  1.1  mrg   SET_OPTION_IF_UNSET (opts, opts_set, param_vect_partial_vector_usage, 0);
   3001  1.1  mrg 
   3002  1.1  mrg   return true;
   3003  1.1  mrg }
   3004  1.1  mrg 
   3005  1.1  mrg /* Implement the TARGET_OPTION_OVERRIDE hook.  */
   3006  1.1  mrg 
   3007  1.1  mrg void
   3008  1.1  mrg ix86_option_override (void)
   3009  1.1  mrg {
   3010  1.1  mrg   ix86_option_override_internal (true, &global_options, &global_options_set);
   3011  1.1  mrg }
   3012  1.1  mrg 
   3013  1.1  mrg /* Remember the last target of ix86_set_current_function.  */
   3014  1.1  mrg static GTY(()) tree ix86_previous_fndecl;
   3015  1.1  mrg 
   3016  1.1  mrg /* Set targets globals to the default (or current #pragma GCC target
   3017  1.1  mrg    if active).  Invalidate ix86_previous_fndecl cache.  */
   3018  1.1  mrg 
   3019  1.1  mrg void
   3020  1.1  mrg ix86_reset_previous_fndecl (void)
   3021  1.1  mrg {
   3022  1.1  mrg   tree new_tree = target_option_current_node;
   3023  1.1  mrg   cl_target_option_restore (&global_options, &global_options_set,
   3024  1.1  mrg 			    TREE_TARGET_OPTION (new_tree));
   3025  1.1  mrg   if (TREE_TARGET_GLOBALS (new_tree))
   3026  1.1  mrg     restore_target_globals (TREE_TARGET_GLOBALS (new_tree));
   3027  1.1  mrg   else if (new_tree == target_option_default_node)
   3028  1.1  mrg     restore_target_globals (&default_target_globals);
   3029  1.1  mrg   else
   3030  1.1  mrg     TREE_TARGET_GLOBALS (new_tree) = save_target_globals_default_opts ();
   3031  1.1  mrg   ix86_previous_fndecl = NULL_TREE;
   3032  1.1  mrg }
   3033  1.1  mrg 
   3034  1.1  mrg /* Add target attribute to SIMD clone NODE if needed.  */
   3035  1.1  mrg 
   3036  1.1  mrg void
   3037  1.1  mrg ix86_simd_clone_adjust (struct cgraph_node *node)
   3038  1.1  mrg {
   3039  1.1  mrg   const char *str = NULL;
   3040  1.1  mrg 
   3041  1.1  mrg   /* Attributes need to be adjusted for definitions, not declarations.  */
   3042  1.1  mrg   if (!node->definition)
   3043  1.1  mrg     return;
   3044  1.1  mrg 
   3045  1.1  mrg   gcc_assert (node->decl == cfun->decl);
   3046  1.1  mrg   switch (node->simdclone->vecsize_mangle)
   3047  1.1  mrg     {
   3048  1.1  mrg     case 'b':
   3049  1.1  mrg       if (!TARGET_SSE2)
   3050  1.1  mrg 	str = "sse2";
   3051  1.1  mrg       break;
   3052  1.1  mrg     case 'c':
   3053  1.1  mrg       if (TARGET_PREFER_AVX128)
   3054  1.1  mrg 	{
   3055  1.1  mrg 	  if (!TARGET_AVX)
   3056  1.1  mrg 	    str = "avx,prefer-vector-width=256";
   3057  1.1  mrg 	  else
   3058  1.1  mrg 	    str = "prefer-vector-width=256";
   3059  1.1  mrg 	}
   3060  1.1  mrg       else if (!TARGET_AVX)
   3061  1.1  mrg 	str = "avx";
   3062  1.1  mrg       break;
   3063  1.1  mrg     case 'd':
   3064  1.1  mrg       if (TARGET_PREFER_AVX128)
   3065  1.1  mrg 	{
   3066  1.1  mrg 	  if (!TARGET_AVX2)
   3067  1.1  mrg 	    str = "avx2,prefer-vector-width=256";
   3068  1.1  mrg 	  else
   3069  1.1  mrg 	    str = "prefer-vector-width=256";
   3070  1.1  mrg 	}
   3071  1.1  mrg       else if (!TARGET_AVX2)
   3072  1.1  mrg 	str = "avx2";
   3073  1.1  mrg       break;
   3074  1.1  mrg     case 'e':
   3075  1.1  mrg       if (TARGET_PREFER_AVX256)
   3076  1.1  mrg 	{
   3077  1.1  mrg 	  if (!TARGET_AVX512F)
   3078  1.1  mrg 	    str = "avx512f,prefer-vector-width=512";
   3079  1.1  mrg 	  else
   3080  1.1  mrg 	    str = "prefer-vector-width=512";
   3081  1.1  mrg 	}
   3082  1.1  mrg       else if (!TARGET_AVX512F)
   3083  1.1  mrg 	str = "avx512f";
   3084  1.1  mrg       break;
   3085  1.1  mrg     default:
   3086  1.1  mrg       gcc_unreachable ();
   3087  1.1  mrg     }
   3088  1.1  mrg   if (str == NULL)
   3089  1.1  mrg     return;
   3090  1.1  mrg   push_cfun (NULL);
   3091  1.1  mrg   tree args = build_tree_list (NULL_TREE, build_string (strlen (str), str));
   3092  1.1  mrg   bool ok = ix86_valid_target_attribute_p (node->decl, NULL, args, 0);
   3093  1.1  mrg   gcc_assert (ok);
   3094  1.1  mrg   pop_cfun ();
   3095  1.1  mrg   ix86_reset_previous_fndecl ();
   3096  1.1  mrg   ix86_set_current_function (node->decl);
   3097  1.1  mrg }
   3098  1.1  mrg 
   3099  1.1  mrg 
   3100  1.1  mrg 
   3101  1.1  mrg /* Set the func_type field from the function FNDECL.  */
   3102  1.1  mrg 
   3103  1.1  mrg static void
   3104  1.1  mrg ix86_set_func_type (tree fndecl)
   3105  1.1  mrg {
   3106  1.1  mrg   if (cfun->machine->func_type == TYPE_UNKNOWN)
   3107  1.1  mrg     {
   3108  1.1  mrg       if (lookup_attribute ("interrupt",
   3109  1.1  mrg 			    TYPE_ATTRIBUTES (TREE_TYPE (fndecl))))
   3110  1.1  mrg 	{
   3111  1.1  mrg 	  if (ix86_function_naked (fndecl))
   3112  1.1  mrg 	    error_at (DECL_SOURCE_LOCATION (fndecl),
   3113  1.1  mrg 		      "interrupt and naked attributes are not compatible");
   3114  1.1  mrg 
   3115  1.1  mrg 	  int nargs = 0;
   3116  1.1  mrg 	  for (tree arg = DECL_ARGUMENTS (fndecl);
   3117  1.1  mrg 	       arg;
   3118  1.1  mrg 	       arg = TREE_CHAIN (arg))
   3119  1.1  mrg 	    nargs++;
   3120  1.1  mrg 	  cfun->machine->no_caller_saved_registers = true;
   3121  1.1  mrg 	  cfun->machine->func_type
   3122  1.1  mrg 	    = nargs == 2 ? TYPE_EXCEPTION : TYPE_INTERRUPT;
   3123  1.1  mrg 
   3124  1.1  mrg 	  ix86_optimize_mode_switching[X86_DIRFLAG] = 1;
   3125  1.1  mrg 
   3126  1.1  mrg 	  /* Only dwarf2out.cc can handle -WORD(AP) as a pointer argument.  */
   3127  1.1  mrg 	  if (write_symbols != NO_DEBUG && write_symbols != DWARF2_DEBUG)
   3128  1.1  mrg 	    sorry ("only DWARF debug format is supported for interrupt "
   3129  1.1  mrg 		   "service routine");
   3130  1.1  mrg 	}
   3131  1.1  mrg       else
   3132  1.1  mrg 	{
   3133  1.1  mrg 	  cfun->machine->func_type = TYPE_NORMAL;
   3134  1.1  mrg 	  if (lookup_attribute ("no_caller_saved_registers",
   3135  1.1  mrg 				TYPE_ATTRIBUTES (TREE_TYPE (fndecl))))
   3136  1.1  mrg 	    cfun->machine->no_caller_saved_registers = true;
   3137  1.1  mrg 	}
   3138  1.1  mrg     }
   3139  1.1  mrg }
   3140  1.1  mrg 
   3141  1.1  mrg /* Set the indirect_branch_type field from the function FNDECL.  */
   3142  1.1  mrg 
   3143  1.1  mrg static void
   3144  1.1  mrg ix86_set_indirect_branch_type (tree fndecl)
   3145  1.1  mrg {
   3146  1.1  mrg   if (cfun->machine->indirect_branch_type == indirect_branch_unset)
   3147  1.1  mrg     {
   3148  1.1  mrg       tree attr = lookup_attribute ("indirect_branch",
   3149  1.1  mrg 				    DECL_ATTRIBUTES (fndecl));
   3150  1.1  mrg       if (attr != NULL)
   3151  1.1  mrg 	{
   3152  1.1  mrg 	  tree args = TREE_VALUE (attr);
   3153  1.1  mrg 	  if (args == NULL)
   3154  1.1  mrg 	    gcc_unreachable ();
   3155  1.1  mrg 	  tree cst = TREE_VALUE (args);
   3156  1.1  mrg 	  if (strcmp (TREE_STRING_POINTER (cst), "keep") == 0)
   3157  1.1  mrg 	    cfun->machine->indirect_branch_type = indirect_branch_keep;
   3158  1.1  mrg 	  else if (strcmp (TREE_STRING_POINTER (cst), "thunk") == 0)
   3159  1.1  mrg 	    cfun->machine->indirect_branch_type = indirect_branch_thunk;
   3160  1.1  mrg 	  else if (strcmp (TREE_STRING_POINTER (cst), "thunk-inline") == 0)
   3161  1.1  mrg 	    cfun->machine->indirect_branch_type = indirect_branch_thunk_inline;
   3162  1.1  mrg 	  else if (strcmp (TREE_STRING_POINTER (cst), "thunk-extern") == 0)
   3163  1.1  mrg 	    cfun->machine->indirect_branch_type = indirect_branch_thunk_extern;
   3164  1.1  mrg 	  else
   3165  1.1  mrg 	    gcc_unreachable ();
   3166  1.1  mrg 	}
   3167  1.1  mrg       else
   3168  1.1  mrg 	cfun->machine->indirect_branch_type = ix86_indirect_branch;
   3169  1.1  mrg 
   3170  1.1  mrg       /* -mcmodel=large is not compatible with -mindirect-branch=thunk
   3171  1.1  mrg 	 nor -mindirect-branch=thunk-extern.  */
   3172  1.1  mrg       if ((ix86_cmodel == CM_LARGE || ix86_cmodel == CM_LARGE_PIC)
   3173  1.1  mrg 	  && ((cfun->machine->indirect_branch_type
   3174  1.1  mrg 	       == indirect_branch_thunk_extern)
   3175  1.1  mrg 	      || (cfun->machine->indirect_branch_type
   3176  1.1  mrg 		  == indirect_branch_thunk)))
   3177  1.1  mrg 	error ("%<-mindirect-branch=%s%> and %<-mcmodel=large%> are not "
   3178  1.1  mrg 	       "compatible",
   3179  1.1  mrg 	       ((cfun->machine->indirect_branch_type
   3180  1.1  mrg 		 == indirect_branch_thunk_extern)
   3181  1.1  mrg 		? "thunk-extern" : "thunk"));
   3182  1.1  mrg 
   3183  1.1  mrg       if (cfun->machine->indirect_branch_type != indirect_branch_keep
   3184  1.1  mrg 	  && (cfun->machine->indirect_branch_type
   3185  1.1  mrg 	      != indirect_branch_thunk_extern)
   3186  1.1  mrg 	  && (flag_cf_protection & CF_RETURN))
   3187  1.1  mrg 	error ("%<-mindirect-branch%> and %<-fcf-protection%> are not "
   3188  1.1  mrg 	       "compatible");
   3189  1.1  mrg     }
   3190  1.1  mrg 
   3191  1.1  mrg   if (cfun->machine->function_return_type == indirect_branch_unset)
   3192  1.1  mrg     {
   3193  1.1  mrg       tree attr = lookup_attribute ("function_return",
   3194  1.1  mrg 				    DECL_ATTRIBUTES (fndecl));
   3195  1.1  mrg       if (attr != NULL)
   3196  1.1  mrg 	{
   3197  1.1  mrg 	  tree args = TREE_VALUE (attr);
   3198  1.1  mrg 	  if (args == NULL)
   3199  1.1  mrg 	    gcc_unreachable ();
   3200  1.1  mrg 	  tree cst = TREE_VALUE (args);
   3201  1.1  mrg 	  if (strcmp (TREE_STRING_POINTER (cst), "keep") == 0)
   3202  1.1  mrg 	    cfun->machine->function_return_type = indirect_branch_keep;
   3203  1.1  mrg 	  else if (strcmp (TREE_STRING_POINTER (cst), "thunk") == 0)
   3204  1.1  mrg 	    cfun->machine->function_return_type = indirect_branch_thunk;
   3205  1.1  mrg 	  else if (strcmp (TREE_STRING_POINTER (cst), "thunk-inline") == 0)
   3206  1.1  mrg 	    cfun->machine->function_return_type = indirect_branch_thunk_inline;
   3207  1.1  mrg 	  else if (strcmp (TREE_STRING_POINTER (cst), "thunk-extern") == 0)
   3208  1.1  mrg 	    cfun->machine->function_return_type = indirect_branch_thunk_extern;
   3209  1.1  mrg 	  else
   3210  1.1  mrg 	    gcc_unreachable ();
   3211  1.1  mrg 	}
   3212  1.1  mrg       else
   3213  1.1  mrg 	cfun->machine->function_return_type = ix86_function_return;
   3214  1.1  mrg 
   3215  1.1  mrg       /* -mcmodel=large is not compatible with -mfunction-return=thunk
   3216  1.1  mrg 	 nor -mfunction-return=thunk-extern.  */
   3217  1.1  mrg       if ((ix86_cmodel == CM_LARGE || ix86_cmodel == CM_LARGE_PIC)
   3218  1.1  mrg 	  && ((cfun->machine->function_return_type
   3219  1.1  mrg 	       == indirect_branch_thunk_extern)
   3220  1.1  mrg 	      || (cfun->machine->function_return_type
   3221  1.1  mrg 		  == indirect_branch_thunk)))
   3222  1.1  mrg 	error ("%<-mfunction-return=%s%> and %<-mcmodel=large%> are not "
   3223  1.1  mrg 	       "compatible",
   3224  1.1  mrg 	       ((cfun->machine->function_return_type
   3225  1.1  mrg 		 == indirect_branch_thunk_extern)
   3226  1.1  mrg 		? "thunk-extern" : "thunk"));
   3227  1.1  mrg 
   3228  1.1  mrg       if (cfun->machine->function_return_type != indirect_branch_keep
   3229  1.1  mrg 	  && (cfun->machine->function_return_type
   3230  1.1  mrg 	      != indirect_branch_thunk_extern)
   3231  1.1  mrg 	  && (flag_cf_protection & CF_RETURN))
   3232  1.1  mrg 	error ("%<-mfunction-return%> and %<-fcf-protection%> are not "
   3233  1.1  mrg 	       "compatible");
   3234  1.1  mrg     }
   3235  1.1  mrg }
   3236  1.1  mrg 
   3237  1.1  mrg /* Establish appropriate back-end context for processing the function
   3238  1.1  mrg    FNDECL.  The argument might be NULL to indicate processing at top
   3239  1.1  mrg    level, outside of any function scope.  */
   3240  1.1  mrg void
   3241  1.1  mrg ix86_set_current_function (tree fndecl)
   3242  1.1  mrg {
   3243  1.1  mrg   /* Only change the context if the function changes.  This hook is called
   3244  1.1  mrg      several times in the course of compiling a function, and we don't want to
   3245  1.1  mrg      slow things down too much or call target_reinit when it isn't safe.  */
   3246  1.1  mrg   if (fndecl == ix86_previous_fndecl)
   3247  1.1  mrg     {
   3248  1.1  mrg       /* There may be 2 function bodies for the same function FNDECL,
   3249  1.1  mrg 	 one is extern inline and one isn't.  Call ix86_set_func_type
   3250  1.1  mrg 	 to set the func_type field.  */
   3251  1.1  mrg       if (fndecl != NULL_TREE)
   3252  1.1  mrg 	{
   3253  1.1  mrg 	  ix86_set_func_type (fndecl);
   3254  1.1  mrg 	  ix86_set_indirect_branch_type (fndecl);
   3255  1.1  mrg 	}
   3256  1.1  mrg       return;
   3257  1.1  mrg     }
   3258  1.1  mrg 
   3259  1.1  mrg   tree old_tree;
   3260  1.1  mrg   if (ix86_previous_fndecl == NULL_TREE)
   3261  1.1  mrg     old_tree = target_option_current_node;
   3262  1.1  mrg   else if (DECL_FUNCTION_SPECIFIC_TARGET (ix86_previous_fndecl))
   3263  1.1  mrg     old_tree = DECL_FUNCTION_SPECIFIC_TARGET (ix86_previous_fndecl);
   3264  1.1  mrg   else
   3265  1.1  mrg     old_tree = target_option_default_node;
   3266  1.1  mrg 
   3267  1.1  mrg   if (fndecl == NULL_TREE)
   3268  1.1  mrg     {
   3269  1.1  mrg       if (old_tree != target_option_current_node)
   3270  1.1  mrg 	ix86_reset_previous_fndecl ();
   3271  1.1  mrg       return;
   3272  1.1  mrg     }
   3273  1.1  mrg 
   3274  1.1  mrg   ix86_set_func_type (fndecl);
   3275  1.1  mrg   ix86_set_indirect_branch_type (fndecl);
   3276  1.1  mrg 
   3277  1.1  mrg   tree new_tree = DECL_FUNCTION_SPECIFIC_TARGET (fndecl);
   3278  1.1  mrg   if (new_tree == NULL_TREE)
   3279  1.1  mrg     new_tree = target_option_default_node;
   3280  1.1  mrg 
   3281  1.1  mrg   bool fp_flag_change
   3282  1.1  mrg     = (flag_unsafe_math_optimizations
   3283  1.1  mrg        != TREE_TARGET_OPTION (new_tree)->x_ix86_unsafe_math_optimizations
   3284  1.1  mrg        || (flag_excess_precision
   3285  1.1  mrg 	   != TREE_TARGET_OPTION (new_tree)->x_ix86_excess_precision));
   3286  1.1  mrg   if (old_tree != new_tree || fp_flag_change)
   3287  1.1  mrg     {
   3288  1.1  mrg       cl_target_option_restore (&global_options, &global_options_set,
   3289  1.1  mrg 				TREE_TARGET_OPTION (new_tree));
   3290  1.1  mrg       if (fp_flag_change)
   3291  1.1  mrg 	{
   3292  1.1  mrg 	  ix86_excess_precision = flag_excess_precision;
   3293  1.1  mrg 	  ix86_unsafe_math_optimizations = flag_unsafe_math_optimizations;
   3294  1.1  mrg 	  DECL_FUNCTION_SPECIFIC_TARGET (fndecl) = new_tree
   3295  1.1  mrg 	    = build_target_option_node (&global_options, &global_options_set);
   3296  1.1  mrg 	}
   3297  1.1  mrg       if (TREE_TARGET_GLOBALS (new_tree))
   3298  1.1  mrg 	restore_target_globals (TREE_TARGET_GLOBALS (new_tree));
   3299  1.1  mrg       else if (new_tree == target_option_default_node)
   3300  1.1  mrg 	restore_target_globals (&default_target_globals);
   3301  1.1  mrg       else
   3302  1.1  mrg 	TREE_TARGET_GLOBALS (new_tree) = save_target_globals_default_opts ();
   3303  1.1  mrg     }
   3304  1.1  mrg   ix86_previous_fndecl = fndecl;
   3305  1.1  mrg 
   3306  1.1  mrg   static bool prev_no_caller_saved_registers;
   3307  1.1  mrg 
   3308  1.1  mrg   /* 64-bit MS and SYSV ABI have different set of call used registers.
   3309  1.1  mrg      Avoid expensive re-initialization of init_regs each time we switch
   3310  1.1  mrg      function context.  */
   3311  1.1  mrg   if (TARGET_64BIT
   3312  1.1  mrg       && (call_used_or_fixed_reg_p (SI_REG)
   3313  1.1  mrg 	  == (cfun->machine->call_abi == MS_ABI)))
   3314  1.1  mrg     reinit_regs ();
   3315  1.1  mrg   /* Need to re-initialize init_regs if caller-saved registers are
   3316  1.1  mrg      changed.  */
   3317  1.1  mrg   else if (prev_no_caller_saved_registers
   3318  1.1  mrg 	   != cfun->machine->no_caller_saved_registers)
   3319  1.1  mrg     reinit_regs ();
   3320  1.1  mrg 
   3321  1.1  mrg   if (cfun->machine->func_type != TYPE_NORMAL
   3322  1.1  mrg       || cfun->machine->no_caller_saved_registers)
   3323  1.1  mrg     {
   3324  1.1  mrg       /* Don't allow SSE, MMX nor x87 instructions since they
   3325  1.1  mrg 	 may change processor state.  */
   3326  1.1  mrg       const char *isa;
   3327  1.1  mrg       if (TARGET_SSE)
   3328  1.1  mrg 	isa = "SSE";
   3329  1.1  mrg       else if (TARGET_MMX)
   3330  1.1  mrg 	isa = "MMX/3Dnow";
   3331  1.1  mrg       else if (TARGET_80387)
   3332  1.1  mrg 	isa = "80387";
   3333  1.1  mrg       else
   3334  1.1  mrg 	isa = NULL;
   3335  1.1  mrg       if (isa != NULL)
   3336  1.1  mrg 	{
   3337  1.1  mrg 	  if (cfun->machine->func_type != TYPE_NORMAL)
   3338  1.1  mrg 	    sorry (cfun->machine->func_type == TYPE_EXCEPTION
   3339  1.1  mrg 		   ? G_("%s instructions aren%'t allowed in an"
   3340  1.1  mrg 			" exception service routine")
   3341  1.1  mrg 		   : G_("%s instructions aren%'t allowed in an"
   3342  1.1  mrg 			" interrupt service routine"),
   3343  1.1  mrg 		   isa);
   3344  1.1  mrg 	  else
   3345  1.1  mrg 	    sorry ("%s instructions aren%'t allowed in a function with "
   3346  1.1  mrg 		   "the %<no_caller_saved_registers%> attribute", isa);
   3347  1.1  mrg 	  /* Don't issue the same error twice.  */
   3348  1.1  mrg 	  cfun->machine->func_type = TYPE_NORMAL;
   3349  1.1  mrg 	  cfun->machine->no_caller_saved_registers = false;
   3350  1.1  mrg 	}
   3351  1.1  mrg     }
   3352  1.1  mrg 
   3353  1.1  mrg   prev_no_caller_saved_registers
   3354  1.1  mrg     = cfun->machine->no_caller_saved_registers;
   3355  1.1  mrg }
   3356  1.1  mrg 
   3357  1.1  mrg /* Implement the TARGET_OFFLOAD_OPTIONS hook.  */
   3358  1.1  mrg char *
   3359  1.1  mrg ix86_offload_options (void)
   3360  1.1  mrg {
   3361  1.1  mrg   if (TARGET_LP64)
   3362  1.1  mrg     return xstrdup ("-foffload-abi=lp64");
   3363  1.1  mrg   return xstrdup ("-foffload-abi=ilp32");
   3364  1.1  mrg }
   3365  1.1  mrg 
   3366  1.1  mrg /* Handle "cdecl", "stdcall", "fastcall", "regparm", "thiscall",
   3367  1.1  mrg    and "sseregparm" calling convention attributes;
   3368  1.1  mrg    arguments as in struct attribute_spec.handler.  */
   3369  1.1  mrg 
   3370  1.1  mrg static tree
   3371  1.1  mrg ix86_handle_cconv_attribute (tree *node, tree name, tree args, int,
   3372  1.1  mrg 			     bool *no_add_attrs)
   3373  1.1  mrg {
   3374  1.1  mrg   if (TREE_CODE (*node) != FUNCTION_TYPE
   3375  1.1  mrg       && TREE_CODE (*node) != METHOD_TYPE
   3376  1.1  mrg       && TREE_CODE (*node) != FIELD_DECL
   3377  1.1  mrg       && TREE_CODE (*node) != TYPE_DECL)
   3378  1.1  mrg     {
   3379  1.1  mrg       warning (OPT_Wattributes, "%qE attribute only applies to functions",
   3380  1.1  mrg 	       name);
   3381  1.1  mrg       *no_add_attrs = true;
   3382  1.1  mrg       return NULL_TREE;
   3383  1.1  mrg     }
   3384  1.1  mrg 
   3385  1.1  mrg   /* Can combine regparm with all attributes but fastcall, and thiscall.  */
   3386  1.1  mrg   if (is_attribute_p ("regparm", name))
   3387  1.1  mrg     {
   3388  1.1  mrg       tree cst;
   3389  1.1  mrg 
   3390  1.1  mrg       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (*node)))
   3391  1.1  mrg         {
   3392  1.1  mrg 	  error ("fastcall and regparm attributes are not compatible");
   3393  1.1  mrg 	}
   3394  1.1  mrg 
   3395  1.1  mrg       if (lookup_attribute ("thiscall", TYPE_ATTRIBUTES (*node)))
   3396  1.1  mrg 	{
   3397  1.1  mrg 	  error ("regparam and thiscall attributes are not compatible");
   3398  1.1  mrg 	}
   3399  1.1  mrg 
   3400  1.1  mrg       cst = TREE_VALUE (args);
   3401  1.1  mrg       if (TREE_CODE (cst) != INTEGER_CST)
   3402  1.1  mrg 	{
   3403  1.1  mrg 	  warning (OPT_Wattributes,
   3404  1.1  mrg 		   "%qE attribute requires an integer constant argument",
   3405  1.1  mrg 		   name);
   3406  1.1  mrg 	  *no_add_attrs = true;
   3407  1.1  mrg 	}
   3408  1.1  mrg       else if (compare_tree_int (cst, REGPARM_MAX) > 0)
   3409  1.1  mrg 	{
   3410  1.1  mrg 	  warning (OPT_Wattributes, "argument to %qE attribute larger than %d",
   3411  1.1  mrg 		   name, REGPARM_MAX);
   3412  1.1  mrg 	  *no_add_attrs = true;
   3413  1.1  mrg 	}
   3414  1.1  mrg 
   3415  1.1  mrg       return NULL_TREE;
   3416  1.1  mrg     }
   3417  1.1  mrg 
   3418  1.1  mrg   if (TARGET_64BIT)
   3419  1.1  mrg     {
   3420  1.1  mrg       /* Do not warn when emulating the MS ABI.  */
   3421  1.1  mrg       if ((TREE_CODE (*node) != FUNCTION_TYPE
   3422  1.1  mrg 	   && TREE_CODE (*node) != METHOD_TYPE)
   3423  1.1  mrg 	  || ix86_function_type_abi (*node) != MS_ABI)
   3424  1.1  mrg 	warning (OPT_Wattributes, "%qE attribute ignored",
   3425  1.1  mrg 	         name);
   3426  1.1  mrg       *no_add_attrs = true;
   3427  1.1  mrg       return NULL_TREE;
   3428  1.1  mrg     }
   3429  1.1  mrg 
   3430  1.1  mrg   /* Can combine fastcall with stdcall (redundant) and sseregparm.  */
   3431  1.1  mrg   if (is_attribute_p ("fastcall", name))
   3432  1.1  mrg     {
   3433  1.1  mrg       if (lookup_attribute ("cdecl", TYPE_ATTRIBUTES (*node)))
   3434  1.1  mrg         {
   3435  1.1  mrg 	  error ("fastcall and cdecl attributes are not compatible");
   3436  1.1  mrg 	}
   3437  1.1  mrg       if (lookup_attribute ("stdcall", TYPE_ATTRIBUTES (*node)))
   3438  1.1  mrg         {
   3439  1.1  mrg 	  error ("fastcall and stdcall attributes are not compatible");
   3440  1.1  mrg 	}
   3441  1.1  mrg       if (lookup_attribute ("regparm", TYPE_ATTRIBUTES (*node)))
   3442  1.1  mrg         {
   3443  1.1  mrg 	  error ("fastcall and regparm attributes are not compatible");
   3444  1.1  mrg 	}
   3445  1.1  mrg       if (lookup_attribute ("thiscall", TYPE_ATTRIBUTES (*node)))
   3446  1.1  mrg 	{
   3447  1.1  mrg 	  error ("fastcall and thiscall attributes are not compatible");
   3448  1.1  mrg 	}
   3449  1.1  mrg     }
   3450  1.1  mrg 
   3451  1.1  mrg   /* Can combine stdcall with fastcall (redundant), regparm and
   3452  1.1  mrg      sseregparm.  */
   3453  1.1  mrg   else if (is_attribute_p ("stdcall", name))
   3454  1.1  mrg     {
   3455  1.1  mrg       if (lookup_attribute ("cdecl", TYPE_ATTRIBUTES (*node)))
   3456  1.1  mrg         {
   3457  1.1  mrg 	  error ("stdcall and cdecl attributes are not compatible");
   3458  1.1  mrg 	}
   3459  1.1  mrg       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (*node)))
   3460  1.1  mrg         {
   3461  1.1  mrg 	  error ("stdcall and fastcall attributes are not compatible");
   3462  1.1  mrg 	}
   3463  1.1  mrg       if (lookup_attribute ("thiscall", TYPE_ATTRIBUTES (*node)))
   3464  1.1  mrg 	{
   3465  1.1  mrg 	  error ("stdcall and thiscall attributes are not compatible");
   3466  1.1  mrg 	}
   3467  1.1  mrg     }
   3468  1.1  mrg 
   3469  1.1  mrg   /* Can combine cdecl with regparm and sseregparm.  */
   3470  1.1  mrg   else if (is_attribute_p ("cdecl", name))
   3471  1.1  mrg     {
   3472  1.1  mrg       if (lookup_attribute ("stdcall", TYPE_ATTRIBUTES (*node)))
   3473  1.1  mrg         {
   3474  1.1  mrg 	  error ("stdcall and cdecl attributes are not compatible");
   3475  1.1  mrg 	}
   3476  1.1  mrg       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (*node)))
   3477  1.1  mrg         {
   3478  1.1  mrg 	  error ("fastcall and cdecl attributes are not compatible");
   3479  1.1  mrg 	}
   3480  1.1  mrg       if (lookup_attribute ("thiscall", TYPE_ATTRIBUTES (*node)))
   3481  1.1  mrg 	{
   3482  1.1  mrg 	  error ("cdecl and thiscall attributes are not compatible");
   3483  1.1  mrg 	}
   3484  1.1  mrg     }
   3485  1.1  mrg   else if (is_attribute_p ("thiscall", name))
   3486  1.1  mrg     {
   3487  1.1  mrg       if (TREE_CODE (*node) != METHOD_TYPE && pedantic)
   3488  1.1  mrg 	warning (OPT_Wattributes, "%qE attribute is used for non-class method",
   3489  1.1  mrg 	         name);
   3490  1.1  mrg       if (lookup_attribute ("stdcall", TYPE_ATTRIBUTES (*node)))
   3491  1.1  mrg 	{
   3492  1.1  mrg 	  error ("stdcall and thiscall attributes are not compatible");
   3493  1.1  mrg 	}
   3494  1.1  mrg       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (*node)))
   3495  1.1  mrg 	{
   3496  1.1  mrg 	  error ("fastcall and thiscall attributes are not compatible");
   3497  1.1  mrg 	}
   3498  1.1  mrg       if (lookup_attribute ("cdecl", TYPE_ATTRIBUTES (*node)))
   3499  1.1  mrg 	{
   3500  1.1  mrg 	  error ("cdecl and thiscall attributes are not compatible");
   3501  1.1  mrg 	}
   3502  1.1  mrg     }
   3503  1.1  mrg 
   3504  1.1  mrg   /* Can combine sseregparm with all attributes.  */
   3505  1.1  mrg 
   3506  1.1  mrg   return NULL_TREE;
   3507  1.1  mrg }
   3508  1.1  mrg 
   3509  1.1  mrg #ifndef CHECK_STACK_LIMIT
   3510  1.1  mrg #define CHECK_STACK_LIMIT (-1)
   3511  1.1  mrg #endif
   3512  1.1  mrg 
   3513  1.1  mrg /* The transactional memory builtins are implicitly regparm or fastcall
   3514  1.1  mrg    depending on the ABI.  Override the generic do-nothing attribute that
   3515  1.1  mrg    these builtins were declared with, and replace it with one of the two
   3516  1.1  mrg    attributes that we expect elsewhere.  */
   3517  1.1  mrg 
   3518  1.1  mrg static tree
   3519  1.1  mrg ix86_handle_tm_regparm_attribute (tree *node, tree, tree,
   3520  1.1  mrg 				  int flags, bool *no_add_attrs)
   3521  1.1  mrg {
   3522  1.1  mrg   tree alt;
   3523  1.1  mrg 
   3524  1.1  mrg   /* In no case do we want to add the placeholder attribute.  */
   3525  1.1  mrg   *no_add_attrs = true;
   3526  1.1  mrg 
   3527  1.1  mrg   /* The 64-bit ABI is unchanged for transactional memory.  */
   3528  1.1  mrg   if (TARGET_64BIT)
   3529  1.1  mrg     return NULL_TREE;
   3530  1.1  mrg 
   3531  1.1  mrg   /* ??? Is there a better way to validate 32-bit windows?  We have
   3532  1.1  mrg      cfun->machine->call_abi, but that seems to be set only for 64-bit.  */
   3533  1.1  mrg   if (CHECK_STACK_LIMIT > 0)
   3534  1.1  mrg     alt = tree_cons (get_identifier ("fastcall"), NULL, NULL);
   3535  1.1  mrg   else
   3536  1.1  mrg     {
   3537  1.1  mrg       alt = tree_cons (NULL, build_int_cst (NULL, 2), NULL);
   3538  1.1  mrg       alt = tree_cons (get_identifier ("regparm"), alt, NULL);
   3539  1.1  mrg     }
   3540  1.1  mrg   decl_attributes (node, alt, flags);
   3541  1.1  mrg 
   3542  1.1  mrg   return NULL_TREE;
   3543  1.1  mrg }
   3544  1.1  mrg 
   3545  1.1  mrg /* Handle a "force_align_arg_pointer" attribute.  */
   3546  1.1  mrg 
   3547  1.1  mrg static tree
   3548  1.1  mrg ix86_handle_force_align_arg_pointer_attribute (tree *node, tree name,
   3549  1.1  mrg 					       tree, int, bool *no_add_attrs)
   3550  1.1  mrg {
   3551  1.1  mrg   if (TREE_CODE (*node) != FUNCTION_TYPE
   3552  1.1  mrg       && TREE_CODE (*node) != METHOD_TYPE
   3553  1.1  mrg       && TREE_CODE (*node) != FIELD_DECL
   3554  1.1  mrg       && TREE_CODE (*node) != TYPE_DECL)
   3555  1.1  mrg     {
   3556  1.1  mrg       warning (OPT_Wattributes, "%qE attribute only applies to functions",
   3557  1.1  mrg 	       name);
   3558  1.1  mrg       *no_add_attrs = true;
   3559  1.1  mrg     }
   3560  1.1  mrg 
   3561  1.1  mrg   return NULL_TREE;
   3562  1.1  mrg }
   3563  1.1  mrg 
   3564  1.1  mrg /* Handle a "ms_struct" or "gcc_struct" attribute; arguments as in
   3565  1.1  mrg    struct attribute_spec.handler.  */
   3566  1.1  mrg 
   3567  1.1  mrg static tree
   3568  1.1  mrg ix86_handle_struct_attribute (tree *node, tree name, tree, int,
   3569  1.1  mrg 			      bool *no_add_attrs)
   3570  1.1  mrg {
   3571  1.1  mrg   tree *type = NULL;
   3572  1.1  mrg   if (DECL_P (*node))
   3573  1.1  mrg     {
   3574  1.1  mrg       if (TREE_CODE (*node) == TYPE_DECL)
   3575  1.1  mrg 	type = &TREE_TYPE (*node);
   3576  1.1  mrg     }
   3577  1.1  mrg   else
   3578  1.1  mrg     type = node;
   3579  1.1  mrg 
   3580  1.1  mrg   if (!(type && RECORD_OR_UNION_TYPE_P (*type)))
   3581  1.1  mrg     {
   3582  1.1  mrg       warning (OPT_Wattributes, "%qE attribute ignored",
   3583  1.1  mrg 	       name);
   3584  1.1  mrg       *no_add_attrs = true;
   3585  1.1  mrg     }
   3586  1.1  mrg 
   3587  1.1  mrg   else if ((is_attribute_p ("ms_struct", name)
   3588  1.1  mrg 	    && lookup_attribute ("gcc_struct", TYPE_ATTRIBUTES (*type)))
   3589  1.1  mrg 	   || ((is_attribute_p ("gcc_struct", name)
   3590  1.1  mrg 		&& lookup_attribute ("ms_struct", TYPE_ATTRIBUTES (*type)))))
   3591  1.1  mrg     {
   3592  1.1  mrg       warning (OPT_Wattributes, "%qE incompatible attribute ignored",
   3593  1.1  mrg                name);
   3594  1.1  mrg       *no_add_attrs = true;
   3595  1.1  mrg     }
   3596  1.1  mrg 
   3597  1.1  mrg   return NULL_TREE;
   3598  1.1  mrg }
   3599  1.1  mrg 
   3600  1.1  mrg /* Handle a "callee_pop_aggregate_return" attribute; arguments as
   3601  1.1  mrg    in struct attribute_spec handler.  */
   3602  1.1  mrg 
   3603  1.1  mrg static tree
   3604  1.1  mrg ix86_handle_callee_pop_aggregate_return (tree *node, tree name, tree args, int,
   3605  1.1  mrg 					 bool *no_add_attrs)
   3606  1.1  mrg {
   3607  1.1  mrg   if (TREE_CODE (*node) != FUNCTION_TYPE
   3608  1.1  mrg       && TREE_CODE (*node) != METHOD_TYPE
   3609  1.1  mrg       && TREE_CODE (*node) != FIELD_DECL
   3610  1.1  mrg       && TREE_CODE (*node) != TYPE_DECL)
   3611  1.1  mrg     {
   3612  1.1  mrg       warning (OPT_Wattributes, "%qE attribute only applies to functions",
   3613  1.1  mrg 	       name);
   3614  1.1  mrg       *no_add_attrs = true;
   3615  1.1  mrg       return NULL_TREE;
   3616  1.1  mrg     }
   3617  1.1  mrg   if (TARGET_64BIT)
   3618  1.1  mrg     {
   3619  1.1  mrg       warning (OPT_Wattributes, "%qE attribute only available for 32-bit",
   3620  1.1  mrg 	       name);
   3621  1.1  mrg       *no_add_attrs = true;
   3622  1.1  mrg       return NULL_TREE;
   3623  1.1  mrg     }
   3624  1.1  mrg   if (is_attribute_p ("callee_pop_aggregate_return", name))
   3625  1.1  mrg     {
   3626  1.1  mrg       tree cst;
   3627  1.1  mrg 
   3628  1.1  mrg       cst = TREE_VALUE (args);
   3629  1.1  mrg       if (TREE_CODE (cst) != INTEGER_CST)
   3630  1.1  mrg 	{
   3631  1.1  mrg 	  warning (OPT_Wattributes,
   3632  1.1  mrg 		   "%qE attribute requires an integer constant argument",
   3633  1.1  mrg 		   name);
   3634  1.1  mrg 	  *no_add_attrs = true;
   3635  1.1  mrg 	}
   3636  1.1  mrg       else if (compare_tree_int (cst, 0) != 0
   3637  1.1  mrg 	       && compare_tree_int (cst, 1) != 0)
   3638  1.1  mrg 	{
   3639  1.1  mrg 	  warning (OPT_Wattributes,
   3640  1.1  mrg 		   "argument to %qE attribute is neither zero, nor one",
   3641  1.1  mrg 		   name);
   3642  1.1  mrg 	  *no_add_attrs = true;
   3643  1.1  mrg 	}
   3644  1.1  mrg 
   3645  1.1  mrg       return NULL_TREE;
   3646  1.1  mrg     }
   3647  1.1  mrg 
   3648  1.1  mrg   return NULL_TREE;
   3649  1.1  mrg }
   3650  1.1  mrg 
   3651  1.1  mrg /* Handle a "ms_abi" or "sysv" attribute; arguments as in
   3652  1.1  mrg    struct attribute_spec.handler.  */
   3653  1.1  mrg 
   3654  1.1  mrg static tree
   3655  1.1  mrg ix86_handle_abi_attribute (tree *node, tree name, tree, int,
   3656  1.1  mrg 			   bool *no_add_attrs)
   3657  1.1  mrg {
   3658  1.1  mrg   if (TREE_CODE (*node) != FUNCTION_TYPE
   3659  1.1  mrg       && TREE_CODE (*node) != METHOD_TYPE
   3660  1.1  mrg       && TREE_CODE (*node) != FIELD_DECL
   3661  1.1  mrg       && TREE_CODE (*node) != TYPE_DECL)
   3662  1.1  mrg     {
   3663  1.1  mrg       warning (OPT_Wattributes, "%qE attribute only applies to functions",
   3664  1.1  mrg 	       name);
   3665  1.1  mrg       *no_add_attrs = true;
   3666  1.1  mrg       return NULL_TREE;
   3667  1.1  mrg     }
   3668  1.1  mrg 
   3669  1.1  mrg   /* Can combine regparm with all attributes but fastcall.  */
   3670  1.1  mrg   if (is_attribute_p ("ms_abi", name))
   3671  1.1  mrg     {
   3672  1.1  mrg       if (lookup_attribute ("sysv_abi", TYPE_ATTRIBUTES (*node)))
   3673  1.1  mrg         {
   3674  1.1  mrg 	  error ("%qs and %qs attributes are not compatible",
   3675  1.1  mrg 		 "ms_abi", "sysv_abi");
   3676  1.1  mrg 	}
   3677  1.1  mrg 
   3678  1.1  mrg       return NULL_TREE;
   3679  1.1  mrg     }
   3680  1.1  mrg   else if (is_attribute_p ("sysv_abi", name))
   3681  1.1  mrg     {
   3682  1.1  mrg       if (lookup_attribute ("ms_abi", TYPE_ATTRIBUTES (*node)))
   3683  1.1  mrg         {
   3684  1.1  mrg 	  error ("%qs and %qs attributes are not compatible",
   3685  1.1  mrg 		 "ms_abi", "sysv_abi");
   3686  1.1  mrg 	}
   3687  1.1  mrg 
   3688  1.1  mrg       return NULL_TREE;
   3689  1.1  mrg     }
   3690  1.1  mrg 
   3691  1.1  mrg   return NULL_TREE;
   3692  1.1  mrg }
   3693  1.1  mrg 
   3694  1.1  mrg static tree
   3695  1.1  mrg ix86_handle_fndecl_attribute (tree *node, tree name, tree args, int,
   3696  1.1  mrg 			      bool *no_add_attrs)
   3697  1.1  mrg {
   3698  1.1  mrg   if (TREE_CODE (*node) != FUNCTION_DECL)
   3699  1.1  mrg     {
   3700  1.1  mrg       warning (OPT_Wattributes, "%qE attribute only applies to functions",
   3701  1.1  mrg                name);
   3702  1.1  mrg       *no_add_attrs = true;
   3703  1.1  mrg     }
   3704  1.1  mrg 
   3705  1.1  mrg   if (is_attribute_p ("indirect_branch", name))
   3706  1.1  mrg     {
   3707  1.1  mrg       tree cst = TREE_VALUE (args);
   3708  1.1  mrg       if (TREE_CODE (cst) != STRING_CST)
   3709  1.1  mrg 	{
   3710  1.1  mrg 	  warning (OPT_Wattributes,
   3711  1.1  mrg 		   "%qE attribute requires a string constant argument",
   3712  1.1  mrg 		   name);
   3713  1.1  mrg 	  *no_add_attrs = true;
   3714  1.1  mrg 	}
   3715  1.1  mrg       else if (strcmp (TREE_STRING_POINTER (cst), "keep") != 0
   3716  1.1  mrg 	       && strcmp (TREE_STRING_POINTER (cst), "thunk") != 0
   3717  1.1  mrg 	       && strcmp (TREE_STRING_POINTER (cst), "thunk-inline") != 0
   3718  1.1  mrg 	       && strcmp (TREE_STRING_POINTER (cst), "thunk-extern") != 0)
   3719  1.1  mrg 	{
   3720  1.1  mrg 	  warning (OPT_Wattributes,
   3721  1.1  mrg 		   "argument to %qE attribute is not "
   3722  1.1  mrg 		   "(keep|thunk|thunk-inline|thunk-extern)", name);
   3723  1.1  mrg 	  *no_add_attrs = true;
   3724  1.1  mrg 	}
   3725  1.1  mrg     }
   3726  1.1  mrg 
   3727  1.1  mrg   if (is_attribute_p ("function_return", name))
   3728  1.1  mrg     {
   3729  1.1  mrg       tree cst = TREE_VALUE (args);
   3730  1.1  mrg       if (TREE_CODE (cst) != STRING_CST)
   3731  1.1  mrg 	{
   3732  1.1  mrg 	  warning (OPT_Wattributes,
   3733  1.1  mrg 		   "%qE attribute requires a string constant argument",
   3734  1.1  mrg 		   name);
   3735  1.1  mrg 	  *no_add_attrs = true;
   3736  1.1  mrg 	}
   3737  1.1  mrg       else if (strcmp (TREE_STRING_POINTER (cst), "keep") != 0
   3738  1.1  mrg 	       && strcmp (TREE_STRING_POINTER (cst), "thunk") != 0
   3739  1.1  mrg 	       && strcmp (TREE_STRING_POINTER (cst), "thunk-inline") != 0
   3740  1.1  mrg 	       && strcmp (TREE_STRING_POINTER (cst), "thunk-extern") != 0)
   3741  1.1  mrg 	{
   3742  1.1  mrg 	  warning (OPT_Wattributes,
   3743  1.1  mrg 		   "argument to %qE attribute is not "
   3744  1.1  mrg 		   "(keep|thunk|thunk-inline|thunk-extern)", name);
   3745  1.1  mrg 	  *no_add_attrs = true;
   3746  1.1  mrg 	}
   3747  1.1  mrg     }
   3748  1.1  mrg 
   3749  1.1  mrg   return NULL_TREE;
   3750  1.1  mrg }
   3751  1.1  mrg 
   3752  1.1  mrg static tree
   3753  1.1  mrg ix86_handle_no_caller_saved_registers_attribute (tree *, tree, tree,
   3754  1.1  mrg 						 int, bool *)
   3755  1.1  mrg {
   3756  1.1  mrg   return NULL_TREE;
   3757  1.1  mrg }
   3758  1.1  mrg 
   3759  1.1  mrg static tree
   3760  1.1  mrg ix86_handle_interrupt_attribute (tree *node, tree, tree, int, bool *)
   3761  1.1  mrg {
   3762  1.1  mrg   /* DECL_RESULT and DECL_ARGUMENTS do not exist there yet,
   3763  1.1  mrg      but the function type contains args and return type data.  */
   3764  1.1  mrg   tree func_type = *node;
   3765  1.1  mrg   tree return_type = TREE_TYPE (func_type);
   3766  1.1  mrg 
   3767  1.1  mrg   int nargs = 0;
   3768  1.1  mrg   tree current_arg_type = TYPE_ARG_TYPES (func_type);
   3769  1.1  mrg   while (current_arg_type
   3770  1.1  mrg 	 && ! VOID_TYPE_P (TREE_VALUE (current_arg_type)))
   3771  1.1  mrg     {
   3772  1.1  mrg       if (nargs == 0)
   3773  1.1  mrg 	{
   3774  1.1  mrg 	  if (! POINTER_TYPE_P (TREE_VALUE (current_arg_type)))
   3775  1.1  mrg 	    error ("interrupt service routine should have a pointer "
   3776  1.1  mrg 		   "as the first argument");
   3777  1.1  mrg 	}
   3778  1.1  mrg       else if (nargs == 1)
   3779  1.1  mrg 	{
   3780  1.1  mrg 	  if (TREE_CODE (TREE_VALUE (current_arg_type)) != INTEGER_TYPE
   3781  1.1  mrg 	      || TYPE_MODE (TREE_VALUE (current_arg_type)) != word_mode)
   3782  1.1  mrg 	    error ("interrupt service routine should have %qs "
   3783  1.1  mrg 		   "as the second argument",
   3784  1.1  mrg 		   TARGET_64BIT
   3785  1.1  mrg 		   ? (TARGET_X32 ? "unsigned long long int"
   3786  1.1  mrg 				 : "unsigned long int")
   3787  1.1  mrg 		   : "unsigned int");
   3788  1.1  mrg 	}
   3789  1.1  mrg       nargs++;
   3790  1.1  mrg       current_arg_type = TREE_CHAIN (current_arg_type);
   3791  1.1  mrg     }
   3792  1.1  mrg   if (!nargs || nargs > 2)
   3793  1.1  mrg     error ("interrupt service routine can only have a pointer argument "
   3794  1.1  mrg 	   "and an optional integer argument");
   3795  1.1  mrg   if (! VOID_TYPE_P (return_type))
   3796  1.1  mrg     error ("interrupt service routine must return %<void%>");
   3797  1.1  mrg 
   3798  1.1  mrg   return NULL_TREE;
   3799  1.1  mrg }
   3800  1.1  mrg 
   3801  1.1  mrg /* Handle fentry_name / fentry_section attribute.  */
   3802  1.1  mrg 
   3803  1.1  mrg static tree
   3804  1.1  mrg ix86_handle_fentry_name (tree *node, tree name, tree args,
   3805  1.1  mrg 			 int, bool *no_add_attrs)
   3806  1.1  mrg {
   3807  1.1  mrg   if (TREE_CODE (*node) == FUNCTION_DECL
   3808  1.1  mrg       && TREE_CODE (TREE_VALUE (args)) == STRING_CST)
   3809  1.1  mrg     /* Do nothing else, just set the attribute.  We'll get at
   3810  1.1  mrg        it later with lookup_attribute.  */
   3811  1.1  mrg     ;
   3812  1.1  mrg   else
   3813  1.1  mrg     {
   3814  1.1  mrg       warning (OPT_Wattributes, "%qE attribute ignored", name);
   3815  1.1  mrg       *no_add_attrs = true;
   3816  1.1  mrg     }
   3817  1.1  mrg 
   3818  1.1  mrg   return NULL_TREE;
   3819  1.1  mrg }
   3820  1.1  mrg 
   3821  1.1  mrg /* Handle a "nodirect_extern_access" attribute; arguments as in
   3822  1.1  mrg    struct attribute_spec.handler.  */
   3823  1.1  mrg 
   3824  1.1  mrg static tree
   3825  1.1  mrg handle_nodirect_extern_access_attribute (tree *pnode, tree name,
   3826  1.1  mrg 					 tree ARG_UNUSED (args),
   3827  1.1  mrg 					 int ARG_UNUSED (flags),
   3828  1.1  mrg 					 bool *no_add_attrs)
   3829  1.1  mrg {
   3830  1.1  mrg   tree node = *pnode;
   3831  1.1  mrg 
   3832  1.1  mrg   if (VAR_OR_FUNCTION_DECL_P (node))
   3833  1.1  mrg     {
   3834  1.1  mrg       if ((!TREE_STATIC (node) && TREE_CODE (node) != FUNCTION_DECL
   3835  1.1  mrg 	   && !DECL_EXTERNAL (node)) || !TREE_PUBLIC (node))
   3836  1.1  mrg 	{
   3837  1.1  mrg 	  warning (OPT_Wattributes,
   3838  1.1  mrg 		   "%qE attribute have effect only on public objects", name);
   3839  1.1  mrg 	  *no_add_attrs = true;
   3840  1.1  mrg 	}
   3841  1.1  mrg     }
   3842  1.1  mrg   else
   3843  1.1  mrg     {
   3844  1.1  mrg       warning (OPT_Wattributes, "%qE attribute ignored", name);
   3845  1.1  mrg       *no_add_attrs = true;
   3846  1.1  mrg     }
   3847  1.1  mrg 
   3848  1.1  mrg   return NULL_TREE;
   3849  1.1  mrg }
   3850  1.1  mrg 
   3851  1.1  mrg /* Table of valid machine attributes.  */
   3852  1.1  mrg const struct attribute_spec ix86_attribute_table[] =
   3853  1.1  mrg {
   3854  1.1  mrg   /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
   3855  1.1  mrg        affects_type_identity, handler, exclude } */
   3856  1.1  mrg   /* Stdcall attribute says callee is responsible for popping arguments
   3857  1.1  mrg      if they are not variable.  */
   3858  1.1  mrg   { "stdcall",   0, 0, false, true,  true,  true, ix86_handle_cconv_attribute,
   3859  1.1  mrg     NULL },
   3860  1.1  mrg   /* Fastcall attribute says callee is responsible for popping arguments
   3861  1.1  mrg      if they are not variable.  */
   3862  1.1  mrg   { "fastcall",  0, 0, false, true,  true,  true, ix86_handle_cconv_attribute,
   3863  1.1  mrg     NULL },
   3864  1.1  mrg   /* Thiscall attribute says callee is responsible for popping arguments
   3865  1.1  mrg      if they are not variable.  */
   3866  1.1  mrg   { "thiscall",  0, 0, false, true,  true,  true, ix86_handle_cconv_attribute,
   3867  1.1  mrg     NULL },
   3868  1.1  mrg   /* Cdecl attribute says the callee is a normal C declaration */
   3869  1.1  mrg   { "cdecl",     0, 0, false, true,  true,  true, ix86_handle_cconv_attribute,
   3870  1.1  mrg     NULL },
   3871  1.1  mrg   /* Regparm attribute specifies how many integer arguments are to be
   3872  1.1  mrg      passed in registers.  */
   3873  1.1  mrg   { "regparm",   1, 1, false, true,  true,  true, ix86_handle_cconv_attribute,
   3874  1.1  mrg     NULL },
   3875  1.1  mrg   /* Sseregparm attribute says we are using x86_64 calling conventions
   3876  1.1  mrg      for FP arguments.  */
   3877  1.1  mrg   { "sseregparm", 0, 0, false, true, true,  true, ix86_handle_cconv_attribute,
   3878  1.1  mrg     NULL },
   3879  1.1  mrg   /* The transactional memory builtins are implicitly regparm or fastcall
   3880  1.1  mrg      depending on the ABI.  Override the generic do-nothing attribute that
   3881  1.1  mrg      these builtins were declared with.  */
   3882  1.1  mrg   { "*tm regparm", 0, 0, false, true, true, true,
   3883  1.1  mrg     ix86_handle_tm_regparm_attribute, NULL },
   3884  1.1  mrg   /* force_align_arg_pointer says this function realigns the stack at entry.  */
   3885  1.1  mrg   { "force_align_arg_pointer", 0, 0,
   3886  1.1  mrg     false, true,  true, false, ix86_handle_force_align_arg_pointer_attribute,
   3887  1.1  mrg     NULL },
   3888  1.1  mrg #if TARGET_DLLIMPORT_DECL_ATTRIBUTES
   3889  1.1  mrg   { "dllimport", 0, 0, false, false, false, false, handle_dll_attribute,
   3890  1.1  mrg     NULL },
   3891  1.1  mrg   { "dllexport", 0, 0, false, false, false, false, handle_dll_attribute,
   3892  1.1  mrg     NULL },
   3893  1.1  mrg   { "shared",    0, 0, true,  false, false, false,
   3894  1.1  mrg     ix86_handle_shared_attribute, NULL },
   3895  1.1  mrg #endif
   3896  1.1  mrg   { "ms_struct", 0, 0, false, false,  false, false,
   3897  1.1  mrg     ix86_handle_struct_attribute, NULL },
   3898  1.1  mrg   { "gcc_struct", 0, 0, false, false,  false, false,
   3899  1.1  mrg     ix86_handle_struct_attribute, NULL },
   3900  1.1  mrg #ifdef SUBTARGET_ATTRIBUTE_TABLE
   3901  1.1  mrg   SUBTARGET_ATTRIBUTE_TABLE,
   3902  1.1  mrg #endif
   3903  1.1  mrg   /* ms_abi and sysv_abi calling convention function attributes.  */
   3904  1.1  mrg   { "ms_abi", 0, 0, false, true, true, true, ix86_handle_abi_attribute, NULL },
   3905  1.1  mrg   { "sysv_abi", 0, 0, false, true, true, true, ix86_handle_abi_attribute,
   3906  1.1  mrg     NULL },
   3907  1.1  mrg   { "ms_abi va_list", 0, 0, false, false, false, false, NULL, NULL },
   3908  1.1  mrg   { "sysv_abi va_list", 0, 0, false, false, false, false, NULL, NULL },
   3909  1.1  mrg   { "ms_hook_prologue", 0, 0, true, false, false, false,
   3910  1.1  mrg     ix86_handle_fndecl_attribute, NULL },
   3911  1.1  mrg   { "callee_pop_aggregate_return", 1, 1, false, true, true, true,
   3912  1.1  mrg     ix86_handle_callee_pop_aggregate_return, NULL },
   3913  1.1  mrg   { "interrupt", 0, 0, false, true, true, false,
   3914  1.1  mrg     ix86_handle_interrupt_attribute, NULL },
   3915  1.1  mrg   { "no_caller_saved_registers", 0, 0, false, true, true, false,
   3916  1.1  mrg     ix86_handle_no_caller_saved_registers_attribute, NULL },
   3917  1.1  mrg   { "naked", 0, 0, true, false, false, false,
   3918  1.1  mrg     ix86_handle_fndecl_attribute, NULL },
   3919  1.1  mrg   { "indirect_branch", 1, 1, true, false, false, false,
   3920  1.1  mrg     ix86_handle_fndecl_attribute, NULL },
   3921  1.1  mrg   { "function_return", 1, 1, true, false, false, false,
   3922  1.1  mrg     ix86_handle_fndecl_attribute, NULL },
   3923  1.1  mrg   { "indirect_return", 0, 0, false, true, true, false,
   3924  1.1  mrg     NULL, NULL },
   3925  1.1  mrg   { "fentry_name", 1, 1, true, false, false, false,
   3926  1.1  mrg     ix86_handle_fentry_name, NULL },
   3927  1.1  mrg   { "fentry_section", 1, 1, true, false, false, false,
   3928  1.1  mrg     ix86_handle_fentry_name, NULL },
   3929  1.1  mrg   { "cf_check", 0, 0, true, false, false, false,
   3930  1.1  mrg     ix86_handle_fndecl_attribute, NULL },
   3931  1.1  mrg   { "nodirect_extern_access", 0, 0, true, false, false, false,
   3932  1.1  mrg     handle_nodirect_extern_access_attribute, NULL },
   3933  1.1  mrg 
   3934  1.1  mrg   /* End element.  */
   3935  1.1  mrg   { NULL, 0, 0, false, false, false, false, NULL, NULL }
   3936  1.1  mrg };
   3937           
   3938           #include "gt-i386-options.h"
   3939