Branch data Line data Source code
1 : : /* Subroutines used for macro/preprocessor support on the ia-32.
2 : : Copyright (C) 2008-2024 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 : 2289718 : 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 : 2289718 : size_t arch_len = strlen (ix86_arch_string);
50 : 2289718 : size_t tune_len = strlen (ix86_tune_string);
51 : 2289718 : int last_arch_char = ix86_arch_string[arch_len - 1];
52 : 2289718 : int last_tune_char = ix86_tune_string[tune_len - 1];
53 : :
54 : : /* Built-ins based on -march=. */
55 : 2289718 : 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 : 206301 : case PROCESSOR_K8:
100 : 206301 : def_or_undef (parse_in, "__k8");
101 : 206301 : def_or_undef (parse_in, "__k8__");
102 : 206301 : break;
103 : 41 : case PROCESSOR_AMDFAM10:
104 : 41 : def_or_undef (parse_in, "__amdfam10");
105 : 41 : def_or_undef (parse_in, "__amdfam10__");
106 : 41 : 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 : 15 : case PROCESSOR_BDVER2:
112 : 15 : def_or_undef (parse_in, "__bdver2");
113 : 15 : def_or_undef (parse_in, "__bdver2__");
114 : 15 : 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 : 16 : case PROCESSOR_ZNVER2:
128 : 16 : def_or_undef (parse_in, "__znver2");
129 : 16 : def_or_undef (parse_in, "__znver2__");
130 : 16 : 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 : 5 : case PROCESSOR_ZNVER4:
136 : 5 : def_or_undef (parse_in, "__znver4");
137 : 5 : def_or_undef (parse_in, "__znver4__");
138 : 5 : break;
139 : 0 : case PROCESSOR_ZNVER5:
140 : 0 : def_or_undef (parse_in, "__znver5");
141 : 0 : def_or_undef (parse_in, "__znver5__");
142 : 0 : 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_PENTIUM4:
160 : 0 : def_or_undef (parse_in, "__pentium4");
161 : 0 : def_or_undef (parse_in, "__pentium4__");
162 : 0 : break;
163 : 8 : case PROCESSOR_NOCONA:
164 : 8 : def_or_undef (parse_in, "__nocona");
165 : 8 : def_or_undef (parse_in, "__nocona__");
166 : 8 : break;
167 : 18 : case PROCESSOR_CORE2:
168 : 18 : def_or_undef (parse_in, "__core2");
169 : 18 : def_or_undef (parse_in, "__core2__");
170 : 18 : break;
171 : 17 : case PROCESSOR_NEHALEM:
172 : 17 : def_or_undef (parse_in, "__corei7");
173 : 17 : def_or_undef (parse_in, "__corei7__");
174 : 17 : def_or_undef (parse_in, "__nehalem");
175 : 17 : def_or_undef (parse_in, "__nehalem__");
176 : 17 : break;
177 : 3 : case PROCESSOR_SANDYBRIDGE:
178 : 3 : def_or_undef (parse_in, "__corei7_avx");
179 : 3 : def_or_undef (parse_in, "__corei7_avx__");
180 : 3 : def_or_undef (parse_in, "__sandybridge");
181 : 3 : def_or_undef (parse_in, "__sandybridge__");
182 : 3 : break;
183 : 78 : case PROCESSOR_HASWELL:
184 : 78 : def_or_undef (parse_in, "__core_avx2");
185 : 78 : def_or_undef (parse_in, "__core_avx2__");
186 : 78 : def_or_undef (parse_in, "__haswell");
187 : 78 : def_or_undef (parse_in, "__haswell__");
188 : 78 : break;
189 : 21 : case PROCESSOR_BONNELL:
190 : 21 : def_or_undef (parse_in, "__atom");
191 : 21 : def_or_undef (parse_in, "__atom__");
192 : 21 : def_or_undef (parse_in, "__bonnell");
193 : 21 : def_or_undef (parse_in, "__bonnell__");
194 : 21 : break;
195 : 8 : case PROCESSOR_SILVERMONT:
196 : 8 : def_or_undef (parse_in, "__slm");
197 : 8 : def_or_undef (parse_in, "__slm__");
198 : 8 : def_or_undef (parse_in, "__silvermont");
199 : 8 : def_or_undef (parse_in, "__silvermont__");
200 : 8 : break;
201 : 3 : case PROCESSOR_GOLDMONT:
202 : 3 : def_or_undef (parse_in, "__goldmont");
203 : 3 : def_or_undef (parse_in, "__goldmont__");
204 : 3 : break;
205 : 0 : case PROCESSOR_GOLDMONT_PLUS:
206 : 0 : def_or_undef (parse_in, "__goldmont_plus");
207 : 0 : def_or_undef (parse_in, "__goldmont_plus__");
208 : 0 : break;
209 : 0 : case PROCESSOR_TREMONT:
210 : 0 : def_or_undef (parse_in, "__tremont");
211 : 0 : def_or_undef (parse_in, "__tremont__");
212 : 0 : break;
213 : 0 : case PROCESSOR_SIERRAFOREST:
214 : 0 : def_or_undef (parse_in, "__sierraforest");
215 : 0 : def_or_undef (parse_in, "__sierraforest__");
216 : 0 : break;
217 : 0 : case PROCESSOR_GRANDRIDGE:
218 : 0 : def_or_undef (parse_in, "__grandridge");
219 : 0 : def_or_undef (parse_in, "__grandridge__");
220 : 0 : break;
221 : 0 : case PROCESSOR_CLEARWATERFOREST:
222 : 0 : def_or_undef (parse_in, "__clearwaterforest");
223 : 0 : def_or_undef (parse_in, "__clearwaterforest__");
224 : 0 : break;
225 : 3 : case PROCESSOR_KNL:
226 : 3 : def_or_undef (parse_in, "__knl");
227 : 3 : def_or_undef (parse_in, "__knl__");
228 : 3 : break;
229 : 0 : case PROCESSOR_KNM:
230 : 0 : def_or_undef (parse_in, "__knm");
231 : 0 : def_or_undef (parse_in, "__knm__");
232 : 0 : break;
233 : 60 : case PROCESSOR_SKYLAKE:
234 : 60 : def_or_undef (parse_in, "__skylake");
235 : 60 : def_or_undef (parse_in, "__skylake__");
236 : 60 : break;
237 : 169 : case PROCESSOR_SKYLAKE_AVX512:
238 : 169 : def_or_undef (parse_in, "__skylake_avx512");
239 : 169 : def_or_undef (parse_in, "__skylake_avx512__");
240 : 169 : break;
241 : 11 : case PROCESSOR_CANNONLAKE:
242 : 11 : def_or_undef (parse_in, "__cannonlake");
243 : 11 : def_or_undef (parse_in, "__cannonlake__");
244 : 11 : break;
245 : 0 : case PROCESSOR_ICELAKE_CLIENT:
246 : 0 : def_or_undef (parse_in, "__icelake_client");
247 : 0 : def_or_undef (parse_in, "__icelake_client__");
248 : 0 : break;
249 : 11 : case PROCESSOR_ICELAKE_SERVER:
250 : 11 : def_or_undef (parse_in, "__icelake_server");
251 : 11 : def_or_undef (parse_in, "__icelake_server__");
252 : 11 : break;
253 : 16 : case PROCESSOR_CASCADELAKE:
254 : 16 : def_or_undef (parse_in, "__cascadelake");
255 : 16 : def_or_undef (parse_in, "__cascadelake__");
256 : 16 : break;
257 : 7 : case PROCESSOR_TIGERLAKE:
258 : 7 : def_or_undef (parse_in, "__tigerlake");
259 : 7 : def_or_undef (parse_in, "__tigerlake__");
260 : 7 : break;
261 : 2 : case PROCESSOR_COOPERLAKE:
262 : 2 : def_or_undef (parse_in, "__cooperlake");
263 : 2 : def_or_undef (parse_in, "__cooperlake__");
264 : 2 : break;
265 : 30 : case PROCESSOR_SAPPHIRERAPIDS:
266 : 30 : def_or_undef (parse_in, "__sapphirerapids");
267 : 30 : def_or_undef (parse_in, "__sapphirerapids__");
268 : 30 : break;
269 : 0 : case PROCESSOR_GRANITERAPIDS:
270 : 0 : def_or_undef (parse_in, "__graniterapids");
271 : 0 : def_or_undef (parse_in, "__graniterapids__");
272 : 0 : break;
273 : 0 : case PROCESSOR_GRANITERAPIDS_D:
274 : 0 : def_or_undef (parse_in, "__graniterapids_d");
275 : 0 : def_or_undef (parse_in, "__graniterapids_d__");
276 : 0 : break;
277 : 7 : case PROCESSOR_ALDERLAKE:
278 : 7 : def_or_undef (parse_in, "__alderlake");
279 : 7 : def_or_undef (parse_in, "__alderlake__");
280 : 7 : break;
281 : 0 : case PROCESSOR_ROCKETLAKE:
282 : 0 : def_or_undef (parse_in, "__rocketlake");
283 : 0 : def_or_undef (parse_in, "__rocketlake__");
284 : 0 : break;
285 : 0 : case PROCESSOR_ARROWLAKE:
286 : 0 : def_or_undef (parse_in, "__arrowlake");
287 : 0 : def_or_undef (parse_in, "__arrowlake__");
288 : 0 : break;
289 : 0 : case PROCESSOR_ARROWLAKE_S:
290 : 0 : def_or_undef (parse_in, "__arrowlake_s");
291 : 0 : def_or_undef (parse_in, "__arrowlake_s__");
292 : 0 : break;
293 : 0 : case PROCESSOR_PANTHERLAKE:
294 : 0 : def_or_undef (parse_in, "__pantherlake");
295 : 0 : def_or_undef (parse_in, "__pantherlake__");
296 : 0 : break;
297 : :
298 : : /* use PROCESSOR_max to not set/unset the arch macro. */
299 : : case PROCESSOR_max:
300 : : break;
301 : 0 : case PROCESSOR_INTEL:
302 : 0 : case PROCESSOR_GENERIC:
303 : 0 : gcc_unreachable ();
304 : : }
305 : :
306 : : /* Built-ins based on -mtune=. */
307 : 2289718 : switch (tune)
308 : : {
309 : 0 : case PROCESSOR_I386:
310 : 0 : def_or_undef (parse_in, "__tune_i386__");
311 : 0 : break;
312 : 0 : case PROCESSOR_I486:
313 : 0 : def_or_undef (parse_in, "__tune_i486__");
314 : 0 : break;
315 : 0 : case PROCESSOR_PENTIUM:
316 : 0 : def_or_undef (parse_in, "__tune_i586__");
317 : 0 : def_or_undef (parse_in, "__tune_pentium__");
318 : 0 : if (last_tune_char == 'x')
319 : 0 : def_or_undef (parse_in, "__tune_pentium_mmx__");
320 : : break;
321 : 0 : case PROCESSOR_PENTIUMPRO:
322 : 0 : def_or_undef (parse_in, "__tune_i686__");
323 : 0 : def_or_undef (parse_in, "__tune_pentiumpro__");
324 : 0 : switch (last_tune_char)
325 : : {
326 : 0 : case '3':
327 : 0 : def_or_undef (parse_in, "__tune_pentium3__");
328 : : /* FALLTHRU */
329 : 0 : case '2':
330 : 0 : def_or_undef (parse_in, "__tune_pentium2__");
331 : 0 : break;
332 : : }
333 : : break;
334 : 0 : case PROCESSOR_GEODE:
335 : 0 : def_or_undef (parse_in, "__tune_geode__");
336 : 0 : break;
337 : 0 : case PROCESSOR_K6:
338 : 0 : def_or_undef (parse_in, "__tune_k6__");
339 : 0 : if (last_tune_char == '2')
340 : 0 : def_or_undef (parse_in, "__tune_k6_2__");
341 : 0 : else if (last_tune_char == '3')
342 : 0 : def_or_undef (parse_in, "__tune_k6_3__");
343 : 0 : else if (isa_flag & OPTION_MASK_ISA_3DNOW)
344 : 0 : def_or_undef (parse_in, "__tune_k6_3__");
345 : : break;
346 : 0 : case PROCESSOR_ATHLON:
347 : 0 : def_or_undef (parse_in, "__tune_athlon__");
348 : 0 : if (isa_flag & OPTION_MASK_ISA_SSE)
349 : 0 : def_or_undef (parse_in, "__tune_athlon_sse__");
350 : : break;
351 : 104 : case PROCESSOR_K8:
352 : 104 : def_or_undef (parse_in, "__tune_k8__");
353 : 104 : break;
354 : 53 : case PROCESSOR_AMDFAM10:
355 : 53 : def_or_undef (parse_in, "__tune_amdfam10__");
356 : 53 : break;
357 : 7 : case PROCESSOR_BDVER1:
358 : 7 : def_or_undef (parse_in, "__tune_bdver1__");
359 : 7 : break;
360 : 15 : case PROCESSOR_BDVER2:
361 : 15 : def_or_undef (parse_in, "__tune_bdver2__");
362 : 15 : break;
363 : 0 : case PROCESSOR_BDVER3:
364 : 0 : def_or_undef (parse_in, "__tune_bdver3__");
365 : 0 : break;
366 : 17 : case PROCESSOR_BDVER4:
367 : 17 : def_or_undef (parse_in, "__tune_bdver4__");
368 : 17 : break;
369 : 8 : case PROCESSOR_ZNVER1:
370 : 8 : def_or_undef (parse_in, "__tune_znver1__");
371 : 8 : break;
372 : 16 : case PROCESSOR_ZNVER2:
373 : 16 : def_or_undef (parse_in, "__tune_znver2__");
374 : 16 : break;
375 : 0 : case PROCESSOR_ZNVER3:
376 : 0 : def_or_undef (parse_in, "__tune_znver3__");
377 : 0 : break;
378 : 5 : case PROCESSOR_ZNVER4:
379 : 5 : def_or_undef (parse_in, "__tune_znver4__");
380 : 5 : break;
381 : 0 : case PROCESSOR_ZNVER5:
382 : 0 : def_or_undef (parse_in, "__tune_znver5__");
383 : 0 : break;
384 : 0 : case PROCESSOR_BTVER1:
385 : 0 : def_or_undef (parse_in, "__tune_btver1__");
386 : 0 : break;
387 : 4 : case PROCESSOR_BTVER2:
388 : 4 : def_or_undef (parse_in, "__tune_btver2__");
389 : 4 : break;
390 : 0 : case PROCESSOR_LUJIAZUI:
391 : 0 : def_or_undef (parse_in, "__tune_lujiazui__");
392 : 0 : break;
393 : 0 : case PROCESSOR_YONGFENG:
394 : 0 : def_or_undef (parse_in, "__tune_yongfeng__");
395 : 0 : break;
396 : 0 : case PROCESSOR_PENTIUM4:
397 : 0 : def_or_undef (parse_in, "__tune_pentium4__");
398 : 0 : break;
399 : 10 : case PROCESSOR_NOCONA:
400 : 10 : def_or_undef (parse_in, "__tune_nocona__");
401 : 10 : break;
402 : 61 : case PROCESSOR_CORE2:
403 : 61 : def_or_undef (parse_in, "__tune_core2__");
404 : 61 : break;
405 : 25 : case PROCESSOR_NEHALEM:
406 : 25 : def_or_undef (parse_in, "__tune_corei7__");
407 : 25 : def_or_undef (parse_in, "__tune_nehalem__");
408 : 25 : break;
409 : 17 : case PROCESSOR_SANDYBRIDGE:
410 : 17 : def_or_undef (parse_in, "__tune_corei7_avx__");
411 : 17 : def_or_undef (parse_in, "__tune_sandybridge__");
412 : 17 : break;
413 : 92 : case PROCESSOR_HASWELL:
414 : 92 : def_or_undef (parse_in, "__tune_core_avx2__");
415 : 92 : def_or_undef (parse_in, "__tune_haswell__");
416 : 92 : break;
417 : 39 : case PROCESSOR_BONNELL:
418 : 39 : def_or_undef (parse_in, "__tune_atom__");
419 : 39 : def_or_undef (parse_in, "__tune_bonnell__");
420 : 39 : break;
421 : 18 : case PROCESSOR_SILVERMONT:
422 : 18 : def_or_undef (parse_in, "__tune_slm__");
423 : 18 : def_or_undef (parse_in, "__tune_silvermont__");
424 : 18 : break;
425 : 11 : case PROCESSOR_GOLDMONT:
426 : 11 : def_or_undef (parse_in, "__tune_goldmont__");
427 : 11 : break;
428 : 0 : case PROCESSOR_GOLDMONT_PLUS:
429 : 0 : def_or_undef (parse_in, "__tune_goldmont_plus__");
430 : 0 : break;
431 : 0 : case PROCESSOR_TREMONT:
432 : 0 : def_or_undef (parse_in, "__tune_tremont__");
433 : 0 : break;
434 : 0 : case PROCESSOR_SIERRAFOREST:
435 : 0 : def_or_undef (parse_in, "__tune_sierraforest__");
436 : 0 : break;
437 : 0 : case PROCESSOR_GRANDRIDGE:
438 : 0 : def_or_undef (parse_in, "__tune_grandridge__");
439 : 0 : break;
440 : 0 : case PROCESSOR_CLEARWATERFOREST:
441 : 0 : def_or_undef (parse_in, "__tune_clearwaterforest__");
442 : 0 : break;
443 : 5 : case PROCESSOR_KNL:
444 : 5 : def_or_undef (parse_in, "__tune_knl__");
445 : 5 : break;
446 : 0 : case PROCESSOR_KNM:
447 : 0 : def_or_undef (parse_in, "__tune_knm__");
448 : 0 : break;
449 : 82 : case PROCESSOR_SKYLAKE:
450 : 82 : def_or_undef (parse_in, "__tune_skylake__");
451 : 82 : break;
452 : 192 : case PROCESSOR_SKYLAKE_AVX512:
453 : 192 : def_or_undef (parse_in, "__tune_skylake_avx512__");
454 : 192 : break;
455 : 11 : case PROCESSOR_CANNONLAKE:
456 : 11 : def_or_undef (parse_in, "__tune_cannonlake__");
457 : 11 : break;
458 : 0 : case PROCESSOR_ICELAKE_CLIENT:
459 : 0 : def_or_undef (parse_in, "__tune_icelake_client__");
460 : 0 : break;
461 : 21 : case PROCESSOR_ICELAKE_SERVER:
462 : 21 : def_or_undef (parse_in, "__tune_icelake_server__");
463 : 21 : break;
464 : 0 : case PROCESSOR_LAKEMONT:
465 : 0 : def_or_undef (parse_in, "__tune_lakemont__");
466 : 0 : break;
467 : 16 : case PROCESSOR_CASCADELAKE:
468 : 16 : def_or_undef (parse_in, "__tune_cascadelake__");
469 : 16 : break;
470 : 7 : case PROCESSOR_TIGERLAKE:
471 : 7 : def_or_undef (parse_in, "__tune_tigerlake__");
472 : 7 : break;
473 : 2 : case PROCESSOR_COOPERLAKE:
474 : 2 : def_or_undef (parse_in, "__tune_cooperlake__");
475 : 2 : break;
476 : 32 : case PROCESSOR_SAPPHIRERAPIDS:
477 : 32 : def_or_undef (parse_in, "__tune_sapphirerapids__");
478 : 32 : break;
479 : 7 : case PROCESSOR_ALDERLAKE:
480 : 7 : def_or_undef (parse_in, "__tune_alderlake__");
481 : 7 : break;
482 : 0 : case PROCESSOR_ROCKETLAKE:
483 : 0 : def_or_undef (parse_in, "__tune_rocketlake__");
484 : 0 : break;
485 : 0 : case PROCESSOR_GRANITERAPIDS:
486 : 0 : def_or_undef (parse_in, "__tune_graniterapids__");
487 : 0 : break;
488 : 0 : case PROCESSOR_GRANITERAPIDS_D:
489 : 0 : def_or_undef (parse_in, "__tune_graniterapids_d__");
490 : 0 : break;
491 : 0 : case PROCESSOR_ARROWLAKE:
492 : 0 : def_or_undef (parse_in, "__tune_arrowlake__");
493 : 0 : break;
494 : 0 : case PROCESSOR_ARROWLAKE_S:
495 : 0 : def_or_undef (parse_in, "__tune_arrowlake_s__");
496 : 0 : break;
497 : 0 : case PROCESSOR_PANTHERLAKE:
498 : 0 : def_or_undef (parse_in, "__tune_pantherlake__");
499 : 0 : break;
500 : : case PROCESSOR_INTEL:
501 : : case PROCESSOR_GENERIC:
502 : : break;
503 : : /* use PROCESSOR_max to not set/unset the tune macro. */
504 : : case PROCESSOR_max:
505 : : break;
506 : : }
507 : :
508 : 2289718 : switch (ix86_cmodel)
509 : : {
510 : 2245267 : case CM_SMALL:
511 : 2245267 : case CM_SMALL_PIC:
512 : 2245267 : def_or_undef (parse_in, "__code_model_small__");
513 : 2245267 : break;
514 : 839 : case CM_MEDIUM:
515 : 839 : case CM_MEDIUM_PIC:
516 : 839 : def_or_undef (parse_in, "__code_model_medium__");
517 : 839 : break;
518 : 469 : case CM_LARGE:
519 : 469 : case CM_LARGE_PIC:
520 : 469 : def_or_undef (parse_in, "__code_model_large__");
521 : 469 : break;
522 : 43142 : case CM_32:
523 : 43142 : def_or_undef (parse_in, "__code_model_32__");
524 : 43142 : break;
525 : 1 : case CM_KERNEL:
526 : 1 : def_or_undef (parse_in, "__code_model_kernel__");
527 : 1 : break;
528 : 2289718 : default:
529 : 2289718 : ;
530 : : }
531 : :
532 : 2289718 : if (isa_flag2 & OPTION_MASK_ISA2_WBNOINVD)
533 : 10116 : def_or_undef (parse_in, "__WBNOINVD__");
534 : 2289718 : if (isa_flag2 & OPTION_MASK_ISA2_AVX512VP2INTERSECT)
535 : 19971 : def_or_undef (parse_in, "__AVX512VP2INTERSECT__");
536 : 2289718 : if (isa_flag & OPTION_MASK_ISA_MMX)
537 : 215356 : def_or_undef (parse_in, "__MMX__");
538 : 2289718 : if (isa_flag & OPTION_MASK_ISA_3DNOW)
539 : 2769 : def_or_undef (parse_in, "__3dNOW__");
540 : 2289718 : if (isa_flag & OPTION_MASK_ISA_3DNOW_A)
541 : 1471 : def_or_undef (parse_in, "__3dNOW_A__");
542 : 2289718 : if (isa_flag & OPTION_MASK_ISA_SSE)
543 : 217244 : def_or_undef (parse_in, "__SSE__");
544 : 2289718 : if (isa_flag & OPTION_MASK_ISA_SSE2)
545 : 217140 : def_or_undef (parse_in, "__SSE2__");
546 : 2289718 : if (isa_flag & OPTION_MASK_ISA_SSE3)
547 : 84636 : def_or_undef (parse_in, "__SSE3__");
548 : 2289718 : if (isa_flag & OPTION_MASK_ISA_SSSE3)
549 : 82914 : def_or_undef (parse_in, "__SSSE3__");
550 : 2289718 : if (isa_flag & OPTION_MASK_ISA_SSE4_1)
551 : 82052 : def_or_undef (parse_in, "__SSE4_1__");
552 : 2289718 : if (isa_flag & OPTION_MASK_ISA_SSE4_2)
553 : 82451 : def_or_undef (parse_in, "__SSE4_2__");
554 : 2289718 : if (isa_flag & OPTION_MASK_ISA_AES)
555 : 10324 : def_or_undef (parse_in, "__AES__");
556 : 2289718 : if (isa_flag & OPTION_MASK_ISA_SHA)
557 : 10020 : def_or_undef (parse_in, "__SHA__");
558 : 2289718 : if (isa_flag & OPTION_MASK_ISA_PCLMUL)
559 : 30039 : def_or_undef (parse_in, "__PCLMUL__");
560 : 2289718 : if (isa_flag & OPTION_MASK_ISA_AVX)
561 : 81921 : def_or_undef (parse_in, "__AVX__");
562 : 2289718 : if (isa_flag & OPTION_MASK_ISA_AVX2)
563 : 136967 : def_or_undef (parse_in, "__AVX2__");
564 : 2289718 : if (isa_flag & OPTION_MASK_ISA_AVX512F)
565 : 166589 : def_or_undef (parse_in, "__AVX512F__");
566 : 2289718 : if (isa_flag & OPTION_MASK_ISA_AVX512ER)
567 : 11469 : def_or_undef (parse_in, "__AVX512ER__");
568 : 2289718 : if (isa_flag & OPTION_MASK_ISA_AVX512CD)
569 : 20170 : def_or_undef (parse_in, "__AVX512CD__");
570 : 2289718 : if (isa_flag & OPTION_MASK_ISA_AVX512PF)
571 : 11503 : def_or_undef (parse_in, "__AVX512PF__");
572 : 2289718 : if (isa_flag & OPTION_MASK_ISA_AVX512DQ)
573 : 47475 : def_or_undef (parse_in, "__AVX512DQ__");
574 : 2289718 : if (isa_flag & OPTION_MASK_ISA_AVX512BW)
575 : 134282 : def_or_undef (parse_in, "__AVX512BW__");
576 : 2289718 : if (isa_flag & OPTION_MASK_ISA_AVX512VL)
577 : : {
578 : 116712 : def_or_undef (parse_in, "__AVX512VL__");
579 : 116712 : def_or_undef (parse_in, "__EVEX256__");
580 : : }
581 : 2289718 : if (isa_flag & OPTION_MASK_ISA_AVX512VBMI)
582 : 20014 : def_or_undef (parse_in, "__AVX512VBMI__");
583 : 2289718 : if (isa_flag & OPTION_MASK_ISA_AVX512IFMA)
584 : 20007 : def_or_undef (parse_in, "__AVX512IFMA__");
585 : 2289718 : if (isa_flag2 & OPTION_MASK_ISA2_AVX5124VNNIW)
586 : 10910 : def_or_undef (parse_in, "__AVX5124VNNIW__");
587 : 2289718 : if (isa_flag & OPTION_MASK_ISA_AVX512VBMI2)
588 : 19962 : def_or_undef (parse_in, "__AVX512VBMI2__");
589 : 2289718 : if (isa_flag & OPTION_MASK_ISA_AVX512VNNI)
590 : 20049 : def_or_undef (parse_in, "__AVX512VNNI__");
591 : 2289718 : if (isa_flag2 & OPTION_MASK_ISA2_PCONFIG)
592 : 10104 : def_or_undef (parse_in, "__PCONFIG__");
593 : 2289718 : if (isa_flag2 & OPTION_MASK_ISA2_SGX)
594 : 10338 : def_or_undef (parse_in, "__SGX__");
595 : 2289718 : if (isa_flag2 & OPTION_MASK_ISA2_AVX5124FMAPS)
596 : 10983 : def_or_undef (parse_in, "__AVX5124FMAPS__");
597 : 2289718 : if (isa_flag & OPTION_MASK_ISA_AVX512BITALG)
598 : 19991 : def_or_undef (parse_in, "__AVX512BITALG__");
599 : 2289718 : if (isa_flag & OPTION_MASK_ISA_AVX512VPOPCNTDQ)
600 : 20006 : def_or_undef (parse_in, "__AVX512VPOPCNTDQ__");
601 : 2289718 : if (isa_flag & OPTION_MASK_ISA_FMA)
602 : 10623 : def_or_undef (parse_in, "__FMA__");
603 : 2289718 : if (isa_flag & OPTION_MASK_ISA_RTM)
604 : 19550 : def_or_undef (parse_in, "__RTM__");
605 : 2289718 : if (isa_flag & OPTION_MASK_ISA_SSE4A)
606 : 4026 : def_or_undef (parse_in, "__SSE4A__");
607 : 2289718 : if (isa_flag & OPTION_MASK_ISA_FMA4)
608 : 2721 : def_or_undef (parse_in, "__FMA4__");
609 : 2289718 : if (isa_flag & OPTION_MASK_ISA_XOP)
610 : 1478 : def_or_undef (parse_in, "__XOP__");
611 : 2289718 : if (isa_flag & OPTION_MASK_ISA_LWP)
612 : 10120 : def_or_undef (parse_in, "__LWP__");
613 : 2289718 : if (isa_flag & OPTION_MASK_ISA_ABM)
614 : 124 : def_or_undef (parse_in, "__ABM__");
615 : 2289718 : if (isa_flag & OPTION_MASK_ISA_BMI)
616 : 10470 : def_or_undef (parse_in, "__BMI__");
617 : 2289718 : if (isa_flag & OPTION_MASK_ISA_BMI2)
618 : 10477 : def_or_undef (parse_in, "__BMI2__");
619 : 2289718 : if (isa_flag & OPTION_MASK_ISA_LZCNT)
620 : 10508 : def_or_undef (parse_in, "__LZCNT__");
621 : 2289718 : if (isa_flag & OPTION_MASK_ISA_TBM)
622 : 10110 : def_or_undef (parse_in, "__TBM__");
623 : 2289718 : if (isa_flag & OPTION_MASK_ISA_CRC32)
624 : 76544 : def_or_undef (parse_in, "__CRC32__");
625 : 2289718 : if (isa_flag & OPTION_MASK_ISA_POPCNT)
626 : 74748 : def_or_undef (parse_in, "__POPCNT__");
627 : 2289718 : if (isa_flag & OPTION_MASK_ISA_FSGSBASE)
628 : 10246 : def_or_undef (parse_in, "__FSGSBASE__");
629 : 2289718 : if (isa_flag & OPTION_MASK_ISA_RDRND)
630 : 20201 : def_or_undef (parse_in, "__RDRND__");
631 : 2289718 : if (isa_flag & OPTION_MASK_ISA_F16C)
632 : 10525 : def_or_undef (parse_in, "__F16C__");
633 : 2289718 : if (isa_flag & OPTION_MASK_ISA_RDSEED)
634 : 10361 : def_or_undef (parse_in, "__RDSEED__");
635 : 2289718 : if (isa_flag & OPTION_MASK_ISA_PRFCHW)
636 : 451 : def_or_undef (parse_in, "__PRFCHW__");
637 : 2289718 : if (isa_flag & OPTION_MASK_ISA_ADX)
638 : 372 : def_or_undef (parse_in, "__ADX__");
639 : 2289718 : if (isa_flag & OPTION_MASK_ISA_FXSR)
640 : 206879 : def_or_undef (parse_in, "__FXSR__");
641 : 2289718 : if (isa_flag & OPTION_MASK_ISA_XSAVE)
642 : 77170 : def_or_undef (parse_in, "__XSAVE__");
643 : 2289718 : if (isa_flag & OPTION_MASK_ISA_XSAVEOPT)
644 : 10436 : def_or_undef (parse_in, "__XSAVEOPT__");
645 : 2289718 : if (isa_flag & OPTION_MASK_ISA_PREFETCHWT1)
646 : 19 : def_or_undef (parse_in, "__PREFETCHWT1__");
647 : 2289718 : if ((fpmath & FPMATH_SSE) && (isa_flag & OPTION_MASK_ISA_SSE))
648 : 211896 : def_or_undef (parse_in, "__SSE_MATH__");
649 : 1482174 : if ((fpmath & FPMATH_SSE) && (isa_flag & OPTION_MASK_ISA_SSE2))
650 : 211792 : def_or_undef (parse_in, "__SSE2_MATH__");
651 : 2289718 : if (isa_flag & OPTION_MASK_ISA_CLFLUSHOPT)
652 : 10365 : def_or_undef (parse_in, "__CLFLUSHOPT__");
653 : 2289718 : if (isa_flag2 & OPTION_MASK_ISA2_CLZERO)
654 : 10106 : def_or_undef (parse_in, "__CLZERO__");
655 : 2289718 : if (isa_flag & OPTION_MASK_ISA_XSAVEC)
656 : 10364 : def_or_undef (parse_in, "__XSAVEC__");
657 : 2289718 : if (isa_flag & OPTION_MASK_ISA_XSAVES)
658 : 10364 : def_or_undef (parse_in, "__XSAVES__");
659 : 2289718 : if (isa_flag & OPTION_MASK_ISA_CLWB)
660 : 10298 : def_or_undef (parse_in, "__CLWB__");
661 : 2289718 : if (isa_flag2 & OPTION_MASK_ISA2_MWAITX)
662 : 10122 : def_or_undef (parse_in, "__MWAITX__");
663 : 2289718 : if (isa_flag & OPTION_MASK_ISA_PKU)
664 : 10284 : def_or_undef (parse_in, "__PKU__");
665 : 2289718 : if (isa_flag2 & OPTION_MASK_ISA2_RDPID)
666 : 10129 : def_or_undef (parse_in, "__RDPID__");
667 : 2289718 : if (isa_flag & OPTION_MASK_ISA_GFNI)
668 : 59514 : def_or_undef (parse_in, "__GFNI__");
669 : 2289718 : if ((isa_flag & OPTION_MASK_ISA_SHSTK))
670 : 28140 : def_or_undef (parse_in, "__SHSTK__");
671 : 2289718 : if (isa_flag2 & OPTION_MASK_ISA2_VAES)
672 : 20036 : def_or_undef (parse_in, "__VAES__");
673 : 2289718 : if (isa_flag & OPTION_MASK_ISA_VPCLMULQDQ)
674 : 20029 : def_or_undef (parse_in, "__VPCLMULQDQ__");
675 : 2289718 : if (isa_flag & OPTION_MASK_ISA_MOVDIRI)
676 : 10137 : def_or_undef (parse_in, "__MOVDIRI__");
677 : 2289718 : if (isa_flag2 & OPTION_MASK_ISA2_MOVDIR64B)
678 : 10143 : def_or_undef (parse_in, "__MOVDIR64B__");
679 : 2289718 : if (isa_flag2 & OPTION_MASK_ISA2_WAITPKG)
680 : 10129 : def_or_undef (parse_in, "__WAITPKG__");
681 : 2289718 : if (isa_flag2 & OPTION_MASK_ISA2_CLDEMOTE)
682 : 10130 : def_or_undef (parse_in, "__CLDEMOTE__");
683 : 2289718 : if (isa_flag2 & OPTION_MASK_ISA2_SERIALIZE)
684 : 10094 : def_or_undef (parse_in, "__SERIALIZE__");
685 : 2289718 : if (isa_flag2 & OPTION_MASK_ISA2_PTWRITE)
686 : 10132 : def_or_undef (parse_in, "__PTWRITE__");
687 : 2289718 : if (isa_flag2 & OPTION_MASK_ISA2_AVX512BF16)
688 : 29881 : def_or_undef (parse_in, "__AVX512BF16__");
689 : 2289718 : if (isa_flag2 & OPTION_MASK_ISA2_AVX512FP16)
690 : 28733 : def_or_undef (parse_in, "__AVX512FP16__");
691 : 2289718 : if (TARGET_MMX_WITH_SSE)
692 : 1468678 : def_or_undef (parse_in, "__MMX_WITH_SSE__");
693 : 2289718 : if (isa_flag2 & OPTION_MASK_ISA2_ENQCMD)
694 : 10091 : def_or_undef (parse_in, "__ENQCMD__");
695 : 2289718 : if (isa_flag2 & OPTION_MASK_ISA2_TSXLDTRK)
696 : 10089 : def_or_undef (parse_in, "__TSXLDTRK__");
697 : 2289718 : if (isa_flag2 & OPTION_MASK_ISA2_AMX_TILE)
698 : 39649 : def_or_undef (parse_in, "__AMX_TILE__");
699 : 2289718 : if (isa_flag2 & OPTION_MASK_ISA2_AMX_INT8)
700 : 9977 : def_or_undef (parse_in, "__AMX_INT8__");
701 : 2289718 : if (isa_flag2 & OPTION_MASK_ISA2_AMX_BF16)
702 : 9980 : def_or_undef (parse_in, "__AMX_BF16__");
703 : 2289718 : if (isa_flag & OPTION_MASK_ISA_SAHF)
704 : 5674 : def_or_undef (parse_in, "__LAHF_SAHF__");
705 : 2289718 : if (isa_flag2 & OPTION_MASK_ISA2_MOVBE)
706 : 486 : def_or_undef (parse_in, "__MOVBE__");
707 : 2289718 : if (isa_flag2 & OPTION_MASK_ISA2_UINTR)
708 : 9911 : def_or_undef (parse_in, "__UINTR__");
709 : 2289718 : if (isa_flag2 & OPTION_MASK_ISA2_HRESET)
710 : 10116 : def_or_undef (parse_in, "__HRESET__");
711 : 2289718 : if (isa_flag2 & OPTION_MASK_ISA2_KL)
712 : 19975 : def_or_undef (parse_in, "__KL__");
713 : 2289718 : if (isa_flag2 & OPTION_MASK_ISA2_WIDEKL)
714 : 10035 : def_or_undef (parse_in, "__WIDEKL__");
715 : 2289718 : if (isa_flag2 & OPTION_MASK_ISA2_AVXVNNI)
716 : 10073 : def_or_undef (parse_in, "__AVXVNNI__");
717 : 2289718 : if (isa_flag2 & OPTION_MASK_ISA2_AVXIFMA)
718 : 10026 : def_or_undef (parse_in, "__AVXIFMA__");
719 : 2289718 : if (isa_flag2 & OPTION_MASK_ISA2_AVXVNNIINT8)
720 : 10030 : def_or_undef (parse_in, "__AVXVNNIINT8__");
721 : 2289718 : if (isa_flag2 & OPTION_MASK_ISA2_AVXNECONVERT)
722 : 10030 : def_or_undef (parse_in, "__AVXNECONVERT__");
723 : 2289718 : if (isa_flag2 & OPTION_MASK_ISA2_CMPCCXADD)
724 : 9906 : def_or_undef (parse_in, "__CMPCCXADD__");
725 : 2289718 : if (isa_flag2 & OPTION_MASK_ISA2_AMX_FP16)
726 : 20 : def_or_undef (parse_in, "__AMX_FP16__");
727 : 2289718 : if (isa_flag2 & OPTION_MASK_ISA2_PREFETCHI)
728 : 9907 : def_or_undef (parse_in, "__PREFETCHI__");
729 : 2289718 : if (isa_flag2 & OPTION_MASK_ISA2_RAOINT)
730 : 10077 : def_or_undef (parse_in, "__RAOINT__");
731 : 2289718 : if (isa_flag2 & OPTION_MASK_ISA2_AMX_COMPLEX)
732 : 9968 : def_or_undef (parse_in, "__AMX_COMPLEX__");
733 : 2289718 : if (isa_flag2 & OPTION_MASK_ISA2_AVXVNNIINT16)
734 : 10030 : def_or_undef (parse_in, "__AVXVNNIINT16__");
735 : 2289718 : if (isa_flag2 & OPTION_MASK_ISA2_SM3)
736 : 10023 : def_or_undef (parse_in, "__SM3__");
737 : 2289718 : if (isa_flag2 & OPTION_MASK_ISA2_SHA512)
738 : 10023 : def_or_undef (parse_in, "__SHA512__");
739 : 2289718 : if (isa_flag2 & OPTION_MASK_ISA2_SM4)
740 : 10022 : def_or_undef (parse_in, "__SM4__");
741 : 2289718 : if (isa_flag2 & OPTION_MASK_ISA2_EVEX512)
742 : 203766 : def_or_undef (parse_in, "__EVEX512__");
743 : 2289718 : if (isa_flag2 & OPTION_MASK_ISA2_USER_MSR)
744 : 9934 : def_or_undef (parse_in, "__USER_MSR__");
745 : 2289718 : if (isa_flag2 & OPTION_MASK_ISA2_AVX10_1_256)
746 : : {
747 : 27 : def_or_undef (parse_in, "__AVX10_1_256__");
748 : 27 : def_or_undef (parse_in, "__AVX10_1__");
749 : : }
750 : 2289718 : if (isa_flag2 & OPTION_MASK_ISA2_AVX10_1_512)
751 : 10 : def_or_undef (parse_in, "__AVX10_1_512__");
752 : 2289718 : if (TARGET_IAMCU)
753 : : {
754 : 0 : def_or_undef (parse_in, "__iamcu");
755 : 0 : def_or_undef (parse_in, "__iamcu__");
756 : : }
757 : 2289718 : }
758 : :
759 : :
760 : : /* Hook to validate the current #pragma GCC target and set the state, and
761 : : update the macros based on what was changed. If ARGS is NULL, then
762 : : POP_TARGET is used to reset the options. */
763 : :
764 : : static bool
765 : 1041689 : ix86_pragma_target_parse (tree args, tree pop_target)
766 : : {
767 : 1041689 : tree prev_tree
768 : 1041689 : = build_target_option_node (&global_options, &global_options_set);
769 : 1041689 : tree cur_tree;
770 : 1041689 : struct cl_target_option *prev_opt;
771 : 1041689 : struct cl_target_option *cur_opt;
772 : 1041689 : HOST_WIDE_INT prev_isa;
773 : 1041689 : HOST_WIDE_INT cur_isa;
774 : 1041689 : HOST_WIDE_INT diff_isa;
775 : 1041689 : HOST_WIDE_INT prev_isa2;
776 : 1041689 : HOST_WIDE_INT cur_isa2;
777 : 1041689 : HOST_WIDE_INT diff_isa2;
778 : 1041689 : enum processor_type prev_arch;
779 : 1041689 : enum processor_type prev_tune;
780 : 1041689 : enum processor_type cur_arch;
781 : 1041689 : enum processor_type cur_tune;
782 : :
783 : 1041689 : if (! args)
784 : : {
785 : 518435 : cur_tree = (pop_target ? pop_target : target_option_default_node);
786 : 518435 : cl_target_option_restore (&global_options, &global_options_set,
787 : 518435 : TREE_TARGET_OPTION (cur_tree));
788 : : }
789 : : else
790 : : {
791 : 523254 : cur_tree = ix86_valid_target_attribute_tree (NULL_TREE, args,
792 : : &global_options,
793 : : &global_options_set, 0);
794 : 523254 : if (!cur_tree || cur_tree == error_mark_node)
795 : : {
796 : 269 : cl_target_option_restore (&global_options, &global_options_set,
797 : 269 : TREE_TARGET_OPTION (prev_tree));
798 : 269 : return false;
799 : : }
800 : : }
801 : :
802 : 1041420 : target_option_current_node = cur_tree;
803 : 1041420 : ix86_reset_previous_fndecl ();
804 : :
805 : : /* Figure out the previous/current isa, arch, tune and the differences. */
806 : 1041420 : prev_opt = TREE_TARGET_OPTION (prev_tree);
807 : 1041420 : cur_opt = TREE_TARGET_OPTION (cur_tree);
808 : 1041420 : prev_isa = prev_opt->x_ix86_isa_flags;
809 : 1041420 : cur_isa = cur_opt->x_ix86_isa_flags;
810 : 1041420 : diff_isa = (prev_isa ^ cur_isa);
811 : 1041420 : prev_isa2 = prev_opt->x_ix86_isa_flags2;
812 : 1041420 : cur_isa2 = cur_opt->x_ix86_isa_flags2;
813 : 1041420 : diff_isa2 = (prev_isa2 ^ cur_isa2);
814 : 1041420 : prev_arch = (enum processor_type) prev_opt->arch;
815 : 1041420 : prev_tune = (enum processor_type) prev_opt->tune;
816 : 1041420 : cur_arch = (enum processor_type) cur_opt->arch;
817 : 1041420 : cur_tune = (enum processor_type) cur_opt->tune;
818 : :
819 : : /* If the same processor is used for both previous and current options, don't
820 : : change the macros. */
821 : 1041420 : if (cur_arch == prev_arch)
822 : 1041419 : cur_arch = prev_arch = PROCESSOR_max;
823 : :
824 : 1041420 : if (cur_tune == prev_tune)
825 : 1041419 : cur_tune = prev_tune = PROCESSOR_max;
826 : :
827 : : /* Undef all of the macros for that are no longer current. */
828 : 1041420 : cpp_force_token_locations (parse_in, BUILTINS_LOCATION);
829 : 1041420 : ix86_target_macros_internal (prev_isa & diff_isa,
830 : : prev_isa2 & diff_isa2,
831 : : prev_arch,
832 : : prev_tune,
833 : 1041420 : (enum fpmath_unit) prev_opt->x_ix86_fpmath,
834 : : cpp_undef);
835 : 1041420 : cpp_stop_forcing_token_locations (parse_in);
836 : :
837 : : /* For the definitions, ensure all newly defined macros are considered
838 : : as used for -Wunused-macros. There is no point warning about the
839 : : compiler predefined macros. */
840 : 1041420 : cpp_options *cpp_opts = cpp_get_options (parse_in);
841 : 1041420 : unsigned char saved_warn_unused_macros = cpp_opts->warn_unused_macros;
842 : 1041420 : cpp_opts->warn_unused_macros = 0;
843 : :
844 : : /* Define all of the macros for new options that were just turned on. */
845 : 1041420 : cpp_force_token_locations (parse_in, BUILTINS_LOCATION);
846 : 1041420 : ix86_target_macros_internal (cur_isa & diff_isa,
847 : : cur_isa2 & diff_isa2,
848 : : cur_arch,
849 : : cur_tune,
850 : 1041420 : (enum fpmath_unit) cur_opt->x_ix86_fpmath,
851 : : cpp_define);
852 : 1041420 : cpp_stop_forcing_token_locations (parse_in);
853 : :
854 : 1041420 : cpp_opts->warn_unused_macros = saved_warn_unused_macros;
855 : :
856 : 1041420 : return true;
857 : : }
858 : :
859 : : /* Function to tell the preprocessor about the defines for the current target. */
860 : :
861 : : void
862 : 206878 : ix86_target_macros (void)
863 : : {
864 : : /* 32/64-bit won't change with target specific options, so do the assert and
865 : : builtin_define_std calls here. */
866 : 206878 : if (TARGET_64BIT)
867 : : {
868 : 201788 : cpp_assert (parse_in, "cpu=x86_64");
869 : 201788 : cpp_assert (parse_in, "machine=x86_64");
870 : 201788 : cpp_define (parse_in, "__amd64");
871 : 201788 : cpp_define (parse_in, "__amd64__");
872 : 201788 : cpp_define (parse_in, "__x86_64");
873 : 201788 : cpp_define (parse_in, "__x86_64__");
874 : 201788 : if (TARGET_X32)
875 : : {
876 : 82 : cpp_define (parse_in, "_ILP32");
877 : 82 : cpp_define (parse_in, "__ILP32__");
878 : : }
879 : : }
880 : : else
881 : : {
882 : 5090 : cpp_assert (parse_in, "cpu=i386");
883 : 5090 : cpp_assert (parse_in, "machine=i386");
884 : 5090 : builtin_define_std ("i386");
885 : 5090 : cpp_define (parse_in, "_ILP32");
886 : 5090 : cpp_define (parse_in, "__ILP32__");
887 : : }
888 : :
889 : 206878 : if (!TARGET_80387)
890 : 206 : cpp_define (parse_in, "_SOFT_FLOAT");
891 : :
892 : : /* HFmode/BFmode is supported without depending any isa
893 : : in scalar_mode_supported_p and libgcc_floating_mode_supported_p,
894 : : but according to psABI, they're really supported w/ SSE2 and above.
895 : : Since libstdc++ uses __STDCPP_FLOAT16_T__ and __STDCPP_BFLOAT16_T__
896 : : for backend support of the types, undef the macros to avoid
897 : : build failure, see PR109504. */
898 : 206878 : if (!TARGET_SSE2)
899 : : {
900 : 379 : if (c_dialect_cxx () && cxx_dialect > cxx20)
901 : : {
902 : 0 : cpp_undef (parse_in, "__STDCPP_FLOAT16_T__");
903 : 0 : cpp_undef (parse_in, "__STDCPP_BFLOAT16_T__");
904 : : }
905 : : }
906 : :
907 : 206878 : if (TARGET_LONG_DOUBLE_64)
908 : 16 : cpp_define (parse_in, "__LONG_DOUBLE_64__");
909 : :
910 : 206878 : if (TARGET_LONG_DOUBLE_128)
911 : 6 : cpp_define (parse_in, "__LONG_DOUBLE_128__");
912 : :
913 : 206878 : cpp_define_formatted (parse_in, "__SIZEOF_FLOAT80__=%d",
914 : 206878 : GET_MODE_SIZE (XFmode));
915 : :
916 : 206878 : cpp_define (parse_in, "__SIZEOF_FLOAT128__=16");
917 : :
918 : 206878 : cpp_define_formatted (parse_in, "__ATOMIC_HLE_ACQUIRE=%d", IX86_HLE_ACQUIRE);
919 : 206878 : cpp_define_formatted (parse_in, "__ATOMIC_HLE_RELEASE=%d", IX86_HLE_RELEASE);
920 : :
921 : 206878 : cpp_define (parse_in, "__GCC_ASM_FLAG_OUTPUTS__");
922 : :
923 : 206878 : ix86_target_macros_internal (ix86_isa_flags,
924 : : ix86_isa_flags2,
925 : : ix86_arch,
926 : : ix86_tune,
927 : : ix86_fpmath,
928 : : cpp_define);
929 : :
930 : 206878 : cpp_define (parse_in, "__SEG_FS");
931 : 206878 : cpp_define (parse_in, "__SEG_GS");
932 : :
933 : 206878 : if (flag_cf_protection != CF_NONE)
934 : 18695 : cpp_define_formatted (parse_in, "__CET__=%d", flag_cf_protection & ~CF_SET);
935 : 206878 : }
936 : :
937 : :
938 : : /* Register target pragmas. We need to add the hook for parsing #pragma GCC
939 : : option here rather than in i386.cc since it will pull in various preprocessor
940 : : functions, and those are not present in languages like fortran without a
941 : : preprocessor. */
942 : :
943 : : void
944 : 207404 : ix86_register_pragmas (void)
945 : : {
946 : : /* Update pragma hook to allow parsing #pragma GCC target. */
947 : 207404 : targetm.target_option.pragma_parse = ix86_pragma_target_parse;
948 : :
949 : 207404 : c_register_addr_space ("__seg_fs", ADDR_SPACE_SEG_FS);
950 : 207404 : c_register_addr_space ("__seg_gs", ADDR_SPACE_SEG_GS);
951 : :
952 : : #ifdef REGISTER_SUBTARGET_PRAGMAS
953 : : REGISTER_SUBTARGET_PRAGMAS ();
954 : : #endif
955 : 207404 : }
|