OSDN Git Service

1fd33bd39f8b114971d9436ceb0c170be5922c72
[pf3gnuchains/gcc-fork.git] / gcc / common / config / i386 / i386-common.c
1 /* IA-32 common hooks.
2    Copyright (C) 1988, 1992, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3    2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
4    Free Software Foundation, Inc.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
11 any later version.
12
13 GCC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "diagnostic-core.h"
26 #include "tm.h"
27 #include "tm_p.h"
28 #include "common/common-target.h"
29 #include "common/common-target-def.h"
30 #include "opts.h"
31 #include "flags.h"
32
33 /* Define a set of ISAs which are available when a given ISA is
34    enabled.  MMX and SSE ISAs are handled separately.  */
35
36 #define OPTION_MASK_ISA_MMX_SET OPTION_MASK_ISA_MMX
37 #define OPTION_MASK_ISA_3DNOW_SET \
38   (OPTION_MASK_ISA_3DNOW | OPTION_MASK_ISA_MMX_SET)
39
40 #define OPTION_MASK_ISA_SSE_SET OPTION_MASK_ISA_SSE
41 #define OPTION_MASK_ISA_SSE2_SET \
42   (OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_SSE_SET)
43 #define OPTION_MASK_ISA_SSE3_SET \
44   (OPTION_MASK_ISA_SSE3 | OPTION_MASK_ISA_SSE2_SET)
45 #define OPTION_MASK_ISA_SSSE3_SET \
46   (OPTION_MASK_ISA_SSSE3 | OPTION_MASK_ISA_SSE3_SET)
47 #define OPTION_MASK_ISA_SSE4_1_SET \
48   (OPTION_MASK_ISA_SSE4_1 | OPTION_MASK_ISA_SSSE3_SET)
49 #define OPTION_MASK_ISA_SSE4_2_SET \
50   (OPTION_MASK_ISA_SSE4_2 | OPTION_MASK_ISA_SSE4_1_SET)
51 #define OPTION_MASK_ISA_AVX_SET \
52   (OPTION_MASK_ISA_AVX | OPTION_MASK_ISA_SSE4_2_SET)
53 #define OPTION_MASK_ISA_FMA_SET \
54   (OPTION_MASK_ISA_FMA | OPTION_MASK_ISA_AVX_SET)
55
56 /* SSE4 includes both SSE4.1 and SSE4.2. -msse4 should be the same
57    as -msse4.2.  */
58 #define OPTION_MASK_ISA_SSE4_SET OPTION_MASK_ISA_SSE4_2_SET
59
60 #define OPTION_MASK_ISA_SSE4A_SET \
61   (OPTION_MASK_ISA_SSE4A | OPTION_MASK_ISA_SSE3_SET)
62 #define OPTION_MASK_ISA_FMA4_SET \
63   (OPTION_MASK_ISA_FMA4 | OPTION_MASK_ISA_SSE4A_SET \
64    | OPTION_MASK_ISA_AVX_SET)
65 #define OPTION_MASK_ISA_XOP_SET \
66   (OPTION_MASK_ISA_XOP | OPTION_MASK_ISA_FMA4_SET)
67 #define OPTION_MASK_ISA_LWP_SET \
68   OPTION_MASK_ISA_LWP
69
70 /* AES and PCLMUL need SSE2 because they use xmm registers */
71 #define OPTION_MASK_ISA_AES_SET \
72   (OPTION_MASK_ISA_AES | OPTION_MASK_ISA_SSE2_SET)
73 #define OPTION_MASK_ISA_PCLMUL_SET \
74   (OPTION_MASK_ISA_PCLMUL | OPTION_MASK_ISA_SSE2_SET)
75
76 #define OPTION_MASK_ISA_ABM_SET \
77   (OPTION_MASK_ISA_ABM | OPTION_MASK_ISA_POPCNT)
78
79 #define OPTION_MASK_ISA_BMI_SET OPTION_MASK_ISA_BMI
80 #define OPTION_MASK_ISA_TBM_SET OPTION_MASK_ISA_TBM
81 #define OPTION_MASK_ISA_POPCNT_SET OPTION_MASK_ISA_POPCNT
82 #define OPTION_MASK_ISA_CX16_SET OPTION_MASK_ISA_CX16
83 #define OPTION_MASK_ISA_SAHF_SET OPTION_MASK_ISA_SAHF
84 #define OPTION_MASK_ISA_MOVBE_SET OPTION_MASK_ISA_MOVBE
85 #define OPTION_MASK_ISA_CRC32_SET OPTION_MASK_ISA_CRC32
86
87 #define OPTION_MASK_ISA_FSGSBASE_SET OPTION_MASK_ISA_FSGSBASE
88 #define OPTION_MASK_ISA_RDRND_SET OPTION_MASK_ISA_RDRND
89 #define OPTION_MASK_ISA_F16C_SET \
90   (OPTION_MASK_ISA_F16C | OPTION_MASK_ISA_AVX_SET)
91
92 /* Define a set of ISAs which aren't available when a given ISA is
93    disabled.  MMX and SSE ISAs are handled separately.  */
94
95 #define OPTION_MASK_ISA_MMX_UNSET \
96   (OPTION_MASK_ISA_MMX | OPTION_MASK_ISA_3DNOW_UNSET)
97 #define OPTION_MASK_ISA_3DNOW_UNSET \
98   (OPTION_MASK_ISA_3DNOW | OPTION_MASK_ISA_3DNOW_A_UNSET)
99 #define OPTION_MASK_ISA_3DNOW_A_UNSET OPTION_MASK_ISA_3DNOW_A
100
101 #define OPTION_MASK_ISA_SSE_UNSET \
102   (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_SSE2_UNSET)
103 #define OPTION_MASK_ISA_SSE2_UNSET \
104   (OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_SSE3_UNSET)
105 #define OPTION_MASK_ISA_SSE3_UNSET \
106   (OPTION_MASK_ISA_SSE3 \
107    | OPTION_MASK_ISA_SSSE3_UNSET \
108    | OPTION_MASK_ISA_SSE4A_UNSET )
109 #define OPTION_MASK_ISA_SSSE3_UNSET \
110   (OPTION_MASK_ISA_SSSE3 | OPTION_MASK_ISA_SSE4_1_UNSET)
111 #define OPTION_MASK_ISA_SSE4_1_UNSET \
112   (OPTION_MASK_ISA_SSE4_1 | OPTION_MASK_ISA_SSE4_2_UNSET)
113 #define OPTION_MASK_ISA_SSE4_2_UNSET \
114   (OPTION_MASK_ISA_SSE4_2 | OPTION_MASK_ISA_AVX_UNSET )
115 #define OPTION_MASK_ISA_AVX_UNSET \
116   (OPTION_MASK_ISA_AVX | OPTION_MASK_ISA_FMA_UNSET \
117    | OPTION_MASK_ISA_FMA4_UNSET | OPTION_MASK_ISA_F16C_UNSET)
118 #define OPTION_MASK_ISA_FMA_UNSET OPTION_MASK_ISA_FMA
119
120 /* SSE4 includes both SSE4.1 and SSE4.2.  -mno-sse4 should the same
121    as -mno-sse4.1. */
122 #define OPTION_MASK_ISA_SSE4_UNSET OPTION_MASK_ISA_SSE4_1_UNSET
123
124 #define OPTION_MASK_ISA_SSE4A_UNSET \
125   (OPTION_MASK_ISA_SSE4A | OPTION_MASK_ISA_FMA4_UNSET)
126
127 #define OPTION_MASK_ISA_FMA4_UNSET \
128   (OPTION_MASK_ISA_FMA4 | OPTION_MASK_ISA_XOP_UNSET)
129 #define OPTION_MASK_ISA_XOP_UNSET OPTION_MASK_ISA_XOP
130 #define OPTION_MASK_ISA_LWP_UNSET OPTION_MASK_ISA_LWP
131
132 #define OPTION_MASK_ISA_AES_UNSET OPTION_MASK_ISA_AES
133 #define OPTION_MASK_ISA_PCLMUL_UNSET OPTION_MASK_ISA_PCLMUL
134 #define OPTION_MASK_ISA_ABM_UNSET OPTION_MASK_ISA_ABM
135 #define OPTION_MASK_ISA_BMI_UNSET OPTION_MASK_ISA_BMI
136 #define OPTION_MASK_ISA_TBM_UNSET OPTION_MASK_ISA_TBM
137 #define OPTION_MASK_ISA_POPCNT_UNSET OPTION_MASK_ISA_POPCNT
138 #define OPTION_MASK_ISA_CX16_UNSET OPTION_MASK_ISA_CX16
139 #define OPTION_MASK_ISA_SAHF_UNSET OPTION_MASK_ISA_SAHF
140 #define OPTION_MASK_ISA_MOVBE_UNSET OPTION_MASK_ISA_MOVBE
141 #define OPTION_MASK_ISA_CRC32_UNSET OPTION_MASK_ISA_CRC32
142
143 #define OPTION_MASK_ISA_FSGSBASE_UNSET OPTION_MASK_ISA_FSGSBASE
144 #define OPTION_MASK_ISA_RDRND_UNSET OPTION_MASK_ISA_RDRND
145 #define OPTION_MASK_ISA_F16C_UNSET OPTION_MASK_ISA_F16C
146
147 /* Implement TARGET_HANDLE_OPTION.  */
148
149 bool
150 ix86_handle_option (struct gcc_options *opts,
151                     struct gcc_options *opts_set ATTRIBUTE_UNUSED,
152                     const struct cl_decoded_option *decoded,
153                     location_t loc)
154 {
155   size_t code = decoded->opt_index;
156   int value = decoded->value;
157
158   switch (code)
159     {
160     case OPT_mmmx:
161       if (value)
162         {
163           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_MMX_SET;
164           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_MMX_SET;
165         }
166       else
167         {
168           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_MMX_UNSET;
169           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_MMX_UNSET;
170         }
171       return true;
172
173     case OPT_m3dnow:
174       if (value)
175         {
176           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_3DNOW_SET;
177           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_3DNOW_SET;
178         }
179       else
180         {
181           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_3DNOW_UNSET;
182           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_3DNOW_UNSET;
183         }
184       return true;
185
186     case OPT_m3dnowa:
187       return false;
188
189     case OPT_msse:
190       if (value)
191         {
192           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE_SET;
193           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE_SET;
194         }
195       else
196         {
197           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE_UNSET;
198           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE_UNSET;
199         }
200       return true;
201
202     case OPT_msse2:
203       if (value)
204         {
205           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE2_SET;
206           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE2_SET;
207         }
208       else
209         {
210           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE2_UNSET;
211           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE2_UNSET;
212         }
213       return true;
214
215     case OPT_msse3:
216       if (value)
217         {
218           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE3_SET;
219           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE3_SET;
220         }
221       else
222         {
223           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE3_UNSET;
224           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE3_UNSET;
225         }
226       return true;
227
228     case OPT_mssse3:
229       if (value)
230         {
231           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSSE3_SET;
232           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSSE3_SET;
233         }
234       else
235         {
236           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSSE3_UNSET;
237           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSSE3_UNSET;
238         }
239       return true;
240
241     case OPT_msse4_1:
242       if (value)
243         {
244           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE4_1_SET;
245           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_1_SET;
246         }
247       else
248         {
249           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4_1_UNSET;
250           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_1_UNSET;
251         }
252       return true;
253
254     case OPT_msse4_2:
255       if (value)
256         {
257           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE4_2_SET;
258           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_2_SET;
259         }
260       else
261         {
262           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4_2_UNSET;
263           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_2_UNSET;
264         }
265       return true;
266
267     case OPT_mavx:
268       if (value)
269         {
270           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_AVX_SET;
271           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX_SET;
272         }
273       else
274         {
275           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AVX_UNSET;
276           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX_UNSET;
277         }
278       return true;
279
280     case OPT_mfma:
281       if (value)
282         {
283           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_FMA_SET;
284           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FMA_SET;
285         }
286       else
287         {
288           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_FMA_UNSET;
289           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FMA_UNSET;
290         }
291       return true;
292
293     case OPT_msse4:
294       opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE4_SET;
295       opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_SET;
296       return true;
297
298     case OPT_mno_sse4:
299       opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4_UNSET;
300       opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_UNSET;
301       return true;
302
303     case OPT_msse4a:
304       if (value)
305         {
306           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE4A_SET;
307           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4A_SET;
308         }
309       else
310         {
311           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4A_UNSET;
312           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4A_UNSET;
313         }
314       return true;
315
316     case OPT_mfma4:
317       if (value)
318         {
319           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_FMA4_SET;
320           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FMA4_SET;
321         }
322       else
323         {
324           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_FMA4_UNSET;
325           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FMA4_UNSET;
326         }
327       return true;
328
329    case OPT_mxop:
330       if (value)
331         {
332           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_XOP_SET;
333           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_XOP_SET;
334         }
335       else
336         {
337           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_XOP_UNSET;
338           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_XOP_UNSET;
339         }
340       return true;
341
342    case OPT_mlwp:
343       if (value)
344         {
345           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_LWP_SET;
346           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_LWP_SET;
347         }
348       else
349         {
350           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_LWP_UNSET;
351           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_LWP_UNSET;
352         }
353       return true;
354
355     case OPT_mabm:
356       if (value)
357         {
358           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_ABM_SET;
359           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_ABM_SET;
360         }
361       else
362         {
363           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_ABM_UNSET;
364           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_ABM_UNSET;
365         }
366       return true;
367
368     case OPT_mbmi:
369       if (value)
370         {
371           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_BMI_SET;
372           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_BMI_SET;
373         }
374       else
375         {
376           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_BMI_UNSET;
377           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_BMI_UNSET;
378         }
379       return true;
380
381     case OPT_mtbm:
382       if (value)
383         {
384           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_TBM_SET;
385           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_TBM_SET;
386         }
387       else
388         {
389           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_TBM_UNSET;
390           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_TBM_UNSET;
391         }
392       return true;
393
394     case OPT_mpopcnt:
395       if (value)
396         {
397           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_POPCNT_SET;
398           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_POPCNT_SET;
399         }
400       else
401         {
402           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_POPCNT_UNSET;
403           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_POPCNT_UNSET;
404         }
405       return true;
406
407     case OPT_msahf:
408       if (value)
409         {
410           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SAHF_SET;
411           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SAHF_SET;
412         }
413       else
414         {
415           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_SAHF_UNSET;
416           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_SAHF_UNSET;
417         }
418       return true;
419
420     case OPT_mcx16:
421       if (value)
422         {
423           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_CX16_SET;
424           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_CX16_SET;
425         }
426       else
427         {
428           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_CX16_UNSET;
429           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_CX16_UNSET;
430         }
431       return true;
432
433     case OPT_mmovbe:
434       if (value)
435         {
436           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_MOVBE_SET;
437           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_MOVBE_SET;
438         }
439       else
440         {
441           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_MOVBE_UNSET;
442           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_MOVBE_UNSET;
443         }
444       return true;
445
446     case OPT_mcrc32:
447       if (value)
448         {
449           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_CRC32_SET;
450           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_CRC32_SET;
451         }
452       else
453         {
454           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_CRC32_UNSET;
455           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_CRC32_UNSET;
456         }
457       return true;
458
459     case OPT_maes:
460       if (value)
461         {
462           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_AES_SET;
463           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AES_SET;
464         }
465       else
466         {
467           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_AES_UNSET;
468           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AES_UNSET;
469         }
470       return true;
471
472     case OPT_mpclmul:
473       if (value)
474         {
475           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_PCLMUL_SET;
476           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_PCLMUL_SET;
477         }
478       else
479         {
480           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_PCLMUL_UNSET;
481           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_PCLMUL_UNSET;
482         }
483       return true;
484
485     case OPT_mfsgsbase:
486       if (value)
487         {
488           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_FSGSBASE_SET;
489           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FSGSBASE_SET;
490         }
491       else
492         {
493           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_FSGSBASE_UNSET;
494           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_FSGSBASE_UNSET;
495         }
496       return true;
497
498     case OPT_mrdrnd:
499       if (value)
500         {
501           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_RDRND_SET;
502           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_RDRND_SET;
503         }
504       else
505         {
506           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_RDRND_UNSET;
507           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_RDRND_UNSET;
508         }
509       return true;
510
511     case OPT_mf16c:
512       if (value)
513         {
514           opts->x_ix86_isa_flags |= OPTION_MASK_ISA_F16C_SET;
515           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_F16C_SET;
516         }
517       else
518         {
519           opts->x_ix86_isa_flags &= ~OPTION_MASK_ISA_F16C_UNSET;
520           opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_F16C_UNSET;
521         }
522       return true;
523
524   /* Comes from final.c -- no real reason to change it.  */
525 #define MAX_CODE_ALIGN 16
526
527     case OPT_malign_loops_:
528       warning_at (loc, 0, "-malign-loops is obsolete, use -falign-loops");
529       if (value > MAX_CODE_ALIGN)
530         error_at (loc, "-malign-loops=%d is not between 0 and %d",
531                   value, MAX_CODE_ALIGN);
532       else
533         opts->x_align_loops = 1 << value;
534       return true;
535
536     case OPT_malign_jumps_:
537       warning_at (loc, 0, "-malign-jumps is obsolete, use -falign-jumps");
538       if (value > MAX_CODE_ALIGN)
539         error_at (loc, "-malign-jumps=%d is not between 0 and %d",
540                   value, MAX_CODE_ALIGN);
541       else
542         opts->x_align_jumps = 1 << value;
543       return true;
544
545     case OPT_malign_functions_:
546       warning_at (loc, 0,
547                   "-malign-functions is obsolete, use -falign-functions");
548       if (value > MAX_CODE_ALIGN)
549         error_at (loc, "-malign-functions=%d is not between 0 and %d",
550                   value, MAX_CODE_ALIGN);
551       else
552         opts->x_align_functions = 1 << value;
553       return true;
554
555     case OPT_mbranch_cost_:
556       if (value > 5)
557         {
558           error_at (loc, "-mbranch-cost=%d is not between 0 and 5", value);
559           opts->x_ix86_branch_cost = 5;
560         }
561       return true;
562
563     default:
564       return true;
565     }
566 }
567
568 static const struct default_options ix86_option_optimization_table[] =
569   {
570     /* Turn off -fschedule-insns by default.  It tends to make the
571        problem with not enough registers even worse.  */
572     { OPT_LEVELS_ALL, OPT_fschedule_insns, NULL, 0 },
573
574 #ifdef SUBTARGET_OPTIMIZATION_OPTIONS
575     SUBTARGET_OPTIMIZATION_OPTIONS,
576 #endif
577     { OPT_LEVELS_NONE, 0, NULL, 0 }
578   };
579
580 /* Implement TARGET_OPTION_INIT_STRUCT.  */
581
582 static void
583 ix86_option_init_struct (struct gcc_options *opts)
584 {
585   if (TARGET_MACHO)
586     /* The Darwin libraries never set errno, so we might as well
587        avoid calling them when that's the only reason we would.  */
588     opts->x_flag_errno_math = 0;
589
590   opts->x_flag_pcc_struct_return = 2;
591   opts->x_flag_asynchronous_unwind_tables = 2;
592   opts->x_flag_vect_cost_model = 1;
593 }
594
595 /* On the x86 -fsplit-stack and -fstack-protector both use the same
596    field in the TCB, so they can not be used together.  */
597
598 static bool
599 ix86_supports_split_stack (bool report ATTRIBUTE_UNUSED,
600                            struct gcc_options *opts ATTRIBUTE_UNUSED)
601 {
602   bool ret = true;
603
604 #ifndef TARGET_THREAD_SPLIT_STACK_OFFSET
605   if (report)
606     error ("%<-fsplit-stack%> currently only supported on GNU/Linux");
607   ret = false;
608 #else
609   if (!HAVE_GAS_CFI_PERSONALITY_DIRECTIVE)
610     {
611       if (report)
612         error ("%<-fsplit-stack%> requires "
613                "assembler support for CFI directives");
614       ret = false;
615     }
616 #endif
617
618   return ret;
619 }
620
621 #undef TARGET_DEFAULT_TARGET_FLAGS
622 #define TARGET_DEFAULT_TARGET_FLAGS     \
623   (TARGET_DEFAULT                       \
624    | TARGET_SUBTARGET_DEFAULT           \
625    | TARGET_TLS_DIRECT_SEG_REFS_DEFAULT)
626
627 #undef TARGET_HANDLE_OPTION
628 #define TARGET_HANDLE_OPTION ix86_handle_option
629
630 #undef TARGET_OPTION_OPTIMIZATION_TABLE
631 #define TARGET_OPTION_OPTIMIZATION_TABLE ix86_option_optimization_table
632 #undef TARGET_OPTION_INIT_STRUCT
633 #define TARGET_OPTION_INIT_STRUCT ix86_option_init_struct
634
635 #undef TARGET_SUPPORTS_SPLIT_STACK
636 #define TARGET_SUPPORTS_SPLIT_STACK ix86_supports_split_stack
637
638 struct gcc_targetm_common targetm_common = TARGETM_COMMON_INITIALIZER;