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