gcc/
[official-gcc.git] / gcc / common / config / i386 / i386-common.c
blobda47e644b43d055e9b9855428f6df31b16628e9a
1 /* IA-32 common hooks.
2 Copyright (C) 1988-2014 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_AVX512F_SET \
61 (OPTION_MASK_ISA_AVX512F | OPTION_MASK_ISA_AVX2_SET)
62 #define OPTION_MASK_ISA_AVX512CD_SET \
63 (OPTION_MASK_ISA_AVX512CD | OPTION_MASK_ISA_AVX512F_SET)
64 #define OPTION_MASK_ISA_AVX512PF_SET \
65 (OPTION_MASK_ISA_AVX512PF | OPTION_MASK_ISA_AVX512F_SET)
66 #define OPTION_MASK_ISA_AVX512ER_SET \
67 (OPTION_MASK_ISA_AVX512ER | OPTION_MASK_ISA_AVX512F_SET)
68 #define OPTION_MASK_ISA_AVX512DQ_SET \
69 (OPTION_MASK_ISA_AVX512DQ | OPTION_MASK_ISA_AVX512F_SET)
70 #define OPTION_MASK_ISA_AVX512BW_SET \
71 (OPTION_MASK_ISA_AVX512BW | OPTION_MASK_ISA_AVX512F_SET)
72 #define OPTION_MASK_ISA_AVX512VL_SET \
73 (OPTION_MASK_ISA_AVX512VL | OPTION_MASK_ISA_AVX512F_SET)
74 #define OPTION_MASK_ISA_RTM_SET OPTION_MASK_ISA_RTM
75 #define OPTION_MASK_ISA_PRFCHW_SET OPTION_MASK_ISA_PRFCHW
76 #define OPTION_MASK_ISA_RDSEED_SET OPTION_MASK_ISA_RDSEED
77 #define OPTION_MASK_ISA_ADX_SET OPTION_MASK_ISA_ADX
78 #define OPTION_MASK_ISA_PREFETCHWT1_SET OPTION_MASK_ISA_PREFETCHWT1
79 #define OPTION_MASK_ISA_CLFLUSHOPT_SET OPTION_MASK_ISA_CLFLUSHOPT
80 #define OPTION_MASK_ISA_XSAVES_SET \
81 (OPTION_MASK_ISA_XSAVES | OPTION_MASK_ISA_XSAVE)
82 #define OPTION_MASK_ISA_XSAVEC_SET \
83 (OPTION_MASK_ISA_XSAVEC | OPTION_MASK_ISA_XSAVE)
85 /* SSE4 includes both SSE4.1 and SSE4.2. -msse4 should be the same
86 as -msse4.2. */
87 #define OPTION_MASK_ISA_SSE4_SET OPTION_MASK_ISA_SSE4_2_SET
89 #define OPTION_MASK_ISA_SSE4A_SET \
90 (OPTION_MASK_ISA_SSE4A | OPTION_MASK_ISA_SSE3_SET)
91 #define OPTION_MASK_ISA_FMA4_SET \
92 (OPTION_MASK_ISA_FMA4 | OPTION_MASK_ISA_SSE4A_SET \
93 | OPTION_MASK_ISA_AVX_SET)
94 #define OPTION_MASK_ISA_XOP_SET \
95 (OPTION_MASK_ISA_XOP | OPTION_MASK_ISA_FMA4_SET)
96 #define OPTION_MASK_ISA_LWP_SET \
97 OPTION_MASK_ISA_LWP
99 /* AES, SHA and PCLMUL need SSE2 because they use xmm registers. */
100 #define OPTION_MASK_ISA_AES_SET \
101 (OPTION_MASK_ISA_AES | OPTION_MASK_ISA_SSE2_SET)
102 #define OPTION_MASK_ISA_SHA_SET \
103 (OPTION_MASK_ISA_SHA | OPTION_MASK_ISA_SSE2_SET)
104 #define OPTION_MASK_ISA_PCLMUL_SET \
105 (OPTION_MASK_ISA_PCLMUL | OPTION_MASK_ISA_SSE2_SET)
107 #define OPTION_MASK_ISA_ABM_SET \
108 (OPTION_MASK_ISA_ABM | OPTION_MASK_ISA_POPCNT)
110 #define OPTION_MASK_ISA_BMI_SET OPTION_MASK_ISA_BMI
111 #define OPTION_MASK_ISA_BMI2_SET OPTION_MASK_ISA_BMI2
112 #define OPTION_MASK_ISA_LZCNT_SET OPTION_MASK_ISA_LZCNT
113 #define OPTION_MASK_ISA_TBM_SET OPTION_MASK_ISA_TBM
114 #define OPTION_MASK_ISA_POPCNT_SET OPTION_MASK_ISA_POPCNT
115 #define OPTION_MASK_ISA_CX16_SET OPTION_MASK_ISA_CX16
116 #define OPTION_MASK_ISA_SAHF_SET OPTION_MASK_ISA_SAHF
117 #define OPTION_MASK_ISA_MOVBE_SET OPTION_MASK_ISA_MOVBE
118 #define OPTION_MASK_ISA_CRC32_SET OPTION_MASK_ISA_CRC32
120 #define OPTION_MASK_ISA_FSGSBASE_SET OPTION_MASK_ISA_FSGSBASE
121 #define OPTION_MASK_ISA_RDRND_SET OPTION_MASK_ISA_RDRND
122 #define OPTION_MASK_ISA_F16C_SET \
123 (OPTION_MASK_ISA_F16C | OPTION_MASK_ISA_AVX_SET)
125 /* Define a set of ISAs which aren't available when a given ISA is
126 disabled. MMX and SSE ISAs are handled separately. */
128 #define OPTION_MASK_ISA_MMX_UNSET \
129 (OPTION_MASK_ISA_MMX | OPTION_MASK_ISA_3DNOW_UNSET)
130 #define OPTION_MASK_ISA_3DNOW_UNSET \
131 (OPTION_MASK_ISA_3DNOW | OPTION_MASK_ISA_3DNOW_A_UNSET)
132 #define OPTION_MASK_ISA_3DNOW_A_UNSET OPTION_MASK_ISA_3DNOW_A
134 #define OPTION_MASK_ISA_SSE_UNSET \
135 (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_SSE2_UNSET)
136 #define OPTION_MASK_ISA_SSE2_UNSET \
137 (OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_SSE3_UNSET)
138 #define OPTION_MASK_ISA_SSE3_UNSET \
139 (OPTION_MASK_ISA_SSE3 \
140 | OPTION_MASK_ISA_SSSE3_UNSET \
141 | OPTION_MASK_ISA_SSE4A_UNSET )
142 #define OPTION_MASK_ISA_SSSE3_UNSET \
143 (OPTION_MASK_ISA_SSSE3 | OPTION_MASK_ISA_SSE4_1_UNSET)
144 #define OPTION_MASK_ISA_SSE4_1_UNSET \
145 (OPTION_MASK_ISA_SSE4_1 | OPTION_MASK_ISA_SSE4_2_UNSET)
146 #define OPTION_MASK_ISA_SSE4_2_UNSET \
147 (OPTION_MASK_ISA_SSE4_2 | OPTION_MASK_ISA_AVX_UNSET )
148 #define OPTION_MASK_ISA_AVX_UNSET \
149 (OPTION_MASK_ISA_AVX | OPTION_MASK_ISA_FMA_UNSET \
150 | OPTION_MASK_ISA_FMA4_UNSET | OPTION_MASK_ISA_F16C_UNSET \
151 | OPTION_MASK_ISA_AVX2_UNSET | OPTION_MASK_ISA_XSAVE_UNSET)
152 #define OPTION_MASK_ISA_FMA_UNSET OPTION_MASK_ISA_FMA
153 #define OPTION_MASK_ISA_FXSR_UNSET OPTION_MASK_ISA_FXSR
154 #define OPTION_MASK_ISA_XSAVE_UNSET \
155 (OPTION_MASK_ISA_XSAVE | OPTION_MASK_ISA_XSAVEOPT_UNSET)
156 #define OPTION_MASK_ISA_XSAVEOPT_UNSET OPTION_MASK_ISA_XSAVEOPT
157 #define OPTION_MASK_ISA_AVX2_UNSET \
158 (OPTION_MASK_ISA_AVX2 | OPTION_MASK_ISA_AVX512F_UNSET)
159 #define OPTION_MASK_ISA_AVX512F_UNSET \
160 (OPTION_MASK_ISA_AVX512F | OPTION_MASK_ISA_AVX512CD_UNSET \
161 | OPTION_MASK_ISA_AVX512PF_UNSET | OPTION_MASK_ISA_AVX512ER_UNSET \
162 | OPTION_MASK_ISA_AVX512DQ_UNSET | OPTION_MASK_ISA_AVX512BW_UNSET \
163 | OPTION_MASK_ISA_AVX512VL_UNSET)
164 #define OPTION_MASK_ISA_AVX512CD_UNSET OPTION_MASK_ISA_AVX512CD
165 #define OPTION_MASK_ISA_AVX512PF_UNSET OPTION_MASK_ISA_AVX512PF
166 #define OPTION_MASK_ISA_AVX512ER_UNSET OPTION_MASK_ISA_AVX512ER
167 #define OPTION_MASK_ISA_AVX512DQ_UNSET OPTION_MASK_ISA_AVX512DQ
168 #define OPTION_MASK_ISA_AVX512BW_UNSET OPTION_MASK_ISA_AVX512BW
169 #define OPTION_MASK_ISA_AVX512VL_UNSET OPTION_MASK_ISA_AVX512VL
170 #define OPTION_MASK_ISA_RTM_UNSET OPTION_MASK_ISA_RTM
171 #define OPTION_MASK_ISA_PRFCHW_UNSET OPTION_MASK_ISA_PRFCHW
172 #define OPTION_MASK_ISA_RDSEED_UNSET OPTION_MASK_ISA_RDSEED
173 #define OPTION_MASK_ISA_ADX_UNSET OPTION_MASK_ISA_ADX
174 #define OPTION_MASK_ISA_PREFETCHWT1_UNSET OPTION_MASK_ISA_PREFETCHWT1
175 #define OPTION_MASK_ISA_CLFLUSHOPT_UNSET OPTION_MASK_ISA_CLFLUSHOPT
176 #define OPTION_MASK_ISA_XSAVEC_UNSET OPTION_MASK_ISA_XSAVEC
177 #define OPTION_MASK_ISA_XSAVES_UNSET OPTION_MASK_ISA_XSAVES
179 /* SSE4 includes both SSE4.1 and SSE4.2. -mno-sse4 should the same
180 as -mno-sse4.1. */
181 #define OPTION_MASK_ISA_SSE4_UNSET OPTION_MASK_ISA_SSE4_1_UNSET
183 #define OPTION_MASK_ISA_SSE4A_UNSET \
184 (OPTION_MASK_ISA_SSE4A | OPTION_MASK_ISA_FMA4_UNSET)
186 #define OPTION_MASK_ISA_FMA4_UNSET \
187 (OPTION_MASK_ISA_FMA4 | OPTION_MASK_ISA_XOP_UNSET)
188 #define OPTION_MASK_ISA_XOP_UNSET OPTION_MASK_ISA_XOP
189 #define OPTION_MASK_ISA_LWP_UNSET OPTION_MASK_ISA_LWP
191 #define OPTION_MASK_ISA_AES_UNSET OPTION_MASK_ISA_AES
192 #define OPTION_MASK_ISA_SHA_UNSET OPTION_MASK_ISA_SHA
193 #define OPTION_MASK_ISA_PCLMUL_UNSET OPTION_MASK_ISA_PCLMUL
194 #define OPTION_MASK_ISA_ABM_UNSET OPTION_MASK_ISA_ABM
195 #define OPTION_MASK_ISA_BMI_UNSET OPTION_MASK_ISA_BMI
196 #define OPTION_MASK_ISA_BMI2_UNSET OPTION_MASK_ISA_BMI2
197 #define OPTION_MASK_ISA_LZCNT_UNSET OPTION_MASK_ISA_LZCNT
198 #define OPTION_MASK_ISA_TBM_UNSET OPTION_MASK_ISA_TBM
199 #define OPTION_MASK_ISA_POPCNT_UNSET OPTION_MASK_ISA_POPCNT
200 #define OPTION_MASK_ISA_CX16_UNSET OPTION_MASK_ISA_CX16
201 #define OPTION_MASK_ISA_SAHF_UNSET OPTION_MASK_ISA_SAHF
202 #define OPTION_MASK_ISA_MOVBE_UNSET OPTION_MASK_ISA_MOVBE
203 #define OPTION_MASK_ISA_CRC32_UNSET OPTION_MASK_ISA_CRC32
205 #define OPTION_MASK_ISA_FSGSBASE_UNSET OPTION_MASK_ISA_FSGSBASE
206 #define OPTION_MASK_ISA_RDRND_UNSET OPTION_MASK_ISA_RDRND
207 #define OPTION_MASK_ISA_F16C_UNSET OPTION_MASK_ISA_F16C
209 /* Implement TARGET_HANDLE_OPTION. */
211 bool
212 ix86_handle_option (struct gcc_options *opts,
213 struct gcc_options *opts_set ATTRIBUTE_UNUSED,
214 const struct cl_decoded_option *decoded,
215 location_t loc)
217 size_t code = decoded->opt_index;
218 int value = decoded->value;
220 switch (code)
222 case OPT_mmmx:
223 if (value)
225 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_MMX_SET;
226 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_MMX_SET;
228 else
230 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_MMX_UNSET;
231 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_MMX_UNSET;
233 return true;
235 case OPT_m3dnow:
236 if (value)
238 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_3DNOW_SET;
239 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_3DNOW_SET;
241 else
243 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_3DNOW_UNSET;
244 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_3DNOW_UNSET;
246 return true;
248 case OPT_m3dnowa:
249 return false;
251 case OPT_msse:
252 if (value)
254 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE_SET;
255 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE_SET;
257 else
259 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE_UNSET;
260 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE_UNSET;
262 return true;
264 case OPT_msse2:
265 if (value)
267 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE2_SET;
268 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE2_SET;
270 else
272 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE2_UNSET;
273 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE2_UNSET;
275 return true;
277 case OPT_msse3:
278 if (value)
280 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE3_SET;
281 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE3_SET;
283 else
285 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE3_UNSET;
286 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE3_UNSET;
288 return true;
290 case OPT_mssse3:
291 if (value)
293 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSSE3_SET;
294 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSSE3_SET;
296 else
298 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSSE3_UNSET;
299 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSSE3_UNSET;
301 return true;
303 case OPT_msse4_1:
304 if (value)
306 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE4_1_SET;
307 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_1_SET;
309 else
311 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4_1_UNSET;
312 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_1_UNSET;
314 return true;
316 case OPT_msse4_2:
317 if (value)
319 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE4_2_SET;
320 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_2_SET;
322 else
324 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4_2_UNSET;
325 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_2_UNSET;
327 return true;
329 case OPT_mavx:
330 if (value)
332 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_AVX_SET;
333 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX_SET;
335 else
337 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AVX_UNSET;
338 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX_UNSET;
340 return true;
342 case OPT_mavx2:
343 if (value)
345 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_AVX2_SET;
346 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX2_SET;
348 else
350 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AVX2_UNSET;
351 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX2_UNSET;
353 return true;
355 case OPT_mavx512f:
356 if (value)
358 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_AVX512F_SET;
359 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512F_SET;
361 else
363 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AVX512F_UNSET;
364 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512F_UNSET;
366 return true;
368 case OPT_mavx512cd:
369 if (value)
371 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_AVX512CD_SET;
372 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512CD_SET;
374 else
376 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AVX512CD_UNSET;
377 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512CD_UNSET;
379 return true;
381 case OPT_mavx512pf:
382 if (value)
384 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_AVX512PF_SET;
385 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512PF_SET;
387 else
389 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AVX512PF_UNSET;
390 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512PF_UNSET;
392 return true;
394 case OPT_mavx512er:
395 if (value)
397 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_AVX512ER_SET;
398 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512ER_SET;
400 else
402 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AVX512ER_UNSET;
403 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512ER_UNSET;
405 return true;
407 case OPT_mavx512dq:
408 if (value)
410 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_AVX512DQ_SET;
411 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512DQ_SET;
413 else
415 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AVX512DQ_UNSET;
416 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512DQ_UNSET;
418 return true;
420 case OPT_mavx512bw:
421 if (value)
423 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_AVX512BW_SET;
424 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512BW_SET;
426 else
428 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AVX512BW_UNSET;
429 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512BW_UNSET;
431 return true;
433 case OPT_mavx512vl:
434 if (value)
436 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_AVX512VL_SET;
437 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512VL_SET;
439 else
441 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AVX512VL_UNSET;
442 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512VL_UNSET;
444 return true;
446 case OPT_mfma:
447 if (value)
449 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_FMA_SET;
450 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FMA_SET;
452 else
454 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_FMA_UNSET;
455 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FMA_UNSET;
457 return true;
459 case OPT_mrtm:
460 if (value)
462 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_RTM_SET;
463 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_RTM_SET;
465 else
467 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_RTM_UNSET;
468 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_RTM_UNSET;
470 return true;
472 case OPT_msse4:
473 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE4_SET;
474 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_SET;
475 return true;
477 case OPT_mno_sse4:
478 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4_UNSET;
479 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_UNSET;
480 return true;
482 case OPT_msse4a:
483 if (value)
485 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE4A_SET;
486 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4A_SET;
488 else
490 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4A_UNSET;
491 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4A_UNSET;
493 return true;
495 case OPT_mfma4:
496 if (value)
498 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_FMA4_SET;
499 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FMA4_SET;
501 else
503 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_FMA4_UNSET;
504 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FMA4_UNSET;
506 return true;
508 case OPT_mxop:
509 if (value)
511 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_XOP_SET;
512 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_XOP_SET;
514 else
516 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_XOP_UNSET;
517 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_XOP_UNSET;
519 return true;
521 case OPT_mlwp:
522 if (value)
524 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_LWP_SET;
525 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_LWP_SET;
527 else
529 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_LWP_UNSET;
530 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_LWP_UNSET;
532 return true;
534 case OPT_mabm:
535 if (value)
537 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_ABM_SET;
538 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_ABM_SET;
540 else
542 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_ABM_UNSET;
543 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_ABM_UNSET;
545 return true;
547 case OPT_mbmi:
548 if (value)
550 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_BMI_SET;
551 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_BMI_SET;
553 else
555 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_BMI_UNSET;
556 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_BMI_UNSET;
558 return true;
560 case OPT_mbmi2:
561 if (value)
563 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_BMI2_SET;
564 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_BMI2_SET;
566 else
568 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_BMI2_UNSET;
569 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_BMI2_UNSET;
571 return true;
573 case OPT_mlzcnt:
574 if (value)
576 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_LZCNT_SET;
577 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_LZCNT_SET;
579 else
581 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_LZCNT_UNSET;
582 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_LZCNT_UNSET;
584 return true;
586 case OPT_mtbm:
587 if (value)
589 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_TBM_SET;
590 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_TBM_SET;
592 else
594 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_TBM_UNSET;
595 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_TBM_UNSET;
597 return true;
599 case OPT_mpopcnt:
600 if (value)
602 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_POPCNT_SET;
603 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_POPCNT_SET;
605 else
607 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_POPCNT_UNSET;
608 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_POPCNT_UNSET;
610 return true;
612 case OPT_msahf:
613 if (value)
615 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SAHF_SET;
616 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SAHF_SET;
618 else
620 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SAHF_UNSET;
621 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SAHF_UNSET;
623 return true;
625 case OPT_mcx16:
626 if (value)
628 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_CX16_SET;
629 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_CX16_SET;
631 else
633 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_CX16_UNSET;
634 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_CX16_UNSET;
636 return true;
638 case OPT_mmovbe:
639 if (value)
641 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_MOVBE_SET;
642 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_MOVBE_SET;
644 else
646 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_MOVBE_UNSET;
647 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_MOVBE_UNSET;
649 return true;
651 case OPT_mcrc32:
652 if (value)
654 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_CRC32_SET;
655 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_CRC32_SET;
657 else
659 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_CRC32_UNSET;
660 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_CRC32_UNSET;
662 return true;
664 case OPT_maes:
665 if (value)
667 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_AES_SET;
668 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AES_SET;
670 else
672 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AES_UNSET;
673 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AES_UNSET;
675 return true;
677 case OPT_msha:
678 if (value)
680 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SHA_SET;
681 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SHA_SET;
683 else
685 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SHA_UNSET;
686 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SHA_UNSET;
688 return true;
690 case OPT_mpclmul:
691 if (value)
693 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_PCLMUL_SET;
694 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_PCLMUL_SET;
696 else
698 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_PCLMUL_UNSET;
699 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_PCLMUL_UNSET;
701 return true;
703 case OPT_mfsgsbase:
704 if (value)
706 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_FSGSBASE_SET;
707 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FSGSBASE_SET;
709 else
711 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_FSGSBASE_UNSET;
712 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FSGSBASE_UNSET;
714 return true;
716 case OPT_mrdrnd:
717 if (value)
719 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_RDRND_SET;
720 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_RDRND_SET;
722 else
724 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_RDRND_UNSET;
725 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_RDRND_UNSET;
727 return true;
729 case OPT_mf16c:
730 if (value)
732 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_F16C_SET;
733 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_F16C_SET;
735 else
737 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_F16C_UNSET;
738 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_F16C_UNSET;
740 return true;
742 case OPT_mfxsr:
743 if (value)
745 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_FXSR_SET;
746 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FXSR_SET;
748 else
750 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_FXSR_UNSET;
751 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FXSR_UNSET;
753 return true;
755 case OPT_mxsave:
756 if (value)
758 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_XSAVE_SET;
759 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_XSAVE_SET;
761 else
763 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_XSAVE_UNSET;
764 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_XSAVE_UNSET;
766 return true;
768 case OPT_mxsaveopt:
769 if (value)
771 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_XSAVEOPT_SET;
772 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_XSAVEOPT_SET;
774 else
776 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_XSAVEOPT_UNSET;
777 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_XSAVEOPT_UNSET;
779 return true;
781 case OPT_mxsavec:
782 if (value)
784 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_XSAVEC_SET;
785 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_XSAVEC_SET;
787 else
789 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_XSAVEC_UNSET;
790 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_XSAVEC_UNSET;
792 return true;
794 case OPT_mxsaves:
795 if (value)
797 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_XSAVES_SET;
798 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_XSAVES_SET;
800 else
802 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_XSAVES_UNSET;
803 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_XSAVES_UNSET;
805 return true;
807 case OPT_mrdseed:
808 if (value)
810 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_RDSEED_SET;
811 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_RDSEED_SET;
813 else
815 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_RDSEED_UNSET;
816 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_RDSEED_UNSET;
818 return true;
820 case OPT_mprfchw:
821 if (value)
823 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_PRFCHW_SET;
824 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_PRFCHW_SET;
826 else
828 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_PRFCHW_UNSET;
829 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_PRFCHW_UNSET;
831 return true;
833 case OPT_madx:
834 if (value)
836 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_ADX_SET;
837 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_ADX_SET;
839 else
841 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_ADX_UNSET;
842 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_ADX_UNSET;
844 return true;
846 case OPT_mprefetchwt1:
847 if (value)
849 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_PREFETCHWT1_SET;
850 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_PREFETCHWT1_SET;
852 else
854 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_PREFETCHWT1_UNSET;
855 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_PREFETCHWT1_UNSET;
857 return true;
859 case OPT_mclflushopt:
860 if (value)
862 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_CLFLUSHOPT_SET;
863 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_CLFLUSHOPT_SET;
865 else
867 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_CLFLUSHOPT_UNSET;
868 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_CLFLUSHOPT_UNSET;
870 return true;
872 /* Comes from final.c -- no real reason to change it. */
873 #define MAX_CODE_ALIGN 16
875 case OPT_malign_loops_:
876 warning_at (loc, 0, "-malign-loops is obsolete, use -falign-loops");
877 if (value > MAX_CODE_ALIGN)
878 error_at (loc, "-malign-loops=%d is not between 0 and %d",
879 value, MAX_CODE_ALIGN);
880 else
881 opts->x_align_loops = 1 << value;
882 return true;
884 case OPT_malign_jumps_:
885 warning_at (loc, 0, "-malign-jumps is obsolete, use -falign-jumps");
886 if (value > MAX_CODE_ALIGN)
887 error_at (loc, "-malign-jumps=%d is not between 0 and %d",
888 value, MAX_CODE_ALIGN);
889 else
890 opts->x_align_jumps = 1 << value;
891 return true;
893 case OPT_malign_functions_:
894 warning_at (loc, 0,
895 "-malign-functions is obsolete, use -falign-functions");
896 if (value > MAX_CODE_ALIGN)
897 error_at (loc, "-malign-functions=%d is not between 0 and %d",
898 value, MAX_CODE_ALIGN);
899 else
900 opts->x_align_functions = 1 << value;
901 return true;
903 case OPT_mbranch_cost_:
904 if (value > 5)
906 error_at (loc, "-mbranch-cost=%d is not between 0 and 5", value);
907 opts->x_ix86_branch_cost = 5;
909 return true;
911 default:
912 return true;
916 static const struct default_options ix86_option_optimization_table[] =
918 /* Enable redundant extension instructions removal at -O2 and higher. */
919 { OPT_LEVELS_2_PLUS, OPT_free, NULL, 1 },
920 /* Enable function splitting at -O2 and higher. */
921 { OPT_LEVELS_2_PLUS, OPT_freorder_blocks_and_partition, NULL, 1 },
922 /* Turn off -fschedule-insns by default. It tends to make the
923 problem with not enough registers even worse. */
924 { OPT_LEVELS_ALL, OPT_fschedule_insns, NULL, 0 },
926 #ifdef SUBTARGET_OPTIMIZATION_OPTIONS
927 SUBTARGET_OPTIMIZATION_OPTIONS,
928 #endif
929 { OPT_LEVELS_NONE, 0, NULL, 0 }
932 /* Implement TARGET_OPTION_INIT_STRUCT. */
934 static void
935 ix86_option_init_struct (struct gcc_options *opts)
937 if (TARGET_MACHO)
938 /* The Darwin libraries never set errno, so we might as well
939 avoid calling them when that's the only reason we would. */
940 opts->x_flag_errno_math = 0;
942 opts->x_flag_pcc_struct_return = 2;
943 opts->x_flag_asynchronous_unwind_tables = 2;
946 /* On the x86 -fsplit-stack and -fstack-protector both use the same
947 field in the TCB, so they can not be used together. */
949 static bool
950 ix86_supports_split_stack (bool report ATTRIBUTE_UNUSED,
951 struct gcc_options *opts ATTRIBUTE_UNUSED)
953 bool ret = true;
955 #ifndef TARGET_THREAD_SPLIT_STACK_OFFSET
956 if (report)
957 error ("%<-fsplit-stack%> currently only supported on GNU/Linux");
958 ret = false;
959 #else
960 if (!HAVE_GAS_CFI_PERSONALITY_DIRECTIVE)
962 if (report)
963 error ("%<-fsplit-stack%> requires "
964 "assembler support for CFI directives");
965 ret = false;
967 #endif
969 return ret;
972 /* Implement TARGET_EXCEPT_UNWIND_INFO. */
974 static enum unwind_info_type
975 i386_except_unwind_info (struct gcc_options *opts)
977 /* Honor the --enable-sjlj-exceptions configure switch. */
978 #ifdef CONFIG_SJLJ_EXCEPTIONS
979 if (CONFIG_SJLJ_EXCEPTIONS)
980 return UI_SJLJ;
981 #endif
983 /* On windows 64, prefer SEH exceptions over anything else. */
984 if (TARGET_64BIT && DEFAULT_ABI == MS_ABI && opts->x_flag_unwind_tables)
985 return UI_SEH;
987 if (DWARF2_UNWIND_INFO)
988 return UI_DWARF2;
990 return UI_SJLJ;
993 #undef TARGET_EXCEPT_UNWIND_INFO
994 #define TARGET_EXCEPT_UNWIND_INFO i386_except_unwind_info
996 #undef TARGET_DEFAULT_TARGET_FLAGS
997 #define TARGET_DEFAULT_TARGET_FLAGS \
998 (TARGET_DEFAULT \
999 | TARGET_SUBTARGET_DEFAULT \
1000 | TARGET_TLS_DIRECT_SEG_REFS_DEFAULT)
1002 #undef TARGET_HANDLE_OPTION
1003 #define TARGET_HANDLE_OPTION ix86_handle_option
1005 #undef TARGET_OPTION_OPTIMIZATION_TABLE
1006 #define TARGET_OPTION_OPTIMIZATION_TABLE ix86_option_optimization_table
1007 #undef TARGET_OPTION_INIT_STRUCT
1008 #define TARGET_OPTION_INIT_STRUCT ix86_option_init_struct
1010 #undef TARGET_SUPPORTS_SPLIT_STACK
1011 #define TARGET_SUPPORTS_SPLIT_STACK ix86_supports_split_stack
1013 struct gcc_targetm_common targetm_common = TARGETM_COMMON_INITIALIZER;