2014-02-01 Christophe Lyon <christophe.lyon@linaro.org>
[official-gcc.git] / gcc-4_8-branch / gcc / common / config / i386 / i386-common.c
blob2c8f7cf9e3e2dfbb04e3a20858fc715d024fec33
1 /* IA-32 common hooks.
2 Copyright (C) 1988-2013 Free Software Foundation, Inc.
4 This file is part of GCC.
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.
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.
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/>. */
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "diagnostic-core.h"
24 #include "tm.h"
25 #include "tm_p.h"
26 #include "common/common-target.h"
27 #include "common/common-target-def.h"
28 #include "opts.h"
29 #include "flags.h"
31 /* Define a set of ISAs which are available when a given ISA is
32 enabled. MMX and SSE ISAs are handled separately. */
34 #define OPTION_MASK_ISA_MMX_SET OPTION_MASK_ISA_MMX
35 #define OPTION_MASK_ISA_3DNOW_SET \
36 (OPTION_MASK_ISA_3DNOW | OPTION_MASK_ISA_MMX_SET)
38 #define OPTION_MASK_ISA_SSE_SET OPTION_MASK_ISA_SSE
39 #define OPTION_MASK_ISA_SSE2_SET \
40 (OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_SSE_SET)
41 #define OPTION_MASK_ISA_SSE3_SET \
42 (OPTION_MASK_ISA_SSE3 | OPTION_MASK_ISA_SSE2_SET)
43 #define OPTION_MASK_ISA_SSSE3_SET \
44 (OPTION_MASK_ISA_SSSE3 | OPTION_MASK_ISA_SSE3_SET)
45 #define OPTION_MASK_ISA_SSE4_1_SET \
46 (OPTION_MASK_ISA_SSE4_1 | OPTION_MASK_ISA_SSSE3_SET)
47 #define OPTION_MASK_ISA_SSE4_2_SET \
48 (OPTION_MASK_ISA_SSE4_2 | OPTION_MASK_ISA_SSE4_1_SET)
49 #define OPTION_MASK_ISA_AVX_SET \
50 (OPTION_MASK_ISA_AVX | OPTION_MASK_ISA_SSE4_2_SET \
51 | OPTION_MASK_ISA_XSAVE_SET)
52 #define OPTION_MASK_ISA_FMA_SET \
53 (OPTION_MASK_ISA_FMA | OPTION_MASK_ISA_AVX_SET)
54 #define OPTION_MASK_ISA_AVX2_SET \
55 (OPTION_MASK_ISA_AVX2 | OPTION_MASK_ISA_AVX_SET)
56 #define OPTION_MASK_ISA_FXSR_SET OPTION_MASK_ISA_FXSR
57 #define OPTION_MASK_ISA_XSAVE_SET OPTION_MASK_ISA_XSAVE
58 #define OPTION_MASK_ISA_XSAVEOPT_SET \
59 (OPTION_MASK_ISA_XSAVEOPT | OPTION_MASK_ISA_XSAVE)
60 #define OPTION_MASK_ISA_RTM_SET OPTION_MASK_ISA_RTM
61 #define OPTION_MASK_ISA_PRFCHW_SET OPTION_MASK_ISA_PRFCHW
62 #define OPTION_MASK_ISA_RDSEED_SET OPTION_MASK_ISA_RDSEED
63 #define OPTION_MASK_ISA_ADX_SET OPTION_MASK_ISA_ADX
65 /* SSE4 includes both SSE4.1 and SSE4.2. -msse4 should be the same
66 as -msse4.2. */
67 #define OPTION_MASK_ISA_SSE4_SET OPTION_MASK_ISA_SSE4_2_SET
69 #define OPTION_MASK_ISA_SSE4A_SET \
70 (OPTION_MASK_ISA_SSE4A | OPTION_MASK_ISA_SSE3_SET)
71 #define OPTION_MASK_ISA_FMA4_SET \
72 (OPTION_MASK_ISA_FMA4 | OPTION_MASK_ISA_SSE4A_SET \
73 | OPTION_MASK_ISA_AVX_SET)
74 #define OPTION_MASK_ISA_XOP_SET \
75 (OPTION_MASK_ISA_XOP | OPTION_MASK_ISA_FMA4_SET)
76 #define OPTION_MASK_ISA_LWP_SET \
77 OPTION_MASK_ISA_LWP
79 /* AES and PCLMUL need SSE2 because they use xmm registers */
80 #define OPTION_MASK_ISA_AES_SET \
81 (OPTION_MASK_ISA_AES | OPTION_MASK_ISA_SSE2_SET)
82 #define OPTION_MASK_ISA_PCLMUL_SET \
83 (OPTION_MASK_ISA_PCLMUL | OPTION_MASK_ISA_SSE2_SET)
85 #define OPTION_MASK_ISA_ABM_SET \
86 (OPTION_MASK_ISA_ABM | OPTION_MASK_ISA_POPCNT)
88 #define OPTION_MASK_ISA_BMI_SET OPTION_MASK_ISA_BMI
89 #define OPTION_MASK_ISA_BMI2_SET OPTION_MASK_ISA_BMI2
90 #define OPTION_MASK_ISA_TBM_SET OPTION_MASK_ISA_TBM
91 #define OPTION_MASK_ISA_POPCNT_SET OPTION_MASK_ISA_POPCNT
92 #define OPTION_MASK_ISA_CX16_SET OPTION_MASK_ISA_CX16
93 #define OPTION_MASK_ISA_SAHF_SET OPTION_MASK_ISA_SAHF
94 #define OPTION_MASK_ISA_MOVBE_SET OPTION_MASK_ISA_MOVBE
95 #define OPTION_MASK_ISA_CRC32_SET OPTION_MASK_ISA_CRC32
97 #define OPTION_MASK_ISA_FSGSBASE_SET OPTION_MASK_ISA_FSGSBASE
98 #define OPTION_MASK_ISA_RDRND_SET OPTION_MASK_ISA_RDRND
99 #define OPTION_MASK_ISA_F16C_SET \
100 (OPTION_MASK_ISA_F16C | OPTION_MASK_ISA_AVX_SET)
102 /* Define a set of ISAs which aren't available when a given ISA is
103 disabled. MMX and SSE ISAs are handled separately. */
105 #define OPTION_MASK_ISA_MMX_UNSET \
106 (OPTION_MASK_ISA_MMX | OPTION_MASK_ISA_3DNOW_UNSET)
107 #define OPTION_MASK_ISA_3DNOW_UNSET \
108 (OPTION_MASK_ISA_3DNOW | OPTION_MASK_ISA_3DNOW_A_UNSET)
109 #define OPTION_MASK_ISA_3DNOW_A_UNSET OPTION_MASK_ISA_3DNOW_A
111 #define OPTION_MASK_ISA_SSE_UNSET \
112 (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_SSE2_UNSET)
113 #define OPTION_MASK_ISA_SSE2_UNSET \
114 (OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_SSE3_UNSET)
115 #define OPTION_MASK_ISA_SSE3_UNSET \
116 (OPTION_MASK_ISA_SSE3 \
117 | OPTION_MASK_ISA_SSSE3_UNSET \
118 | OPTION_MASK_ISA_SSE4A_UNSET )
119 #define OPTION_MASK_ISA_SSSE3_UNSET \
120 (OPTION_MASK_ISA_SSSE3 | OPTION_MASK_ISA_SSE4_1_UNSET)
121 #define OPTION_MASK_ISA_SSE4_1_UNSET \
122 (OPTION_MASK_ISA_SSE4_1 | OPTION_MASK_ISA_SSE4_2_UNSET)
123 #define OPTION_MASK_ISA_SSE4_2_UNSET \
124 (OPTION_MASK_ISA_SSE4_2 | OPTION_MASK_ISA_AVX_UNSET )
125 #define OPTION_MASK_ISA_AVX_UNSET \
126 (OPTION_MASK_ISA_AVX | OPTION_MASK_ISA_FMA_UNSET \
127 | OPTION_MASK_ISA_FMA4_UNSET | OPTION_MASK_ISA_F16C_UNSET \
128 | OPTION_MASK_ISA_AVX2_UNSET | OPTION_MASK_ISA_XSAVE_UNSET)
129 #define OPTION_MASK_ISA_FMA_UNSET OPTION_MASK_ISA_FMA
130 #define OPTION_MASK_ISA_AVX2_UNSET OPTION_MASK_ISA_AVX2
131 #define OPTION_MASK_ISA_FXSR_UNSET OPTION_MASK_ISA_FXSR
132 #define OPTION_MASK_ISA_XSAVE_UNSET \
133 (OPTION_MASK_ISA_XSAVE | OPTION_MASK_ISA_XSAVEOPT_UNSET)
134 #define OPTION_MASK_ISA_XSAVEOPT_UNSET OPTION_MASK_ISA_XSAVEOPT
135 #define OPTION_MASK_ISA_RTM_UNSET OPTION_MASK_ISA_RTM
136 #define OPTION_MASK_ISA_PRFCHW_UNSET OPTION_MASK_ISA_PRFCHW
137 #define OPTION_MASK_ISA_RDSEED_UNSET OPTION_MASK_ISA_RDSEED
138 #define OPTION_MASK_ISA_ADX_UNSET OPTION_MASK_ISA_ADX
140 /* SSE4 includes both SSE4.1 and SSE4.2. -mno-sse4 should the same
141 as -mno-sse4.1. */
142 #define OPTION_MASK_ISA_SSE4_UNSET OPTION_MASK_ISA_SSE4_1_UNSET
144 #define OPTION_MASK_ISA_SSE4A_UNSET \
145 (OPTION_MASK_ISA_SSE4A | OPTION_MASK_ISA_FMA4_UNSET)
147 #define OPTION_MASK_ISA_FMA4_UNSET \
148 (OPTION_MASK_ISA_FMA4 | OPTION_MASK_ISA_XOP_UNSET)
149 #define OPTION_MASK_ISA_XOP_UNSET OPTION_MASK_ISA_XOP
150 #define OPTION_MASK_ISA_LWP_UNSET OPTION_MASK_ISA_LWP
152 #define OPTION_MASK_ISA_AES_UNSET OPTION_MASK_ISA_AES
153 #define OPTION_MASK_ISA_PCLMUL_UNSET OPTION_MASK_ISA_PCLMUL
154 #define OPTION_MASK_ISA_ABM_UNSET OPTION_MASK_ISA_ABM
155 #define OPTION_MASK_ISA_BMI_UNSET OPTION_MASK_ISA_BMI
156 #define OPTION_MASK_ISA_BMI2_UNSET OPTION_MASK_ISA_BMI2
157 #define OPTION_MASK_ISA_TBM_UNSET OPTION_MASK_ISA_TBM
158 #define OPTION_MASK_ISA_POPCNT_UNSET OPTION_MASK_ISA_POPCNT
159 #define OPTION_MASK_ISA_CX16_UNSET OPTION_MASK_ISA_CX16
160 #define OPTION_MASK_ISA_SAHF_UNSET OPTION_MASK_ISA_SAHF
161 #define OPTION_MASK_ISA_MOVBE_UNSET OPTION_MASK_ISA_MOVBE
162 #define OPTION_MASK_ISA_CRC32_UNSET OPTION_MASK_ISA_CRC32
164 #define OPTION_MASK_ISA_FSGSBASE_UNSET OPTION_MASK_ISA_FSGSBASE
165 #define OPTION_MASK_ISA_RDRND_UNSET OPTION_MASK_ISA_RDRND
166 #define OPTION_MASK_ISA_F16C_UNSET OPTION_MASK_ISA_F16C
168 /* Implement TARGET_HANDLE_OPTION. */
170 bool
171 ix86_handle_option (struct gcc_options *opts,
172 struct gcc_options *opts_set ATTRIBUTE_UNUSED,
173 const struct cl_decoded_option *decoded,
174 location_t loc)
176 size_t code = decoded->opt_index;
177 int value = decoded->value;
179 switch (code)
181 case OPT_mmmx:
182 if (value)
184 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_MMX_SET;
185 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_MMX_SET;
187 else
189 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_MMX_UNSET;
190 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_MMX_UNSET;
192 return true;
194 case OPT_m3dnow:
195 if (value)
197 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_3DNOW_SET;
198 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_3DNOW_SET;
200 else
202 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_3DNOW_UNSET;
203 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_3DNOW_UNSET;
205 return true;
207 case OPT_m3dnowa:
208 return false;
210 case OPT_msse:
211 if (value)
213 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE_SET;
214 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE_SET;
216 else
218 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE_UNSET;
219 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE_UNSET;
221 return true;
223 case OPT_msse2:
224 if (value)
226 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE2_SET;
227 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE2_SET;
229 else
231 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE2_UNSET;
232 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE2_UNSET;
234 return true;
236 case OPT_msse3:
237 if (value)
239 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE3_SET;
240 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE3_SET;
242 else
244 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE3_UNSET;
245 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE3_UNSET;
247 return true;
249 case OPT_mssse3:
250 if (value)
252 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSSE3_SET;
253 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSSE3_SET;
255 else
257 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSSE3_UNSET;
258 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSSE3_UNSET;
260 return true;
262 case OPT_msse4_1:
263 if (value)
265 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE4_1_SET;
266 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_1_SET;
268 else
270 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4_1_UNSET;
271 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_1_UNSET;
273 return true;
275 case OPT_msse4_2:
276 if (value)
278 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE4_2_SET;
279 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_2_SET;
281 else
283 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4_2_UNSET;
284 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_2_UNSET;
286 return true;
288 case OPT_mavx:
289 if (value)
291 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_AVX_SET;
292 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX_SET;
294 else
296 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AVX_UNSET;
297 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX_UNSET;
299 return true;
301 case OPT_mavx2:
302 if (value)
304 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_AVX2_SET;
305 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX2_SET;
307 else
309 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AVX2_UNSET;
310 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX2_UNSET;
312 return true;
314 case OPT_mfma:
315 if (value)
317 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_FMA_SET;
318 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FMA_SET;
320 else
322 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_FMA_UNSET;
323 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FMA_UNSET;
325 return true;
327 case OPT_mrtm:
328 if (value)
330 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_RTM_SET;
331 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_RTM_SET;
333 else
335 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_RTM_UNSET;
336 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_RTM_UNSET;
338 return true;
340 case OPT_msse4:
341 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE4_SET;
342 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_SET;
343 return true;
345 case OPT_mno_sse4:
346 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4_UNSET;
347 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_UNSET;
348 return true;
350 case OPT_msse4a:
351 if (value)
353 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE4A_SET;
354 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4A_SET;
356 else
358 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4A_UNSET;
359 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4A_UNSET;
361 return true;
363 case OPT_mfma4:
364 if (value)
366 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_FMA4_SET;
367 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FMA4_SET;
369 else
371 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_FMA4_UNSET;
372 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FMA4_UNSET;
374 return true;
376 case OPT_mxop:
377 if (value)
379 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_XOP_SET;
380 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_XOP_SET;
382 else
384 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_XOP_UNSET;
385 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_XOP_UNSET;
387 return true;
389 case OPT_mlwp:
390 if (value)
392 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_LWP_SET;
393 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_LWP_SET;
395 else
397 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_LWP_UNSET;
398 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_LWP_UNSET;
400 return true;
402 case OPT_mabm:
403 if (value)
405 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_ABM_SET;
406 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_ABM_SET;
408 else
410 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_ABM_UNSET;
411 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_ABM_UNSET;
413 return true;
415 case OPT_mbmi:
416 if (value)
418 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_BMI_SET;
419 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_BMI_SET;
421 else
423 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_BMI_UNSET;
424 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_BMI_UNSET;
426 return true;
428 case OPT_mbmi2:
429 if (value)
431 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_BMI2_SET;
432 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_BMI2_SET;
434 else
436 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_BMI2_UNSET;
437 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_BMI2_UNSET;
439 return true;
441 case OPT_mtbm:
442 if (value)
444 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_TBM_SET;
445 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_TBM_SET;
447 else
449 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_TBM_UNSET;
450 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_TBM_UNSET;
452 return true;
454 case OPT_mpopcnt:
455 if (value)
457 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_POPCNT_SET;
458 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_POPCNT_SET;
460 else
462 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_POPCNT_UNSET;
463 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_POPCNT_UNSET;
465 return true;
467 case OPT_msahf:
468 if (value)
470 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SAHF_SET;
471 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SAHF_SET;
473 else
475 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SAHF_UNSET;
476 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SAHF_UNSET;
478 return true;
480 case OPT_mcx16:
481 if (value)
483 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_CX16_SET;
484 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_CX16_SET;
486 else
488 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_CX16_UNSET;
489 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_CX16_UNSET;
491 return true;
493 case OPT_mmovbe:
494 if (value)
496 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_MOVBE_SET;
497 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_MOVBE_SET;
499 else
501 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_MOVBE_UNSET;
502 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_MOVBE_UNSET;
504 return true;
506 case OPT_mcrc32:
507 if (value)
509 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_CRC32_SET;
510 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_CRC32_SET;
512 else
514 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_CRC32_UNSET;
515 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_CRC32_UNSET;
517 return true;
519 case OPT_maes:
520 if (value)
522 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_AES_SET;
523 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AES_SET;
525 else
527 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AES_UNSET;
528 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AES_UNSET;
530 return true;
532 case OPT_mpclmul:
533 if (value)
535 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_PCLMUL_SET;
536 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_PCLMUL_SET;
538 else
540 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_PCLMUL_UNSET;
541 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_PCLMUL_UNSET;
543 return true;
545 case OPT_mfsgsbase:
546 if (value)
548 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_FSGSBASE_SET;
549 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FSGSBASE_SET;
551 else
553 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_FSGSBASE_UNSET;
554 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FSGSBASE_UNSET;
556 return true;
558 case OPT_mrdrnd:
559 if (value)
561 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_RDRND_SET;
562 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_RDRND_SET;
564 else
566 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_RDRND_UNSET;
567 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_RDRND_UNSET;
569 return true;
571 case OPT_mf16c:
572 if (value)
574 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_F16C_SET;
575 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_F16C_SET;
577 else
579 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_F16C_UNSET;
580 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_F16C_UNSET;
582 return true;
584 case OPT_mfxsr:
585 if (value)
587 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_FXSR_SET;
588 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FXSR_SET;
590 else
592 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_FXSR_UNSET;
593 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FXSR_UNSET;
595 return true;
597 case OPT_mxsave:
598 if (value)
600 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_XSAVE_SET;
601 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_XSAVE_SET;
603 else
605 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_XSAVE_UNSET;
606 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_XSAVE_UNSET;
608 return true;
610 case OPT_mxsaveopt:
611 if (value)
613 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_XSAVEOPT_SET;
614 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_XSAVEOPT_SET;
616 else
618 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_XSAVEOPT_UNSET;
619 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_XSAVEOPT_UNSET;
621 return true;
623 case OPT_mrdseed:
624 if (value)
626 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_RDSEED_SET;
627 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_RDSEED_SET;
629 else
631 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_RDSEED_UNSET;
632 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_RDSEED_UNSET;
634 return true;
636 case OPT_mprfchw:
637 if (value)
639 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_PRFCHW_SET;
640 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_PRFCHW_SET;
642 else
644 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_PRFCHW_UNSET;
645 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_PRFCHW_UNSET;
647 return true;
649 case OPT_madx:
650 if (value)
652 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_ADX_SET;
653 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_ADX_SET;
655 else
657 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_ADX_UNSET;
658 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_ADX_UNSET;
660 return true;
662 /* Comes from final.c -- no real reason to change it. */
663 #define MAX_CODE_ALIGN 16
665 case OPT_malign_loops_:
666 warning_at (loc, 0, "-malign-loops is obsolete, use -falign-loops");
667 if (value > MAX_CODE_ALIGN)
668 error_at (loc, "-malign-loops=%d is not between 0 and %d",
669 value, MAX_CODE_ALIGN);
670 else
671 opts->x_align_loops = 1 << value;
672 return true;
674 case OPT_malign_jumps_:
675 warning_at (loc, 0, "-malign-jumps is obsolete, use -falign-jumps");
676 if (value > MAX_CODE_ALIGN)
677 error_at (loc, "-malign-jumps=%d is not between 0 and %d",
678 value, MAX_CODE_ALIGN);
679 else
680 opts->x_align_jumps = 1 << value;
681 return true;
683 case OPT_malign_functions_:
684 warning_at (loc, 0,
685 "-malign-functions is obsolete, use -falign-functions");
686 if (value > MAX_CODE_ALIGN)
687 error_at (loc, "-malign-functions=%d is not between 0 and %d",
688 value, MAX_CODE_ALIGN);
689 else
690 opts->x_align_functions = 1 << value;
691 return true;
693 case OPT_mbranch_cost_:
694 if (value > 5)
696 error_at (loc, "-mbranch-cost=%d is not between 0 and 5", value);
697 opts->x_ix86_branch_cost = 5;
699 return true;
701 default:
702 return true;
706 static const struct default_options ix86_option_optimization_table[] =
708 /* Enable redundant extension instructions removal at -O2 and higher. */
709 { OPT_LEVELS_2_PLUS, OPT_free, NULL, 1 },
710 /* Turn off -fschedule-insns by default. It tends to make the
711 problem with not enough registers even worse. */
712 { OPT_LEVELS_ALL, OPT_fschedule_insns, NULL, 0 },
714 #ifdef SUBTARGET_OPTIMIZATION_OPTIONS
715 SUBTARGET_OPTIMIZATION_OPTIONS,
716 #endif
717 { OPT_LEVELS_NONE, 0, NULL, 0 }
720 /* Implement TARGET_OPTION_INIT_STRUCT. */
722 static void
723 ix86_option_init_struct (struct gcc_options *opts)
725 if (TARGET_MACHO)
726 /* The Darwin libraries never set errno, so we might as well
727 avoid calling them when that's the only reason we would. */
728 opts->x_flag_errno_math = 0;
730 opts->x_flag_pcc_struct_return = 2;
731 opts->x_flag_asynchronous_unwind_tables = 2;
734 /* On the x86 -fsplit-stack and -fstack-protector both use the same
735 field in the TCB, so they can not be used together. */
737 static bool
738 ix86_supports_split_stack (bool report ATTRIBUTE_UNUSED,
739 struct gcc_options *opts ATTRIBUTE_UNUSED)
741 bool ret = true;
743 #ifndef TARGET_THREAD_SPLIT_STACK_OFFSET
744 if (report)
745 error ("%<-fsplit-stack%> currently only supported on GNU/Linux");
746 ret = false;
747 #else
748 if (!HAVE_GAS_CFI_PERSONALITY_DIRECTIVE)
750 if (report)
751 error ("%<-fsplit-stack%> requires "
752 "assembler support for CFI directives");
753 ret = false;
755 #endif
757 return ret;
760 /* Implement TARGET_EXCEPT_UNWIND_INFO. */
762 static enum unwind_info_type
763 i386_except_unwind_info (struct gcc_options *opts)
765 /* Honor the --enable-sjlj-exceptions configure switch. */
766 #ifdef CONFIG_SJLJ_EXCEPTIONS
767 if (CONFIG_SJLJ_EXCEPTIONS)
768 return UI_SJLJ;
769 #endif
771 /* On windows 64, prefer SEH exceptions over anything else. */
772 if (TARGET_64BIT && DEFAULT_ABI == MS_ABI && opts->x_flag_unwind_tables)
773 return UI_SEH;
775 if (DWARF2_UNWIND_INFO)
776 return UI_DWARF2;
778 return UI_SJLJ;
781 #undef TARGET_EXCEPT_UNWIND_INFO
782 #define TARGET_EXCEPT_UNWIND_INFO i386_except_unwind_info
784 #undef TARGET_DEFAULT_TARGET_FLAGS
785 #define TARGET_DEFAULT_TARGET_FLAGS \
786 (TARGET_DEFAULT \
787 | TARGET_SUBTARGET_DEFAULT \
788 | TARGET_TLS_DIRECT_SEG_REFS_DEFAULT)
790 #undef TARGET_HANDLE_OPTION
791 #define TARGET_HANDLE_OPTION ix86_handle_option
793 #undef TARGET_OPTION_OPTIMIZATION_TABLE
794 #define TARGET_OPTION_OPTIMIZATION_TABLE ix86_option_optimization_table
795 #undef TARGET_OPTION_INIT_STRUCT
796 #define TARGET_OPTION_INIT_STRUCT ix86_option_init_struct
798 #undef TARGET_SUPPORTS_SPLIT_STACK
799 #define TARGET_SUPPORTS_SPLIT_STACK ix86_supports_split_stack
801 struct gcc_targetm_common targetm_common = TARGETM_COMMON_INITIALIZER;