i386-options.cc revision 1.1 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