Branch data Line data Source code
1 : : /* Subroutines used for macro/preprocessor support on the ia-32.
2 : : Copyright (C) 2008-2025 Free Software Foundation, Inc.
3 : :
4 : : This file is part of GCC.
5 : :
6 : : GCC is free software; you can redistribute it and/or modify
7 : : it under the terms of the GNU General Public License as published by
8 : : the Free Software Foundation; either version 3, or (at your option)
9 : : any later version.
10 : :
11 : : GCC is distributed in the hope that it will be useful,
12 : : but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : : GNU General Public License for more details.
15 : :
16 : : You should have received a copy of the GNU General Public License
17 : : along with GCC; see the file COPYING3. If not see
18 : : <http://www.gnu.org/licenses/>. */
19 : :
20 : : #define IN_TARGET_CODE 1
21 : :
22 : : #include "config.h"
23 : : #include "system.h"
24 : : #include "coretypes.h"
25 : : #include "target.h"
26 : : #include "c-family/c-common.h"
27 : : #include "memmodel.h"
28 : : #include "tm_p.h"
29 : : #include "c-family/c-pragma.h"
30 : :
31 : : static bool ix86_pragma_target_parse (tree, tree);
32 : : static void ix86_target_macros_internal
33 : : (HOST_WIDE_INT, HOST_WIDE_INT, enum processor_type, enum processor_type, enum fpmath_unit,
34 : : void (*def_or_undef) (cpp_reader *, const char *));
35 : :
36 : : /* Internal function to either define or undef the appropriate system
37 : : macros. */
38 : : static void
39 : 2390038 : ix86_target_macros_internal (HOST_WIDE_INT isa_flag,
40 : : HOST_WIDE_INT isa_flag2,
41 : : enum processor_type arch,
42 : : enum processor_type tune,
43 : : enum fpmath_unit fpmath,
44 : : void (*def_or_undef) (cpp_reader *,
45 : : const char *))
46 : : {
47 : : /* For some of the k6/pentium varients there weren't separate ISA bits to
48 : : identify which tune/arch flag was passed, so figure it out here. */
49 : 2390038 : size_t arch_len = strlen (ix86_arch_string);
50 : 2390038 : size_t tune_len = strlen (ix86_tune_string);
51 : 2390038 : int last_arch_char = ix86_arch_string[arch_len - 1];
52 : 2390038 : int last_tune_char = ix86_tune_string[tune_len - 1];
53 : :
54 : : /* Built-ins based on -march=. */
55 : 2390038 : switch (arch)
56 : : {
57 : : case PROCESSOR_I386:
58 : : break;
59 : 0 : case PROCESSOR_I486:
60 : 0 : def_or_undef (parse_in, "__i486");
61 : 0 : def_or_undef (parse_in, "__i486__");
62 : 0 : break;
63 : 0 : case PROCESSOR_LAKEMONT:
64 : : /* Intel MCU is based on Intel Pentium CPU. */
65 : 0 : case PROCESSOR_PENTIUM:
66 : 0 : def_or_undef (parse_in, "__i586");
67 : 0 : def_or_undef (parse_in, "__i586__");
68 : 0 : def_or_undef (parse_in, "__pentium");
69 : 0 : def_or_undef (parse_in, "__pentium__");
70 : 0 : if (isa_flag & OPTION_MASK_ISA_MMX)
71 : 0 : def_or_undef (parse_in, "__pentium_mmx__");
72 : : break;
73 : 0 : case PROCESSOR_PENTIUMPRO:
74 : 0 : def_or_undef (parse_in, "__i686");
75 : 0 : def_or_undef (parse_in, "__i686__");
76 : 0 : def_or_undef (parse_in, "__pentiumpro");
77 : 0 : def_or_undef (parse_in, "__pentiumpro__");
78 : 0 : break;
79 : 0 : case PROCESSOR_GEODE:
80 : 0 : def_or_undef (parse_in, "__geode");
81 : 0 : def_or_undef (parse_in, "__geode__");
82 : 0 : break;
83 : 0 : case PROCESSOR_K6:
84 : 0 : def_or_undef (parse_in, "__k6");
85 : 0 : def_or_undef (parse_in, "__k6__");
86 : 0 : if (last_arch_char == '2')
87 : 0 : def_or_undef (parse_in, "__k6_2__");
88 : 0 : else if (last_arch_char == '3')
89 : 0 : def_or_undef (parse_in, "__k6_3__");
90 : 0 : else if (isa_flag & OPTION_MASK_ISA_3DNOW)
91 : 0 : def_or_undef (parse_in, "__k6_3__");
92 : : break;
93 : 0 : case PROCESSOR_ATHLON:
94 : 0 : def_or_undef (parse_in, "__athlon");
95 : 0 : def_or_undef (parse_in, "__athlon__");
96 : 0 : if (isa_flag & OPTION_MASK_ISA_SSE)
97 : 0 : def_or_undef (parse_in, "__athlon_sse__");
98 : : break;
99 : 208771 : case PROCESSOR_K8:
100 : 208771 : def_or_undef (parse_in, "__k8");
101 : 208771 : def_or_undef (parse_in, "__k8__");
102 : 208771 : break;
103 : 40 : case PROCESSOR_AMDFAM10:
104 : 40 : def_or_undef (parse_in, "__amdfam10");
105 : 40 : def_or_undef (parse_in, "__amdfam10__");
106 : 40 : break;
107 : 5 : case PROCESSOR_BDVER1:
108 : 5 : def_or_undef (parse_in, "__bdver1");
109 : 5 : def_or_undef (parse_in, "__bdver1__");
110 : 5 : break;
111 : 12 : case PROCESSOR_BDVER2:
112 : 12 : def_or_undef (parse_in, "__bdver2");
113 : 12 : def_or_undef (parse_in, "__bdver2__");
114 : 12 : break;
115 : 0 : case PROCESSOR_BDVER3:
116 : 0 : def_or_undef (parse_in, "__bdver3");
117 : 0 : def_or_undef (parse_in, "__bdver3__");
118 : 0 : break;
119 : 16 : case PROCESSOR_BDVER4:
120 : 16 : def_or_undef (parse_in, "__bdver4");
121 : 16 : def_or_undef (parse_in, "__bdver4__");
122 : 16 : break;
123 : 7 : case PROCESSOR_ZNVER1:
124 : 7 : def_or_undef (parse_in, "__znver1");
125 : 7 : def_or_undef (parse_in, "__znver1__");
126 : 7 : break;
127 : 21 : case PROCESSOR_ZNVER2:
128 : 21 : def_or_undef (parse_in, "__znver2");
129 : 21 : def_or_undef (parse_in, "__znver2__");
130 : 21 : break;
131 : 0 : case PROCESSOR_ZNVER3:
132 : 0 : def_or_undef (parse_in, "__znver3");
133 : 0 : def_or_undef (parse_in, "__znver3__");
134 : 0 : break;
135 : 15 : case PROCESSOR_ZNVER4:
136 : 15 : def_or_undef (parse_in, "__znver4");
137 : 15 : def_or_undef (parse_in, "__znver4__");
138 : 15 : break;
139 : 18 : case PROCESSOR_ZNVER5:
140 : 18 : def_or_undef (parse_in, "__znver5");
141 : 18 : def_or_undef (parse_in, "__znver5__");
142 : 18 : break;
143 : 0 : case PROCESSOR_BTVER1:
144 : 0 : def_or_undef (parse_in, "__btver1");
145 : 0 : def_or_undef (parse_in, "__btver1__");
146 : 0 : break;
147 : 2 : case PROCESSOR_BTVER2:
148 : 2 : def_or_undef (parse_in, "__btver2");
149 : 2 : def_or_undef (parse_in, "__btver2__");
150 : 2 : break;
151 : 0 : case PROCESSOR_LUJIAZUI:
152 : 0 : def_or_undef (parse_in, "__lujiazui");
153 : 0 : def_or_undef (parse_in, "__lujiazui__");
154 : 0 : break;
155 : 0 : case PROCESSOR_YONGFENG:
156 : 0 : def_or_undef (parse_in, "__yongfeng");
157 : 0 : def_or_undef (parse_in, "__yongfeng__");
158 : 0 : break;
159 : 0 : case PROCESSOR_SHIJIDADAO:
160 : 0 : def_or_undef (parse_in, "__shijidadao");
161 : 0 : def_or_undef (parse_in, "__shijidadao__");
162 : 0 : break;
163 : 0 : case PROCESSOR_PENTIUM4:
164 : 0 : def_or_undef (parse_in, "__pentium4");
165 : 0 : def_or_undef (parse_in, "__pentium4__");
166 : 0 : break;
167 : 8 : case PROCESSOR_NOCONA:
168 : 8 : def_or_undef (parse_in, "__nocona");
169 : 8 : def_or_undef (parse_in, "__nocona__");
170 : 8 : break;
171 : 17 : case PROCESSOR_CORE2:
172 : 17 : def_or_undef (parse_in, "__core2");
173 : 17 : def_or_undef (parse_in, "__core2__");
174 : 17 : break;
175 : 17 : case PROCESSOR_NEHALEM:
176 : 17 : def_or_undef (parse_in, "__corei7");
177 : 17 : def_or_undef (parse_in, "__corei7__");
178 : 17 : def_or_undef (parse_in, "__nehalem");
179 : 17 : def_or_undef (parse_in, "__nehalem__");
180 : 17 : break;
181 : 3 : case PROCESSOR_SANDYBRIDGE:
182 : 3 : def_or_undef (parse_in, "__corei7_avx");
183 : 3 : def_or_undef (parse_in, "__corei7_avx__");
184 : 3 : def_or_undef (parse_in, "__sandybridge");
185 : 3 : def_or_undef (parse_in, "__sandybridge__");
186 : 3 : break;
187 : 75 : case PROCESSOR_HASWELL:
188 : 75 : def_or_undef (parse_in, "__core_avx2");
189 : 75 : def_or_undef (parse_in, "__core_avx2__");
190 : 75 : def_or_undef (parse_in, "__haswell");
191 : 75 : def_or_undef (parse_in, "__haswell__");
192 : 75 : break;
193 : 19 : case PROCESSOR_BONNELL:
194 : 19 : def_or_undef (parse_in, "__atom");
195 : 19 : def_or_undef (parse_in, "__atom__");
196 : 19 : def_or_undef (parse_in, "__bonnell");
197 : 19 : def_or_undef (parse_in, "__bonnell__");
198 : 19 : break;
199 : 8 : case PROCESSOR_SILVERMONT:
200 : 8 : def_or_undef (parse_in, "__slm");
201 : 8 : def_or_undef (parse_in, "__slm__");
202 : 8 : def_or_undef (parse_in, "__silvermont");
203 : 8 : def_or_undef (parse_in, "__silvermont__");
204 : 8 : break;
205 : 3 : case PROCESSOR_GOLDMONT:
206 : 3 : def_or_undef (parse_in, "__goldmont");
207 : 3 : def_or_undef (parse_in, "__goldmont__");
208 : 3 : break;
209 : 0 : case PROCESSOR_GOLDMONT_PLUS:
210 : 0 : def_or_undef (parse_in, "__goldmont_plus");
211 : 0 : def_or_undef (parse_in, "__goldmont_plus__");
212 : 0 : break;
213 : 0 : case PROCESSOR_TREMONT:
214 : 0 : def_or_undef (parse_in, "__tremont");
215 : 0 : def_or_undef (parse_in, "__tremont__");
216 : 0 : break;
217 : 5 : case PROCESSOR_SIERRAFOREST:
218 : 5 : def_or_undef (parse_in, "__sierraforest");
219 : 5 : def_or_undef (parse_in, "__sierraforest__");
220 : 5 : break;
221 : 0 : case PROCESSOR_GRANDRIDGE:
222 : 0 : def_or_undef (parse_in, "__grandridge");
223 : 0 : def_or_undef (parse_in, "__grandridge__");
224 : 0 : break;
225 : 0 : case PROCESSOR_CLEARWATERFOREST:
226 : 0 : def_or_undef (parse_in, "__clearwaterforest");
227 : 0 : def_or_undef (parse_in, "__clearwaterforest__");
228 : 0 : break;
229 : : break;
230 : 61 : case PROCESSOR_SKYLAKE:
231 : 61 : def_or_undef (parse_in, "__skylake");
232 : 61 : def_or_undef (parse_in, "__skylake__");
233 : 61 : break;
234 : 163 : case PROCESSOR_SKYLAKE_AVX512:
235 : 163 : def_or_undef (parse_in, "__skylake_avx512");
236 : 163 : def_or_undef (parse_in, "__skylake_avx512__");
237 : 163 : break;
238 : 11 : case PROCESSOR_CANNONLAKE:
239 : 11 : def_or_undef (parse_in, "__cannonlake");
240 : 11 : def_or_undef (parse_in, "__cannonlake__");
241 : 11 : break;
242 : 0 : case PROCESSOR_ICELAKE_CLIENT:
243 : 0 : def_or_undef (parse_in, "__icelake_client");
244 : 0 : def_or_undef (parse_in, "__icelake_client__");
245 : 0 : break;
246 : 12 : case PROCESSOR_ICELAKE_SERVER:
247 : 12 : def_or_undef (parse_in, "__icelake_server");
248 : 12 : def_or_undef (parse_in, "__icelake_server__");
249 : 12 : break;
250 : 17 : case PROCESSOR_CASCADELAKE:
251 : 17 : def_or_undef (parse_in, "__cascadelake");
252 : 17 : def_or_undef (parse_in, "__cascadelake__");
253 : 17 : break;
254 : 7 : case PROCESSOR_TIGERLAKE:
255 : 7 : def_or_undef (parse_in, "__tigerlake");
256 : 7 : def_or_undef (parse_in, "__tigerlake__");
257 : 7 : break;
258 : 2 : case PROCESSOR_COOPERLAKE:
259 : 2 : def_or_undef (parse_in, "__cooperlake");
260 : 2 : def_or_undef (parse_in, "__cooperlake__");
261 : 2 : break;
262 : 30 : case PROCESSOR_SAPPHIRERAPIDS:
263 : 30 : def_or_undef (parse_in, "__sapphirerapids");
264 : 30 : def_or_undef (parse_in, "__sapphirerapids__");
265 : 30 : break;
266 : 0 : case PROCESSOR_GRANITERAPIDS:
267 : 0 : def_or_undef (parse_in, "__graniterapids");
268 : 0 : def_or_undef (parse_in, "__graniterapids__");
269 : 0 : break;
270 : 0 : case PROCESSOR_GRANITERAPIDS_D:
271 : 0 : def_or_undef (parse_in, "__graniterapids_d");
272 : 0 : def_or_undef (parse_in, "__graniterapids_d__");
273 : 0 : break;
274 : 7 : case PROCESSOR_ALDERLAKE:
275 : 7 : def_or_undef (parse_in, "__alderlake");
276 : 7 : def_or_undef (parse_in, "__alderlake__");
277 : 7 : break;
278 : 0 : case PROCESSOR_ROCKETLAKE:
279 : 0 : def_or_undef (parse_in, "__rocketlake");
280 : 0 : def_or_undef (parse_in, "__rocketlake__");
281 : 0 : break;
282 : 0 : case PROCESSOR_ARROWLAKE:
283 : 0 : def_or_undef (parse_in, "__arrowlake");
284 : 0 : def_or_undef (parse_in, "__arrowlake__");
285 : 0 : break;
286 : 0 : case PROCESSOR_ARROWLAKE_S:
287 : 0 : def_or_undef (parse_in, "__arrowlake_s");
288 : 0 : def_or_undef (parse_in, "__arrowlake_s__");
289 : 0 : break;
290 : 0 : case PROCESSOR_PANTHERLAKE:
291 : 0 : def_or_undef (parse_in, "__pantherlake");
292 : 0 : def_or_undef (parse_in, "__pantherlake__");
293 : 0 : break;
294 : 0 : case PROCESSOR_DIAMONDRAPIDS:
295 : 0 : def_or_undef (parse_in, "__diamondrapids");
296 : 0 : def_or_undef (parse_in, "__diamondrapids__");
297 : 0 : break;
298 : 0 : case PROCESSOR_NOVALAKE:
299 : 0 : def_or_undef (parse_in, "__novalake");
300 : 0 : def_or_undef (parse_in, "__novalake__");
301 : 0 : break;
302 : :
303 : : /* use PROCESSOR_max to not set/unset the arch macro. */
304 : : case PROCESSOR_max:
305 : : break;
306 : 0 : case PROCESSOR_INTEL:
307 : 0 : case PROCESSOR_GENERIC:
308 : 0 : gcc_unreachable ();
309 : : }
310 : :
311 : : /* Built-ins based on -mtune=. */
312 : 2390038 : switch (tune)
313 : : {
314 : 0 : case PROCESSOR_I386:
315 : 0 : def_or_undef (parse_in, "__tune_i386__");
316 : 0 : break;
317 : 0 : case PROCESSOR_I486:
318 : 0 : def_or_undef (parse_in, "__tune_i486__");
319 : 0 : break;
320 : 0 : case PROCESSOR_PENTIUM:
321 : 0 : def_or_undef (parse_in, "__tune_i586__");
322 : 0 : def_or_undef (parse_in, "__tune_pentium__");
323 : 0 : if (last_tune_char == 'x')
324 : 0 : def_or_undef (parse_in, "__tune_pentium_mmx__");
325 : : break;
326 : 0 : case PROCESSOR_PENTIUMPRO:
327 : 0 : def_or_undef (parse_in, "__tune_i686__");
328 : 0 : def_or_undef (parse_in, "__tune_pentiumpro__");
329 : 0 : switch (last_tune_char)
330 : : {
331 : 0 : case '3':
332 : 0 : def_or_undef (parse_in, "__tune_pentium3__");
333 : : /* FALLTHRU */
334 : 0 : case '2':
335 : 0 : def_or_undef (parse_in, "__tune_pentium2__");
336 : 0 : break;
337 : : }
338 : : break;
339 : 0 : case PROCESSOR_GEODE:
340 : 0 : def_or_undef (parse_in, "__tune_geode__");
341 : 0 : break;
342 : 0 : case PROCESSOR_K6:
343 : 0 : def_or_undef (parse_in, "__tune_k6__");
344 : 0 : if (last_tune_char == '2')
345 : 0 : def_or_undef (parse_in, "__tune_k6_2__");
346 : 0 : else if (last_tune_char == '3')
347 : 0 : def_or_undef (parse_in, "__tune_k6_3__");
348 : 0 : else if (isa_flag & OPTION_MASK_ISA_3DNOW)
349 : 0 : def_or_undef (parse_in, "__tune_k6_3__");
350 : : break;
351 : 0 : case PROCESSOR_ATHLON:
352 : 0 : def_or_undef (parse_in, "__tune_athlon__");
353 : 0 : if (isa_flag & OPTION_MASK_ISA_SSE)
354 : 0 : def_or_undef (parse_in, "__tune_athlon_sse__");
355 : : break;
356 : 101 : case PROCESSOR_K8:
357 : 101 : def_or_undef (parse_in, "__tune_k8__");
358 : 101 : break;
359 : 52 : case PROCESSOR_AMDFAM10:
360 : 52 : def_or_undef (parse_in, "__tune_amdfam10__");
361 : 52 : break;
362 : 7 : case PROCESSOR_BDVER1:
363 : 7 : def_or_undef (parse_in, "__tune_bdver1__");
364 : 7 : break;
365 : 12 : case PROCESSOR_BDVER2:
366 : 12 : def_or_undef (parse_in, "__tune_bdver2__");
367 : 12 : break;
368 : 0 : case PROCESSOR_BDVER3:
369 : 0 : def_or_undef (parse_in, "__tune_bdver3__");
370 : 0 : break;
371 : 17 : case PROCESSOR_BDVER4:
372 : 17 : def_or_undef (parse_in, "__tune_bdver4__");
373 : 17 : break;
374 : 11 : case PROCESSOR_ZNVER1:
375 : 11 : def_or_undef (parse_in, "__tune_znver1__");
376 : 11 : break;
377 : 21 : case PROCESSOR_ZNVER2:
378 : 21 : def_or_undef (parse_in, "__tune_znver2__");
379 : 21 : break;
380 : 1 : case PROCESSOR_ZNVER3:
381 : 1 : def_or_undef (parse_in, "__tune_znver3__");
382 : 1 : break;
383 : 17 : case PROCESSOR_ZNVER4:
384 : 17 : def_or_undef (parse_in, "__tune_znver4__");
385 : 17 : break;
386 : 21 : case PROCESSOR_ZNVER5:
387 : 21 : def_or_undef (parse_in, "__tune_znver5__");
388 : 21 : break;
389 : 0 : case PROCESSOR_BTVER1:
390 : 0 : def_or_undef (parse_in, "__tune_btver1__");
391 : 0 : break;
392 : 4 : case PROCESSOR_BTVER2:
393 : 4 : def_or_undef (parse_in, "__tune_btver2__");
394 : 4 : break;
395 : 0 : case PROCESSOR_LUJIAZUI:
396 : 0 : def_or_undef (parse_in, "__tune_lujiazui__");
397 : 0 : break;
398 : 0 : case PROCESSOR_YONGFENG:
399 : 0 : def_or_undef (parse_in, "__tune_yongfeng__");
400 : 0 : break;
401 : 0 : case PROCESSOR_SHIJIDADAO:
402 : 0 : def_or_undef (parse_in, "__tune_shijidadao__");
403 : 0 : break;
404 : 0 : case PROCESSOR_PENTIUM4:
405 : 0 : def_or_undef (parse_in, "__tune_pentium4__");
406 : 0 : break;
407 : 10 : case PROCESSOR_NOCONA:
408 : 10 : def_or_undef (parse_in, "__tune_nocona__");
409 : 10 : break;
410 : 60 : case PROCESSOR_CORE2:
411 : 60 : def_or_undef (parse_in, "__tune_core2__");
412 : 60 : break;
413 : 25 : case PROCESSOR_NEHALEM:
414 : 25 : def_or_undef (parse_in, "__tune_corei7__");
415 : 25 : def_or_undef (parse_in, "__tune_nehalem__");
416 : 25 : break;
417 : 16 : case PROCESSOR_SANDYBRIDGE:
418 : 16 : def_or_undef (parse_in, "__tune_corei7_avx__");
419 : 16 : def_or_undef (parse_in, "__tune_sandybridge__");
420 : 16 : break;
421 : 92 : case PROCESSOR_HASWELL:
422 : 92 : def_or_undef (parse_in, "__tune_core_avx2__");
423 : 92 : def_or_undef (parse_in, "__tune_haswell__");
424 : 92 : break;
425 : 36 : case PROCESSOR_BONNELL:
426 : 36 : def_or_undef (parse_in, "__tune_atom__");
427 : 36 : def_or_undef (parse_in, "__tune_bonnell__");
428 : 36 : break;
429 : 18 : case PROCESSOR_SILVERMONT:
430 : 18 : def_or_undef (parse_in, "__tune_slm__");
431 : 18 : def_or_undef (parse_in, "__tune_silvermont__");
432 : 18 : break;
433 : 9 : case PROCESSOR_GOLDMONT:
434 : 9 : def_or_undef (parse_in, "__tune_goldmont__");
435 : 9 : break;
436 : 0 : case PROCESSOR_GOLDMONT_PLUS:
437 : 0 : def_or_undef (parse_in, "__tune_goldmont_plus__");
438 : 0 : break;
439 : 0 : case PROCESSOR_TREMONT:
440 : 0 : def_or_undef (parse_in, "__tune_tremont__");
441 : 0 : break;
442 : 5 : case PROCESSOR_SIERRAFOREST:
443 : 5 : def_or_undef (parse_in, "__tune_sierraforest__");
444 : 5 : break;
445 : 0 : case PROCESSOR_GRANDRIDGE:
446 : 0 : def_or_undef (parse_in, "__tune_grandridge__");
447 : 0 : break;
448 : 0 : case PROCESSOR_CLEARWATERFOREST:
449 : 0 : def_or_undef (parse_in, "__tune_clearwaterforest__");
450 : 0 : break;
451 : 82 : case PROCESSOR_SKYLAKE:
452 : 82 : def_or_undef (parse_in, "__tune_skylake__");
453 : 82 : break;
454 : 188 : case PROCESSOR_SKYLAKE_AVX512:
455 : 188 : def_or_undef (parse_in, "__tune_skylake_avx512__");
456 : 188 : break;
457 : 11 : case PROCESSOR_CANNONLAKE:
458 : 11 : def_or_undef (parse_in, "__tune_cannonlake__");
459 : 11 : break;
460 : 0 : case PROCESSOR_ICELAKE_CLIENT:
461 : 0 : def_or_undef (parse_in, "__tune_icelake_client__");
462 : 0 : break;
463 : 22 : case PROCESSOR_ICELAKE_SERVER:
464 : 22 : def_or_undef (parse_in, "__tune_icelake_server__");
465 : 22 : break;
466 : 0 : case PROCESSOR_LAKEMONT:
467 : 0 : def_or_undef (parse_in, "__tune_lakemont__");
468 : 0 : break;
469 : 17 : case PROCESSOR_CASCADELAKE:
470 : 17 : def_or_undef (parse_in, "__tune_cascadelake__");
471 : 17 : break;
472 : 7 : case PROCESSOR_TIGERLAKE:
473 : 7 : def_or_undef (parse_in, "__tune_tigerlake__");
474 : 7 : break;
475 : 2 : case PROCESSOR_COOPERLAKE:
476 : 2 : def_or_undef (parse_in, "__tune_cooperlake__");
477 : 2 : break;
478 : 33 : case PROCESSOR_SAPPHIRERAPIDS:
479 : 33 : def_or_undef (parse_in, "__tune_sapphirerapids__");
480 : 33 : break;
481 : 7 : case PROCESSOR_ALDERLAKE:
482 : 7 : def_or_undef (parse_in, "__tune_alderlake__");
483 : 7 : break;
484 : 0 : case PROCESSOR_ROCKETLAKE:
485 : 0 : def_or_undef (parse_in, "__tune_rocketlake__");
486 : 0 : break;
487 : 0 : case PROCESSOR_GRANITERAPIDS:
488 : 0 : def_or_undef (parse_in, "__tune_graniterapids__");
489 : 0 : break;
490 : 0 : case PROCESSOR_GRANITERAPIDS_D:
491 : 0 : def_or_undef (parse_in, "__tune_graniterapids_d__");
492 : 0 : break;
493 : 0 : case PROCESSOR_ARROWLAKE:
494 : 0 : def_or_undef (parse_in, "__tune_arrowlake__");
495 : 0 : break;
496 : 0 : case PROCESSOR_ARROWLAKE_S:
497 : 0 : def_or_undef (parse_in, "__tune_arrowlake_s__");
498 : 0 : break;
499 : 0 : case PROCESSOR_PANTHERLAKE:
500 : 0 : def_or_undef (parse_in, "__tune_pantherlake__");
501 : 0 : break;
502 : 0 : case PROCESSOR_DIAMONDRAPIDS:
503 : 0 : def_or_undef (parse_in, "__tune_diamondrapids__");
504 : 0 : break;
505 : 0 : case PROCESSOR_NOVALAKE:
506 : 0 : def_or_undef (parse_in, "__tune_novalake__");
507 : 0 : break;
508 : : case PROCESSOR_INTEL:
509 : : case PROCESSOR_GENERIC:
510 : : break;
511 : : /* use PROCESSOR_max to not set/unset the tune macro. */
512 : : case PROCESSOR_max:
513 : : break;
514 : : }
515 : :
516 : 2390038 : switch (ix86_cmodel)
517 : : {
518 : 2345310 : case CM_SMALL:
519 : 2345310 : case CM_SMALL_PIC:
520 : 2345310 : def_or_undef (parse_in, "__code_model_small__");
521 : 2345310 : break;
522 : 854 : case CM_MEDIUM:
523 : 854 : case CM_MEDIUM_PIC:
524 : 854 : def_or_undef (parse_in, "__code_model_medium__");
525 : 854 : break;
526 : 483 : case CM_LARGE:
527 : 483 : case CM_LARGE_PIC:
528 : 483 : def_or_undef (parse_in, "__code_model_large__");
529 : 483 : break;
530 : 43390 : case CM_32:
531 : 43390 : def_or_undef (parse_in, "__code_model_32__");
532 : 43390 : break;
533 : 1 : case CM_KERNEL:
534 : 1 : def_or_undef (parse_in, "__code_model_kernel__");
535 : 1 : break;
536 : 2390038 : default:
537 : 2390038 : ;
538 : : }
539 : :
540 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_WBNOINVD)
541 : 10534 : def_or_undef (parse_in, "__WBNOINVD__");
542 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_AVX512VP2INTERSECT)
543 : 20748 : def_or_undef (parse_in, "__AVX512VP2INTERSECT__");
544 : 2390038 : if (isa_flag & OPTION_MASK_ISA_MMX)
545 : 218210 : def_or_undef (parse_in, "__MMX__");
546 : 2390038 : if (isa_flag & OPTION_MASK_ISA_3DNOW)
547 : 2799 : def_or_undef (parse_in, "__3dNOW__");
548 : 2390038 : if (isa_flag & OPTION_MASK_ISA_3DNOW_A)
549 : 1480 : def_or_undef (parse_in, "__3dNOW_A__");
550 : 2390038 : if (isa_flag & OPTION_MASK_ISA_SSE)
551 : 220087 : def_or_undef (parse_in, "__SSE__");
552 : 2390038 : if (isa_flag & OPTION_MASK_ISA_SSE2)
553 : 219985 : def_or_undef (parse_in, "__SSE2__");
554 : 2390038 : if (isa_flag & OPTION_MASK_ISA_SSE3)
555 : 93371 : def_or_undef (parse_in, "__SSE3__");
556 : 2390038 : if (isa_flag & OPTION_MASK_ISA_SSSE3)
557 : 91472 : def_or_undef (parse_in, "__SSSE3__");
558 : 2390038 : if (isa_flag & OPTION_MASK_ISA_SSE4_1)
559 : 90447 : def_or_undef (parse_in, "__SSE4_1__");
560 : 2390038 : if (isa_flag & OPTION_MASK_ISA_SSE4_2)
561 : 90730 : def_or_undef (parse_in, "__SSE4_2__");
562 : 2390038 : if (isa_flag & OPTION_MASK_ISA_AES)
563 : 10741 : def_or_undef (parse_in, "__AES__");
564 : 2390038 : if (isa_flag & OPTION_MASK_ISA_SHA)
565 : 10441 : def_or_undef (parse_in, "__SHA__");
566 : 2390038 : if (isa_flag & OPTION_MASK_ISA_PCLMUL)
567 : 31248 : def_or_undef (parse_in, "__PCLMUL__");
568 : 2390038 : if (isa_flag & OPTION_MASK_ISA_AVX)
569 : 90305 : def_or_undef (parse_in, "__AVX__");
570 : 2390038 : if (isa_flag & OPTION_MASK_ISA_AVX2)
571 : 141540 : def_or_undef (parse_in, "__AVX2__");
572 : 2390038 : if (isa_flag & OPTION_MASK_ISA_AVX512F)
573 : 169354 : def_or_undef (parse_in, "__AVX512F__");
574 : 2390038 : if (isa_flag & OPTION_MASK_ISA_AVX512CD)
575 : 90745 : def_or_undef (parse_in, "__AVX512CD__");
576 : 2390038 : if (isa_flag & OPTION_MASK_ISA_AVX512DQ)
577 : 104397 : def_or_undef (parse_in, "__AVX512DQ__");
578 : 2390038 : if (isa_flag & OPTION_MASK_ISA_AVX512BW)
579 : 167688 : def_or_undef (parse_in, "__AVX512BW__");
580 : 2390038 : if (isa_flag & OPTION_MASK_ISA_AVX512VL)
581 : : {
582 : 172326 : def_or_undef (parse_in, "__AVX512VL__");
583 : 172326 : def_or_undef (parse_in, "__EVEX256__");
584 : : }
585 : 2390038 : if (isa_flag & OPTION_MASK_ISA_AVX512VBMI)
586 : 91010 : def_or_undef (parse_in, "__AVX512VBMI__");
587 : 2390038 : if (isa_flag & OPTION_MASK_ISA_AVX512IFMA)
588 : 91061 : def_or_undef (parse_in, "__AVX512IFMA__");
589 : 2390038 : if (isa_flag & OPTION_MASK_ISA_AVX512VBMI2)
590 : 90429 : def_or_undef (parse_in, "__AVX512VBMI2__");
591 : 2390038 : if (isa_flag & OPTION_MASK_ISA_AVX512VNNI)
592 : 91059 : def_or_undef (parse_in, "__AVX512VNNI__");
593 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_PCONFIG)
594 : 10494 : def_or_undef (parse_in, "__PCONFIG__");
595 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_SGX)
596 : 10728 : def_or_undef (parse_in, "__SGX__");
597 : 2390038 : if (isa_flag & OPTION_MASK_ISA_AVX512BITALG)
598 : 90975 : def_or_undef (parse_in, "__AVX512BITALG__");
599 : 2390038 : if (isa_flag & OPTION_MASK_ISA_AVX512VPOPCNTDQ)
600 : 91046 : def_or_undef (parse_in, "__AVX512VPOPCNTDQ__");
601 : 2390038 : if (isa_flag & OPTION_MASK_ISA_FMA)
602 : 11331 : def_or_undef (parse_in, "__FMA__");
603 : 2390038 : if (isa_flag & OPTION_MASK_ISA_RTM)
604 : 20320 : def_or_undef (parse_in, "__RTM__");
605 : 2390038 : if (isa_flag & OPTION_MASK_ISA_SSE4A)
606 : 4115 : def_or_undef (parse_in, "__SSE4A__");
607 : 2390038 : if (isa_flag & OPTION_MASK_ISA_FMA4)
608 : 2750 : def_or_undef (parse_in, "__FMA4__");
609 : 2390038 : if (isa_flag & OPTION_MASK_ISA_XOP)
610 : 1479 : def_or_undef (parse_in, "__XOP__");
611 : 2390038 : if (isa_flag & OPTION_MASK_ISA_LWP)
612 : 10501 : def_or_undef (parse_in, "__LWP__");
613 : 2390038 : if (isa_flag & OPTION_MASK_ISA_ABM)
614 : 153 : def_or_undef (parse_in, "__ABM__");
615 : 2390038 : if (isa_flag & OPTION_MASK_ISA_BMI)
616 : 10914 : def_or_undef (parse_in, "__BMI__");
617 : 2390038 : if (isa_flag & OPTION_MASK_ISA_BMI2)
618 : 10901 : def_or_undef (parse_in, "__BMI2__");
619 : 2390038 : if (isa_flag & OPTION_MASK_ISA_LZCNT)
620 : 10952 : def_or_undef (parse_in, "__LZCNT__");
621 : 2390038 : if (isa_flag & OPTION_MASK_ISA_TBM)
622 : 10490 : def_or_undef (parse_in, "__TBM__");
623 : 2390038 : if (isa_flag & OPTION_MASK_ISA_CRC32)
624 : 85102 : def_or_undef (parse_in, "__CRC32__");
625 : 2390038 : if (isa_flag & OPTION_MASK_ISA_POPCNT)
626 : 82980 : def_or_undef (parse_in, "__POPCNT__");
627 : 2390038 : if (isa_flag & OPTION_MASK_ISA_FSGSBASE)
628 : 10667 : def_or_undef (parse_in, "__FSGSBASE__");
629 : 2390038 : if (isa_flag & OPTION_MASK_ISA_RDRND)
630 : 21015 : def_or_undef (parse_in, "__RDRND__");
631 : 2390038 : if (isa_flag & OPTION_MASK_ISA_F16C)
632 : 11195 : def_or_undef (parse_in, "__F16C__");
633 : 2390038 : if (isa_flag & OPTION_MASK_ISA_RDSEED)
634 : 10785 : def_or_undef (parse_in, "__RDSEED__");
635 : 2390038 : if (isa_flag & OPTION_MASK_ISA_PRFCHW)
636 : 477 : def_or_undef (parse_in, "__PRFCHW__");
637 : 2390038 : if (isa_flag & OPTION_MASK_ISA_ADX)
638 : 402 : def_or_undef (parse_in, "__ADX__");
639 : 2390038 : if (isa_flag & OPTION_MASK_ISA_FXSR)
640 : 209371 : def_or_undef (parse_in, "__FXSR__");
641 : 2390038 : if (isa_flag & OPTION_MASK_ISA_XSAVE)
642 : 79737 : def_or_undef (parse_in, "__XSAVE__");
643 : 2390038 : if (isa_flag & OPTION_MASK_ISA_XSAVEOPT)
644 : 10857 : def_or_undef (parse_in, "__XSAVEOPT__");
645 : 2390038 : if ((fpmath & FPMATH_SSE) && (isa_flag & OPTION_MASK_ISA_SSE))
646 : 214495 : def_or_undef (parse_in, "__SSE_MATH__");
647 : 1553553 : if ((fpmath & FPMATH_SSE) && (isa_flag & OPTION_MASK_ISA_SSE2))
648 : 214393 : def_or_undef (parse_in, "__SSE2_MATH__");
649 : 2390038 : if (isa_flag & OPTION_MASK_ISA_CLFLUSHOPT)
650 : 10788 : def_or_undef (parse_in, "__CLFLUSHOPT__");
651 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_CLZERO)
652 : 10523 : def_or_undef (parse_in, "__CLZERO__");
653 : 2390038 : if (isa_flag & OPTION_MASK_ISA_XSAVEC)
654 : 10787 : def_or_undef (parse_in, "__XSAVEC__");
655 : 2390038 : if (isa_flag & OPTION_MASK_ISA_XSAVES)
656 : 10787 : def_or_undef (parse_in, "__XSAVES__");
657 : 2390038 : if (isa_flag & OPTION_MASK_ISA_CLWB)
658 : 10720 : def_or_undef (parse_in, "__CLWB__");
659 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_MWAITX)
660 : 10539 : def_or_undef (parse_in, "__MWAITX__");
661 : 2390038 : if (isa_flag & OPTION_MASK_ISA_PKU)
662 : 10701 : def_or_undef (parse_in, "__PKU__");
663 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_RDPID)
664 : 10552 : def_or_undef (parse_in, "__RDPID__");
665 : 2390038 : if (isa_flag & OPTION_MASK_ISA_GFNI)
666 : 61860 : def_or_undef (parse_in, "__GFNI__");
667 : 2390038 : if ((isa_flag & OPTION_MASK_ISA_SHSTK))
668 : 29704 : def_or_undef (parse_in, "__SHSTK__");
669 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_VAES)
670 : 20826 : def_or_undef (parse_in, "__VAES__");
671 : 2390038 : if (isa_flag & OPTION_MASK_ISA_VPCLMULQDQ)
672 : 20815 : def_or_undef (parse_in, "__VPCLMULQDQ__");
673 : 2390038 : if (isa_flag & OPTION_MASK_ISA_MOVDIRI)
674 : 10537 : def_or_undef (parse_in, "__MOVDIRI__");
675 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_MOVDIR64B)
676 : 10543 : def_or_undef (parse_in, "__MOVDIR64B__");
677 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_WAITPKG)
678 : 10512 : def_or_undef (parse_in, "__WAITPKG__");
679 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_CLDEMOTE)
680 : 10508 : def_or_undef (parse_in, "__CLDEMOTE__");
681 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_SERIALIZE)
682 : 10483 : def_or_undef (parse_in, "__SERIALIZE__");
683 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_PTWRITE)
684 : 10515 : def_or_undef (parse_in, "__PTWRITE__");
685 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_AVX512BF16)
686 : 91039 : def_or_undef (parse_in, "__AVX512BF16__");
687 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_AVX512FP16)
688 : 83405 : def_or_undef (parse_in, "__AVX512FP16__");
689 : 2390038 : if (TARGET_MMX_WITH_SSE)
690 : 1538951 : def_or_undef (parse_in, "__MMX_WITH_SSE__");
691 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_ENQCMD)
692 : 10480 : def_or_undef (parse_in, "__ENQCMD__");
693 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_TSXLDTRK)
694 : 10473 : def_or_undef (parse_in, "__TSXLDTRK__");
695 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_AMX_TILE)
696 : 70805 : def_or_undef (parse_in, "__AMX_TILE__");
697 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_AMX_INT8)
698 : 10342 : def_or_undef (parse_in, "__AMX_INT8__");
699 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_AMX_BF16)
700 : 10353 : def_or_undef (parse_in, "__AMX_BF16__");
701 : 2390038 : if (isa_flag & OPTION_MASK_ISA_SAHF)
702 : 6210 : def_or_undef (parse_in, "__LAHF_SAHF__");
703 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_MOVBE)
704 : 776 : def_or_undef (parse_in, "__MOVBE__");
705 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_UINTR)
706 : 10294 : def_or_undef (parse_in, "__UINTR__");
707 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_HRESET)
708 : 10499 : def_or_undef (parse_in, "__HRESET__");
709 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_KL)
710 : 20739 : def_or_undef (parse_in, "__KL__");
711 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_WIDEKL)
712 : 10415 : def_or_undef (parse_in, "__WIDEKL__");
713 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_AVXVNNI)
714 : 10473 : def_or_undef (parse_in, "__AVXVNNI__");
715 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_AVXIFMA)
716 : 10406 : def_or_undef (parse_in, "__AVXIFMA__");
717 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_AVXVNNIINT8)
718 : 10413 : def_or_undef (parse_in, "__AVXVNNIINT8__");
719 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_AVXNECONVERT)
720 : 10409 : def_or_undef (parse_in, "__AVXNECONVERT__");
721 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_CMPCCXADD)
722 : 10294 : def_or_undef (parse_in, "__CMPCCXADD__");
723 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_AMX_FP16)
724 : 22 : def_or_undef (parse_in, "__AMX_FP16__");
725 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_PREFETCHI)
726 : 10308 : def_or_undef (parse_in, "__PREFETCHI__");
727 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_RAOINT)
728 : 10461 : def_or_undef (parse_in, "__RAOINT__");
729 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_AMX_COMPLEX)
730 : 10340 : def_or_undef (parse_in, "__AMX_COMPLEX__");
731 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_AVXVNNIINT16)
732 : 10409 : def_or_undef (parse_in, "__AVXVNNIINT16__");
733 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_SM3)
734 : 10398 : def_or_undef (parse_in, "__SM3__");
735 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_SHA512)
736 : 10397 : def_or_undef (parse_in, "__SHA512__");
737 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_SM4)
738 : 20724 : def_or_undef (parse_in, "__SM4__");
739 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_USER_MSR)
740 : 10312 : def_or_undef (parse_in, "__USER_MSR__");
741 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_AVX10_1)
742 : 71112 : def_or_undef (parse_in, "__AVX10_1__");
743 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_APX_F)
744 : 54 : def_or_undef (parse_in, "__APX_F__");
745 : 2390038 : if (ix86_apx_inline_asm_use_gpr32)
746 : 1 : def_or_undef (parse_in, "__APX_INLINE_ASM_USE_GPR32__");
747 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_AVX10_2)
748 : 71142 : def_or_undef (parse_in, "__AVX10_2__");
749 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_AMX_AVX512)
750 : 10402 : def_or_undef (parse_in, "__AMX_AVX512__");
751 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_AMX_TF32)
752 : 10341 : def_or_undef (parse_in, "__AMX_TF32__");
753 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_AMX_FP8)
754 : 23 : def_or_undef (parse_in, "__AMX_FP8__");
755 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_MOVRS)
756 : 20507 : def_or_undef (parse_in, "__MOVRS__");
757 : 2390038 : if (isa_flag2 & OPTION_MASK_ISA2_AMX_MOVRS)
758 : 10169 : def_or_undef (parse_in, "__AMX_MOVRS__");
759 : 2390038 : if (TARGET_IAMCU)
760 : : {
761 : 0 : def_or_undef (parse_in, "__iamcu");
762 : 0 : def_or_undef (parse_in, "__iamcu__");
763 : : }
764 : 2390038 : }
765 : :
766 : :
767 : : /* Hook to validate the current #pragma GCC target and set the state, and
768 : : update the macros based on what was changed. If ARGS is NULL, then
769 : : POP_TARGET is used to reset the options. */
770 : :
771 : : static bool
772 : 1090603 : ix86_pragma_target_parse (tree args, tree pop_target)
773 : : {
774 : 1090603 : tree prev_tree
775 : 1090603 : = build_target_option_node (&global_options, &global_options_set);
776 : 1090603 : tree cur_tree;
777 : 1090603 : struct cl_target_option *prev_opt;
778 : 1090603 : struct cl_target_option *cur_opt;
779 : 1090603 : HOST_WIDE_INT prev_isa;
780 : 1090603 : HOST_WIDE_INT cur_isa;
781 : 1090603 : HOST_WIDE_INT diff_isa;
782 : 1090603 : HOST_WIDE_INT prev_isa2;
783 : 1090603 : HOST_WIDE_INT cur_isa2;
784 : 1090603 : HOST_WIDE_INT diff_isa2;
785 : 1090603 : enum processor_type prev_arch;
786 : 1090603 : enum processor_type prev_tune;
787 : 1090603 : enum processor_type cur_arch;
788 : 1090603 : enum processor_type cur_tune;
789 : :
790 : 1090603 : if (! args)
791 : : {
792 : 542840 : cur_tree = (pop_target ? pop_target : target_option_default_node);
793 : 542840 : cl_target_option_restore (&global_options, &global_options_set,
794 : 542840 : TREE_TARGET_OPTION (cur_tree));
795 : : }
796 : : else
797 : : {
798 : 547763 : cur_tree = ix86_valid_target_attribute_tree (NULL_TREE, args,
799 : : &global_options,
800 : : &global_options_set, 0);
801 : 547763 : if (!cur_tree || cur_tree == error_mark_node)
802 : : {
803 : 269 : cl_target_option_restore (&global_options, &global_options_set,
804 : 269 : TREE_TARGET_OPTION (prev_tree));
805 : 269 : return false;
806 : : }
807 : : }
808 : :
809 : 1090334 : target_option_current_node = cur_tree;
810 : 1090334 : ix86_reset_previous_fndecl ();
811 : :
812 : : /* Figure out the previous/current isa, arch, tune and the differences. */
813 : 1090334 : prev_opt = TREE_TARGET_OPTION (prev_tree);
814 : 1090334 : cur_opt = TREE_TARGET_OPTION (cur_tree);
815 : 1090334 : prev_isa = prev_opt->x_ix86_isa_flags;
816 : 1090334 : cur_isa = cur_opt->x_ix86_isa_flags;
817 : 1090334 : diff_isa = (prev_isa ^ cur_isa);
818 : 1090334 : prev_isa2 = prev_opt->x_ix86_isa_flags2;
819 : 1090334 : cur_isa2 = cur_opt->x_ix86_isa_flags2;
820 : 1090334 : diff_isa2 = (prev_isa2 ^ cur_isa2);
821 : 1090334 : prev_arch = (enum processor_type) prev_opt->arch;
822 : 1090334 : prev_tune = (enum processor_type) prev_opt->tune;
823 : 1090334 : cur_arch = (enum processor_type) cur_opt->arch;
824 : 1090334 : cur_tune = (enum processor_type) cur_opt->tune;
825 : :
826 : : /* If the same processor is used for both previous and current options, don't
827 : : change the macros. */
828 : 1090334 : if (cur_arch == prev_arch)
829 : 1090333 : cur_arch = prev_arch = PROCESSOR_max;
830 : :
831 : 1090334 : if (cur_tune == prev_tune)
832 : 1090333 : cur_tune = prev_tune = PROCESSOR_max;
833 : :
834 : : /* Undef all of the macros for that are no longer current. */
835 : 1090334 : cpp_force_token_locations (parse_in, BUILTINS_LOCATION);
836 : 1090334 : ix86_target_macros_internal (prev_isa & diff_isa,
837 : : prev_isa2 & diff_isa2,
838 : : prev_arch,
839 : : prev_tune,
840 : 1090334 : (enum fpmath_unit) prev_opt->x_ix86_fpmath,
841 : : cpp_undef);
842 : 1090334 : cpp_stop_forcing_token_locations (parse_in);
843 : :
844 : : /* For the definitions, ensure all newly defined macros are considered
845 : : as used for -Wunused-macros. There is no point warning about the
846 : : compiler predefined macros. */
847 : 1090334 : cpp_options *cpp_opts = cpp_get_options (parse_in);
848 : 1090334 : unsigned char saved_warn_unused_macros = cpp_opts->warn_unused_macros;
849 : 1090334 : cpp_opts->warn_unused_macros = 0;
850 : :
851 : : /* Define all of the macros for new options that were just turned on. */
852 : 1090334 : cpp_force_token_locations (parse_in, BUILTINS_LOCATION);
853 : 1090334 : ix86_target_macros_internal (cur_isa & diff_isa,
854 : : cur_isa2 & diff_isa2,
855 : : cur_arch,
856 : : cur_tune,
857 : 1090334 : (enum fpmath_unit) cur_opt->x_ix86_fpmath,
858 : : cpp_define);
859 : 1090334 : cpp_stop_forcing_token_locations (parse_in);
860 : :
861 : 1090334 : cpp_opts->warn_unused_macros = saved_warn_unused_macros;
862 : :
863 : 1090334 : return true;
864 : : }
865 : :
866 : : /* Function to tell the preprocessor about the defines for the current target. */
867 : :
868 : : void
869 : 209370 : ix86_target_macros (void)
870 : : {
871 : : /* 32/64-bit won't change with target specific options, so do the assert and
872 : : builtin_define_std calls here. */
873 : 209370 : if (TARGET_64BIT)
874 : : {
875 : 204032 : cpp_assert (parse_in, "cpu=x86_64");
876 : 204032 : cpp_assert (parse_in, "machine=x86_64");
877 : 204032 : cpp_define (parse_in, "__amd64");
878 : 204032 : cpp_define (parse_in, "__amd64__");
879 : 204032 : cpp_define (parse_in, "__x86_64");
880 : 204032 : cpp_define (parse_in, "__x86_64__");
881 : 204032 : if (TARGET_X32)
882 : : {
883 : 103 : cpp_define (parse_in, "_ILP32");
884 : 103 : cpp_define (parse_in, "__ILP32__");
885 : : }
886 : : }
887 : : else
888 : : {
889 : 5338 : cpp_assert (parse_in, "cpu=i386");
890 : 5338 : cpp_assert (parse_in, "machine=i386");
891 : 5338 : builtin_define_std ("i386");
892 : 5338 : cpp_define (parse_in, "_ILP32");
893 : 5338 : cpp_define (parse_in, "__ILP32__");
894 : : }
895 : :
896 : 209370 : if (!TARGET_80387)
897 : 220 : cpp_define (parse_in, "_SOFT_FLOAT");
898 : :
899 : : /* HFmode/BFmode is supported without depending any isa
900 : : in scalar_mode_supported_p and libgcc_floating_mode_supported_p,
901 : : but according to psABI, they're really supported w/ SSE2 and above.
902 : : Since libstdc++ uses __STDCPP_FLOAT16_T__ and __STDCPP_BFLOAT16_T__
903 : : for backend support of the types, undef the macros to avoid
904 : : build failure, see PR109504. */
905 : 209370 : if (!TARGET_SSE2)
906 : : {
907 : 396 : if (c_dialect_cxx () && cxx_dialect > cxx20)
908 : : {
909 : 5 : cpp_undef (parse_in, "__STDCPP_FLOAT16_T__");
910 : 5 : cpp_undef (parse_in, "__STDCPP_BFLOAT16_T__");
911 : : }
912 : : }
913 : :
914 : 209370 : if (TARGET_LONG_DOUBLE_64)
915 : 16 : cpp_define (parse_in, "__LONG_DOUBLE_64__");
916 : :
917 : 209370 : if (TARGET_LONG_DOUBLE_128)
918 : 6 : cpp_define (parse_in, "__LONG_DOUBLE_128__");
919 : :
920 : 209370 : cpp_define_formatted (parse_in, "__SIZEOF_FLOAT80__=%d",
921 : 209370 : GET_MODE_SIZE (XFmode));
922 : :
923 : 209370 : cpp_define (parse_in, "__SIZEOF_FLOAT128__=16");
924 : :
925 : 209370 : cpp_define_formatted (parse_in, "__ATOMIC_HLE_ACQUIRE=%d", IX86_HLE_ACQUIRE);
926 : 209370 : cpp_define_formatted (parse_in, "__ATOMIC_HLE_RELEASE=%d", IX86_HLE_RELEASE);
927 : :
928 : 209370 : cpp_define (parse_in, "__GCC_ASM_FLAG_OUTPUTS__");
929 : :
930 : 209370 : ix86_target_macros_internal (ix86_isa_flags,
931 : : ix86_isa_flags2,
932 : : ix86_arch,
933 : : ix86_tune,
934 : : ix86_fpmath,
935 : : cpp_define);
936 : :
937 : 209370 : cpp_define (parse_in, "__SEG_FS");
938 : 209370 : cpp_define (parse_in, "__SEG_GS");
939 : :
940 : 209370 : if (flag_cf_protection != CF_NONE)
941 : 19906 : cpp_define_formatted (parse_in, "__CET__=%d", flag_cf_protection & ~CF_SET);
942 : 209370 : }
943 : :
944 : :
945 : : /* Register target pragmas. We need to add the hook for parsing #pragma GCC
946 : : option here rather than in i386.cc since it will pull in various preprocessor
947 : : functions, and those are not present in languages like fortran without a
948 : : preprocessor. */
949 : :
950 : : void
951 : 209898 : ix86_register_pragmas (void)
952 : : {
953 : : /* Update pragma hook to allow parsing #pragma GCC target. */
954 : 209898 : targetm.target_option.pragma_parse = ix86_pragma_target_parse;
955 : :
956 : 209898 : c_register_addr_space ("__seg_fs", ADDR_SPACE_SEG_FS);
957 : 209898 : c_register_addr_space ("__seg_gs", ADDR_SPACE_SEG_GS);
958 : :
959 : : #ifdef REGISTER_SUBTARGET_PRAGMAS
960 : : REGISTER_SUBTARGET_PRAGMAS ();
961 : : #endif
962 : 209898 : }
|