1 /* IA-32 common hooks.
2 Copyright (C) 1988-2020 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
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.
10
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.
15
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/>. */
19
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "diagnostic-core.h"
24 #include "tm.h"
25 #include "memmodel.h"
26 #include "tm_p.h"
27 #include "common/common-target.h"
28 #include "common/common-target-def.h"
29 #include "opts.h"
30 #include "flags.h"
31
32 /* Define a set of ISAs which are available when a given ISA is
33 enabled. MMX and SSE ISAs are handled separately. */
34
35 #define OPTION_MASK_ISA_MMX_SET OPTION_MASK_ISA_MMX
36 #define OPTION_MASK_ISA_3DNOW_SET \
37 (OPTION_MASK_ISA_3DNOW | OPTION_MASK_ISA_MMX_SET)
38 #define OPTION_MASK_ISA_3DNOW_A_SET \
39 (OPTION_MASK_ISA_3DNOW_A | OPTION_MASK_ISA_3DNOW_SET)
40
41 #define OPTION_MASK_ISA_SSE_SET OPTION_MASK_ISA_SSE
42 #define OPTION_MASK_ISA_SSE2_SET \
43 (OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_SSE_SET)
44 #define OPTION_MASK_ISA_SSE3_SET \
45 (OPTION_MASK_ISA_SSE3 | OPTION_MASK_ISA_SSE2_SET)
46 #define OPTION_MASK_ISA_SSSE3_SET \
47 (OPTION_MASK_ISA_SSSE3 | OPTION_MASK_ISA_SSE3_SET)
48 #define OPTION_MASK_ISA_SSE4_1_SET \
49 (OPTION_MASK_ISA_SSE4_1 | OPTION_MASK_ISA_SSSE3_SET)
50 #define OPTION_MASK_ISA_SSE4_2_SET \
51 (OPTION_MASK_ISA_SSE4_2 | OPTION_MASK_ISA_SSE4_1_SET)
52 #define OPTION_MASK_ISA_AVX_SET \
53 (OPTION_MASK_ISA_AVX | OPTION_MASK_ISA_SSE4_2_SET \
54 | OPTION_MASK_ISA_XSAVE_SET)
55 #define OPTION_MASK_ISA_FMA_SET \
56 (OPTION_MASK_ISA_FMA | OPTION_MASK_ISA_AVX_SET)
57 #define OPTION_MASK_ISA_AVX2_SET \
58 (OPTION_MASK_ISA_AVX2 | OPTION_MASK_ISA_AVX_SET)
59 #define OPTION_MASK_ISA_FXSR_SET OPTION_MASK_ISA_FXSR
60 #define OPTION_MASK_ISA_XSAVE_SET OPTION_MASK_ISA_XSAVE
61 #define OPTION_MASK_ISA_XSAVEOPT_SET \
62 (OPTION_MASK_ISA_XSAVEOPT | OPTION_MASK_ISA_XSAVE_SET)
63 #define OPTION_MASK_ISA_AVX512F_SET \
64 (OPTION_MASK_ISA_AVX512F | OPTION_MASK_ISA_AVX2_SET)
65 #define OPTION_MASK_ISA_AVX512CD_SET \
66 (OPTION_MASK_ISA_AVX512CD | OPTION_MASK_ISA_AVX512F_SET)
67 #define OPTION_MASK_ISA_AVX512PF_SET \
68 (OPTION_MASK_ISA_AVX512PF | OPTION_MASK_ISA_AVX512F_SET)
69 #define OPTION_MASK_ISA_AVX512ER_SET \
70 (OPTION_MASK_ISA_AVX512ER | OPTION_MASK_ISA_AVX512F_SET)
71 #define OPTION_MASK_ISA_AVX512DQ_SET \
72 (OPTION_MASK_ISA_AVX512DQ | OPTION_MASK_ISA_AVX512F_SET)
73 #define OPTION_MASK_ISA_AVX512BW_SET \
74 (OPTION_MASK_ISA_AVX512BW | OPTION_MASK_ISA_AVX512F_SET)
75 #define OPTION_MASK_ISA_AVX512VL_SET \
76 (OPTION_MASK_ISA_AVX512VL | OPTION_MASK_ISA_AVX512F_SET)
77 #define OPTION_MASK_ISA_AVX512IFMA_SET \
78 (OPTION_MASK_ISA_AVX512IFMA | OPTION_MASK_ISA_AVX512F_SET)
79 #define OPTION_MASK_ISA_AVX512VBMI_SET \
80 (OPTION_MASK_ISA_AVX512VBMI | OPTION_MASK_ISA_AVX512BW_SET)
81 #define OPTION_MASK_ISA2_AVX5124FMAPS_SET OPTION_MASK_ISA2_AVX5124FMAPS
82 #define OPTION_MASK_ISA2_AVX5124VNNIW_SET OPTION_MASK_ISA2_AVX5124VNNIW
83 #define OPTION_MASK_ISA_AVX512VBMI2_SET \
84 (OPTION_MASK_ISA_AVX512VBMI2 | OPTION_MASK_ISA_AVX512F_SET)
85 #define OPTION_MASK_ISA_AVX512VNNI_SET \
86 (OPTION_MASK_ISA_AVX512VNNI | OPTION_MASK_ISA_AVX512F_SET)
87 #define OPTION_MASK_ISA_AVX512VPOPCNTDQ_SET \
88 (OPTION_MASK_ISA_AVX512VPOPCNTDQ | OPTION_MASK_ISA_AVX512F_SET)
89 #define OPTION_MASK_ISA_AVX512BITALG_SET \
90 (OPTION_MASK_ISA_AVX512BITALG | OPTION_MASK_ISA_AVX512F_SET)
91 #define OPTION_MASK_ISA2_AVX512BF16_SET OPTION_MASK_ISA2_AVX512BF16
92 #define OPTION_MASK_ISA_RTM_SET OPTION_MASK_ISA_RTM
93 #define OPTION_MASK_ISA_PRFCHW_SET OPTION_MASK_ISA_PRFCHW
94 #define OPTION_MASK_ISA_RDSEED_SET OPTION_MASK_ISA_RDSEED
95 #define OPTION_MASK_ISA_ADX_SET OPTION_MASK_ISA_ADX
96 #define OPTION_MASK_ISA_PREFETCHWT1_SET OPTION_MASK_ISA_PREFETCHWT1
97 #define OPTION_MASK_ISA_CLFLUSHOPT_SET OPTION_MASK_ISA_CLFLUSHOPT
98 #define OPTION_MASK_ISA_XSAVES_SET \
99 (OPTION_MASK_ISA_XSAVES | OPTION_MASK_ISA_XSAVE_SET)
100 #define OPTION_MASK_ISA_XSAVEC_SET \
101 (OPTION_MASK_ISA_XSAVEC | OPTION_MASK_ISA_XSAVE_SET)
102 #define OPTION_MASK_ISA_CLWB_SET OPTION_MASK_ISA_CLWB
103 #define OPTION_MASK_ISA2_AVX512VP2INTERSECT_SET OPTION_MASK_ISA2_AVX512VP2INTERSECT
104
105 /* SSE4 includes both SSE4.1 and SSE4.2. -msse4 should be the same
106 as -msse4.2. */
107 #define OPTION_MASK_ISA_SSE4_SET OPTION_MASK_ISA_SSE4_2_SET
108
109 #define OPTION_MASK_ISA_SSE4A_SET \
110 (OPTION_MASK_ISA_SSE4A | OPTION_MASK_ISA_SSE3_SET)
111 #define OPTION_MASK_ISA_FMA4_SET \
112 (OPTION_MASK_ISA_FMA4 | OPTION_MASK_ISA_SSE4A_SET \
113 | OPTION_MASK_ISA_AVX_SET)
114 #define OPTION_MASK_ISA_XOP_SET \
115 (OPTION_MASK_ISA_XOP | OPTION_MASK_ISA_FMA4_SET)
116 #define OPTION_MASK_ISA_LWP_SET \
117 OPTION_MASK_ISA_LWP
118
119 /* AES, SHA and PCLMUL need SSE2 because they use xmm registers. */
120 #define OPTION_MASK_ISA_AES_SET \
121 (OPTION_MASK_ISA_AES | OPTION_MASK_ISA_SSE2_SET)
122 #define OPTION_MASK_ISA_SHA_SET \
123 (OPTION_MASK_ISA_SHA | OPTION_MASK_ISA_SSE2_SET)
124 #define OPTION_MASK_ISA_PCLMUL_SET \
125 (OPTION_MASK_ISA_PCLMUL | OPTION_MASK_ISA_SSE2_SET)
126
127 #define OPTION_MASK_ISA_ABM_SET \
128 (OPTION_MASK_ISA_ABM | OPTION_MASK_ISA_POPCNT)
129
130 #define OPTION_MASK_ISA2_PCONFIG_SET OPTION_MASK_ISA2_PCONFIG
131 #define OPTION_MASK_ISA2_WBNOINVD_SET OPTION_MASK_ISA2_WBNOINVD
132 #define OPTION_MASK_ISA2_SGX_SET OPTION_MASK_ISA2_SGX
133 #define OPTION_MASK_ISA_BMI_SET OPTION_MASK_ISA_BMI
134 #define OPTION_MASK_ISA_BMI2_SET OPTION_MASK_ISA_BMI2
135 #define OPTION_MASK_ISA_LZCNT_SET OPTION_MASK_ISA_LZCNT
136 #define OPTION_MASK_ISA_TBM_SET OPTION_MASK_ISA_TBM
137 #define OPTION_MASK_ISA_POPCNT_SET OPTION_MASK_ISA_POPCNT
138 #define OPTION_MASK_ISA2_CX16_SET OPTION_MASK_ISA2_CX16
139 #define OPTION_MASK_ISA_SAHF_SET OPTION_MASK_ISA_SAHF
140 #define OPTION_MASK_ISA2_MOVBE_SET OPTION_MASK_ISA2_MOVBE
141 #define OPTION_MASK_ISA_CRC32_SET OPTION_MASK_ISA_CRC32
142
143 #define OPTION_MASK_ISA_FSGSBASE_SET OPTION_MASK_ISA_FSGSBASE
144 #define OPTION_MASK_ISA_RDRND_SET OPTION_MASK_ISA_RDRND
145 #define OPTION_MASK_ISA2_PTWRITE_SET OPTION_MASK_ISA2_PTWRITE
146 #define OPTION_MASK_ISA_F16C_SET \
147 (OPTION_MASK_ISA_F16C | OPTION_MASK_ISA_AVX_SET)
148 #define OPTION_MASK_ISA2_MWAITX_SET OPTION_MASK_ISA2_MWAITX
149 #define OPTION_MASK_ISA2_CLZERO_SET OPTION_MASK_ISA2_CLZERO
150 #define OPTION_MASK_ISA_PKU_SET OPTION_MASK_ISA_PKU
151 #define OPTION_MASK_ISA2_RDPID_SET OPTION_MASK_ISA2_RDPID
152 #define OPTION_MASK_ISA_GFNI_SET OPTION_MASK_ISA_GFNI
153 #define OPTION_MASK_ISA_SHSTK_SET OPTION_MASK_ISA_SHSTK
154 #define OPTION_MASK_ISA2_VAES_SET OPTION_MASK_ISA2_VAES
155 #define OPTION_MASK_ISA_VPCLMULQDQ_SET OPTION_MASK_ISA_VPCLMULQDQ
156 #define OPTION_MASK_ISA_MOVDIRI_SET OPTION_MASK_ISA_MOVDIRI
157 #define OPTION_MASK_ISA2_MOVDIR64B_SET OPTION_MASK_ISA2_MOVDIR64B
158 #define OPTION_MASK_ISA2_WAITPKG_SET OPTION_MASK_ISA2_WAITPKG
159 #define OPTION_MASK_ISA2_CLDEMOTE_SET OPTION_MASK_ISA2_CLDEMOTE
160 #define OPTION_MASK_ISA2_ENQCMD_SET OPTION_MASK_ISA2_ENQCMD
161
162 /* Define a set of ISAs which aren't available when a given ISA is
163 disabled. MMX and SSE ISAs are handled separately. */
164
165 #define OPTION_MASK_ISA_MMX_UNSET \
166 (OPTION_MASK_ISA_MMX | OPTION_MASK_ISA_3DNOW_UNSET)
167 #define OPTION_MASK_ISA_3DNOW_UNSET \
168 (OPTION_MASK_ISA_3DNOW | OPTION_MASK_ISA_3DNOW_A_UNSET)
169 #define OPTION_MASK_ISA_3DNOW_A_UNSET OPTION_MASK_ISA_3DNOW_A
170
171 #define OPTION_MASK_ISA_SSE_UNSET \
172 (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_SSE2_UNSET)
173 #define OPTION_MASK_ISA_SSE2_UNSET \
174 (OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_SSE3_UNSET)
175 #define OPTION_MASK_ISA_SSE3_UNSET \
176 (OPTION_MASK_ISA_SSE3 \
177 | OPTION_MASK_ISA_SSSE3_UNSET \
178 | OPTION_MASK_ISA_SSE4A_UNSET )
179 #define OPTION_MASK_ISA_SSSE3_UNSET \
180 (OPTION_MASK_ISA_SSSE3 | OPTION_MASK_ISA_SSE4_1_UNSET)
181 #define OPTION_MASK_ISA_SSE4_1_UNSET \
182 (OPTION_MASK_ISA_SSE4_1 | OPTION_MASK_ISA_SSE4_2_UNSET)
183 #define OPTION_MASK_ISA_SSE4_2_UNSET \
184 (OPTION_MASK_ISA_SSE4_2 | OPTION_MASK_ISA_AVX_UNSET )
185 #define OPTION_MASK_ISA_AVX_UNSET \
186 (OPTION_MASK_ISA_AVX | OPTION_MASK_ISA_FMA_UNSET \
187 | OPTION_MASK_ISA_FMA4_UNSET | OPTION_MASK_ISA_F16C_UNSET \
188 | OPTION_MASK_ISA_AVX2_UNSET )
189 #define OPTION_MASK_ISA_FMA_UNSET OPTION_MASK_ISA_FMA
190 #define OPTION_MASK_ISA_FXSR_UNSET OPTION_MASK_ISA_FXSR
191 #define OPTION_MASK_ISA_XSAVE_UNSET \
192 (OPTION_MASK_ISA_XSAVE | OPTION_MASK_ISA_XSAVEOPT_UNSET \
193 | OPTION_MASK_ISA_XSAVES_UNSET | OPTION_MASK_ISA_XSAVEC_UNSET \
194 | OPTION_MASK_ISA_AVX_UNSET)
195 #define OPTION_MASK_ISA_XSAVEOPT_UNSET OPTION_MASK_ISA_XSAVEOPT
196 #define OPTION_MASK_ISA_AVX2_UNSET \
197 (OPTION_MASK_ISA_AVX2 | OPTION_MASK_ISA_AVX512F_UNSET)
198 #define OPTION_MASK_ISA_AVX512F_UNSET \
199 (OPTION_MASK_ISA_AVX512F | OPTION_MASK_ISA_AVX512CD_UNSET \
200 | OPTION_MASK_ISA_AVX512PF_UNSET | OPTION_MASK_ISA_AVX512ER_UNSET \
201 | OPTION_MASK_ISA_AVX512DQ_UNSET | OPTION_MASK_ISA_AVX512BW_UNSET \
202 | OPTION_MASK_ISA_AVX512VL_UNSET | OPTION_MASK_ISA_AVX512IFMA_UNSET \
203 | OPTION_MASK_ISA_AVX512VBMI2_UNSET \
204 | OPTION_MASK_ISA_AVX512VNNI_UNSET \
205 | OPTION_MASK_ISA_AVX512VPOPCNTDQ_UNSET \
206 | OPTION_MASK_ISA_AVX512BITALG_UNSET)
207 #define OPTION_MASK_ISA_AVX512CD_UNSET OPTION_MASK_ISA_AVX512CD
208 #define OPTION_MASK_ISA_AVX512PF_UNSET OPTION_MASK_ISA_AVX512PF
209 #define OPTION_MASK_ISA_AVX512ER_UNSET OPTION_MASK_ISA_AVX512ER
210 #define OPTION_MASK_ISA_AVX512DQ_UNSET OPTION_MASK_ISA_AVX512DQ
211 #define OPTION_MASK_ISA_AVX512BW_UNSET \
212 (OPTION_MASK_ISA_AVX512BW | OPTION_MASK_ISA_AVX512VBMI_UNSET)
213 #define OPTION_MASK_ISA_AVX512VL_UNSET OPTION_MASK_ISA_AVX512VL
214 #define OPTION_MASK_ISA_AVX512IFMA_UNSET OPTION_MASK_ISA_AVX512IFMA
215 #define OPTION_MASK_ISA_AVX512VBMI_UNSET OPTION_MASK_ISA_AVX512VBMI
216 #define OPTION_MASK_ISA2_AVX5124FMAPS_UNSET OPTION_MASK_ISA2_AVX5124FMAPS
217 #define OPTION_MASK_ISA2_AVX5124VNNIW_UNSET OPTION_MASK_ISA2_AVX5124VNNIW
218 #define OPTION_MASK_ISA_AVX512VBMI2_UNSET OPTION_MASK_ISA_AVX512VBMI2
219 #define OPTION_MASK_ISA_AVX512VNNI_UNSET OPTION_MASK_ISA_AVX512VNNI
220 #define OPTION_MASK_ISA_AVX512VPOPCNTDQ_UNSET OPTION_MASK_ISA_AVX512VPOPCNTDQ
221 #define OPTION_MASK_ISA_AVX512BITALG_UNSET OPTION_MASK_ISA_AVX512BITALG
222 #define OPTION_MASK_ISA2_AVX512BF16_UNSET OPTION_MASK_ISA2_AVX512BF16
223 #define OPTION_MASK_ISA_RTM_UNSET OPTION_MASK_ISA_RTM
224 #define OPTION_MASK_ISA_PRFCHW_UNSET OPTION_MASK_ISA_PRFCHW
225 #define OPTION_MASK_ISA_RDSEED_UNSET OPTION_MASK_ISA_RDSEED
226 #define OPTION_MASK_ISA_ADX_UNSET OPTION_MASK_ISA_ADX
227 #define OPTION_MASK_ISA_PREFETCHWT1_UNSET OPTION_MASK_ISA_PREFETCHWT1
228 #define OPTION_MASK_ISA_CLFLUSHOPT_UNSET OPTION_MASK_ISA_CLFLUSHOPT
229 #define OPTION_MASK_ISA_XSAVEC_UNSET OPTION_MASK_ISA_XSAVEC
230 #define OPTION_MASK_ISA_XSAVES_UNSET OPTION_MASK_ISA_XSAVES
231 #define OPTION_MASK_ISA_CLWB_UNSET OPTION_MASK_ISA_CLWB
232 #define OPTION_MASK_ISA2_MWAITX_UNSET OPTION_MASK_ISA2_MWAITX
233 #define OPTION_MASK_ISA2_CLZERO_UNSET OPTION_MASK_ISA2_CLZERO
234 #define OPTION_MASK_ISA_PKU_UNSET OPTION_MASK_ISA_PKU
235 #define OPTION_MASK_ISA2_RDPID_UNSET OPTION_MASK_ISA2_RDPID
236 #define OPTION_MASK_ISA_GFNI_UNSET OPTION_MASK_ISA_GFNI
237 #define OPTION_MASK_ISA_SHSTK_UNSET OPTION_MASK_ISA_SHSTK
238 #define OPTION_MASK_ISA2_VAES_UNSET OPTION_MASK_ISA2_VAES
239 #define OPTION_MASK_ISA_VPCLMULQDQ_UNSET OPTION_MASK_ISA_VPCLMULQDQ
240 #define OPTION_MASK_ISA_MOVDIRI_UNSET OPTION_MASK_ISA_MOVDIRI
241 #define OPTION_MASK_ISA2_MOVDIR64B_UNSET OPTION_MASK_ISA2_MOVDIR64B
242 #define OPTION_MASK_ISA2_WAITPKG_UNSET OPTION_MASK_ISA2_WAITPKG
243 #define OPTION_MASK_ISA2_CLDEMOTE_UNSET OPTION_MASK_ISA2_CLDEMOTE
244 #define OPTION_MASK_ISA2_ENQCMD_UNSET OPTION_MASK_ISA2_ENQCMD
245 #define OPTION_MASK_ISA2_AVX512VP2INTERSECT_UNSET OPTION_MASK_ISA2_AVX512VP2INTERSECT
246
247 /* SSE4 includes both SSE4.1 and SSE4.2. -mno-sse4 should the same
248 as -mno-sse4.1. */
249 #define OPTION_MASK_ISA_SSE4_UNSET OPTION_MASK_ISA_SSE4_1_UNSET
250
251 #define OPTION_MASK_ISA_SSE4A_UNSET \
252 (OPTION_MASK_ISA_SSE4A | OPTION_MASK_ISA_FMA4_UNSET)
253
254 #define OPTION_MASK_ISA_FMA4_UNSET \
255 (OPTION_MASK_ISA_FMA4 | OPTION_MASK_ISA_XOP_UNSET)
256 #define OPTION_MASK_ISA_XOP_UNSET OPTION_MASK_ISA_XOP
257 #define OPTION_MASK_ISA_LWP_UNSET OPTION_MASK_ISA_LWP
258
259 #define OPTION_MASK_ISA_AES_UNSET OPTION_MASK_ISA_AES
260 #define OPTION_MASK_ISA_SHA_UNSET OPTION_MASK_ISA_SHA
261 #define OPTION_MASK_ISA_PCLMUL_UNSET OPTION_MASK_ISA_PCLMUL
262 #define OPTION_MASK_ISA_ABM_UNSET OPTION_MASK_ISA_ABM
263 #define OPTION_MASK_ISA2_PCONFIG_UNSET OPTION_MASK_ISA2_PCONFIG
264 #define OPTION_MASK_ISA2_WBNOINVD_UNSET OPTION_MASK_ISA2_WBNOINVD
265 #define OPTION_MASK_ISA2_SGX_UNSET OPTION_MASK_ISA2_SGX
266 #define OPTION_MASK_ISA_BMI_UNSET OPTION_MASK_ISA_BMI
267 #define OPTION_MASK_ISA_BMI2_UNSET OPTION_MASK_ISA_BMI2
268 #define OPTION_MASK_ISA_LZCNT_UNSET OPTION_MASK_ISA_LZCNT
269 #define OPTION_MASK_ISA_TBM_UNSET OPTION_MASK_ISA_TBM
270 #define OPTION_MASK_ISA_POPCNT_UNSET OPTION_MASK_ISA_POPCNT
271 #define OPTION_MASK_ISA2_CX16_UNSET OPTION_MASK_ISA2_CX16
272 #define OPTION_MASK_ISA_SAHF_UNSET OPTION_MASK_ISA_SAHF
273 #define OPTION_MASK_ISA2_MOVBE_UNSET OPTION_MASK_ISA2_MOVBE
274 #define OPTION_MASK_ISA_CRC32_UNSET OPTION_MASK_ISA_CRC32
275
276 #define OPTION_MASK_ISA_FSGSBASE_UNSET OPTION_MASK_ISA_FSGSBASE
277 #define OPTION_MASK_ISA_RDRND_UNSET OPTION_MASK_ISA_RDRND
278 #define OPTION_MASK_ISA2_PTWRITE_UNSET OPTION_MASK_ISA2_PTWRITE
279 #define OPTION_MASK_ISA_F16C_UNSET OPTION_MASK_ISA_F16C
280
281 #define OPTION_MASK_ISA_GENERAL_REGS_ONLY_UNSET \
282 (OPTION_MASK_ISA_MMX_UNSET \
283 | OPTION_MASK_ISA_SSE_UNSET)
284
285 #define OPTION_MASK_ISA2_AVX512F_UNSET \
286 (OPTION_MASK_ISA2_AVX512BF16_UNSET \
287 | OPTION_MASK_ISA2_AVX5124FMAPS_UNSET \
288 | OPTION_MASK_ISA2_AVX5124VNNIW_UNSET \
289 | OPTION_MASK_ISA2_AVX512VP2INTERSECT_UNSET)
290 #define OPTION_MASK_ISA2_GENERAL_REGS_ONLY_UNSET \
291 (OPTION_MASK_ISA2_AVX512F_UNSET)
292
293 #define OPTION_MASK_ISA2_AVX512BW_UNSET OPTION_MASK_ISA2_AVX512BF16_UNSET
294
295 /* Set 1 << value as value of -malign-FLAG option. */
296
297 static void
set_malign_value(const char ** flag,unsigned value)298 set_malign_value (const char **flag, unsigned value)
299 {
300 char *r = XNEWVEC (char, 6);
301 sprintf (r, "%d", 1 << value);
302 *flag = r;
303 }
304
305 /* Implement TARGET_HANDLE_OPTION. */
306
307 bool
ix86_handle_option(struct gcc_options * opts,struct gcc_options * opts_set ATTRIBUTE_UNUSED,const struct cl_decoded_option * decoded,location_t loc)308 ix86_handle_option (struct gcc_options *opts,
309 struct gcc_options *opts_set ATTRIBUTE_UNUSED,
310 const struct cl_decoded_option *decoded,
311 location_t loc)
312 {
313 size_t code = decoded->opt_index;
314 int value = decoded->value;
315
316 switch (code)
317 {
318 case OPT_mgeneral_regs_only:
319 if (value)
320 {
321 /* Disable MMX, SSE and x87 instructions if only
322 general registers are allowed. */
323 opts->x_ix86_isa_flags
324 &= ~OPTION_MASK_ISA_GENERAL_REGS_ONLY_UNSET;
325 opts->x_ix86_isa_flags2
326 &= ~OPTION_MASK_ISA2_GENERAL_REGS_ONLY_UNSET;
327 opts->x_ix86_isa_flags_explicit
328 |= OPTION_MASK_ISA_GENERAL_REGS_ONLY_UNSET;
329 opts->x_ix86_isa_flags2_explicit
330 |= OPTION_MASK_ISA2_GENERAL_REGS_ONLY_UNSET;
331
332 opts->x_target_flags &= ~MASK_80387;
333 }
334 else
335 gcc_unreachable ();
336 return true;
337
338 case OPT_mmmx:
339 if (value)
340 {
341 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_MMX_SET;
342 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_MMX_SET;
343 }
344 else
345 {
346 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_MMX_UNSET;
347 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_MMX_UNSET;
348 }
349 return true;
350
351 case OPT_m3dnow:
352 if (value)
353 {
354 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_3DNOW_SET;
355 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_3DNOW_SET;
356 }
357 else
358 {
359 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_3DNOW_UNSET;
360 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_3DNOW_UNSET;
361 }
362 return true;
363
364 case OPT_m3dnowa:
365 if (value)
366 {
367 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_3DNOW_A_SET;
368 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_3DNOW_A_SET;
369 }
370 else
371 {
372 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_3DNOW_A_UNSET;
373 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_3DNOW_A_UNSET;
374 }
375 return true;
376
377 case OPT_msse:
378 if (value)
379 {
380 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE_SET;
381 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE_SET;
382 }
383 else
384 {
385 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE_UNSET;
386 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE_UNSET;
387 opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA2_AVX512F_UNSET;
388 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_AVX512F_UNSET;
389 }
390 return true;
391
392 case OPT_msse2:
393 if (value)
394 {
395 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE2_SET;
396 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE2_SET;
397 }
398 else
399 {
400 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE2_UNSET;
401 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE2_UNSET;
402 opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA2_AVX512F_UNSET;
403 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_AVX512F_UNSET;
404 }
405 return true;
406
407 case OPT_msse3:
408 if (value)
409 {
410 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE3_SET;
411 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE3_SET;
412 }
413 else
414 {
415 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE3_UNSET;
416 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE3_UNSET;
417 opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA2_AVX512F_UNSET;
418 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_AVX512F_UNSET;
419 }
420 return true;
421
422 case OPT_mssse3:
423 if (value)
424 {
425 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSSE3_SET;
426 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSSE3_SET;
427 }
428 else
429 {
430 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSSE3_UNSET;
431 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSSE3_UNSET;
432 opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA2_AVX512F_UNSET;
433 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_AVX512F_UNSET;
434 }
435 return true;
436
437 case OPT_msse4_1:
438 if (value)
439 {
440 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE4_1_SET;
441 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_1_SET;
442 }
443 else
444 {
445 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4_1_UNSET;
446 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_1_UNSET;
447 opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA2_AVX512F_UNSET;
448 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_AVX512F_UNSET;
449 }
450 return true;
451
452 case OPT_msse4_2:
453 if (value)
454 {
455 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE4_2_SET;
456 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_2_SET;
457 }
458 else
459 {
460 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4_2_UNSET;
461 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_2_UNSET;
462 opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA2_AVX512F_UNSET;
463 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_AVX512F_UNSET;
464 }
465 return true;
466
467 case OPT_mavx:
468 if (value)
469 {
470 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_AVX_SET;
471 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX_SET;
472 }
473 else
474 {
475 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AVX_UNSET;
476 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX_UNSET;
477 opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA2_AVX512F_UNSET;
478 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_AVX512F_UNSET;
479 }
480 return true;
481
482 case OPT_mavx2:
483 if (value)
484 {
485 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_AVX2_SET;
486 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX2_SET;
487 }
488 else
489 {
490 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AVX2_UNSET;
491 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX2_UNSET;
492 opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA2_AVX512F_UNSET;
493 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_AVX512F_UNSET;
494 }
495 return true;
496
497 case OPT_mavx512f:
498 if (value)
499 {
500 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_AVX512F_SET;
501 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512F_SET;
502 }
503 else
504 {
505 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AVX512F_UNSET;
506 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512F_UNSET;
507 opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA2_AVX512F_UNSET;
508 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_AVX512F_UNSET;
509 }
510 return true;
511
512 case OPT_mavx512cd:
513 if (value)
514 {
515 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_AVX512CD_SET;
516 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512CD_SET;
517 }
518 else
519 {
520 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AVX512CD_UNSET;
521 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512CD_UNSET;
522 }
523 return true;
524
525 case OPT_mavx512pf:
526 if (value)
527 {
528 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_AVX512PF_SET;
529 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512PF_SET;
530 }
531 else
532 {
533 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AVX512PF_UNSET;
534 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512PF_UNSET;
535 }
536 return true;
537
538 case OPT_mavx512er:
539 if (value)
540 {
541 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_AVX512ER_SET;
542 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512ER_SET;
543 }
544 else
545 {
546 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AVX512ER_UNSET;
547 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512ER_UNSET;
548 }
549 return true;
550
551 case OPT_mrdpid:
552 if (value)
553 {
554 opts->x_ix86_isa_flags2 |= OPTION_MASK_ISA2_RDPID_SET;
555 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_RDPID_SET;
556 }
557 else
558 {
559 opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA2_RDPID_UNSET;
560 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_RDPID_UNSET;
561 }
562 return true;
563
564 case OPT_mgfni:
565 if (value)
566 {
567 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_GFNI_SET;
568 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_GFNI_SET;
569 }
570 else
571 {
572 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_GFNI_UNSET;
573 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_GFNI_UNSET;
574 }
575 return true;
576
577 case OPT_mshstk:
578 if (value)
579 {
580 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SHSTK_SET;
581 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SHSTK_SET;
582 }
583 else
584 {
585 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SHSTK_UNSET;
586 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SHSTK_UNSET;
587 }
588 return true;
589
590 case OPT_mvaes:
591 if (value)
592 {
593 opts->x_ix86_isa_flags2 |= OPTION_MASK_ISA2_VAES_SET;
594 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_VAES_SET;
595 }
596 else
597 {
598 opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA2_VAES_UNSET;
599 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_VAES_UNSET;
600 }
601 return true;
602
603 case OPT_mvpclmulqdq:
604 if (value)
605 {
606 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_VPCLMULQDQ_SET;
607 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_VPCLMULQDQ_SET;
608 }
609 else
610 {
611 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_VPCLMULQDQ_UNSET;
612 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_VPCLMULQDQ_UNSET;
613 }
614 return true;
615
616 case OPT_mmovdiri:
617 if (value)
618 {
619 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_MOVDIRI_SET;
620 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_MOVDIRI_SET;
621 }
622 else
623 {
624 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_MOVDIRI_UNSET;
625 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_MOVDIRI_UNSET;
626 }
627 return true;
628
629 case OPT_mmovdir64b:
630 if (value)
631 {
632 opts->x_ix86_isa_flags2 |= OPTION_MASK_ISA2_MOVDIR64B_SET;
633 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_MOVDIR64B_SET;
634 }
635 else
636 {
637 opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA2_MOVDIR64B_UNSET;
638 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_MOVDIR64B_UNSET;
639 }
640 return true;
641
642 case OPT_mcldemote:
643 if (value)
644 {
645 opts->x_ix86_isa_flags2 |= OPTION_MASK_ISA2_CLDEMOTE_SET;
646 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_CLDEMOTE_SET;
647 }
648 else
649 {
650 opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA2_CLDEMOTE_UNSET;
651 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_CLDEMOTE_UNSET;
652 }
653 return true;
654
655 case OPT_mwaitpkg:
656 if (value)
657 {
658 opts->x_ix86_isa_flags2 |= OPTION_MASK_ISA2_WAITPKG_SET;
659 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_WAITPKG_SET;
660 }
661 else
662 {
663 opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA2_WAITPKG_UNSET;
664 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_WAITPKG_UNSET;
665 }
666 return true;
667
668 case OPT_menqcmd:
669 if (value)
670 {
671 opts->x_ix86_isa_flags2 |= OPTION_MASK_ISA2_ENQCMD_SET;
672 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_ENQCMD_SET;
673 }
674 else
675 {
676 opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA2_ENQCMD_UNSET;
677 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_ENQCMD_UNSET;
678 }
679 return true;
680
681 case OPT_mavx5124fmaps:
682 if (value)
683 {
684 opts->x_ix86_isa_flags2 |= OPTION_MASK_ISA2_AVX5124FMAPS_SET;
685 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_AVX5124FMAPS_SET;
686 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_AVX512F_SET;
687 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512F_SET;
688 }
689 else
690 {
691 opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA2_AVX5124FMAPS_UNSET;
692 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_AVX5124FMAPS_UNSET;
693 }
694 return true;
695
696 case OPT_mavx5124vnniw:
697 if (value)
698 {
699 opts->x_ix86_isa_flags2 |= OPTION_MASK_ISA2_AVX5124VNNIW_SET;
700 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_AVX5124VNNIW_SET;
701 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_AVX512F_SET;
702 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512F_SET;
703 }
704 else
705 {
706 opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA2_AVX5124VNNIW_UNSET;
707 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_AVX5124VNNIW_UNSET;
708 }
709 return true;
710
711 case OPT_mavx512vbmi2:
712 if (value)
713 {
714 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_AVX512VBMI2_SET;
715 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512VBMI2_SET;
716 }
717 else
718 {
719 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AVX512VBMI2_UNSET;
720 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512VBMI2_UNSET;
721 }
722 return true;
723
724 case OPT_mavx512vnni:
725 if (value)
726 {
727 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_AVX512VNNI_SET;
728 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512VNNI_SET;
729 }
730 else
731 {
732 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AVX512VNNI_UNSET;
733 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512VNNI_UNSET;
734 }
735 return true;
736
737 case OPT_mavx512vpopcntdq:
738 if (value)
739 {
740 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_AVX512VPOPCNTDQ_SET;
741 opts->x_ix86_isa_flags_explicit
742 |= OPTION_MASK_ISA_AVX512VPOPCNTDQ_SET;
743 }
744 else
745 {
746 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AVX512VPOPCNTDQ_UNSET;
747 opts->x_ix86_isa_flags_explicit
748 |= OPTION_MASK_ISA_AVX512VPOPCNTDQ_UNSET;
749 }
750 return true;
751
752 case OPT_mavx512bitalg:
753 if (value)
754 {
755 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_AVX512BITALG_SET;
756 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512BITALG_SET;
757 }
758 else
759 {
760 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AVX512BITALG_UNSET;
761 opts->x_ix86_isa_flags_explicit
762 |= OPTION_MASK_ISA_AVX512BITALG_UNSET;
763 }
764 return true;
765
766 case OPT_mavx512bf16:
767 if (value)
768 {
769 opts->x_ix86_isa_flags2 |= OPTION_MASK_ISA2_AVX512BF16_SET;
770 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_AVX512BF16_SET;
771 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_AVX512BW_SET;
772 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512BW_SET;
773 }
774 else
775 {
776 opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA2_AVX512BF16_UNSET;
777 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_AVX512BF16_UNSET;
778 }
779 return true;
780
781 case OPT_msgx:
782 if (value)
783 {
784 opts->x_ix86_isa_flags2 |= OPTION_MASK_ISA2_SGX_SET;
785 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_SGX_SET;
786 }
787 else
788 {
789 opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA2_SGX_UNSET;
790 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_SGX_UNSET;
791 }
792 return true;
793
794 case OPT_mpconfig:
795 if (value)
796 {
797 opts->x_ix86_isa_flags2 |= OPTION_MASK_ISA2_PCONFIG_SET;
798 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_PCONFIG_SET;
799 }
800 else
801 {
802 opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA2_PCONFIG_UNSET;
803 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_PCONFIG_UNSET;
804 }
805 return true;
806
807 case OPT_mwbnoinvd:
808 if (value)
809 {
810 opts->x_ix86_isa_flags2 |= OPTION_MASK_ISA2_WBNOINVD_SET;
811 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_WBNOINVD_SET;
812 }
813 else
814 {
815 opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA2_WBNOINVD_UNSET;
816 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_WBNOINVD_UNSET;
817 }
818 return true;
819
820 case OPT_mavx512dq:
821 if (value)
822 {
823 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_AVX512DQ_SET;
824 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512DQ_SET;
825 }
826 else
827 {
828 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AVX512DQ_UNSET;
829 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512DQ_UNSET;
830 }
831 return true;
832
833 case OPT_mavx512bw:
834 if (value)
835 {
836 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_AVX512BW_SET;
837 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512BW_SET;
838 }
839 else
840 {
841 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AVX512BW_UNSET;
842 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512BW_UNSET;
843 opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA2_AVX512BW_UNSET;
844 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_AVX512BW_UNSET;
845 }
846 return true;
847
848 case OPT_mavx512vl:
849 if (value)
850 {
851 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_AVX512VL_SET;
852 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512VL_SET;
853 }
854 else
855 {
856 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AVX512VL_UNSET;
857 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512VL_UNSET;
858 }
859 return true;
860
861 case OPT_mavx512ifma:
862 if (value)
863 {
864 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_AVX512IFMA_SET;
865 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512IFMA_SET;
866 }
867 else
868 {
869 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AVX512IFMA_UNSET;
870 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512IFMA_UNSET;
871 }
872 return true;
873
874 case OPT_mavx512vbmi:
875 if (value)
876 {
877 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_AVX512VBMI_SET;
878 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512VBMI_SET;
879 }
880 else
881 {
882 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AVX512VBMI_UNSET;
883 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512VBMI_UNSET;
884 }
885 return true;
886
887 case OPT_mavx512vp2intersect:
888 if (value)
889 {
890 opts->x_ix86_isa_flags2 |= OPTION_MASK_ISA2_AVX512VP2INTERSECT_SET;
891 opts->x_ix86_isa_flags2_explicit |=
892 OPTION_MASK_ISA2_AVX512VP2INTERSECT_SET;
893 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_AVX512DQ_SET;
894 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX512DQ_SET;
895 }
896 else
897 {
898 opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA2_AVX512VP2INTERSECT_UNSET;
899 opts->x_ix86_isa_flags2_explicit |=
900 OPTION_MASK_ISA2_AVX512VP2INTERSECT_UNSET;
901 }
902 return true;
903
904 case OPT_mfma:
905 if (value)
906 {
907 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_FMA_SET;
908 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FMA_SET;
909 }
910 else
911 {
912 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_FMA_UNSET;
913 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FMA_UNSET;
914 }
915 return true;
916
917 case OPT_mrtm:
918 if (value)
919 {
920 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_RTM_SET;
921 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_RTM_SET;
922 }
923 else
924 {
925 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_RTM_UNSET;
926 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_RTM_UNSET;
927 }
928 return true;
929
930 case OPT_msse4:
931 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE4_SET;
932 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_SET;
933 return true;
934
935 case OPT_mno_sse4:
936 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4_UNSET;
937 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_UNSET;
938 opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA2_AVX512F_UNSET;
939 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_AVX512F_UNSET;
940 return true;
941
942 case OPT_msse4a:
943 if (value)
944 {
945 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE4A_SET;
946 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4A_SET;
947 }
948 else
949 {
950 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4A_UNSET;
951 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4A_UNSET;
952 }
953 return true;
954
955 case OPT_mfma4:
956 if (value)
957 {
958 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_FMA4_SET;
959 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FMA4_SET;
960 }
961 else
962 {
963 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_FMA4_UNSET;
964 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FMA4_UNSET;
965 }
966 return true;
967
968 case OPT_mxop:
969 if (value)
970 {
971 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_XOP_SET;
972 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_XOP_SET;
973 }
974 else
975 {
976 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_XOP_UNSET;
977 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_XOP_UNSET;
978 }
979 return true;
980
981 case OPT_mlwp:
982 if (value)
983 {
984 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_LWP_SET;
985 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_LWP_SET;
986 }
987 else
988 {
989 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_LWP_UNSET;
990 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_LWP_UNSET;
991 }
992 return true;
993
994 case OPT_mabm:
995 if (value)
996 {
997 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_ABM_SET;
998 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_ABM_SET;
999 }
1000 else
1001 {
1002 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_ABM_UNSET;
1003 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_ABM_UNSET;
1004 }
1005 return true;
1006
1007 case OPT_mbmi:
1008 if (value)
1009 {
1010 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_BMI_SET;
1011 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_BMI_SET;
1012 }
1013 else
1014 {
1015 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_BMI_UNSET;
1016 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_BMI_UNSET;
1017 }
1018 return true;
1019
1020 case OPT_mbmi2:
1021 if (value)
1022 {
1023 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_BMI2_SET;
1024 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_BMI2_SET;
1025 }
1026 else
1027 {
1028 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_BMI2_UNSET;
1029 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_BMI2_UNSET;
1030 }
1031 return true;
1032
1033 case OPT_mlzcnt:
1034 if (value)
1035 {
1036 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_LZCNT_SET;
1037 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_LZCNT_SET;
1038 }
1039 else
1040 {
1041 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_LZCNT_UNSET;
1042 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_LZCNT_UNSET;
1043 }
1044 return true;
1045
1046 case OPT_mtbm:
1047 if (value)
1048 {
1049 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_TBM_SET;
1050 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_TBM_SET;
1051 }
1052 else
1053 {
1054 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_TBM_UNSET;
1055 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_TBM_UNSET;
1056 }
1057 return true;
1058
1059 case OPT_mpopcnt:
1060 if (value)
1061 {
1062 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_POPCNT_SET;
1063 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_POPCNT_SET;
1064 }
1065 else
1066 {
1067 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_POPCNT_UNSET;
1068 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_POPCNT_UNSET;
1069 }
1070 return true;
1071
1072 case OPT_msahf:
1073 if (value)
1074 {
1075 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SAHF_SET;
1076 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SAHF_SET;
1077 }
1078 else
1079 {
1080 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SAHF_UNSET;
1081 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SAHF_UNSET;
1082 }
1083 return true;
1084
1085 case OPT_mcx16:
1086 if (value)
1087 {
1088 opts->x_ix86_isa_flags2 |= OPTION_MASK_ISA2_CX16_SET;
1089 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_CX16_SET;
1090 }
1091 else
1092 {
1093 opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA2_CX16_UNSET;
1094 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_CX16_UNSET;
1095 }
1096 return true;
1097
1098 case OPT_mmovbe:
1099 if (value)
1100 {
1101 opts->x_ix86_isa_flags2 |= OPTION_MASK_ISA2_MOVBE_SET;
1102 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_MOVBE_SET;
1103 }
1104 else
1105 {
1106 opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA2_MOVBE_UNSET;
1107 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_MOVBE_UNSET;
1108 }
1109 return true;
1110
1111 case OPT_mcrc32:
1112 if (value)
1113 {
1114 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_CRC32_SET;
1115 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_CRC32_SET;
1116 }
1117 else
1118 {
1119 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_CRC32_UNSET;
1120 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_CRC32_UNSET;
1121 }
1122 return true;
1123
1124 case OPT_maes:
1125 if (value)
1126 {
1127 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_AES_SET;
1128 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AES_SET;
1129 }
1130 else
1131 {
1132 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AES_UNSET;
1133 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AES_UNSET;
1134 }
1135 return true;
1136
1137 case OPT_msha:
1138 if (value)
1139 {
1140 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SHA_SET;
1141 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SHA_SET;
1142 }
1143 else
1144 {
1145 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SHA_UNSET;
1146 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SHA_UNSET;
1147 }
1148 return true;
1149
1150 case OPT_mpclmul:
1151 if (value)
1152 {
1153 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_PCLMUL_SET;
1154 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_PCLMUL_SET;
1155 }
1156 else
1157 {
1158 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_PCLMUL_UNSET;
1159 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_PCLMUL_UNSET;
1160 }
1161 return true;
1162
1163 case OPT_mfsgsbase:
1164 if (value)
1165 {
1166 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_FSGSBASE_SET;
1167 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FSGSBASE_SET;
1168 }
1169 else
1170 {
1171 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_FSGSBASE_UNSET;
1172 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FSGSBASE_UNSET;
1173 }
1174 return true;
1175
1176 case OPT_mrdrnd:
1177 if (value)
1178 {
1179 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_RDRND_SET;
1180 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_RDRND_SET;
1181 }
1182 else
1183 {
1184 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_RDRND_UNSET;
1185 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_RDRND_UNSET;
1186 }
1187 return true;
1188
1189 case OPT_mptwrite:
1190 if (value)
1191 {
1192 opts->x_ix86_isa_flags2 |= OPTION_MASK_ISA2_PTWRITE_SET;
1193 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_PTWRITE_SET;
1194 }
1195 else
1196 {
1197 opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA2_PTWRITE_UNSET;
1198 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_PTWRITE_UNSET;
1199 }
1200 return true;
1201
1202 case OPT_mf16c:
1203 if (value)
1204 {
1205 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_F16C_SET;
1206 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_F16C_SET;
1207 }
1208 else
1209 {
1210 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_F16C_UNSET;
1211 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_F16C_UNSET;
1212 }
1213 return true;
1214
1215 case OPT_mfxsr:
1216 if (value)
1217 {
1218 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_FXSR_SET;
1219 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FXSR_SET;
1220 }
1221 else
1222 {
1223 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_FXSR_UNSET;
1224 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FXSR_UNSET;
1225 }
1226 return true;
1227
1228 case OPT_mxsave:
1229 if (value)
1230 {
1231 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_XSAVE_SET;
1232 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_XSAVE_SET;
1233 }
1234 else
1235 {
1236 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_XSAVE_UNSET;
1237 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_XSAVE_UNSET;
1238 }
1239 return true;
1240
1241 case OPT_mxsaveopt:
1242 if (value)
1243 {
1244 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_XSAVEOPT_SET;
1245 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_XSAVEOPT_SET;
1246 }
1247 else
1248 {
1249 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_XSAVEOPT_UNSET;
1250 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_XSAVEOPT_UNSET;
1251 }
1252 return true;
1253
1254 case OPT_mxsavec:
1255 if (value)
1256 {
1257 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_XSAVEC_SET;
1258 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_XSAVEC_SET;
1259 }
1260 else
1261 {
1262 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_XSAVEC_UNSET;
1263 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_XSAVEC_UNSET;
1264 }
1265 return true;
1266
1267 case OPT_mxsaves:
1268 if (value)
1269 {
1270 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_XSAVES_SET;
1271 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_XSAVES_SET;
1272 }
1273 else
1274 {
1275 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_XSAVES_UNSET;
1276 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_XSAVES_UNSET;
1277 }
1278 return true;
1279
1280 case OPT_mrdseed:
1281 if (value)
1282 {
1283 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_RDSEED_SET;
1284 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_RDSEED_SET;
1285 }
1286 else
1287 {
1288 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_RDSEED_UNSET;
1289 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_RDSEED_UNSET;
1290 }
1291 return true;
1292
1293 case OPT_mprfchw:
1294 if (value)
1295 {
1296 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_PRFCHW_SET;
1297 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_PRFCHW_SET;
1298 }
1299 else
1300 {
1301 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_PRFCHW_UNSET;
1302 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_PRFCHW_UNSET;
1303 }
1304 return true;
1305
1306 case OPT_madx:
1307 if (value)
1308 {
1309 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_ADX_SET;
1310 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_ADX_SET;
1311 }
1312 else
1313 {
1314 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_ADX_UNSET;
1315 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_ADX_UNSET;
1316 }
1317 return true;
1318
1319 case OPT_mprefetchwt1:
1320 if (value)
1321 {
1322 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_PREFETCHWT1_SET;
1323 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_PREFETCHWT1_SET;
1324 }
1325 else
1326 {
1327 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_PREFETCHWT1_UNSET;
1328 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_PREFETCHWT1_UNSET;
1329 }
1330 return true;
1331
1332 case OPT_mclflushopt:
1333 if (value)
1334 {
1335 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_CLFLUSHOPT_SET;
1336 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_CLFLUSHOPT_SET;
1337 }
1338 else
1339 {
1340 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_CLFLUSHOPT_UNSET;
1341 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_CLFLUSHOPT_UNSET;
1342 }
1343 return true;
1344
1345 case OPT_mclwb:
1346 if (value)
1347 {
1348 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_CLWB_SET;
1349 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_CLWB_SET;
1350 }
1351 else
1352 {
1353 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_CLWB_UNSET;
1354 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_CLWB_UNSET;
1355 }
1356 return true;
1357
1358 case OPT_mmwaitx:
1359 if (value)
1360 {
1361 opts->x_ix86_isa_flags2 |= OPTION_MASK_ISA2_MWAITX_SET;
1362 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_MWAITX_SET;
1363 }
1364 else
1365 {
1366 opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA2_MWAITX_UNSET;
1367 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_MWAITX_UNSET;
1368 }
1369 return true;
1370
1371 case OPT_mclzero:
1372 if (value)
1373 {
1374 opts->x_ix86_isa_flags2 |= OPTION_MASK_ISA2_CLZERO_SET;
1375 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_CLZERO_SET;
1376 }
1377 else
1378 {
1379 opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA2_CLZERO_UNSET;
1380 opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_CLZERO_UNSET;
1381 }
1382 return true;
1383
1384 case OPT_mpku:
1385 if (value)
1386 {
1387 opts->x_ix86_isa_flags |= OPTION_MASK_ISA_PKU_SET;
1388 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_PKU_SET;
1389 }
1390 else
1391 {
1392 opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_PKU_UNSET;
1393 opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_PKU_UNSET;
1394 }
1395 return true;
1396
1397
1398 case OPT_malign_loops_:
1399 warning_at (loc, 0, "%<-malign-loops%> is obsolete, "
1400 "use %<-falign-loops%>");
1401 if (value > MAX_CODE_ALIGN)
1402 error_at (loc, "%<-malign-loops=%d%> is not between 0 and %d",
1403 value, MAX_CODE_ALIGN);
1404 else
1405 set_malign_value (&opts->x_str_align_loops, value);
1406 return true;
1407
1408 case OPT_malign_jumps_:
1409 warning_at (loc, 0, "%<-malign-jumps%> is obsolete, "
1410 "use %<-falign-jumps%>");
1411 if (value > MAX_CODE_ALIGN)
1412 error_at (loc, "%<-malign-jumps=%d%> is not between 0 and %d",
1413 value, MAX_CODE_ALIGN);
1414 else
1415 set_malign_value (&opts->x_str_align_jumps, value);
1416 return true;
1417
1418 case OPT_malign_functions_:
1419 warning_at (loc, 0,
1420 "%<-malign-functions%> is obsolete, "
1421 "use %<-falign-functions%>");
1422 if (value > MAX_CODE_ALIGN)
1423 error_at (loc, "%<-malign-functions=%d%> is not between 0 and %d",
1424 value, MAX_CODE_ALIGN);
1425 else
1426 set_malign_value (&opts->x_str_align_functions, value);
1427 return true;
1428
1429 case OPT_mbranch_cost_:
1430 if (value > 5)
1431 {
1432 error_at (loc, "%<-mbranch-cost=%d%> is not between 0 and 5", value);
1433 opts->x_ix86_branch_cost = 5;
1434 }
1435 return true;
1436
1437 default:
1438 return true;
1439 }
1440 }
1441
1442 static const struct default_options ix86_option_optimization_table[] =
1443 {
1444 /* Enable redundant extension instructions removal at -O2 and higher. */
1445 { OPT_LEVELS_2_PLUS, OPT_free, NULL, 1 },
1446 /* Enable function splitting at -O2 and higher. */
1447 { OPT_LEVELS_2_PLUS, OPT_freorder_blocks_and_partition, NULL, 1 },
1448 /* The STC algorithm produces the smallest code at -Os, for x86. */
1449 { OPT_LEVELS_2_PLUS, OPT_freorder_blocks_algorithm_, NULL,
1450 REORDER_BLOCKS_ALGORITHM_STC },
1451 /* Turn off -fschedule-insns by default. It tends to make the
1452 problem with not enough registers even worse. */
1453 { OPT_LEVELS_ALL, OPT_fschedule_insns, NULL, 0 },
1454
1455 #ifdef SUBTARGET_OPTIMIZATION_OPTIONS
1456 SUBTARGET_OPTIMIZATION_OPTIONS,
1457 #endif
1458 { OPT_LEVELS_NONE, 0, NULL, 0 }
1459 };
1460
1461 /* Implement TARGET_OPTION_INIT_STRUCT. */
1462
1463 static void
ix86_option_init_struct(struct gcc_options * opts)1464 ix86_option_init_struct (struct gcc_options *opts)
1465 {
1466 if (TARGET_MACHO)
1467 /* The Darwin libraries never set errno, so we might as well
1468 avoid calling them when that's the only reason we would. */
1469 opts->x_flag_errno_math = 0;
1470
1471 opts->x_flag_pcc_struct_return = 2;
1472 opts->x_flag_asynchronous_unwind_tables = 2;
1473 }
1474
1475 /* On the x86 -fsplit-stack and -fstack-protector both use the same
1476 field in the TCB, so they cannot be used together. */
1477
1478 static bool
ix86_supports_split_stack(bool report ATTRIBUTE_UNUSED,struct gcc_options * opts ATTRIBUTE_UNUSED)1479 ix86_supports_split_stack (bool report ATTRIBUTE_UNUSED,
1480 struct gcc_options *opts ATTRIBUTE_UNUSED)
1481 {
1482 bool ret = true;
1483
1484 #ifndef TARGET_THREAD_SPLIT_STACK_OFFSET
1485 if (report)
1486 error ("%<-fsplit-stack%> currently only supported on GNU/Linux");
1487 ret = false;
1488 #else
1489 if (!HAVE_GAS_CFI_PERSONALITY_DIRECTIVE)
1490 {
1491 if (report)
1492 error ("%<-fsplit-stack%> requires "
1493 "assembler support for CFI directives");
1494 ret = false;
1495 }
1496 #endif
1497
1498 return ret;
1499 }
1500
1501 /* Implement TARGET_EXCEPT_UNWIND_INFO. */
1502
1503 static enum unwind_info_type
i386_except_unwind_info(struct gcc_options * opts)1504 i386_except_unwind_info (struct gcc_options *opts)
1505 {
1506 /* Honor the --enable-sjlj-exceptions configure switch. */
1507 #ifdef CONFIG_SJLJ_EXCEPTIONS
1508 if (CONFIG_SJLJ_EXCEPTIONS)
1509 return UI_SJLJ;
1510 #endif
1511
1512 /* On windows 64, prefer SEH exceptions over anything else. */
1513 if (TARGET_64BIT && DEFAULT_ABI == MS_ABI && opts->x_flag_unwind_tables)
1514 return UI_SEH;
1515
1516 if (DWARF2_UNWIND_INFO)
1517 return UI_DWARF2;
1518
1519 return UI_SJLJ;
1520 }
1521
1522 #undef TARGET_EXCEPT_UNWIND_INFO
1523 #define TARGET_EXCEPT_UNWIND_INFO i386_except_unwind_info
1524
1525 #undef TARGET_DEFAULT_TARGET_FLAGS
1526 #define TARGET_DEFAULT_TARGET_FLAGS \
1527 (TARGET_DEFAULT \
1528 | TARGET_SUBTARGET_DEFAULT \
1529 | TARGET_TLS_DIRECT_SEG_REFS_DEFAULT)
1530
1531 #undef TARGET_HANDLE_OPTION
1532 #define TARGET_HANDLE_OPTION ix86_handle_option
1533
1534 #undef TARGET_OPTION_OPTIMIZATION_TABLE
1535 #define TARGET_OPTION_OPTIMIZATION_TABLE ix86_option_optimization_table
1536 #undef TARGET_OPTION_INIT_STRUCT
1537 #define TARGET_OPTION_INIT_STRUCT ix86_option_init_struct
1538
1539 #undef TARGET_SUPPORTS_SPLIT_STACK
1540 #define TARGET_SUPPORTS_SPLIT_STACK ix86_supports_split_stack
1541
1542 /* This table must be in sync with enum processor_type in i386.h. */
1543 const char *const processor_names[] =
1544 {
1545 "generic",
1546 "i386",
1547 "i486",
1548 "pentium",
1549 "lakemont",
1550 "pentiumpro",
1551 "pentium4",
1552 "nocona",
1553 "core2",
1554 "nehalem",
1555 "sandybridge",
1556 "haswell",
1557 "bonnell",
1558 "silvermont",
1559 "goldmont",
1560 "goldmont-plus",
1561 "tremont",
1562 "knl",
1563 "knm",
1564 "skylake",
1565 "skylake-avx512",
1566 "cannonlake",
1567 "icelake-client",
1568 "icelake-server",
1569 "cascadelake",
1570 "tigerlake",
1571 "cooperlake",
1572 "intel",
1573 "geode",
1574 "k6",
1575 "athlon",
1576 "k8",
1577 "amdfam10",
1578 "bdver1",
1579 "bdver2",
1580 "bdver3",
1581 "bdver4",
1582 "btver1",
1583 "btver2",
1584 "znver1",
1585 "znver2",
1586 "znver3"
1587 };
1588
1589 /* Guarantee that the array is aligned with enum processor_type. */
1590 STATIC_ASSERT (ARRAY_SIZE (processor_names) == PROCESSOR_max);
1591
1592 const pta processor_alias_table[] =
1593 {
1594 {"i386", PROCESSOR_I386, CPU_NONE, 0, 0, P_NONE},
1595 {"i486", PROCESSOR_I486, CPU_NONE, 0, 0, P_NONE},
1596 {"i586", PROCESSOR_PENTIUM, CPU_PENTIUM, 0, 0, P_NONE},
1597 {"pentium", PROCESSOR_PENTIUM, CPU_PENTIUM, 0, 0, P_NONE},
1598 {"lakemont", PROCESSOR_LAKEMONT, CPU_PENTIUM, PTA_NO_80387,
1599 0, P_NONE},
1600 {"pentium-mmx", PROCESSOR_PENTIUM, CPU_PENTIUM, PTA_MMX, 0, P_NONE},
1601 {"winchip-c6", PROCESSOR_I486, CPU_NONE, PTA_MMX, 0, P_NONE},
1602 {"winchip2", PROCESSOR_I486, CPU_NONE, PTA_MMX | PTA_3DNOW,
1603 0, P_NONE},
1604 {"c3", PROCESSOR_I486, CPU_NONE, PTA_MMX | PTA_3DNOW, 0, P_NONE},
1605 {"samuel-2", PROCESSOR_I486, CPU_NONE, PTA_MMX | PTA_3DNOW,
1606 0, P_NONE},
1607 {"c3-2", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO,
1608 PTA_MMX | PTA_SSE | PTA_FXSR, 0, P_NONE},
1609 {"nehemiah", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO,
1610 PTA_MMX | PTA_SSE | PTA_FXSR, 0, P_NONE},
1611 {"c7", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO,
1612 PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3 | PTA_FXSR, 0, P_NONE},
1613 {"esther", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO,
1614 PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3 | PTA_FXSR, 0, P_NONE},
1615 {"i686", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO, 0, 0, P_NONE},
1616 {"pentiumpro", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO, 0, 0, P_NONE},
1617 {"pentium2", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO, PTA_MMX | PTA_FXSR,
1618 0, P_NONE},
1619 {"pentium3", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO,
1620 PTA_MMX | PTA_SSE | PTA_FXSR, 0, P_NONE},
1621 {"pentium3m", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO,
1622 PTA_MMX | PTA_SSE | PTA_FXSR, 0, P_NONE},
1623 {"pentium-m", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO,
1624 PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_FXSR, 0, P_NONE},
1625 {"pentium4", PROCESSOR_PENTIUM4, CPU_NONE,
1626 PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_FXSR, 0, P_NONE},
1627 {"pentium4m", PROCESSOR_PENTIUM4, CPU_NONE,
1628 PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_FXSR, 0, P_NONE},
1629 {"prescott", PROCESSOR_NOCONA, CPU_NONE,
1630 PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3 | PTA_FXSR, 0, P_NONE},
1631 {"nocona", PROCESSOR_NOCONA, CPU_NONE,
1632 PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
1633 | PTA_CX16 | PTA_NO_SAHF | PTA_FXSR, 0, P_NONE},
1634 {"core2", PROCESSOR_CORE2, CPU_CORE2, PTA_CORE2,
1635 M_CPU_TYPE (INTEL_CORE2), P_PROC_SSSE3},
1636 {"nehalem", PROCESSOR_NEHALEM, CPU_NEHALEM, PTA_NEHALEM,
1637 M_CPU_SUBTYPE (INTEL_COREI7_NEHALEM), P_PROC_DYNAMIC},
1638 {"corei7", PROCESSOR_NEHALEM, CPU_NEHALEM, PTA_NEHALEM,
1639 M_CPU_TYPE (INTEL_COREI7), P_PROC_DYNAMIC},
1640 {"westmere", PROCESSOR_NEHALEM, CPU_NEHALEM, PTA_WESTMERE,
1641 M_CPU_SUBTYPE (INTEL_COREI7_WESTMERE), P_PROC_DYNAMIC},
1642 {"sandybridge", PROCESSOR_SANDYBRIDGE, CPU_NEHALEM,
1643 PTA_SANDYBRIDGE,
1644 M_CPU_SUBTYPE (INTEL_COREI7_SANDYBRIDGE), P_PROC_DYNAMIC},
1645 {"corei7-avx", PROCESSOR_SANDYBRIDGE, CPU_NEHALEM,
1646 PTA_SANDYBRIDGE, 0, P_PROC_DYNAMIC},
1647 {"ivybridge", PROCESSOR_SANDYBRIDGE, CPU_NEHALEM,
1648 PTA_IVYBRIDGE,
1649 M_CPU_SUBTYPE (INTEL_COREI7_IVYBRIDGE), P_PROC_DYNAMIC},
1650 {"core-avx-i", PROCESSOR_SANDYBRIDGE, CPU_NEHALEM,
1651 PTA_IVYBRIDGE, 0, P_PROC_DYNAMIC},
1652 {"haswell", PROCESSOR_HASWELL, CPU_HASWELL, PTA_HASWELL,
1653 M_CPU_SUBTYPE (INTEL_COREI7_HASWELL), P_PROC_DYNAMIC},
1654 {"core-avx2", PROCESSOR_HASWELL, CPU_HASWELL, PTA_HASWELL,
1655 0, P_PROC_DYNAMIC},
1656 {"broadwell", PROCESSOR_HASWELL, CPU_HASWELL, PTA_BROADWELL,
1657 M_CPU_SUBTYPE (INTEL_COREI7_BROADWELL), P_PROC_DYNAMIC},
1658 {"skylake", PROCESSOR_SKYLAKE, CPU_HASWELL, PTA_SKYLAKE,
1659 M_CPU_SUBTYPE (INTEL_COREI7_SKYLAKE), P_PROC_AVX2},
1660 {"skylake-avx512", PROCESSOR_SKYLAKE_AVX512, CPU_HASWELL,
1661 PTA_SKYLAKE_AVX512,
1662 M_CPU_SUBTYPE (INTEL_COREI7_SKYLAKE_AVX512), P_PROC_AVX512F},
1663 {"cannonlake", PROCESSOR_CANNONLAKE, CPU_HASWELL, PTA_CANNONLAKE,
1664 M_CPU_SUBTYPE (INTEL_COREI7_CANNONLAKE), P_PROC_AVX512F},
1665 {"icelake-client", PROCESSOR_ICELAKE_CLIENT, CPU_HASWELL,
1666 PTA_ICELAKE_CLIENT,
1667 M_CPU_SUBTYPE (INTEL_COREI7_ICELAKE_CLIENT), P_PROC_AVX512F},
1668 {"icelake-server", PROCESSOR_ICELAKE_SERVER, CPU_HASWELL,
1669 PTA_ICELAKE_SERVER,
1670 M_CPU_SUBTYPE (INTEL_COREI7_ICELAKE_SERVER), P_PROC_AVX512F},
1671 {"cascadelake", PROCESSOR_CASCADELAKE, CPU_HASWELL,
1672 PTA_CASCADELAKE,
1673 M_CPU_SUBTYPE (INTEL_COREI7_CASCADELAKE), P_PROC_AVX512F},
1674 {"tigerlake", PROCESSOR_TIGERLAKE, CPU_HASWELL, PTA_TIGERLAKE,
1675 M_CPU_SUBTYPE (INTEL_COREI7_TIGERLAKE), P_PROC_AVX512F},
1676 {"cooperlake", PROCESSOR_COOPERLAKE, CPU_HASWELL, PTA_COOPERLAKE,
1677 M_CPU_SUBTYPE (INTEL_COREI7_COOPERLAKE), P_PROC_AVX512F},
1678 {"bonnell", PROCESSOR_BONNELL, CPU_ATOM, PTA_BONNELL,
1679 M_CPU_TYPE (INTEL_BONNELL), P_PROC_SSSE3},
1680 {"atom", PROCESSOR_BONNELL, CPU_ATOM, PTA_BONNELL,
1681 M_CPU_TYPE (INTEL_BONNELL), P_PROC_SSSE3},
1682 {"silvermont", PROCESSOR_SILVERMONT, CPU_SLM, PTA_SILVERMONT,
1683 M_CPU_TYPE (INTEL_SILVERMONT), P_PROC_SSE4_2},
1684 {"slm", PROCESSOR_SILVERMONT, CPU_SLM, PTA_SILVERMONT,
1685 M_CPU_TYPE (INTEL_SILVERMONT), P_PROC_SSE4_2},
1686 {"goldmont", PROCESSOR_GOLDMONT, CPU_GLM, PTA_GOLDMONT,
1687 M_CPU_TYPE (INTEL_GOLDMONT), P_PROC_SSE4_2},
1688 {"goldmont-plus", PROCESSOR_GOLDMONT_PLUS, CPU_GLM, PTA_GOLDMONT_PLUS,
1689 M_CPU_TYPE (INTEL_GOLDMONT_PLUS), P_PROC_SSE4_2},
1690 {"tremont", PROCESSOR_TREMONT, CPU_GLM, PTA_TREMONT,
1691 M_CPU_TYPE (INTEL_TREMONT), P_PROC_SSE4_2},
1692 {"knl", PROCESSOR_KNL, CPU_SLM, PTA_KNL,
1693 M_CPU_TYPE (INTEL_KNL), P_PROC_AVX512F},
1694 {"knm", PROCESSOR_KNM, CPU_SLM, PTA_KNM,
1695 M_CPU_TYPE (INTEL_KNM), P_PROC_AVX512F},
1696 {"intel", PROCESSOR_INTEL, CPU_SLM, PTA_NEHALEM,
1697 M_VENDOR (VENDOR_INTEL), P_NONE},
1698 {"geode", PROCESSOR_GEODE, CPU_GEODE,
1699 PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_PREFETCH_SSE, 0, P_NONE},
1700 {"k6", PROCESSOR_K6, CPU_K6, PTA_MMX, 0, P_NONE},
1701 {"k6-2", PROCESSOR_K6, CPU_K6, PTA_MMX | PTA_3DNOW, 0, P_NONE},
1702 {"k6-3", PROCESSOR_K6, CPU_K6, PTA_MMX | PTA_3DNOW, 0, P_NONE},
1703 {"athlon", PROCESSOR_ATHLON, CPU_ATHLON,
1704 PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_PREFETCH_SSE, 0, P_NONE},
1705 {"athlon-tbird", PROCESSOR_ATHLON, CPU_ATHLON,
1706 PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_PREFETCH_SSE, 0, P_NONE},
1707 {"athlon-4", PROCESSOR_ATHLON, CPU_ATHLON,
1708 PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE | PTA_FXSR, 0, P_NONE},
1709 {"athlon-xp", PROCESSOR_ATHLON, CPU_ATHLON,
1710 PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE | PTA_FXSR, 0, P_NONE},
1711 {"athlon-mp", PROCESSOR_ATHLON, CPU_ATHLON,
1712 PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE | PTA_FXSR, 0, P_NONE},
1713 {"x86-64", PROCESSOR_K8, CPU_K8,
1714 PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_NO_SAHF | PTA_FXSR,
1715 0, P_NONE},
1716 {"eden-x2", PROCESSOR_K8, CPU_K8,
1717 PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3 | PTA_FXSR,
1718 0, P_NONE},
1719 {"nano", PROCESSOR_K8, CPU_K8,
1720 PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
1721 | PTA_SSSE3 | PTA_FXSR, 0, P_NONE},
1722 {"nano-1000", PROCESSOR_K8, CPU_K8,
1723 PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
1724 | PTA_SSSE3 | PTA_FXSR, 0, P_NONE},
1725 {"nano-2000", PROCESSOR_K8, CPU_K8,
1726 PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
1727 | PTA_SSSE3 | PTA_FXSR, 0, P_NONE},
1728 {"nano-3000", PROCESSOR_K8, CPU_K8,
1729 PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
1730 | PTA_SSSE3 | PTA_SSE4_1 | PTA_FXSR, 0, P_NONE},
1731 {"nano-x2", PROCESSOR_K8, CPU_K8,
1732 PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
1733 | PTA_SSSE3 | PTA_SSE4_1 | PTA_FXSR, 0, P_NONE},
1734 {"eden-x4", PROCESSOR_K8, CPU_K8,
1735 PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
1736 | PTA_SSSE3 | PTA_SSE4_1 | PTA_FXSR, 0, P_NONE},
1737 {"nano-x4", PROCESSOR_K8, CPU_K8,
1738 PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
1739 | PTA_SSSE3 | PTA_SSE4_1 | PTA_FXSR, 0, P_NONE},
1740 {"k8", PROCESSOR_K8, CPU_K8,
1741 PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
1742 | PTA_SSE2 | PTA_NO_SAHF | PTA_FXSR, 0, P_NONE},
1743 {"k8-sse3", PROCESSOR_K8, CPU_K8,
1744 PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
1745 | PTA_SSE2 | PTA_SSE3 | PTA_NO_SAHF | PTA_FXSR, 0, P_NONE},
1746 {"opteron", PROCESSOR_K8, CPU_K8,
1747 PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
1748 | PTA_SSE2 | PTA_NO_SAHF | PTA_FXSR, 0, P_NONE},
1749 {"opteron-sse3", PROCESSOR_K8, CPU_K8,
1750 PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
1751 | PTA_SSE2 | PTA_SSE3 | PTA_NO_SAHF | PTA_FXSR, 0, P_NONE},
1752 {"athlon64", PROCESSOR_K8, CPU_K8,
1753 PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
1754 | PTA_SSE2 | PTA_NO_SAHF | PTA_FXSR, 0, P_NONE},
1755 {"athlon64-sse3", PROCESSOR_K8, CPU_K8,
1756 PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
1757 | PTA_SSE2 | PTA_SSE3 | PTA_NO_SAHF | PTA_FXSR, 0, P_NONE},
1758 {"athlon-fx", PROCESSOR_K8, CPU_K8,
1759 PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
1760 | PTA_SSE2 | PTA_NO_SAHF | PTA_FXSR, 0, P_NONE},
1761 {"amdfam10", PROCESSOR_AMDFAM10, CPU_AMDFAM10,
1762 PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE | PTA_SSE2
1763 | PTA_SSE3 | PTA_SSE4A | PTA_CX16 | PTA_ABM | PTA_PRFCHW | PTA_FXSR,
1764 0, P_PROC_DYNAMIC},
1765 {"barcelona", PROCESSOR_AMDFAM10, CPU_AMDFAM10,
1766 PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE | PTA_SSE2
1767 | PTA_SSE3 | PTA_SSE4A | PTA_CX16 | PTA_ABM | PTA_PRFCHW | PTA_FXSR,
1768 M_CPU_SUBTYPE (AMDFAM10H_BARCELONA), P_PROC_DYNAMIC},
1769 {"bdver1", PROCESSOR_BDVER1, CPU_BDVER1,
1770 PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
1771 | PTA_SSE4A | PTA_CX16 | PTA_ABM | PTA_SSSE3 | PTA_SSE4_1
1772 | PTA_SSE4_2 | PTA_AES | PTA_PCLMUL | PTA_AVX | PTA_FMA4
1773 | PTA_XOP | PTA_LWP | PTA_PRFCHW | PTA_FXSR | PTA_XSAVE,
1774 M_CPU_TYPE (AMDFAM15H_BDVER1), P_PROC_XOP},
1775 {"bdver2", PROCESSOR_BDVER2, CPU_BDVER2,
1776 PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
1777 | PTA_SSE4A | PTA_CX16 | PTA_ABM | PTA_SSSE3 | PTA_SSE4_1
1778 | PTA_SSE4_2 | PTA_AES | PTA_PCLMUL | PTA_AVX | PTA_FMA4
1779 | PTA_XOP | PTA_LWP | PTA_BMI | PTA_TBM | PTA_F16C
1780 | PTA_FMA | PTA_PRFCHW | PTA_FXSR | PTA_XSAVE,
1781 M_CPU_TYPE (AMDFAM15H_BDVER2), P_PROC_FMA},
1782 {"bdver3", PROCESSOR_BDVER3, CPU_BDVER3,
1783 PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
1784 | PTA_SSE4A | PTA_CX16 | PTA_ABM | PTA_SSSE3 | PTA_SSE4_1
1785 | PTA_SSE4_2 | PTA_AES | PTA_PCLMUL | PTA_AVX | PTA_FMA4
1786 | PTA_XOP | PTA_LWP | PTA_BMI | PTA_TBM | PTA_F16C
1787 | PTA_FMA | PTA_PRFCHW | PTA_FXSR | PTA_XSAVE
1788 | PTA_XSAVEOPT | PTA_FSGSBASE,
1789 M_CPU_SUBTYPE (AMDFAM15H_BDVER3), P_PROC_FMA},
1790 {"bdver4", PROCESSOR_BDVER4, CPU_BDVER4,
1791 PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
1792 | PTA_SSE4A | PTA_CX16 | PTA_ABM | PTA_SSSE3 | PTA_SSE4_1
1793 | PTA_SSE4_2 | PTA_AES | PTA_PCLMUL | PTA_AVX | PTA_AVX2
1794 | PTA_FMA4 | PTA_XOP | PTA_LWP | PTA_BMI | PTA_BMI2
1795 | PTA_TBM | PTA_F16C | PTA_FMA | PTA_PRFCHW | PTA_FXSR
1796 | PTA_XSAVE | PTA_XSAVEOPT | PTA_FSGSBASE | PTA_RDRND
1797 | PTA_MOVBE | PTA_MWAITX,
1798 M_CPU_SUBTYPE (AMDFAM15H_BDVER4), P_PROC_AVX2},
1799 {"znver1", PROCESSOR_ZNVER1, CPU_ZNVER1,
1800 PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
1801 | PTA_SSE4A | PTA_CX16 | PTA_ABM | PTA_SSSE3 | PTA_SSE4_1
1802 | PTA_SSE4_2 | PTA_AES | PTA_PCLMUL | PTA_AVX | PTA_AVX2
1803 | PTA_BMI | PTA_BMI2 | PTA_F16C | PTA_FMA | PTA_PRFCHW
1804 | PTA_FXSR | PTA_XSAVE | PTA_XSAVEOPT | PTA_FSGSBASE
1805 | PTA_RDRND | PTA_MOVBE | PTA_MWAITX | PTA_ADX | PTA_RDSEED
1806 | PTA_CLZERO | PTA_CLFLUSHOPT | PTA_XSAVEC | PTA_XSAVES
1807 | PTA_SHA | PTA_LZCNT | PTA_POPCNT,
1808 M_CPU_SUBTYPE (AMDFAM17H_ZNVER1), P_PROC_AVX2},
1809 {"znver2", PROCESSOR_ZNVER2, CPU_ZNVER2,
1810 PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
1811 | PTA_SSE4A | PTA_CX16 | PTA_ABM | PTA_SSSE3 | PTA_SSE4_1
1812 | PTA_SSE4_2 | PTA_AES | PTA_PCLMUL | PTA_AVX | PTA_AVX2
1813 | PTA_BMI | PTA_BMI2 | PTA_F16C | PTA_FMA | PTA_PRFCHW
1814 | PTA_FXSR | PTA_XSAVE | PTA_XSAVEOPT | PTA_FSGSBASE
1815 | PTA_RDRND | PTA_MOVBE | PTA_MWAITX | PTA_ADX | PTA_RDSEED
1816 | PTA_CLZERO | PTA_CLFLUSHOPT | PTA_XSAVEC | PTA_XSAVES
1817 | PTA_SHA | PTA_LZCNT | PTA_POPCNT | PTA_CLWB | PTA_RDPID
1818 | PTA_WBNOINVD,
1819 M_CPU_SUBTYPE (AMDFAM17H_ZNVER2), P_PROC_AVX2},
1820 {"znver3", PROCESSOR_ZNVER2, CPU_ZNVER2,
1821 PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
1822 | PTA_SSE4A | PTA_CX16 | PTA_ABM | PTA_SSSE3 | PTA_SSE4_1
1823 | PTA_SSE4_2 | PTA_AES | PTA_PCLMUL | PTA_AVX | PTA_AVX2
1824 | PTA_BMI | PTA_BMI2 | PTA_F16C | PTA_FMA | PTA_PRFCHW
1825 | PTA_FXSR | PTA_XSAVE | PTA_XSAVEOPT | PTA_FSGSBASE
1826 | PTA_RDRND | PTA_MOVBE | PTA_MWAITX | PTA_ADX | PTA_RDSEED
1827 | PTA_CLZERO | PTA_CLFLUSHOPT | PTA_XSAVEC | PTA_XSAVES
1828 | PTA_SHA | PTA_LZCNT | PTA_POPCNT | PTA_CLWB | PTA_RDPID
1829 | PTA_WBNOINVD | PTA_VAES | PTA_VPCLMULQDQ | PTA_PKU,
1830 M_CPU_SUBTYPE (AMDFAM19H_ZNVER3), P_PROC_AVX2},
1831 {"btver1", PROCESSOR_BTVER1, CPU_GENERIC,
1832 PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
1833 | PTA_SSSE3 | PTA_SSE4A | PTA_ABM | PTA_CX16 | PTA_PRFCHW
1834 | PTA_FXSR | PTA_XSAVE,
1835 M_CPU_SUBTYPE (AMDFAM15H_BDVER1), P_PROC_SSE4_A},
1836 {"btver2", PROCESSOR_BTVER2, CPU_BTVER2,
1837 PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
1838 | PTA_SSSE3 | PTA_SSE4A | PTA_ABM | PTA_CX16 | PTA_SSE4_1
1839 | PTA_SSE4_2 | PTA_AES | PTA_PCLMUL | PTA_AVX
1840 | PTA_BMI | PTA_F16C | PTA_MOVBE | PTA_PRFCHW
1841 | PTA_FXSR | PTA_XSAVE | PTA_XSAVEOPT,
1842 M_CPU_TYPE (AMD_BTVER2), P_PROC_BMI},
1843
1844 {"generic", PROCESSOR_GENERIC, CPU_GENERIC,
1845 PTA_64BIT
1846 | PTA_HLE /* flags are only used for -march switch. */,
1847 0, P_NONE},
1848
1849 {"amd", PROCESSOR_GENERIC, CPU_GENERIC, 0,
1850 M_VENDOR (VENDOR_AMD), P_NONE},
1851 {"amdfam10h", PROCESSOR_GENERIC, CPU_GENERIC, 0,
1852 M_CPU_TYPE (AMDFAM10H), P_NONE},
1853 {"amdfam15h", PROCESSOR_GENERIC, CPU_GENERIC, 0,
1854 M_CPU_TYPE (AMDFAM15H), P_NONE},
1855 {"amdfam17h", PROCESSOR_GENERIC, CPU_GENERIC, 0,
1856 M_CPU_TYPE (AMDFAM17H), P_NONE},
1857 {"amdfam19h", PROCESSOR_GENERIC, CPU_GENERIC, 0,
1858 M_CPU_TYPE (AMDFAM19H), P_NONE},
1859 {"shanghai", PROCESSOR_GENERIC, CPU_GENERIC, 0,
1860 M_CPU_TYPE (AMDFAM10H_SHANGHAI), P_NONE},
1861 {"istanbul", PROCESSOR_GENERIC, CPU_GENERIC, 0,
1862 M_CPU_TYPE (AMDFAM10H_ISTANBUL), P_NONE},
1863 };
1864
1865 /* NB: processor_alias_table stops at the "generic" entry. */
1866 int const pta_size = ARRAY_SIZE (processor_alias_table) - 7;
1867 unsigned int const num_arch_names = ARRAY_SIZE (processor_alias_table);
1868
1869 /* Provide valid option values for -march and -mtune options. */
1870
1871 vec<const char *>
ix86_get_valid_option_values(int option_code,const char * prefix ATTRIBUTE_UNUSED)1872 ix86_get_valid_option_values (int option_code,
1873 const char *prefix ATTRIBUTE_UNUSED)
1874 {
1875 vec<const char *> v;
1876 v.create (0);
1877 opt_code opt = (opt_code) option_code;
1878
1879 switch (opt)
1880 {
1881 case OPT_march_:
1882 for (unsigned i = 0; i < pta_size; i++)
1883 {
1884 const char *name = processor_alias_table[i].name;
1885 gcc_checking_assert (name != NULL);
1886 v.safe_push (name);
1887 }
1888 #ifdef HAVE_LOCAL_CPU_DETECT
1889 /* Add also "native" as possible value. */
1890 v.safe_push ("native");
1891 #endif
1892
1893 break;
1894 case OPT_mtune_:
1895 for (unsigned i = 0; i < PROCESSOR_max; i++)
1896 {
1897 const char *name = processor_names[i];
1898 gcc_checking_assert (name != NULL);
1899 v.safe_push (name);
1900 }
1901 break;
1902 default:
1903 break;
1904 }
1905
1906 return v;
1907 }
1908
1909 #undef TARGET_GET_VALID_OPTION_VALUES
1910 #define TARGET_GET_VALID_OPTION_VALUES ix86_get_valid_option_values
1911
1912 struct gcc_targetm_common targetm_common = TARGETM_COMMON_INITIALIZER;
1913