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 : 2446734 : 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 : 2446734 : size_t arch_len = strlen (ix86_arch_string);
50 : 2446734 : size_t tune_len = strlen (ix86_tune_string);
51 : 2446734 : int last_arch_char = ix86_arch_string[arch_len - 1];
52 : 2446734 : int last_tune_char = ix86_tune_string[tune_len - 1];
53 : :
54 : : /* Built-ins based on -march=. */
55 : 2446734 : 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 : 205884 : case PROCESSOR_K8:
100 : 205884 : def_or_undef (parse_in, "__k8");
101 : 205884 : def_or_undef (parse_in, "__k8__");
102 : 205884 : 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 : 17 : case PROCESSOR_ZNVER2:
128 : 17 : def_or_undef (parse_in, "__znver2");
129 : 17 : def_or_undef (parse_in, "__znver2__");
130 : 17 : 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 : 14 : case PROCESSOR_ZNVER4:
136 : 14 : def_or_undef (parse_in, "__znver4");
137 : 14 : def_or_undef (parse_in, "__znver4__");
138 : 14 : break;
139 : 13 : case PROCESSOR_ZNVER5:
140 : 13 : def_or_undef (parse_in, "__znver5");
141 : 13 : def_or_undef (parse_in, "__znver5__");
142 : 13 : 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 : 2 : case PROCESSOR_SIERRAFOREST:
218 : 2 : def_or_undef (parse_in, "__sierraforest");
219 : 2 : def_or_undef (parse_in, "__sierraforest__");
220 : 2 : 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 : 32 : case PROCESSOR_SAPPHIRERAPIDS:
263 : 32 : def_or_undef (parse_in, "__sapphirerapids");
264 : 32 : def_or_undef (parse_in, "__sapphirerapids__");
265 : 32 : 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 : :
299 : : /* use PROCESSOR_max to not set/unset the arch macro. */
300 : : case PROCESSOR_max:
301 : : break;
302 : 0 : case PROCESSOR_INTEL:
303 : 0 : case PROCESSOR_GENERIC:
304 : 0 : gcc_unreachable ();
305 : : }
306 : :
307 : : /* Built-ins based on -mtune=. */
308 : 2446734 : switch (tune)
309 : : {
310 : 0 : case PROCESSOR_I386:
311 : 0 : def_or_undef (parse_in, "__tune_i386__");
312 : 0 : break;
313 : 0 : case PROCESSOR_I486:
314 : 0 : def_or_undef (parse_in, "__tune_i486__");
315 : 0 : break;
316 : 0 : case PROCESSOR_PENTIUM:
317 : 0 : def_or_undef (parse_in, "__tune_i586__");
318 : 0 : def_or_undef (parse_in, "__tune_pentium__");
319 : 0 : if (last_tune_char == 'x')
320 : 0 : def_or_undef (parse_in, "__tune_pentium_mmx__");
321 : : break;
322 : 0 : case PROCESSOR_PENTIUMPRO:
323 : 0 : def_or_undef (parse_in, "__tune_i686__");
324 : 0 : def_or_undef (parse_in, "__tune_pentiumpro__");
325 : 0 : switch (last_tune_char)
326 : : {
327 : 0 : case '3':
328 : 0 : def_or_undef (parse_in, "__tune_pentium3__");
329 : : /* FALLTHRU */
330 : 0 : case '2':
331 : 0 : def_or_undef (parse_in, "__tune_pentium2__");
332 : 0 : break;
333 : : }
334 : : break;
335 : 0 : case PROCESSOR_GEODE:
336 : 0 : def_or_undef (parse_in, "__tune_geode__");
337 : 0 : break;
338 : 0 : case PROCESSOR_K6:
339 : 0 : def_or_undef (parse_in, "__tune_k6__");
340 : 0 : if (last_tune_char == '2')
341 : 0 : def_or_undef (parse_in, "__tune_k6_2__");
342 : 0 : else if (last_tune_char == '3')
343 : 0 : def_or_undef (parse_in, "__tune_k6_3__");
344 : 0 : else if (isa_flag & OPTION_MASK_ISA_3DNOW)
345 : 0 : def_or_undef (parse_in, "__tune_k6_3__");
346 : : break;
347 : 0 : case PROCESSOR_ATHLON:
348 : 0 : def_or_undef (parse_in, "__tune_athlon__");
349 : 0 : if (isa_flag & OPTION_MASK_ISA_SSE)
350 : 0 : def_or_undef (parse_in, "__tune_athlon_sse__");
351 : : break;
352 : 101 : case PROCESSOR_K8:
353 : 101 : def_or_undef (parse_in, "__tune_k8__");
354 : 101 : break;
355 : 52 : case PROCESSOR_AMDFAM10:
356 : 52 : def_or_undef (parse_in, "__tune_amdfam10__");
357 : 52 : break;
358 : 7 : case PROCESSOR_BDVER1:
359 : 7 : def_or_undef (parse_in, "__tune_bdver1__");
360 : 7 : break;
361 : 12 : case PROCESSOR_BDVER2:
362 : 12 : def_or_undef (parse_in, "__tune_bdver2__");
363 : 12 : break;
364 : 0 : case PROCESSOR_BDVER3:
365 : 0 : def_or_undef (parse_in, "__tune_bdver3__");
366 : 0 : break;
367 : 17 : case PROCESSOR_BDVER4:
368 : 17 : def_or_undef (parse_in, "__tune_bdver4__");
369 : 17 : break;
370 : 11 : case PROCESSOR_ZNVER1:
371 : 11 : def_or_undef (parse_in, "__tune_znver1__");
372 : 11 : break;
373 : 17 : case PROCESSOR_ZNVER2:
374 : 17 : def_or_undef (parse_in, "__tune_znver2__");
375 : 17 : break;
376 : 1 : case PROCESSOR_ZNVER3:
377 : 1 : def_or_undef (parse_in, "__tune_znver3__");
378 : 1 : break;
379 : 16 : case PROCESSOR_ZNVER4:
380 : 16 : def_or_undef (parse_in, "__tune_znver4__");
381 : 16 : break;
382 : 14 : case PROCESSOR_ZNVER5:
383 : 14 : def_or_undef (parse_in, "__tune_znver5__");
384 : 14 : break;
385 : 0 : case PROCESSOR_BTVER1:
386 : 0 : def_or_undef (parse_in, "__tune_btver1__");
387 : 0 : break;
388 : 4 : case PROCESSOR_BTVER2:
389 : 4 : def_or_undef (parse_in, "__tune_btver2__");
390 : 4 : break;
391 : 0 : case PROCESSOR_LUJIAZUI:
392 : 0 : def_or_undef (parse_in, "__tune_lujiazui__");
393 : 0 : break;
394 : 0 : case PROCESSOR_YONGFENG:
395 : 0 : def_or_undef (parse_in, "__tune_yongfeng__");
396 : 0 : break;
397 : 0 : case PROCESSOR_SHIJIDADAO:
398 : 0 : def_or_undef (parse_in, "__tune_shijidadao__");
399 : 0 : break;
400 : 0 : case PROCESSOR_PENTIUM4:
401 : 0 : def_or_undef (parse_in, "__tune_pentium4__");
402 : 0 : break;
403 : 10 : case PROCESSOR_NOCONA:
404 : 10 : def_or_undef (parse_in, "__tune_nocona__");
405 : 10 : break;
406 : 60 : case PROCESSOR_CORE2:
407 : 60 : def_or_undef (parse_in, "__tune_core2__");
408 : 60 : break;
409 : 25 : case PROCESSOR_NEHALEM:
410 : 25 : def_or_undef (parse_in, "__tune_corei7__");
411 : 25 : def_or_undef (parse_in, "__tune_nehalem__");
412 : 25 : break;
413 : 16 : case PROCESSOR_SANDYBRIDGE:
414 : 16 : def_or_undef (parse_in, "__tune_corei7_avx__");
415 : 16 : def_or_undef (parse_in, "__tune_sandybridge__");
416 : 16 : break;
417 : 92 : case PROCESSOR_HASWELL:
418 : 92 : def_or_undef (parse_in, "__tune_core_avx2__");
419 : 92 : def_or_undef (parse_in, "__tune_haswell__");
420 : 92 : break;
421 : 36 : case PROCESSOR_BONNELL:
422 : 36 : def_or_undef (parse_in, "__tune_atom__");
423 : 36 : def_or_undef (parse_in, "__tune_bonnell__");
424 : 36 : break;
425 : 18 : case PROCESSOR_SILVERMONT:
426 : 18 : def_or_undef (parse_in, "__tune_slm__");
427 : 18 : def_or_undef (parse_in, "__tune_silvermont__");
428 : 18 : break;
429 : 9 : case PROCESSOR_GOLDMONT:
430 : 9 : def_or_undef (parse_in, "__tune_goldmont__");
431 : 9 : break;
432 : 0 : case PROCESSOR_GOLDMONT_PLUS:
433 : 0 : def_or_undef (parse_in, "__tune_goldmont_plus__");
434 : 0 : break;
435 : 0 : case PROCESSOR_TREMONT:
436 : 0 : def_or_undef (parse_in, "__tune_tremont__");
437 : 0 : break;
438 : 2 : case PROCESSOR_SIERRAFOREST:
439 : 2 : def_or_undef (parse_in, "__tune_sierraforest__");
440 : 2 : break;
441 : 0 : case PROCESSOR_GRANDRIDGE:
442 : 0 : def_or_undef (parse_in, "__tune_grandridge__");
443 : 0 : break;
444 : 0 : case PROCESSOR_CLEARWATERFOREST:
445 : 0 : def_or_undef (parse_in, "__tune_clearwaterforest__");
446 : 0 : break;
447 : 82 : case PROCESSOR_SKYLAKE:
448 : 82 : def_or_undef (parse_in, "__tune_skylake__");
449 : 82 : break;
450 : 188 : case PROCESSOR_SKYLAKE_AVX512:
451 : 188 : def_or_undef (parse_in, "__tune_skylake_avx512__");
452 : 188 : break;
453 : 11 : case PROCESSOR_CANNONLAKE:
454 : 11 : def_or_undef (parse_in, "__tune_cannonlake__");
455 : 11 : break;
456 : 0 : case PROCESSOR_ICELAKE_CLIENT:
457 : 0 : def_or_undef (parse_in, "__tune_icelake_client__");
458 : 0 : break;
459 : 22 : case PROCESSOR_ICELAKE_SERVER:
460 : 22 : def_or_undef (parse_in, "__tune_icelake_server__");
461 : 22 : break;
462 : 0 : case PROCESSOR_LAKEMONT:
463 : 0 : def_or_undef (parse_in, "__tune_lakemont__");
464 : 0 : break;
465 : 17 : case PROCESSOR_CASCADELAKE:
466 : 17 : def_or_undef (parse_in, "__tune_cascadelake__");
467 : 17 : break;
468 : 7 : case PROCESSOR_TIGERLAKE:
469 : 7 : def_or_undef (parse_in, "__tune_tigerlake__");
470 : 7 : break;
471 : 2 : case PROCESSOR_COOPERLAKE:
472 : 2 : def_or_undef (parse_in, "__tune_cooperlake__");
473 : 2 : break;
474 : 37 : case PROCESSOR_SAPPHIRERAPIDS:
475 : 37 : def_or_undef (parse_in, "__tune_sapphirerapids__");
476 : 37 : break;
477 : 7 : case PROCESSOR_ALDERLAKE:
478 : 7 : def_or_undef (parse_in, "__tune_alderlake__");
479 : 7 : break;
480 : 0 : case PROCESSOR_ROCKETLAKE:
481 : 0 : def_or_undef (parse_in, "__tune_rocketlake__");
482 : 0 : break;
483 : 0 : case PROCESSOR_GRANITERAPIDS:
484 : 0 : def_or_undef (parse_in, "__tune_graniterapids__");
485 : 0 : break;
486 : 0 : case PROCESSOR_GRANITERAPIDS_D:
487 : 0 : def_or_undef (parse_in, "__tune_graniterapids_d__");
488 : 0 : break;
489 : 0 : case PROCESSOR_ARROWLAKE:
490 : 0 : def_or_undef (parse_in, "__tune_arrowlake__");
491 : 0 : break;
492 : 0 : case PROCESSOR_ARROWLAKE_S:
493 : 0 : def_or_undef (parse_in, "__tune_arrowlake_s__");
494 : 0 : break;
495 : 0 : case PROCESSOR_PANTHERLAKE:
496 : 0 : def_or_undef (parse_in, "__tune_pantherlake__");
497 : 0 : break;
498 : 0 : case PROCESSOR_DIAMONDRAPIDS:
499 : 0 : def_or_undef (parse_in, "__tune_diamondrapids__");
500 : 0 : break;
501 : : case PROCESSOR_INTEL:
502 : : case PROCESSOR_GENERIC:
503 : : break;
504 : : /* use PROCESSOR_max to not set/unset the tune macro. */
505 : : case PROCESSOR_max:
506 : : break;
507 : : }
508 : :
509 : 2446734 : switch (ix86_cmodel)
510 : : {
511 : 2401628 : case CM_SMALL:
512 : 2401628 : case CM_SMALL_PIC:
513 : 2401628 : def_or_undef (parse_in, "__code_model_small__");
514 : 2401628 : break;
515 : 902 : case CM_MEDIUM:
516 : 902 : case CM_MEDIUM_PIC:
517 : 902 : def_or_undef (parse_in, "__code_model_medium__");
518 : 902 : break;
519 : 500 : case CM_LARGE:
520 : 500 : case CM_LARGE_PIC:
521 : 500 : def_or_undef (parse_in, "__code_model_large__");
522 : 500 : break;
523 : 43703 : case CM_32:
524 : 43703 : def_or_undef (parse_in, "__code_model_32__");
525 : 43703 : break;
526 : 1 : case CM_KERNEL:
527 : 1 : def_or_undef (parse_in, "__code_model_kernel__");
528 : 1 : break;
529 : 2446734 : default:
530 : 2446734 : ;
531 : : }
532 : :
533 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_WBNOINVD)
534 : 10200 : def_or_undef (parse_in, "__WBNOINVD__");
535 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_AVX512VP2INTERSECT)
536 : 20090 : def_or_undef (parse_in, "__AVX512VP2INTERSECT__");
537 : 2446734 : if (isa_flag & OPTION_MASK_ISA_MMX)
538 : 214996 : def_or_undef (parse_in, "__MMX__");
539 : 2446734 : if (isa_flag & OPTION_MASK_ISA_3DNOW)
540 : 2799 : def_or_undef (parse_in, "__3dNOW__");
541 : 2446734 : if (isa_flag & OPTION_MASK_ISA_3DNOW_A)
542 : 1480 : def_or_undef (parse_in, "__3dNOW_A__");
543 : 2446734 : if (isa_flag & OPTION_MASK_ISA_SSE)
544 : 216872 : def_or_undef (parse_in, "__SSE__");
545 : 2446734 : if (isa_flag & OPTION_MASK_ISA_SSE2)
546 : 216770 : def_or_undef (parse_in, "__SSE2__");
547 : 2446734 : if (isa_flag & OPTION_MASK_ISA_SSE3)
548 : 86231 : def_or_undef (parse_in, "__SSE3__");
549 : 2446734 : if (isa_flag & OPTION_MASK_ISA_SSSE3)
550 : 84447 : def_or_undef (parse_in, "__SSSE3__");
551 : 2446734 : if (isa_flag & OPTION_MASK_ISA_SSE4_1)
552 : 83538 : def_or_undef (parse_in, "__SSE4_1__");
553 : 2446734 : if (isa_flag & OPTION_MASK_ISA_SSE4_2)
554 : 83822 : def_or_undef (parse_in, "__SSE4_2__");
555 : 2446734 : if (isa_flag & OPTION_MASK_ISA_AES)
556 : 10404 : def_or_undef (parse_in, "__AES__");
557 : 2446734 : if (isa_flag & OPTION_MASK_ISA_SHA)
558 : 10104 : def_or_undef (parse_in, "__SHA__");
559 : 2446734 : if (isa_flag & OPTION_MASK_ISA_PCLMUL)
560 : 30259 : def_or_undef (parse_in, "__PCLMUL__");
561 : 2446734 : if (isa_flag & OPTION_MASK_ISA_AVX)
562 : 83513 : def_or_undef (parse_in, "__AVX__");
563 : 2446734 : if (isa_flag & OPTION_MASK_ISA_AVX2)
564 : 135806 : def_or_undef (parse_in, "__AVX2__");
565 : 2446734 : if (isa_flag & OPTION_MASK_ISA_AVX512F)
566 : 164378 : def_or_undef (parse_in, "__AVX512F__");
567 : 2446734 : if (isa_flag & OPTION_MASK_ISA_AVX512CD)
568 : 99041 : def_or_undef (parse_in, "__AVX512CD__");
569 : 2446734 : if (isa_flag & OPTION_MASK_ISA_AVX512DQ)
570 : 111738 : def_or_undef (parse_in, "__AVX512DQ__");
571 : 2446734 : if (isa_flag & OPTION_MASK_ISA_AVX512BW)
572 : 172225 : def_or_undef (parse_in, "__AVX512BW__");
573 : 2446734 : if (isa_flag & OPTION_MASK_ISA_AVX512VL)
574 : : {
575 : 176420 : def_or_undef (parse_in, "__AVX512VL__");
576 : 176420 : def_or_undef (parse_in, "__EVEX256__");
577 : : }
578 : 2446734 : if (isa_flag & OPTION_MASK_ISA_AVX512VBMI)
579 : 99243 : def_or_undef (parse_in, "__AVX512VBMI__");
580 : 2446734 : if (isa_flag & OPTION_MASK_ISA_AVX512IFMA)
581 : 99301 : def_or_undef (parse_in, "__AVX512IFMA__");
582 : 2446734 : if (isa_flag & OPTION_MASK_ISA_AVX512VBMI2)
583 : 98588 : def_or_undef (parse_in, "__AVX512VBMI2__");
584 : 2446734 : if (isa_flag & OPTION_MASK_ISA_AVX512VNNI)
585 : 99297 : def_or_undef (parse_in, "__AVX512VNNI__");
586 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_PCONFIG)
587 : 10167 : def_or_undef (parse_in, "__PCONFIG__");
588 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_SGX)
589 : 10401 : def_or_undef (parse_in, "__SGX__");
590 : 2446734 : if (isa_flag & OPTION_MASK_ISA_AVX512BITALG)
591 : 99206 : def_or_undef (parse_in, "__AVX512BITALG__");
592 : 2446734 : if (isa_flag & OPTION_MASK_ISA_AVX512VPOPCNTDQ)
593 : 99285 : def_or_undef (parse_in, "__AVX512VPOPCNTDQ__");
594 : 2446734 : if (isa_flag & OPTION_MASK_ISA_FMA)
595 : 10846 : def_or_undef (parse_in, "__FMA__");
596 : 2446734 : if (isa_flag & OPTION_MASK_ISA_RTM)
597 : 19668 : def_or_undef (parse_in, "__RTM__");
598 : 2446734 : if (isa_flag & OPTION_MASK_ISA_SSE4A)
599 : 4105 : def_or_undef (parse_in, "__SSE4A__");
600 : 2446734 : if (isa_flag & OPTION_MASK_ISA_FMA4)
601 : 2749 : def_or_undef (parse_in, "__FMA4__");
602 : 2446734 : if (isa_flag & OPTION_MASK_ISA_XOP)
603 : 1478 : def_or_undef (parse_in, "__XOP__");
604 : 2446734 : if (isa_flag & OPTION_MASK_ISA_LWP)
605 : 10175 : def_or_undef (parse_in, "__LWP__");
606 : 2446734 : if (isa_flag & OPTION_MASK_ISA_ABM)
607 : 143 : def_or_undef (parse_in, "__ABM__");
608 : 2446734 : if (isa_flag & OPTION_MASK_ISA_BMI)
609 : 10626 : def_or_undef (parse_in, "__BMI__");
610 : 2446734 : if (isa_flag & OPTION_MASK_ISA_BMI2)
611 : 10614 : def_or_undef (parse_in, "__BMI2__");
612 : 2446734 : if (isa_flag & OPTION_MASK_ISA_LZCNT)
613 : 10664 : def_or_undef (parse_in, "__LZCNT__");
614 : 2446734 : if (isa_flag & OPTION_MASK_ISA_TBM)
615 : 10164 : def_or_undef (parse_in, "__TBM__");
616 : 2446734 : if (isa_flag & OPTION_MASK_ISA_CRC32)
617 : 78056 : def_or_undef (parse_in, "__CRC32__");
618 : 2446734 : if (isa_flag & OPTION_MASK_ISA_POPCNT)
619 : 76166 : def_or_undef (parse_in, "__POPCNT__");
620 : 2446734 : if (isa_flag & OPTION_MASK_ISA_FSGSBASE)
621 : 10330 : def_or_undef (parse_in, "__FSGSBASE__");
622 : 2446734 : if (isa_flag & OPTION_MASK_ISA_RDRND)
623 : 20352 : def_or_undef (parse_in, "__RDRND__");
624 : 2446734 : if (isa_flag & OPTION_MASK_ISA_F16C)
625 : 10710 : def_or_undef (parse_in, "__F16C__");
626 : 2446734 : if (isa_flag & OPTION_MASK_ISA_RDSEED)
627 : 10448 : def_or_undef (parse_in, "__RDSEED__");
628 : 2446734 : if (isa_flag & OPTION_MASK_ISA_PRFCHW)
629 : 466 : def_or_undef (parse_in, "__PRFCHW__");
630 : 2446734 : if (isa_flag & OPTION_MASK_ISA_ADX)
631 : 391 : def_or_undef (parse_in, "__ADX__");
632 : 2446734 : if (isa_flag & OPTION_MASK_ISA_FXSR)
633 : 206473 : def_or_undef (parse_in, "__FXSR__");
634 : 2446734 : if (isa_flag & OPTION_MASK_ISA_XSAVE)
635 : 79036 : def_or_undef (parse_in, "__XSAVE__");
636 : 2446734 : if (isa_flag & OPTION_MASK_ISA_XSAVEOPT)
637 : 10520 : def_or_undef (parse_in, "__XSAVEOPT__");
638 : 2446734 : if ((fpmath & FPMATH_SSE) && (isa_flag & OPTION_MASK_ISA_SSE))
639 : 211311 : def_or_undef (parse_in, "__SSE_MATH__");
640 : 1633765 : if ((fpmath & FPMATH_SSE) && (isa_flag & OPTION_MASK_ISA_SSE2))
641 : 211209 : def_or_undef (parse_in, "__SSE2_MATH__");
642 : 2446734 : if (isa_flag & OPTION_MASK_ISA_CLFLUSHOPT)
643 : 10451 : def_or_undef (parse_in, "__CLFLUSHOPT__");
644 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_CLZERO)
645 : 10187 : def_or_undef (parse_in, "__CLZERO__");
646 : 2446734 : if (isa_flag & OPTION_MASK_ISA_XSAVEC)
647 : 10450 : def_or_undef (parse_in, "__XSAVEC__");
648 : 2446734 : if (isa_flag & OPTION_MASK_ISA_XSAVES)
649 : 10450 : def_or_undef (parse_in, "__XSAVES__");
650 : 2446734 : if (isa_flag & OPTION_MASK_ISA_CLWB)
651 : 10383 : def_or_undef (parse_in, "__CLWB__");
652 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_MWAITX)
653 : 10203 : def_or_undef (parse_in, "__MWAITX__");
654 : 2446734 : if (isa_flag & OPTION_MASK_ISA_PKU)
655 : 10368 : def_or_undef (parse_in, "__PKU__");
656 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_RDPID)
657 : 10215 : def_or_undef (parse_in, "__RDPID__");
658 : 2446734 : if (isa_flag & OPTION_MASK_ISA_GFNI)
659 : 59887 : def_or_undef (parse_in, "__GFNI__");
660 : 2446734 : if ((isa_flag & OPTION_MASK_ISA_SHSTK))
661 : 29024 : def_or_undef (parse_in, "__SHSTK__");
662 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_VAES)
663 : 20165 : def_or_undef (parse_in, "__VAES__");
664 : 2446734 : if (isa_flag & OPTION_MASK_ISA_VPCLMULQDQ)
665 : 20156 : def_or_undef (parse_in, "__VPCLMULQDQ__");
666 : 2446734 : if (isa_flag & OPTION_MASK_ISA_MOVDIRI)
667 : 10205 : def_or_undef (parse_in, "__MOVDIRI__");
668 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_MOVDIR64B)
669 : 10211 : def_or_undef (parse_in, "__MOVDIR64B__");
670 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_WAITPKG)
671 : 10185 : def_or_undef (parse_in, "__WAITPKG__");
672 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_CLDEMOTE)
673 : 10181 : def_or_undef (parse_in, "__CLDEMOTE__");
674 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_SERIALIZE)
675 : 10156 : def_or_undef (parse_in, "__SERIALIZE__");
676 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_PTWRITE)
677 : 10188 : def_or_undef (parse_in, "__PTWRITE__");
678 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_AVX512BF16)
679 : 99280 : def_or_undef (parse_in, "__AVX512BF16__");
680 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_AVX512FP16)
681 : 90660 : def_or_undef (parse_in, "__AVX512FP16__");
682 : 2446734 : if (TARGET_MMX_WITH_SSE)
683 : 1620315 : def_or_undef (parse_in, "__MMX_WITH_SSE__");
684 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_ENQCMD)
685 : 10153 : def_or_undef (parse_in, "__ENQCMD__");
686 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_TSXLDTRK)
687 : 10149 : def_or_undef (parse_in, "__TSXLDTRK__");
688 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_AMX_TILE)
689 : 89134 : def_or_undef (parse_in, "__AMX_TILE__");
690 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_AMX_INT8)
691 : 10036 : def_or_undef (parse_in, "__AMX_INT8__");
692 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_AMX_BF16)
693 : 19848 : def_or_undef (parse_in, "__AMX_BF16__");
694 : 2446734 : if (isa_flag & OPTION_MASK_ISA_SAHF)
695 : 6020 : def_or_undef (parse_in, "__LAHF_SAHF__");
696 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_MOVBE)
697 : 617 : def_or_undef (parse_in, "__MOVBE__");
698 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_UINTR)
699 : 9967 : def_or_undef (parse_in, "__UINTR__");
700 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_HRESET)
701 : 10170 : def_or_undef (parse_in, "__HRESET__");
702 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_KL)
703 : 20084 : def_or_undef (parse_in, "__KL__");
704 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_WIDEKL)
705 : 10086 : def_or_undef (parse_in, "__WIDEKL__");
706 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_AVXVNNI)
707 : 10140 : def_or_undef (parse_in, "__AVXVNNI__");
708 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_AVXIFMA)
709 : 10077 : def_or_undef (parse_in, "__AVXIFMA__");
710 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_AVXVNNIINT8)
711 : 10084 : def_or_undef (parse_in, "__AVXVNNIINT8__");
712 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_AVXNECONVERT)
713 : 10080 : def_or_undef (parse_in, "__AVXNECONVERT__");
714 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_CMPCCXADD)
715 : 9965 : def_or_undef (parse_in, "__CMPCCXADD__");
716 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_AMX_FP16)
717 : 9849 : def_or_undef (parse_in, "__AMX_FP16__");
718 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_PREFETCHI)
719 : 9977 : def_or_undef (parse_in, "__PREFETCHI__");
720 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_RAOINT)
721 : 10135 : def_or_undef (parse_in, "__RAOINT__");
722 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_AMX_COMPLEX)
723 : 19849 : def_or_undef (parse_in, "__AMX_COMPLEX__");
724 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_AVXVNNIINT16)
725 : 10081 : def_or_undef (parse_in, "__AVXVNNIINT16__");
726 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_SM3)
727 : 10071 : def_or_undef (parse_in, "__SM3__");
728 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_SHA512)
729 : 10071 : def_or_undef (parse_in, "__SHA512__");
730 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_SM4)
731 : 20075 : def_or_undef (parse_in, "__SM4__");
732 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_USER_MSR)
733 : 9986 : def_or_undef (parse_in, "__USER_MSR__");
734 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_AVX10_1)
735 : 79725 : def_or_undef (parse_in, "__AVX10_1__");
736 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_APX_F)
737 : 54 : def_or_undef (parse_in, "__APX_F__");
738 : 2446734 : if (ix86_apx_inline_asm_use_gpr32)
739 : 1 : def_or_undef (parse_in, "__APX_INLINE_ASM_USE_GPR32__");
740 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_AVX10_2)
741 : 79761 : def_or_undef (parse_in, "__AVX10_2__");
742 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_AMX_AVX512)
743 : 10070 : def_or_undef (parse_in, "__AMX_AVX512__");
744 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_AMX_TF32)
745 : 19855 : def_or_undef (parse_in, "__AMX_TF32__");
746 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_AMX_TRANSPOSE)
747 : 19856 : def_or_undef (parse_in, "__AMX_TRANSPOSE__");
748 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_AMX_FP8)
749 : 16 : def_or_undef (parse_in, "__AMX_FP8__");
750 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_MOVRS)
751 : 19855 : def_or_undef (parse_in, "__MOVRS__");
752 : 2446734 : if (isa_flag2 & OPTION_MASK_ISA2_AMX_MOVRS)
753 : 19689 : def_or_undef (parse_in, "__AMX_MOVRS__");
754 : 2446734 : if (TARGET_IAMCU)
755 : : {
756 : 0 : def_or_undef (parse_in, "__iamcu");
757 : 0 : def_or_undef (parse_in, "__iamcu__");
758 : : }
759 : 2446734 : }
760 : :
761 : :
762 : : /* Hook to validate the current #pragma GCC target and set the state, and
763 : : update the macros based on what was changed. If ARGS is NULL, then
764 : : POP_TARGET is used to reset the options. */
765 : :
766 : : static bool
767 : 1120400 : ix86_pragma_target_parse (tree args, tree pop_target)
768 : : {
769 : 1120400 : tree prev_tree
770 : 1120400 : = build_target_option_node (&global_options, &global_options_set);
771 : 1120400 : tree cur_tree;
772 : 1120400 : struct cl_target_option *prev_opt;
773 : 1120400 : struct cl_target_option *cur_opt;
774 : 1120400 : HOST_WIDE_INT prev_isa;
775 : 1120400 : HOST_WIDE_INT cur_isa;
776 : 1120400 : HOST_WIDE_INT diff_isa;
777 : 1120400 : HOST_WIDE_INT prev_isa2;
778 : 1120400 : HOST_WIDE_INT cur_isa2;
779 : 1120400 : HOST_WIDE_INT diff_isa2;
780 : 1120400 : enum processor_type prev_arch;
781 : 1120400 : enum processor_type prev_tune;
782 : 1120400 : enum processor_type cur_arch;
783 : 1120400 : enum processor_type cur_tune;
784 : :
785 : 1120400 : if (! args)
786 : : {
787 : 557791 : cur_tree = (pop_target ? pop_target : target_option_default_node);
788 : 557791 : cl_target_option_restore (&global_options, &global_options_set,
789 : 557791 : TREE_TARGET_OPTION (cur_tree));
790 : : }
791 : : else
792 : : {
793 : 562609 : cur_tree = ix86_valid_target_attribute_tree (NULL_TREE, args,
794 : : &global_options,
795 : : &global_options_set, 0);
796 : 562609 : if (!cur_tree || cur_tree == error_mark_node)
797 : : {
798 : 269 : cl_target_option_restore (&global_options, &global_options_set,
799 : 269 : TREE_TARGET_OPTION (prev_tree));
800 : 269 : return false;
801 : : }
802 : : }
803 : :
804 : 1120131 : target_option_current_node = cur_tree;
805 : 1120131 : ix86_reset_previous_fndecl ();
806 : :
807 : : /* Figure out the previous/current isa, arch, tune and the differences. */
808 : 1120131 : prev_opt = TREE_TARGET_OPTION (prev_tree);
809 : 1120131 : cur_opt = TREE_TARGET_OPTION (cur_tree);
810 : 1120131 : prev_isa = prev_opt->x_ix86_isa_flags;
811 : 1120131 : cur_isa = cur_opt->x_ix86_isa_flags;
812 : 1120131 : diff_isa = (prev_isa ^ cur_isa);
813 : 1120131 : prev_isa2 = prev_opt->x_ix86_isa_flags2;
814 : 1120131 : cur_isa2 = cur_opt->x_ix86_isa_flags2;
815 : 1120131 : diff_isa2 = (prev_isa2 ^ cur_isa2);
816 : 1120131 : prev_arch = (enum processor_type) prev_opt->arch;
817 : 1120131 : prev_tune = (enum processor_type) prev_opt->tune;
818 : 1120131 : cur_arch = (enum processor_type) cur_opt->arch;
819 : 1120131 : cur_tune = (enum processor_type) cur_opt->tune;
820 : :
821 : : /* If the same processor is used for both previous and current options, don't
822 : : change the macros. */
823 : 1120131 : if (cur_arch == prev_arch)
824 : 1120130 : cur_arch = prev_arch = PROCESSOR_max;
825 : :
826 : 1120131 : if (cur_tune == prev_tune)
827 : 1120130 : cur_tune = prev_tune = PROCESSOR_max;
828 : :
829 : : /* Undef all of the macros for that are no longer current. */
830 : 1120131 : cpp_force_token_locations (parse_in, BUILTINS_LOCATION);
831 : 1120131 : ix86_target_macros_internal (prev_isa & diff_isa,
832 : : prev_isa2 & diff_isa2,
833 : : prev_arch,
834 : : prev_tune,
835 : 1120131 : (enum fpmath_unit) prev_opt->x_ix86_fpmath,
836 : : cpp_undef);
837 : 1120131 : cpp_stop_forcing_token_locations (parse_in);
838 : :
839 : : /* For the definitions, ensure all newly defined macros are considered
840 : : as used for -Wunused-macros. There is no point warning about the
841 : : compiler predefined macros. */
842 : 1120131 : cpp_options *cpp_opts = cpp_get_options (parse_in);
843 : 1120131 : unsigned char saved_warn_unused_macros = cpp_opts->warn_unused_macros;
844 : 1120131 : cpp_opts->warn_unused_macros = 0;
845 : :
846 : : /* Define all of the macros for new options that were just turned on. */
847 : 1120131 : cpp_force_token_locations (parse_in, BUILTINS_LOCATION);
848 : 1120131 : ix86_target_macros_internal (cur_isa & diff_isa,
849 : : cur_isa2 & diff_isa2,
850 : : cur_arch,
851 : : cur_tune,
852 : 1120131 : (enum fpmath_unit) cur_opt->x_ix86_fpmath,
853 : : cpp_define);
854 : 1120131 : cpp_stop_forcing_token_locations (parse_in);
855 : :
856 : 1120131 : cpp_opts->warn_unused_macros = saved_warn_unused_macros;
857 : :
858 : 1120131 : return true;
859 : : }
860 : :
861 : : /* Function to tell the preprocessor about the defines for the current target. */
862 : :
863 : : void
864 : 206472 : ix86_target_macros (void)
865 : : {
866 : : /* 32/64-bit won't change with target specific options, so do the assert and
867 : : builtin_define_std calls here. */
868 : 206472 : if (TARGET_64BIT)
869 : : {
870 : 201165 : cpp_assert (parse_in, "cpu=x86_64");
871 : 201165 : cpp_assert (parse_in, "machine=x86_64");
872 : 201165 : cpp_define (parse_in, "__amd64");
873 : 201165 : cpp_define (parse_in, "__amd64__");
874 : 201165 : cpp_define (parse_in, "__x86_64");
875 : 201165 : cpp_define (parse_in, "__x86_64__");
876 : 201165 : if (TARGET_X32)
877 : : {
878 : 103 : cpp_define (parse_in, "_ILP32");
879 : 103 : cpp_define (parse_in, "__ILP32__");
880 : : }
881 : : }
882 : : else
883 : : {
884 : 5307 : cpp_assert (parse_in, "cpu=i386");
885 : 5307 : cpp_assert (parse_in, "machine=i386");
886 : 5307 : builtin_define_std ("i386");
887 : 5307 : cpp_define (parse_in, "_ILP32");
888 : 5307 : cpp_define (parse_in, "__ILP32__");
889 : : }
890 : :
891 : 206472 : if (!TARGET_80387)
892 : 210 : cpp_define (parse_in, "_SOFT_FLOAT");
893 : :
894 : : /* HFmode/BFmode is supported without depending any isa
895 : : in scalar_mode_supported_p and libgcc_floating_mode_supported_p,
896 : : but according to psABI, they're really supported w/ SSE2 and above.
897 : : Since libstdc++ uses __STDCPP_FLOAT16_T__ and __STDCPP_BFLOAT16_T__
898 : : for backend support of the types, undef the macros to avoid
899 : : build failure, see PR109504. */
900 : 206472 : if (!TARGET_SSE2)
901 : : {
902 : 387 : if (c_dialect_cxx () && cxx_dialect > cxx20)
903 : : {
904 : 5 : cpp_undef (parse_in, "__STDCPP_FLOAT16_T__");
905 : 5 : cpp_undef (parse_in, "__STDCPP_BFLOAT16_T__");
906 : : }
907 : : }
908 : :
909 : 206472 : if (TARGET_LONG_DOUBLE_64)
910 : 16 : cpp_define (parse_in, "__LONG_DOUBLE_64__");
911 : :
912 : 206472 : if (TARGET_LONG_DOUBLE_128)
913 : 6 : cpp_define (parse_in, "__LONG_DOUBLE_128__");
914 : :
915 : 206472 : cpp_define_formatted (parse_in, "__SIZEOF_FLOAT80__=%d",
916 : 206472 : GET_MODE_SIZE (XFmode));
917 : :
918 : 206472 : cpp_define (parse_in, "__SIZEOF_FLOAT128__=16");
919 : :
920 : 206472 : cpp_define_formatted (parse_in, "__ATOMIC_HLE_ACQUIRE=%d", IX86_HLE_ACQUIRE);
921 : 206472 : cpp_define_formatted (parse_in, "__ATOMIC_HLE_RELEASE=%d", IX86_HLE_RELEASE);
922 : :
923 : 206472 : cpp_define (parse_in, "__GCC_ASM_FLAG_OUTPUTS__");
924 : :
925 : 206472 : ix86_target_macros_internal (ix86_isa_flags,
926 : : ix86_isa_flags2,
927 : : ix86_arch,
928 : : ix86_tune,
929 : : ix86_fpmath,
930 : : cpp_define);
931 : :
932 : 206472 : cpp_define (parse_in, "__SEG_FS");
933 : 206472 : cpp_define (parse_in, "__SEG_GS");
934 : :
935 : 206472 : if (flag_cf_protection != CF_NONE)
936 : 19534 : cpp_define_formatted (parse_in, "__CET__=%d", flag_cf_protection & ~CF_SET);
937 : 206472 : }
938 : :
939 : :
940 : : /* Register target pragmas. We need to add the hook for parsing #pragma GCC
941 : : option here rather than in i386.cc since it will pull in various preprocessor
942 : : functions, and those are not present in languages like fortran without a
943 : : preprocessor. */
944 : :
945 : : void
946 : 206994 : ix86_register_pragmas (void)
947 : : {
948 : : /* Update pragma hook to allow parsing #pragma GCC target. */
949 : 206994 : targetm.target_option.pragma_parse = ix86_pragma_target_parse;
950 : :
951 : 206994 : c_register_addr_space ("__seg_fs", ADDR_SPACE_SEG_FS);
952 : 206994 : c_register_addr_space ("__seg_gs", ADDR_SPACE_SEG_GS);
953 : :
954 : : #ifdef REGISTER_SUBTARGET_PRAGMAS
955 : : REGISTER_SUBTARGET_PRAGMAS ();
956 : : #endif
957 : 206994 : }
|