xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/common/config/i386/i386-common.c (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
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