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)
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/>. */
22 #include "coretypes.h"
23 #include "diagnostic-core.h"
26 #include "common/common-target.h"
27 #include "common/common-target-def.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
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 \
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
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. */
171 ix86_handle_option (struct gcc_options
*opts
,
172 struct gcc_options
*opts_set ATTRIBUTE_UNUSED
,
173 const struct cl_decoded_option
*decoded
,
176 size_t code
= decoded
->opt_index
;
177 int value
= decoded
->value
;
184 opts
->x_ix86_isa_flags
|= OPTION_MASK_ISA_MMX_SET
;
185 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_MMX_SET
;
189 opts
->x_ix86_isa_flags
&= ~OPTION_MASK_ISA_MMX_UNSET
;
190 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_MMX_UNSET
;
197 opts
->x_ix86_isa_flags
|= OPTION_MASK_ISA_3DNOW_SET
;
198 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_3DNOW_SET
;
202 opts
->x_ix86_isa_flags
&= ~OPTION_MASK_ISA_3DNOW_UNSET
;
203 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_3DNOW_UNSET
;
213 opts
->x_ix86_isa_flags
|= OPTION_MASK_ISA_SSE_SET
;
214 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_SSE_SET
;
218 opts
->x_ix86_isa_flags
&= ~OPTION_MASK_ISA_SSE_UNSET
;
219 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_SSE_UNSET
;
226 opts
->x_ix86_isa_flags
|= OPTION_MASK_ISA_SSE2_SET
;
227 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_SSE2_SET
;
231 opts
->x_ix86_isa_flags
&= ~OPTION_MASK_ISA_SSE2_UNSET
;
232 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_SSE2_UNSET
;
239 opts
->x_ix86_isa_flags
|= OPTION_MASK_ISA_SSE3_SET
;
240 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_SSE3_SET
;
244 opts
->x_ix86_isa_flags
&= ~OPTION_MASK_ISA_SSE3_UNSET
;
245 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_SSE3_UNSET
;
252 opts
->x_ix86_isa_flags
|= OPTION_MASK_ISA_SSSE3_SET
;
253 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_SSSE3_SET
;
257 opts
->x_ix86_isa_flags
&= ~OPTION_MASK_ISA_SSSE3_UNSET
;
258 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_SSSE3_UNSET
;
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
;
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
;
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
;
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
;
291 opts
->x_ix86_isa_flags
|= OPTION_MASK_ISA_AVX_SET
;
292 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_AVX_SET
;
296 opts
->x_ix86_isa_flags
&= ~OPTION_MASK_ISA_AVX_UNSET
;
297 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_AVX_UNSET
;
304 opts
->x_ix86_isa_flags
|= OPTION_MASK_ISA_AVX2_SET
;
305 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_AVX2_SET
;
309 opts
->x_ix86_isa_flags
&= ~OPTION_MASK_ISA_AVX2_UNSET
;
310 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_AVX2_UNSET
;
317 opts
->x_ix86_isa_flags
|= OPTION_MASK_ISA_FMA_SET
;
318 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_FMA_SET
;
322 opts
->x_ix86_isa_flags
&= ~OPTION_MASK_ISA_FMA_UNSET
;
323 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_FMA_UNSET
;
330 opts
->x_ix86_isa_flags
|= OPTION_MASK_ISA_RTM_SET
;
331 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_RTM_SET
;
335 opts
->x_ix86_isa_flags
&= ~OPTION_MASK_ISA_RTM_UNSET
;
336 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_RTM_UNSET
;
341 opts
->x_ix86_isa_flags
|= OPTION_MASK_ISA_SSE4_SET
;
342 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_SSE4_SET
;
346 opts
->x_ix86_isa_flags
&= ~OPTION_MASK_ISA_SSE4_UNSET
;
347 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_SSE4_UNSET
;
353 opts
->x_ix86_isa_flags
|= OPTION_MASK_ISA_SSE4A_SET
;
354 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_SSE4A_SET
;
358 opts
->x_ix86_isa_flags
&= ~OPTION_MASK_ISA_SSE4A_UNSET
;
359 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_SSE4A_UNSET
;
366 opts
->x_ix86_isa_flags
|= OPTION_MASK_ISA_FMA4_SET
;
367 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_FMA4_SET
;
371 opts
->x_ix86_isa_flags
&= ~OPTION_MASK_ISA_FMA4_UNSET
;
372 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_FMA4_UNSET
;
379 opts
->x_ix86_isa_flags
|= OPTION_MASK_ISA_XOP_SET
;
380 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_XOP_SET
;
384 opts
->x_ix86_isa_flags
&= ~OPTION_MASK_ISA_XOP_UNSET
;
385 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_XOP_UNSET
;
392 opts
->x_ix86_isa_flags
|= OPTION_MASK_ISA_LWP_SET
;
393 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_LWP_SET
;
397 opts
->x_ix86_isa_flags
&= ~OPTION_MASK_ISA_LWP_UNSET
;
398 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_LWP_UNSET
;
405 opts
->x_ix86_isa_flags
|= OPTION_MASK_ISA_ABM_SET
;
406 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_ABM_SET
;
410 opts
->x_ix86_isa_flags
&= ~OPTION_MASK_ISA_ABM_UNSET
;
411 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_ABM_UNSET
;
418 opts
->x_ix86_isa_flags
|= OPTION_MASK_ISA_BMI_SET
;
419 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_BMI_SET
;
423 opts
->x_ix86_isa_flags
&= ~OPTION_MASK_ISA_BMI_UNSET
;
424 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_BMI_UNSET
;
431 opts
->x_ix86_isa_flags
|= OPTION_MASK_ISA_BMI2_SET
;
432 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_BMI2_SET
;
436 opts
->x_ix86_isa_flags
&= ~OPTION_MASK_ISA_BMI2_UNSET
;
437 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_BMI2_UNSET
;
444 opts
->x_ix86_isa_flags
|= OPTION_MASK_ISA_TBM_SET
;
445 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_TBM_SET
;
449 opts
->x_ix86_isa_flags
&= ~OPTION_MASK_ISA_TBM_UNSET
;
450 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_TBM_UNSET
;
457 opts
->x_ix86_isa_flags
|= OPTION_MASK_ISA_POPCNT_SET
;
458 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_POPCNT_SET
;
462 opts
->x_ix86_isa_flags
&= ~OPTION_MASK_ISA_POPCNT_UNSET
;
463 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_POPCNT_UNSET
;
470 opts
->x_ix86_isa_flags
|= OPTION_MASK_ISA_SAHF_SET
;
471 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_SAHF_SET
;
475 opts
->x_ix86_isa_flags
&= ~OPTION_MASK_ISA_SAHF_UNSET
;
476 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_SAHF_UNSET
;
483 opts
->x_ix86_isa_flags
|= OPTION_MASK_ISA_CX16_SET
;
484 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_CX16_SET
;
488 opts
->x_ix86_isa_flags
&= ~OPTION_MASK_ISA_CX16_UNSET
;
489 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_CX16_UNSET
;
496 opts
->x_ix86_isa_flags
|= OPTION_MASK_ISA_MOVBE_SET
;
497 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_MOVBE_SET
;
501 opts
->x_ix86_isa_flags
&= ~OPTION_MASK_ISA_MOVBE_UNSET
;
502 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_MOVBE_UNSET
;
509 opts
->x_ix86_isa_flags
|= OPTION_MASK_ISA_CRC32_SET
;
510 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_CRC32_SET
;
514 opts
->x_ix86_isa_flags
&= ~OPTION_MASK_ISA_CRC32_UNSET
;
515 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_CRC32_UNSET
;
522 opts
->x_ix86_isa_flags
|= OPTION_MASK_ISA_AES_SET
;
523 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_AES_SET
;
527 opts
->x_ix86_isa_flags
&= ~OPTION_MASK_ISA_AES_UNSET
;
528 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_AES_UNSET
;
535 opts
->x_ix86_isa_flags
|= OPTION_MASK_ISA_PCLMUL_SET
;
536 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_PCLMUL_SET
;
540 opts
->x_ix86_isa_flags
&= ~OPTION_MASK_ISA_PCLMUL_UNSET
;
541 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_PCLMUL_UNSET
;
548 opts
->x_ix86_isa_flags
|= OPTION_MASK_ISA_FSGSBASE_SET
;
549 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_FSGSBASE_SET
;
553 opts
->x_ix86_isa_flags
&= ~OPTION_MASK_ISA_FSGSBASE_UNSET
;
554 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_FSGSBASE_UNSET
;
561 opts
->x_ix86_isa_flags
|= OPTION_MASK_ISA_RDRND_SET
;
562 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_RDRND_SET
;
566 opts
->x_ix86_isa_flags
&= ~OPTION_MASK_ISA_RDRND_UNSET
;
567 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_RDRND_UNSET
;
574 opts
->x_ix86_isa_flags
|= OPTION_MASK_ISA_F16C_SET
;
575 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_F16C_SET
;
579 opts
->x_ix86_isa_flags
&= ~OPTION_MASK_ISA_F16C_UNSET
;
580 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_F16C_UNSET
;
587 opts
->x_ix86_isa_flags
|= OPTION_MASK_ISA_FXSR_SET
;
588 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_FXSR_SET
;
592 opts
->x_ix86_isa_flags
&= ~OPTION_MASK_ISA_FXSR_UNSET
;
593 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_FXSR_UNSET
;
600 opts
->x_ix86_isa_flags
|= OPTION_MASK_ISA_XSAVE_SET
;
601 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_XSAVE_SET
;
605 opts
->x_ix86_isa_flags
&= ~OPTION_MASK_ISA_XSAVE_UNSET
;
606 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_XSAVE_UNSET
;
613 opts
->x_ix86_isa_flags
|= OPTION_MASK_ISA_XSAVEOPT_SET
;
614 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_XSAVEOPT_SET
;
618 opts
->x_ix86_isa_flags
&= ~OPTION_MASK_ISA_XSAVEOPT_UNSET
;
619 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_XSAVEOPT_UNSET
;
626 opts
->x_ix86_isa_flags
|= OPTION_MASK_ISA_RDSEED_SET
;
627 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_RDSEED_SET
;
631 opts
->x_ix86_isa_flags
&= ~OPTION_MASK_ISA_RDSEED_UNSET
;
632 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_RDSEED_UNSET
;
639 opts
->x_ix86_isa_flags
|= OPTION_MASK_ISA_PRFCHW_SET
;
640 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_PRFCHW_SET
;
644 opts
->x_ix86_isa_flags
&= ~OPTION_MASK_ISA_PRFCHW_UNSET
;
645 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_PRFCHW_UNSET
;
652 opts
->x_ix86_isa_flags
|= OPTION_MASK_ISA_ADX_SET
;
653 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_ADX_SET
;
657 opts
->x_ix86_isa_flags
&= ~OPTION_MASK_ISA_ADX_UNSET
;
658 opts
->x_ix86_isa_flags_explicit
|= OPTION_MASK_ISA_ADX_UNSET
;
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
);
671 opts
->x_align_loops
= 1 << value
;
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
);
680 opts
->x_align_jumps
= 1 << value
;
683 case OPT_malign_functions_
:
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
);
690 opts
->x_align_functions
= 1 << value
;
693 case OPT_mbranch_cost_
:
696 error_at (loc
, "-mbranch-cost=%d is not between 0 and 5", value
);
697 opts
->x_ix86_branch_cost
= 5;
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
,
717 { OPT_LEVELS_NONE
, 0, NULL
, 0 }
720 /* Implement TARGET_OPTION_INIT_STRUCT. */
723 ix86_option_init_struct (struct gcc_options
*opts
)
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. */
738 ix86_supports_split_stack (bool report ATTRIBUTE_UNUSED
,
739 struct gcc_options
*opts ATTRIBUTE_UNUSED
)
743 #ifndef TARGET_THREAD_SPLIT_STACK_OFFSET
745 error ("%<-fsplit-stack%> currently only supported on GNU/Linux");
748 if (!HAVE_GAS_CFI_PERSONALITY_DIRECTIVE
)
751 error ("%<-fsplit-stack%> requires "
752 "assembler support for CFI directives");
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
)
771 /* On windows 64, prefer SEH exceptions over anything else. */
772 if (TARGET_64BIT
&& DEFAULT_ABI
== MS_ABI
&& opts
->x_flag_unwind_tables
)
775 if (DWARF2_UNWIND_INFO
)
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 \
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
;