Changelog entry:
[official-gcc.git] / gcc / common / config / i386 / i386-common.c
blobe2e4814e808172d31d46367da5237981c56154b7
1 /* IA-32 common hooks.
2 Copyright (C) 1988, 1992, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
4 Free Software Foundation, Inc.
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
11 any later version.
13 GCC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "diagnostic-core.h"
26 #include "tm.h"
27 #include "tm_p.h"
28 #include "common/common-target.h"
29 #include "common/common-target-def.h"
30 #include "opts.h"
31 #include "flags.h"
33 /* Define a set of ISAs which are available when a given ISA is
34 enabled. MMX and SSE ISAs are handled separately. */
36 #define OPTION_MASK_ISA_MMX_SET OPTION_MASK_ISA_MMX
37 #define OPTION_MASK_ISA_3DNOW_SET \
38 (OPTION_MASK_ISA_3DNOW | OPTION_MASK_ISA_MMX_SET)
40 #define OPTION_MASK_ISA_SSE_SET OPTION_MASK_ISA_SSE
41 #define OPTION_MASK_ISA_SSE2_SET \
42 (OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_SSE_SET)
43 #define OPTION_MASK_ISA_SSE3_SET \
44 (OPTION_MASK_ISA_SSE3 | OPTION_MASK_ISA_SSE2_SET)
45 #define OPTION_MASK_ISA_SSSE3_SET \
46 (OPTION_MASK_ISA_SSSE3 | OPTION_MASK_ISA_SSE3_SET)
47 #define OPTION_MASK_ISA_SSE4_1_SET \
48 (OPTION_MASK_ISA_SSE4_1 | OPTION_MASK_ISA_SSSE3_SET)
49 #define OPTION_MASK_ISA_SSE4_2_SET \
50 (OPTION_MASK_ISA_SSE4_2 | OPTION_MASK_ISA_SSE4_1_SET)
51 #define OPTION_MASK_ISA_AVX_SET \
52 (OPTION_MASK_ISA_AVX | OPTION_MASK_ISA_SSE4_2_SET)
53 #define OPTION_MASK_ISA_FMA_SET \
54 (OPTION_MASK_ISA_FMA | OPTION_MASK_ISA_AVX_SET)
55 #define OPTION_MASK_ISA_AVX2_SET \
56 (OPTION_MASK_ISA_AVX2 | OPTION_MASK_ISA_AVX_SET)
57 #define OPTION_MASK_ISA_RTM_SET OPTION_MASK_ISA_RTM
58 #define OPTION_MASK_ISA_PRFCHW_SET OPTION_MASK_ISA_PRFCHW
60 /* SSE4 includes both SSE4.1 and SSE4.2. -msse4 should be the same
61 as -msse4.2. */
62 #define OPTION_MASK_ISA_SSE4_SET OPTION_MASK_ISA_SSE4_2_SET
64 #define OPTION_MASK_ISA_SSE4A_SET \
65 (OPTION_MASK_ISA_SSE4A | OPTION_MASK_ISA_SSE3_SET)
66 #define OPTION_MASK_ISA_FMA4_SET \
67 (OPTION_MASK_ISA_FMA4 | OPTION_MASK_ISA_SSE4A_SET \
68 | OPTION_MASK_ISA_AVX_SET)
69 #define OPTION_MASK_ISA_XOP_SET \
70 (OPTION_MASK_ISA_XOP | OPTION_MASK_ISA_FMA4_SET)
71 #define OPTION_MASK_ISA_LWP_SET \
72 OPTION_MASK_ISA_LWP
74 /* AES and PCLMUL need SSE2 because they use xmm registers */
75 #define OPTION_MASK_ISA_AES_SET \
76 (OPTION_MASK_ISA_AES | OPTION_MASK_ISA_SSE2_SET)
77 #define OPTION_MASK_ISA_PCLMUL_SET \
78 (OPTION_MASK_ISA_PCLMUL | OPTION_MASK_ISA_SSE2_SET)
80 #define OPTION_MASK_ISA_ABM_SET \
81 (OPTION_MASK_ISA_ABM | OPTION_MASK_ISA_POPCNT)
83 #define OPTION_MASK_ISA_BMI_SET OPTION_MASK_ISA_BMI
84 #define OPTION_MASK_ISA_BMI2_SET OPTION_MASK_ISA_BMI2
85 #define OPTION_MASK_ISA_TBM_SET OPTION_MASK_ISA_TBM
86 #define OPTION_MASK_ISA_POPCNT_SET OPTION_MASK_ISA_POPCNT
87 #define OPTION_MASK_ISA_CX16_SET OPTION_MASK_ISA_CX16
88 #define OPTION_MASK_ISA_SAHF_SET OPTION_MASK_ISA_SAHF
89 #define OPTION_MASK_ISA_MOVBE_SET OPTION_MASK_ISA_MOVBE
90 #define OPTION_MASK_ISA_CRC32_SET OPTION_MASK_ISA_CRC32
92 #define OPTION_MASK_ISA_FSGSBASE_SET OPTION_MASK_ISA_FSGSBASE
93 #define OPTION_MASK_ISA_RDRND_SET OPTION_MASK_ISA_RDRND
94 #define OPTION_MASK_ISA_F16C_SET \
95 (OPTION_MASK_ISA_F16C | OPTION_MASK_ISA_AVX_SET)
97 /* Define a set of ISAs which aren't available when a given ISA is
98 disabled. MMX and SSE ISAs are handled separately. */
100 #define OPTION_MASK_ISA_MMX_UNSET \
101 (OPTION_MASK_ISA_MMX | OPTION_MASK_ISA_3DNOW_UNSET)
102 #define OPTION_MASK_ISA_3DNOW_UNSET \
103 (OPTION_MASK_ISA_3DNOW | OPTION_MASK_ISA_3DNOW_A_UNSET)
104 #define OPTION_MASK_ISA_3DNOW_A_UNSET OPTION_MASK_ISA_3DNOW_A
106 #define OPTION_MASK_ISA_SSE_UNSET \
107 (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_SSE2_UNSET)
108 #define OPTION_MASK_ISA_SSE2_UNSET \
109 (OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_SSE3_UNSET)
110 #define OPTION_MASK_ISA_SSE3_UNSET \
111 (OPTION_MASK_ISA_SSE3 \
112 | OPTION_MASK_ISA_SSSE3_UNSET \
113 | OPTION_MASK_ISA_SSE4A_UNSET )
114 #define OPTION_MASK_ISA_SSSE3_UNSET \
115 (OPTION_MASK_ISA_SSSE3 | OPTION_MASK_ISA_SSE4_1_UNSET)
116 #define OPTION_MASK_ISA_SSE4_1_UNSET \
117 (OPTION_MASK_ISA_SSE4_1 | OPTION_MASK_ISA_SSE4_2_UNSET)
118 #define OPTION_MASK_ISA_SSE4_2_UNSET \
119 (OPTION_MASK_ISA_SSE4_2 | OPTION_MASK_ISA_AVX_UNSET )
120 #define OPTION_MASK_ISA_AVX_UNSET \
121 (OPTION_MASK_ISA_AVX | OPTION_MASK_ISA_FMA_UNSET \
122 | OPTION_MASK_ISA_FMA4_UNSET | OPTION_MASK_ISA_F16C_UNSET \
123 | OPTION_MASK_ISA_AVX2_UNSET)
124 #define OPTION_MASK_ISA_FMA_UNSET OPTION_MASK_ISA_FMA
125 #define OPTION_MASK_ISA_AVX2_UNSET OPTION_MASK_ISA_AVX2
126 #define OPTION_MASK_ISA_RTM_UNSET OPTION_MASK_ISA_RTM
127 #define OPTION_MASK_ISA_PRFCHW_UNSET OPTION_MASK_ISA_PRFCHW
129 /* SSE4 includes both SSE4.1 and SSE4.2. -mno-sse4 should the same
130 as -mno-sse4.1. */
131 #define OPTION_MASK_ISA_SSE4_UNSET OPTION_MASK_ISA_SSE4_1_UNSET
133 #define OPTION_MASK_ISA_SSE4A_UNSET \
134 (OPTION_MASK_ISA_SSE4A | OPTION_MASK_ISA_FMA4_UNSET)
136 #define OPTION_MASK_ISA_FMA4_UNSET \
137 (OPTION_MASK_ISA_FMA4 | OPTION_MASK_ISA_XOP_UNSET)
138 #define OPTION_MASK_ISA_XOP_UNSET OPTION_MASK_ISA_XOP
139 #define OPTION_MASK_ISA_LWP_UNSET OPTION_MASK_ISA_LWP
141 #define OPTION_MASK_ISA_AES_UNSET OPTION_MASK_ISA_AES
142 #define OPTION_MASK_ISA_PCLMUL_UNSET OPTION_MASK_ISA_PCLMUL
143 #define OPTION_MASK_ISA_ABM_UNSET OPTION_MASK_ISA_ABM
144 #define OPTION_MASK_ISA_BMI_UNSET OPTION_MASK_ISA_BMI
145 #define OPTION_MASK_ISA_BMI2_UNSET OPTION_MASK_ISA_BMI2
146 #define OPTION_MASK_ISA_TBM_UNSET OPTION_MASK_ISA_TBM
147 #define OPTION_MASK_ISA_POPCNT_UNSET OPTION_MASK_ISA_POPCNT
148 #define OPTION_MASK_ISA_CX16_UNSET OPTION_MASK_ISA_CX16
149 #define OPTION_MASK_ISA_SAHF_UNSET OPTION_MASK_ISA_SAHF
150 #define OPTION_MASK_ISA_MOVBE_UNSET OPTION_MASK_ISA_MOVBE
151 #define OPTION_MASK_ISA_CRC32_UNSET OPTION_MASK_ISA_CRC32
153 #define OPTION_MASK_ISA_FSGSBASE_UNSET OPTION_MASK_ISA_FSGSBASE
154 #define OPTION_MASK_ISA_RDRND_UNSET OPTION_MASK_ISA_RDRND
155 #define OPTION_MASK_ISA_F16C_UNSET OPTION_MASK_ISA_F16C
157 /* Implement TARGET_HANDLE_OPTION. */
159 bool
160 ix86_handle_option (struct gcc_options *opts,
161 struct gcc_options *opts_set ATTRIBUTE_UNUSED,
162 const struct cl_decoded_option *decoded,
163 location_t loc)
165 size_t code = decoded->opt_index;
166 int value = decoded->value;
168 switch (code)
170 case OPT_mmmx:
171 if (value)
173 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_MMX_SET;
174 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_MMX_SET;
176 else
178 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_MMX_UNSET;
179 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_MMX_UNSET;
181 return true;
183 case OPT_m3dnow:
184 if (value)
186 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_3DNOW_SET;
187 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_3DNOW_SET;
189 else
191 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_3DNOW_UNSET;
192 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_3DNOW_UNSET;
194 return true;
196 case OPT_m3dnowa:
197 return false;
199 case OPT_msse:
200 if (value)
202 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE_SET;
203 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE_SET;
205 else
207 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE_UNSET;
208 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE_UNSET;
210 return true;
212 case OPT_msse2:
213 if (value)
215 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE2_SET;
216 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE2_SET;
218 else
220 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE2_UNSET;
221 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE2_UNSET;
223 return true;
225 case OPT_msse3:
226 if (value)
228 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE3_SET;
229 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE3_SET;
231 else
233 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE3_UNSET;
234 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE3_UNSET;
236 return true;
238 case OPT_mssse3:
239 if (value)
241 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSSE3_SET;
242 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSSE3_SET;
244 else
246 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSSE3_UNSET;
247 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSSE3_UNSET;
249 return true;
251 case OPT_msse4_1:
252 if (value)
254 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE4_1_SET;
255 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_1_SET;
257 else
259 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4_1_UNSET;
260 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_1_UNSET;
262 return true;
264 case OPT_msse4_2:
265 if (value)
267 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE4_2_SET;
268 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_2_SET;
270 else
272 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4_2_UNSET;
273 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_2_UNSET;
275 return true;
277 case OPT_mavx:
278 if (value)
280 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_AVX_SET;
281 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX_SET;
283 else
285 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AVX_UNSET;
286 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX_UNSET;
288 return true;
290 case OPT_mavx2:
291 if (value)
293 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_AVX2_SET;
294 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX2_SET;
296 else
298 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AVX2_UNSET;
299 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX2_UNSET;
301 return true;
303 case OPT_mfma:
304 if (value)
306 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_FMA_SET;
307 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FMA_SET;
309 else
311 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_FMA_UNSET;
312 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FMA_UNSET;
314 return true;
316 case OPT_mrtm:
317 if (value)
319 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_RTM_SET;
320 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_RTM_SET;
322 else
324 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_RTM_UNSET;
325 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_RTM_UNSET;
327 return true;
329 case OPT_msse4:
330 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE4_SET;
331 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_SET;
332 return true;
334 case OPT_mno_sse4:
335 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4_UNSET;
336 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_UNSET;
337 return true;
339 case OPT_msse4a:
340 if (value)
342 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE4A_SET;
343 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4A_SET;
345 else
347 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4A_UNSET;
348 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4A_UNSET;
350 return true;
352 case OPT_mfma4:
353 if (value)
355 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_FMA4_SET;
356 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FMA4_SET;
358 else
360 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_FMA4_UNSET;
361 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FMA4_UNSET;
363 return true;
365 case OPT_mxop:
366 if (value)
368 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_XOP_SET;
369 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_XOP_SET;
371 else
373 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_XOP_UNSET;
374 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_XOP_UNSET;
376 return true;
378 case OPT_mlwp:
379 if (value)
381 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_LWP_SET;
382 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_LWP_SET;
384 else
386 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_LWP_UNSET;
387 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_LWP_UNSET;
389 return true;
391 case OPT_mabm:
392 if (value)
394 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_ABM_SET;
395 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_ABM_SET;
397 else
399 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_ABM_UNSET;
400 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_ABM_UNSET;
402 return true;
404 case OPT_mbmi:
405 if (value)
407 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_BMI_SET;
408 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_BMI_SET;
410 else
412 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_BMI_UNSET;
413 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_BMI_UNSET;
415 return true;
417 case OPT_mbmi2:
418 if (value)
420 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_BMI2_SET;
421 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_BMI2_SET;
423 else
425 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_BMI2_UNSET;
426 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_BMI2_UNSET;
428 return true;
430 case OPT_mtbm:
431 if (value)
433 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_TBM_SET;
434 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_TBM_SET;
436 else
438 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_TBM_UNSET;
439 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_TBM_UNSET;
441 return true;
443 case OPT_mpopcnt:
444 if (value)
446 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_POPCNT_SET;
447 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_POPCNT_SET;
449 else
451 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_POPCNT_UNSET;
452 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_POPCNT_UNSET;
454 return true;
456 case OPT_msahf:
457 if (value)
459 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SAHF_SET;
460 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SAHF_SET;
462 else
464 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SAHF_UNSET;
465 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SAHF_UNSET;
467 return true;
469 case OPT_mcx16:
470 if (value)
472 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_CX16_SET;
473 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_CX16_SET;
475 else
477 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_CX16_UNSET;
478 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_CX16_UNSET;
480 return true;
482 case OPT_mmovbe:
483 if (value)
485 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_MOVBE_SET;
486 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_MOVBE_SET;
488 else
490 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_MOVBE_UNSET;
491 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_MOVBE_UNSET;
493 return true;
495 case OPT_mcrc32:
496 if (value)
498 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_CRC32_SET;
499 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_CRC32_SET;
501 else
503 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_CRC32_UNSET;
504 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_CRC32_UNSET;
506 return true;
508 case OPT_maes:
509 if (value)
511 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_AES_SET;
512 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AES_SET;
514 else
516 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AES_UNSET;
517 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AES_UNSET;
519 return true;
521 case OPT_mpclmul:
522 if (value)
524 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_PCLMUL_SET;
525 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_PCLMUL_SET;
527 else
529 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_PCLMUL_UNSET;
530 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_PCLMUL_UNSET;
532 return true;
534 case OPT_mfsgsbase:
535 if (value)
537 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_FSGSBASE_SET;
538 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FSGSBASE_SET;
540 else
542 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_FSGSBASE_UNSET;
543 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FSGSBASE_UNSET;
545 return true;
547 case OPT_mrdrnd:
548 if (value)
550 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_RDRND_SET;
551 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_RDRND_SET;
553 else
555 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_RDRND_UNSET;
556 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_RDRND_UNSET;
558 return true;
560 case OPT_mf16c:
561 if (value)
563 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_F16C_SET;
564 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_F16C_SET;
566 else
568 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_F16C_UNSET;
569 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_F16C_UNSET;
571 return true;
573 case OPT_mprfchw:
574 if (value)
576 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_PRFCHW_SET;
577 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_PRFCHW_SET;
579 else
581 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_PRFCHW_UNSET;
582 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_PRFCHW_UNSET;
584 return true;
586 /* Comes from final.c -- no real reason to change it. */
587 #define MAX_CODE_ALIGN 16
589 case OPT_malign_loops_:
590 warning_at (loc, 0, "-malign-loops is obsolete, use -falign-loops");
591 if (value > MAX_CODE_ALIGN)
592 error_at (loc, "-malign-loops=%d is not between 0 and %d",
593 value, MAX_CODE_ALIGN);
594 else
595 opts->x_align_loops = 1 << value;
596 return true;
598 case OPT_malign_jumps_:
599 warning_at (loc, 0, "-malign-jumps is obsolete, use -falign-jumps");
600 if (value > MAX_CODE_ALIGN)
601 error_at (loc, "-malign-jumps=%d is not between 0 and %d",
602 value, MAX_CODE_ALIGN);
603 else
604 opts->x_align_jumps = 1 << value;
605 return true;
607 case OPT_malign_functions_:
608 warning_at (loc, 0,
609 "-malign-functions is obsolete, use -falign-functions");
610 if (value > MAX_CODE_ALIGN)
611 error_at (loc, "-malign-functions=%d is not between 0 and %d",
612 value, MAX_CODE_ALIGN);
613 else
614 opts->x_align_functions = 1 << value;
615 return true;
617 case OPT_mbranch_cost_:
618 if (value > 5)
620 error_at (loc, "-mbranch-cost=%d is not between 0 and 5", value);
621 opts->x_ix86_branch_cost = 5;
623 return true;
625 default:
626 return true;
630 static const struct default_options ix86_option_optimization_table[] =
632 /* Enable redundant extension instructions removal at -O2 and higher. */
633 { OPT_LEVELS_2_PLUS, OPT_free, NULL, 1 },
634 /* Turn off -fschedule-insns by default. It tends to make the
635 problem with not enough registers even worse. */
636 { OPT_LEVELS_ALL, OPT_fschedule_insns, NULL, 0 },
638 #ifdef SUBTARGET_OPTIMIZATION_OPTIONS
639 SUBTARGET_OPTIMIZATION_OPTIONS,
640 #endif
641 { OPT_LEVELS_NONE, 0, NULL, 0 }
644 /* Implement TARGET_OPTION_INIT_STRUCT. */
646 static void
647 ix86_option_init_struct (struct gcc_options *opts)
649 if (TARGET_MACHO)
650 /* The Darwin libraries never set errno, so we might as well
651 avoid calling them when that's the only reason we would. */
652 opts->x_flag_errno_math = 0;
654 opts->x_flag_pcc_struct_return = 2;
655 opts->x_flag_asynchronous_unwind_tables = 2;
656 opts->x_flag_vect_cost_model = 1;
659 /* On the x86 -fsplit-stack and -fstack-protector both use the same
660 field in the TCB, so they can not be used together. */
662 static bool
663 ix86_supports_split_stack (bool report ATTRIBUTE_UNUSED,
664 struct gcc_options *opts ATTRIBUTE_UNUSED)
666 bool ret = true;
668 #ifndef TARGET_THREAD_SPLIT_STACK_OFFSET
669 if (report)
670 error ("%<-fsplit-stack%> currently only supported on GNU/Linux");
671 ret = false;
672 #else
673 if (!HAVE_GAS_CFI_PERSONALITY_DIRECTIVE)
675 if (report)
676 error ("%<-fsplit-stack%> requires "
677 "assembler support for CFI directives");
678 ret = false;
680 #endif
682 return ret;
685 /* Implement TARGET_EXCEPT_UNWIND_INFO. */
687 static enum unwind_info_type
688 i386_except_unwind_info (struct gcc_options *opts)
690 /* Honor the --enable-sjlj-exceptions configure switch. */
691 #ifdef CONFIG_SJLJ_EXCEPTIONS
692 if (CONFIG_SJLJ_EXCEPTIONS)
693 return UI_SJLJ;
694 #endif
696 /* On windows 64, prefer SEH exceptions over anything else. */
697 if (TARGET_64BIT && DEFAULT_ABI == MS_ABI && opts->x_flag_unwind_tables)
698 return UI_SEH;
700 if (DWARF2_UNWIND_INFO)
701 return UI_DWARF2;
703 return UI_SJLJ;
706 #undef TARGET_EXCEPT_UNWIND_INFO
707 #define TARGET_EXCEPT_UNWIND_INFO i386_except_unwind_info
709 #undef TARGET_DEFAULT_TARGET_FLAGS
710 #define TARGET_DEFAULT_TARGET_FLAGS \
711 (TARGET_DEFAULT \
712 | TARGET_SUBTARGET_DEFAULT \
713 | TARGET_TLS_DIRECT_SEG_REFS_DEFAULT)
715 #undef TARGET_HANDLE_OPTION
716 #define TARGET_HANDLE_OPTION ix86_handle_option
718 #undef TARGET_OPTION_OPTIMIZATION_TABLE
719 #define TARGET_OPTION_OPTIMIZATION_TABLE ix86_option_optimization_table
720 #undef TARGET_OPTION_INIT_STRUCT
721 #define TARGET_OPTION_INIT_STRUCT ix86_option_init_struct
723 #undef TARGET_SUPPORTS_SPLIT_STACK
724 #define TARGET_SUPPORTS_SPLIT_STACK ix86_supports_split_stack
726 struct gcc_targetm_common targetm_common = TARGETM_COMMON_INITIALIZER;