xref: /dflybsd-src/contrib/gcc-4.7/gcc/config/i386/i386-c.c (revision 81fc95a5293ee307c688a350a3feb4734aaddbb4)
1e4b17023SJohn Marino /* Subroutines used for macro/preprocessor support on the ia-32.
2e4b17023SJohn Marino    Copyright (C) 2008, 2009, 2010
3e4b17023SJohn Marino    Free Software Foundation, Inc.
4e4b17023SJohn Marino 
5e4b17023SJohn Marino This file is part of GCC.
6e4b17023SJohn Marino 
7e4b17023SJohn Marino GCC is free software; you can redistribute it and/or modify
8e4b17023SJohn Marino it under the terms of the GNU General Public License as published by
9e4b17023SJohn Marino the Free Software Foundation; either version 3, or (at your option)
10e4b17023SJohn Marino any later version.
11e4b17023SJohn Marino 
12e4b17023SJohn Marino GCC is distributed in the hope that it will be useful,
13e4b17023SJohn Marino but WITHOUT ANY WARRANTY; without even the implied warranty of
14e4b17023SJohn Marino MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15e4b17023SJohn Marino GNU General Public License for more details.
16e4b17023SJohn Marino 
17e4b17023SJohn Marino You should have received a copy of the GNU General Public License
18e4b17023SJohn Marino along with GCC; see the file COPYING3.  If not see
19e4b17023SJohn Marino <http://www.gnu.org/licenses/>.  */
20e4b17023SJohn Marino 
21e4b17023SJohn Marino #include "config.h"
22e4b17023SJohn Marino #include "system.h"
23e4b17023SJohn Marino #include "coretypes.h"
24e4b17023SJohn Marino #include "tm.h"
25e4b17023SJohn Marino #include "tree.h"
26e4b17023SJohn Marino #include "tm_p.h"
27e4b17023SJohn Marino #include "flags.h"
28e4b17023SJohn Marino #include "c-family/c-common.h"
29e4b17023SJohn Marino #include "ggc.h"
30e4b17023SJohn Marino #include "target.h"
31e4b17023SJohn Marino #include "target-def.h"
32e4b17023SJohn Marino #include "cpplib.h"
33e4b17023SJohn Marino #include "c-family/c-pragma.h"
34e4b17023SJohn Marino 
35e4b17023SJohn Marino static bool ix86_pragma_target_parse (tree, tree);
36e4b17023SJohn Marino static void ix86_target_macros_internal
37e4b17023SJohn Marino   (HOST_WIDE_INT, enum processor_type, enum processor_type, enum fpmath_unit,
38e4b17023SJohn Marino    void (*def_or_undef) (cpp_reader *, const char *));
39e4b17023SJohn Marino 
40e4b17023SJohn Marino 
41e4b17023SJohn Marino /* Internal function to either define or undef the appropriate system
42e4b17023SJohn Marino    macros.  */
43e4b17023SJohn Marino static void
ix86_target_macros_internal(HOST_WIDE_INT isa_flag,enum processor_type arch,enum processor_type tune,enum fpmath_unit fpmath,void (* def_or_undef)(cpp_reader *,const char *))44e4b17023SJohn Marino ix86_target_macros_internal (HOST_WIDE_INT isa_flag,
45e4b17023SJohn Marino 			     enum processor_type arch,
46e4b17023SJohn Marino 			     enum processor_type tune,
47e4b17023SJohn Marino 			     enum fpmath_unit fpmath,
48e4b17023SJohn Marino 			     void (*def_or_undef) (cpp_reader *,
49e4b17023SJohn Marino 						   const char *))
50e4b17023SJohn Marino {
51e4b17023SJohn Marino   /* For some of the k6/pentium varients there weren't seperate ISA bits to
52e4b17023SJohn Marino      identify which tune/arch flag was passed, so figure it out here.  */
53e4b17023SJohn Marino   size_t arch_len = strlen (ix86_arch_string);
54e4b17023SJohn Marino   size_t tune_len = strlen (ix86_tune_string);
55e4b17023SJohn Marino   int last_arch_char = ix86_arch_string[arch_len - 1];
56e4b17023SJohn Marino   int last_tune_char = ix86_tune_string[tune_len - 1];
57e4b17023SJohn Marino 
58e4b17023SJohn Marino   /* Built-ins based on -march=.  */
59e4b17023SJohn Marino   switch (arch)
60e4b17023SJohn Marino     {
61e4b17023SJohn Marino     case PROCESSOR_I386:
62e4b17023SJohn Marino       break;
63e4b17023SJohn Marino     case PROCESSOR_I486:
64e4b17023SJohn Marino       def_or_undef (parse_in, "__i486");
65e4b17023SJohn Marino       def_or_undef (parse_in, "__i486__");
66e4b17023SJohn Marino       break;
67e4b17023SJohn Marino     case PROCESSOR_PENTIUM:
68e4b17023SJohn Marino       def_or_undef (parse_in, "__i586");
69e4b17023SJohn Marino       def_or_undef (parse_in, "__i586__");
70e4b17023SJohn Marino       def_or_undef (parse_in, "__pentium");
71e4b17023SJohn Marino       def_or_undef (parse_in, "__pentium__");
72e4b17023SJohn Marino       if (isa_flag & OPTION_MASK_ISA_MMX)
73e4b17023SJohn Marino 	def_or_undef (parse_in, "__pentium_mmx__");
74e4b17023SJohn Marino       break;
75e4b17023SJohn Marino     case PROCESSOR_PENTIUMPRO:
76e4b17023SJohn Marino       def_or_undef (parse_in, "__i686");
77e4b17023SJohn Marino       def_or_undef (parse_in, "__i686__");
78e4b17023SJohn Marino       def_or_undef (parse_in, "__pentiumpro");
79e4b17023SJohn Marino       def_or_undef (parse_in, "__pentiumpro__");
80e4b17023SJohn Marino       break;
81e4b17023SJohn Marino     case PROCESSOR_GEODE:
82e4b17023SJohn Marino       def_or_undef (parse_in, "__geode");
83e4b17023SJohn Marino       def_or_undef (parse_in, "__geode__");
84e4b17023SJohn Marino       break;
85e4b17023SJohn Marino     case PROCESSOR_K6:
86e4b17023SJohn Marino       def_or_undef (parse_in, "__k6");
87e4b17023SJohn Marino       def_or_undef (parse_in, "__k6__");
88e4b17023SJohn Marino       if (last_arch_char == '2')
89e4b17023SJohn Marino 	def_or_undef (parse_in, "__k6_2__");
90e4b17023SJohn Marino       else if (last_arch_char == '3')
91e4b17023SJohn Marino 	def_or_undef (parse_in, "__k6_3__");
92e4b17023SJohn Marino       else if (isa_flag & OPTION_MASK_ISA_3DNOW)
93e4b17023SJohn Marino 	def_or_undef (parse_in, "__k6_3__");
94e4b17023SJohn Marino       break;
95e4b17023SJohn Marino     case PROCESSOR_ATHLON:
96e4b17023SJohn Marino       def_or_undef (parse_in, "__athlon");
97e4b17023SJohn Marino       def_or_undef (parse_in, "__athlon__");
98e4b17023SJohn Marino       if (isa_flag & OPTION_MASK_ISA_SSE)
99e4b17023SJohn Marino 	def_or_undef (parse_in, "__athlon_sse__");
100e4b17023SJohn Marino       break;
101e4b17023SJohn Marino     case PROCESSOR_K8:
102e4b17023SJohn Marino       def_or_undef (parse_in, "__k8");
103e4b17023SJohn Marino       def_or_undef (parse_in, "__k8__");
104e4b17023SJohn Marino       break;
105e4b17023SJohn Marino     case PROCESSOR_AMDFAM10:
106e4b17023SJohn Marino       def_or_undef (parse_in, "__amdfam10");
107e4b17023SJohn Marino       def_or_undef (parse_in, "__amdfam10__");
108e4b17023SJohn Marino       break;
109e4b17023SJohn Marino     case PROCESSOR_BDVER1:
110e4b17023SJohn Marino       def_or_undef (parse_in, "__bdver1");
111e4b17023SJohn Marino       def_or_undef (parse_in, "__bdver1__");
112e4b17023SJohn Marino       break;
113e4b17023SJohn Marino     case PROCESSOR_BDVER2:
114e4b17023SJohn Marino       def_or_undef (parse_in, "__bdver2");
115e4b17023SJohn Marino       def_or_undef (parse_in, "__bdver2__");
116e4b17023SJohn Marino       break;
117e4b17023SJohn Marino     case PROCESSOR_BTVER1:
118e4b17023SJohn Marino       def_or_undef (parse_in, "__btver1");
119e4b17023SJohn Marino       def_or_undef (parse_in, "__btver1__");
120e4b17023SJohn Marino       break;
121e4b17023SJohn Marino     case PROCESSOR_PENTIUM4:
122e4b17023SJohn Marino       def_or_undef (parse_in, "__pentium4");
123e4b17023SJohn Marino       def_or_undef (parse_in, "__pentium4__");
124e4b17023SJohn Marino       break;
125e4b17023SJohn Marino     case PROCESSOR_NOCONA:
126e4b17023SJohn Marino       def_or_undef (parse_in, "__nocona");
127e4b17023SJohn Marino       def_or_undef (parse_in, "__nocona__");
128e4b17023SJohn Marino       break;
129e4b17023SJohn Marino     case PROCESSOR_CORE2_32:
130e4b17023SJohn Marino     case PROCESSOR_CORE2_64:
131e4b17023SJohn Marino       def_or_undef (parse_in, "__core2");
132e4b17023SJohn Marino       def_or_undef (parse_in, "__core2__");
133e4b17023SJohn Marino       break;
134e4b17023SJohn Marino     case PROCESSOR_COREI7_32:
135e4b17023SJohn Marino     case PROCESSOR_COREI7_64:
136e4b17023SJohn Marino       def_or_undef (parse_in, "__corei7");
137e4b17023SJohn Marino       def_or_undef (parse_in, "__corei7__");
138e4b17023SJohn Marino       break;
139e4b17023SJohn Marino     case PROCESSOR_ATOM:
140e4b17023SJohn Marino       def_or_undef (parse_in, "__atom");
141e4b17023SJohn Marino       def_or_undef (parse_in, "__atom__");
142e4b17023SJohn Marino       break;
143e4b17023SJohn Marino     /* use PROCESSOR_max to not set/unset the arch macro.  */
144e4b17023SJohn Marino     case PROCESSOR_max:
145e4b17023SJohn Marino       break;
146e4b17023SJohn Marino     case PROCESSOR_GENERIC32:
147e4b17023SJohn Marino     case PROCESSOR_GENERIC64:
148e4b17023SJohn Marino       gcc_unreachable ();
149e4b17023SJohn Marino     }
150e4b17023SJohn Marino 
151e4b17023SJohn Marino   /* Built-ins based on -mtune=.  */
152e4b17023SJohn Marino   switch (tune)
153e4b17023SJohn Marino     {
154e4b17023SJohn Marino     case PROCESSOR_I386:
155e4b17023SJohn Marino       def_or_undef (parse_in, "__tune_i386__");
156e4b17023SJohn Marino       break;
157e4b17023SJohn Marino     case PROCESSOR_I486:
158e4b17023SJohn Marino       def_or_undef (parse_in, "__tune_i486__");
159e4b17023SJohn Marino       break;
160e4b17023SJohn Marino     case PROCESSOR_PENTIUM:
161e4b17023SJohn Marino       def_or_undef (parse_in, "__tune_i586__");
162e4b17023SJohn Marino       def_or_undef (parse_in, "__tune_pentium__");
163e4b17023SJohn Marino       if (last_tune_char == 'x')
164e4b17023SJohn Marino 	def_or_undef (parse_in, "__tune_pentium_mmx__");
165e4b17023SJohn Marino       break;
166e4b17023SJohn Marino     case PROCESSOR_PENTIUMPRO:
167e4b17023SJohn Marino       def_or_undef (parse_in, "__tune_i686__");
168e4b17023SJohn Marino       def_or_undef (parse_in, "__tune_pentiumpro__");
169e4b17023SJohn Marino       switch (last_tune_char)
170e4b17023SJohn Marino 	{
171e4b17023SJohn Marino 	case '3':
172e4b17023SJohn Marino 	  def_or_undef (parse_in, "__tune_pentium3__");
173e4b17023SJohn Marino 	  /* FALLTHRU */
174e4b17023SJohn Marino 	case '2':
175e4b17023SJohn Marino 	  def_or_undef (parse_in, "__tune_pentium2__");
176e4b17023SJohn Marino 	  break;
177e4b17023SJohn Marino 	}
178e4b17023SJohn Marino       break;
179e4b17023SJohn Marino     case PROCESSOR_GEODE:
180e4b17023SJohn Marino       def_or_undef (parse_in, "__tune_geode__");
181e4b17023SJohn Marino       break;
182e4b17023SJohn Marino     case PROCESSOR_K6:
183e4b17023SJohn Marino       def_or_undef (parse_in, "__tune_k6__");
184e4b17023SJohn Marino       if (last_tune_char == '2')
185e4b17023SJohn Marino 	def_or_undef (parse_in, "__tune_k6_2__");
186e4b17023SJohn Marino       else if (last_tune_char == '3')
187e4b17023SJohn Marino 	def_or_undef (parse_in, "__tune_k6_3__");
188e4b17023SJohn Marino       else if (isa_flag & OPTION_MASK_ISA_3DNOW)
189e4b17023SJohn Marino 	def_or_undef (parse_in, "__tune_k6_3__");
190e4b17023SJohn Marino       break;
191e4b17023SJohn Marino     case PROCESSOR_ATHLON:
192e4b17023SJohn Marino       def_or_undef (parse_in, "__tune_athlon__");
193e4b17023SJohn Marino       if (isa_flag & OPTION_MASK_ISA_SSE)
194e4b17023SJohn Marino 	def_or_undef (parse_in, "__tune_athlon_sse__");
195e4b17023SJohn Marino       break;
196e4b17023SJohn Marino     case PROCESSOR_K8:
197e4b17023SJohn Marino       def_or_undef (parse_in, "__tune_k8__");
198e4b17023SJohn Marino       break;
199e4b17023SJohn Marino     case PROCESSOR_AMDFAM10:
200e4b17023SJohn Marino       def_or_undef (parse_in, "__tune_amdfam10__");
201e4b17023SJohn Marino       break;
202e4b17023SJohn Marino     case PROCESSOR_BDVER1:
203e4b17023SJohn Marino       def_or_undef (parse_in, "__tune_bdver1__");
204e4b17023SJohn Marino       break;
205e4b17023SJohn Marino     case PROCESSOR_BDVER2:
206e4b17023SJohn Marino       def_or_undef (parse_in, "__tune_bdver2__");
207e4b17023SJohn Marino       break;
208e4b17023SJohn Marino    case PROCESSOR_BTVER1:
209e4b17023SJohn Marino       def_or_undef (parse_in, "__tune_btver1__");
210e4b17023SJohn Marino       break;
211e4b17023SJohn Marino     case PROCESSOR_PENTIUM4:
212e4b17023SJohn Marino       def_or_undef (parse_in, "__tune_pentium4__");
213e4b17023SJohn Marino       break;
214e4b17023SJohn Marino     case PROCESSOR_NOCONA:
215e4b17023SJohn Marino       def_or_undef (parse_in, "__tune_nocona__");
216e4b17023SJohn Marino       break;
217e4b17023SJohn Marino     case PROCESSOR_CORE2_32:
218e4b17023SJohn Marino     case PROCESSOR_CORE2_64:
219e4b17023SJohn Marino       def_or_undef (parse_in, "__tune_core2__");
220e4b17023SJohn Marino       break;
221e4b17023SJohn Marino     case PROCESSOR_COREI7_32:
222e4b17023SJohn Marino     case PROCESSOR_COREI7_64:
223e4b17023SJohn Marino       def_or_undef (parse_in, "__tune_corei7__");
224e4b17023SJohn Marino       break;
225e4b17023SJohn Marino     case PROCESSOR_ATOM:
226e4b17023SJohn Marino       def_or_undef (parse_in, "__tune_atom__");
227e4b17023SJohn Marino       break;
228e4b17023SJohn Marino     case PROCESSOR_GENERIC32:
229e4b17023SJohn Marino     case PROCESSOR_GENERIC64:
230e4b17023SJohn Marino       break;
231e4b17023SJohn Marino     /* use PROCESSOR_max to not set/unset the tune macro.  */
232e4b17023SJohn Marino     case PROCESSOR_max:
233e4b17023SJohn Marino       break;
234e4b17023SJohn Marino     }
235e4b17023SJohn Marino 
236*5ce9237cSJohn Marino   switch (ix86_cmodel)
237*5ce9237cSJohn Marino     {
238*5ce9237cSJohn Marino     case CM_SMALL:
239*5ce9237cSJohn Marino     case CM_SMALL_PIC:
240*5ce9237cSJohn Marino       def_or_undef (parse_in, "__code_model_small__");
241*5ce9237cSJohn Marino       break;
242*5ce9237cSJohn Marino     case CM_MEDIUM:
243*5ce9237cSJohn Marino     case CM_MEDIUM_PIC:
244*5ce9237cSJohn Marino       def_or_undef (parse_in, "__code_model_medium__");
245*5ce9237cSJohn Marino       break;
246*5ce9237cSJohn Marino     case CM_LARGE:
247*5ce9237cSJohn Marino     case CM_LARGE_PIC:
248*5ce9237cSJohn Marino       def_or_undef (parse_in, "__code_model_large__");
249*5ce9237cSJohn Marino       break;
250*5ce9237cSJohn Marino     case CM_32:
251*5ce9237cSJohn Marino       def_or_undef (parse_in, "__code_model_32__");
252*5ce9237cSJohn Marino       break;
253*5ce9237cSJohn Marino     case CM_KERNEL:
254*5ce9237cSJohn Marino       def_or_undef (parse_in, "__code_model_kernel__");
255*5ce9237cSJohn Marino       break;
256*5ce9237cSJohn Marino     default:
257*5ce9237cSJohn Marino       ;
258*5ce9237cSJohn Marino     }
259*5ce9237cSJohn Marino 
260e4b17023SJohn Marino   if (isa_flag & OPTION_MASK_ISA_MMX)
261e4b17023SJohn Marino     def_or_undef (parse_in, "__MMX__");
262e4b17023SJohn Marino   if (isa_flag & OPTION_MASK_ISA_3DNOW)
263e4b17023SJohn Marino     def_or_undef (parse_in, "__3dNOW__");
264e4b17023SJohn Marino   if (isa_flag & OPTION_MASK_ISA_3DNOW_A)
265e4b17023SJohn Marino     def_or_undef (parse_in, "__3dNOW_A__");
266e4b17023SJohn Marino   if (isa_flag & OPTION_MASK_ISA_SSE)
267e4b17023SJohn Marino     def_or_undef (parse_in, "__SSE__");
268e4b17023SJohn Marino   if (isa_flag & OPTION_MASK_ISA_SSE2)
269e4b17023SJohn Marino     def_or_undef (parse_in, "__SSE2__");
270e4b17023SJohn Marino   if (isa_flag & OPTION_MASK_ISA_SSE3)
271e4b17023SJohn Marino     def_or_undef (parse_in, "__SSE3__");
272e4b17023SJohn Marino   if (isa_flag & OPTION_MASK_ISA_SSSE3)
273e4b17023SJohn Marino     def_or_undef (parse_in, "__SSSE3__");
274e4b17023SJohn Marino   if (isa_flag & OPTION_MASK_ISA_SSE4_1)
275e4b17023SJohn Marino     def_or_undef (parse_in, "__SSE4_1__");
276e4b17023SJohn Marino   if (isa_flag & OPTION_MASK_ISA_SSE4_2)
277e4b17023SJohn Marino     def_or_undef (parse_in, "__SSE4_2__");
278e4b17023SJohn Marino   if (isa_flag & OPTION_MASK_ISA_AES)
279e4b17023SJohn Marino     def_or_undef (parse_in, "__AES__");
280e4b17023SJohn Marino   if (isa_flag & OPTION_MASK_ISA_PCLMUL)
281e4b17023SJohn Marino     def_or_undef (parse_in, "__PCLMUL__");
282e4b17023SJohn Marino   if (isa_flag & OPTION_MASK_ISA_AVX)
283e4b17023SJohn Marino     def_or_undef (parse_in, "__AVX__");
284e4b17023SJohn Marino   if (isa_flag & OPTION_MASK_ISA_AVX2)
285e4b17023SJohn Marino     def_or_undef (parse_in, "__AVX2__");
286e4b17023SJohn Marino   if (isa_flag & OPTION_MASK_ISA_FMA)
287e4b17023SJohn Marino     def_or_undef (parse_in, "__FMA__");
288e4b17023SJohn Marino   if (isa_flag & OPTION_MASK_ISA_SSE4A)
289e4b17023SJohn Marino     def_or_undef (parse_in, "__SSE4A__");
290e4b17023SJohn Marino   if (isa_flag & OPTION_MASK_ISA_FMA4)
291e4b17023SJohn Marino     def_or_undef (parse_in, "__FMA4__");
292e4b17023SJohn Marino   if (isa_flag & OPTION_MASK_ISA_XOP)
293e4b17023SJohn Marino     def_or_undef (parse_in, "__XOP__");
294e4b17023SJohn Marino   if (isa_flag & OPTION_MASK_ISA_LWP)
295e4b17023SJohn Marino     def_or_undef (parse_in, "__LWP__");
296e4b17023SJohn Marino   if (isa_flag & OPTION_MASK_ISA_ABM)
297e4b17023SJohn Marino     def_or_undef (parse_in, "__ABM__");
298e4b17023SJohn Marino   if (isa_flag & OPTION_MASK_ISA_BMI)
299e4b17023SJohn Marino     def_or_undef (parse_in, "__BMI__");
300e4b17023SJohn Marino   if (isa_flag & OPTION_MASK_ISA_BMI2)
301e4b17023SJohn Marino     def_or_undef (parse_in, "__BMI2__");
302e4b17023SJohn Marino   if (isa_flag & OPTION_MASK_ISA_LZCNT)
303e4b17023SJohn Marino     def_or_undef (parse_in, "__LZCNT__");
304e4b17023SJohn Marino   if (isa_flag & OPTION_MASK_ISA_TBM)
305e4b17023SJohn Marino     def_or_undef (parse_in, "__TBM__");
306e4b17023SJohn Marino   if (isa_flag & OPTION_MASK_ISA_POPCNT)
307e4b17023SJohn Marino     def_or_undef (parse_in, "__POPCNT__");
308e4b17023SJohn Marino   if (isa_flag & OPTION_MASK_ISA_FSGSBASE)
309e4b17023SJohn Marino     def_or_undef (parse_in, "__FSGSBASE__");
310e4b17023SJohn Marino   if (isa_flag & OPTION_MASK_ISA_RDRND)
311e4b17023SJohn Marino     def_or_undef (parse_in, "__RDRND__");
312e4b17023SJohn Marino   if (isa_flag & OPTION_MASK_ISA_F16C)
313e4b17023SJohn Marino     def_or_undef (parse_in, "__F16C__");
314e4b17023SJohn Marino   if ((fpmath & FPMATH_SSE) && (isa_flag & OPTION_MASK_ISA_SSE))
315e4b17023SJohn Marino     def_or_undef (parse_in, "__SSE_MATH__");
316e4b17023SJohn Marino   if ((fpmath & FPMATH_SSE) && (isa_flag & OPTION_MASK_ISA_SSE2))
317e4b17023SJohn Marino     def_or_undef (parse_in, "__SSE2_MATH__");
318e4b17023SJohn Marino }
319e4b17023SJohn Marino 
320e4b17023SJohn Marino 
321e4b17023SJohn Marino /* Hook to validate the current #pragma GCC target and set the state, and
322e4b17023SJohn Marino    update the macros based on what was changed.  If ARGS is NULL, then
323e4b17023SJohn Marino    POP_TARGET is used to reset the options.  */
324e4b17023SJohn Marino 
325e4b17023SJohn Marino static bool
ix86_pragma_target_parse(tree args,tree pop_target)326e4b17023SJohn Marino ix86_pragma_target_parse (tree args, tree pop_target)
327e4b17023SJohn Marino {
328e4b17023SJohn Marino   tree prev_tree = build_target_option_node ();
329e4b17023SJohn Marino   tree cur_tree;
330e4b17023SJohn Marino   struct cl_target_option *prev_opt;
331e4b17023SJohn Marino   struct cl_target_option *cur_opt;
332e4b17023SJohn Marino   HOST_WIDE_INT prev_isa;
333e4b17023SJohn Marino   HOST_WIDE_INT cur_isa;
334e4b17023SJohn Marino   HOST_WIDE_INT diff_isa;
335e4b17023SJohn Marino   enum processor_type prev_arch;
336e4b17023SJohn Marino   enum processor_type prev_tune;
337e4b17023SJohn Marino   enum processor_type cur_arch;
338e4b17023SJohn Marino   enum processor_type cur_tune;
339e4b17023SJohn Marino 
340e4b17023SJohn Marino   if (! args)
341e4b17023SJohn Marino     {
342e4b17023SJohn Marino       cur_tree = ((pop_target)
343e4b17023SJohn Marino 		  ? pop_target
344e4b17023SJohn Marino 		  : target_option_default_node);
345e4b17023SJohn Marino       cl_target_option_restore (&global_options,
346e4b17023SJohn Marino 				TREE_TARGET_OPTION (cur_tree));
347e4b17023SJohn Marino     }
348e4b17023SJohn Marino   else
349e4b17023SJohn Marino     {
350e4b17023SJohn Marino       cur_tree = ix86_valid_target_attribute_tree (args);
351e4b17023SJohn Marino       if (!cur_tree)
352e4b17023SJohn Marino 	return false;
353e4b17023SJohn Marino     }
354e4b17023SJohn Marino 
355e4b17023SJohn Marino   target_option_current_node = cur_tree;
356e4b17023SJohn Marino 
357e4b17023SJohn Marino   /* Figure out the previous/current isa, arch, tune and the differences.  */
358e4b17023SJohn Marino   prev_opt  = TREE_TARGET_OPTION (prev_tree);
359e4b17023SJohn Marino   cur_opt   = TREE_TARGET_OPTION (cur_tree);
360e4b17023SJohn Marino   prev_isa  = prev_opt->x_ix86_isa_flags;
361e4b17023SJohn Marino   cur_isa   = cur_opt->x_ix86_isa_flags;
362e4b17023SJohn Marino   diff_isa  = (prev_isa ^ cur_isa);
363e4b17023SJohn Marino   prev_arch = (enum processor_type) prev_opt->arch;
364e4b17023SJohn Marino   prev_tune = (enum processor_type) prev_opt->tune;
365e4b17023SJohn Marino   cur_arch  = (enum processor_type) cur_opt->arch;
366e4b17023SJohn Marino   cur_tune  = (enum processor_type) cur_opt->tune;
367e4b17023SJohn Marino 
368e4b17023SJohn Marino   /* If the same processor is used for both previous and current options, don't
369e4b17023SJohn Marino      change the macros.  */
370e4b17023SJohn Marino   if (cur_arch == prev_arch)
371e4b17023SJohn Marino     cur_arch = prev_arch = PROCESSOR_max;
372e4b17023SJohn Marino 
373e4b17023SJohn Marino   if (cur_tune == prev_tune)
374e4b17023SJohn Marino     cur_tune = prev_tune = PROCESSOR_max;
375e4b17023SJohn Marino 
376e4b17023SJohn Marino   /* Undef all of the macros for that are no longer current.  */
377e4b17023SJohn Marino   ix86_target_macros_internal (prev_isa & diff_isa,
378e4b17023SJohn Marino 			       prev_arch,
379e4b17023SJohn Marino 			       prev_tune,
380e4b17023SJohn Marino 			       (enum fpmath_unit) prev_opt->x_ix86_fpmath,
381e4b17023SJohn Marino 			       cpp_undef);
382e4b17023SJohn Marino 
383e4b17023SJohn Marino   /* Define all of the macros for new options that were just turned on.  */
384e4b17023SJohn Marino   ix86_target_macros_internal (cur_isa & diff_isa,
385e4b17023SJohn Marino 			       cur_arch,
386e4b17023SJohn Marino 			       cur_tune,
387e4b17023SJohn Marino 			       (enum fpmath_unit) cur_opt->x_ix86_fpmath,
388e4b17023SJohn Marino 			       cpp_define);
389e4b17023SJohn Marino 
390e4b17023SJohn Marino   return true;
391e4b17023SJohn Marino }
392e4b17023SJohn Marino 
393e4b17023SJohn Marino /* Function to tell the preprocessor about the defines for the current target.  */
394e4b17023SJohn Marino 
395e4b17023SJohn Marino void
ix86_target_macros(void)396e4b17023SJohn Marino ix86_target_macros (void)
397e4b17023SJohn Marino {
398e4b17023SJohn Marino   /* 32/64-bit won't change with target specific options, so do the assert and
399e4b17023SJohn Marino      builtin_define_std calls here.  */
400e4b17023SJohn Marino   if (TARGET_64BIT)
401e4b17023SJohn Marino     {
402e4b17023SJohn Marino       cpp_assert (parse_in, "cpu=x86_64");
403e4b17023SJohn Marino       cpp_assert (parse_in, "machine=x86_64");
404e4b17023SJohn Marino       cpp_define (parse_in, "__amd64");
405e4b17023SJohn Marino       cpp_define (parse_in, "__amd64__");
406e4b17023SJohn Marino       cpp_define (parse_in, "__x86_64");
407e4b17023SJohn Marino       cpp_define (parse_in, "__x86_64__");
408e4b17023SJohn Marino       if (TARGET_X32)
409e4b17023SJohn Marino 	{
410e4b17023SJohn Marino 	  cpp_define (parse_in, "_ILP32");
411e4b17023SJohn Marino 	  cpp_define (parse_in, "__ILP32__");
412e4b17023SJohn Marino 	}
413e4b17023SJohn Marino     }
414e4b17023SJohn Marino   else
415e4b17023SJohn Marino     {
416e4b17023SJohn Marino       cpp_assert (parse_in, "cpu=i386");
417e4b17023SJohn Marino       cpp_assert (parse_in, "machine=i386");
418e4b17023SJohn Marino       builtin_define_std ("i386");
419e4b17023SJohn Marino     }
420e4b17023SJohn Marino 
421e4b17023SJohn Marino   ix86_target_macros_internal (ix86_isa_flags,
422e4b17023SJohn Marino 			       ix86_arch,
423e4b17023SJohn Marino 			       ix86_tune,
424e4b17023SJohn Marino 			       ix86_fpmath,
425e4b17023SJohn Marino 			       cpp_define);
426e4b17023SJohn Marino }
427e4b17023SJohn Marino 
428e4b17023SJohn Marino 
429e4b17023SJohn Marino /* Register target pragmas.  We need to add the hook for parsing #pragma GCC
430e4b17023SJohn Marino    option here rather than in i386.c since it will pull in various preprocessor
431e4b17023SJohn Marino    functions, and those are not present in languages like fortran without a
432e4b17023SJohn Marino    preprocessor.  */
433e4b17023SJohn Marino 
434e4b17023SJohn Marino void
ix86_register_pragmas(void)435e4b17023SJohn Marino ix86_register_pragmas (void)
436e4b17023SJohn Marino {
437e4b17023SJohn Marino   /* Update pragma hook to allow parsing #pragma GCC target.  */
438e4b17023SJohn Marino   targetm.target_option.pragma_parse = ix86_pragma_target_parse;
439e4b17023SJohn Marino 
440e4b17023SJohn Marino #ifdef REGISTER_SUBTARGET_PRAGMAS
441e4b17023SJohn Marino   REGISTER_SUBTARGET_PRAGMAS ();
442e4b17023SJohn Marino #endif
443e4b17023SJohn Marino }
444