OSDN Git Service

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