OSDN Git Service

PR target/32280
[pf3gnuchains/gcc-fork.git] / gcc / config / i386 / i386.c
1 /* Subroutines used for code generation on IA-32.
2    Copyright (C) 1988, 1992, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
3    2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
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 "tm.h"
26 #include "rtl.h"
27 #include "tree.h"
28 #include "tm_p.h"
29 #include "regs.h"
30 #include "hard-reg-set.h"
31 #include "real.h"
32 #include "insn-config.h"
33 #include "conditions.h"
34 #include "output.h"
35 #include "insn-codes.h"
36 #include "insn-attr.h"
37 #include "flags.h"
38 #include "except.h"
39 #include "function.h"
40 #include "recog.h"
41 #include "expr.h"
42 #include "optabs.h"
43 #include "toplev.h"
44 #include "basic-block.h"
45 #include "ggc.h"
46 #include "target.h"
47 #include "target-def.h"
48 #include "langhooks.h"
49 #include "cgraph.h"
50 #include "gimple.h"
51 #include "dwarf2.h"
52 #include "df.h"
53 #include "tm-constrs.h"
54 #include "params.h"
55 #include "cselib.h"
56
57 static rtx legitimize_dllimport_symbol (rtx, bool);
58
59 #ifndef CHECK_STACK_LIMIT
60 #define CHECK_STACK_LIMIT (-1)
61 #endif
62
63 /* Return index of given mode in mult and division cost tables.  */
64 #define MODE_INDEX(mode)                                        \
65   ((mode) == QImode ? 0                                         \
66    : (mode) == HImode ? 1                                       \
67    : (mode) == SImode ? 2                                       \
68    : (mode) == DImode ? 3                                       \
69    : 4)
70
71 /* Processor costs (relative to an add) */
72 /* We assume COSTS_N_INSNS is defined as (N)*4 and an addition is 2 bytes.  */
73 #define COSTS_N_BYTES(N) ((N) * 2)
74
75 #define DUMMY_STRINGOP_ALGS {libcall, {{-1, libcall}}}
76
77 const
78 struct processor_costs ix86_size_cost = {/* costs for tuning for size */
79   COSTS_N_BYTES (2),                    /* cost of an add instruction */
80   COSTS_N_BYTES (3),                    /* cost of a lea instruction */
81   COSTS_N_BYTES (2),                    /* variable shift costs */
82   COSTS_N_BYTES (3),                    /* constant shift costs */
83   {COSTS_N_BYTES (3),                   /* cost of starting multiply for QI */
84    COSTS_N_BYTES (3),                   /*                               HI */
85    COSTS_N_BYTES (3),                   /*                               SI */
86    COSTS_N_BYTES (3),                   /*                               DI */
87    COSTS_N_BYTES (5)},                  /*                            other */
88   0,                                    /* cost of multiply per each bit set */
89   {COSTS_N_BYTES (3),                   /* cost of a divide/mod for QI */
90    COSTS_N_BYTES (3),                   /*                          HI */
91    COSTS_N_BYTES (3),                   /*                          SI */
92    COSTS_N_BYTES (3),                   /*                          DI */
93    COSTS_N_BYTES (5)},                  /*                       other */
94   COSTS_N_BYTES (3),                    /* cost of movsx */
95   COSTS_N_BYTES (3),                    /* cost of movzx */
96   0,                                    /* "large" insn */
97   2,                                    /* MOVE_RATIO */
98   2,                                    /* cost for loading QImode using movzbl */
99   {2, 2, 2},                            /* cost of loading integer registers
100                                            in QImode, HImode and SImode.
101                                            Relative to reg-reg move (2).  */
102   {2, 2, 2},                            /* cost of storing integer registers */
103   2,                                    /* cost of reg,reg fld/fst */
104   {2, 2, 2},                            /* cost of loading fp registers
105                                            in SFmode, DFmode and XFmode */
106   {2, 2, 2},                            /* cost of storing fp registers
107                                            in SFmode, DFmode and XFmode */
108   3,                                    /* cost of moving MMX register */
109   {3, 3},                               /* cost of loading MMX registers
110                                            in SImode and DImode */
111   {3, 3},                               /* cost of storing MMX registers
112                                            in SImode and DImode */
113   3,                                    /* cost of moving SSE register */
114   {3, 3, 3},                            /* cost of loading SSE registers
115                                            in SImode, DImode and TImode */
116   {3, 3, 3},                            /* cost of storing SSE registers
117                                            in SImode, DImode and TImode */
118   3,                                    /* MMX or SSE register to integer */
119   0,                                    /* size of l1 cache  */
120   0,                                    /* size of l2 cache  */
121   0,                                    /* size of prefetch block */
122   0,                                    /* number of parallel prefetches */
123   2,                                    /* Branch cost */
124   COSTS_N_BYTES (2),                    /* cost of FADD and FSUB insns.  */
125   COSTS_N_BYTES (2),                    /* cost of FMUL instruction.  */
126   COSTS_N_BYTES (2),                    /* cost of FDIV instruction.  */
127   COSTS_N_BYTES (2),                    /* cost of FABS instruction.  */
128   COSTS_N_BYTES (2),                    /* cost of FCHS instruction.  */
129   COSTS_N_BYTES (2),                    /* cost of FSQRT instruction.  */
130   {{rep_prefix_1_byte, {{-1, rep_prefix_1_byte}}},
131    {rep_prefix_1_byte, {{-1, rep_prefix_1_byte}}}},
132   {{rep_prefix_1_byte, {{-1, rep_prefix_1_byte}}},
133    {rep_prefix_1_byte, {{-1, rep_prefix_1_byte}}}},
134   1,                                    /* scalar_stmt_cost.  */
135   1,                                    /* scalar load_cost.  */
136   1,                                    /* scalar_store_cost.  */
137   1,                                    /* vec_stmt_cost.  */
138   1,                                    /* vec_to_scalar_cost.  */
139   1,                                    /* scalar_to_vec_cost.  */
140   1,                                    /* vec_align_load_cost.  */
141   1,                                    /* vec_unalign_load_cost.  */
142   1,                                    /* vec_store_cost.  */
143   1,                                    /* cond_taken_branch_cost.  */
144   1,                                    /* cond_not_taken_branch_cost.  */
145 };
146
147 /* Processor costs (relative to an add) */
148 static const
149 struct processor_costs i386_cost = {    /* 386 specific costs */
150   COSTS_N_INSNS (1),                    /* cost of an add instruction */
151   COSTS_N_INSNS (1),                    /* cost of a lea instruction */
152   COSTS_N_INSNS (3),                    /* variable shift costs */
153   COSTS_N_INSNS (2),                    /* constant shift costs */
154   {COSTS_N_INSNS (6),                   /* cost of starting multiply for QI */
155    COSTS_N_INSNS (6),                   /*                               HI */
156    COSTS_N_INSNS (6),                   /*                               SI */
157    COSTS_N_INSNS (6),                   /*                               DI */
158    COSTS_N_INSNS (6)},                  /*                               other */
159   COSTS_N_INSNS (1),                    /* cost of multiply per each bit set */
160   {COSTS_N_INSNS (23),                  /* cost of a divide/mod for QI */
161    COSTS_N_INSNS (23),                  /*                          HI */
162    COSTS_N_INSNS (23),                  /*                          SI */
163    COSTS_N_INSNS (23),                  /*                          DI */
164    COSTS_N_INSNS (23)},                 /*                          other */
165   COSTS_N_INSNS (3),                    /* cost of movsx */
166   COSTS_N_INSNS (2),                    /* cost of movzx */
167   15,                                   /* "large" insn */
168   3,                                    /* MOVE_RATIO */
169   4,                                    /* cost for loading QImode using movzbl */
170   {2, 4, 2},                            /* cost of loading integer registers
171                                            in QImode, HImode and SImode.
172                                            Relative to reg-reg move (2).  */
173   {2, 4, 2},                            /* cost of storing integer registers */
174   2,                                    /* cost of reg,reg fld/fst */
175   {8, 8, 8},                            /* cost of loading fp registers
176                                            in SFmode, DFmode and XFmode */
177   {8, 8, 8},                            /* cost of storing fp registers
178                                            in SFmode, DFmode and XFmode */
179   2,                                    /* cost of moving MMX register */
180   {4, 8},                               /* cost of loading MMX registers
181                                            in SImode and DImode */
182   {4, 8},                               /* cost of storing MMX registers
183                                            in SImode and DImode */
184   2,                                    /* cost of moving SSE register */
185   {4, 8, 16},                           /* cost of loading SSE registers
186                                            in SImode, DImode and TImode */
187   {4, 8, 16},                           /* cost of storing SSE registers
188                                            in SImode, DImode and TImode */
189   3,                                    /* MMX or SSE register to integer */
190   0,                                    /* size of l1 cache  */
191   0,                                    /* size of l2 cache  */
192   0,                                    /* size of prefetch block */
193   0,                                    /* number of parallel prefetches */
194   1,                                    /* Branch cost */
195   COSTS_N_INSNS (23),                   /* cost of FADD and FSUB insns.  */
196   COSTS_N_INSNS (27),                   /* cost of FMUL instruction.  */
197   COSTS_N_INSNS (88),                   /* cost of FDIV instruction.  */
198   COSTS_N_INSNS (22),                   /* cost of FABS instruction.  */
199   COSTS_N_INSNS (24),                   /* cost of FCHS instruction.  */
200   COSTS_N_INSNS (122),                  /* cost of FSQRT instruction.  */
201   {{rep_prefix_1_byte, {{-1, rep_prefix_1_byte}}},
202    DUMMY_STRINGOP_ALGS},
203   {{rep_prefix_1_byte, {{-1, rep_prefix_1_byte}}},
204    DUMMY_STRINGOP_ALGS},
205   1,                                    /* scalar_stmt_cost.  */
206   1,                                    /* scalar load_cost.  */
207   1,                                    /* scalar_store_cost.  */
208   1,                                    /* vec_stmt_cost.  */
209   1,                                    /* vec_to_scalar_cost.  */
210   1,                                    /* scalar_to_vec_cost.  */
211   1,                                    /* vec_align_load_cost.  */
212   2,                                    /* vec_unalign_load_cost.  */
213   1,                                    /* vec_store_cost.  */
214   3,                                    /* cond_taken_branch_cost.  */
215   1,                                    /* cond_not_taken_branch_cost.  */
216 };
217
218 static const
219 struct processor_costs i486_cost = {    /* 486 specific costs */
220   COSTS_N_INSNS (1),                    /* cost of an add instruction */
221   COSTS_N_INSNS (1),                    /* cost of a lea instruction */
222   COSTS_N_INSNS (3),                    /* variable shift costs */
223   COSTS_N_INSNS (2),                    /* constant shift costs */
224   {COSTS_N_INSNS (12),                  /* cost of starting multiply for QI */
225    COSTS_N_INSNS (12),                  /*                               HI */
226    COSTS_N_INSNS (12),                  /*                               SI */
227    COSTS_N_INSNS (12),                  /*                               DI */
228    COSTS_N_INSNS (12)},                 /*                               other */
229   1,                                    /* cost of multiply per each bit set */
230   {COSTS_N_INSNS (40),                  /* cost of a divide/mod for QI */
231    COSTS_N_INSNS (40),                  /*                          HI */
232    COSTS_N_INSNS (40),                  /*                          SI */
233    COSTS_N_INSNS (40),                  /*                          DI */
234    COSTS_N_INSNS (40)},                 /*                          other */
235   COSTS_N_INSNS (3),                    /* cost of movsx */
236   COSTS_N_INSNS (2),                    /* cost of movzx */
237   15,                                   /* "large" insn */
238   3,                                    /* MOVE_RATIO */
239   4,                                    /* cost for loading QImode using movzbl */
240   {2, 4, 2},                            /* cost of loading integer registers
241                                            in QImode, HImode and SImode.
242                                            Relative to reg-reg move (2).  */
243   {2, 4, 2},                            /* cost of storing integer registers */
244   2,                                    /* cost of reg,reg fld/fst */
245   {8, 8, 8},                            /* cost of loading fp registers
246                                            in SFmode, DFmode and XFmode */
247   {8, 8, 8},                            /* cost of storing fp registers
248                                            in SFmode, DFmode and XFmode */
249   2,                                    /* cost of moving MMX register */
250   {4, 8},                               /* cost of loading MMX registers
251                                            in SImode and DImode */
252   {4, 8},                               /* cost of storing MMX registers
253                                            in SImode and DImode */
254   2,                                    /* cost of moving SSE register */
255   {4, 8, 16},                           /* cost of loading SSE registers
256                                            in SImode, DImode and TImode */
257   {4, 8, 16},                           /* cost of storing SSE registers
258                                            in SImode, DImode and TImode */
259   3,                                    /* MMX or SSE register to integer */
260   4,                                    /* size of l1 cache.  486 has 8kB cache
261                                            shared for code and data, so 4kB is
262                                            not really precise.  */
263   4,                                    /* size of l2 cache  */
264   0,                                    /* size of prefetch block */
265   0,                                    /* number of parallel prefetches */
266   1,                                    /* Branch cost */
267   COSTS_N_INSNS (8),                    /* cost of FADD and FSUB insns.  */
268   COSTS_N_INSNS (16),                   /* cost of FMUL instruction.  */
269   COSTS_N_INSNS (73),                   /* cost of FDIV instruction.  */
270   COSTS_N_INSNS (3),                    /* cost of FABS instruction.  */
271   COSTS_N_INSNS (3),                    /* cost of FCHS instruction.  */
272   COSTS_N_INSNS (83),                   /* cost of FSQRT instruction.  */
273   {{rep_prefix_4_byte, {{-1, rep_prefix_4_byte}}},
274    DUMMY_STRINGOP_ALGS},
275   {{rep_prefix_4_byte, {{-1, rep_prefix_4_byte}}},
276    DUMMY_STRINGOP_ALGS},
277   1,                                    /* scalar_stmt_cost.  */
278   1,                                    /* scalar load_cost.  */
279   1,                                    /* scalar_store_cost.  */
280   1,                                    /* vec_stmt_cost.  */
281   1,                                    /* vec_to_scalar_cost.  */
282   1,                                    /* scalar_to_vec_cost.  */
283   1,                                    /* vec_align_load_cost.  */
284   2,                                    /* vec_unalign_load_cost.  */
285   1,                                    /* vec_store_cost.  */
286   3,                                    /* cond_taken_branch_cost.  */
287   1,                                    /* cond_not_taken_branch_cost.  */
288 };
289
290 static const
291 struct processor_costs pentium_cost = {
292   COSTS_N_INSNS (1),                    /* cost of an add instruction */
293   COSTS_N_INSNS (1),                    /* cost of a lea instruction */
294   COSTS_N_INSNS (4),                    /* variable shift costs */
295   COSTS_N_INSNS (1),                    /* constant shift costs */
296   {COSTS_N_INSNS (11),                  /* cost of starting multiply for QI */
297    COSTS_N_INSNS (11),                  /*                               HI */
298    COSTS_N_INSNS (11),                  /*                               SI */
299    COSTS_N_INSNS (11),                  /*                               DI */
300    COSTS_N_INSNS (11)},                 /*                               other */
301   0,                                    /* cost of multiply per each bit set */
302   {COSTS_N_INSNS (25),                  /* cost of a divide/mod for QI */
303    COSTS_N_INSNS (25),                  /*                          HI */
304    COSTS_N_INSNS (25),                  /*                          SI */
305    COSTS_N_INSNS (25),                  /*                          DI */
306    COSTS_N_INSNS (25)},                 /*                          other */
307   COSTS_N_INSNS (3),                    /* cost of movsx */
308   COSTS_N_INSNS (2),                    /* cost of movzx */
309   8,                                    /* "large" insn */
310   6,                                    /* MOVE_RATIO */
311   6,                                    /* cost for loading QImode using movzbl */
312   {2, 4, 2},                            /* cost of loading integer registers
313                                            in QImode, HImode and SImode.
314                                            Relative to reg-reg move (2).  */
315   {2, 4, 2},                            /* cost of storing integer registers */
316   2,                                    /* cost of reg,reg fld/fst */
317   {2, 2, 6},                            /* cost of loading fp registers
318                                            in SFmode, DFmode and XFmode */
319   {4, 4, 6},                            /* cost of storing fp registers
320                                            in SFmode, DFmode and XFmode */
321   8,                                    /* cost of moving MMX register */
322   {8, 8},                               /* cost of loading MMX registers
323                                            in SImode and DImode */
324   {8, 8},                               /* cost of storing MMX registers
325                                            in SImode and DImode */
326   2,                                    /* cost of moving SSE register */
327   {4, 8, 16},                           /* cost of loading SSE registers
328                                            in SImode, DImode and TImode */
329   {4, 8, 16},                           /* cost of storing SSE registers
330                                            in SImode, DImode and TImode */
331   3,                                    /* MMX or SSE register to integer */
332   8,                                    /* size of l1 cache.  */
333   8,                                    /* size of l2 cache  */
334   0,                                    /* size of prefetch block */
335   0,                                    /* number of parallel prefetches */
336   2,                                    /* Branch cost */
337   COSTS_N_INSNS (3),                    /* cost of FADD and FSUB insns.  */
338   COSTS_N_INSNS (3),                    /* cost of FMUL instruction.  */
339   COSTS_N_INSNS (39),                   /* cost of FDIV instruction.  */
340   COSTS_N_INSNS (1),                    /* cost of FABS instruction.  */
341   COSTS_N_INSNS (1),                    /* cost of FCHS instruction.  */
342   COSTS_N_INSNS (70),                   /* cost of FSQRT instruction.  */
343   {{libcall, {{256, rep_prefix_4_byte}, {-1, libcall}}},
344    DUMMY_STRINGOP_ALGS},
345   {{libcall, {{-1, rep_prefix_4_byte}}},
346    DUMMY_STRINGOP_ALGS},
347   1,                                    /* scalar_stmt_cost.  */
348   1,                                    /* scalar load_cost.  */
349   1,                                    /* scalar_store_cost.  */
350   1,                                    /* vec_stmt_cost.  */
351   1,                                    /* vec_to_scalar_cost.  */
352   1,                                    /* scalar_to_vec_cost.  */
353   1,                                    /* vec_align_load_cost.  */
354   2,                                    /* vec_unalign_load_cost.  */
355   1,                                    /* vec_store_cost.  */
356   3,                                    /* cond_taken_branch_cost.  */
357   1,                                    /* cond_not_taken_branch_cost.  */
358 };
359
360 static const
361 struct processor_costs pentiumpro_cost = {
362   COSTS_N_INSNS (1),                    /* cost of an add instruction */
363   COSTS_N_INSNS (1),                    /* cost of a lea instruction */
364   COSTS_N_INSNS (1),                    /* variable shift costs */
365   COSTS_N_INSNS (1),                    /* constant shift costs */
366   {COSTS_N_INSNS (4),                   /* cost of starting multiply for QI */
367    COSTS_N_INSNS (4),                   /*                               HI */
368    COSTS_N_INSNS (4),                   /*                               SI */
369    COSTS_N_INSNS (4),                   /*                               DI */
370    COSTS_N_INSNS (4)},                  /*                               other */
371   0,                                    /* cost of multiply per each bit set */
372   {COSTS_N_INSNS (17),                  /* cost of a divide/mod for QI */
373    COSTS_N_INSNS (17),                  /*                          HI */
374    COSTS_N_INSNS (17),                  /*                          SI */
375    COSTS_N_INSNS (17),                  /*                          DI */
376    COSTS_N_INSNS (17)},                 /*                          other */
377   COSTS_N_INSNS (1),                    /* cost of movsx */
378   COSTS_N_INSNS (1),                    /* cost of movzx */
379   8,                                    /* "large" insn */
380   6,                                    /* MOVE_RATIO */
381   2,                                    /* cost for loading QImode using movzbl */
382   {4, 4, 4},                            /* cost of loading integer registers
383                                            in QImode, HImode and SImode.
384                                            Relative to reg-reg move (2).  */
385   {2, 2, 2},                            /* cost of storing integer registers */
386   2,                                    /* cost of reg,reg fld/fst */
387   {2, 2, 6},                            /* cost of loading fp registers
388                                            in SFmode, DFmode and XFmode */
389   {4, 4, 6},                            /* cost of storing fp registers
390                                            in SFmode, DFmode and XFmode */
391   2,                                    /* cost of moving MMX register */
392   {2, 2},                               /* cost of loading MMX registers
393                                            in SImode and DImode */
394   {2, 2},                               /* cost of storing MMX registers
395                                            in SImode and DImode */
396   2,                                    /* cost of moving SSE register */
397   {2, 2, 8},                            /* cost of loading SSE registers
398                                            in SImode, DImode and TImode */
399   {2, 2, 8},                            /* cost of storing SSE registers
400                                            in SImode, DImode and TImode */
401   3,                                    /* MMX or SSE register to integer */
402   8,                                    /* size of l1 cache.  */
403   256,                                  /* size of l2 cache  */
404   32,                                   /* size of prefetch block */
405   6,                                    /* number of parallel prefetches */
406   2,                                    /* Branch cost */
407   COSTS_N_INSNS (3),                    /* cost of FADD and FSUB insns.  */
408   COSTS_N_INSNS (5),                    /* cost of FMUL instruction.  */
409   COSTS_N_INSNS (56),                   /* cost of FDIV instruction.  */
410   COSTS_N_INSNS (2),                    /* cost of FABS instruction.  */
411   COSTS_N_INSNS (2),                    /* cost of FCHS instruction.  */
412   COSTS_N_INSNS (56),                   /* cost of FSQRT instruction.  */
413   /* PentiumPro has optimized rep instructions for blocks aligned by 8 bytes (we ensure
414      the alignment).  For small blocks inline loop is still a noticeable win, for bigger
415      blocks either rep movsl or rep movsb is way to go.  Rep movsb has apparently
416      more expensive startup time in CPU, but after 4K the difference is down in the noise.
417    */
418   {{rep_prefix_4_byte, {{128, loop}, {1024, unrolled_loop},
419                         {8192, rep_prefix_4_byte}, {-1, rep_prefix_1_byte}}},
420    DUMMY_STRINGOP_ALGS},
421   {{rep_prefix_4_byte, {{1024, unrolled_loop},
422                         {8192, rep_prefix_4_byte}, {-1, libcall}}},
423    DUMMY_STRINGOP_ALGS},
424   1,                                    /* scalar_stmt_cost.  */
425   1,                                    /* scalar load_cost.  */
426   1,                                    /* scalar_store_cost.  */
427   1,                                    /* vec_stmt_cost.  */
428   1,                                    /* vec_to_scalar_cost.  */
429   1,                                    /* scalar_to_vec_cost.  */
430   1,                                    /* vec_align_load_cost.  */
431   2,                                    /* vec_unalign_load_cost.  */
432   1,                                    /* vec_store_cost.  */
433   3,                                    /* cond_taken_branch_cost.  */
434   1,                                    /* cond_not_taken_branch_cost.  */
435 };
436
437 static const
438 struct processor_costs geode_cost = {
439   COSTS_N_INSNS (1),                    /* cost of an add instruction */
440   COSTS_N_INSNS (1),                    /* cost of a lea instruction */
441   COSTS_N_INSNS (2),                    /* variable shift costs */
442   COSTS_N_INSNS (1),                    /* constant shift costs */
443   {COSTS_N_INSNS (3),                   /* cost of starting multiply for QI */
444    COSTS_N_INSNS (4),                   /*                               HI */
445    COSTS_N_INSNS (7),                   /*                               SI */
446    COSTS_N_INSNS (7),                   /*                               DI */
447    COSTS_N_INSNS (7)},                  /*                               other */
448   0,                                    /* cost of multiply per each bit set */
449   {COSTS_N_INSNS (15),                  /* cost of a divide/mod for QI */
450    COSTS_N_INSNS (23),                  /*                          HI */
451    COSTS_N_INSNS (39),                  /*                          SI */
452    COSTS_N_INSNS (39),                  /*                          DI */
453    COSTS_N_INSNS (39)},                 /*                          other */
454   COSTS_N_INSNS (1),                    /* cost of movsx */
455   COSTS_N_INSNS (1),                    /* cost of movzx */
456   8,                                    /* "large" insn */
457   4,                                    /* MOVE_RATIO */
458   1,                                    /* cost for loading QImode using movzbl */
459   {1, 1, 1},                            /* cost of loading integer registers
460                                            in QImode, HImode and SImode.
461                                            Relative to reg-reg move (2).  */
462   {1, 1, 1},                            /* cost of storing integer registers */
463   1,                                    /* cost of reg,reg fld/fst */
464   {1, 1, 1},                            /* cost of loading fp registers
465                                            in SFmode, DFmode and XFmode */
466   {4, 6, 6},                            /* cost of storing fp registers
467                                            in SFmode, DFmode and XFmode */
468
469   1,                                    /* cost of moving MMX register */
470   {1, 1},                               /* cost of loading MMX registers
471                                            in SImode and DImode */
472   {1, 1},                               /* cost of storing MMX registers
473                                            in SImode and DImode */
474   1,                                    /* cost of moving SSE register */
475   {1, 1, 1},                            /* cost of loading SSE registers
476                                            in SImode, DImode and TImode */
477   {1, 1, 1},                            /* cost of storing SSE registers
478                                            in SImode, DImode and TImode */
479   1,                                    /* MMX or SSE register to integer */
480   64,                                   /* size of l1 cache.  */
481   128,                                  /* size of l2 cache.  */
482   32,                                   /* size of prefetch block */
483   1,                                    /* number of parallel prefetches */
484   1,                                    /* Branch cost */
485   COSTS_N_INSNS (6),                    /* cost of FADD and FSUB insns.  */
486   COSTS_N_INSNS (11),                   /* cost of FMUL instruction.  */
487   COSTS_N_INSNS (47),                   /* cost of FDIV instruction.  */
488   COSTS_N_INSNS (1),                    /* cost of FABS instruction.  */
489   COSTS_N_INSNS (1),                    /* cost of FCHS instruction.  */
490   COSTS_N_INSNS (54),                   /* cost of FSQRT instruction.  */
491   {{libcall, {{256, rep_prefix_4_byte}, {-1, libcall}}},
492    DUMMY_STRINGOP_ALGS},
493   {{libcall, {{256, rep_prefix_4_byte}, {-1, libcall}}},
494    DUMMY_STRINGOP_ALGS},
495   1,                                    /* scalar_stmt_cost.  */
496   1,                                    /* scalar load_cost.  */
497   1,                                    /* scalar_store_cost.  */
498   1,                                    /* vec_stmt_cost.  */
499   1,                                    /* vec_to_scalar_cost.  */
500   1,                                    /* scalar_to_vec_cost.  */
501   1,                                    /* vec_align_load_cost.  */
502   2,                                    /* vec_unalign_load_cost.  */
503   1,                                    /* vec_store_cost.  */
504   3,                                    /* cond_taken_branch_cost.  */
505   1,                                    /* cond_not_taken_branch_cost.  */
506 };
507
508 static const
509 struct processor_costs k6_cost = {
510   COSTS_N_INSNS (1),                    /* cost of an add instruction */
511   COSTS_N_INSNS (2),                    /* cost of a lea instruction */
512   COSTS_N_INSNS (1),                    /* variable shift costs */
513   COSTS_N_INSNS (1),                    /* constant shift costs */
514   {COSTS_N_INSNS (3),                   /* cost of starting multiply for QI */
515    COSTS_N_INSNS (3),                   /*                               HI */
516    COSTS_N_INSNS (3),                   /*                               SI */
517    COSTS_N_INSNS (3),                   /*                               DI */
518    COSTS_N_INSNS (3)},                  /*                               other */
519   0,                                    /* cost of multiply per each bit set */
520   {COSTS_N_INSNS (18),                  /* cost of a divide/mod for QI */
521    COSTS_N_INSNS (18),                  /*                          HI */
522    COSTS_N_INSNS (18),                  /*                          SI */
523    COSTS_N_INSNS (18),                  /*                          DI */
524    COSTS_N_INSNS (18)},                 /*                          other */
525   COSTS_N_INSNS (2),                    /* cost of movsx */
526   COSTS_N_INSNS (2),                    /* cost of movzx */
527   8,                                    /* "large" insn */
528   4,                                    /* MOVE_RATIO */
529   3,                                    /* cost for loading QImode using movzbl */
530   {4, 5, 4},                            /* cost of loading integer registers
531                                            in QImode, HImode and SImode.
532                                            Relative to reg-reg move (2).  */
533   {2, 3, 2},                            /* cost of storing integer registers */
534   4,                                    /* cost of reg,reg fld/fst */
535   {6, 6, 6},                            /* cost of loading fp registers
536                                            in SFmode, DFmode and XFmode */
537   {4, 4, 4},                            /* cost of storing fp registers
538                                            in SFmode, DFmode and XFmode */
539   2,                                    /* cost of moving MMX register */
540   {2, 2},                               /* cost of loading MMX registers
541                                            in SImode and DImode */
542   {2, 2},                               /* cost of storing MMX registers
543                                            in SImode and DImode */
544   2,                                    /* cost of moving SSE register */
545   {2, 2, 8},                            /* cost of loading SSE registers
546                                            in SImode, DImode and TImode */
547   {2, 2, 8},                            /* cost of storing SSE registers
548                                            in SImode, DImode and TImode */
549   6,                                    /* MMX or SSE register to integer */
550   32,                                   /* size of l1 cache.  */
551   32,                                   /* size of l2 cache.  Some models
552                                            have integrated l2 cache, but
553                                            optimizing for k6 is not important
554                                            enough to worry about that.  */
555   32,                                   /* size of prefetch block */
556   1,                                    /* number of parallel prefetches */
557   1,                                    /* Branch cost */
558   COSTS_N_INSNS (2),                    /* cost of FADD and FSUB insns.  */
559   COSTS_N_INSNS (2),                    /* cost of FMUL instruction.  */
560   COSTS_N_INSNS (56),                   /* cost of FDIV instruction.  */
561   COSTS_N_INSNS (2),                    /* cost of FABS instruction.  */
562   COSTS_N_INSNS (2),                    /* cost of FCHS instruction.  */
563   COSTS_N_INSNS (56),                   /* cost of FSQRT instruction.  */
564   {{libcall, {{256, rep_prefix_4_byte}, {-1, libcall}}},
565    DUMMY_STRINGOP_ALGS},
566   {{libcall, {{256, rep_prefix_4_byte}, {-1, libcall}}},
567    DUMMY_STRINGOP_ALGS},
568   1,                                    /* scalar_stmt_cost.  */
569   1,                                    /* scalar load_cost.  */
570   1,                                    /* scalar_store_cost.  */
571   1,                                    /* vec_stmt_cost.  */
572   1,                                    /* vec_to_scalar_cost.  */
573   1,                                    /* scalar_to_vec_cost.  */
574   1,                                    /* vec_align_load_cost.  */
575   2,                                    /* vec_unalign_load_cost.  */
576   1,                                    /* vec_store_cost.  */
577   3,                                    /* cond_taken_branch_cost.  */
578   1,                                    /* cond_not_taken_branch_cost.  */
579 };
580
581 static const
582 struct processor_costs athlon_cost = {
583   COSTS_N_INSNS (1),                    /* cost of an add instruction */
584   COSTS_N_INSNS (2),                    /* cost of a lea instruction */
585   COSTS_N_INSNS (1),                    /* variable shift costs */
586   COSTS_N_INSNS (1),                    /* constant shift costs */
587   {COSTS_N_INSNS (5),                   /* cost of starting multiply for QI */
588    COSTS_N_INSNS (5),                   /*                               HI */
589    COSTS_N_INSNS (5),                   /*                               SI */
590    COSTS_N_INSNS (5),                   /*                               DI */
591    COSTS_N_INSNS (5)},                  /*                               other */
592   0,                                    /* cost of multiply per each bit set */
593   {COSTS_N_INSNS (18),                  /* cost of a divide/mod for QI */
594    COSTS_N_INSNS (26),                  /*                          HI */
595    COSTS_N_INSNS (42),                  /*                          SI */
596    COSTS_N_INSNS (74),                  /*                          DI */
597    COSTS_N_INSNS (74)},                 /*                          other */
598   COSTS_N_INSNS (1),                    /* cost of movsx */
599   COSTS_N_INSNS (1),                    /* cost of movzx */
600   8,                                    /* "large" insn */
601   9,                                    /* MOVE_RATIO */
602   4,                                    /* cost for loading QImode using movzbl */
603   {3, 4, 3},                            /* cost of loading integer registers
604                                            in QImode, HImode and SImode.
605                                            Relative to reg-reg move (2).  */
606   {3, 4, 3},                            /* cost of storing integer registers */
607   4,                                    /* cost of reg,reg fld/fst */
608   {4, 4, 12},                           /* cost of loading fp registers
609                                            in SFmode, DFmode and XFmode */
610   {6, 6, 8},                            /* cost of storing fp registers
611                                            in SFmode, DFmode and XFmode */
612   2,                                    /* cost of moving MMX register */
613   {4, 4},                               /* cost of loading MMX registers
614                                            in SImode and DImode */
615   {4, 4},                               /* cost of storing MMX registers
616                                            in SImode and DImode */
617   2,                                    /* cost of moving SSE register */
618   {4, 4, 6},                            /* cost of loading SSE registers
619                                            in SImode, DImode and TImode */
620   {4, 4, 5},                            /* cost of storing SSE registers
621                                            in SImode, DImode and TImode */
622   5,                                    /* MMX or SSE register to integer */
623   64,                                   /* size of l1 cache.  */
624   256,                                  /* size of l2 cache.  */
625   64,                                   /* size of prefetch block */
626   6,                                    /* number of parallel prefetches */
627   5,                                    /* Branch cost */
628   COSTS_N_INSNS (4),                    /* cost of FADD and FSUB insns.  */
629   COSTS_N_INSNS (4),                    /* cost of FMUL instruction.  */
630   COSTS_N_INSNS (24),                   /* cost of FDIV instruction.  */
631   COSTS_N_INSNS (2),                    /* cost of FABS instruction.  */
632   COSTS_N_INSNS (2),                    /* cost of FCHS instruction.  */
633   COSTS_N_INSNS (35),                   /* cost of FSQRT instruction.  */
634   /* For some reason, Athlon deals better with REP prefix (relative to loops)
635      compared to K8. Alignment becomes important after 8 bytes for memcpy and
636      128 bytes for memset.  */
637   {{libcall, {{2048, rep_prefix_4_byte}, {-1, libcall}}},
638    DUMMY_STRINGOP_ALGS},
639   {{libcall, {{2048, rep_prefix_4_byte}, {-1, libcall}}},
640    DUMMY_STRINGOP_ALGS},
641   1,                                    /* scalar_stmt_cost.  */
642   1,                                    /* scalar load_cost.  */
643   1,                                    /* scalar_store_cost.  */
644   1,                                    /* vec_stmt_cost.  */
645   1,                                    /* vec_to_scalar_cost.  */
646   1,                                    /* scalar_to_vec_cost.  */
647   1,                                    /* vec_align_load_cost.  */
648   2,                                    /* vec_unalign_load_cost.  */
649   1,                                    /* vec_store_cost.  */
650   3,                                    /* cond_taken_branch_cost.  */
651   1,                                    /* cond_not_taken_branch_cost.  */
652 };
653
654 static const
655 struct processor_costs k8_cost = {
656   COSTS_N_INSNS (1),                    /* cost of an add instruction */
657   COSTS_N_INSNS (2),                    /* cost of a lea instruction */
658   COSTS_N_INSNS (1),                    /* variable shift costs */
659   COSTS_N_INSNS (1),                    /* constant shift costs */
660   {COSTS_N_INSNS (3),                   /* cost of starting multiply for QI */
661    COSTS_N_INSNS (4),                   /*                               HI */
662    COSTS_N_INSNS (3),                   /*                               SI */
663    COSTS_N_INSNS (4),                   /*                               DI */
664    COSTS_N_INSNS (5)},                  /*                               other */
665   0,                                    /* cost of multiply per each bit set */
666   {COSTS_N_INSNS (18),                  /* cost of a divide/mod for QI */
667    COSTS_N_INSNS (26),                  /*                          HI */
668    COSTS_N_INSNS (42),                  /*                          SI */
669    COSTS_N_INSNS (74),                  /*                          DI */
670    COSTS_N_INSNS (74)},                 /*                          other */
671   COSTS_N_INSNS (1),                    /* cost of movsx */
672   COSTS_N_INSNS (1),                    /* cost of movzx */
673   8,                                    /* "large" insn */
674   9,                                    /* MOVE_RATIO */
675   4,                                    /* cost for loading QImode using movzbl */
676   {3, 4, 3},                            /* cost of loading integer registers
677                                            in QImode, HImode and SImode.
678                                            Relative to reg-reg move (2).  */
679   {3, 4, 3},                            /* cost of storing integer registers */
680   4,                                    /* cost of reg,reg fld/fst */
681   {4, 4, 12},                           /* cost of loading fp registers
682                                            in SFmode, DFmode and XFmode */
683   {6, 6, 8},                            /* cost of storing fp registers
684                                            in SFmode, DFmode and XFmode */
685   2,                                    /* cost of moving MMX register */
686   {3, 3},                               /* cost of loading MMX registers
687                                            in SImode and DImode */
688   {4, 4},                               /* cost of storing MMX registers
689                                            in SImode and DImode */
690   2,                                    /* cost of moving SSE register */
691   {4, 3, 6},                            /* cost of loading SSE registers
692                                            in SImode, DImode and TImode */
693   {4, 4, 5},                            /* cost of storing SSE registers
694                                            in SImode, DImode and TImode */
695   5,                                    /* MMX or SSE register to integer */
696   64,                                   /* size of l1 cache.  */
697   512,                                  /* size of l2 cache.  */
698   64,                                   /* size of prefetch block */
699   /* New AMD processors never drop prefetches; if they cannot be performed
700      immediately, they are queued.  We set number of simultaneous prefetches
701      to a large constant to reflect this (it probably is not a good idea not
702      to limit number of prefetches at all, as their execution also takes some
703      time).  */
704   100,                                  /* number of parallel prefetches */
705   3,                                    /* Branch cost */
706   COSTS_N_INSNS (4),                    /* cost of FADD and FSUB insns.  */
707   COSTS_N_INSNS (4),                    /* cost of FMUL instruction.  */
708   COSTS_N_INSNS (19),                   /* cost of FDIV instruction.  */
709   COSTS_N_INSNS (2),                    /* cost of FABS instruction.  */
710   COSTS_N_INSNS (2),                    /* cost of FCHS instruction.  */
711   COSTS_N_INSNS (35),                   /* cost of FSQRT instruction.  */
712   /* K8 has optimized REP instruction for medium sized blocks, but for very small
713      blocks it is better to use loop. For large blocks, libcall can do
714      nontemporary accesses and beat inline considerably.  */
715   {{libcall, {{6, loop}, {14, unrolled_loop}, {-1, rep_prefix_4_byte}}},
716    {libcall, {{16, loop}, {8192, rep_prefix_8_byte}, {-1, libcall}}}},
717   {{libcall, {{8, loop}, {24, unrolled_loop},
718               {2048, rep_prefix_4_byte}, {-1, libcall}}},
719    {libcall, {{48, unrolled_loop}, {8192, rep_prefix_8_byte}, {-1, libcall}}}},
720   4,                                    /* scalar_stmt_cost.  */
721   2,                                    /* scalar load_cost.  */
722   2,                                    /* scalar_store_cost.  */
723   5,                                    /* vec_stmt_cost.  */
724   0,                                    /* vec_to_scalar_cost.  */
725   2,                                    /* scalar_to_vec_cost.  */
726   2,                                    /* vec_align_load_cost.  */
727   3,                                    /* vec_unalign_load_cost.  */
728   3,                                    /* vec_store_cost.  */
729   3,                                    /* cond_taken_branch_cost.  */
730   2,                                    /* cond_not_taken_branch_cost.  */
731 };
732
733 struct processor_costs amdfam10_cost = {
734   COSTS_N_INSNS (1),                    /* cost of an add instruction */
735   COSTS_N_INSNS (2),                    /* cost of a lea instruction */
736   COSTS_N_INSNS (1),                    /* variable shift costs */
737   COSTS_N_INSNS (1),                    /* constant shift costs */
738   {COSTS_N_INSNS (3),                   /* cost of starting multiply for QI */
739    COSTS_N_INSNS (4),                   /*                               HI */
740    COSTS_N_INSNS (3),                   /*                               SI */
741    COSTS_N_INSNS (4),                   /*                               DI */
742    COSTS_N_INSNS (5)},                  /*                               other */
743   0,                                    /* cost of multiply per each bit set */
744   {COSTS_N_INSNS (19),                  /* cost of a divide/mod for QI */
745    COSTS_N_INSNS (35),                  /*                          HI */
746    COSTS_N_INSNS (51),                  /*                          SI */
747    COSTS_N_INSNS (83),                  /*                          DI */
748    COSTS_N_INSNS (83)},                 /*                          other */
749   COSTS_N_INSNS (1),                    /* cost of movsx */
750   COSTS_N_INSNS (1),                    /* cost of movzx */
751   8,                                    /* "large" insn */
752   9,                                    /* MOVE_RATIO */
753   4,                                    /* cost for loading QImode using movzbl */
754   {3, 4, 3},                            /* cost of loading integer registers
755                                            in QImode, HImode and SImode.
756                                            Relative to reg-reg move (2).  */
757   {3, 4, 3},                            /* cost of storing integer registers */
758   4,                                    /* cost of reg,reg fld/fst */
759   {4, 4, 12},                           /* cost of loading fp registers
760                                            in SFmode, DFmode and XFmode */
761   {6, 6, 8},                            /* cost of storing fp registers
762                                            in SFmode, DFmode and XFmode */
763   2,                                    /* cost of moving MMX register */
764   {3, 3},                               /* cost of loading MMX registers
765                                            in SImode and DImode */
766   {4, 4},                               /* cost of storing MMX registers
767                                            in SImode and DImode */
768   2,                                    /* cost of moving SSE register */
769   {4, 4, 3},                            /* cost of loading SSE registers
770                                            in SImode, DImode and TImode */
771   {4, 4, 5},                            /* cost of storing SSE registers
772                                            in SImode, DImode and TImode */
773   3,                                    /* MMX or SSE register to integer */
774                                         /* On K8
775                                             MOVD reg64, xmmreg  Double  FSTORE 4
776                                             MOVD reg32, xmmreg  Double  FSTORE 4
777                                            On AMDFAM10
778                                             MOVD reg64, xmmreg  Double  FADD 3
779                                                                 1/1  1/1
780                                             MOVD reg32, xmmreg  Double  FADD 3
781                                                                 1/1  1/1 */
782   64,                                   /* size of l1 cache.  */
783   512,                                  /* size of l2 cache.  */
784   64,                                   /* size of prefetch block */
785   /* New AMD processors never drop prefetches; if they cannot be performed
786      immediately, they are queued.  We set number of simultaneous prefetches
787      to a large constant to reflect this (it probably is not a good idea not
788      to limit number of prefetches at all, as their execution also takes some
789      time).  */
790   100,                                  /* number of parallel prefetches */
791   2,                                    /* Branch cost */
792   COSTS_N_INSNS (4),                    /* cost of FADD and FSUB insns.  */
793   COSTS_N_INSNS (4),                    /* cost of FMUL instruction.  */
794   COSTS_N_INSNS (19),                   /* cost of FDIV instruction.  */
795   COSTS_N_INSNS (2),                    /* cost of FABS instruction.  */
796   COSTS_N_INSNS (2),                    /* cost of FCHS instruction.  */
797   COSTS_N_INSNS (35),                   /* cost of FSQRT instruction.  */
798
799   /* AMDFAM10 has optimized REP instruction for medium sized blocks, but for
800      very small blocks it is better to use loop. For large blocks, libcall can
801      do nontemporary accesses and beat inline considerably.  */
802   {{libcall, {{6, loop}, {14, unrolled_loop}, {-1, rep_prefix_4_byte}}},
803    {libcall, {{16, loop}, {8192, rep_prefix_8_byte}, {-1, libcall}}}},
804   {{libcall, {{8, loop}, {24, unrolled_loop},
805               {2048, rep_prefix_4_byte}, {-1, libcall}}},
806    {libcall, {{48, unrolled_loop}, {8192, rep_prefix_8_byte}, {-1, libcall}}}},
807   4,                                    /* scalar_stmt_cost.  */
808   2,                                    /* scalar load_cost.  */
809   2,                                    /* scalar_store_cost.  */
810   6,                                    /* vec_stmt_cost.  */
811   0,                                    /* vec_to_scalar_cost.  */
812   2,                                    /* scalar_to_vec_cost.  */
813   2,                                    /* vec_align_load_cost.  */
814   2,                                    /* vec_unalign_load_cost.  */
815   2,                                    /* vec_store_cost.  */
816   2,                                    /* cond_taken_branch_cost.  */
817   1,                                    /* cond_not_taken_branch_cost.  */
818 };
819
820 static const
821 struct processor_costs pentium4_cost = {
822   COSTS_N_INSNS (1),                    /* cost of an add instruction */
823   COSTS_N_INSNS (3),                    /* cost of a lea instruction */
824   COSTS_N_INSNS (4),                    /* variable shift costs */
825   COSTS_N_INSNS (4),                    /* constant shift costs */
826   {COSTS_N_INSNS (15),                  /* cost of starting multiply for QI */
827    COSTS_N_INSNS (15),                  /*                               HI */
828    COSTS_N_INSNS (15),                  /*                               SI */
829    COSTS_N_INSNS (15),                  /*                               DI */
830    COSTS_N_INSNS (15)},                 /*                               other */
831   0,                                    /* cost of multiply per each bit set */
832   {COSTS_N_INSNS (56),                  /* cost of a divide/mod for QI */
833    COSTS_N_INSNS (56),                  /*                          HI */
834    COSTS_N_INSNS (56),                  /*                          SI */
835    COSTS_N_INSNS (56),                  /*                          DI */
836    COSTS_N_INSNS (56)},                 /*                          other */
837   COSTS_N_INSNS (1),                    /* cost of movsx */
838   COSTS_N_INSNS (1),                    /* cost of movzx */
839   16,                                   /* "large" insn */
840   6,                                    /* MOVE_RATIO */
841   2,                                    /* cost for loading QImode using movzbl */
842   {4, 5, 4},                            /* cost of loading integer registers
843                                            in QImode, HImode and SImode.
844                                            Relative to reg-reg move (2).  */
845   {2, 3, 2},                            /* cost of storing integer registers */
846   2,                                    /* cost of reg,reg fld/fst */
847   {2, 2, 6},                            /* cost of loading fp registers
848                                            in SFmode, DFmode and XFmode */
849   {4, 4, 6},                            /* cost of storing fp registers
850                                            in SFmode, DFmode and XFmode */
851   2,                                    /* cost of moving MMX register */
852   {2, 2},                               /* cost of loading MMX registers
853                                            in SImode and DImode */
854   {2, 2},                               /* cost of storing MMX registers
855                                            in SImode and DImode */
856   12,                                   /* cost of moving SSE register */
857   {12, 12, 12},                         /* cost of loading SSE registers
858                                            in SImode, DImode and TImode */
859   {2, 2, 8},                            /* cost of storing SSE registers
860                                            in SImode, DImode and TImode */
861   10,                                   /* MMX or SSE register to integer */
862   8,                                    /* size of l1 cache.  */
863   256,                                  /* size of l2 cache.  */
864   64,                                   /* size of prefetch block */
865   6,                                    /* number of parallel prefetches */
866   2,                                    /* Branch cost */
867   COSTS_N_INSNS (5),                    /* cost of FADD and FSUB insns.  */
868   COSTS_N_INSNS (7),                    /* cost of FMUL instruction.  */
869   COSTS_N_INSNS (43),                   /* cost of FDIV instruction.  */
870   COSTS_N_INSNS (2),                    /* cost of FABS instruction.  */
871   COSTS_N_INSNS (2),                    /* cost of FCHS instruction.  */
872   COSTS_N_INSNS (43),                   /* cost of FSQRT instruction.  */
873   {{libcall, {{12, loop_1_byte}, {-1, rep_prefix_4_byte}}},
874    DUMMY_STRINGOP_ALGS},
875   {{libcall, {{6, loop_1_byte}, {48, loop}, {20480, rep_prefix_4_byte},
876    {-1, libcall}}},
877    DUMMY_STRINGOP_ALGS},
878   1,                                    /* scalar_stmt_cost.  */
879   1,                                    /* scalar load_cost.  */
880   1,                                    /* scalar_store_cost.  */
881   1,                                    /* vec_stmt_cost.  */
882   1,                                    /* vec_to_scalar_cost.  */
883   1,                                    /* scalar_to_vec_cost.  */
884   1,                                    /* vec_align_load_cost.  */
885   2,                                    /* vec_unalign_load_cost.  */
886   1,                                    /* vec_store_cost.  */
887   3,                                    /* cond_taken_branch_cost.  */
888   1,                                    /* cond_not_taken_branch_cost.  */
889 };
890
891 static const
892 struct processor_costs nocona_cost = {
893   COSTS_N_INSNS (1),                    /* cost of an add instruction */
894   COSTS_N_INSNS (1),                    /* cost of a lea instruction */
895   COSTS_N_INSNS (1),                    /* variable shift costs */
896   COSTS_N_INSNS (1),                    /* constant shift costs */
897   {COSTS_N_INSNS (10),                  /* cost of starting multiply for QI */
898    COSTS_N_INSNS (10),                  /*                               HI */
899    COSTS_N_INSNS (10),                  /*                               SI */
900    COSTS_N_INSNS (10),                  /*                               DI */
901    COSTS_N_INSNS (10)},                 /*                               other */
902   0,                                    /* cost of multiply per each bit set */
903   {COSTS_N_INSNS (66),                  /* cost of a divide/mod for QI */
904    COSTS_N_INSNS (66),                  /*                          HI */
905    COSTS_N_INSNS (66),                  /*                          SI */
906    COSTS_N_INSNS (66),                  /*                          DI */
907    COSTS_N_INSNS (66)},                 /*                          other */
908   COSTS_N_INSNS (1),                    /* cost of movsx */
909   COSTS_N_INSNS (1),                    /* cost of movzx */
910   16,                                   /* "large" insn */
911   17,                                   /* MOVE_RATIO */
912   4,                                    /* cost for loading QImode using movzbl */
913   {4, 4, 4},                            /* cost of loading integer registers
914                                            in QImode, HImode and SImode.
915                                            Relative to reg-reg move (2).  */
916   {4, 4, 4},                            /* cost of storing integer registers */
917   3,                                    /* cost of reg,reg fld/fst */
918   {12, 12, 12},                         /* cost of loading fp registers
919                                            in SFmode, DFmode and XFmode */
920   {4, 4, 4},                            /* cost of storing fp registers
921                                            in SFmode, DFmode and XFmode */
922   6,                                    /* cost of moving MMX register */
923   {12, 12},                             /* cost of loading MMX registers
924                                            in SImode and DImode */
925   {12, 12},                             /* cost of storing MMX registers
926                                            in SImode and DImode */
927   6,                                    /* cost of moving SSE register */
928   {12, 12, 12},                         /* cost of loading SSE registers
929                                            in SImode, DImode and TImode */
930   {12, 12, 12},                         /* cost of storing SSE registers
931                                            in SImode, DImode and TImode */
932   8,                                    /* MMX or SSE register to integer */
933   8,                                    /* size of l1 cache.  */
934   1024,                                 /* size of l2 cache.  */
935   128,                                  /* size of prefetch block */
936   8,                                    /* number of parallel prefetches */
937   1,                                    /* Branch cost */
938   COSTS_N_INSNS (6),                    /* cost of FADD and FSUB insns.  */
939   COSTS_N_INSNS (8),                    /* cost of FMUL instruction.  */
940   COSTS_N_INSNS (40),                   /* cost of FDIV instruction.  */
941   COSTS_N_INSNS (3),                    /* cost of FABS instruction.  */
942   COSTS_N_INSNS (3),                    /* cost of FCHS instruction.  */
943   COSTS_N_INSNS (44),                   /* cost of FSQRT instruction.  */
944   {{libcall, {{12, loop_1_byte}, {-1, rep_prefix_4_byte}}},
945    {libcall, {{32, loop}, {20000, rep_prefix_8_byte},
946               {100000, unrolled_loop}, {-1, libcall}}}},
947   {{libcall, {{6, loop_1_byte}, {48, loop}, {20480, rep_prefix_4_byte},
948    {-1, libcall}}},
949    {libcall, {{24, loop}, {64, unrolled_loop},
950               {8192, rep_prefix_8_byte}, {-1, libcall}}}},
951   1,                                    /* scalar_stmt_cost.  */
952   1,                                    /* scalar load_cost.  */
953   1,                                    /* scalar_store_cost.  */
954   1,                                    /* vec_stmt_cost.  */
955   1,                                    /* vec_to_scalar_cost.  */
956   1,                                    /* scalar_to_vec_cost.  */
957   1,                                    /* vec_align_load_cost.  */
958   2,                                    /* vec_unalign_load_cost.  */
959   1,                                    /* vec_store_cost.  */
960   3,                                    /* cond_taken_branch_cost.  */
961   1,                                    /* cond_not_taken_branch_cost.  */
962 };
963
964 static const
965 struct processor_costs core2_cost = {
966   COSTS_N_INSNS (1),                    /* cost of an add instruction */
967   COSTS_N_INSNS (1) + 1,                /* cost of a lea instruction */
968   COSTS_N_INSNS (1),                    /* variable shift costs */
969   COSTS_N_INSNS (1),                    /* constant shift costs */
970   {COSTS_N_INSNS (3),                   /* cost of starting multiply for QI */
971    COSTS_N_INSNS (3),                   /*                               HI */
972    COSTS_N_INSNS (3),                   /*                               SI */
973    COSTS_N_INSNS (3),                   /*                               DI */
974    COSTS_N_INSNS (3)},                  /*                               other */
975   0,                                    /* cost of multiply per each bit set */
976   {COSTS_N_INSNS (22),                  /* cost of a divide/mod for QI */
977    COSTS_N_INSNS (22),                  /*                          HI */
978    COSTS_N_INSNS (22),                  /*                          SI */
979    COSTS_N_INSNS (22),                  /*                          DI */
980    COSTS_N_INSNS (22)},                 /*                          other */
981   COSTS_N_INSNS (1),                    /* cost of movsx */
982   COSTS_N_INSNS (1),                    /* cost of movzx */
983   8,                                    /* "large" insn */
984   16,                                   /* MOVE_RATIO */
985   2,                                    /* cost for loading QImode using movzbl */
986   {6, 6, 6},                            /* cost of loading integer registers
987                                            in QImode, HImode and SImode.
988                                            Relative to reg-reg move (2).  */
989   {4, 4, 4},                            /* cost of storing integer registers */
990   2,                                    /* cost of reg,reg fld/fst */
991   {6, 6, 6},                            /* cost of loading fp registers
992                                            in SFmode, DFmode and XFmode */
993   {4, 4, 4},                            /* cost of storing fp registers
994                                            in SFmode, DFmode and XFmode */
995   2,                                    /* cost of moving MMX register */
996   {6, 6},                               /* cost of loading MMX registers
997                                            in SImode and DImode */
998   {4, 4},                               /* cost of storing MMX registers
999                                            in SImode and DImode */
1000   2,                                    /* cost of moving SSE register */
1001   {6, 6, 6},                            /* cost of loading SSE registers
1002                                            in SImode, DImode and TImode */
1003   {4, 4, 4},                            /* cost of storing SSE registers
1004                                            in SImode, DImode and TImode */
1005   2,                                    /* MMX or SSE register to integer */
1006   32,                                   /* size of l1 cache.  */
1007   2048,                                 /* size of l2 cache.  */
1008   128,                                  /* size of prefetch block */
1009   8,                                    /* number of parallel prefetches */
1010   3,                                    /* Branch cost */
1011   COSTS_N_INSNS (3),                    /* cost of FADD and FSUB insns.  */
1012   COSTS_N_INSNS (5),                    /* cost of FMUL instruction.  */
1013   COSTS_N_INSNS (32),                   /* cost of FDIV instruction.  */
1014   COSTS_N_INSNS (1),                    /* cost of FABS instruction.  */
1015   COSTS_N_INSNS (1),                    /* cost of FCHS instruction.  */
1016   COSTS_N_INSNS (58),                   /* cost of FSQRT instruction.  */
1017   {{libcall, {{11, loop}, {-1, rep_prefix_4_byte}}},
1018    {libcall, {{32, loop}, {64, rep_prefix_4_byte},
1019               {8192, rep_prefix_8_byte}, {-1, libcall}}}},
1020   {{libcall, {{8, loop}, {15, unrolled_loop},
1021               {2048, rep_prefix_4_byte}, {-1, libcall}}},
1022    {libcall, {{24, loop}, {32, unrolled_loop},
1023               {8192, rep_prefix_8_byte}, {-1, libcall}}}},
1024   1,                                    /* scalar_stmt_cost.  */
1025   1,                                    /* scalar load_cost.  */
1026   1,                                    /* scalar_store_cost.  */
1027   1,                                    /* vec_stmt_cost.  */
1028   1,                                    /* vec_to_scalar_cost.  */
1029   1,                                    /* scalar_to_vec_cost.  */
1030   1,                                    /* vec_align_load_cost.  */
1031   2,                                    /* vec_unalign_load_cost.  */
1032   1,                                    /* vec_store_cost.  */
1033   3,                                    /* cond_taken_branch_cost.  */
1034   1,                                    /* cond_not_taken_branch_cost.  */
1035 };
1036
1037 static const
1038 struct processor_costs atom_cost = {
1039   COSTS_N_INSNS (1),                    /* cost of an add instruction */
1040   COSTS_N_INSNS (1) + 1,                /* cost of a lea instruction */
1041   COSTS_N_INSNS (1),                    /* variable shift costs */
1042   COSTS_N_INSNS (1),                    /* constant shift costs */
1043   {COSTS_N_INSNS (3),                   /* cost of starting multiply for QI */
1044    COSTS_N_INSNS (4),                   /*                               HI */
1045    COSTS_N_INSNS (3),                   /*                               SI */
1046    COSTS_N_INSNS (4),                   /*                               DI */
1047    COSTS_N_INSNS (2)},                  /*                               other */
1048   0,                                    /* cost of multiply per each bit set */
1049   {COSTS_N_INSNS (18),                  /* cost of a divide/mod for QI */
1050    COSTS_N_INSNS (26),                  /*                          HI */
1051    COSTS_N_INSNS (42),                  /*                          SI */
1052    COSTS_N_INSNS (74),                  /*                          DI */
1053    COSTS_N_INSNS (74)},                 /*                          other */
1054   COSTS_N_INSNS (1),                    /* cost of movsx */
1055   COSTS_N_INSNS (1),                    /* cost of movzx */
1056   8,                                    /* "large" insn */
1057   17,                                   /* MOVE_RATIO */
1058   2,                                    /* cost for loading QImode using movzbl */
1059   {4, 4, 4},                            /* cost of loading integer registers
1060                                            in QImode, HImode and SImode.
1061                                            Relative to reg-reg move (2).  */
1062   {4, 4, 4},                            /* cost of storing integer registers */
1063   4,                                    /* cost of reg,reg fld/fst */
1064   {12, 12, 12},                         /* cost of loading fp registers
1065                                            in SFmode, DFmode and XFmode */
1066   {6, 6, 8},                            /* cost of storing fp registers
1067                                            in SFmode, DFmode and XFmode */
1068   2,                                    /* cost of moving MMX register */
1069   {8, 8},                               /* cost of loading MMX registers
1070                                            in SImode and DImode */
1071   {8, 8},                               /* cost of storing MMX registers
1072                                            in SImode and DImode */
1073   2,                                    /* cost of moving SSE register */
1074   {8, 8, 8},                            /* cost of loading SSE registers
1075                                            in SImode, DImode and TImode */
1076   {8, 8, 8},                            /* cost of storing SSE registers
1077                                            in SImode, DImode and TImode */
1078   5,                                    /* MMX or SSE register to integer */
1079   32,                                   /* size of l1 cache.  */
1080   256,                                  /* size of l2 cache.  */
1081   64,                                   /* size of prefetch block */
1082   6,                                    /* number of parallel prefetches */
1083   3,                                    /* Branch cost */
1084   COSTS_N_INSNS (8),                    /* cost of FADD and FSUB insns.  */
1085   COSTS_N_INSNS (8),                    /* cost of FMUL instruction.  */
1086   COSTS_N_INSNS (20),                   /* cost of FDIV instruction.  */
1087   COSTS_N_INSNS (8),                    /* cost of FABS instruction.  */
1088   COSTS_N_INSNS (8),                    /* cost of FCHS instruction.  */
1089   COSTS_N_INSNS (40),                   /* cost of FSQRT instruction.  */
1090   {{libcall, {{11, loop}, {-1, rep_prefix_4_byte}}},
1091    {libcall, {{32, loop}, {64, rep_prefix_4_byte},
1092           {8192, rep_prefix_8_byte}, {-1, libcall}}}},
1093   {{libcall, {{8, loop}, {15, unrolled_loop},
1094           {2048, rep_prefix_4_byte}, {-1, libcall}}},
1095    {libcall, {{24, loop}, {32, unrolled_loop},
1096           {8192, rep_prefix_8_byte}, {-1, libcall}}}},
1097   1,                                    /* scalar_stmt_cost.  */
1098   1,                                    /* scalar load_cost.  */
1099   1,                                    /* scalar_store_cost.  */
1100   1,                                    /* vec_stmt_cost.  */
1101   1,                                    /* vec_to_scalar_cost.  */
1102   1,                                    /* scalar_to_vec_cost.  */
1103   1,                                    /* vec_align_load_cost.  */
1104   2,                                    /* vec_unalign_load_cost.  */
1105   1,                                    /* vec_store_cost.  */
1106   3,                                    /* cond_taken_branch_cost.  */
1107   1,                                    /* cond_not_taken_branch_cost.  */
1108 };
1109
1110 /* Generic64 should produce code tuned for Nocona and K8.  */
1111 static const
1112 struct processor_costs generic64_cost = {
1113   COSTS_N_INSNS (1),                    /* cost of an add instruction */
1114   /* On all chips taken into consideration lea is 2 cycles and more.  With
1115      this cost however our current implementation of synth_mult results in
1116      use of unnecessary temporary registers causing regression on several
1117      SPECfp benchmarks.  */
1118   COSTS_N_INSNS (1) + 1,                /* cost of a lea instruction */
1119   COSTS_N_INSNS (1),                    /* variable shift costs */
1120   COSTS_N_INSNS (1),                    /* constant shift costs */
1121   {COSTS_N_INSNS (3),                   /* cost of starting multiply for QI */
1122    COSTS_N_INSNS (4),                   /*                               HI */
1123    COSTS_N_INSNS (3),                   /*                               SI */
1124    COSTS_N_INSNS (4),                   /*                               DI */
1125    COSTS_N_INSNS (2)},                  /*                               other */
1126   0,                                    /* cost of multiply per each bit set */
1127   {COSTS_N_INSNS (18),                  /* cost of a divide/mod for QI */
1128    COSTS_N_INSNS (26),                  /*                          HI */
1129    COSTS_N_INSNS (42),                  /*                          SI */
1130    COSTS_N_INSNS (74),                  /*                          DI */
1131    COSTS_N_INSNS (74)},                 /*                          other */
1132   COSTS_N_INSNS (1),                    /* cost of movsx */
1133   COSTS_N_INSNS (1),                    /* cost of movzx */
1134   8,                                    /* "large" insn */
1135   17,                                   /* MOVE_RATIO */
1136   4,                                    /* cost for loading QImode using movzbl */
1137   {4, 4, 4},                            /* cost of loading integer registers
1138                                            in QImode, HImode and SImode.
1139                                            Relative to reg-reg move (2).  */
1140   {4, 4, 4},                            /* cost of storing integer registers */
1141   4,                                    /* cost of reg,reg fld/fst */
1142   {12, 12, 12},                         /* cost of loading fp registers
1143                                            in SFmode, DFmode and XFmode */
1144   {6, 6, 8},                            /* cost of storing fp registers
1145                                            in SFmode, DFmode and XFmode */
1146   2,                                    /* cost of moving MMX register */
1147   {8, 8},                               /* cost of loading MMX registers
1148                                            in SImode and DImode */
1149   {8, 8},                               /* cost of storing MMX registers
1150                                            in SImode and DImode */
1151   2,                                    /* cost of moving SSE register */
1152   {8, 8, 8},                            /* cost of loading SSE registers
1153                                            in SImode, DImode and TImode */
1154   {8, 8, 8},                            /* cost of storing SSE registers
1155                                            in SImode, DImode and TImode */
1156   5,                                    /* MMX or SSE register to integer */
1157   32,                                   /* size of l1 cache.  */
1158   512,                                  /* size of l2 cache.  */
1159   64,                                   /* size of prefetch block */
1160   6,                                    /* number of parallel prefetches */
1161   /* Benchmarks shows large regressions on K8 sixtrack benchmark when this value
1162      is increased to perhaps more appropriate value of 5.  */
1163   3,                                    /* Branch cost */
1164   COSTS_N_INSNS (8),                    /* cost of FADD and FSUB insns.  */
1165   COSTS_N_INSNS (8),                    /* cost of FMUL instruction.  */
1166   COSTS_N_INSNS (20),                   /* cost of FDIV instruction.  */
1167   COSTS_N_INSNS (8),                    /* cost of FABS instruction.  */
1168   COSTS_N_INSNS (8),                    /* cost of FCHS instruction.  */
1169   COSTS_N_INSNS (40),                   /* cost of FSQRT instruction.  */
1170   {DUMMY_STRINGOP_ALGS,
1171    {libcall, {{32, loop}, {8192, rep_prefix_8_byte}, {-1, libcall}}}},
1172   {DUMMY_STRINGOP_ALGS,
1173    {libcall, {{32, loop}, {8192, rep_prefix_8_byte}, {-1, libcall}}}},
1174   1,                                    /* scalar_stmt_cost.  */
1175   1,                                    /* scalar load_cost.  */
1176   1,                                    /* scalar_store_cost.  */
1177   1,                                    /* vec_stmt_cost.  */
1178   1,                                    /* vec_to_scalar_cost.  */
1179   1,                                    /* scalar_to_vec_cost.  */
1180   1,                                    /* vec_align_load_cost.  */
1181   2,                                    /* vec_unalign_load_cost.  */
1182   1,                                    /* vec_store_cost.  */
1183   3,                                    /* cond_taken_branch_cost.  */
1184   1,                                    /* cond_not_taken_branch_cost.  */
1185 };
1186
1187 /* Generic32 should produce code tuned for Athlon, PPro, Pentium4, Nocona and K8.  */
1188 static const
1189 struct processor_costs generic32_cost = {
1190   COSTS_N_INSNS (1),                    /* cost of an add instruction */
1191   COSTS_N_INSNS (1) + 1,                /* cost of a lea instruction */
1192   COSTS_N_INSNS (1),                    /* variable shift costs */
1193   COSTS_N_INSNS (1),                    /* constant shift costs */
1194   {COSTS_N_INSNS (3),                   /* cost of starting multiply for QI */
1195    COSTS_N_INSNS (4),                   /*                               HI */
1196    COSTS_N_INSNS (3),                   /*                               SI */
1197    COSTS_N_INSNS (4),                   /*                               DI */
1198    COSTS_N_INSNS (2)},                  /*                               other */
1199   0,                                    /* cost of multiply per each bit set */
1200   {COSTS_N_INSNS (18),                  /* cost of a divide/mod for QI */
1201    COSTS_N_INSNS (26),                  /*                          HI */
1202    COSTS_N_INSNS (42),                  /*                          SI */
1203    COSTS_N_INSNS (74),                  /*                          DI */
1204    COSTS_N_INSNS (74)},                 /*                          other */
1205   COSTS_N_INSNS (1),                    /* cost of movsx */
1206   COSTS_N_INSNS (1),                    /* cost of movzx */
1207   8,                                    /* "large" insn */
1208   17,                                   /* MOVE_RATIO */
1209   4,                                    /* cost for loading QImode using movzbl */
1210   {4, 4, 4},                            /* cost of loading integer registers
1211                                            in QImode, HImode and SImode.
1212                                            Relative to reg-reg move (2).  */
1213   {4, 4, 4},                            /* cost of storing integer registers */
1214   4,                                    /* cost of reg,reg fld/fst */
1215   {12, 12, 12},                         /* cost of loading fp registers
1216                                            in SFmode, DFmode and XFmode */
1217   {6, 6, 8},                            /* cost of storing fp registers
1218                                            in SFmode, DFmode and XFmode */
1219   2,                                    /* cost of moving MMX register */
1220   {8, 8},                               /* cost of loading MMX registers
1221                                            in SImode and DImode */
1222   {8, 8},                               /* cost of storing MMX registers
1223                                            in SImode and DImode */
1224   2,                                    /* cost of moving SSE register */
1225   {8, 8, 8},                            /* cost of loading SSE registers
1226                                            in SImode, DImode and TImode */
1227   {8, 8, 8},                            /* cost of storing SSE registers
1228                                            in SImode, DImode and TImode */
1229   5,                                    /* MMX or SSE register to integer */
1230   32,                                   /* size of l1 cache.  */
1231   256,                                  /* size of l2 cache.  */
1232   64,                                   /* size of prefetch block */
1233   6,                                    /* number of parallel prefetches */
1234   3,                                    /* Branch cost */
1235   COSTS_N_INSNS (8),                    /* cost of FADD and FSUB insns.  */
1236   COSTS_N_INSNS (8),                    /* cost of FMUL instruction.  */
1237   COSTS_N_INSNS (20),                   /* cost of FDIV instruction.  */
1238   COSTS_N_INSNS (8),                    /* cost of FABS instruction.  */
1239   COSTS_N_INSNS (8),                    /* cost of FCHS instruction.  */
1240   COSTS_N_INSNS (40),                   /* cost of FSQRT instruction.  */
1241   {{libcall, {{32, loop}, {8192, rep_prefix_4_byte}, {-1, libcall}}},
1242    DUMMY_STRINGOP_ALGS},
1243   {{libcall, {{32, loop}, {8192, rep_prefix_4_byte}, {-1, libcall}}},
1244    DUMMY_STRINGOP_ALGS},
1245   1,                                    /* scalar_stmt_cost.  */
1246   1,                                    /* scalar load_cost.  */
1247   1,                                    /* scalar_store_cost.  */
1248   1,                                    /* vec_stmt_cost.  */
1249   1,                                    /* vec_to_scalar_cost.  */
1250   1,                                    /* scalar_to_vec_cost.  */
1251   1,                                    /* vec_align_load_cost.  */
1252   2,                                    /* vec_unalign_load_cost.  */
1253   1,                                    /* vec_store_cost.  */
1254   3,                                    /* cond_taken_branch_cost.  */
1255   1,                                    /* cond_not_taken_branch_cost.  */
1256 };
1257
1258 const struct processor_costs *ix86_cost = &pentium_cost;
1259
1260 /* Processor feature/optimization bitmasks.  */
1261 #define m_386 (1<<PROCESSOR_I386)
1262 #define m_486 (1<<PROCESSOR_I486)
1263 #define m_PENT (1<<PROCESSOR_PENTIUM)
1264 #define m_PPRO (1<<PROCESSOR_PENTIUMPRO)
1265 #define m_PENT4  (1<<PROCESSOR_PENTIUM4)
1266 #define m_NOCONA  (1<<PROCESSOR_NOCONA)
1267 #define m_CORE2  (1<<PROCESSOR_CORE2)
1268 #define m_ATOM  (1<<PROCESSOR_ATOM)
1269
1270 #define m_GEODE  (1<<PROCESSOR_GEODE)
1271 #define m_K6  (1<<PROCESSOR_K6)
1272 #define m_K6_GEODE  (m_K6 | m_GEODE)
1273 #define m_K8  (1<<PROCESSOR_K8)
1274 #define m_ATHLON  (1<<PROCESSOR_ATHLON)
1275 #define m_ATHLON_K8  (m_K8 | m_ATHLON)
1276 #define m_AMDFAM10  (1<<PROCESSOR_AMDFAM10)
1277 #define m_AMD_MULTIPLE  (m_K8 | m_ATHLON | m_AMDFAM10)
1278
1279 #define m_GENERIC32 (1<<PROCESSOR_GENERIC32)
1280 #define m_GENERIC64 (1<<PROCESSOR_GENERIC64)
1281
1282 /* Generic instruction choice should be common subset of supported CPUs
1283    (PPro/PENT4/NOCONA/CORE2/Athlon/K8).  */
1284 #define m_GENERIC (m_GENERIC32 | m_GENERIC64)
1285
1286 /* Feature tests against the various tunings.  */
1287 unsigned char ix86_tune_features[X86_TUNE_LAST];
1288
1289 /* Feature tests against the various tunings used to create ix86_tune_features
1290    based on the processor mask.  */
1291 static unsigned int initial_ix86_tune_features[X86_TUNE_LAST] = {
1292   /* X86_TUNE_USE_LEAVE: Leave does not affect Nocona SPEC2000 results
1293      negatively, so enabling for Generic64 seems like good code size
1294      tradeoff.  We can't enable it for 32bit generic because it does not
1295      work well with PPro base chips.  */
1296   m_386 | m_K6_GEODE | m_AMD_MULTIPLE | m_CORE2 | m_GENERIC64,
1297
1298   /* X86_TUNE_PUSH_MEMORY */
1299   m_386 | m_K6_GEODE | m_AMD_MULTIPLE | m_PENT4
1300   | m_NOCONA | m_CORE2 | m_GENERIC,
1301
1302   /* X86_TUNE_ZERO_EXTEND_WITH_AND */
1303   m_486 | m_PENT,
1304
1305   /* X86_TUNE_UNROLL_STRLEN */
1306   m_486 | m_PENT | m_ATOM | m_PPRO | m_AMD_MULTIPLE | m_K6
1307   | m_CORE2 | m_GENERIC,
1308
1309   /* X86_TUNE_DEEP_BRANCH_PREDICTION */
1310   m_ATOM | m_PPRO | m_K6_GEODE | m_AMD_MULTIPLE | m_PENT4 | m_GENERIC,
1311
1312   /* X86_TUNE_BRANCH_PREDICTION_HINTS: Branch hints were put in P4 based
1313      on simulation result. But after P4 was made, no performance benefit
1314      was observed with branch hints.  It also increases the code size.
1315      As a result, icc never generates branch hints.  */
1316   0,
1317
1318   /* X86_TUNE_DOUBLE_WITH_ADD */
1319   ~m_386,
1320
1321   /* X86_TUNE_USE_SAHF */
1322   m_ATOM | m_PPRO | m_K6_GEODE | m_K8 | m_AMDFAM10 | m_PENT4
1323   | m_NOCONA | m_CORE2 | m_GENERIC,
1324
1325   /* X86_TUNE_MOVX: Enable to zero extend integer registers to avoid
1326      partial dependencies.  */
1327   m_AMD_MULTIPLE | m_ATOM | m_PPRO | m_PENT4 | m_NOCONA
1328   | m_CORE2 | m_GENERIC | m_GEODE /* m_386 | m_K6 */,
1329
1330   /* X86_TUNE_PARTIAL_REG_STALL: We probably ought to watch for partial
1331      register stalls on Generic32 compilation setting as well.  However
1332      in current implementation the partial register stalls are not eliminated
1333      very well - they can be introduced via subregs synthesized by combine
1334      and can happen in caller/callee saving sequences.  Because this option
1335      pays back little on PPro based chips and is in conflict with partial reg
1336      dependencies used by Athlon/P4 based chips, it is better to leave it off
1337      for generic32 for now.  */
1338   m_PPRO,
1339
1340   /* X86_TUNE_PARTIAL_FLAG_REG_STALL */
1341   m_CORE2 | m_GENERIC,
1342
1343   /* X86_TUNE_USE_HIMODE_FIOP */
1344   m_386 | m_486 | m_K6_GEODE,
1345
1346   /* X86_TUNE_USE_SIMODE_FIOP */
1347   ~(m_PPRO | m_AMD_MULTIPLE | m_PENT | m_ATOM | m_CORE2 | m_GENERIC),
1348
1349   /* X86_TUNE_USE_MOV0 */
1350   m_K6,
1351
1352   /* X86_TUNE_USE_CLTD */
1353   ~(m_PENT | m_ATOM | m_K6 | m_CORE2 | m_GENERIC),
1354
1355   /* X86_TUNE_USE_XCHGB: Use xchgb %rh,%rl instead of rolw/rorw $8,rx.  */
1356   m_PENT4,
1357
1358   /* X86_TUNE_SPLIT_LONG_MOVES */
1359   m_PPRO,
1360
1361   /* X86_TUNE_READ_MODIFY_WRITE */
1362   ~m_PENT,
1363
1364   /* X86_TUNE_READ_MODIFY */
1365   ~(m_PENT | m_PPRO),
1366
1367   /* X86_TUNE_PROMOTE_QIMODE */
1368   m_K6_GEODE | m_PENT | m_ATOM | m_386 | m_486 | m_AMD_MULTIPLE
1369   | m_CORE2 | m_GENERIC /* | m_PENT4 ? */,
1370
1371   /* X86_TUNE_FAST_PREFIX */
1372   ~(m_PENT | m_486 | m_386),
1373
1374   /* X86_TUNE_SINGLE_STRINGOP */
1375   m_386 | m_PENT4 | m_NOCONA,
1376
1377   /* X86_TUNE_QIMODE_MATH */
1378   ~0,
1379
1380   /* X86_TUNE_HIMODE_MATH: On PPro this flag is meant to avoid partial
1381      register stalls.  Just like X86_TUNE_PARTIAL_REG_STALL this option
1382      might be considered for Generic32 if our scheme for avoiding partial
1383      stalls was more effective.  */
1384   ~m_PPRO,
1385
1386   /* X86_TUNE_PROMOTE_QI_REGS */
1387   0,
1388
1389   /* X86_TUNE_PROMOTE_HI_REGS */
1390   m_PPRO,
1391
1392   /* X86_TUNE_ADD_ESP_4: Enable if add/sub is preferred over 1/2 push/pop.  */
1393   m_ATOM | m_AMD_MULTIPLE | m_K6_GEODE | m_PENT4 | m_NOCONA
1394   | m_CORE2 | m_GENERIC,
1395
1396   /* X86_TUNE_ADD_ESP_8 */
1397   m_AMD_MULTIPLE | m_ATOM | m_PPRO | m_K6_GEODE | m_386
1398   | m_486 | m_PENT4 | m_NOCONA | m_CORE2 | m_GENERIC,
1399
1400   /* X86_TUNE_SUB_ESP_4 */
1401   m_AMD_MULTIPLE | m_ATOM | m_PPRO | m_PENT4 | m_NOCONA | m_CORE2
1402   | m_GENERIC,
1403
1404   /* X86_TUNE_SUB_ESP_8 */
1405   m_AMD_MULTIPLE | m_ATOM | m_PPRO | m_386 | m_486
1406   | m_PENT4 | m_NOCONA | m_CORE2 | m_GENERIC,
1407
1408   /* X86_TUNE_INTEGER_DFMODE_MOVES: Enable if integer moves are preferred
1409      for DFmode copies */
1410   ~(m_AMD_MULTIPLE | m_ATOM | m_PENT4 | m_NOCONA | m_PPRO | m_CORE2
1411     | m_GENERIC | m_GEODE),
1412
1413   /* X86_TUNE_PARTIAL_REG_DEPENDENCY */
1414   m_AMD_MULTIPLE | m_ATOM | m_PENT4 | m_NOCONA | m_CORE2 | m_GENERIC,
1415
1416   /* X86_TUNE_SSE_PARTIAL_REG_DEPENDENCY: In the Generic model we have a
1417      conflict here in between PPro/Pentium4 based chips that thread 128bit
1418      SSE registers as single units versus K8 based chips that divide SSE
1419      registers to two 64bit halves.  This knob promotes all store destinations
1420      to be 128bit to allow register renaming on 128bit SSE units, but usually
1421      results in one extra microop on 64bit SSE units.  Experimental results
1422      shows that disabling this option on P4 brings over 20% SPECfp regression,
1423      while enabling it on K8 brings roughly 2.4% regression that can be partly
1424      masked by careful scheduling of moves.  */
1425   m_ATOM | m_PENT4 | m_NOCONA | m_PPRO | m_CORE2 | m_GENERIC
1426   | m_AMDFAM10,
1427
1428   /* X86_TUNE_SSE_UNALIGNED_MOVE_OPTIMAL */
1429   m_AMDFAM10,
1430
1431   /* X86_TUNE_SSE_SPLIT_REGS: Set for machines where the type and dependencies
1432      are resolved on SSE register parts instead of whole registers, so we may
1433      maintain just lower part of scalar values in proper format leaving the
1434      upper part undefined.  */
1435   m_ATHLON_K8,
1436
1437   /* X86_TUNE_SSE_TYPELESS_STORES */
1438   m_AMD_MULTIPLE,
1439
1440   /* X86_TUNE_SSE_LOAD0_BY_PXOR */
1441   m_PPRO | m_PENT4 | m_NOCONA,
1442
1443   /* X86_TUNE_MEMORY_MISMATCH_STALL */
1444   m_AMD_MULTIPLE | m_ATOM | m_PENT4 | m_NOCONA | m_CORE2 | m_GENERIC,
1445
1446   /* X86_TUNE_PROLOGUE_USING_MOVE */
1447   m_ATHLON_K8 | m_ATOM | m_PPRO | m_CORE2 | m_GENERIC,
1448
1449   /* X86_TUNE_EPILOGUE_USING_MOVE */
1450   m_ATHLON_K8 | m_ATOM | m_PPRO | m_CORE2 | m_GENERIC,
1451
1452   /* X86_TUNE_SHIFT1 */
1453   ~m_486,
1454
1455   /* X86_TUNE_USE_FFREEP */
1456   m_AMD_MULTIPLE,
1457
1458   /* X86_TUNE_INTER_UNIT_MOVES */
1459   ~(m_AMD_MULTIPLE | m_ATOM | m_GENERIC),
1460
1461   /* X86_TUNE_INTER_UNIT_CONVERSIONS */
1462   ~(m_AMDFAM10),
1463
1464   /* X86_TUNE_FOUR_JUMP_LIMIT: Some CPU cores are not able to predict more
1465      than 4 branch instructions in the 16 byte window.  */
1466   m_ATOM | m_PPRO | m_AMD_MULTIPLE | m_PENT4 | m_NOCONA | m_CORE2
1467   | m_GENERIC,
1468
1469   /* X86_TUNE_SCHEDULE */
1470   m_PPRO | m_AMD_MULTIPLE | m_K6_GEODE | m_PENT | m_ATOM | m_CORE2
1471   | m_GENERIC,
1472
1473   /* X86_TUNE_USE_BT */
1474   m_AMD_MULTIPLE | m_ATOM | m_CORE2 | m_GENERIC,
1475
1476   /* X86_TUNE_USE_INCDEC */
1477   ~(m_PENT4 | m_NOCONA | m_GENERIC | m_ATOM),
1478
1479   /* X86_TUNE_PAD_RETURNS */
1480   m_AMD_MULTIPLE | m_CORE2 | m_GENERIC,
1481
1482   /* X86_TUNE_EXT_80387_CONSTANTS */
1483   m_K6_GEODE | m_ATHLON_K8 | m_ATOM | m_PENT4 | m_NOCONA | m_PPRO
1484   | m_CORE2 | m_GENERIC,
1485
1486   /* X86_TUNE_SHORTEN_X87_SSE */
1487   ~m_K8,
1488
1489   /* X86_TUNE_AVOID_VECTOR_DECODE */
1490   m_K8 | m_GENERIC64,
1491
1492   /* X86_TUNE_PROMOTE_HIMODE_IMUL: Modern CPUs have same latency for HImode
1493      and SImode multiply, but 386 and 486 do HImode multiply faster.  */
1494   ~(m_386 | m_486),
1495
1496   /* X86_TUNE_SLOW_IMUL_IMM32_MEM: Imul of 32-bit constant and memory is
1497      vector path on AMD machines.  */
1498   m_K8 | m_GENERIC64 | m_AMDFAM10,
1499
1500   /* X86_TUNE_SLOW_IMUL_IMM8: Imul of 8-bit constant is vector path on AMD
1501      machines.  */
1502   m_K8 | m_GENERIC64 | m_AMDFAM10,
1503
1504   /* X86_TUNE_MOVE_M1_VIA_OR: On pentiums, it is faster to load -1 via OR
1505      than a MOV.  */
1506   m_PENT,
1507
1508   /* X86_TUNE_NOT_UNPAIRABLE: NOT is not pairable on Pentium, while XOR is,
1509      but one byte longer.  */
1510   m_PENT,
1511
1512   /* X86_TUNE_NOT_VECTORMODE: On AMD K6, NOT is vector decoded with memory
1513      operand that cannot be represented using a modRM byte.  The XOR
1514      replacement is long decoded, so this split helps here as well.  */
1515   m_K6,
1516
1517   /* X86_TUNE_USE_VECTOR_FP_CONVERTS: Prefer vector packed SSE conversion
1518      from FP to FP. */
1519   m_AMDFAM10 | m_GENERIC,
1520
1521   /* X86_TUNE_USE_VECTOR_CONVERTS: Prefer vector packed SSE conversion
1522      from integer to FP. */
1523   m_AMDFAM10,
1524
1525   /* X86_TUNE_FUSE_CMP_AND_BRANCH: Fuse a compare or test instruction
1526      with a subsequent conditional jump instruction into a single
1527      compare-and-branch uop.  */
1528   m_CORE2,
1529
1530   /* X86_TUNE_OPT_AGU: Optimize for Address Generation Unit. This flag
1531      will impact LEA instruction selection. */
1532   m_ATOM,
1533 };
1534
1535 /* Feature tests against the various architecture variations.  */
1536 unsigned char ix86_arch_features[X86_ARCH_LAST];
1537
1538 /* Feature tests against the various architecture variations, used to create
1539    ix86_arch_features based on the processor mask.  */
1540 static unsigned int initial_ix86_arch_features[X86_ARCH_LAST] = {
1541   /* X86_ARCH_CMOVE: Conditional move was added for pentiumpro.  */
1542   ~(m_386 | m_486 | m_PENT | m_K6),
1543
1544   /* X86_ARCH_CMPXCHG: Compare and exchange was added for 80486.  */
1545   ~m_386,
1546
1547   /* X86_ARCH_CMPXCHG8B: Compare and exchange 8 bytes was added for pentium. */
1548   ~(m_386 | m_486),
1549
1550   /* X86_ARCH_XADD: Exchange and add was added for 80486.  */
1551   ~m_386,
1552
1553   /* X86_ARCH_BSWAP: Byteswap was added for 80486.  */
1554   ~m_386,
1555 };
1556
1557 static const unsigned int x86_accumulate_outgoing_args
1558   = m_AMD_MULTIPLE | m_ATOM | m_PENT4 | m_NOCONA | m_PPRO | m_CORE2
1559     | m_GENERIC;
1560
1561 static const unsigned int x86_arch_always_fancy_math_387
1562   = m_PENT | m_ATOM | m_PPRO | m_AMD_MULTIPLE | m_PENT4
1563     | m_NOCONA | m_CORE2 | m_GENERIC;
1564
1565 static enum stringop_alg stringop_alg = no_stringop;
1566
1567 /* In case the average insn count for single function invocation is
1568    lower than this constant, emit fast (but longer) prologue and
1569    epilogue code.  */
1570 #define FAST_PROLOGUE_INSN_COUNT 20
1571
1572 /* Names for 8 (low), 8 (high), and 16-bit registers, respectively.  */
1573 static const char *const qi_reg_name[] = QI_REGISTER_NAMES;
1574 static const char *const qi_high_reg_name[] = QI_HIGH_REGISTER_NAMES;
1575 static const char *const hi_reg_name[] = HI_REGISTER_NAMES;
1576
1577 /* Array of the smallest class containing reg number REGNO, indexed by
1578    REGNO.  Used by REGNO_REG_CLASS in i386.h.  */
1579
1580 enum reg_class const regclass_map[FIRST_PSEUDO_REGISTER] =
1581 {
1582   /* ax, dx, cx, bx */
1583   AREG, DREG, CREG, BREG,
1584   /* si, di, bp, sp */
1585   SIREG, DIREG, NON_Q_REGS, NON_Q_REGS,
1586   /* FP registers */
1587   FP_TOP_REG, FP_SECOND_REG, FLOAT_REGS, FLOAT_REGS,
1588   FLOAT_REGS, FLOAT_REGS, FLOAT_REGS, FLOAT_REGS,
1589   /* arg pointer */
1590   NON_Q_REGS,
1591   /* flags, fpsr, fpcr, frame */
1592   NO_REGS, NO_REGS, NO_REGS, NON_Q_REGS,
1593   /* SSE registers */
1594   SSE_FIRST_REG, SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS,
1595   SSE_REGS, SSE_REGS,
1596   /* MMX registers */
1597   MMX_REGS, MMX_REGS, MMX_REGS, MMX_REGS, MMX_REGS, MMX_REGS,
1598   MMX_REGS, MMX_REGS,
1599   /* REX registers */
1600   NON_Q_REGS, NON_Q_REGS, NON_Q_REGS, NON_Q_REGS,
1601   NON_Q_REGS, NON_Q_REGS, NON_Q_REGS, NON_Q_REGS,
1602   /* SSE REX registers */
1603   SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS,
1604   SSE_REGS, SSE_REGS,
1605 };
1606
1607 /* The "default" register map used in 32bit mode.  */
1608
1609 int const dbx_register_map[FIRST_PSEUDO_REGISTER] =
1610 {
1611   0, 2, 1, 3, 6, 7, 4, 5,               /* general regs */
1612   12, 13, 14, 15, 16, 17, 18, 19,       /* fp regs */
1613   -1, -1, -1, -1, -1,                   /* arg, flags, fpsr, fpcr, frame */
1614   21, 22, 23, 24, 25, 26, 27, 28,       /* SSE */
1615   29, 30, 31, 32, 33, 34, 35, 36,       /* MMX */
1616   -1, -1, -1, -1, -1, -1, -1, -1,       /* extended integer registers */
1617   -1, -1, -1, -1, -1, -1, -1, -1,       /* extended SSE registers */
1618 };
1619
1620 /* The "default" register map used in 64bit mode.  */
1621
1622 int const dbx64_register_map[FIRST_PSEUDO_REGISTER] =
1623 {
1624   0, 1, 2, 3, 4, 5, 6, 7,               /* general regs */
1625   33, 34, 35, 36, 37, 38, 39, 40,       /* fp regs */
1626   -1, -1, -1, -1, -1,                   /* arg, flags, fpsr, fpcr, frame */
1627   17, 18, 19, 20, 21, 22, 23, 24,       /* SSE */
1628   41, 42, 43, 44, 45, 46, 47, 48,       /* MMX */
1629   8,9,10,11,12,13,14,15,                /* extended integer registers */
1630   25, 26, 27, 28, 29, 30, 31, 32,       /* extended SSE registers */
1631 };
1632
1633 /* Define the register numbers to be used in Dwarf debugging information.
1634    The SVR4 reference port C compiler uses the following register numbers
1635    in its Dwarf output code:
1636         0 for %eax (gcc regno = 0)
1637         1 for %ecx (gcc regno = 2)
1638         2 for %edx (gcc regno = 1)
1639         3 for %ebx (gcc regno = 3)
1640         4 for %esp (gcc regno = 7)
1641         5 for %ebp (gcc regno = 6)
1642         6 for %esi (gcc regno = 4)
1643         7 for %edi (gcc regno = 5)
1644    The following three DWARF register numbers are never generated by
1645    the SVR4 C compiler or by the GNU compilers, but SDB on x86/svr4
1646    believes these numbers have these meanings.
1647         8  for %eip    (no gcc equivalent)
1648         9  for %eflags (gcc regno = 17)
1649         10 for %trapno (no gcc equivalent)
1650    It is not at all clear how we should number the FP stack registers
1651    for the x86 architecture.  If the version of SDB on x86/svr4 were
1652    a bit less brain dead with respect to floating-point then we would
1653    have a precedent to follow with respect to DWARF register numbers
1654    for x86 FP registers, but the SDB on x86/svr4 is so completely
1655    broken with respect to FP registers that it is hardly worth thinking
1656    of it as something to strive for compatibility with.
1657    The version of x86/svr4 SDB I have at the moment does (partially)
1658    seem to believe that DWARF register number 11 is associated with
1659    the x86 register %st(0), but that's about all.  Higher DWARF
1660    register numbers don't seem to be associated with anything in
1661    particular, and even for DWARF regno 11, SDB only seems to under-
1662    stand that it should say that a variable lives in %st(0) (when
1663    asked via an `=' command) if we said it was in DWARF regno 11,
1664    but SDB still prints garbage when asked for the value of the
1665    variable in question (via a `/' command).
1666    (Also note that the labels SDB prints for various FP stack regs
1667    when doing an `x' command are all wrong.)
1668    Note that these problems generally don't affect the native SVR4
1669    C compiler because it doesn't allow the use of -O with -g and
1670    because when it is *not* optimizing, it allocates a memory
1671    location for each floating-point variable, and the memory
1672    location is what gets described in the DWARF AT_location
1673    attribute for the variable in question.
1674    Regardless of the severe mental illness of the x86/svr4 SDB, we
1675    do something sensible here and we use the following DWARF
1676    register numbers.  Note that these are all stack-top-relative
1677    numbers.
1678         11 for %st(0) (gcc regno = 8)
1679         12 for %st(1) (gcc regno = 9)
1680         13 for %st(2) (gcc regno = 10)
1681         14 for %st(3) (gcc regno = 11)
1682         15 for %st(4) (gcc regno = 12)
1683         16 for %st(5) (gcc regno = 13)
1684         17 for %st(6) (gcc regno = 14)
1685         18 for %st(7) (gcc regno = 15)
1686 */
1687 int const svr4_dbx_register_map[FIRST_PSEUDO_REGISTER] =
1688 {
1689   0, 2, 1, 3, 6, 7, 5, 4,               /* general regs */
1690   11, 12, 13, 14, 15, 16, 17, 18,       /* fp regs */
1691   -1, 9, -1, -1, -1,                    /* arg, flags, fpsr, fpcr, frame */
1692   21, 22, 23, 24, 25, 26, 27, 28,       /* SSE registers */
1693   29, 30, 31, 32, 33, 34, 35, 36,       /* MMX registers */
1694   -1, -1, -1, -1, -1, -1, -1, -1,       /* extended integer registers */
1695   -1, -1, -1, -1, -1, -1, -1, -1,       /* extended SSE registers */
1696 };
1697
1698 /* Test and compare insns in i386.md store the information needed to
1699    generate branch and scc insns here.  */
1700
1701 rtx ix86_compare_op0 = NULL_RTX;
1702 rtx ix86_compare_op1 = NULL_RTX;
1703
1704 /* Define parameter passing and return registers.  */
1705
1706 static int const x86_64_int_parameter_registers[6] =
1707 {
1708   DI_REG, SI_REG, DX_REG, CX_REG, R8_REG, R9_REG
1709 };
1710
1711 static int const x86_64_ms_abi_int_parameter_registers[4] =
1712 {
1713   CX_REG, DX_REG, R8_REG, R9_REG
1714 };
1715
1716 static int const x86_64_int_return_registers[4] =
1717 {
1718   AX_REG, DX_REG, DI_REG, SI_REG
1719 };
1720
1721 /* Define the structure for the machine field in struct function.  */
1722
1723 struct GTY(()) stack_local_entry {
1724   unsigned short mode;
1725   unsigned short n;
1726   rtx rtl;
1727   struct stack_local_entry *next;
1728 };
1729
1730 /* Structure describing stack frame layout.
1731    Stack grows downward:
1732
1733    [arguments]
1734                                               <- ARG_POINTER
1735    saved pc
1736
1737    saved frame pointer if frame_pointer_needed
1738                                               <- HARD_FRAME_POINTER
1739    [saved regs]
1740
1741    [padding0]
1742
1743    [saved SSE regs]
1744
1745    [padding1]          \
1746                         )
1747    [va_arg registers]  (
1748                         > to_allocate         <- FRAME_POINTER
1749    [frame]             (
1750                         )
1751    [padding2]          /
1752   */
1753 struct ix86_frame
1754 {
1755   int padding0;
1756   int nsseregs;
1757   int nregs;
1758   int padding1;
1759   int va_arg_size;
1760   HOST_WIDE_INT frame;
1761   int padding2;
1762   int outgoing_arguments_size;
1763   int red_zone_size;
1764
1765   HOST_WIDE_INT to_allocate;
1766   /* The offsets relative to ARG_POINTER.  */
1767   HOST_WIDE_INT frame_pointer_offset;
1768   HOST_WIDE_INT hard_frame_pointer_offset;
1769   HOST_WIDE_INT stack_pointer_offset;
1770
1771   /* When save_regs_using_mov is set, emit prologue using
1772      move instead of push instructions.  */
1773   bool save_regs_using_mov;
1774 };
1775
1776 /* Code model option.  */
1777 enum cmodel ix86_cmodel;
1778 /* Asm dialect.  */
1779 enum asm_dialect ix86_asm_dialect = ASM_ATT;
1780 /* TLS dialects.  */
1781 enum tls_dialect ix86_tls_dialect = TLS_DIALECT_GNU;
1782
1783 /* Which unit we are generating floating point math for.  */
1784 enum fpmath_unit ix86_fpmath;
1785
1786 /* Which cpu are we scheduling for.  */
1787 enum attr_cpu ix86_schedule;
1788
1789 /* Which cpu are we optimizing for.  */
1790 enum processor_type ix86_tune;
1791
1792 /* Which instruction set architecture to use.  */
1793 enum processor_type ix86_arch;
1794
1795 /* true if sse prefetch instruction is not NOOP.  */
1796 int x86_prefetch_sse;
1797
1798 /* ix86_regparm_string as a number */
1799 static int ix86_regparm;
1800
1801 /* -mstackrealign option */
1802 extern int ix86_force_align_arg_pointer;
1803 static const char ix86_force_align_arg_pointer_string[]
1804   = "force_align_arg_pointer";
1805
1806 static rtx (*ix86_gen_leave) (void);
1807 static rtx (*ix86_gen_pop1) (rtx);
1808 static rtx (*ix86_gen_add3) (rtx, rtx, rtx);
1809 static rtx (*ix86_gen_sub3) (rtx, rtx, rtx);
1810 static rtx (*ix86_gen_sub3_carry) (rtx, rtx, rtx, rtx, rtx);
1811 static rtx (*ix86_gen_one_cmpl2) (rtx, rtx);
1812 static rtx (*ix86_gen_monitor) (rtx, rtx, rtx);
1813 static rtx (*ix86_gen_andsp) (rtx, rtx, rtx);
1814
1815 /* Preferred alignment for stack boundary in bits.  */
1816 unsigned int ix86_preferred_stack_boundary;
1817
1818 /* Alignment for incoming stack boundary in bits specified at
1819    command line.  */
1820 static unsigned int ix86_user_incoming_stack_boundary;
1821
1822 /* Default alignment for incoming stack boundary in bits.  */
1823 static unsigned int ix86_default_incoming_stack_boundary;
1824
1825 /* Alignment for incoming stack boundary in bits.  */
1826 unsigned int ix86_incoming_stack_boundary;
1827
1828 /* The abi used by target.  */
1829 enum calling_abi ix86_abi;
1830
1831 /* Values 1-5: see jump.c */
1832 int ix86_branch_cost;
1833
1834 /* Calling abi specific va_list type nodes.  */
1835 static GTY(()) tree sysv_va_list_type_node;
1836 static GTY(()) tree ms_va_list_type_node;
1837
1838 /* Variables which are this size or smaller are put in the data/bss
1839    or ldata/lbss sections.  */
1840
1841 int ix86_section_threshold = 65536;
1842
1843 /* Prefix built by ASM_GENERATE_INTERNAL_LABEL.  */
1844 char internal_label_prefix[16];
1845 int internal_label_prefix_len;
1846
1847 /* Fence to use after loop using movnt.  */
1848 tree x86_mfence;
1849
1850 /* Register class used for passing given 64bit part of the argument.
1851    These represent classes as documented by the PS ABI, with the exception
1852    of SSESF, SSEDF classes, that are basically SSE class, just gcc will
1853    use SF or DFmode move instead of DImode to avoid reformatting penalties.
1854
1855    Similarly we play games with INTEGERSI_CLASS to use cheaper SImode moves
1856    whenever possible (upper half does contain padding).  */
1857 enum x86_64_reg_class
1858   {
1859     X86_64_NO_CLASS,
1860     X86_64_INTEGER_CLASS,
1861     X86_64_INTEGERSI_CLASS,
1862     X86_64_SSE_CLASS,
1863     X86_64_SSESF_CLASS,
1864     X86_64_SSEDF_CLASS,
1865     X86_64_SSEUP_CLASS,
1866     X86_64_X87_CLASS,
1867     X86_64_X87UP_CLASS,
1868     X86_64_COMPLEX_X87_CLASS,
1869     X86_64_MEMORY_CLASS
1870   };
1871
1872 #define MAX_CLASSES 4
1873
1874 /* Table of constants used by fldpi, fldln2, etc....  */
1875 static REAL_VALUE_TYPE ext_80387_constants_table [5];
1876 static bool ext_80387_constants_init = 0;
1877
1878 \f
1879 static struct machine_function * ix86_init_machine_status (void);
1880 static rtx ix86_function_value (const_tree, const_tree, bool);
1881 static rtx ix86_static_chain (const_tree, bool);
1882 static int ix86_function_regparm (const_tree, const_tree);
1883 static void ix86_compute_frame_layout (struct ix86_frame *);
1884 static bool ix86_expand_vector_init_one_nonzero (bool, enum machine_mode,
1885                                                  rtx, rtx, int);
1886 static void ix86_add_new_builtins (int);
1887 static rtx ix86_expand_vec_perm_builtin (tree);
1888
1889 enum ix86_function_specific_strings
1890 {
1891   IX86_FUNCTION_SPECIFIC_ARCH,
1892   IX86_FUNCTION_SPECIFIC_TUNE,
1893   IX86_FUNCTION_SPECIFIC_FPMATH,
1894   IX86_FUNCTION_SPECIFIC_MAX
1895 };
1896
1897 static char *ix86_target_string (int, int, const char *, const char *,
1898                                  const char *, bool);
1899 static void ix86_debug_options (void) ATTRIBUTE_UNUSED;
1900 static void ix86_function_specific_save (struct cl_target_option *);
1901 static void ix86_function_specific_restore (struct cl_target_option *);
1902 static void ix86_function_specific_print (FILE *, int,
1903                                           struct cl_target_option *);
1904 static bool ix86_valid_target_attribute_p (tree, tree, tree, int);
1905 static bool ix86_valid_target_attribute_inner_p (tree, char *[]);
1906 static bool ix86_can_inline_p (tree, tree);
1907 static void ix86_set_current_function (tree);
1908 static unsigned int ix86_minimum_incoming_stack_boundary (bool);
1909
1910 static enum calling_abi ix86_function_abi (const_tree);
1911
1912 \f
1913 /* The svr4 ABI for the i386 says that records and unions are returned
1914    in memory.  */
1915 #ifndef DEFAULT_PCC_STRUCT_RETURN
1916 #define DEFAULT_PCC_STRUCT_RETURN 1
1917 #endif
1918
1919 /* Whether -mtune= or -march= were specified */
1920 static int ix86_tune_defaulted;
1921 static int ix86_arch_specified;
1922
1923 /* Bit flags that specify the ISA we are compiling for.  */
1924 int ix86_isa_flags = TARGET_64BIT_DEFAULT | TARGET_SUBTARGET_ISA_DEFAULT;
1925
1926 /* A mask of ix86_isa_flags that includes bit X if X
1927    was set or cleared on the command line.  */
1928 static int ix86_isa_flags_explicit;
1929
1930 /* Define a set of ISAs which are available when a given ISA is
1931    enabled.  MMX and SSE ISAs are handled separately.  */
1932
1933 #define OPTION_MASK_ISA_MMX_SET OPTION_MASK_ISA_MMX
1934 #define OPTION_MASK_ISA_3DNOW_SET \
1935   (OPTION_MASK_ISA_3DNOW | OPTION_MASK_ISA_MMX_SET)
1936
1937 #define OPTION_MASK_ISA_SSE_SET OPTION_MASK_ISA_SSE
1938 #define OPTION_MASK_ISA_SSE2_SET \
1939   (OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_SSE_SET)
1940 #define OPTION_MASK_ISA_SSE3_SET \
1941   (OPTION_MASK_ISA_SSE3 | OPTION_MASK_ISA_SSE2_SET)
1942 #define OPTION_MASK_ISA_SSSE3_SET \
1943   (OPTION_MASK_ISA_SSSE3 | OPTION_MASK_ISA_SSE3_SET)
1944 #define OPTION_MASK_ISA_SSE4_1_SET \
1945   (OPTION_MASK_ISA_SSE4_1 | OPTION_MASK_ISA_SSSE3_SET)
1946 #define OPTION_MASK_ISA_SSE4_2_SET \
1947   (OPTION_MASK_ISA_SSE4_2 | OPTION_MASK_ISA_SSE4_1_SET)
1948 #define OPTION_MASK_ISA_AVX_SET \
1949   (OPTION_MASK_ISA_AVX | OPTION_MASK_ISA_SSE4_2_SET)
1950 #define OPTION_MASK_ISA_FMA_SET \
1951   (OPTION_MASK_ISA_FMA | OPTION_MASK_ISA_AVX_SET)
1952
1953 /* SSE4 includes both SSE4.1 and SSE4.2. -msse4 should be the same
1954    as -msse4.2.  */
1955 #define OPTION_MASK_ISA_SSE4_SET OPTION_MASK_ISA_SSE4_2_SET
1956
1957 #define OPTION_MASK_ISA_SSE4A_SET \
1958   (OPTION_MASK_ISA_SSE4A | OPTION_MASK_ISA_SSE3_SET)
1959 #define OPTION_MASK_ISA_FMA4_SET \
1960   (OPTION_MASK_ISA_FMA4 | OPTION_MASK_ISA_SSE4A_SET \
1961    | OPTION_MASK_ISA_AVX_SET)
1962 #define OPTION_MASK_ISA_XOP_SET \
1963   (OPTION_MASK_ISA_XOP | OPTION_MASK_ISA_FMA4_SET)
1964 #define OPTION_MASK_ISA_LWP_SET \
1965   OPTION_MASK_ISA_LWP
1966
1967 /* AES and PCLMUL need SSE2 because they use xmm registers */
1968 #define OPTION_MASK_ISA_AES_SET \
1969   (OPTION_MASK_ISA_AES | OPTION_MASK_ISA_SSE2_SET)
1970 #define OPTION_MASK_ISA_PCLMUL_SET \
1971   (OPTION_MASK_ISA_PCLMUL | OPTION_MASK_ISA_SSE2_SET)
1972
1973 #define OPTION_MASK_ISA_ABM_SET \
1974   (OPTION_MASK_ISA_ABM | OPTION_MASK_ISA_POPCNT)
1975
1976 #define OPTION_MASK_ISA_POPCNT_SET OPTION_MASK_ISA_POPCNT
1977 #define OPTION_MASK_ISA_CX16_SET OPTION_MASK_ISA_CX16
1978 #define OPTION_MASK_ISA_SAHF_SET OPTION_MASK_ISA_SAHF
1979 #define OPTION_MASK_ISA_MOVBE_SET OPTION_MASK_ISA_MOVBE
1980 #define OPTION_MASK_ISA_CRC32_SET OPTION_MASK_ISA_CRC32
1981
1982 /* Define a set of ISAs which aren't available when a given ISA is
1983    disabled.  MMX and SSE ISAs are handled separately.  */
1984
1985 #define OPTION_MASK_ISA_MMX_UNSET \
1986   (OPTION_MASK_ISA_MMX | OPTION_MASK_ISA_3DNOW_UNSET)
1987 #define OPTION_MASK_ISA_3DNOW_UNSET \
1988   (OPTION_MASK_ISA_3DNOW | OPTION_MASK_ISA_3DNOW_A_UNSET)
1989 #define OPTION_MASK_ISA_3DNOW_A_UNSET OPTION_MASK_ISA_3DNOW_A
1990
1991 #define OPTION_MASK_ISA_SSE_UNSET \
1992   (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_SSE2_UNSET)
1993 #define OPTION_MASK_ISA_SSE2_UNSET \
1994   (OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_SSE3_UNSET)
1995 #define OPTION_MASK_ISA_SSE3_UNSET \
1996   (OPTION_MASK_ISA_SSE3 \
1997    | OPTION_MASK_ISA_SSSE3_UNSET \
1998    | OPTION_MASK_ISA_SSE4A_UNSET )
1999 #define OPTION_MASK_ISA_SSSE3_UNSET \
2000   (OPTION_MASK_ISA_SSSE3 | OPTION_MASK_ISA_SSE4_1_UNSET)
2001 #define OPTION_MASK_ISA_SSE4_1_UNSET \
2002   (OPTION_MASK_ISA_SSE4_1 | OPTION_MASK_ISA_SSE4_2_UNSET)
2003 #define OPTION_MASK_ISA_SSE4_2_UNSET \
2004   (OPTION_MASK_ISA_SSE4_2 | OPTION_MASK_ISA_AVX_UNSET )
2005 #define OPTION_MASK_ISA_AVX_UNSET \
2006   (OPTION_MASK_ISA_AVX | OPTION_MASK_ISA_FMA_UNSET \
2007    | OPTION_MASK_ISA_FMA4_UNSET)
2008 #define OPTION_MASK_ISA_FMA_UNSET OPTION_MASK_ISA_FMA
2009
2010 /* SSE4 includes both SSE4.1 and SSE4.2.  -mno-sse4 should the same
2011    as -mno-sse4.1. */
2012 #define OPTION_MASK_ISA_SSE4_UNSET OPTION_MASK_ISA_SSE4_1_UNSET
2013
2014 #define OPTION_MASK_ISA_SSE4A_UNSET \
2015   (OPTION_MASK_ISA_SSE4A | OPTION_MASK_ISA_FMA4_UNSET)
2016
2017 #define OPTION_MASK_ISA_FMA4_UNSET \
2018   (OPTION_MASK_ISA_FMA4 | OPTION_MASK_ISA_XOP_UNSET)
2019 #define OPTION_MASK_ISA_XOP_UNSET OPTION_MASK_ISA_XOP
2020 #define OPTION_MASK_ISA_LWP_UNSET OPTION_MASK_ISA_LWP
2021
2022 #define OPTION_MASK_ISA_AES_UNSET OPTION_MASK_ISA_AES
2023 #define OPTION_MASK_ISA_PCLMUL_UNSET OPTION_MASK_ISA_PCLMUL
2024 #define OPTION_MASK_ISA_ABM_UNSET OPTION_MASK_ISA_ABM
2025 #define OPTION_MASK_ISA_POPCNT_UNSET OPTION_MASK_ISA_POPCNT
2026 #define OPTION_MASK_ISA_CX16_UNSET OPTION_MASK_ISA_CX16
2027 #define OPTION_MASK_ISA_SAHF_UNSET OPTION_MASK_ISA_SAHF
2028 #define OPTION_MASK_ISA_MOVBE_UNSET OPTION_MASK_ISA_MOVBE
2029 #define OPTION_MASK_ISA_CRC32_UNSET OPTION_MASK_ISA_CRC32
2030
2031 /* Vectorization library interface and handlers.  */
2032 tree (*ix86_veclib_handler)(enum built_in_function, tree, tree) = NULL;
2033 static tree ix86_veclibabi_svml (enum built_in_function, tree, tree);
2034 static tree ix86_veclibabi_acml (enum built_in_function, tree, tree);
2035
2036 /* Processor target table, indexed by processor number */
2037 struct ptt
2038 {
2039   const struct processor_costs *cost;           /* Processor costs */
2040   const int align_loop;                         /* Default alignments.  */
2041   const int align_loop_max_skip;
2042   const int align_jump;
2043   const int align_jump_max_skip;
2044   const int align_func;
2045 };
2046
2047 static const struct ptt processor_target_table[PROCESSOR_max] =
2048 {
2049   {&i386_cost, 4, 3, 4, 3, 4},
2050   {&i486_cost, 16, 15, 16, 15, 16},
2051   {&pentium_cost, 16, 7, 16, 7, 16},
2052   {&pentiumpro_cost, 16, 15, 16, 10, 16},
2053   {&geode_cost, 0, 0, 0, 0, 0},
2054   {&k6_cost, 32, 7, 32, 7, 32},
2055   {&athlon_cost, 16, 7, 16, 7, 16},
2056   {&pentium4_cost, 0, 0, 0, 0, 0},
2057   {&k8_cost, 16, 7, 16, 7, 16},
2058   {&nocona_cost, 0, 0, 0, 0, 0},
2059   {&core2_cost, 16, 10, 16, 10, 16},
2060   {&generic32_cost, 16, 7, 16, 7, 16},
2061   {&generic64_cost, 16, 10, 16, 10, 16},
2062   {&amdfam10_cost, 32, 24, 32, 7, 32},
2063   {&atom_cost, 16, 7, 16, 7, 16}
2064 };
2065
2066 static const char *const cpu_names[TARGET_CPU_DEFAULT_max] =
2067 {
2068   "generic",
2069   "i386",
2070   "i486",
2071   "pentium",
2072   "pentium-mmx",
2073   "pentiumpro",
2074   "pentium2",
2075   "pentium3",
2076   "pentium4",
2077   "pentium-m",
2078   "prescott",
2079   "nocona",
2080   "core2",
2081   "atom",
2082   "geode",
2083   "k6",
2084   "k6-2",
2085   "k6-3",
2086   "athlon",
2087   "athlon-4",
2088   "k8",
2089   "amdfam10"
2090 };
2091 \f
2092 /* Implement TARGET_HANDLE_OPTION.  */
2093
2094 static bool
2095 ix86_handle_option (size_t code, const char *arg ATTRIBUTE_UNUSED, int value)
2096 {
2097   switch (code)
2098     {
2099     case OPT_mmmx:
2100       if (value)
2101         {
2102           ix86_isa_flags |= OPTION_MASK_ISA_MMX_SET;
2103           ix86_isa_flags_explicit |= OPTION_MASK_ISA_MMX_SET;
2104         }
2105       else
2106         {
2107           ix86_isa_flags &= ~OPTION_MASK_ISA_MMX_UNSET;
2108           ix86_isa_flags_explicit |= OPTION_MASK_ISA_MMX_UNSET;
2109         }
2110       return true;
2111
2112     case OPT_m3dnow:
2113       if (value)
2114         {
2115           ix86_isa_flags |= OPTION_MASK_ISA_3DNOW_SET;
2116           ix86_isa_flags_explicit |= OPTION_MASK_ISA_3DNOW_SET;
2117         }
2118       else
2119         {
2120           ix86_isa_flags &= ~OPTION_MASK_ISA_3DNOW_UNSET;
2121           ix86_isa_flags_explicit |= OPTION_MASK_ISA_3DNOW_UNSET;
2122         }
2123       return true;
2124
2125     case OPT_m3dnowa:
2126       return false;
2127
2128     case OPT_msse:
2129       if (value)
2130         {
2131           ix86_isa_flags |= OPTION_MASK_ISA_SSE_SET;
2132           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE_SET;
2133         }
2134       else
2135         {
2136           ix86_isa_flags &= ~OPTION_MASK_ISA_SSE_UNSET;
2137           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE_UNSET;
2138         }
2139       return true;
2140
2141     case OPT_msse2:
2142       if (value)
2143         {
2144           ix86_isa_flags |= OPTION_MASK_ISA_SSE2_SET;
2145           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE2_SET;
2146         }
2147       else
2148         {
2149           ix86_isa_flags &= ~OPTION_MASK_ISA_SSE2_UNSET;
2150           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE2_UNSET;
2151         }
2152       return true;
2153
2154     case OPT_msse3:
2155       if (value)
2156         {
2157           ix86_isa_flags |= OPTION_MASK_ISA_SSE3_SET;
2158           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE3_SET;
2159         }
2160       else
2161         {
2162           ix86_isa_flags &= ~OPTION_MASK_ISA_SSE3_UNSET;
2163           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE3_UNSET;
2164         }
2165       return true;
2166
2167     case OPT_mssse3:
2168       if (value)
2169         {
2170           ix86_isa_flags |= OPTION_MASK_ISA_SSSE3_SET;
2171           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSSE3_SET;
2172         }
2173       else
2174         {
2175           ix86_isa_flags &= ~OPTION_MASK_ISA_SSSE3_UNSET;
2176           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSSE3_UNSET;
2177         }
2178       return true;
2179
2180     case OPT_msse4_1:
2181       if (value)
2182         {
2183           ix86_isa_flags |= OPTION_MASK_ISA_SSE4_1_SET;
2184           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_1_SET;
2185         }
2186       else
2187         {
2188           ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4_1_UNSET;
2189           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_1_UNSET;
2190         }
2191       return true;
2192
2193     case OPT_msse4_2:
2194       if (value)
2195         {
2196           ix86_isa_flags |= OPTION_MASK_ISA_SSE4_2_SET;
2197           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_2_SET;
2198         }
2199       else
2200         {
2201           ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4_2_UNSET;
2202           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_2_UNSET;
2203         }
2204       return true;
2205
2206     case OPT_mavx:
2207       if (value)
2208         {
2209           ix86_isa_flags |= OPTION_MASK_ISA_AVX_SET;
2210           ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX_SET;
2211         }
2212       else
2213         {
2214           ix86_isa_flags &= ~OPTION_MASK_ISA_AVX_UNSET;
2215           ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX_UNSET;
2216         }
2217       return true;
2218
2219     case OPT_mfma:
2220       if (value)
2221         {
2222           ix86_isa_flags |= OPTION_MASK_ISA_FMA_SET;
2223           ix86_isa_flags_explicit |= OPTION_MASK_ISA_FMA_SET;
2224         }
2225       else
2226         {
2227           ix86_isa_flags &= ~OPTION_MASK_ISA_FMA_UNSET;
2228           ix86_isa_flags_explicit |= OPTION_MASK_ISA_FMA_UNSET;
2229         }
2230       return true;
2231
2232     case OPT_msse4:
2233       ix86_isa_flags |= OPTION_MASK_ISA_SSE4_SET;
2234       ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_SET;
2235       return true;
2236
2237     case OPT_mno_sse4:
2238       ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4_UNSET;
2239       ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_UNSET;
2240       return true;
2241
2242     case OPT_msse4a:
2243       if (value)
2244         {
2245           ix86_isa_flags |= OPTION_MASK_ISA_SSE4A_SET;
2246           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4A_SET;
2247         }
2248       else
2249         {
2250           ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4A_UNSET;
2251           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4A_UNSET;
2252         }
2253       return true;
2254
2255     case OPT_mfma4:
2256       if (value)
2257         {
2258           ix86_isa_flags |= OPTION_MASK_ISA_FMA4_SET;
2259           ix86_isa_flags_explicit |= OPTION_MASK_ISA_FMA4_SET;
2260         }
2261       else
2262         {
2263           ix86_isa_flags &= ~OPTION_MASK_ISA_FMA4_UNSET;
2264           ix86_isa_flags_explicit |= OPTION_MASK_ISA_FMA4_UNSET;
2265         }
2266       return true;
2267
2268    case OPT_mxop:
2269       if (value)
2270         {
2271           ix86_isa_flags |= OPTION_MASK_ISA_XOP_SET;
2272           ix86_isa_flags_explicit |= OPTION_MASK_ISA_XOP_SET;
2273         }
2274       else
2275         {
2276           ix86_isa_flags &= ~OPTION_MASK_ISA_XOP_UNSET;
2277           ix86_isa_flags_explicit |= OPTION_MASK_ISA_XOP_UNSET;
2278         }
2279       return true;
2280
2281    case OPT_mlwp:
2282       if (value)
2283         {
2284           ix86_isa_flags |= OPTION_MASK_ISA_LWP_SET;
2285           ix86_isa_flags_explicit |= OPTION_MASK_ISA_LWP_SET;
2286         }
2287       else
2288         {
2289           ix86_isa_flags &= ~OPTION_MASK_ISA_LWP_UNSET;
2290           ix86_isa_flags_explicit |= OPTION_MASK_ISA_LWP_UNSET;
2291         }
2292       return true;
2293
2294     case OPT_mabm:
2295       if (value)
2296         {
2297           ix86_isa_flags |= OPTION_MASK_ISA_ABM_SET;
2298           ix86_isa_flags_explicit |= OPTION_MASK_ISA_ABM_SET;
2299         }
2300       else
2301         {
2302           ix86_isa_flags &= ~OPTION_MASK_ISA_ABM_UNSET;
2303           ix86_isa_flags_explicit |= OPTION_MASK_ISA_ABM_UNSET;
2304         }
2305       return true;
2306
2307     case OPT_mpopcnt:
2308       if (value)
2309         {
2310           ix86_isa_flags |= OPTION_MASK_ISA_POPCNT_SET;
2311           ix86_isa_flags_explicit |= OPTION_MASK_ISA_POPCNT_SET;
2312         }
2313       else
2314         {
2315           ix86_isa_flags &= ~OPTION_MASK_ISA_POPCNT_UNSET;
2316           ix86_isa_flags_explicit |= OPTION_MASK_ISA_POPCNT_UNSET;
2317         }
2318       return true;
2319
2320     case OPT_msahf:
2321       if (value)
2322         {
2323           ix86_isa_flags |= OPTION_MASK_ISA_SAHF_SET;
2324           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SAHF_SET;
2325         }
2326       else
2327         {
2328           ix86_isa_flags &= ~OPTION_MASK_ISA_SAHF_UNSET;
2329           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SAHF_UNSET;
2330         }
2331       return true;
2332
2333     case OPT_mcx16:
2334       if (value)
2335         {
2336           ix86_isa_flags |= OPTION_MASK_ISA_CX16_SET;
2337           ix86_isa_flags_explicit |= OPTION_MASK_ISA_CX16_SET;
2338         }
2339       else
2340         {
2341           ix86_isa_flags &= ~OPTION_MASK_ISA_CX16_UNSET;
2342           ix86_isa_flags_explicit |= OPTION_MASK_ISA_CX16_UNSET;
2343         }
2344       return true;
2345
2346     case OPT_mmovbe:
2347       if (value)
2348         {
2349           ix86_isa_flags |= OPTION_MASK_ISA_MOVBE_SET;
2350           ix86_isa_flags_explicit |= OPTION_MASK_ISA_MOVBE_SET;
2351         }
2352       else
2353         {
2354           ix86_isa_flags &= ~OPTION_MASK_ISA_MOVBE_UNSET;
2355           ix86_isa_flags_explicit |= OPTION_MASK_ISA_MOVBE_UNSET;
2356         }
2357       return true;
2358
2359     case OPT_mcrc32:
2360       if (value)
2361         {
2362           ix86_isa_flags |= OPTION_MASK_ISA_CRC32_SET;
2363           ix86_isa_flags_explicit |= OPTION_MASK_ISA_CRC32_SET;
2364         }
2365       else
2366         {
2367           ix86_isa_flags &= ~OPTION_MASK_ISA_CRC32_UNSET;
2368           ix86_isa_flags_explicit |= OPTION_MASK_ISA_CRC32_UNSET;
2369         }
2370       return true;
2371
2372     case OPT_maes:
2373       if (value)
2374         {
2375           ix86_isa_flags |= OPTION_MASK_ISA_AES_SET;
2376           ix86_isa_flags_explicit |= OPTION_MASK_ISA_AES_SET;
2377         }
2378       else
2379         {
2380           ix86_isa_flags &= ~OPTION_MASK_ISA_AES_UNSET;
2381           ix86_isa_flags_explicit |= OPTION_MASK_ISA_AES_UNSET;
2382         }
2383       return true;
2384
2385     case OPT_mpclmul:
2386       if (value)
2387         {
2388           ix86_isa_flags |= OPTION_MASK_ISA_PCLMUL_SET;
2389           ix86_isa_flags_explicit |= OPTION_MASK_ISA_PCLMUL_SET;
2390         }
2391       else
2392         {
2393           ix86_isa_flags &= ~OPTION_MASK_ISA_PCLMUL_UNSET;
2394           ix86_isa_flags_explicit |= OPTION_MASK_ISA_PCLMUL_UNSET;
2395         }
2396       return true;
2397
2398     default:
2399       return true;
2400     }
2401 }
2402 \f
2403 /* Return a string the documents the current -m options.  The caller is
2404    responsible for freeing the string.  */
2405
2406 static char *
2407 ix86_target_string (int isa, int flags, const char *arch, const char *tune,
2408                     const char *fpmath, bool add_nl_p)
2409 {
2410   struct ix86_target_opts
2411   {
2412     const char *option;         /* option string */
2413     int mask;                   /* isa mask options */
2414   };
2415
2416   /* This table is ordered so that options like -msse4.2 that imply
2417      preceding options while match those first.  */
2418   static struct ix86_target_opts isa_opts[] =
2419   {
2420     { "-m64",           OPTION_MASK_ISA_64BIT },
2421     { "-mfma4",         OPTION_MASK_ISA_FMA4 },
2422     { "-mxop",          OPTION_MASK_ISA_XOP },
2423     { "-mlwp",          OPTION_MASK_ISA_LWP },
2424     { "-msse4a",        OPTION_MASK_ISA_SSE4A },
2425     { "-msse4.2",       OPTION_MASK_ISA_SSE4_2 },
2426     { "-msse4.1",       OPTION_MASK_ISA_SSE4_1 },
2427     { "-mssse3",        OPTION_MASK_ISA_SSSE3 },
2428     { "-msse3",         OPTION_MASK_ISA_SSE3 },
2429     { "-msse2",         OPTION_MASK_ISA_SSE2 },
2430     { "-msse",          OPTION_MASK_ISA_SSE },
2431     { "-m3dnow",        OPTION_MASK_ISA_3DNOW },
2432     { "-m3dnowa",       OPTION_MASK_ISA_3DNOW_A },
2433     { "-mmmx",          OPTION_MASK_ISA_MMX },
2434     { "-mabm",          OPTION_MASK_ISA_ABM },
2435     { "-mpopcnt",       OPTION_MASK_ISA_POPCNT },
2436     { "-mmovbe",        OPTION_MASK_ISA_MOVBE },
2437     { "-mcrc32",        OPTION_MASK_ISA_CRC32 },
2438     { "-maes",          OPTION_MASK_ISA_AES },
2439     { "-mpclmul",       OPTION_MASK_ISA_PCLMUL },
2440   };
2441
2442   /* Flag options.  */
2443   static struct ix86_target_opts flag_opts[] =
2444   {
2445     { "-m128bit-long-double",           MASK_128BIT_LONG_DOUBLE },
2446     { "-m80387",                        MASK_80387 },
2447     { "-maccumulate-outgoing-args",     MASK_ACCUMULATE_OUTGOING_ARGS },
2448     { "-malign-double",                 MASK_ALIGN_DOUBLE },
2449     { "-mcld",                          MASK_CLD },
2450     { "-mfp-ret-in-387",                MASK_FLOAT_RETURNS },
2451     { "-mieee-fp",                      MASK_IEEE_FP },
2452     { "-minline-all-stringops",         MASK_INLINE_ALL_STRINGOPS },
2453     { "-minline-stringops-dynamically", MASK_INLINE_STRINGOPS_DYNAMICALLY },
2454     { "-mms-bitfields",                 MASK_MS_BITFIELD_LAYOUT },
2455     { "-mno-align-stringops",           MASK_NO_ALIGN_STRINGOPS },
2456     { "-mno-fancy-math-387",            MASK_NO_FANCY_MATH_387 },
2457     { "-mno-push-args",                 MASK_NO_PUSH_ARGS },
2458     { "-mno-red-zone",                  MASK_NO_RED_ZONE },
2459     { "-momit-leaf-frame-pointer",      MASK_OMIT_LEAF_FRAME_POINTER },
2460     { "-mrecip",                        MASK_RECIP },
2461     { "-mrtd",                          MASK_RTD },
2462     { "-msseregparm",                   MASK_SSEREGPARM },
2463     { "-mstack-arg-probe",              MASK_STACK_PROBE },
2464     { "-mtls-direct-seg-refs",          MASK_TLS_DIRECT_SEG_REFS },
2465   };
2466
2467   const char *opts[ARRAY_SIZE (isa_opts) + ARRAY_SIZE (flag_opts) + 6][2];
2468
2469   char isa_other[40];
2470   char target_other[40];
2471   unsigned num = 0;
2472   unsigned i, j;
2473   char *ret;
2474   char *ptr;
2475   size_t len;
2476   size_t line_len;
2477   size_t sep_len;
2478
2479   memset (opts, '\0', sizeof (opts));
2480
2481   /* Add -march= option.  */
2482   if (arch)
2483     {
2484       opts[num][0] = "-march=";
2485       opts[num++][1] = arch;
2486     }
2487
2488   /* Add -mtune= option.  */
2489   if (tune)
2490     {
2491       opts[num][0] = "-mtune=";
2492       opts[num++][1] = tune;
2493     }
2494
2495   /* Pick out the options in isa options.  */
2496   for (i = 0; i < ARRAY_SIZE (isa_opts); i++)
2497     {
2498       if ((isa & isa_opts[i].mask) != 0)
2499         {
2500           opts[num++][0] = isa_opts[i].option;
2501           isa &= ~ isa_opts[i].mask;
2502         }
2503     }
2504
2505   if (isa && add_nl_p)
2506     {
2507       opts[num++][0] = isa_other;
2508       sprintf (isa_other, "(other isa: 0x%x)", isa);
2509     }
2510
2511   /* Add flag options.  */
2512   for (i = 0; i < ARRAY_SIZE (flag_opts); i++)
2513     {
2514       if ((flags & flag_opts[i].mask) != 0)
2515         {
2516           opts[num++][0] = flag_opts[i].option;
2517           flags &= ~ flag_opts[i].mask;
2518         }
2519     }
2520
2521   if (flags && add_nl_p)
2522     {
2523       opts[num++][0] = target_other;
2524       sprintf (target_other, "(other flags: 0x%x)", isa);
2525     }
2526
2527   /* Add -fpmath= option.  */
2528   if (fpmath)
2529     {
2530       opts[num][0] = "-mfpmath=";
2531       opts[num++][1] = fpmath;
2532     }
2533
2534   /* Any options?  */
2535   if (num == 0)
2536     return NULL;
2537
2538   gcc_assert (num < ARRAY_SIZE (opts));
2539
2540   /* Size the string.  */
2541   len = 0;
2542   sep_len = (add_nl_p) ? 3 : 1;
2543   for (i = 0; i < num; i++)
2544     {
2545       len += sep_len;
2546       for (j = 0; j < 2; j++)
2547         if (opts[i][j])
2548           len += strlen (opts[i][j]);
2549     }
2550
2551   /* Build the string.  */
2552   ret = ptr = (char *) xmalloc (len);
2553   line_len = 0;
2554
2555   for (i = 0; i < num; i++)
2556     {
2557       size_t len2[2];
2558
2559       for (j = 0; j < 2; j++)
2560         len2[j] = (opts[i][j]) ? strlen (opts[i][j]) : 0;
2561
2562       if (i != 0)
2563         {
2564           *ptr++ = ' ';
2565           line_len++;
2566
2567           if (add_nl_p && line_len + len2[0] + len2[1] > 70)
2568             {
2569               *ptr++ = '\\';
2570               *ptr++ = '\n';
2571               line_len = 0;
2572             }
2573         }
2574
2575       for (j = 0; j < 2; j++)
2576         if (opts[i][j])
2577           {
2578             memcpy (ptr, opts[i][j], len2[j]);
2579             ptr += len2[j];
2580             line_len += len2[j];
2581           }
2582     }
2583
2584   *ptr = '\0';
2585   gcc_assert (ret + len >= ptr);
2586
2587   return ret;
2588 }
2589
2590 /* Function that is callable from the debugger to print the current
2591    options.  */
2592 void
2593 ix86_debug_options (void)
2594 {
2595   char *opts = ix86_target_string (ix86_isa_flags, target_flags,
2596                                    ix86_arch_string, ix86_tune_string,
2597                                    ix86_fpmath_string, true);
2598
2599   if (opts)
2600     {
2601       fprintf (stderr, "%s\n\n", opts);
2602       free (opts);
2603     }
2604   else
2605     fputs ("<no options>\n\n", stderr);
2606
2607   return;
2608 }
2609 \f
2610 /* Sometimes certain combinations of command options do not make
2611    sense on a particular target machine.  You can define a macro
2612    `OVERRIDE_OPTIONS' to take account of this.  This macro, if
2613    defined, is executed once just after all the command options have
2614    been parsed.
2615
2616    Don't use this macro to turn on various extra optimizations for
2617    `-O'.  That is what `OPTIMIZATION_OPTIONS' is for.  */
2618
2619 void
2620 override_options (bool main_args_p)
2621 {
2622   int i;
2623   unsigned int ix86_arch_mask, ix86_tune_mask;
2624   const char *prefix;
2625   const char *suffix;
2626   const char *sw;
2627
2628   /* Comes from final.c -- no real reason to change it.  */
2629 #define MAX_CODE_ALIGN 16
2630
2631   enum pta_flags
2632     {
2633       PTA_SSE = 1 << 0,
2634       PTA_SSE2 = 1 << 1,
2635       PTA_SSE3 = 1 << 2,
2636       PTA_MMX = 1 << 3,
2637       PTA_PREFETCH_SSE = 1 << 4,
2638       PTA_3DNOW = 1 << 5,
2639       PTA_3DNOW_A = 1 << 6,
2640       PTA_64BIT = 1 << 7,
2641       PTA_SSSE3 = 1 << 8,
2642       PTA_CX16 = 1 << 9,
2643       PTA_POPCNT = 1 << 10,
2644       PTA_ABM = 1 << 11,
2645       PTA_SSE4A = 1 << 12,
2646       PTA_NO_SAHF = 1 << 13,
2647       PTA_SSE4_1 = 1 << 14,
2648       PTA_SSE4_2 = 1 << 15,
2649       PTA_AES = 1 << 16,
2650       PTA_PCLMUL = 1 << 17,
2651       PTA_AVX = 1 << 18,
2652       PTA_FMA = 1 << 19,
2653       PTA_MOVBE = 1 << 20,
2654       PTA_FMA4 = 1 << 21,
2655       PTA_XOP = 1 << 22,
2656       PTA_LWP = 1 << 23
2657     };
2658
2659   static struct pta
2660     {
2661       const char *const name;           /* processor name or nickname.  */
2662       const enum processor_type processor;
2663       const enum attr_cpu schedule;
2664       const unsigned /*enum pta_flags*/ flags;
2665     }
2666   const processor_alias_table[] =
2667     {
2668       {"i386", PROCESSOR_I386, CPU_NONE, 0},
2669       {"i486", PROCESSOR_I486, CPU_NONE, 0},
2670       {"i586", PROCESSOR_PENTIUM, CPU_PENTIUM, 0},
2671       {"pentium", PROCESSOR_PENTIUM, CPU_PENTIUM, 0},
2672       {"pentium-mmx", PROCESSOR_PENTIUM, CPU_PENTIUM, PTA_MMX},
2673       {"winchip-c6", PROCESSOR_I486, CPU_NONE, PTA_MMX},
2674       {"winchip2", PROCESSOR_I486, CPU_NONE, PTA_MMX | PTA_3DNOW},
2675       {"c3", PROCESSOR_I486, CPU_NONE, PTA_MMX | PTA_3DNOW},
2676       {"c3-2", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO, PTA_MMX | PTA_SSE},
2677       {"i686", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO, 0},
2678       {"pentiumpro", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO, 0},
2679       {"pentium2", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO, PTA_MMX},
2680       {"pentium3", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO,
2681         PTA_MMX | PTA_SSE},
2682       {"pentium3m", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO,
2683         PTA_MMX | PTA_SSE},
2684       {"pentium-m", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO,
2685         PTA_MMX | PTA_SSE | PTA_SSE2},
2686       {"pentium4", PROCESSOR_PENTIUM4, CPU_NONE,
2687         PTA_MMX |PTA_SSE | PTA_SSE2},
2688       {"pentium4m", PROCESSOR_PENTIUM4, CPU_NONE,
2689         PTA_MMX | PTA_SSE | PTA_SSE2},
2690       {"prescott", PROCESSOR_NOCONA, CPU_NONE,
2691         PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3},
2692       {"nocona", PROCESSOR_NOCONA, CPU_NONE,
2693         PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
2694         | PTA_CX16 | PTA_NO_SAHF},
2695       {"core2", PROCESSOR_CORE2, CPU_CORE2,
2696         PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
2697         | PTA_SSSE3 | PTA_CX16},
2698       {"atom", PROCESSOR_ATOM, CPU_ATOM,
2699         PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
2700         | PTA_SSSE3 | PTA_CX16 | PTA_MOVBE},
2701       {"geode", PROCESSOR_GEODE, CPU_GEODE,
2702         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A |PTA_PREFETCH_SSE},
2703       {"k6", PROCESSOR_K6, CPU_K6, PTA_MMX},
2704       {"k6-2", PROCESSOR_K6, CPU_K6, PTA_MMX | PTA_3DNOW},
2705       {"k6-3", PROCESSOR_K6, CPU_K6, PTA_MMX | PTA_3DNOW},
2706       {"athlon", PROCESSOR_ATHLON, CPU_ATHLON,
2707         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_PREFETCH_SSE},
2708       {"athlon-tbird", PROCESSOR_ATHLON, CPU_ATHLON,
2709         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_PREFETCH_SSE},
2710       {"athlon-4", PROCESSOR_ATHLON, CPU_ATHLON,
2711         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE},
2712       {"athlon-xp", PROCESSOR_ATHLON, CPU_ATHLON,
2713         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE},
2714       {"athlon-mp", PROCESSOR_ATHLON, CPU_ATHLON,
2715         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE},
2716       {"x86-64", PROCESSOR_K8, CPU_K8,
2717         PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_NO_SAHF},
2718       {"k8", PROCESSOR_K8, CPU_K8,
2719         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2720         | PTA_SSE2 | PTA_NO_SAHF},
2721       {"k8-sse3", PROCESSOR_K8, CPU_K8,
2722         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2723         | PTA_SSE2 | PTA_SSE3 | PTA_NO_SAHF},
2724       {"opteron", PROCESSOR_K8, CPU_K8,
2725         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2726         | PTA_SSE2 | PTA_NO_SAHF},
2727       {"opteron-sse3", PROCESSOR_K8, CPU_K8,
2728         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2729         | PTA_SSE2 | PTA_SSE3 | PTA_NO_SAHF},
2730       {"athlon64", PROCESSOR_K8, CPU_K8,
2731         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2732         | PTA_SSE2 | PTA_NO_SAHF},
2733       {"athlon64-sse3", PROCESSOR_K8, CPU_K8,
2734         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2735         | PTA_SSE2 | PTA_SSE3 | PTA_NO_SAHF},
2736       {"athlon-fx", PROCESSOR_K8, CPU_K8,
2737         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2738         | PTA_SSE2 | PTA_NO_SAHF},
2739       {"amdfam10", PROCESSOR_AMDFAM10, CPU_AMDFAM10,
2740         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2741         | PTA_SSE2 | PTA_SSE3 | PTA_SSE4A | PTA_CX16 | PTA_ABM},
2742       {"barcelona", PROCESSOR_AMDFAM10, CPU_AMDFAM10,
2743         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2744         | PTA_SSE2 | PTA_SSE3 | PTA_SSE4A | PTA_CX16 | PTA_ABM},
2745       {"generic32", PROCESSOR_GENERIC32, CPU_PENTIUMPRO,
2746         0 /* flags are only used for -march switch.  */ },
2747       {"generic64", PROCESSOR_GENERIC64, CPU_GENERIC64,
2748         PTA_64BIT /* flags are only used for -march switch.  */ },
2749     };
2750
2751   int const pta_size = ARRAY_SIZE (processor_alias_table);
2752
2753   /* Set up prefix/suffix so the error messages refer to either the command
2754      line argument, or the attribute(target).  */
2755   if (main_args_p)
2756     {
2757       prefix = "-m";
2758       suffix = "";
2759       sw = "switch";
2760     }
2761   else
2762     {
2763       prefix = "option(\"";
2764       suffix = "\")";
2765       sw = "attribute";
2766     }
2767
2768 #ifdef SUBTARGET_OVERRIDE_OPTIONS
2769   SUBTARGET_OVERRIDE_OPTIONS;
2770 #endif
2771
2772 #ifdef SUBSUBTARGET_OVERRIDE_OPTIONS
2773   SUBSUBTARGET_OVERRIDE_OPTIONS;
2774 #endif
2775
2776   /* -fPIC is the default for x86_64.  */
2777   if (TARGET_MACHO && TARGET_64BIT)
2778     flag_pic = 2;
2779
2780   /* Set the default values for switches whose default depends on TARGET_64BIT
2781      in case they weren't overwritten by command line options.  */
2782   if (TARGET_64BIT)
2783     {
2784       /* Mach-O doesn't support omitting the frame pointer for now.  */
2785       if (flag_omit_frame_pointer == 2)
2786         flag_omit_frame_pointer = (TARGET_MACHO ? 0 : 1);
2787       if (flag_asynchronous_unwind_tables == 2)
2788         flag_asynchronous_unwind_tables = 1;
2789       if (flag_pcc_struct_return == 2)
2790         flag_pcc_struct_return = 0;
2791     }
2792   else
2793     {
2794       if (flag_omit_frame_pointer == 2)
2795         flag_omit_frame_pointer = 0;
2796       if (flag_asynchronous_unwind_tables == 2)
2797         flag_asynchronous_unwind_tables = 0;
2798       if (flag_pcc_struct_return == 2)
2799         flag_pcc_struct_return = DEFAULT_PCC_STRUCT_RETURN;
2800     }
2801
2802   /* Need to check -mtune=generic first.  */
2803   if (ix86_tune_string)
2804     {
2805       if (!strcmp (ix86_tune_string, "generic")
2806           || !strcmp (ix86_tune_string, "i686")
2807           /* As special support for cross compilers we read -mtune=native
2808              as -mtune=generic.  With native compilers we won't see the
2809              -mtune=native, as it was changed by the driver.  */
2810           || !strcmp (ix86_tune_string, "native"))
2811         {
2812           if (TARGET_64BIT)
2813             ix86_tune_string = "generic64";
2814           else
2815             ix86_tune_string = "generic32";
2816         }
2817       /* If this call is for setting the option attribute, allow the
2818          generic32/generic64 that was previously set.  */
2819       else if (!main_args_p
2820                && (!strcmp (ix86_tune_string, "generic32")
2821                    || !strcmp (ix86_tune_string, "generic64")))
2822         ;
2823       else if (!strncmp (ix86_tune_string, "generic", 7))
2824         error ("bad value (%s) for %stune=%s %s",
2825                ix86_tune_string, prefix, suffix, sw);
2826     }
2827   else
2828     {
2829       if (ix86_arch_string)
2830         ix86_tune_string = ix86_arch_string;
2831       if (!ix86_tune_string)
2832         {
2833           ix86_tune_string = cpu_names[TARGET_CPU_DEFAULT];
2834           ix86_tune_defaulted = 1;
2835         }
2836
2837       /* ix86_tune_string is set to ix86_arch_string or defaulted.  We
2838          need to use a sensible tune option.  */
2839       if (!strcmp (ix86_tune_string, "generic")
2840           || !strcmp (ix86_tune_string, "x86-64")
2841           || !strcmp (ix86_tune_string, "i686"))
2842         {
2843           if (TARGET_64BIT)
2844             ix86_tune_string = "generic64";
2845           else
2846             ix86_tune_string = "generic32";
2847         }
2848     }
2849   if (ix86_stringop_string)
2850     {
2851       if (!strcmp (ix86_stringop_string, "rep_byte"))
2852         stringop_alg = rep_prefix_1_byte;
2853       else if (!strcmp (ix86_stringop_string, "libcall"))
2854         stringop_alg = libcall;
2855       else if (!strcmp (ix86_stringop_string, "rep_4byte"))
2856         stringop_alg = rep_prefix_4_byte;
2857       else if (!strcmp (ix86_stringop_string, "rep_8byte")
2858                && TARGET_64BIT)
2859         /* rep; movq isn't available in 32-bit code.  */
2860         stringop_alg = rep_prefix_8_byte;
2861       else if (!strcmp (ix86_stringop_string, "byte_loop"))
2862         stringop_alg = loop_1_byte;
2863       else if (!strcmp (ix86_stringop_string, "loop"))
2864         stringop_alg = loop;
2865       else if (!strcmp (ix86_stringop_string, "unrolled_loop"))
2866         stringop_alg = unrolled_loop;
2867       else
2868         error ("bad value (%s) for %sstringop-strategy=%s %s",
2869                ix86_stringop_string, prefix, suffix, sw);
2870     }
2871   if (!strcmp (ix86_tune_string, "x86-64"))
2872     warning (OPT_Wdeprecated, "%stune=x86-64%s is deprecated.  Use "
2873              "%stune=k8%s or %stune=generic%s instead as appropriate.",
2874              prefix, suffix, prefix, suffix, prefix, suffix);
2875
2876   if (!ix86_arch_string)
2877     ix86_arch_string = TARGET_64BIT ? "x86-64" : "i386";
2878   else
2879     ix86_arch_specified = 1;
2880
2881   if (!strcmp (ix86_arch_string, "generic"))
2882     error ("generic CPU can be used only for %stune=%s %s",
2883            prefix, suffix, sw);
2884   if (!strncmp (ix86_arch_string, "generic", 7))
2885     error ("bad value (%s) for %sarch=%s %s",
2886            ix86_arch_string, prefix, suffix, sw);
2887
2888   /* Validate -mabi= value.  */
2889   if (ix86_abi_string)
2890     {
2891       if (strcmp (ix86_abi_string, "sysv") == 0)
2892         ix86_abi = SYSV_ABI;
2893       else if (strcmp (ix86_abi_string, "ms") == 0)
2894         ix86_abi = MS_ABI;
2895       else
2896         error ("unknown ABI (%s) for %sabi=%s %s",
2897                ix86_abi_string, prefix, suffix, sw);
2898     }
2899   else
2900     ix86_abi = DEFAULT_ABI;
2901
2902   if (ix86_cmodel_string != 0)
2903     {
2904       if (!strcmp (ix86_cmodel_string, "small"))
2905         ix86_cmodel = flag_pic ? CM_SMALL_PIC : CM_SMALL;
2906       else if (!strcmp (ix86_cmodel_string, "medium"))
2907         ix86_cmodel = flag_pic ? CM_MEDIUM_PIC : CM_MEDIUM;
2908       else if (!strcmp (ix86_cmodel_string, "large"))
2909         ix86_cmodel = flag_pic ? CM_LARGE_PIC : CM_LARGE;
2910       else if (flag_pic)
2911         error ("code model %s does not support PIC mode", ix86_cmodel_string);
2912       else if (!strcmp (ix86_cmodel_string, "32"))
2913         ix86_cmodel = CM_32;
2914       else if (!strcmp (ix86_cmodel_string, "kernel") && !flag_pic)
2915         ix86_cmodel = CM_KERNEL;
2916       else
2917         error ("bad value (%s) for %scmodel=%s %s",
2918                ix86_cmodel_string, prefix, suffix, sw);
2919     }
2920   else
2921     {
2922       /* For TARGET_64BIT and MS_ABI, force pic on, in order to enable the
2923          use of rip-relative addressing.  This eliminates fixups that
2924          would otherwise be needed if this object is to be placed in a
2925          DLL, and is essentially just as efficient as direct addressing.  */
2926       if (TARGET_64BIT && DEFAULT_ABI == MS_ABI)
2927         ix86_cmodel = CM_SMALL_PIC, flag_pic = 1;
2928       else if (TARGET_64BIT)
2929         ix86_cmodel = flag_pic ? CM_SMALL_PIC : CM_SMALL;
2930       else
2931         ix86_cmodel = CM_32;
2932     }
2933   if (ix86_asm_string != 0)
2934     {
2935       if (! TARGET_MACHO
2936           && !strcmp (ix86_asm_string, "intel"))
2937         ix86_asm_dialect = ASM_INTEL;
2938       else if (!strcmp (ix86_asm_string, "att"))
2939         ix86_asm_dialect = ASM_ATT;
2940       else
2941         error ("bad value (%s) for %sasm=%s %s",
2942                ix86_asm_string, prefix, suffix, sw);
2943     }
2944   if ((TARGET_64BIT == 0) != (ix86_cmodel == CM_32))
2945     error ("code model %qs not supported in the %s bit mode",
2946            ix86_cmodel_string, TARGET_64BIT ? "64" : "32");
2947   if ((TARGET_64BIT != 0) != ((ix86_isa_flags & OPTION_MASK_ISA_64BIT) != 0))
2948     sorry ("%i-bit mode not compiled in",
2949            (ix86_isa_flags & OPTION_MASK_ISA_64BIT) ? 64 : 32);
2950
2951   for (i = 0; i < pta_size; i++)
2952     if (! strcmp (ix86_arch_string, processor_alias_table[i].name))
2953       {
2954         ix86_schedule = processor_alias_table[i].schedule;
2955         ix86_arch = processor_alias_table[i].processor;
2956         /* Default cpu tuning to the architecture.  */
2957         ix86_tune = ix86_arch;
2958
2959         if (TARGET_64BIT && !(processor_alias_table[i].flags & PTA_64BIT))
2960           error ("CPU you selected does not support x86-64 "
2961                  "instruction set");
2962
2963         if (processor_alias_table[i].flags & PTA_MMX
2964             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_MMX))
2965           ix86_isa_flags |= OPTION_MASK_ISA_MMX;
2966         if (processor_alias_table[i].flags & PTA_3DNOW
2967             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_3DNOW))
2968           ix86_isa_flags |= OPTION_MASK_ISA_3DNOW;
2969         if (processor_alias_table[i].flags & PTA_3DNOW_A
2970             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_3DNOW_A))
2971           ix86_isa_flags |= OPTION_MASK_ISA_3DNOW_A;
2972         if (processor_alias_table[i].flags & PTA_SSE
2973             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE))
2974           ix86_isa_flags |= OPTION_MASK_ISA_SSE;
2975         if (processor_alias_table[i].flags & PTA_SSE2
2976             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE2))
2977           ix86_isa_flags |= OPTION_MASK_ISA_SSE2;
2978         if (processor_alias_table[i].flags & PTA_SSE3
2979             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE3))
2980           ix86_isa_flags |= OPTION_MASK_ISA_SSE3;
2981         if (processor_alias_table[i].flags & PTA_SSSE3
2982             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSSE3))
2983           ix86_isa_flags |= OPTION_MASK_ISA_SSSE3;
2984         if (processor_alias_table[i].flags & PTA_SSE4_1
2985             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE4_1))
2986           ix86_isa_flags |= OPTION_MASK_ISA_SSE4_1;
2987         if (processor_alias_table[i].flags & PTA_SSE4_2
2988             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE4_2))
2989           ix86_isa_flags |= OPTION_MASK_ISA_SSE4_2;
2990         if (processor_alias_table[i].flags & PTA_AVX
2991             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_AVX))
2992           ix86_isa_flags |= OPTION_MASK_ISA_AVX;
2993         if (processor_alias_table[i].flags & PTA_FMA
2994             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_FMA))
2995           ix86_isa_flags |= OPTION_MASK_ISA_FMA;
2996         if (processor_alias_table[i].flags & PTA_SSE4A
2997             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE4A))
2998           ix86_isa_flags |= OPTION_MASK_ISA_SSE4A;
2999         if (processor_alias_table[i].flags & PTA_FMA4
3000             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_FMA4))
3001           ix86_isa_flags |= OPTION_MASK_ISA_FMA4;
3002         if (processor_alias_table[i].flags & PTA_XOP
3003             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_XOP))
3004           ix86_isa_flags |= OPTION_MASK_ISA_XOP;
3005         if (processor_alias_table[i].flags & PTA_LWP
3006             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_LWP))
3007           ix86_isa_flags |= OPTION_MASK_ISA_LWP;
3008         if (processor_alias_table[i].flags & PTA_ABM
3009             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_ABM))
3010           ix86_isa_flags |= OPTION_MASK_ISA_ABM;
3011         if (processor_alias_table[i].flags & PTA_CX16
3012             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_CX16))
3013           ix86_isa_flags |= OPTION_MASK_ISA_CX16;
3014         if (processor_alias_table[i].flags & (PTA_POPCNT | PTA_ABM)
3015             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_POPCNT))
3016           ix86_isa_flags |= OPTION_MASK_ISA_POPCNT;
3017         if (!(TARGET_64BIT && (processor_alias_table[i].flags & PTA_NO_SAHF))
3018             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SAHF))
3019           ix86_isa_flags |= OPTION_MASK_ISA_SAHF;
3020         if (processor_alias_table[i].flags & PTA_MOVBE
3021             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_MOVBE))
3022           ix86_isa_flags |= OPTION_MASK_ISA_MOVBE;
3023         if (processor_alias_table[i].flags & PTA_AES
3024             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_AES))
3025           ix86_isa_flags |= OPTION_MASK_ISA_AES;
3026         if (processor_alias_table[i].flags & PTA_PCLMUL
3027             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_PCLMUL))
3028           ix86_isa_flags |= OPTION_MASK_ISA_PCLMUL;
3029         if (processor_alias_table[i].flags & (PTA_PREFETCH_SSE | PTA_SSE))
3030           x86_prefetch_sse = true;
3031
3032         break;
3033       }
3034
3035   if (i == pta_size)
3036     error ("bad value (%s) for %sarch=%s %s",
3037            ix86_arch_string, prefix, suffix, sw);
3038
3039   ix86_arch_mask = 1u << ix86_arch;
3040   for (i = 0; i < X86_ARCH_LAST; ++i)
3041     ix86_arch_features[i] = !!(initial_ix86_arch_features[i] & ix86_arch_mask);
3042
3043   for (i = 0; i < pta_size; i++)
3044     if (! strcmp (ix86_tune_string, processor_alias_table[i].name))
3045       {
3046         ix86_schedule = processor_alias_table[i].schedule;
3047         ix86_tune = processor_alias_table[i].processor;
3048         if (TARGET_64BIT && !(processor_alias_table[i].flags & PTA_64BIT))
3049           {
3050             if (ix86_tune_defaulted)
3051               {
3052                 ix86_tune_string = "x86-64";
3053                 for (i = 0; i < pta_size; i++)
3054                   if (! strcmp (ix86_tune_string,
3055                                 processor_alias_table[i].name))
3056                     break;
3057                 ix86_schedule = processor_alias_table[i].schedule;
3058                 ix86_tune = processor_alias_table[i].processor;
3059               }
3060             else
3061               error ("CPU you selected does not support x86-64 "
3062                      "instruction set");
3063           }
3064         /* Intel CPUs have always interpreted SSE prefetch instructions as
3065            NOPs; so, we can enable SSE prefetch instructions even when
3066            -mtune (rather than -march) points us to a processor that has them.
3067            However, the VIA C3 gives a SIGILL, so we only do that for i686 and
3068            higher processors.  */
3069         if (TARGET_CMOVE
3070             && (processor_alias_table[i].flags & (PTA_PREFETCH_SSE | PTA_SSE)))
3071           x86_prefetch_sse = true;
3072         break;
3073       }
3074   if (i == pta_size)
3075     error ("bad value (%s) for %stune=%s %s",
3076            ix86_tune_string, prefix, suffix, sw);
3077
3078   ix86_tune_mask = 1u << ix86_tune;
3079   for (i = 0; i < X86_TUNE_LAST; ++i)
3080     ix86_tune_features[i] = !!(initial_ix86_tune_features[i] & ix86_tune_mask);
3081
3082   if (optimize_size)
3083     ix86_cost = &ix86_size_cost;
3084   else
3085     ix86_cost = processor_target_table[ix86_tune].cost;
3086
3087   /* Arrange to set up i386_stack_locals for all functions.  */
3088   init_machine_status = ix86_init_machine_status;
3089
3090   /* Validate -mregparm= value.  */
3091   if (ix86_regparm_string)
3092     {
3093       if (TARGET_64BIT)
3094         warning (0, "%sregparm%s is ignored in 64-bit mode", prefix, suffix);
3095       i = atoi (ix86_regparm_string);
3096       if (i < 0 || i > REGPARM_MAX)
3097         error ("%sregparm=%d%s is not between 0 and %d",
3098                prefix, i, suffix, REGPARM_MAX);
3099       else
3100         ix86_regparm = i;
3101     }
3102   if (TARGET_64BIT)
3103     ix86_regparm = REGPARM_MAX;
3104
3105   /* If the user has provided any of the -malign-* options,
3106      warn and use that value only if -falign-* is not set.
3107      Remove this code in GCC 3.2 or later.  */
3108   if (ix86_align_loops_string)
3109     {
3110       warning (0, "%salign-loops%s is obsolete, use -falign-loops%s",
3111                prefix, suffix, suffix);
3112       if (align_loops == 0)
3113         {
3114           i = atoi (ix86_align_loops_string);
3115           if (i < 0 || i > MAX_CODE_ALIGN)
3116             error ("%salign-loops=%d%s is not between 0 and %d",
3117                    prefix, i, suffix, MAX_CODE_ALIGN);
3118           else
3119             align_loops = 1 << i;
3120         }
3121     }
3122
3123   if (ix86_align_jumps_string)
3124     {
3125       warning (0, "%salign-jumps%s is obsolete, use -falign-jumps%s",
3126                prefix, suffix, suffix);
3127       if (align_jumps == 0)
3128         {
3129           i = atoi (ix86_align_jumps_string);
3130           if (i < 0 || i > MAX_CODE_ALIGN)
3131             error ("%salign-loops=%d%s is not between 0 and %d",
3132                    prefix, i, suffix, MAX_CODE_ALIGN);
3133           else
3134             align_jumps = 1 << i;
3135         }
3136     }
3137
3138   if (ix86_align_funcs_string)
3139     {
3140       warning (0, "%salign-functions%s is obsolete, use -falign-functions%s",
3141                prefix, suffix, suffix);
3142       if (align_functions == 0)
3143         {
3144           i = atoi (ix86_align_funcs_string);
3145           if (i < 0 || i > MAX_CODE_ALIGN)
3146             error ("%salign-loops=%d%s is not between 0 and %d",
3147                    prefix, i, suffix, MAX_CODE_ALIGN);
3148           else
3149             align_functions = 1 << i;
3150         }
3151     }
3152
3153   /* Default align_* from the processor table.  */
3154   if (align_loops == 0)
3155     {
3156       align_loops = processor_target_table[ix86_tune].align_loop;
3157       align_loops_max_skip = processor_target_table[ix86_tune].align_loop_max_skip;
3158     }
3159   if (align_jumps == 0)
3160     {
3161       align_jumps = processor_target_table[ix86_tune].align_jump;
3162       align_jumps_max_skip = processor_target_table[ix86_tune].align_jump_max_skip;
3163     }
3164   if (align_functions == 0)
3165     {
3166       align_functions = processor_target_table[ix86_tune].align_func;
3167     }
3168
3169   /* Validate -mbranch-cost= value, or provide default.  */
3170   ix86_branch_cost = ix86_cost->branch_cost;
3171   if (ix86_branch_cost_string)
3172     {
3173       i = atoi (ix86_branch_cost_string);
3174       if (i < 0 || i > 5)
3175         error ("%sbranch-cost=%d%s is not between 0 and 5", prefix, i, suffix);
3176       else
3177         ix86_branch_cost = i;
3178     }
3179   if (ix86_section_threshold_string)
3180     {
3181       i = atoi (ix86_section_threshold_string);
3182       if (i < 0)
3183         error ("%slarge-data-threshold=%d%s is negative", prefix, i, suffix);
3184       else
3185         ix86_section_threshold = i;
3186     }
3187
3188   if (ix86_tls_dialect_string)
3189     {
3190       if (strcmp (ix86_tls_dialect_string, "gnu") == 0)
3191         ix86_tls_dialect = TLS_DIALECT_GNU;
3192       else if (strcmp (ix86_tls_dialect_string, "gnu2") == 0)
3193         ix86_tls_dialect = TLS_DIALECT_GNU2;
3194       else if (strcmp (ix86_tls_dialect_string, "sun") == 0)
3195         ix86_tls_dialect = TLS_DIALECT_SUN;
3196       else
3197         error ("bad value (%s) for %stls-dialect=%s %s",
3198                ix86_tls_dialect_string, prefix, suffix, sw);
3199     }
3200
3201   if (ix87_precision_string)
3202     {
3203       i = atoi (ix87_precision_string);
3204       if (i != 32 && i != 64 && i != 80)
3205         error ("pc%d is not valid precision setting (32, 64 or 80)", i);
3206     }
3207
3208   if (TARGET_64BIT)
3209     {
3210       target_flags |= TARGET_SUBTARGET64_DEFAULT & ~target_flags_explicit;
3211
3212       /* Enable by default the SSE and MMX builtins.  Do allow the user to
3213          explicitly disable any of these.  In particular, disabling SSE and
3214          MMX for kernel code is extremely useful.  */
3215       if (!ix86_arch_specified)
3216       ix86_isa_flags
3217         |= ((OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_MMX
3218              | TARGET_SUBTARGET64_ISA_DEFAULT) & ~ix86_isa_flags_explicit);
3219
3220       if (TARGET_RTD)
3221         warning (0, "%srtd%s is ignored in 64bit mode", prefix, suffix);
3222     }
3223   else
3224     {
3225       target_flags |= TARGET_SUBTARGET32_DEFAULT & ~target_flags_explicit;
3226
3227       if (!ix86_arch_specified)
3228       ix86_isa_flags
3229         |= TARGET_SUBTARGET32_ISA_DEFAULT & ~ix86_isa_flags_explicit;
3230
3231       /* i386 ABI does not specify red zone.  It still makes sense to use it
3232          when programmer takes care to stack from being destroyed.  */
3233       if (!(target_flags_explicit & MASK_NO_RED_ZONE))
3234         target_flags |= MASK_NO_RED_ZONE;
3235     }
3236
3237   /* Keep nonleaf frame pointers.  */
3238   if (flag_omit_frame_pointer)
3239     target_flags &= ~MASK_OMIT_LEAF_FRAME_POINTER;
3240   else if (TARGET_OMIT_LEAF_FRAME_POINTER)
3241     flag_omit_frame_pointer = 1;
3242
3243   /* If we're doing fast math, we don't care about comparison order
3244      wrt NaNs.  This lets us use a shorter comparison sequence.  */
3245   if (flag_finite_math_only)
3246     target_flags &= ~MASK_IEEE_FP;
3247
3248   /* If the architecture always has an FPU, turn off NO_FANCY_MATH_387,
3249      since the insns won't need emulation.  */
3250   if (x86_arch_always_fancy_math_387 & ix86_arch_mask)
3251     target_flags &= ~MASK_NO_FANCY_MATH_387;
3252
3253   /* Likewise, if the target doesn't have a 387, or we've specified
3254      software floating point, don't use 387 inline intrinsics.  */
3255   if (!TARGET_80387)
3256     target_flags |= MASK_NO_FANCY_MATH_387;
3257
3258   /* Turn on MMX builtins for -msse.  */
3259   if (TARGET_SSE)
3260     {
3261       ix86_isa_flags |= OPTION_MASK_ISA_MMX & ~ix86_isa_flags_explicit;
3262       x86_prefetch_sse = true;
3263     }
3264
3265   /* Turn on popcnt instruction for -msse4.2 or -mabm.  */
3266   if (TARGET_SSE4_2 || TARGET_ABM)
3267     ix86_isa_flags |= OPTION_MASK_ISA_POPCNT & ~ix86_isa_flags_explicit;
3268
3269   /* Validate -mpreferred-stack-boundary= value or default it to
3270      PREFERRED_STACK_BOUNDARY_DEFAULT.  */
3271   ix86_preferred_stack_boundary = PREFERRED_STACK_BOUNDARY_DEFAULT;
3272   if (ix86_preferred_stack_boundary_string)
3273     {
3274       i = atoi (ix86_preferred_stack_boundary_string);
3275       if (i < (TARGET_64BIT ? 4 : 2) || i > 12)
3276         error ("%spreferred-stack-boundary=%d%s is not between %d and 12",
3277                prefix, i, suffix, TARGET_64BIT ? 4 : 2);
3278       else
3279         ix86_preferred_stack_boundary = (1 << i) * BITS_PER_UNIT;
3280     }
3281
3282   /* Set the default value for -mstackrealign.  */
3283   if (ix86_force_align_arg_pointer == -1)
3284     ix86_force_align_arg_pointer = STACK_REALIGN_DEFAULT;
3285
3286   ix86_default_incoming_stack_boundary = PREFERRED_STACK_BOUNDARY;
3287
3288   /* Validate -mincoming-stack-boundary= value or default it to
3289      MIN_STACK_BOUNDARY/PREFERRED_STACK_BOUNDARY.  */
3290   ix86_incoming_stack_boundary = ix86_default_incoming_stack_boundary;
3291   if (ix86_incoming_stack_boundary_string)
3292     {
3293       i = atoi (ix86_incoming_stack_boundary_string);
3294       if (i < (TARGET_64BIT ? 4 : 2) || i > 12)
3295         error ("-mincoming-stack-boundary=%d is not between %d and 12",
3296                i, TARGET_64BIT ? 4 : 2);
3297       else
3298         {
3299           ix86_user_incoming_stack_boundary = (1 << i) * BITS_PER_UNIT;
3300           ix86_incoming_stack_boundary
3301             = ix86_user_incoming_stack_boundary;
3302         }
3303     }
3304
3305   /* Accept -msseregparm only if at least SSE support is enabled.  */
3306   if (TARGET_SSEREGPARM
3307       && ! TARGET_SSE)
3308     error ("%ssseregparm%s used without SSE enabled", prefix, suffix);
3309
3310   ix86_fpmath = TARGET_FPMATH_DEFAULT;
3311   if (ix86_fpmath_string != 0)
3312     {
3313       if (! strcmp (ix86_fpmath_string, "387"))
3314         ix86_fpmath = FPMATH_387;
3315       else if (! strcmp (ix86_fpmath_string, "sse"))
3316         {
3317           if (!TARGET_SSE)
3318             {
3319               warning (0, "SSE instruction set disabled, using 387 arithmetics");
3320               ix86_fpmath = FPMATH_387;
3321             }
3322           else
3323             ix86_fpmath = FPMATH_SSE;
3324         }
3325       else if (! strcmp (ix86_fpmath_string, "387,sse")
3326                || ! strcmp (ix86_fpmath_string, "387+sse")
3327                || ! strcmp (ix86_fpmath_string, "sse,387")
3328                || ! strcmp (ix86_fpmath_string, "sse+387")
3329                || ! strcmp (ix86_fpmath_string, "both"))
3330         {
3331           if (!TARGET_SSE)
3332             {
3333               warning (0, "SSE instruction set disabled, using 387 arithmetics");
3334               ix86_fpmath = FPMATH_387;
3335             }
3336           else if (!TARGET_80387)
3337             {
3338               warning (0, "387 instruction set disabled, using SSE arithmetics");
3339               ix86_fpmath = FPMATH_SSE;
3340             }
3341           else
3342             ix86_fpmath = (enum fpmath_unit) (FPMATH_SSE | FPMATH_387);
3343         }
3344       else
3345         error ("bad value (%s) for %sfpmath=%s %s",
3346                ix86_fpmath_string, prefix, suffix, sw);
3347     }
3348
3349   /* If the i387 is disabled, then do not return values in it. */
3350   if (!TARGET_80387)
3351     target_flags &= ~MASK_FLOAT_RETURNS;
3352
3353   /* Use external vectorized library in vectorizing intrinsics.  */
3354   if (ix86_veclibabi_string)
3355     {
3356       if (strcmp (ix86_veclibabi_string, "svml") == 0)
3357         ix86_veclib_handler = ix86_veclibabi_svml;
3358       else if (strcmp (ix86_veclibabi_string, "acml") == 0)
3359         ix86_veclib_handler = ix86_veclibabi_acml;
3360       else
3361         error ("unknown vectorization library ABI type (%s) for "
3362                "%sveclibabi=%s %s", ix86_veclibabi_string,
3363                prefix, suffix, sw);
3364     }
3365
3366   if ((x86_accumulate_outgoing_args & ix86_tune_mask)
3367       && !(target_flags_explicit & MASK_ACCUMULATE_OUTGOING_ARGS)
3368       && !optimize_size)
3369     target_flags |= MASK_ACCUMULATE_OUTGOING_ARGS;
3370
3371   /* ??? Unwind info is not correct around the CFG unless either a frame
3372      pointer is present or M_A_O_A is set.  Fixing this requires rewriting
3373      unwind info generation to be aware of the CFG and propagating states
3374      around edges.  */
3375   if ((flag_unwind_tables || flag_asynchronous_unwind_tables
3376        || flag_exceptions || flag_non_call_exceptions)
3377       && flag_omit_frame_pointer
3378       && !(target_flags & MASK_ACCUMULATE_OUTGOING_ARGS))
3379     {
3380       if (target_flags_explicit & MASK_ACCUMULATE_OUTGOING_ARGS)
3381         warning (0, "unwind tables currently require either a frame pointer "
3382                  "or %saccumulate-outgoing-args%s for correctness",
3383                  prefix, suffix);
3384       target_flags |= MASK_ACCUMULATE_OUTGOING_ARGS;
3385     }
3386
3387   /* If stack probes are required, the space used for large function
3388      arguments on the stack must also be probed, so enable
3389      -maccumulate-outgoing-args so this happens in the prologue.  */
3390   if (TARGET_STACK_PROBE
3391       && !(target_flags & MASK_ACCUMULATE_OUTGOING_ARGS))
3392     {
3393       if (target_flags_explicit & MASK_ACCUMULATE_OUTGOING_ARGS)
3394         warning (0, "stack probing requires %saccumulate-outgoing-args%s "
3395                  "for correctness", prefix, suffix);
3396       target_flags |= MASK_ACCUMULATE_OUTGOING_ARGS;
3397     }
3398
3399   /* For sane SSE instruction set generation we need fcomi instruction.
3400      It is safe to enable all CMOVE instructions.  */
3401   if (TARGET_SSE)
3402     TARGET_CMOVE = 1;
3403
3404   /* Figure out what ASM_GENERATE_INTERNAL_LABEL builds as a prefix.  */
3405   {
3406     char *p;
3407     ASM_GENERATE_INTERNAL_LABEL (internal_label_prefix, "LX", 0);
3408     p = strchr (internal_label_prefix, 'X');
3409     internal_label_prefix_len = p - internal_label_prefix;
3410     *p = '\0';
3411   }
3412
3413   /* When scheduling description is not available, disable scheduler pass
3414      so it won't slow down the compilation and make x87 code slower.  */
3415   if (!TARGET_SCHEDULE)
3416     flag_schedule_insns_after_reload = flag_schedule_insns = 0;
3417
3418   if (!PARAM_SET_P (PARAM_SIMULTANEOUS_PREFETCHES))
3419     set_param_value ("simultaneous-prefetches",
3420                      ix86_cost->simultaneous_prefetches);
3421   if (!PARAM_SET_P (PARAM_L1_CACHE_LINE_SIZE))
3422     set_param_value ("l1-cache-line-size", ix86_cost->prefetch_block);
3423   if (!PARAM_SET_P (PARAM_L1_CACHE_SIZE))
3424     set_param_value ("l1-cache-size", ix86_cost->l1_cache_size);
3425   if (!PARAM_SET_P (PARAM_L2_CACHE_SIZE))
3426     set_param_value ("l2-cache-size", ix86_cost->l2_cache_size);
3427
3428   /* If using typedef char *va_list, signal that __builtin_va_start (&ap, 0)
3429      can be optimized to ap = __builtin_next_arg (0).  */
3430   if (!TARGET_64BIT)
3431     targetm.expand_builtin_va_start = NULL;
3432
3433   if (TARGET_64BIT)
3434     {
3435       ix86_gen_leave = gen_leave_rex64;
3436       ix86_gen_pop1 = gen_popdi1;
3437       ix86_gen_add3 = gen_adddi3;
3438       ix86_gen_sub3 = gen_subdi3;
3439       ix86_gen_sub3_carry = gen_subdi3_carry;
3440       ix86_gen_one_cmpl2 = gen_one_cmpldi2;
3441       ix86_gen_monitor = gen_sse3_monitor64;
3442       ix86_gen_andsp = gen_anddi3;
3443     }
3444   else
3445     {
3446       ix86_gen_leave = gen_leave;
3447       ix86_gen_pop1 = gen_popsi1;
3448       ix86_gen_add3 = gen_addsi3;
3449       ix86_gen_sub3 = gen_subsi3;
3450       ix86_gen_sub3_carry = gen_subsi3_carry;
3451       ix86_gen_one_cmpl2 = gen_one_cmplsi2;
3452       ix86_gen_monitor = gen_sse3_monitor;
3453       ix86_gen_andsp = gen_andsi3;
3454     }
3455
3456 #ifdef USE_IX86_CLD
3457   /* Use -mcld by default for 32-bit code if configured with --enable-cld.  */
3458   if (!TARGET_64BIT)
3459     target_flags |= MASK_CLD & ~target_flags_explicit;
3460 #endif
3461
3462   /* Save the initial options in case the user does function specific options */
3463   if (main_args_p)
3464     target_option_default_node = target_option_current_node
3465       = build_target_option_node ();
3466 }
3467
3468 /* Update register usage after having seen the compiler flags.  */
3469
3470 void
3471 ix86_conditional_register_usage (void)
3472 {
3473   int i;
3474   unsigned int j;
3475
3476   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
3477     {
3478       if (fixed_regs[i] > 1)
3479         fixed_regs[i] = (fixed_regs[i] == (TARGET_64BIT ? 3 : 2));
3480       if (call_used_regs[i] > 1)
3481         call_used_regs[i] = (call_used_regs[i] == (TARGET_64BIT ? 3 : 2));
3482     }
3483
3484   /* The PIC register, if it exists, is fixed.  */
3485   j = PIC_OFFSET_TABLE_REGNUM;
3486   if (j != INVALID_REGNUM)
3487     fixed_regs[j] = call_used_regs[j] = 1;
3488
3489   /* The MS_ABI changes the set of call-used registers.  */
3490   if (TARGET_64BIT && ix86_cfun_abi () == MS_ABI)
3491     {
3492       call_used_regs[SI_REG] = 0;
3493       call_used_regs[DI_REG] = 0;
3494       call_used_regs[XMM6_REG] = 0;
3495       call_used_regs[XMM7_REG] = 0;
3496       for (i = FIRST_REX_SSE_REG; i <= LAST_REX_SSE_REG; i++)
3497         call_used_regs[i] = 0;
3498     }
3499
3500   /* The default setting of CLOBBERED_REGS is for 32-bit; add in the
3501      other call-clobbered regs for 64-bit.  */
3502   if (TARGET_64BIT)
3503     {
3504       CLEAR_HARD_REG_SET (reg_class_contents[(int)CLOBBERED_REGS]);
3505
3506       for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
3507         if (TEST_HARD_REG_BIT (reg_class_contents[(int)GENERAL_REGS], i)
3508             && call_used_regs[i])
3509           SET_HARD_REG_BIT (reg_class_contents[(int)CLOBBERED_REGS], i);
3510     }
3511
3512   /* If MMX is disabled, squash the registers.  */
3513   if (! TARGET_MMX)
3514     for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
3515       if (TEST_HARD_REG_BIT (reg_class_contents[(int)MMX_REGS], i))
3516         fixed_regs[i] = call_used_regs[i] = 1, reg_names[i] = "";
3517
3518   /* If SSE is disabled, squash the registers.  */
3519   if (! TARGET_SSE)
3520     for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
3521       if (TEST_HARD_REG_BIT (reg_class_contents[(int)SSE_REGS], i))
3522         fixed_regs[i] = call_used_regs[i] = 1, reg_names[i] = "";
3523
3524   /* If the FPU is disabled, squash the registers.  */
3525   if (! (TARGET_80387 || TARGET_FLOAT_RETURNS_IN_80387))
3526     for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
3527       if (TEST_HARD_REG_BIT (reg_class_contents[(int)FLOAT_REGS], i))
3528         fixed_regs[i] = call_used_regs[i] = 1, reg_names[i] = "";
3529
3530   /* If 32-bit, squash the 64-bit registers.  */
3531   if (! TARGET_64BIT)
3532     {
3533       for (i = FIRST_REX_INT_REG; i <= LAST_REX_INT_REG; i++)
3534         reg_names[i] = "";
3535       for (i = FIRST_REX_SSE_REG; i <= LAST_REX_SSE_REG; i++)
3536         reg_names[i] = "";
3537     }
3538 }
3539
3540 \f
3541 /* Save the current options */
3542
3543 static void
3544 ix86_function_specific_save (struct cl_target_option *ptr)
3545 {
3546   ptr->arch = ix86_arch;
3547   ptr->schedule = ix86_schedule;
3548   ptr->tune = ix86_tune;
3549   ptr->fpmath = ix86_fpmath;
3550   ptr->branch_cost = ix86_branch_cost;
3551   ptr->tune_defaulted = ix86_tune_defaulted;
3552   ptr->arch_specified = ix86_arch_specified;
3553   ptr->ix86_isa_flags_explicit = ix86_isa_flags_explicit;
3554   ptr->target_flags_explicit = target_flags_explicit;
3555
3556   /* The fields are char but the variables are not; make sure the
3557      values fit in the fields.  */
3558   gcc_assert (ptr->arch == ix86_arch);
3559   gcc_assert (ptr->schedule == ix86_schedule);
3560   gcc_assert (ptr->tune == ix86_tune);
3561   gcc_assert (ptr->fpmath == ix86_fpmath);
3562   gcc_assert (ptr->branch_cost == ix86_branch_cost);
3563 }
3564
3565 /* Restore the current options */
3566
3567 static void
3568 ix86_function_specific_restore (struct cl_target_option *ptr)
3569 {
3570   enum processor_type old_tune = ix86_tune;
3571   enum processor_type old_arch = ix86_arch;
3572   unsigned int ix86_arch_mask, ix86_tune_mask;
3573   int i;
3574
3575   ix86_arch = (enum processor_type) ptr->arch;
3576   ix86_schedule = (enum attr_cpu) ptr->schedule;
3577   ix86_tune = (enum processor_type) ptr->tune;
3578   ix86_fpmath = (enum fpmath_unit) ptr->fpmath;
3579   ix86_branch_cost = ptr->branch_cost;
3580   ix86_tune_defaulted = ptr->tune_defaulted;
3581   ix86_arch_specified = ptr->arch_specified;
3582   ix86_isa_flags_explicit = ptr->ix86_isa_flags_explicit;
3583   target_flags_explicit = ptr->target_flags_explicit;
3584
3585   /* Recreate the arch feature tests if the arch changed */
3586   if (old_arch != ix86_arch)
3587     {
3588       ix86_arch_mask = 1u << ix86_arch;
3589       for (i = 0; i < X86_ARCH_LAST; ++i)
3590         ix86_arch_features[i]
3591           = !!(initial_ix86_arch_features[i] & ix86_arch_mask);
3592     }
3593
3594   /* Recreate the tune optimization tests */
3595   if (old_tune != ix86_tune)
3596     {
3597       ix86_tune_mask = 1u << ix86_tune;
3598       for (i = 0; i < X86_TUNE_LAST; ++i)
3599         ix86_tune_features[i]
3600           = !!(initial_ix86_tune_features[i] & ix86_tune_mask);
3601     }
3602 }
3603
3604 /* Print the current options */
3605
3606 static void
3607 ix86_function_specific_print (FILE *file, int indent,
3608                               struct cl_target_option *ptr)
3609 {
3610   char *target_string
3611     = ix86_target_string (ptr->ix86_isa_flags, ptr->target_flags,
3612                           NULL, NULL, NULL, false);
3613
3614   fprintf (file, "%*sarch = %d (%s)\n",
3615            indent, "",
3616            ptr->arch,
3617            ((ptr->arch < TARGET_CPU_DEFAULT_max)
3618             ? cpu_names[ptr->arch]
3619             : "<unknown>"));
3620
3621   fprintf (file, "%*stune = %d (%s)\n",
3622            indent, "",
3623            ptr->tune,
3624            ((ptr->tune < TARGET_CPU_DEFAULT_max)
3625             ? cpu_names[ptr->tune]
3626             : "<unknown>"));
3627
3628   fprintf (file, "%*sfpmath = %d%s%s\n", indent, "", ptr->fpmath,
3629            (ptr->fpmath & FPMATH_387) ? ", 387" : "",
3630            (ptr->fpmath & FPMATH_SSE) ? ", sse" : "");
3631   fprintf (file, "%*sbranch_cost = %d\n", indent, "", ptr->branch_cost);
3632
3633   if (target_string)
3634     {
3635       fprintf (file, "%*s%s\n", indent, "", target_string);
3636       free (target_string);
3637     }
3638 }
3639
3640 \f
3641 /* Inner function to process the attribute((target(...))), take an argument and
3642    set the current options from the argument. If we have a list, recursively go
3643    over the list.  */
3644
3645 static bool
3646 ix86_valid_target_attribute_inner_p (tree args, char *p_strings[])
3647 {
3648   char *next_optstr;
3649   bool ret = true;
3650
3651 #define IX86_ATTR_ISA(S,O)   { S, sizeof (S)-1, ix86_opt_isa, O, 0 }
3652 #define IX86_ATTR_STR(S,O)   { S, sizeof (S)-1, ix86_opt_str, O, 0 }
3653 #define IX86_ATTR_YES(S,O,M) { S, sizeof (S)-1, ix86_opt_yes, O, M }
3654 #define IX86_ATTR_NO(S,O,M)  { S, sizeof (S)-1, ix86_opt_no,  O, M }
3655
3656   enum ix86_opt_type
3657   {
3658     ix86_opt_unknown,
3659     ix86_opt_yes,
3660     ix86_opt_no,
3661     ix86_opt_str,
3662     ix86_opt_isa
3663   };
3664
3665   static const struct
3666   {
3667     const char *string;
3668     size_t len;
3669     enum ix86_opt_type type;
3670     int opt;
3671     int mask;
3672   } attrs[] = {
3673     /* isa options */
3674     IX86_ATTR_ISA ("3dnow",     OPT_m3dnow),
3675     IX86_ATTR_ISA ("abm",       OPT_mabm),
3676     IX86_ATTR_ISA ("aes",       OPT_maes),
3677     IX86_ATTR_ISA ("avx",       OPT_mavx),
3678     IX86_ATTR_ISA ("mmx",       OPT_mmmx),
3679     IX86_ATTR_ISA ("pclmul",    OPT_mpclmul),
3680     IX86_ATTR_ISA ("popcnt",    OPT_mpopcnt),
3681     IX86_ATTR_ISA ("sse",       OPT_msse),
3682     IX86_ATTR_ISA ("sse2",      OPT_msse2),
3683     IX86_ATTR_ISA ("sse3",      OPT_msse3),
3684     IX86_ATTR_ISA ("sse4",      OPT_msse4),
3685     IX86_ATTR_ISA ("sse4.1",    OPT_msse4_1),
3686     IX86_ATTR_ISA ("sse4.2",    OPT_msse4_2),
3687     IX86_ATTR_ISA ("sse4a",     OPT_msse4a),
3688     IX86_ATTR_ISA ("ssse3",     OPT_mssse3),
3689     IX86_ATTR_ISA ("fma4",      OPT_mfma4),
3690     IX86_ATTR_ISA ("xop",       OPT_mxop),
3691     IX86_ATTR_ISA ("lwp",       OPT_mlwp),
3692
3693     /* string options */
3694     IX86_ATTR_STR ("arch=",     IX86_FUNCTION_SPECIFIC_ARCH),
3695     IX86_ATTR_STR ("fpmath=",   IX86_FUNCTION_SPECIFIC_FPMATH),
3696     IX86_ATTR_STR ("tune=",     IX86_FUNCTION_SPECIFIC_TUNE),
3697
3698     /* flag options */
3699     IX86_ATTR_YES ("cld",
3700                    OPT_mcld,
3701                    MASK_CLD),
3702
3703     IX86_ATTR_NO ("fancy-math-387",
3704                   OPT_mfancy_math_387,
3705                   MASK_NO_FANCY_MATH_387),
3706
3707     IX86_ATTR_YES ("ieee-fp",
3708                    OPT_mieee_fp,
3709                    MASK_IEEE_FP),
3710
3711     IX86_ATTR_YES ("inline-all-stringops",
3712                    OPT_minline_all_stringops,
3713                    MASK_INLINE_ALL_STRINGOPS),
3714
3715     IX86_ATTR_YES ("inline-stringops-dynamically",
3716                    OPT_minline_stringops_dynamically,
3717                    MASK_INLINE_STRINGOPS_DYNAMICALLY),
3718
3719     IX86_ATTR_NO ("align-stringops",
3720                   OPT_mno_align_stringops,
3721                   MASK_NO_ALIGN_STRINGOPS),
3722
3723     IX86_ATTR_YES ("recip",
3724                    OPT_mrecip,
3725                    MASK_RECIP),
3726
3727   };
3728
3729   /* If this is a list, recurse to get the options.  */
3730   if (TREE_CODE (args) == TREE_LIST)
3731     {
3732       bool ret = true;
3733
3734       for (; args; args = TREE_CHAIN (args))
3735         if (TREE_VALUE (args)
3736             && !ix86_valid_target_attribute_inner_p (TREE_VALUE (args), p_strings))
3737           ret = false;
3738
3739       return ret;
3740     }
3741
3742   else if (TREE_CODE (args) != STRING_CST)
3743     gcc_unreachable ();
3744
3745   /* Handle multiple arguments separated by commas.  */
3746   next_optstr = ASTRDUP (TREE_STRING_POINTER (args));
3747
3748   while (next_optstr && *next_optstr != '\0')
3749     {
3750       char *p = next_optstr;
3751       char *orig_p = p;
3752       char *comma = strchr (next_optstr, ',');
3753       const char *opt_string;
3754       size_t len, opt_len;
3755       int opt;
3756       bool opt_set_p;
3757       char ch;
3758       unsigned i;
3759       enum ix86_opt_type type = ix86_opt_unknown;
3760       int mask = 0;
3761
3762       if (comma)
3763         {
3764           *comma = '\0';
3765           len = comma - next_optstr;
3766           next_optstr = comma + 1;
3767         }
3768       else
3769         {
3770           len = strlen (p);
3771           next_optstr = NULL;
3772         }
3773
3774       /* Recognize no-xxx.  */
3775       if (len > 3 && p[0] == 'n' && p[1] == 'o' && p[2] == '-')
3776         {
3777           opt_set_p = false;
3778           p += 3;
3779           len -= 3;
3780         }
3781       else
3782         opt_set_p = true;
3783
3784       /* Find the option.  */
3785       ch = *p;
3786       opt = N_OPTS;
3787       for (i = 0; i < ARRAY_SIZE (attrs); i++)
3788         {
3789           type = attrs[i].type;
3790           opt_len = attrs[i].len;
3791           if (ch == attrs[i].string[0]
3792               && ((type != ix86_opt_str) ? len == opt_len : len > opt_len)
3793               && memcmp (p, attrs[i].string, opt_len) == 0)
3794             {
3795               opt = attrs[i].opt;
3796               mask = attrs[i].mask;
3797               opt_string = attrs[i].string;
3798               break;
3799             }
3800         }
3801
3802       /* Process the option.  */
3803       if (opt == N_OPTS)
3804         {
3805           error ("attribute(target(\"%s\")) is unknown", orig_p);
3806           ret = false;
3807         }
3808
3809       else if (type == ix86_opt_isa)
3810         ix86_handle_option (opt, p, opt_set_p);
3811
3812       else if (type == ix86_opt_yes || type == ix86_opt_no)
3813         {
3814           if (type == ix86_opt_no)
3815             opt_set_p = !opt_set_p;
3816
3817           if (opt_set_p)
3818             target_flags |= mask;
3819           else
3820             target_flags &= ~mask;
3821         }
3822
3823       else if (type == ix86_opt_str)
3824         {
3825           if (p_strings[opt])
3826             {
3827               error ("option(\"%s\") was already specified", opt_string);
3828               ret = false;
3829             }
3830           else
3831             p_strings[opt] = xstrdup (p + opt_len);
3832         }
3833
3834       else
3835         gcc_unreachable ();
3836     }
3837
3838   return ret;
3839 }
3840
3841 /* Return a TARGET_OPTION_NODE tree of the target options listed or NULL.  */
3842
3843 tree
3844 ix86_valid_target_attribute_tree (tree args)
3845 {
3846   const char *orig_arch_string = ix86_arch_string;
3847   const char *orig_tune_string = ix86_tune_string;
3848   const char *orig_fpmath_string = ix86_fpmath_string;
3849   int orig_tune_defaulted = ix86_tune_defaulted;
3850   int orig_arch_specified = ix86_arch_specified;
3851   char *option_strings[IX86_FUNCTION_SPECIFIC_MAX] = { NULL, NULL, NULL };
3852   tree t = NULL_TREE;
3853   int i;
3854   struct cl_target_option *def
3855     = TREE_TARGET_OPTION (target_option_default_node);
3856
3857   /* Process each of the options on the chain.  */
3858   if (! ix86_valid_target_attribute_inner_p (args, option_strings))
3859     return NULL_TREE;
3860
3861   /* If the changed options are different from the default, rerun override_options,
3862      and then save the options away.  The string options are are attribute options,
3863      and will be undone when we copy the save structure.  */
3864   if (ix86_isa_flags != def->ix86_isa_flags
3865       || target_flags != def->target_flags
3866       || option_strings[IX86_FUNCTION_SPECIFIC_ARCH]
3867       || option_strings[IX86_FUNCTION_SPECIFIC_TUNE]
3868       || option_strings[IX86_FUNCTION_SPECIFIC_FPMATH])
3869     {
3870       /* If we are using the default tune= or arch=, undo the string assigned,
3871          and use the default.  */
3872       if (option_strings[IX86_FUNCTION_SPECIFIC_ARCH])
3873         ix86_arch_string = option_strings[IX86_FUNCTION_SPECIFIC_ARCH];
3874       else if (!orig_arch_specified)
3875         ix86_arch_string = NULL;
3876
3877       if (option_strings[IX86_FUNCTION_SPECIFIC_TUNE])
3878         ix86_tune_string = option_strings[IX86_FUNCTION_SPECIFIC_TUNE];
3879       else if (orig_tune_defaulted)
3880         ix86_tune_string = NULL;
3881
3882       /* If fpmath= is not set, and we now have sse2 on 32-bit, use it.  */
3883       if (option_strings[IX86_FUNCTION_SPECIFIC_FPMATH])
3884         ix86_fpmath_string = option_strings[IX86_FUNCTION_SPECIFIC_FPMATH];
3885       else if (!TARGET_64BIT && TARGET_SSE)
3886         ix86_fpmath_string = "sse,387";
3887
3888       /* Do any overrides, such as arch=xxx, or tune=xxx support.  */
3889       override_options (false);
3890
3891       /* Add any builtin functions with the new isa if any.  */
3892       ix86_add_new_builtins (ix86_isa_flags);
3893
3894       /* Save the current options unless we are validating options for
3895          #pragma.  */
3896       t = build_target_option_node ();
3897
3898       ix86_arch_string = orig_arch_string;
3899       ix86_tune_string = orig_tune_string;
3900       ix86_fpmath_string = orig_fpmath_string;
3901
3902       /* Free up memory allocated to hold the strings */
3903       for (i = 0; i < IX86_FUNCTION_SPECIFIC_MAX; i++)
3904         if (option_strings[i])
3905           free (option_strings[i]);
3906     }
3907
3908   return t;
3909 }
3910
3911 /* Hook to validate attribute((target("string"))).  */
3912
3913 static bool
3914 ix86_valid_target_attribute_p (tree fndecl,
3915                                tree ARG_UNUSED (name),
3916                                tree args,
3917                                int ARG_UNUSED (flags))
3918 {
3919   struct cl_target_option cur_target;
3920   bool ret = true;
3921   tree old_optimize = build_optimization_node ();
3922   tree new_target, new_optimize;
3923   tree func_optimize = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl);
3924
3925   /* If the function changed the optimization levels as well as setting target
3926      options, start with the optimizations specified.  */
3927   if (func_optimize && func_optimize != old_optimize)
3928     cl_optimization_restore (TREE_OPTIMIZATION (func_optimize));
3929
3930   /* The target attributes may also change some optimization flags, so update
3931      the optimization options if necessary.  */
3932   cl_target_option_save (&cur_target);
3933   new_target = ix86_valid_target_attribute_tree (args);
3934   new_optimize = build_optimization_node ();
3935
3936   if (!new_target)
3937     ret = false;
3938
3939   else if (fndecl)
3940     {
3941       DECL_FUNCTION_SPECIFIC_TARGET (fndecl) = new_target;
3942
3943       if (old_optimize != new_optimize)
3944         DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl) = new_optimize;
3945     }
3946
3947   cl_target_option_restore (&cur_target);
3948
3949   if (old_optimize != new_optimize)
3950     cl_optimization_restore (TREE_OPTIMIZATION (old_optimize));
3951
3952   return ret;
3953 }
3954
3955 \f
3956 /* Hook to determine if one function can safely inline another.  */
3957
3958 static bool
3959 ix86_can_inline_p (tree caller, tree callee)
3960 {
3961   bool ret = false;
3962   tree caller_tree = DECL_FUNCTION_SPECIFIC_TARGET (caller);
3963   tree callee_tree = DECL_FUNCTION_SPECIFIC_TARGET (callee);
3964
3965   /* If callee has no option attributes, then it is ok to inline.  */
3966   if (!callee_tree)
3967     ret = true;
3968
3969   /* If caller has no option attributes, but callee does then it is not ok to
3970      inline.  */
3971   else if (!caller_tree)
3972     ret = false;
3973
3974   else
3975     {
3976       struct cl_target_option *caller_opts = TREE_TARGET_OPTION (caller_tree);
3977       struct cl_target_option *callee_opts = TREE_TARGET_OPTION (callee_tree);
3978
3979       /* Callee's isa options should a subset of the caller's, i.e. a SSE4 function
3980          can inline a SSE2 function but a SSE2 function can't inline a SSE4
3981          function.  */
3982       if ((caller_opts->ix86_isa_flags & callee_opts->ix86_isa_flags)
3983           != callee_opts->ix86_isa_flags)
3984         ret = false;
3985
3986       /* See if we have the same non-isa options.  */
3987       else if (caller_opts->target_flags != callee_opts->target_flags)
3988         ret = false;
3989
3990       /* See if arch, tune, etc. are the same.  */
3991       else if (caller_opts->arch != callee_opts->arch)
3992         ret = false;
3993
3994       else if (caller_opts->tune != callee_opts->tune)
3995         ret = false;
3996
3997       else if (caller_opts->fpmath != callee_opts->fpmath)
3998         ret = false;
3999
4000       else if (caller_opts->branch_cost != callee_opts->branch_cost)
4001         ret = false;
4002
4003       else
4004         ret = true;
4005     }
4006
4007   return ret;
4008 }
4009
4010 \f
4011 /* Remember the last target of ix86_set_current_function.  */
4012 static GTY(()) tree ix86_previous_fndecl;
4013
4014 /* Establish appropriate back-end context for processing the function
4015    FNDECL.  The argument might be NULL to indicate processing at top
4016    level, outside of any function scope.  */
4017 static void
4018 ix86_set_current_function (tree fndecl)
4019 {
4020   /* Only change the context if the function changes.  This hook is called
4021      several times in the course of compiling a function, and we don't want to
4022      slow things down too much or call target_reinit when it isn't safe.  */
4023   if (fndecl && fndecl != ix86_previous_fndecl)
4024     {
4025       tree old_tree = (ix86_previous_fndecl
4026                        ? DECL_FUNCTION_SPECIFIC_TARGET (ix86_previous_fndecl)
4027                        : NULL_TREE);
4028
4029       tree new_tree = (fndecl
4030                        ? DECL_FUNCTION_SPECIFIC_TARGET (fndecl)
4031                        : NULL_TREE);
4032
4033       ix86_previous_fndecl = fndecl;
4034       if (old_tree == new_tree)
4035         ;
4036
4037       else if (new_tree)
4038         {
4039           cl_target_option_restore (TREE_TARGET_OPTION (new_tree));
4040           target_reinit ();
4041         }
4042
4043       else if (old_tree)
4044         {
4045           struct cl_target_option *def
4046             = TREE_TARGET_OPTION (target_option_current_node);
4047
4048           cl_target_option_restore (def);
4049           target_reinit ();
4050         }
4051     }
4052 }
4053
4054 \f
4055 /* Return true if this goes in large data/bss.  */
4056
4057 static bool
4058 ix86_in_large_data_p (tree exp)
4059 {
4060   if (ix86_cmodel != CM_MEDIUM && ix86_cmodel != CM_MEDIUM_PIC)
4061     return false;
4062
4063   /* Functions are never large data.  */
4064   if (TREE_CODE (exp) == FUNCTION_DECL)
4065     return false;
4066
4067   if (TREE_CODE (exp) == VAR_DECL && DECL_SECTION_NAME (exp))
4068     {
4069       const char *section = TREE_STRING_POINTER (DECL_SECTION_NAME (exp));
4070       if (strcmp (section, ".ldata") == 0
4071           || strcmp (section, ".lbss") == 0)
4072         return true;
4073       return false;
4074     }
4075   else
4076     {
4077       HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (exp));
4078
4079       /* If this is an incomplete type with size 0, then we can't put it
4080          in data because it might be too big when completed.  */
4081       if (!size || size > ix86_section_threshold)
4082         return true;
4083     }
4084
4085   return false;
4086 }
4087
4088 /* Switch to the appropriate section for output of DECL.
4089    DECL is either a `VAR_DECL' node or a constant of some sort.
4090    RELOC indicates whether forming the initial value of DECL requires
4091    link-time relocations.  */
4092
4093 static section * x86_64_elf_select_section (tree, int, unsigned HOST_WIDE_INT)
4094         ATTRIBUTE_UNUSED;
4095
4096 static section *
4097 x86_64_elf_select_section (tree decl, int reloc,
4098                            unsigned HOST_WIDE_INT align)
4099 {
4100   if ((ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_MEDIUM_PIC)
4101       && ix86_in_large_data_p (decl))
4102     {
4103       const char *sname = NULL;
4104       unsigned int flags = SECTION_WRITE;
4105       switch (categorize_decl_for_section (decl, reloc))
4106         {
4107         case SECCAT_DATA:
4108           sname = ".ldata";
4109           break;
4110         case SECCAT_DATA_REL:
4111           sname = ".ldata.rel";
4112           break;
4113         case SECCAT_DATA_REL_LOCAL:
4114           sname = ".ldata.rel.local";
4115           break;
4116         case SECCAT_DATA_REL_RO:
4117           sname = ".ldata.rel.ro";
4118           break;
4119         case SECCAT_DATA_REL_RO_LOCAL:
4120           sname = ".ldata.rel.ro.local";
4121           break;
4122         case SECCAT_BSS:
4123           sname = ".lbss";
4124           flags |= SECTION_BSS;
4125           break;
4126         case SECCAT_RODATA:
4127         case SECCAT_RODATA_MERGE_STR:
4128         case SECCAT_RODATA_MERGE_STR_INIT:
4129         case SECCAT_RODATA_MERGE_CONST:
4130           sname = ".lrodata";
4131           flags = 0;
4132           break;
4133         case SECCAT_SRODATA:
4134         case SECCAT_SDATA:
4135         case SECCAT_SBSS:
4136           gcc_unreachable ();
4137         case SECCAT_TEXT:
4138         case SECCAT_TDATA:
4139         case SECCAT_TBSS:
4140           /* We don't split these for medium model.  Place them into
4141              default sections and hope for best.  */
4142           break;
4143         case SECCAT_EMUTLS_VAR:
4144         case SECCAT_EMUTLS_TMPL:
4145           gcc_unreachable ();
4146         }
4147       if (sname)
4148         {
4149           /* We might get called with string constants, but get_named_section
4150              doesn't like them as they are not DECLs.  Also, we need to set
4151              flags in that case.  */
4152           if (!DECL_P (decl))
4153             return get_section (sname, flags, NULL);
4154           return get_named_section (decl, sname, reloc);
4155         }
4156     }
4157   return default_elf_select_section (decl, reloc, align);
4158 }
4159
4160 /* Build up a unique section name, expressed as a
4161    STRING_CST node, and assign it to DECL_SECTION_NAME (decl).
4162    RELOC indicates whether the initial value of EXP requires
4163    link-time relocations.  */
4164
4165 static void ATTRIBUTE_UNUSED
4166 x86_64_elf_unique_section (tree decl, int reloc)
4167 {
4168   if ((ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_MEDIUM_PIC)
4169       && ix86_in_large_data_p (decl))
4170     {
4171       const char *prefix = NULL;
4172       /* We only need to use .gnu.linkonce if we don't have COMDAT groups.  */
4173       bool one_only = DECL_ONE_ONLY (decl) && !HAVE_COMDAT_GROUP;
4174
4175       switch (categorize_decl_for_section (decl, reloc))
4176         {
4177         case SECCAT_DATA:
4178         case SECCAT_DATA_REL:
4179         case SECCAT_DATA_REL_LOCAL:
4180         case SECCAT_DATA_REL_RO:
4181         case SECCAT_DATA_REL_RO_LOCAL:
4182           prefix = one_only ? ".ld" : ".ldata";
4183           break;
4184         case SECCAT_BSS:
4185           prefix = one_only ? ".lb" : ".lbss";
4186           break;
4187         case SECCAT_RODATA:
4188         case SECCAT_RODATA_MERGE_STR:
4189         case SECCAT_RODATA_MERGE_STR_INIT:
4190         case SECCAT_RODATA_MERGE_CONST:
4191           prefix = one_only ? ".lr" : ".lrodata";
4192           break;
4193         case SECCAT_SRODATA:
4194         case SECCAT_SDATA:
4195         case SECCAT_SBSS:
4196           gcc_unreachable ();
4197         case SECCAT_TEXT:
4198         case SECCAT_TDATA:
4199         case SECCAT_TBSS:
4200           /* We don't split these for medium model.  Place them into
4201              default sections and hope for best.  */
4202           break;
4203         case SECCAT_EMUTLS_VAR:
4204           prefix = targetm.emutls.var_section;
4205           break;
4206         case SECCAT_EMUTLS_TMPL:
4207           prefix = targetm.emutls.tmpl_section;
4208           break;
4209         }
4210       if (prefix)
4211         {
4212           const char *name, *linkonce;
4213           char *string;
4214
4215           name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
4216           name = targetm.strip_name_encoding (name);
4217           
4218           /* If we're using one_only, then there needs to be a .gnu.linkonce
4219              prefix to the section name.  */
4220           linkonce = one_only ? ".gnu.linkonce" : "";
4221   
4222           string = ACONCAT ((linkonce, prefix, ".", name, NULL));
4223           
4224           DECL_SECTION_NAME (decl) = build_string (strlen (string), string);
4225           return;
4226         }
4227     }
4228   default_unique_section (decl, reloc);
4229 }
4230
4231 #ifdef COMMON_ASM_OP
4232 /* This says how to output assembler code to declare an
4233    uninitialized external linkage data object.
4234
4235    For medium model x86-64 we need to use .largecomm opcode for
4236    large objects.  */
4237 void
4238 x86_elf_aligned_common (FILE *file,
4239                         const char *name, unsigned HOST_WIDE_INT size,
4240                         int align)
4241 {
4242   if ((ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_MEDIUM_PIC)
4243       && size > (unsigned int)ix86_section_threshold)
4244     fputs (".largecomm\t", file);
4245   else
4246     fputs (COMMON_ASM_OP, file);
4247   assemble_name (file, name);
4248   fprintf (file, "," HOST_WIDE_INT_PRINT_UNSIGNED ",%u\n",
4249            size, align / BITS_PER_UNIT);
4250 }
4251 #endif
4252
4253 /* Utility function for targets to use in implementing
4254    ASM_OUTPUT_ALIGNED_BSS.  */
4255
4256 void
4257 x86_output_aligned_bss (FILE *file, tree decl ATTRIBUTE_UNUSED,
4258                         const char *name, unsigned HOST_WIDE_INT size,
4259                         int align)
4260 {
4261   if ((ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_MEDIUM_PIC)
4262       && size > (unsigned int)ix86_section_threshold)
4263     switch_to_section (get_named_section (decl, ".lbss", 0));
4264   else
4265     switch_to_section (bss_section);
4266   ASM_OUTPUT_ALIGN (file, floor_log2 (align / BITS_PER_UNIT));
4267 #ifdef ASM_DECLARE_OBJECT_NAME
4268   last_assemble_variable_decl = decl;
4269   ASM_DECLARE_OBJECT_NAME (file, name, decl);
4270 #else
4271   /* Standard thing is just output label for the object.  */
4272   ASM_OUTPUT_LABEL (file, name);
4273 #endif /* ASM_DECLARE_OBJECT_NAME */
4274   ASM_OUTPUT_SKIP (file, size ? size : 1);
4275 }
4276 \f
4277 void
4278 optimization_options (int level, int size ATTRIBUTE_UNUSED)
4279 {
4280   /* For -O2 and beyond, turn off -fschedule-insns by default.  It tends to
4281      make the problem with not enough registers even worse.  */
4282 #ifdef INSN_SCHEDULING
4283   if (level > 1)
4284     flag_schedule_insns = 0;
4285 #endif
4286
4287   if (TARGET_MACHO)
4288     /* The Darwin libraries never set errno, so we might as well
4289        avoid calling them when that's the only reason we would.  */
4290     flag_errno_math = 0;
4291
4292   /* The default values of these switches depend on the TARGET_64BIT
4293      that is not known at this moment.  Mark these values with 2 and
4294      let user the to override these.  In case there is no command line option
4295      specifying them, we will set the defaults in override_options.  */
4296   if (optimize >= 1)
4297     flag_omit_frame_pointer = 2;
4298   flag_pcc_struct_return = 2;
4299   flag_asynchronous_unwind_tables = 2;
4300   flag_vect_cost_model = 1;
4301 #ifdef SUBTARGET_OPTIMIZATION_OPTIONS
4302   SUBTARGET_OPTIMIZATION_OPTIONS;
4303 #endif
4304 }
4305 \f
4306 /* Decide whether we can make a sibling call to a function.  DECL is the
4307    declaration of the function being targeted by the call and EXP is the
4308    CALL_EXPR representing the call.  */
4309
4310 static bool
4311 ix86_function_ok_for_sibcall (tree decl, tree exp)
4312 {
4313   tree type, decl_or_type;
4314   rtx a, b;
4315
4316   /* If we are generating position-independent code, we cannot sibcall
4317      optimize any indirect call, or a direct call to a global function,
4318      as the PLT requires %ebx be live.  */
4319   if (!TARGET_64BIT && flag_pic && (!decl || !targetm.binds_local_p (decl)))
4320     return false;
4321
4322   /* If we need to align the outgoing stack, then sibcalling would
4323      unalign the stack, which may break the called function.  */
4324   if (ix86_minimum_incoming_stack_boundary (true)
4325       < PREFERRED_STACK_BOUNDARY)
4326     return false;
4327
4328   if (decl)
4329     {
4330       decl_or_type = decl;
4331       type = TREE_TYPE (decl);
4332     }
4333   else
4334     {
4335       /* We're looking at the CALL_EXPR, we need the type of the function.  */
4336       type = CALL_EXPR_FN (exp);                /* pointer expression */
4337       type = TREE_TYPE (type);                  /* pointer type */
4338       type = TREE_TYPE (type);                  /* function type */
4339       decl_or_type = type;
4340     }
4341
4342   /* Check that the return value locations are the same.  Like
4343      if we are returning floats on the 80387 register stack, we cannot
4344      make a sibcall from a function that doesn't return a float to a
4345      function that does or, conversely, from a function that does return
4346      a float to a function that doesn't; the necessary stack adjustment
4347      would not be executed.  This is also the place we notice
4348      differences in the return value ABI.  Note that it is ok for one
4349      of the functions to have void return type as long as the return
4350      value of the other is passed in a register.  */
4351   a = ix86_function_value (TREE_TYPE (exp), decl_or_type, false);
4352   b = ix86_function_value (TREE_TYPE (DECL_RESULT (cfun->decl)),
4353                            cfun->decl, false);
4354   if (STACK_REG_P (a) || STACK_REG_P (b))
4355     {
4356       if (!rtx_equal_p (a, b))
4357         return false;
4358     }
4359   else if (VOID_TYPE_P (TREE_TYPE (DECL_RESULT (cfun->decl))))
4360     ;
4361   else if (!rtx_equal_p (a, b))
4362     return false;
4363
4364   if (TARGET_64BIT)
4365     {
4366       /* The SYSV ABI has more call-clobbered registers;
4367          disallow sibcalls from MS to SYSV.  */
4368       if (cfun->machine->call_abi == MS_ABI
4369           && ix86_function_type_abi (type) == SYSV_ABI)
4370         return false;
4371     }
4372   else
4373     {
4374       /* If this call is indirect, we'll need to be able to use a
4375          call-clobbered register for the address of the target function.
4376          Make sure that all such registers are not used for passing
4377          parameters.  Note that DLLIMPORT functions are indirect.  */
4378       if (!decl
4379           || (TARGET_DLLIMPORT_DECL_ATTRIBUTES && DECL_DLLIMPORT_P (decl)))
4380         {
4381           if (ix86_function_regparm (type, NULL) >= 3)
4382             {
4383               /* ??? Need to count the actual number of registers to be used,
4384                  not the possible number of registers.  Fix later.  */
4385               return false;
4386             }
4387         }
4388     }
4389
4390   /* Otherwise okay.  That also includes certain types of indirect calls.  */
4391   return true;
4392 }
4393
4394 /* Handle "cdecl", "stdcall", "fastcall", "regparm" and "sseregparm"
4395    calling convention attributes;
4396    arguments as in struct attribute_spec.handler.  */
4397
4398 static tree
4399 ix86_handle_cconv_attribute (tree *node, tree name,
4400                                    tree args,
4401                                    int flags ATTRIBUTE_UNUSED,
4402                                    bool *no_add_attrs)
4403 {
4404   if (TREE_CODE (*node) != FUNCTION_TYPE
4405       && TREE_CODE (*node) != METHOD_TYPE
4406       && TREE_CODE (*node) != FIELD_DECL
4407       && TREE_CODE (*node) != TYPE_DECL)
4408     {
4409       warning (OPT_Wattributes, "%qE attribute only applies to functions",
4410                name);
4411       *no_add_attrs = true;
4412       return NULL_TREE;
4413     }
4414
4415   /* Can combine regparm with all attributes but fastcall.  */
4416   if (is_attribute_p ("regparm", name))
4417     {
4418       tree cst;
4419
4420       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (*node)))
4421         {
4422           error ("fastcall and regparm attributes are not compatible");
4423         }
4424
4425       cst = TREE_VALUE (args);
4426       if (TREE_CODE (cst) != INTEGER_CST)
4427         {
4428           warning (OPT_Wattributes,
4429                    "%qE attribute requires an integer constant argument",
4430                    name);
4431           *no_add_attrs = true;
4432         }
4433       else if (compare_tree_int (cst, REGPARM_MAX) > 0)
4434         {
4435           warning (OPT_Wattributes, "argument to %qE attribute larger than %d",
4436                    name, REGPARM_MAX);
4437           *no_add_attrs = true;
4438         }
4439
4440       return NULL_TREE;
4441     }
4442
4443   if (TARGET_64BIT)
4444     {
4445       /* Do not warn when emulating the MS ABI.  */
4446       if (TREE_CODE (*node) != FUNCTION_TYPE
4447           || ix86_function_type_abi (*node) != MS_ABI)
4448         warning (OPT_Wattributes, "%qE attribute ignored",
4449                  name);
4450       *no_add_attrs = true;
4451       return NULL_TREE;
4452     }
4453
4454   /* Can combine fastcall with stdcall (redundant) and sseregparm.  */
4455   if (is_attribute_p ("fastcall", name))
4456     {
4457       if (lookup_attribute ("cdecl", TYPE_ATTRIBUTES (*node)))
4458         {
4459           error ("fastcall and cdecl attributes are not compatible");
4460         }
4461       if (lookup_attribute ("stdcall", TYPE_ATTRIBUTES (*node)))
4462         {
4463           error ("fastcall and stdcall attributes are not compatible");
4464         }
4465       if (lookup_attribute ("regparm", TYPE_ATTRIBUTES (*node)))
4466         {
4467           error ("fastcall and regparm attributes are not compatible");
4468         }
4469     }
4470
4471   /* Can combine stdcall with fastcall (redundant), regparm and
4472      sseregparm.  */
4473   else if (is_attribute_p ("stdcall", name))
4474     {
4475       if (lookup_attribute ("cdecl", TYPE_ATTRIBUTES (*node)))
4476         {
4477           error ("stdcall and cdecl attributes are not compatible");
4478         }
4479       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (*node)))
4480         {
4481           error ("stdcall and fastcall attributes are not compatible");
4482         }
4483     }
4484
4485   /* Can combine cdecl with regparm and sseregparm.  */
4486   else if (is_attribute_p ("cdecl", name))
4487     {
4488       if (lookup_attribute ("stdcall", TYPE_ATTRIBUTES (*node)))
4489         {
4490           error ("stdcall and cdecl attributes are not compatible");
4491         }
4492       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (*node)))
4493         {
4494           error ("fastcall and cdecl attributes are not compatible");
4495         }
4496     }
4497
4498   /* Can combine sseregparm with all attributes.  */
4499
4500   return NULL_TREE;
4501 }
4502
4503 /* Return 0 if the attributes for two types are incompatible, 1 if they
4504    are compatible, and 2 if they are nearly compatible (which causes a
4505    warning to be generated).  */
4506
4507 static int
4508 ix86_comp_type_attributes (const_tree type1, const_tree type2)
4509 {
4510   /* Check for mismatch of non-default calling convention.  */
4511   const char *const rtdstr = TARGET_RTD ? "cdecl" : "stdcall";
4512
4513   if (TREE_CODE (type1) != FUNCTION_TYPE
4514       && TREE_CODE (type1) != METHOD_TYPE)
4515     return 1;
4516
4517   /* Check for mismatched fastcall/regparm types.  */
4518   if ((!lookup_attribute ("fastcall", TYPE_ATTRIBUTES (type1))
4519        != !lookup_attribute ("fastcall", TYPE_ATTRIBUTES (type2)))
4520       || (ix86_function_regparm (type1, NULL)
4521           != ix86_function_regparm (type2, NULL)))
4522     return 0;
4523
4524   /* Check for mismatched sseregparm types.  */
4525   if (!lookup_attribute ("sseregparm", TYPE_ATTRIBUTES (type1))
4526       != !lookup_attribute ("sseregparm", TYPE_ATTRIBUTES (type2)))
4527     return 0;
4528
4529   /* Check for mismatched return types (cdecl vs stdcall).  */
4530   if (!lookup_attribute (rtdstr, TYPE_ATTRIBUTES (type1))
4531       != !lookup_attribute (rtdstr, TYPE_ATTRIBUTES (type2)))
4532     return 0;
4533
4534   return 1;
4535 }
4536 \f
4537 /* Return the regparm value for a function with the indicated TYPE and DECL.
4538    DECL may be NULL when calling function indirectly
4539    or considering a libcall.  */
4540
4541 static int
4542 ix86_function_regparm (const_tree type, const_tree decl)
4543 {
4544   tree attr;
4545   int regparm;
4546
4547   if (TARGET_64BIT)
4548     return (ix86_function_type_abi (type) == SYSV_ABI
4549             ? X86_64_REGPARM_MAX : X86_64_MS_REGPARM_MAX);
4550
4551   regparm = ix86_regparm;
4552   attr = lookup_attribute ("regparm", TYPE_ATTRIBUTES (type));
4553   if (attr)
4554     {
4555       regparm = TREE_INT_CST_LOW (TREE_VALUE (TREE_VALUE (attr)));
4556       return regparm;
4557     }
4558
4559   if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (type)))
4560     return 2;
4561
4562   /* Use register calling convention for local functions when possible.  */
4563   if (decl
4564       && TREE_CODE (decl) == FUNCTION_DECL
4565       && optimize
4566       && !profile_flag)
4567     {
4568       /* FIXME: remove this CONST_CAST when cgraph.[ch] is constified.  */
4569       struct cgraph_local_info *i = cgraph_local_info (CONST_CAST_TREE (decl));
4570       if (i && i->local)
4571         {
4572           int local_regparm, globals = 0, regno;
4573
4574           /* Make sure no regparm register is taken by a
4575              fixed register variable.  */
4576           for (local_regparm = 0; local_regparm < REGPARM_MAX; local_regparm++)
4577             if (fixed_regs[local_regparm])
4578               break;
4579
4580           /* We don't want to use regparm(3) for nested functions as
4581              these use a static chain pointer in the third argument.  */
4582           if (local_regparm == 3 && DECL_STATIC_CHAIN (decl))
4583             local_regparm = 2;
4584
4585           /* Each fixed register usage increases register pressure,
4586              so less registers should be used for argument passing.
4587              This functionality can be overriden by an explicit
4588              regparm value.  */
4589           for (regno = 0; regno <= DI_REG; regno++)
4590             if (fixed_regs[regno])
4591               globals++;
4592
4593           local_regparm
4594             = globals < local_regparm ? local_regparm - globals : 0;
4595
4596           if (local_regparm > regparm)
4597             regparm = local_regparm;
4598         }
4599     }
4600
4601   return regparm;
4602 }
4603
4604 /* Return 1 or 2, if we can pass up to SSE_REGPARM_MAX SFmode (1) and
4605    DFmode (2) arguments in SSE registers for a function with the
4606    indicated TYPE and DECL.  DECL may be NULL when calling function
4607    indirectly or considering a libcall.  Otherwise return 0.  */
4608
4609 static int
4610 ix86_function_sseregparm (const_tree type, const_tree decl, bool warn)
4611 {
4612   gcc_assert (!TARGET_64BIT);
4613
4614   /* Use SSE registers to pass SFmode and DFmode arguments if requested
4615      by the sseregparm attribute.  */
4616   if (TARGET_SSEREGPARM
4617       || (type && lookup_attribute ("sseregparm", TYPE_ATTRIBUTES (type))))
4618     {
4619       if (!TARGET_SSE)
4620         {
4621           if (warn)
4622             {
4623               if (decl)
4624                 error ("Calling %qD with attribute sseregparm without "
4625                        "SSE/SSE2 enabled", decl);
4626               else
4627                 error ("Calling %qT with attribute sseregparm without "
4628                        "SSE/SSE2 enabled", type);
4629             }
4630           return 0;
4631         }
4632
4633       return 2;
4634     }
4635
4636   /* For local functions, pass up to SSE_REGPARM_MAX SFmode
4637      (and DFmode for SSE2) arguments in SSE registers.  */
4638   if (decl && TARGET_SSE_MATH && optimize && !profile_flag)
4639     {
4640       /* FIXME: remove this CONST_CAST when cgraph.[ch] is constified.  */
4641       struct cgraph_local_info *i = cgraph_local_info (CONST_CAST_TREE(decl));
4642       if (i && i->local)
4643         return TARGET_SSE2 ? 2 : 1;
4644     }
4645
4646   return 0;
4647 }
4648
4649 /* Return true if EAX is live at the start of the function.  Used by
4650    ix86_expand_prologue to determine if we need special help before
4651    calling allocate_stack_worker.  */
4652
4653 static bool
4654 ix86_eax_live_at_start_p (void)
4655 {
4656   /* Cheat.  Don't bother working forward from ix86_function_regparm
4657      to the function type to whether an actual argument is located in
4658      eax.  Instead just look at cfg info, which is still close enough
4659      to correct at this point.  This gives false positives for broken
4660      functions that might use uninitialized data that happens to be
4661      allocated in eax, but who cares?  */
4662   return REGNO_REG_SET_P (df_get_live_out (ENTRY_BLOCK_PTR), 0);
4663 }
4664
4665 /* Value is the number of bytes of arguments automatically
4666    popped when returning from a subroutine call.
4667    FUNDECL is the declaration node of the function (as a tree),
4668    FUNTYPE is the data type of the function (as a tree),
4669    or for a library call it is an identifier node for the subroutine name.
4670    SIZE is the number of bytes of arguments passed on the stack.
4671
4672    On the 80386, the RTD insn may be used to pop them if the number
4673      of args is fixed, but if the number is variable then the caller
4674      must pop them all.  RTD can't be used for library calls now
4675      because the library is compiled with the Unix compiler.
4676    Use of RTD is a selectable option, since it is incompatible with
4677    standard Unix calling sequences.  If the option is not selected,
4678    the caller must always pop the args.
4679
4680    The attribute stdcall is equivalent to RTD on a per module basis.  */
4681
4682 int
4683 ix86_return_pops_args (tree fundecl, tree funtype, int size)
4684 {
4685   int rtd;
4686
4687   /* None of the 64-bit ABIs pop arguments.  */
4688   if (TARGET_64BIT)
4689     return 0;
4690
4691   rtd = TARGET_RTD && (!fundecl || TREE_CODE (fundecl) != IDENTIFIER_NODE);
4692
4693   /* Cdecl functions override -mrtd, and never pop the stack.  */
4694   if (! lookup_attribute ("cdecl", TYPE_ATTRIBUTES (funtype)))
4695     {
4696       /* Stdcall and fastcall functions will pop the stack if not
4697          variable args.  */
4698       if (lookup_attribute ("stdcall", TYPE_ATTRIBUTES (funtype))
4699           || lookup_attribute ("fastcall", TYPE_ATTRIBUTES (funtype)))
4700         rtd = 1;
4701
4702       if (rtd && ! stdarg_p (funtype))
4703         return size;
4704     }
4705
4706   /* Lose any fake structure return argument if it is passed on the stack.  */
4707   if (aggregate_value_p (TREE_TYPE (funtype), fundecl)
4708       && !KEEP_AGGREGATE_RETURN_POINTER)
4709     {
4710       int nregs = ix86_function_regparm (funtype, fundecl);
4711       if (nregs == 0)
4712         return GET_MODE_SIZE (Pmode);
4713     }
4714
4715   return 0;
4716 }
4717 \f
4718 /* Argument support functions.  */
4719
4720 /* Return true when register may be used to pass function parameters.  */
4721 bool
4722 ix86_function_arg_regno_p (int regno)
4723 {
4724   int i;
4725   const int *parm_regs;
4726
4727   if (!TARGET_64BIT)
4728     {
4729       if (TARGET_MACHO)
4730         return (regno < REGPARM_MAX
4731                 || (TARGET_SSE && SSE_REGNO_P (regno) && !fixed_regs[regno]));
4732       else
4733         return (regno < REGPARM_MAX
4734                 || (TARGET_MMX && MMX_REGNO_P (regno)
4735                     && (regno < FIRST_MMX_REG + MMX_REGPARM_MAX))
4736                 || (TARGET_SSE && SSE_REGNO_P (regno)
4737                     && (regno < FIRST_SSE_REG + SSE_REGPARM_MAX)));
4738     }
4739
4740   if (TARGET_MACHO)
4741     {
4742       if (SSE_REGNO_P (regno) && TARGET_SSE)
4743         return true;
4744     }
4745   else
4746     {
4747       if (TARGET_SSE && SSE_REGNO_P (regno)
4748           && (regno < FIRST_SSE_REG + SSE_REGPARM_MAX))
4749         return true;
4750     }
4751
4752   /* TODO: The function should depend on current function ABI but
4753      builtins.c would need updating then. Therefore we use the
4754      default ABI.  */
4755
4756   /* RAX is used as hidden argument to va_arg functions.  */
4757   if (ix86_abi == SYSV_ABI && regno == AX_REG)
4758     return true;
4759
4760   if (ix86_abi == MS_ABI)
4761     parm_regs = x86_64_ms_abi_int_parameter_registers;
4762   else
4763     parm_regs = x86_64_int_parameter_registers;
4764   for (i = 0; i < (ix86_abi == MS_ABI
4765                    ? X86_64_MS_REGPARM_MAX : X86_64_REGPARM_MAX); i++)
4766     if (regno == parm_regs[i])
4767       return true;
4768   return false;
4769 }
4770
4771 /* Return if we do not know how to pass TYPE solely in registers.  */
4772
4773 static bool
4774 ix86_must_pass_in_stack (enum machine_mode mode, const_tree type)
4775 {
4776   if (must_pass_in_stack_var_size_or_pad (mode, type))
4777     return true;
4778
4779   /* For 32-bit, we want TImode aggregates to go on the stack.  But watch out!
4780      The layout_type routine is crafty and tries to trick us into passing
4781      currently unsupported vector types on the stack by using TImode.  */
4782   return (!TARGET_64BIT && mode == TImode
4783           && type && TREE_CODE (type) != VECTOR_TYPE);
4784 }
4785
4786 /* It returns the size, in bytes, of the area reserved for arguments passed
4787    in registers for the function represented by fndecl dependent to the used
4788    abi format.  */
4789 int
4790 ix86_reg_parm_stack_space (const_tree fndecl)
4791 {
4792   enum calling_abi call_abi = SYSV_ABI;
4793   if (fndecl != NULL_TREE && TREE_CODE (fndecl) == FUNCTION_DECL)
4794     call_abi = ix86_function_abi (fndecl);
4795   else
4796     call_abi = ix86_function_type_abi (fndecl);
4797   if (call_abi == MS_ABI)
4798     return 32;
4799   return 0;
4800 }
4801
4802 /* Returns value SYSV_ABI, MS_ABI dependent on fntype, specifying the
4803    call abi used.  */
4804 enum calling_abi
4805 ix86_function_type_abi (const_tree fntype)
4806 {
4807   if (TARGET_64BIT && fntype != NULL)
4808     {
4809       enum calling_abi abi = ix86_abi;
4810       if (abi == SYSV_ABI)
4811         {
4812           if (lookup_attribute ("ms_abi", TYPE_ATTRIBUTES (fntype)))
4813             abi = MS_ABI;
4814         }
4815       else if (lookup_attribute ("sysv_abi", TYPE_ATTRIBUTES (fntype)))
4816         abi = SYSV_ABI;
4817       return abi;
4818     }
4819   return ix86_abi;
4820 }
4821
4822 static bool
4823 ix86_function_ms_hook_prologue (const_tree fntype)
4824 {
4825   if (!TARGET_64BIT)
4826     {
4827       if (lookup_attribute ("ms_hook_prologue", DECL_ATTRIBUTES (fntype)))
4828         {
4829           if (decl_function_context (fntype) != NULL_TREE)
4830           {
4831             error_at (DECL_SOURCE_LOCATION (fntype),
4832                 "ms_hook_prologue is not compatible with nested function");
4833           }
4834
4835           return true;
4836         }
4837     }
4838   return false;
4839 }
4840
4841 static enum calling_abi
4842 ix86_function_abi (const_tree fndecl)
4843 {
4844   if (! fndecl)
4845     return ix86_abi;
4846   return ix86_function_type_abi (TREE_TYPE (fndecl));
4847 }
4848
4849 /* Returns value SYSV_ABI, MS_ABI dependent on cfun, specifying the
4850    call abi used.  */
4851 enum calling_abi
4852 ix86_cfun_abi (void)
4853 {
4854   if (! cfun || ! TARGET_64BIT)
4855     return ix86_abi;
4856   return cfun->machine->call_abi;
4857 }
4858
4859 /* regclass.c  */
4860 extern void init_regs (void);
4861
4862 /* Implementation of call abi switching target hook. Specific to FNDECL
4863    the specific call register sets are set. See also CONDITIONAL_REGISTER_USAGE
4864    for more details.  */
4865 void
4866 ix86_call_abi_override (const_tree fndecl)
4867 {
4868   if (fndecl == NULL_TREE)
4869     cfun->machine->call_abi = ix86_abi;
4870   else
4871     cfun->machine->call_abi = ix86_function_type_abi (TREE_TYPE (fndecl));
4872 }
4873
4874 /* MS and SYSV ABI have different set of call used registers.  Avoid expensive
4875    re-initialization of init_regs each time we switch function context since
4876    this is needed only during RTL expansion.  */
4877 static void
4878 ix86_maybe_switch_abi (void)
4879 {
4880   if (TARGET_64BIT &&
4881       call_used_regs[SI_REG] == (cfun->machine->call_abi == MS_ABI))
4882     reinit_regs ();
4883 }
4884
4885 /* Initialize a variable CUM of type CUMULATIVE_ARGS
4886    for a call to a function whose data type is FNTYPE.
4887    For a library call, FNTYPE is 0.  */
4888
4889 void
4890 init_cumulative_args (CUMULATIVE_ARGS *cum,  /* Argument info to initialize */
4891                       tree fntype,      /* tree ptr for function decl */
4892                       rtx libname,      /* SYMBOL_REF of library name or 0 */
4893                       tree fndecl)
4894 {
4895   struct cgraph_local_info *i = fndecl ? cgraph_local_info (fndecl) : NULL;
4896   memset (cum, 0, sizeof (*cum));
4897
4898   if (fndecl)
4899    cum->call_abi = ix86_function_abi (fndecl);
4900   else
4901    cum->call_abi = ix86_function_type_abi (fntype);
4902   /* Set up the number of registers to use for passing arguments.  */
4903
4904   if (cum->call_abi == MS_ABI && !ACCUMULATE_OUTGOING_ARGS)
4905     sorry ("ms_abi attribute requires -maccumulate-outgoing-args "
4906            "or subtarget optimization implying it");
4907   cum->nregs = ix86_regparm;
4908   if (TARGET_64BIT)
4909     {
4910       if (cum->call_abi != ix86_abi)
4911         cum->nregs = (ix86_abi != SYSV_ABI
4912                       ? X86_64_REGPARM_MAX : X86_64_MS_REGPARM_MAX);
4913     }
4914   if (TARGET_SSE)
4915     {
4916       cum->sse_nregs = SSE_REGPARM_MAX;
4917       if (TARGET_64BIT)
4918         {
4919           if (cum->call_abi != ix86_abi)
4920             cum->sse_nregs = (ix86_abi != SYSV_ABI
4921                               ? X86_64_SSE_REGPARM_MAX
4922                               : X86_64_MS_SSE_REGPARM_MAX);
4923         }
4924     }
4925   if (TARGET_MMX)
4926     cum->mmx_nregs = MMX_REGPARM_MAX;
4927   cum->warn_avx = true;
4928   cum->warn_sse = true;
4929   cum->warn_mmx = true;
4930
4931   /* Because type might mismatch in between caller and callee, we need to
4932      use actual type of function for local calls.
4933      FIXME: cgraph_analyze can be told to actually record if function uses
4934      va_start so for local functions maybe_vaarg can be made aggressive
4935      helping K&R code.
4936      FIXME: once typesytem is fixed, we won't need this code anymore.  */
4937   if (i && i->local)
4938     fntype = TREE_TYPE (fndecl);
4939   cum->maybe_vaarg = (fntype
4940                       ? (!prototype_p (fntype) || stdarg_p (fntype))
4941                       : !libname);
4942
4943   if (!TARGET_64BIT)
4944     {
4945       /* If there are variable arguments, then we won't pass anything
4946          in registers in 32-bit mode. */
4947       if (stdarg_p (fntype))
4948         {
4949           cum->nregs = 0;
4950           cum->sse_nregs = 0;
4951           cum->mmx_nregs = 0;
4952           cum->warn_avx = 0;
4953           cum->warn_sse = 0;
4954           cum->warn_mmx = 0;
4955           return;
4956         }
4957
4958       /* Use ecx and edx registers if function has fastcall attribute,
4959          else look for regparm information.  */
4960       if (fntype)
4961         {
4962           if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (fntype)))
4963             {
4964               cum->nregs = 2;
4965               cum->fastcall = 1;
4966             }
4967           else
4968             cum->nregs = ix86_function_regparm (fntype, fndecl);
4969         }
4970
4971       /* Set up the number of SSE registers used for passing SFmode
4972          and DFmode arguments.  Warn for mismatching ABI.  */
4973       cum->float_in_sse = ix86_function_sseregparm (fntype, fndecl, true);
4974     }
4975 }
4976
4977 /* Return the "natural" mode for TYPE.  In most cases, this is just TYPE_MODE.
4978    But in the case of vector types, it is some vector mode.
4979
4980    When we have only some of our vector isa extensions enabled, then there
4981    are some modes for which vector_mode_supported_p is false.  For these
4982    modes, the generic vector support in gcc will choose some non-vector mode
4983    in order to implement the type.  By computing the natural mode, we'll
4984    select the proper ABI location for the operand and not depend on whatever
4985    the middle-end decides to do with these vector types.
4986
4987    The midde-end can't deal with the vector types > 16 bytes.  In this
4988    case, we return the original mode and warn ABI change if CUM isn't
4989    NULL.  */
4990
4991 static enum machine_mode
4992 type_natural_mode (const_tree type, CUMULATIVE_ARGS *cum)
4993 {
4994   enum machine_mode mode = TYPE_MODE (type);
4995
4996   if (TREE_CODE (type) == VECTOR_TYPE && !VECTOR_MODE_P (mode))
4997     {
4998       HOST_WIDE_INT size = int_size_in_bytes (type);
4999       if ((size == 8 || size == 16 || size == 32)
5000           /* ??? Generic code allows us to create width 1 vectors.  Ignore.  */
5001           && TYPE_VECTOR_SUBPARTS (type) > 1)
5002         {
5003           enum machine_mode innermode = TYPE_MODE (TREE_TYPE (type));
5004
5005           if (TREE_CODE (TREE_TYPE (type)) == REAL_TYPE)
5006             mode = MIN_MODE_VECTOR_FLOAT;
5007           else
5008             mode = MIN_MODE_VECTOR_INT;
5009
5010           /* Get the mode which has this inner mode and number of units.  */
5011           for (; mode != VOIDmode; mode = GET_MODE_WIDER_MODE (mode))
5012             if (GET_MODE_NUNITS (mode) == TYPE_VECTOR_SUBPARTS (type)
5013                 && GET_MODE_INNER (mode) == innermode)
5014               {
5015                 if (size == 32 && !TARGET_AVX)
5016                   {
5017                     static bool warnedavx;
5018
5019                     if (cum
5020                         && !warnedavx 
5021                         && cum->warn_avx)
5022                       {
5023                         warnedavx = true;
5024                         warning (0, "AVX vector argument without AVX "
5025                                  "enabled changes the ABI");
5026                       }
5027                     return TYPE_MODE (type);
5028                   }
5029                 else
5030                   return mode;
5031               }
5032
5033           gcc_unreachable ();
5034         }
5035     }
5036
5037   return mode;
5038 }
5039
5040 /* We want to pass a value in REGNO whose "natural" mode is MODE.  However,
5041    this may not agree with the mode that the type system has chosen for the
5042    register, which is ORIG_MODE.  If ORIG_MODE is not BLKmode, then we can
5043    go ahead and use it.  Otherwise we have to build a PARALLEL instead.  */
5044
5045 static rtx
5046 gen_reg_or_parallel (enum machine_mode mode, enum machine_mode orig_mode,
5047                      unsigned int regno)
5048 {
5049   rtx tmp;
5050
5051   if (orig_mode != BLKmode)
5052     tmp = gen_rtx_REG (orig_mode, regno);
5053   else
5054     {
5055       tmp = gen_rtx_REG (mode, regno);
5056       tmp = gen_rtx_EXPR_LIST (VOIDmode, tmp, const0_rtx);
5057       tmp = gen_rtx_PARALLEL (orig_mode, gen_rtvec (1, tmp));
5058     }
5059
5060   return tmp;
5061 }
5062
5063 /* x86-64 register passing implementation.  See x86-64 ABI for details.  Goal
5064    of this code is to classify each 8bytes of incoming argument by the register
5065    class and assign registers accordingly.  */
5066
5067 /* Return the union class of CLASS1 and CLASS2.
5068    See the x86-64 PS ABI for details.  */
5069
5070 static enum x86_64_reg_class
5071 merge_classes (enum x86_64_reg_class class1, enum x86_64_reg_class class2)
5072 {
5073   /* Rule #1: If both classes are equal, this is the resulting class.  */
5074   if (class1 == class2)
5075     return class1;
5076
5077   /* Rule #2: If one of the classes is NO_CLASS, the resulting class is
5078      the other class.  */
5079   if (class1 == X86_64_NO_CLASS)
5080     return class2;
5081   if (class2 == X86_64_NO_CLASS)
5082     return class1;
5083
5084   /* Rule #3: If one of the classes is MEMORY, the result is MEMORY.  */
5085   if (class1 == X86_64_MEMORY_CLASS || class2 == X86_64_MEMORY_CLASS)
5086     return X86_64_MEMORY_CLASS;
5087
5088   /* Rule #4: If one of the classes is INTEGER, the result is INTEGER.  */
5089   if ((class1 == X86_64_INTEGERSI_CLASS && class2 == X86_64_SSESF_CLASS)
5090       || (class2 == X86_64_INTEGERSI_CLASS && class1 == X86_64_SSESF_CLASS))
5091     return X86_64_INTEGERSI_CLASS;
5092   if (class1 == X86_64_INTEGER_CLASS || class1 == X86_64_INTEGERSI_CLASS
5093       || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS)
5094     return X86_64_INTEGER_CLASS;
5095
5096   /* Rule #5: If one of the classes is X87, X87UP, or COMPLEX_X87 class,
5097      MEMORY is used.  */
5098   if (class1 == X86_64_X87_CLASS
5099       || class1 == X86_64_X87UP_CLASS
5100       || class1 == X86_64_COMPLEX_X87_CLASS
5101       || class2 == X86_64_X87_CLASS
5102       || class2 == X86_64_X87UP_CLASS
5103       || class2 == X86_64_COMPLEX_X87_CLASS)
5104     return X86_64_MEMORY_CLASS;
5105
5106   /* Rule #6: Otherwise class SSE is used.  */
5107   return X86_64_SSE_CLASS;
5108 }
5109
5110 /* Classify the argument of type TYPE and mode MODE.
5111    CLASSES will be filled by the register class used to pass each word
5112    of the operand.  The number of words is returned.  In case the parameter
5113    should be passed in memory, 0 is returned. As a special case for zero
5114    sized containers, classes[0] will be NO_CLASS and 1 is returned.
5115
5116    BIT_OFFSET is used internally for handling records and specifies offset
5117    of the offset in bits modulo 256 to avoid overflow cases.
5118
5119    See the x86-64 PS ABI for details.
5120 */
5121
5122 static int
5123 classify_argument (enum machine_mode mode, const_tree type,
5124                    enum x86_64_reg_class classes[MAX_CLASSES], int bit_offset)
5125 {
5126   HOST_WIDE_INT bytes =
5127     (mode == BLKmode) ? int_size_in_bytes (type) : (int) GET_MODE_SIZE (mode);
5128   int words = (bytes + (bit_offset % 64) / 8 + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
5129
5130   /* Variable sized entities are always passed/returned in memory.  */
5131   if (bytes < 0)
5132     return 0;
5133
5134   if (mode != VOIDmode
5135       && targetm.calls.must_pass_in_stack (mode, type))
5136     return 0;
5137
5138   if (type && AGGREGATE_TYPE_P (type))
5139     {
5140       int i;
5141       tree field;
5142       enum x86_64_reg_class subclasses[MAX_CLASSES];
5143
5144       /* On x86-64 we pass structures larger than 32 bytes on the stack.  */
5145       if (bytes > 32)
5146         return 0;
5147
5148       for (i = 0; i < words; i++)
5149         classes[i] = X86_64_NO_CLASS;
5150
5151       /* Zero sized arrays or structures are NO_CLASS.  We return 0 to
5152          signalize memory class, so handle it as special case.  */
5153       if (!words)
5154         {
5155           classes[0] = X86_64_NO_CLASS;
5156           return 1;
5157         }
5158
5159       /* Classify each field of record and merge classes.  */
5160       switch (TREE_CODE (type))
5161         {
5162         case RECORD_TYPE:
5163           /* And now merge the fields of structure.  */
5164           for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
5165             {
5166               if (TREE_CODE (field) == FIELD_DECL)
5167                 {
5168                   int num;
5169
5170                   if (TREE_TYPE (field) == error_mark_node)
5171                     continue;
5172
5173                   /* Bitfields are always classified as integer.  Handle them
5174                      early, since later code would consider them to be
5175                      misaligned integers.  */
5176                   if (DECL_BIT_FIELD (field))
5177                     {
5178                       for (i = (int_bit_position (field) + (bit_offset % 64)) / 8 / 8;
5179                            i < ((int_bit_position (field) + (bit_offset % 64))
5180                                 + tree_low_cst (DECL_SIZE (field), 0)
5181                                 + 63) / 8 / 8; i++)
5182                         classes[i] =
5183                           merge_classes (X86_64_INTEGER_CLASS,
5184                                          classes[i]);
5185                     }
5186                   else
5187                     {
5188                       int pos;
5189
5190                       type = TREE_TYPE (field);
5191
5192                       /* Flexible array member is ignored.  */
5193                       if (TYPE_MODE (type) == BLKmode
5194                           && TREE_CODE (type) == ARRAY_TYPE
5195                           && TYPE_SIZE (type) == NULL_TREE
5196                           && TYPE_DOMAIN (type) != NULL_TREE
5197                           && (TYPE_MAX_VALUE (TYPE_DOMAIN (type))
5198                               == NULL_TREE))
5199                         {
5200                           static bool warned;
5201                           
5202                           if (!warned && warn_psabi)
5203                             {
5204                               warned = true;
5205                               inform (input_location,
5206                                       "The ABI of passing struct with"
5207                                       " a flexible array member has"
5208                                       " changed in GCC 4.4");
5209                             }
5210                           continue;
5211                         }
5212                       num = classify_argument (TYPE_MODE (type), type,
5213                                                subclasses,
5214                                                (int_bit_position (field)
5215                                                 + bit_offset) % 256);
5216                       if (!num)
5217                         return 0;
5218                       pos = (int_bit_position (field) + (bit_offset % 64)) / 8 / 8;
5219                       for (i = 0; i < num && (i + pos) < words; i++)
5220                         classes[i + pos] =
5221                           merge_classes (subclasses[i], classes[i + pos]);
5222                     }
5223                 }
5224             }
5225           break;
5226
5227         case ARRAY_TYPE:
5228           /* Arrays are handled as small records.  */
5229           {
5230             int num;
5231             num = classify_argument (TYPE_MODE (TREE_TYPE (type)),
5232                                      TREE_TYPE (type), subclasses, bit_offset);
5233             if (!num)
5234               return 0;
5235
5236             /* The partial classes are now full classes.  */
5237             if (subclasses[0] == X86_64_SSESF_CLASS && bytes != 4)
5238               subclasses[0] = X86_64_SSE_CLASS;
5239             if (subclasses[0] == X86_64_INTEGERSI_CLASS
5240                 && !((bit_offset % 64) == 0 && bytes == 4))
5241               subclasses[0] = X86_64_INTEGER_CLASS;
5242
5243             for (i = 0; i < words; i++)
5244               classes[i] = subclasses[i % num];
5245
5246             break;
5247           }
5248         case UNION_TYPE:
5249         case QUAL_UNION_TYPE:
5250           /* Unions are similar to RECORD_TYPE but offset is always 0.
5251              */
5252           for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
5253             {
5254               if (TREE_CODE (field) == FIELD_DECL)
5255                 {
5256                   int num;
5257
5258                   if (TREE_TYPE (field) == error_mark_node)
5259                     continue;
5260
5261                   num = classify_argument (TYPE_MODE (TREE_TYPE (field)),
5262                                            TREE_TYPE (field), subclasses,
5263                                            bit_offset);
5264                   if (!num)
5265                     return 0;
5266                   for (i = 0; i < num; i++)
5267                     classes[i] = merge_classes (subclasses[i], classes[i]);
5268                 }
5269             }
5270           break;
5271
5272         default:
5273           gcc_unreachable ();
5274         }
5275
5276       if (words > 2)
5277         {
5278           /* When size > 16 bytes, if the first one isn't
5279              X86_64_SSE_CLASS or any other ones aren't
5280              X86_64_SSEUP_CLASS, everything should be passed in
5281              memory.  */
5282           if (classes[0] != X86_64_SSE_CLASS)
5283               return 0;
5284
5285           for (i = 1; i < words; i++)
5286             if (classes[i] != X86_64_SSEUP_CLASS)
5287               return 0;
5288         }
5289
5290       /* Final merger cleanup.  */
5291       for (i = 0; i < words; i++)
5292         {
5293           /* If one class is MEMORY, everything should be passed in
5294              memory.  */
5295           if (classes[i] == X86_64_MEMORY_CLASS)
5296             return 0;
5297
5298           /* The X86_64_SSEUP_CLASS should be always preceded by
5299              X86_64_SSE_CLASS or X86_64_SSEUP_CLASS.  */
5300           if (classes[i] == X86_64_SSEUP_CLASS
5301               && classes[i - 1] != X86_64_SSE_CLASS
5302               && classes[i - 1] != X86_64_SSEUP_CLASS)
5303             {
5304               /* The first one should never be X86_64_SSEUP_CLASS.  */
5305               gcc_assert (i != 0);
5306               classes[i] = X86_64_SSE_CLASS;
5307             }
5308
5309           /*  If X86_64_X87UP_CLASS isn't preceded by X86_64_X87_CLASS,
5310                everything should be passed in memory.  */
5311           if (classes[i] == X86_64_X87UP_CLASS
5312               && (classes[i - 1] != X86_64_X87_CLASS))
5313             {
5314               static bool warned;
5315
5316               /* The first one should never be X86_64_X87UP_CLASS.  */
5317               gcc_assert (i != 0);
5318               if (!warned && warn_psabi)
5319                 {
5320                   warned = true;
5321                   inform (input_location,
5322                           "The ABI of passing union with long double"
5323                           " has changed in GCC 4.4");
5324                 }
5325               return 0;
5326             }
5327         }
5328       return words;
5329     }
5330
5331   /* Compute alignment needed.  We align all types to natural boundaries with
5332      exception of XFmode that is aligned to 64bits.  */
5333   if (mode != VOIDmode && mode != BLKmode)
5334     {
5335       int mode_alignment = GET_MODE_BITSIZE (mode);
5336
5337       if (mode == XFmode)
5338         mode_alignment = 128;
5339       else if (mode == XCmode)
5340         mode_alignment = 256;
5341       if (COMPLEX_MODE_P (mode))
5342         mode_alignment /= 2;
5343       /* Misaligned fields are always returned in memory.  */
5344       if (bit_offset % mode_alignment)
5345         return 0;
5346     }
5347
5348   /* for V1xx modes, just use the base mode */
5349   if (VECTOR_MODE_P (mode) && mode != V1DImode && mode != V1TImode
5350       && GET_MODE_SIZE (GET_MODE_INNER (mode)) == bytes)
5351     mode = GET_MODE_INNER (mode);
5352
5353   /* Classification of atomic types.  */
5354   switch (mode)
5355     {
5356     case SDmode:
5357     case DDmode:
5358       classes[0] = X86_64_SSE_CLASS;
5359       return 1;
5360     case TDmode:
5361       classes[0] = X86_64_SSE_CLASS;
5362       classes[1] = X86_64_SSEUP_CLASS;
5363       return 2;
5364     case DImode:
5365     case SImode:
5366     case HImode:
5367     case QImode:
5368     case CSImode:
5369     case CHImode:
5370     case CQImode:
5371       {
5372         int size = (bit_offset % 64)+ (int) GET_MODE_BITSIZE (mode);
5373
5374         if (size <= 32)
5375           {
5376             classes[0] = X86_64_INTEGERSI_CLASS;
5377             return 1;
5378           }
5379         else if (size <= 64)
5380           {
5381             classes[0] = X86_64_INTEGER_CLASS;
5382             return 1;
5383           }
5384         else if (size <= 64+32)
5385           {
5386             classes[0] = X86_64_INTEGER_CLASS;
5387             classes[1] = X86_64_INTEGERSI_CLASS;
5388             return 2;
5389           }
5390         else if (size <= 64+64)
5391           {
5392             classes[0] = classes[1] = X86_64_INTEGER_CLASS;
5393             return 2;
5394           }
5395         else
5396           gcc_unreachable ();
5397       }
5398     case CDImode:
5399     case TImode:
5400       classes[0] = classes[1] = X86_64_INTEGER_CLASS;
5401       return 2;
5402     case COImode:
5403     case OImode:
5404       /* OImode shouldn't be used directly.  */
5405       gcc_unreachable ();
5406     case CTImode:
5407       return 0;
5408     case SFmode:
5409       if (!(bit_offset % 64))
5410         classes[0] = X86_64_SSESF_CLASS;
5411       else
5412         classes[0] = X86_64_SSE_CLASS;
5413       return 1;
5414     case DFmode:
5415       classes[0] = X86_64_SSEDF_CLASS;
5416       return 1;
5417     case XFmode:
5418       classes[0] = X86_64_X87_CLASS;
5419       classes[1] = X86_64_X87UP_CLASS;
5420       return 2;
5421     case TFmode:
5422       classes[0] = X86_64_SSE_CLASS;
5423       classes[1] = X86_64_SSEUP_CLASS;
5424       return 2;
5425     case SCmode:
5426       classes[0] = X86_64_SSE_CLASS;
5427       if (!(bit_offset % 64))
5428         return 1;
5429       else
5430         {
5431           static bool warned;
5432
5433           if (!warned && warn_psabi)
5434             {
5435               warned = true;
5436               inform (input_location,
5437                       "The ABI of passing structure with complex float"
5438                       " member has changed in GCC 4.4");
5439             }
5440           classes[1] = X86_64_SSESF_CLASS;
5441           return 2;
5442         }
5443     case DCmode:
5444       classes[0] = X86_64_SSEDF_CLASS;
5445       classes[1] = X86_64_SSEDF_CLASS;
5446       return 2;
5447     case XCmode:
5448       classes[0] = X86_64_COMPLEX_X87_CLASS;
5449       return 1;
5450     case TCmode:
5451       /* This modes is larger than 16 bytes.  */
5452       return 0;
5453     case V8SFmode:
5454     case V8SImode:
5455     case V32QImode:
5456     case V16HImode:
5457     case V4DFmode:
5458     case V4DImode:
5459       classes[0] = X86_64_SSE_CLASS;
5460       classes[1] = X86_64_SSEUP_CLASS;
5461       classes[2] = X86_64_SSEUP_CLASS;
5462       classes[3] = X86_64_SSEUP_CLASS;
5463       return 4;
5464     case V4SFmode:
5465     case V4SImode:
5466     case V16QImode:
5467     case V8HImode:
5468     case V2DFmode:
5469     case V2DImode:
5470       classes[0] = X86_64_SSE_CLASS;
5471       classes[1] = X86_64_SSEUP_CLASS;
5472       return 2;
5473     case V1TImode:
5474     case V1DImode:
5475     case V2SFmode:
5476     case V2SImode:
5477     case V4HImode:
5478     case V8QImode:
5479       classes[0] = X86_64_SSE_CLASS;
5480       return 1;
5481     case BLKmode:
5482     case VOIDmode:
5483       return 0;
5484     default:
5485       gcc_assert (VECTOR_MODE_P (mode));
5486
5487       if (bytes > 16)
5488         return 0;
5489
5490       gcc_assert (GET_MODE_CLASS (GET_MODE_INNER (mode)) == MODE_INT);
5491
5492       if (bit_offset + GET_MODE_BITSIZE (mode) <= 32)
5493         classes[0] = X86_64_INTEGERSI_CLASS;
5494       else
5495         classes[0] = X86_64_INTEGER_CLASS;
5496       classes[1] = X86_64_INTEGER_CLASS;
5497       return 1 + (bytes > 8);
5498     }
5499 }
5500
5501 /* Examine the argument and return set number of register required in each
5502    class.  Return 0 iff parameter should be passed in memory.  */
5503 static int
5504 examine_argument (enum machine_mode mode, const_tree type, int in_return,
5505                   int *int_nregs, int *sse_nregs)
5506 {
5507   enum x86_64_reg_class regclass[MAX_CLASSES];
5508   int n = classify_argument (mode, type, regclass, 0);
5509
5510   *int_nregs = 0;
5511   *sse_nregs = 0;
5512   if (!n)
5513     return 0;
5514   for (n--; n >= 0; n--)
5515     switch (regclass[n])
5516       {
5517       case X86_64_INTEGER_CLASS:
5518       case X86_64_INTEGERSI_CLASS:
5519         (*int_nregs)++;
5520         break;
5521       case X86_64_SSE_CLASS:
5522       case X86_64_SSESF_CLASS:
5523       case X86_64_SSEDF_CLASS:
5524         (*sse_nregs)++;
5525         break;
5526       case X86_64_NO_CLASS:
5527       case X86_64_SSEUP_CLASS:
5528         break;
5529       case X86_64_X87_CLASS:
5530       case X86_64_X87UP_CLASS:
5531         if (!in_return)
5532           return 0;
5533         break;
5534       case X86_64_COMPLEX_X87_CLASS:
5535         return in_return ? 2 : 0;
5536       case X86_64_MEMORY_CLASS:
5537         gcc_unreachable ();
5538       }
5539   return 1;
5540 }
5541
5542 /* Construct container for the argument used by GCC interface.  See
5543    FUNCTION_ARG for the detailed description.  */
5544
5545 static rtx
5546 construct_container (enum machine_mode mode, enum machine_mode orig_mode,
5547                      const_tree type, int in_return, int nintregs, int nsseregs,
5548                      const int *intreg, int sse_regno)
5549 {
5550   /* The following variables hold the static issued_error state.  */
5551   static bool issued_sse_arg_error;
5552   static bool issued_sse_ret_error;
5553   static bool issued_x87_ret_error;
5554
5555   enum machine_mode tmpmode;
5556   int bytes =
5557     (mode == BLKmode) ? int_size_in_bytes (type) : (int) GET_MODE_SIZE (mode);
5558   enum x86_64_reg_class regclass[MAX_CLASSES];
5559   int n;
5560   int i;
5561   int nexps = 0;
5562   int needed_sseregs, needed_intregs;
5563   rtx exp[MAX_CLASSES];
5564   rtx ret;
5565
5566   n = classify_argument (mode, type, regclass, 0);
5567   if (!n)
5568     return NULL;
5569   if (!examine_argument (mode, type, in_return, &needed_intregs,
5570                          &needed_sseregs))
5571     return NULL;
5572   if (needed_intregs > nintregs || needed_sseregs > nsseregs)
5573     return NULL;
5574
5575   /* We allowed the user to turn off SSE for kernel mode.  Don't crash if
5576      some less clueful developer tries to use floating-point anyway.  */
5577   if (needed_sseregs && !TARGET_SSE)
5578     {
5579       if (in_return)
5580         {
5581           if (!issued_sse_ret_error)
5582             {
5583               error ("SSE register return with SSE disabled");
5584               issued_sse_ret_error = true;
5585             }
5586         }
5587       else if (!issued_sse_arg_error)
5588         {
5589           error ("SSE register argument with SSE disabled");
5590           issued_sse_arg_error = true;
5591         }
5592       return NULL;
5593     }
5594
5595   /* Likewise, error if the ABI requires us to return values in the
5596      x87 registers and the user specified -mno-80387.  */
5597   if (!TARGET_80387 && in_return)
5598     for (i = 0; i < n; i++)
5599       if (regclass[i] == X86_64_X87_CLASS
5600           || regclass[i] == X86_64_X87UP_CLASS
5601           || regclass[i] == X86_64_COMPLEX_X87_CLASS)
5602         {
5603           if (!issued_x87_ret_error)
5604             {
5605               error ("x87 register return with x87 disabled");
5606               issued_x87_ret_error = true;
5607             }
5608           return NULL;
5609         }
5610
5611   /* First construct simple cases.  Avoid SCmode, since we want to use
5612      single register to pass this type.  */
5613   if (n == 1 && mode != SCmode)
5614     switch (regclass[0])
5615       {
5616       case X86_64_INTEGER_CLASS:
5617       case X86_64_INTEGERSI_CLASS:
5618         return gen_rtx_REG (mode, intreg[0]);
5619       case X86_64_SSE_CLASS:
5620       case X86_64_SSESF_CLASS:
5621       case X86_64_SSEDF_CLASS:
5622         if (mode != BLKmode)
5623           return gen_reg_or_parallel (mode, orig_mode, 
5624                                       SSE_REGNO (sse_regno));
5625         break;
5626       case X86_64_X87_CLASS:
5627       case X86_64_COMPLEX_X87_CLASS:
5628         return gen_rtx_REG (mode, FIRST_STACK_REG);
5629       case X86_64_NO_CLASS:
5630         /* Zero sized array, struct or class.  */
5631         return NULL;
5632       default:
5633         gcc_unreachable ();
5634       }
5635   if (n == 2 && regclass[0] == X86_64_SSE_CLASS
5636       && regclass[1] == X86_64_SSEUP_CLASS && mode != BLKmode)
5637     return gen_rtx_REG (mode, SSE_REGNO (sse_regno));
5638   if (n == 4
5639       && regclass[0] == X86_64_SSE_CLASS
5640       && regclass[1] == X86_64_SSEUP_CLASS
5641       && regclass[2] == X86_64_SSEUP_CLASS
5642       && regclass[3] == X86_64_SSEUP_CLASS
5643       && mode != BLKmode)
5644     return gen_rtx_REG (mode, SSE_REGNO (sse_regno));
5645
5646   if (n == 2
5647       && regclass[0] == X86_64_X87_CLASS && regclass[1] == X86_64_X87UP_CLASS)
5648     return gen_rtx_REG (XFmode, FIRST_STACK_REG);
5649   if (n == 2 && regclass[0] == X86_64_INTEGER_CLASS
5650       && regclass[1] == X86_64_INTEGER_CLASS
5651       && (mode == CDImode || mode == TImode || mode == TFmode)
5652       && intreg[0] + 1 == intreg[1])
5653     return gen_rtx_REG (mode, intreg[0]);
5654
5655   /* Otherwise figure out the entries of the PARALLEL.  */
5656   for (i = 0; i < n; i++)
5657     {
5658       int pos;
5659
5660       switch (regclass[i])
5661         {
5662           case X86_64_NO_CLASS:
5663             break;
5664           case X86_64_INTEGER_CLASS:
5665           case X86_64_INTEGERSI_CLASS:
5666             /* Merge TImodes on aligned occasions here too.  */
5667             if (i * 8 + 8 > bytes)
5668               tmpmode = mode_for_size ((bytes - i * 8) * BITS_PER_UNIT, MODE_INT, 0);
5669             else if (regclass[i] == X86_64_INTEGERSI_CLASS)
5670               tmpmode = SImode;
5671             else
5672               tmpmode = DImode;
5673             /* We've requested 24 bytes we don't have mode for.  Use DImode.  */
5674             if (tmpmode == BLKmode)
5675               tmpmode = DImode;
5676             exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
5677                                                gen_rtx_REG (tmpmode, *intreg),
5678                                                GEN_INT (i*8));
5679             intreg++;
5680             break;
5681           case X86_64_SSESF_CLASS:
5682             exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
5683                                                gen_rtx_REG (SFmode,
5684                                                             SSE_REGNO (sse_regno)),
5685                                                GEN_INT (i*8));
5686             sse_regno++;
5687             break;
5688           case X86_64_SSEDF_CLASS:
5689             exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
5690                                                gen_rtx_REG (DFmode,
5691                                                             SSE_REGNO (sse_regno)),
5692                                                GEN_INT (i*8));
5693             sse_regno++;
5694             break;
5695           case X86_64_SSE_CLASS:
5696             pos = i;
5697             switch (n)
5698               {
5699               case 1:
5700                 tmpmode = DImode;
5701                 break;
5702               case 2:
5703                 if (i == 0 && regclass[1] == X86_64_SSEUP_CLASS)
5704                   {
5705                     tmpmode = TImode;
5706                     i++;
5707                   }
5708                 else
5709                   tmpmode = DImode;
5710                 break;
5711               case 4:
5712                 gcc_assert (i == 0
5713                             && regclass[1] == X86_64_SSEUP_CLASS
5714                             && regclass[2] == X86_64_SSEUP_CLASS
5715                             && regclass[3] == X86_64_SSEUP_CLASS);
5716                 tmpmode = OImode;
5717                 i += 3;
5718                 break;
5719               default:
5720                 gcc_unreachable ();
5721               }
5722             exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
5723                                                gen_rtx_REG (tmpmode,
5724                                                             SSE_REGNO (sse_regno)),
5725                                                GEN_INT (pos*8));
5726             sse_regno++;
5727             break;
5728           default:
5729             gcc_unreachable ();
5730         }
5731     }
5732
5733   /* Empty aligned struct, union or class.  */
5734   if (nexps == 0)
5735     return NULL;
5736
5737   ret =  gen_rtx_PARALLEL (mode, rtvec_alloc (nexps));
5738   for (i = 0; i < nexps; i++)
5739     XVECEXP (ret, 0, i) = exp [i];
5740   return ret;
5741 }
5742
5743 /* Update the data in CUM to advance over an argument of mode MODE
5744    and data type TYPE.  (TYPE is null for libcalls where that information
5745    may not be available.)  */
5746
5747 static void
5748 function_arg_advance_32 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5749                          tree type, HOST_WIDE_INT bytes, HOST_WIDE_INT words)
5750 {
5751   switch (mode)
5752     {
5753     default:
5754       break;
5755
5756     case BLKmode:
5757       if (bytes < 0)
5758         break;
5759       /* FALLTHRU */
5760
5761     case DImode:
5762     case SImode:
5763     case HImode:
5764     case QImode:
5765       cum->words += words;
5766       cum->nregs -= words;
5767       cum->regno += words;
5768
5769       if (cum->nregs <= 0)
5770         {
5771           cum->nregs = 0;
5772           cum->regno = 0;
5773         }
5774       break;
5775
5776     case OImode:
5777       /* OImode shouldn't be used directly.  */
5778       gcc_unreachable ();
5779
5780     case DFmode:
5781       if (cum->float_in_sse < 2)
5782         break;
5783     case SFmode:
5784       if (cum->float_in_sse < 1)
5785         break;
5786       /* FALLTHRU */
5787
5788     case V8SFmode:
5789     case V8SImode:
5790     case V32QImode:
5791     case V16HImode:
5792     case V4DFmode:
5793     case V4DImode:
5794     case TImode:
5795     case V16QImode:
5796     case V8HImode:
5797     case V4SImode:
5798     case V2DImode:
5799     case V4SFmode:
5800     case V2DFmode:
5801       if (!type || !AGGREGATE_TYPE_P (type))
5802         {
5803           cum->sse_words += words;
5804           cum->sse_nregs -= 1;
5805           cum->sse_regno += 1;
5806           if (cum->sse_nregs <= 0)
5807             {
5808               cum->sse_nregs = 0;
5809               cum->sse_regno = 0;
5810             }
5811         }
5812       break;
5813
5814     case V8QImode:
5815     case V4HImode:
5816     case V2SImode:
5817     case V2SFmode:
5818     case V1TImode:
5819     case V1DImode:
5820       if (!type || !AGGREGATE_TYPE_P (type))
5821         {
5822           cum->mmx_words += words;
5823           cum->mmx_nregs -= 1;
5824           cum->mmx_regno += 1;
5825           if (cum->mmx_nregs <= 0)
5826             {
5827               cum->mmx_nregs = 0;
5828               cum->mmx_regno = 0;
5829             }
5830         }
5831       break;
5832     }
5833 }
5834
5835 static void
5836 function_arg_advance_64 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5837                          tree type, HOST_WIDE_INT words, int named)
5838 {
5839   int int_nregs, sse_nregs;
5840
5841   /* Unnamed 256bit vector mode parameters are passed on stack.  */
5842   if (!named && VALID_AVX256_REG_MODE (mode))
5843     return;
5844
5845   if (!examine_argument (mode, type, 0, &int_nregs, &sse_nregs))
5846     cum->words += words;
5847   else if (sse_nregs <= cum->sse_nregs && int_nregs <= cum->nregs)
5848     {
5849       cum->nregs -= int_nregs;
5850       cum->sse_nregs -= sse_nregs;
5851       cum->regno += int_nregs;
5852       cum->sse_regno += sse_nregs;
5853     }
5854   else
5855     cum->words += words;
5856 }
5857
5858 static void
5859 function_arg_advance_ms_64 (CUMULATIVE_ARGS *cum, HOST_WIDE_INT bytes,
5860                             HOST_WIDE_INT words)
5861 {
5862   /* Otherwise, this should be passed indirect.  */
5863   gcc_assert (bytes == 1 || bytes == 2 || bytes == 4 || bytes == 8);
5864
5865   cum->words += words;
5866   if (cum->nregs > 0)
5867     {
5868       cum->nregs -= 1;
5869       cum->regno += 1;
5870     }
5871 }
5872
5873 void
5874 function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5875                       tree type, int named)
5876 {
5877   HOST_WIDE_INT bytes, words;
5878
5879   if (mode == BLKmode)
5880     bytes = int_size_in_bytes (type);
5881   else
5882     bytes = GET_MODE_SIZE (mode);
5883   words = (bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
5884
5885   if (type)
5886     mode = type_natural_mode (type, NULL);
5887
5888   if (TARGET_64BIT && (cum ? cum->call_abi : ix86_abi) == MS_ABI)
5889     function_arg_advance_ms_64 (cum, bytes, words);
5890   else if (TARGET_64BIT)
5891     function_arg_advance_64 (cum, mode, type, words, named);
5892   else
5893     function_arg_advance_32 (cum, mode, type, bytes, words);
5894 }
5895
5896 /* Define where to put the arguments to a function.
5897    Value is zero to push the argument on the stack,
5898    or a hard register in which to store the argument.
5899
5900    MODE is the argument's machine mode.
5901    TYPE is the data type of the argument (as a tree).
5902     This is null for libcalls where that information may
5903     not be available.
5904    CUM is a variable of type CUMULATIVE_ARGS which gives info about
5905     the preceding args and about the function being called.
5906    NAMED is nonzero if this argument is a named parameter
5907     (otherwise it is an extra parameter matching an ellipsis).  */
5908
5909 static rtx
5910 function_arg_32 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5911                  enum machine_mode orig_mode, tree type,
5912                  HOST_WIDE_INT bytes, HOST_WIDE_INT words)
5913 {
5914   static bool warnedsse, warnedmmx;
5915
5916   /* Avoid the AL settings for the Unix64 ABI.  */
5917   if (mode == VOIDmode)
5918     return constm1_rtx;
5919
5920   switch (mode)
5921     {
5922     default:
5923       break;
5924
5925     case BLKmode:
5926       if (bytes < 0)
5927         break;
5928       /* FALLTHRU */
5929     case DImode:
5930     case SImode:
5931     case HImode:
5932     case QImode:
5933       if (words <= cum->nregs)
5934         {
5935           int regno = cum->regno;
5936
5937           /* Fastcall allocates the first two DWORD (SImode) or
5938             smaller arguments to ECX and EDX if it isn't an
5939             aggregate type .  */
5940           if (cum->fastcall)
5941             {
5942               if (mode == BLKmode
5943                   || mode == DImode
5944                   || (type && AGGREGATE_TYPE_P (type)))
5945                 break;
5946
5947               /* ECX not EAX is the first allocated register.  */
5948               if (regno == AX_REG)
5949                 regno = CX_REG;
5950             }
5951           return gen_rtx_REG (mode, regno);
5952         }
5953       break;
5954
5955     case DFmode:
5956       if (cum->float_in_sse < 2)
5957         break;
5958     case SFmode:
5959       if (cum->float_in_sse < 1)
5960         break;
5961       /* FALLTHRU */
5962     case TImode:
5963       /* In 32bit, we pass TImode in xmm registers.  */
5964     case V16QImode:
5965     case V8HImode:
5966     case V4SImode:
5967     case V2DImode:
5968     case V4SFmode:
5969     case V2DFmode:
5970       if (!type || !AGGREGATE_TYPE_P (type))
5971         {
5972           if (!TARGET_SSE && !warnedsse && cum->warn_sse)
5973             {
5974               warnedsse = true;
5975               warning (0, "SSE vector argument without SSE enabled "
5976                        "changes the ABI");
5977             }
5978           if (cum->sse_nregs)
5979             return gen_reg_or_parallel (mode, orig_mode,
5980                                         cum->sse_regno + FIRST_SSE_REG);
5981         }
5982       break;
5983
5984     case OImode:
5985       /* OImode shouldn't be used directly.  */
5986       gcc_unreachable ();
5987
5988     case V8SFmode:
5989     case V8SImode:
5990     case V32QImode:
5991     case V16HImode:
5992     case V4DFmode:
5993     case V4DImode:
5994       if (!type || !AGGREGATE_TYPE_P (type))
5995         {
5996           if (cum->sse_nregs)
5997             return gen_reg_or_parallel (mode, orig_mode,
5998                                         cum->sse_regno + FIRST_SSE_REG);
5999         }
6000       break;
6001
6002     case V8QImode:
6003     case V4HImode:
6004     case V2SImode:
6005     case V2SFmode:
6006     case V1TImode:
6007     case V1DImode:
6008       if (!type || !AGGREGATE_TYPE_P (type))
6009         {
6010           if (!TARGET_MMX && !warnedmmx && cum->warn_mmx)
6011             {
6012               warnedmmx = true;
6013               warning (0, "MMX vector argument without MMX enabled "
6014                        "changes the ABI");
6015             }
6016           if (cum->mmx_nregs)
6017             return gen_reg_or_parallel (mode, orig_mode,
6018                                         cum->mmx_regno + FIRST_MMX_REG);
6019         }
6020       break;
6021     }
6022
6023   return NULL_RTX;
6024 }
6025
6026 static rtx
6027 function_arg_64 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
6028                  enum machine_mode orig_mode, tree type, int named)
6029 {
6030   /* Handle a hidden AL argument containing number of registers
6031      for varargs x86-64 functions.  */
6032   if (mode == VOIDmode)
6033     return GEN_INT (cum->maybe_vaarg
6034                     ? (cum->sse_nregs < 0
6035                        ? (cum->call_abi == ix86_abi
6036                           ? SSE_REGPARM_MAX
6037                           : (ix86_abi != SYSV_ABI
6038                              ? X86_64_SSE_REGPARM_MAX
6039                              : X86_64_MS_SSE_REGPARM_MAX))
6040                        : cum->sse_regno)
6041                     : -1);
6042
6043   switch (mode)
6044     {
6045     default:
6046       break;
6047
6048     case V8SFmode:
6049     case V8SImode:
6050     case V32QImode:
6051     case V16HImode:
6052     case V4DFmode:
6053     case V4DImode:
6054       /* Unnamed 256bit vector mode parameters are passed on stack.  */
6055       if (!named)
6056         return NULL;
6057       break;
6058     }
6059
6060   return construct_container (mode, orig_mode, type, 0, cum->nregs,
6061                               cum->sse_nregs,
6062                               &x86_64_int_parameter_registers [cum->regno],
6063                               cum->sse_regno);
6064 }
6065
6066 static rtx
6067 function_arg_ms_64 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
6068                     enum machine_mode orig_mode, int named,
6069                     HOST_WIDE_INT bytes)
6070 {
6071   unsigned int regno;
6072
6073   /* We need to add clobber for MS_ABI->SYSV ABI calls in expand_call.
6074      We use value of -2 to specify that current function call is MSABI.  */
6075   if (mode == VOIDmode)
6076     return GEN_INT (-2);
6077
6078   /* If we've run out of registers, it goes on the stack.  */
6079   if (cum->nregs == 0)
6080     return NULL_RTX;
6081
6082   regno = x86_64_ms_abi_int_parameter_registers[cum->regno];
6083
6084   /* Only floating point modes are passed in anything but integer regs.  */
6085   if (TARGET_SSE && (mode == SFmode || mode == DFmode))
6086     {
6087       if (named)
6088         regno = cum->regno + FIRST_SSE_REG;
6089       else
6090         {
6091           rtx t1, t2;
6092
6093           /* Unnamed floating parameters are passed in both the
6094              SSE and integer registers.  */
6095           t1 = gen_rtx_REG (mode, cum->regno + FIRST_SSE_REG);
6096           t2 = gen_rtx_REG (mode, regno);
6097           t1 = gen_rtx_EXPR_LIST (VOIDmode, t1, const0_rtx);
6098           t2 = gen_rtx_EXPR_LIST (VOIDmode, t2, const0_rtx);
6099           return gen_rtx_PARALLEL (mode, gen_rtvec (2, t1, t2));
6100         }
6101     }
6102   /* Handle aggregated types passed in register.  */
6103   if (orig_mode == BLKmode)
6104     {
6105       if (bytes > 0 && bytes <= 8)
6106         mode = (bytes > 4 ? DImode : SImode);
6107       if (mode == BLKmode)
6108         mode = DImode;
6109     }
6110
6111   return gen_reg_or_parallel (mode, orig_mode, regno);
6112 }
6113
6114 rtx
6115 function_arg (CUMULATIVE_ARGS *cum, enum machine_mode omode,
6116               tree type, int named)
6117 {
6118   enum machine_mode mode = omode;
6119   HOST_WIDE_INT bytes, words;
6120
6121   if (mode == BLKmode)
6122     bytes = int_size_in_bytes (type);
6123   else
6124     bytes = GET_MODE_SIZE (mode);
6125   words = (bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
6126
6127   /* To simplify the code below, represent vector types with a vector mode
6128      even if MMX/SSE are not active.  */
6129   if (type && TREE_CODE (type) == VECTOR_TYPE)
6130     mode = type_natural_mode (type, cum);
6131
6132   if (TARGET_64BIT && (cum ? cum->call_abi : ix86_abi) == MS_ABI)
6133     return function_arg_ms_64 (cum, mode, omode, named, bytes);
6134   else if (TARGET_64BIT)
6135     return function_arg_64 (cum, mode, omode, type, named);
6136   else
6137     return function_arg_32 (cum, mode, omode, type, bytes, words);
6138 }
6139
6140 /* A C expression that indicates when an argument must be passed by
6141    reference.  If nonzero for an argument, a copy of that argument is
6142    made in memory and a pointer to the argument is passed instead of
6143    the argument itself.  The pointer is passed in whatever way is
6144    appropriate for passing a pointer to that type.  */
6145
6146 static bool
6147 ix86_pass_by_reference (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
6148                         enum machine_mode mode ATTRIBUTE_UNUSED,
6149                         const_tree type, bool named ATTRIBUTE_UNUSED)
6150 {
6151   /* See Windows x64 Software Convention.  */
6152   if (TARGET_64BIT && (cum ? cum->call_abi : ix86_abi) == MS_ABI)
6153     {
6154       int msize = (int) GET_MODE_SIZE (mode);
6155       if (type)
6156         {
6157           /* Arrays are passed by reference.  */
6158           if (TREE_CODE (type) == ARRAY_TYPE)
6159             return true;
6160
6161           if (AGGREGATE_TYPE_P (type))
6162             {
6163               /* Structs/unions of sizes other than 8, 16, 32, or 64 bits
6164                  are passed by reference.  */
6165               msize = int_size_in_bytes (type);
6166             }
6167         }
6168
6169       /* __m128 is passed by reference.  */
6170       switch (msize) {
6171       case 1: case 2: case 4: case 8:
6172         break;
6173       default:
6174         return true;
6175       }
6176     }
6177   else if (TARGET_64BIT && type && int_size_in_bytes (type) == -1)
6178     return 1;
6179
6180   return 0;
6181 }
6182
6183 /* Return true when TYPE should be 128bit aligned for 32bit argument passing
6184    ABI.  */
6185 static bool
6186 contains_aligned_value_p (tree type)
6187 {
6188   enum machine_mode mode = TYPE_MODE (type);
6189   if (((TARGET_SSE && SSE_REG_MODE_P (mode))
6190        || mode == TDmode
6191        || mode == TFmode
6192        || mode == TCmode)
6193       && (!TYPE_USER_ALIGN (type) || TYPE_ALIGN (type) > 128))
6194     return true;
6195   if (TYPE_ALIGN (type) < 128)
6196     return false;
6197
6198   if (AGGREGATE_TYPE_P (type))
6199     {
6200       /* Walk the aggregates recursively.  */
6201       switch (TREE_CODE (type))
6202         {
6203         case RECORD_TYPE:
6204         case UNION_TYPE:
6205         case QUAL_UNION_TYPE:
6206           {
6207             tree field;
6208
6209             /* Walk all the structure fields.  */
6210             for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
6211               {
6212                 if (TREE_CODE (field) == FIELD_DECL
6213                     && contains_aligned_value_p (TREE_TYPE (field)))
6214                   return true;
6215               }
6216             break;
6217           }
6218
6219         case ARRAY_TYPE:
6220           /* Just for use if some languages passes arrays by value.  */
6221           if (contains_aligned_value_p (TREE_TYPE (type)))
6222             return true;
6223           break;
6224
6225         default:
6226           gcc_unreachable ();
6227         }
6228     }
6229   return false;
6230 }
6231
6232 /* Gives the alignment boundary, in bits, of an argument with the
6233    specified mode and type.  */
6234
6235 int
6236 ix86_function_arg_boundary (enum machine_mode mode, tree type)
6237 {
6238   int align;
6239   if (type)
6240     {
6241       /* Since canonical type is used for call, we convert it to
6242          canonical type if needed.  */
6243       if (!TYPE_STRUCTURAL_EQUALITY_P (type))
6244         type = TYPE_CANONICAL (type);
6245       align = TYPE_ALIGN (type);
6246     }
6247   else
6248     align = GET_MODE_ALIGNMENT (mode);
6249   if (align < PARM_BOUNDARY)
6250     align = PARM_BOUNDARY;
6251   /* In 32bit, only _Decimal128 and __float128 are aligned to their
6252      natural boundaries.  */
6253   if (!TARGET_64BIT && mode != TDmode && mode != TFmode)
6254     {
6255       /* i386 ABI defines all arguments to be 4 byte aligned.  We have to
6256          make an exception for SSE modes since these require 128bit
6257          alignment.
6258
6259          The handling here differs from field_alignment.  ICC aligns MMX
6260          arguments to 4 byte boundaries, while structure fields are aligned
6261          to 8 byte boundaries.  */
6262       if (!type)
6263         {
6264           if (!(TARGET_SSE && SSE_REG_MODE_P (mode)))
6265             align = PARM_BOUNDARY;
6266         }
6267       else
6268         {
6269           if (!contains_aligned_value_p (type))
6270             align = PARM_BOUNDARY;
6271         }
6272     }
6273   if (align > BIGGEST_ALIGNMENT)
6274     align = BIGGEST_ALIGNMENT;
6275   return align;
6276 }
6277
6278 /* Return true if N is a possible register number of function value.  */
6279
6280 bool
6281 ix86_function_value_regno_p (int regno)
6282 {
6283   switch (regno)
6284     {
6285     case 0:
6286       return true;
6287
6288     case FIRST_FLOAT_REG:
6289       /* TODO: The function should depend on current function ABI but
6290        builtins.c would need updating then. Therefore we use the
6291        default ABI.  */
6292       if (TARGET_64BIT && ix86_abi == MS_ABI)
6293         return false;
6294       return TARGET_FLOAT_RETURNS_IN_80387;
6295
6296     case FIRST_SSE_REG:
6297       return TARGET_SSE;
6298
6299     case FIRST_MMX_REG:
6300       if (TARGET_MACHO || TARGET_64BIT)
6301         return false;
6302       return TARGET_MMX;
6303     }
6304
6305   return false;
6306 }
6307
6308 /* Define how to find the value returned by a function.
6309    VALTYPE is the data type of the value (as a tree).
6310    If the precise function being called is known, FUNC is its FUNCTION_DECL;
6311    otherwise, FUNC is 0.  */
6312
6313 static rtx
6314 function_value_32 (enum machine_mode orig_mode, enum machine_mode mode,
6315                    const_tree fntype, const_tree fn)
6316 {
6317   unsigned int regno;
6318
6319   /* 8-byte vector modes in %mm0. See ix86_return_in_memory for where
6320      we normally prevent this case when mmx is not available.  However
6321      some ABIs may require the result to be returned like DImode.  */
6322   if (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 8)
6323     regno = TARGET_MMX ? FIRST_MMX_REG : 0;
6324
6325   /* 16-byte vector modes in %xmm0.  See ix86_return_in_memory for where
6326      we prevent this case when sse is not available.  However some ABIs
6327      may require the result to be returned like integer TImode.  */
6328   else if (mode == TImode
6329            || (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 16))
6330     regno = TARGET_SSE ? FIRST_SSE_REG : 0;
6331
6332   /* 32-byte vector modes in %ymm0.   */
6333   else if (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 32)
6334     regno = TARGET_AVX ? FIRST_SSE_REG : 0;
6335
6336   /* Floating point return values in %st(0) (unless -mno-fp-ret-in-387).  */
6337   else if (X87_FLOAT_MODE_P (mode) && TARGET_FLOAT_RETURNS_IN_80387)
6338     regno = FIRST_FLOAT_REG;
6339   else
6340     /* Most things go in %eax.  */
6341     regno = AX_REG;
6342
6343   /* Override FP return register with %xmm0 for local functions when
6344      SSE math is enabled or for functions with sseregparm attribute.  */
6345   if ((fn || fntype) && (mode == SFmode || mode == DFmode))
6346     {
6347       int sse_level = ix86_function_sseregparm (fntype, fn, false);
6348       if ((sse_level >= 1 && mode == SFmode)
6349           || (sse_level == 2 && mode == DFmode))
6350         regno = FIRST_SSE_REG;
6351     }
6352
6353   /* OImode shouldn't be used directly.  */
6354   gcc_assert (mode != OImode);
6355
6356   return gen_rtx_REG (orig_mode, regno);
6357 }
6358
6359 static rtx
6360 function_value_64 (enum machine_mode orig_mode, enum machine_mode mode,
6361                    const_tree valtype)
6362 {
6363   rtx ret;
6364
6365   /* Handle libcalls, which don't provide a type node.  */
6366   if (valtype == NULL)
6367     {
6368       switch (mode)
6369         {
6370         case SFmode:
6371         case SCmode:
6372         case DFmode:
6373         case DCmode:
6374         case TFmode:
6375         case SDmode:
6376         case DDmode:
6377         case TDmode:
6378           return gen_rtx_REG (mode, FIRST_SSE_REG);
6379         case XFmode:
6380         case XCmode:
6381           return gen_rtx_REG (mode, FIRST_FLOAT_REG);
6382         case TCmode:
6383           return NULL;
6384         default:
6385           return gen_rtx_REG (mode, AX_REG);
6386         }
6387     }
6388
6389   ret = construct_container (mode, orig_mode, valtype, 1,
6390                              X86_64_REGPARM_MAX, X86_64_SSE_REGPARM_MAX,
6391                              x86_64_int_return_registers, 0);
6392
6393   /* For zero sized structures, construct_container returns NULL, but we
6394      need to keep rest of compiler happy by returning meaningful value.  */
6395   if (!ret)
6396     ret = gen_rtx_REG (orig_mode, AX_REG);
6397
6398   return ret;
6399 }
6400
6401 static rtx
6402 function_value_ms_64 (enum machine_mode orig_mode, enum machine_mode mode)
6403 {
6404   unsigned int regno = AX_REG;
6405
6406   if (TARGET_SSE)
6407     {
6408       switch (GET_MODE_SIZE (mode))
6409         {
6410         case 16:
6411           if((SCALAR_INT_MODE_P (mode) || VECTOR_MODE_P (mode))
6412              && !COMPLEX_MODE_P (mode))
6413             regno = FIRST_SSE_REG;
6414           break;
6415         case 8:
6416         case 4:
6417           if (mode == SFmode || mode == DFmode)
6418             regno = FIRST_SSE_REG;
6419           break;
6420         default:
6421           break;
6422         }
6423     }
6424   return gen_rtx_REG (orig_mode, regno);
6425 }
6426
6427 static rtx
6428 ix86_function_value_1 (const_tree valtype, const_tree fntype_or_decl,
6429                        enum machine_mode orig_mode, enum machine_mode mode)
6430 {
6431   const_tree fn, fntype;
6432
6433   fn = NULL_TREE;
6434   if (fntype_or_decl && DECL_P (fntype_or_decl))
6435     fn = fntype_or_decl;
6436   fntype = fn ? TREE_TYPE (fn) : fntype_or_decl;
6437
6438   if (TARGET_64BIT && ix86_function_type_abi (fntype) == MS_ABI)
6439     return function_value_ms_64 (orig_mode, mode);
6440   else if (TARGET_64BIT)
6441     return function_value_64 (orig_mode, mode, valtype);
6442   else
6443     return function_value_32 (orig_mode, mode, fntype, fn);
6444 }
6445
6446 static rtx
6447 ix86_function_value (const_tree valtype, const_tree fntype_or_decl,
6448                      bool outgoing ATTRIBUTE_UNUSED)
6449 {
6450   enum machine_mode mode, orig_mode;
6451
6452   orig_mode = TYPE_MODE (valtype);
6453   mode = type_natural_mode (valtype, NULL);
6454   return ix86_function_value_1 (valtype, fntype_or_decl, orig_mode, mode);
6455 }
6456
6457 rtx
6458 ix86_libcall_value (enum machine_mode mode)
6459 {
6460   return ix86_function_value_1 (NULL, NULL, mode, mode);
6461 }
6462
6463 /* Return true iff type is returned in memory.  */
6464
6465 static int ATTRIBUTE_UNUSED
6466 return_in_memory_32 (const_tree type, enum machine_mode mode)
6467 {
6468   HOST_WIDE_INT size;
6469
6470   if (mode == BLKmode)
6471     return 1;
6472
6473   size = int_size_in_bytes (type);
6474
6475   if (MS_AGGREGATE_RETURN && AGGREGATE_TYPE_P (type) && size <= 8)
6476     return 0;
6477
6478   if (VECTOR_MODE_P (mode) || mode == TImode)
6479     {
6480       /* User-created vectors small enough to fit in EAX.  */
6481       if (size < 8)
6482         return 0;
6483
6484       /* MMX/3dNow values are returned in MM0,
6485          except when it doesn't exits.  */
6486       if (size == 8)
6487         return (TARGET_MMX ? 0 : 1);
6488
6489       /* SSE values are returned in XMM0, except when it doesn't exist.  */
6490       if (size == 16)
6491         return (TARGET_SSE ? 0 : 1);
6492
6493       /* AVX values are returned in YMM0, except when it doesn't exist.  */
6494       if (size == 32)
6495         return TARGET_AVX ? 0 : 1;
6496     }
6497
6498   if (mode == XFmode)
6499     return 0;
6500
6501   if (size > 12)
6502     return 1;
6503
6504   /* OImode shouldn't be used directly.  */
6505   gcc_assert (mode != OImode);
6506
6507   return 0;
6508 }
6509
6510 static int ATTRIBUTE_UNUSED
6511 return_in_memory_64 (const_tree type, enum machine_mode mode)
6512 {
6513   int needed_intregs, needed_sseregs;
6514   return !examine_argument (mode, type, 1, &needed_intregs, &needed_sseregs);
6515 }
6516
6517 static int ATTRIBUTE_UNUSED
6518 return_in_memory_ms_64 (const_tree type, enum machine_mode mode)
6519 {
6520   HOST_WIDE_INT size = int_size_in_bytes (type);
6521
6522   /* __m128 is returned in xmm0.  */
6523   if ((SCALAR_INT_MODE_P (mode) || VECTOR_MODE_P (mode))
6524       && !COMPLEX_MODE_P (mode) && (GET_MODE_SIZE (mode) == 16 || size == 16))
6525     return 0;
6526
6527   /* Otherwise, the size must be exactly in [1248]. */
6528   return (size != 1 && size != 2 && size != 4 && size != 8);
6529 }
6530
6531 static bool
6532 ix86_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
6533 {
6534 #ifdef SUBTARGET_RETURN_IN_MEMORY
6535   return SUBTARGET_RETURN_IN_MEMORY (type, fntype);
6536 #else
6537   const enum machine_mode mode = type_natural_mode (type, NULL);
6538  
6539   if (TARGET_64BIT)
6540     {
6541       if (ix86_function_type_abi (fntype) == MS_ABI)
6542         return return_in_memory_ms_64 (type, mode);
6543       else
6544         return return_in_memory_64 (type, mode);
6545     }
6546   else
6547     return return_in_memory_32 (type, mode);
6548 #endif
6549 }
6550
6551 /* Return false iff TYPE is returned in memory.  This version is used
6552    on Solaris 10.  It is similar to the generic ix86_return_in_memory,
6553    but differs notably in that when MMX is available, 8-byte vectors
6554    are returned in memory, rather than in MMX registers.  */
6555
6556 bool
6557 ix86_sol10_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
6558 {
6559   int size;
6560   enum machine_mode mode = type_natural_mode (type, NULL);
6561
6562   if (TARGET_64BIT)
6563     return return_in_memory_64 (type, mode);
6564
6565   if (mode == BLKmode)
6566     return 1;
6567
6568   size = int_size_in_bytes (type);
6569
6570   if (VECTOR_MODE_P (mode))
6571     {
6572       /* Return in memory only if MMX registers *are* available.  This
6573          seems backwards, but it is consistent with the existing
6574          Solaris x86 ABI.  */
6575       if (size == 8)
6576         return TARGET_MMX;
6577       if (size == 16)
6578         return !TARGET_SSE;
6579     }
6580   else if (mode == TImode)
6581     return !TARGET_SSE;
6582   else if (mode == XFmode)
6583     return 0;
6584
6585   return size > 12;
6586 }
6587
6588 /* When returning SSE vector types, we have a choice of either
6589      (1) being abi incompatible with a -march switch, or
6590      (2) generating an error.
6591    Given no good solution, I think the safest thing is one warning.
6592    The user won't be able to use -Werror, but....
6593
6594    Choose the STRUCT_VALUE_RTX hook because that's (at present) only
6595    called in response to actually generating a caller or callee that
6596    uses such a type.  As opposed to TARGET_RETURN_IN_MEMORY, which is called
6597    via aggregate_value_p for general type probing from tree-ssa.  */
6598
6599 static rtx
6600 ix86_struct_value_rtx (tree type, int incoming ATTRIBUTE_UNUSED)
6601 {
6602   static bool warnedsse, warnedmmx;
6603
6604   if (!TARGET_64BIT && type)
6605     {
6606       /* Look at the return type of the function, not the function type.  */
6607       enum machine_mode mode = TYPE_MODE (TREE_TYPE (type));
6608
6609       if (!TARGET_SSE && !warnedsse)
6610         {
6611           if (mode == TImode
6612               || (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 16))
6613             {
6614               warnedsse = true;
6615               warning (0, "SSE vector return without SSE enabled "
6616                        "changes the ABI");
6617             }
6618         }
6619
6620       if (!TARGET_MMX && !warnedmmx)
6621         {
6622           if (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 8)
6623             {
6624               warnedmmx = true;
6625               warning (0, "MMX vector return without MMX enabled "
6626                        "changes the ABI");
6627             }
6628         }
6629     }
6630
6631   return NULL;
6632 }
6633
6634 \f
6635 /* Create the va_list data type.  */
6636
6637 /* Returns the calling convention specific va_list date type.
6638    The argument ABI can be DEFAULT_ABI, MS_ABI, or SYSV_ABI.  */
6639
6640 static tree
6641 ix86_build_builtin_va_list_abi (enum calling_abi abi)
6642 {
6643   tree f_gpr, f_fpr, f_ovf, f_sav, record, type_decl;
6644
6645   /* For i386 we use plain pointer to argument area.  */
6646   if (!TARGET_64BIT || abi == MS_ABI)
6647     return build_pointer_type (char_type_node);
6648
6649   record = (*lang_hooks.types.make_type) (RECORD_TYPE);
6650   type_decl = build_decl (BUILTINS_LOCATION,
6651                           TYPE_DECL, get_identifier ("__va_list_tag"), record);
6652
6653   f_gpr = build_decl (BUILTINS_LOCATION,
6654                       FIELD_DECL, get_identifier ("gp_offset"),
6655                       unsigned_type_node);
6656   f_fpr = build_decl (BUILTINS_LOCATION,
6657                       FIELD_DECL, get_identifier ("fp_offset"),
6658                       unsigned_type_node);
6659   f_ovf = build_decl (BUILTINS_LOCATION,
6660                       FIELD_DECL, get_identifier ("overflow_arg_area"),
6661                       ptr_type_node);
6662   f_sav = build_decl (BUILTINS_LOCATION,
6663                       FIELD_DECL, get_identifier ("reg_save_area"),
6664                       ptr_type_node);
6665
6666   va_list_gpr_counter_field = f_gpr;
6667   va_list_fpr_counter_field = f_fpr;
6668
6669   DECL_FIELD_CONTEXT (f_gpr) = record;
6670   DECL_FIELD_CONTEXT (f_fpr) = record;
6671   DECL_FIELD_CONTEXT (f_ovf) = record;
6672   DECL_FIELD_CONTEXT (f_sav) = record;
6673
6674   TREE_CHAIN (record) = type_decl;
6675   TYPE_NAME (record) = type_decl;
6676   TYPE_FIELDS (record) = f_gpr;
6677   TREE_CHAIN (f_gpr) = f_fpr;
6678   TREE_CHAIN (f_fpr) = f_ovf;
6679   TREE_CHAIN (f_ovf) = f_sav;
6680
6681   layout_type (record);
6682
6683   /* The correct type is an array type of one element.  */
6684   return build_array_type (record, build_index_type (size_zero_node));
6685 }
6686
6687 /* Setup the builtin va_list data type and for 64-bit the additional
6688    calling convention specific va_list data types.  */
6689
6690 static tree
6691 ix86_build_builtin_va_list (void)
6692 {
6693   tree ret = ix86_build_builtin_va_list_abi (ix86_abi);
6694
6695   /* Initialize abi specific va_list builtin types.  */
6696   if (TARGET_64BIT)
6697     {
6698       tree t;
6699       if (ix86_abi == MS_ABI)
6700         {
6701           t = ix86_build_builtin_va_list_abi (SYSV_ABI);
6702           if (TREE_CODE (t) != RECORD_TYPE)
6703             t = build_variant_type_copy (t);
6704           sysv_va_list_type_node = t;
6705         }
6706       else
6707         {
6708           t = ret;
6709           if (TREE_CODE (t) != RECORD_TYPE)
6710             t = build_variant_type_copy (t);
6711           sysv_va_list_type_node = t;
6712         }
6713       if (ix86_abi != MS_ABI)
6714         {
6715           t = ix86_build_builtin_va_list_abi (MS_ABI);
6716           if (TREE_CODE (t) != RECORD_TYPE)
6717             t = build_variant_type_copy (t);
6718           ms_va_list_type_node = t;
6719         }
6720       else
6721         {
6722           t = ret;
6723           if (TREE_CODE (t) != RECORD_TYPE)
6724             t = build_variant_type_copy (t);
6725           ms_va_list_type_node = t;
6726         }
6727     }
6728
6729   return ret;
6730 }
6731
6732 /* Worker function for TARGET_SETUP_INCOMING_VARARGS.  */
6733
6734 static void
6735 setup_incoming_varargs_64 (CUMULATIVE_ARGS *cum)
6736 {
6737   rtx save_area, mem;
6738   rtx label;
6739   rtx label_ref;
6740   rtx tmp_reg;
6741   rtx nsse_reg;
6742   alias_set_type set;
6743   int i;
6744   int regparm = ix86_regparm;
6745
6746   if (cum->call_abi != ix86_abi)
6747     regparm = (ix86_abi != SYSV_ABI
6748                ? X86_64_REGPARM_MAX : X86_64_MS_REGPARM_MAX);
6749
6750   /* GPR size of varargs save area.  */
6751   if (cfun->va_list_gpr_size)
6752     ix86_varargs_gpr_size = X86_64_REGPARM_MAX * UNITS_PER_WORD;
6753   else
6754     ix86_varargs_gpr_size = 0;
6755
6756   /* FPR size of varargs save area.  We don't need it if we don't pass
6757      anything in SSE registers.  */
6758   if (cum->sse_nregs && cfun->va_list_fpr_size)
6759     ix86_varargs_fpr_size = X86_64_SSE_REGPARM_MAX * 16;
6760   else
6761     ix86_varargs_fpr_size = 0;
6762
6763   if (! ix86_varargs_gpr_size && ! ix86_varargs_fpr_size)
6764     return;
6765
6766   save_area = frame_pointer_rtx;
6767   set = get_varargs_alias_set ();
6768
6769   for (i = cum->regno;
6770        i < regparm
6771        && i < cum->regno + cfun->va_list_gpr_size / UNITS_PER_WORD;
6772        i++)
6773     {
6774       mem = gen_rtx_MEM (Pmode,
6775                          plus_constant (save_area, i * UNITS_PER_WORD));
6776       MEM_NOTRAP_P (mem) = 1;
6777       set_mem_alias_set (mem, set);
6778       emit_move_insn (mem, gen_rtx_REG (Pmode,
6779                                         x86_64_int_parameter_registers[i]));
6780     }
6781
6782   if (ix86_varargs_fpr_size)
6783     {
6784       /* Now emit code to save SSE registers.  The AX parameter contains number
6785          of SSE parameter registers used to call this function.  We use
6786          sse_prologue_save insn template that produces computed jump across
6787          SSE saves.  We need some preparation work to get this working.  */
6788
6789       label = gen_label_rtx ();
6790       label_ref = gen_rtx_LABEL_REF (Pmode, label);
6791
6792       /* Compute address to jump to :
6793          label - eax*4 + nnamed_sse_arguments*4 Or
6794          label - eax*5 + nnamed_sse_arguments*5 for AVX.  */
6795       tmp_reg = gen_reg_rtx (Pmode);
6796       nsse_reg = gen_reg_rtx (Pmode);
6797       emit_insn (gen_zero_extendqidi2 (nsse_reg, gen_rtx_REG (QImode, AX_REG)));
6798       emit_insn (gen_rtx_SET (VOIDmode, tmp_reg,
6799                               gen_rtx_MULT (Pmode, nsse_reg,
6800                                             GEN_INT (4))));
6801
6802       /* vmovaps is one byte longer than movaps.  */
6803       if (TARGET_AVX)
6804         emit_insn (gen_rtx_SET (VOIDmode, tmp_reg,
6805                                 gen_rtx_PLUS (Pmode, tmp_reg,
6806                                               nsse_reg)));
6807
6808       if (cum->sse_regno)
6809         emit_move_insn
6810           (nsse_reg,
6811            gen_rtx_CONST (DImode,
6812                           gen_rtx_PLUS (DImode,
6813                                         label_ref,
6814                                         GEN_INT (cum->sse_regno
6815                                                  * (TARGET_AVX ? 5 : 4)))));
6816       else
6817         emit_move_insn (nsse_reg, label_ref);
6818       emit_insn (gen_subdi3 (nsse_reg, nsse_reg, tmp_reg));
6819
6820       /* Compute address of memory block we save into.  We always use pointer
6821          pointing 127 bytes after first byte to store - this is needed to keep
6822          instruction size limited by 4 bytes (5 bytes for AVX) with one
6823          byte displacement.  */
6824       tmp_reg = gen_reg_rtx (Pmode);
6825       emit_insn (gen_rtx_SET (VOIDmode, tmp_reg,
6826                               plus_constant (save_area,
6827                                              ix86_varargs_gpr_size + 127)));
6828       mem = gen_rtx_MEM (BLKmode, plus_constant (tmp_reg, -127));
6829       MEM_NOTRAP_P (mem) = 1;
6830       set_mem_alias_set (mem, set);
6831       set_mem_align (mem, BITS_PER_WORD);
6832
6833       /* And finally do the dirty job!  */
6834       emit_insn (gen_sse_prologue_save (mem, nsse_reg,
6835                                         GEN_INT (cum->sse_regno), label));
6836     }
6837 }
6838
6839 static void
6840 setup_incoming_varargs_ms_64 (CUMULATIVE_ARGS *cum)
6841 {
6842   alias_set_type set = get_varargs_alias_set ();
6843   int i;
6844
6845   for (i = cum->regno; i < X86_64_MS_REGPARM_MAX; i++)
6846     {
6847       rtx reg, mem;
6848
6849       mem = gen_rtx_MEM (Pmode,
6850                          plus_constant (virtual_incoming_args_rtx,
6851                                         i * UNITS_PER_WORD));
6852       MEM_NOTRAP_P (mem) = 1;
6853       set_mem_alias_set (mem, set);
6854
6855       reg = gen_rtx_REG (Pmode, x86_64_ms_abi_int_parameter_registers[i]);
6856       emit_move_insn (mem, reg);
6857     }
6858 }
6859
6860 static void
6861 ix86_setup_incoming_varargs (CUMULATIVE_ARGS *cum, enum machine_mode mode,
6862                              tree type, int *pretend_size ATTRIBUTE_UNUSED,
6863                              int no_rtl)
6864 {
6865   CUMULATIVE_ARGS next_cum;
6866   tree fntype;
6867
6868   /* This argument doesn't appear to be used anymore.  Which is good,
6869      because the old code here didn't suppress rtl generation.  */
6870   gcc_assert (!no_rtl);
6871
6872   if (!TARGET_64BIT)
6873     return;
6874
6875   fntype = TREE_TYPE (current_function_decl);
6876
6877   /* For varargs, we do not want to skip the dummy va_dcl argument.
6878      For stdargs, we do want to skip the last named argument.  */
6879   next_cum = *cum;
6880   if (stdarg_p (fntype))
6881     function_arg_advance (&next_cum, mode, type, 1);
6882
6883   if (cum->call_abi == MS_ABI)
6884     setup_incoming_varargs_ms_64 (&next_cum);
6885   else
6886     setup_incoming_varargs_64 (&next_cum);
6887 }
6888
6889 /* Checks if TYPE is of kind va_list char *.  */
6890
6891 static bool
6892 is_va_list_char_pointer (tree type)
6893 {
6894   tree canonic;
6895
6896   /* For 32-bit it is always true.  */
6897   if (!TARGET_64BIT)
6898     return true;
6899   canonic = ix86_canonical_va_list_type (type);
6900   return (canonic == ms_va_list_type_node
6901           || (ix86_abi == MS_ABI && canonic == va_list_type_node));
6902 }
6903
6904 /* Implement va_start.  */
6905
6906 static void
6907 ix86_va_start (tree valist, rtx nextarg)
6908 {
6909   HOST_WIDE_INT words, n_gpr, n_fpr;
6910   tree f_gpr, f_fpr, f_ovf, f_sav;
6911   tree gpr, fpr, ovf, sav, t;
6912   tree type;
6913
6914   /* Only 64bit target needs something special.  */
6915   if (!TARGET_64BIT || is_va_list_char_pointer (TREE_TYPE (valist)))
6916     {
6917       std_expand_builtin_va_start (valist, nextarg);
6918       return;
6919     }
6920
6921   f_gpr = TYPE_FIELDS (TREE_TYPE (sysv_va_list_type_node));
6922   f_fpr = TREE_CHAIN (f_gpr);
6923   f_ovf = TREE_CHAIN (f_fpr);
6924   f_sav = TREE_CHAIN (f_ovf);
6925
6926   valist = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (valist)), valist);
6927   gpr = build3 (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr, NULL_TREE);
6928   fpr = build3 (COMPONENT_REF, TREE_TYPE (f_fpr), valist, f_fpr, NULL_TREE);
6929   ovf = build3 (COMPONENT_REF, TREE_TYPE (f_ovf), valist, f_ovf, NULL_TREE);
6930   sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), valist, f_sav, NULL_TREE);
6931
6932   /* Count number of gp and fp argument registers used.  */
6933   words = crtl->args.info.words;
6934   n_gpr = crtl->args.info.regno;
6935   n_fpr = crtl->args.info.sse_regno;
6936
6937   if (cfun->va_list_gpr_size)
6938     {
6939       type = TREE_TYPE (gpr);
6940       t = build2 (MODIFY_EXPR, type,
6941                   gpr, build_int_cst (type, n_gpr * 8));
6942       TREE_SIDE_EFFECTS (t) = 1;
6943       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
6944     }
6945
6946   if (TARGET_SSE && cfun->va_list_fpr_size)
6947     {
6948       type = TREE_TYPE (fpr);
6949       t = build2 (MODIFY_EXPR, type, fpr,
6950                   build_int_cst (type, n_fpr * 16 + 8*X86_64_REGPARM_MAX));
6951       TREE_SIDE_EFFECTS (t) = 1;
6952       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
6953     }
6954
6955   /* Find the overflow area.  */
6956   type = TREE_TYPE (ovf);
6957   t = make_tree (type, crtl->args.internal_arg_pointer);
6958   if (words != 0)
6959     t = build2 (POINTER_PLUS_EXPR, type, t,
6960                 size_int (words * UNITS_PER_WORD));
6961   t = build2 (MODIFY_EXPR, type, ovf, t);
6962   TREE_SIDE_EFFECTS (t) = 1;
6963   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
6964
6965   if (ix86_varargs_gpr_size || ix86_varargs_fpr_size)
6966     {
6967       /* Find the register save area.
6968          Prologue of the function save it right above stack frame.  */
6969       type = TREE_TYPE (sav);
6970       t = make_tree (type, frame_pointer_rtx);
6971       if (!ix86_varargs_gpr_size)
6972         t = build2 (POINTER_PLUS_EXPR, type, t,
6973                     size_int (-8 * X86_64_REGPARM_MAX));
6974       t = build2 (MODIFY_EXPR, type, sav, t);
6975       TREE_SIDE_EFFECTS (t) = 1;
6976       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
6977     }
6978 }
6979
6980 /* Implement va_arg.  */
6981
6982 static tree
6983 ix86_gimplify_va_arg (tree valist, tree type, gimple_seq *pre_p,
6984                       gimple_seq *post_p)
6985 {
6986   static const int intreg[6] = { 0, 1, 2, 3, 4, 5 };
6987   tree f_gpr, f_fpr, f_ovf, f_sav;
6988   tree gpr, fpr, ovf, sav, t;
6989   int size, rsize;
6990   tree lab_false, lab_over = NULL_TREE;
6991   tree addr, t2;
6992   rtx container;
6993   int indirect_p = 0;
6994   tree ptrtype;
6995   enum machine_mode nat_mode;
6996   int arg_boundary;
6997
6998   /* Only 64bit target needs something special.  */
6999   if (!TARGET_64BIT || is_va_list_char_pointer (TREE_TYPE (valist)))
7000     return std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
7001
7002   f_gpr = TYPE_FIELDS (TREE_TYPE (sysv_va_list_type_node));
7003   f_fpr = TREE_CHAIN (f_gpr);
7004   f_ovf = TREE_CHAIN (f_fpr);
7005   f_sav = TREE_CHAIN (f_ovf);
7006
7007   gpr = build3 (COMPONENT_REF, TREE_TYPE (f_gpr),
7008                 build_va_arg_indirect_ref (valist), f_gpr, NULL_TREE);
7009   valist = build_va_arg_indirect_ref (valist);
7010   fpr = build3 (COMPONENT_REF, TREE_TYPE (f_fpr), valist, f_fpr, NULL_TREE);
7011   ovf = build3 (COMPONENT_REF, TREE_TYPE (f_ovf), valist, f_ovf, NULL_TREE);
7012   sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), valist, f_sav, NULL_TREE);
7013
7014   indirect_p = pass_by_reference (NULL, TYPE_MODE (type), type, false);
7015   if (indirect_p)
7016     type = build_pointer_type (type);
7017   size = int_size_in_bytes (type);
7018   rsize = (size + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
7019
7020   nat_mode = type_natural_mode (type, NULL);
7021   switch (nat_mode)
7022     {
7023     case V8SFmode:
7024     case V8SImode:
7025     case V32QImode:
7026     case V16HImode:
7027     case V4DFmode:
7028     case V4DImode:
7029       /* Unnamed 256bit vector mode parameters are passed on stack.  */
7030       if (ix86_cfun_abi () == SYSV_ABI)
7031         {
7032           container = NULL;
7033           break;
7034         }
7035
7036     default:
7037       container = construct_container (nat_mode, TYPE_MODE (type),
7038                                        type, 0, X86_64_REGPARM_MAX,
7039                                        X86_64_SSE_REGPARM_MAX, intreg,
7040                                        0);
7041       break;
7042     }
7043
7044   /* Pull the value out of the saved registers.  */
7045
7046   addr = create_tmp_var (ptr_type_node, "addr");
7047
7048   if (container)
7049     {
7050       int needed_intregs, needed_sseregs;
7051       bool need_temp;
7052       tree int_addr, sse_addr;
7053
7054       lab_false = create_artificial_label (UNKNOWN_LOCATION);
7055       lab_over = create_artificial_label (UNKNOWN_LOCATION);
7056
7057       examine_argument (nat_mode, type, 0, &needed_intregs, &needed_sseregs);
7058
7059       need_temp = (!REG_P (container)
7060                    && ((needed_intregs && TYPE_ALIGN (type) > 64)
7061                        || TYPE_ALIGN (type) > 128));
7062
7063       /* In case we are passing structure, verify that it is consecutive block
7064          on the register save area.  If not we need to do moves.  */
7065       if (!need_temp && !REG_P (container))
7066         {
7067           /* Verify that all registers are strictly consecutive  */
7068           if (SSE_REGNO_P (REGNO (XEXP (XVECEXP (container, 0, 0), 0))))
7069             {
7070               int i;
7071
7072               for (i = 0; i < XVECLEN (container, 0) && !need_temp; i++)
7073                 {
7074                   rtx slot = XVECEXP (container, 0, i);
7075                   if (REGNO (XEXP (slot, 0)) != FIRST_SSE_REG + (unsigned int) i
7076                       || INTVAL (XEXP (slot, 1)) != i * 16)
7077                     need_temp = 1;
7078                 }
7079             }
7080           else
7081             {
7082               int i;
7083
7084               for (i = 0; i < XVECLEN (container, 0) && !need_temp; i++)
7085                 {
7086                   rtx slot = XVECEXP (container, 0, i);
7087                   if (REGNO (XEXP (slot, 0)) != (unsigned int) i
7088                       || INTVAL (XEXP (slot, 1)) != i * 8)
7089                     need_temp = 1;
7090                 }
7091             }
7092         }
7093       if (!need_temp)
7094         {
7095           int_addr = addr;
7096           sse_addr = addr;
7097         }
7098       else
7099         {
7100           int_addr = create_tmp_var (ptr_type_node, "int_addr");
7101           sse_addr = create_tmp_var (ptr_type_node, "sse_addr");
7102         }
7103
7104       /* First ensure that we fit completely in registers.  */
7105       if (needed_intregs)
7106         {
7107           t = build_int_cst (TREE_TYPE (gpr),
7108                              (X86_64_REGPARM_MAX - needed_intregs + 1) * 8);
7109           t = build2 (GE_EXPR, boolean_type_node, gpr, t);
7110           t2 = build1 (GOTO_EXPR, void_type_node, lab_false);
7111           t = build3 (COND_EXPR, void_type_node, t, t2, NULL_TREE);
7112           gimplify_and_add (t, pre_p);
7113         }
7114       if (needed_sseregs)
7115         {
7116           t = build_int_cst (TREE_TYPE (fpr),
7117                              (X86_64_SSE_REGPARM_MAX - needed_sseregs + 1) * 16
7118                              + X86_64_REGPARM_MAX * 8);
7119           t = build2 (GE_EXPR, boolean_type_node, fpr, t);
7120           t2 = build1 (GOTO_EXPR, void_type_node, lab_false);
7121           t = build3 (COND_EXPR, void_type_node, t, t2, NULL_TREE);
7122           gimplify_and_add (t, pre_p);
7123         }
7124
7125       /* Compute index to start of area used for integer regs.  */
7126       if (needed_intregs)
7127         {
7128           /* int_addr = gpr + sav; */
7129           t = fold_convert (sizetype, gpr);
7130           t = build2 (POINTER_PLUS_EXPR, ptr_type_node, sav, t);
7131           gimplify_assign (int_addr, t, pre_p);
7132         }
7133       if (needed_sseregs)
7134         {
7135           /* sse_addr = fpr + sav; */
7136           t = fold_convert (sizetype, fpr);
7137           t = build2 (POINTER_PLUS_EXPR, ptr_type_node, sav, t);
7138           gimplify_assign (sse_addr, t, pre_p);
7139         }
7140       if (need_temp)
7141         {
7142           int i;
7143           tree temp = create_tmp_var (type, "va_arg_tmp");
7144
7145           /* addr = &temp; */
7146           t = build1 (ADDR_EXPR, build_pointer_type (type), temp);
7147           gimplify_assign (addr, t, pre_p);
7148
7149           for (i = 0; i < XVECLEN (container, 0); i++)
7150             {
7151               rtx slot = XVECEXP (container, 0, i);
7152               rtx reg = XEXP (slot, 0);
7153               enum machine_mode mode = GET_MODE (reg);
7154               tree piece_type = lang_hooks.types.type_for_mode (mode, 1);
7155               tree addr_type = build_pointer_type (piece_type);
7156               tree daddr_type = build_pointer_type_for_mode (piece_type,
7157                                                              ptr_mode, true);
7158               tree src_addr, src;
7159               int src_offset;
7160               tree dest_addr, dest;
7161
7162               if (SSE_REGNO_P (REGNO (reg)))
7163                 {
7164                   src_addr = sse_addr;
7165                   src_offset = (REGNO (reg) - FIRST_SSE_REG) * 16;
7166                 }
7167               else
7168                 {
7169                   src_addr = int_addr;
7170                   src_offset = REGNO (reg) * 8;
7171                 }
7172               src_addr = fold_convert (addr_type, src_addr);
7173               src_addr = fold_build2 (POINTER_PLUS_EXPR, addr_type, src_addr,
7174                                       size_int (src_offset));
7175               src = build_va_arg_indirect_ref (src_addr);
7176
7177               dest_addr = fold_convert (daddr_type, addr);
7178               dest_addr = fold_build2 (POINTER_PLUS_EXPR, daddr_type, dest_addr,
7179                                        size_int (INTVAL (XEXP (slot, 1))));
7180               dest = build_va_arg_indirect_ref (dest_addr);
7181
7182               gimplify_assign (dest, src, pre_p);
7183             }
7184         }
7185
7186       if (needed_intregs)
7187         {
7188           t = build2 (PLUS_EXPR, TREE_TYPE (gpr), gpr,
7189                       build_int_cst (TREE_TYPE (gpr), needed_intregs * 8));
7190           gimplify_assign (gpr, t, pre_p);
7191         }
7192
7193       if (needed_sseregs)
7194         {
7195           t = build2 (PLUS_EXPR, TREE_TYPE (fpr), fpr,
7196                       build_int_cst (TREE_TYPE (fpr), needed_sseregs * 16));
7197           gimplify_assign (fpr, t, pre_p);
7198         }
7199
7200       gimple_seq_add_stmt (pre_p, gimple_build_goto (lab_over));
7201
7202       gimple_seq_add_stmt (pre_p, gimple_build_label (lab_false));
7203     }
7204
7205   /* ... otherwise out of the overflow area.  */
7206
7207   /* When we align parameter on stack for caller, if the parameter
7208      alignment is beyond MAX_SUPPORTED_STACK_ALIGNMENT, it will be
7209      aligned at MAX_SUPPORTED_STACK_ALIGNMENT.  We will match callee
7210      here with caller.  */
7211   arg_boundary = FUNCTION_ARG_BOUNDARY (VOIDmode, type);
7212   if ((unsigned int) arg_boundary > MAX_SUPPORTED_STACK_ALIGNMENT)
7213     arg_boundary = MAX_SUPPORTED_STACK_ALIGNMENT;
7214
7215   /* Care for on-stack alignment if needed.  */
7216   if (arg_boundary <= 64
7217       || integer_zerop (TYPE_SIZE (type)))
7218     t = ovf;
7219  else
7220     {
7221       HOST_WIDE_INT align = arg_boundary / 8;
7222       t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ovf), ovf,
7223                   size_int (align - 1));
7224       t = fold_convert (sizetype, t);
7225       t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t,
7226                   size_int (-align));
7227       t = fold_convert (TREE_TYPE (ovf), t);
7228     }
7229   gimplify_expr (&t, pre_p, NULL, is_gimple_val, fb_rvalue);
7230   gimplify_assign (addr, t, pre_p);
7231
7232   t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t,
7233               size_int (rsize * UNITS_PER_WORD));
7234   gimplify_assign (unshare_expr (ovf), t, pre_p);
7235
7236   if (container)
7237     gimple_seq_add_stmt (pre_p, gimple_build_label (lab_over));
7238
7239   ptrtype = build_pointer_type_for_mode (type, ptr_mode, true);
7240   addr = fold_convert (ptrtype, addr);
7241
7242   if (indirect_p)
7243     addr = build_va_arg_indirect_ref (addr);
7244   return build_va_arg_indirect_ref (addr);
7245 }
7246 \f
7247 /* Return nonzero if OPNUM's MEM should be matched
7248    in movabs* patterns.  */
7249
7250 int
7251 ix86_check_movabs (rtx insn, int opnum)
7252 {
7253   rtx set, mem;
7254
7255   set = PATTERN (insn);
7256   if (GET_CODE (set) == PARALLEL)
7257     set = XVECEXP (set, 0, 0);
7258   gcc_assert (GET_CODE (set) == SET);
7259   mem = XEXP (set, opnum);
7260   while (GET_CODE (mem) == SUBREG)
7261     mem = SUBREG_REG (mem);
7262   gcc_assert (MEM_P (mem));
7263   return (volatile_ok || !MEM_VOLATILE_P (mem));
7264 }
7265 \f
7266 /* Initialize the table of extra 80387 mathematical constants.  */
7267
7268 static void
7269 init_ext_80387_constants (void)
7270 {
7271   static const char * cst[5] =
7272   {
7273     "0.3010299956639811952256464283594894482",  /* 0: fldlg2  */
7274     "0.6931471805599453094286904741849753009",  /* 1: fldln2  */
7275     "1.4426950408889634073876517827983434472",  /* 2: fldl2e  */
7276     "3.3219280948873623478083405569094566090",  /* 3: fldl2t  */
7277     "3.1415926535897932385128089594061862044",  /* 4: fldpi   */
7278   };
7279   int i;
7280
7281   for (i = 0; i < 5; i++)
7282     {
7283       real_from_string (&ext_80387_constants_table[i], cst[i]);
7284       /* Ensure each constant is rounded to XFmode precision.  */
7285       real_convert (&ext_80387_constants_table[i],
7286                     XFmode, &ext_80387_constants_table[i]);
7287     }
7288
7289   ext_80387_constants_init = 1;
7290 }
7291
7292 /* Return true if the constant is something that can be loaded with
7293    a special instruction.  */
7294
7295 int
7296 standard_80387_constant_p (rtx x)
7297 {
7298   enum machine_mode mode = GET_MODE (x);
7299
7300   REAL_VALUE_TYPE r;
7301
7302   if (!(X87_FLOAT_MODE_P (mode) && (GET_CODE (x) == CONST_DOUBLE)))
7303     return -1;
7304
7305   if (x == CONST0_RTX (mode))
7306     return 1;
7307   if (x == CONST1_RTX (mode))
7308     return 2;
7309
7310   REAL_VALUE_FROM_CONST_DOUBLE (r, x);
7311
7312   /* For XFmode constants, try to find a special 80387 instruction when
7313      optimizing for size or on those CPUs that benefit from them.  */
7314   if (mode == XFmode
7315       && (optimize_function_for_size_p (cfun) || TARGET_EXT_80387_CONSTANTS))
7316     {
7317       int i;
7318
7319       if (! ext_80387_constants_init)
7320         init_ext_80387_constants ();
7321
7322       for (i = 0; i < 5; i++)
7323         if (real_identical (&r, &ext_80387_constants_table[i]))
7324           return i + 3;
7325     }
7326
7327   /* Load of the constant -0.0 or -1.0 will be split as
7328      fldz;fchs or fld1;fchs sequence.  */
7329   if (real_isnegzero (&r))
7330     return 8;
7331   if (real_identical (&r, &dconstm1))
7332     return 9;
7333
7334   return 0;
7335 }
7336
7337 /* Return the opcode of the special instruction to be used to load
7338    the constant X.  */
7339
7340 const char *
7341 standard_80387_constant_opcode (rtx x)
7342 {
7343   switch (standard_80387_constant_p (x))
7344     {
7345     case 1:
7346       return "fldz";
7347     case 2:
7348       return "fld1";
7349     case 3:
7350       return "fldlg2";
7351     case 4:
7352       return "fldln2";
7353     case 5:
7354       return "fldl2e";
7355     case 6:
7356       return "fldl2t";
7357     case 7:
7358       return "fldpi";
7359     case 8:
7360     case 9:
7361       return "#";
7362     default:
7363       gcc_unreachable ();
7364     }
7365 }
7366
7367 /* Return the CONST_DOUBLE representing the 80387 constant that is
7368    loaded by the specified special instruction.  The argument IDX
7369    matches the return value from standard_80387_constant_p.  */
7370
7371 rtx
7372 standard_80387_constant_rtx (int idx)
7373 {
7374   int i;
7375
7376   if (! ext_80387_constants_init)
7377     init_ext_80387_constants ();
7378
7379   switch (idx)
7380     {
7381     case 3:
7382     case 4:
7383     case 5:
7384     case 6:
7385     case 7:
7386       i = idx - 3;
7387       break;
7388
7389     default:
7390       gcc_unreachable ();
7391     }
7392
7393   return CONST_DOUBLE_FROM_REAL_VALUE (ext_80387_constants_table[i],
7394                                        XFmode);
7395 }
7396
7397 /* Return 1 if X is all 0s and 2 if x is all 1s
7398    in supported SSE vector mode.  */
7399
7400 int
7401 standard_sse_constant_p (rtx x)
7402 {
7403   enum machine_mode mode = GET_MODE (x);
7404
7405   if (x == const0_rtx || x == CONST0_RTX (GET_MODE (x)))
7406     return 1;
7407   if (vector_all_ones_operand (x, mode))
7408     switch (mode)
7409       {
7410       case V16QImode:
7411       case V8HImode:
7412       case V4SImode:
7413       case V2DImode:
7414         if (TARGET_SSE2)
7415           return 2;
7416       default:
7417         break;
7418       }
7419
7420   return 0;
7421 }
7422
7423 /* Return the opcode of the special instruction to be used to load
7424    the constant X.  */
7425
7426 const char *
7427 standard_sse_constant_opcode (rtx insn, rtx x)
7428 {
7429   switch (standard_sse_constant_p (x))
7430     {
7431     case 1:
7432       switch (get_attr_mode (insn))
7433         {
7434         case MODE_V4SF:
7435           return TARGET_AVX ? "vxorps\t%0, %0, %0" : "xorps\t%0, %0";
7436         case MODE_V2DF:
7437           return TARGET_AVX ? "vxorpd\t%0, %0, %0" : "xorpd\t%0, %0";
7438         case MODE_TI:
7439           return TARGET_AVX ? "vpxor\t%0, %0, %0" : "pxor\t%0, %0";
7440         case MODE_V8SF:
7441           return "vxorps\t%x0, %x0, %x0";
7442         case MODE_V4DF:
7443           return "vxorpd\t%x0, %x0, %x0";
7444         case MODE_OI:
7445           return "vpxor\t%x0, %x0, %x0";
7446         default:
7447           break;
7448         }
7449     case 2:
7450       return TARGET_AVX ? "vpcmpeqd\t%0, %0, %0" : "pcmpeqd\t%0, %0";
7451     default:
7452       break;
7453     }
7454   gcc_unreachable ();
7455 }
7456
7457 /* Returns 1 if OP contains a symbol reference */
7458
7459 int
7460 symbolic_reference_mentioned_p (rtx op)
7461 {
7462   const char *fmt;
7463   int i;
7464
7465   if (GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == LABEL_REF)
7466     return 1;
7467
7468   fmt = GET_RTX_FORMAT (GET_CODE (op));
7469   for (i = GET_RTX_LENGTH (GET_CODE (op)) - 1; i >= 0; i--)
7470     {
7471       if (fmt[i] == 'E')
7472         {
7473           int j;
7474
7475           for (j = XVECLEN (op, i) - 1; j >= 0; j--)
7476             if (symbolic_reference_mentioned_p (XVECEXP (op, i, j)))
7477               return 1;
7478         }
7479
7480       else if (fmt[i] == 'e' && symbolic_reference_mentioned_p (XEXP (op, i)))
7481         return 1;
7482     }
7483
7484   return 0;
7485 }
7486
7487 /* Return 1 if it is appropriate to emit `ret' instructions in the
7488    body of a function.  Do this only if the epilogue is simple, needing a
7489    couple of insns.  Prior to reloading, we can't tell how many registers
7490    must be saved, so return 0 then.  Return 0 if there is no frame
7491    marker to de-allocate.  */
7492
7493 int
7494 ix86_can_use_return_insn_p (void)
7495 {
7496   struct ix86_frame frame;
7497
7498   if (! reload_completed || frame_pointer_needed)
7499     return 0;
7500
7501   /* Don't allow more than 32 pop, since that's all we can do
7502      with one instruction.  */
7503   if (crtl->args.pops_args
7504       && crtl->args.size >= 32768)
7505     return 0;
7506
7507   ix86_compute_frame_layout (&frame);
7508   return frame.to_allocate == 0 && frame.padding0 == 0
7509          && (frame.nregs + frame.nsseregs) == 0;
7510 }
7511 \f
7512 /* Value should be nonzero if functions must have frame pointers.
7513    Zero means the frame pointer need not be set up (and parms may
7514    be accessed via the stack pointer) in functions that seem suitable.  */
7515
7516 static bool
7517 ix86_frame_pointer_required (void)
7518 {
7519   /* If we accessed previous frames, then the generated code expects
7520      to be able to access the saved ebp value in our frame.  */
7521   if (cfun->machine->accesses_prev_frame)
7522     return true;
7523
7524   /* Several x86 os'es need a frame pointer for other reasons,
7525      usually pertaining to setjmp.  */
7526   if (SUBTARGET_FRAME_POINTER_REQUIRED)
7527     return true;
7528
7529   /* In override_options, TARGET_OMIT_LEAF_FRAME_POINTER turns off
7530      the frame pointer by default.  Turn it back on now if we've not
7531      got a leaf function.  */
7532   if (TARGET_OMIT_LEAF_FRAME_POINTER
7533       && (!current_function_is_leaf
7534           || ix86_current_function_calls_tls_descriptor))
7535     return true;
7536
7537   if (crtl->profile)
7538     return true;
7539
7540   return false;
7541 }
7542
7543 /* Record that the current function accesses previous call frames.  */
7544
7545 void
7546 ix86_setup_frame_addresses (void)
7547 {
7548   cfun->machine->accesses_prev_frame = 1;
7549 }
7550 \f
7551 #ifndef USE_HIDDEN_LINKONCE
7552 # if (defined(HAVE_GAS_HIDDEN) && (SUPPORTS_ONE_ONLY - 0)) || TARGET_MACHO
7553 #  define USE_HIDDEN_LINKONCE 1
7554 # else
7555 #  define USE_HIDDEN_LINKONCE 0
7556 # endif
7557 #endif
7558
7559 static int pic_labels_used;
7560
7561 /* Fills in the label name that should be used for a pc thunk for
7562    the given register.  */
7563
7564 static void
7565 get_pc_thunk_name (char name[32], unsigned int regno)
7566 {
7567   gcc_assert (!TARGET_64BIT);
7568
7569   if (USE_HIDDEN_LINKONCE)
7570     sprintf (name, "__i686.get_pc_thunk.%s", reg_names[regno]);
7571   else
7572     ASM_GENERATE_INTERNAL_LABEL (name, "LPR", regno);
7573 }
7574
7575
7576 /* This function generates code for -fpic that loads %ebx with
7577    the return address of the caller and then returns.  */
7578
7579 void
7580 ix86_file_end (void)
7581 {
7582   rtx xops[2];
7583   int regno;
7584
7585   for (regno = 0; regno < 8; ++regno)
7586     {
7587       char name[32];
7588
7589       if (! ((pic_labels_used >> regno) & 1))
7590         continue;
7591
7592       get_pc_thunk_name (name, regno);
7593
7594 #if TARGET_MACHO
7595       if (TARGET_MACHO)
7596         {
7597           switch_to_section (darwin_sections[text_coal_section]);
7598           fputs ("\t.weak_definition\t", asm_out_file);
7599           assemble_name (asm_out_file, name);
7600           fputs ("\n\t.private_extern\t", asm_out_file);
7601           assemble_name (asm_out_file, name);
7602           fputs ("\n", asm_out_file);
7603           ASM_OUTPUT_LABEL (asm_out_file, name);
7604         }
7605       else
7606 #endif
7607       if (USE_HIDDEN_LINKONCE)
7608         {
7609           tree decl;
7610
7611           decl = build_decl (BUILTINS_LOCATION,
7612                              FUNCTION_DECL, get_identifier (name),
7613                              error_mark_node);
7614           TREE_PUBLIC (decl) = 1;
7615           TREE_STATIC (decl) = 1;
7616           DECL_COMDAT_GROUP (decl) = DECL_ASSEMBLER_NAME (decl);
7617
7618           (*targetm.asm_out.unique_section) (decl, 0);
7619           switch_to_section (get_named_section (decl, NULL, 0));
7620
7621           (*targetm.asm_out.globalize_label) (asm_out_file, name);
7622           fputs ("\t.hidden\t", asm_out_file);
7623           assemble_name (asm_out_file, name);
7624           putc ('\n', asm_out_file);
7625           ASM_DECLARE_FUNCTION_NAME (asm_out_file, name, decl);
7626         }
7627       else
7628         {
7629           switch_to_section (text_section);
7630           ASM_OUTPUT_LABEL (asm_out_file, name);
7631         }
7632
7633       xops[0] = gen_rtx_REG (Pmode, regno);
7634       xops[1] = gen_rtx_MEM (Pmode, stack_pointer_rtx);
7635       output_asm_insn ("mov%z0\t{%1, %0|%0, %1}", xops);
7636       output_asm_insn ("ret", xops);
7637     }
7638
7639   if (NEED_INDICATE_EXEC_STACK)
7640     file_end_indicate_exec_stack ();
7641 }
7642
7643 /* Emit code for the SET_GOT patterns.  */
7644
7645 const char *
7646 output_set_got (rtx dest, rtx label ATTRIBUTE_UNUSED)
7647 {
7648   rtx xops[3];
7649
7650   xops[0] = dest;
7651
7652   if (TARGET_VXWORKS_RTP && flag_pic)
7653     {
7654       /* Load (*VXWORKS_GOTT_BASE) into the PIC register.  */
7655       xops[2] = gen_rtx_MEM (Pmode,
7656                              gen_rtx_SYMBOL_REF (Pmode, VXWORKS_GOTT_BASE));
7657       output_asm_insn ("mov{l}\t{%2, %0|%0, %2}", xops);
7658
7659       /* Load (*VXWORKS_GOTT_BASE)[VXWORKS_GOTT_INDEX] into the PIC register.
7660          Use %P and a local symbol in order to print VXWORKS_GOTT_INDEX as
7661          an unadorned address.  */
7662       xops[2] = gen_rtx_SYMBOL_REF (Pmode, VXWORKS_GOTT_INDEX);
7663       SYMBOL_REF_FLAGS (xops[2]) |= SYMBOL_FLAG_LOCAL;
7664       output_asm_insn ("mov{l}\t{%P2(%0), %0|%0, DWORD PTR %P2[%0]}", xops);
7665       return "";
7666     }
7667
7668   xops[1] = gen_rtx_SYMBOL_REF (Pmode, GOT_SYMBOL_NAME);
7669
7670   if (! TARGET_DEEP_BRANCH_PREDICTION || !flag_pic)
7671     {
7672       xops[2] = gen_rtx_LABEL_REF (Pmode, label ? label : gen_label_rtx ());
7673
7674       if (!flag_pic)
7675         output_asm_insn ("mov%z0\t{%2, %0|%0, %2}", xops);
7676       else
7677         output_asm_insn ("call\t%a2", xops);
7678
7679 #if TARGET_MACHO
7680       /* Output the Mach-O "canonical" label name ("Lxx$pb") here too.  This
7681          is what will be referenced by the Mach-O PIC subsystem.  */
7682       if (!label)
7683         ASM_OUTPUT_LABEL (asm_out_file, MACHOPIC_FUNCTION_BASE_NAME);
7684 #endif
7685
7686       (*targetm.asm_out.internal_label) (asm_out_file, "L",
7687                                  CODE_LABEL_NUMBER (XEXP (xops[2], 0)));
7688
7689       if (flag_pic)
7690         output_asm_insn ("pop%z0\t%0", xops);
7691     }
7692   else
7693     {
7694       char name[32];
7695       get_pc_thunk_name (name, REGNO (dest));
7696       pic_labels_used |= 1 << REGNO (dest);
7697
7698       xops[2] = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (name));
7699       xops[2] = gen_rtx_MEM (QImode, xops[2]);
7700       output_asm_insn ("call\t%X2", xops);
7701       /* Output the Mach-O "canonical" label name ("Lxx$pb") here too.  This
7702          is what will be referenced by the Mach-O PIC subsystem.  */
7703 #if TARGET_MACHO
7704       if (!label)
7705         ASM_OUTPUT_LABEL (asm_out_file, MACHOPIC_FUNCTION_BASE_NAME);
7706       else
7707         targetm.asm_out.internal_label (asm_out_file, "L",
7708                                            CODE_LABEL_NUMBER (label));
7709 #endif
7710     }
7711
7712   if (TARGET_MACHO)
7713     return "";
7714
7715   if (!flag_pic || TARGET_DEEP_BRANCH_PREDICTION)
7716     output_asm_insn ("add%z0\t{%1, %0|%0, %1}", xops);
7717   else
7718     output_asm_insn ("add%z0\t{%1+[.-%a2], %0|%0, %1+(.-%a2)}", xops);
7719
7720   return "";
7721 }
7722
7723 /* Generate an "push" pattern for input ARG.  */
7724
7725 static rtx
7726 gen_push (rtx arg)
7727 {
7728   if (ix86_cfa_state->reg == stack_pointer_rtx)
7729     ix86_cfa_state->offset += UNITS_PER_WORD;
7730
7731   return gen_rtx_SET (VOIDmode,
7732                       gen_rtx_MEM (Pmode,
7733                                    gen_rtx_PRE_DEC (Pmode,
7734                                                     stack_pointer_rtx)),
7735                       arg);
7736 }
7737
7738 /* Return >= 0 if there is an unused call-clobbered register available
7739    for the entire function.  */
7740
7741 static unsigned int
7742 ix86_select_alt_pic_regnum (void)
7743 {
7744   if (current_function_is_leaf && !crtl->profile
7745       && !ix86_current_function_calls_tls_descriptor)
7746     {
7747       int i, drap;
7748       /* Can't use the same register for both PIC and DRAP.  */
7749       if (crtl->drap_reg)
7750         drap = REGNO (crtl->drap_reg);
7751       else
7752         drap = -1;
7753       for (i = 2; i >= 0; --i)
7754         if (i != drap && !df_regs_ever_live_p (i))
7755           return i;
7756     }
7757
7758   return INVALID_REGNUM;
7759 }
7760
7761 /* Return 1 if we need to save REGNO.  */
7762 static int
7763 ix86_save_reg (unsigned int regno, int maybe_eh_return)
7764 {
7765   if (pic_offset_table_rtx
7766       && regno == REAL_PIC_OFFSET_TABLE_REGNUM
7767       && (df_regs_ever_live_p (REAL_PIC_OFFSET_TABLE_REGNUM)
7768           || crtl->profile
7769           || crtl->calls_eh_return
7770           || crtl->uses_const_pool))
7771     {
7772       if (ix86_select_alt_pic_regnum () != INVALID_REGNUM)
7773         return 0;
7774       return 1;
7775     }
7776
7777   if (crtl->calls_eh_return && maybe_eh_return)
7778     {
7779       unsigned i;
7780       for (i = 0; ; i++)
7781         {
7782           unsigned test = EH_RETURN_DATA_REGNO (i);
7783           if (test == INVALID_REGNUM)
7784             break;
7785           if (test == regno)
7786             return 1;
7787         }
7788     }
7789
7790   if (crtl->drap_reg && regno == REGNO (crtl->drap_reg))
7791     return 1;
7792
7793   return (df_regs_ever_live_p (regno)
7794           && !call_used_regs[regno]
7795           && !fixed_regs[regno]
7796           && (regno != HARD_FRAME_POINTER_REGNUM || !frame_pointer_needed));
7797 }
7798
7799 /* Return number of saved general prupose registers.  */
7800
7801 static int
7802 ix86_nsaved_regs (void)
7803 {
7804   int nregs = 0;
7805   int regno;
7806
7807   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
7808     if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
7809       nregs ++;
7810   return nregs;
7811 }
7812
7813 /* Return number of saved SSE registrers.  */
7814
7815 static int
7816 ix86_nsaved_sseregs (void)
7817 {
7818   int nregs = 0;
7819   int regno;
7820
7821   if (ix86_cfun_abi () != MS_ABI)
7822     return 0;
7823   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
7824     if (SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
7825       nregs ++;
7826   return nregs;
7827 }
7828
7829 /* Given FROM and TO register numbers, say whether this elimination is
7830    allowed.  If stack alignment is needed, we can only replace argument
7831    pointer with hard frame pointer, or replace frame pointer with stack
7832    pointer.  Otherwise, frame pointer elimination is automatically
7833    handled and all other eliminations are valid.  */
7834
7835 static bool
7836 ix86_can_eliminate (const int from, const int to)
7837 {
7838   if (stack_realign_fp)
7839     return ((from == ARG_POINTER_REGNUM
7840              && to == HARD_FRAME_POINTER_REGNUM)
7841             || (from == FRAME_POINTER_REGNUM
7842                 && to == STACK_POINTER_REGNUM));
7843   else
7844     return to == STACK_POINTER_REGNUM ? !frame_pointer_needed : true;
7845 }
7846
7847 /* Return the offset between two registers, one to be eliminated, and the other
7848    its replacement, at the start of a routine.  */
7849
7850 HOST_WIDE_INT
7851 ix86_initial_elimination_offset (int from, int to)
7852 {
7853   struct ix86_frame frame;
7854   ix86_compute_frame_layout (&frame);
7855
7856   if (from == ARG_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
7857     return frame.hard_frame_pointer_offset;
7858   else if (from == FRAME_POINTER_REGNUM
7859            && to == HARD_FRAME_POINTER_REGNUM)
7860     return frame.hard_frame_pointer_offset - frame.frame_pointer_offset;
7861   else
7862     {
7863       gcc_assert (to == STACK_POINTER_REGNUM);
7864
7865       if (from == ARG_POINTER_REGNUM)
7866         return frame.stack_pointer_offset;
7867
7868       gcc_assert (from == FRAME_POINTER_REGNUM);
7869       return frame.stack_pointer_offset - frame.frame_pointer_offset;
7870     }
7871 }
7872
7873 /* In a dynamically-aligned function, we can't know the offset from
7874    stack pointer to frame pointer, so we must ensure that setjmp
7875    eliminates fp against the hard fp (%ebp) rather than trying to
7876    index from %esp up to the top of the frame across a gap that is
7877    of unknown (at compile-time) size.  */
7878 static rtx
7879 ix86_builtin_setjmp_frame_value (void)
7880 {
7881   return stack_realign_fp ? hard_frame_pointer_rtx : virtual_stack_vars_rtx;
7882 }
7883
7884 /* Fill structure ix86_frame about frame of currently computed function.  */
7885
7886 static void
7887 ix86_compute_frame_layout (struct ix86_frame *frame)
7888 {
7889   unsigned int stack_alignment_needed;
7890   HOST_WIDE_INT offset;
7891   unsigned int preferred_alignment;
7892   HOST_WIDE_INT size = get_frame_size ();
7893
7894   frame->nregs = ix86_nsaved_regs ();
7895   frame->nsseregs = ix86_nsaved_sseregs ();
7896
7897   stack_alignment_needed = crtl->stack_alignment_needed / BITS_PER_UNIT;
7898   preferred_alignment = crtl->preferred_stack_boundary / BITS_PER_UNIT;
7899
7900   /* MS ABI seem to require stack alignment to be always 16 except for function
7901      prologues.  */
7902   if (ix86_cfun_abi () == MS_ABI && preferred_alignment < 16)
7903     {
7904       preferred_alignment = 16;
7905       stack_alignment_needed = 16;
7906       crtl->preferred_stack_boundary = 128;
7907       crtl->stack_alignment_needed = 128;
7908     }
7909
7910   gcc_assert (!size || stack_alignment_needed);
7911   gcc_assert (preferred_alignment >= STACK_BOUNDARY / BITS_PER_UNIT);
7912   gcc_assert (preferred_alignment <= stack_alignment_needed);
7913
7914   /* During reload iteration the amount of registers saved can change.
7915      Recompute the value as needed.  Do not recompute when amount of registers
7916      didn't change as reload does multiple calls to the function and does not
7917      expect the decision to change within single iteration.  */
7918   if (!optimize_function_for_size_p (cfun)
7919       && cfun->machine->use_fast_prologue_epilogue_nregs != frame->nregs)
7920     {
7921       int count = frame->nregs;
7922
7923       cfun->machine->use_fast_prologue_epilogue_nregs = count;
7924       /* The fast prologue uses move instead of push to save registers.  This
7925          is significantly longer, but also executes faster as modern hardware
7926          can execute the moves in parallel, but can't do that for push/pop.
7927
7928          Be careful about choosing what prologue to emit:  When function takes
7929          many instructions to execute we may use slow version as well as in
7930          case function is known to be outside hot spot (this is known with
7931          feedback only).  Weight the size of function by number of registers
7932          to save as it is cheap to use one or two push instructions but very
7933          slow to use many of them.  */
7934       if (count)
7935         count = (count - 1) * FAST_PROLOGUE_INSN_COUNT;
7936       if (cfun->function_frequency < FUNCTION_FREQUENCY_NORMAL
7937           || (flag_branch_probabilities
7938               && cfun->function_frequency < FUNCTION_FREQUENCY_HOT))
7939         cfun->machine->use_fast_prologue_epilogue = false;
7940       else
7941         cfun->machine->use_fast_prologue_epilogue
7942            = !expensive_function_p (count);
7943     }
7944   if (TARGET_PROLOGUE_USING_MOVE
7945       && cfun->machine->use_fast_prologue_epilogue)
7946     frame->save_regs_using_mov = true;
7947   else
7948     frame->save_regs_using_mov = false;
7949
7950   /* Skip return address.  */
7951   offset = UNITS_PER_WORD;
7952
7953   /* Skip pushed static chain.  */
7954   if (ix86_static_chain_on_stack)
7955     offset += UNITS_PER_WORD;
7956
7957   /* Skip saved base pointer.  */
7958   if (frame_pointer_needed)
7959     offset += UNITS_PER_WORD;
7960
7961   frame->hard_frame_pointer_offset = offset;
7962
7963   /* Set offset to aligned because the realigned frame starts from
7964      here.  */
7965   if (stack_realign_fp)
7966     offset = (offset + stack_alignment_needed -1) & -stack_alignment_needed;
7967
7968   /* Register save area */
7969   offset += frame->nregs * UNITS_PER_WORD;
7970
7971   /* Align SSE reg save area.  */
7972   if (frame->nsseregs)
7973     frame->padding0 = ((offset + 16 - 1) & -16) - offset;
7974   else
7975     frame->padding0 = 0;
7976   
7977   /* SSE register save area.  */
7978   offset += frame->padding0 + frame->nsseregs * 16;
7979
7980   /* Va-arg area */
7981   frame->va_arg_size = ix86_varargs_gpr_size + ix86_varargs_fpr_size;
7982   offset += frame->va_arg_size;
7983
7984   /* Align start of frame for local function.  */
7985   frame->padding1 = ((offset + stack_alignment_needed - 1)
7986                      & -stack_alignment_needed) - offset;
7987
7988   offset += frame->padding1;
7989
7990   /* Frame pointer points here.  */
7991   frame->frame_pointer_offset = offset;
7992
7993   offset += size;
7994
7995   /* Add outgoing arguments area.  Can be skipped if we eliminated
7996      all the function calls as dead code.
7997      Skipping is however impossible when function calls alloca.  Alloca
7998      expander assumes that last crtl->outgoing_args_size
7999      of stack frame are unused.  */
8000   if (ACCUMULATE_OUTGOING_ARGS
8001       && (!current_function_is_leaf || cfun->calls_alloca
8002           || ix86_current_function_calls_tls_descriptor))
8003     {
8004       offset += crtl->outgoing_args_size;
8005       frame->outgoing_arguments_size = crtl->outgoing_args_size;
8006     }
8007   else
8008     frame->outgoing_arguments_size = 0;
8009
8010   /* Align stack boundary.  Only needed if we're calling another function
8011      or using alloca.  */
8012   if (!current_function_is_leaf || cfun->calls_alloca
8013       || ix86_current_function_calls_tls_descriptor)
8014     frame->padding2 = ((offset + preferred_alignment - 1)
8015                        & -preferred_alignment) - offset;
8016   else
8017     frame->padding2 = 0;
8018
8019   offset += frame->padding2;
8020
8021   /* We've reached end of stack frame.  */
8022   frame->stack_pointer_offset = offset;
8023
8024   /* Size prologue needs to allocate.  */
8025   frame->to_allocate =
8026     (size + frame->padding1 + frame->padding2
8027      + frame->outgoing_arguments_size + frame->va_arg_size);
8028
8029   if ((!frame->to_allocate && frame->nregs <= 1)
8030       || (TARGET_64BIT && frame->to_allocate >= (HOST_WIDE_INT) 0x80000000))
8031     frame->save_regs_using_mov = false;
8032
8033   if (!TARGET_64BIT_MS_ABI && TARGET_RED_ZONE
8034       && current_function_sp_is_unchanging
8035       && current_function_is_leaf
8036       && !ix86_current_function_calls_tls_descriptor)
8037     {
8038       frame->red_zone_size = frame->to_allocate;
8039       if (frame->save_regs_using_mov)
8040         frame->red_zone_size += frame->nregs * UNITS_PER_WORD;
8041       if (frame->red_zone_size > RED_ZONE_SIZE - RED_ZONE_RESERVE)
8042         frame->red_zone_size = RED_ZONE_SIZE - RED_ZONE_RESERVE;
8043     }
8044   else
8045     frame->red_zone_size = 0;
8046   frame->to_allocate -= frame->red_zone_size;
8047   frame->stack_pointer_offset -= frame->red_zone_size;
8048 }
8049
8050 /* Emit code to save registers in the prologue.  */
8051
8052 static void
8053 ix86_emit_save_regs (void)
8054 {
8055   unsigned int regno;
8056   rtx insn;
8057
8058   for (regno = FIRST_PSEUDO_REGISTER - 1; regno-- > 0; )
8059     if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
8060       {
8061         insn = emit_insn (gen_push (gen_rtx_REG (Pmode, regno)));
8062         RTX_FRAME_RELATED_P (insn) = 1;
8063       }
8064 }
8065
8066 /* Emit code to save registers using MOV insns.  First register
8067    is restored from POINTER + OFFSET.  */
8068 static void
8069 ix86_emit_save_regs_using_mov (rtx pointer, HOST_WIDE_INT offset)
8070 {
8071   unsigned int regno;
8072   rtx insn;
8073
8074   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
8075     if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
8076       {
8077         insn = emit_move_insn (adjust_address (gen_rtx_MEM (Pmode, pointer),
8078                                                Pmode, offset),
8079                                gen_rtx_REG (Pmode, regno));
8080         RTX_FRAME_RELATED_P (insn) = 1;
8081         offset += UNITS_PER_WORD;
8082       }
8083 }
8084
8085 /* Emit code to save registers using MOV insns.  First register
8086    is restored from POINTER + OFFSET.  */
8087 static void
8088 ix86_emit_save_sse_regs_using_mov (rtx pointer, HOST_WIDE_INT offset)
8089 {
8090   unsigned int regno;
8091   rtx insn;
8092   rtx mem;
8093
8094   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
8095     if (SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
8096       {
8097         mem = adjust_address (gen_rtx_MEM (TImode, pointer), TImode, offset);
8098         set_mem_align (mem, 128);
8099         insn = emit_move_insn (mem, gen_rtx_REG (TImode, regno));
8100         RTX_FRAME_RELATED_P (insn) = 1;
8101         offset += 16;
8102       }
8103 }
8104
8105 static GTY(()) rtx queued_cfa_restores;
8106
8107 /* Add a REG_CFA_RESTORE REG note to INSN or queue them until next stack
8108    manipulation insn.  Don't add it if the previously
8109    saved value will be left untouched within stack red-zone till return,
8110    as unwinders can find the same value in the register and
8111    on the stack.  */
8112
8113 static void
8114 ix86_add_cfa_restore_note (rtx insn, rtx reg, HOST_WIDE_INT red_offset)
8115 {
8116   if (TARGET_RED_ZONE
8117       && !TARGET_64BIT_MS_ABI
8118       && red_offset + RED_ZONE_SIZE >= 0
8119       && crtl->args.pops_args < 65536)
8120     return;
8121
8122   if (insn)
8123     {
8124       add_reg_note (insn, REG_CFA_RESTORE, reg);
8125       RTX_FRAME_RELATED_P (insn) = 1;
8126     }
8127   else
8128     queued_cfa_restores
8129       = alloc_reg_note (REG_CFA_RESTORE, reg, queued_cfa_restores);
8130 }
8131
8132 /* Add queued REG_CFA_RESTORE notes if any to INSN.  */
8133
8134 static void
8135 ix86_add_queued_cfa_restore_notes (rtx insn)
8136 {
8137   rtx last;
8138   if (!queued_cfa_restores)
8139     return;
8140   for (last = queued_cfa_restores; XEXP (last, 1); last = XEXP (last, 1))
8141     ;
8142   XEXP (last, 1) = REG_NOTES (insn);
8143   REG_NOTES (insn) = queued_cfa_restores;
8144   queued_cfa_restores = NULL_RTX;
8145   RTX_FRAME_RELATED_P (insn) = 1;
8146 }
8147
8148 /* Expand prologue or epilogue stack adjustment.
8149    The pattern exist to put a dependency on all ebp-based memory accesses.
8150    STYLE should be negative if instructions should be marked as frame related,
8151    zero if %r11 register is live and cannot be freely used and positive
8152    otherwise.  */
8153
8154 static void
8155 pro_epilogue_adjust_stack (rtx dest, rtx src, rtx offset,
8156                            int style, bool set_cfa)
8157 {
8158   rtx insn;
8159
8160   if (! TARGET_64BIT)
8161     insn = emit_insn (gen_pro_epilogue_adjust_stack_1 (dest, src, offset));
8162   else if (x86_64_immediate_operand (offset, DImode))
8163     insn = emit_insn (gen_pro_epilogue_adjust_stack_rex64 (dest, src, offset));
8164   else
8165     {
8166       rtx r11;
8167       /* r11 is used by indirect sibcall return as well, set before the
8168          epilogue and used after the epilogue.  ATM indirect sibcall
8169          shouldn't be used together with huge frame sizes in one
8170          function because of the frame_size check in sibcall.c.  */
8171       gcc_assert (style);
8172       r11 = gen_rtx_REG (DImode, R11_REG);
8173       insn = emit_insn (gen_rtx_SET (DImode, r11, offset));
8174       if (style < 0)
8175         RTX_FRAME_RELATED_P (insn) = 1;
8176       insn = emit_insn (gen_pro_epilogue_adjust_stack_rex64_2 (dest, src, r11,
8177                                                                offset));
8178     }
8179
8180   if (style >= 0)
8181     ix86_add_queued_cfa_restore_notes (insn);
8182
8183   if (set_cfa)
8184     {
8185       rtx r;
8186
8187       gcc_assert (ix86_cfa_state->reg == src);
8188       ix86_cfa_state->offset += INTVAL (offset);
8189       ix86_cfa_state->reg = dest;
8190     
8191       r = gen_rtx_PLUS (Pmode, src, offset);
8192       r = gen_rtx_SET (VOIDmode, dest, r);
8193       add_reg_note (insn, REG_CFA_ADJUST_CFA, r);
8194       RTX_FRAME_RELATED_P (insn) = 1;
8195     }
8196   else if (style < 0)
8197     RTX_FRAME_RELATED_P (insn) = 1;
8198 }
8199
8200 /* Find an available register to be used as dynamic realign argument
8201    pointer regsiter.  Such a register will be written in prologue and
8202    used in begin of body, so it must not be
8203         1. parameter passing register.
8204         2. GOT pointer.
8205    We reuse static-chain register if it is available.  Otherwise, we
8206    use DI for i386 and R13 for x86-64.  We chose R13 since it has
8207    shorter encoding.
8208
8209    Return: the regno of chosen register.  */
8210
8211 static unsigned int 
8212 find_drap_reg (void)
8213 {
8214   tree decl = cfun->decl;
8215
8216   if (TARGET_64BIT)
8217     {
8218       /* Use R13 for nested function or function need static chain.
8219          Since function with tail call may use any caller-saved
8220          registers in epilogue, DRAP must not use caller-saved
8221          register in such case.  */
8222       if (DECL_STATIC_CHAIN (decl) || crtl->tail_call_emit)
8223         return R13_REG;
8224
8225       return R10_REG;
8226     }
8227   else
8228     {
8229       /* Use DI for nested function or function need static chain.
8230          Since function with tail call may use any caller-saved
8231          registers in epilogue, DRAP must not use caller-saved
8232          register in such case.  */
8233       if (DECL_STATIC_CHAIN (decl) || crtl->tail_call_emit)
8234         return DI_REG;
8235     
8236       /* Reuse static chain register if it isn't used for parameter
8237          passing.  */
8238       if (ix86_function_regparm (TREE_TYPE (decl), decl) <= 2
8239           && !lookup_attribute ("fastcall",
8240                                 TYPE_ATTRIBUTES (TREE_TYPE (decl))))
8241         return CX_REG;
8242       else
8243         return DI_REG;
8244     }
8245 }
8246
8247 /* Return minimum incoming stack alignment.  */
8248
8249 static unsigned int
8250 ix86_minimum_incoming_stack_boundary (bool sibcall)
8251 {
8252   unsigned int incoming_stack_boundary;
8253
8254   /* Prefer the one specified at command line. */
8255   if (ix86_user_incoming_stack_boundary)
8256     incoming_stack_boundary = ix86_user_incoming_stack_boundary;
8257   /* In 32bit, use MIN_STACK_BOUNDARY for incoming stack boundary
8258      if -mstackrealign is used, it isn't used for sibcall check and 
8259      estimated stack alignment is 128bit.  */
8260   else if (!sibcall
8261            && !TARGET_64BIT
8262            && ix86_force_align_arg_pointer
8263            && crtl->stack_alignment_estimated == 128)
8264     incoming_stack_boundary = MIN_STACK_BOUNDARY;
8265   else
8266     incoming_stack_boundary = ix86_default_incoming_stack_boundary;
8267
8268   /* Incoming stack alignment can be changed on individual functions
8269      via force_align_arg_pointer attribute.  We use the smallest
8270      incoming stack boundary.  */
8271   if (incoming_stack_boundary > MIN_STACK_BOUNDARY
8272       && lookup_attribute (ix86_force_align_arg_pointer_string,
8273                            TYPE_ATTRIBUTES (TREE_TYPE (current_function_decl))))
8274     incoming_stack_boundary = MIN_STACK_BOUNDARY;
8275
8276   /* The incoming stack frame has to be aligned at least at
8277      parm_stack_boundary.  */
8278   if (incoming_stack_boundary < crtl->parm_stack_boundary)
8279     incoming_stack_boundary = crtl->parm_stack_boundary;
8280
8281   /* Stack at entrance of main is aligned by runtime.  We use the
8282      smallest incoming stack boundary. */
8283   if (incoming_stack_boundary > MAIN_STACK_BOUNDARY
8284       && DECL_NAME (current_function_decl)
8285       && MAIN_NAME_P (DECL_NAME (current_function_decl))
8286       && DECL_FILE_SCOPE_P (current_function_decl))
8287     incoming_stack_boundary = MAIN_STACK_BOUNDARY;
8288
8289   return incoming_stack_boundary;
8290 }
8291
8292 /* Update incoming stack boundary and estimated stack alignment.  */
8293
8294 static void
8295 ix86_update_stack_boundary (void)
8296 {
8297   ix86_incoming_stack_boundary
8298     = ix86_minimum_incoming_stack_boundary (false);
8299
8300   /* x86_64 vararg needs 16byte stack alignment for register save
8301      area.  */
8302   if (TARGET_64BIT
8303       && cfun->stdarg
8304       && crtl->stack_alignment_estimated < 128)
8305     crtl->stack_alignment_estimated = 128;
8306 }
8307
8308 /* Handle the TARGET_GET_DRAP_RTX hook.  Return NULL if no DRAP is
8309    needed or an rtx for DRAP otherwise.  */
8310
8311 static rtx
8312 ix86_get_drap_rtx (void)
8313 {
8314   if (ix86_force_drap || !ACCUMULATE_OUTGOING_ARGS)
8315     crtl->need_drap = true;
8316
8317   if (stack_realign_drap)
8318     {
8319       /* Assign DRAP to vDRAP and returns vDRAP */
8320       unsigned int regno = find_drap_reg ();
8321       rtx drap_vreg;
8322       rtx arg_ptr;
8323       rtx seq, insn;
8324
8325       arg_ptr = gen_rtx_REG (Pmode, regno);
8326       crtl->drap_reg = arg_ptr;
8327
8328       start_sequence ();
8329       drap_vreg = copy_to_reg (arg_ptr);
8330       seq = get_insns ();
8331       end_sequence ();
8332       
8333       insn = emit_insn_before (seq, NEXT_INSN (entry_of_function ()));
8334       RTX_FRAME_RELATED_P (insn) = 1;
8335       return drap_vreg;
8336     }
8337   else
8338     return NULL;
8339 }
8340
8341 /* Handle the TARGET_INTERNAL_ARG_POINTER hook.  */
8342
8343 static rtx
8344 ix86_internal_arg_pointer (void)
8345 {
8346   return virtual_incoming_args_rtx;
8347 }
8348
8349 /* Finalize stack_realign_needed flag, which will guide prologue/epilogue
8350    to be generated in correct form.  */
8351 static void 
8352 ix86_finalize_stack_realign_flags (void)
8353 {
8354   /* Check if stack realign is really needed after reload, and 
8355      stores result in cfun */
8356   unsigned int incoming_stack_boundary
8357     = (crtl->parm_stack_boundary > ix86_incoming_stack_boundary
8358        ? crtl->parm_stack_boundary : ix86_incoming_stack_boundary);
8359   unsigned int stack_realign = (incoming_stack_boundary
8360                                 < (current_function_is_leaf
8361                                    ? crtl->max_used_stack_slot_alignment
8362                                    : crtl->stack_alignment_needed));
8363
8364   if (crtl->stack_realign_finalized)
8365     {
8366       /* After stack_realign_needed is finalized, we can't no longer
8367          change it.  */
8368       gcc_assert (crtl->stack_realign_needed == stack_realign);
8369     }
8370   else
8371     {
8372       crtl->stack_realign_needed = stack_realign;
8373       crtl->stack_realign_finalized = true;
8374     }
8375 }
8376
8377 /* Expand the prologue into a bunch of separate insns.  */
8378
8379 void
8380 ix86_expand_prologue (void)
8381 {
8382   rtx insn;
8383   bool pic_reg_used;
8384   struct ix86_frame frame;
8385   HOST_WIDE_INT allocate;
8386   int gen_frame_pointer = frame_pointer_needed;
8387
8388   ix86_finalize_stack_realign_flags ();
8389
8390   /* DRAP should not coexist with stack_realign_fp */
8391   gcc_assert (!(crtl->drap_reg && stack_realign_fp));
8392
8393   /* Initialize CFA state for before the prologue.  */
8394   ix86_cfa_state->reg = stack_pointer_rtx;
8395   ix86_cfa_state->offset = INCOMING_FRAME_SP_OFFSET;
8396
8397   ix86_compute_frame_layout (&frame);
8398
8399   if (ix86_function_ms_hook_prologue (current_function_decl))
8400     {
8401       rtx push, mov;
8402
8403       /* Make sure the function starts with
8404          8b ff     movl.s %edi,%edi
8405          55        push   %ebp
8406          8b ec     movl.s %esp,%ebp
8407
8408          This matches the hookable function prologue in Win32 API
8409          functions in Microsoft Windows XP Service Pack 2 and newer.
8410          Wine uses this to enable Windows apps to hook the Win32 API
8411          functions provided by Wine.  */
8412       insn = emit_insn (gen_vswapmov (gen_rtx_REG (SImode, DI_REG),
8413                                       gen_rtx_REG (SImode, DI_REG)));
8414       push = emit_insn (gen_push (hard_frame_pointer_rtx));
8415       mov = emit_insn (gen_vswapmov (hard_frame_pointer_rtx,
8416                                      stack_pointer_rtx));
8417
8418       if (frame_pointer_needed && !(crtl->drap_reg
8419                                     && crtl->stack_realign_needed))
8420         {
8421           /* The push %ebp and movl.s %esp, %ebp already set up
8422              the frame pointer.  No need to do this again. */
8423           gen_frame_pointer = 0;
8424           RTX_FRAME_RELATED_P (push) = 1;
8425           RTX_FRAME_RELATED_P (mov) = 1;
8426           if (ix86_cfa_state->reg == stack_pointer_rtx)
8427             ix86_cfa_state->reg = hard_frame_pointer_rtx;
8428         }
8429       else
8430         /* If the frame pointer is not needed, pop %ebp again. This
8431            could be optimized for cases where ebp needs to be backed up
8432            for some other reason.  If stack realignment is needed, pop
8433            the base pointer again, align the stack, and later regenerate
8434            the frame pointer setup.  The frame pointer generated by the
8435            hook prologue is not aligned, so it can't be used.  */
8436         insn = emit_insn ((*ix86_gen_pop1) (hard_frame_pointer_rtx));
8437     }
8438
8439   /* The first insn of a function that accepts its static chain on the
8440      stack is to push the register that would be filled in by a direct
8441      call.  This insn will be skipped by the trampoline.  */
8442   if (ix86_static_chain_on_stack)
8443     {
8444       rtx t;
8445
8446       insn = emit_insn (gen_push (ix86_static_chain (cfun->decl, false)));
8447       emit_insn (gen_blockage ());
8448
8449       /* We don't want to interpret this push insn as a register save,
8450          only as a stack adjustment.  The real copy of the register as
8451          a save will be done later, if needed.  */
8452       t = plus_constant (stack_pointer_rtx, -UNITS_PER_WORD);
8453       t = gen_rtx_SET (VOIDmode, stack_pointer_rtx, t);
8454       add_reg_note (insn, REG_CFA_ADJUST_CFA, t);
8455       RTX_FRAME_RELATED_P (insn) = 1;
8456     }
8457
8458   /* Emit prologue code to adjust stack alignment and setup DRAP, in case
8459      of DRAP is needed and stack realignment is really needed after reload */
8460   if (crtl->drap_reg && crtl->stack_realign_needed)
8461     {
8462       rtx x, y;
8463       int align_bytes = crtl->stack_alignment_needed / BITS_PER_UNIT;
8464       int param_ptr_offset = UNITS_PER_WORD;
8465
8466       if (ix86_static_chain_on_stack)
8467         param_ptr_offset += UNITS_PER_WORD;
8468       if (!call_used_regs[REGNO (crtl->drap_reg)])
8469         param_ptr_offset += UNITS_PER_WORD;
8470
8471       gcc_assert (stack_realign_drap);
8472
8473       /* Grab the argument pointer.  */
8474       x = plus_constant (stack_pointer_rtx, param_ptr_offset);
8475       y = crtl->drap_reg;
8476
8477       /* Only need to push parameter pointer reg if it is caller
8478          saved reg */
8479       if (!call_used_regs[REGNO (crtl->drap_reg)])
8480         {
8481           /* Push arg pointer reg */
8482           insn = emit_insn (gen_push (y));
8483           RTX_FRAME_RELATED_P (insn) = 1;
8484         }
8485
8486       insn = emit_insn (gen_rtx_SET (VOIDmode, y, x));
8487       RTX_FRAME_RELATED_P (insn) = 1; 
8488       ix86_cfa_state->reg = crtl->drap_reg;
8489
8490       /* Align the stack.  */
8491       insn = emit_insn ((*ix86_gen_andsp) (stack_pointer_rtx,
8492                                            stack_pointer_rtx,
8493                                            GEN_INT (-align_bytes)));
8494       RTX_FRAME_RELATED_P (insn) = 1;
8495
8496       /* Replicate the return address on the stack so that return
8497          address can be reached via (argp - 1) slot.  This is needed
8498          to implement macro RETURN_ADDR_RTX and intrinsic function
8499          expand_builtin_return_addr etc.  */
8500       x = crtl->drap_reg;
8501       x = gen_frame_mem (Pmode,
8502                          plus_constant (x, -UNITS_PER_WORD));
8503       insn = emit_insn (gen_push (x));
8504       RTX_FRAME_RELATED_P (insn) = 1;
8505     }
8506
8507   /* Note: AT&T enter does NOT have reversed args.  Enter is probably
8508      slower on all targets.  Also sdb doesn't like it.  */
8509
8510   if (gen_frame_pointer)
8511     {
8512       insn = emit_insn (gen_push (hard_frame_pointer_rtx));
8513       RTX_FRAME_RELATED_P (insn) = 1;
8514
8515       insn = emit_move_insn (hard_frame_pointer_rtx, stack_pointer_rtx);
8516       RTX_FRAME_RELATED_P (insn) = 1;
8517
8518       if (ix86_cfa_state->reg == stack_pointer_rtx)
8519         ix86_cfa_state->reg = hard_frame_pointer_rtx;
8520     }
8521
8522   if (stack_realign_fp)
8523     {
8524       int align_bytes = crtl->stack_alignment_needed / BITS_PER_UNIT;
8525       gcc_assert (align_bytes > MIN_STACK_BOUNDARY / BITS_PER_UNIT);
8526
8527       /* Align the stack.  */
8528       insn = emit_insn ((*ix86_gen_andsp) (stack_pointer_rtx,
8529                                            stack_pointer_rtx,
8530                                            GEN_INT (-align_bytes)));
8531       RTX_FRAME_RELATED_P (insn) = 1;
8532     }
8533
8534   allocate = frame.to_allocate + frame.nsseregs * 16 + frame.padding0;
8535
8536   if (!frame.save_regs_using_mov)
8537     ix86_emit_save_regs ();
8538   else
8539     allocate += frame.nregs * UNITS_PER_WORD;
8540
8541   /* When using red zone we may start register saving before allocating
8542      the stack frame saving one cycle of the prologue. However I will
8543      avoid doing this if I am going to have to probe the stack since
8544      at least on x86_64 the stack probe can turn into a call that clobbers
8545      a red zone location */
8546   if (!TARGET_64BIT_MS_ABI && TARGET_RED_ZONE && frame.save_regs_using_mov
8547       && (! TARGET_STACK_PROBE || allocate < CHECK_STACK_LIMIT))
8548     ix86_emit_save_regs_using_mov ((frame_pointer_needed
8549                                      && !crtl->stack_realign_needed) 
8550                                    ? hard_frame_pointer_rtx
8551                                    : stack_pointer_rtx,
8552                                    -frame.nregs * UNITS_PER_WORD);
8553
8554   if (allocate == 0)
8555     ;
8556   else if (! TARGET_STACK_PROBE || allocate < CHECK_STACK_LIMIT)
8557     pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
8558                                GEN_INT (-allocate), -1,
8559                                ix86_cfa_state->reg == stack_pointer_rtx);
8560   else
8561     {
8562       /* Only valid for Win32.  */
8563       rtx eax = gen_rtx_REG (Pmode, AX_REG);
8564       bool eax_live;
8565       rtx t;
8566
8567       gcc_assert (!TARGET_64BIT || cfun->machine->call_abi == MS_ABI);
8568
8569       if (cfun->machine->call_abi == MS_ABI)
8570         eax_live = false;
8571       else
8572         eax_live = ix86_eax_live_at_start_p ();
8573
8574       if (eax_live)
8575         {
8576           emit_insn (gen_push (eax));
8577           allocate -= UNITS_PER_WORD;
8578         }
8579
8580       emit_move_insn (eax, GEN_INT (allocate));
8581
8582       if (TARGET_64BIT)
8583         insn = gen_allocate_stack_worker_64 (eax, eax);
8584       else
8585         insn = gen_allocate_stack_worker_32 (eax, eax);
8586       insn = emit_insn (insn);
8587
8588       if (ix86_cfa_state->reg == stack_pointer_rtx)
8589         {
8590           ix86_cfa_state->offset += allocate;
8591           t = gen_rtx_PLUS (Pmode, stack_pointer_rtx, GEN_INT (-allocate));
8592           t = gen_rtx_SET (VOIDmode, stack_pointer_rtx, t);
8593           add_reg_note (insn, REG_CFA_ADJUST_CFA, t);
8594           RTX_FRAME_RELATED_P (insn) = 1;
8595         }
8596
8597       if (eax_live)
8598         {
8599           if (frame_pointer_needed)
8600             t = plus_constant (hard_frame_pointer_rtx,
8601                                allocate
8602                                - frame.to_allocate
8603                                - frame.nregs * UNITS_PER_WORD);
8604           else
8605             t = plus_constant (stack_pointer_rtx, allocate);
8606           emit_move_insn (eax, gen_rtx_MEM (Pmode, t));
8607         }
8608     }
8609
8610   if (frame.save_regs_using_mov
8611       && !(!TARGET_64BIT_MS_ABI && TARGET_RED_ZONE
8612          && (! TARGET_STACK_PROBE || allocate < CHECK_STACK_LIMIT)))
8613     {
8614       if (!frame_pointer_needed
8615           || !(frame.to_allocate + frame.padding0)
8616           || crtl->stack_realign_needed)
8617         ix86_emit_save_regs_using_mov (stack_pointer_rtx,
8618                                        frame.to_allocate
8619                                        + frame.nsseregs * 16 + frame.padding0);
8620       else
8621         ix86_emit_save_regs_using_mov (hard_frame_pointer_rtx,
8622                                        -frame.nregs * UNITS_PER_WORD);
8623     }
8624   if (!frame_pointer_needed
8625       || !(frame.to_allocate + frame.padding0)
8626       || crtl->stack_realign_needed)
8627     ix86_emit_save_sse_regs_using_mov (stack_pointer_rtx,
8628                                        frame.to_allocate);
8629   else
8630     ix86_emit_save_sse_regs_using_mov (hard_frame_pointer_rtx,
8631                                        - frame.nregs * UNITS_PER_WORD
8632                                        - frame.nsseregs * 16
8633                                        - frame.padding0);
8634
8635   pic_reg_used = false;
8636   if (pic_offset_table_rtx
8637       && (df_regs_ever_live_p (REAL_PIC_OFFSET_TABLE_REGNUM)
8638           || crtl->profile))
8639     {
8640       unsigned int alt_pic_reg_used = ix86_select_alt_pic_regnum ();
8641
8642       if (alt_pic_reg_used != INVALID_REGNUM)
8643         SET_REGNO (pic_offset_table_rtx, alt_pic_reg_used);
8644
8645       pic_reg_used = true;
8646     }
8647
8648   if (pic_reg_used)
8649     {
8650       if (TARGET_64BIT)
8651         {
8652           if (ix86_cmodel == CM_LARGE_PIC)
8653             {
8654               rtx tmp_reg = gen_rtx_REG (DImode, R11_REG);
8655               rtx label = gen_label_rtx ();
8656               emit_label (label);
8657               LABEL_PRESERVE_P (label) = 1;
8658               gcc_assert (REGNO (pic_offset_table_rtx) != REGNO (tmp_reg));
8659               insn = emit_insn (gen_set_rip_rex64 (pic_offset_table_rtx, label));
8660               insn = emit_insn (gen_set_got_offset_rex64 (tmp_reg, label));
8661               insn = emit_insn (gen_adddi3 (pic_offset_table_rtx,
8662                                             pic_offset_table_rtx, tmp_reg));
8663             }
8664           else
8665             insn = emit_insn (gen_set_got_rex64 (pic_offset_table_rtx));
8666         }
8667       else
8668         insn = emit_insn (gen_set_got (pic_offset_table_rtx));
8669     }
8670
8671   /* In the pic_reg_used case, make sure that the got load isn't deleted
8672      when mcount needs it.  Blockage to avoid call movement across mcount
8673      call is emitted in generic code after the NOTE_INSN_PROLOGUE_END
8674      note.  */
8675   if (crtl->profile && pic_reg_used)
8676     emit_insn (gen_prologue_use (pic_offset_table_rtx));
8677
8678   if (crtl->drap_reg && !crtl->stack_realign_needed)
8679     {
8680       /* vDRAP is setup but after reload it turns out stack realign
8681          isn't necessary, here we will emit prologue to setup DRAP
8682          without stack realign adjustment */
8683       rtx x;
8684       int drap_bp_offset = UNITS_PER_WORD * 2;
8685
8686       if (ix86_static_chain_on_stack)
8687         drap_bp_offset += UNITS_PER_WORD;
8688       x = plus_constant (hard_frame_pointer_rtx, drap_bp_offset);
8689       insn = emit_insn (gen_rtx_SET (VOIDmode, crtl->drap_reg, x));
8690     }
8691
8692   /* Prevent instructions from being scheduled into register save push
8693      sequence when access to the redzone area is done through frame pointer.
8694      The offset between the frame pointer and the stack pointer is calculated
8695      relative to the value of the stack pointer at the end of the function
8696      prologue, and moving instructions that access redzone area via frame
8697      pointer inside push sequence violates this assumption.  */
8698   if (frame_pointer_needed && frame.red_zone_size)
8699     emit_insn (gen_memory_blockage ());
8700
8701   /* Emit cld instruction if stringops are used in the function.  */
8702   if (TARGET_CLD && ix86_current_function_needs_cld)
8703     emit_insn (gen_cld ());
8704 }
8705
8706 /* Emit code to restore REG using a POP insn.  */
8707
8708 static void
8709 ix86_emit_restore_reg_using_pop (rtx reg, HOST_WIDE_INT red_offset)
8710 {
8711   rtx insn = emit_insn (ix86_gen_pop1 (reg));
8712
8713   if (ix86_cfa_state->reg == crtl->drap_reg
8714       && REGNO (reg) == REGNO (crtl->drap_reg))
8715     {
8716       /* Previously we'd represented the CFA as an expression
8717          like *(%ebp - 8).  We've just popped that value from
8718          the stack, which means we need to reset the CFA to
8719          the drap register.  This will remain until we restore
8720          the stack pointer.  */
8721       add_reg_note (insn, REG_CFA_DEF_CFA, reg);
8722       RTX_FRAME_RELATED_P (insn) = 1;
8723       return;
8724     }
8725
8726   if (ix86_cfa_state->reg == stack_pointer_rtx)
8727     {
8728       ix86_cfa_state->offset -= UNITS_PER_WORD;
8729       add_reg_note (insn, REG_CFA_ADJUST_CFA,
8730                     copy_rtx (XVECEXP (PATTERN (insn), 0, 1)));
8731       RTX_FRAME_RELATED_P (insn) = 1;
8732     }
8733
8734   /* When the frame pointer is the CFA, and we pop it, we are
8735      swapping back to the stack pointer as the CFA.  This happens
8736      for stack frames that don't allocate other data, so we assume
8737      the stack pointer is now pointing at the return address, i.e.
8738      the function entry state, which makes the offset be 1 word.  */
8739   else if (ix86_cfa_state->reg == hard_frame_pointer_rtx
8740            && reg == hard_frame_pointer_rtx)
8741     {
8742       ix86_cfa_state->reg = stack_pointer_rtx;
8743       ix86_cfa_state->offset -= UNITS_PER_WORD;
8744
8745       add_reg_note (insn, REG_CFA_DEF_CFA,
8746                     gen_rtx_PLUS (Pmode, stack_pointer_rtx,
8747                                   GEN_INT (ix86_cfa_state->offset)));
8748       RTX_FRAME_RELATED_P (insn) = 1;
8749     }
8750
8751   ix86_add_cfa_restore_note (insn, reg, red_offset);
8752 }
8753
8754 /* Emit code to restore saved registers using POP insns.  */
8755
8756 static void
8757 ix86_emit_restore_regs_using_pop (HOST_WIDE_INT red_offset)
8758 {
8759   int regno;
8760
8761   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
8762     if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, false))
8763       {
8764         ix86_emit_restore_reg_using_pop (gen_rtx_REG (Pmode, regno),
8765                                          red_offset);
8766         red_offset += UNITS_PER_WORD;
8767       }
8768 }
8769
8770 /* Emit code and notes for the LEAVE instruction.  */
8771
8772 static void
8773 ix86_emit_leave (HOST_WIDE_INT red_offset)
8774 {
8775   rtx insn = emit_insn (ix86_gen_leave ());
8776
8777   ix86_add_queued_cfa_restore_notes (insn);
8778
8779   if (ix86_cfa_state->reg == hard_frame_pointer_rtx)
8780     {
8781       ix86_cfa_state->reg = stack_pointer_rtx;
8782       ix86_cfa_state->offset -= UNITS_PER_WORD;
8783
8784       add_reg_note (insn, REG_CFA_ADJUST_CFA, 
8785                     copy_rtx (XVECEXP (PATTERN (insn), 0, 0)));
8786       RTX_FRAME_RELATED_P (insn) = 1;
8787       ix86_add_cfa_restore_note (insn, hard_frame_pointer_rtx, red_offset);
8788     }
8789 }
8790
8791 /* Emit code to restore saved registers using MOV insns.  First register
8792    is restored from POINTER + OFFSET.  */
8793 static void
8794 ix86_emit_restore_regs_using_mov (rtx pointer, HOST_WIDE_INT offset,
8795                                   HOST_WIDE_INT red_offset,
8796                                   int maybe_eh_return)
8797 {
8798   unsigned int regno;
8799   rtx base_address = gen_rtx_MEM (Pmode, pointer);
8800   rtx insn;
8801
8802   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
8803     if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, maybe_eh_return))
8804       {
8805         rtx reg = gen_rtx_REG (Pmode, regno);
8806
8807         /* Ensure that adjust_address won't be forced to produce pointer
8808            out of range allowed by x86-64 instruction set.  */
8809         if (TARGET_64BIT && offset != trunc_int_for_mode (offset, SImode))
8810           {
8811             rtx r11;
8812
8813             r11 = gen_rtx_REG (DImode, R11_REG);
8814             emit_move_insn (r11, GEN_INT (offset));
8815             emit_insn (gen_adddi3 (r11, r11, pointer));
8816             base_address = gen_rtx_MEM (Pmode, r11);
8817             offset = 0;
8818           }
8819         insn = emit_move_insn (reg,
8820                                adjust_address (base_address, Pmode, offset));
8821         offset += UNITS_PER_WORD;
8822
8823         if (ix86_cfa_state->reg == crtl->drap_reg
8824             && regno == REGNO (crtl->drap_reg))
8825           {
8826             /* Previously we'd represented the CFA as an expression
8827                like *(%ebp - 8).  We've just popped that value from
8828                the stack, which means we need to reset the CFA to
8829                the drap register.  This will remain until we restore
8830                the stack pointer.  */
8831             add_reg_note (insn, REG_CFA_DEF_CFA, reg);
8832             RTX_FRAME_RELATED_P (insn) = 1;
8833           }
8834         else
8835           ix86_add_cfa_restore_note (NULL_RTX, reg, red_offset);
8836
8837         red_offset += UNITS_PER_WORD;
8838       }
8839 }
8840
8841 /* Emit code to restore saved registers using MOV insns.  First register
8842    is restored from POINTER + OFFSET.  */
8843 static void
8844 ix86_emit_restore_sse_regs_using_mov (rtx pointer, HOST_WIDE_INT offset,
8845                                       HOST_WIDE_INT red_offset,
8846                                       int maybe_eh_return)
8847 {
8848   int regno;
8849   rtx base_address = gen_rtx_MEM (TImode, pointer);
8850   rtx mem;
8851
8852   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
8853     if (SSE_REGNO_P (regno) && ix86_save_reg (regno, maybe_eh_return))
8854       {
8855         rtx reg = gen_rtx_REG (TImode, regno);
8856
8857         /* Ensure that adjust_address won't be forced to produce pointer
8858            out of range allowed by x86-64 instruction set.  */
8859         if (TARGET_64BIT && offset != trunc_int_for_mode (offset, SImode))
8860           {
8861             rtx r11;
8862
8863             r11 = gen_rtx_REG (DImode, R11_REG);
8864             emit_move_insn (r11, GEN_INT (offset));
8865             emit_insn (gen_adddi3 (r11, r11, pointer));
8866             base_address = gen_rtx_MEM (TImode, r11);
8867             offset = 0;
8868           }
8869         mem = adjust_address (base_address, TImode, offset);
8870         set_mem_align (mem, 128);
8871         emit_move_insn (reg, mem);
8872         offset += 16;
8873
8874         ix86_add_cfa_restore_note (NULL_RTX, reg, red_offset);
8875
8876         red_offset += 16;
8877       }
8878 }
8879
8880 /* Restore function stack, frame, and registers.  */
8881
8882 void
8883 ix86_expand_epilogue (int style)
8884 {
8885   int sp_valid;
8886   struct ix86_frame frame;
8887   HOST_WIDE_INT offset, red_offset;
8888   struct machine_cfa_state cfa_state_save = *ix86_cfa_state;
8889   bool using_drap;
8890
8891   ix86_finalize_stack_realign_flags ();
8892
8893  /* When stack is realigned, SP must be valid.  */
8894   sp_valid = (!frame_pointer_needed
8895               || current_function_sp_is_unchanging
8896               || stack_realign_fp);
8897
8898   ix86_compute_frame_layout (&frame);
8899
8900   /* See the comment about red zone and frame
8901      pointer usage in ix86_expand_prologue.  */
8902   if (frame_pointer_needed && frame.red_zone_size)
8903     emit_insn (gen_memory_blockage ()); 
8904
8905   using_drap = crtl->drap_reg && crtl->stack_realign_needed;
8906   gcc_assert (!using_drap || ix86_cfa_state->reg == crtl->drap_reg);
8907
8908   /* Calculate start of saved registers relative to ebp.  Special care
8909      must be taken for the normal return case of a function using
8910      eh_return: the eax and edx registers are marked as saved, but not
8911      restored along this path.  */
8912   offset = frame.nregs;
8913   if (crtl->calls_eh_return && style != 2)
8914     offset -= 2;
8915   offset *= -UNITS_PER_WORD;
8916   offset -= frame.nsseregs * 16 + frame.padding0;
8917
8918   /* Calculate start of saved registers relative to esp on entry of the
8919      function.  When realigning stack, this needs to be the most negative
8920      value possible at runtime.  */
8921   red_offset = offset;
8922   if (using_drap)
8923     red_offset -= crtl->stack_alignment_needed / BITS_PER_UNIT
8924                   + UNITS_PER_WORD;
8925   else if (stack_realign_fp)
8926     red_offset -= crtl->stack_alignment_needed / BITS_PER_UNIT
8927                   - UNITS_PER_WORD;
8928   if (ix86_static_chain_on_stack)
8929     red_offset -= UNITS_PER_WORD;
8930   if (frame_pointer_needed)
8931     red_offset -= UNITS_PER_WORD;
8932
8933   /* If we're only restoring one register and sp is not valid then
8934      using a move instruction to restore the register since it's
8935      less work than reloading sp and popping the register.
8936
8937      The default code result in stack adjustment using add/lea instruction,
8938      while this code results in LEAVE instruction (or discrete equivalent),
8939      so it is profitable in some other cases as well.  Especially when there
8940      are no registers to restore.  We also use this code when TARGET_USE_LEAVE
8941      and there is exactly one register to pop. This heuristic may need some
8942      tuning in future.  */
8943   if ((!sp_valid && (frame.nregs + frame.nsseregs) <= 1)
8944       || (TARGET_EPILOGUE_USING_MOVE
8945           && cfun->machine->use_fast_prologue_epilogue
8946           && ((frame.nregs + frame.nsseregs) > 1
8947               || (frame.to_allocate + frame.padding0) != 0))
8948       || (frame_pointer_needed && !(frame.nregs + frame.nsseregs)
8949           && (frame.to_allocate + frame.padding0) != 0)
8950       || (frame_pointer_needed && TARGET_USE_LEAVE
8951           && cfun->machine->use_fast_prologue_epilogue
8952           && (frame.nregs + frame.nsseregs) == 1)
8953       || crtl->calls_eh_return)
8954     {
8955       /* Restore registers.  We can use ebp or esp to address the memory
8956          locations.  If both are available, default to ebp, since offsets
8957          are known to be small.  Only exception is esp pointing directly
8958          to the end of block of saved registers, where we may simplify
8959          addressing mode.  
8960
8961          If we are realigning stack with bp and sp, regs restore can't
8962          be addressed by bp. sp must be used instead.  */
8963
8964       if (!frame_pointer_needed
8965           || (sp_valid && !(frame.to_allocate + frame.padding0)) 
8966           || stack_realign_fp)
8967         {
8968           ix86_emit_restore_sse_regs_using_mov (stack_pointer_rtx,
8969                                                 frame.to_allocate, red_offset,
8970                                                 style == 2);
8971           ix86_emit_restore_regs_using_mov (stack_pointer_rtx,
8972                                             frame.to_allocate
8973                                             + frame.nsseregs * 16
8974                                             + frame.padding0,
8975                                             red_offset
8976                                             + frame.nsseregs * 16
8977                                             + frame.padding0, style == 2);
8978         }
8979       else
8980         {
8981           ix86_emit_restore_sse_regs_using_mov (hard_frame_pointer_rtx,
8982                                                 offset, red_offset,
8983                                                 style == 2);
8984           ix86_emit_restore_regs_using_mov (hard_frame_pointer_rtx,
8985                                             offset
8986                                             + frame.nsseregs * 16
8987                                             + frame.padding0,
8988                                             red_offset
8989                                             + frame.nsseregs * 16
8990                                             + frame.padding0, style == 2);
8991         }
8992
8993       red_offset -= offset;
8994
8995       /* eh_return epilogues need %ecx added to the stack pointer.  */
8996       if (style == 2)
8997         {
8998           rtx tmp, sa = EH_RETURN_STACKADJ_RTX;
8999
9000           /* Stack align doesn't work with eh_return.  */
9001           gcc_assert (!crtl->stack_realign_needed);
9002           /* Neither does regparm nested functions.  */
9003           gcc_assert (!ix86_static_chain_on_stack);
9004
9005           if (frame_pointer_needed)
9006             {
9007               tmp = gen_rtx_PLUS (Pmode, hard_frame_pointer_rtx, sa);
9008               tmp = plus_constant (tmp, UNITS_PER_WORD);
9009               tmp = emit_insn (gen_rtx_SET (VOIDmode, sa, tmp));
9010
9011               tmp = gen_rtx_MEM (Pmode, hard_frame_pointer_rtx);
9012               tmp = emit_move_insn (hard_frame_pointer_rtx, tmp);
9013
9014               /* Note that we use SA as a temporary CFA, as the return
9015                  address is at the proper place relative to it.  We
9016                  pretend this happens at the FP restore insn because
9017                  prior to this insn the FP would be stored at the wrong
9018                  offset relative to SA, and after this insn we have no
9019                  other reasonable register to use for the CFA.  We don't
9020                  bother resetting the CFA to the SP for the duration of
9021                  the return insn.  */
9022               add_reg_note (tmp, REG_CFA_DEF_CFA,
9023                             plus_constant (sa, UNITS_PER_WORD));
9024               ix86_add_queued_cfa_restore_notes (tmp);
9025               add_reg_note (tmp, REG_CFA_RESTORE, hard_frame_pointer_rtx);
9026               RTX_FRAME_RELATED_P (tmp) = 1;
9027               ix86_cfa_state->reg = sa;
9028               ix86_cfa_state->offset = UNITS_PER_WORD;
9029
9030               pro_epilogue_adjust_stack (stack_pointer_rtx, sa,
9031                                          const0_rtx, style, false);
9032             }
9033           else
9034             {
9035               tmp = gen_rtx_PLUS (Pmode, stack_pointer_rtx, sa);
9036               tmp = plus_constant (tmp, (frame.to_allocate
9037                                          + frame.nregs * UNITS_PER_WORD
9038                                          + frame.nsseregs * 16
9039                                          + frame.padding0));
9040               tmp = emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx, tmp));
9041               ix86_add_queued_cfa_restore_notes (tmp);
9042
9043               gcc_assert (ix86_cfa_state->reg == stack_pointer_rtx);
9044               if (ix86_cfa_state->offset != UNITS_PER_WORD)
9045                 {
9046                   ix86_cfa_state->offset = UNITS_PER_WORD;
9047                   add_reg_note (tmp, REG_CFA_DEF_CFA,
9048                                 plus_constant (stack_pointer_rtx,
9049                                                UNITS_PER_WORD));
9050                   RTX_FRAME_RELATED_P (tmp) = 1;
9051                 }
9052             }
9053         }
9054       else if (!frame_pointer_needed)
9055         pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
9056                                    GEN_INT (frame.to_allocate
9057                                             + frame.nregs * UNITS_PER_WORD
9058                                             + frame.nsseregs * 16
9059                                             + frame.padding0),
9060                                    style, !using_drap);
9061       /* If not an i386, mov & pop is faster than "leave".  */
9062       else if (TARGET_USE_LEAVE || optimize_function_for_size_p (cfun)
9063                || !cfun->machine->use_fast_prologue_epilogue)
9064         ix86_emit_leave (red_offset);
9065       else
9066         {
9067           pro_epilogue_adjust_stack (stack_pointer_rtx,
9068                                      hard_frame_pointer_rtx,
9069                                      const0_rtx, style, !using_drap);
9070
9071           ix86_emit_restore_reg_using_pop (hard_frame_pointer_rtx, red_offset);
9072         }
9073     }
9074   else
9075     {
9076       /* First step is to deallocate the stack frame so that we can
9077          pop the registers.
9078
9079          If we realign stack with frame pointer, then stack pointer
9080          won't be able to recover via lea $offset(%bp), %sp, because
9081          there is a padding area between bp and sp for realign. 
9082          "add $to_allocate, %sp" must be used instead.  */
9083       if (!sp_valid)
9084         {
9085           gcc_assert (frame_pointer_needed);
9086           gcc_assert (!stack_realign_fp);
9087           pro_epilogue_adjust_stack (stack_pointer_rtx,
9088                                      hard_frame_pointer_rtx,
9089                                      GEN_INT (offset), style, false);
9090           ix86_emit_restore_sse_regs_using_mov (stack_pointer_rtx,
9091                                                 0, red_offset,
9092                                                 style == 2);
9093           pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
9094                                      GEN_INT (frame.nsseregs * 16
9095                                               + frame.padding0),
9096                                      style, false);
9097         }
9098       else if (frame.to_allocate || frame.padding0 || frame.nsseregs)
9099         {
9100           ix86_emit_restore_sse_regs_using_mov (stack_pointer_rtx,
9101                                                 frame.to_allocate, red_offset,
9102                                                 style == 2);
9103           pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
9104                                      GEN_INT (frame.to_allocate
9105                                               + frame.nsseregs * 16
9106                                               + frame.padding0), style,
9107                                      !using_drap && !frame_pointer_needed);
9108         }
9109
9110       ix86_emit_restore_regs_using_pop (red_offset + frame.nsseregs * 16
9111                                         + frame.padding0);
9112       red_offset -= offset;
9113
9114       if (frame_pointer_needed)
9115         {
9116           /* Leave results in shorter dependency chains on CPUs that are
9117              able to grok it fast.  */
9118           if (TARGET_USE_LEAVE)
9119             ix86_emit_leave (red_offset);
9120           else
9121             {
9122               /* For stack realigned really happens, recover stack 
9123                  pointer to hard frame pointer is a must, if not using 
9124                  leave.  */
9125               if (stack_realign_fp)
9126                 pro_epilogue_adjust_stack (stack_pointer_rtx,
9127                                            hard_frame_pointer_rtx,
9128                                            const0_rtx, style, !using_drap);
9129               ix86_emit_restore_reg_using_pop (hard_frame_pointer_rtx,
9130                                                red_offset);
9131             }
9132         }
9133     }
9134
9135   if (using_drap)
9136     {
9137       int param_ptr_offset = UNITS_PER_WORD;
9138       rtx insn;
9139
9140       gcc_assert (stack_realign_drap);
9141
9142       if (ix86_static_chain_on_stack)
9143         param_ptr_offset += UNITS_PER_WORD;
9144       if (!call_used_regs[REGNO (crtl->drap_reg)])
9145         param_ptr_offset += UNITS_PER_WORD;
9146
9147       insn = emit_insn ((*ix86_gen_add3) (stack_pointer_rtx,
9148                                           crtl->drap_reg,
9149                                           GEN_INT (-param_ptr_offset)));
9150
9151       ix86_cfa_state->reg = stack_pointer_rtx;
9152       ix86_cfa_state->offset = param_ptr_offset;
9153
9154       add_reg_note (insn, REG_CFA_DEF_CFA,
9155                     gen_rtx_PLUS (Pmode, ix86_cfa_state->reg,
9156                                   GEN_INT (ix86_cfa_state->offset)));
9157       RTX_FRAME_RELATED_P (insn) = 1;
9158
9159       if (!call_used_regs[REGNO (crtl->drap_reg)])
9160         ix86_emit_restore_reg_using_pop (crtl->drap_reg, -UNITS_PER_WORD);
9161     }
9162
9163   /* Remove the saved static chain from the stack.  The use of ECX is
9164      merely as a scratch register, not as the actual static chain.  */
9165   if (ix86_static_chain_on_stack)
9166     {
9167       rtx r, insn;
9168
9169       gcc_assert (ix86_cfa_state->reg == stack_pointer_rtx);
9170       ix86_cfa_state->offset += UNITS_PER_WORD;
9171     
9172       r = gen_rtx_REG (Pmode, CX_REG);
9173       insn = emit_insn (ix86_gen_pop1 (r));
9174
9175       r = plus_constant (stack_pointer_rtx, UNITS_PER_WORD);
9176       r = gen_rtx_SET (VOIDmode, stack_pointer_rtx, r);
9177       add_reg_note (insn, REG_CFA_ADJUST_CFA, r);
9178       RTX_FRAME_RELATED_P (insn) = 1;
9179     }
9180
9181   /* Sibcall epilogues don't want a return instruction.  */
9182   if (style == 0)
9183     {
9184       *ix86_cfa_state = cfa_state_save;
9185       return;
9186     }
9187
9188   if (crtl->args.pops_args && crtl->args.size)
9189     {
9190       rtx popc = GEN_INT (crtl->args.pops_args);
9191
9192       /* i386 can only pop 64K bytes.  If asked to pop more, pop return
9193          address, do explicit add, and jump indirectly to the caller.  */
9194
9195       if (crtl->args.pops_args >= 65536)
9196         {
9197           rtx ecx = gen_rtx_REG (SImode, CX_REG);
9198           rtx insn;
9199
9200           /* There is no "pascal" calling convention in any 64bit ABI.  */
9201           gcc_assert (!TARGET_64BIT);
9202
9203           insn = emit_insn (gen_popsi1 (ecx));
9204           ix86_cfa_state->offset -= UNITS_PER_WORD;
9205
9206           add_reg_note (insn, REG_CFA_ADJUST_CFA,
9207                         copy_rtx (XVECEXP (PATTERN (insn), 0, 1)));
9208           add_reg_note (insn, REG_CFA_REGISTER,
9209                         gen_rtx_SET (VOIDmode, ecx, pc_rtx));
9210           RTX_FRAME_RELATED_P (insn) = 1;
9211
9212           pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
9213                                      popc, -1, true);
9214           emit_jump_insn (gen_return_indirect_internal (ecx));
9215         }
9216       else
9217         emit_jump_insn (gen_return_pop_internal (popc));
9218     }
9219   else
9220     emit_jump_insn (gen_return_internal ());
9221
9222   /* Restore the state back to the state from the prologue,
9223      so that it's correct for the next epilogue.  */
9224   *ix86_cfa_state = cfa_state_save;
9225 }
9226
9227 /* Reset from the function's potential modifications.  */
9228
9229 static void
9230 ix86_output_function_epilogue (FILE *file ATTRIBUTE_UNUSED,
9231                                HOST_WIDE_INT size ATTRIBUTE_UNUSED)
9232 {
9233   if (pic_offset_table_rtx)
9234     SET_REGNO (pic_offset_table_rtx, REAL_PIC_OFFSET_TABLE_REGNUM);
9235 #if TARGET_MACHO
9236   /* Mach-O doesn't support labels at the end of objects, so if
9237      it looks like we might want one, insert a NOP.  */
9238   {
9239     rtx insn = get_last_insn ();
9240     while (insn
9241            && NOTE_P (insn)
9242            && NOTE_KIND (insn) != NOTE_INSN_DELETED_LABEL)
9243       insn = PREV_INSN (insn);
9244     if (insn
9245         && (LABEL_P (insn)
9246             || (NOTE_P (insn)
9247                 && NOTE_KIND (insn) == NOTE_INSN_DELETED_LABEL)))
9248       fputs ("\tnop\n", file);
9249   }
9250 #endif
9251
9252 }
9253 \f
9254 /* Extract the parts of an RTL expression that is a valid memory address
9255    for an instruction.  Return 0 if the structure of the address is
9256    grossly off.  Return -1 if the address contains ASHIFT, so it is not
9257    strictly valid, but still used for computing length of lea instruction.  */
9258
9259 int
9260 ix86_decompose_address (rtx addr, struct ix86_address *out)
9261 {
9262   rtx base = NULL_RTX, index = NULL_RTX, disp = NULL_RTX;
9263   rtx base_reg, index_reg;
9264   HOST_WIDE_INT scale = 1;
9265   rtx scale_rtx = NULL_RTX;
9266   int retval = 1;
9267   enum ix86_address_seg seg = SEG_DEFAULT;
9268
9269   if (REG_P (addr) || GET_CODE (addr) == SUBREG)
9270     base = addr;
9271   else if (GET_CODE (addr) == PLUS)
9272     {
9273       rtx addends[4], op;
9274       int n = 0, i;
9275
9276       op = addr;
9277       do
9278         {
9279           if (n >= 4)
9280             return 0;
9281           addends[n++] = XEXP (op, 1);
9282           op = XEXP (op, 0);
9283         }
9284       while (GET_CODE (op) == PLUS);
9285       if (n >= 4)
9286         return 0;
9287       addends[n] = op;
9288
9289       for (i = n; i >= 0; --i)
9290         {
9291           op = addends[i];
9292           switch (GET_CODE (op))
9293             {
9294             case MULT:
9295               if (index)
9296                 return 0;
9297               index = XEXP (op, 0);
9298               scale_rtx = XEXP (op, 1);
9299               break;
9300
9301             case UNSPEC:
9302               if (XINT (op, 1) == UNSPEC_TP
9303                   && TARGET_TLS_DIRECT_SEG_REFS
9304                   && seg == SEG_DEFAULT)
9305                 seg = TARGET_64BIT ? SEG_FS : SEG_GS;
9306               else
9307                 return 0;
9308               break;
9309
9310             case REG:
9311             case SUBREG:
9312               if (!base)
9313                 base = op;
9314               else if (!index)
9315                 index = op;
9316               else
9317                 return 0;
9318               break;
9319
9320             case CONST:
9321             case CONST_INT:
9322             case SYMBOL_REF:
9323             case LABEL_REF:
9324               if (disp)
9325                 return 0;
9326               disp = op;
9327               break;
9328
9329             default:
9330               return 0;
9331             }
9332         }
9333     }
9334   else if (GET_CODE (addr) == MULT)
9335     {
9336       index = XEXP (addr, 0);           /* index*scale */
9337       scale_rtx = XEXP (addr, 1);
9338     }
9339   else if (GET_CODE (addr) == ASHIFT)
9340     {
9341       rtx tmp;
9342
9343       /* We're called for lea too, which implements ashift on occasion.  */
9344       index = XEXP (addr, 0);
9345       tmp = XEXP (addr, 1);
9346       if (!CONST_INT_P (tmp))
9347         return 0;
9348       scale = INTVAL (tmp);
9349       if ((unsigned HOST_WIDE_INT) scale > 3)
9350         return 0;
9351       scale = 1 << scale;
9352       retval = -1;
9353     }
9354   else
9355     disp = addr;                        /* displacement */
9356
9357   /* Extract the integral value of scale.  */
9358   if (scale_rtx)
9359     {
9360       if (!CONST_INT_P (scale_rtx))
9361         return 0;
9362       scale = INTVAL (scale_rtx);
9363     }
9364
9365   base_reg = base && GET_CODE (base) == SUBREG ? SUBREG_REG (base) : base;
9366   index_reg = index && GET_CODE (index) == SUBREG ? SUBREG_REG (index) : index;
9367
9368   /* Avoid useless 0 displacement.  */
9369   if (disp == const0_rtx && (base || index))
9370     disp = NULL_RTX;
9371
9372   /* Allow arg pointer and stack pointer as index if there is not scaling.  */
9373   if (base_reg && index_reg && scale == 1
9374       && (index_reg == arg_pointer_rtx
9375           || index_reg == frame_pointer_rtx
9376           || (REG_P (index_reg) && REGNO (index_reg) == STACK_POINTER_REGNUM)))
9377     {
9378       rtx tmp;
9379       tmp = base, base = index, index = tmp;
9380       tmp = base_reg, base_reg = index_reg, index_reg = tmp;
9381     }
9382
9383   /* Special case: %ebp cannot be encoded as a base without a displacement.
9384      Similarly %r13.  */
9385   if (!disp
9386       && base_reg
9387       && (base_reg == hard_frame_pointer_rtx
9388           || base_reg == frame_pointer_rtx
9389           || base_reg == arg_pointer_rtx
9390           || (REG_P (base_reg)
9391               && (REGNO (base_reg) == HARD_FRAME_POINTER_REGNUM
9392                   || REGNO (base_reg) == R13_REG))))
9393     disp = const0_rtx;
9394
9395   /* Special case: on K6, [%esi] makes the instruction vector decoded.
9396      Avoid this by transforming to [%esi+0].
9397      Reload calls address legitimization without cfun defined, so we need
9398      to test cfun for being non-NULL. */
9399   if (TARGET_K6 && cfun && optimize_function_for_speed_p (cfun)
9400       && base_reg && !index_reg && !disp
9401       && REG_P (base_reg)
9402       && REGNO_REG_CLASS (REGNO (base_reg)) == SIREG)
9403     disp = const0_rtx;
9404
9405   /* Special case: encode reg+reg instead of reg*2.  */
9406   if (!base && index && scale == 2)
9407     base = index, base_reg = index_reg, scale = 1;
9408
9409   /* Special case: scaling cannot be encoded without base or displacement.  */
9410   if (!base && !disp && index && scale != 1)
9411     disp = const0_rtx;
9412
9413   out->base = base;
9414   out->index = index;
9415   out->disp = disp;
9416   out->scale = scale;
9417   out->seg = seg;
9418
9419   return retval;
9420 }
9421 \f
9422 /* Return cost of the memory address x.
9423    For i386, it is better to use a complex address than let gcc copy
9424    the address into a reg and make a new pseudo.  But not if the address
9425    requires to two regs - that would mean more pseudos with longer
9426    lifetimes.  */
9427 static int
9428 ix86_address_cost (rtx x, bool speed ATTRIBUTE_UNUSED)
9429 {
9430   struct ix86_address parts;
9431   int cost = 1;
9432   int ok = ix86_decompose_address (x, &parts);
9433
9434   gcc_assert (ok);
9435
9436   if (parts.base && GET_CODE (parts.base) == SUBREG)
9437     parts.base = SUBREG_REG (parts.base);
9438   if (parts.index && GET_CODE (parts.index) == SUBREG)
9439     parts.index = SUBREG_REG (parts.index);
9440
9441   /* Attempt to minimize number of registers in the address.  */
9442   if ((parts.base
9443        && (!REG_P (parts.base) || REGNO (parts.base) >= FIRST_PSEUDO_REGISTER))
9444       || (parts.index
9445           && (!REG_P (parts.index)
9446               || REGNO (parts.index) >= FIRST_PSEUDO_REGISTER)))
9447     cost++;
9448
9449   if (parts.base
9450       && (!REG_P (parts.base) || REGNO (parts.base) >= FIRST_PSEUDO_REGISTER)
9451       && parts.index
9452       && (!REG_P (parts.index) || REGNO (parts.index) >= FIRST_PSEUDO_REGISTER)
9453       && parts.base != parts.index)
9454     cost++;
9455
9456   /* AMD-K6 don't like addresses with ModR/M set to 00_xxx_100b,
9457      since it's predecode logic can't detect the length of instructions
9458      and it degenerates to vector decoded.  Increase cost of such
9459      addresses here.  The penalty is minimally 2 cycles.  It may be worthwhile
9460      to split such addresses or even refuse such addresses at all.
9461
9462      Following addressing modes are affected:
9463       [base+scale*index]
9464       [scale*index+disp]
9465       [base+index]
9466
9467      The first and last case  may be avoidable by explicitly coding the zero in
9468      memory address, but I don't have AMD-K6 machine handy to check this
9469      theory.  */
9470
9471   if (TARGET_K6
9472       && ((!parts.disp && parts.base && parts.index && parts.scale != 1)
9473           || (parts.disp && !parts.base && parts.index && parts.scale != 1)
9474           || (!parts.disp && parts.base && parts.index && parts.scale == 1)))
9475     cost += 10;
9476
9477   return cost;
9478 }
9479 \f
9480 /* Allow {LABEL | SYMBOL}_REF - SYMBOL_REF-FOR-PICBASE for Mach-O as
9481    this is used for to form addresses to local data when -fPIC is in
9482    use.  */
9483
9484 static bool
9485 darwin_local_data_pic (rtx disp)
9486 {
9487   return (GET_CODE (disp) == UNSPEC
9488           && XINT (disp, 1) == UNSPEC_MACHOPIC_OFFSET);
9489 }
9490
9491 /* Determine if a given RTX is a valid constant.  We already know this
9492    satisfies CONSTANT_P.  */
9493
9494 bool
9495 legitimate_constant_p (rtx x)
9496 {
9497   switch (GET_CODE (x))
9498     {
9499     case CONST:
9500       x = XEXP (x, 0);
9501
9502       if (GET_CODE (x) == PLUS)
9503         {
9504           if (!CONST_INT_P (XEXP (x, 1)))
9505             return false;
9506           x = XEXP (x, 0);
9507         }
9508
9509       if (TARGET_MACHO && darwin_local_data_pic (x))
9510         return true;
9511
9512       /* Only some unspecs are valid as "constants".  */
9513       if (GET_CODE (x) == UNSPEC)
9514         switch (XINT (x, 1))
9515           {
9516           case UNSPEC_GOT:
9517           case UNSPEC_GOTOFF:
9518           case UNSPEC_PLTOFF:
9519             return TARGET_64BIT;
9520           case UNSPEC_TPOFF:
9521           case UNSPEC_NTPOFF:
9522             x = XVECEXP (x, 0, 0);
9523             return (GET_CODE (x) == SYMBOL_REF
9524                     && SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_EXEC);
9525           case UNSPEC_DTPOFF:
9526             x = XVECEXP (x, 0, 0);
9527             return (GET_CODE (x) == SYMBOL_REF
9528                     && SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_DYNAMIC);
9529           default:
9530             return false;
9531           }
9532
9533       /* We must have drilled down to a symbol.  */
9534       if (GET_CODE (x) == LABEL_REF)
9535         return true;
9536       if (GET_CODE (x) != SYMBOL_REF)
9537         return false;
9538       /* FALLTHRU */
9539
9540     case SYMBOL_REF:
9541       /* TLS symbols are never valid.  */
9542       if (SYMBOL_REF_TLS_MODEL (x))
9543         return false;
9544
9545       /* DLLIMPORT symbols are never valid.  */
9546       if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
9547           && SYMBOL_REF_DLLIMPORT_P (x))
9548         return false;
9549       break;
9550
9551     case CONST_DOUBLE:
9552       if (GET_MODE (x) == TImode
9553           && x != CONST0_RTX (TImode)
9554           && !TARGET_64BIT)
9555         return false;
9556       break;
9557
9558     case CONST_VECTOR:
9559       if (!standard_sse_constant_p (x))
9560         return false;
9561
9562     default:
9563       break;
9564     }
9565
9566   /* Otherwise we handle everything else in the move patterns.  */
9567   return true;
9568 }
9569
9570 /* Determine if it's legal to put X into the constant pool.  This
9571    is not possible for the address of thread-local symbols, which
9572    is checked above.  */
9573
9574 static bool
9575 ix86_cannot_force_const_mem (rtx x)
9576 {
9577   /* We can always put integral constants and vectors in memory.  */
9578   switch (GET_CODE (x))
9579     {
9580     case CONST_INT:
9581     case CONST_DOUBLE:
9582     case CONST_VECTOR:
9583       return false;
9584
9585     default:
9586       break;
9587     }
9588   return !legitimate_constant_p (x);
9589 }
9590
9591
9592 /* Nonzero if the constant value X is a legitimate general operand
9593    when generating PIC code.  It is given that flag_pic is on and
9594    that X satisfies CONSTANT_P or is a CONST_DOUBLE.  */
9595
9596 bool
9597 legitimate_pic_operand_p (rtx x)
9598 {
9599   rtx inner;
9600
9601   switch (GET_CODE (x))
9602     {
9603     case CONST:
9604       inner = XEXP (x, 0);
9605       if (GET_CODE (inner) == PLUS
9606           && CONST_INT_P (XEXP (inner, 1)))
9607         inner = XEXP (inner, 0);
9608
9609       /* Only some unspecs are valid as "constants".  */
9610       if (GET_CODE (inner) == UNSPEC)
9611         switch (XINT (inner, 1))
9612           {
9613           case UNSPEC_GOT:
9614           case UNSPEC_GOTOFF:
9615           case UNSPEC_PLTOFF:
9616             return TARGET_64BIT;
9617           case UNSPEC_TPOFF:
9618             x = XVECEXP (inner, 0, 0);
9619             return (GET_CODE (x) == SYMBOL_REF
9620                     && SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_EXEC);
9621           case UNSPEC_MACHOPIC_OFFSET:
9622             return legitimate_pic_address_disp_p (x);
9623           default:
9624             return false;
9625           }
9626       /* FALLTHRU */
9627
9628     case SYMBOL_REF:
9629     case LABEL_REF:
9630       return legitimate_pic_address_disp_p (x);
9631
9632     default:
9633       return true;
9634     }
9635 }
9636
9637 /* Determine if a given CONST RTX is a valid memory displacement
9638    in PIC mode.  */
9639
9640 int
9641 legitimate_pic_address_disp_p (rtx disp)
9642 {
9643   bool saw_plus;
9644
9645   /* In 64bit mode we can allow direct addresses of symbols and labels
9646      when they are not dynamic symbols.  */
9647   if (TARGET_64BIT)
9648     {
9649       rtx op0 = disp, op1;
9650
9651       switch (GET_CODE (disp))
9652         {
9653         case LABEL_REF:
9654           return true;
9655
9656         case CONST:
9657           if (GET_CODE (XEXP (disp, 0)) != PLUS)
9658             break;
9659           op0 = XEXP (XEXP (disp, 0), 0);
9660           op1 = XEXP (XEXP (disp, 0), 1);
9661           if (!CONST_INT_P (op1)
9662               || INTVAL (op1) >= 16*1024*1024
9663               || INTVAL (op1) < -16*1024*1024)
9664             break;
9665           if (GET_CODE (op0) == LABEL_REF)
9666             return true;
9667           if (GET_CODE (op0) != SYMBOL_REF)
9668             break;
9669           /* FALLTHRU */
9670
9671         case SYMBOL_REF:
9672           /* TLS references should always be enclosed in UNSPEC.  */
9673           if (SYMBOL_REF_TLS_MODEL (op0))
9674             return false;
9675           if (!SYMBOL_REF_FAR_ADDR_P (op0) && SYMBOL_REF_LOCAL_P (op0)
9676               && ix86_cmodel != CM_LARGE_PIC)
9677             return true;
9678           break;
9679
9680         default:
9681           break;
9682         }
9683     }
9684   if (GET_CODE (disp) != CONST)
9685     return 0;
9686   disp = XEXP (disp, 0);
9687
9688   if (TARGET_64BIT)
9689     {
9690       /* We are unsafe to allow PLUS expressions.  This limit allowed distance
9691          of GOT tables.  We should not need these anyway.  */
9692       if (GET_CODE (disp) != UNSPEC
9693           || (XINT (disp, 1) != UNSPEC_GOTPCREL
9694               && XINT (disp, 1) != UNSPEC_GOTOFF
9695               && XINT (disp, 1) != UNSPEC_PLTOFF))
9696         return 0;
9697
9698       if (GET_CODE (XVECEXP (disp, 0, 0)) != SYMBOL_REF
9699           && GET_CODE (XVECEXP (disp, 0, 0)) != LABEL_REF)
9700         return 0;
9701       return 1;
9702     }
9703
9704   saw_plus = false;
9705   if (GET_CODE (disp) == PLUS)
9706     {
9707       if (!CONST_INT_P (XEXP (disp, 1)))
9708         return 0;
9709       disp = XEXP (disp, 0);
9710       saw_plus = true;
9711     }
9712
9713   if (TARGET_MACHO && darwin_local_data_pic (disp))
9714     return 1;
9715
9716   if (GET_CODE (disp) != UNSPEC)
9717     return 0;
9718
9719   switch (XINT (disp, 1))
9720     {
9721     case UNSPEC_GOT:
9722       if (saw_plus)
9723         return false;
9724       /* We need to check for both symbols and labels because VxWorks loads
9725          text labels with @GOT rather than @GOTOFF.  See gotoff_operand for
9726          details.  */
9727       return (GET_CODE (XVECEXP (disp, 0, 0)) == SYMBOL_REF
9728               || GET_CODE (XVECEXP (disp, 0, 0)) == LABEL_REF);
9729     case UNSPEC_GOTOFF:
9730       /* Refuse GOTOFF in 64bit mode since it is always 64bit when used.
9731          While ABI specify also 32bit relocation but we don't produce it in
9732          small PIC model at all.  */
9733       if ((GET_CODE (XVECEXP (disp, 0, 0)) == SYMBOL_REF
9734            || GET_CODE (XVECEXP (disp, 0, 0)) == LABEL_REF)
9735           && !TARGET_64BIT)
9736         return gotoff_operand (XVECEXP (disp, 0, 0), Pmode);
9737       return false;
9738     case UNSPEC_GOTTPOFF:
9739     case UNSPEC_GOTNTPOFF:
9740     case UNSPEC_INDNTPOFF:
9741       if (saw_plus)
9742         return false;
9743       disp = XVECEXP (disp, 0, 0);
9744       return (GET_CODE (disp) == SYMBOL_REF
9745               && SYMBOL_REF_TLS_MODEL (disp) == TLS_MODEL_INITIAL_EXEC);
9746     case UNSPEC_NTPOFF:
9747       disp = XVECEXP (disp, 0, 0);
9748       return (GET_CODE (disp) == SYMBOL_REF
9749               && SYMBOL_REF_TLS_MODEL (disp) == TLS_MODEL_LOCAL_EXEC);
9750     case UNSPEC_DTPOFF:
9751       disp = XVECEXP (disp, 0, 0);
9752       return (GET_CODE (disp) == SYMBOL_REF
9753               && SYMBOL_REF_TLS_MODEL (disp) == TLS_MODEL_LOCAL_DYNAMIC);
9754     }
9755
9756   return 0;
9757 }
9758
9759 /* Recognizes RTL expressions that are valid memory addresses for an
9760    instruction.  The MODE argument is the machine mode for the MEM
9761    expression that wants to use this address.
9762
9763    It only recognizes address in canonical form.  LEGITIMIZE_ADDRESS should
9764    convert common non-canonical forms to canonical form so that they will
9765    be recognized.  */
9766
9767 static bool
9768 ix86_legitimate_address_p (enum machine_mode mode ATTRIBUTE_UNUSED,
9769                            rtx addr, bool strict)
9770 {
9771   struct ix86_address parts;
9772   rtx base, index, disp;
9773   HOST_WIDE_INT scale;
9774
9775   if (ix86_decompose_address (addr, &parts) <= 0)
9776     /* Decomposition failed.  */
9777     return false;
9778
9779   base = parts.base;
9780   index = parts.index;
9781   disp = parts.disp;
9782   scale = parts.scale;
9783
9784   /* Validate base register.
9785
9786      Don't allow SUBREG's that span more than a word here.  It can lead to spill
9787      failures when the base is one word out of a two word structure, which is
9788      represented internally as a DImode int.  */
9789
9790   if (base)
9791     {
9792       rtx reg;
9793
9794       if (REG_P (base))
9795         reg = base;
9796       else if (GET_CODE (base) == SUBREG
9797                && REG_P (SUBREG_REG (base))
9798                && GET_MODE_SIZE (GET_MODE (SUBREG_REG (base)))
9799                   <= UNITS_PER_WORD)
9800         reg = SUBREG_REG (base);
9801       else
9802         /* Base is not a register.  */
9803         return false;
9804
9805       if (GET_MODE (base) != Pmode)
9806         /* Base is not in Pmode.  */
9807         return false;
9808
9809       if ((strict && ! REG_OK_FOR_BASE_STRICT_P (reg))
9810           || (! strict && ! REG_OK_FOR_BASE_NONSTRICT_P (reg)))
9811         /* Base is not valid.  */
9812         return false;
9813     }
9814
9815   /* Validate index register.
9816
9817      Don't allow SUBREG's that span more than a word here -- same as above.  */
9818
9819   if (index)
9820     {
9821       rtx reg;
9822
9823       if (REG_P (index))
9824         reg = index;
9825       else if (GET_CODE (index) == SUBREG
9826                && REG_P (SUBREG_REG (index))
9827                && GET_MODE_SIZE (GET_MODE (SUBREG_REG (index)))
9828                   <= UNITS_PER_WORD)
9829         reg = SUBREG_REG (index);
9830       else
9831         /* Index is not a register.  */
9832         return false;
9833
9834       if (GET_MODE (index) != Pmode)
9835         /* Index is not in Pmode.  */
9836         return false;
9837
9838       if ((strict && ! REG_OK_FOR_INDEX_STRICT_P (reg))
9839           || (! strict && ! REG_OK_FOR_INDEX_NONSTRICT_P (reg)))
9840         /* Index is not valid.  */
9841         return false;
9842     }
9843
9844   /* Validate scale factor.  */
9845   if (scale != 1)
9846     {
9847       if (!index)
9848         /* Scale without index.  */
9849         return false;
9850
9851       if (scale != 2 && scale != 4 && scale != 8)
9852         /* Scale is not a valid multiplier.  */
9853         return false;
9854     }
9855
9856   /* Validate displacement.  */
9857   if (disp)
9858     {
9859       if (GET_CODE (disp) == CONST
9860           && GET_CODE (XEXP (disp, 0)) == UNSPEC
9861           && XINT (XEXP (disp, 0), 1) != UNSPEC_MACHOPIC_OFFSET)
9862         switch (XINT (XEXP (disp, 0), 1))
9863           {
9864           /* Refuse GOTOFF and GOT in 64bit mode since it is always 64bit when
9865              used.  While ABI specify also 32bit relocations, we don't produce
9866              them at all and use IP relative instead.  */
9867           case UNSPEC_GOT:
9868           case UNSPEC_GOTOFF:
9869             gcc_assert (flag_pic);
9870             if (!TARGET_64BIT)
9871               goto is_legitimate_pic;
9872
9873             /* 64bit address unspec.  */
9874             return false;
9875
9876           case UNSPEC_GOTPCREL:
9877             gcc_assert (flag_pic);
9878             goto is_legitimate_pic;
9879
9880           case UNSPEC_GOTTPOFF:
9881           case UNSPEC_GOTNTPOFF:
9882           case UNSPEC_INDNTPOFF:
9883           case UNSPEC_NTPOFF:
9884           case UNSPEC_DTPOFF:
9885             break;
9886
9887           default:
9888             /* Invalid address unspec.  */
9889             return false;
9890           }
9891
9892       else if (SYMBOLIC_CONST (disp)
9893                && (flag_pic
9894                    || (TARGET_MACHO
9895 #if TARGET_MACHO
9896                        && MACHOPIC_INDIRECT
9897                        && !machopic_operand_p (disp)
9898 #endif
9899                )))
9900         {
9901
9902         is_legitimate_pic:
9903           if (TARGET_64BIT && (index || base))
9904             {
9905               /* foo@dtpoff(%rX) is ok.  */
9906               if (GET_CODE (disp) != CONST
9907                   || GET_CODE (XEXP (disp, 0)) != PLUS
9908                   || GET_CODE (XEXP (XEXP (disp, 0), 0)) != UNSPEC
9909                   || !CONST_INT_P (XEXP (XEXP (disp, 0), 1))
9910                   || (XINT (XEXP (XEXP (disp, 0), 0), 1) != UNSPEC_DTPOFF
9911                       && XINT (XEXP (XEXP (disp, 0), 0), 1) != UNSPEC_NTPOFF))
9912                 /* Non-constant pic memory reference.  */
9913                 return false;
9914             }
9915           else if (! legitimate_pic_address_disp_p (disp))
9916             /* Displacement is an invalid pic construct.  */
9917             return false;
9918
9919           /* This code used to verify that a symbolic pic displacement
9920              includes the pic_offset_table_rtx register.
9921
9922              While this is good idea, unfortunately these constructs may
9923              be created by "adds using lea" optimization for incorrect
9924              code like:
9925
9926              int a;
9927              int foo(int i)
9928                {
9929                  return *(&a+i);
9930                }
9931
9932              This code is nonsensical, but results in addressing
9933              GOT table with pic_offset_table_rtx base.  We can't
9934              just refuse it easily, since it gets matched by
9935              "addsi3" pattern, that later gets split to lea in the
9936              case output register differs from input.  While this
9937              can be handled by separate addsi pattern for this case
9938              that never results in lea, this seems to be easier and
9939              correct fix for crash to disable this test.  */
9940         }
9941       else if (GET_CODE (disp) != LABEL_REF
9942                && !CONST_INT_P (disp)
9943                && (GET_CODE (disp) != CONST
9944                    || !legitimate_constant_p (disp))
9945                && (GET_CODE (disp) != SYMBOL_REF
9946                    || !legitimate_constant_p (disp)))
9947         /* Displacement is not constant.  */
9948         return false;
9949       else if (TARGET_64BIT
9950                && !x86_64_immediate_operand (disp, VOIDmode))
9951         /* Displacement is out of range.  */
9952         return false;
9953     }
9954
9955   /* Everything looks valid.  */
9956   return true;
9957 }
9958
9959 /* Determine if a given RTX is a valid constant address.  */
9960
9961 bool
9962 constant_address_p (rtx x)
9963 {
9964   return CONSTANT_P (x) && ix86_legitimate_address_p (Pmode, x, 1);
9965 }
9966 \f
9967 /* Return a unique alias set for the GOT.  */
9968
9969 static alias_set_type
9970 ix86_GOT_alias_set (void)
9971 {
9972   static alias_set_type set = -1;
9973   if (set == -1)
9974     set = new_alias_set ();
9975   return set;
9976 }
9977
9978 /* Return a legitimate reference for ORIG (an address) using the
9979    register REG.  If REG is 0, a new pseudo is generated.
9980
9981    There are two types of references that must be handled:
9982
9983    1. Global data references must load the address from the GOT, via
9984       the PIC reg.  An insn is emitted to do this load, and the reg is
9985       returned.
9986
9987    2. Static data references, constant pool addresses, and code labels
9988       compute the address as an offset from the GOT, whose base is in
9989       the PIC reg.  Static data objects have SYMBOL_FLAG_LOCAL set to
9990       differentiate them from global data objects.  The returned
9991       address is the PIC reg + an unspec constant.
9992
9993    TARGET_LEGITIMATE_ADDRESS_P rejects symbolic references unless the PIC
9994    reg also appears in the address.  */
9995
9996 static rtx
9997 legitimize_pic_address (rtx orig, rtx reg)
9998 {
9999   rtx addr = orig;
10000   rtx new_rtx = orig;
10001   rtx base;
10002
10003 #if TARGET_MACHO
10004   if (TARGET_MACHO && !TARGET_64BIT)
10005     {
10006       if (reg == 0)
10007         reg = gen_reg_rtx (Pmode);
10008       /* Use the generic Mach-O PIC machinery.  */
10009       return machopic_legitimize_pic_address (orig, GET_MODE (orig), reg);
10010     }
10011 #endif
10012
10013   if (TARGET_64BIT && legitimate_pic_address_disp_p (addr))
10014     new_rtx = addr;
10015   else if (TARGET_64BIT
10016            && ix86_cmodel != CM_SMALL_PIC
10017            && gotoff_operand (addr, Pmode))
10018     {
10019       rtx tmpreg;
10020       /* This symbol may be referenced via a displacement from the PIC
10021          base address (@GOTOFF).  */
10022
10023       if (reload_in_progress)
10024         df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
10025       if (GET_CODE (addr) == CONST)
10026         addr = XEXP (addr, 0);
10027       if (GET_CODE (addr) == PLUS)
10028           {
10029             new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, XEXP (addr, 0)),
10030                                       UNSPEC_GOTOFF);
10031             new_rtx = gen_rtx_PLUS (Pmode, new_rtx, XEXP (addr, 1));
10032           }
10033         else
10034           new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOTOFF);
10035       new_rtx = gen_rtx_CONST (Pmode, new_rtx);
10036       if (!reg)
10037         tmpreg = gen_reg_rtx (Pmode);
10038       else
10039         tmpreg = reg;
10040       emit_move_insn (tmpreg, new_rtx);
10041
10042       if (reg != 0)
10043         {
10044           new_rtx = expand_simple_binop (Pmode, PLUS, reg, pic_offset_table_rtx,
10045                                          tmpreg, 1, OPTAB_DIRECT);
10046           new_rtx = reg;
10047         }
10048       else new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, tmpreg);
10049     }
10050   else if (!TARGET_64BIT && gotoff_operand (addr, Pmode))
10051     {
10052       /* This symbol may be referenced via a displacement from the PIC
10053          base address (@GOTOFF).  */
10054
10055       if (reload_in_progress)
10056         df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
10057       if (GET_CODE (addr) == CONST)
10058         addr = XEXP (addr, 0);
10059       if (GET_CODE (addr) == PLUS)
10060           {
10061             new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, XEXP (addr, 0)),
10062                                       UNSPEC_GOTOFF);
10063             new_rtx = gen_rtx_PLUS (Pmode, new_rtx, XEXP (addr, 1));
10064           }
10065         else
10066           new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOTOFF);
10067       new_rtx = gen_rtx_CONST (Pmode, new_rtx);
10068       new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, new_rtx);
10069
10070       if (reg != 0)
10071         {
10072           emit_move_insn (reg, new_rtx);
10073           new_rtx = reg;
10074         }
10075     }
10076   else if ((GET_CODE (addr) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (addr) == 0)
10077            /* We can't use @GOTOFF for text labels on VxWorks;
10078               see gotoff_operand.  */
10079            || (TARGET_VXWORKS_RTP && GET_CODE (addr) == LABEL_REF))
10080     {
10081       if (TARGET_DLLIMPORT_DECL_ATTRIBUTES)
10082         {
10083           if (GET_CODE (addr) == SYMBOL_REF && SYMBOL_REF_DLLIMPORT_P (addr))
10084             return legitimize_dllimport_symbol (addr, true);
10085           if (GET_CODE (addr) == CONST && GET_CODE (XEXP (addr, 0)) == PLUS
10086               && GET_CODE (XEXP (XEXP (addr, 0), 0)) == SYMBOL_REF
10087               && SYMBOL_REF_DLLIMPORT_P (XEXP (XEXP (addr, 0), 0)))
10088             {
10089               rtx t = legitimize_dllimport_symbol (XEXP (XEXP (addr, 0), 0), true);
10090               return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (addr, 0), 1));
10091             }
10092         }
10093
10094       if (TARGET_64BIT && ix86_cmodel != CM_LARGE_PIC)
10095         {
10096           new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOTPCREL);
10097           new_rtx = gen_rtx_CONST (Pmode, new_rtx);
10098           new_rtx = gen_const_mem (Pmode, new_rtx);
10099           set_mem_alias_set (new_rtx, ix86_GOT_alias_set ());
10100
10101           if (reg == 0)
10102             reg = gen_reg_rtx (Pmode);
10103           /* Use directly gen_movsi, otherwise the address is loaded
10104              into register for CSE.  We don't want to CSE this addresses,
10105              instead we CSE addresses from the GOT table, so skip this.  */
10106           emit_insn (gen_movsi (reg, new_rtx));
10107           new_rtx = reg;
10108         }
10109       else
10110         {
10111           /* This symbol must be referenced via a load from the
10112              Global Offset Table (@GOT).  */
10113
10114           if (reload_in_progress)
10115             df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
10116           new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOT);
10117           new_rtx = gen_rtx_CONST (Pmode, new_rtx);
10118           if (TARGET_64BIT)
10119             new_rtx = force_reg (Pmode, new_rtx);
10120           new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, new_rtx);
10121           new_rtx = gen_const_mem (Pmode, new_rtx);
10122           set_mem_alias_set (new_rtx, ix86_GOT_alias_set ());
10123
10124           if (reg == 0)
10125             reg = gen_reg_rtx (Pmode);
10126           emit_move_insn (reg, new_rtx);
10127           new_rtx = reg;
10128         }
10129     }
10130   else
10131     {
10132       if (CONST_INT_P (addr)
10133           && !x86_64_immediate_operand (addr, VOIDmode))
10134         {
10135           if (reg)
10136             {
10137               emit_move_insn (reg, addr);
10138               new_rtx = reg;
10139             }
10140           else
10141             new_rtx = force_reg (Pmode, addr);
10142         }
10143       else if (GET_CODE (addr) == CONST)
10144         {
10145           addr = XEXP (addr, 0);
10146
10147           /* We must match stuff we generate before.  Assume the only
10148              unspecs that can get here are ours.  Not that we could do
10149              anything with them anyway....  */
10150           if (GET_CODE (addr) == UNSPEC
10151               || (GET_CODE (addr) == PLUS
10152                   && GET_CODE (XEXP (addr, 0)) == UNSPEC))
10153             return orig;
10154           gcc_assert (GET_CODE (addr) == PLUS);
10155         }
10156       if (GET_CODE (addr) == PLUS)
10157         {
10158           rtx op0 = XEXP (addr, 0), op1 = XEXP (addr, 1);
10159
10160           /* Check first to see if this is a constant offset from a @GOTOFF
10161              symbol reference.  */
10162           if (gotoff_operand (op0, Pmode)
10163               && CONST_INT_P (op1))
10164             {
10165               if (!TARGET_64BIT)
10166                 {
10167                   if (reload_in_progress)
10168                     df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
10169                   new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, op0),
10170                                             UNSPEC_GOTOFF);
10171                   new_rtx = gen_rtx_PLUS (Pmode, new_rtx, op1);
10172                   new_rtx = gen_rtx_CONST (Pmode, new_rtx);
10173                   new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, new_rtx);
10174
10175                   if (reg != 0)
10176                     {
10177                       emit_move_insn (reg, new_rtx);
10178                       new_rtx = reg;
10179                     }
10180                 }
10181               else
10182                 {
10183                   if (INTVAL (op1) < -16*1024*1024
10184                       || INTVAL (op1) >= 16*1024*1024)
10185                     {
10186                       if (!x86_64_immediate_operand (op1, Pmode))
10187                         op1 = force_reg (Pmode, op1);
10188                       new_rtx = gen_rtx_PLUS (Pmode, force_reg (Pmode, op0), op1);
10189                     }
10190                 }
10191             }
10192           else
10193             {
10194               base = legitimize_pic_address (XEXP (addr, 0), reg);
10195               new_rtx  = legitimize_pic_address (XEXP (addr, 1),
10196                                                  base == reg ? NULL_RTX : reg);
10197
10198               if (CONST_INT_P (new_rtx))
10199                 new_rtx = plus_constant (base, INTVAL (new_rtx));
10200               else
10201                 {
10202                   if (GET_CODE (new_rtx) == PLUS && CONSTANT_P (XEXP (new_rtx, 1)))
10203                     {
10204                       base = gen_rtx_PLUS (Pmode, base, XEXP (new_rtx, 0));
10205                       new_rtx = XEXP (new_rtx, 1);
10206                     }
10207                   new_rtx = gen_rtx_PLUS (Pmode, base, new_rtx);
10208                 }
10209             }
10210         }
10211     }
10212   return new_rtx;
10213 }
10214 \f
10215 /* Load the thread pointer.  If TO_REG is true, force it into a register.  */
10216
10217 static rtx
10218 get_thread_pointer (int to_reg)
10219 {
10220   rtx tp, reg, insn;
10221
10222   tp = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx), UNSPEC_TP);
10223   if (!to_reg)
10224     return tp;
10225
10226   reg = gen_reg_rtx (Pmode);
10227   insn = gen_rtx_SET (VOIDmode, reg, tp);
10228   insn = emit_insn (insn);
10229
10230   return reg;
10231 }
10232
10233 /* A subroutine of ix86_legitimize_address and ix86_expand_move.  FOR_MOV is
10234    false if we expect this to be used for a memory address and true if
10235    we expect to load the address into a register.  */
10236
10237 static rtx
10238 legitimize_tls_address (rtx x, enum tls_model model, int for_mov)
10239 {
10240   rtx dest, base, off, pic, tp;
10241   int type;
10242
10243   switch (model)
10244     {
10245     case TLS_MODEL_GLOBAL_DYNAMIC:
10246       dest = gen_reg_rtx (Pmode);
10247       tp = TARGET_GNU2_TLS ? get_thread_pointer (1) : 0;
10248
10249       if (TARGET_64BIT && ! TARGET_GNU2_TLS)
10250         {
10251           rtx rax = gen_rtx_REG (Pmode, AX_REG), insns;
10252
10253           start_sequence ();
10254           emit_call_insn (gen_tls_global_dynamic_64 (rax, x));
10255           insns = get_insns ();
10256           end_sequence ();
10257
10258           RTL_CONST_CALL_P (insns) = 1;
10259           emit_libcall_block (insns, dest, rax, x);
10260         }
10261       else if (TARGET_64BIT && TARGET_GNU2_TLS)
10262         emit_insn (gen_tls_global_dynamic_64 (dest, x));
10263       else
10264         emit_insn (gen_tls_global_dynamic_32 (dest, x));
10265
10266       if (TARGET_GNU2_TLS)
10267         {
10268           dest = force_reg (Pmode, gen_rtx_PLUS (Pmode, tp, dest));
10269
10270           set_unique_reg_note (get_last_insn (), REG_EQUIV, x);
10271         }
10272       break;
10273
10274     case TLS_MODEL_LOCAL_DYNAMIC:
10275       base = gen_reg_rtx (Pmode);
10276       tp = TARGET_GNU2_TLS ? get_thread_pointer (1) : 0;
10277
10278       if (TARGET_64BIT && ! TARGET_GNU2_TLS)
10279         {
10280           rtx rax = gen_rtx_REG (Pmode, AX_REG), insns, note;
10281
10282           start_sequence ();
10283           emit_call_insn (gen_tls_local_dynamic_base_64 (rax));
10284           insns = get_insns ();
10285           end_sequence ();
10286
10287           note = gen_rtx_EXPR_LIST (VOIDmode, const0_rtx, NULL);
10288           note = gen_rtx_EXPR_LIST (VOIDmode, ix86_tls_get_addr (), note);
10289           RTL_CONST_CALL_P (insns) = 1;
10290           emit_libcall_block (insns, base, rax, note);
10291         }
10292       else if (TARGET_64BIT && TARGET_GNU2_TLS)
10293         emit_insn (gen_tls_local_dynamic_base_64 (base));
10294       else
10295         emit_insn (gen_tls_local_dynamic_base_32 (base));
10296
10297       if (TARGET_GNU2_TLS)
10298         {
10299           rtx x = ix86_tls_module_base ();
10300
10301           set_unique_reg_note (get_last_insn (), REG_EQUIV,
10302                                gen_rtx_MINUS (Pmode, x, tp));
10303         }
10304
10305       off = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, x), UNSPEC_DTPOFF);
10306       off = gen_rtx_CONST (Pmode, off);
10307
10308       dest = force_reg (Pmode, gen_rtx_PLUS (Pmode, base, off));
10309
10310       if (TARGET_GNU2_TLS)
10311         {
10312           dest = force_reg (Pmode, gen_rtx_PLUS (Pmode, dest, tp));
10313
10314           set_unique_reg_note (get_last_insn (), REG_EQUIV, x);
10315         }
10316
10317       break;
10318
10319     case TLS_MODEL_INITIAL_EXEC:
10320       if (TARGET_64BIT)
10321         {
10322           pic = NULL;
10323           type = UNSPEC_GOTNTPOFF;
10324         }
10325       else if (flag_pic)
10326         {
10327           if (reload_in_progress)
10328             df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
10329           pic = pic_offset_table_rtx;
10330           type = TARGET_ANY_GNU_TLS ? UNSPEC_GOTNTPOFF : UNSPEC_GOTTPOFF;
10331         }
10332       else if (!TARGET_ANY_GNU_TLS)
10333         {
10334           pic = gen_reg_rtx (Pmode);
10335           emit_insn (gen_set_got (pic));
10336           type = UNSPEC_GOTTPOFF;
10337         }
10338       else
10339         {
10340           pic = NULL;
10341           type = UNSPEC_INDNTPOFF;
10342         }
10343
10344       off = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, x), type);
10345       off = gen_rtx_CONST (Pmode, off);
10346       if (pic)
10347         off = gen_rtx_PLUS (Pmode, pic, off);
10348       off = gen_const_mem (Pmode, off);
10349       set_mem_alias_set (off, ix86_GOT_alias_set ());
10350
10351       if (TARGET_64BIT || TARGET_ANY_GNU_TLS)
10352         {
10353           base = get_thread_pointer (for_mov || !TARGET_TLS_DIRECT_SEG_REFS);
10354           off = force_reg (Pmode, off);
10355           return gen_rtx_PLUS (Pmode, base, off);
10356         }
10357       else
10358         {
10359           base = get_thread_pointer (true);
10360           dest = gen_reg_rtx (Pmode);
10361           emit_insn (gen_subsi3 (dest, base, off));
10362         }
10363       break;
10364
10365     case TLS_MODEL_LOCAL_EXEC:
10366       off = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, x),
10367                             (TARGET_64BIT || TARGET_ANY_GNU_TLS)
10368                             ? UNSPEC_NTPOFF : UNSPEC_TPOFF);
10369       off = gen_rtx_CONST (Pmode, off);
10370
10371       if (TARGET_64BIT || TARGET_ANY_GNU_TLS)
10372         {
10373           base = get_thread_pointer (for_mov || !TARGET_TLS_DIRECT_SEG_REFS);
10374           return gen_rtx_PLUS (Pmode, base, off);
10375         }
10376       else
10377         {
10378           base = get_thread_pointer (true);
10379           dest = gen_reg_rtx (Pmode);
10380           emit_insn (gen_subsi3 (dest, base, off));
10381         }
10382       break;
10383
10384     default:
10385       gcc_unreachable ();
10386     }
10387
10388   return dest;
10389 }
10390
10391 /* Create or return the unique __imp_DECL dllimport symbol corresponding
10392    to symbol DECL.  */
10393
10394 static GTY((if_marked ("tree_map_marked_p"), param_is (struct tree_map)))
10395   htab_t dllimport_map;
10396
10397 static tree
10398 get_dllimport_decl (tree decl)
10399 {
10400   struct tree_map *h, in;
10401   void **loc;
10402   const char *name;
10403   const char *prefix;
10404   size_t namelen, prefixlen;
10405   char *imp_name;
10406   tree to;
10407   rtx rtl;
10408
10409   if (!dllimport_map)
10410     dllimport_map = htab_create_ggc (512, tree_map_hash, tree_map_eq, 0);
10411
10412   in.hash = htab_hash_pointer (decl);
10413   in.base.from = decl;
10414   loc = htab_find_slot_with_hash (dllimport_map, &in, in.hash, INSERT);
10415   h = (struct tree_map *) *loc;
10416   if (h)
10417     return h->to;
10418
10419   *loc = h = GGC_NEW (struct tree_map);
10420   h->hash = in.hash;
10421   h->base.from = decl;
10422   h->to = to = build_decl (DECL_SOURCE_LOCATION (decl),
10423                            VAR_DECL, NULL, ptr_type_node);
10424   DECL_ARTIFICIAL (to) = 1;
10425   DECL_IGNORED_P (to) = 1;
10426   DECL_EXTERNAL (to) = 1;
10427   TREE_READONLY (to) = 1;
10428
10429   name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
10430   name = targetm.strip_name_encoding (name);
10431   prefix = name[0] == FASTCALL_PREFIX || user_label_prefix[0] == 0
10432     ? "*__imp_" : "*__imp__";
10433   namelen = strlen (name);
10434   prefixlen = strlen (prefix);
10435   imp_name = (char *) alloca (namelen + prefixlen + 1);
10436   memcpy (imp_name, prefix, prefixlen);
10437   memcpy (imp_name + prefixlen, name, namelen + 1);
10438
10439   name = ggc_alloc_string (imp_name, namelen + prefixlen);
10440   rtl = gen_rtx_SYMBOL_REF (Pmode, name);
10441   SET_SYMBOL_REF_DECL (rtl, to);
10442   SYMBOL_REF_FLAGS (rtl) = SYMBOL_FLAG_LOCAL;
10443
10444   rtl = gen_const_mem (Pmode, rtl);
10445   set_mem_alias_set (rtl, ix86_GOT_alias_set ());
10446
10447   SET_DECL_RTL (to, rtl);
10448   SET_DECL_ASSEMBLER_NAME (to, get_identifier (name));
10449
10450   return to;
10451 }
10452
10453 /* Expand SYMBOL into its corresponding dllimport symbol.  WANT_REG is
10454    true if we require the result be a register.  */
10455
10456 static rtx
10457 legitimize_dllimport_symbol (rtx symbol, bool want_reg)
10458 {
10459   tree imp_decl;
10460   rtx x;
10461
10462   gcc_assert (SYMBOL_REF_DECL (symbol));
10463   imp_decl = get_dllimport_decl (SYMBOL_REF_DECL (symbol));
10464
10465   x = DECL_RTL (imp_decl);
10466   if (want_reg)
10467     x = force_reg (Pmode, x);
10468   return x;
10469 }
10470
10471 /* Try machine-dependent ways of modifying an illegitimate address
10472    to be legitimate.  If we find one, return the new, valid address.
10473    This macro is used in only one place: `memory_address' in explow.c.
10474
10475    OLDX is the address as it was before break_out_memory_refs was called.
10476    In some cases it is useful to look at this to decide what needs to be done.
10477
10478    It is always safe for this macro to do nothing.  It exists to recognize
10479    opportunities to optimize the output.
10480
10481    For the 80386, we handle X+REG by loading X into a register R and
10482    using R+REG.  R will go in a general reg and indexing will be used.
10483    However, if REG is a broken-out memory address or multiplication,
10484    nothing needs to be done because REG can certainly go in a general reg.
10485
10486    When -fpic is used, special handling is needed for symbolic references.
10487    See comments by legitimize_pic_address in i386.c for details.  */
10488
10489 static rtx
10490 ix86_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED,
10491                          enum machine_mode mode)
10492 {
10493   int changed = 0;
10494   unsigned log;
10495
10496   log = GET_CODE (x) == SYMBOL_REF ? SYMBOL_REF_TLS_MODEL (x) : 0;
10497   if (log)
10498     return legitimize_tls_address (x, (enum tls_model) log, false);
10499   if (GET_CODE (x) == CONST
10500       && GET_CODE (XEXP (x, 0)) == PLUS
10501       && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
10502       && (log = SYMBOL_REF_TLS_MODEL (XEXP (XEXP (x, 0), 0))))
10503     {
10504       rtx t = legitimize_tls_address (XEXP (XEXP (x, 0), 0),
10505                                       (enum tls_model) log, false);
10506       return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (x, 0), 1));
10507     }
10508
10509   if (TARGET_DLLIMPORT_DECL_ATTRIBUTES)
10510     {
10511       if (GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_DLLIMPORT_P (x))
10512         return legitimize_dllimport_symbol (x, true);
10513       if (GET_CODE (x) == CONST
10514           && GET_CODE (XEXP (x, 0)) == PLUS
10515           && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
10516           && SYMBOL_REF_DLLIMPORT_P (XEXP (XEXP (x, 0), 0)))
10517         {
10518           rtx t = legitimize_dllimport_symbol (XEXP (XEXP (x, 0), 0), true);
10519           return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (x, 0), 1));
10520         }
10521     }
10522
10523   if (flag_pic && SYMBOLIC_CONST (x))
10524     return legitimize_pic_address (x, 0);
10525
10526   /* Canonicalize shifts by 0, 1, 2, 3 into multiply */
10527   if (GET_CODE (x) == ASHIFT
10528       && CONST_INT_P (XEXP (x, 1))
10529       && (unsigned HOST_WIDE_INT) INTVAL (XEXP (x, 1)) < 4)
10530     {
10531       changed = 1;
10532       log = INTVAL (XEXP (x, 1));
10533       x = gen_rtx_MULT (Pmode, force_reg (Pmode, XEXP (x, 0)),
10534                         GEN_INT (1 << log));
10535     }
10536
10537   if (GET_CODE (x) == PLUS)
10538     {
10539       /* Canonicalize shifts by 0, 1, 2, 3 into multiply.  */
10540
10541       if (GET_CODE (XEXP (x, 0)) == ASHIFT
10542           && CONST_INT_P (XEXP (XEXP (x, 0), 1))
10543           && (unsigned HOST_WIDE_INT) INTVAL (XEXP (XEXP (x, 0), 1)) < 4)
10544         {
10545           changed = 1;
10546           log = INTVAL (XEXP (XEXP (x, 0), 1));
10547           XEXP (x, 0) = gen_rtx_MULT (Pmode,
10548                                       force_reg (Pmode, XEXP (XEXP (x, 0), 0)),
10549                                       GEN_INT (1 << log));
10550         }
10551
10552       if (GET_CODE (XEXP (x, 1)) == ASHIFT
10553           && CONST_INT_P (XEXP (XEXP (x, 1), 1))
10554           && (unsigned HOST_WIDE_INT) INTVAL (XEXP (XEXP (x, 1), 1)) < 4)
10555         {
10556           changed = 1;
10557           log = INTVAL (XEXP (XEXP (x, 1), 1));
10558           XEXP (x, 1) = gen_rtx_MULT (Pmode,
10559                                       force_reg (Pmode, XEXP (XEXP (x, 1), 0)),
10560                                       GEN_INT (1 << log));
10561         }
10562
10563       /* Put multiply first if it isn't already.  */
10564       if (GET_CODE (XEXP (x, 1)) == MULT)
10565         {
10566           rtx tmp = XEXP (x, 0);
10567           XEXP (x, 0) = XEXP (x, 1);
10568           XEXP (x, 1) = tmp;
10569           changed = 1;
10570         }
10571
10572       /* Canonicalize (plus (mult (reg) (const)) (plus (reg) (const)))
10573          into (plus (plus (mult (reg) (const)) (reg)) (const)).  This can be
10574          created by virtual register instantiation, register elimination, and
10575          similar optimizations.  */
10576       if (GET_CODE (XEXP (x, 0)) == MULT && GET_CODE (XEXP (x, 1)) == PLUS)
10577         {
10578           changed = 1;
10579           x = gen_rtx_PLUS (Pmode,
10580                             gen_rtx_PLUS (Pmode, XEXP (x, 0),
10581                                           XEXP (XEXP (x, 1), 0)),
10582                             XEXP (XEXP (x, 1), 1));
10583         }
10584
10585       /* Canonicalize
10586          (plus (plus (mult (reg) (const)) (plus (reg) (const))) const)
10587          into (plus (plus (mult (reg) (const)) (reg)) (const)).  */
10588       else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 0)) == PLUS
10589                && GET_CODE (XEXP (XEXP (x, 0), 0)) == MULT
10590                && GET_CODE (XEXP (XEXP (x, 0), 1)) == PLUS
10591                && CONSTANT_P (XEXP (x, 1)))
10592         {
10593           rtx constant;
10594           rtx other = NULL_RTX;
10595
10596           if (CONST_INT_P (XEXP (x, 1)))
10597             {
10598               constant = XEXP (x, 1);
10599               other = XEXP (XEXP (XEXP (x, 0), 1), 1);
10600             }
10601           else if (CONST_INT_P (XEXP (XEXP (XEXP (x, 0), 1), 1)))
10602             {
10603               constant = XEXP (XEXP (XEXP (x, 0), 1), 1);
10604               other = XEXP (x, 1);
10605             }
10606           else
10607             constant = 0;
10608
10609           if (constant)
10610             {
10611               changed = 1;
10612               x = gen_rtx_PLUS (Pmode,
10613                                 gen_rtx_PLUS (Pmode, XEXP (XEXP (x, 0), 0),
10614                                               XEXP (XEXP (XEXP (x, 0), 1), 0)),
10615                                 plus_constant (other, INTVAL (constant)));
10616             }
10617         }
10618
10619       if (changed && ix86_legitimate_address_p (mode, x, FALSE))
10620         return x;
10621
10622       if (GET_CODE (XEXP (x, 0)) == MULT)
10623         {
10624           changed = 1;
10625           XEXP (x, 0) = force_operand (XEXP (x, 0), 0);
10626         }
10627
10628       if (GET_CODE (XEXP (x, 1)) == MULT)
10629         {
10630           changed = 1;
10631           XEXP (x, 1) = force_operand (XEXP (x, 1), 0);
10632         }
10633
10634       if (changed
10635           && REG_P (XEXP (x, 1))
10636           && REG_P (XEXP (x, 0)))
10637         return x;
10638
10639       if (flag_pic && SYMBOLIC_CONST (XEXP (x, 1)))
10640         {
10641           changed = 1;
10642           x = legitimize_pic_address (x, 0);
10643         }
10644
10645       if (changed && ix86_legitimate_address_p (mode, x, FALSE))
10646         return x;
10647
10648       if (REG_P (XEXP (x, 0)))
10649         {
10650           rtx temp = gen_reg_rtx (Pmode);
10651           rtx val  = force_operand (XEXP (x, 1), temp);
10652           if (val != temp)
10653             emit_move_insn (temp, val);
10654
10655           XEXP (x, 1) = temp;
10656           return x;
10657         }
10658
10659       else if (REG_P (XEXP (x, 1)))
10660         {
10661           rtx temp = gen_reg_rtx (Pmode);
10662           rtx val  = force_operand (XEXP (x, 0), temp);
10663           if (val != temp)
10664             emit_move_insn (temp, val);
10665
10666           XEXP (x, 0) = temp;
10667           return x;
10668         }
10669     }
10670
10671   return x;
10672 }
10673 \f
10674 /* Print an integer constant expression in assembler syntax.  Addition
10675    and subtraction are the only arithmetic that may appear in these
10676    expressions.  FILE is the stdio stream to write to, X is the rtx, and
10677    CODE is the operand print code from the output string.  */
10678
10679 static void
10680 output_pic_addr_const (FILE *file, rtx x, int code)
10681 {
10682   char buf[256];
10683
10684   switch (GET_CODE (x))
10685     {
10686     case PC:
10687       gcc_assert (flag_pic);
10688       putc ('.', file);
10689       break;
10690
10691     case SYMBOL_REF:
10692       if (! TARGET_MACHO || TARGET_64BIT)
10693         output_addr_const (file, x);
10694       else
10695         {
10696           const char *name = XSTR (x, 0);
10697
10698           /* Mark the decl as referenced so that cgraph will
10699              output the function.  */
10700           if (SYMBOL_REF_DECL (x))
10701             mark_decl_referenced (SYMBOL_REF_DECL (x));
10702
10703 #if TARGET_MACHO
10704           if (MACHOPIC_INDIRECT
10705               && machopic_classify_symbol (x) == MACHOPIC_UNDEFINED_FUNCTION)
10706             name = machopic_indirection_name (x, /*stub_p=*/true);
10707 #endif
10708           assemble_name (file, name);
10709         }
10710       if (!TARGET_MACHO && !(TARGET_64BIT && DEFAULT_ABI == MS_ABI)
10711           && code == 'P' && ! SYMBOL_REF_LOCAL_P (x))
10712         fputs ("@PLT", file);
10713       break;
10714
10715     case LABEL_REF:
10716       x = XEXP (x, 0);
10717       /* FALLTHRU */
10718     case CODE_LABEL:
10719       ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (x));
10720       assemble_name (asm_out_file, buf);
10721       break;
10722
10723     case CONST_INT:
10724       fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (x));
10725       break;
10726
10727     case CONST:
10728       /* This used to output parentheses around the expression,
10729          but that does not work on the 386 (either ATT or BSD assembler).  */
10730       output_pic_addr_const (file, XEXP (x, 0), code);
10731       break;
10732
10733     case CONST_DOUBLE:
10734       if (GET_MODE (x) == VOIDmode)
10735         {
10736           /* We can use %d if the number is <32 bits and positive.  */
10737           if (CONST_DOUBLE_HIGH (x) || CONST_DOUBLE_LOW (x) < 0)
10738             fprintf (file, "0x%lx%08lx",
10739                      (unsigned long) CONST_DOUBLE_HIGH (x),
10740                      (unsigned long) CONST_DOUBLE_LOW (x));
10741           else
10742             fprintf (file, HOST_WIDE_INT_PRINT_DEC, CONST_DOUBLE_LOW (x));
10743         }
10744       else
10745         /* We can't handle floating point constants;
10746            PRINT_OPERAND must handle them.  */
10747         output_operand_lossage ("floating constant misused");
10748       break;
10749
10750     case PLUS:
10751       /* Some assemblers need integer constants to appear first.  */
10752       if (CONST_INT_P (XEXP (x, 0)))
10753         {
10754           output_pic_addr_const (file, XEXP (x, 0), code);
10755           putc ('+', file);
10756           output_pic_addr_const (file, XEXP (x, 1), code);
10757         }
10758       else
10759         {
10760           gcc_assert (CONST_INT_P (XEXP (x, 1)));
10761           output_pic_addr_const (file, XEXP (x, 1), code);
10762           putc ('+', file);
10763           output_pic_addr_const (file, XEXP (x, 0), code);
10764         }
10765       break;
10766
10767     case MINUS:
10768       if (!TARGET_MACHO)
10769         putc (ASSEMBLER_DIALECT == ASM_INTEL ? '(' : '[', file);
10770       output_pic_addr_const (file, XEXP (x, 0), code);
10771       putc ('-', file);
10772       output_pic_addr_const (file, XEXP (x, 1), code);
10773       if (!TARGET_MACHO)
10774         putc (ASSEMBLER_DIALECT == ASM_INTEL ? ')' : ']', file);
10775       break;
10776
10777      case UNSPEC:
10778        gcc_assert (XVECLEN (x, 0) == 1);
10779        output_pic_addr_const (file, XVECEXP (x, 0, 0), code);
10780        switch (XINT (x, 1))
10781         {
10782         case UNSPEC_GOT:
10783           fputs ("@GOT", file);
10784           break;
10785         case UNSPEC_GOTOFF:
10786           fputs ("@GOTOFF", file);
10787           break;
10788         case UNSPEC_PLTOFF:
10789           fputs ("@PLTOFF", file);
10790           break;
10791         case UNSPEC_GOTPCREL:
10792           fputs (ASSEMBLER_DIALECT == ASM_ATT ?
10793                  "@GOTPCREL(%rip)" : "@GOTPCREL[rip]", file);
10794           break;
10795         case UNSPEC_GOTTPOFF:
10796           /* FIXME: This might be @TPOFF in Sun ld too.  */
10797           fputs ("@GOTTPOFF", file);
10798           break;
10799         case UNSPEC_TPOFF:
10800           fputs ("@TPOFF", file);
10801           break;
10802         case UNSPEC_NTPOFF:
10803           if (TARGET_64BIT)
10804             fputs ("@TPOFF", file);
10805           else
10806             fputs ("@NTPOFF", file);
10807           break;
10808         case UNSPEC_DTPOFF:
10809           fputs ("@DTPOFF", file);
10810           break;
10811         case UNSPEC_GOTNTPOFF:
10812           if (TARGET_64BIT)
10813             fputs (ASSEMBLER_DIALECT == ASM_ATT ?
10814                    "@GOTTPOFF(%rip)": "@GOTTPOFF[rip]", file);
10815           else
10816             fputs ("@GOTNTPOFF", file);
10817           break;
10818         case UNSPEC_INDNTPOFF:
10819           fputs ("@INDNTPOFF", file);
10820           break;
10821 #if TARGET_MACHO
10822         case UNSPEC_MACHOPIC_OFFSET:
10823           putc ('-', file);
10824           machopic_output_function_base_name (file);
10825           break;
10826 #endif
10827         default:
10828           output_operand_lossage ("invalid UNSPEC as operand");
10829           break;
10830         }
10831        break;
10832
10833     default:
10834       output_operand_lossage ("invalid expression as operand");
10835     }
10836 }
10837
10838 /* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL.
10839    We need to emit DTP-relative relocations.  */
10840
10841 static void ATTRIBUTE_UNUSED
10842 i386_output_dwarf_dtprel (FILE *file, int size, rtx x)
10843 {
10844   fputs (ASM_LONG, file);
10845   output_addr_const (file, x);
10846   fputs ("@DTPOFF", file);
10847   switch (size)
10848     {
10849     case 4:
10850       break;
10851     case 8:
10852       fputs (", 0", file);
10853       break;
10854     default:
10855       gcc_unreachable ();
10856    }
10857 }
10858
10859 /* Return true if X is a representation of the PIC register.  This copes
10860    with calls from ix86_find_base_term, where the register might have
10861    been replaced by a cselib value.  */
10862
10863 static bool
10864 ix86_pic_register_p (rtx x)
10865 {
10866   if (GET_CODE (x) == VALUE && CSELIB_VAL_PTR (x))
10867     return (pic_offset_table_rtx
10868             && rtx_equal_for_cselib_p (x, pic_offset_table_rtx));
10869   else
10870     return REG_P (x) && REGNO (x) == PIC_OFFSET_TABLE_REGNUM;
10871 }
10872
10873 /* In the name of slightly smaller debug output, and to cater to
10874    general assembler lossage, recognize PIC+GOTOFF and turn it back
10875    into a direct symbol reference.
10876
10877    On Darwin, this is necessary to avoid a crash, because Darwin
10878    has a different PIC label for each routine but the DWARF debugging
10879    information is not associated with any particular routine, so it's
10880    necessary to remove references to the PIC label from RTL stored by
10881    the DWARF output code.  */
10882
10883 static rtx
10884 ix86_delegitimize_address (rtx x)
10885 {
10886   rtx orig_x = delegitimize_mem_from_attrs (x);
10887   /* reg_addend is NULL or a multiple of some register.  */
10888   rtx reg_addend = NULL_RTX;
10889   /* const_addend is NULL or a const_int.  */
10890   rtx const_addend = NULL_RTX;
10891   /* This is the result, or NULL.  */
10892   rtx result = NULL_RTX;
10893
10894   x = orig_x;
10895
10896   if (MEM_P (x))
10897     x = XEXP (x, 0);
10898
10899   if (TARGET_64BIT)
10900     {
10901       if (GET_CODE (x) != CONST
10902           || GET_CODE (XEXP (x, 0)) != UNSPEC
10903           || XINT (XEXP (x, 0), 1) != UNSPEC_GOTPCREL
10904           || !MEM_P (orig_x))
10905         return orig_x;
10906       return XVECEXP (XEXP (x, 0), 0, 0);
10907     }
10908
10909   if (GET_CODE (x) != PLUS
10910       || GET_CODE (XEXP (x, 1)) != CONST)
10911     return orig_x;
10912
10913   if (ix86_pic_register_p (XEXP (x, 0)))
10914     /* %ebx + GOT/GOTOFF */
10915     ;
10916   else if (GET_CODE (XEXP (x, 0)) == PLUS)
10917     {
10918       /* %ebx + %reg * scale + GOT/GOTOFF */
10919       reg_addend = XEXP (x, 0);
10920       if (ix86_pic_register_p (XEXP (reg_addend, 0)))
10921         reg_addend = XEXP (reg_addend, 1);
10922       else if (ix86_pic_register_p (XEXP (reg_addend, 1)))
10923         reg_addend = XEXP (reg_addend, 0);
10924       else
10925         return orig_x;
10926       if (!REG_P (reg_addend)
10927           && GET_CODE (reg_addend) != MULT
10928           && GET_CODE (reg_addend) != ASHIFT)
10929         return orig_x;
10930     }
10931   else
10932     return orig_x;
10933
10934   x = XEXP (XEXP (x, 1), 0);
10935   if (GET_CODE (x) == PLUS
10936       && CONST_INT_P (XEXP (x, 1)))
10937     {
10938       const_addend = XEXP (x, 1);
10939       x = XEXP (x, 0);
10940     }
10941
10942   if (GET_CODE (x) == UNSPEC
10943       && ((XINT (x, 1) == UNSPEC_GOT && MEM_P (orig_x))
10944           || (XINT (x, 1) == UNSPEC_GOTOFF && !MEM_P (orig_x))))
10945     result = XVECEXP (x, 0, 0);
10946
10947   if (TARGET_MACHO && darwin_local_data_pic (x)
10948       && !MEM_P (orig_x))
10949     result = XVECEXP (x, 0, 0);
10950
10951   if (! result)
10952     return orig_x;
10953
10954   if (const_addend)
10955     result = gen_rtx_CONST (Pmode, gen_rtx_PLUS (Pmode, result, const_addend));
10956   if (reg_addend)
10957     result = gen_rtx_PLUS (Pmode, reg_addend, result);
10958   return result;
10959 }
10960
10961 /* If X is a machine specific address (i.e. a symbol or label being
10962    referenced as a displacement from the GOT implemented using an
10963    UNSPEC), then return the base term.  Otherwise return X.  */
10964
10965 rtx
10966 ix86_find_base_term (rtx x)
10967 {
10968   rtx term;
10969
10970   if (TARGET_64BIT)
10971     {
10972       if (GET_CODE (x) != CONST)
10973         return x;
10974       term = XEXP (x, 0);
10975       if (GET_CODE (term) == PLUS
10976           && (CONST_INT_P (XEXP (term, 1))
10977               || GET_CODE (XEXP (term, 1)) == CONST_DOUBLE))
10978         term = XEXP (term, 0);
10979       if (GET_CODE (term) != UNSPEC
10980           || XINT (term, 1) != UNSPEC_GOTPCREL)
10981         return x;
10982
10983       return XVECEXP (term, 0, 0);
10984     }
10985
10986   return ix86_delegitimize_address (x);
10987 }
10988 \f
10989 static void
10990 put_condition_code (enum rtx_code code, enum machine_mode mode, int reverse,
10991                     int fp, FILE *file)
10992 {
10993   const char *suffix;
10994
10995   if (mode == CCFPmode || mode == CCFPUmode)
10996     {
10997       code = ix86_fp_compare_code_to_integer (code);
10998       mode = CCmode;
10999     }
11000   if (reverse)
11001     code = reverse_condition (code);
11002
11003   switch (code)
11004     {
11005     case EQ:
11006       switch (mode)
11007         {
11008         case CCAmode:
11009           suffix = "a";
11010           break;
11011
11012         case CCCmode:
11013           suffix = "c";
11014           break;
11015
11016         case CCOmode:
11017           suffix = "o";
11018           break;
11019
11020         case CCSmode:
11021           suffix = "s";
11022           break;
11023
11024         default:
11025           suffix = "e";
11026         }
11027       break;
11028     case NE:
11029       switch (mode)
11030         {
11031         case CCAmode:
11032           suffix = "na";
11033           break;
11034
11035         case CCCmode:
11036           suffix = "nc";
11037           break;
11038
11039         case CCOmode:
11040           suffix = "no";
11041           break;
11042
11043         case CCSmode:
11044           suffix = "ns";
11045           break;
11046
11047         default:
11048           suffix = "ne";
11049         }
11050       break;
11051     case GT:
11052       gcc_assert (mode == CCmode || mode == CCNOmode || mode == CCGCmode);
11053       suffix = "g";
11054       break;
11055     case GTU:
11056       /* ??? Use "nbe" instead of "a" for fcmov lossage on some assemblers.
11057          Those same assemblers have the same but opposite lossage on cmov.  */
11058       if (mode == CCmode)
11059         suffix = fp ? "nbe" : "a";
11060       else if (mode == CCCmode)
11061         suffix = "b";
11062       else
11063         gcc_unreachable ();
11064       break;
11065     case LT:
11066       switch (mode)
11067         {
11068         case CCNOmode:
11069         case CCGOCmode:
11070           suffix = "s";
11071           break;
11072
11073         case CCmode:
11074         case CCGCmode:
11075           suffix = "l";
11076           break;
11077
11078         default:
11079           gcc_unreachable ();
11080         }
11081       break;
11082     case LTU:
11083       gcc_assert (mode == CCmode || mode == CCCmode);
11084       suffix = "b";
11085       break;
11086     case GE:
11087       switch (mode)
11088         {
11089         case CCNOmode:
11090         case CCGOCmode:
11091           suffix = "ns";
11092           break;
11093
11094         case CCmode:
11095         case CCGCmode:
11096           suffix = "ge";
11097           break;
11098
11099         default:
11100           gcc_unreachable ();
11101         }
11102       break;
11103     case GEU:
11104       /* ??? As above.  */
11105       gcc_assert (mode == CCmode || mode == CCCmode);
11106       suffix = fp ? "nb" : "ae";
11107       break;
11108     case LE:
11109       gcc_assert (mode == CCmode || mode == CCGCmode || mode == CCNOmode);
11110       suffix = "le";
11111       break;
11112     case LEU:
11113       /* ??? As above.  */
11114       if (mode == CCmode)
11115         suffix = "be";
11116       else if (mode == CCCmode)
11117         suffix = fp ? "nb" : "ae";
11118       else
11119         gcc_unreachable ();
11120       break;
11121     case UNORDERED:
11122       suffix = fp ? "u" : "p";
11123       break;
11124     case ORDERED:
11125       suffix = fp ? "nu" : "np";
11126       break;
11127     default:
11128       gcc_unreachable ();
11129     }
11130   fputs (suffix, file);
11131 }
11132
11133 /* Print the name of register X to FILE based on its machine mode and number.
11134    If CODE is 'w', pretend the mode is HImode.
11135    If CODE is 'b', pretend the mode is QImode.
11136    If CODE is 'k', pretend the mode is SImode.
11137    If CODE is 'q', pretend the mode is DImode.
11138    If CODE is 'x', pretend the mode is V4SFmode.
11139    If CODE is 't', pretend the mode is V8SFmode.
11140    If CODE is 'h', pretend the reg is the 'high' byte register.
11141    If CODE is 'y', print "st(0)" instead of "st", if the reg is stack op.
11142    If CODE is 'd', duplicate the operand for AVX instruction.
11143  */
11144
11145 void
11146 print_reg (rtx x, int code, FILE *file)
11147 {
11148   const char *reg;
11149   bool duplicated = code == 'd' && TARGET_AVX;
11150
11151   gcc_assert (x == pc_rtx
11152               || (REGNO (x) != ARG_POINTER_REGNUM
11153                   && REGNO (x) != FRAME_POINTER_REGNUM
11154                   && REGNO (x) != FLAGS_REG
11155                   && REGNO (x) != FPSR_REG
11156                   && REGNO (x) != FPCR_REG));
11157
11158   if (ASSEMBLER_DIALECT == ASM_ATT)
11159     putc ('%', file);
11160
11161   if (x == pc_rtx)
11162     {
11163       gcc_assert (TARGET_64BIT);
11164       fputs ("rip", file);
11165       return;
11166     }
11167
11168   if (code == 'w' || MMX_REG_P (x))
11169     code = 2;
11170   else if (code == 'b')
11171     code = 1;
11172   else if (code == 'k')
11173     code = 4;
11174   else if (code == 'q')
11175     code = 8;
11176   else if (code == 'y')
11177     code = 3;
11178   else if (code == 'h')
11179     code = 0;
11180   else if (code == 'x')
11181     code = 16;
11182   else if (code == 't')
11183     code = 32;
11184   else
11185     code = GET_MODE_SIZE (GET_MODE (x));
11186
11187   /* Irritatingly, AMD extended registers use different naming convention
11188      from the normal registers.  */
11189   if (REX_INT_REG_P (x))
11190     {
11191       gcc_assert (TARGET_64BIT);
11192       switch (code)
11193         {
11194           case 0:
11195             error ("extended registers have no high halves");
11196             break;
11197           case 1:
11198             fprintf (file, "r%ib", REGNO (x) - FIRST_REX_INT_REG + 8);
11199             break;
11200           case 2:
11201             fprintf (file, "r%iw", REGNO (x) - FIRST_REX_INT_REG + 8);
11202             break;
11203           case 4:
11204             fprintf (file, "r%id", REGNO (x) - FIRST_REX_INT_REG + 8);
11205             break;
11206           case 8:
11207             fprintf (file, "r%i", REGNO (x) - FIRST_REX_INT_REG + 8);
11208             break;
11209           default:
11210             error ("unsupported operand size for extended register");
11211             break;
11212         }
11213       return;
11214     }
11215
11216   reg = NULL;
11217   switch (code)
11218     {
11219     case 3:
11220       if (STACK_TOP_P (x))
11221         {
11222           reg = "st(0)";
11223           break;
11224         }
11225       /* FALLTHRU */
11226     case 8:
11227     case 4:
11228     case 12:
11229       if (! ANY_FP_REG_P (x))
11230         putc (code == 8 && TARGET_64BIT ? 'r' : 'e', file);
11231       /* FALLTHRU */
11232     case 16:
11233     case 2:
11234     normal:
11235       reg = hi_reg_name[REGNO (x)];
11236       break;
11237     case 1:
11238       if (REGNO (x) >= ARRAY_SIZE (qi_reg_name))
11239         goto normal;
11240       reg = qi_reg_name[REGNO (x)];
11241       break;
11242     case 0:
11243       if (REGNO (x) >= ARRAY_SIZE (qi_high_reg_name))
11244         goto normal;
11245       reg = qi_high_reg_name[REGNO (x)];
11246       break;
11247     case 32:
11248       if (SSE_REG_P (x))
11249         {
11250           gcc_assert (!duplicated);
11251           putc ('y', file);
11252           fputs (hi_reg_name[REGNO (x)] + 1, file);
11253           return;
11254         }
11255       break;
11256     default:
11257       gcc_unreachable ();
11258     }
11259
11260   fputs (reg, file);
11261   if (duplicated)
11262     {
11263       if (ASSEMBLER_DIALECT == ASM_ATT)
11264         fprintf (file, ", %%%s", reg);
11265       else
11266         fprintf (file, ", %s", reg);
11267     }
11268 }
11269
11270 /* Locate some local-dynamic symbol still in use by this function
11271    so that we can print its name in some tls_local_dynamic_base
11272    pattern.  */
11273
11274 static int
11275 get_some_local_dynamic_name_1 (rtx *px, void *data ATTRIBUTE_UNUSED)
11276 {
11277   rtx x = *px;
11278
11279   if (GET_CODE (x) == SYMBOL_REF
11280       && SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_DYNAMIC)
11281     {
11282       cfun->machine->some_ld_name = XSTR (x, 0);
11283       return 1;
11284     }
11285
11286   return 0;
11287 }
11288
11289 static const char *
11290 get_some_local_dynamic_name (void)
11291 {
11292   rtx insn;
11293
11294   if (cfun->machine->some_ld_name)
11295     return cfun->machine->some_ld_name;
11296
11297   for (insn = get_insns (); insn ; insn = NEXT_INSN (insn))
11298     if (INSN_P (insn)
11299         && for_each_rtx (&PATTERN (insn), get_some_local_dynamic_name_1, 0))
11300       return cfun->machine->some_ld_name;
11301
11302   return NULL;
11303 }
11304
11305 /* Meaning of CODE:
11306    L,W,B,Q,S,T -- print the opcode suffix for specified size of operand.
11307    C -- print opcode suffix for set/cmov insn.
11308    c -- like C, but print reversed condition
11309    E,e -- likewise, but for compare-and-branch fused insn.
11310    F,f -- likewise, but for floating-point.
11311    O -- if HAVE_AS_IX86_CMOV_SUN_SYNTAX, expand to "w.", "l." or "q.",
11312         otherwise nothing
11313    R -- print the prefix for register names.
11314    z -- print the opcode suffix for the size of the current operand.
11315    Z -- likewise, with special suffixes for x87 instructions.
11316    * -- print a star (in certain assembler syntax)
11317    A -- print an absolute memory reference.
11318    w -- print the operand as if it's a "word" (HImode) even if it isn't.
11319    s -- print a shift double count, followed by the assemblers argument
11320         delimiter.
11321    b -- print the QImode name of the register for the indicated operand.
11322         %b0 would print %al if operands[0] is reg 0.
11323    w --  likewise, print the HImode name of the register.
11324    k --  likewise, print the SImode name of the register.
11325    q --  likewise, print the DImode name of the register.
11326    x --  likewise, print the V4SFmode name of the register.
11327    t --  likewise, print the V8SFmode name of the register.
11328    h -- print the QImode name for a "high" register, either ah, bh, ch or dh.
11329    y -- print "st(0)" instead of "st" as a register.
11330    d -- print duplicated register operand for AVX instruction.
11331    D -- print condition for SSE cmp instruction.
11332    P -- if PIC, print an @PLT suffix.
11333    X -- don't print any sort of PIC '@' suffix for a symbol.
11334    & -- print some in-use local-dynamic symbol name.
11335    H -- print a memory address offset by 8; used for sse high-parts
11336    Y -- print condition for XOP pcom* instruction.
11337    + -- print a branch hint as 'cs' or 'ds' prefix
11338    ; -- print a semicolon (after prefixes due to bug in older gas).
11339  */
11340
11341 void
11342 print_operand (FILE *file, rtx x, int code)
11343 {
11344   if (code)
11345     {
11346       switch (code)
11347         {
11348         case '*':
11349           if (ASSEMBLER_DIALECT == ASM_ATT)
11350             putc ('*', file);
11351           return;
11352
11353         case '&':
11354           {
11355             const char *name = get_some_local_dynamic_name ();
11356             if (name == NULL)
11357               output_operand_lossage ("'%%&' used without any "
11358                                       "local dynamic TLS references");
11359             else
11360               assemble_name (file, name);
11361             return;
11362           }
11363
11364         case 'A':
11365           switch (ASSEMBLER_DIALECT)
11366             {
11367             case ASM_ATT:
11368               putc ('*', file);
11369               break;
11370
11371             case ASM_INTEL:
11372               /* Intel syntax. For absolute addresses, registers should not
11373                  be surrounded by braces.  */
11374               if (!REG_P (x))
11375                 {
11376                   putc ('[', file);
11377                   PRINT_OPERAND (file, x, 0);
11378                   putc (']', file);
11379                   return;
11380                 }
11381               break;
11382
11383             default:
11384               gcc_unreachable ();
11385             }
11386
11387           PRINT_OPERAND (file, x, 0);
11388           return;
11389
11390
11391         case 'L':
11392           if (ASSEMBLER_DIALECT == ASM_ATT)
11393             putc ('l', file);
11394           return;
11395
11396         case 'W':
11397           if (ASSEMBLER_DIALECT == ASM_ATT)
11398             putc ('w', file);
11399           return;
11400
11401         case 'B':
11402           if (ASSEMBLER_DIALECT == ASM_ATT)
11403             putc ('b', file);
11404           return;
11405
11406         case 'Q':
11407           if (ASSEMBLER_DIALECT == ASM_ATT)
11408             putc ('l', file);
11409           return;
11410
11411         case 'S':
11412           if (ASSEMBLER_DIALECT == ASM_ATT)
11413             putc ('s', file);
11414           return;
11415
11416         case 'T':
11417           if (ASSEMBLER_DIALECT == ASM_ATT)
11418             putc ('t', file);
11419           return;
11420
11421         case 'z':
11422           if (GET_MODE_CLASS (GET_MODE (x)) == MODE_INT)
11423             {
11424               /* Opcodes don't get size suffixes if using Intel opcodes.  */
11425               if (ASSEMBLER_DIALECT == ASM_INTEL)
11426                 return;
11427
11428               switch (GET_MODE_SIZE (GET_MODE (x)))
11429                 {
11430                 case 1:
11431                   putc ('b', file);
11432                   return;
11433
11434                 case 2:
11435                   putc ('w', file);
11436                   return;
11437
11438                 case 4:
11439                   putc ('l', file);
11440                   return;
11441
11442                 case 8:
11443                   putc ('q', file);
11444                   return;
11445
11446                 default:
11447                   output_operand_lossage
11448                     ("invalid operand size for operand code '%c'", code);
11449                   return;
11450                 }
11451             }
11452
11453           if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
11454             warning
11455               (0, "non-integer operand used with operand code '%c'", code);
11456           /* FALLTHRU */
11457
11458         case 'Z':
11459           /* 387 opcodes don't get size suffixes if using Intel opcodes.  */
11460           if (ASSEMBLER_DIALECT == ASM_INTEL)
11461             return;
11462
11463           if (GET_MODE_CLASS (GET_MODE (x)) == MODE_INT)
11464             {
11465               switch (GET_MODE_SIZE (GET_MODE (x)))
11466                 {
11467                 case 2:
11468 #ifdef HAVE_AS_IX86_FILDS
11469                   putc ('s', file);
11470 #endif
11471                   return;
11472
11473                 case 4:
11474                   putc ('l', file);
11475                   return;
11476
11477                 case 8:
11478 #ifdef HAVE_AS_IX86_FILDQ
11479                   putc ('q', file);
11480 #else
11481                   fputs ("ll", file);
11482 #endif
11483                   return;
11484
11485                 default:
11486                   break;
11487                 }
11488             }
11489           else if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
11490             {
11491               /* 387 opcodes don't get size suffixes
11492                  if the operands are registers.  */
11493               if (STACK_REG_P (x))
11494                 return;
11495
11496               switch (GET_MODE_SIZE (GET_MODE (x)))
11497                 {
11498                 case 4:
11499                   putc ('s', file);
11500                   return;
11501
11502                 case 8:
11503                   putc ('l', file);
11504                   return;
11505
11506                 case 12:
11507                 case 16:
11508                   putc ('t', file);
11509                   return;
11510
11511                 default:
11512                   break;
11513                 }
11514             }
11515           else
11516             {
11517               output_operand_lossage
11518                 ("invalid operand type used with operand code '%c'", code);
11519               return;
11520             }
11521
11522           output_operand_lossage
11523             ("invalid operand size for operand code '%c'", code);
11524           return;
11525             
11526         case 'd':
11527         case 'b':
11528         case 'w':
11529         case 'k':
11530         case 'q':
11531         case 'h':
11532         case 't':
11533         case 'y':
11534         case 'x':
11535         case 'X':
11536         case 'P':
11537           break;
11538
11539         case 's':
11540           if (CONST_INT_P (x) || ! SHIFT_DOUBLE_OMITS_COUNT)
11541             {
11542               PRINT_OPERAND (file, x, 0);
11543               fputs (", ", file);
11544             }
11545           return;
11546
11547         case 'D':
11548           /* Little bit of braindamage here.  The SSE compare instructions
11549              does use completely different names for the comparisons that the
11550              fp conditional moves.  */
11551           if (TARGET_AVX)
11552             {
11553               switch (GET_CODE (x))
11554                 {
11555                 case EQ:
11556                   fputs ("eq", file);
11557                   break;
11558                 case UNEQ:
11559                   fputs ("eq_us", file);
11560                   break;
11561                 case LT:
11562                   fputs ("lt", file);
11563                   break;
11564                 case UNLT:
11565                   fputs ("nge", file);
11566                   break;
11567                 case LE:
11568                   fputs ("le", file);
11569                   break;
11570                 case UNLE:
11571                   fputs ("ngt", file);
11572                   break;
11573                 case UNORDERED:
11574                   fputs ("unord", file);
11575                   break;
11576                 case NE:
11577                   fputs ("neq", file);
11578                   break;
11579                 case LTGT:
11580                   fputs ("neq_oq", file);
11581                   break;
11582                 case GE:
11583                   fputs ("ge", file);
11584                   break;
11585                 case UNGE:
11586                   fputs ("nlt", file);
11587                   break;
11588                 case GT:
11589                   fputs ("gt", file);
11590                   break;
11591                 case UNGT:
11592                   fputs ("nle", file);
11593                   break;
11594                 case ORDERED:
11595                   fputs ("ord", file);
11596                   break;
11597                 default:
11598                   output_operand_lossage ("operand is not a condition code, "
11599                                           "invalid operand code 'D'");
11600                   return;
11601                 }
11602             }
11603           else
11604             {
11605               switch (GET_CODE (x))
11606                 {
11607                 case EQ:
11608                 case UNEQ:
11609                   fputs ("eq", file);
11610                   break;
11611                 case LT:
11612                 case UNLT:
11613                   fputs ("lt", file);
11614                   break;
11615                 case LE:
11616                 case UNLE:
11617                   fputs ("le", file);
11618                   break;
11619                 case UNORDERED:
11620                   fputs ("unord", file);
11621                   break;
11622                 case NE:
11623                 case LTGT:
11624                   fputs ("neq", file);
11625                   break;
11626                 case UNGE:
11627                 case GE:
11628                   fputs ("nlt", file);
11629                   break;
11630                 case UNGT:
11631                 case GT:
11632                   fputs ("nle", file);
11633                   break;
11634                 case ORDERED:
11635                   fputs ("ord", file);
11636                   break;
11637                 default:
11638                   output_operand_lossage ("operand is not a condition code, "
11639                                           "invalid operand code 'D'");
11640                   return;
11641                 }
11642             }
11643           return;
11644         case 'O':
11645 #ifdef HAVE_AS_IX86_CMOV_SUN_SYNTAX
11646           if (ASSEMBLER_DIALECT == ASM_ATT)
11647             {
11648               switch (GET_MODE (x))
11649                 {
11650                 case HImode: putc ('w', file); break;
11651                 case SImode:
11652                 case SFmode: putc ('l', file); break;
11653                 case DImode:
11654                 case DFmode: putc ('q', file); break;
11655                 default: gcc_unreachable ();
11656                 }
11657               putc ('.', file);
11658             }
11659 #endif
11660           return;
11661         case 'C':
11662           if (!COMPARISON_P (x))
11663             {
11664               output_operand_lossage ("operand is neither a constant nor a "
11665                                       "condition code, invalid operand code "
11666                                       "'C'");
11667               return;
11668             }
11669           put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 0, 0, file);
11670           return;
11671         case 'F':
11672           if (!COMPARISON_P (x))
11673             {
11674               output_operand_lossage ("operand is neither a constant nor a "
11675                                       "condition code, invalid operand code "
11676                                       "'F'");
11677               return;
11678             }
11679 #ifdef HAVE_AS_IX86_CMOV_SUN_SYNTAX
11680           if (ASSEMBLER_DIALECT == ASM_ATT)
11681             putc ('.', file);
11682 #endif
11683           put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 0, 1, file);
11684           return;
11685
11686           /* Like above, but reverse condition */
11687         case 'c':
11688           /* Check to see if argument to %c is really a constant
11689              and not a condition code which needs to be reversed.  */
11690           if (!COMPARISON_P (x))
11691             {
11692               output_operand_lossage ("operand is neither a constant nor a "
11693                                       "condition code, invalid operand "
11694                                       "code 'c'");
11695               return;
11696             }
11697           put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 1, 0, file);
11698           return;
11699         case 'f':
11700           if (!COMPARISON_P (x))
11701             {
11702               output_operand_lossage ("operand is neither a constant nor a "
11703                                       "condition code, invalid operand "
11704                                       "code 'f'");
11705               return;
11706             }
11707 #ifdef HAVE_AS_IX86_CMOV_SUN_SYNTAX
11708           if (ASSEMBLER_DIALECT == ASM_ATT)
11709             putc ('.', file);
11710 #endif
11711           put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 1, 1, file);
11712           return;
11713
11714         case 'E':
11715           put_condition_code (GET_CODE (x), CCmode, 0, 0, file);
11716           return;
11717
11718         case 'e':
11719           put_condition_code (GET_CODE (x), CCmode, 1, 0, file);
11720           return;
11721
11722         case 'H':
11723           /* It doesn't actually matter what mode we use here, as we're
11724              only going to use this for printing.  */
11725           x = adjust_address_nv (x, DImode, 8);
11726           break;
11727
11728         case '+':
11729           {
11730             rtx x;
11731
11732             if (!optimize
11733                 || optimize_function_for_size_p (cfun) || !TARGET_BRANCH_PREDICTION_HINTS)
11734               return;
11735
11736             x = find_reg_note (current_output_insn, REG_BR_PROB, 0);
11737             if (x)
11738               {
11739                 int pred_val = INTVAL (XEXP (x, 0));
11740
11741                 if (pred_val < REG_BR_PROB_BASE * 45 / 100
11742                     || pred_val > REG_BR_PROB_BASE * 55 / 100)
11743                   {
11744                     int taken = pred_val > REG_BR_PROB_BASE / 2;
11745                     int cputaken = final_forward_branch_p (current_output_insn) == 0;
11746
11747                     /* Emit hints only in the case default branch prediction
11748                        heuristics would fail.  */
11749                     if (taken != cputaken)
11750                       {
11751                         /* We use 3e (DS) prefix for taken branches and
11752                            2e (CS) prefix for not taken branches.  */
11753                         if (taken)
11754                           fputs ("ds ; ", file);
11755                         else
11756                           fputs ("cs ; ", file);
11757                       }
11758                   }
11759               }
11760             return;
11761           }
11762
11763         case 'Y':
11764           switch (GET_CODE (x))
11765             {
11766             case NE:
11767               fputs ("neq", file);
11768               break;
11769             case EQ:
11770               fputs ("eq", file);
11771               break;
11772             case GE:
11773             case GEU:
11774               fputs (INTEGRAL_MODE_P (GET_MODE (x)) ? "ge" : "unlt", file);
11775               break;
11776             case GT:
11777             case GTU:
11778               fputs (INTEGRAL_MODE_P (GET_MODE (x)) ? "gt" : "unle", file);
11779               break;
11780             case LE:
11781             case LEU:
11782               fputs ("le", file);
11783               break;
11784             case LT:
11785             case LTU:
11786               fputs ("lt", file);
11787               break;
11788             case UNORDERED:
11789               fputs ("unord", file);
11790               break;
11791             case ORDERED:
11792               fputs ("ord", file);
11793               break;
11794             case UNEQ:
11795               fputs ("ueq", file);
11796               break;
11797             case UNGE:
11798               fputs ("nlt", file);
11799               break;
11800             case UNGT:
11801               fputs ("nle", file);
11802               break;
11803             case UNLE:
11804               fputs ("ule", file);
11805               break;
11806             case UNLT:
11807               fputs ("ult", file);
11808               break;
11809             case LTGT:
11810               fputs ("une", file);
11811               break;
11812             default:
11813               output_operand_lossage ("operand is not a condition code, "
11814                                       "invalid operand code 'Y'");
11815               return;
11816             }
11817           return;
11818
11819         case ';':
11820 #if TARGET_MACHO
11821           fputs (" ; ", file);
11822 #else
11823           putc (' ', file);
11824 #endif
11825           return;
11826
11827         default:
11828             output_operand_lossage ("invalid operand code '%c'", code);
11829         }
11830     }
11831
11832   if (REG_P (x))
11833     print_reg (x, code, file);
11834
11835   else if (MEM_P (x))
11836     {
11837       /* No `byte ptr' prefix for call instructions or BLKmode operands.  */
11838       if (ASSEMBLER_DIALECT == ASM_INTEL && code != 'X' && code != 'P'
11839           && GET_MODE (x) != BLKmode)
11840         {
11841           const char * size;
11842           switch (GET_MODE_SIZE (GET_MODE (x)))
11843             {
11844             case 1: size = "BYTE"; break;
11845             case 2: size = "WORD"; break;
11846             case 4: size = "DWORD"; break;
11847             case 8: size = "QWORD"; break;
11848             case 12: size = "TBYTE"; break;
11849             case 16:
11850               if (GET_MODE (x) == XFmode)
11851                 size = "TBYTE";
11852               else
11853                 size = "XMMWORD";
11854               break;
11855             case 32: size = "YMMWORD"; break;
11856             default:
11857               gcc_unreachable ();
11858             }
11859
11860           /* Check for explicit size override (codes 'b', 'w' and 'k')  */
11861           if (code == 'b')
11862             size = "BYTE";
11863           else if (code == 'w')
11864             size = "WORD";
11865           else if (code == 'k')
11866             size = "DWORD";
11867
11868           fputs (size, file);
11869           fputs (" PTR ", file);
11870         }
11871
11872       x = XEXP (x, 0);
11873       /* Avoid (%rip) for call operands.  */
11874       if (CONSTANT_ADDRESS_P (x) && code == 'P'
11875           && !CONST_INT_P (x))
11876         output_addr_const (file, x);
11877       else if (this_is_asm_operands && ! address_operand (x, VOIDmode))
11878         output_operand_lossage ("invalid constraints for operand");
11879       else
11880         output_address (x);
11881     }
11882
11883   else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == SFmode)
11884     {
11885       REAL_VALUE_TYPE r;
11886       long l;
11887
11888       REAL_VALUE_FROM_CONST_DOUBLE (r, x);
11889       REAL_VALUE_TO_TARGET_SINGLE (r, l);
11890
11891       if (ASSEMBLER_DIALECT == ASM_ATT)
11892         putc ('$', file);
11893       fprintf (file, "0x%08lx", (long unsigned int) l);
11894     }
11895
11896   /* These float cases don't actually occur as immediate operands.  */
11897   else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == DFmode)
11898     {
11899       char dstr[30];
11900
11901       real_to_decimal (dstr, CONST_DOUBLE_REAL_VALUE (x), sizeof (dstr), 0, 1);
11902       fputs (dstr, file);
11903     }
11904
11905   else if (GET_CODE (x) == CONST_DOUBLE
11906            && GET_MODE (x) == XFmode)
11907     {
11908       char dstr[30];
11909
11910       real_to_decimal (dstr, CONST_DOUBLE_REAL_VALUE (x), sizeof (dstr), 0, 1);
11911       fputs (dstr, file);
11912     }
11913
11914   else
11915     {
11916       /* We have patterns that allow zero sets of memory, for instance.
11917          In 64-bit mode, we should probably support all 8-byte vectors,
11918          since we can in fact encode that into an immediate.  */
11919       if (GET_CODE (x) == CONST_VECTOR)
11920         {
11921           gcc_assert (x == CONST0_RTX (GET_MODE (x)));
11922           x = const0_rtx;
11923         }
11924
11925       if (code != 'P')
11926         {
11927           if (CONST_INT_P (x) || GET_CODE (x) == CONST_DOUBLE)
11928             {
11929               if (ASSEMBLER_DIALECT == ASM_ATT)
11930                 putc ('$', file);
11931             }
11932           else if (GET_CODE (x) == CONST || GET_CODE (x) == SYMBOL_REF
11933                    || GET_CODE (x) == LABEL_REF)
11934             {
11935               if (ASSEMBLER_DIALECT == ASM_ATT)
11936                 putc ('$', file);
11937               else
11938                 fputs ("OFFSET FLAT:", file);
11939             }
11940         }
11941       if (CONST_INT_P (x))
11942         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (x));
11943       else if (flag_pic)
11944         output_pic_addr_const (file, x, code);
11945       else
11946         output_addr_const (file, x);
11947     }
11948 }
11949 \f
11950 /* Print a memory operand whose address is ADDR.  */
11951
11952 void
11953 print_operand_address (FILE *file, rtx addr)
11954 {
11955   struct ix86_address parts;
11956   rtx base, index, disp;
11957   int scale;
11958   int ok = ix86_decompose_address (addr, &parts);
11959
11960   gcc_assert (ok);
11961
11962   base = parts.base;
11963   index = parts.index;
11964   disp = parts.disp;
11965   scale = parts.scale;
11966
11967   switch (parts.seg)
11968     {
11969     case SEG_DEFAULT:
11970       break;
11971     case SEG_FS:
11972     case SEG_GS:
11973       if (ASSEMBLER_DIALECT == ASM_ATT)
11974         putc ('%', file);
11975       fputs ((parts.seg == SEG_FS ? "fs:" : "gs:"), file);
11976       break;
11977     default:
11978       gcc_unreachable ();
11979     }
11980
11981   /* Use one byte shorter RIP relative addressing for 64bit mode.  */
11982   if (TARGET_64BIT && !base && !index)
11983     {
11984       rtx symbol = disp;
11985
11986       if (GET_CODE (disp) == CONST
11987           && GET_CODE (XEXP (disp, 0)) == PLUS
11988           && CONST_INT_P (XEXP (XEXP (disp, 0), 1)))
11989         symbol = XEXP (XEXP (disp, 0), 0);
11990
11991       if (GET_CODE (symbol) == LABEL_REF
11992           || (GET_CODE (symbol) == SYMBOL_REF
11993               && SYMBOL_REF_TLS_MODEL (symbol) == 0))
11994         base = pc_rtx;
11995     }
11996   if (!base && !index)
11997     {
11998       /* Displacement only requires special attention.  */
11999
12000       if (CONST_INT_P (disp))
12001         {
12002           if (ASSEMBLER_DIALECT == ASM_INTEL && parts.seg == SEG_DEFAULT)
12003             fputs ("ds:", file);
12004           fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (disp));
12005         }
12006       else if (flag_pic)
12007         output_pic_addr_const (file, disp, 0);
12008       else
12009         output_addr_const (file, disp);
12010     }
12011   else
12012     {
12013       if (ASSEMBLER_DIALECT == ASM_ATT)
12014         {
12015           if (disp)
12016             {
12017               if (flag_pic)
12018                 output_pic_addr_const (file, disp, 0);
12019               else if (GET_CODE (disp) == LABEL_REF)
12020                 output_asm_label (disp);
12021               else
12022                 output_addr_const (file, disp);
12023             }
12024
12025           putc ('(', file);
12026           if (base)
12027             print_reg (base, 0, file);
12028           if (index)
12029             {
12030               putc (',', file);
12031               print_reg (index, 0, file);
12032               if (scale != 1)
12033                 fprintf (file, ",%d", scale);
12034             }
12035           putc (')', file);
12036         }
12037       else
12038         {
12039           rtx offset = NULL_RTX;
12040
12041           if (disp)
12042             {
12043               /* Pull out the offset of a symbol; print any symbol itself.  */
12044               if (GET_CODE (disp) == CONST
12045                   && GET_CODE (XEXP (disp, 0)) == PLUS
12046                   && CONST_INT_P (XEXP (XEXP (disp, 0), 1)))
12047                 {
12048                   offset = XEXP (XEXP (disp, 0), 1);
12049                   disp = gen_rtx_CONST (VOIDmode,
12050                                         XEXP (XEXP (disp, 0), 0));
12051                 }
12052
12053               if (flag_pic)
12054                 output_pic_addr_const (file, disp, 0);
12055               else if (GET_CODE (disp) == LABEL_REF)
12056                 output_asm_label (disp);
12057               else if (CONST_INT_P (disp))
12058                 offset = disp;
12059               else
12060                 output_addr_const (file, disp);
12061             }
12062
12063           putc ('[', file);
12064           if (base)
12065             {
12066               print_reg (base, 0, file);
12067               if (offset)
12068                 {
12069                   if (INTVAL (offset) >= 0)
12070                     putc ('+', file);
12071                   fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (offset));
12072                 }
12073             }
12074           else if (offset)
12075             fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (offset));
12076           else
12077             putc ('0', file);
12078
12079           if (index)
12080             {
12081               putc ('+', file);
12082               print_reg (index, 0, file);
12083               if (scale != 1)
12084                 fprintf (file, "*%d", scale);
12085             }
12086           putc (']', file);
12087         }
12088     }
12089 }
12090
12091 bool
12092 output_addr_const_extra (FILE *file, rtx x)
12093 {
12094   rtx op;
12095
12096   if (GET_CODE (x) != UNSPEC)
12097     return false;
12098
12099   op = XVECEXP (x, 0, 0);
12100   switch (XINT (x, 1))
12101     {
12102     case UNSPEC_GOTTPOFF:
12103       output_addr_const (file, op);
12104       /* FIXME: This might be @TPOFF in Sun ld.  */
12105       fputs ("@GOTTPOFF", file);
12106       break;
12107     case UNSPEC_TPOFF:
12108       output_addr_const (file, op);
12109       fputs ("@TPOFF", file);
12110       break;
12111     case UNSPEC_NTPOFF:
12112       output_addr_const (file, op);
12113       if (TARGET_64BIT)
12114         fputs ("@TPOFF", file);
12115       else
12116         fputs ("@NTPOFF", file);
12117       break;
12118     case UNSPEC_DTPOFF:
12119       output_addr_const (file, op);
12120       fputs ("@DTPOFF", file);
12121       break;
12122     case UNSPEC_GOTNTPOFF:
12123       output_addr_const (file, op);
12124       if (TARGET_64BIT)
12125         fputs (ASSEMBLER_DIALECT == ASM_ATT ?
12126                "@GOTTPOFF(%rip)" : "@GOTTPOFF[rip]", file);
12127       else
12128         fputs ("@GOTNTPOFF", file);
12129       break;
12130     case UNSPEC_INDNTPOFF:
12131       output_addr_const (file, op);
12132       fputs ("@INDNTPOFF", file);
12133       break;
12134 #if TARGET_MACHO
12135     case UNSPEC_MACHOPIC_OFFSET:
12136       output_addr_const (file, op);
12137       putc ('-', file);
12138       machopic_output_function_base_name (file);
12139       break;
12140 #endif
12141
12142     default:
12143       return false;
12144     }
12145
12146   return true;
12147 }
12148 \f
12149 /* Split one or more DImode RTL references into pairs of SImode
12150    references.  The RTL can be REG, offsettable MEM, integer constant, or
12151    CONST_DOUBLE.  "operands" is a pointer to an array of DImode RTL to
12152    split and "num" is its length.  lo_half and hi_half are output arrays
12153    that parallel "operands".  */
12154
12155 void
12156 split_di (rtx operands[], int num, rtx lo_half[], rtx hi_half[])
12157 {
12158   while (num--)
12159     {
12160       rtx op = operands[num];
12161
12162       /* simplify_subreg refuse to split volatile memory addresses,
12163          but we still have to handle it.  */
12164       if (MEM_P (op))
12165         {
12166           lo_half[num] = adjust_address (op, SImode, 0);
12167           hi_half[num] = adjust_address (op, SImode, 4);
12168         }
12169       else
12170         {
12171           lo_half[num] = simplify_gen_subreg (SImode, op,
12172                                               GET_MODE (op) == VOIDmode
12173                                               ? DImode : GET_MODE (op), 0);
12174           hi_half[num] = simplify_gen_subreg (SImode, op,
12175                                               GET_MODE (op) == VOIDmode
12176                                               ? DImode : GET_MODE (op), 4);
12177         }
12178     }
12179 }
12180 /* Split one or more TImode RTL references into pairs of DImode
12181    references.  The RTL can be REG, offsettable MEM, integer constant, or
12182    CONST_DOUBLE.  "operands" is a pointer to an array of DImode RTL to
12183    split and "num" is its length.  lo_half and hi_half are output arrays
12184    that parallel "operands".  */
12185
12186 void
12187 split_ti (rtx operands[], int num, rtx lo_half[], rtx hi_half[])
12188 {
12189   while (num--)
12190     {
12191       rtx op = operands[num];
12192
12193       /* simplify_subreg refuse to split volatile memory addresses, but we
12194          still have to handle it.  */
12195       if (MEM_P (op))
12196         {
12197           lo_half[num] = adjust_address (op, DImode, 0);
12198           hi_half[num] = adjust_address (op, DImode, 8);
12199         }
12200       else
12201         {
12202           lo_half[num] = simplify_gen_subreg (DImode, op, TImode, 0);
12203           hi_half[num] = simplify_gen_subreg (DImode, op, TImode, 8);
12204         }
12205     }
12206 }
12207 \f
12208 /* Output code to perform a 387 binary operation in INSN, one of PLUS,
12209    MINUS, MULT or DIV.  OPERANDS are the insn operands, where operands[3]
12210    is the expression of the binary operation.  The output may either be
12211    emitted here, or returned to the caller, like all output_* functions.
12212
12213    There is no guarantee that the operands are the same mode, as they
12214    might be within FLOAT or FLOAT_EXTEND expressions.  */
12215
12216 #ifndef SYSV386_COMPAT
12217 /* Set to 1 for compatibility with brain-damaged assemblers.  No-one
12218    wants to fix the assemblers because that causes incompatibility
12219    with gcc.  No-one wants to fix gcc because that causes
12220    incompatibility with assemblers...  You can use the option of
12221    -DSYSV386_COMPAT=0 if you recompile both gcc and gas this way.  */
12222 #define SYSV386_COMPAT 1
12223 #endif
12224
12225 const char *
12226 output_387_binary_op (rtx insn, rtx *operands)
12227 {
12228   static char buf[40];
12229   const char *p;
12230   const char *ssep;
12231   int is_sse = SSE_REG_P (operands[0]) || SSE_REG_P (operands[1]) || SSE_REG_P (operands[2]);
12232
12233 #ifdef ENABLE_CHECKING
12234   /* Even if we do not want to check the inputs, this documents input
12235      constraints.  Which helps in understanding the following code.  */
12236   if (STACK_REG_P (operands[0])
12237       && ((REG_P (operands[1])
12238            && REGNO (operands[0]) == REGNO (operands[1])
12239            && (STACK_REG_P (operands[2]) || MEM_P (operands[2])))
12240           || (REG_P (operands[2])
12241               && REGNO (operands[0]) == REGNO (operands[2])
12242               && (STACK_REG_P (operands[1]) || MEM_P (operands[1]))))
12243       && (STACK_TOP_P (operands[1]) || STACK_TOP_P (operands[2])))
12244     ; /* ok */
12245   else
12246     gcc_assert (is_sse);
12247 #endif
12248
12249   switch (GET_CODE (operands[3]))
12250     {
12251     case PLUS:
12252       if (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
12253           || GET_MODE_CLASS (GET_MODE (operands[2])) == MODE_INT)
12254         p = "fiadd";
12255       else
12256         p = "fadd";
12257       ssep = "vadd";
12258       break;
12259
12260     case MINUS:
12261       if (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
12262           || GET_MODE_CLASS (GET_MODE (operands[2])) == MODE_INT)
12263         p = "fisub";
12264       else
12265         p = "fsub";
12266       ssep = "vsub";
12267       break;
12268
12269     case MULT:
12270       if (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
12271           || GET_MODE_CLASS (GET_MODE (operands[2])) == MODE_INT)
12272         p = "fimul";
12273       else
12274         p = "fmul";
12275       ssep = "vmul";
12276       break;
12277
12278     case DIV:
12279       if (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
12280           || GET_MODE_CLASS (GET_MODE (operands[2])) == MODE_INT)
12281         p = "fidiv";
12282       else
12283         p = "fdiv";
12284       ssep = "vdiv";
12285       break;
12286
12287     default:
12288       gcc_unreachable ();
12289     }
12290
12291   if (is_sse)
12292    {
12293      if (TARGET_AVX)
12294        {
12295          strcpy (buf, ssep);
12296          if (GET_MODE (operands[0]) == SFmode)
12297            strcat (buf, "ss\t{%2, %1, %0|%0, %1, %2}");
12298          else
12299            strcat (buf, "sd\t{%2, %1, %0|%0, %1, %2}");
12300        }
12301      else
12302        {
12303          strcpy (buf, ssep + 1);
12304          if (GET_MODE (operands[0]) == SFmode)
12305            strcat (buf, "ss\t{%2, %0|%0, %2}");
12306          else
12307            strcat (buf, "sd\t{%2, %0|%0, %2}");
12308        }
12309       return buf;
12310    }
12311   strcpy (buf, p);
12312
12313   switch (GET_CODE (operands[3]))
12314     {
12315     case MULT:
12316     case PLUS:
12317       if (REG_P (operands[2]) && REGNO (operands[0]) == REGNO (operands[2]))
12318         {
12319           rtx temp = operands[2];
12320           operands[2] = operands[1];
12321           operands[1] = temp;
12322         }
12323
12324       /* know operands[0] == operands[1].  */
12325
12326       if (MEM_P (operands[2]))
12327         {
12328           p = "%Z2\t%2";
12329           break;
12330         }
12331
12332       if (find_regno_note (insn, REG_DEAD, REGNO (operands[2])))
12333         {
12334           if (STACK_TOP_P (operands[0]))
12335             /* How is it that we are storing to a dead operand[2]?
12336                Well, presumably operands[1] is dead too.  We can't
12337                store the result to st(0) as st(0) gets popped on this
12338                instruction.  Instead store to operands[2] (which I
12339                think has to be st(1)).  st(1) will be popped later.
12340                gcc <= 2.8.1 didn't have this check and generated
12341                assembly code that the Unixware assembler rejected.  */
12342             p = "p\t{%0, %2|%2, %0}";   /* st(1) = st(0) op st(1); pop */
12343           else
12344             p = "p\t{%2, %0|%0, %2}";   /* st(r1) = st(r1) op st(0); pop */
12345           break;
12346         }
12347
12348       if (STACK_TOP_P (operands[0]))
12349         p = "\t{%y2, %0|%0, %y2}";      /* st(0) = st(0) op st(r2) */
12350       else
12351         p = "\t{%2, %0|%0, %2}";        /* st(r1) = st(r1) op st(0) */
12352       break;
12353
12354     case MINUS:
12355     case DIV:
12356       if (MEM_P (operands[1]))
12357         {
12358           p = "r%Z1\t%1";
12359           break;
12360         }
12361
12362       if (MEM_P (operands[2]))
12363         {
12364           p = "%Z2\t%2";
12365           break;
12366         }
12367
12368       if (find_regno_note (insn, REG_DEAD, REGNO (operands[2])))
12369         {
12370 #if SYSV386_COMPAT
12371           /* The SystemV/386 SVR3.2 assembler, and probably all AT&T
12372              derived assemblers, confusingly reverse the direction of
12373              the operation for fsub{r} and fdiv{r} when the
12374              destination register is not st(0).  The Intel assembler
12375              doesn't have this brain damage.  Read !SYSV386_COMPAT to
12376              figure out what the hardware really does.  */
12377           if (STACK_TOP_P (operands[0]))
12378             p = "{p\t%0, %2|rp\t%2, %0}";
12379           else
12380             p = "{rp\t%2, %0|p\t%0, %2}";
12381 #else
12382           if (STACK_TOP_P (operands[0]))
12383             /* As above for fmul/fadd, we can't store to st(0).  */
12384             p = "rp\t{%0, %2|%2, %0}";  /* st(1) = st(0) op st(1); pop */
12385           else
12386             p = "p\t{%2, %0|%0, %2}";   /* st(r1) = st(r1) op st(0); pop */
12387 #endif
12388           break;
12389         }
12390
12391       if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
12392         {
12393 #if SYSV386_COMPAT
12394           if (STACK_TOP_P (operands[0]))
12395             p = "{rp\t%0, %1|p\t%1, %0}";
12396           else
12397             p = "{p\t%1, %0|rp\t%0, %1}";
12398 #else
12399           if (STACK_TOP_P (operands[0]))
12400             p = "p\t{%0, %1|%1, %0}";   /* st(1) = st(1) op st(0); pop */
12401           else
12402             p = "rp\t{%1, %0|%0, %1}";  /* st(r2) = st(0) op st(r2); pop */
12403 #endif
12404           break;
12405         }
12406
12407       if (STACK_TOP_P (operands[0]))
12408         {
12409           if (STACK_TOP_P (operands[1]))
12410             p = "\t{%y2, %0|%0, %y2}";  /* st(0) = st(0) op st(r2) */
12411           else
12412             p = "r\t{%y1, %0|%0, %y1}"; /* st(0) = st(r1) op st(0) */
12413           break;
12414         }
12415       else if (STACK_TOP_P (operands[1]))
12416         {
12417 #if SYSV386_COMPAT
12418           p = "{\t%1, %0|r\t%0, %1}";
12419 #else
12420           p = "r\t{%1, %0|%0, %1}";     /* st(r2) = st(0) op st(r2) */
12421 #endif
12422         }
12423       else
12424         {
12425 #if SYSV386_COMPAT
12426           p = "{r\t%2, %0|\t%0, %2}";
12427 #else
12428           p = "\t{%2, %0|%0, %2}";      /* st(r1) = st(r1) op st(0) */
12429 #endif
12430         }
12431       break;
12432
12433     default:
12434       gcc_unreachable ();
12435     }
12436
12437   strcat (buf, p);
12438   return buf;
12439 }
12440
12441 /* Return needed mode for entity in optimize_mode_switching pass.  */
12442
12443 int
12444 ix86_mode_needed (int entity, rtx insn)
12445 {
12446   enum attr_i387_cw mode;
12447
12448   /* The mode UNINITIALIZED is used to store control word after a
12449      function call or ASM pattern.  The mode ANY specify that function
12450      has no requirements on the control word and make no changes in the
12451      bits we are interested in.  */
12452
12453   if (CALL_P (insn)
12454       || (NONJUMP_INSN_P (insn)
12455           && (asm_noperands (PATTERN (insn)) >= 0
12456               || GET_CODE (PATTERN (insn)) == ASM_INPUT)))
12457     return I387_CW_UNINITIALIZED;
12458
12459   if (recog_memoized (insn) < 0)
12460     return I387_CW_ANY;
12461
12462   mode = get_attr_i387_cw (insn);
12463
12464   switch (entity)
12465     {
12466     case I387_TRUNC:
12467       if (mode == I387_CW_TRUNC)
12468         return mode;
12469       break;
12470
12471     case I387_FLOOR:
12472       if (mode == I387_CW_FLOOR)
12473         return mode;
12474       break;
12475
12476     case I387_CEIL:
12477       if (mode == I387_CW_CEIL)
12478         return mode;
12479       break;
12480
12481     case I387_MASK_PM:
12482       if (mode == I387_CW_MASK_PM)
12483         return mode;
12484       break;
12485
12486     default:
12487       gcc_unreachable ();
12488     }
12489
12490   return I387_CW_ANY;
12491 }
12492
12493 /* Output code to initialize control word copies used by trunc?f?i and
12494    rounding patterns.  CURRENT_MODE is set to current control word,
12495    while NEW_MODE is set to new control word.  */
12496
12497 void
12498 emit_i387_cw_initialization (int mode)
12499 {
12500   rtx stored_mode = assign_386_stack_local (HImode, SLOT_CW_STORED);
12501   rtx new_mode;
12502
12503   enum ix86_stack_slot slot;
12504
12505   rtx reg = gen_reg_rtx (HImode);
12506
12507   emit_insn (gen_x86_fnstcw_1 (stored_mode));
12508   emit_move_insn (reg, copy_rtx (stored_mode));
12509
12510   if (TARGET_64BIT || TARGET_PARTIAL_REG_STALL
12511       || optimize_function_for_size_p (cfun))
12512     {
12513       switch (mode)
12514         {
12515         case I387_CW_TRUNC:
12516           /* round toward zero (truncate) */
12517           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0c00)));
12518           slot = SLOT_CW_TRUNC;
12519           break;
12520
12521         case I387_CW_FLOOR:
12522           /* round down toward -oo */
12523           emit_insn (gen_andhi3 (reg, reg, GEN_INT (~0x0c00)));
12524           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0400)));
12525           slot = SLOT_CW_FLOOR;
12526           break;
12527
12528         case I387_CW_CEIL:
12529           /* round up toward +oo */
12530           emit_insn (gen_andhi3 (reg, reg, GEN_INT (~0x0c00)));
12531           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0800)));
12532           slot = SLOT_CW_CEIL;
12533           break;
12534
12535         case I387_CW_MASK_PM:
12536           /* mask precision exception for nearbyint() */
12537           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0020)));
12538           slot = SLOT_CW_MASK_PM;
12539           break;
12540
12541         default:
12542           gcc_unreachable ();
12543         }
12544     }
12545   else
12546     {
12547       switch (mode)
12548         {
12549         case I387_CW_TRUNC:
12550           /* round toward zero (truncate) */
12551           emit_insn (gen_movsi_insv_1 (reg, GEN_INT (0xc)));
12552           slot = SLOT_CW_TRUNC;
12553           break;
12554
12555         case I387_CW_FLOOR:
12556           /* round down toward -oo */
12557           emit_insn (gen_movsi_insv_1 (reg, GEN_INT (0x4)));
12558           slot = SLOT_CW_FLOOR;
12559           break;
12560
12561         case I387_CW_CEIL:
12562           /* round up toward +oo */
12563           emit_insn (gen_movsi_insv_1 (reg, GEN_INT (0x8)));
12564           slot = SLOT_CW_CEIL;
12565           break;
12566
12567         case I387_CW_MASK_PM:
12568           /* mask precision exception for nearbyint() */
12569           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0020)));
12570           slot = SLOT_CW_MASK_PM;
12571           break;
12572
12573         default:
12574           gcc_unreachable ();
12575         }
12576     }
12577
12578   gcc_assert (slot < MAX_386_STACK_LOCALS);
12579
12580   new_mode = assign_386_stack_local (HImode, slot);
12581   emit_move_insn (new_mode, reg);
12582 }
12583
12584 /* Output code for INSN to convert a float to a signed int.  OPERANDS
12585    are the insn operands.  The output may be [HSD]Imode and the input
12586    operand may be [SDX]Fmode.  */
12587
12588 const char *
12589 output_fix_trunc (rtx insn, rtx *operands, int fisttp)
12590 {
12591   int stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
12592   int dimode_p = GET_MODE (operands[0]) == DImode;
12593   int round_mode = get_attr_i387_cw (insn);
12594
12595   /* Jump through a hoop or two for DImode, since the hardware has no
12596      non-popping instruction.  We used to do this a different way, but
12597      that was somewhat fragile and broke with post-reload splitters.  */
12598   if ((dimode_p || fisttp) && !stack_top_dies)
12599     output_asm_insn ("fld\t%y1", operands);
12600
12601   gcc_assert (STACK_TOP_P (operands[1]));
12602   gcc_assert (MEM_P (operands[0]));
12603   gcc_assert (GET_MODE (operands[1]) != TFmode);
12604
12605   if (fisttp)
12606       output_asm_insn ("fisttp%Z0\t%0", operands);
12607   else
12608     {
12609       if (round_mode != I387_CW_ANY)
12610         output_asm_insn ("fldcw\t%3", operands);
12611       if (stack_top_dies || dimode_p)
12612         output_asm_insn ("fistp%Z0\t%0", operands);
12613       else
12614         output_asm_insn ("fist%Z0\t%0", operands);
12615       if (round_mode != I387_CW_ANY)
12616         output_asm_insn ("fldcw\t%2", operands);
12617     }
12618
12619   return "";
12620 }
12621
12622 /* Output code for x87 ffreep insn.  The OPNO argument, which may only
12623    have the values zero or one, indicates the ffreep insn's operand
12624    from the OPERANDS array.  */
12625
12626 static const char *
12627 output_387_ffreep (rtx *operands ATTRIBUTE_UNUSED, int opno)
12628 {
12629   if (TARGET_USE_FFREEP)
12630 #ifdef HAVE_AS_IX86_FFREEP
12631     return opno ? "ffreep\t%y1" : "ffreep\t%y0";
12632 #else
12633     {
12634       static char retval[32];
12635       int regno = REGNO (operands[opno]);
12636
12637       gcc_assert (FP_REGNO_P (regno));
12638
12639       regno -= FIRST_STACK_REG;
12640
12641       snprintf (retval, sizeof (retval), ASM_SHORT "0xc%ddf", regno);
12642       return retval;
12643     }
12644 #endif
12645
12646   return opno ? "fstp\t%y1" : "fstp\t%y0";
12647 }
12648
12649
12650 /* Output code for INSN to compare OPERANDS.  EFLAGS_P is 1 when fcomi
12651    should be used.  UNORDERED_P is true when fucom should be used.  */
12652
12653 const char *
12654 output_fp_compare (rtx insn, rtx *operands, int eflags_p, int unordered_p)
12655 {
12656   int stack_top_dies;
12657   rtx cmp_op0, cmp_op1;
12658   int is_sse = SSE_REG_P (operands[0]) || SSE_REG_P (operands[1]);
12659
12660   if (eflags_p)
12661     {
12662       cmp_op0 = operands[0];
12663       cmp_op1 = operands[1];
12664     }
12665   else
12666     {
12667       cmp_op0 = operands[1];
12668       cmp_op1 = operands[2];
12669     }
12670
12671   if (is_sse)
12672     {
12673       static const char ucomiss[] = "vucomiss\t{%1, %0|%0, %1}";
12674       static const char ucomisd[] = "vucomisd\t{%1, %0|%0, %1}";
12675       static const char comiss[] = "vcomiss\t{%1, %0|%0, %1}";
12676       static const char comisd[] = "vcomisd\t{%1, %0|%0, %1}";
12677
12678       if (GET_MODE (operands[0]) == SFmode)
12679         if (unordered_p)
12680           return &ucomiss[TARGET_AVX ? 0 : 1];
12681         else
12682           return &comiss[TARGET_AVX ? 0 : 1];
12683       else
12684         if (unordered_p)
12685           return &ucomisd[TARGET_AVX ? 0 : 1];
12686         else
12687           return &comisd[TARGET_AVX ? 0 : 1];
12688     }
12689
12690   gcc_assert (STACK_TOP_P (cmp_op0));
12691
12692   stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
12693
12694   if (cmp_op1 == CONST0_RTX (GET_MODE (cmp_op1)))
12695     {
12696       if (stack_top_dies)
12697         {
12698           output_asm_insn ("ftst\n\tfnstsw\t%0", operands);
12699           return output_387_ffreep (operands, 1);
12700         }
12701       else
12702         return "ftst\n\tfnstsw\t%0";
12703     }
12704
12705   if (STACK_REG_P (cmp_op1)
12706       && stack_top_dies
12707       && find_regno_note (insn, REG_DEAD, REGNO (cmp_op1))
12708       && REGNO (cmp_op1) != FIRST_STACK_REG)
12709     {
12710       /* If both the top of the 387 stack dies, and the other operand
12711          is also a stack register that dies, then this must be a
12712          `fcompp' float compare */
12713
12714       if (eflags_p)
12715         {
12716           /* There is no double popping fcomi variant.  Fortunately,
12717              eflags is immune from the fstp's cc clobbering.  */
12718           if (unordered_p)
12719             output_asm_insn ("fucomip\t{%y1, %0|%0, %y1}", operands);
12720           else
12721             output_asm_insn ("fcomip\t{%y1, %0|%0, %y1}", operands);
12722           return output_387_ffreep (operands, 0);
12723         }
12724       else
12725         {
12726           if (unordered_p)
12727             return "fucompp\n\tfnstsw\t%0";
12728           else
12729             return "fcompp\n\tfnstsw\t%0";
12730         }
12731     }
12732   else
12733     {
12734       /* Encoded here as eflags_p | intmode | unordered_p | stack_top_dies.  */
12735
12736       static const char * const alt[16] =
12737       {
12738         "fcom%Z2\t%y2\n\tfnstsw\t%0",
12739         "fcomp%Z2\t%y2\n\tfnstsw\t%0",
12740         "fucom%Z2\t%y2\n\tfnstsw\t%0",
12741         "fucomp%Z2\t%y2\n\tfnstsw\t%0",
12742
12743         "ficom%Z2\t%y2\n\tfnstsw\t%0",
12744         "ficomp%Z2\t%y2\n\tfnstsw\t%0",
12745         NULL,
12746         NULL,
12747
12748         "fcomi\t{%y1, %0|%0, %y1}",
12749         "fcomip\t{%y1, %0|%0, %y1}",
12750         "fucomi\t{%y1, %0|%0, %y1}",
12751         "fucomip\t{%y1, %0|%0, %y1}",
12752
12753         NULL,
12754         NULL,
12755         NULL,
12756         NULL
12757       };
12758
12759       int mask;
12760       const char *ret;
12761
12762       mask  = eflags_p << 3;
12763       mask |= (GET_MODE_CLASS (GET_MODE (cmp_op1)) == MODE_INT) << 2;
12764       mask |= unordered_p << 1;
12765       mask |= stack_top_dies;
12766
12767       gcc_assert (mask < 16);
12768       ret = alt[mask];
12769       gcc_assert (ret);
12770
12771       return ret;
12772     }
12773 }
12774
12775 void
12776 ix86_output_addr_vec_elt (FILE *file, int value)
12777 {
12778   const char *directive = ASM_LONG;
12779
12780 #ifdef ASM_QUAD
12781   if (TARGET_64BIT)
12782     directive = ASM_QUAD;
12783 #else
12784   gcc_assert (!TARGET_64BIT);
12785 #endif
12786
12787   fprintf (file, "%s" LPREFIX "%d\n", directive, value);
12788 }
12789
12790 void
12791 ix86_output_addr_diff_elt (FILE *file, int value, int rel)
12792 {
12793   const char *directive = ASM_LONG;
12794
12795 #ifdef ASM_QUAD
12796   if (TARGET_64BIT && CASE_VECTOR_MODE == DImode)
12797     directive = ASM_QUAD;
12798 #else
12799   gcc_assert (!TARGET_64BIT);
12800 #endif
12801   /* We can't use @GOTOFF for text labels on VxWorks; see gotoff_operand.  */
12802   if (TARGET_64BIT || TARGET_VXWORKS_RTP)
12803     fprintf (file, "%s" LPREFIX "%d-" LPREFIX "%d\n",
12804              directive, value, rel);
12805   else if (HAVE_AS_GOTOFF_IN_DATA)
12806     fprintf (file, ASM_LONG LPREFIX "%d@GOTOFF\n", value);
12807 #if TARGET_MACHO
12808   else if (TARGET_MACHO)
12809     {
12810       fprintf (file, ASM_LONG LPREFIX "%d-", value);
12811       machopic_output_function_base_name (file);
12812       putc ('\n', file);
12813     }
12814 #endif
12815   else
12816     asm_fprintf (file, ASM_LONG "%U%s+[.-" LPREFIX "%d]\n",
12817                  GOT_SYMBOL_NAME, value);
12818 }
12819 \f
12820 /* Generate either "mov $0, reg" or "xor reg, reg", as appropriate
12821    for the target.  */
12822
12823 void
12824 ix86_expand_clear (rtx dest)
12825 {
12826   rtx tmp;
12827
12828   /* We play register width games, which are only valid after reload.  */
12829   gcc_assert (reload_completed);
12830
12831   /* Avoid HImode and its attendant prefix byte.  */
12832   if (GET_MODE_SIZE (GET_MODE (dest)) < 4)
12833     dest = gen_rtx_REG (SImode, REGNO (dest));
12834   tmp = gen_rtx_SET (VOIDmode, dest, const0_rtx);
12835
12836   /* This predicate should match that for movsi_xor and movdi_xor_rex64.  */
12837   if (!TARGET_USE_MOV0 || optimize_insn_for_speed_p ())
12838     {
12839       rtx clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
12840       tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, tmp, clob));
12841     }
12842
12843   emit_insn (tmp);
12844 }
12845
12846 /* X is an unchanging MEM.  If it is a constant pool reference, return
12847    the constant pool rtx, else NULL.  */
12848
12849 rtx
12850 maybe_get_pool_constant (rtx x)
12851 {
12852   x = ix86_delegitimize_address (XEXP (x, 0));
12853
12854   if (GET_CODE (x) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (x))
12855     return get_pool_constant (x);
12856
12857   return NULL_RTX;
12858 }
12859
12860 void
12861 ix86_expand_move (enum machine_mode mode, rtx operands[])
12862 {
12863   rtx op0, op1;
12864   enum tls_model model;
12865
12866   op0 = operands[0];
12867   op1 = operands[1];
12868
12869   if (GET_CODE (op1) == SYMBOL_REF)
12870     {
12871       model = SYMBOL_REF_TLS_MODEL (op1);
12872       if (model)
12873         {
12874           op1 = legitimize_tls_address (op1, model, true);
12875           op1 = force_operand (op1, op0);
12876           if (op1 == op0)
12877             return;
12878         }
12879       else if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
12880                && SYMBOL_REF_DLLIMPORT_P (op1))
12881         op1 = legitimize_dllimport_symbol (op1, false);
12882     }
12883   else if (GET_CODE (op1) == CONST
12884            && GET_CODE (XEXP (op1, 0)) == PLUS
12885            && GET_CODE (XEXP (XEXP (op1, 0), 0)) == SYMBOL_REF)
12886     {
12887       rtx addend = XEXP (XEXP (op1, 0), 1);
12888       rtx symbol = XEXP (XEXP (op1, 0), 0);
12889       rtx tmp = NULL;
12890
12891       model = SYMBOL_REF_TLS_MODEL (symbol);
12892       if (model)
12893         tmp = legitimize_tls_address (symbol, model, true);
12894       else if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
12895                && SYMBOL_REF_DLLIMPORT_P (symbol))
12896         tmp = legitimize_dllimport_symbol (symbol, true);
12897
12898       if (tmp)
12899         {
12900           tmp = force_operand (tmp, NULL);
12901           tmp = expand_simple_binop (Pmode, PLUS, tmp, addend,
12902                                      op0, 1, OPTAB_DIRECT);
12903           if (tmp == op0)
12904             return;
12905         }
12906     }
12907
12908   if (flag_pic && mode == Pmode && symbolic_operand (op1, Pmode))
12909     {
12910       if (TARGET_MACHO && !TARGET_64BIT)
12911         {
12912 #if TARGET_MACHO
12913           if (MACHOPIC_PURE)
12914             {
12915               rtx temp = ((reload_in_progress
12916                            || ((op0 && REG_P (op0))
12917                                && mode == Pmode))
12918                           ? op0 : gen_reg_rtx (Pmode));
12919               op1 = machopic_indirect_data_reference (op1, temp);
12920               op1 = machopic_legitimize_pic_address (op1, mode,
12921                                                      temp == op1 ? 0 : temp);
12922             }
12923           else if (MACHOPIC_INDIRECT)
12924             op1 = machopic_indirect_data_reference (op1, 0);
12925           if (op0 == op1)
12926             return;
12927 #endif
12928         }
12929       else
12930         {
12931           if (MEM_P (op0))
12932             op1 = force_reg (Pmode, op1);
12933           else if (!TARGET_64BIT || !x86_64_movabs_operand (op1, Pmode))
12934             {
12935               rtx reg = can_create_pseudo_p () ? NULL_RTX : op0;
12936               op1 = legitimize_pic_address (op1, reg);
12937               if (op0 == op1)
12938                 return;
12939             }
12940         }
12941     }
12942   else
12943     {
12944       if (MEM_P (op0)
12945           && (PUSH_ROUNDING (GET_MODE_SIZE (mode)) != GET_MODE_SIZE (mode)
12946               || !push_operand (op0, mode))
12947           && MEM_P (op1))
12948         op1 = force_reg (mode, op1);
12949
12950       if (push_operand (op0, mode)
12951           && ! general_no_elim_operand (op1, mode))
12952         op1 = copy_to_mode_reg (mode, op1);
12953
12954       /* Force large constants in 64bit compilation into register
12955          to get them CSEed.  */
12956       if (can_create_pseudo_p ()
12957           && (mode == DImode) && TARGET_64BIT
12958           && immediate_operand (op1, mode)
12959           && !x86_64_zext_immediate_operand (op1, VOIDmode)
12960           && !register_operand (op0, mode)
12961           && optimize)
12962         op1 = copy_to_mode_reg (mode, op1);
12963
12964       if (can_create_pseudo_p ()
12965           && FLOAT_MODE_P (mode)
12966           && GET_CODE (op1) == CONST_DOUBLE)
12967         {
12968           /* If we are loading a floating point constant to a register,
12969              force the value to memory now, since we'll get better code
12970              out the back end.  */
12971
12972           op1 = validize_mem (force_const_mem (mode, op1));
12973           if (!register_operand (op0, mode))
12974             {
12975               rtx temp = gen_reg_rtx (mode);
12976               emit_insn (gen_rtx_SET (VOIDmode, temp, op1));
12977               emit_move_insn (op0, temp);
12978               return;
12979             }
12980         }
12981     }
12982
12983   emit_insn (gen_rtx_SET (VOIDmode, op0, op1));
12984 }
12985
12986 void
12987 ix86_expand_vector_move (enum machine_mode mode, rtx operands[])
12988 {
12989   rtx op0 = operands[0], op1 = operands[1];
12990   unsigned int align = GET_MODE_ALIGNMENT (mode);
12991
12992   /* Force constants other than zero into memory.  We do not know how
12993      the instructions used to build constants modify the upper 64 bits
12994      of the register, once we have that information we may be able
12995      to handle some of them more efficiently.  */
12996   if (can_create_pseudo_p ()
12997       && register_operand (op0, mode)
12998       && (CONSTANT_P (op1)
12999           || (GET_CODE (op1) == SUBREG
13000               && CONSTANT_P (SUBREG_REG (op1))))
13001       && !standard_sse_constant_p (op1))
13002     op1 = validize_mem (force_const_mem (mode, op1));
13003
13004   /* We need to check memory alignment for SSE mode since attribute
13005      can make operands unaligned.  */
13006   if (can_create_pseudo_p ()
13007       && SSE_REG_MODE_P (mode)
13008       && ((MEM_P (op0) && (MEM_ALIGN (op0) < align))
13009           || (MEM_P (op1) && (MEM_ALIGN (op1) < align))))
13010     {
13011       rtx tmp[2];
13012
13013       /* ix86_expand_vector_move_misalign() does not like constants ... */
13014       if (CONSTANT_P (op1)
13015           || (GET_CODE (op1) == SUBREG
13016               && CONSTANT_P (SUBREG_REG (op1))))
13017         op1 = validize_mem (force_const_mem (mode, op1));
13018
13019       /* ... nor both arguments in memory.  */
13020       if (!register_operand (op0, mode)
13021           && !register_operand (op1, mode))
13022         op1 = force_reg (mode, op1);
13023
13024       tmp[0] = op0; tmp[1] = op1;
13025       ix86_expand_vector_move_misalign (mode, tmp);
13026       return;
13027     }
13028
13029   /* Make operand1 a register if it isn't already.  */
13030   if (can_create_pseudo_p ()
13031       && !register_operand (op0, mode)
13032       && !register_operand (op1, mode))
13033     {
13034       emit_move_insn (op0, force_reg (GET_MODE (op0), op1));
13035       return;
13036     }
13037
13038   emit_insn (gen_rtx_SET (VOIDmode, op0, op1));
13039 }
13040
13041 /* Implement the movmisalign patterns for SSE.  Non-SSE modes go
13042    straight to ix86_expand_vector_move.  */
13043 /* Code generation for scalar reg-reg moves of single and double precision data:
13044      if (x86_sse_partial_reg_dependency == true | x86_sse_split_regs == true)
13045        movaps reg, reg
13046      else
13047        movss reg, reg
13048      if (x86_sse_partial_reg_dependency == true)
13049        movapd reg, reg
13050      else
13051        movsd reg, reg
13052
13053    Code generation for scalar loads of double precision data:
13054      if (x86_sse_split_regs == true)
13055        movlpd mem, reg      (gas syntax)
13056      else
13057        movsd mem, reg
13058
13059    Code generation for unaligned packed loads of single precision data
13060    (x86_sse_unaligned_move_optimal overrides x86_sse_partial_reg_dependency):
13061      if (x86_sse_unaligned_move_optimal)
13062        movups mem, reg
13063
13064      if (x86_sse_partial_reg_dependency == true)
13065        {
13066          xorps  reg, reg
13067          movlps mem, reg
13068          movhps mem+8, reg
13069        }
13070      else
13071        {
13072          movlps mem, reg
13073          movhps mem+8, reg
13074        }
13075
13076    Code generation for unaligned packed loads of double precision data
13077    (x86_sse_unaligned_move_optimal overrides x86_sse_split_regs):
13078      if (x86_sse_unaligned_move_optimal)
13079        movupd mem, reg
13080
13081      if (x86_sse_split_regs == true)
13082        {
13083          movlpd mem, reg
13084          movhpd mem+8, reg
13085        }
13086      else
13087        {
13088          movsd  mem, reg
13089          movhpd mem+8, reg
13090        }
13091  */
13092
13093 void
13094 ix86_expand_vector_move_misalign (enum machine_mode mode, rtx operands[])
13095 {
13096   rtx op0, op1, m;
13097
13098   op0 = operands[0];
13099   op1 = operands[1];
13100
13101   if (TARGET_AVX)
13102     {
13103       switch (GET_MODE_CLASS (mode))
13104         {
13105         case MODE_VECTOR_INT:
13106         case MODE_INT:
13107           switch (GET_MODE_SIZE (mode))
13108             {
13109             case 16:
13110               op0 = gen_lowpart (V16QImode, op0);
13111               op1 = gen_lowpart (V16QImode, op1);
13112               emit_insn (gen_avx_movdqu (op0, op1));
13113               break;
13114             case 32:
13115               op0 = gen_lowpart (V32QImode, op0);
13116               op1 = gen_lowpart (V32QImode, op1);
13117               emit_insn (gen_avx_movdqu256 (op0, op1));
13118               break;
13119             default:
13120               gcc_unreachable ();
13121             }
13122           break;
13123         case MODE_VECTOR_FLOAT:
13124           op0 = gen_lowpart (mode, op0);
13125           op1 = gen_lowpart (mode, op1);
13126
13127           switch (mode)
13128             { 
13129             case V4SFmode:
13130               emit_insn (gen_avx_movups (op0, op1));
13131               break;
13132             case V8SFmode:
13133               emit_insn (gen_avx_movups256 (op0, op1));
13134               break;
13135             case V2DFmode:
13136               emit_insn (gen_avx_movupd (op0, op1));
13137               break;
13138             case V4DFmode:
13139               emit_insn (gen_avx_movupd256 (op0, op1));
13140               break;
13141             default:
13142               gcc_unreachable ();
13143             }
13144           break;
13145
13146         default:
13147           gcc_unreachable ();
13148         }
13149
13150       return;
13151     }
13152
13153   if (MEM_P (op1))
13154     {
13155       /* If we're optimizing for size, movups is the smallest.  */
13156       if (optimize_insn_for_size_p ())
13157         {
13158           op0 = gen_lowpart (V4SFmode, op0);
13159           op1 = gen_lowpart (V4SFmode, op1);
13160           emit_insn (gen_sse_movups (op0, op1));
13161           return;
13162         }
13163
13164       /* ??? If we have typed data, then it would appear that using
13165          movdqu is the only way to get unaligned data loaded with
13166          integer type.  */
13167       if (TARGET_SSE2 && GET_MODE_CLASS (mode) == MODE_VECTOR_INT)
13168         {
13169           op0 = gen_lowpart (V16QImode, op0);
13170           op1 = gen_lowpart (V16QImode, op1);
13171           emit_insn (gen_sse2_movdqu (op0, op1));
13172           return;
13173         }
13174
13175       if (TARGET_SSE2 && mode == V2DFmode)
13176         {
13177           rtx zero;
13178
13179           if (TARGET_SSE_UNALIGNED_MOVE_OPTIMAL)
13180             {
13181               op0 = gen_lowpart (V2DFmode, op0);
13182               op1 = gen_lowpart (V2DFmode, op1);
13183               emit_insn (gen_sse2_movupd (op0, op1));
13184               return;
13185             }
13186
13187           /* When SSE registers are split into halves, we can avoid
13188              writing to the top half twice.  */
13189           if (TARGET_SSE_SPLIT_REGS)
13190             {
13191               emit_clobber (op0);
13192               zero = op0;
13193             }
13194           else
13195             {
13196               /* ??? Not sure about the best option for the Intel chips.
13197                  The following would seem to satisfy; the register is
13198                  entirely cleared, breaking the dependency chain.  We
13199                  then store to the upper half, with a dependency depth
13200                  of one.  A rumor has it that Intel recommends two movsd
13201                  followed by an unpacklpd, but this is unconfirmed.  And
13202                  given that the dependency depth of the unpacklpd would
13203                  still be one, I'm not sure why this would be better.  */
13204               zero = CONST0_RTX (V2DFmode);
13205             }
13206
13207           m = adjust_address (op1, DFmode, 0);
13208           emit_insn (gen_sse2_loadlpd (op0, zero, m));
13209           m = adjust_address (op1, DFmode, 8);
13210           emit_insn (gen_sse2_loadhpd (op0, op0, m));
13211         }
13212       else
13213         {
13214           if (TARGET_SSE_UNALIGNED_MOVE_OPTIMAL)
13215             {
13216               op0 = gen_lowpart (V4SFmode, op0);
13217               op1 = gen_lowpart (V4SFmode, op1);
13218               emit_insn (gen_sse_movups (op0, op1));
13219               return;
13220             }
13221
13222           if (TARGET_SSE_PARTIAL_REG_DEPENDENCY)
13223             emit_move_insn (op0, CONST0_RTX (mode));
13224           else
13225             emit_clobber (op0);
13226
13227           if (mode != V4SFmode)
13228             op0 = gen_lowpart (V4SFmode, op0);
13229           m = adjust_address (op1, V2SFmode, 0);
13230           emit_insn (gen_sse_loadlps (op0, op0, m));
13231           m = adjust_address (op1, V2SFmode, 8);
13232           emit_insn (gen_sse_loadhps (op0, op0, m));
13233         }
13234     }
13235   else if (MEM_P (op0))
13236     {
13237       /* If we're optimizing for size, movups is the smallest.  */
13238       if (optimize_insn_for_size_p ())
13239         {
13240           op0 = gen_lowpart (V4SFmode, op0);
13241           op1 = gen_lowpart (V4SFmode, op1);
13242           emit_insn (gen_sse_movups (op0, op1));
13243           return;
13244         }
13245
13246       /* ??? Similar to above, only less clear because of quote
13247          typeless stores unquote.  */
13248       if (TARGET_SSE2 && !TARGET_SSE_TYPELESS_STORES
13249           && GET_MODE_CLASS (mode) == MODE_VECTOR_INT)
13250         {
13251           op0 = gen_lowpart (V16QImode, op0);
13252           op1 = gen_lowpart (V16QImode, op1);
13253           emit_insn (gen_sse2_movdqu (op0, op1));
13254           return;
13255         }
13256
13257       if (TARGET_SSE2 && mode == V2DFmode)
13258         {
13259           m = adjust_address (op0, DFmode, 0);
13260           emit_insn (gen_sse2_storelpd (m, op1));
13261           m = adjust_address (op0, DFmode, 8);
13262           emit_insn (gen_sse2_storehpd (m, op1));
13263         }
13264       else
13265         {
13266           if (mode != V4SFmode)
13267             op1 = gen_lowpart (V4SFmode, op1);
13268           m = adjust_address (op0, V2SFmode, 0);
13269           emit_insn (gen_sse_storelps (m, op1));
13270           m = adjust_address (op0, V2SFmode, 8);
13271           emit_insn (gen_sse_storehps (m, op1));
13272         }
13273     }
13274   else
13275     gcc_unreachable ();
13276 }
13277
13278 /* Expand a push in MODE.  This is some mode for which we do not support
13279    proper push instructions, at least from the registers that we expect
13280    the value to live in.  */
13281
13282 void
13283 ix86_expand_push (enum machine_mode mode, rtx x)
13284 {
13285   rtx tmp;
13286
13287   tmp = expand_simple_binop (Pmode, PLUS, stack_pointer_rtx,
13288                              GEN_INT (-GET_MODE_SIZE (mode)),
13289                              stack_pointer_rtx, 1, OPTAB_DIRECT);
13290   if (tmp != stack_pointer_rtx)
13291     emit_move_insn (stack_pointer_rtx, tmp);
13292
13293   tmp = gen_rtx_MEM (mode, stack_pointer_rtx);
13294
13295   /* When we push an operand onto stack, it has to be aligned at least
13296      at the function argument boundary.  However since we don't have
13297      the argument type, we can't determine the actual argument
13298      boundary.  */
13299   emit_move_insn (tmp, x);
13300 }
13301
13302 /* Helper function of ix86_fixup_binary_operands to canonicalize
13303    operand order.  Returns true if the operands should be swapped.  */
13304
13305 static bool
13306 ix86_swap_binary_operands_p (enum rtx_code code, enum machine_mode mode,
13307                              rtx operands[])
13308 {
13309   rtx dst = operands[0];
13310   rtx src1 = operands[1];
13311   rtx src2 = operands[2];
13312
13313   /* If the operation is not commutative, we can't do anything.  */
13314   if (GET_RTX_CLASS (code) != RTX_COMM_ARITH)
13315     return false;
13316
13317   /* Highest priority is that src1 should match dst.  */
13318   if (rtx_equal_p (dst, src1))
13319     return false;
13320   if (rtx_equal_p (dst, src2))
13321     return true;
13322
13323   /* Next highest priority is that immediate constants come second.  */
13324   if (immediate_operand (src2, mode))
13325     return false;
13326   if (immediate_operand (src1, mode))
13327     return true;
13328
13329   /* Lowest priority is that memory references should come second.  */
13330   if (MEM_P (src2))
13331     return false;
13332   if (MEM_P (src1))
13333     return true;
13334
13335   return false;
13336 }
13337
13338
13339 /* Fix up OPERANDS to satisfy ix86_binary_operator_ok.  Return the
13340    destination to use for the operation.  If different from the true
13341    destination in operands[0], a copy operation will be required.  */
13342
13343 rtx
13344 ix86_fixup_binary_operands (enum rtx_code code, enum machine_mode mode,
13345                             rtx operands[])
13346 {
13347   rtx dst = operands[0];
13348   rtx src1 = operands[1];
13349   rtx src2 = operands[2];
13350
13351   /* Canonicalize operand order.  */
13352   if (ix86_swap_binary_operands_p (code, mode, operands))
13353     {
13354       rtx temp;
13355
13356       /* It is invalid to swap operands of different modes.  */
13357       gcc_assert (GET_MODE (src1) == GET_MODE (src2));
13358
13359       temp = src1;
13360       src1 = src2;
13361       src2 = temp;
13362     }
13363
13364   /* Both source operands cannot be in memory.  */
13365   if (MEM_P (src1) && MEM_P (src2))
13366     {
13367       /* Optimization: Only read from memory once.  */
13368       if (rtx_equal_p (src1, src2))
13369         {
13370           src2 = force_reg (mode, src2);
13371           src1 = src2;
13372         }
13373       else
13374         src2 = force_reg (mode, src2);
13375     }
13376
13377   /* If the destination is memory, and we do not have matching source
13378      operands, do things in registers.  */
13379   if (MEM_P (dst) && !rtx_equal_p (dst, src1))
13380     dst = gen_reg_rtx (mode);
13381
13382   /* Source 1 cannot be a constant.  */
13383   if (CONSTANT_P (src1))
13384     src1 = force_reg (mode, src1);
13385
13386   /* Source 1 cannot be a non-matching memory.  */
13387   if (MEM_P (src1) && !rtx_equal_p (dst, src1))
13388     src1 = force_reg (mode, src1);
13389
13390   /* In order for the multiply-add patterns to get matched, we need
13391      to aid combine by forcing all operands into registers to start.  */
13392   if (optimize && TARGET_FMA4)
13393     {
13394       if (MEM_P (src2))
13395         src2 = force_reg (GET_MODE (src2), src2);
13396       else if (MEM_P (src1))
13397         src1 = force_reg (GET_MODE (src1), src1);
13398     }
13399
13400   operands[1] = src1;
13401   operands[2] = src2;
13402   return dst;
13403 }
13404
13405 /* Similarly, but assume that the destination has already been
13406    set up properly.  */
13407
13408 void
13409 ix86_fixup_binary_operands_no_copy (enum rtx_code code,
13410                                     enum machine_mode mode, rtx operands[])
13411 {
13412   rtx dst = ix86_fixup_binary_operands (code, mode, operands);
13413   gcc_assert (dst == operands[0]);
13414 }
13415
13416 /* Attempt to expand a binary operator.  Make the expansion closer to the
13417    actual machine, then just general_operand, which will allow 3 separate
13418    memory references (one output, two input) in a single insn.  */
13419
13420 void
13421 ix86_expand_binary_operator (enum rtx_code code, enum machine_mode mode,
13422                              rtx operands[])
13423 {
13424   rtx src1, src2, dst, op, clob;
13425
13426   dst = ix86_fixup_binary_operands (code, mode, operands);
13427   src1 = operands[1];
13428   src2 = operands[2];
13429
13430  /* Emit the instruction.  */
13431
13432   op = gen_rtx_SET (VOIDmode, dst, gen_rtx_fmt_ee (code, mode, src1, src2));
13433   if (reload_in_progress)
13434     {
13435       /* Reload doesn't know about the flags register, and doesn't know that
13436          it doesn't want to clobber it.  We can only do this with PLUS.  */
13437       gcc_assert (code == PLUS);
13438       emit_insn (op);
13439     }
13440   else
13441     {
13442       clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
13443       emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, op, clob)));
13444     }
13445
13446   /* Fix up the destination if needed.  */
13447   if (dst != operands[0])
13448     emit_move_insn (operands[0], dst);
13449 }
13450
13451 /* Return TRUE or FALSE depending on whether the binary operator meets the
13452    appropriate constraints.  */
13453
13454 int
13455 ix86_binary_operator_ok (enum rtx_code code, enum machine_mode mode,
13456                          rtx operands[3])
13457 {
13458   rtx dst = operands[0];
13459   rtx src1 = operands[1];
13460   rtx src2 = operands[2];
13461
13462   /* Both source operands cannot be in memory.  */
13463   if (MEM_P (src1) && MEM_P (src2))
13464     return 0;
13465
13466   /* Canonicalize operand order for commutative operators.  */
13467   if (ix86_swap_binary_operands_p (code, mode, operands))
13468     {
13469       rtx temp = src1;
13470       src1 = src2;
13471       src2 = temp;
13472     }
13473
13474   /* If the destination is memory, we must have a matching source operand.  */
13475   if (MEM_P (dst) && !rtx_equal_p (dst, src1))
13476       return 0;
13477
13478   /* Source 1 cannot be a constant.  */
13479   if (CONSTANT_P (src1))
13480     return 0;
13481
13482   /* Source 1 cannot be a non-matching memory.  */
13483   if (MEM_P (src1) && !rtx_equal_p (dst, src1))
13484     return 0;
13485
13486   return 1;
13487 }
13488
13489 /* Attempt to expand a unary operator.  Make the expansion closer to the
13490    actual machine, then just general_operand, which will allow 2 separate
13491    memory references (one output, one input) in a single insn.  */
13492
13493 void
13494 ix86_expand_unary_operator (enum rtx_code code, enum machine_mode mode,
13495                             rtx operands[])
13496 {
13497   int matching_memory;
13498   rtx src, dst, op, clob;
13499
13500   dst = operands[0];
13501   src = operands[1];
13502
13503   /* If the destination is memory, and we do not have matching source
13504      operands, do things in registers.  */
13505   matching_memory = 0;
13506   if (MEM_P (dst))
13507     {
13508       if (rtx_equal_p (dst, src))
13509         matching_memory = 1;
13510       else
13511         dst = gen_reg_rtx (mode);
13512     }
13513
13514   /* When source operand is memory, destination must match.  */
13515   if (MEM_P (src) && !matching_memory)
13516     src = force_reg (mode, src);
13517
13518   /* Emit the instruction.  */
13519
13520   op = gen_rtx_SET (VOIDmode, dst, gen_rtx_fmt_e (code, mode, src));
13521   if (reload_in_progress || code == NOT)
13522     {
13523       /* Reload doesn't know about the flags register, and doesn't know that
13524          it doesn't want to clobber it.  */
13525       gcc_assert (code == NOT);
13526       emit_insn (op);
13527     }
13528   else
13529     {
13530       clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
13531       emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, op, clob)));
13532     }
13533
13534   /* Fix up the destination if needed.  */
13535   if (dst != operands[0])
13536     emit_move_insn (operands[0], dst);
13537 }
13538
13539 #define LEA_SEARCH_THRESHOLD 12
13540
13541 /* Search backward for non-agu definition of register number REGNO1
13542    or register number REGNO2 in INSN's basic block until 
13543    1. Pass LEA_SEARCH_THRESHOLD instructions, or
13544    2. Reach BB boundary, or
13545    3. Reach agu definition.
13546    Returns the distance between the non-agu definition point and INSN.
13547    If no definition point, returns -1.  */
13548
13549 static int
13550 distance_non_agu_define (unsigned int regno1, unsigned int regno2,
13551                          rtx insn)
13552 {
13553   basic_block bb = BLOCK_FOR_INSN (insn);
13554   int distance = 0;
13555   df_ref *def_rec;
13556   enum attr_type insn_type;
13557
13558   if (insn != BB_HEAD (bb))
13559     {
13560       rtx prev = PREV_INSN (insn);
13561       while (prev && distance < LEA_SEARCH_THRESHOLD)
13562         {
13563           if (INSN_P (prev))
13564             {
13565               distance++;
13566               for (def_rec = DF_INSN_DEFS (prev); *def_rec; def_rec++)
13567                 if (DF_REF_TYPE (*def_rec) == DF_REF_REG_DEF
13568                     && !DF_REF_IS_ARTIFICIAL (*def_rec)
13569                     && (regno1 == DF_REF_REGNO (*def_rec)
13570                         || regno2 == DF_REF_REGNO (*def_rec)))
13571                   {
13572                     insn_type = get_attr_type (prev);
13573                     if (insn_type != TYPE_LEA)
13574                       goto done;
13575                   }
13576             }
13577           if (prev == BB_HEAD (bb))
13578             break;
13579           prev = PREV_INSN (prev);
13580         }
13581     }
13582   
13583   if (distance < LEA_SEARCH_THRESHOLD)
13584     {
13585       edge e;
13586       edge_iterator ei;
13587       bool simple_loop = false;
13588   
13589       FOR_EACH_EDGE (e, ei, bb->preds)
13590         if (e->src == bb)
13591           {
13592             simple_loop = true;
13593             break;
13594           }
13595   
13596       if (simple_loop)
13597         {
13598           rtx prev = BB_END (bb);
13599           while (prev
13600                  && prev != insn
13601                  && distance < LEA_SEARCH_THRESHOLD)
13602             {
13603               if (INSN_P (prev))
13604                 {
13605                   distance++;
13606                   for (def_rec = DF_INSN_DEFS (prev); *def_rec; def_rec++)
13607                     if (DF_REF_TYPE (*def_rec) == DF_REF_REG_DEF
13608                         && !DF_REF_IS_ARTIFICIAL (*def_rec)
13609                         && (regno1 == DF_REF_REGNO (*def_rec)
13610                             || regno2 == DF_REF_REGNO (*def_rec)))
13611                       {
13612                         insn_type = get_attr_type (prev);
13613                         if (insn_type != TYPE_LEA)
13614                           goto done;
13615                       }
13616                 }
13617               prev = PREV_INSN (prev);
13618             }
13619         }
13620     }
13621
13622   distance = -1;
13623
13624 done:
13625   /* get_attr_type may modify recog data.  We want to make sure
13626      that recog data is valid for instruction INSN, on which
13627      distance_non_agu_define is called.  INSN is unchanged here.  */
13628   extract_insn_cached (insn);
13629   return distance;
13630 }
13631
13632 /* Return the distance between INSN and the next insn that uses 
13633    register number REGNO0 in memory address.  Return -1 if no such
13634    a use is found within LEA_SEARCH_THRESHOLD or REGNO0 is set.  */
13635
13636 static int
13637 distance_agu_use (unsigned int regno0, rtx insn)
13638 {
13639   basic_block bb = BLOCK_FOR_INSN (insn);
13640   int distance = 0;
13641   df_ref *def_rec;
13642   df_ref *use_rec;
13643
13644   if (insn != BB_END (bb))
13645     {
13646       rtx next = NEXT_INSN (insn);
13647       while (next && distance < LEA_SEARCH_THRESHOLD)
13648         {
13649           if (INSN_P (next))
13650             {
13651               distance++;
13652
13653               for (use_rec = DF_INSN_USES (next); *use_rec; use_rec++)
13654                 if ((DF_REF_TYPE (*use_rec) == DF_REF_REG_MEM_LOAD
13655                      || DF_REF_TYPE (*use_rec) == DF_REF_REG_MEM_STORE)
13656                     && regno0 == DF_REF_REGNO (*use_rec))
13657                   {
13658                     /* Return DISTANCE if OP0 is used in memory
13659                        address in NEXT.  */
13660                     return distance;
13661                   }
13662
13663               for (def_rec = DF_INSN_DEFS (next); *def_rec; def_rec++)
13664                 if (DF_REF_TYPE (*def_rec) == DF_REF_REG_DEF
13665                     && !DF_REF_IS_ARTIFICIAL (*def_rec)
13666                     && regno0 == DF_REF_REGNO (*def_rec))
13667                   {
13668                     /* Return -1 if OP0 is set in NEXT.  */
13669                     return -1;
13670                   }
13671             }
13672           if (next == BB_END (bb))
13673             break;
13674           next = NEXT_INSN (next);
13675         }
13676     }
13677
13678   if (distance < LEA_SEARCH_THRESHOLD)
13679     {
13680       edge e;
13681       edge_iterator ei;
13682       bool simple_loop = false;
13683   
13684       FOR_EACH_EDGE (e, ei, bb->succs)
13685         if (e->dest == bb)
13686           {
13687             simple_loop = true;
13688             break;
13689           }
13690   
13691       if (simple_loop)
13692         {
13693           rtx next = BB_HEAD (bb);
13694           while (next
13695                  && next != insn
13696                  && distance < LEA_SEARCH_THRESHOLD)
13697             {
13698               if (INSN_P (next))
13699                 {
13700                   distance++;
13701
13702                   for (use_rec = DF_INSN_USES (next); *use_rec; use_rec++)
13703                     if ((DF_REF_TYPE (*use_rec) == DF_REF_REG_MEM_LOAD
13704                          || DF_REF_TYPE (*use_rec) == DF_REF_REG_MEM_STORE)
13705                         && regno0 == DF_REF_REGNO (*use_rec))
13706                       {
13707                         /* Return DISTANCE if OP0 is used in memory
13708                            address in NEXT.  */
13709                         return distance;
13710                       }
13711
13712                   for (def_rec = DF_INSN_DEFS (next); *def_rec; def_rec++)
13713                     if (DF_REF_TYPE (*def_rec) == DF_REF_REG_DEF
13714                         && !DF_REF_IS_ARTIFICIAL (*def_rec)
13715                         && regno0 == DF_REF_REGNO (*def_rec))
13716                       {
13717                         /* Return -1 if OP0 is set in NEXT.  */
13718                         return -1;
13719                       }
13720
13721                 }
13722               next = NEXT_INSN (next);
13723             }
13724         }
13725     }  
13726
13727   return -1;
13728 }
13729
13730 /* Define this macro to tune LEA priority vs ADD, it take effect when
13731    there is a dilemma of choicing LEA or ADD
13732    Negative value: ADD is more preferred than LEA
13733    Zero: Netrual
13734    Positive value: LEA is more preferred than ADD*/
13735 #define IX86_LEA_PRIORITY 2
13736
13737 /* Return true if it is ok to optimize an ADD operation to LEA
13738    operation to avoid flag register consumation.  For the processors
13739    like ATOM, if the destination register of LEA holds an actual
13740    address which will be used soon, LEA is better and otherwise ADD
13741    is better.  */
13742
13743 bool
13744 ix86_lea_for_add_ok (enum rtx_code code ATTRIBUTE_UNUSED,
13745                      rtx insn, rtx operands[])
13746 {
13747   unsigned int regno0 = true_regnum (operands[0]);
13748   unsigned int regno1 = true_regnum (operands[1]);
13749   unsigned int regno2;
13750
13751   if (!TARGET_OPT_AGU || optimize_function_for_size_p (cfun))
13752     return regno0 != regno1;
13753
13754   regno2 = true_regnum (operands[2]);
13755
13756   /* If a = b + c, (a!=b && a!=c), must use lea form. */
13757   if (regno0 != regno1 && regno0 != regno2)
13758     return true;
13759   else    
13760     {
13761       int dist_define, dist_use;
13762       dist_define = distance_non_agu_define (regno1, regno2, insn);
13763       if (dist_define <= 0)
13764         return true;
13765
13766       /* If this insn has both backward non-agu dependence and forward
13767          agu dependence, the one with short distance take effect. */
13768       dist_use = distance_agu_use (regno0, insn);
13769       if (dist_use <= 0
13770           || (dist_define + IX86_LEA_PRIORITY) < dist_use)
13771         return false;
13772
13773       return true;
13774     }
13775 }
13776
13777 /* Return true if destination reg of SET_BODY is shift count of
13778    USE_BODY.  */
13779
13780 static bool
13781 ix86_dep_by_shift_count_body (const_rtx set_body, const_rtx use_body)
13782 {
13783   rtx set_dest;
13784   rtx shift_rtx;
13785   int i;
13786
13787   /* Retrieve destination of SET_BODY.  */
13788   switch (GET_CODE (set_body))
13789     {
13790     case SET:
13791       set_dest = SET_DEST (set_body);
13792       if (!set_dest || !REG_P (set_dest))
13793         return false;
13794       break;
13795     case PARALLEL:
13796       for (i = XVECLEN (set_body, 0) - 1; i >= 0; i--)
13797         if (ix86_dep_by_shift_count_body (XVECEXP (set_body, 0, i),
13798                                           use_body))
13799           return true;
13800     default:
13801       return false;
13802       break;
13803     }
13804
13805   /* Retrieve shift count of USE_BODY.  */
13806   switch (GET_CODE (use_body))
13807     {
13808     case SET:
13809       shift_rtx = XEXP (use_body, 1);
13810       break;
13811     case PARALLEL:
13812       for (i = XVECLEN (use_body, 0) - 1; i >= 0; i--)
13813         if (ix86_dep_by_shift_count_body (set_body,
13814                                           XVECEXP (use_body, 0, i)))
13815           return true;
13816     default:
13817       return false;
13818       break;
13819     }
13820
13821   if (shift_rtx 
13822       && (GET_CODE (shift_rtx) == ASHIFT
13823           || GET_CODE (shift_rtx) == LSHIFTRT
13824           || GET_CODE (shift_rtx) == ASHIFTRT
13825           || GET_CODE (shift_rtx) == ROTATE
13826           || GET_CODE (shift_rtx) == ROTATERT))
13827     {
13828       rtx shift_count = XEXP (shift_rtx, 1);
13829
13830       /* Return true if shift count is dest of SET_BODY.  */
13831       if (REG_P (shift_count)
13832           && true_regnum (set_dest) == true_regnum (shift_count))
13833         return true;
13834     }
13835
13836   return false;
13837 }
13838
13839 /* Return true if destination reg of SET_INSN is shift count of
13840    USE_INSN.  */
13841
13842 bool
13843 ix86_dep_by_shift_count (const_rtx set_insn, const_rtx use_insn)
13844 {
13845   return ix86_dep_by_shift_count_body (PATTERN (set_insn),
13846                                        PATTERN (use_insn));
13847 }
13848
13849 /* Return TRUE or FALSE depending on whether the unary operator meets the
13850    appropriate constraints.  */
13851
13852 int
13853 ix86_unary_operator_ok (enum rtx_code code ATTRIBUTE_UNUSED,
13854                         enum machine_mode mode ATTRIBUTE_UNUSED,
13855                         rtx operands[2] ATTRIBUTE_UNUSED)
13856 {
13857   /* If one of operands is memory, source and destination must match.  */
13858   if ((MEM_P (operands[0])
13859        || MEM_P (operands[1]))
13860       && ! rtx_equal_p (operands[0], operands[1]))
13861     return FALSE;
13862   return TRUE;
13863 }
13864
13865 /* Return TRUE if the operands to a vec_interleave_{high,low}v2df
13866    are ok, keeping in mind the possible movddup alternative.  */
13867
13868 bool
13869 ix86_vec_interleave_v2df_operator_ok (rtx operands[3], bool high)
13870 {
13871   if (MEM_P (operands[0]))
13872     return rtx_equal_p (operands[0], operands[1 + high]);
13873   if (MEM_P (operands[1]) && MEM_P (operands[2]))
13874     return TARGET_SSE3 && rtx_equal_p (operands[1], operands[2]);
13875   return true;
13876 }
13877
13878 /* Post-reload splitter for converting an SF or DFmode value in an
13879    SSE register into an unsigned SImode.  */
13880
13881 void
13882 ix86_split_convert_uns_si_sse (rtx operands[])
13883 {
13884   enum machine_mode vecmode;
13885   rtx value, large, zero_or_two31, input, two31, x;
13886
13887   large = operands[1];
13888   zero_or_two31 = operands[2];
13889   input = operands[3];
13890   two31 = operands[4];
13891   vecmode = GET_MODE (large);
13892   value = gen_rtx_REG (vecmode, REGNO (operands[0]));
13893
13894   /* Load up the value into the low element.  We must ensure that the other
13895      elements are valid floats -- zero is the easiest such value.  */
13896   if (MEM_P (input))
13897     {
13898       if (vecmode == V4SFmode)
13899         emit_insn (gen_vec_setv4sf_0 (value, CONST0_RTX (V4SFmode), input));
13900       else
13901         emit_insn (gen_sse2_loadlpd (value, CONST0_RTX (V2DFmode), input));
13902     }
13903   else
13904     {
13905       input = gen_rtx_REG (vecmode, REGNO (input));
13906       emit_move_insn (value, CONST0_RTX (vecmode));
13907       if (vecmode == V4SFmode)
13908         emit_insn (gen_sse_movss (value, value, input));
13909       else
13910         emit_insn (gen_sse2_movsd (value, value, input));
13911     }
13912
13913   emit_move_insn (large, two31);
13914   emit_move_insn (zero_or_two31, MEM_P (two31) ? large : two31);
13915
13916   x = gen_rtx_fmt_ee (LE, vecmode, large, value);
13917   emit_insn (gen_rtx_SET (VOIDmode, large, x));
13918
13919   x = gen_rtx_AND (vecmode, zero_or_two31, large);
13920   emit_insn (gen_rtx_SET (VOIDmode, zero_or_two31, x));
13921
13922   x = gen_rtx_MINUS (vecmode, value, zero_or_two31);
13923   emit_insn (gen_rtx_SET (VOIDmode, value, x));
13924
13925   large = gen_rtx_REG (V4SImode, REGNO (large));
13926   emit_insn (gen_ashlv4si3 (large, large, GEN_INT (31)));
13927
13928   x = gen_rtx_REG (V4SImode, REGNO (value));
13929   if (vecmode == V4SFmode)
13930     emit_insn (gen_sse2_cvttps2dq (x, value));
13931   else
13932     emit_insn (gen_sse2_cvttpd2dq (x, value));
13933   value = x;
13934
13935   emit_insn (gen_xorv4si3 (value, value, large));
13936 }
13937
13938 /* Convert an unsigned DImode value into a DFmode, using only SSE.
13939    Expects the 64-bit DImode to be supplied in a pair of integral
13940    registers.  Requires SSE2; will use SSE3 if available.  For x86_32,
13941    -mfpmath=sse, !optimize_size only.  */
13942
13943 void
13944 ix86_expand_convert_uns_didf_sse (rtx target, rtx input)
13945 {
13946   REAL_VALUE_TYPE bias_lo_rvt, bias_hi_rvt;
13947   rtx int_xmm, fp_xmm;
13948   rtx biases, exponents;
13949   rtx x;
13950
13951   int_xmm = gen_reg_rtx (V4SImode);
13952   if (TARGET_INTER_UNIT_MOVES)
13953     emit_insn (gen_movdi_to_sse (int_xmm, input));
13954   else if (TARGET_SSE_SPLIT_REGS)
13955     {
13956       emit_clobber (int_xmm);
13957       emit_move_insn (gen_lowpart (DImode, int_xmm), input);
13958     }
13959   else
13960     {
13961       x = gen_reg_rtx (V2DImode);
13962       ix86_expand_vector_init_one_nonzero (false, V2DImode, x, input, 0);
13963       emit_move_insn (int_xmm, gen_lowpart (V4SImode, x));
13964     }
13965
13966   x = gen_rtx_CONST_VECTOR (V4SImode,
13967                             gen_rtvec (4, GEN_INT (0x43300000UL),
13968                                        GEN_INT (0x45300000UL),
13969                                        const0_rtx, const0_rtx));
13970   exponents = validize_mem (force_const_mem (V4SImode, x));
13971
13972   /* int_xmm = {0x45300000UL, fp_xmm/hi, 0x43300000, fp_xmm/lo } */
13973   emit_insn (gen_vec_interleave_lowv4si (int_xmm, int_xmm, exponents));
13974
13975   /* Concatenating (juxtaposing) (0x43300000UL ## fp_value_low_xmm)
13976      yields a valid DF value equal to (0x1.0p52 + double(fp_value_lo_xmm)).
13977      Similarly (0x45300000UL ## fp_value_hi_xmm) yields
13978      (0x1.0p84 + double(fp_value_hi_xmm)).
13979      Note these exponents differ by 32.  */
13980
13981   fp_xmm = copy_to_mode_reg (V2DFmode, gen_lowpart (V2DFmode, int_xmm));
13982
13983   /* Subtract off those 0x1.0p52 and 0x1.0p84 biases, to produce values
13984      in [0,2**32-1] and [0]+[2**32,2**64-1] respectively.  */
13985   real_ldexp (&bias_lo_rvt, &dconst1, 52);
13986   real_ldexp (&bias_hi_rvt, &dconst1, 84);
13987   biases = const_double_from_real_value (bias_lo_rvt, DFmode);
13988   x = const_double_from_real_value (bias_hi_rvt, DFmode);
13989   biases = gen_rtx_CONST_VECTOR (V2DFmode, gen_rtvec (2, biases, x));
13990   biases = validize_mem (force_const_mem (V2DFmode, biases));
13991   emit_insn (gen_subv2df3 (fp_xmm, fp_xmm, biases));
13992
13993   /* Add the upper and lower DFmode values together.  */
13994   if (TARGET_SSE3)
13995     emit_insn (gen_sse3_haddv2df3 (fp_xmm, fp_xmm, fp_xmm));
13996   else
13997     {
13998       x = copy_to_mode_reg (V2DFmode, fp_xmm);
13999       emit_insn (gen_vec_interleave_highv2df (fp_xmm, fp_xmm, fp_xmm));
14000       emit_insn (gen_addv2df3 (fp_xmm, fp_xmm, x));
14001     }
14002
14003   ix86_expand_vector_extract (false, target, fp_xmm, 0);
14004 }
14005
14006 /* Not used, but eases macroization of patterns.  */
14007 void
14008 ix86_expand_convert_uns_sixf_sse (rtx target ATTRIBUTE_UNUSED,
14009                                   rtx input ATTRIBUTE_UNUSED)
14010 {
14011   gcc_unreachable ();
14012 }
14013
14014 /* Convert an unsigned SImode value into a DFmode.  Only currently used
14015    for SSE, but applicable anywhere.  */
14016
14017 void
14018 ix86_expand_convert_uns_sidf_sse (rtx target, rtx input)
14019 {
14020   REAL_VALUE_TYPE TWO31r;
14021   rtx x, fp;
14022
14023   x = expand_simple_binop (SImode, PLUS, input, GEN_INT (-2147483647 - 1),
14024                            NULL, 1, OPTAB_DIRECT);
14025
14026   fp = gen_reg_rtx (DFmode);
14027   emit_insn (gen_floatsidf2 (fp, x));
14028
14029   real_ldexp (&TWO31r, &dconst1, 31);
14030   x = const_double_from_real_value (TWO31r, DFmode);
14031
14032   x = expand_simple_binop (DFmode, PLUS, fp, x, target, 0, OPTAB_DIRECT);
14033   if (x != target)
14034     emit_move_insn (target, x);
14035 }
14036
14037 /* Convert a signed DImode value into a DFmode.  Only used for SSE in
14038    32-bit mode; otherwise we have a direct convert instruction.  */
14039
14040 void
14041 ix86_expand_convert_sign_didf_sse (rtx target, rtx input)
14042 {
14043   REAL_VALUE_TYPE TWO32r;
14044   rtx fp_lo, fp_hi, x;
14045
14046   fp_lo = gen_reg_rtx (DFmode);
14047   fp_hi = gen_reg_rtx (DFmode);
14048
14049   emit_insn (gen_floatsidf2 (fp_hi, gen_highpart (SImode, input)));
14050
14051   real_ldexp (&TWO32r, &dconst1, 32);
14052   x = const_double_from_real_value (TWO32r, DFmode);
14053   fp_hi = expand_simple_binop (DFmode, MULT, fp_hi, x, fp_hi, 0, OPTAB_DIRECT);
14054
14055   ix86_expand_convert_uns_sidf_sse (fp_lo, gen_lowpart (SImode, input));
14056
14057   x = expand_simple_binop (DFmode, PLUS, fp_hi, fp_lo, target,
14058                            0, OPTAB_DIRECT);
14059   if (x != target)
14060     emit_move_insn (target, x);
14061 }
14062
14063 /* Convert an unsigned SImode value into a SFmode, using only SSE.
14064    For x86_32, -mfpmath=sse, !optimize_size only.  */
14065 void
14066 ix86_expand_convert_uns_sisf_sse (rtx target, rtx input)
14067 {
14068   REAL_VALUE_TYPE ONE16r;
14069   rtx fp_hi, fp_lo, int_hi, int_lo, x;
14070
14071   real_ldexp (&ONE16r, &dconst1, 16);
14072   x = const_double_from_real_value (ONE16r, SFmode);
14073   int_lo = expand_simple_binop (SImode, AND, input, GEN_INT(0xffff),
14074                                       NULL, 0, OPTAB_DIRECT);
14075   int_hi = expand_simple_binop (SImode, LSHIFTRT, input, GEN_INT(16),
14076                                       NULL, 0, OPTAB_DIRECT);
14077   fp_hi = gen_reg_rtx (SFmode);
14078   fp_lo = gen_reg_rtx (SFmode);
14079   emit_insn (gen_floatsisf2 (fp_hi, int_hi));
14080   emit_insn (gen_floatsisf2 (fp_lo, int_lo));
14081   fp_hi = expand_simple_binop (SFmode, MULT, fp_hi, x, fp_hi,
14082                                0, OPTAB_DIRECT);
14083   fp_hi = expand_simple_binop (SFmode, PLUS, fp_hi, fp_lo, target,
14084                                0, OPTAB_DIRECT);
14085   if (!rtx_equal_p (target, fp_hi))
14086     emit_move_insn (target, fp_hi);
14087 }
14088
14089 /* A subroutine of ix86_build_signbit_mask.  If VECT is true,
14090    then replicate the value for all elements of the vector
14091    register.  */
14092
14093 rtx
14094 ix86_build_const_vector (enum machine_mode mode, bool vect, rtx value)
14095 {
14096   rtvec v;
14097   switch (mode)
14098     {
14099     case SImode:
14100       gcc_assert (vect);
14101       v = gen_rtvec (4, value, value, value, value);
14102       return gen_rtx_CONST_VECTOR (V4SImode, v);
14103
14104     case DImode:
14105       gcc_assert (vect);
14106       v = gen_rtvec (2, value, value);
14107       return gen_rtx_CONST_VECTOR (V2DImode, v);
14108
14109     case SFmode:
14110       if (vect)
14111         v = gen_rtvec (4, value, value, value, value);
14112       else
14113         v = gen_rtvec (4, value, CONST0_RTX (SFmode),
14114                        CONST0_RTX (SFmode), CONST0_RTX (SFmode));
14115       return gen_rtx_CONST_VECTOR (V4SFmode, v);
14116
14117     case DFmode:
14118       if (vect)
14119         v = gen_rtvec (2, value, value);
14120       else
14121         v = gen_rtvec (2, value, CONST0_RTX (DFmode));
14122       return gen_rtx_CONST_VECTOR (V2DFmode, v);
14123
14124     default:
14125       gcc_unreachable ();
14126     }
14127 }
14128
14129 /* A subroutine of ix86_expand_fp_absneg_operator, copysign expanders
14130    and ix86_expand_int_vcond.  Create a mask for the sign bit in MODE
14131    for an SSE register.  If VECT is true, then replicate the mask for
14132    all elements of the vector register.  If INVERT is true, then create
14133    a mask excluding the sign bit.  */
14134
14135 rtx
14136 ix86_build_signbit_mask (enum machine_mode mode, bool vect, bool invert)
14137 {
14138   enum machine_mode vec_mode, imode;
14139   HOST_WIDE_INT hi, lo;
14140   int shift = 63;
14141   rtx v;
14142   rtx mask;
14143
14144   /* Find the sign bit, sign extended to 2*HWI.  */
14145   switch (mode)
14146     {
14147     case SImode:
14148     case SFmode:
14149       imode = SImode;
14150       vec_mode = (mode == SImode) ? V4SImode : V4SFmode;
14151       lo = 0x80000000, hi = lo < 0;
14152       break;
14153
14154     case DImode:
14155     case DFmode:
14156       imode = DImode;
14157       vec_mode = (mode == DImode) ? V2DImode : V2DFmode;
14158       if (HOST_BITS_PER_WIDE_INT >= 64)
14159         lo = (HOST_WIDE_INT)1 << shift, hi = -1;
14160       else
14161         lo = 0, hi = (HOST_WIDE_INT)1 << (shift - HOST_BITS_PER_WIDE_INT);
14162       break;
14163
14164     case TImode:
14165     case TFmode:
14166       vec_mode = VOIDmode;
14167       if (HOST_BITS_PER_WIDE_INT >= 64)
14168         {
14169           imode = TImode;
14170           lo = 0, hi = (HOST_WIDE_INT)1 << shift;
14171         }
14172       else
14173         {
14174           rtvec vec;
14175
14176           imode = DImode;
14177           lo = 0, hi = (HOST_WIDE_INT)1 << (shift - HOST_BITS_PER_WIDE_INT);
14178
14179           if (invert)
14180             {
14181               lo = ~lo, hi = ~hi;
14182               v = constm1_rtx;
14183             }
14184           else
14185             v = const0_rtx;
14186
14187           mask = immed_double_const (lo, hi, imode);
14188
14189           vec = gen_rtvec (2, v, mask);
14190           v = gen_rtx_CONST_VECTOR (V2DImode, vec);
14191           v = copy_to_mode_reg (mode, gen_lowpart (mode, v));
14192
14193           return v;
14194         }
14195      break;
14196
14197     default:
14198       gcc_unreachable ();
14199     }
14200
14201   if (invert)
14202     lo = ~lo, hi = ~hi;
14203
14204   /* Force this value into the low part of a fp vector constant.  */
14205   mask = immed_double_const (lo, hi, imode);
14206   mask = gen_lowpart (mode, mask);
14207
14208   if (vec_mode == VOIDmode)
14209     return force_reg (mode, mask);
14210
14211   v = ix86_build_const_vector (mode, vect, mask);
14212   return force_reg (vec_mode, v);
14213 }
14214
14215 /* Generate code for floating point ABS or NEG.  */
14216
14217 void
14218 ix86_expand_fp_absneg_operator (enum rtx_code code, enum machine_mode mode,
14219                                 rtx operands[])
14220 {
14221   rtx mask, set, use, clob, dst, src;
14222   bool use_sse = false;
14223   bool vector_mode = VECTOR_MODE_P (mode);
14224   enum machine_mode elt_mode = mode;
14225
14226   if (vector_mode)
14227     {
14228       elt_mode = GET_MODE_INNER (mode);
14229       use_sse = true;
14230     }
14231   else if (mode == TFmode)
14232     use_sse = true;
14233   else if (TARGET_SSE_MATH)
14234     use_sse = SSE_FLOAT_MODE_P (mode);
14235
14236   /* NEG and ABS performed with SSE use bitwise mask operations.
14237      Create the appropriate mask now.  */
14238   if (use_sse)
14239     mask = ix86_build_signbit_mask (elt_mode, vector_mode, code == ABS);
14240   else
14241     mask = NULL_RTX;
14242
14243   dst = operands[0];
14244   src = operands[1];
14245
14246   if (vector_mode)
14247     {
14248       set = gen_rtx_fmt_ee (code == NEG ? XOR : AND, mode, src, mask);
14249       set = gen_rtx_SET (VOIDmode, dst, set);
14250       emit_insn (set);
14251     }
14252   else
14253     {
14254       set = gen_rtx_fmt_e (code, mode, src);
14255       set = gen_rtx_SET (VOIDmode, dst, set);
14256       if (mask)
14257         {
14258           use = gen_rtx_USE (VOIDmode, mask);
14259           clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
14260           emit_insn (gen_rtx_PARALLEL (VOIDmode,
14261                                        gen_rtvec (3, set, use, clob)));
14262         }
14263       else
14264         emit_insn (set);
14265     }
14266 }
14267
14268 /* Expand a copysign operation.  Special case operand 0 being a constant.  */
14269
14270 void
14271 ix86_expand_copysign (rtx operands[])
14272 {
14273   enum machine_mode mode;
14274   rtx dest, op0, op1, mask, nmask;
14275
14276   dest = operands[0];
14277   op0 = operands[1];
14278   op1 = operands[2];
14279
14280   mode = GET_MODE (dest);
14281
14282   if (GET_CODE (op0) == CONST_DOUBLE)
14283     {
14284       rtx (*copysign_insn)(rtx, rtx, rtx, rtx);
14285
14286       if (real_isneg (CONST_DOUBLE_REAL_VALUE (op0)))
14287         op0 = simplify_unary_operation (ABS, mode, op0, mode);
14288
14289       if (mode == SFmode || mode == DFmode)
14290         {
14291           enum machine_mode vmode;
14292
14293           vmode = mode == SFmode ? V4SFmode : V2DFmode;
14294
14295           if (op0 == CONST0_RTX (mode))
14296             op0 = CONST0_RTX (vmode);
14297           else
14298             {
14299               rtx v = ix86_build_const_vector (mode, false, op0);
14300
14301               op0 = force_reg (vmode, v);
14302             }
14303         }
14304       else if (op0 != CONST0_RTX (mode))
14305         op0 = force_reg (mode, op0);
14306
14307       mask = ix86_build_signbit_mask (mode, 0, 0);
14308
14309       if (mode == SFmode)
14310         copysign_insn = gen_copysignsf3_const;
14311       else if (mode == DFmode)
14312         copysign_insn = gen_copysigndf3_const;
14313       else
14314         copysign_insn = gen_copysigntf3_const;
14315
14316         emit_insn (copysign_insn (dest, op0, op1, mask));
14317     }
14318   else
14319     {
14320       rtx (*copysign_insn)(rtx, rtx, rtx, rtx, rtx, rtx);
14321
14322       nmask = ix86_build_signbit_mask (mode, 0, 1);
14323       mask = ix86_build_signbit_mask (mode, 0, 0);
14324
14325       if (mode == SFmode)
14326         copysign_insn = gen_copysignsf3_var;
14327       else if (mode == DFmode)
14328         copysign_insn = gen_copysigndf3_var;
14329       else
14330         copysign_insn = gen_copysigntf3_var;
14331
14332       emit_insn (copysign_insn (dest, NULL_RTX, op0, op1, nmask, mask));
14333     }
14334 }
14335
14336 /* Deconstruct a copysign operation into bit masks.  Operand 0 is known to
14337    be a constant, and so has already been expanded into a vector constant.  */
14338
14339 void
14340 ix86_split_copysign_const (rtx operands[])
14341 {
14342   enum machine_mode mode, vmode;
14343   rtx dest, op0, mask, x;
14344
14345   dest = operands[0];
14346   op0 = operands[1];
14347   mask = operands[3];
14348
14349   mode = GET_MODE (dest);
14350   vmode = GET_MODE (mask);
14351
14352   dest = simplify_gen_subreg (vmode, dest, mode, 0);
14353   x = gen_rtx_AND (vmode, dest, mask);
14354   emit_insn (gen_rtx_SET (VOIDmode, dest, x));
14355
14356   if (op0 != CONST0_RTX (vmode))
14357     {
14358       x = gen_rtx_IOR (vmode, dest, op0);
14359       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
14360     }
14361 }
14362
14363 /* Deconstruct a copysign operation into bit masks.  Operand 0 is variable,
14364    so we have to do two masks.  */
14365
14366 void
14367 ix86_split_copysign_var (rtx operands[])
14368 {
14369   enum machine_mode mode, vmode;
14370   rtx dest, scratch, op0, op1, mask, nmask, x;
14371
14372   dest = operands[0];
14373   scratch = operands[1];
14374   op0 = operands[2];
14375   op1 = operands[3];
14376   nmask = operands[4];
14377   mask = operands[5];
14378
14379   mode = GET_MODE (dest);
14380   vmode = GET_MODE (mask);
14381
14382   if (rtx_equal_p (op0, op1))
14383     {
14384       /* Shouldn't happen often (it's useless, obviously), but when it does
14385          we'd generate incorrect code if we continue below.  */
14386       emit_move_insn (dest, op0);
14387       return;
14388     }
14389
14390   if (REG_P (mask) && REGNO (dest) == REGNO (mask))     /* alternative 0 */
14391     {
14392       gcc_assert (REGNO (op1) == REGNO (scratch));
14393
14394       x = gen_rtx_AND (vmode, scratch, mask);
14395       emit_insn (gen_rtx_SET (VOIDmode, scratch, x));
14396
14397       dest = mask;
14398       op0 = simplify_gen_subreg (vmode, op0, mode, 0);
14399       x = gen_rtx_NOT (vmode, dest);
14400       x = gen_rtx_AND (vmode, x, op0);
14401       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
14402     }
14403   else
14404     {
14405       if (REGNO (op1) == REGNO (scratch))               /* alternative 1,3 */
14406         {
14407           x = gen_rtx_AND (vmode, scratch, mask);
14408         }
14409       else                                              /* alternative 2,4 */
14410         {
14411           gcc_assert (REGNO (mask) == REGNO (scratch));
14412           op1 = simplify_gen_subreg (vmode, op1, mode, 0);
14413           x = gen_rtx_AND (vmode, scratch, op1);
14414         }
14415       emit_insn (gen_rtx_SET (VOIDmode, scratch, x));
14416
14417       if (REGNO (op0) == REGNO (dest))                  /* alternative 1,2 */
14418         {
14419           dest = simplify_gen_subreg (vmode, op0, mode, 0);
14420           x = gen_rtx_AND (vmode, dest, nmask);
14421         }
14422       else                                              /* alternative 3,4 */
14423         {
14424           gcc_assert (REGNO (nmask) == REGNO (dest));
14425           dest = nmask;
14426           op0 = simplify_gen_subreg (vmode, op0, mode, 0);
14427           x = gen_rtx_AND (vmode, dest, op0);
14428         }
14429       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
14430     }
14431
14432   x = gen_rtx_IOR (vmode, dest, scratch);
14433   emit_insn (gen_rtx_SET (VOIDmode, dest, x));
14434 }
14435
14436 /* Return TRUE or FALSE depending on whether the first SET in INSN
14437    has source and destination with matching CC modes, and that the
14438    CC mode is at least as constrained as REQ_MODE.  */
14439
14440 int
14441 ix86_match_ccmode (rtx insn, enum machine_mode req_mode)
14442 {
14443   rtx set;
14444   enum machine_mode set_mode;
14445
14446   set = PATTERN (insn);
14447   if (GET_CODE (set) == PARALLEL)
14448     set = XVECEXP (set, 0, 0);
14449   gcc_assert (GET_CODE (set) == SET);
14450   gcc_assert (GET_CODE (SET_SRC (set)) == COMPARE);
14451
14452   set_mode = GET_MODE (SET_DEST (set));
14453   switch (set_mode)
14454     {
14455     case CCNOmode:
14456       if (req_mode != CCNOmode
14457           && (req_mode != CCmode
14458               || XEXP (SET_SRC (set), 1) != const0_rtx))
14459         return 0;
14460       break;
14461     case CCmode:
14462       if (req_mode == CCGCmode)
14463         return 0;
14464       /* FALLTHRU */
14465     case CCGCmode:
14466       if (req_mode == CCGOCmode || req_mode == CCNOmode)
14467         return 0;
14468       /* FALLTHRU */
14469     case CCGOCmode:
14470       if (req_mode == CCZmode)
14471         return 0;
14472       /* FALLTHRU */
14473     case CCAmode:
14474     case CCCmode:
14475     case CCOmode:
14476     case CCSmode:
14477     case CCZmode:
14478       break;
14479
14480     default:
14481       gcc_unreachable ();
14482     }
14483
14484   return (GET_MODE (SET_SRC (set)) == set_mode);
14485 }
14486
14487 /* Generate insn patterns to do an integer compare of OPERANDS.  */
14488
14489 static rtx
14490 ix86_expand_int_compare (enum rtx_code code, rtx op0, rtx op1)
14491 {
14492   enum machine_mode cmpmode;
14493   rtx tmp, flags;
14494
14495   cmpmode = SELECT_CC_MODE (code, op0, op1);
14496   flags = gen_rtx_REG (cmpmode, FLAGS_REG);
14497
14498   /* This is very simple, but making the interface the same as in the
14499      FP case makes the rest of the code easier.  */
14500   tmp = gen_rtx_COMPARE (cmpmode, op0, op1);
14501   emit_insn (gen_rtx_SET (VOIDmode, flags, tmp));
14502
14503   /* Return the test that should be put into the flags user, i.e.
14504      the bcc, scc, or cmov instruction.  */
14505   return gen_rtx_fmt_ee (code, VOIDmode, flags, const0_rtx);
14506 }
14507
14508 /* Figure out whether to use ordered or unordered fp comparisons.
14509    Return the appropriate mode to use.  */
14510
14511 enum machine_mode
14512 ix86_fp_compare_mode (enum rtx_code code ATTRIBUTE_UNUSED)
14513 {
14514   /* ??? In order to make all comparisons reversible, we do all comparisons
14515      non-trapping when compiling for IEEE.  Once gcc is able to distinguish
14516      all forms trapping and nontrapping comparisons, we can make inequality
14517      comparisons trapping again, since it results in better code when using
14518      FCOM based compares.  */
14519   return TARGET_IEEE_FP ? CCFPUmode : CCFPmode;
14520 }
14521
14522 enum machine_mode
14523 ix86_cc_mode (enum rtx_code code, rtx op0, rtx op1)
14524 {
14525   enum machine_mode mode = GET_MODE (op0);
14526
14527   if (SCALAR_FLOAT_MODE_P (mode))
14528     {
14529       gcc_assert (!DECIMAL_FLOAT_MODE_P (mode));
14530       return ix86_fp_compare_mode (code);
14531     }
14532
14533   switch (code)
14534     {
14535       /* Only zero flag is needed.  */
14536     case EQ:                    /* ZF=0 */
14537     case NE:                    /* ZF!=0 */
14538       return CCZmode;
14539       /* Codes needing carry flag.  */
14540     case GEU:                   /* CF=0 */
14541     case LTU:                   /* CF=1 */
14542       /* Detect overflow checks.  They need just the carry flag.  */
14543       if (GET_CODE (op0) == PLUS
14544           && rtx_equal_p (op1, XEXP (op0, 0)))
14545         return CCCmode;
14546       else
14547         return CCmode;
14548     case GTU:                   /* CF=0 & ZF=0 */
14549     case LEU:                   /* CF=1 | ZF=1 */
14550       /* Detect overflow checks.  They need just the carry flag.  */
14551       if (GET_CODE (op0) == MINUS
14552           && rtx_equal_p (op1, XEXP (op0, 0)))
14553         return CCCmode;
14554       else
14555         return CCmode;
14556       /* Codes possibly doable only with sign flag when
14557          comparing against zero.  */
14558     case GE:                    /* SF=OF   or   SF=0 */
14559     case LT:                    /* SF<>OF  or   SF=1 */
14560       if (op1 == const0_rtx)
14561         return CCGOCmode;
14562       else
14563         /* For other cases Carry flag is not required.  */
14564         return CCGCmode;
14565       /* Codes doable only with sign flag when comparing
14566          against zero, but we miss jump instruction for it
14567          so we need to use relational tests against overflow
14568          that thus needs to be zero.  */
14569     case GT:                    /* ZF=0 & SF=OF */
14570     case LE:                    /* ZF=1 | SF<>OF */
14571       if (op1 == const0_rtx)
14572         return CCNOmode;
14573       else
14574         return CCGCmode;
14575       /* strcmp pattern do (use flags) and combine may ask us for proper
14576          mode.  */
14577     case USE:
14578       return CCmode;
14579     default:
14580       gcc_unreachable ();
14581     }
14582 }
14583
14584 /* Return the fixed registers used for condition codes.  */
14585
14586 static bool
14587 ix86_fixed_condition_code_regs (unsigned int *p1, unsigned int *p2)
14588 {
14589   *p1 = FLAGS_REG;
14590   *p2 = FPSR_REG;
14591   return true;
14592 }
14593
14594 /* If two condition code modes are compatible, return a condition code
14595    mode which is compatible with both.  Otherwise, return
14596    VOIDmode.  */
14597
14598 static enum machine_mode
14599 ix86_cc_modes_compatible (enum machine_mode m1, enum machine_mode m2)
14600 {
14601   if (m1 == m2)
14602     return m1;
14603
14604   if (GET_MODE_CLASS (m1) != MODE_CC || GET_MODE_CLASS (m2) != MODE_CC)
14605     return VOIDmode;
14606
14607   if ((m1 == CCGCmode && m2 == CCGOCmode)
14608       || (m1 == CCGOCmode && m2 == CCGCmode))
14609     return CCGCmode;
14610
14611   switch (m1)
14612     {
14613     default:
14614       gcc_unreachable ();
14615
14616     case CCmode:
14617     case CCGCmode:
14618     case CCGOCmode:
14619     case CCNOmode:
14620     case CCAmode:
14621     case CCCmode:
14622     case CCOmode:
14623     case CCSmode:
14624     case CCZmode:
14625       switch (m2)
14626         {
14627         default:
14628           return VOIDmode;
14629
14630         case CCmode:
14631         case CCGCmode:
14632         case CCGOCmode:
14633         case CCNOmode:
14634         case CCAmode:
14635         case CCCmode:
14636         case CCOmode:
14637         case CCSmode:
14638         case CCZmode:
14639           return CCmode;
14640         }
14641
14642     case CCFPmode:
14643     case CCFPUmode:
14644       /* These are only compatible with themselves, which we already
14645          checked above.  */
14646       return VOIDmode;
14647     }
14648 }
14649
14650
14651 /* Return a comparison we can do and that it is equivalent to 
14652    swap_condition (code) apart possibly from orderedness.
14653    But, never change orderedness if TARGET_IEEE_FP, returning
14654    UNKNOWN in that case if necessary.  */
14655
14656 static enum rtx_code
14657 ix86_fp_swap_condition (enum rtx_code code)
14658 {
14659   switch (code)
14660     {
14661     case GT:                   /* GTU - CF=0 & ZF=0 */
14662       return TARGET_IEEE_FP ? UNKNOWN : UNLT;
14663     case GE:                   /* GEU - CF=0 */
14664       return TARGET_IEEE_FP ? UNKNOWN : UNLE;
14665     case UNLT:                 /* LTU - CF=1 */
14666       return TARGET_IEEE_FP ? UNKNOWN : GT;
14667     case UNLE:                 /* LEU - CF=1 | ZF=1 */
14668       return TARGET_IEEE_FP ? UNKNOWN : GE;
14669     default:
14670       return swap_condition (code);
14671     }
14672 }
14673
14674 /* Return cost of comparison CODE using the best strategy for performance.
14675    All following functions do use number of instructions as a cost metrics.
14676    In future this should be tweaked to compute bytes for optimize_size and
14677    take into account performance of various instructions on various CPUs.  */
14678
14679 static int
14680 ix86_fp_comparison_cost (enum rtx_code code)
14681 {
14682   int arith_cost;
14683
14684   /* The cost of code using bit-twiddling on %ah.  */
14685   switch (code)
14686     {
14687     case UNLE:
14688     case UNLT:
14689     case LTGT:
14690     case GT:
14691     case GE:
14692     case UNORDERED:
14693     case ORDERED:
14694     case UNEQ:
14695       arith_cost = 4;
14696       break;
14697     case LT:
14698     case NE:
14699     case EQ:
14700     case UNGE:
14701       arith_cost = TARGET_IEEE_FP ? 5 : 4;
14702       break;
14703     case LE:
14704     case UNGT:
14705       arith_cost = TARGET_IEEE_FP ? 6 : 4;
14706       break;
14707     default:
14708       gcc_unreachable ();
14709     }
14710
14711   switch (ix86_fp_comparison_strategy (code))
14712     {
14713     case IX86_FPCMP_COMI:
14714       return arith_cost > 4 ? 3 : 2;
14715     case IX86_FPCMP_SAHF:
14716       return arith_cost > 4 ? 4 : 3;
14717     default:
14718       return arith_cost;
14719     }
14720 }
14721
14722 /* Return strategy to use for floating-point.  We assume that fcomi is always
14723    preferrable where available, since that is also true when looking at size
14724    (2 bytes, vs. 3 for fnstsw+sahf and at least 5 for fnstsw+test).  */
14725
14726 enum ix86_fpcmp_strategy
14727 ix86_fp_comparison_strategy (enum rtx_code code ATTRIBUTE_UNUSED)
14728 {
14729   /* Do fcomi/sahf based test when profitable.  */
14730
14731   if (TARGET_CMOVE)
14732     return IX86_FPCMP_COMI;
14733
14734   if (TARGET_SAHF && (TARGET_USE_SAHF || optimize_function_for_size_p (cfun)))
14735     return IX86_FPCMP_SAHF;
14736
14737   return IX86_FPCMP_ARITH;
14738 }
14739
14740 /* Swap, force into registers, or otherwise massage the two operands
14741    to a fp comparison.  The operands are updated in place; the new
14742    comparison code is returned.  */
14743
14744 static enum rtx_code
14745 ix86_prepare_fp_compare_args (enum rtx_code code, rtx *pop0, rtx *pop1)
14746 {
14747   enum machine_mode fpcmp_mode = ix86_fp_compare_mode (code);
14748   rtx op0 = *pop0, op1 = *pop1;
14749   enum machine_mode op_mode = GET_MODE (op0);
14750   int is_sse = TARGET_SSE_MATH && SSE_FLOAT_MODE_P (op_mode);
14751
14752   /* All of the unordered compare instructions only work on registers.
14753      The same is true of the fcomi compare instructions.  The XFmode
14754      compare instructions require registers except when comparing
14755      against zero or when converting operand 1 from fixed point to
14756      floating point.  */
14757
14758   if (!is_sse
14759       && (fpcmp_mode == CCFPUmode
14760           || (op_mode == XFmode
14761               && ! (standard_80387_constant_p (op0) == 1
14762                     || standard_80387_constant_p (op1) == 1)
14763               && GET_CODE (op1) != FLOAT)
14764           || ix86_fp_comparison_strategy (code) == IX86_FPCMP_COMI))
14765     {
14766       op0 = force_reg (op_mode, op0);
14767       op1 = force_reg (op_mode, op1);
14768     }
14769   else
14770     {
14771       /* %%% We only allow op1 in memory; op0 must be st(0).  So swap
14772          things around if they appear profitable, otherwise force op0
14773          into a register.  */
14774
14775       if (standard_80387_constant_p (op0) == 0
14776           || (MEM_P (op0)
14777               && ! (standard_80387_constant_p (op1) == 0
14778                     || MEM_P (op1))))
14779         {
14780           enum rtx_code new_code = ix86_fp_swap_condition (code);
14781           if (new_code != UNKNOWN)
14782             {
14783               rtx tmp;
14784               tmp = op0, op0 = op1, op1 = tmp;
14785               code = new_code;
14786             }
14787         }
14788
14789       if (!REG_P (op0))
14790         op0 = force_reg (op_mode, op0);
14791
14792       if (CONSTANT_P (op1))
14793         {
14794           int tmp = standard_80387_constant_p (op1);
14795           if (tmp == 0)
14796             op1 = validize_mem (force_const_mem (op_mode, op1));
14797           else if (tmp == 1)
14798             {
14799               if (TARGET_CMOVE)
14800                 op1 = force_reg (op_mode, op1);
14801             }
14802           else
14803             op1 = force_reg (op_mode, op1);
14804         }
14805     }
14806
14807   /* Try to rearrange the comparison to make it cheaper.  */
14808   if (ix86_fp_comparison_cost (code)
14809       > ix86_fp_comparison_cost (swap_condition (code))
14810       && (REG_P (op1) || can_create_pseudo_p ()))
14811     {
14812       rtx tmp;
14813       tmp = op0, op0 = op1, op1 = tmp;
14814       code = swap_condition (code);
14815       if (!REG_P (op0))
14816         op0 = force_reg (op_mode, op0);
14817     }
14818
14819   *pop0 = op0;
14820   *pop1 = op1;
14821   return code;
14822 }
14823
14824 /* Convert comparison codes we use to represent FP comparison to integer
14825    code that will result in proper branch.  Return UNKNOWN if no such code
14826    is available.  */
14827
14828 enum rtx_code
14829 ix86_fp_compare_code_to_integer (enum rtx_code code)
14830 {
14831   switch (code)
14832     {
14833     case GT:
14834       return GTU;
14835     case GE:
14836       return GEU;
14837     case ORDERED:
14838     case UNORDERED:
14839       return code;
14840       break;
14841     case UNEQ:
14842       return EQ;
14843       break;
14844     case UNLT:
14845       return LTU;
14846       break;
14847     case UNLE:
14848       return LEU;
14849       break;
14850     case LTGT:
14851       return NE;
14852       break;
14853     default:
14854       return UNKNOWN;
14855     }
14856 }
14857
14858 /* Generate insn patterns to do a floating point compare of OPERANDS.  */
14859
14860 static rtx
14861 ix86_expand_fp_compare (enum rtx_code code, rtx op0, rtx op1, rtx scratch)
14862 {
14863   enum machine_mode fpcmp_mode, intcmp_mode;
14864   rtx tmp, tmp2;
14865
14866   fpcmp_mode = ix86_fp_compare_mode (code);
14867   code = ix86_prepare_fp_compare_args (code, &op0, &op1);
14868
14869   /* Do fcomi/sahf based test when profitable.  */
14870   switch (ix86_fp_comparison_strategy (code))
14871     {
14872     case IX86_FPCMP_COMI:
14873       intcmp_mode = fpcmp_mode;
14874       tmp = gen_rtx_COMPARE (fpcmp_mode, op0, op1);
14875       tmp = gen_rtx_SET (VOIDmode, gen_rtx_REG (fpcmp_mode, FLAGS_REG),
14876                          tmp);
14877       emit_insn (tmp);
14878       break;
14879
14880     case IX86_FPCMP_SAHF:
14881       intcmp_mode = fpcmp_mode;
14882       tmp = gen_rtx_COMPARE (fpcmp_mode, op0, op1);
14883       tmp = gen_rtx_SET (VOIDmode, gen_rtx_REG (fpcmp_mode, FLAGS_REG),
14884                          tmp);
14885
14886       if (!scratch)
14887         scratch = gen_reg_rtx (HImode);
14888       tmp2 = gen_rtx_CLOBBER (VOIDmode, scratch);
14889       emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, tmp, tmp2)));
14890       break;
14891
14892     case IX86_FPCMP_ARITH:
14893       /* Sadness wrt reg-stack pops killing fpsr -- gotta get fnstsw first.  */
14894       tmp = gen_rtx_COMPARE (fpcmp_mode, op0, op1);
14895       tmp2 = gen_rtx_UNSPEC (HImode, gen_rtvec (1, tmp), UNSPEC_FNSTSW);
14896       if (!scratch)
14897         scratch = gen_reg_rtx (HImode);
14898       emit_insn (gen_rtx_SET (VOIDmode, scratch, tmp2));
14899
14900       /* In the unordered case, we have to check C2 for NaN's, which
14901          doesn't happen to work out to anything nice combination-wise.
14902          So do some bit twiddling on the value we've got in AH to come
14903          up with an appropriate set of condition codes.  */
14904
14905       intcmp_mode = CCNOmode;
14906       switch (code)
14907         {
14908         case GT:
14909         case UNGT:
14910           if (code == GT || !TARGET_IEEE_FP)
14911             {
14912               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x45)));
14913               code = EQ;
14914             }
14915           else
14916             {
14917               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
14918               emit_insn (gen_addqi_ext_1 (scratch, scratch, constm1_rtx));
14919               emit_insn (gen_cmpqi_ext_3 (scratch, GEN_INT (0x44)));
14920               intcmp_mode = CCmode;
14921               code = GEU;
14922             }
14923           break;
14924         case LT:
14925         case UNLT:
14926           if (code == LT && TARGET_IEEE_FP)
14927             {
14928               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
14929               emit_insn (gen_cmpqi_ext_3 (scratch, const1_rtx));
14930               intcmp_mode = CCmode;
14931               code = EQ;
14932             }
14933           else
14934             {
14935               emit_insn (gen_testqi_ext_ccno_0 (scratch, const1_rtx));
14936               code = NE;
14937             }
14938           break;
14939         case GE:
14940         case UNGE:
14941           if (code == GE || !TARGET_IEEE_FP)
14942             {
14943               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x05)));
14944               code = EQ;
14945             }
14946           else
14947             {
14948               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
14949               emit_insn (gen_xorqi_cc_ext_1 (scratch, scratch, const1_rtx));
14950               code = NE;
14951             }
14952           break;
14953         case LE:
14954         case UNLE:
14955           if (code == LE && TARGET_IEEE_FP)
14956             {
14957               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
14958               emit_insn (gen_addqi_ext_1 (scratch, scratch, constm1_rtx));
14959               emit_insn (gen_cmpqi_ext_3 (scratch, GEN_INT (0x40)));
14960               intcmp_mode = CCmode;
14961               code = LTU;
14962             }
14963           else
14964             {
14965               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x45)));
14966               code = NE;
14967             }
14968           break;
14969         case EQ:
14970         case UNEQ:
14971           if (code == EQ && TARGET_IEEE_FP)
14972             {
14973               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
14974               emit_insn (gen_cmpqi_ext_3 (scratch, GEN_INT (0x40)));
14975               intcmp_mode = CCmode;
14976               code = EQ;
14977             }
14978           else
14979             {
14980               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x40)));
14981               code = NE;
14982             }
14983           break;
14984         case NE:
14985         case LTGT:
14986           if (code == NE && TARGET_IEEE_FP)
14987             {
14988               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
14989               emit_insn (gen_xorqi_cc_ext_1 (scratch, scratch,
14990                                              GEN_INT (0x40)));
14991               code = NE;
14992             }
14993           else
14994             {
14995               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x40)));
14996               code = EQ;
14997             }
14998           break;
14999
15000         case UNORDERED:
15001           emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x04)));
15002           code = NE;
15003           break;
15004         case ORDERED:
15005           emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x04)));
15006           code = EQ;
15007           break;
15008
15009         default:
15010           gcc_unreachable ();
15011         }
15012         break;
15013
15014     default:
15015       gcc_unreachable();
15016     }
15017
15018   /* Return the test that should be put into the flags user, i.e.
15019      the bcc, scc, or cmov instruction.  */
15020   return gen_rtx_fmt_ee (code, VOIDmode,
15021                          gen_rtx_REG (intcmp_mode, FLAGS_REG),
15022                          const0_rtx);
15023 }
15024
15025 rtx
15026 ix86_expand_compare (enum rtx_code code)
15027 {
15028   rtx op0, op1, ret;
15029   op0 = ix86_compare_op0;
15030   op1 = ix86_compare_op1;
15031
15032   if (GET_MODE_CLASS (GET_MODE (ix86_compare_op0)) == MODE_CC)
15033     ret = gen_rtx_fmt_ee (code, VOIDmode, ix86_compare_op0, ix86_compare_op1);
15034
15035   else if (SCALAR_FLOAT_MODE_P (GET_MODE (op0)))
15036     {
15037       gcc_assert (!DECIMAL_FLOAT_MODE_P (GET_MODE (op0)));
15038       ret = ix86_expand_fp_compare (code, op0, op1, NULL_RTX);
15039     }
15040   else
15041     ret = ix86_expand_int_compare (code, op0, op1);
15042
15043   return ret;
15044 }
15045
15046 void
15047 ix86_expand_branch (enum rtx_code code, rtx label)
15048 {
15049   rtx tmp;
15050
15051   switch (GET_MODE (ix86_compare_op0))
15052     {
15053     case SFmode:
15054     case DFmode:
15055     case XFmode:
15056     case QImode:
15057     case HImode:
15058     case SImode:
15059       simple:
15060       tmp = ix86_expand_compare (code);
15061       tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp,
15062                                   gen_rtx_LABEL_REF (VOIDmode, label),
15063                                   pc_rtx);
15064       emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, tmp));
15065       return;
15066
15067     case DImode:
15068       if (TARGET_64BIT)
15069         goto simple;
15070     case TImode:
15071       /* Expand DImode branch into multiple compare+branch.  */
15072       {
15073         rtx lo[2], hi[2], label2;
15074         enum rtx_code code1, code2, code3;
15075         enum machine_mode submode;
15076
15077         if (CONSTANT_P (ix86_compare_op0) && ! CONSTANT_P (ix86_compare_op1))
15078           {
15079             tmp = ix86_compare_op0;
15080             ix86_compare_op0 = ix86_compare_op1;
15081             ix86_compare_op1 = tmp;
15082             code = swap_condition (code);
15083           }
15084         if (GET_MODE (ix86_compare_op0) == DImode)
15085           {
15086             split_di (&ix86_compare_op0, 1, lo+0, hi+0);
15087             split_di (&ix86_compare_op1, 1, lo+1, hi+1);
15088             submode = SImode;
15089           }
15090         else
15091           {
15092             split_ti (&ix86_compare_op0, 1, lo+0, hi+0);
15093             split_ti (&ix86_compare_op1, 1, lo+1, hi+1);
15094             submode = DImode;
15095           }
15096
15097         /* When comparing for equality, we can use (hi0^hi1)|(lo0^lo1) to
15098            avoid two branches.  This costs one extra insn, so disable when
15099            optimizing for size.  */
15100
15101         if ((code == EQ || code == NE)
15102             && (!optimize_insn_for_size_p ()
15103                 || hi[1] == const0_rtx || lo[1] == const0_rtx))
15104           {
15105             rtx xor0, xor1;
15106
15107             xor1 = hi[0];
15108             if (hi[1] != const0_rtx)
15109               xor1 = expand_binop (submode, xor_optab, xor1, hi[1],
15110                                    NULL_RTX, 0, OPTAB_WIDEN);
15111
15112             xor0 = lo[0];
15113             if (lo[1] != const0_rtx)
15114               xor0 = expand_binop (submode, xor_optab, xor0, lo[1],
15115                                    NULL_RTX, 0, OPTAB_WIDEN);
15116
15117             tmp = expand_binop (submode, ior_optab, xor1, xor0,
15118                                 NULL_RTX, 0, OPTAB_WIDEN);
15119
15120             ix86_compare_op0 = tmp;
15121             ix86_compare_op1 = const0_rtx;
15122             ix86_expand_branch (code, label);
15123             return;
15124           }
15125
15126         /* Otherwise, if we are doing less-than or greater-or-equal-than,
15127            op1 is a constant and the low word is zero, then we can just
15128            examine the high word.  Similarly for low word -1 and
15129            less-or-equal-than or greater-than.  */
15130
15131         if (CONST_INT_P (hi[1]))
15132           switch (code)
15133             {
15134             case LT: case LTU: case GE: case GEU:
15135               if (lo[1] == const0_rtx)
15136                 {
15137                   ix86_compare_op0 = hi[0];
15138                   ix86_compare_op1 = hi[1];
15139                   ix86_expand_branch (code, label);
15140                   return;
15141                 }
15142               break;
15143             case LE: case LEU: case GT: case GTU:
15144               if (lo[1] == constm1_rtx)
15145                 {
15146                   ix86_compare_op0 = hi[0];
15147                   ix86_compare_op1 = hi[1];
15148                   ix86_expand_branch (code, label);
15149                   return;
15150                 }
15151               break;
15152             default:
15153               break;
15154             }
15155
15156         /* Otherwise, we need two or three jumps.  */
15157
15158         label2 = gen_label_rtx ();
15159
15160         code1 = code;
15161         code2 = swap_condition (code);
15162         code3 = unsigned_condition (code);
15163
15164         switch (code)
15165           {
15166           case LT: case GT: case LTU: case GTU:
15167             break;
15168
15169           case LE:   code1 = LT;  code2 = GT;  break;
15170           case GE:   code1 = GT;  code2 = LT;  break;
15171           case LEU:  code1 = LTU; code2 = GTU; break;
15172           case GEU:  code1 = GTU; code2 = LTU; break;
15173
15174           case EQ:   code1 = UNKNOWN; code2 = NE;  break;
15175           case NE:   code2 = UNKNOWN; break;
15176
15177           default:
15178             gcc_unreachable ();
15179           }
15180
15181         /*
15182          * a < b =>
15183          *    if (hi(a) < hi(b)) goto true;
15184          *    if (hi(a) > hi(b)) goto false;
15185          *    if (lo(a) < lo(b)) goto true;
15186          *  false:
15187          */
15188
15189         ix86_compare_op0 = hi[0];
15190         ix86_compare_op1 = hi[1];
15191
15192         if (code1 != UNKNOWN)
15193           ix86_expand_branch (code1, label);
15194         if (code2 != UNKNOWN)
15195           ix86_expand_branch (code2, label2);
15196
15197         ix86_compare_op0 = lo[0];
15198         ix86_compare_op1 = lo[1];
15199         ix86_expand_branch (code3, label);
15200
15201         if (code2 != UNKNOWN)
15202           emit_label (label2);
15203         return;
15204       }
15205
15206     default:
15207       /* If we have already emitted a compare insn, go straight to simple.
15208          ix86_expand_compare won't emit anything if ix86_compare_emitted
15209          is non NULL.  */
15210       gcc_assert (GET_MODE_CLASS (GET_MODE (ix86_compare_op0)) == MODE_CC);
15211       goto simple;
15212     }
15213 }
15214
15215 /* Split branch based on floating point condition.  */
15216 void
15217 ix86_split_fp_branch (enum rtx_code code, rtx op1, rtx op2,
15218                       rtx target1, rtx target2, rtx tmp, rtx pushed)
15219 {
15220   rtx condition;
15221   rtx i;
15222
15223   if (target2 != pc_rtx)
15224     {
15225       rtx tmp = target2;
15226       code = reverse_condition_maybe_unordered (code);
15227       target2 = target1;
15228       target1 = tmp;
15229     }
15230
15231   condition = ix86_expand_fp_compare (code, op1, op2,
15232                                       tmp);
15233
15234   /* Remove pushed operand from stack.  */
15235   if (pushed)
15236     ix86_free_from_memory (GET_MODE (pushed));
15237
15238   i = emit_jump_insn (gen_rtx_SET
15239                       (VOIDmode, pc_rtx,
15240                        gen_rtx_IF_THEN_ELSE (VOIDmode,
15241                                              condition, target1, target2)));
15242   if (split_branch_probability >= 0)
15243     add_reg_note (i, REG_BR_PROB, GEN_INT (split_branch_probability));
15244 }
15245
15246 void
15247 ix86_expand_setcc (enum rtx_code code, rtx dest)
15248 {
15249   rtx ret;
15250
15251   gcc_assert (GET_MODE (dest) == QImode);
15252
15253   ret = ix86_expand_compare (code);
15254   PUT_MODE (ret, QImode);
15255   emit_insn (gen_rtx_SET (VOIDmode, dest, ret));
15256 }
15257
15258 /* Expand comparison setting or clearing carry flag.  Return true when
15259    successful and set pop for the operation.  */
15260 static bool
15261 ix86_expand_carry_flag_compare (enum rtx_code code, rtx op0, rtx op1, rtx *pop)
15262 {
15263   enum machine_mode mode =
15264     GET_MODE (op0) != VOIDmode ? GET_MODE (op0) : GET_MODE (op1);
15265
15266   /* Do not handle DImode compares that go through special path.  */
15267   if (mode == (TARGET_64BIT ? TImode : DImode))
15268     return false;
15269
15270   if (SCALAR_FLOAT_MODE_P (mode))
15271     {
15272       rtx compare_op, compare_seq;
15273
15274       gcc_assert (!DECIMAL_FLOAT_MODE_P (mode));
15275
15276       /* Shortcut:  following common codes never translate
15277          into carry flag compares.  */
15278       if (code == EQ || code == NE || code == UNEQ || code == LTGT
15279           || code == ORDERED || code == UNORDERED)
15280         return false;
15281
15282       /* These comparisons require zero flag; swap operands so they won't.  */
15283       if ((code == GT || code == UNLE || code == LE || code == UNGT)
15284           && !TARGET_IEEE_FP)
15285         {
15286           rtx tmp = op0;
15287           op0 = op1;
15288           op1 = tmp;
15289           code = swap_condition (code);
15290         }
15291
15292       /* Try to expand the comparison and verify that we end up with
15293          carry flag based comparison.  This fails to be true only when
15294          we decide to expand comparison using arithmetic that is not
15295          too common scenario.  */
15296       start_sequence ();
15297       compare_op = ix86_expand_fp_compare (code, op0, op1, NULL_RTX);
15298       compare_seq = get_insns ();
15299       end_sequence ();
15300
15301       if (GET_MODE (XEXP (compare_op, 0)) == CCFPmode
15302           || GET_MODE (XEXP (compare_op, 0)) == CCFPUmode)
15303         code = ix86_fp_compare_code_to_integer (GET_CODE (compare_op));
15304       else
15305         code = GET_CODE (compare_op);
15306
15307       if (code != LTU && code != GEU)
15308         return false;
15309
15310       emit_insn (compare_seq);
15311       *pop = compare_op;
15312       return true;
15313     }
15314
15315   if (!INTEGRAL_MODE_P (mode))
15316     return false;
15317
15318   switch (code)
15319     {
15320     case LTU:
15321     case GEU:
15322       break;
15323
15324     /* Convert a==0 into (unsigned)a<1.  */
15325     case EQ:
15326     case NE:
15327       if (op1 != const0_rtx)
15328         return false;
15329       op1 = const1_rtx;
15330       code = (code == EQ ? LTU : GEU);
15331       break;
15332
15333     /* Convert a>b into b<a or a>=b-1.  */
15334     case GTU:
15335     case LEU:
15336       if (CONST_INT_P (op1))
15337         {
15338           op1 = gen_int_mode (INTVAL (op1) + 1, GET_MODE (op0));
15339           /* Bail out on overflow.  We still can swap operands but that
15340              would force loading of the constant into register.  */
15341           if (op1 == const0_rtx
15342               || !x86_64_immediate_operand (op1, GET_MODE (op1)))
15343             return false;
15344           code = (code == GTU ? GEU : LTU);
15345         }
15346       else
15347         {
15348           rtx tmp = op1;
15349           op1 = op0;
15350           op0 = tmp;
15351           code = (code == GTU ? LTU : GEU);
15352         }
15353       break;
15354
15355     /* Convert a>=0 into (unsigned)a<0x80000000.  */
15356     case LT:
15357     case GE:
15358       if (mode == DImode || op1 != const0_rtx)
15359         return false;
15360       op1 = gen_int_mode (1 << (GET_MODE_BITSIZE (mode) - 1), mode);
15361       code = (code == LT ? GEU : LTU);
15362       break;
15363     case LE:
15364     case GT:
15365       if (mode == DImode || op1 != constm1_rtx)
15366         return false;
15367       op1 = gen_int_mode (1 << (GET_MODE_BITSIZE (mode) - 1), mode);
15368       code = (code == LE ? GEU : LTU);
15369       break;
15370
15371     default:
15372       return false;
15373     }
15374   /* Swapping operands may cause constant to appear as first operand.  */
15375   if (!nonimmediate_operand (op0, VOIDmode))
15376     {
15377       if (!can_create_pseudo_p ())
15378         return false;
15379       op0 = force_reg (mode, op0);
15380     }
15381   ix86_compare_op0 = op0;
15382   ix86_compare_op1 = op1;
15383   *pop = ix86_expand_compare (code);
15384   gcc_assert (GET_CODE (*pop) == LTU || GET_CODE (*pop) == GEU);
15385   return true;
15386 }
15387
15388 int
15389 ix86_expand_int_movcc (rtx operands[])
15390 {
15391   enum rtx_code code = GET_CODE (operands[1]), compare_code;
15392   rtx compare_seq, compare_op;
15393   enum machine_mode mode = GET_MODE (operands[0]);
15394   bool sign_bit_compare_p = false;;
15395
15396   start_sequence ();
15397   ix86_compare_op0 = XEXP (operands[1], 0);
15398   ix86_compare_op1 = XEXP (operands[1], 1);
15399   compare_op = ix86_expand_compare (code);
15400   compare_seq = get_insns ();
15401   end_sequence ();
15402
15403   compare_code = GET_CODE (compare_op);
15404
15405   if ((ix86_compare_op1 == const0_rtx && (code == GE || code == LT))
15406       || (ix86_compare_op1 == constm1_rtx && (code == GT || code == LE)))
15407     sign_bit_compare_p = true;
15408
15409   /* Don't attempt mode expansion here -- if we had to expand 5 or 6
15410      HImode insns, we'd be swallowed in word prefix ops.  */
15411
15412   if ((mode != HImode || TARGET_FAST_PREFIX)
15413       && (mode != (TARGET_64BIT ? TImode : DImode))
15414       && CONST_INT_P (operands[2])
15415       && CONST_INT_P (operands[3]))
15416     {
15417       rtx out = operands[0];
15418       HOST_WIDE_INT ct = INTVAL (operands[2]);
15419       HOST_WIDE_INT cf = INTVAL (operands[3]);
15420       HOST_WIDE_INT diff;
15421
15422       diff = ct - cf;
15423       /*  Sign bit compares are better done using shifts than we do by using
15424           sbb.  */
15425       if (sign_bit_compare_p
15426           || ix86_expand_carry_flag_compare (code, ix86_compare_op0,
15427                                              ix86_compare_op1, &compare_op))
15428         {
15429           /* Detect overlap between destination and compare sources.  */
15430           rtx tmp = out;
15431
15432           if (!sign_bit_compare_p)
15433             {
15434               rtx flags;
15435               rtx (*insn)(rtx, rtx, rtx);
15436               bool fpcmp = false;
15437
15438               compare_code = GET_CODE (compare_op);
15439
15440               flags = XEXP (compare_op, 0);
15441
15442               if (GET_MODE (flags) == CCFPmode
15443                   || GET_MODE (flags) == CCFPUmode)
15444                 {
15445                   fpcmp = true;
15446                   compare_code
15447                     = ix86_fp_compare_code_to_integer (compare_code);
15448                 }
15449
15450               /* To simplify rest of code, restrict to the GEU case.  */
15451               if (compare_code == LTU)
15452                 {
15453                   HOST_WIDE_INT tmp = ct;
15454                   ct = cf;
15455                   cf = tmp;
15456                   compare_code = reverse_condition (compare_code);
15457                   code = reverse_condition (code);
15458                 }
15459               else
15460                 {
15461                   if (fpcmp)
15462                     PUT_CODE (compare_op,
15463                               reverse_condition_maybe_unordered
15464                                 (GET_CODE (compare_op)));
15465                   else
15466                     PUT_CODE (compare_op,
15467                               reverse_condition (GET_CODE (compare_op)));
15468                 }
15469               diff = ct - cf;
15470
15471               if (reg_overlap_mentioned_p (out, ix86_compare_op0)
15472                   || reg_overlap_mentioned_p (out, ix86_compare_op1))
15473                 tmp = gen_reg_rtx (mode);
15474
15475               if (mode == DImode)
15476                 insn = gen_x86_movdicc_0_m1;
15477               else
15478                 insn = gen_x86_movsicc_0_m1;
15479
15480               emit_insn (insn (tmp, flags, compare_op));
15481             }
15482           else
15483             {
15484               if (code == GT || code == GE)
15485                 code = reverse_condition (code);
15486               else
15487                 {
15488                   HOST_WIDE_INT tmp = ct;
15489                   ct = cf;
15490                   cf = tmp;
15491                   diff = ct - cf;
15492                 }
15493               tmp = emit_store_flag (tmp, code, ix86_compare_op0,
15494                                      ix86_compare_op1, VOIDmode, 0, -1);
15495             }
15496
15497           if (diff == 1)
15498             {
15499               /*
15500                * cmpl op0,op1
15501                * sbbl dest,dest
15502                * [addl dest, ct]
15503                *
15504                * Size 5 - 8.
15505                */
15506               if (ct)
15507                 tmp = expand_simple_binop (mode, PLUS,
15508                                            tmp, GEN_INT (ct),
15509                                            copy_rtx (tmp), 1, OPTAB_DIRECT);
15510             }
15511           else if (cf == -1)
15512             {
15513               /*
15514                * cmpl op0,op1
15515                * sbbl dest,dest
15516                * orl $ct, dest
15517                *
15518                * Size 8.
15519                */
15520               tmp = expand_simple_binop (mode, IOR,
15521                                          tmp, GEN_INT (ct),
15522                                          copy_rtx (tmp), 1, OPTAB_DIRECT);
15523             }
15524           else if (diff == -1 && ct)
15525             {
15526               /*
15527                * cmpl op0,op1
15528                * sbbl dest,dest
15529                * notl dest
15530                * [addl dest, cf]
15531                *
15532                * Size 8 - 11.
15533                */
15534               tmp = expand_simple_unop (mode, NOT, tmp, copy_rtx (tmp), 1);
15535               if (cf)
15536                 tmp = expand_simple_binop (mode, PLUS,
15537                                            copy_rtx (tmp), GEN_INT (cf),
15538                                            copy_rtx (tmp), 1, OPTAB_DIRECT);
15539             }
15540           else
15541             {
15542               /*
15543                * cmpl op0,op1
15544                * sbbl dest,dest
15545                * [notl dest]
15546                * andl cf - ct, dest
15547                * [addl dest, ct]
15548                *
15549                * Size 8 - 11.
15550                */
15551
15552               if (cf == 0)
15553                 {
15554                   cf = ct;
15555                   ct = 0;
15556                   tmp = expand_simple_unop (mode, NOT, tmp, copy_rtx (tmp), 1);
15557                 }
15558
15559               tmp = expand_simple_binop (mode, AND,
15560                                          copy_rtx (tmp),
15561                                          gen_int_mode (cf - ct, mode),
15562                                          copy_rtx (tmp), 1, OPTAB_DIRECT);
15563               if (ct)
15564                 tmp = expand_simple_binop (mode, PLUS,
15565                                            copy_rtx (tmp), GEN_INT (ct),
15566                                            copy_rtx (tmp), 1, OPTAB_DIRECT);
15567             }
15568
15569           if (!rtx_equal_p (tmp, out))
15570             emit_move_insn (copy_rtx (out), copy_rtx (tmp));
15571
15572           return 1; /* DONE */
15573         }
15574
15575       if (diff < 0)
15576         {
15577           enum machine_mode cmp_mode = GET_MODE (ix86_compare_op0);
15578
15579           HOST_WIDE_INT tmp;
15580           tmp = ct, ct = cf, cf = tmp;
15581           diff = -diff;
15582
15583           if (SCALAR_FLOAT_MODE_P (cmp_mode))
15584             {
15585               gcc_assert (!DECIMAL_FLOAT_MODE_P (cmp_mode));
15586
15587               /* We may be reversing unordered compare to normal compare, that
15588                  is not valid in general (we may convert non-trapping condition
15589                  to trapping one), however on i386 we currently emit all
15590                  comparisons unordered.  */
15591               compare_code = reverse_condition_maybe_unordered (compare_code);
15592               code = reverse_condition_maybe_unordered (code);
15593             }
15594           else
15595             {
15596               compare_code = reverse_condition (compare_code);
15597               code = reverse_condition (code);
15598             }
15599         }
15600
15601       compare_code = UNKNOWN;
15602       if (GET_MODE_CLASS (GET_MODE (ix86_compare_op0)) == MODE_INT
15603           && CONST_INT_P (ix86_compare_op1))
15604         {
15605           if (ix86_compare_op1 == const0_rtx
15606               && (code == LT || code == GE))
15607             compare_code = code;
15608           else if (ix86_compare_op1 == constm1_rtx)
15609             {
15610               if (code == LE)
15611                 compare_code = LT;
15612               else if (code == GT)
15613                 compare_code = GE;
15614             }
15615         }
15616
15617       /* Optimize dest = (op0 < 0) ? -1 : cf.  */
15618       if (compare_code != UNKNOWN
15619           && GET_MODE (ix86_compare_op0) == GET_MODE (out)
15620           && (cf == -1 || ct == -1))
15621         {
15622           /* If lea code below could be used, only optimize
15623              if it results in a 2 insn sequence.  */
15624
15625           if (! (diff == 1 || diff == 2 || diff == 4 || diff == 8
15626                  || diff == 3 || diff == 5 || diff == 9)
15627               || (compare_code == LT && ct == -1)
15628               || (compare_code == GE && cf == -1))
15629             {
15630               /*
15631                * notl op1       (if necessary)
15632                * sarl $31, op1
15633                * orl cf, op1
15634                */
15635               if (ct != -1)
15636                 {
15637                   cf = ct;
15638                   ct = -1;
15639                   code = reverse_condition (code);
15640                 }
15641
15642               out = emit_store_flag (out, code, ix86_compare_op0,
15643                                      ix86_compare_op1, VOIDmode, 0, -1);
15644
15645               out = expand_simple_binop (mode, IOR,
15646                                          out, GEN_INT (cf),
15647                                          out, 1, OPTAB_DIRECT);
15648               if (out != operands[0])
15649                 emit_move_insn (operands[0], out);
15650
15651               return 1; /* DONE */
15652             }
15653         }
15654
15655
15656       if ((diff == 1 || diff == 2 || diff == 4 || diff == 8
15657            || diff == 3 || diff == 5 || diff == 9)
15658           && ((mode != QImode && mode != HImode) || !TARGET_PARTIAL_REG_STALL)
15659           && (mode != DImode
15660               || x86_64_immediate_operand (GEN_INT (cf), VOIDmode)))
15661         {
15662           /*
15663            * xorl dest,dest
15664            * cmpl op1,op2
15665            * setcc dest
15666            * lea cf(dest*(ct-cf)),dest
15667            *
15668            * Size 14.
15669            *
15670            * This also catches the degenerate setcc-only case.
15671            */
15672
15673           rtx tmp;
15674           int nops;
15675
15676           out = emit_store_flag (out, code, ix86_compare_op0,
15677                                  ix86_compare_op1, VOIDmode, 0, 1);
15678
15679           nops = 0;
15680           /* On x86_64 the lea instruction operates on Pmode, so we need
15681              to get arithmetics done in proper mode to match.  */
15682           if (diff == 1)
15683             tmp = copy_rtx (out);
15684           else
15685             {
15686               rtx out1;
15687               out1 = copy_rtx (out);
15688               tmp = gen_rtx_MULT (mode, out1, GEN_INT (diff & ~1));
15689               nops++;
15690               if (diff & 1)
15691                 {
15692                   tmp = gen_rtx_PLUS (mode, tmp, out1);
15693                   nops++;
15694                 }
15695             }
15696           if (cf != 0)
15697             {
15698               tmp = gen_rtx_PLUS (mode, tmp, GEN_INT (cf));
15699               nops++;
15700             }
15701           if (!rtx_equal_p (tmp, out))
15702             {
15703               if (nops == 1)
15704                 out = force_operand (tmp, copy_rtx (out));
15705               else
15706                 emit_insn (gen_rtx_SET (VOIDmode, copy_rtx (out), copy_rtx (tmp)));
15707             }
15708           if (!rtx_equal_p (out, operands[0]))
15709             emit_move_insn (operands[0], copy_rtx (out));
15710
15711           return 1; /* DONE */
15712         }
15713
15714       /*
15715        * General case:                  Jumpful:
15716        *   xorl dest,dest               cmpl op1, op2
15717        *   cmpl op1, op2                movl ct, dest
15718        *   setcc dest                   jcc 1f
15719        *   decl dest                    movl cf, dest
15720        *   andl (cf-ct),dest            1:
15721        *   addl ct,dest
15722        *
15723        * Size 20.                       Size 14.
15724        *
15725        * This is reasonably steep, but branch mispredict costs are
15726        * high on modern cpus, so consider failing only if optimizing
15727        * for space.
15728        */
15729
15730       if ((!TARGET_CMOVE || (mode == QImode && TARGET_PARTIAL_REG_STALL))
15731           && BRANCH_COST (optimize_insn_for_speed_p (),
15732                           false) >= 2)
15733         {
15734           if (cf == 0)
15735             {
15736               enum machine_mode cmp_mode = GET_MODE (ix86_compare_op0);
15737
15738               cf = ct;
15739               ct = 0;
15740
15741               if (SCALAR_FLOAT_MODE_P (cmp_mode))
15742                 {
15743                   gcc_assert (!DECIMAL_FLOAT_MODE_P (cmp_mode));
15744
15745                   /* We may be reversing unordered compare to normal compare,
15746                      that is not valid in general (we may convert non-trapping
15747                      condition to trapping one), however on i386 we currently
15748                      emit all comparisons unordered.  */
15749                   code = reverse_condition_maybe_unordered (code);
15750                 }
15751               else
15752                 {
15753                   code = reverse_condition (code);
15754                   if (compare_code != UNKNOWN)
15755                     compare_code = reverse_condition (compare_code);
15756                 }
15757             }
15758
15759           if (compare_code != UNKNOWN)
15760             {
15761               /* notl op1       (if needed)
15762                  sarl $31, op1
15763                  andl (cf-ct), op1
15764                  addl ct, op1
15765
15766                  For x < 0 (resp. x <= -1) there will be no notl,
15767                  so if possible swap the constants to get rid of the
15768                  complement.
15769                  True/false will be -1/0 while code below (store flag
15770                  followed by decrement) is 0/-1, so the constants need
15771                  to be exchanged once more.  */
15772
15773               if (compare_code == GE || !cf)
15774                 {
15775                   code = reverse_condition (code);
15776                   compare_code = LT;
15777                 }
15778               else
15779                 {
15780                   HOST_WIDE_INT tmp = cf;
15781                   cf = ct;
15782                   ct = tmp;
15783                 }
15784
15785               out = emit_store_flag (out, code, ix86_compare_op0,
15786                                      ix86_compare_op1, VOIDmode, 0, -1);
15787             }
15788           else
15789             {
15790               out = emit_store_flag (out, code, ix86_compare_op0,
15791                                      ix86_compare_op1, VOIDmode, 0, 1);
15792
15793               out = expand_simple_binop (mode, PLUS, copy_rtx (out), constm1_rtx,
15794                                          copy_rtx (out), 1, OPTAB_DIRECT);
15795             }
15796
15797           out = expand_simple_binop (mode, AND, copy_rtx (out),
15798                                      gen_int_mode (cf - ct, mode),
15799                                      copy_rtx (out), 1, OPTAB_DIRECT);
15800           if (ct)
15801             out = expand_simple_binop (mode, PLUS, copy_rtx (out), GEN_INT (ct),
15802                                        copy_rtx (out), 1, OPTAB_DIRECT);
15803           if (!rtx_equal_p (out, operands[0]))
15804             emit_move_insn (operands[0], copy_rtx (out));
15805
15806           return 1; /* DONE */
15807         }
15808     }
15809
15810   if (!TARGET_CMOVE || (mode == QImode && TARGET_PARTIAL_REG_STALL))
15811     {
15812       /* Try a few things more with specific constants and a variable.  */
15813
15814       optab op;
15815       rtx var, orig_out, out, tmp;
15816
15817       if (BRANCH_COST (optimize_insn_for_speed_p (), false) <= 2)
15818         return 0; /* FAIL */
15819
15820       /* If one of the two operands is an interesting constant, load a
15821          constant with the above and mask it in with a logical operation.  */
15822
15823       if (CONST_INT_P (operands[2]))
15824         {
15825           var = operands[3];
15826           if (INTVAL (operands[2]) == 0 && operands[3] != constm1_rtx)
15827             operands[3] = constm1_rtx, op = and_optab;
15828           else if (INTVAL (operands[2]) == -1 && operands[3] != const0_rtx)
15829             operands[3] = const0_rtx, op = ior_optab;
15830           else
15831             return 0; /* FAIL */
15832         }
15833       else if (CONST_INT_P (operands[3]))
15834         {
15835           var = operands[2];
15836           if (INTVAL (operands[3]) == 0 && operands[2] != constm1_rtx)
15837             operands[2] = constm1_rtx, op = and_optab;
15838           else if (INTVAL (operands[3]) == -1 && operands[3] != const0_rtx)
15839             operands[2] = const0_rtx, op = ior_optab;
15840           else
15841             return 0; /* FAIL */
15842         }
15843       else
15844         return 0; /* FAIL */
15845
15846       orig_out = operands[0];
15847       tmp = gen_reg_rtx (mode);
15848       operands[0] = tmp;
15849
15850       /* Recurse to get the constant loaded.  */
15851       if (ix86_expand_int_movcc (operands) == 0)
15852         return 0; /* FAIL */
15853
15854       /* Mask in the interesting variable.  */
15855       out = expand_binop (mode, op, var, tmp, orig_out, 0,
15856                           OPTAB_WIDEN);
15857       if (!rtx_equal_p (out, orig_out))
15858         emit_move_insn (copy_rtx (orig_out), copy_rtx (out));
15859
15860       return 1; /* DONE */
15861     }
15862
15863   /*
15864    * For comparison with above,
15865    *
15866    * movl cf,dest
15867    * movl ct,tmp
15868    * cmpl op1,op2
15869    * cmovcc tmp,dest
15870    *
15871    * Size 15.
15872    */
15873
15874   if (! nonimmediate_operand (operands[2], mode))
15875     operands[2] = force_reg (mode, operands[2]);
15876   if (! nonimmediate_operand (operands[3], mode))
15877     operands[3] = force_reg (mode, operands[3]);
15878
15879   if (! register_operand (operands[2], VOIDmode)
15880       && (mode == QImode
15881           || ! register_operand (operands[3], VOIDmode)))
15882     operands[2] = force_reg (mode, operands[2]);
15883
15884   if (mode == QImode
15885       && ! register_operand (operands[3], VOIDmode))
15886     operands[3] = force_reg (mode, operands[3]);
15887
15888   emit_insn (compare_seq);
15889   emit_insn (gen_rtx_SET (VOIDmode, operands[0],
15890                           gen_rtx_IF_THEN_ELSE (mode,
15891                                                 compare_op, operands[2],
15892                                                 operands[3])));
15893
15894   return 1; /* DONE */
15895 }
15896
15897 /* Swap, force into registers, or otherwise massage the two operands
15898    to an sse comparison with a mask result.  Thus we differ a bit from
15899    ix86_prepare_fp_compare_args which expects to produce a flags result.
15900
15901    The DEST operand exists to help determine whether to commute commutative
15902    operators.  The POP0/POP1 operands are updated in place.  The new
15903    comparison code is returned, or UNKNOWN if not implementable.  */
15904
15905 static enum rtx_code
15906 ix86_prepare_sse_fp_compare_args (rtx dest, enum rtx_code code,
15907                                   rtx *pop0, rtx *pop1)
15908 {
15909   rtx tmp;
15910
15911   switch (code)
15912     {
15913     case LTGT:
15914     case UNEQ:
15915       /* We have no LTGT as an operator.  We could implement it with
15916          NE & ORDERED, but this requires an extra temporary.  It's
15917          not clear that it's worth it.  */
15918       return UNKNOWN;
15919
15920     case LT:
15921     case LE:
15922     case UNGT:
15923     case UNGE:
15924       /* These are supported directly.  */
15925       break;
15926
15927     case EQ:
15928     case NE:
15929     case UNORDERED:
15930     case ORDERED:
15931       /* For commutative operators, try to canonicalize the destination
15932          operand to be first in the comparison - this helps reload to
15933          avoid extra moves.  */
15934       if (!dest || !rtx_equal_p (dest, *pop1))
15935         break;
15936       /* FALLTHRU */
15937
15938     case GE:
15939     case GT:
15940     case UNLE:
15941     case UNLT:
15942       /* These are not supported directly.  Swap the comparison operands
15943          to transform into something that is supported.  */
15944       tmp = *pop0;
15945       *pop0 = *pop1;
15946       *pop1 = tmp;
15947       code = swap_condition (code);
15948       break;
15949
15950     default:
15951       gcc_unreachable ();
15952     }
15953
15954   return code;
15955 }
15956
15957 /* Detect conditional moves that exactly match min/max operational
15958    semantics.  Note that this is IEEE safe, as long as we don't
15959    interchange the operands.
15960
15961    Returns FALSE if this conditional move doesn't match a MIN/MAX,
15962    and TRUE if the operation is successful and instructions are emitted.  */
15963
15964 static bool
15965 ix86_expand_sse_fp_minmax (rtx dest, enum rtx_code code, rtx cmp_op0,
15966                            rtx cmp_op1, rtx if_true, rtx if_false)
15967 {
15968   enum machine_mode mode;
15969   bool is_min;
15970   rtx tmp;
15971
15972   if (code == LT)
15973     ;
15974   else if (code == UNGE)
15975     {
15976       tmp = if_true;
15977       if_true = if_false;
15978       if_false = tmp;
15979     }
15980   else
15981     return false;
15982
15983   if (rtx_equal_p (cmp_op0, if_true) && rtx_equal_p (cmp_op1, if_false))
15984     is_min = true;
15985   else if (rtx_equal_p (cmp_op1, if_true) && rtx_equal_p (cmp_op0, if_false))
15986     is_min = false;
15987   else
15988     return false;
15989
15990   mode = GET_MODE (dest);
15991
15992   /* We want to check HONOR_NANS and HONOR_SIGNED_ZEROS here,
15993      but MODE may be a vector mode and thus not appropriate.  */
15994   if (!flag_finite_math_only || !flag_unsafe_math_optimizations)
15995     {
15996       int u = is_min ? UNSPEC_IEEE_MIN : UNSPEC_IEEE_MAX;
15997       rtvec v;
15998
15999       if_true = force_reg (mode, if_true);
16000       v = gen_rtvec (2, if_true, if_false);
16001       tmp = gen_rtx_UNSPEC (mode, v, u);
16002     }
16003   else
16004     {
16005       code = is_min ? SMIN : SMAX;
16006       tmp = gen_rtx_fmt_ee (code, mode, if_true, if_false);
16007     }
16008
16009   emit_insn (gen_rtx_SET (VOIDmode, dest, tmp));
16010   return true;
16011 }
16012
16013 /* Expand an sse vector comparison.  Return the register with the result.  */
16014
16015 static rtx
16016 ix86_expand_sse_cmp (rtx dest, enum rtx_code code, rtx cmp_op0, rtx cmp_op1,
16017                      rtx op_true, rtx op_false)
16018 {
16019   enum machine_mode mode = GET_MODE (dest);
16020   rtx x;
16021
16022   cmp_op0 = force_reg (mode, cmp_op0);
16023   if (!nonimmediate_operand (cmp_op1, mode))
16024     cmp_op1 = force_reg (mode, cmp_op1);
16025
16026   if (optimize
16027       || reg_overlap_mentioned_p (dest, op_true)
16028       || reg_overlap_mentioned_p (dest, op_false))
16029     dest = gen_reg_rtx (mode);
16030
16031   x = gen_rtx_fmt_ee (code, mode, cmp_op0, cmp_op1);
16032   emit_insn (gen_rtx_SET (VOIDmode, dest, x));
16033
16034   return dest;
16035 }
16036
16037 /* Expand DEST = CMP ? OP_TRUE : OP_FALSE into a sequence of logical
16038    operations.  This is used for both scalar and vector conditional moves.  */
16039
16040 static void
16041 ix86_expand_sse_movcc (rtx dest, rtx cmp, rtx op_true, rtx op_false)
16042 {
16043   enum machine_mode mode = GET_MODE (dest);
16044   rtx t2, t3, x;
16045
16046   if (op_false == CONST0_RTX (mode))
16047     {
16048       op_true = force_reg (mode, op_true);
16049       x = gen_rtx_AND (mode, cmp, op_true);
16050       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
16051     }
16052   else if (op_true == CONST0_RTX (mode))
16053     {
16054       op_false = force_reg (mode, op_false);
16055       x = gen_rtx_NOT (mode, cmp);
16056       x = gen_rtx_AND (mode, x, op_false);
16057       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
16058     }
16059   else if (TARGET_XOP)
16060     {
16061       rtx pcmov = gen_rtx_SET (mode, dest,
16062                                gen_rtx_IF_THEN_ELSE (mode, cmp,
16063                                                      op_true,
16064                                                      op_false));
16065       emit_insn (pcmov);
16066     }
16067   else
16068     {
16069       op_true = force_reg (mode, op_true);
16070       op_false = force_reg (mode, op_false);
16071
16072       t2 = gen_reg_rtx (mode);
16073       if (optimize)
16074         t3 = gen_reg_rtx (mode);
16075       else
16076         t3 = dest;
16077
16078       x = gen_rtx_AND (mode, op_true, cmp);
16079       emit_insn (gen_rtx_SET (VOIDmode, t2, x));
16080
16081       x = gen_rtx_NOT (mode, cmp);
16082       x = gen_rtx_AND (mode, x, op_false);
16083       emit_insn (gen_rtx_SET (VOIDmode, t3, x));
16084
16085       x = gen_rtx_IOR (mode, t3, t2);
16086       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
16087     }
16088 }
16089
16090 /* Expand a floating-point conditional move.  Return true if successful.  */
16091
16092 int
16093 ix86_expand_fp_movcc (rtx operands[])
16094 {
16095   enum machine_mode mode = GET_MODE (operands[0]);
16096   enum rtx_code code = GET_CODE (operands[1]);
16097   rtx tmp, compare_op;
16098
16099   ix86_compare_op0 = XEXP (operands[1], 0);
16100   ix86_compare_op1 = XEXP (operands[1], 1);
16101   if (TARGET_SSE_MATH && SSE_FLOAT_MODE_P (mode))
16102     {
16103       enum machine_mode cmode;
16104
16105       /* Since we've no cmove for sse registers, don't force bad register
16106          allocation just to gain access to it.  Deny movcc when the
16107          comparison mode doesn't match the move mode.  */
16108       cmode = GET_MODE (ix86_compare_op0);
16109       if (cmode == VOIDmode)
16110         cmode = GET_MODE (ix86_compare_op1);
16111       if (cmode != mode)
16112         return 0;
16113
16114       code = ix86_prepare_sse_fp_compare_args (operands[0], code,
16115                                                &ix86_compare_op0,
16116                                                &ix86_compare_op1);
16117       if (code == UNKNOWN)
16118         return 0;
16119
16120       if (ix86_expand_sse_fp_minmax (operands[0], code, ix86_compare_op0,
16121                                      ix86_compare_op1, operands[2],
16122                                      operands[3]))
16123         return 1;
16124
16125       tmp = ix86_expand_sse_cmp (operands[0], code, ix86_compare_op0,
16126                                  ix86_compare_op1, operands[2], operands[3]);
16127       ix86_expand_sse_movcc (operands[0], tmp, operands[2], operands[3]);
16128       return 1;
16129     }
16130
16131   /* The floating point conditional move instructions don't directly
16132      support conditions resulting from a signed integer comparison.  */
16133
16134   compare_op = ix86_expand_compare (code);
16135   if (!fcmov_comparison_operator (compare_op, VOIDmode))
16136     {
16137       tmp = gen_reg_rtx (QImode);
16138       ix86_expand_setcc (code, tmp);
16139       code = NE;
16140       ix86_compare_op0 = tmp;
16141       ix86_compare_op1 = const0_rtx;
16142       compare_op = ix86_expand_compare (code);
16143     }
16144
16145   emit_insn (gen_rtx_SET (VOIDmode, operands[0],
16146                           gen_rtx_IF_THEN_ELSE (mode, compare_op,
16147                                                 operands[2], operands[3])));
16148
16149   return 1;
16150 }
16151
16152 /* Expand a floating-point vector conditional move; a vcond operation
16153    rather than a movcc operation.  */
16154
16155 bool
16156 ix86_expand_fp_vcond (rtx operands[])
16157 {
16158   enum rtx_code code = GET_CODE (operands[3]);
16159   rtx cmp;
16160
16161   code = ix86_prepare_sse_fp_compare_args (operands[0], code,
16162                                            &operands[4], &operands[5]);
16163   if (code == UNKNOWN)
16164     return false;
16165
16166   if (ix86_expand_sse_fp_minmax (operands[0], code, operands[4],
16167                                  operands[5], operands[1], operands[2]))
16168     return true;
16169
16170   cmp = ix86_expand_sse_cmp (operands[0], code, operands[4], operands[5],
16171                              operands[1], operands[2]);
16172   ix86_expand_sse_movcc (operands[0], cmp, operands[1], operands[2]);
16173   return true;
16174 }
16175
16176 /* Expand a signed/unsigned integral vector conditional move.  */
16177
16178 bool
16179 ix86_expand_int_vcond (rtx operands[])
16180 {
16181   enum machine_mode mode = GET_MODE (operands[0]);
16182   enum rtx_code code = GET_CODE (operands[3]);
16183   bool negate = false;
16184   rtx x, cop0, cop1;
16185
16186   cop0 = operands[4];
16187   cop1 = operands[5];
16188
16189   /* XOP supports all of the comparisons on all vector int types.  */
16190   if (!TARGET_XOP)
16191     {
16192   /* Canonicalize the comparison to EQ, GT, GTU.  */
16193   switch (code)
16194     {
16195     case EQ:
16196     case GT:
16197     case GTU:
16198       break;
16199
16200     case NE:
16201     case LE:
16202     case LEU:
16203       code = reverse_condition (code);
16204       negate = true;
16205       break;
16206
16207     case GE:
16208     case GEU:
16209       code = reverse_condition (code);
16210       negate = true;
16211       /* FALLTHRU */
16212
16213     case LT:
16214     case LTU:
16215       code = swap_condition (code);
16216       x = cop0, cop0 = cop1, cop1 = x;
16217       break;
16218
16219     default:
16220       gcc_unreachable ();
16221     }
16222
16223   /* Only SSE4.1/SSE4.2 supports V2DImode.  */
16224   if (mode == V2DImode)
16225     {
16226       switch (code)
16227         {
16228         case EQ:
16229           /* SSE4.1 supports EQ.  */
16230           if (!TARGET_SSE4_1)
16231             return false;
16232           break;
16233
16234         case GT:
16235         case GTU:
16236           /* SSE4.2 supports GT/GTU.  */
16237           if (!TARGET_SSE4_2)
16238             return false;
16239           break;
16240
16241         default:
16242           gcc_unreachable ();
16243         }
16244     }
16245
16246   /* Unsigned parallel compare is not supported by the hardware.  Play some
16247      tricks to turn this into a signed comparison against 0.  */
16248   if (code == GTU)
16249     {
16250       cop0 = force_reg (mode, cop0);
16251
16252       switch (mode)
16253         {
16254         case V4SImode:
16255         case V2DImode:
16256           {
16257             rtx t1, t2, mask;
16258
16259             /* Perform a parallel modulo subtraction.  */
16260             t1 = gen_reg_rtx (mode);
16261             emit_insn ((mode == V4SImode
16262                         ? gen_subv4si3
16263                         : gen_subv2di3) (t1, cop0, cop1));
16264
16265             /* Extract the original sign bit of op0.  */
16266             mask = ix86_build_signbit_mask (GET_MODE_INNER (mode),
16267                                             true, false);
16268             t2 = gen_reg_rtx (mode);
16269             emit_insn ((mode == V4SImode
16270                         ? gen_andv4si3
16271                         : gen_andv2di3) (t2, cop0, mask));
16272
16273             /* XOR it back into the result of the subtraction.  This results
16274                in the sign bit set iff we saw unsigned underflow.  */
16275             x = gen_reg_rtx (mode);
16276             emit_insn ((mode == V4SImode
16277                         ? gen_xorv4si3
16278                         : gen_xorv2di3) (x, t1, t2));
16279
16280             code = GT;
16281           }
16282           break;
16283
16284         case V16QImode:
16285         case V8HImode:
16286           /* Perform a parallel unsigned saturating subtraction.  */
16287           x = gen_reg_rtx (mode);
16288           emit_insn (gen_rtx_SET (VOIDmode, x,
16289                                   gen_rtx_US_MINUS (mode, cop0, cop1)));
16290
16291           code = EQ;
16292           negate = !negate;
16293           break;
16294
16295         default:
16296           gcc_unreachable ();
16297         }
16298
16299       cop0 = x;
16300       cop1 = CONST0_RTX (mode);
16301     }
16302     }
16303
16304   x = ix86_expand_sse_cmp (operands[0], code, cop0, cop1,
16305                            operands[1+negate], operands[2-negate]);
16306
16307   ix86_expand_sse_movcc (operands[0], x, operands[1+negate],
16308                          operands[2-negate]);
16309   return true;
16310 }
16311
16312 /* Unpack OP[1] into the next wider integer vector type.  UNSIGNED_P is
16313    true if we should do zero extension, else sign extension.  HIGH_P is
16314    true if we want the N/2 high elements, else the low elements.  */
16315
16316 void
16317 ix86_expand_sse_unpack (rtx operands[2], bool unsigned_p, bool high_p)
16318 {
16319   enum machine_mode imode = GET_MODE (operands[1]);
16320   rtx (*unpack)(rtx, rtx, rtx);
16321   rtx se, dest;
16322
16323   switch (imode)
16324     {
16325     case V16QImode:
16326       if (high_p)
16327         unpack = gen_vec_interleave_highv16qi;
16328       else
16329         unpack = gen_vec_interleave_lowv16qi;
16330       break;
16331     case V8HImode:
16332       if (high_p)
16333         unpack = gen_vec_interleave_highv8hi;
16334       else
16335         unpack = gen_vec_interleave_lowv8hi;
16336       break;
16337     case V4SImode:
16338       if (high_p)
16339         unpack = gen_vec_interleave_highv4si;
16340       else
16341         unpack = gen_vec_interleave_lowv4si;
16342       break;
16343     default:
16344       gcc_unreachable ();
16345     }
16346
16347   dest = gen_lowpart (imode, operands[0]);
16348
16349   if (unsigned_p)
16350     se = force_reg (imode, CONST0_RTX (imode));
16351   else
16352     se = ix86_expand_sse_cmp (gen_reg_rtx (imode), GT, CONST0_RTX (imode),
16353                               operands[1], pc_rtx, pc_rtx);
16354
16355   emit_insn (unpack (dest, operands[1], se));
16356 }
16357
16358 /* This function performs the same task as ix86_expand_sse_unpack,
16359    but with SSE4.1 instructions.  */
16360
16361 void
16362 ix86_expand_sse4_unpack (rtx operands[2], bool unsigned_p, bool high_p)
16363 {
16364   enum machine_mode imode = GET_MODE (operands[1]);
16365   rtx (*unpack)(rtx, rtx);
16366   rtx src, dest;
16367
16368   switch (imode)
16369     {
16370     case V16QImode:
16371       if (unsigned_p)
16372         unpack = gen_sse4_1_zero_extendv8qiv8hi2;
16373       else
16374         unpack = gen_sse4_1_extendv8qiv8hi2;
16375       break;
16376     case V8HImode:
16377       if (unsigned_p)
16378         unpack = gen_sse4_1_zero_extendv4hiv4si2;
16379       else
16380         unpack = gen_sse4_1_extendv4hiv4si2;
16381       break;
16382     case V4SImode:
16383       if (unsigned_p)
16384         unpack = gen_sse4_1_zero_extendv2siv2di2;
16385       else
16386         unpack = gen_sse4_1_extendv2siv2di2;
16387       break;
16388     default:
16389       gcc_unreachable ();
16390     }
16391
16392   dest = operands[0];
16393   if (high_p)
16394     {
16395       /* Shift higher 8 bytes to lower 8 bytes.  */
16396       src = gen_reg_rtx (imode);
16397       emit_insn (gen_sse2_lshrv1ti3 (gen_lowpart (V1TImode, src),
16398                                      gen_lowpart (V1TImode, operands[1]),
16399                                      GEN_INT (64)));
16400     }
16401   else
16402     src = operands[1];
16403
16404   emit_insn (unpack (dest, src));
16405 }
16406
16407 /* Expand conditional increment or decrement using adb/sbb instructions.
16408    The default case using setcc followed by the conditional move can be
16409    done by generic code.  */
16410 int
16411 ix86_expand_int_addcc (rtx operands[])
16412 {
16413   enum rtx_code code = GET_CODE (operands[1]);
16414   rtx flags;
16415   rtx (*insn)(rtx, rtx, rtx, rtx, rtx);
16416   rtx compare_op;
16417   rtx val = const0_rtx;
16418   bool fpcmp = false;
16419   enum machine_mode mode;
16420
16421   ix86_compare_op0 = XEXP (operands[1], 0);
16422   ix86_compare_op1 = XEXP (operands[1], 1);
16423   if (operands[3] != const1_rtx
16424       && operands[3] != constm1_rtx)
16425     return 0;
16426   if (!ix86_expand_carry_flag_compare (code, ix86_compare_op0,
16427                                        ix86_compare_op1, &compare_op))
16428      return 0;
16429   code = GET_CODE (compare_op);
16430
16431   flags = XEXP (compare_op, 0);
16432
16433   if (GET_MODE (flags) == CCFPmode
16434       || GET_MODE (flags) == CCFPUmode)
16435     {
16436       fpcmp = true;
16437       code = ix86_fp_compare_code_to_integer (code);
16438     }
16439
16440   if (code != LTU)
16441     {
16442       val = constm1_rtx;
16443       if (fpcmp)
16444         PUT_CODE (compare_op,
16445                   reverse_condition_maybe_unordered
16446                     (GET_CODE (compare_op)));
16447       else
16448         PUT_CODE (compare_op, reverse_condition (GET_CODE (compare_op)));
16449     }
16450
16451   mode = GET_MODE (operands[0]);
16452
16453   /* Construct either adc or sbb insn.  */
16454   if ((code == LTU) == (operands[3] == constm1_rtx))
16455     {
16456       switch (mode)
16457         {
16458           case QImode:
16459             insn = gen_subqi3_carry;
16460             break;
16461           case HImode:
16462             insn = gen_subhi3_carry;
16463             break;
16464           case SImode:
16465             insn = gen_subsi3_carry;
16466             break;
16467           case DImode:
16468             insn = gen_subdi3_carry;
16469             break;
16470           default:
16471             gcc_unreachable ();
16472         }
16473     }
16474   else
16475     {
16476       switch (mode)
16477         {
16478           case QImode:
16479             insn = gen_addqi3_carry;
16480             break;
16481           case HImode:
16482             insn = gen_addhi3_carry;
16483             break;
16484           case SImode:
16485             insn = gen_addsi3_carry;
16486             break;
16487           case DImode:
16488             insn = gen_adddi3_carry;
16489             break;
16490           default:
16491             gcc_unreachable ();
16492         }
16493     }
16494   emit_insn (insn (operands[0], operands[2], val, flags, compare_op));
16495
16496   return 1; /* DONE */
16497 }
16498
16499
16500 /* Split operands 0 and 1 into SImode parts.  Similar to split_di, but
16501    works for floating pointer parameters and nonoffsetable memories.
16502    For pushes, it returns just stack offsets; the values will be saved
16503    in the right order.  Maximally three parts are generated.  */
16504
16505 static int
16506 ix86_split_to_parts (rtx operand, rtx *parts, enum machine_mode mode)
16507 {
16508   int size;
16509
16510   if (!TARGET_64BIT)
16511     size = mode==XFmode ? 3 : GET_MODE_SIZE (mode) / 4;
16512   else
16513     size = (GET_MODE_SIZE (mode) + 4) / 8;
16514
16515   gcc_assert (!REG_P (operand) || !MMX_REGNO_P (REGNO (operand)));
16516   gcc_assert (size >= 2 && size <= 4);
16517
16518   /* Optimize constant pool reference to immediates.  This is used by fp
16519      moves, that force all constants to memory to allow combining.  */
16520   if (MEM_P (operand) && MEM_READONLY_P (operand))
16521     {
16522       rtx tmp = maybe_get_pool_constant (operand);
16523       if (tmp)
16524         operand = tmp;
16525     }
16526
16527   if (MEM_P (operand) && !offsettable_memref_p (operand))
16528     {
16529       /* The only non-offsetable memories we handle are pushes.  */
16530       int ok = push_operand (operand, VOIDmode);
16531
16532       gcc_assert (ok);
16533
16534       operand = copy_rtx (operand);
16535       PUT_MODE (operand, Pmode);
16536       parts[0] = parts[1] = parts[2] = parts[3] = operand;
16537       return size;
16538     }
16539
16540   if (GET_CODE (operand) == CONST_VECTOR)
16541     {
16542       enum machine_mode imode = int_mode_for_mode (mode);
16543       /* Caution: if we looked through a constant pool memory above,
16544          the operand may actually have a different mode now.  That's
16545          ok, since we want to pun this all the way back to an integer.  */
16546       operand = simplify_subreg (imode, operand, GET_MODE (operand), 0);
16547       gcc_assert (operand != NULL);
16548       mode = imode;
16549     }
16550
16551   if (!TARGET_64BIT)
16552     {
16553       if (mode == DImode)
16554         split_di (&operand, 1, &parts[0], &parts[1]);
16555       else
16556         {
16557           int i;
16558
16559           if (REG_P (operand))
16560             {
16561               gcc_assert (reload_completed);
16562               for (i = 0; i < size; i++)
16563                 parts[i] = gen_rtx_REG (SImode, REGNO (operand) + i);
16564             }
16565           else if (offsettable_memref_p (operand))
16566             {
16567               operand = adjust_address (operand, SImode, 0);
16568               parts[0] = operand;
16569               for (i = 1; i < size; i++)
16570                 parts[i] = adjust_address (operand, SImode, 4 * i);
16571             }
16572           else if (GET_CODE (operand) == CONST_DOUBLE)
16573             {
16574               REAL_VALUE_TYPE r;
16575               long l[4];
16576
16577               REAL_VALUE_FROM_CONST_DOUBLE (r, operand);
16578               switch (mode)
16579                 {
16580                 case TFmode:
16581                   real_to_target (l, &r, mode);
16582                   parts[3] = gen_int_mode (l[3], SImode);
16583                   parts[2] = gen_int_mode (l[2], SImode);
16584                   break;
16585                 case XFmode:
16586                   REAL_VALUE_TO_TARGET_LONG_DOUBLE (r, l);
16587                   parts[2] = gen_int_mode (l[2], SImode);
16588                   break;
16589                 case DFmode:
16590                   REAL_VALUE_TO_TARGET_DOUBLE (r, l);
16591                   break;
16592                 default:
16593                   gcc_unreachable ();
16594                 }
16595               parts[1] = gen_int_mode (l[1], SImode);
16596               parts[0] = gen_int_mode (l[0], SImode);
16597             }
16598           else
16599             gcc_unreachable ();
16600         }
16601     }
16602   else
16603     {
16604       if (mode == TImode)
16605         split_ti (&operand, 1, &parts[0], &parts[1]);
16606       if (mode == XFmode || mode == TFmode)
16607         {
16608           enum machine_mode upper_mode = mode==XFmode ? SImode : DImode;
16609           if (REG_P (operand))
16610             {
16611               gcc_assert (reload_completed);
16612               parts[0] = gen_rtx_REG (DImode, REGNO (operand) + 0);
16613               parts[1] = gen_rtx_REG (upper_mode, REGNO (operand) + 1);
16614             }
16615           else if (offsettable_memref_p (operand))
16616             {
16617               operand = adjust_address (operand, DImode, 0);
16618               parts[0] = operand;
16619               parts[1] = adjust_address (operand, upper_mode, 8);
16620             }
16621           else if (GET_CODE (operand) == CONST_DOUBLE)
16622             {
16623               REAL_VALUE_TYPE r;
16624               long l[4];
16625
16626               REAL_VALUE_FROM_CONST_DOUBLE (r, operand);
16627               real_to_target (l, &r, mode);
16628
16629               /* Do not use shift by 32 to avoid warning on 32bit systems.  */
16630               if (HOST_BITS_PER_WIDE_INT >= 64)
16631                 parts[0]
16632                   = gen_int_mode
16633                       ((l[0] & (((HOST_WIDE_INT) 2 << 31) - 1))
16634                        + ((((HOST_WIDE_INT) l[1]) << 31) << 1),
16635                        DImode);
16636               else
16637                 parts[0] = immed_double_const (l[0], l[1], DImode);
16638
16639               if (upper_mode == SImode)
16640                 parts[1] = gen_int_mode (l[2], SImode);
16641               else if (HOST_BITS_PER_WIDE_INT >= 64)
16642                 parts[1]
16643                   = gen_int_mode
16644                       ((l[2] & (((HOST_WIDE_INT) 2 << 31) - 1))
16645                        + ((((HOST_WIDE_INT) l[3]) << 31) << 1),
16646                        DImode);
16647               else
16648                 parts[1] = immed_double_const (l[2], l[3], DImode);
16649             }
16650           else
16651             gcc_unreachable ();
16652         }
16653     }
16654
16655   return size;
16656 }
16657
16658 /* Emit insns to perform a move or push of DI, DF, XF, and TF values.
16659    Return false when normal moves are needed; true when all required
16660    insns have been emitted.  Operands 2-4 contain the input values
16661    int the correct order; operands 5-7 contain the output values.  */
16662
16663 void
16664 ix86_split_long_move (rtx operands[])
16665 {
16666   rtx part[2][4];
16667   int nparts, i, j;
16668   int push = 0;
16669   int collisions = 0;
16670   enum machine_mode mode = GET_MODE (operands[0]);
16671   bool collisionparts[4];
16672
16673   /* The DFmode expanders may ask us to move double.
16674      For 64bit target this is single move.  By hiding the fact
16675      here we simplify i386.md splitters.  */
16676   if (GET_MODE_SIZE (GET_MODE (operands[0])) == 8 && TARGET_64BIT)
16677     {
16678       /* Optimize constant pool reference to immediates.  This is used by
16679          fp moves, that force all constants to memory to allow combining.  */
16680
16681       if (MEM_P (operands[1])
16682           && GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF
16683           && CONSTANT_POOL_ADDRESS_P (XEXP (operands[1], 0)))
16684         operands[1] = get_pool_constant (XEXP (operands[1], 0));
16685       if (push_operand (operands[0], VOIDmode))
16686         {
16687           operands[0] = copy_rtx (operands[0]);
16688           PUT_MODE (operands[0], Pmode);
16689         }
16690       else
16691         operands[0] = gen_lowpart (DImode, operands[0]);
16692       operands[1] = gen_lowpart (DImode, operands[1]);
16693       emit_move_insn (operands[0], operands[1]);
16694       return;
16695     }
16696
16697   /* The only non-offsettable memory we handle is push.  */
16698   if (push_operand (operands[0], VOIDmode))
16699     push = 1;
16700   else
16701     gcc_assert (!MEM_P (operands[0])
16702                 || offsettable_memref_p (operands[0]));
16703
16704   nparts = ix86_split_to_parts (operands[1], part[1], GET_MODE (operands[0]));
16705   ix86_split_to_parts (operands[0], part[0], GET_MODE (operands[0]));
16706
16707   /* When emitting push, take care for source operands on the stack.  */
16708   if (push && MEM_P (operands[1])
16709       && reg_overlap_mentioned_p (stack_pointer_rtx, operands[1]))
16710     {
16711       rtx src_base = XEXP (part[1][nparts - 1], 0);
16712
16713       /* Compensate for the stack decrement by 4.  */
16714       if (!TARGET_64BIT && nparts == 3
16715           && mode == XFmode && TARGET_128BIT_LONG_DOUBLE)
16716         src_base = plus_constant (src_base, 4);
16717
16718       /* src_base refers to the stack pointer and is
16719          automatically decreased by emitted push.  */
16720       for (i = 0; i < nparts; i++)
16721         part[1][i] = change_address (part[1][i],
16722                                      GET_MODE (part[1][i]), src_base);
16723     }
16724
16725   /* We need to do copy in the right order in case an address register
16726      of the source overlaps the destination.  */
16727   if (REG_P (part[0][0]) && MEM_P (part[1][0]))
16728     {
16729       rtx tmp;
16730
16731       for (i = 0; i < nparts; i++)
16732         {
16733           collisionparts[i]
16734             = reg_overlap_mentioned_p (part[0][i], XEXP (part[1][0], 0));
16735           if (collisionparts[i])
16736             collisions++;
16737         }
16738
16739       /* Collision in the middle part can be handled by reordering.  */
16740       if (collisions == 1 && nparts == 3 && collisionparts [1])
16741         {
16742           tmp = part[0][1]; part[0][1] = part[0][2]; part[0][2] = tmp;
16743           tmp = part[1][1]; part[1][1] = part[1][2]; part[1][2] = tmp;
16744         }
16745       else if (collisions == 1
16746                && nparts == 4
16747                && (collisionparts [1] || collisionparts [2]))
16748         {
16749           if (collisionparts [1])
16750             {
16751               tmp = part[0][1]; part[0][1] = part[0][2]; part[0][2] = tmp;
16752               tmp = part[1][1]; part[1][1] = part[1][2]; part[1][2] = tmp;
16753             }
16754           else
16755             {
16756               tmp = part[0][2]; part[0][2] = part[0][3]; part[0][3] = tmp;
16757               tmp = part[1][2]; part[1][2] = part[1][3]; part[1][3] = tmp;
16758             }
16759         }
16760
16761       /* If there are more collisions, we can't handle it by reordering.
16762          Do an lea to the last part and use only one colliding move.  */
16763       else if (collisions > 1)
16764         {
16765           rtx base;
16766
16767           collisions = 1;
16768
16769           base = part[0][nparts - 1];
16770
16771           /* Handle the case when the last part isn't valid for lea.
16772              Happens in 64-bit mode storing the 12-byte XFmode.  */
16773           if (GET_MODE (base) != Pmode)
16774             base = gen_rtx_REG (Pmode, REGNO (base));
16775
16776           emit_insn (gen_rtx_SET (VOIDmode, base, XEXP (part[1][0], 0)));
16777           part[1][0] = replace_equiv_address (part[1][0], base);
16778           for (i = 1; i < nparts; i++)
16779             {
16780               tmp = plus_constant (base, UNITS_PER_WORD * i);
16781               part[1][i] = replace_equiv_address (part[1][i], tmp);
16782             }
16783         }
16784     }
16785
16786   if (push)
16787     {
16788       if (!TARGET_64BIT)
16789         {
16790           if (nparts == 3)
16791             {
16792               if (TARGET_128BIT_LONG_DOUBLE && mode == XFmode)
16793                 emit_insn (gen_addsi3 (stack_pointer_rtx,
16794                                        stack_pointer_rtx, GEN_INT (-4)));
16795               emit_move_insn (part[0][2], part[1][2]);
16796             }
16797           else if (nparts == 4)
16798             {
16799               emit_move_insn (part[0][3], part[1][3]);
16800               emit_move_insn (part[0][2], part[1][2]);
16801             }
16802         }
16803       else
16804         {
16805           /* In 64bit mode we don't have 32bit push available.  In case this is
16806              register, it is OK - we will just use larger counterpart.  We also
16807              retype memory - these comes from attempt to avoid REX prefix on
16808              moving of second half of TFmode value.  */
16809           if (GET_MODE (part[1][1]) == SImode)
16810             {
16811               switch (GET_CODE (part[1][1]))
16812                 {
16813                 case MEM:
16814                   part[1][1] = adjust_address (part[1][1], DImode, 0);
16815                   break;
16816
16817                 case REG:
16818                   part[1][1] = gen_rtx_REG (DImode, REGNO (part[1][1]));
16819                   break;
16820
16821                 default:
16822                   gcc_unreachable ();
16823                 }
16824
16825               if (GET_MODE (part[1][0]) == SImode)
16826                 part[1][0] = part[1][1];
16827             }
16828         }
16829       emit_move_insn (part[0][1], part[1][1]);
16830       emit_move_insn (part[0][0], part[1][0]);
16831       return;
16832     }
16833
16834   /* Choose correct order to not overwrite the source before it is copied.  */
16835   if ((REG_P (part[0][0])
16836        && REG_P (part[1][1])
16837        && (REGNO (part[0][0]) == REGNO (part[1][1])
16838            || (nparts == 3
16839                && REGNO (part[0][0]) == REGNO (part[1][2]))
16840            || (nparts == 4
16841                && REGNO (part[0][0]) == REGNO (part[1][3]))))
16842       || (collisions > 0
16843           && reg_overlap_mentioned_p (part[0][0], XEXP (part[1][0], 0))))
16844     {
16845       for (i = 0, j = nparts - 1; i < nparts; i++, j--)
16846         {
16847           operands[2 + i] = part[0][j];
16848           operands[6 + i] = part[1][j];
16849         }
16850     }
16851   else
16852     {
16853       for (i = 0; i < nparts; i++)
16854         {
16855           operands[2 + i] = part[0][i];
16856           operands[6 + i] = part[1][i];
16857         }
16858     }
16859
16860   /* If optimizing for size, attempt to locally unCSE nonzero constants.  */
16861   if (optimize_insn_for_size_p ())
16862     {
16863       for (j = 0; j < nparts - 1; j++)
16864         if (CONST_INT_P (operands[6 + j])
16865             && operands[6 + j] != const0_rtx
16866             && REG_P (operands[2 + j]))
16867           for (i = j; i < nparts - 1; i++)
16868             if (CONST_INT_P (operands[7 + i])
16869                 && INTVAL (operands[7 + i]) == INTVAL (operands[6 + j]))
16870               operands[7 + i] = operands[2 + j];
16871     }
16872
16873   for (i = 0; i < nparts; i++)
16874     emit_move_insn (operands[2 + i], operands[6 + i]);
16875
16876   return;
16877 }
16878
16879 /* Helper function of ix86_split_ashl used to generate an SImode/DImode
16880    left shift by a constant, either using a single shift or
16881    a sequence of add instructions.  */
16882
16883 static void
16884 ix86_expand_ashl_const (rtx operand, int count, enum machine_mode mode)
16885 {
16886   if (count == 1)
16887     {
16888       emit_insn ((mode == DImode
16889                   ? gen_addsi3
16890                   : gen_adddi3) (operand, operand, operand));
16891     }
16892   else if (!optimize_insn_for_size_p ()
16893            && count * ix86_cost->add <= ix86_cost->shift_const)
16894     {
16895       int i;
16896       for (i=0; i<count; i++)
16897         {
16898           emit_insn ((mode == DImode
16899                       ? gen_addsi3
16900                       : gen_adddi3) (operand, operand, operand));
16901         }
16902     }
16903   else
16904     emit_insn ((mode == DImode
16905                 ? gen_ashlsi3
16906                 : gen_ashldi3) (operand, operand, GEN_INT (count)));
16907 }
16908
16909 void
16910 ix86_split_ashl (rtx *operands, rtx scratch, enum machine_mode mode)
16911 {
16912   rtx low[2], high[2];
16913   int count;
16914   const int single_width = mode == DImode ? 32 : 64;
16915
16916   if (CONST_INT_P (operands[2]))
16917     {
16918       (mode == DImode ? split_di : split_ti) (operands, 2, low, high);
16919       count = INTVAL (operands[2]) & (single_width * 2 - 1);
16920
16921       if (count >= single_width)
16922         {
16923           emit_move_insn (high[0], low[1]);
16924           emit_move_insn (low[0], const0_rtx);
16925
16926           if (count > single_width)
16927             ix86_expand_ashl_const (high[0], count - single_width, mode);
16928         }
16929       else
16930         {
16931           if (!rtx_equal_p (operands[0], operands[1]))
16932             emit_move_insn (operands[0], operands[1]);
16933           emit_insn ((mode == DImode
16934                      ? gen_x86_shld
16935                      : gen_x86_64_shld) (high[0], low[0], GEN_INT (count)));
16936           ix86_expand_ashl_const (low[0], count, mode);
16937         }
16938       return;
16939     }
16940
16941   (mode == DImode ? split_di : split_ti) (operands, 1, low, high);
16942
16943   if (operands[1] == const1_rtx)
16944     {
16945       /* Assuming we've chosen a QImode capable registers, then 1 << N
16946          can be done with two 32/64-bit shifts, no branches, no cmoves.  */
16947       if (ANY_QI_REG_P (low[0]) && ANY_QI_REG_P (high[0]))
16948         {
16949           rtx s, d, flags = gen_rtx_REG (CCZmode, FLAGS_REG);
16950
16951           ix86_expand_clear (low[0]);
16952           ix86_expand_clear (high[0]);
16953           emit_insn (gen_testqi_ccz_1 (operands[2], GEN_INT (single_width)));
16954
16955           d = gen_lowpart (QImode, low[0]);
16956           d = gen_rtx_STRICT_LOW_PART (VOIDmode, d);
16957           s = gen_rtx_EQ (QImode, flags, const0_rtx);
16958           emit_insn (gen_rtx_SET (VOIDmode, d, s));
16959
16960           d = gen_lowpart (QImode, high[0]);
16961           d = gen_rtx_STRICT_LOW_PART (VOIDmode, d);
16962           s = gen_rtx_NE (QImode, flags, const0_rtx);
16963           emit_insn (gen_rtx_SET (VOIDmode, d, s));
16964         }
16965
16966       /* Otherwise, we can get the same results by manually performing
16967          a bit extract operation on bit 5/6, and then performing the two
16968          shifts.  The two methods of getting 0/1 into low/high are exactly
16969          the same size.  Avoiding the shift in the bit extract case helps
16970          pentium4 a bit; no one else seems to care much either way.  */
16971       else
16972         {
16973           rtx x;
16974
16975           if (TARGET_PARTIAL_REG_STALL && !optimize_insn_for_size_p ())
16976             x = gen_rtx_ZERO_EXTEND (mode == DImode ? SImode : DImode, operands[2]);
16977           else
16978             x = gen_lowpart (mode == DImode ? SImode : DImode, operands[2]);
16979           emit_insn (gen_rtx_SET (VOIDmode, high[0], x));
16980
16981           emit_insn ((mode == DImode
16982                       ? gen_lshrsi3
16983                       : gen_lshrdi3) (high[0], high[0],
16984                                       GEN_INT (mode == DImode ? 5 : 6)));
16985           emit_insn ((mode == DImode
16986                       ? gen_andsi3
16987                       : gen_anddi3) (high[0], high[0], const1_rtx));
16988           emit_move_insn (low[0], high[0]);
16989           emit_insn ((mode == DImode
16990                       ? gen_xorsi3
16991                       : gen_xordi3) (low[0], low[0], const1_rtx));
16992         }
16993
16994       emit_insn ((mode == DImode
16995                     ? gen_ashlsi3
16996                     : gen_ashldi3) (low[0], low[0], operands[2]));
16997       emit_insn ((mode == DImode
16998                     ? gen_ashlsi3
16999                     : gen_ashldi3) (high[0], high[0], operands[2]));
17000       return;
17001     }
17002
17003   if (operands[1] == constm1_rtx)
17004     {
17005       /* For -1 << N, we can avoid the shld instruction, because we
17006          know that we're shifting 0...31/63 ones into a -1.  */
17007       emit_move_insn (low[0], constm1_rtx);
17008       if (optimize_insn_for_size_p ())
17009         emit_move_insn (high[0], low[0]);
17010       else
17011         emit_move_insn (high[0], constm1_rtx);
17012     }
17013   else
17014     {
17015       if (!rtx_equal_p (operands[0], operands[1]))
17016         emit_move_insn (operands[0], operands[1]);
17017
17018       (mode == DImode ? split_di : split_ti) (operands, 1, low, high);
17019       emit_insn ((mode == DImode
17020                   ? gen_x86_shld
17021                   : gen_x86_64_shld) (high[0], low[0], operands[2]));
17022     }
17023
17024   emit_insn ((mode == DImode ? gen_ashlsi3 : gen_ashldi3) (low[0], low[0], operands[2]));
17025
17026   if (TARGET_CMOVE && scratch)
17027     {
17028       ix86_expand_clear (scratch);
17029       emit_insn ((mode == DImode
17030                   ? gen_x86_shift_adj_1
17031                   : gen_x86_64_shift_adj_1) (high[0], low[0], operands[2],
17032                                              scratch));
17033     }
17034   else
17035     emit_insn ((mode == DImode
17036                 ? gen_x86_shift_adj_2
17037                 : gen_x86_64_shift_adj_2) (high[0], low[0], operands[2]));
17038 }
17039
17040 void
17041 ix86_split_ashr (rtx *operands, rtx scratch, enum machine_mode mode)
17042 {
17043   rtx low[2], high[2];
17044   int count;
17045   const int single_width = mode == DImode ? 32 : 64;
17046
17047   if (CONST_INT_P (operands[2]))
17048     {
17049       (mode == DImode ? split_di : split_ti) (operands, 2, low, high);
17050       count = INTVAL (operands[2]) & (single_width * 2 - 1);
17051
17052       if (count == single_width * 2 - 1)
17053         {
17054           emit_move_insn (high[0], high[1]);
17055           emit_insn ((mode == DImode
17056                       ? gen_ashrsi3
17057                       : gen_ashrdi3) (high[0], high[0],
17058                                       GEN_INT (single_width - 1)));
17059           emit_move_insn (low[0], high[0]);
17060
17061         }
17062       else if (count >= single_width)
17063         {
17064           emit_move_insn (low[0], high[1]);
17065           emit_move_insn (high[0], low[0]);
17066           emit_insn ((mode == DImode
17067                       ? gen_ashrsi3
17068                       : gen_ashrdi3) (high[0], high[0],
17069                                       GEN_INT (single_width - 1)));
17070           if (count > single_width)
17071             emit_insn ((mode == DImode
17072                         ? gen_ashrsi3
17073                         : gen_ashrdi3) (low[0], low[0],
17074                                         GEN_INT (count - single_width)));
17075         }
17076       else
17077         {
17078           if (!rtx_equal_p (operands[0], operands[1]))
17079             emit_move_insn (operands[0], operands[1]);
17080           emit_insn ((mode == DImode
17081                       ? gen_x86_shrd
17082                       : gen_x86_64_shrd) (low[0], high[0], GEN_INT (count)));
17083           emit_insn ((mode == DImode
17084                       ? gen_ashrsi3
17085                       : gen_ashrdi3) (high[0], high[0], GEN_INT (count)));
17086         }
17087     }
17088   else
17089     {
17090       if (!rtx_equal_p (operands[0], operands[1]))
17091         emit_move_insn (operands[0], operands[1]);
17092
17093       (mode == DImode ? split_di : split_ti) (operands, 1, low, high);
17094
17095       emit_insn ((mode == DImode
17096                   ? gen_x86_shrd
17097                   : gen_x86_64_shrd) (low[0], high[0], operands[2]));
17098       emit_insn ((mode == DImode
17099                   ? gen_ashrsi3
17100                   : gen_ashrdi3)  (high[0], high[0], operands[2]));
17101
17102       if (TARGET_CMOVE && scratch)
17103         {
17104           emit_move_insn (scratch, high[0]);
17105           emit_insn ((mode == DImode
17106                       ? gen_ashrsi3
17107                       : gen_ashrdi3) (scratch, scratch,
17108                                       GEN_INT (single_width - 1)));
17109           emit_insn ((mode == DImode
17110                       ? gen_x86_shift_adj_1
17111                       : gen_x86_64_shift_adj_1) (low[0], high[0], operands[2],
17112                                                  scratch));
17113         }
17114       else
17115         emit_insn ((mode == DImode
17116                     ? gen_x86_shift_adj_3
17117                     : gen_x86_64_shift_adj_3) (low[0], high[0], operands[2]));
17118     }
17119 }
17120
17121 void
17122 ix86_split_lshr (rtx *operands, rtx scratch, enum machine_mode mode)
17123 {
17124   rtx low[2], high[2];
17125   int count;
17126   const int single_width = mode == DImode ? 32 : 64;
17127
17128   if (CONST_INT_P (operands[2]))
17129     {
17130       (mode == DImode ? split_di : split_ti) (operands, 2, low, high);
17131       count = INTVAL (operands[2]) & (single_width * 2 - 1);
17132
17133       if (count >= single_width)
17134         {
17135           emit_move_insn (low[0], high[1]);
17136           ix86_expand_clear (high[0]);
17137
17138           if (count > single_width)
17139             emit_insn ((mode == DImode
17140                         ? gen_lshrsi3
17141                         : gen_lshrdi3) (low[0], low[0],
17142                                         GEN_INT (count - single_width)));
17143         }
17144       else
17145         {
17146           if (!rtx_equal_p (operands[0], operands[1]))
17147             emit_move_insn (operands[0], operands[1]);
17148           emit_insn ((mode == DImode
17149                       ? gen_x86_shrd
17150                       : gen_x86_64_shrd) (low[0], high[0], GEN_INT (count)));
17151           emit_insn ((mode == DImode
17152                       ? gen_lshrsi3
17153                       : gen_lshrdi3) (high[0], high[0], GEN_INT (count)));
17154         }
17155     }
17156   else
17157     {
17158       if (!rtx_equal_p (operands[0], operands[1]))
17159         emit_move_insn (operands[0], operands[1]);
17160
17161       (mode == DImode ? split_di : split_ti) (operands, 1, low, high);
17162
17163       emit_insn ((mode == DImode
17164                   ? gen_x86_shrd
17165                   : gen_x86_64_shrd) (low[0], high[0], operands[2]));
17166       emit_insn ((mode == DImode
17167                   ? gen_lshrsi3
17168                   : gen_lshrdi3) (high[0], high[0], operands[2]));
17169
17170       /* Heh.  By reversing the arguments, we can reuse this pattern.  */
17171       if (TARGET_CMOVE && scratch)
17172         {
17173           ix86_expand_clear (scratch);
17174           emit_insn ((mode == DImode
17175                       ? gen_x86_shift_adj_1
17176                       : gen_x86_64_shift_adj_1) (low[0], high[0], operands[2],
17177                                                  scratch));
17178         }
17179       else
17180         emit_insn ((mode == DImode
17181                     ? gen_x86_shift_adj_2
17182                     : gen_x86_64_shift_adj_2) (low[0], high[0], operands[2]));
17183     }
17184 }
17185
17186 /* Predict just emitted jump instruction to be taken with probability PROB.  */
17187 static void
17188 predict_jump (int prob)
17189 {
17190   rtx insn = get_last_insn ();
17191   gcc_assert (JUMP_P (insn));
17192   add_reg_note (insn, REG_BR_PROB, GEN_INT (prob));
17193 }
17194
17195 /* Helper function for the string operations below.  Dest VARIABLE whether
17196    it is aligned to VALUE bytes.  If true, jump to the label.  */
17197 static rtx
17198 ix86_expand_aligntest (rtx variable, int value, bool epilogue)
17199 {
17200   rtx label = gen_label_rtx ();
17201   rtx tmpcount = gen_reg_rtx (GET_MODE (variable));
17202   if (GET_MODE (variable) == DImode)
17203     emit_insn (gen_anddi3 (tmpcount, variable, GEN_INT (value)));
17204   else
17205     emit_insn (gen_andsi3 (tmpcount, variable, GEN_INT (value)));
17206   emit_cmp_and_jump_insns (tmpcount, const0_rtx, EQ, 0, GET_MODE (variable),
17207                            1, label);
17208   if (epilogue)
17209     predict_jump (REG_BR_PROB_BASE * 50 / 100);
17210   else
17211     predict_jump (REG_BR_PROB_BASE * 90 / 100);
17212   return label;
17213 }
17214
17215 /* Adjust COUNTER by the VALUE.  */
17216 static void
17217 ix86_adjust_counter (rtx countreg, HOST_WIDE_INT value)
17218 {
17219   if (GET_MODE (countreg) == DImode)
17220     emit_insn (gen_adddi3 (countreg, countreg, GEN_INT (-value)));
17221   else
17222     emit_insn (gen_addsi3 (countreg, countreg, GEN_INT (-value)));
17223 }
17224
17225 /* Zero extend possibly SImode EXP to Pmode register.  */
17226 rtx
17227 ix86_zero_extend_to_Pmode (rtx exp)
17228 {
17229   rtx r;
17230   if (GET_MODE (exp) == VOIDmode)
17231     return force_reg (Pmode, exp);
17232   if (GET_MODE (exp) == Pmode)
17233     return copy_to_mode_reg (Pmode, exp);
17234   r = gen_reg_rtx (Pmode);
17235   emit_insn (gen_zero_extendsidi2 (r, exp));
17236   return r;
17237 }
17238
17239 /* Divide COUNTREG by SCALE.  */
17240 static rtx
17241 scale_counter (rtx countreg, int scale)
17242 {
17243   rtx sc;
17244
17245   if (scale == 1)
17246     return countreg;
17247   if (CONST_INT_P (countreg))
17248     return GEN_INT (INTVAL (countreg) / scale);
17249   gcc_assert (REG_P (countreg));
17250
17251   sc = expand_simple_binop (GET_MODE (countreg), LSHIFTRT, countreg,
17252                             GEN_INT (exact_log2 (scale)),
17253                             NULL, 1, OPTAB_DIRECT);
17254   return sc;
17255 }
17256
17257 /* Return mode for the memcpy/memset loop counter.  Prefer SImode over
17258    DImode for constant loop counts.  */
17259
17260 static enum machine_mode
17261 counter_mode (rtx count_exp)
17262 {
17263   if (GET_MODE (count_exp) != VOIDmode)
17264     return GET_MODE (count_exp);
17265   if (!CONST_INT_P (count_exp))
17266     return Pmode;
17267   if (TARGET_64BIT && (INTVAL (count_exp) & ~0xffffffff))
17268     return DImode;
17269   return SImode;
17270 }
17271
17272 /* When SRCPTR is non-NULL, output simple loop to move memory
17273    pointer to SRCPTR to DESTPTR via chunks of MODE unrolled UNROLL times,
17274    overall size is COUNT specified in bytes.  When SRCPTR is NULL, output the
17275    equivalent loop to set memory by VALUE (supposed to be in MODE).
17276
17277    The size is rounded down to whole number of chunk size moved at once.
17278    SRCMEM and DESTMEM provide MEMrtx to feed proper aliasing info.  */
17279
17280
17281 static void
17282 expand_set_or_movmem_via_loop (rtx destmem, rtx srcmem,
17283                                rtx destptr, rtx srcptr, rtx value,
17284                                rtx count, enum machine_mode mode, int unroll,
17285                                int expected_size)
17286 {
17287   rtx out_label, top_label, iter, tmp;
17288   enum machine_mode iter_mode = counter_mode (count);
17289   rtx piece_size = GEN_INT (GET_MODE_SIZE (mode) * unroll);
17290   rtx piece_size_mask = GEN_INT (~((GET_MODE_SIZE (mode) * unroll) - 1));
17291   rtx size;
17292   rtx x_addr;
17293   rtx y_addr;
17294   int i;
17295
17296   top_label = gen_label_rtx ();
17297   out_label = gen_label_rtx ();
17298   iter = gen_reg_rtx (iter_mode);
17299
17300   size = expand_simple_binop (iter_mode, AND, count, piece_size_mask,
17301                               NULL, 1, OPTAB_DIRECT);
17302   /* Those two should combine.  */
17303   if (piece_size == const1_rtx)
17304     {
17305       emit_cmp_and_jump_insns (size, const0_rtx, EQ, NULL_RTX, iter_mode,
17306                                true, out_label);
17307       predict_jump (REG_BR_PROB_BASE * 10 / 100);
17308     }
17309   emit_move_insn (iter, const0_rtx);
17310
17311   emit_label (top_label);
17312
17313   tmp = convert_modes (Pmode, iter_mode, iter, true);
17314   x_addr = gen_rtx_PLUS (Pmode, destptr, tmp);
17315   destmem = change_address (destmem, mode, x_addr);
17316
17317   if (srcmem)
17318     {
17319       y_addr = gen_rtx_PLUS (Pmode, srcptr, copy_rtx (tmp));
17320       srcmem = change_address (srcmem, mode, y_addr);
17321
17322       /* When unrolling for chips that reorder memory reads and writes,
17323          we can save registers by using single temporary.
17324          Also using 4 temporaries is overkill in 32bit mode.  */
17325       if (!TARGET_64BIT && 0)
17326         {
17327           for (i = 0; i < unroll; i++)
17328             {
17329               if (i)
17330                 {
17331                   destmem =
17332                     adjust_address (copy_rtx (destmem), mode, GET_MODE_SIZE (mode));
17333                   srcmem =
17334                     adjust_address (copy_rtx (srcmem), mode, GET_MODE_SIZE (mode));
17335                 }
17336               emit_move_insn (destmem, srcmem);
17337             }
17338         }
17339       else
17340         {
17341           rtx tmpreg[4];
17342           gcc_assert (unroll <= 4);
17343           for (i = 0; i < unroll; i++)
17344             {
17345               tmpreg[i] = gen_reg_rtx (mode);
17346               if (i)
17347                 {
17348                   srcmem =
17349                     adjust_address (copy_rtx (srcmem), mode, GET_MODE_SIZE (mode));
17350                 }
17351               emit_move_insn (tmpreg[i], srcmem);
17352             }
17353           for (i = 0; i < unroll; i++)
17354             {
17355               if (i)
17356                 {
17357                   destmem =
17358                     adjust_address (copy_rtx (destmem), mode, GET_MODE_SIZE (mode));
17359                 }
17360               emit_move_insn (destmem, tmpreg[i]);
17361             }
17362         }
17363     }
17364   else
17365     for (i = 0; i < unroll; i++)
17366       {
17367         if (i)
17368           destmem =
17369             adjust_address (copy_rtx (destmem), mode, GET_MODE_SIZE (mode));
17370         emit_move_insn (destmem, value);
17371       }
17372
17373   tmp = expand_simple_binop (iter_mode, PLUS, iter, piece_size, iter,
17374                              true, OPTAB_LIB_WIDEN);
17375   if (tmp != iter)
17376     emit_move_insn (iter, tmp);
17377
17378   emit_cmp_and_jump_insns (iter, size, LT, NULL_RTX, iter_mode,
17379                            true, top_label);
17380   if (expected_size != -1)
17381     {
17382       expected_size /= GET_MODE_SIZE (mode) * unroll;
17383       if (expected_size == 0)
17384         predict_jump (0);
17385       else if (expected_size > REG_BR_PROB_BASE)
17386         predict_jump (REG_BR_PROB_BASE - 1);
17387       else
17388         predict_jump (REG_BR_PROB_BASE - (REG_BR_PROB_BASE + expected_size / 2) / expected_size);
17389     }
17390   else
17391     predict_jump (REG_BR_PROB_BASE * 80 / 100);
17392   iter = ix86_zero_extend_to_Pmode (iter);
17393   tmp = expand_simple_binop (Pmode, PLUS, destptr, iter, destptr,
17394                              true, OPTAB_LIB_WIDEN);
17395   if (tmp != destptr)
17396     emit_move_insn (destptr, tmp);
17397   if (srcptr)
17398     {
17399       tmp = expand_simple_binop (Pmode, PLUS, srcptr, iter, srcptr,
17400                                  true, OPTAB_LIB_WIDEN);
17401       if (tmp != srcptr)
17402         emit_move_insn (srcptr, tmp);
17403     }
17404   emit_label (out_label);
17405 }
17406
17407 /* Output "rep; mov" instruction.
17408    Arguments have same meaning as for previous function */
17409 static void
17410 expand_movmem_via_rep_mov (rtx destmem, rtx srcmem,
17411                            rtx destptr, rtx srcptr,
17412                            rtx count,
17413                            enum machine_mode mode)
17414 {
17415   rtx destexp;
17416   rtx srcexp;
17417   rtx countreg;
17418
17419   /* If the size is known, it is shorter to use rep movs.  */
17420   if (mode == QImode && CONST_INT_P (count)
17421       && !(INTVAL (count) & 3))
17422     mode = SImode;
17423
17424   if (destptr != XEXP (destmem, 0) || GET_MODE (destmem) != BLKmode)
17425     destmem = adjust_automodify_address_nv (destmem, BLKmode, destptr, 0);
17426   if (srcptr != XEXP (srcmem, 0) || GET_MODE (srcmem) != BLKmode)
17427     srcmem = adjust_automodify_address_nv (srcmem, BLKmode, srcptr, 0);
17428   countreg = ix86_zero_extend_to_Pmode (scale_counter (count, GET_MODE_SIZE (mode)));
17429   if (mode != QImode)
17430     {
17431       destexp = gen_rtx_ASHIFT (Pmode, countreg,
17432                                 GEN_INT (exact_log2 (GET_MODE_SIZE (mode))));
17433       destexp = gen_rtx_PLUS (Pmode, destexp, destptr);
17434       srcexp = gen_rtx_ASHIFT (Pmode, countreg,
17435                                GEN_INT (exact_log2 (GET_MODE_SIZE (mode))));
17436       srcexp = gen_rtx_PLUS (Pmode, srcexp, srcptr);
17437     }
17438   else
17439     {
17440       destexp = gen_rtx_PLUS (Pmode, destptr, countreg);
17441       srcexp = gen_rtx_PLUS (Pmode, srcptr, countreg);
17442     }
17443   if (CONST_INT_P (count))
17444     {
17445       count = GEN_INT (INTVAL (count)
17446                        & ~((HOST_WIDE_INT) GET_MODE_SIZE (mode) - 1));
17447       destmem = shallow_copy_rtx (destmem);
17448       srcmem = shallow_copy_rtx (srcmem);
17449       set_mem_size (destmem, count);
17450       set_mem_size (srcmem, count);
17451     }
17452   else
17453     {
17454       if (MEM_SIZE (destmem))
17455         set_mem_size (destmem, NULL_RTX);
17456       if (MEM_SIZE (srcmem))
17457         set_mem_size (srcmem, NULL_RTX);
17458     }
17459   emit_insn (gen_rep_mov (destptr, destmem, srcptr, srcmem, countreg,
17460                           destexp, srcexp));
17461 }
17462
17463 /* Output "rep; stos" instruction.
17464    Arguments have same meaning as for previous function */
17465 static void
17466 expand_setmem_via_rep_stos (rtx destmem, rtx destptr, rtx value,
17467                             rtx count, enum machine_mode mode,
17468                             rtx orig_value)
17469 {
17470   rtx destexp;
17471   rtx countreg;
17472
17473   if (destptr != XEXP (destmem, 0) || GET_MODE (destmem) != BLKmode)
17474     destmem = adjust_automodify_address_nv (destmem, BLKmode, destptr, 0);
17475   value = force_reg (mode, gen_lowpart (mode, value));
17476   countreg = ix86_zero_extend_to_Pmode (scale_counter (count, GET_MODE_SIZE (mode)));
17477   if (mode != QImode)
17478     {
17479       destexp = gen_rtx_ASHIFT (Pmode, countreg,
17480                                 GEN_INT (exact_log2 (GET_MODE_SIZE (mode))));
17481       destexp = gen_rtx_PLUS (Pmode, destexp, destptr);
17482     }
17483   else
17484     destexp = gen_rtx_PLUS (Pmode, destptr, countreg);
17485   if (orig_value == const0_rtx && CONST_INT_P (count))
17486     {
17487       count = GEN_INT (INTVAL (count)
17488                        & ~((HOST_WIDE_INT) GET_MODE_SIZE (mode) - 1));
17489       destmem = shallow_copy_rtx (destmem);
17490       set_mem_size (destmem, count);
17491     }
17492   else if (MEM_SIZE (destmem))
17493     set_mem_size (destmem, NULL_RTX);
17494   emit_insn (gen_rep_stos (destptr, countreg, destmem, value, destexp));
17495 }
17496
17497 static void
17498 emit_strmov (rtx destmem, rtx srcmem,
17499              rtx destptr, rtx srcptr, enum machine_mode mode, int offset)
17500 {
17501   rtx src = adjust_automodify_address_nv (srcmem, mode, srcptr, offset);
17502   rtx dest = adjust_automodify_address_nv (destmem, mode, destptr, offset);
17503   emit_insn (gen_strmov (destptr, dest, srcptr, src));
17504 }
17505
17506 /* Output code to copy at most count & (max_size - 1) bytes from SRC to DEST.  */
17507 static void
17508 expand_movmem_epilogue (rtx destmem, rtx srcmem,
17509                         rtx destptr, rtx srcptr, rtx count, int max_size)
17510 {
17511   rtx src, dest;
17512   if (CONST_INT_P (count))
17513     {
17514       HOST_WIDE_INT countval = INTVAL (count);
17515       int offset = 0;
17516
17517       if ((countval & 0x10) && max_size > 16)
17518         {
17519           if (TARGET_64BIT)
17520             {
17521               emit_strmov (destmem, srcmem, destptr, srcptr, DImode, offset);
17522               emit_strmov (destmem, srcmem, destptr, srcptr, DImode, offset + 8);
17523             }
17524           else
17525             gcc_unreachable ();
17526           offset += 16;
17527         }
17528       if ((countval & 0x08) && max_size > 8)
17529         {
17530           if (TARGET_64BIT)
17531             emit_strmov (destmem, srcmem, destptr, srcptr, DImode, offset);
17532           else
17533             {
17534               emit_strmov (destmem, srcmem, destptr, srcptr, SImode, offset);
17535               emit_strmov (destmem, srcmem, destptr, srcptr, SImode, offset + 4);
17536             }
17537           offset += 8;
17538         }
17539       if ((countval & 0x04) && max_size > 4)
17540         {
17541           emit_strmov (destmem, srcmem, destptr, srcptr, SImode, offset);
17542           offset += 4;
17543         }
17544       if ((countval & 0x02) && max_size > 2)
17545         {
17546           emit_strmov (destmem, srcmem, destptr, srcptr, HImode, offset);
17547           offset += 2;
17548         }
17549       if ((countval & 0x01) && max_size > 1)
17550         {
17551           emit_strmov (destmem, srcmem, destptr, srcptr, QImode, offset);
17552           offset += 1;
17553         }
17554       return;
17555     }
17556   if (max_size > 8)
17557     {
17558       count = expand_simple_binop (GET_MODE (count), AND, count, GEN_INT (max_size - 1),
17559                                     count, 1, OPTAB_DIRECT);
17560       expand_set_or_movmem_via_loop (destmem, srcmem, destptr, srcptr, NULL,
17561                                      count, QImode, 1, 4);
17562       return;
17563     }
17564
17565   /* When there are stringops, we can cheaply increase dest and src pointers.
17566      Otherwise we save code size by maintaining offset (zero is readily
17567      available from preceding rep operation) and using x86 addressing modes.
17568    */
17569   if (TARGET_SINGLE_STRINGOP)
17570     {
17571       if (max_size > 4)
17572         {
17573           rtx label = ix86_expand_aligntest (count, 4, true);
17574           src = change_address (srcmem, SImode, srcptr);
17575           dest = change_address (destmem, SImode, destptr);
17576           emit_insn (gen_strmov (destptr, dest, srcptr, src));
17577           emit_label (label);
17578           LABEL_NUSES (label) = 1;
17579         }
17580       if (max_size > 2)
17581         {
17582           rtx label = ix86_expand_aligntest (count, 2, true);
17583           src = change_address (srcmem, HImode, srcptr);
17584           dest = change_address (destmem, HImode, destptr);
17585           emit_insn (gen_strmov (destptr, dest, srcptr, src));
17586           emit_label (label);
17587           LABEL_NUSES (label) = 1;
17588         }
17589       if (max_size > 1)
17590         {
17591           rtx label = ix86_expand_aligntest (count, 1, true);
17592           src = change_address (srcmem, QImode, srcptr);
17593           dest = change_address (destmem, QImode, destptr);
17594           emit_insn (gen_strmov (destptr, dest, srcptr, src));
17595           emit_label (label);
17596           LABEL_NUSES (label) = 1;
17597         }
17598     }
17599   else
17600     {
17601       rtx offset = force_reg (Pmode, const0_rtx);
17602       rtx tmp;
17603
17604       if (max_size > 4)
17605         {
17606           rtx label = ix86_expand_aligntest (count, 4, true);
17607           src = change_address (srcmem, SImode, srcptr);
17608           dest = change_address (destmem, SImode, destptr);
17609           emit_move_insn (dest, src);
17610           tmp = expand_simple_binop (Pmode, PLUS, offset, GEN_INT (4), NULL,
17611                                      true, OPTAB_LIB_WIDEN);
17612           if (tmp != offset)
17613             emit_move_insn (offset, tmp);
17614           emit_label (label);
17615           LABEL_NUSES (label) = 1;
17616         }
17617       if (max_size > 2)
17618         {
17619           rtx label = ix86_expand_aligntest (count, 2, true);
17620           tmp = gen_rtx_PLUS (Pmode, srcptr, offset);
17621           src = change_address (srcmem, HImode, tmp);
17622           tmp = gen_rtx_PLUS (Pmode, destptr, offset);
17623           dest = change_address (destmem, HImode, tmp);
17624           emit_move_insn (dest, src);
17625           tmp = expand_simple_binop (Pmode, PLUS, offset, GEN_INT (2), tmp,
17626                                      true, OPTAB_LIB_WIDEN);
17627           if (tmp != offset)
17628             emit_move_insn (offset, tmp);
17629           emit_label (label);
17630           LABEL_NUSES (label) = 1;
17631         }
17632       if (max_size > 1)
17633         {
17634           rtx label = ix86_expand_aligntest (count, 1, true);
17635           tmp = gen_rtx_PLUS (Pmode, srcptr, offset);
17636           src = change_address (srcmem, QImode, tmp);
17637           tmp = gen_rtx_PLUS (Pmode, destptr, offset);
17638           dest = change_address (destmem, QImode, tmp);
17639           emit_move_insn (dest, src);
17640           emit_label (label);
17641           LABEL_NUSES (label) = 1;
17642         }
17643     }
17644 }
17645
17646 /* Output code to set at most count & (max_size - 1) bytes starting by DEST.  */
17647 static void
17648 expand_setmem_epilogue_via_loop (rtx destmem, rtx destptr, rtx value,
17649                                  rtx count, int max_size)
17650 {
17651   count =
17652     expand_simple_binop (counter_mode (count), AND, count,
17653                          GEN_INT (max_size - 1), count, 1, OPTAB_DIRECT);
17654   expand_set_or_movmem_via_loop (destmem, NULL, destptr, NULL,
17655                                  gen_lowpart (QImode, value), count, QImode,
17656                                  1, max_size / 2);
17657 }
17658
17659 /* Output code to set at most count & (max_size - 1) bytes starting by DEST.  */
17660 static void
17661 expand_setmem_epilogue (rtx destmem, rtx destptr, rtx value, rtx count, int max_size)
17662 {
17663   rtx dest;
17664
17665   if (CONST_INT_P (count))
17666     {
17667       HOST_WIDE_INT countval = INTVAL (count);
17668       int offset = 0;
17669
17670       if ((countval & 0x10) && max_size > 16)
17671         {
17672           if (TARGET_64BIT)
17673             {
17674               dest = adjust_automodify_address_nv (destmem, DImode, destptr, offset);
17675               emit_insn (gen_strset (destptr, dest, value));
17676               dest = adjust_automodify_address_nv (destmem, DImode, destptr, offset + 8);
17677               emit_insn (gen_strset (destptr, dest, value));
17678             }
17679           else
17680             gcc_unreachable ();
17681           offset += 16;
17682         }
17683       if ((countval & 0x08) && max_size > 8)
17684         {
17685           if (TARGET_64BIT)
17686             {
17687               dest = adjust_automodify_address_nv (destmem, DImode, destptr, offset);
17688               emit_insn (gen_strset (destptr, dest, value));
17689             }
17690           else
17691             {
17692               dest = adjust_automodify_address_nv (destmem, SImode, destptr, offset);
17693               emit_insn (gen_strset (destptr, dest, value));
17694               dest = adjust_automodify_address_nv (destmem, SImode, destptr, offset + 4);
17695               emit_insn (gen_strset (destptr, dest, value));
17696             }
17697           offset += 8;
17698         }
17699       if ((countval & 0x04) && max_size > 4)
17700         {
17701           dest = adjust_automodify_address_nv (destmem, SImode, destptr, offset);
17702           emit_insn (gen_strset (destptr, dest, gen_lowpart (SImode, value)));
17703           offset += 4;
17704         }
17705       if ((countval & 0x02) && max_size > 2)
17706         {
17707           dest = adjust_automodify_address_nv (destmem, HImode, destptr, offset);
17708           emit_insn (gen_strset (destptr, dest, gen_lowpart (HImode, value)));
17709           offset += 2;
17710         }
17711       if ((countval & 0x01) && max_size > 1)
17712         {
17713           dest = adjust_automodify_address_nv (destmem, QImode, destptr, offset);
17714           emit_insn (gen_strset (destptr, dest, gen_lowpart (QImode, value)));
17715           offset += 1;
17716         }
17717       return;
17718     }
17719   if (max_size > 32)
17720     {
17721       expand_setmem_epilogue_via_loop (destmem, destptr, value, count, max_size);
17722       return;
17723     }
17724   if (max_size > 16)
17725     {
17726       rtx label = ix86_expand_aligntest (count, 16, true);
17727       if (TARGET_64BIT)
17728         {
17729           dest = change_address (destmem, DImode, destptr);
17730           emit_insn (gen_strset (destptr, dest, value));
17731           emit_insn (gen_strset (destptr, dest, value));
17732         }
17733       else
17734         {
17735           dest = change_address (destmem, SImode, destptr);
17736           emit_insn (gen_strset (destptr, dest, value));
17737           emit_insn (gen_strset (destptr, dest, value));
17738           emit_insn (gen_strset (destptr, dest, value));
17739           emit_insn (gen_strset (destptr, dest, value));
17740         }
17741       emit_label (label);
17742       LABEL_NUSES (label) = 1;
17743     }
17744   if (max_size > 8)
17745     {
17746       rtx label = ix86_expand_aligntest (count, 8, true);
17747       if (TARGET_64BIT)
17748         {
17749           dest = change_address (destmem, DImode, destptr);
17750           emit_insn (gen_strset (destptr, dest, value));
17751         }
17752       else
17753         {
17754           dest = change_address (destmem, SImode, destptr);
17755           emit_insn (gen_strset (destptr, dest, value));
17756           emit_insn (gen_strset (destptr, dest, value));
17757         }
17758       emit_label (label);
17759       LABEL_NUSES (label) = 1;
17760     }
17761   if (max_size > 4)
17762     {
17763       rtx label = ix86_expand_aligntest (count, 4, true);
17764       dest = change_address (destmem, SImode, destptr);
17765       emit_insn (gen_strset (destptr, dest, gen_lowpart (SImode, value)));
17766       emit_label (label);
17767       LABEL_NUSES (label) = 1;
17768     }
17769   if (max_size > 2)
17770     {
17771       rtx label = ix86_expand_aligntest (count, 2, true);
17772       dest = change_address (destmem, HImode, destptr);
17773       emit_insn (gen_strset (destptr, dest, gen_lowpart (HImode, value)));
17774       emit_label (label);
17775       LABEL_NUSES (label) = 1;
17776     }
17777   if (max_size > 1)
17778     {
17779       rtx label = ix86_expand_aligntest (count, 1, true);
17780       dest = change_address (destmem, QImode, destptr);
17781       emit_insn (gen_strset (destptr, dest, gen_lowpart (QImode, value)));
17782       emit_label (label);
17783       LABEL_NUSES (label) = 1;
17784     }
17785 }
17786
17787 /* Copy enough from DEST to SRC to align DEST known to by aligned by ALIGN to
17788    DESIRED_ALIGNMENT.  */
17789 static void
17790 expand_movmem_prologue (rtx destmem, rtx srcmem,
17791                         rtx destptr, rtx srcptr, rtx count,
17792                         int align, int desired_alignment)
17793 {
17794   if (align <= 1 && desired_alignment > 1)
17795     {
17796       rtx label = ix86_expand_aligntest (destptr, 1, false);
17797       srcmem = change_address (srcmem, QImode, srcptr);
17798       destmem = change_address (destmem, QImode, destptr);
17799       emit_insn (gen_strmov (destptr, destmem, srcptr, srcmem));
17800       ix86_adjust_counter (count, 1);
17801       emit_label (label);
17802       LABEL_NUSES (label) = 1;
17803     }
17804   if (align <= 2 && desired_alignment > 2)
17805     {
17806       rtx label = ix86_expand_aligntest (destptr, 2, false);
17807       srcmem = change_address (srcmem, HImode, srcptr);
17808       destmem = change_address (destmem, HImode, destptr);
17809       emit_insn (gen_strmov (destptr, destmem, srcptr, srcmem));
17810       ix86_adjust_counter (count, 2);
17811       emit_label (label);
17812       LABEL_NUSES (label) = 1;
17813     }
17814   if (align <= 4 && desired_alignment > 4)
17815     {
17816       rtx label = ix86_expand_aligntest (destptr, 4, false);
17817       srcmem = change_address (srcmem, SImode, srcptr);
17818       destmem = change_address (destmem, SImode, destptr);
17819       emit_insn (gen_strmov (destptr, destmem, srcptr, srcmem));
17820       ix86_adjust_counter (count, 4);
17821       emit_label (label);
17822       LABEL_NUSES (label) = 1;
17823     }
17824   gcc_assert (desired_alignment <= 8);
17825 }
17826
17827 /* Copy enough from DST to SRC to align DST known to DESIRED_ALIGN.
17828    ALIGN_BYTES is how many bytes need to be copied.  */
17829 static rtx
17830 expand_constant_movmem_prologue (rtx dst, rtx *srcp, rtx destreg, rtx srcreg,
17831                                  int desired_align, int align_bytes)
17832 {
17833   rtx src = *srcp;
17834   rtx src_size, dst_size;
17835   int off = 0;
17836   int src_align_bytes = get_mem_align_offset (src, desired_align * BITS_PER_UNIT);
17837   if (src_align_bytes >= 0)
17838     src_align_bytes = desired_align - src_align_bytes;
17839   src_size = MEM_SIZE (src);
17840   dst_size = MEM_SIZE (dst);
17841   if (align_bytes & 1)
17842     {
17843       dst = adjust_automodify_address_nv (dst, QImode, destreg, 0);
17844       src = adjust_automodify_address_nv (src, QImode, srcreg, 0);
17845       off = 1;
17846       emit_insn (gen_strmov (destreg, dst, srcreg, src));
17847     }
17848   if (align_bytes & 2)
17849     {
17850       dst = adjust_automodify_address_nv (dst, HImode, destreg, off);
17851       src = adjust_automodify_address_nv (src, HImode, srcreg, off);
17852       if (MEM_ALIGN (dst) < 2 * BITS_PER_UNIT)
17853         set_mem_align (dst, 2 * BITS_PER_UNIT);
17854       if (src_align_bytes >= 0
17855           && (src_align_bytes & 1) == (align_bytes & 1)
17856           && MEM_ALIGN (src) < 2 * BITS_PER_UNIT)
17857         set_mem_align (src, 2 * BITS_PER_UNIT);
17858       off = 2;
17859       emit_insn (gen_strmov (destreg, dst, srcreg, src));
17860     }
17861   if (align_bytes & 4)
17862     {
17863       dst = adjust_automodify_address_nv (dst, SImode, destreg, off);
17864       src = adjust_automodify_address_nv (src, SImode, srcreg, off);
17865       if (MEM_ALIGN (dst) < 4 * BITS_PER_UNIT)
17866         set_mem_align (dst, 4 * BITS_PER_UNIT);
17867       if (src_align_bytes >= 0)
17868         {
17869           unsigned int src_align = 0;
17870           if ((src_align_bytes & 3) == (align_bytes & 3))
17871             src_align = 4;
17872           else if ((src_align_bytes & 1) == (align_bytes & 1))
17873             src_align = 2;
17874           if (MEM_ALIGN (src) < src_align * BITS_PER_UNIT)
17875             set_mem_align (src, src_align * BITS_PER_UNIT);
17876         }
17877       off = 4;
17878       emit_insn (gen_strmov (destreg, dst, srcreg, src));
17879     }
17880   dst = adjust_automodify_address_nv (dst, BLKmode, destreg, off);
17881   src = adjust_automodify_address_nv (src, BLKmode, srcreg, off);
17882   if (MEM_ALIGN (dst) < (unsigned int) desired_align * BITS_PER_UNIT)
17883     set_mem_align (dst, desired_align * BITS_PER_UNIT);
17884   if (src_align_bytes >= 0)
17885     {
17886       unsigned int src_align = 0;
17887       if ((src_align_bytes & 7) == (align_bytes & 7))
17888         src_align = 8;
17889       else if ((src_align_bytes & 3) == (align_bytes & 3))
17890         src_align = 4;
17891       else if ((src_align_bytes & 1) == (align_bytes & 1))
17892         src_align = 2;
17893       if (src_align > (unsigned int) desired_align)
17894         src_align = desired_align;
17895       if (MEM_ALIGN (src) < src_align * BITS_PER_UNIT)
17896         set_mem_align (src, src_align * BITS_PER_UNIT);
17897     }
17898   if (dst_size)
17899     set_mem_size (dst, GEN_INT (INTVAL (dst_size) - align_bytes));
17900   if (src_size)
17901     set_mem_size (dst, GEN_INT (INTVAL (src_size) - align_bytes));
17902   *srcp = src;
17903   return dst;
17904 }
17905
17906 /* Set enough from DEST to align DEST known to by aligned by ALIGN to
17907    DESIRED_ALIGNMENT.  */
17908 static void
17909 expand_setmem_prologue (rtx destmem, rtx destptr, rtx value, rtx count,
17910                         int align, int desired_alignment)
17911 {
17912   if (align <= 1 && desired_alignment > 1)
17913     {
17914       rtx label = ix86_expand_aligntest (destptr, 1, false);
17915       destmem = change_address (destmem, QImode, destptr);
17916       emit_insn (gen_strset (destptr, destmem, gen_lowpart (QImode, value)));
17917       ix86_adjust_counter (count, 1);
17918       emit_label (label);
17919       LABEL_NUSES (label) = 1;
17920     }
17921   if (align <= 2 && desired_alignment > 2)
17922     {
17923       rtx label = ix86_expand_aligntest (destptr, 2, false);
17924       destmem = change_address (destmem, HImode, destptr);
17925       emit_insn (gen_strset (destptr, destmem, gen_lowpart (HImode, value)));
17926       ix86_adjust_counter (count, 2);
17927       emit_label (label);
17928       LABEL_NUSES (label) = 1;
17929     }
17930   if (align <= 4 && desired_alignment > 4)
17931     {
17932       rtx label = ix86_expand_aligntest (destptr, 4, false);
17933       destmem = change_address (destmem, SImode, destptr);
17934       emit_insn (gen_strset (destptr, destmem, gen_lowpart (SImode, value)));
17935       ix86_adjust_counter (count, 4);
17936       emit_label (label);
17937       LABEL_NUSES (label) = 1;
17938     }
17939   gcc_assert (desired_alignment <= 8);
17940 }
17941
17942 /* Set enough from DST to align DST known to by aligned by ALIGN to
17943    DESIRED_ALIGN.  ALIGN_BYTES is how many bytes need to be stored.  */
17944 static rtx
17945 expand_constant_setmem_prologue (rtx dst, rtx destreg, rtx value,
17946                                  int desired_align, int align_bytes)
17947 {
17948   int off = 0;
17949   rtx dst_size = MEM_SIZE (dst);
17950   if (align_bytes & 1)
17951     {
17952       dst = adjust_automodify_address_nv (dst, QImode, destreg, 0);
17953       off = 1;
17954       emit_insn (gen_strset (destreg, dst,
17955                              gen_lowpart (QImode, value)));
17956     }
17957   if (align_bytes & 2)
17958     {
17959       dst = adjust_automodify_address_nv (dst, HImode, destreg, off);
17960       if (MEM_ALIGN (dst) < 2 * BITS_PER_UNIT)
17961         set_mem_align (dst, 2 * BITS_PER_UNIT);
17962       off = 2;
17963       emit_insn (gen_strset (destreg, dst,
17964                              gen_lowpart (HImode, value)));
17965     }
17966   if (align_bytes & 4)
17967     {
17968       dst = adjust_automodify_address_nv (dst, SImode, destreg, off);
17969       if (MEM_ALIGN (dst) < 4 * BITS_PER_UNIT)
17970         set_mem_align (dst, 4 * BITS_PER_UNIT);
17971       off = 4;
17972       emit_insn (gen_strset (destreg, dst,
17973                              gen_lowpart (SImode, value)));
17974     }
17975   dst = adjust_automodify_address_nv (dst, BLKmode, destreg, off);
17976   if (MEM_ALIGN (dst) < (unsigned int) desired_align * BITS_PER_UNIT)
17977     set_mem_align (dst, desired_align * BITS_PER_UNIT);
17978   if (dst_size)
17979     set_mem_size (dst, GEN_INT (INTVAL (dst_size) - align_bytes));
17980   return dst;
17981 }
17982
17983 /* Given COUNT and EXPECTED_SIZE, decide on codegen of string operation.  */
17984 static enum stringop_alg
17985 decide_alg (HOST_WIDE_INT count, HOST_WIDE_INT expected_size, bool memset,
17986             int *dynamic_check)
17987 {
17988   const struct stringop_algs * algs;
17989   bool optimize_for_speed;
17990   /* Algorithms using the rep prefix want at least edi and ecx;
17991      additionally, memset wants eax and memcpy wants esi.  Don't
17992      consider such algorithms if the user has appropriated those
17993      registers for their own purposes.  */
17994   bool rep_prefix_usable = !(fixed_regs[CX_REG] || fixed_regs[DI_REG]
17995                              || (memset
17996                                  ? fixed_regs[AX_REG] : fixed_regs[SI_REG]));
17997
17998 #define ALG_USABLE_P(alg) (rep_prefix_usable                    \
17999                            || (alg != rep_prefix_1_byte         \
18000                                && alg != rep_prefix_4_byte      \
18001                                && alg != rep_prefix_8_byte))
18002   const struct processor_costs *cost;
18003   
18004   /* Even if the string operation call is cold, we still might spend a lot
18005      of time processing large blocks.  */
18006   if (optimize_function_for_size_p (cfun)
18007       || (optimize_insn_for_size_p ()
18008           && expected_size != -1 && expected_size < 256))
18009     optimize_for_speed = false;
18010   else
18011     optimize_for_speed = true;
18012
18013   cost = optimize_for_speed ? ix86_cost : &ix86_size_cost;
18014
18015   *dynamic_check = -1;
18016   if (memset)
18017     algs = &cost->memset[TARGET_64BIT != 0];
18018   else
18019     algs = &cost->memcpy[TARGET_64BIT != 0];
18020   if (stringop_alg != no_stringop && ALG_USABLE_P (stringop_alg))
18021     return stringop_alg;
18022   /* rep; movq or rep; movl is the smallest variant.  */
18023   else if (!optimize_for_speed)
18024     {
18025       if (!count || (count & 3))
18026         return rep_prefix_usable ? rep_prefix_1_byte : loop_1_byte;
18027       else
18028         return rep_prefix_usable ? rep_prefix_4_byte : loop;
18029     }
18030   /* Very tiny blocks are best handled via the loop, REP is expensive to setup.
18031    */
18032   else if (expected_size != -1 && expected_size < 4)
18033     return loop_1_byte;
18034   else if (expected_size != -1)
18035     {
18036       unsigned int i;
18037       enum stringop_alg alg = libcall;
18038       for (i = 0; i < NAX_STRINGOP_ALGS; i++)
18039         {
18040           /* We get here if the algorithms that were not libcall-based
18041              were rep-prefix based and we are unable to use rep prefixes
18042              based on global register usage.  Break out of the loop and
18043              use the heuristic below.  */
18044           if (algs->size[i].max == 0)
18045             break;
18046           if (algs->size[i].max >= expected_size || algs->size[i].max == -1)
18047             {
18048               enum stringop_alg candidate = algs->size[i].alg;
18049
18050               if (candidate != libcall && ALG_USABLE_P (candidate))
18051                 alg = candidate;
18052               /* Honor TARGET_INLINE_ALL_STRINGOPS by picking
18053                  last non-libcall inline algorithm.  */
18054               if (TARGET_INLINE_ALL_STRINGOPS)
18055                 {
18056                   /* When the current size is best to be copied by a libcall,
18057                      but we are still forced to inline, run the heuristic below
18058                      that will pick code for medium sized blocks.  */
18059                   if (alg != libcall)
18060                     return alg;
18061                   break;
18062                 }
18063               else if (ALG_USABLE_P (candidate))
18064                 return candidate;
18065             }
18066         }
18067       gcc_assert (TARGET_INLINE_ALL_STRINGOPS || !rep_prefix_usable);
18068     }
18069   /* When asked to inline the call anyway, try to pick meaningful choice.
18070      We look for maximal size of block that is faster to copy by hand and
18071      take blocks of at most of that size guessing that average size will
18072      be roughly half of the block.
18073
18074      If this turns out to be bad, we might simply specify the preferred
18075      choice in ix86_costs.  */
18076   if ((TARGET_INLINE_ALL_STRINGOPS || TARGET_INLINE_STRINGOPS_DYNAMICALLY)
18077       && (algs->unknown_size == libcall || !ALG_USABLE_P (algs->unknown_size)))
18078     {
18079       int max = -1;
18080       enum stringop_alg alg;
18081       int i;
18082       bool any_alg_usable_p = true;
18083
18084       for (i = 0; i < NAX_STRINGOP_ALGS; i++)
18085         {
18086           enum stringop_alg candidate = algs->size[i].alg;
18087           any_alg_usable_p = any_alg_usable_p && ALG_USABLE_P (candidate);
18088
18089           if (candidate != libcall && candidate
18090               && ALG_USABLE_P (candidate))
18091               max = algs->size[i].max;
18092         }
18093       /* If there aren't any usable algorithms, then recursing on
18094          smaller sizes isn't going to find anything.  Just return the
18095          simple byte-at-a-time copy loop.  */
18096       if (!any_alg_usable_p)
18097         {
18098           /* Pick something reasonable.  */
18099           if (TARGET_INLINE_STRINGOPS_DYNAMICALLY)
18100             *dynamic_check = 128;
18101           return loop_1_byte;
18102         }
18103       if (max == -1)
18104         max = 4096;
18105       alg = decide_alg (count, max / 2, memset, dynamic_check);
18106       gcc_assert (*dynamic_check == -1);
18107       gcc_assert (alg != libcall);
18108       if (TARGET_INLINE_STRINGOPS_DYNAMICALLY)
18109         *dynamic_check = max;
18110       return alg;
18111     }
18112   return ALG_USABLE_P (algs->unknown_size) ? algs->unknown_size : libcall;
18113 #undef ALG_USABLE_P
18114 }
18115
18116 /* Decide on alignment.  We know that the operand is already aligned to ALIGN
18117    (ALIGN can be based on profile feedback and thus it is not 100% guaranteed).  */
18118 static int
18119 decide_alignment (int align,
18120                   enum stringop_alg alg,
18121                   int expected_size)
18122 {
18123   int desired_align = 0;
18124   switch (alg)
18125     {
18126       case no_stringop:
18127         gcc_unreachable ();
18128       case loop:
18129       case unrolled_loop:
18130         desired_align = GET_MODE_SIZE (Pmode);
18131         break;
18132       case rep_prefix_8_byte:
18133         desired_align = 8;
18134         break;
18135       case rep_prefix_4_byte:
18136         /* PentiumPro has special logic triggering for 8 byte aligned blocks.
18137            copying whole cacheline at once.  */
18138         if (TARGET_PENTIUMPRO)
18139           desired_align = 8;
18140         else
18141           desired_align = 4;
18142         break;
18143       case rep_prefix_1_byte:
18144         /* PentiumPro has special logic triggering for 8 byte aligned blocks.
18145            copying whole cacheline at once.  */
18146         if (TARGET_PENTIUMPRO)
18147           desired_align = 8;
18148         else
18149           desired_align = 1;
18150         break;
18151       case loop_1_byte:
18152         desired_align = 1;
18153         break;
18154       case libcall:
18155         return 0;
18156     }
18157
18158   if (optimize_size)
18159     desired_align = 1;
18160   if (desired_align < align)
18161     desired_align = align;
18162   if (expected_size != -1 && expected_size < 4)
18163     desired_align = align;
18164   return desired_align;
18165 }
18166
18167 /* Return the smallest power of 2 greater than VAL.  */
18168 static int
18169 smallest_pow2_greater_than (int val)
18170 {
18171   int ret = 1;
18172   while (ret <= val)
18173     ret <<= 1;
18174   return ret;
18175 }
18176
18177 /* Expand string move (memcpy) operation.  Use i386 string operations when
18178    profitable.  expand_setmem contains similar code.  The code depends upon
18179    architecture, block size and alignment, but always has the same
18180    overall structure:
18181
18182    1) Prologue guard: Conditional that jumps up to epilogues for small
18183       blocks that can be handled by epilogue alone.  This is faster but
18184       also needed for correctness, since prologue assume the block is larger
18185       than the desired alignment.
18186
18187       Optional dynamic check for size and libcall for large
18188       blocks is emitted here too, with -minline-stringops-dynamically.
18189
18190    2) Prologue: copy first few bytes in order to get destination aligned
18191       to DESIRED_ALIGN.  It is emitted only when ALIGN is less than
18192       DESIRED_ALIGN and and up to DESIRED_ALIGN - ALIGN bytes can be copied.
18193       We emit either a jump tree on power of two sized blocks, or a byte loop.
18194
18195    3) Main body: the copying loop itself, copying in SIZE_NEEDED chunks
18196       with specified algorithm.
18197
18198    4) Epilogue: code copying tail of the block that is too small to be
18199       handled by main body (or up to size guarded by prologue guard).  */
18200
18201 int
18202 ix86_expand_movmem (rtx dst, rtx src, rtx count_exp, rtx align_exp,
18203                     rtx expected_align_exp, rtx expected_size_exp)
18204 {
18205   rtx destreg;
18206   rtx srcreg;
18207   rtx label = NULL;
18208   rtx tmp;
18209   rtx jump_around_label = NULL;
18210   HOST_WIDE_INT align = 1;
18211   unsigned HOST_WIDE_INT count = 0;
18212   HOST_WIDE_INT expected_size = -1;
18213   int size_needed = 0, epilogue_size_needed;
18214   int desired_align = 0, align_bytes = 0;
18215   enum stringop_alg alg;
18216   int dynamic_check;
18217   bool need_zero_guard = false;
18218
18219   if (CONST_INT_P (align_exp))
18220     align = INTVAL (align_exp);
18221   /* i386 can do misaligned access on reasonably increased cost.  */
18222   if (CONST_INT_P (expected_align_exp)
18223       && INTVAL (expected_align_exp) > align)
18224     align = INTVAL (expected_align_exp);
18225   /* ALIGN is the minimum of destination and source alignment, but we care here
18226      just about destination alignment.  */
18227   else if (MEM_ALIGN (dst) > (unsigned HOST_WIDE_INT) align * BITS_PER_UNIT)
18228     align = MEM_ALIGN (dst) / BITS_PER_UNIT;
18229
18230   if (CONST_INT_P (count_exp))
18231     count = expected_size = INTVAL (count_exp);
18232   if (CONST_INT_P (expected_size_exp) && count == 0)
18233     expected_size = INTVAL (expected_size_exp);
18234
18235   /* Make sure we don't need to care about overflow later on.  */
18236   if (count > ((unsigned HOST_WIDE_INT) 1 << 30))
18237     return 0;
18238
18239   /* Step 0: Decide on preferred algorithm, desired alignment and
18240      size of chunks to be copied by main loop.  */
18241
18242   alg = decide_alg (count, expected_size, false, &dynamic_check);
18243   desired_align = decide_alignment (align, alg, expected_size);
18244
18245   if (!TARGET_ALIGN_STRINGOPS)
18246     align = desired_align;
18247
18248   if (alg == libcall)
18249     return 0;
18250   gcc_assert (alg != no_stringop);
18251   if (!count)
18252     count_exp = copy_to_mode_reg (GET_MODE (count_exp), count_exp);
18253   destreg = copy_to_mode_reg (Pmode, XEXP (dst, 0));
18254   srcreg = copy_to_mode_reg (Pmode, XEXP (src, 0));
18255   switch (alg)
18256     {
18257     case libcall:
18258     case no_stringop:
18259       gcc_unreachable ();
18260     case loop:
18261       need_zero_guard = true;
18262       size_needed = GET_MODE_SIZE (Pmode);
18263       break;
18264     case unrolled_loop:
18265       need_zero_guard = true;
18266       size_needed = GET_MODE_SIZE (Pmode) * (TARGET_64BIT ? 4 : 2);
18267       break;
18268     case rep_prefix_8_byte:
18269       size_needed = 8;
18270       break;
18271     case rep_prefix_4_byte:
18272       size_needed = 4;
18273       break;
18274     case rep_prefix_1_byte:
18275       size_needed = 1;
18276       break;
18277     case loop_1_byte:
18278       need_zero_guard = true;
18279       size_needed = 1;
18280       break;
18281     }
18282
18283   epilogue_size_needed = size_needed;
18284
18285   /* Step 1: Prologue guard.  */
18286
18287   /* Alignment code needs count to be in register.  */
18288   if (CONST_INT_P (count_exp) && desired_align > align)
18289     {
18290       if (INTVAL (count_exp) > desired_align
18291           && INTVAL (count_exp) > size_needed)
18292         {
18293           align_bytes
18294             = get_mem_align_offset (dst, desired_align * BITS_PER_UNIT);
18295           if (align_bytes <= 0)
18296             align_bytes = 0;
18297           else
18298             align_bytes = desired_align - align_bytes;
18299         }
18300       if (align_bytes == 0)
18301         count_exp = force_reg (counter_mode (count_exp), count_exp);
18302     }
18303   gcc_assert (desired_align >= 1 && align >= 1);
18304
18305   /* Ensure that alignment prologue won't copy past end of block.  */
18306   if (size_needed > 1 || (desired_align > 1 && desired_align > align))
18307     {
18308       epilogue_size_needed = MAX (size_needed - 1, desired_align - align);
18309       /* Epilogue always copies COUNT_EXP & EPILOGUE_SIZE_NEEDED bytes.
18310          Make sure it is power of 2.  */
18311       epilogue_size_needed = smallest_pow2_greater_than (epilogue_size_needed);
18312
18313       if (count)
18314         {
18315           if (count < (unsigned HOST_WIDE_INT)epilogue_size_needed)
18316             {
18317               /* If main algorithm works on QImode, no epilogue is needed.
18318                  For small sizes just don't align anything.  */
18319               if (size_needed == 1)
18320                 desired_align = align;
18321               else
18322                 goto epilogue;
18323             }
18324         }
18325       else
18326         {
18327           label = gen_label_rtx ();
18328           emit_cmp_and_jump_insns (count_exp,
18329                                    GEN_INT (epilogue_size_needed),
18330                                    LTU, 0, counter_mode (count_exp), 1, label);
18331           if (expected_size == -1 || expected_size < epilogue_size_needed)
18332             predict_jump (REG_BR_PROB_BASE * 60 / 100);
18333           else
18334             predict_jump (REG_BR_PROB_BASE * 20 / 100);
18335         }
18336     }
18337
18338   /* Emit code to decide on runtime whether library call or inline should be
18339      used.  */
18340   if (dynamic_check != -1)
18341     {
18342       if (CONST_INT_P (count_exp))
18343         {
18344           if (UINTVAL (count_exp) >= (unsigned HOST_WIDE_INT)dynamic_check)
18345             {
18346               emit_block_move_via_libcall (dst, src, count_exp, false);
18347               count_exp = const0_rtx;
18348               goto epilogue;
18349             }
18350         }
18351       else
18352         {
18353           rtx hot_label = gen_label_rtx ();
18354           jump_around_label = gen_label_rtx ();
18355           emit_cmp_and_jump_insns (count_exp, GEN_INT (dynamic_check - 1),
18356                                    LEU, 0, GET_MODE (count_exp), 1, hot_label);
18357           predict_jump (REG_BR_PROB_BASE * 90 / 100);
18358           emit_block_move_via_libcall (dst, src, count_exp, false);
18359           emit_jump (jump_around_label);
18360           emit_label (hot_label);
18361         }
18362     }
18363
18364   /* Step 2: Alignment prologue.  */
18365
18366   if (desired_align > align)
18367     {
18368       if (align_bytes == 0)
18369         {
18370           /* Except for the first move in epilogue, we no longer know
18371              constant offset in aliasing info.  It don't seems to worth
18372              the pain to maintain it for the first move, so throw away
18373              the info early.  */
18374           src = change_address (src, BLKmode, srcreg);
18375           dst = change_address (dst, BLKmode, destreg);
18376           expand_movmem_prologue (dst, src, destreg, srcreg, count_exp, align,
18377                                   desired_align);
18378         }
18379       else
18380         {
18381           /* If we know how many bytes need to be stored before dst is
18382              sufficiently aligned, maintain aliasing info accurately.  */
18383           dst = expand_constant_movmem_prologue (dst, &src, destreg, srcreg,
18384                                                  desired_align, align_bytes);
18385           count_exp = plus_constant (count_exp, -align_bytes);
18386           count -= align_bytes;
18387         }
18388       if (need_zero_guard
18389           && (count < (unsigned HOST_WIDE_INT) size_needed
18390               || (align_bytes == 0
18391                   && count < ((unsigned HOST_WIDE_INT) size_needed
18392                               + desired_align - align))))
18393         {
18394           /* It is possible that we copied enough so the main loop will not
18395              execute.  */
18396           gcc_assert (size_needed > 1);
18397           if (label == NULL_RTX)
18398             label = gen_label_rtx ();
18399           emit_cmp_and_jump_insns (count_exp,
18400                                    GEN_INT (size_needed),
18401                                    LTU, 0, counter_mode (count_exp), 1, label);
18402           if (expected_size == -1
18403               || expected_size < (desired_align - align) / 2 + size_needed)
18404             predict_jump (REG_BR_PROB_BASE * 20 / 100);
18405           else
18406             predict_jump (REG_BR_PROB_BASE * 60 / 100);
18407         }
18408     }
18409   if (label && size_needed == 1)
18410     {
18411       emit_label (label);
18412       LABEL_NUSES (label) = 1;
18413       label = NULL;
18414       epilogue_size_needed = 1;
18415     }
18416   else if (label == NULL_RTX)
18417     epilogue_size_needed = size_needed;
18418
18419   /* Step 3: Main loop.  */
18420
18421   switch (alg)
18422     {
18423     case libcall:
18424     case no_stringop:
18425       gcc_unreachable ();
18426     case loop_1_byte:
18427       expand_set_or_movmem_via_loop (dst, src, destreg, srcreg, NULL,
18428                                      count_exp, QImode, 1, expected_size);
18429       break;
18430     case loop:
18431       expand_set_or_movmem_via_loop (dst, src, destreg, srcreg, NULL,
18432                                      count_exp, Pmode, 1, expected_size);
18433       break;
18434     case unrolled_loop:
18435       /* Unroll only by factor of 2 in 32bit mode, since we don't have enough
18436          registers for 4 temporaries anyway.  */
18437       expand_set_or_movmem_via_loop (dst, src, destreg, srcreg, NULL,
18438                                      count_exp, Pmode, TARGET_64BIT ? 4 : 2,
18439                                      expected_size);
18440       break;
18441     case rep_prefix_8_byte:
18442       expand_movmem_via_rep_mov (dst, src, destreg, srcreg, count_exp,
18443                                  DImode);
18444       break;
18445     case rep_prefix_4_byte:
18446       expand_movmem_via_rep_mov (dst, src, destreg, srcreg, count_exp,
18447                                  SImode);
18448       break;
18449     case rep_prefix_1_byte:
18450       expand_movmem_via_rep_mov (dst, src, destreg, srcreg, count_exp,
18451                                  QImode);
18452       break;
18453     }
18454   /* Adjust properly the offset of src and dest memory for aliasing.  */
18455   if (CONST_INT_P (count_exp))
18456     {
18457       src = adjust_automodify_address_nv (src, BLKmode, srcreg,
18458                                           (count / size_needed) * size_needed);
18459       dst = adjust_automodify_address_nv (dst, BLKmode, destreg,
18460                                           (count / size_needed) * size_needed);
18461     }
18462   else
18463     {
18464       src = change_address (src, BLKmode, srcreg);
18465       dst = change_address (dst, BLKmode, destreg);
18466     }
18467
18468   /* Step 4: Epilogue to copy the remaining bytes.  */
18469  epilogue:
18470   if (label)
18471     {
18472       /* When the main loop is done, COUNT_EXP might hold original count,
18473          while we want to copy only COUNT_EXP & SIZE_NEEDED bytes.
18474          Epilogue code will actually copy COUNT_EXP & EPILOGUE_SIZE_NEEDED
18475          bytes. Compensate if needed.  */
18476
18477       if (size_needed < epilogue_size_needed)
18478         {
18479           tmp =
18480             expand_simple_binop (counter_mode (count_exp), AND, count_exp,
18481                                  GEN_INT (size_needed - 1), count_exp, 1,
18482                                  OPTAB_DIRECT);
18483           if (tmp != count_exp)
18484             emit_move_insn (count_exp, tmp);
18485         }
18486       emit_label (label);
18487       LABEL_NUSES (label) = 1;
18488     }
18489
18490   if (count_exp != const0_rtx && epilogue_size_needed > 1)
18491     expand_movmem_epilogue (dst, src, destreg, srcreg, count_exp,
18492                             epilogue_size_needed);
18493   if (jump_around_label)
18494     emit_label (jump_around_label);
18495   return 1;
18496 }
18497
18498 /* Helper function for memcpy.  For QImode value 0xXY produce
18499    0xXYXYXYXY of wide specified by MODE.  This is essentially
18500    a * 0x10101010, but we can do slightly better than
18501    synth_mult by unwinding the sequence by hand on CPUs with
18502    slow multiply.  */
18503 static rtx
18504 promote_duplicated_reg (enum machine_mode mode, rtx val)
18505 {
18506   enum machine_mode valmode = GET_MODE (val);
18507   rtx tmp;
18508   int nops = mode == DImode ? 3 : 2;
18509
18510   gcc_assert (mode == SImode || mode == DImode);
18511   if (val == const0_rtx)
18512     return copy_to_mode_reg (mode, const0_rtx);
18513   if (CONST_INT_P (val))
18514     {
18515       HOST_WIDE_INT v = INTVAL (val) & 255;
18516
18517       v |= v << 8;
18518       v |= v << 16;
18519       if (mode == DImode)
18520         v |= (v << 16) << 16;
18521       return copy_to_mode_reg (mode, gen_int_mode (v, mode));
18522     }
18523
18524   if (valmode == VOIDmode)
18525     valmode = QImode;
18526   if (valmode != QImode)
18527     val = gen_lowpart (QImode, val);
18528   if (mode == QImode)
18529     return val;
18530   if (!TARGET_PARTIAL_REG_STALL)
18531     nops--;
18532   if (ix86_cost->mult_init[mode == DImode ? 3 : 2]
18533       + ix86_cost->mult_bit * (mode == DImode ? 8 : 4)
18534       <= (ix86_cost->shift_const + ix86_cost->add) * nops
18535           + (COSTS_N_INSNS (TARGET_PARTIAL_REG_STALL == 0)))
18536     {
18537       rtx reg = convert_modes (mode, QImode, val, true);
18538       tmp = promote_duplicated_reg (mode, const1_rtx);
18539       return expand_simple_binop (mode, MULT, reg, tmp, NULL, 1,
18540                                   OPTAB_DIRECT);
18541     }
18542   else
18543     {
18544       rtx reg = convert_modes (mode, QImode, val, true);
18545
18546       if (!TARGET_PARTIAL_REG_STALL)
18547         if (mode == SImode)
18548           emit_insn (gen_movsi_insv_1 (reg, reg));
18549         else
18550           emit_insn (gen_movdi_insv_1_rex64 (reg, reg));
18551       else
18552         {
18553           tmp = expand_simple_binop (mode, ASHIFT, reg, GEN_INT (8),
18554                                      NULL, 1, OPTAB_DIRECT);
18555           reg =
18556             expand_simple_binop (mode, IOR, reg, tmp, reg, 1, OPTAB_DIRECT);
18557         }
18558       tmp = expand_simple_binop (mode, ASHIFT, reg, GEN_INT (16),
18559                                  NULL, 1, OPTAB_DIRECT);
18560       reg = expand_simple_binop (mode, IOR, reg, tmp, reg, 1, OPTAB_DIRECT);
18561       if (mode == SImode)
18562         return reg;
18563       tmp = expand_simple_binop (mode, ASHIFT, reg, GEN_INT (32),
18564                                  NULL, 1, OPTAB_DIRECT);
18565       reg = expand_simple_binop (mode, IOR, reg, tmp, reg, 1, OPTAB_DIRECT);
18566       return reg;
18567     }
18568 }
18569
18570 /* Duplicate value VAL using promote_duplicated_reg into maximal size that will
18571    be needed by main loop copying SIZE_NEEDED chunks and prologue getting
18572    alignment from ALIGN to DESIRED_ALIGN.  */
18573 static rtx
18574 promote_duplicated_reg_to_size (rtx val, int size_needed, int desired_align, int align)
18575 {
18576   rtx promoted_val;
18577
18578   if (TARGET_64BIT
18579       && (size_needed > 4 || (desired_align > align && desired_align > 4)))
18580     promoted_val = promote_duplicated_reg (DImode, val);
18581   else if (size_needed > 2 || (desired_align > align && desired_align > 2))
18582     promoted_val = promote_duplicated_reg (SImode, val);
18583   else if (size_needed > 1 || (desired_align > align && desired_align > 1))
18584     promoted_val = promote_duplicated_reg (HImode, val);
18585   else
18586     promoted_val = val;
18587
18588   return promoted_val;
18589 }
18590
18591 /* Expand string clear operation (bzero).  Use i386 string operations when
18592    profitable.  See expand_movmem comment for explanation of individual
18593    steps performed.  */
18594 int
18595 ix86_expand_setmem (rtx dst, rtx count_exp, rtx val_exp, rtx align_exp,
18596                     rtx expected_align_exp, rtx expected_size_exp)
18597 {
18598   rtx destreg;
18599   rtx label = NULL;
18600   rtx tmp;
18601   rtx jump_around_label = NULL;
18602   HOST_WIDE_INT align = 1;
18603   unsigned HOST_WIDE_INT count = 0;
18604   HOST_WIDE_INT expected_size = -1;
18605   int size_needed = 0, epilogue_size_needed;
18606   int desired_align = 0, align_bytes = 0;
18607   enum stringop_alg alg;
18608   rtx promoted_val = NULL;
18609   bool force_loopy_epilogue = false;
18610   int dynamic_check;
18611   bool need_zero_guard = false;
18612
18613   if (CONST_INT_P (align_exp))
18614     align = INTVAL (align_exp);
18615   /* i386 can do misaligned access on reasonably increased cost.  */
18616   if (CONST_INT_P (expected_align_exp)
18617       && INTVAL (expected_align_exp) > align)
18618     align = INTVAL (expected_align_exp);
18619   if (CONST_INT_P (count_exp))
18620     count = expected_size = INTVAL (count_exp);
18621   if (CONST_INT_P (expected_size_exp) && count == 0)
18622     expected_size = INTVAL (expected_size_exp);
18623
18624   /* Make sure we don't need to care about overflow later on.  */
18625   if (count > ((unsigned HOST_WIDE_INT) 1 << 30))
18626     return 0;
18627
18628   /* Step 0: Decide on preferred algorithm, desired alignment and
18629      size of chunks to be copied by main loop.  */
18630
18631   alg = decide_alg (count, expected_size, true, &dynamic_check);
18632   desired_align = decide_alignment (align, alg, expected_size);
18633
18634   if (!TARGET_ALIGN_STRINGOPS)
18635     align = desired_align;
18636
18637   if (alg == libcall)
18638     return 0;
18639   gcc_assert (alg != no_stringop);
18640   if (!count)
18641     count_exp = copy_to_mode_reg (counter_mode (count_exp), count_exp);
18642   destreg = copy_to_mode_reg (Pmode, XEXP (dst, 0));
18643   switch (alg)
18644     {
18645     case libcall:
18646     case no_stringop:
18647       gcc_unreachable ();
18648     case loop:
18649       need_zero_guard = true;
18650       size_needed = GET_MODE_SIZE (Pmode);
18651       break;
18652     case unrolled_loop:
18653       need_zero_guard = true;
18654       size_needed = GET_MODE_SIZE (Pmode) * 4;
18655       break;
18656     case rep_prefix_8_byte:
18657       size_needed = 8;
18658       break;
18659     case rep_prefix_4_byte:
18660       size_needed = 4;
18661       break;
18662     case rep_prefix_1_byte:
18663       size_needed = 1;
18664       break;
18665     case loop_1_byte:
18666       need_zero_guard = true;
18667       size_needed = 1;
18668       break;
18669     }
18670   epilogue_size_needed = size_needed;
18671
18672   /* Step 1: Prologue guard.  */
18673
18674   /* Alignment code needs count to be in register.  */
18675   if (CONST_INT_P (count_exp) && desired_align > align)
18676     {
18677       if (INTVAL (count_exp) > desired_align
18678           && INTVAL (count_exp) > size_needed)
18679         {
18680           align_bytes
18681             = get_mem_align_offset (dst, desired_align * BITS_PER_UNIT);
18682           if (align_bytes <= 0)
18683             align_bytes = 0;
18684           else
18685             align_bytes = desired_align - align_bytes;
18686         }
18687       if (align_bytes == 0)
18688         {
18689           enum machine_mode mode = SImode;
18690           if (TARGET_64BIT && (count & ~0xffffffff))
18691             mode = DImode;
18692           count_exp = force_reg (mode, count_exp);
18693         }
18694     }
18695   /* Do the cheap promotion to allow better CSE across the
18696      main loop and epilogue (ie one load of the big constant in the
18697      front of all code.  */
18698   if (CONST_INT_P (val_exp))
18699     promoted_val = promote_duplicated_reg_to_size (val_exp, size_needed,
18700                                                    desired_align, align);
18701   /* Ensure that alignment prologue won't copy past end of block.  */
18702   if (size_needed > 1 || (desired_align > 1 && desired_align > align))
18703     {
18704       epilogue_size_needed = MAX (size_needed - 1, desired_align - align);
18705       /* Epilogue always copies COUNT_EXP & (EPILOGUE_SIZE_NEEDED - 1) bytes.
18706          Make sure it is power of 2.  */
18707       epilogue_size_needed = smallest_pow2_greater_than (epilogue_size_needed);
18708
18709       /* To improve performance of small blocks, we jump around the VAL
18710          promoting mode.  This mean that if the promoted VAL is not constant,
18711          we might not use it in the epilogue and have to use byte
18712          loop variant.  */
18713       if (epilogue_size_needed > 2 && !promoted_val)
18714         force_loopy_epilogue = true;
18715       if (count)
18716         {
18717           if (count < (unsigned HOST_WIDE_INT)epilogue_size_needed)
18718             {
18719               /* If main algorithm works on QImode, no epilogue is needed.
18720                  For small sizes just don't align anything.  */
18721               if (size_needed == 1)
18722                 desired_align = align;
18723               else
18724                 goto epilogue;
18725             }
18726         }
18727       else
18728         {
18729           label = gen_label_rtx ();
18730           emit_cmp_and_jump_insns (count_exp,
18731                                    GEN_INT (epilogue_size_needed),
18732                                    LTU, 0, counter_mode (count_exp), 1, label);
18733           if (expected_size == -1 || expected_size <= epilogue_size_needed)
18734             predict_jump (REG_BR_PROB_BASE * 60 / 100);
18735           else
18736             predict_jump (REG_BR_PROB_BASE * 20 / 100);
18737         }
18738     }
18739   if (dynamic_check != -1)
18740     {
18741       rtx hot_label = gen_label_rtx ();
18742       jump_around_label = gen_label_rtx ();
18743       emit_cmp_and_jump_insns (count_exp, GEN_INT (dynamic_check - 1),
18744                                LEU, 0, counter_mode (count_exp), 1, hot_label);
18745       predict_jump (REG_BR_PROB_BASE * 90 / 100);
18746       set_storage_via_libcall (dst, count_exp, val_exp, false);
18747       emit_jump (jump_around_label);
18748       emit_label (hot_label);
18749     }
18750
18751   /* Step 2: Alignment prologue.  */
18752
18753   /* Do the expensive promotion once we branched off the small blocks.  */
18754   if (!promoted_val)
18755     promoted_val = promote_duplicated_reg_to_size (val_exp, size_needed,
18756                                                    desired_align, align);
18757   gcc_assert (desired_align >= 1 && align >= 1);
18758
18759   if (desired_align > align)
18760     {
18761       if (align_bytes == 0)
18762         {
18763           /* Except for the first move in epilogue, we no longer know
18764              constant offset in aliasing info.  It don't seems to worth
18765              the pain to maintain it for the first move, so throw away
18766              the info early.  */
18767           dst = change_address (dst, BLKmode, destreg);
18768           expand_setmem_prologue (dst, destreg, promoted_val, count_exp, align,
18769                                   desired_align);
18770         }
18771       else
18772         {
18773           /* If we know how many bytes need to be stored before dst is
18774              sufficiently aligned, maintain aliasing info accurately.  */
18775           dst = expand_constant_setmem_prologue (dst, destreg, promoted_val,
18776                                                  desired_align, align_bytes);
18777           count_exp = plus_constant (count_exp, -align_bytes);
18778           count -= align_bytes;
18779         }
18780       if (need_zero_guard
18781           && (count < (unsigned HOST_WIDE_INT) size_needed
18782               || (align_bytes == 0
18783                   && count < ((unsigned HOST_WIDE_INT) size_needed
18784                               + desired_align - align))))
18785         {
18786           /* It is possible that we copied enough so the main loop will not
18787              execute.  */
18788           gcc_assert (size_needed > 1);
18789           if (label == NULL_RTX)
18790             label = gen_label_rtx ();
18791           emit_cmp_and_jump_insns (count_exp,
18792                                    GEN_INT (size_needed),
18793                                    LTU, 0, counter_mode (count_exp), 1, label);
18794           if (expected_size == -1
18795               || expected_size < (desired_align - align) / 2 + size_needed)
18796             predict_jump (REG_BR_PROB_BASE * 20 / 100);
18797           else
18798             predict_jump (REG_BR_PROB_BASE * 60 / 100);
18799         }
18800     }
18801   if (label && size_needed == 1)
18802     {
18803       emit_label (label);
18804       LABEL_NUSES (label) = 1;
18805       label = NULL;
18806       promoted_val = val_exp;
18807       epilogue_size_needed = 1;
18808     }
18809   else if (label == NULL_RTX)
18810     epilogue_size_needed = size_needed;
18811
18812   /* Step 3: Main loop.  */
18813
18814   switch (alg)
18815     {
18816     case libcall:
18817     case no_stringop:
18818       gcc_unreachable ();
18819     case loop_1_byte:
18820       expand_set_or_movmem_via_loop (dst, NULL, destreg, NULL, promoted_val,
18821                                      count_exp, QImode, 1, expected_size);
18822       break;
18823     case loop:
18824       expand_set_or_movmem_via_loop (dst, NULL, destreg, NULL, promoted_val,
18825                                      count_exp, Pmode, 1, expected_size);
18826       break;
18827     case unrolled_loop:
18828       expand_set_or_movmem_via_loop (dst, NULL, destreg, NULL, promoted_val,
18829                                      count_exp, Pmode, 4, expected_size);
18830       break;
18831     case rep_prefix_8_byte:
18832       expand_setmem_via_rep_stos (dst, destreg, promoted_val, count_exp,
18833                                   DImode, val_exp);
18834       break;
18835     case rep_prefix_4_byte:
18836       expand_setmem_via_rep_stos (dst, destreg, promoted_val, count_exp,
18837                                   SImode, val_exp);
18838       break;
18839     case rep_prefix_1_byte:
18840       expand_setmem_via_rep_stos (dst, destreg, promoted_val, count_exp,
18841                                   QImode, val_exp);
18842       break;
18843     }
18844   /* Adjust properly the offset of src and dest memory for aliasing.  */
18845   if (CONST_INT_P (count_exp))
18846     dst = adjust_automodify_address_nv (dst, BLKmode, destreg,
18847                                         (count / size_needed) * size_needed);
18848   else
18849     dst = change_address (dst, BLKmode, destreg);
18850
18851   /* Step 4: Epilogue to copy the remaining bytes.  */
18852
18853   if (label)
18854     {
18855       /* When the main loop is done, COUNT_EXP might hold original count,
18856          while we want to copy only COUNT_EXP & SIZE_NEEDED bytes.
18857          Epilogue code will actually copy COUNT_EXP & EPILOGUE_SIZE_NEEDED
18858          bytes. Compensate if needed.  */
18859
18860       if (size_needed < epilogue_size_needed)
18861         {
18862           tmp =
18863             expand_simple_binop (counter_mode (count_exp), AND, count_exp,
18864                                  GEN_INT (size_needed - 1), count_exp, 1,
18865                                  OPTAB_DIRECT);
18866           if (tmp != count_exp)
18867             emit_move_insn (count_exp, tmp);
18868         }
18869       emit_label (label);
18870       LABEL_NUSES (label) = 1;
18871     }
18872  epilogue:
18873   if (count_exp != const0_rtx && epilogue_size_needed > 1)
18874     {
18875       if (force_loopy_epilogue)
18876         expand_setmem_epilogue_via_loop (dst, destreg, val_exp, count_exp,
18877                                          epilogue_size_needed);
18878       else
18879         expand_setmem_epilogue (dst, destreg, promoted_val, count_exp,
18880                                 epilogue_size_needed);
18881     }
18882   if (jump_around_label)
18883     emit_label (jump_around_label);
18884   return 1;
18885 }
18886
18887 /* Expand the appropriate insns for doing strlen if not just doing
18888    repnz; scasb
18889
18890    out = result, initialized with the start address
18891    align_rtx = alignment of the address.
18892    scratch = scratch register, initialized with the startaddress when
18893         not aligned, otherwise undefined
18894
18895    This is just the body. It needs the initializations mentioned above and
18896    some address computing at the end.  These things are done in i386.md.  */
18897
18898 static void
18899 ix86_expand_strlensi_unroll_1 (rtx out, rtx src, rtx align_rtx)
18900 {
18901   int align;
18902   rtx tmp;
18903   rtx align_2_label = NULL_RTX;
18904   rtx align_3_label = NULL_RTX;
18905   rtx align_4_label = gen_label_rtx ();
18906   rtx end_0_label = gen_label_rtx ();
18907   rtx mem;
18908   rtx tmpreg = gen_reg_rtx (SImode);
18909   rtx scratch = gen_reg_rtx (SImode);
18910   rtx cmp;
18911
18912   align = 0;
18913   if (CONST_INT_P (align_rtx))
18914     align = INTVAL (align_rtx);
18915
18916   /* Loop to check 1..3 bytes for null to get an aligned pointer.  */
18917
18918   /* Is there a known alignment and is it less than 4?  */
18919   if (align < 4)
18920     {
18921       rtx scratch1 = gen_reg_rtx (Pmode);
18922       emit_move_insn (scratch1, out);
18923       /* Is there a known alignment and is it not 2? */
18924       if (align != 2)
18925         {
18926           align_3_label = gen_label_rtx (); /* Label when aligned to 3-byte */
18927           align_2_label = gen_label_rtx (); /* Label when aligned to 2-byte */
18928
18929           /* Leave just the 3 lower bits.  */
18930           align_rtx = expand_binop (Pmode, and_optab, scratch1, GEN_INT (3),
18931                                     NULL_RTX, 0, OPTAB_WIDEN);
18932
18933           emit_cmp_and_jump_insns (align_rtx, const0_rtx, EQ, NULL,
18934                                    Pmode, 1, align_4_label);
18935           emit_cmp_and_jump_insns (align_rtx, const2_rtx, EQ, NULL,
18936                                    Pmode, 1, align_2_label);
18937           emit_cmp_and_jump_insns (align_rtx, const2_rtx, GTU, NULL,
18938                                    Pmode, 1, align_3_label);
18939         }
18940       else
18941         {
18942           /* Since the alignment is 2, we have to check 2 or 0 bytes;
18943              check if is aligned to 4 - byte.  */
18944
18945           align_rtx = expand_binop (Pmode, and_optab, scratch1, const2_rtx,
18946                                     NULL_RTX, 0, OPTAB_WIDEN);
18947
18948           emit_cmp_and_jump_insns (align_rtx, const0_rtx, EQ, NULL,
18949                                    Pmode, 1, align_4_label);
18950         }
18951
18952       mem = change_address (src, QImode, out);
18953
18954       /* Now compare the bytes.  */
18955
18956       /* Compare the first n unaligned byte on a byte per byte basis.  */
18957       emit_cmp_and_jump_insns (mem, const0_rtx, EQ, NULL,
18958                                QImode, 1, end_0_label);
18959
18960       /* Increment the address.  */
18961       emit_insn ((*ix86_gen_add3) (out, out, const1_rtx));
18962
18963       /* Not needed with an alignment of 2 */
18964       if (align != 2)
18965         {
18966           emit_label (align_2_label);
18967
18968           emit_cmp_and_jump_insns (mem, const0_rtx, EQ, NULL, QImode, 1,
18969                                    end_0_label);
18970
18971           emit_insn ((*ix86_gen_add3) (out, out, const1_rtx));
18972
18973           emit_label (align_3_label);
18974         }
18975
18976       emit_cmp_and_jump_insns (mem, const0_rtx, EQ, NULL, QImode, 1,
18977                                end_0_label);
18978
18979       emit_insn ((*ix86_gen_add3) (out, out, const1_rtx));
18980     }
18981
18982   /* Generate loop to check 4 bytes at a time.  It is not a good idea to
18983      align this loop.  It gives only huge programs, but does not help to
18984      speed up.  */
18985   emit_label (align_4_label);
18986
18987   mem = change_address (src, SImode, out);
18988   emit_move_insn (scratch, mem);
18989   emit_insn ((*ix86_gen_add3) (out, out, GEN_INT (4)));
18990
18991   /* This formula yields a nonzero result iff one of the bytes is zero.
18992      This saves three branches inside loop and many cycles.  */
18993
18994   emit_insn (gen_addsi3 (tmpreg, scratch, GEN_INT (-0x01010101)));
18995   emit_insn (gen_one_cmplsi2 (scratch, scratch));
18996   emit_insn (gen_andsi3 (tmpreg, tmpreg, scratch));
18997   emit_insn (gen_andsi3 (tmpreg, tmpreg,
18998                          gen_int_mode (0x80808080, SImode)));
18999   emit_cmp_and_jump_insns (tmpreg, const0_rtx, EQ, 0, SImode, 1,
19000                            align_4_label);
19001
19002   if (TARGET_CMOVE)
19003     {
19004        rtx reg = gen_reg_rtx (SImode);
19005        rtx reg2 = gen_reg_rtx (Pmode);
19006        emit_move_insn (reg, tmpreg);
19007        emit_insn (gen_lshrsi3 (reg, reg, GEN_INT (16)));
19008
19009        /* If zero is not in the first two bytes, move two bytes forward.  */
19010        emit_insn (gen_testsi_ccno_1 (tmpreg, GEN_INT (0x8080)));
19011        tmp = gen_rtx_REG (CCNOmode, FLAGS_REG);
19012        tmp = gen_rtx_EQ (VOIDmode, tmp, const0_rtx);
19013        emit_insn (gen_rtx_SET (VOIDmode, tmpreg,
19014                                gen_rtx_IF_THEN_ELSE (SImode, tmp,
19015                                                      reg,
19016                                                      tmpreg)));
19017        /* Emit lea manually to avoid clobbering of flags.  */
19018        emit_insn (gen_rtx_SET (SImode, reg2,
19019                                gen_rtx_PLUS (Pmode, out, const2_rtx)));
19020
19021        tmp = gen_rtx_REG (CCNOmode, FLAGS_REG);
19022        tmp = gen_rtx_EQ (VOIDmode, tmp, const0_rtx);
19023        emit_insn (gen_rtx_SET (VOIDmode, out,
19024                                gen_rtx_IF_THEN_ELSE (Pmode, tmp,
19025                                                      reg2,
19026                                                      out)));
19027     }
19028   else
19029     {
19030        rtx end_2_label = gen_label_rtx ();
19031        /* Is zero in the first two bytes? */
19032
19033        emit_insn (gen_testsi_ccno_1 (tmpreg, GEN_INT (0x8080)));
19034        tmp = gen_rtx_REG (CCNOmode, FLAGS_REG);
19035        tmp = gen_rtx_NE (VOIDmode, tmp, const0_rtx);
19036        tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp,
19037                             gen_rtx_LABEL_REF (VOIDmode, end_2_label),
19038                             pc_rtx);
19039        tmp = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, tmp));
19040        JUMP_LABEL (tmp) = end_2_label;
19041
19042        /* Not in the first two.  Move two bytes forward.  */
19043        emit_insn (gen_lshrsi3 (tmpreg, tmpreg, GEN_INT (16)));
19044        emit_insn ((*ix86_gen_add3) (out, out, const2_rtx));
19045
19046        emit_label (end_2_label);
19047
19048     }
19049
19050   /* Avoid branch in fixing the byte.  */
19051   tmpreg = gen_lowpart (QImode, tmpreg);
19052   emit_insn (gen_addqi3_cc (tmpreg, tmpreg, tmpreg));
19053   tmp = gen_rtx_REG (CCmode, FLAGS_REG);
19054   cmp = gen_rtx_LTU (VOIDmode, tmp, const0_rtx);
19055   emit_insn ((*ix86_gen_sub3_carry) (out, out, GEN_INT (3), tmp, cmp));
19056
19057   emit_label (end_0_label);
19058 }
19059
19060 /* Expand strlen.  */
19061
19062 int
19063 ix86_expand_strlen (rtx out, rtx src, rtx eoschar, rtx align)
19064 {
19065   rtx addr, scratch1, scratch2, scratch3, scratch4;
19066
19067   /* The generic case of strlen expander is long.  Avoid it's
19068      expanding unless TARGET_INLINE_ALL_STRINGOPS.  */
19069
19070   if (TARGET_UNROLL_STRLEN && eoschar == const0_rtx && optimize > 1
19071       && !TARGET_INLINE_ALL_STRINGOPS
19072       && !optimize_insn_for_size_p ()
19073       && (!CONST_INT_P (align) || INTVAL (align) < 4))
19074     return 0;
19075
19076   addr = force_reg (Pmode, XEXP (src, 0));
19077   scratch1 = gen_reg_rtx (Pmode);
19078
19079   if (TARGET_UNROLL_STRLEN && eoschar == const0_rtx && optimize > 1
19080       && !optimize_insn_for_size_p ())
19081     {
19082       /* Well it seems that some optimizer does not combine a call like
19083          foo(strlen(bar), strlen(bar));
19084          when the move and the subtraction is done here.  It does calculate
19085          the length just once when these instructions are done inside of
19086          output_strlen_unroll().  But I think since &bar[strlen(bar)] is
19087          often used and I use one fewer register for the lifetime of
19088          output_strlen_unroll() this is better.  */
19089
19090       emit_move_insn (out, addr);
19091
19092       ix86_expand_strlensi_unroll_1 (out, src, align);
19093
19094       /* strlensi_unroll_1 returns the address of the zero at the end of
19095          the string, like memchr(), so compute the length by subtracting
19096          the start address.  */
19097       emit_insn ((*ix86_gen_sub3) (out, out, addr));
19098     }
19099   else
19100     {
19101       rtx unspec;
19102
19103       /* Can't use this if the user has appropriated eax, ecx, or edi.  */
19104       if (fixed_regs[AX_REG] || fixed_regs[CX_REG] || fixed_regs[DI_REG])
19105         return false;
19106
19107       scratch2 = gen_reg_rtx (Pmode);
19108       scratch3 = gen_reg_rtx (Pmode);
19109       scratch4 = force_reg (Pmode, constm1_rtx);
19110
19111       emit_move_insn (scratch3, addr);
19112       eoschar = force_reg (QImode, eoschar);
19113
19114       src = replace_equiv_address_nv (src, scratch3);
19115
19116       /* If .md starts supporting :P, this can be done in .md.  */
19117       unspec = gen_rtx_UNSPEC (Pmode, gen_rtvec (4, src, eoschar, align,
19118                                                  scratch4), UNSPEC_SCAS);
19119       emit_insn (gen_strlenqi_1 (scratch1, scratch3, unspec));
19120       emit_insn ((*ix86_gen_one_cmpl2) (scratch2, scratch1));
19121       emit_insn ((*ix86_gen_add3) (out, scratch2, constm1_rtx));
19122     }
19123   return 1;
19124 }
19125
19126 /* For given symbol (function) construct code to compute address of it's PLT
19127    entry in large x86-64 PIC model.  */
19128 rtx
19129 construct_plt_address (rtx symbol)
19130 {
19131   rtx tmp = gen_reg_rtx (Pmode);
19132   rtx unspec = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, symbol), UNSPEC_PLTOFF);
19133
19134   gcc_assert (GET_CODE (symbol) == SYMBOL_REF);
19135   gcc_assert (ix86_cmodel == CM_LARGE_PIC);
19136
19137   emit_move_insn (tmp, gen_rtx_CONST (Pmode, unspec));
19138   emit_insn (gen_adddi3 (tmp, tmp, pic_offset_table_rtx));
19139   return tmp;
19140 }
19141
19142 void
19143 ix86_expand_call (rtx retval, rtx fnaddr, rtx callarg1,
19144                   rtx callarg2,
19145                   rtx pop, int sibcall)
19146 {
19147   rtx use = NULL, call;
19148
19149   if (pop == const0_rtx)
19150     pop = NULL;
19151   gcc_assert (!TARGET_64BIT || !pop);
19152
19153   if (TARGET_MACHO && !TARGET_64BIT)
19154     {
19155 #if TARGET_MACHO
19156       if (flag_pic && GET_CODE (XEXP (fnaddr, 0)) == SYMBOL_REF)
19157         fnaddr = machopic_indirect_call_target (fnaddr);
19158 #endif
19159     }
19160   else
19161     {
19162       /* Static functions and indirect calls don't need the pic register.  */
19163       if (flag_pic && (!TARGET_64BIT || ix86_cmodel == CM_LARGE_PIC)
19164           && GET_CODE (XEXP (fnaddr, 0)) == SYMBOL_REF
19165           && ! SYMBOL_REF_LOCAL_P (XEXP (fnaddr, 0)))
19166         use_reg (&use, pic_offset_table_rtx);
19167     }
19168
19169   if (TARGET_64BIT && INTVAL (callarg2) >= 0)
19170     {
19171       rtx al = gen_rtx_REG (QImode, AX_REG);
19172       emit_move_insn (al, callarg2);
19173       use_reg (&use, al);
19174     }
19175
19176   if (ix86_cmodel == CM_LARGE_PIC
19177       && MEM_P (fnaddr) 
19178       && GET_CODE (XEXP (fnaddr, 0)) == SYMBOL_REF
19179       && !local_symbolic_operand (XEXP (fnaddr, 0), VOIDmode))
19180     fnaddr = gen_rtx_MEM (QImode, construct_plt_address (XEXP (fnaddr, 0)));
19181   else if (sibcall
19182            ? !sibcall_insn_operand (XEXP (fnaddr, 0), Pmode)
19183            : !call_insn_operand (XEXP (fnaddr, 0), Pmode))
19184     {
19185       fnaddr = copy_to_mode_reg (Pmode, XEXP (fnaddr, 0));
19186       fnaddr = gen_rtx_MEM (QImode, fnaddr);
19187     }
19188
19189   call = gen_rtx_CALL (VOIDmode, fnaddr, callarg1);
19190   if (retval)
19191     call = gen_rtx_SET (VOIDmode, retval, call);
19192   if (pop)
19193     {
19194       pop = gen_rtx_PLUS (Pmode, stack_pointer_rtx, pop);
19195       pop = gen_rtx_SET (VOIDmode, stack_pointer_rtx, pop);
19196       call = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, call, pop));
19197     }
19198   if (TARGET_64BIT
19199       && ix86_cfun_abi () == MS_ABI
19200       && (!callarg2 || INTVAL (callarg2) != -2))
19201     {
19202       /* We need to represent that SI and DI registers are clobbered
19203          by SYSV calls.  */
19204       static int clobbered_registers[] = {
19205         XMM6_REG, XMM7_REG, XMM8_REG,
19206         XMM9_REG, XMM10_REG, XMM11_REG,
19207         XMM12_REG, XMM13_REG, XMM14_REG,
19208         XMM15_REG, SI_REG, DI_REG
19209       };
19210       unsigned int i;
19211       rtx vec[ARRAY_SIZE (clobbered_registers) + 2];
19212       rtx unspec = gen_rtx_UNSPEC (VOIDmode, gen_rtvec (1, const0_rtx),
19213                                    UNSPEC_MS_TO_SYSV_CALL);
19214
19215       vec[0] = call;
19216       vec[1] = unspec;
19217       for (i = 0; i < ARRAY_SIZE (clobbered_registers); i++)
19218         vec[i + 2] = gen_rtx_CLOBBER (SSE_REGNO_P (clobbered_registers[i])
19219                                       ? TImode : DImode,
19220                                       gen_rtx_REG
19221                                         (SSE_REGNO_P (clobbered_registers[i])
19222                                                       ? TImode : DImode,
19223                                          clobbered_registers[i]));
19224
19225       call = gen_rtx_PARALLEL (VOIDmode,
19226                                gen_rtvec_v (ARRAY_SIZE (clobbered_registers)
19227                                + 2, vec));
19228     }
19229
19230   call = emit_call_insn (call);
19231   if (use)
19232     CALL_INSN_FUNCTION_USAGE (call) = use;
19233 }
19234
19235 \f
19236 /* Clear stack slot assignments remembered from previous functions.
19237    This is called from INIT_EXPANDERS once before RTL is emitted for each
19238    function.  */
19239
19240 static struct machine_function *
19241 ix86_init_machine_status (void)
19242 {
19243   struct machine_function *f;
19244
19245   f = GGC_CNEW (struct machine_function);
19246   f->use_fast_prologue_epilogue_nregs = -1;
19247   f->tls_descriptor_call_expanded_p = 0;
19248   f->call_abi = ix86_abi;
19249
19250   return f;
19251 }
19252
19253 /* Return a MEM corresponding to a stack slot with mode MODE.
19254    Allocate a new slot if necessary.
19255
19256    The RTL for a function can have several slots available: N is
19257    which slot to use.  */
19258
19259 rtx
19260 assign_386_stack_local (enum machine_mode mode, enum ix86_stack_slot n)
19261 {
19262   struct stack_local_entry *s;
19263
19264   gcc_assert (n < MAX_386_STACK_LOCALS);
19265
19266   /* Virtual slot is valid only before vregs are instantiated.  */
19267   gcc_assert ((n == SLOT_VIRTUAL) == !virtuals_instantiated);
19268
19269   for (s = ix86_stack_locals; s; s = s->next)
19270     if (s->mode == mode && s->n == n)
19271       return copy_rtx (s->rtl);
19272
19273   s = (struct stack_local_entry *)
19274     ggc_alloc (sizeof (struct stack_local_entry));
19275   s->n = n;
19276   s->mode = mode;
19277   s->rtl = assign_stack_local (mode, GET_MODE_SIZE (mode), 0);
19278
19279   s->next = ix86_stack_locals;
19280   ix86_stack_locals = s;
19281   return s->rtl;
19282 }
19283
19284 /* Construct the SYMBOL_REF for the tls_get_addr function.  */
19285
19286 static GTY(()) rtx ix86_tls_symbol;
19287 rtx
19288 ix86_tls_get_addr (void)
19289 {
19290
19291   if (!ix86_tls_symbol)
19292     {
19293       ix86_tls_symbol = gen_rtx_SYMBOL_REF (Pmode,
19294                                             (TARGET_ANY_GNU_TLS
19295                                              && !TARGET_64BIT)
19296                                             ? "___tls_get_addr"
19297                                             : "__tls_get_addr");
19298     }
19299
19300   return ix86_tls_symbol;
19301 }
19302
19303 /* Construct the SYMBOL_REF for the _TLS_MODULE_BASE_ symbol.  */
19304
19305 static GTY(()) rtx ix86_tls_module_base_symbol;
19306 rtx
19307 ix86_tls_module_base (void)
19308 {
19309
19310   if (!ix86_tls_module_base_symbol)
19311     {
19312       ix86_tls_module_base_symbol = gen_rtx_SYMBOL_REF (Pmode,
19313                                                         "_TLS_MODULE_BASE_");
19314       SYMBOL_REF_FLAGS (ix86_tls_module_base_symbol)
19315         |= TLS_MODEL_GLOBAL_DYNAMIC << SYMBOL_FLAG_TLS_SHIFT;
19316     }
19317
19318   return ix86_tls_module_base_symbol;
19319 }
19320 \f
19321 /* Calculate the length of the memory address in the instruction
19322    encoding.  Does not include the one-byte modrm, opcode, or prefix.  */
19323
19324 int
19325 memory_address_length (rtx addr)
19326 {
19327   struct ix86_address parts;
19328   rtx base, index, disp;
19329   int len;
19330   int ok;
19331
19332   if (GET_CODE (addr) == PRE_DEC
19333       || GET_CODE (addr) == POST_INC
19334       || GET_CODE (addr) == PRE_MODIFY
19335       || GET_CODE (addr) == POST_MODIFY)
19336     return 0;
19337
19338   ok = ix86_decompose_address (addr, &parts);
19339   gcc_assert (ok);
19340
19341   if (parts.base && GET_CODE (parts.base) == SUBREG)
19342     parts.base = SUBREG_REG (parts.base);
19343   if (parts.index && GET_CODE (parts.index) == SUBREG)
19344     parts.index = SUBREG_REG (parts.index);
19345
19346   base = parts.base;
19347   index = parts.index;
19348   disp = parts.disp;
19349   len = 0;
19350
19351   /* Rule of thumb:
19352        - esp as the base always wants an index,
19353        - ebp as the base always wants a displacement,
19354        - r12 as the base always wants an index,
19355        - r13 as the base always wants a displacement.  */
19356
19357   /* Register Indirect.  */
19358   if (base && !index && !disp)
19359     {
19360       /* esp (for its index) and ebp (for its displacement) need
19361          the two-byte modrm form.  Similarly for r12 and r13 in 64-bit
19362          code.  */
19363       if (REG_P (addr)
19364           && (addr == arg_pointer_rtx
19365               || addr == frame_pointer_rtx
19366               || REGNO (addr) == SP_REG
19367               || REGNO (addr) == BP_REG
19368               || REGNO (addr) == R12_REG
19369               || REGNO (addr) == R13_REG))
19370         len = 1;
19371     }
19372
19373   /* Direct Addressing.  In 64-bit mode mod 00 r/m 5
19374      is not disp32, but disp32(%rip), so for disp32
19375      SIB byte is needed, unless print_operand_address
19376      optimizes it into disp32(%rip) or (%rip) is implied
19377      by UNSPEC.  */
19378   else if (disp && !base && !index)
19379     {
19380       len = 4;
19381       if (TARGET_64BIT)
19382         {
19383           rtx symbol = disp;
19384
19385           if (GET_CODE (disp) == CONST)
19386             symbol = XEXP (disp, 0);
19387           if (GET_CODE (symbol) == PLUS
19388               && CONST_INT_P (XEXP (symbol, 1)))
19389             symbol = XEXP (symbol, 0);
19390
19391           if (GET_CODE (symbol) != LABEL_REF
19392               && (GET_CODE (symbol) != SYMBOL_REF
19393                   || SYMBOL_REF_TLS_MODEL (symbol) != 0)
19394               && (GET_CODE (symbol) != UNSPEC
19395                   || (XINT (symbol, 1) != UNSPEC_GOTPCREL
19396                       && XINT (symbol, 1) != UNSPEC_GOTNTPOFF)))
19397             len += 1;
19398         }
19399     }
19400
19401   else
19402     {
19403       /* Find the length of the displacement constant.  */
19404       if (disp)
19405         {
19406           if (base && satisfies_constraint_K (disp))
19407             len = 1;
19408           else
19409             len = 4;
19410         }
19411       /* ebp always wants a displacement.  Similarly r13.  */
19412       else if (base && REG_P (base)
19413                && (REGNO (base) == BP_REG || REGNO (base) == R13_REG))
19414         len = 1;
19415
19416       /* An index requires the two-byte modrm form....  */
19417       if (index
19418           /* ...like esp (or r12), which always wants an index.  */
19419           || base == arg_pointer_rtx
19420           || base == frame_pointer_rtx
19421           || (base && REG_P (base)
19422               && (REGNO (base) == SP_REG || REGNO (base) == R12_REG)))
19423         len += 1;
19424     }
19425
19426   switch (parts.seg)
19427     {
19428     case SEG_FS:
19429     case SEG_GS:
19430       len += 1;
19431       break;
19432     default:
19433       break;
19434     }
19435
19436   return len;
19437 }
19438
19439 /* Compute default value for "length_immediate" attribute.  When SHORTFORM
19440    is set, expect that insn have 8bit immediate alternative.  */
19441 int
19442 ix86_attr_length_immediate_default (rtx insn, int shortform)
19443 {
19444   int len = 0;
19445   int i;
19446   extract_insn_cached (insn);
19447   for (i = recog_data.n_operands - 1; i >= 0; --i)
19448     if (CONSTANT_P (recog_data.operand[i]))
19449       {
19450         enum attr_mode mode = get_attr_mode (insn);
19451
19452         gcc_assert (!len);
19453         if (shortform && CONST_INT_P (recog_data.operand[i]))
19454           {
19455             HOST_WIDE_INT ival = INTVAL (recog_data.operand[i]);
19456             switch (mode)
19457               {
19458               case MODE_QI:
19459                 len = 1;
19460                 continue;
19461               case MODE_HI:
19462                 ival = trunc_int_for_mode (ival, HImode);
19463                 break;
19464               case MODE_SI:
19465                 ival = trunc_int_for_mode (ival, SImode);
19466                 break;
19467               default:
19468                 break;
19469               }
19470             if (IN_RANGE (ival, -128, 127))
19471               {
19472                 len = 1;
19473                 continue;
19474               }
19475           }
19476         switch (mode)
19477           {
19478           case MODE_QI:
19479             len = 1;
19480             break;
19481           case MODE_HI:
19482             len = 2;
19483             break;
19484           case MODE_SI:
19485             len = 4;
19486             break;
19487           /* Immediates for DImode instructions are encoded as 32bit sign extended values.  */
19488           case MODE_DI:
19489             len = 4;
19490             break;
19491           default:
19492             fatal_insn ("unknown insn mode", insn);
19493         }
19494       }
19495   return len;
19496 }
19497 /* Compute default value for "length_address" attribute.  */
19498 int
19499 ix86_attr_length_address_default (rtx insn)
19500 {
19501   int i;
19502
19503   if (get_attr_type (insn) == TYPE_LEA)
19504     {
19505       rtx set = PATTERN (insn), addr;
19506
19507       if (GET_CODE (set) == PARALLEL)
19508         set = XVECEXP (set, 0, 0);
19509
19510       gcc_assert (GET_CODE (set) == SET);
19511
19512       addr = SET_SRC (set);
19513       if (TARGET_64BIT && get_attr_mode (insn) == MODE_SI)
19514         {
19515           if (GET_CODE (addr) == ZERO_EXTEND)
19516             addr = XEXP (addr, 0);
19517           if (GET_CODE (addr) == SUBREG)
19518             addr = SUBREG_REG (addr);
19519         }
19520
19521       return memory_address_length (addr);
19522     }
19523
19524   extract_insn_cached (insn);
19525   for (i = recog_data.n_operands - 1; i >= 0; --i)
19526     if (MEM_P (recog_data.operand[i]))
19527       {
19528         constrain_operands_cached (reload_completed);
19529         if (which_alternative != -1)
19530           {
19531             const char *constraints = recog_data.constraints[i];
19532             int alt = which_alternative;
19533
19534             while (*constraints == '=' || *constraints == '+')
19535               constraints++;
19536             while (alt-- > 0)
19537               while (*constraints++ != ',')
19538                 ;
19539             /* Skip ignored operands.  */
19540             if (*constraints == 'X')
19541               continue;
19542           }
19543         return memory_address_length (XEXP (recog_data.operand[i], 0));
19544       }
19545   return 0;
19546 }
19547
19548 /* Compute default value for "length_vex" attribute. It includes
19549    2 or 3 byte VEX prefix and 1 opcode byte.  */
19550
19551 int
19552 ix86_attr_length_vex_default (rtx insn, int has_0f_opcode,
19553                               int has_vex_w)
19554 {
19555   int i;
19556
19557   /* Only 0f opcode can use 2 byte VEX prefix and  VEX W bit uses 3
19558      byte VEX prefix.  */
19559   if (!has_0f_opcode || has_vex_w)
19560     return 3 + 1;
19561
19562  /* We can always use 2 byte VEX prefix in 32bit.  */
19563   if (!TARGET_64BIT)
19564     return 2 + 1;
19565
19566   extract_insn_cached (insn);
19567
19568   for (i = recog_data.n_operands - 1; i >= 0; --i)
19569     if (REG_P (recog_data.operand[i]))
19570       {
19571         /* REX.W bit uses 3 byte VEX prefix.  */
19572         if (GET_MODE (recog_data.operand[i]) == DImode
19573             && GENERAL_REG_P (recog_data.operand[i]))
19574           return 3 + 1;
19575       }
19576     else
19577       {
19578         /* REX.X or REX.B bits use 3 byte VEX prefix.  */
19579         if (MEM_P (recog_data.operand[i])
19580             && x86_extended_reg_mentioned_p (recog_data.operand[i]))
19581           return 3 + 1;
19582       }
19583
19584   return 2 + 1;
19585 }
19586 \f
19587 /* Return the maximum number of instructions a cpu can issue.  */
19588
19589 static int
19590 ix86_issue_rate (void)
19591 {
19592   switch (ix86_tune)
19593     {
19594     case PROCESSOR_PENTIUM:
19595     case PROCESSOR_ATOM:
19596     case PROCESSOR_K6:
19597       return 2;
19598
19599     case PROCESSOR_PENTIUMPRO:
19600     case PROCESSOR_PENTIUM4:
19601     case PROCESSOR_ATHLON:
19602     case PROCESSOR_K8:
19603     case PROCESSOR_AMDFAM10:
19604     case PROCESSOR_NOCONA:
19605     case PROCESSOR_GENERIC32:
19606     case PROCESSOR_GENERIC64:
19607       return 3;
19608
19609     case PROCESSOR_CORE2:
19610       return 4;
19611
19612     default:
19613       return 1;
19614     }
19615 }
19616
19617 /* A subroutine of ix86_adjust_cost -- return true iff INSN reads flags set
19618    by DEP_INSN and nothing set by DEP_INSN.  */
19619
19620 static int
19621 ix86_flags_dependent (rtx insn, rtx dep_insn, enum attr_type insn_type)
19622 {
19623   rtx set, set2;
19624
19625   /* Simplify the test for uninteresting insns.  */
19626   if (insn_type != TYPE_SETCC
19627       && insn_type != TYPE_ICMOV
19628       && insn_type != TYPE_FCMOV
19629       && insn_type != TYPE_IBR)
19630     return 0;
19631
19632   if ((set = single_set (dep_insn)) != 0)
19633     {
19634       set = SET_DEST (set);
19635       set2 = NULL_RTX;
19636     }
19637   else if (GET_CODE (PATTERN (dep_insn)) == PARALLEL
19638            && XVECLEN (PATTERN (dep_insn), 0) == 2
19639            && GET_CODE (XVECEXP (PATTERN (dep_insn), 0, 0)) == SET
19640            && GET_CODE (XVECEXP (PATTERN (dep_insn), 0, 1)) == SET)
19641     {
19642       set = SET_DEST (XVECEXP (PATTERN (dep_insn), 0, 0));
19643       set2 = SET_DEST (XVECEXP (PATTERN (dep_insn), 0, 0));
19644     }
19645   else
19646     return 0;
19647
19648   if (!REG_P (set) || REGNO (set) != FLAGS_REG)
19649     return 0;
19650
19651   /* This test is true if the dependent insn reads the flags but
19652      not any other potentially set register.  */
19653   if (!reg_overlap_mentioned_p (set, PATTERN (insn)))
19654     return 0;
19655
19656   if (set2 && reg_overlap_mentioned_p (set2, PATTERN (insn)))
19657     return 0;
19658
19659   return 1;
19660 }
19661
19662 /* Return true iff USE_INSN has a memory address with operands set by
19663    SET_INSN.  */
19664
19665 bool
19666 ix86_agi_dependent (rtx set_insn, rtx use_insn)
19667 {
19668   int i;
19669   extract_insn_cached (use_insn);
19670   for (i = recog_data.n_operands - 1; i >= 0; --i)
19671     if (MEM_P (recog_data.operand[i]))
19672       {
19673         rtx addr = XEXP (recog_data.operand[i], 0);
19674         return modified_in_p (addr, set_insn) != 0;
19675       }
19676   return false;
19677 }
19678
19679 static int
19680 ix86_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
19681 {
19682   enum attr_type insn_type, dep_insn_type;
19683   enum attr_memory memory;
19684   rtx set, set2;
19685   int dep_insn_code_number;
19686
19687   /* Anti and output dependencies have zero cost on all CPUs.  */
19688   if (REG_NOTE_KIND (link) != 0)
19689     return 0;
19690
19691   dep_insn_code_number = recog_memoized (dep_insn);
19692
19693   /* If we can't recognize the insns, we can't really do anything.  */
19694   if (dep_insn_code_number < 0 || recog_memoized (insn) < 0)
19695     return cost;
19696
19697   insn_type = get_attr_type (insn);
19698   dep_insn_type = get_attr_type (dep_insn);
19699
19700   switch (ix86_tune)
19701     {
19702     case PROCESSOR_PENTIUM:
19703       /* Address Generation Interlock adds a cycle of latency.  */
19704       if (insn_type == TYPE_LEA)
19705         {
19706           rtx addr = PATTERN (insn);
19707
19708           if (GET_CODE (addr) == PARALLEL)
19709             addr = XVECEXP (addr, 0, 0);
19710
19711           gcc_assert (GET_CODE (addr) == SET);
19712
19713           addr = SET_SRC (addr);
19714           if (modified_in_p (addr, dep_insn))
19715             cost += 1;
19716         }
19717       else if (ix86_agi_dependent (dep_insn, insn))
19718         cost += 1;
19719
19720       /* ??? Compares pair with jump/setcc.  */
19721       if (ix86_flags_dependent (insn, dep_insn, insn_type))
19722         cost = 0;
19723
19724       /* Floating point stores require value to be ready one cycle earlier.  */
19725       if (insn_type == TYPE_FMOV
19726           && get_attr_memory (insn) == MEMORY_STORE
19727           && !ix86_agi_dependent (dep_insn, insn))
19728         cost += 1;
19729       break;
19730
19731     case PROCESSOR_PENTIUMPRO:
19732       memory = get_attr_memory (insn);
19733
19734       /* INT->FP conversion is expensive.  */
19735       if (get_attr_fp_int_src (dep_insn))
19736         cost += 5;
19737
19738       /* There is one cycle extra latency between an FP op and a store.  */
19739       if (insn_type == TYPE_FMOV
19740           && (set = single_set (dep_insn)) != NULL_RTX
19741           && (set2 = single_set (insn)) != NULL_RTX
19742           && rtx_equal_p (SET_DEST (set), SET_SRC (set2))
19743           && MEM_P (SET_DEST (set2)))
19744         cost += 1;
19745
19746       /* Show ability of reorder buffer to hide latency of load by executing
19747          in parallel with previous instruction in case
19748          previous instruction is not needed to compute the address.  */
19749       if ((memory == MEMORY_LOAD || memory == MEMORY_BOTH)
19750           && !ix86_agi_dependent (dep_insn, insn))
19751         {
19752           /* Claim moves to take one cycle, as core can issue one load
19753              at time and the next load can start cycle later.  */
19754           if (dep_insn_type == TYPE_IMOV
19755               || dep_insn_type == TYPE_FMOV)
19756             cost = 1;
19757           else if (cost > 1)
19758             cost--;
19759         }
19760       break;
19761
19762     case PROCESSOR_K6:
19763       memory = get_attr_memory (insn);
19764
19765       /* The esp dependency is resolved before the instruction is really
19766          finished.  */
19767       if ((insn_type == TYPE_PUSH || insn_type == TYPE_POP)
19768           && (dep_insn_type == TYPE_PUSH || dep_insn_type == TYPE_POP))
19769         return 1;
19770
19771       /* INT->FP conversion is expensive.  */
19772       if (get_attr_fp_int_src (dep_insn))
19773         cost += 5;
19774
19775       /* Show ability of reorder buffer to hide latency of load by executing
19776          in parallel with previous instruction in case
19777          previous instruction is not needed to compute the address.  */
19778       if ((memory == MEMORY_LOAD || memory == MEMORY_BOTH)
19779           && !ix86_agi_dependent (dep_insn, insn))
19780         {
19781           /* Claim moves to take one cycle, as core can issue one load
19782              at time and the next load can start cycle later.  */
19783           if (dep_insn_type == TYPE_IMOV
19784               || dep_insn_type == TYPE_FMOV)
19785             cost = 1;
19786           else if (cost > 2)
19787             cost -= 2;
19788           else
19789             cost = 1;
19790         }
19791       break;
19792
19793     case PROCESSOR_ATHLON:
19794     case PROCESSOR_K8:
19795     case PROCESSOR_AMDFAM10:
19796     case PROCESSOR_ATOM:
19797     case PROCESSOR_GENERIC32:
19798     case PROCESSOR_GENERIC64:
19799       memory = get_attr_memory (insn);
19800
19801       /* Show ability of reorder buffer to hide latency of load by executing
19802          in parallel with previous instruction in case
19803          previous instruction is not needed to compute the address.  */
19804       if ((memory == MEMORY_LOAD || memory == MEMORY_BOTH)
19805           && !ix86_agi_dependent (dep_insn, insn))
19806         {
19807           enum attr_unit unit = get_attr_unit (insn);
19808           int loadcost = 3;
19809
19810           /* Because of the difference between the length of integer and
19811              floating unit pipeline preparation stages, the memory operands
19812              for floating point are cheaper.
19813
19814              ??? For Athlon it the difference is most probably 2.  */
19815           if (unit == UNIT_INTEGER || unit == UNIT_UNKNOWN)
19816             loadcost = 3;
19817           else
19818             loadcost = TARGET_ATHLON ? 2 : 0;
19819
19820           if (cost >= loadcost)
19821             cost -= loadcost;
19822           else
19823             cost = 0;
19824         }
19825
19826     default:
19827       break;
19828     }
19829
19830   return cost;
19831 }
19832
19833 /* How many alternative schedules to try.  This should be as wide as the
19834    scheduling freedom in the DFA, but no wider.  Making this value too
19835    large results extra work for the scheduler.  */
19836
19837 static int
19838 ia32_multipass_dfa_lookahead (void)
19839 {
19840   switch (ix86_tune)
19841     {
19842     case PROCESSOR_PENTIUM:
19843       return 2;
19844
19845     case PROCESSOR_PENTIUMPRO:
19846     case PROCESSOR_K6:
19847       return 1;
19848
19849     default:
19850       return 0;
19851     }
19852 }
19853
19854 \f
19855 /* Compute the alignment given to a constant that is being placed in memory.
19856    EXP is the constant and ALIGN is the alignment that the object would
19857    ordinarily have.
19858    The value of this function is used instead of that alignment to align
19859    the object.  */
19860
19861 int
19862 ix86_constant_alignment (tree exp, int align)
19863 {
19864   if (TREE_CODE (exp) == REAL_CST || TREE_CODE (exp) == VECTOR_CST
19865       || TREE_CODE (exp) == INTEGER_CST)
19866     {
19867       if (TYPE_MODE (TREE_TYPE (exp)) == DFmode && align < 64)
19868         return 64;
19869       else if (ALIGN_MODE_128 (TYPE_MODE (TREE_TYPE (exp))) && align < 128)
19870         return 128;
19871     }
19872   else if (!optimize_size && TREE_CODE (exp) == STRING_CST
19873            && TREE_STRING_LENGTH (exp) >= 31 && align < BITS_PER_WORD)
19874     return BITS_PER_WORD;
19875
19876   return align;
19877 }
19878
19879 /* Compute the alignment for a static variable.
19880    TYPE is the data type, and ALIGN is the alignment that
19881    the object would ordinarily have.  The value of this function is used
19882    instead of that alignment to align the object.  */
19883
19884 int
19885 ix86_data_alignment (tree type, int align)
19886 {
19887   int max_align = optimize_size ? BITS_PER_WORD : MIN (256, MAX_OFILE_ALIGNMENT);
19888
19889   if (AGGREGATE_TYPE_P (type)
19890       && TYPE_SIZE (type)
19891       && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
19892       && (TREE_INT_CST_LOW (TYPE_SIZE (type)) >= (unsigned) max_align
19893           || TREE_INT_CST_HIGH (TYPE_SIZE (type)))
19894       && align < max_align)
19895     align = max_align;
19896
19897   /* x86-64 ABI requires arrays greater than 16 bytes to be aligned
19898      to 16byte boundary.  */
19899   if (TARGET_64BIT)
19900     {
19901       if (AGGREGATE_TYPE_P (type)
19902            && TYPE_SIZE (type)
19903            && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
19904            && (TREE_INT_CST_LOW (TYPE_SIZE (type)) >= 128
19905                || TREE_INT_CST_HIGH (TYPE_SIZE (type))) && align < 128)
19906         return 128;
19907     }
19908
19909   if (TREE_CODE (type) == ARRAY_TYPE)
19910     {
19911       if (TYPE_MODE (TREE_TYPE (type)) == DFmode && align < 64)
19912         return 64;
19913       if (ALIGN_MODE_128 (TYPE_MODE (TREE_TYPE (type))) && align < 128)
19914         return 128;
19915     }
19916   else if (TREE_CODE (type) == COMPLEX_TYPE)
19917     {
19918
19919       if (TYPE_MODE (type) == DCmode && align < 64)
19920         return 64;
19921       if ((TYPE_MODE (type) == XCmode
19922            || TYPE_MODE (type) == TCmode) && align < 128)
19923         return 128;
19924     }
19925   else if ((TREE_CODE (type) == RECORD_TYPE
19926             || TREE_CODE (type) == UNION_TYPE
19927             || TREE_CODE (type) == QUAL_UNION_TYPE)
19928            && TYPE_FIELDS (type))
19929     {
19930       if (DECL_MODE (TYPE_FIELDS (type)) == DFmode && align < 64)
19931         return 64;
19932       if (ALIGN_MODE_128 (DECL_MODE (TYPE_FIELDS (type))) && align < 128)
19933         return 128;
19934     }
19935   else if (TREE_CODE (type) == REAL_TYPE || TREE_CODE (type) == VECTOR_TYPE
19936            || TREE_CODE (type) == INTEGER_TYPE)
19937     {
19938       if (TYPE_MODE (type) == DFmode && align < 64)
19939         return 64;
19940       if (ALIGN_MODE_128 (TYPE_MODE (type)) && align < 128)
19941         return 128;
19942     }
19943
19944   return align;
19945 }
19946
19947 /* Compute the alignment for a local variable or a stack slot.  EXP is
19948    the data type or decl itself, MODE is the widest mode available and
19949    ALIGN is the alignment that the object would ordinarily have.  The
19950    value of this macro is used instead of that alignment to align the
19951    object.  */
19952
19953 unsigned int
19954 ix86_local_alignment (tree exp, enum machine_mode mode,
19955                       unsigned int align)
19956 {
19957   tree type, decl;
19958
19959   if (exp && DECL_P (exp))
19960     {
19961       type = TREE_TYPE (exp);
19962       decl = exp;
19963     }
19964   else
19965     {
19966       type = exp;
19967       decl = NULL;
19968     }
19969
19970   /* Don't do dynamic stack realignment for long long objects with
19971      -mpreferred-stack-boundary=2.  */
19972   if (!TARGET_64BIT
19973       && align == 64
19974       && ix86_preferred_stack_boundary < 64
19975       && (mode == DImode || (type && TYPE_MODE (type) == DImode))
19976       && (!type || !TYPE_USER_ALIGN (type))
19977       && (!decl || !DECL_USER_ALIGN (decl)))
19978     align = 32;
19979
19980   /* If TYPE is NULL, we are allocating a stack slot for caller-save
19981      register in MODE.  We will return the largest alignment of XF
19982      and DF.  */
19983   if (!type)
19984     {
19985       if (mode == XFmode && align < GET_MODE_ALIGNMENT (DFmode))
19986         align = GET_MODE_ALIGNMENT (DFmode);
19987       return align;
19988     }
19989
19990   /* x86-64 ABI requires arrays greater than 16 bytes to be aligned
19991      to 16byte boundary.  */
19992   if (TARGET_64BIT)
19993     {
19994       if (AGGREGATE_TYPE_P (type)
19995            && TYPE_SIZE (type)
19996            && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
19997            && (TREE_INT_CST_LOW (TYPE_SIZE (type)) >= 16
19998                || TREE_INT_CST_HIGH (TYPE_SIZE (type))) && align < 128)
19999         return 128;
20000     }
20001   if (TREE_CODE (type) == ARRAY_TYPE)
20002     {
20003       if (TYPE_MODE (TREE_TYPE (type)) == DFmode && align < 64)
20004         return 64;
20005       if (ALIGN_MODE_128 (TYPE_MODE (TREE_TYPE (type))) && align < 128)
20006         return 128;
20007     }
20008   else if (TREE_CODE (type) == COMPLEX_TYPE)
20009     {
20010       if (TYPE_MODE (type) == DCmode && align < 64)
20011         return 64;
20012       if ((TYPE_MODE (type) == XCmode
20013            || TYPE_MODE (type) == TCmode) && align < 128)
20014         return 128;
20015     }
20016   else if ((TREE_CODE (type) == RECORD_TYPE
20017             || TREE_CODE (type) == UNION_TYPE
20018             || TREE_CODE (type) == QUAL_UNION_TYPE)
20019            && TYPE_FIELDS (type))
20020     {
20021       if (DECL_MODE (TYPE_FIELDS (type)) == DFmode && align < 64)
20022         return 64;
20023       if (ALIGN_MODE_128 (DECL_MODE (TYPE_FIELDS (type))) && align < 128)
20024         return 128;
20025     }
20026   else if (TREE_CODE (type) == REAL_TYPE || TREE_CODE (type) == VECTOR_TYPE
20027            || TREE_CODE (type) == INTEGER_TYPE)
20028     {
20029
20030       if (TYPE_MODE (type) == DFmode && align < 64)
20031         return 64;
20032       if (ALIGN_MODE_128 (TYPE_MODE (type)) && align < 128)
20033         return 128;
20034     }
20035   return align;
20036 }
20037
20038 /* Compute the minimum required alignment for dynamic stack realignment
20039    purposes for a local variable, parameter or a stack slot.  EXP is
20040    the data type or decl itself, MODE is its mode and ALIGN is the
20041    alignment that the object would ordinarily have.  */
20042
20043 unsigned int
20044 ix86_minimum_alignment (tree exp, enum machine_mode mode,
20045                         unsigned int align)
20046 {
20047   tree type, decl;
20048
20049   if (TARGET_64BIT || align != 64 || ix86_preferred_stack_boundary >= 64)
20050     return align;
20051
20052   if (exp && DECL_P (exp))
20053     {
20054       type = TREE_TYPE (exp);
20055       decl = exp;
20056     }
20057   else
20058     {
20059       type = exp;
20060       decl = NULL;
20061     }
20062
20063   /* Don't do dynamic stack realignment for long long objects with
20064      -mpreferred-stack-boundary=2.  */
20065   if ((mode == DImode || (type && TYPE_MODE (type) == DImode))
20066       && (!type || !TYPE_USER_ALIGN (type))
20067       && (!decl || !DECL_USER_ALIGN (decl)))
20068     return 32;
20069
20070   return align;
20071 }
20072 \f
20073 /* Find a location for the static chain incoming to a nested function.
20074    This is a register, unless all free registers are used by arguments.  */
20075
20076 static rtx
20077 ix86_static_chain (const_tree fndecl, bool incoming_p)
20078 {
20079   unsigned regno;
20080
20081   if (!DECL_STATIC_CHAIN (fndecl))
20082     return NULL;
20083
20084   if (TARGET_64BIT)
20085     {
20086       /* We always use R10 in 64-bit mode.  */
20087       regno = R10_REG;
20088     }
20089   else
20090     {
20091       tree fntype;
20092       /* By default in 32-bit mode we use ECX to pass the static chain.  */
20093       regno = CX_REG;
20094
20095       fntype = TREE_TYPE (fndecl);
20096       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (fntype)))
20097         {
20098           /* Fastcall functions use ecx/edx for arguments, which leaves
20099              us with EAX for the static chain.  */
20100           regno = AX_REG;
20101         }
20102       else if (ix86_function_regparm (fntype, fndecl) == 3)
20103         {
20104           /* For regparm 3, we have no free call-clobbered registers in
20105              which to store the static chain.  In order to implement this,
20106              we have the trampoline push the static chain to the stack.
20107              However, we can't push a value below the return address when
20108              we call the nested function directly, so we have to use an
20109              alternate entry point.  For this we use ESI, and have the
20110              alternate entry point push ESI, so that things appear the
20111              same once we're executing the nested function.  */
20112           if (incoming_p)
20113             {
20114               if (fndecl == current_function_decl)
20115                 ix86_static_chain_on_stack = true;
20116               return gen_frame_mem (SImode,
20117                                     plus_constant (arg_pointer_rtx, -8));
20118             }
20119           regno = SI_REG;
20120         }
20121     }
20122
20123   return gen_rtx_REG (Pmode, regno);
20124 }
20125
20126 /* Emit RTL insns to initialize the variable parts of a trampoline.
20127    FNDECL is the decl of the target address; M_TRAMP is a MEM for 
20128    the trampoline, and CHAIN_VALUE is an RTX for the static chain
20129    to be passed to the target function.  */
20130
20131 static void
20132 ix86_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
20133 {
20134   rtx mem, fnaddr;
20135
20136   fnaddr = XEXP (DECL_RTL (fndecl), 0);
20137
20138   if (!TARGET_64BIT)
20139     {
20140       rtx disp, chain;
20141       int opcode;
20142
20143       /* Depending on the static chain location, either load a register
20144          with a constant, or push the constant to the stack.  All of the
20145          instructions are the same size.  */
20146       chain = ix86_static_chain (fndecl, true);
20147       if (REG_P (chain))
20148         {
20149           if (REGNO (chain) == CX_REG)
20150             opcode = 0xb9;
20151           else if (REGNO (chain) == AX_REG)
20152             opcode = 0xb8;
20153           else
20154             gcc_unreachable ();
20155         }
20156       else
20157         opcode = 0x68;
20158
20159       mem = adjust_address (m_tramp, QImode, 0);
20160       emit_move_insn (mem, gen_int_mode (opcode, QImode));
20161
20162       mem = adjust_address (m_tramp, SImode, 1);
20163       emit_move_insn (mem, chain_value);
20164
20165       /* Compute offset from the end of the jmp to the target function.
20166          In the case in which the trampoline stores the static chain on
20167          the stack, we need to skip the first insn which pushes the
20168          (call-saved) register static chain; this push is 1 byte.  */
20169       disp = expand_binop (SImode, sub_optab, fnaddr,
20170                            plus_constant (XEXP (m_tramp, 0),
20171                                           MEM_P (chain) ? 9 : 10),
20172                            NULL_RTX, 1, OPTAB_DIRECT);
20173
20174       mem = adjust_address (m_tramp, QImode, 5);
20175       emit_move_insn (mem, gen_int_mode (0xe9, QImode));
20176
20177       mem = adjust_address (m_tramp, SImode, 6);
20178       emit_move_insn (mem, disp);
20179     }
20180   else
20181     {
20182       int offset = 0;
20183
20184       /* Load the function address to r11.  Try to load address using
20185          the shorter movl instead of movabs.  We may want to support
20186          movq for kernel mode, but kernel does not use trampolines at
20187          the moment.  */
20188       if (x86_64_zext_immediate_operand (fnaddr, VOIDmode))
20189         {
20190           fnaddr = copy_to_mode_reg (DImode, fnaddr);
20191
20192           mem = adjust_address (m_tramp, HImode, offset);
20193           emit_move_insn (mem, gen_int_mode (0xbb41, HImode));
20194
20195           mem = adjust_address (m_tramp, SImode, offset + 2);
20196           emit_move_insn (mem, gen_lowpart (SImode, fnaddr));
20197           offset += 6;
20198         }
20199       else
20200         {
20201           mem = adjust_address (m_tramp, HImode, offset);
20202           emit_move_insn (mem, gen_int_mode (0xbb49, HImode));
20203
20204           mem = adjust_address (m_tramp, DImode, offset + 2);
20205           emit_move_insn (mem, fnaddr);
20206           offset += 10;
20207         }
20208
20209       /* Load static chain using movabs to r10.  */
20210       mem = adjust_address (m_tramp, HImode, offset);
20211       emit_move_insn (mem, gen_int_mode (0xba49, HImode));
20212
20213       mem = adjust_address (m_tramp, DImode, offset + 2);
20214       emit_move_insn (mem, chain_value);
20215       offset += 10;
20216
20217       /* Jump to r11; the last (unused) byte is a nop, only there to
20218          pad the write out to a single 32-bit store.  */
20219       mem = adjust_address (m_tramp, SImode, offset);
20220       emit_move_insn (mem, gen_int_mode (0x90e3ff49, SImode));
20221       offset += 4;
20222
20223       gcc_assert (offset <= TRAMPOLINE_SIZE);
20224     }
20225
20226 #ifdef ENABLE_EXECUTE_STACK
20227 #ifdef CHECK_EXECUTE_STACK_ENABLED
20228   if (CHECK_EXECUTE_STACK_ENABLED)
20229 #endif
20230   emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__enable_execute_stack"),
20231                      LCT_NORMAL, VOIDmode, 1, XEXP (m_tramp, 0), Pmode);
20232 #endif
20233 }
20234 \f
20235 /* The following file contains several enumerations and data structures
20236    built from the definitions in i386-builtin-types.def.  */
20237
20238 #include "i386-builtin-types.inc"
20239
20240 /* Table for the ix86 builtin non-function types.  */
20241 static GTY(()) tree ix86_builtin_type_tab[(int) IX86_BT_LAST_CPTR + 1];
20242
20243 /* Retrieve an element from the above table, building some of
20244    the types lazily.  */
20245
20246 static tree
20247 ix86_get_builtin_type (enum ix86_builtin_type tcode)
20248 {
20249   unsigned int index;
20250   tree type, itype;
20251
20252   gcc_assert ((unsigned)tcode < ARRAY_SIZE(ix86_builtin_type_tab));
20253
20254   type = ix86_builtin_type_tab[(int) tcode];
20255   if (type != NULL)
20256     return type;
20257
20258   gcc_assert (tcode > IX86_BT_LAST_PRIM);
20259   if (tcode <= IX86_BT_LAST_VECT)
20260     {
20261       enum machine_mode mode;
20262
20263       index = tcode - IX86_BT_LAST_PRIM - 1;
20264       itype = ix86_get_builtin_type (ix86_builtin_type_vect_base[index]);
20265       mode = ix86_builtin_type_vect_mode[index];
20266
20267       type = build_vector_type_for_mode (itype, mode);
20268     }
20269   else
20270     {
20271       int quals;
20272
20273       index = tcode - IX86_BT_LAST_VECT - 1;
20274       if (tcode <= IX86_BT_LAST_PTR)
20275         quals = TYPE_UNQUALIFIED;
20276       else
20277         quals = TYPE_QUAL_CONST;
20278
20279       itype = ix86_get_builtin_type (ix86_builtin_type_ptr_base[index]);
20280       if (quals != TYPE_UNQUALIFIED)
20281         itype = build_qualified_type (itype, quals);
20282
20283       type = build_pointer_type (itype);
20284     }
20285
20286   ix86_builtin_type_tab[(int) tcode] = type;
20287   return type;
20288 }
20289
20290 /* Table for the ix86 builtin function types.  */
20291 static GTY(()) tree ix86_builtin_func_type_tab[(int) IX86_BT_LAST_ALIAS + 1];
20292
20293 /* Retrieve an element from the above table, building some of
20294    the types lazily.  */
20295
20296 static tree
20297 ix86_get_builtin_func_type (enum ix86_builtin_func_type tcode)
20298 {
20299   tree type;
20300
20301   gcc_assert ((unsigned)tcode < ARRAY_SIZE (ix86_builtin_func_type_tab));
20302
20303   type = ix86_builtin_func_type_tab[(int) tcode];
20304   if (type != NULL)
20305     return type;
20306
20307   if (tcode <= IX86_BT_LAST_FUNC)
20308     {
20309       unsigned start = ix86_builtin_func_start[(int) tcode];
20310       unsigned after = ix86_builtin_func_start[(int) tcode + 1];
20311       tree rtype, atype, args = void_list_node;
20312       unsigned i;
20313
20314       rtype = ix86_get_builtin_type (ix86_builtin_func_args[start]);
20315       for (i = after - 1; i > start; --i)
20316         {
20317           atype = ix86_get_builtin_type (ix86_builtin_func_args[i]);
20318           args = tree_cons (NULL, atype, args);
20319         }
20320
20321       type = build_function_type (rtype, args);
20322     }
20323   else
20324     {
20325       unsigned index = tcode - IX86_BT_LAST_FUNC - 1;
20326       enum ix86_builtin_func_type icode;
20327
20328       icode = ix86_builtin_func_alias_base[index];
20329       type = ix86_get_builtin_func_type (icode);
20330     }
20331
20332   ix86_builtin_func_type_tab[(int) tcode] = type;
20333   return type;
20334 }
20335
20336
20337 /* Codes for all the SSE/MMX builtins.  */
20338 enum ix86_builtins
20339 {
20340   IX86_BUILTIN_ADDPS,
20341   IX86_BUILTIN_ADDSS,
20342   IX86_BUILTIN_DIVPS,
20343   IX86_BUILTIN_DIVSS,
20344   IX86_BUILTIN_MULPS,
20345   IX86_BUILTIN_MULSS,
20346   IX86_BUILTIN_SUBPS,
20347   IX86_BUILTIN_SUBSS,
20348
20349   IX86_BUILTIN_CMPEQPS,
20350   IX86_BUILTIN_CMPLTPS,
20351   IX86_BUILTIN_CMPLEPS,
20352   IX86_BUILTIN_CMPGTPS,
20353   IX86_BUILTIN_CMPGEPS,
20354   IX86_BUILTIN_CMPNEQPS,
20355   IX86_BUILTIN_CMPNLTPS,
20356   IX86_BUILTIN_CMPNLEPS,
20357   IX86_BUILTIN_CMPNGTPS,
20358   IX86_BUILTIN_CMPNGEPS,
20359   IX86_BUILTIN_CMPORDPS,
20360   IX86_BUILTIN_CMPUNORDPS,
20361   IX86_BUILTIN_CMPEQSS,
20362   IX86_BUILTIN_CMPLTSS,
20363   IX86_BUILTIN_CMPLESS,
20364   IX86_BUILTIN_CMPNEQSS,
20365   IX86_BUILTIN_CMPNLTSS,
20366   IX86_BUILTIN_CMPNLESS,
20367   IX86_BUILTIN_CMPNGTSS,
20368   IX86_BUILTIN_CMPNGESS,
20369   IX86_BUILTIN_CMPORDSS,
20370   IX86_BUILTIN_CMPUNORDSS,
20371
20372   IX86_BUILTIN_COMIEQSS,
20373   IX86_BUILTIN_COMILTSS,
20374   IX86_BUILTIN_COMILESS,
20375   IX86_BUILTIN_COMIGTSS,
20376   IX86_BUILTIN_COMIGESS,
20377   IX86_BUILTIN_COMINEQSS,
20378   IX86_BUILTIN_UCOMIEQSS,
20379   IX86_BUILTIN_UCOMILTSS,
20380   IX86_BUILTIN_UCOMILESS,
20381   IX86_BUILTIN_UCOMIGTSS,
20382   IX86_BUILTIN_UCOMIGESS,
20383   IX86_BUILTIN_UCOMINEQSS,
20384
20385   IX86_BUILTIN_CVTPI2PS,
20386   IX86_BUILTIN_CVTPS2PI,
20387   IX86_BUILTIN_CVTSI2SS,
20388   IX86_BUILTIN_CVTSI642SS,
20389   IX86_BUILTIN_CVTSS2SI,
20390   IX86_BUILTIN_CVTSS2SI64,
20391   IX86_BUILTIN_CVTTPS2PI,
20392   IX86_BUILTIN_CVTTSS2SI,
20393   IX86_BUILTIN_CVTTSS2SI64,
20394
20395   IX86_BUILTIN_MAXPS,
20396   IX86_BUILTIN_MAXSS,
20397   IX86_BUILTIN_MINPS,
20398   IX86_BUILTIN_MINSS,
20399
20400   IX86_BUILTIN_LOADUPS,
20401   IX86_BUILTIN_STOREUPS,
20402   IX86_BUILTIN_MOVSS,
20403
20404   IX86_BUILTIN_MOVHLPS,
20405   IX86_BUILTIN_MOVLHPS,
20406   IX86_BUILTIN_LOADHPS,
20407   IX86_BUILTIN_LOADLPS,
20408   IX86_BUILTIN_STOREHPS,
20409   IX86_BUILTIN_STORELPS,
20410
20411   IX86_BUILTIN_MASKMOVQ,
20412   IX86_BUILTIN_MOVMSKPS,
20413   IX86_BUILTIN_PMOVMSKB,
20414
20415   IX86_BUILTIN_MOVNTPS,
20416   IX86_BUILTIN_MOVNTQ,
20417
20418   IX86_BUILTIN_LOADDQU,
20419   IX86_BUILTIN_STOREDQU,
20420
20421   IX86_BUILTIN_PACKSSWB,
20422   IX86_BUILTIN_PACKSSDW,
20423   IX86_BUILTIN_PACKUSWB,
20424
20425   IX86_BUILTIN_PADDB,
20426   IX86_BUILTIN_PADDW,
20427   IX86_BUILTIN_PADDD,
20428   IX86_BUILTIN_PADDQ,
20429   IX86_BUILTIN_PADDSB,
20430   IX86_BUILTIN_PADDSW,
20431   IX86_BUILTIN_PADDUSB,
20432   IX86_BUILTIN_PADDUSW,
20433   IX86_BUILTIN_PSUBB,
20434   IX86_BUILTIN_PSUBW,
20435   IX86_BUILTIN_PSUBD,
20436   IX86_BUILTIN_PSUBQ,
20437   IX86_BUILTIN_PSUBSB,
20438   IX86_BUILTIN_PSUBSW,
20439   IX86_BUILTIN_PSUBUSB,
20440   IX86_BUILTIN_PSUBUSW,
20441
20442   IX86_BUILTIN_PAND,
20443   IX86_BUILTIN_PANDN,
20444   IX86_BUILTIN_POR,
20445   IX86_BUILTIN_PXOR,
20446
20447   IX86_BUILTIN_PAVGB,
20448   IX86_BUILTIN_PAVGW,
20449
20450   IX86_BUILTIN_PCMPEQB,
20451   IX86_BUILTIN_PCMPEQW,
20452   IX86_BUILTIN_PCMPEQD,
20453   IX86_BUILTIN_PCMPGTB,
20454   IX86_BUILTIN_PCMPGTW,
20455   IX86_BUILTIN_PCMPGTD,
20456
20457   IX86_BUILTIN_PMADDWD,
20458
20459   IX86_BUILTIN_PMAXSW,
20460   IX86_BUILTIN_PMAXUB,
20461   IX86_BUILTIN_PMINSW,
20462   IX86_BUILTIN_PMINUB,
20463
20464   IX86_BUILTIN_PMULHUW,
20465   IX86_BUILTIN_PMULHW,
20466   IX86_BUILTIN_PMULLW,
20467
20468   IX86_BUILTIN_PSADBW,
20469   IX86_BUILTIN_PSHUFW,
20470
20471   IX86_BUILTIN_PSLLW,
20472   IX86_BUILTIN_PSLLD,
20473   IX86_BUILTIN_PSLLQ,
20474   IX86_BUILTIN_PSRAW,
20475   IX86_BUILTIN_PSRAD,
20476   IX86_BUILTIN_PSRLW,
20477   IX86_BUILTIN_PSRLD,
20478   IX86_BUILTIN_PSRLQ,
20479   IX86_BUILTIN_PSLLWI,
20480   IX86_BUILTIN_PSLLDI,
20481   IX86_BUILTIN_PSLLQI,
20482   IX86_BUILTIN_PSRAWI,
20483   IX86_BUILTIN_PSRADI,
20484   IX86_BUILTIN_PSRLWI,
20485   IX86_BUILTIN_PSRLDI,
20486   IX86_BUILTIN_PSRLQI,
20487
20488   IX86_BUILTIN_PUNPCKHBW,
20489   IX86_BUILTIN_PUNPCKHWD,
20490   IX86_BUILTIN_PUNPCKHDQ,
20491   IX86_BUILTIN_PUNPCKLBW,
20492   IX86_BUILTIN_PUNPCKLWD,
20493   IX86_BUILTIN_PUNPCKLDQ,
20494
20495   IX86_BUILTIN_SHUFPS,
20496
20497   IX86_BUILTIN_RCPPS,
20498   IX86_BUILTIN_RCPSS,
20499   IX86_BUILTIN_RSQRTPS,
20500   IX86_BUILTIN_RSQRTPS_NR,
20501   IX86_BUILTIN_RSQRTSS,
20502   IX86_BUILTIN_RSQRTF,
20503   IX86_BUILTIN_SQRTPS,
20504   IX86_BUILTIN_SQRTPS_NR,
20505   IX86_BUILTIN_SQRTSS,
20506
20507   IX86_BUILTIN_UNPCKHPS,
20508   IX86_BUILTIN_UNPCKLPS,
20509
20510   IX86_BUILTIN_ANDPS,
20511   IX86_BUILTIN_ANDNPS,
20512   IX86_BUILTIN_ORPS,
20513   IX86_BUILTIN_XORPS,
20514
20515   IX86_BUILTIN_EMMS,
20516   IX86_BUILTIN_LDMXCSR,
20517   IX86_BUILTIN_STMXCSR,
20518   IX86_BUILTIN_SFENCE,
20519
20520   /* 3DNow! Original */
20521   IX86_BUILTIN_FEMMS,
20522   IX86_BUILTIN_PAVGUSB,
20523   IX86_BUILTIN_PF2ID,
20524   IX86_BUILTIN_PFACC,
20525   IX86_BUILTIN_PFADD,
20526   IX86_BUILTIN_PFCMPEQ,
20527   IX86_BUILTIN_PFCMPGE,
20528   IX86_BUILTIN_PFCMPGT,
20529   IX86_BUILTIN_PFMAX,
20530   IX86_BUILTIN_PFMIN,
20531   IX86_BUILTIN_PFMUL,
20532   IX86_BUILTIN_PFRCP,
20533   IX86_BUILTIN_PFRCPIT1,
20534   IX86_BUILTIN_PFRCPIT2,
20535   IX86_BUILTIN_PFRSQIT1,
20536   IX86_BUILTIN_PFRSQRT,
20537   IX86_BUILTIN_PFSUB,
20538   IX86_BUILTIN_PFSUBR,
20539   IX86_BUILTIN_PI2FD,
20540   IX86_BUILTIN_PMULHRW,
20541
20542   /* 3DNow! Athlon Extensions */
20543   IX86_BUILTIN_PF2IW,
20544   IX86_BUILTIN_PFNACC,
20545   IX86_BUILTIN_PFPNACC,
20546   IX86_BUILTIN_PI2FW,
20547   IX86_BUILTIN_PSWAPDSI,
20548   IX86_BUILTIN_PSWAPDSF,
20549
20550   /* SSE2 */
20551   IX86_BUILTIN_ADDPD,
20552   IX86_BUILTIN_ADDSD,
20553   IX86_BUILTIN_DIVPD,
20554   IX86_BUILTIN_DIVSD,
20555   IX86_BUILTIN_MULPD,
20556   IX86_BUILTIN_MULSD,
20557   IX86_BUILTIN_SUBPD,
20558   IX86_BUILTIN_SUBSD,
20559
20560   IX86_BUILTIN_CMPEQPD,
20561   IX86_BUILTIN_CMPLTPD,
20562   IX86_BUILTIN_CMPLEPD,
20563   IX86_BUILTIN_CMPGTPD,
20564   IX86_BUILTIN_CMPGEPD,
20565   IX86_BUILTIN_CMPNEQPD,
20566   IX86_BUILTIN_CMPNLTPD,
20567   IX86_BUILTIN_CMPNLEPD,
20568   IX86_BUILTIN_CMPNGTPD,
20569   IX86_BUILTIN_CMPNGEPD,
20570   IX86_BUILTIN_CMPORDPD,
20571   IX86_BUILTIN_CMPUNORDPD,
20572   IX86_BUILTIN_CMPEQSD,
20573   IX86_BUILTIN_CMPLTSD,
20574   IX86_BUILTIN_CMPLESD,
20575   IX86_BUILTIN_CMPNEQSD,
20576   IX86_BUILTIN_CMPNLTSD,
20577   IX86_BUILTIN_CMPNLESD,
20578   IX86_BUILTIN_CMPORDSD,
20579   IX86_BUILTIN_CMPUNORDSD,
20580
20581   IX86_BUILTIN_COMIEQSD,
20582   IX86_BUILTIN_COMILTSD,
20583   IX86_BUILTIN_COMILESD,
20584   IX86_BUILTIN_COMIGTSD,
20585   IX86_BUILTIN_COMIGESD,
20586   IX86_BUILTIN_COMINEQSD,
20587   IX86_BUILTIN_UCOMIEQSD,
20588   IX86_BUILTIN_UCOMILTSD,
20589   IX86_BUILTIN_UCOMILESD,
20590   IX86_BUILTIN_UCOMIGTSD,
20591   IX86_BUILTIN_UCOMIGESD,
20592   IX86_BUILTIN_UCOMINEQSD,
20593
20594   IX86_BUILTIN_MAXPD,
20595   IX86_BUILTIN_MAXSD,
20596   IX86_BUILTIN_MINPD,
20597   IX86_BUILTIN_MINSD,
20598
20599   IX86_BUILTIN_ANDPD,
20600   IX86_BUILTIN_ANDNPD,
20601   IX86_BUILTIN_ORPD,
20602   IX86_BUILTIN_XORPD,
20603
20604   IX86_BUILTIN_SQRTPD,
20605   IX86_BUILTIN_SQRTSD,
20606
20607   IX86_BUILTIN_UNPCKHPD,
20608   IX86_BUILTIN_UNPCKLPD,
20609
20610   IX86_BUILTIN_SHUFPD,
20611
20612   IX86_BUILTIN_LOADUPD,
20613   IX86_BUILTIN_STOREUPD,
20614   IX86_BUILTIN_MOVSD,
20615
20616   IX86_BUILTIN_LOADHPD,
20617   IX86_BUILTIN_LOADLPD,
20618
20619   IX86_BUILTIN_CVTDQ2PD,
20620   IX86_BUILTIN_CVTDQ2PS,
20621
20622   IX86_BUILTIN_CVTPD2DQ,
20623   IX86_BUILTIN_CVTPD2PI,
20624   IX86_BUILTIN_CVTPD2PS,
20625   IX86_BUILTIN_CVTTPD2DQ,
20626   IX86_BUILTIN_CVTTPD2PI,
20627
20628   IX86_BUILTIN_CVTPI2PD,
20629   IX86_BUILTIN_CVTSI2SD,
20630   IX86_BUILTIN_CVTSI642SD,
20631
20632   IX86_BUILTIN_CVTSD2SI,
20633   IX86_BUILTIN_CVTSD2SI64,
20634   IX86_BUILTIN_CVTSD2SS,
20635   IX86_BUILTIN_CVTSS2SD,
20636   IX86_BUILTIN_CVTTSD2SI,
20637   IX86_BUILTIN_CVTTSD2SI64,
20638
20639   IX86_BUILTIN_CVTPS2DQ,
20640   IX86_BUILTIN_CVTPS2PD,
20641   IX86_BUILTIN_CVTTPS2DQ,
20642
20643   IX86_BUILTIN_MOVNTI,
20644   IX86_BUILTIN_MOVNTPD,
20645   IX86_BUILTIN_MOVNTDQ,
20646
20647   IX86_BUILTIN_MOVQ128,
20648
20649   /* SSE2 MMX */
20650   IX86_BUILTIN_MASKMOVDQU,
20651   IX86_BUILTIN_MOVMSKPD,
20652   IX86_BUILTIN_PMOVMSKB128,
20653
20654   IX86_BUILTIN_PACKSSWB128,
20655   IX86_BUILTIN_PACKSSDW128,
20656   IX86_BUILTIN_PACKUSWB128,
20657
20658   IX86_BUILTIN_PADDB128,
20659   IX86_BUILTIN_PADDW128,
20660   IX86_BUILTIN_PADDD128,
20661   IX86_BUILTIN_PADDQ128,
20662   IX86_BUILTIN_PADDSB128,
20663   IX86_BUILTIN_PADDSW128,
20664   IX86_BUILTIN_PADDUSB128,
20665   IX86_BUILTIN_PADDUSW128,
20666   IX86_BUILTIN_PSUBB128,
20667   IX86_BUILTIN_PSUBW128,
20668   IX86_BUILTIN_PSUBD128,
20669   IX86_BUILTIN_PSUBQ128,
20670   IX86_BUILTIN_PSUBSB128,
20671   IX86_BUILTIN_PSUBSW128,
20672   IX86_BUILTIN_PSUBUSB128,
20673   IX86_BUILTIN_PSUBUSW128,
20674
20675   IX86_BUILTIN_PAND128,
20676   IX86_BUILTIN_PANDN128,
20677   IX86_BUILTIN_POR128,
20678   IX86_BUILTIN_PXOR128,
20679
20680   IX86_BUILTIN_PAVGB128,
20681   IX86_BUILTIN_PAVGW128,
20682
20683   IX86_BUILTIN_PCMPEQB128,
20684   IX86_BUILTIN_PCMPEQW128,
20685   IX86_BUILTIN_PCMPEQD128,
20686   IX86_BUILTIN_PCMPGTB128,
20687   IX86_BUILTIN_PCMPGTW128,
20688   IX86_BUILTIN_PCMPGTD128,
20689
20690   IX86_BUILTIN_PMADDWD128,
20691
20692   IX86_BUILTIN_PMAXSW128,
20693   IX86_BUILTIN_PMAXUB128,
20694   IX86_BUILTIN_PMINSW128,
20695   IX86_BUILTIN_PMINUB128,
20696
20697   IX86_BUILTIN_PMULUDQ,
20698   IX86_BUILTIN_PMULUDQ128,
20699   IX86_BUILTIN_PMULHUW128,
20700   IX86_BUILTIN_PMULHW128,
20701   IX86_BUILTIN_PMULLW128,
20702
20703   IX86_BUILTIN_PSADBW128,
20704   IX86_BUILTIN_PSHUFHW,
20705   IX86_BUILTIN_PSHUFLW,
20706   IX86_BUILTIN_PSHUFD,
20707
20708   IX86_BUILTIN_PSLLDQI128,
20709   IX86_BUILTIN_PSLLWI128,
20710   IX86_BUILTIN_PSLLDI128,
20711   IX86_BUILTIN_PSLLQI128,
20712   IX86_BUILTIN_PSRAWI128,
20713   IX86_BUILTIN_PSRADI128,
20714   IX86_BUILTIN_PSRLDQI128,
20715   IX86_BUILTIN_PSRLWI128,
20716   IX86_BUILTIN_PSRLDI128,
20717   IX86_BUILTIN_PSRLQI128,
20718
20719   IX86_BUILTIN_PSLLDQ128,
20720   IX86_BUILTIN_PSLLW128,
20721   IX86_BUILTIN_PSLLD128,
20722   IX86_BUILTIN_PSLLQ128,
20723   IX86_BUILTIN_PSRAW128,
20724   IX86_BUILTIN_PSRAD128,
20725   IX86_BUILTIN_PSRLW128,
20726   IX86_BUILTIN_PSRLD128,
20727   IX86_BUILTIN_PSRLQ128,
20728
20729   IX86_BUILTIN_PUNPCKHBW128,
20730   IX86_BUILTIN_PUNPCKHWD128,
20731   IX86_BUILTIN_PUNPCKHDQ128,
20732   IX86_BUILTIN_PUNPCKHQDQ128,
20733   IX86_BUILTIN_PUNPCKLBW128,
20734   IX86_BUILTIN_PUNPCKLWD128,
20735   IX86_BUILTIN_PUNPCKLDQ128,
20736   IX86_BUILTIN_PUNPCKLQDQ128,
20737
20738   IX86_BUILTIN_CLFLUSH,
20739   IX86_BUILTIN_MFENCE,
20740   IX86_BUILTIN_LFENCE,
20741
20742   IX86_BUILTIN_BSRSI,
20743   IX86_BUILTIN_BSRDI,
20744   IX86_BUILTIN_RDPMC,
20745   IX86_BUILTIN_RDTSC,
20746   IX86_BUILTIN_RDTSCP,
20747   IX86_BUILTIN_ROLQI,
20748   IX86_BUILTIN_ROLHI,
20749   IX86_BUILTIN_RORQI,
20750   IX86_BUILTIN_RORHI,
20751
20752   /* SSE3.  */
20753   IX86_BUILTIN_ADDSUBPS,
20754   IX86_BUILTIN_HADDPS,
20755   IX86_BUILTIN_HSUBPS,
20756   IX86_BUILTIN_MOVSHDUP,
20757   IX86_BUILTIN_MOVSLDUP,
20758   IX86_BUILTIN_ADDSUBPD,
20759   IX86_BUILTIN_HADDPD,
20760   IX86_BUILTIN_HSUBPD,
20761   IX86_BUILTIN_LDDQU,
20762
20763   IX86_BUILTIN_MONITOR,
20764   IX86_BUILTIN_MWAIT,
20765
20766   /* SSSE3.  */
20767   IX86_BUILTIN_PHADDW,
20768   IX86_BUILTIN_PHADDD,
20769   IX86_BUILTIN_PHADDSW,
20770   IX86_BUILTIN_PHSUBW,
20771   IX86_BUILTIN_PHSUBD,
20772   IX86_BUILTIN_PHSUBSW,
20773   IX86_BUILTIN_PMADDUBSW,
20774   IX86_BUILTIN_PMULHRSW,
20775   IX86_BUILTIN_PSHUFB,
20776   IX86_BUILTIN_PSIGNB,
20777   IX86_BUILTIN_PSIGNW,
20778   IX86_BUILTIN_PSIGND,
20779   IX86_BUILTIN_PALIGNR,
20780   IX86_BUILTIN_PABSB,
20781   IX86_BUILTIN_PABSW,
20782   IX86_BUILTIN_PABSD,
20783
20784   IX86_BUILTIN_PHADDW128,
20785   IX86_BUILTIN_PHADDD128,
20786   IX86_BUILTIN_PHADDSW128,
20787   IX86_BUILTIN_PHSUBW128,
20788   IX86_BUILTIN_PHSUBD128,
20789   IX86_BUILTIN_PHSUBSW128,
20790   IX86_BUILTIN_PMADDUBSW128,
20791   IX86_BUILTIN_PMULHRSW128,
20792   IX86_BUILTIN_PSHUFB128,
20793   IX86_BUILTIN_PSIGNB128,
20794   IX86_BUILTIN_PSIGNW128,
20795   IX86_BUILTIN_PSIGND128,
20796   IX86_BUILTIN_PALIGNR128,
20797   IX86_BUILTIN_PABSB128,
20798   IX86_BUILTIN_PABSW128,
20799   IX86_BUILTIN_PABSD128,
20800
20801   /* AMDFAM10 - SSE4A New Instructions.  */
20802   IX86_BUILTIN_MOVNTSD,
20803   IX86_BUILTIN_MOVNTSS,
20804   IX86_BUILTIN_EXTRQI,
20805   IX86_BUILTIN_EXTRQ,
20806   IX86_BUILTIN_INSERTQI,
20807   IX86_BUILTIN_INSERTQ,
20808
20809   /* SSE4.1.  */
20810   IX86_BUILTIN_BLENDPD,
20811   IX86_BUILTIN_BLENDPS,
20812   IX86_BUILTIN_BLENDVPD,
20813   IX86_BUILTIN_BLENDVPS,
20814   IX86_BUILTIN_PBLENDVB128,
20815   IX86_BUILTIN_PBLENDW128,
20816
20817   IX86_BUILTIN_DPPD,
20818   IX86_BUILTIN_DPPS,
20819
20820   IX86_BUILTIN_INSERTPS128,
20821
20822   IX86_BUILTIN_MOVNTDQA,
20823   IX86_BUILTIN_MPSADBW128,
20824   IX86_BUILTIN_PACKUSDW128,
20825   IX86_BUILTIN_PCMPEQQ,
20826   IX86_BUILTIN_PHMINPOSUW128,
20827
20828   IX86_BUILTIN_PMAXSB128,
20829   IX86_BUILTIN_PMAXSD128,
20830   IX86_BUILTIN_PMAXUD128,
20831   IX86_BUILTIN_PMAXUW128,
20832
20833   IX86_BUILTIN_PMINSB128,
20834   IX86_BUILTIN_PMINSD128,
20835   IX86_BUILTIN_PMINUD128,
20836   IX86_BUILTIN_PMINUW128,
20837
20838   IX86_BUILTIN_PMOVSXBW128,
20839   IX86_BUILTIN_PMOVSXBD128,
20840   IX86_BUILTIN_PMOVSXBQ128,
20841   IX86_BUILTIN_PMOVSXWD128,
20842   IX86_BUILTIN_PMOVSXWQ128,
20843   IX86_BUILTIN_PMOVSXDQ128,
20844
20845   IX86_BUILTIN_PMOVZXBW128,
20846   IX86_BUILTIN_PMOVZXBD128,
20847   IX86_BUILTIN_PMOVZXBQ128,
20848   IX86_BUILTIN_PMOVZXWD128,
20849   IX86_BUILTIN_PMOVZXWQ128,
20850   IX86_BUILTIN_PMOVZXDQ128,
20851
20852   IX86_BUILTIN_PMULDQ128,
20853   IX86_BUILTIN_PMULLD128,
20854
20855   IX86_BUILTIN_ROUNDPD,
20856   IX86_BUILTIN_ROUNDPS,
20857   IX86_BUILTIN_ROUNDSD,
20858   IX86_BUILTIN_ROUNDSS,
20859
20860   IX86_BUILTIN_PTESTZ,
20861   IX86_BUILTIN_PTESTC,
20862   IX86_BUILTIN_PTESTNZC,
20863
20864   IX86_BUILTIN_VEC_INIT_V2SI,
20865   IX86_BUILTIN_VEC_INIT_V4HI,
20866   IX86_BUILTIN_VEC_INIT_V8QI,
20867   IX86_BUILTIN_VEC_EXT_V2DF,
20868   IX86_BUILTIN_VEC_EXT_V2DI,
20869   IX86_BUILTIN_VEC_EXT_V4SF,
20870   IX86_BUILTIN_VEC_EXT_V4SI,
20871   IX86_BUILTIN_VEC_EXT_V8HI,
20872   IX86_BUILTIN_VEC_EXT_V2SI,
20873   IX86_BUILTIN_VEC_EXT_V4HI,
20874   IX86_BUILTIN_VEC_EXT_V16QI,
20875   IX86_BUILTIN_VEC_SET_V2DI,
20876   IX86_BUILTIN_VEC_SET_V4SF,
20877   IX86_BUILTIN_VEC_SET_V4SI,
20878   IX86_BUILTIN_VEC_SET_V8HI,
20879   IX86_BUILTIN_VEC_SET_V4HI,
20880   IX86_BUILTIN_VEC_SET_V16QI,
20881
20882   IX86_BUILTIN_VEC_PACK_SFIX,
20883
20884   /* SSE4.2.  */
20885   IX86_BUILTIN_CRC32QI,
20886   IX86_BUILTIN_CRC32HI,
20887   IX86_BUILTIN_CRC32SI,
20888   IX86_BUILTIN_CRC32DI,
20889
20890   IX86_BUILTIN_PCMPESTRI128,
20891   IX86_BUILTIN_PCMPESTRM128,
20892   IX86_BUILTIN_PCMPESTRA128,
20893   IX86_BUILTIN_PCMPESTRC128,
20894   IX86_BUILTIN_PCMPESTRO128,
20895   IX86_BUILTIN_PCMPESTRS128,
20896   IX86_BUILTIN_PCMPESTRZ128,
20897   IX86_BUILTIN_PCMPISTRI128,
20898   IX86_BUILTIN_PCMPISTRM128,
20899   IX86_BUILTIN_PCMPISTRA128,
20900   IX86_BUILTIN_PCMPISTRC128,
20901   IX86_BUILTIN_PCMPISTRO128,
20902   IX86_BUILTIN_PCMPISTRS128,
20903   IX86_BUILTIN_PCMPISTRZ128,
20904
20905   IX86_BUILTIN_PCMPGTQ,
20906
20907   /* AES instructions */
20908   IX86_BUILTIN_AESENC128,
20909   IX86_BUILTIN_AESENCLAST128,
20910   IX86_BUILTIN_AESDEC128,
20911   IX86_BUILTIN_AESDECLAST128,
20912   IX86_BUILTIN_AESIMC128,
20913   IX86_BUILTIN_AESKEYGENASSIST128,
20914
20915   /* PCLMUL instruction */
20916   IX86_BUILTIN_PCLMULQDQ128,
20917
20918   /* AVX */
20919   IX86_BUILTIN_ADDPD256,
20920   IX86_BUILTIN_ADDPS256,
20921   IX86_BUILTIN_ADDSUBPD256,
20922   IX86_BUILTIN_ADDSUBPS256,
20923   IX86_BUILTIN_ANDPD256,
20924   IX86_BUILTIN_ANDPS256,
20925   IX86_BUILTIN_ANDNPD256,
20926   IX86_BUILTIN_ANDNPS256,
20927   IX86_BUILTIN_BLENDPD256,
20928   IX86_BUILTIN_BLENDPS256,
20929   IX86_BUILTIN_BLENDVPD256,
20930   IX86_BUILTIN_BLENDVPS256,
20931   IX86_BUILTIN_DIVPD256,
20932   IX86_BUILTIN_DIVPS256,
20933   IX86_BUILTIN_DPPS256,
20934   IX86_BUILTIN_HADDPD256,
20935   IX86_BUILTIN_HADDPS256,
20936   IX86_BUILTIN_HSUBPD256,
20937   IX86_BUILTIN_HSUBPS256,
20938   IX86_BUILTIN_MAXPD256,
20939   IX86_BUILTIN_MAXPS256,
20940   IX86_BUILTIN_MINPD256,
20941   IX86_BUILTIN_MINPS256,
20942   IX86_BUILTIN_MULPD256,
20943   IX86_BUILTIN_MULPS256,
20944   IX86_BUILTIN_ORPD256,
20945   IX86_BUILTIN_ORPS256,
20946   IX86_BUILTIN_SHUFPD256,
20947   IX86_BUILTIN_SHUFPS256,
20948   IX86_BUILTIN_SUBPD256,
20949   IX86_BUILTIN_SUBPS256,
20950   IX86_BUILTIN_XORPD256,
20951   IX86_BUILTIN_XORPS256,
20952   IX86_BUILTIN_CMPSD,
20953   IX86_BUILTIN_CMPSS,
20954   IX86_BUILTIN_CMPPD,
20955   IX86_BUILTIN_CMPPS,
20956   IX86_BUILTIN_CMPPD256,
20957   IX86_BUILTIN_CMPPS256,
20958   IX86_BUILTIN_CVTDQ2PD256,
20959   IX86_BUILTIN_CVTDQ2PS256,
20960   IX86_BUILTIN_CVTPD2PS256,
20961   IX86_BUILTIN_CVTPS2DQ256,
20962   IX86_BUILTIN_CVTPS2PD256,
20963   IX86_BUILTIN_CVTTPD2DQ256,
20964   IX86_BUILTIN_CVTPD2DQ256,
20965   IX86_BUILTIN_CVTTPS2DQ256,
20966   IX86_BUILTIN_EXTRACTF128PD256,
20967   IX86_BUILTIN_EXTRACTF128PS256,
20968   IX86_BUILTIN_EXTRACTF128SI256,
20969   IX86_BUILTIN_VZEROALL,
20970   IX86_BUILTIN_VZEROUPPER,
20971   IX86_BUILTIN_VPERMILVARPD,
20972   IX86_BUILTIN_VPERMILVARPS,
20973   IX86_BUILTIN_VPERMILVARPD256,
20974   IX86_BUILTIN_VPERMILVARPS256,
20975   IX86_BUILTIN_VPERMILPD,
20976   IX86_BUILTIN_VPERMILPS,
20977   IX86_BUILTIN_VPERMILPD256,
20978   IX86_BUILTIN_VPERMILPS256,
20979   IX86_BUILTIN_VPERM2F128PD256,
20980   IX86_BUILTIN_VPERM2F128PS256,
20981   IX86_BUILTIN_VPERM2F128SI256,
20982   IX86_BUILTIN_VBROADCASTSS,
20983   IX86_BUILTIN_VBROADCASTSD256,
20984   IX86_BUILTIN_VBROADCASTSS256,
20985   IX86_BUILTIN_VBROADCASTPD256,
20986   IX86_BUILTIN_VBROADCASTPS256,
20987   IX86_BUILTIN_VINSERTF128PD256,
20988   IX86_BUILTIN_VINSERTF128PS256,
20989   IX86_BUILTIN_VINSERTF128SI256,
20990   IX86_BUILTIN_LOADUPD256,
20991   IX86_BUILTIN_LOADUPS256,
20992   IX86_BUILTIN_STOREUPD256,
20993   IX86_BUILTIN_STOREUPS256,
20994   IX86_BUILTIN_LDDQU256,
20995   IX86_BUILTIN_MOVNTDQ256,
20996   IX86_BUILTIN_MOVNTPD256,
20997   IX86_BUILTIN_MOVNTPS256,
20998   IX86_BUILTIN_LOADDQU256,
20999   IX86_BUILTIN_STOREDQU256,
21000   IX86_BUILTIN_MASKLOADPD,
21001   IX86_BUILTIN_MASKLOADPS,
21002   IX86_BUILTIN_MASKSTOREPD,
21003   IX86_BUILTIN_MASKSTOREPS,
21004   IX86_BUILTIN_MASKLOADPD256,
21005   IX86_BUILTIN_MASKLOADPS256,
21006   IX86_BUILTIN_MASKSTOREPD256,
21007   IX86_BUILTIN_MASKSTOREPS256,
21008   IX86_BUILTIN_MOVSHDUP256,
21009   IX86_BUILTIN_MOVSLDUP256,
21010   IX86_BUILTIN_MOVDDUP256,
21011
21012   IX86_BUILTIN_SQRTPD256,
21013   IX86_BUILTIN_SQRTPS256,
21014   IX86_BUILTIN_SQRTPS_NR256,
21015   IX86_BUILTIN_RSQRTPS256,
21016   IX86_BUILTIN_RSQRTPS_NR256,
21017
21018   IX86_BUILTIN_RCPPS256,
21019
21020   IX86_BUILTIN_ROUNDPD256,
21021   IX86_BUILTIN_ROUNDPS256,
21022
21023   IX86_BUILTIN_UNPCKHPD256,
21024   IX86_BUILTIN_UNPCKLPD256,
21025   IX86_BUILTIN_UNPCKHPS256,
21026   IX86_BUILTIN_UNPCKLPS256,
21027
21028   IX86_BUILTIN_SI256_SI,
21029   IX86_BUILTIN_PS256_PS,
21030   IX86_BUILTIN_PD256_PD,
21031   IX86_BUILTIN_SI_SI256,
21032   IX86_BUILTIN_PS_PS256,
21033   IX86_BUILTIN_PD_PD256,
21034
21035   IX86_BUILTIN_VTESTZPD,
21036   IX86_BUILTIN_VTESTCPD,
21037   IX86_BUILTIN_VTESTNZCPD,
21038   IX86_BUILTIN_VTESTZPS,
21039   IX86_BUILTIN_VTESTCPS,
21040   IX86_BUILTIN_VTESTNZCPS,
21041   IX86_BUILTIN_VTESTZPD256,
21042   IX86_BUILTIN_VTESTCPD256,
21043   IX86_BUILTIN_VTESTNZCPD256,
21044   IX86_BUILTIN_VTESTZPS256,
21045   IX86_BUILTIN_VTESTCPS256,
21046   IX86_BUILTIN_VTESTNZCPS256,
21047   IX86_BUILTIN_PTESTZ256,
21048   IX86_BUILTIN_PTESTC256,
21049   IX86_BUILTIN_PTESTNZC256,
21050
21051   IX86_BUILTIN_MOVMSKPD256,
21052   IX86_BUILTIN_MOVMSKPS256,
21053
21054   /* TFmode support builtins.  */
21055   IX86_BUILTIN_INFQ,
21056   IX86_BUILTIN_HUGE_VALQ,
21057   IX86_BUILTIN_FABSQ,
21058   IX86_BUILTIN_COPYSIGNQ,
21059
21060   /* Vectorizer support builtins.  */
21061   IX86_BUILTIN_CPYSGNPS,
21062   IX86_BUILTIN_CPYSGNPD,
21063
21064   IX86_BUILTIN_CVTUDQ2PS,
21065
21066   IX86_BUILTIN_VEC_PERM_V2DF,
21067   IX86_BUILTIN_VEC_PERM_V4SF,
21068   IX86_BUILTIN_VEC_PERM_V2DI,
21069   IX86_BUILTIN_VEC_PERM_V4SI,
21070   IX86_BUILTIN_VEC_PERM_V8HI,
21071   IX86_BUILTIN_VEC_PERM_V16QI,
21072   IX86_BUILTIN_VEC_PERM_V2DI_U,
21073   IX86_BUILTIN_VEC_PERM_V4SI_U,
21074   IX86_BUILTIN_VEC_PERM_V8HI_U,
21075   IX86_BUILTIN_VEC_PERM_V16QI_U,
21076   IX86_BUILTIN_VEC_PERM_V4DF,
21077   IX86_BUILTIN_VEC_PERM_V8SF,
21078
21079   /* FMA4 and XOP instructions.  */
21080   IX86_BUILTIN_VFMADDSS,
21081   IX86_BUILTIN_VFMADDSD,
21082   IX86_BUILTIN_VFMADDPS,
21083   IX86_BUILTIN_VFMADDPD,
21084   IX86_BUILTIN_VFMSUBSS,
21085   IX86_BUILTIN_VFMSUBSD,
21086   IX86_BUILTIN_VFMSUBPS,
21087   IX86_BUILTIN_VFMSUBPD,
21088   IX86_BUILTIN_VFMADDSUBPS,
21089   IX86_BUILTIN_VFMADDSUBPD,
21090   IX86_BUILTIN_VFMSUBADDPS,
21091   IX86_BUILTIN_VFMSUBADDPD,
21092   IX86_BUILTIN_VFNMADDSS,
21093   IX86_BUILTIN_VFNMADDSD,
21094   IX86_BUILTIN_VFNMADDPS,
21095   IX86_BUILTIN_VFNMADDPD,
21096   IX86_BUILTIN_VFNMSUBSS,
21097   IX86_BUILTIN_VFNMSUBSD,
21098   IX86_BUILTIN_VFNMSUBPS,
21099   IX86_BUILTIN_VFNMSUBPD,
21100   IX86_BUILTIN_VFMADDPS256,
21101   IX86_BUILTIN_VFMADDPD256,
21102   IX86_BUILTIN_VFMSUBPS256,
21103   IX86_BUILTIN_VFMSUBPD256,
21104   IX86_BUILTIN_VFMADDSUBPS256,
21105   IX86_BUILTIN_VFMADDSUBPD256,
21106   IX86_BUILTIN_VFMSUBADDPS256,
21107   IX86_BUILTIN_VFMSUBADDPD256,
21108   IX86_BUILTIN_VFNMADDPS256,
21109   IX86_BUILTIN_VFNMADDPD256,
21110   IX86_BUILTIN_VFNMSUBPS256,
21111   IX86_BUILTIN_VFNMSUBPD256,
21112
21113   IX86_BUILTIN_VPCMOV,
21114   IX86_BUILTIN_VPCMOV_V2DI,
21115   IX86_BUILTIN_VPCMOV_V4SI,
21116   IX86_BUILTIN_VPCMOV_V8HI,
21117   IX86_BUILTIN_VPCMOV_V16QI,
21118   IX86_BUILTIN_VPCMOV_V4SF,
21119   IX86_BUILTIN_VPCMOV_V2DF,
21120   IX86_BUILTIN_VPCMOV256,
21121   IX86_BUILTIN_VPCMOV_V4DI256,
21122   IX86_BUILTIN_VPCMOV_V8SI256,
21123   IX86_BUILTIN_VPCMOV_V16HI256,
21124   IX86_BUILTIN_VPCMOV_V32QI256,
21125   IX86_BUILTIN_VPCMOV_V8SF256,
21126   IX86_BUILTIN_VPCMOV_V4DF256,
21127
21128   IX86_BUILTIN_VPPERM,
21129
21130   IX86_BUILTIN_VPMACSSWW,
21131   IX86_BUILTIN_VPMACSWW,
21132   IX86_BUILTIN_VPMACSSWD,
21133   IX86_BUILTIN_VPMACSWD,
21134   IX86_BUILTIN_VPMACSSDD,
21135   IX86_BUILTIN_VPMACSDD,
21136   IX86_BUILTIN_VPMACSSDQL,
21137   IX86_BUILTIN_VPMACSSDQH,
21138   IX86_BUILTIN_VPMACSDQL,
21139   IX86_BUILTIN_VPMACSDQH,
21140   IX86_BUILTIN_VPMADCSSWD,
21141   IX86_BUILTIN_VPMADCSWD,
21142
21143   IX86_BUILTIN_VPHADDBW,
21144   IX86_BUILTIN_VPHADDBD,
21145   IX86_BUILTIN_VPHADDBQ,
21146   IX86_BUILTIN_VPHADDWD,
21147   IX86_BUILTIN_VPHADDWQ,
21148   IX86_BUILTIN_VPHADDDQ,
21149   IX86_BUILTIN_VPHADDUBW,
21150   IX86_BUILTIN_VPHADDUBD,
21151   IX86_BUILTIN_VPHADDUBQ,
21152   IX86_BUILTIN_VPHADDUWD,
21153   IX86_BUILTIN_VPHADDUWQ,
21154   IX86_BUILTIN_VPHADDUDQ,
21155   IX86_BUILTIN_VPHSUBBW,
21156   IX86_BUILTIN_VPHSUBWD,
21157   IX86_BUILTIN_VPHSUBDQ,
21158
21159   IX86_BUILTIN_VPROTB,
21160   IX86_BUILTIN_VPROTW,
21161   IX86_BUILTIN_VPROTD,
21162   IX86_BUILTIN_VPROTQ,
21163   IX86_BUILTIN_VPROTB_IMM,
21164   IX86_BUILTIN_VPROTW_IMM,
21165   IX86_BUILTIN_VPROTD_IMM,
21166   IX86_BUILTIN_VPROTQ_IMM,
21167
21168   IX86_BUILTIN_VPSHLB,
21169   IX86_BUILTIN_VPSHLW,
21170   IX86_BUILTIN_VPSHLD,
21171   IX86_BUILTIN_VPSHLQ,
21172   IX86_BUILTIN_VPSHAB,
21173   IX86_BUILTIN_VPSHAW,
21174   IX86_BUILTIN_VPSHAD,
21175   IX86_BUILTIN_VPSHAQ,
21176
21177   IX86_BUILTIN_VFRCZSS,
21178   IX86_BUILTIN_VFRCZSD,
21179   IX86_BUILTIN_VFRCZPS,
21180   IX86_BUILTIN_VFRCZPD,
21181   IX86_BUILTIN_VFRCZPS256,
21182   IX86_BUILTIN_VFRCZPD256,
21183
21184   IX86_BUILTIN_VPCOMEQUB,
21185   IX86_BUILTIN_VPCOMNEUB,
21186   IX86_BUILTIN_VPCOMLTUB,
21187   IX86_BUILTIN_VPCOMLEUB,
21188   IX86_BUILTIN_VPCOMGTUB,
21189   IX86_BUILTIN_VPCOMGEUB,
21190   IX86_BUILTIN_VPCOMFALSEUB,
21191   IX86_BUILTIN_VPCOMTRUEUB,
21192
21193   IX86_BUILTIN_VPCOMEQUW,
21194   IX86_BUILTIN_VPCOMNEUW,
21195   IX86_BUILTIN_VPCOMLTUW,
21196   IX86_BUILTIN_VPCOMLEUW,
21197   IX86_BUILTIN_VPCOMGTUW,
21198   IX86_BUILTIN_VPCOMGEUW,
21199   IX86_BUILTIN_VPCOMFALSEUW,
21200   IX86_BUILTIN_VPCOMTRUEUW,
21201
21202   IX86_BUILTIN_VPCOMEQUD,
21203   IX86_BUILTIN_VPCOMNEUD,
21204   IX86_BUILTIN_VPCOMLTUD,
21205   IX86_BUILTIN_VPCOMLEUD,
21206   IX86_BUILTIN_VPCOMGTUD,
21207   IX86_BUILTIN_VPCOMGEUD,
21208   IX86_BUILTIN_VPCOMFALSEUD,
21209   IX86_BUILTIN_VPCOMTRUEUD,
21210
21211   IX86_BUILTIN_VPCOMEQUQ,
21212   IX86_BUILTIN_VPCOMNEUQ,
21213   IX86_BUILTIN_VPCOMLTUQ,
21214   IX86_BUILTIN_VPCOMLEUQ,
21215   IX86_BUILTIN_VPCOMGTUQ,
21216   IX86_BUILTIN_VPCOMGEUQ,
21217   IX86_BUILTIN_VPCOMFALSEUQ,
21218   IX86_BUILTIN_VPCOMTRUEUQ,
21219
21220   IX86_BUILTIN_VPCOMEQB,
21221   IX86_BUILTIN_VPCOMNEB,
21222   IX86_BUILTIN_VPCOMLTB,
21223   IX86_BUILTIN_VPCOMLEB,
21224   IX86_BUILTIN_VPCOMGTB,
21225   IX86_BUILTIN_VPCOMGEB,
21226   IX86_BUILTIN_VPCOMFALSEB,
21227   IX86_BUILTIN_VPCOMTRUEB,
21228
21229   IX86_BUILTIN_VPCOMEQW,
21230   IX86_BUILTIN_VPCOMNEW,
21231   IX86_BUILTIN_VPCOMLTW,
21232   IX86_BUILTIN_VPCOMLEW,
21233   IX86_BUILTIN_VPCOMGTW,
21234   IX86_BUILTIN_VPCOMGEW,
21235   IX86_BUILTIN_VPCOMFALSEW,
21236   IX86_BUILTIN_VPCOMTRUEW,
21237
21238   IX86_BUILTIN_VPCOMEQD,
21239   IX86_BUILTIN_VPCOMNED,
21240   IX86_BUILTIN_VPCOMLTD,
21241   IX86_BUILTIN_VPCOMLED,
21242   IX86_BUILTIN_VPCOMGTD,
21243   IX86_BUILTIN_VPCOMGED,
21244   IX86_BUILTIN_VPCOMFALSED,
21245   IX86_BUILTIN_VPCOMTRUED,
21246
21247   IX86_BUILTIN_VPCOMEQQ,
21248   IX86_BUILTIN_VPCOMNEQ,
21249   IX86_BUILTIN_VPCOMLTQ,
21250   IX86_BUILTIN_VPCOMLEQ,
21251   IX86_BUILTIN_VPCOMGTQ,
21252   IX86_BUILTIN_VPCOMGEQ,
21253   IX86_BUILTIN_VPCOMFALSEQ,
21254   IX86_BUILTIN_VPCOMTRUEQ,
21255
21256   /* LWP instructions.  */
21257   IX86_BUILTIN_LLWPCB,
21258   IX86_BUILTIN_SLWPCB,
21259   IX86_BUILTIN_LWPVAL32,
21260   IX86_BUILTIN_LWPVAL64,
21261   IX86_BUILTIN_LWPINS32,
21262   IX86_BUILTIN_LWPINS64,
21263
21264   IX86_BUILTIN_CLZS,
21265
21266   IX86_BUILTIN_MAX
21267 };
21268
21269 /* Table for the ix86 builtin decls.  */
21270 static GTY(()) tree ix86_builtins[(int) IX86_BUILTIN_MAX];
21271
21272 /* Table of all of the builtin functions that are possible with different ISA's
21273    but are waiting to be built until a function is declared to use that
21274    ISA.  */
21275 struct builtin_isa {
21276   const char *name;             /* function name */
21277   enum ix86_builtin_func_type tcode; /* type to use in the declaration */
21278   int isa;                      /* isa_flags this builtin is defined for */
21279   bool const_p;                 /* true if the declaration is constant */
21280   bool set_and_not_built_p;
21281 };
21282
21283 static struct builtin_isa ix86_builtins_isa[(int) IX86_BUILTIN_MAX];
21284
21285
21286 /* Add an ix86 target builtin function with CODE, NAME and TYPE.  Save the MASK
21287    of which isa_flags to use in the ix86_builtins_isa array.  Stores the
21288    function decl in the ix86_builtins array.  Returns the function decl or
21289    NULL_TREE, if the builtin was not added.
21290
21291    If the front end has a special hook for builtin functions, delay adding
21292    builtin functions that aren't in the current ISA until the ISA is changed
21293    with function specific optimization.  Doing so, can save about 300K for the
21294    default compiler.  When the builtin is expanded, check at that time whether
21295    it is valid.
21296
21297    If the front end doesn't have a special hook, record all builtins, even if
21298    it isn't an instruction set in the current ISA in case the user uses
21299    function specific options for a different ISA, so that we don't get scope
21300    errors if a builtin is added in the middle of a function scope.  */
21301
21302 static inline tree
21303 def_builtin (int mask, const char *name, enum ix86_builtin_func_type tcode,
21304              enum ix86_builtins code)
21305 {
21306   tree decl = NULL_TREE;
21307
21308   if (!(mask & OPTION_MASK_ISA_64BIT) || TARGET_64BIT)
21309     {
21310       ix86_builtins_isa[(int) code].isa = mask;
21311
21312       if (mask == 0
21313           || (mask & ix86_isa_flags) != 0
21314           || (lang_hooks.builtin_function
21315               == lang_hooks.builtin_function_ext_scope))
21316
21317         {
21318           tree type = ix86_get_builtin_func_type (tcode);
21319           decl = add_builtin_function (name, type, code, BUILT_IN_MD,
21320                                        NULL, NULL_TREE);
21321           ix86_builtins[(int) code] = decl;
21322           ix86_builtins_isa[(int) code].set_and_not_built_p = false;
21323         }
21324       else
21325         {
21326           ix86_builtins[(int) code] = NULL_TREE;
21327           ix86_builtins_isa[(int) code].tcode = tcode;
21328           ix86_builtins_isa[(int) code].name = name;
21329           ix86_builtins_isa[(int) code].const_p = false;
21330           ix86_builtins_isa[(int) code].set_and_not_built_p = true;
21331         }
21332     }
21333
21334   return decl;
21335 }
21336
21337 /* Like def_builtin, but also marks the function decl "const".  */
21338
21339 static inline tree
21340 def_builtin_const (int mask, const char *name,
21341                    enum ix86_builtin_func_type tcode, enum ix86_builtins code)
21342 {
21343   tree decl = def_builtin (mask, name, tcode, code);
21344   if (decl)
21345     TREE_READONLY (decl) = 1;
21346   else
21347     ix86_builtins_isa[(int) code].const_p = true;
21348
21349   return decl;
21350 }
21351
21352 /* Add any new builtin functions for a given ISA that may not have been
21353    declared.  This saves a bit of space compared to adding all of the
21354    declarations to the tree, even if we didn't use them.  */
21355
21356 static void
21357 ix86_add_new_builtins (int isa)
21358 {
21359   int i;
21360
21361   for (i = 0; i < (int)IX86_BUILTIN_MAX; i++)
21362     {
21363       if ((ix86_builtins_isa[i].isa & isa) != 0
21364           && ix86_builtins_isa[i].set_and_not_built_p)
21365         {
21366           tree decl, type;
21367
21368           /* Don't define the builtin again.  */
21369           ix86_builtins_isa[i].set_and_not_built_p = false;
21370
21371           type = ix86_get_builtin_func_type (ix86_builtins_isa[i].tcode);
21372           decl = add_builtin_function_ext_scope (ix86_builtins_isa[i].name,
21373                                                  type, i, BUILT_IN_MD, NULL,
21374                                                  NULL_TREE);
21375
21376           ix86_builtins[i] = decl;
21377           if (ix86_builtins_isa[i].const_p)
21378             TREE_READONLY (decl) = 1;
21379         }
21380     }
21381 }
21382
21383 /* Bits for builtin_description.flag.  */
21384
21385 /* Set when we don't support the comparison natively, and should
21386    swap_comparison in order to support it.  */
21387 #define BUILTIN_DESC_SWAP_OPERANDS      1
21388
21389 struct builtin_description
21390 {
21391   const unsigned int mask;
21392   const enum insn_code icode;
21393   const char *const name;
21394   const enum ix86_builtins code;
21395   const enum rtx_code comparison;
21396   const int flag;
21397 };
21398
21399 static const struct builtin_description bdesc_comi[] =
21400 {
21401   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comieq", IX86_BUILTIN_COMIEQSS, UNEQ, 0 },
21402   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comilt", IX86_BUILTIN_COMILTSS, UNLT, 0 },
21403   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comile", IX86_BUILTIN_COMILESS, UNLE, 0 },
21404   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comigt", IX86_BUILTIN_COMIGTSS, GT, 0 },
21405   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comige", IX86_BUILTIN_COMIGESS, GE, 0 },
21406   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comineq", IX86_BUILTIN_COMINEQSS, LTGT, 0 },
21407   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomieq", IX86_BUILTIN_UCOMIEQSS, UNEQ, 0 },
21408   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomilt", IX86_BUILTIN_UCOMILTSS, UNLT, 0 },
21409   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomile", IX86_BUILTIN_UCOMILESS, UNLE, 0 },
21410   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomigt", IX86_BUILTIN_UCOMIGTSS, GT, 0 },
21411   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomige", IX86_BUILTIN_UCOMIGESS, GE, 0 },
21412   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomineq", IX86_BUILTIN_UCOMINEQSS, LTGT, 0 },
21413   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdeq", IX86_BUILTIN_COMIEQSD, UNEQ, 0 },
21414   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdlt", IX86_BUILTIN_COMILTSD, UNLT, 0 },
21415   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdle", IX86_BUILTIN_COMILESD, UNLE, 0 },
21416   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdgt", IX86_BUILTIN_COMIGTSD, GT, 0 },
21417   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdge", IX86_BUILTIN_COMIGESD, GE, 0 },
21418   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdneq", IX86_BUILTIN_COMINEQSD, LTGT, 0 },
21419   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdeq", IX86_BUILTIN_UCOMIEQSD, UNEQ, 0 },
21420   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdlt", IX86_BUILTIN_UCOMILTSD, UNLT, 0 },
21421   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdle", IX86_BUILTIN_UCOMILESD, UNLE, 0 },
21422   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdgt", IX86_BUILTIN_UCOMIGTSD, GT, 0 },
21423   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdge", IX86_BUILTIN_UCOMIGESD, GE, 0 },
21424   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdneq", IX86_BUILTIN_UCOMINEQSD, LTGT, 0 },
21425 };
21426
21427 static const struct builtin_description bdesc_pcmpestr[] =
21428 {
21429   /* SSE4.2 */
21430   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestri128", IX86_BUILTIN_PCMPESTRI128, UNKNOWN, 0 },
21431   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestrm128", IX86_BUILTIN_PCMPESTRM128, UNKNOWN, 0 },
21432   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestria128", IX86_BUILTIN_PCMPESTRA128, UNKNOWN, (int) CCAmode },
21433   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestric128", IX86_BUILTIN_PCMPESTRC128, UNKNOWN, (int) CCCmode },
21434   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestrio128", IX86_BUILTIN_PCMPESTRO128, UNKNOWN, (int) CCOmode },
21435   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestris128", IX86_BUILTIN_PCMPESTRS128, UNKNOWN, (int) CCSmode },
21436   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestriz128", IX86_BUILTIN_PCMPESTRZ128, UNKNOWN, (int) CCZmode },
21437 };
21438
21439 static const struct builtin_description bdesc_pcmpistr[] =
21440 {
21441   /* SSE4.2 */
21442   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistri128", IX86_BUILTIN_PCMPISTRI128, UNKNOWN, 0 },
21443   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistrm128", IX86_BUILTIN_PCMPISTRM128, UNKNOWN, 0 },
21444   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistria128", IX86_BUILTIN_PCMPISTRA128, UNKNOWN, (int) CCAmode },
21445   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistric128", IX86_BUILTIN_PCMPISTRC128, UNKNOWN, (int) CCCmode },
21446   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistrio128", IX86_BUILTIN_PCMPISTRO128, UNKNOWN, (int) CCOmode },
21447   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistris128", IX86_BUILTIN_PCMPISTRS128, UNKNOWN, (int) CCSmode },
21448   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistriz128", IX86_BUILTIN_PCMPISTRZ128, UNKNOWN, (int) CCZmode },
21449 };
21450
21451 /* Special builtins with variable number of arguments.  */
21452 static const struct builtin_description bdesc_special_args[] =
21453 {
21454   { ~OPTION_MASK_ISA_64BIT, CODE_FOR_rdtsc, "__builtin_ia32_rdtsc", IX86_BUILTIN_RDTSC, UNKNOWN, (int) UINT64_FTYPE_VOID },
21455   { ~OPTION_MASK_ISA_64BIT, CODE_FOR_rdtscp, "__builtin_ia32_rdtscp", IX86_BUILTIN_RDTSCP, UNKNOWN, (int) UINT64_FTYPE_PUNSIGNED },
21456
21457   /* MMX */
21458   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_emms, "__builtin_ia32_emms", IX86_BUILTIN_EMMS, UNKNOWN, (int) VOID_FTYPE_VOID },
21459
21460   /* 3DNow! */
21461   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_femms, "__builtin_ia32_femms", IX86_BUILTIN_FEMMS, UNKNOWN, (int) VOID_FTYPE_VOID },
21462
21463   /* SSE */
21464   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movups, "__builtin_ia32_storeups", IX86_BUILTIN_STOREUPS, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V4SF },
21465   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movntv4sf, "__builtin_ia32_movntps", IX86_BUILTIN_MOVNTPS, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V4SF },
21466   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movups, "__builtin_ia32_loadups", IX86_BUILTIN_LOADUPS, UNKNOWN, (int) V4SF_FTYPE_PCFLOAT },
21467
21468   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_loadhps_exp, "__builtin_ia32_loadhps", IX86_BUILTIN_LOADHPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_PCV2SF },
21469   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_loadlps_exp, "__builtin_ia32_loadlps", IX86_BUILTIN_LOADLPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_PCV2SF },
21470   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_storehps, "__builtin_ia32_storehps", IX86_BUILTIN_STOREHPS, UNKNOWN, (int) VOID_FTYPE_PV2SF_V4SF },
21471   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_storelps, "__builtin_ia32_storelps", IX86_BUILTIN_STORELPS, UNKNOWN, (int) VOID_FTYPE_PV2SF_V4SF },
21472
21473   /* SSE or 3DNow!A  */
21474   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, CODE_FOR_sse_sfence, "__builtin_ia32_sfence", IX86_BUILTIN_SFENCE, UNKNOWN, (int) VOID_FTYPE_VOID },
21475   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, CODE_FOR_sse_movntdi, "__builtin_ia32_movntq", IX86_BUILTIN_MOVNTQ, UNKNOWN, (int) VOID_FTYPE_PULONGLONG_ULONGLONG },
21476
21477   /* SSE2 */
21478   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_lfence, "__builtin_ia32_lfence", IX86_BUILTIN_LFENCE, UNKNOWN, (int) VOID_FTYPE_VOID },
21479   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_mfence, 0, IX86_BUILTIN_MFENCE, UNKNOWN, (int) VOID_FTYPE_VOID },
21480   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movupd, "__builtin_ia32_storeupd", IX86_BUILTIN_STOREUPD, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V2DF },
21481   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movdqu, "__builtin_ia32_storedqu", IX86_BUILTIN_STOREDQU, UNKNOWN, (int) VOID_FTYPE_PCHAR_V16QI },
21482   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movntv2df, "__builtin_ia32_movntpd", IX86_BUILTIN_MOVNTPD, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V2DF },
21483   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movntv2di, "__builtin_ia32_movntdq", IX86_BUILTIN_MOVNTDQ, UNKNOWN, (int) VOID_FTYPE_PV2DI_V2DI },
21484   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movntsi, "__builtin_ia32_movnti", IX86_BUILTIN_MOVNTI, UNKNOWN, (int) VOID_FTYPE_PINT_INT },
21485   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movupd, "__builtin_ia32_loadupd", IX86_BUILTIN_LOADUPD, UNKNOWN, (int) V2DF_FTYPE_PCDOUBLE },
21486   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movdqu, "__builtin_ia32_loaddqu", IX86_BUILTIN_LOADDQU, UNKNOWN, (int) V16QI_FTYPE_PCCHAR },
21487
21488   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_loadhpd_exp, "__builtin_ia32_loadhpd", IX86_BUILTIN_LOADHPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_PCDOUBLE },
21489   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_loadlpd_exp, "__builtin_ia32_loadlpd", IX86_BUILTIN_LOADLPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_PCDOUBLE },
21490
21491   /* SSE3 */
21492   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_lddqu, "__builtin_ia32_lddqu", IX86_BUILTIN_LDDQU, UNKNOWN, (int) V16QI_FTYPE_PCCHAR },
21493
21494   /* SSE4.1 */
21495   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_movntdqa, "__builtin_ia32_movntdqa", IX86_BUILTIN_MOVNTDQA, UNKNOWN, (int) V2DI_FTYPE_PV2DI },
21496
21497   /* SSE4A */
21498   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_vmmovntv2df, "__builtin_ia32_movntsd", IX86_BUILTIN_MOVNTSD, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V2DF },
21499   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_vmmovntv4sf, "__builtin_ia32_movntss", IX86_BUILTIN_MOVNTSS, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V4SF },
21500
21501   /* AVX */
21502   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vzeroall, "__builtin_ia32_vzeroall", IX86_BUILTIN_VZEROALL, UNKNOWN, (int) VOID_FTYPE_VOID },
21503   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vzeroupper, "__builtin_ia32_vzeroupper", IX86_BUILTIN_VZEROUPPER, UNKNOWN, (int) VOID_FTYPE_VOID },
21504
21505   { OPTION_MASK_ISA_AVX, CODE_FOR_vec_dupv4sf, "__builtin_ia32_vbroadcastss", IX86_BUILTIN_VBROADCASTSS, UNKNOWN, (int) V4SF_FTYPE_PCFLOAT },
21506   { OPTION_MASK_ISA_AVX, CODE_FOR_vec_dupv4df, "__builtin_ia32_vbroadcastsd256", IX86_BUILTIN_VBROADCASTSD256, UNKNOWN, (int) V4DF_FTYPE_PCDOUBLE },
21507   { OPTION_MASK_ISA_AVX, CODE_FOR_vec_dupv8sf, "__builtin_ia32_vbroadcastss256", IX86_BUILTIN_VBROADCASTSS256, UNKNOWN, (int) V8SF_FTYPE_PCFLOAT },
21508   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vbroadcastf128_v4df, "__builtin_ia32_vbroadcastf128_pd256", IX86_BUILTIN_VBROADCASTPD256, UNKNOWN, (int) V4DF_FTYPE_PCV2DF },
21509   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vbroadcastf128_v8sf, "__builtin_ia32_vbroadcastf128_ps256", IX86_BUILTIN_VBROADCASTPS256, UNKNOWN, (int) V8SF_FTYPE_PCV4SF },
21510
21511   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movupd256, "__builtin_ia32_loadupd256", IX86_BUILTIN_LOADUPD256, UNKNOWN, (int) V4DF_FTYPE_PCDOUBLE },
21512   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movups256, "__builtin_ia32_loadups256", IX86_BUILTIN_LOADUPS256, UNKNOWN, (int) V8SF_FTYPE_PCFLOAT },
21513   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movupd256, "__builtin_ia32_storeupd256", IX86_BUILTIN_STOREUPD256, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V4DF },
21514   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movups256, "__builtin_ia32_storeups256", IX86_BUILTIN_STOREUPS256, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V8SF },
21515   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movdqu256, "__builtin_ia32_loaddqu256", IX86_BUILTIN_LOADDQU256, UNKNOWN, (int) V32QI_FTYPE_PCCHAR },
21516   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movdqu256, "__builtin_ia32_storedqu256", IX86_BUILTIN_STOREDQU256, UNKNOWN, (int) VOID_FTYPE_PCHAR_V32QI },
21517   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_lddqu256, "__builtin_ia32_lddqu256", IX86_BUILTIN_LDDQU256, UNKNOWN, (int) V32QI_FTYPE_PCCHAR },
21518
21519   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movntv4di, "__builtin_ia32_movntdq256", IX86_BUILTIN_MOVNTDQ256, UNKNOWN, (int) VOID_FTYPE_PV4DI_V4DI },
21520   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movntv4df, "__builtin_ia32_movntpd256", IX86_BUILTIN_MOVNTPD256, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V4DF },
21521   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movntv8sf, "__builtin_ia32_movntps256", IX86_BUILTIN_MOVNTPS256, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V8SF },
21522
21523   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskloadpd, "__builtin_ia32_maskloadpd", IX86_BUILTIN_MASKLOADPD, UNKNOWN, (int) V2DF_FTYPE_PCV2DF_V2DF },
21524   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskloadps, "__builtin_ia32_maskloadps", IX86_BUILTIN_MASKLOADPS, UNKNOWN, (int) V4SF_FTYPE_PCV4SF_V4SF },
21525   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskloadpd256, "__builtin_ia32_maskloadpd256", IX86_BUILTIN_MASKLOADPD256, UNKNOWN, (int) V4DF_FTYPE_PCV4DF_V4DF },
21526   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskloadps256, "__builtin_ia32_maskloadps256", IX86_BUILTIN_MASKLOADPS256, UNKNOWN, (int) V8SF_FTYPE_PCV8SF_V8SF },
21527   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskstorepd, "__builtin_ia32_maskstorepd", IX86_BUILTIN_MASKSTOREPD, UNKNOWN, (int) VOID_FTYPE_PV2DF_V2DF_V2DF },
21528   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskstoreps, "__builtin_ia32_maskstoreps", IX86_BUILTIN_MASKSTOREPS, UNKNOWN, (int) VOID_FTYPE_PV4SF_V4SF_V4SF },
21529   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskstorepd256, "__builtin_ia32_maskstorepd256", IX86_BUILTIN_MASKSTOREPD256, UNKNOWN, (int) VOID_FTYPE_PV4DF_V4DF_V4DF },
21530   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskstoreps256, "__builtin_ia32_maskstoreps256", IX86_BUILTIN_MASKSTOREPS256, UNKNOWN, (int) VOID_FTYPE_PV8SF_V8SF_V8SF },
21531
21532   { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_llwpcb, "__builtin_ia32_llwpcb", IX86_BUILTIN_LLWPCB, UNKNOWN, (int) VOID_FTYPE_PVOID },
21533   { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_slwpcb, "__builtin_ia32_slwpcb", IX86_BUILTIN_SLWPCB, UNKNOWN, (int) PVOID_FTYPE_VOID },
21534   { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_lwpvalsi3, "__builtin_ia32_lwpval32", IX86_BUILTIN_LWPVAL32, UNKNOWN, (int) VOID_FTYPE_UINT_UINT_UINT },
21535   { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_lwpvaldi3, "__builtin_ia32_lwpval64", IX86_BUILTIN_LWPVAL64, UNKNOWN, (int) VOID_FTYPE_UINT64_UINT_UINT },
21536   { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_lwpinssi3, "__builtin_ia32_lwpins32", IX86_BUILTIN_LWPINS32, UNKNOWN, (int) UCHAR_FTYPE_UINT_UINT_UINT },
21537   { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_lwpinsdi3, "__builtin_ia32_lwpins64", IX86_BUILTIN_LWPINS64, UNKNOWN, (int) UCHAR_FTYPE_UINT64_UINT_UINT },
21538
21539 };
21540
21541 /* Builtins with variable number of arguments.  */
21542 static const struct builtin_description bdesc_args[] =
21543 {
21544   { ~OPTION_MASK_ISA_64BIT, CODE_FOR_bsr, "__builtin_ia32_bsrsi", IX86_BUILTIN_BSRSI, UNKNOWN, (int) INT_FTYPE_INT },
21545   { OPTION_MASK_ISA_64BIT, CODE_FOR_bsr_rex64, "__builtin_ia32_bsrdi", IX86_BUILTIN_BSRDI, UNKNOWN, (int) INT64_FTYPE_INT64 },
21546   { ~OPTION_MASK_ISA_64BIT, CODE_FOR_rdpmc, "__builtin_ia32_rdpmc", IX86_BUILTIN_RDPMC, UNKNOWN, (int) UINT64_FTYPE_INT },
21547   { ~OPTION_MASK_ISA_64BIT, CODE_FOR_rotlqi3, "__builtin_ia32_rolqi", IX86_BUILTIN_ROLQI, UNKNOWN, (int) UINT8_FTYPE_UINT8_INT },
21548   { ~OPTION_MASK_ISA_64BIT, CODE_FOR_rotlhi3, "__builtin_ia32_rolhi", IX86_BUILTIN_ROLHI, UNKNOWN, (int) UINT16_FTYPE_UINT16_INT },
21549   { ~OPTION_MASK_ISA_64BIT, CODE_FOR_rotrqi3, "__builtin_ia32_rorqi", IX86_BUILTIN_RORQI, UNKNOWN, (int) UINT8_FTYPE_UINT8_INT },
21550   { ~OPTION_MASK_ISA_64BIT, CODE_FOR_rotrhi3, "__builtin_ia32_rorhi", IX86_BUILTIN_RORHI, UNKNOWN, (int) UINT16_FTYPE_UINT16_INT },
21551
21552   /* MMX */
21553   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_addv8qi3, "__builtin_ia32_paddb", IX86_BUILTIN_PADDB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21554   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_addv4hi3, "__builtin_ia32_paddw", IX86_BUILTIN_PADDW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21555   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_addv2si3, "__builtin_ia32_paddd", IX86_BUILTIN_PADDD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21556   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_subv8qi3, "__builtin_ia32_psubb", IX86_BUILTIN_PSUBB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21557   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_subv4hi3, "__builtin_ia32_psubw", IX86_BUILTIN_PSUBW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21558   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_subv2si3, "__builtin_ia32_psubd", IX86_BUILTIN_PSUBD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21559
21560   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ssaddv8qi3, "__builtin_ia32_paddsb", IX86_BUILTIN_PADDSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21561   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ssaddv4hi3, "__builtin_ia32_paddsw", IX86_BUILTIN_PADDSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21562   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_sssubv8qi3, "__builtin_ia32_psubsb", IX86_BUILTIN_PSUBSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21563   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_sssubv4hi3, "__builtin_ia32_psubsw", IX86_BUILTIN_PSUBSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21564   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_usaddv8qi3, "__builtin_ia32_paddusb", IX86_BUILTIN_PADDUSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21565   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_usaddv4hi3, "__builtin_ia32_paddusw", IX86_BUILTIN_PADDUSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21566   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ussubv8qi3, "__builtin_ia32_psubusb", IX86_BUILTIN_PSUBUSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21567   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ussubv4hi3, "__builtin_ia32_psubusw", IX86_BUILTIN_PSUBUSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21568
21569   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_mulv4hi3, "__builtin_ia32_pmullw", IX86_BUILTIN_PMULLW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21570   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_smulv4hi3_highpart, "__builtin_ia32_pmulhw", IX86_BUILTIN_PMULHW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21571
21572   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_andv2si3, "__builtin_ia32_pand", IX86_BUILTIN_PAND, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21573   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_andnotv2si3, "__builtin_ia32_pandn", IX86_BUILTIN_PANDN, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21574   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_iorv2si3, "__builtin_ia32_por", IX86_BUILTIN_POR, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21575   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_xorv2si3, "__builtin_ia32_pxor", IX86_BUILTIN_PXOR, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21576
21577   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_eqv8qi3, "__builtin_ia32_pcmpeqb", IX86_BUILTIN_PCMPEQB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21578   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_eqv4hi3, "__builtin_ia32_pcmpeqw", IX86_BUILTIN_PCMPEQW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21579   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_eqv2si3, "__builtin_ia32_pcmpeqd", IX86_BUILTIN_PCMPEQD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21580   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_gtv8qi3, "__builtin_ia32_pcmpgtb", IX86_BUILTIN_PCMPGTB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21581   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_gtv4hi3, "__builtin_ia32_pcmpgtw", IX86_BUILTIN_PCMPGTW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21582   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_gtv2si3, "__builtin_ia32_pcmpgtd", IX86_BUILTIN_PCMPGTD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21583
21584   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpckhbw, "__builtin_ia32_punpckhbw", IX86_BUILTIN_PUNPCKHBW, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21585   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpckhwd, "__builtin_ia32_punpckhwd", IX86_BUILTIN_PUNPCKHWD, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21586   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpckhdq, "__builtin_ia32_punpckhdq", IX86_BUILTIN_PUNPCKHDQ, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21587   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpcklbw, "__builtin_ia32_punpcklbw", IX86_BUILTIN_PUNPCKLBW, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21588   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpcklwd, "__builtin_ia32_punpcklwd", IX86_BUILTIN_PUNPCKLWD, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI},
21589   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpckldq, "__builtin_ia32_punpckldq", IX86_BUILTIN_PUNPCKLDQ, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI},
21590
21591   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_packsswb, "__builtin_ia32_packsswb", IX86_BUILTIN_PACKSSWB, UNKNOWN, (int) V8QI_FTYPE_V4HI_V4HI },
21592   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_packssdw, "__builtin_ia32_packssdw", IX86_BUILTIN_PACKSSDW, UNKNOWN, (int) V4HI_FTYPE_V2SI_V2SI },
21593   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_packuswb, "__builtin_ia32_packuswb", IX86_BUILTIN_PACKUSWB, UNKNOWN, (int) V8QI_FTYPE_V4HI_V4HI },
21594
21595   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_pmaddwd, "__builtin_ia32_pmaddwd", IX86_BUILTIN_PMADDWD, UNKNOWN, (int) V2SI_FTYPE_V4HI_V4HI },
21596
21597   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv4hi3, "__builtin_ia32_psllwi", IX86_BUILTIN_PSLLWI, UNKNOWN, (int) V4HI_FTYPE_V4HI_SI_COUNT },
21598   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv2si3, "__builtin_ia32_pslldi", IX86_BUILTIN_PSLLDI, UNKNOWN, (int) V2SI_FTYPE_V2SI_SI_COUNT },
21599   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv1di3, "__builtin_ia32_psllqi", IX86_BUILTIN_PSLLQI, UNKNOWN, (int) V1DI_FTYPE_V1DI_SI_COUNT },
21600   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv4hi3, "__builtin_ia32_psllw", IX86_BUILTIN_PSLLW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI_COUNT },
21601   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv2si3, "__builtin_ia32_pslld", IX86_BUILTIN_PSLLD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI_COUNT },
21602   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv1di3, "__builtin_ia32_psllq", IX86_BUILTIN_PSLLQ, UNKNOWN, (int) V1DI_FTYPE_V1DI_V1DI_COUNT },
21603
21604   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv4hi3, "__builtin_ia32_psrlwi", IX86_BUILTIN_PSRLWI, UNKNOWN, (int) V4HI_FTYPE_V4HI_SI_COUNT },
21605   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv2si3, "__builtin_ia32_psrldi", IX86_BUILTIN_PSRLDI, UNKNOWN, (int) V2SI_FTYPE_V2SI_SI_COUNT },
21606   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv1di3, "__builtin_ia32_psrlqi", IX86_BUILTIN_PSRLQI, UNKNOWN, (int) V1DI_FTYPE_V1DI_SI_COUNT },
21607   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv4hi3, "__builtin_ia32_psrlw", IX86_BUILTIN_PSRLW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI_COUNT },
21608   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv2si3, "__builtin_ia32_psrld", IX86_BUILTIN_PSRLD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI_COUNT },
21609   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv1di3, "__builtin_ia32_psrlq", IX86_BUILTIN_PSRLQ, UNKNOWN, (int) V1DI_FTYPE_V1DI_V1DI_COUNT },
21610
21611   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashrv4hi3, "__builtin_ia32_psrawi", IX86_BUILTIN_PSRAWI, UNKNOWN, (int) V4HI_FTYPE_V4HI_SI_COUNT },
21612   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashrv2si3, "__builtin_ia32_psradi", IX86_BUILTIN_PSRADI, UNKNOWN, (int) V2SI_FTYPE_V2SI_SI_COUNT },
21613   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashrv4hi3, "__builtin_ia32_psraw", IX86_BUILTIN_PSRAW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI_COUNT },
21614   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashrv2si3, "__builtin_ia32_psrad", IX86_BUILTIN_PSRAD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI_COUNT },
21615
21616   /* 3DNow! */
21617   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_pf2id, "__builtin_ia32_pf2id", IX86_BUILTIN_PF2ID, UNKNOWN, (int) V2SI_FTYPE_V2SF },
21618   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_floatv2si2, "__builtin_ia32_pi2fd", IX86_BUILTIN_PI2FD, UNKNOWN, (int) V2SF_FTYPE_V2SI },
21619   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rcpv2sf2, "__builtin_ia32_pfrcp", IX86_BUILTIN_PFRCP, UNKNOWN, (int) V2SF_FTYPE_V2SF },
21620   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rsqrtv2sf2, "__builtin_ia32_pfrsqrt", IX86_BUILTIN_PFRSQRT, UNKNOWN, (int) V2SF_FTYPE_V2SF },
21621
21622   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_uavgv8qi3, "__builtin_ia32_pavgusb", IX86_BUILTIN_PAVGUSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21623   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_haddv2sf3, "__builtin_ia32_pfacc", IX86_BUILTIN_PFACC, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21624   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_addv2sf3, "__builtin_ia32_pfadd", IX86_BUILTIN_PFADD, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21625   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_eqv2sf3, "__builtin_ia32_pfcmpeq", IX86_BUILTIN_PFCMPEQ, UNKNOWN, (int) V2SI_FTYPE_V2SF_V2SF },
21626   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_gev2sf3, "__builtin_ia32_pfcmpge", IX86_BUILTIN_PFCMPGE, UNKNOWN, (int) V2SI_FTYPE_V2SF_V2SF },
21627   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_gtv2sf3, "__builtin_ia32_pfcmpgt", IX86_BUILTIN_PFCMPGT, UNKNOWN, (int) V2SI_FTYPE_V2SF_V2SF },
21628   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_smaxv2sf3, "__builtin_ia32_pfmax", IX86_BUILTIN_PFMAX, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21629   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_sminv2sf3, "__builtin_ia32_pfmin", IX86_BUILTIN_PFMIN, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21630   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_mulv2sf3, "__builtin_ia32_pfmul", IX86_BUILTIN_PFMUL, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21631   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rcpit1v2sf3, "__builtin_ia32_pfrcpit1", IX86_BUILTIN_PFRCPIT1, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21632   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rcpit2v2sf3, "__builtin_ia32_pfrcpit2", IX86_BUILTIN_PFRCPIT2, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21633   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rsqit1v2sf3, "__builtin_ia32_pfrsqit1", IX86_BUILTIN_PFRSQIT1, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21634   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_subv2sf3, "__builtin_ia32_pfsub", IX86_BUILTIN_PFSUB, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21635   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_subrv2sf3, "__builtin_ia32_pfsubr", IX86_BUILTIN_PFSUBR, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21636   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_pmulhrwv4hi3, "__builtin_ia32_pmulhrw", IX86_BUILTIN_PMULHRW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21637
21638   /* 3DNow!A */
21639   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pf2iw, "__builtin_ia32_pf2iw", IX86_BUILTIN_PF2IW, UNKNOWN, (int) V2SI_FTYPE_V2SF },
21640   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pi2fw, "__builtin_ia32_pi2fw", IX86_BUILTIN_PI2FW, UNKNOWN, (int) V2SF_FTYPE_V2SI },
21641   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pswapdv2si2, "__builtin_ia32_pswapdsi", IX86_BUILTIN_PSWAPDSI, UNKNOWN, (int) V2SI_FTYPE_V2SI },
21642   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pswapdv2sf2, "__builtin_ia32_pswapdsf", IX86_BUILTIN_PSWAPDSF, UNKNOWN, (int) V2SF_FTYPE_V2SF },
21643   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_hsubv2sf3, "__builtin_ia32_pfnacc", IX86_BUILTIN_PFNACC, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21644   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_addsubv2sf3, "__builtin_ia32_pfpnacc", IX86_BUILTIN_PFPNACC, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21645
21646   /* SSE */
21647   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movmskps, "__builtin_ia32_movmskps", IX86_BUILTIN_MOVMSKPS, UNKNOWN, (int) INT_FTYPE_V4SF },
21648   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_sqrtv4sf2, "__builtin_ia32_sqrtps", IX86_BUILTIN_SQRTPS, UNKNOWN, (int) V4SF_FTYPE_V4SF },
21649   { OPTION_MASK_ISA_SSE, CODE_FOR_sqrtv4sf2, "__builtin_ia32_sqrtps_nr", IX86_BUILTIN_SQRTPS_NR, UNKNOWN, (int) V4SF_FTYPE_V4SF },
21650   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_rsqrtv4sf2, "__builtin_ia32_rsqrtps", IX86_BUILTIN_RSQRTPS, UNKNOWN, (int) V4SF_FTYPE_V4SF },
21651   { OPTION_MASK_ISA_SSE, CODE_FOR_rsqrtv4sf2, "__builtin_ia32_rsqrtps_nr", IX86_BUILTIN_RSQRTPS_NR, UNKNOWN, (int) V4SF_FTYPE_V4SF },
21652   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_rcpv4sf2, "__builtin_ia32_rcpps", IX86_BUILTIN_RCPPS, UNKNOWN, (int) V4SF_FTYPE_V4SF },
21653   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvtps2pi, "__builtin_ia32_cvtps2pi", IX86_BUILTIN_CVTPS2PI, UNKNOWN, (int) V2SI_FTYPE_V4SF },
21654   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvtss2si, "__builtin_ia32_cvtss2si", IX86_BUILTIN_CVTSS2SI, UNKNOWN, (int) INT_FTYPE_V4SF },
21655   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_64BIT, CODE_FOR_sse_cvtss2siq, "__builtin_ia32_cvtss2si64", IX86_BUILTIN_CVTSS2SI64, UNKNOWN, (int) INT64_FTYPE_V4SF },
21656   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvttps2pi, "__builtin_ia32_cvttps2pi", IX86_BUILTIN_CVTTPS2PI, UNKNOWN, (int) V2SI_FTYPE_V4SF },
21657   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvttss2si, "__builtin_ia32_cvttss2si", IX86_BUILTIN_CVTTSS2SI, UNKNOWN, (int) INT_FTYPE_V4SF },
21658   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_64BIT, CODE_FOR_sse_cvttss2siq, "__builtin_ia32_cvttss2si64", IX86_BUILTIN_CVTTSS2SI64, UNKNOWN, (int) INT64_FTYPE_V4SF },
21659
21660   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_shufps, "__builtin_ia32_shufps", IX86_BUILTIN_SHUFPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
21661
21662   { OPTION_MASK_ISA_SSE, CODE_FOR_addv4sf3, "__builtin_ia32_addps", IX86_BUILTIN_ADDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21663   { OPTION_MASK_ISA_SSE, CODE_FOR_subv4sf3, "__builtin_ia32_subps", IX86_BUILTIN_SUBPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21664   { OPTION_MASK_ISA_SSE, CODE_FOR_mulv4sf3, "__builtin_ia32_mulps", IX86_BUILTIN_MULPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21665   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_divv4sf3, "__builtin_ia32_divps", IX86_BUILTIN_DIVPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21666   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmaddv4sf3,  "__builtin_ia32_addss", IX86_BUILTIN_ADDSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21667   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmsubv4sf3,  "__builtin_ia32_subss", IX86_BUILTIN_SUBSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21668   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmulv4sf3,  "__builtin_ia32_mulss", IX86_BUILTIN_MULSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21669   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmdivv4sf3,  "__builtin_ia32_divss", IX86_BUILTIN_DIVSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21670
21671   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpeqps", IX86_BUILTIN_CMPEQPS, EQ, (int) V4SF_FTYPE_V4SF_V4SF },
21672   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpltps", IX86_BUILTIN_CMPLTPS, LT, (int) V4SF_FTYPE_V4SF_V4SF },
21673   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpleps", IX86_BUILTIN_CMPLEPS, LE, (int) V4SF_FTYPE_V4SF_V4SF },
21674   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpgtps", IX86_BUILTIN_CMPGTPS, LT, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
21675   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpgeps", IX86_BUILTIN_CMPGEPS, LE, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
21676   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpunordps", IX86_BUILTIN_CMPUNORDPS, UNORDERED, (int) V4SF_FTYPE_V4SF_V4SF },
21677   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpneqps", IX86_BUILTIN_CMPNEQPS, NE, (int) V4SF_FTYPE_V4SF_V4SF },
21678   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpnltps", IX86_BUILTIN_CMPNLTPS, UNGE, (int) V4SF_FTYPE_V4SF_V4SF },
21679   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpnleps", IX86_BUILTIN_CMPNLEPS, UNGT, (int) V4SF_FTYPE_V4SF_V4SF },
21680   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpngtps", IX86_BUILTIN_CMPNGTPS, UNGE, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
21681   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpngeps", IX86_BUILTIN_CMPNGEPS, UNGT, (int) V4SF_FTYPE_V4SF_V4SF_SWAP},
21682   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpordps", IX86_BUILTIN_CMPORDPS, ORDERED, (int) V4SF_FTYPE_V4SF_V4SF },
21683   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpeqss", IX86_BUILTIN_CMPEQSS, EQ, (int) V4SF_FTYPE_V4SF_V4SF },
21684   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpltss", IX86_BUILTIN_CMPLTSS, LT, (int) V4SF_FTYPE_V4SF_V4SF },
21685   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpless", IX86_BUILTIN_CMPLESS, LE, (int) V4SF_FTYPE_V4SF_V4SF },
21686   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpunordss", IX86_BUILTIN_CMPUNORDSS, UNORDERED, (int) V4SF_FTYPE_V4SF_V4SF },
21687   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpneqss", IX86_BUILTIN_CMPNEQSS, NE, (int) V4SF_FTYPE_V4SF_V4SF },
21688   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpnltss", IX86_BUILTIN_CMPNLTSS, UNGE, (int) V4SF_FTYPE_V4SF_V4SF },
21689   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpnless", IX86_BUILTIN_CMPNLESS, UNGT, (int) V4SF_FTYPE_V4SF_V4SF },
21690   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpngtss", IX86_BUILTIN_CMPNGTSS, UNGE, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
21691   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpngess", IX86_BUILTIN_CMPNGESS, UNGT, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
21692   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpordss", IX86_BUILTIN_CMPORDSS, ORDERED, (int) V4SF_FTYPE_V4SF_V4SF },
21693
21694   { OPTION_MASK_ISA_SSE, CODE_FOR_sminv4sf3, "__builtin_ia32_minps", IX86_BUILTIN_MINPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21695   { OPTION_MASK_ISA_SSE, CODE_FOR_smaxv4sf3, "__builtin_ia32_maxps", IX86_BUILTIN_MAXPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21696   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmsminv4sf3, "__builtin_ia32_minss", IX86_BUILTIN_MINSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21697   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmsmaxv4sf3, "__builtin_ia32_maxss", IX86_BUILTIN_MAXSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21698
21699   { OPTION_MASK_ISA_SSE, CODE_FOR_andv4sf3, "__builtin_ia32_andps", IX86_BUILTIN_ANDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21700   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_andnotv4sf3,  "__builtin_ia32_andnps", IX86_BUILTIN_ANDNPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21701   { OPTION_MASK_ISA_SSE, CODE_FOR_iorv4sf3, "__builtin_ia32_orps", IX86_BUILTIN_ORPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21702   { OPTION_MASK_ISA_SSE, CODE_FOR_xorv4sf3,  "__builtin_ia32_xorps", IX86_BUILTIN_XORPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21703
21704   { OPTION_MASK_ISA_SSE, CODE_FOR_copysignv4sf3,  "__builtin_ia32_copysignps", IX86_BUILTIN_CPYSGNPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21705
21706   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movss,  "__builtin_ia32_movss", IX86_BUILTIN_MOVSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21707   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movhlps_exp,  "__builtin_ia32_movhlps", IX86_BUILTIN_MOVHLPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21708   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movlhps_exp,  "__builtin_ia32_movlhps", IX86_BUILTIN_MOVLHPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21709   { OPTION_MASK_ISA_SSE, CODE_FOR_vec_interleave_highv4sf, "__builtin_ia32_unpckhps", IX86_BUILTIN_UNPCKHPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21710   { OPTION_MASK_ISA_SSE, CODE_FOR_vec_interleave_lowv4sf, "__builtin_ia32_unpcklps", IX86_BUILTIN_UNPCKLPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21711
21712   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvtpi2ps, "__builtin_ia32_cvtpi2ps", IX86_BUILTIN_CVTPI2PS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V2SI },
21713   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvtsi2ss, "__builtin_ia32_cvtsi2ss", IX86_BUILTIN_CVTSI2SS, UNKNOWN, (int) V4SF_FTYPE_V4SF_SI },
21714   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_64BIT, CODE_FOR_sse_cvtsi2ssq, "__builtin_ia32_cvtsi642ss", IX86_BUILTIN_CVTSI642SS, UNKNOWN, V4SF_FTYPE_V4SF_DI },
21715
21716   { OPTION_MASK_ISA_SSE, CODE_FOR_rsqrtsf2, "__builtin_ia32_rsqrtf", IX86_BUILTIN_RSQRTF, UNKNOWN, (int) FLOAT_FTYPE_FLOAT },
21717
21718   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmsqrtv4sf2, "__builtin_ia32_sqrtss", IX86_BUILTIN_SQRTSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_VEC_MERGE },
21719   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmrsqrtv4sf2, "__builtin_ia32_rsqrtss", IX86_BUILTIN_RSQRTSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_VEC_MERGE },
21720   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmrcpv4sf2, "__builtin_ia32_rcpss", IX86_BUILTIN_RCPSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_VEC_MERGE },
21721
21722   /* SSE MMX or 3Dnow!A */
21723   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_uavgv8qi3, "__builtin_ia32_pavgb", IX86_BUILTIN_PAVGB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21724   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_uavgv4hi3, "__builtin_ia32_pavgw", IX86_BUILTIN_PAVGW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21725   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_umulv4hi3_highpart, "__builtin_ia32_pmulhuw", IX86_BUILTIN_PMULHUW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21726
21727   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_umaxv8qi3, "__builtin_ia32_pmaxub", IX86_BUILTIN_PMAXUB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21728   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_smaxv4hi3, "__builtin_ia32_pmaxsw", IX86_BUILTIN_PMAXSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21729   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_uminv8qi3, "__builtin_ia32_pminub", IX86_BUILTIN_PMINUB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21730   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_sminv4hi3, "__builtin_ia32_pminsw", IX86_BUILTIN_PMINSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21731
21732   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_psadbw, "__builtin_ia32_psadbw", IX86_BUILTIN_PSADBW, UNKNOWN, (int) V1DI_FTYPE_V8QI_V8QI },
21733   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pmovmskb, "__builtin_ia32_pmovmskb", IX86_BUILTIN_PMOVMSKB, UNKNOWN, (int) INT_FTYPE_V8QI },
21734
21735   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pshufw, "__builtin_ia32_pshufw", IX86_BUILTIN_PSHUFW, UNKNOWN, (int) V4HI_FTYPE_V4HI_INT },
21736
21737   /* SSE2 */
21738   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_shufpd, "__builtin_ia32_shufpd", IX86_BUILTIN_SHUFPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
21739
21740   { OPTION_MASK_ISA_SSE2, CODE_FOR_nothing, "__builtin_ia32_vec_perm_v2df", IX86_BUILTIN_VEC_PERM_V2DF, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_V2DI },
21741   { OPTION_MASK_ISA_SSE, CODE_FOR_nothing, "__builtin_ia32_vec_perm_v4sf", IX86_BUILTIN_VEC_PERM_V4SF, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_V4SI },
21742   { OPTION_MASK_ISA_SSE2, CODE_FOR_nothing, "__builtin_ia32_vec_perm_v2di", IX86_BUILTIN_VEC_PERM_V2DI, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_V2DI },
21743   { OPTION_MASK_ISA_SSE2, CODE_FOR_nothing, "__builtin_ia32_vec_perm_v4si", IX86_BUILTIN_VEC_PERM_V4SI, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI_V4SI },
21744   { OPTION_MASK_ISA_SSE2, CODE_FOR_nothing, "__builtin_ia32_vec_perm_v8hi", IX86_BUILTIN_VEC_PERM_V8HI, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI_V8HI },
21745   { OPTION_MASK_ISA_SSE2, CODE_FOR_nothing, "__builtin_ia32_vec_perm_v16qi", IX86_BUILTIN_VEC_PERM_V16QI, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI_V16QI },
21746   { OPTION_MASK_ISA_SSE2, CODE_FOR_nothing, "__builtin_ia32_vec_perm_v2di_u", IX86_BUILTIN_VEC_PERM_V2DI_U, UNKNOWN, (int) V2UDI_FTYPE_V2UDI_V2UDI_V2UDI },
21747   { OPTION_MASK_ISA_SSE2, CODE_FOR_nothing, "__builtin_ia32_vec_perm_v4si_u", IX86_BUILTIN_VEC_PERM_V4SI_U, UNKNOWN, (int) V4USI_FTYPE_V4USI_V4USI_V4USI },
21748   { OPTION_MASK_ISA_SSE2, CODE_FOR_nothing, "__builtin_ia32_vec_perm_v8hi_u", IX86_BUILTIN_VEC_PERM_V8HI_U, UNKNOWN, (int) V8UHI_FTYPE_V8UHI_V8UHI_V8UHI },
21749   { OPTION_MASK_ISA_SSE2, CODE_FOR_nothing, "__builtin_ia32_vec_perm_v16qi_u", IX86_BUILTIN_VEC_PERM_V16QI_U, UNKNOWN, (int) V16UQI_FTYPE_V16UQI_V16UQI_V16UQI },
21750   { OPTION_MASK_ISA_AVX, CODE_FOR_nothing, "__builtin_ia32_vec_perm_v4df", IX86_BUILTIN_VEC_PERM_V4DF, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_V4DI },
21751   { OPTION_MASK_ISA_AVX, CODE_FOR_nothing, "__builtin_ia32_vec_perm_v8sf", IX86_BUILTIN_VEC_PERM_V8SF, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_V8SI },
21752
21753   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movmskpd, "__builtin_ia32_movmskpd", IX86_BUILTIN_MOVMSKPD, UNKNOWN, (int) INT_FTYPE_V2DF  },
21754   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pmovmskb, "__builtin_ia32_pmovmskb128", IX86_BUILTIN_PMOVMSKB128, UNKNOWN, (int) INT_FTYPE_V16QI },
21755   { OPTION_MASK_ISA_SSE2, CODE_FOR_sqrtv2df2, "__builtin_ia32_sqrtpd", IX86_BUILTIN_SQRTPD, UNKNOWN, (int) V2DF_FTYPE_V2DF },
21756   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtdq2pd, "__builtin_ia32_cvtdq2pd", IX86_BUILTIN_CVTDQ2PD, UNKNOWN, (int) V2DF_FTYPE_V4SI },
21757   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtdq2ps, "__builtin_ia32_cvtdq2ps", IX86_BUILTIN_CVTDQ2PS, UNKNOWN, (int) V4SF_FTYPE_V4SI },
21758   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtudq2ps, "__builtin_ia32_cvtudq2ps", IX86_BUILTIN_CVTUDQ2PS, UNKNOWN, (int) V4SF_FTYPE_V4SI },
21759
21760   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtpd2dq, "__builtin_ia32_cvtpd2dq", IX86_BUILTIN_CVTPD2DQ, UNKNOWN, (int) V4SI_FTYPE_V2DF },
21761   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtpd2pi, "__builtin_ia32_cvtpd2pi", IX86_BUILTIN_CVTPD2PI, UNKNOWN, (int) V2SI_FTYPE_V2DF },
21762   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtpd2ps, "__builtin_ia32_cvtpd2ps", IX86_BUILTIN_CVTPD2PS, UNKNOWN, (int) V4SF_FTYPE_V2DF },
21763   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvttpd2dq, "__builtin_ia32_cvttpd2dq", IX86_BUILTIN_CVTTPD2DQ, UNKNOWN, (int) V4SI_FTYPE_V2DF },
21764   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvttpd2pi, "__builtin_ia32_cvttpd2pi", IX86_BUILTIN_CVTTPD2PI, UNKNOWN, (int) V2SI_FTYPE_V2DF },
21765
21766   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtpi2pd, "__builtin_ia32_cvtpi2pd", IX86_BUILTIN_CVTPI2PD, UNKNOWN, (int) V2DF_FTYPE_V2SI },
21767
21768   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtsd2si, "__builtin_ia32_cvtsd2si", IX86_BUILTIN_CVTSD2SI, UNKNOWN, (int) INT_FTYPE_V2DF },
21769   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvttsd2si, "__builtin_ia32_cvttsd2si", IX86_BUILTIN_CVTTSD2SI, UNKNOWN, (int) INT_FTYPE_V2DF },
21770   { OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_64BIT, CODE_FOR_sse2_cvtsd2siq, "__builtin_ia32_cvtsd2si64", IX86_BUILTIN_CVTSD2SI64, UNKNOWN, (int) INT64_FTYPE_V2DF },
21771   { OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_64BIT, CODE_FOR_sse2_cvttsd2siq, "__builtin_ia32_cvttsd2si64", IX86_BUILTIN_CVTTSD2SI64, UNKNOWN, (int) INT64_FTYPE_V2DF },
21772
21773   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtps2dq, "__builtin_ia32_cvtps2dq", IX86_BUILTIN_CVTPS2DQ, UNKNOWN, (int) V4SI_FTYPE_V4SF },
21774   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtps2pd, "__builtin_ia32_cvtps2pd", IX86_BUILTIN_CVTPS2PD, UNKNOWN, (int) V2DF_FTYPE_V4SF },
21775   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvttps2dq, "__builtin_ia32_cvttps2dq", IX86_BUILTIN_CVTTPS2DQ, UNKNOWN, (int) V4SI_FTYPE_V4SF },
21776
21777   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv2df3, "__builtin_ia32_addpd", IX86_BUILTIN_ADDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21778   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv2df3, "__builtin_ia32_subpd", IX86_BUILTIN_SUBPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21779   { OPTION_MASK_ISA_SSE2, CODE_FOR_mulv2df3, "__builtin_ia32_mulpd", IX86_BUILTIN_MULPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21780   { OPTION_MASK_ISA_SSE2, CODE_FOR_divv2df3, "__builtin_ia32_divpd", IX86_BUILTIN_DIVPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21781   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmaddv2df3,  "__builtin_ia32_addsd", IX86_BUILTIN_ADDSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21782   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmsubv2df3,  "__builtin_ia32_subsd", IX86_BUILTIN_SUBSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21783   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmulv2df3,  "__builtin_ia32_mulsd", IX86_BUILTIN_MULSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21784   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmdivv2df3,  "__builtin_ia32_divsd", IX86_BUILTIN_DIVSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21785
21786   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpeqpd", IX86_BUILTIN_CMPEQPD, EQ, (int) V2DF_FTYPE_V2DF_V2DF },
21787   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpltpd", IX86_BUILTIN_CMPLTPD, LT, (int) V2DF_FTYPE_V2DF_V2DF },
21788   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmplepd", IX86_BUILTIN_CMPLEPD, LE, (int) V2DF_FTYPE_V2DF_V2DF },
21789   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpgtpd", IX86_BUILTIN_CMPGTPD, LT, (int) V2DF_FTYPE_V2DF_V2DF_SWAP },
21790   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpgepd", IX86_BUILTIN_CMPGEPD, LE, (int) V2DF_FTYPE_V2DF_V2DF_SWAP},
21791   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpunordpd", IX86_BUILTIN_CMPUNORDPD, UNORDERED, (int) V2DF_FTYPE_V2DF_V2DF },
21792   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpneqpd", IX86_BUILTIN_CMPNEQPD, NE, (int) V2DF_FTYPE_V2DF_V2DF },
21793   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpnltpd", IX86_BUILTIN_CMPNLTPD, UNGE, (int) V2DF_FTYPE_V2DF_V2DF },
21794   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpnlepd", IX86_BUILTIN_CMPNLEPD, UNGT, (int) V2DF_FTYPE_V2DF_V2DF },
21795   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpngtpd", IX86_BUILTIN_CMPNGTPD, UNGE, (int) V2DF_FTYPE_V2DF_V2DF_SWAP },
21796   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpngepd", IX86_BUILTIN_CMPNGEPD, UNGT, (int) V2DF_FTYPE_V2DF_V2DF_SWAP },
21797   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpordpd", IX86_BUILTIN_CMPORDPD, ORDERED, (int) V2DF_FTYPE_V2DF_V2DF },
21798   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpeqsd", IX86_BUILTIN_CMPEQSD, EQ, (int) V2DF_FTYPE_V2DF_V2DF },
21799   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpltsd", IX86_BUILTIN_CMPLTSD, LT, (int) V2DF_FTYPE_V2DF_V2DF },
21800   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmplesd", IX86_BUILTIN_CMPLESD, LE, (int) V2DF_FTYPE_V2DF_V2DF },
21801   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpunordsd", IX86_BUILTIN_CMPUNORDSD, UNORDERED, (int) V2DF_FTYPE_V2DF_V2DF },
21802   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpneqsd", IX86_BUILTIN_CMPNEQSD, NE, (int) V2DF_FTYPE_V2DF_V2DF },
21803   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpnltsd", IX86_BUILTIN_CMPNLTSD, UNGE, (int) V2DF_FTYPE_V2DF_V2DF },
21804   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpnlesd", IX86_BUILTIN_CMPNLESD, UNGT, (int) V2DF_FTYPE_V2DF_V2DF },
21805   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpordsd", IX86_BUILTIN_CMPORDSD, ORDERED, (int) V2DF_FTYPE_V2DF_V2DF },
21806
21807   { OPTION_MASK_ISA_SSE2, CODE_FOR_sminv2df3, "__builtin_ia32_minpd", IX86_BUILTIN_MINPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21808   { OPTION_MASK_ISA_SSE2, CODE_FOR_smaxv2df3, "__builtin_ia32_maxpd", IX86_BUILTIN_MAXPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21809   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmsminv2df3, "__builtin_ia32_minsd", IX86_BUILTIN_MINSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21810   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmsmaxv2df3, "__builtin_ia32_maxsd", IX86_BUILTIN_MAXSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21811
21812   { OPTION_MASK_ISA_SSE2, CODE_FOR_andv2df3, "__builtin_ia32_andpd", IX86_BUILTIN_ANDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21813   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_andnotv2df3,  "__builtin_ia32_andnpd", IX86_BUILTIN_ANDNPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21814   { OPTION_MASK_ISA_SSE2, CODE_FOR_iorv2df3, "__builtin_ia32_orpd", IX86_BUILTIN_ORPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21815   { OPTION_MASK_ISA_SSE2, CODE_FOR_xorv2df3,  "__builtin_ia32_xorpd", IX86_BUILTIN_XORPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21816
21817   { OPTION_MASK_ISA_SSE2, CODE_FOR_copysignv2df3,  "__builtin_ia32_copysignpd", IX86_BUILTIN_CPYSGNPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21818
21819   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movsd,  "__builtin_ia32_movsd", IX86_BUILTIN_MOVSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21820   { OPTION_MASK_ISA_SSE2, CODE_FOR_vec_interleave_highv2df, "__builtin_ia32_unpckhpd", IX86_BUILTIN_UNPCKHPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21821   { OPTION_MASK_ISA_SSE2, CODE_FOR_vec_interleave_lowv2df, "__builtin_ia32_unpcklpd", IX86_BUILTIN_UNPCKLPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21822
21823   { OPTION_MASK_ISA_SSE2, CODE_FOR_vec_pack_sfix_v2df, "__builtin_ia32_vec_pack_sfix", IX86_BUILTIN_VEC_PACK_SFIX, UNKNOWN, (int) V4SI_FTYPE_V2DF_V2DF },
21824
21825   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv16qi3, "__builtin_ia32_paddb128", IX86_BUILTIN_PADDB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21826   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv8hi3, "__builtin_ia32_paddw128", IX86_BUILTIN_PADDW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21827   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv4si3, "__builtin_ia32_paddd128", IX86_BUILTIN_PADDD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21828   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv2di3, "__builtin_ia32_paddq128", IX86_BUILTIN_PADDQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21829   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv16qi3, "__builtin_ia32_psubb128", IX86_BUILTIN_PSUBB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21830   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv8hi3, "__builtin_ia32_psubw128", IX86_BUILTIN_PSUBW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21831   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv4si3, "__builtin_ia32_psubd128", IX86_BUILTIN_PSUBD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21832   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv2di3, "__builtin_ia32_psubq128", IX86_BUILTIN_PSUBQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21833
21834   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ssaddv16qi3, "__builtin_ia32_paddsb128", IX86_BUILTIN_PADDSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21835   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ssaddv8hi3, "__builtin_ia32_paddsw128", IX86_BUILTIN_PADDSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21836   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_sssubv16qi3, "__builtin_ia32_psubsb128", IX86_BUILTIN_PSUBSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21837   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_sssubv8hi3, "__builtin_ia32_psubsw128", IX86_BUILTIN_PSUBSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21838   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_usaddv16qi3, "__builtin_ia32_paddusb128", IX86_BUILTIN_PADDUSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21839   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_usaddv8hi3, "__builtin_ia32_paddusw128", IX86_BUILTIN_PADDUSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21840   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ussubv16qi3, "__builtin_ia32_psubusb128", IX86_BUILTIN_PSUBUSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21841   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ussubv8hi3, "__builtin_ia32_psubusw128", IX86_BUILTIN_PSUBUSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21842
21843   { OPTION_MASK_ISA_SSE2, CODE_FOR_mulv8hi3, "__builtin_ia32_pmullw128", IX86_BUILTIN_PMULLW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21844   { OPTION_MASK_ISA_SSE2, CODE_FOR_smulv8hi3_highpart, "__builtin_ia32_pmulhw128", IX86_BUILTIN_PMULHW128, UNKNOWN,(int) V8HI_FTYPE_V8HI_V8HI },
21845
21846   { OPTION_MASK_ISA_SSE2, CODE_FOR_andv2di3, "__builtin_ia32_pand128", IX86_BUILTIN_PAND128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21847   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_andnotv2di3, "__builtin_ia32_pandn128", IX86_BUILTIN_PANDN128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21848   { OPTION_MASK_ISA_SSE2, CODE_FOR_iorv2di3, "__builtin_ia32_por128", IX86_BUILTIN_POR128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21849   { OPTION_MASK_ISA_SSE2, CODE_FOR_xorv2di3, "__builtin_ia32_pxor128", IX86_BUILTIN_PXOR128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21850
21851   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_uavgv16qi3, "__builtin_ia32_pavgb128", IX86_BUILTIN_PAVGB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21852   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_uavgv8hi3, "__builtin_ia32_pavgw128", IX86_BUILTIN_PAVGW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21853
21854   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_eqv16qi3, "__builtin_ia32_pcmpeqb128", IX86_BUILTIN_PCMPEQB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21855   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_eqv8hi3, "__builtin_ia32_pcmpeqw128", IX86_BUILTIN_PCMPEQW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21856   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_eqv4si3, "__builtin_ia32_pcmpeqd128", IX86_BUILTIN_PCMPEQD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI  },
21857   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_gtv16qi3, "__builtin_ia32_pcmpgtb128", IX86_BUILTIN_PCMPGTB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21858   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_gtv8hi3, "__builtin_ia32_pcmpgtw128", IX86_BUILTIN_PCMPGTW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21859   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_gtv4si3, "__builtin_ia32_pcmpgtd128", IX86_BUILTIN_PCMPGTD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI  },
21860
21861   { OPTION_MASK_ISA_SSE2, CODE_FOR_umaxv16qi3, "__builtin_ia32_pmaxub128", IX86_BUILTIN_PMAXUB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21862   { OPTION_MASK_ISA_SSE2, CODE_FOR_smaxv8hi3, "__builtin_ia32_pmaxsw128", IX86_BUILTIN_PMAXSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21863   { OPTION_MASK_ISA_SSE2, CODE_FOR_uminv16qi3, "__builtin_ia32_pminub128", IX86_BUILTIN_PMINUB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21864   { OPTION_MASK_ISA_SSE2, CODE_FOR_sminv8hi3, "__builtin_ia32_pminsw128", IX86_BUILTIN_PMINSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21865
21866   { OPTION_MASK_ISA_SSE2, CODE_FOR_vec_interleave_highv16qi, "__builtin_ia32_punpckhbw128", IX86_BUILTIN_PUNPCKHBW128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21867   { OPTION_MASK_ISA_SSE2, CODE_FOR_vec_interleave_highv8hi, "__builtin_ia32_punpckhwd128", IX86_BUILTIN_PUNPCKHWD128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI  },
21868   { OPTION_MASK_ISA_SSE2, CODE_FOR_vec_interleave_highv4si, "__builtin_ia32_punpckhdq128", IX86_BUILTIN_PUNPCKHDQ128, UNKNOWN,  (int) V4SI_FTYPE_V4SI_V4SI },
21869   { OPTION_MASK_ISA_SSE2, CODE_FOR_vec_interleave_highv2di, "__builtin_ia32_punpckhqdq128", IX86_BUILTIN_PUNPCKHQDQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21870   { OPTION_MASK_ISA_SSE2, CODE_FOR_vec_interleave_lowv16qi, "__builtin_ia32_punpcklbw128", IX86_BUILTIN_PUNPCKLBW128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21871   { OPTION_MASK_ISA_SSE2, CODE_FOR_vec_interleave_lowv8hi, "__builtin_ia32_punpcklwd128", IX86_BUILTIN_PUNPCKLWD128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21872   { OPTION_MASK_ISA_SSE2, CODE_FOR_vec_interleave_lowv4si, "__builtin_ia32_punpckldq128", IX86_BUILTIN_PUNPCKLDQ128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21873   { OPTION_MASK_ISA_SSE2, CODE_FOR_vec_interleave_lowv2di, "__builtin_ia32_punpcklqdq128", IX86_BUILTIN_PUNPCKLQDQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21874
21875   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_packsswb, "__builtin_ia32_packsswb128", IX86_BUILTIN_PACKSSWB128, UNKNOWN, (int) V16QI_FTYPE_V8HI_V8HI },
21876   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_packssdw, "__builtin_ia32_packssdw128", IX86_BUILTIN_PACKSSDW128, UNKNOWN, (int) V8HI_FTYPE_V4SI_V4SI },
21877   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_packuswb, "__builtin_ia32_packuswb128", IX86_BUILTIN_PACKUSWB128, UNKNOWN, (int) V16QI_FTYPE_V8HI_V8HI },
21878
21879   { OPTION_MASK_ISA_SSE2, CODE_FOR_umulv8hi3_highpart, "__builtin_ia32_pmulhuw128", IX86_BUILTIN_PMULHUW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21880   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_psadbw, "__builtin_ia32_psadbw128", IX86_BUILTIN_PSADBW128, UNKNOWN, (int) V2DI_FTYPE_V16QI_V16QI },
21881
21882   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_umulv1siv1di3, "__builtin_ia32_pmuludq", IX86_BUILTIN_PMULUDQ, UNKNOWN, (int) V1DI_FTYPE_V2SI_V2SI },
21883   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_umulv2siv2di3, "__builtin_ia32_pmuludq128", IX86_BUILTIN_PMULUDQ128, UNKNOWN, (int) V2DI_FTYPE_V4SI_V4SI },
21884
21885   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pmaddwd, "__builtin_ia32_pmaddwd128", IX86_BUILTIN_PMADDWD128, UNKNOWN, (int) V4SI_FTYPE_V8HI_V8HI },
21886
21887   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtsi2sd, "__builtin_ia32_cvtsi2sd", IX86_BUILTIN_CVTSI2SD, UNKNOWN, (int) V2DF_FTYPE_V2DF_SI },
21888   { OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_64BIT, CODE_FOR_sse2_cvtsi2sdq, "__builtin_ia32_cvtsi642sd", IX86_BUILTIN_CVTSI642SD, UNKNOWN, (int) V2DF_FTYPE_V2DF_DI },
21889   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtsd2ss, "__builtin_ia32_cvtsd2ss", IX86_BUILTIN_CVTSD2SS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V2DF },
21890   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtss2sd, "__builtin_ia32_cvtss2sd", IX86_BUILTIN_CVTSS2SD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V4SF },
21891
21892   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ashlv1ti3, "__builtin_ia32_pslldqi128", IX86_BUILTIN_PSLLDQI128, UNKNOWN, (int) V2DI_FTYPE_V2DI_INT_CONVERT },
21893   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv8hi3, "__builtin_ia32_psllwi128", IX86_BUILTIN_PSLLWI128, UNKNOWN, (int) V8HI_FTYPE_V8HI_SI_COUNT },
21894   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv4si3, "__builtin_ia32_pslldi128", IX86_BUILTIN_PSLLDI128, UNKNOWN, (int) V4SI_FTYPE_V4SI_SI_COUNT },
21895   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv2di3, "__builtin_ia32_psllqi128", IX86_BUILTIN_PSLLQI128, UNKNOWN, (int) V2DI_FTYPE_V2DI_SI_COUNT },
21896   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv8hi3, "__builtin_ia32_psllw128", IX86_BUILTIN_PSLLW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI_COUNT },
21897   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv4si3, "__builtin_ia32_pslld128", IX86_BUILTIN_PSLLD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI_COUNT },
21898   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv2di3, "__builtin_ia32_psllq128", IX86_BUILTIN_PSLLQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_COUNT },
21899
21900   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_lshrv1ti3, "__builtin_ia32_psrldqi128", IX86_BUILTIN_PSRLDQI128, UNKNOWN, (int) V2DI_FTYPE_V2DI_INT_CONVERT },
21901   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv8hi3, "__builtin_ia32_psrlwi128", IX86_BUILTIN_PSRLWI128, UNKNOWN, (int) V8HI_FTYPE_V8HI_SI_COUNT },
21902   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv4si3, "__builtin_ia32_psrldi128", IX86_BUILTIN_PSRLDI128, UNKNOWN, (int) V4SI_FTYPE_V4SI_SI_COUNT },
21903   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv2di3, "__builtin_ia32_psrlqi128", IX86_BUILTIN_PSRLQI128, UNKNOWN, (int) V2DI_FTYPE_V2DI_SI_COUNT },
21904   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv8hi3, "__builtin_ia32_psrlw128", IX86_BUILTIN_PSRLW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI_COUNT },
21905   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv4si3, "__builtin_ia32_psrld128", IX86_BUILTIN_PSRLD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI_COUNT },
21906   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv2di3, "__builtin_ia32_psrlq128", IX86_BUILTIN_PSRLQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_COUNT },
21907
21908   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashrv8hi3, "__builtin_ia32_psrawi128", IX86_BUILTIN_PSRAWI128, UNKNOWN, (int) V8HI_FTYPE_V8HI_SI_COUNT },
21909   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashrv4si3, "__builtin_ia32_psradi128", IX86_BUILTIN_PSRADI128, UNKNOWN, (int) V4SI_FTYPE_V4SI_SI_COUNT },
21910   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashrv8hi3, "__builtin_ia32_psraw128", IX86_BUILTIN_PSRAW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI_COUNT },
21911   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashrv4si3, "__builtin_ia32_psrad128", IX86_BUILTIN_PSRAD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI_COUNT },
21912
21913   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pshufd, "__builtin_ia32_pshufd", IX86_BUILTIN_PSHUFD, UNKNOWN, (int) V4SI_FTYPE_V4SI_INT },
21914   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pshuflw, "__builtin_ia32_pshuflw", IX86_BUILTIN_PSHUFLW, UNKNOWN, (int) V8HI_FTYPE_V8HI_INT },
21915   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pshufhw, "__builtin_ia32_pshufhw", IX86_BUILTIN_PSHUFHW, UNKNOWN, (int) V8HI_FTYPE_V8HI_INT },
21916
21917   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmsqrtv2df2, "__builtin_ia32_sqrtsd", IX86_BUILTIN_SQRTSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_VEC_MERGE },
21918
21919   { OPTION_MASK_ISA_SSE2, CODE_FOR_abstf2, 0, IX86_BUILTIN_FABSQ, UNKNOWN, (int) FLOAT128_FTYPE_FLOAT128 },
21920   { OPTION_MASK_ISA_SSE2, CODE_FOR_copysigntf3, 0, IX86_BUILTIN_COPYSIGNQ, UNKNOWN, (int) FLOAT128_FTYPE_FLOAT128_FLOAT128 },
21921
21922   { OPTION_MASK_ISA_SSE, CODE_FOR_sse2_movq128, "__builtin_ia32_movq128", IX86_BUILTIN_MOVQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI },
21923
21924   /* SSE2 MMX */
21925   { OPTION_MASK_ISA_SSE2, CODE_FOR_mmx_addv1di3, "__builtin_ia32_paddq", IX86_BUILTIN_PADDQ, UNKNOWN, (int) V1DI_FTYPE_V1DI_V1DI },
21926   { OPTION_MASK_ISA_SSE2, CODE_FOR_mmx_subv1di3, "__builtin_ia32_psubq", IX86_BUILTIN_PSUBQ, UNKNOWN, (int) V1DI_FTYPE_V1DI_V1DI },
21927
21928   /* SSE3 */
21929   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_movshdup, "__builtin_ia32_movshdup", IX86_BUILTIN_MOVSHDUP, UNKNOWN, (int) V4SF_FTYPE_V4SF},
21930   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_movsldup, "__builtin_ia32_movsldup", IX86_BUILTIN_MOVSLDUP, UNKNOWN, (int) V4SF_FTYPE_V4SF },
21931
21932   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_addsubv4sf3, "__builtin_ia32_addsubps", IX86_BUILTIN_ADDSUBPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21933   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_addsubv2df3, "__builtin_ia32_addsubpd", IX86_BUILTIN_ADDSUBPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21934   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_haddv4sf3, "__builtin_ia32_haddps", IX86_BUILTIN_HADDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21935   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_haddv2df3, "__builtin_ia32_haddpd", IX86_BUILTIN_HADDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21936   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_hsubv4sf3, "__builtin_ia32_hsubps", IX86_BUILTIN_HSUBPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21937   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_hsubv2df3, "__builtin_ia32_hsubpd", IX86_BUILTIN_HSUBPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21938
21939   /* SSSE3 */
21940   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv16qi2, "__builtin_ia32_pabsb128", IX86_BUILTIN_PABSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI },
21941   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv8qi2, "__builtin_ia32_pabsb", IX86_BUILTIN_PABSB, UNKNOWN, (int) V8QI_FTYPE_V8QI },
21942   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv8hi2, "__builtin_ia32_pabsw128", IX86_BUILTIN_PABSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI },
21943   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv4hi2, "__builtin_ia32_pabsw", IX86_BUILTIN_PABSW, UNKNOWN, (int) V4HI_FTYPE_V4HI },
21944   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv4si2, "__builtin_ia32_pabsd128", IX86_BUILTIN_PABSD128, UNKNOWN, (int) V4SI_FTYPE_V4SI },
21945   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv2si2, "__builtin_ia32_pabsd", IX86_BUILTIN_PABSD, UNKNOWN, (int) V2SI_FTYPE_V2SI },
21946
21947   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phaddwv8hi3, "__builtin_ia32_phaddw128", IX86_BUILTIN_PHADDW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21948   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phaddwv4hi3, "__builtin_ia32_phaddw", IX86_BUILTIN_PHADDW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21949   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phadddv4si3, "__builtin_ia32_phaddd128", IX86_BUILTIN_PHADDD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21950   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phadddv2si3, "__builtin_ia32_phaddd", IX86_BUILTIN_PHADDD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21951   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phaddswv8hi3, "__builtin_ia32_phaddsw128", IX86_BUILTIN_PHADDSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21952   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phaddswv4hi3, "__builtin_ia32_phaddsw", IX86_BUILTIN_PHADDSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21953   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubwv8hi3, "__builtin_ia32_phsubw128", IX86_BUILTIN_PHSUBW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21954   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubwv4hi3, "__builtin_ia32_phsubw", IX86_BUILTIN_PHSUBW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21955   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubdv4si3, "__builtin_ia32_phsubd128", IX86_BUILTIN_PHSUBD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21956   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubdv2si3, "__builtin_ia32_phsubd", IX86_BUILTIN_PHSUBD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21957   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubswv8hi3, "__builtin_ia32_phsubsw128", IX86_BUILTIN_PHSUBSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21958   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubswv4hi3, "__builtin_ia32_phsubsw", IX86_BUILTIN_PHSUBSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21959   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pmaddubsw128, "__builtin_ia32_pmaddubsw128", IX86_BUILTIN_PMADDUBSW128, UNKNOWN, (int) V8HI_FTYPE_V16QI_V16QI },
21960   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pmaddubsw, "__builtin_ia32_pmaddubsw", IX86_BUILTIN_PMADDUBSW, UNKNOWN, (int) V4HI_FTYPE_V8QI_V8QI },
21961   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pmulhrswv8hi3, "__builtin_ia32_pmulhrsw128", IX86_BUILTIN_PMULHRSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21962   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pmulhrswv4hi3, "__builtin_ia32_pmulhrsw", IX86_BUILTIN_PMULHRSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21963   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pshufbv16qi3, "__builtin_ia32_pshufb128", IX86_BUILTIN_PSHUFB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21964   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pshufbv8qi3, "__builtin_ia32_pshufb", IX86_BUILTIN_PSHUFB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21965   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv16qi3, "__builtin_ia32_psignb128", IX86_BUILTIN_PSIGNB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21966   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv8qi3, "__builtin_ia32_psignb", IX86_BUILTIN_PSIGNB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21967   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv8hi3, "__builtin_ia32_psignw128", IX86_BUILTIN_PSIGNW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21968   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv4hi3, "__builtin_ia32_psignw", IX86_BUILTIN_PSIGNW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21969   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv4si3, "__builtin_ia32_psignd128", IX86_BUILTIN_PSIGND128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21970   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv2si3, "__builtin_ia32_psignd", IX86_BUILTIN_PSIGND, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21971
21972   /* SSSE3.  */
21973   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_palignrti, "__builtin_ia32_palignr128", IX86_BUILTIN_PALIGNR128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_INT_CONVERT },
21974   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_palignrdi, "__builtin_ia32_palignr", IX86_BUILTIN_PALIGNR, UNKNOWN, (int) V1DI_FTYPE_V1DI_V1DI_INT_CONVERT },
21975
21976   /* SSE4.1 */
21977   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_blendpd, "__builtin_ia32_blendpd", IX86_BUILTIN_BLENDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
21978   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_blendps, "__builtin_ia32_blendps", IX86_BUILTIN_BLENDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
21979   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_blendvpd, "__builtin_ia32_blendvpd", IX86_BUILTIN_BLENDVPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_V2DF },
21980   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_blendvps, "__builtin_ia32_blendvps", IX86_BUILTIN_BLENDVPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_V4SF },
21981   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_dppd, "__builtin_ia32_dppd", IX86_BUILTIN_DPPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
21982   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_dpps, "__builtin_ia32_dpps", IX86_BUILTIN_DPPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
21983   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_insertps, "__builtin_ia32_insertps128", IX86_BUILTIN_INSERTPS128, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
21984   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_mpsadbw, "__builtin_ia32_mpsadbw128", IX86_BUILTIN_MPSADBW128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI_INT },
21985   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_pblendvb, "__builtin_ia32_pblendvb128", IX86_BUILTIN_PBLENDVB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI_V16QI },
21986   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_pblendw, "__builtin_ia32_pblendw128", IX86_BUILTIN_PBLENDW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI_INT },
21987
21988   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_extendv8qiv8hi2, "__builtin_ia32_pmovsxbw128", IX86_BUILTIN_PMOVSXBW128, UNKNOWN, (int) V8HI_FTYPE_V16QI },
21989   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_extendv4qiv4si2, "__builtin_ia32_pmovsxbd128", IX86_BUILTIN_PMOVSXBD128, UNKNOWN, (int) V4SI_FTYPE_V16QI },
21990   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_extendv2qiv2di2, "__builtin_ia32_pmovsxbq128", IX86_BUILTIN_PMOVSXBQ128, UNKNOWN, (int) V2DI_FTYPE_V16QI },
21991   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_extendv4hiv4si2, "__builtin_ia32_pmovsxwd128", IX86_BUILTIN_PMOVSXWD128, UNKNOWN, (int) V4SI_FTYPE_V8HI },
21992   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_extendv2hiv2di2, "__builtin_ia32_pmovsxwq128", IX86_BUILTIN_PMOVSXWQ128, UNKNOWN, (int) V2DI_FTYPE_V8HI },
21993   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_extendv2siv2di2, "__builtin_ia32_pmovsxdq128", IX86_BUILTIN_PMOVSXDQ128, UNKNOWN, (int) V2DI_FTYPE_V4SI },
21994   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv8qiv8hi2, "__builtin_ia32_pmovzxbw128", IX86_BUILTIN_PMOVZXBW128, UNKNOWN, (int) V8HI_FTYPE_V16QI },
21995   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv4qiv4si2, "__builtin_ia32_pmovzxbd128", IX86_BUILTIN_PMOVZXBD128, UNKNOWN, (int) V4SI_FTYPE_V16QI },
21996   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv2qiv2di2, "__builtin_ia32_pmovzxbq128", IX86_BUILTIN_PMOVZXBQ128, UNKNOWN, (int) V2DI_FTYPE_V16QI },
21997   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv4hiv4si2, "__builtin_ia32_pmovzxwd128", IX86_BUILTIN_PMOVZXWD128, UNKNOWN, (int) V4SI_FTYPE_V8HI },
21998   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv2hiv2di2, "__builtin_ia32_pmovzxwq128", IX86_BUILTIN_PMOVZXWQ128, UNKNOWN, (int) V2DI_FTYPE_V8HI },
21999   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv2siv2di2, "__builtin_ia32_pmovzxdq128", IX86_BUILTIN_PMOVZXDQ128, UNKNOWN, (int) V2DI_FTYPE_V4SI },
22000   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_phminposuw, "__builtin_ia32_phminposuw128", IX86_BUILTIN_PHMINPOSUW128, UNKNOWN, (int) V8HI_FTYPE_V8HI },
22001
22002   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_packusdw, "__builtin_ia32_packusdw128", IX86_BUILTIN_PACKUSDW128, UNKNOWN, (int) V8HI_FTYPE_V4SI_V4SI },
22003   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_eqv2di3, "__builtin_ia32_pcmpeqq", IX86_BUILTIN_PCMPEQQ, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
22004   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_smaxv16qi3, "__builtin_ia32_pmaxsb128", IX86_BUILTIN_PMAXSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
22005   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_smaxv4si3, "__builtin_ia32_pmaxsd128", IX86_BUILTIN_PMAXSD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
22006   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_umaxv4si3, "__builtin_ia32_pmaxud128", IX86_BUILTIN_PMAXUD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
22007   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_umaxv8hi3, "__builtin_ia32_pmaxuw128", IX86_BUILTIN_PMAXUW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
22008   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sminv16qi3, "__builtin_ia32_pminsb128", IX86_BUILTIN_PMINSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
22009   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sminv4si3, "__builtin_ia32_pminsd128", IX86_BUILTIN_PMINSD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
22010   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_uminv4si3, "__builtin_ia32_pminud128", IX86_BUILTIN_PMINUD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
22011   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_uminv8hi3, "__builtin_ia32_pminuw128", IX86_BUILTIN_PMINUW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
22012   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_mulv2siv2di3, "__builtin_ia32_pmuldq128", IX86_BUILTIN_PMULDQ128, UNKNOWN, (int) V2DI_FTYPE_V4SI_V4SI },
22013   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_mulv4si3, "__builtin_ia32_pmulld128", IX86_BUILTIN_PMULLD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
22014
22015   /* SSE4.1 */
22016   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_roundpd, "__builtin_ia32_roundpd", IX86_BUILTIN_ROUNDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_INT },
22017   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_roundps, "__builtin_ia32_roundps", IX86_BUILTIN_ROUNDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_INT },
22018   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_roundsd, "__builtin_ia32_roundsd", IX86_BUILTIN_ROUNDSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
22019   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_roundss, "__builtin_ia32_roundss", IX86_BUILTIN_ROUNDSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
22020
22021   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_ptest, "__builtin_ia32_ptestz128", IX86_BUILTIN_PTESTZ, EQ, (int) INT_FTYPE_V2DI_V2DI_PTEST },
22022   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_ptest, "__builtin_ia32_ptestc128", IX86_BUILTIN_PTESTC, LTU, (int) INT_FTYPE_V2DI_V2DI_PTEST },
22023   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_ptest, "__builtin_ia32_ptestnzc128", IX86_BUILTIN_PTESTNZC, GTU, (int) INT_FTYPE_V2DI_V2DI_PTEST },
22024
22025   /* SSE4.2 */
22026   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_gtv2di3, "__builtin_ia32_pcmpgtq", IX86_BUILTIN_PCMPGTQ, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
22027   { OPTION_MASK_ISA_SSE4_2 | OPTION_MASK_ISA_CRC32, CODE_FOR_sse4_2_crc32qi, "__builtin_ia32_crc32qi", IX86_BUILTIN_CRC32QI, UNKNOWN, (int) UINT_FTYPE_UINT_UCHAR },
22028   { OPTION_MASK_ISA_SSE4_2 | OPTION_MASK_ISA_CRC32, CODE_FOR_sse4_2_crc32hi, "__builtin_ia32_crc32hi", IX86_BUILTIN_CRC32HI, UNKNOWN, (int) UINT_FTYPE_UINT_USHORT },
22029   { OPTION_MASK_ISA_SSE4_2 | OPTION_MASK_ISA_CRC32, CODE_FOR_sse4_2_crc32si, "__builtin_ia32_crc32si", IX86_BUILTIN_CRC32SI, UNKNOWN, (int) UINT_FTYPE_UINT_UINT },
22030   { OPTION_MASK_ISA_SSE4_2 | OPTION_MASK_ISA_CRC32 | OPTION_MASK_ISA_64BIT, CODE_FOR_sse4_2_crc32di, "__builtin_ia32_crc32di", IX86_BUILTIN_CRC32DI, UNKNOWN, (int) UINT64_FTYPE_UINT64_UINT64 },
22031
22032   /* SSE4A */
22033   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_extrqi, "__builtin_ia32_extrqi", IX86_BUILTIN_EXTRQI, UNKNOWN, (int) V2DI_FTYPE_V2DI_UINT_UINT },
22034   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_extrq, "__builtin_ia32_extrq", IX86_BUILTIN_EXTRQ, UNKNOWN, (int) V2DI_FTYPE_V2DI_V16QI },
22035   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_insertqi, "__builtin_ia32_insertqi", IX86_BUILTIN_INSERTQI, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_UINT_UINT },
22036   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_insertq, "__builtin_ia32_insertq", IX86_BUILTIN_INSERTQ, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
22037
22038   /* AES */
22039   { OPTION_MASK_ISA_SSE2, CODE_FOR_aeskeygenassist, 0, IX86_BUILTIN_AESKEYGENASSIST128, UNKNOWN, (int) V2DI_FTYPE_V2DI_INT },
22040   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesimc, 0, IX86_BUILTIN_AESIMC128, UNKNOWN, (int) V2DI_FTYPE_V2DI },
22041
22042   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesenc, 0, IX86_BUILTIN_AESENC128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
22043   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesenclast, 0, IX86_BUILTIN_AESENCLAST128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
22044   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesdec, 0, IX86_BUILTIN_AESDEC128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
22045   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesdeclast, 0, IX86_BUILTIN_AESDECLAST128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
22046
22047   /* PCLMUL */
22048   { OPTION_MASK_ISA_SSE2, CODE_FOR_pclmulqdq, 0, IX86_BUILTIN_PCLMULQDQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_INT },
22049
22050   /* AVX */
22051   { OPTION_MASK_ISA_AVX, CODE_FOR_addv4df3, "__builtin_ia32_addpd256", IX86_BUILTIN_ADDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
22052   { OPTION_MASK_ISA_AVX, CODE_FOR_addv8sf3, "__builtin_ia32_addps256", IX86_BUILTIN_ADDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
22053   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_addsubv4df3, "__builtin_ia32_addsubpd256", IX86_BUILTIN_ADDSUBPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
22054   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_addsubv8sf3, "__builtin_ia32_addsubps256", IX86_BUILTIN_ADDSUBPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
22055   { OPTION_MASK_ISA_AVX, CODE_FOR_andv4df3, "__builtin_ia32_andpd256", IX86_BUILTIN_ANDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
22056   { OPTION_MASK_ISA_AVX, CODE_FOR_andv8sf3, "__builtin_ia32_andps256", IX86_BUILTIN_ANDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
22057   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_andnotv4df3, "__builtin_ia32_andnpd256", IX86_BUILTIN_ANDNPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
22058   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_andnotv8sf3, "__builtin_ia32_andnps256", IX86_BUILTIN_ANDNPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
22059   { OPTION_MASK_ISA_AVX, CODE_FOR_divv4df3, "__builtin_ia32_divpd256", IX86_BUILTIN_DIVPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
22060   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_divv8sf3, "__builtin_ia32_divps256", IX86_BUILTIN_DIVPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
22061   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_haddv4df3, "__builtin_ia32_haddpd256", IX86_BUILTIN_HADDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
22062   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_hsubv8sf3, "__builtin_ia32_hsubps256", IX86_BUILTIN_HSUBPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
22063   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_hsubv4df3, "__builtin_ia32_hsubpd256", IX86_BUILTIN_HSUBPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
22064   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_haddv8sf3, "__builtin_ia32_haddps256", IX86_BUILTIN_HADDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
22065   { OPTION_MASK_ISA_AVX, CODE_FOR_smaxv4df3, "__builtin_ia32_maxpd256", IX86_BUILTIN_MAXPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
22066   { OPTION_MASK_ISA_AVX, CODE_FOR_smaxv8sf3, "__builtin_ia32_maxps256", IX86_BUILTIN_MAXPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
22067   { OPTION_MASK_ISA_AVX, CODE_FOR_sminv4df3, "__builtin_ia32_minpd256", IX86_BUILTIN_MINPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
22068   { OPTION_MASK_ISA_AVX, CODE_FOR_sminv8sf3, "__builtin_ia32_minps256", IX86_BUILTIN_MINPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
22069   { OPTION_MASK_ISA_AVX, CODE_FOR_mulv4df3, "__builtin_ia32_mulpd256", IX86_BUILTIN_MULPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
22070   { OPTION_MASK_ISA_AVX, CODE_FOR_mulv8sf3, "__builtin_ia32_mulps256", IX86_BUILTIN_MULPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
22071   { OPTION_MASK_ISA_AVX, CODE_FOR_iorv4df3, "__builtin_ia32_orpd256", IX86_BUILTIN_ORPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
22072   { OPTION_MASK_ISA_AVX, CODE_FOR_iorv8sf3, "__builtin_ia32_orps256", IX86_BUILTIN_ORPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
22073   { OPTION_MASK_ISA_AVX, CODE_FOR_subv4df3, "__builtin_ia32_subpd256", IX86_BUILTIN_SUBPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
22074   { OPTION_MASK_ISA_AVX, CODE_FOR_subv8sf3, "__builtin_ia32_subps256", IX86_BUILTIN_SUBPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
22075   { OPTION_MASK_ISA_AVX, CODE_FOR_xorv4df3, "__builtin_ia32_xorpd256", IX86_BUILTIN_XORPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
22076   { OPTION_MASK_ISA_AVX, CODE_FOR_xorv8sf3, "__builtin_ia32_xorps256", IX86_BUILTIN_XORPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
22077
22078   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilvarv2df3, "__builtin_ia32_vpermilvarpd", IX86_BUILTIN_VPERMILVARPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DI },
22079   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilvarv4sf3, "__builtin_ia32_vpermilvarps", IX86_BUILTIN_VPERMILVARPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SI },
22080   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilvarv4df3, "__builtin_ia32_vpermilvarpd256", IX86_BUILTIN_VPERMILVARPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DI },
22081   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilvarv8sf3, "__builtin_ia32_vpermilvarps256", IX86_BUILTIN_VPERMILVARPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SI },
22082
22083   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_blendpd256, "__builtin_ia32_blendpd256", IX86_BUILTIN_BLENDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_INT },
22084   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_blendps256, "__builtin_ia32_blendps256", IX86_BUILTIN_BLENDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
22085   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_blendvpd256, "__builtin_ia32_blendvpd256", IX86_BUILTIN_BLENDVPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_V4DF },
22086   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_blendvps256, "__builtin_ia32_blendvps256", IX86_BUILTIN_BLENDVPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_V8SF },
22087   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_dpps256, "__builtin_ia32_dpps256", IX86_BUILTIN_DPPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
22088   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_shufpd256, "__builtin_ia32_shufpd256", IX86_BUILTIN_SHUFPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_INT },
22089   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_shufps256, "__builtin_ia32_shufps256", IX86_BUILTIN_SHUFPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
22090   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmpsdv2df3, "__builtin_ia32_cmpsd", IX86_BUILTIN_CMPSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
22091   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmpssv4sf3, "__builtin_ia32_cmpss", IX86_BUILTIN_CMPSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
22092   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmppdv2df3, "__builtin_ia32_cmppd", IX86_BUILTIN_CMPPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
22093   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmppsv4sf3, "__builtin_ia32_cmpps", IX86_BUILTIN_CMPPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
22094   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmppdv4df3, "__builtin_ia32_cmppd256", IX86_BUILTIN_CMPPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_INT },
22095   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmppsv8sf3, "__builtin_ia32_cmpps256", IX86_BUILTIN_CMPPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
22096   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vextractf128v4df, "__builtin_ia32_vextractf128_pd256", IX86_BUILTIN_EXTRACTF128PD256, UNKNOWN, (int) V2DF_FTYPE_V4DF_INT },
22097   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vextractf128v8sf, "__builtin_ia32_vextractf128_ps256", IX86_BUILTIN_EXTRACTF128PS256, UNKNOWN, (int) V4SF_FTYPE_V8SF_INT },
22098   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vextractf128v8si, "__builtin_ia32_vextractf128_si256", IX86_BUILTIN_EXTRACTF128SI256, UNKNOWN, (int) V4SI_FTYPE_V8SI_INT },
22099   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtdq2pd256, "__builtin_ia32_cvtdq2pd256", IX86_BUILTIN_CVTDQ2PD256, UNKNOWN, (int) V4DF_FTYPE_V4SI },
22100   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtdq2ps256, "__builtin_ia32_cvtdq2ps256", IX86_BUILTIN_CVTDQ2PS256, UNKNOWN, (int) V8SF_FTYPE_V8SI },
22101   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtpd2ps256, "__builtin_ia32_cvtpd2ps256", IX86_BUILTIN_CVTPD2PS256, UNKNOWN, (int) V4SF_FTYPE_V4DF },
22102   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtps2dq256, "__builtin_ia32_cvtps2dq256", IX86_BUILTIN_CVTPS2DQ256, UNKNOWN, (int) V8SI_FTYPE_V8SF },
22103   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtps2pd256, "__builtin_ia32_cvtps2pd256", IX86_BUILTIN_CVTPS2PD256, UNKNOWN, (int) V4DF_FTYPE_V4SF },
22104   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvttpd2dq256, "__builtin_ia32_cvttpd2dq256", IX86_BUILTIN_CVTTPD2DQ256, UNKNOWN, (int) V4SI_FTYPE_V4DF },
22105   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtpd2dq256, "__builtin_ia32_cvtpd2dq256", IX86_BUILTIN_CVTPD2DQ256, UNKNOWN, (int) V4SI_FTYPE_V4DF },
22106   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvttps2dq256, "__builtin_ia32_cvttps2dq256", IX86_BUILTIN_CVTTPS2DQ256, UNKNOWN, (int) V8SI_FTYPE_V8SF },
22107   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vperm2f128v4df3, "__builtin_ia32_vperm2f128_pd256", IX86_BUILTIN_VPERM2F128PD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_INT },
22108   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vperm2f128v8sf3, "__builtin_ia32_vperm2f128_ps256", IX86_BUILTIN_VPERM2F128PS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
22109   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vperm2f128v8si3, "__builtin_ia32_vperm2f128_si256", IX86_BUILTIN_VPERM2F128SI256, UNKNOWN, (int) V8SI_FTYPE_V8SI_V8SI_INT },
22110   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilv2df, "__builtin_ia32_vpermilpd", IX86_BUILTIN_VPERMILPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_INT },
22111   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilv4sf, "__builtin_ia32_vpermilps", IX86_BUILTIN_VPERMILPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_INT },
22112   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilv4df, "__builtin_ia32_vpermilpd256", IX86_BUILTIN_VPERMILPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_INT },
22113   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilv8sf, "__builtin_ia32_vpermilps256", IX86_BUILTIN_VPERMILPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_INT },
22114   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vinsertf128v4df, "__builtin_ia32_vinsertf128_pd256", IX86_BUILTIN_VINSERTF128PD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V2DF_INT },
22115   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vinsertf128v8sf, "__builtin_ia32_vinsertf128_ps256", IX86_BUILTIN_VINSERTF128PS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V4SF_INT },
22116   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vinsertf128v8si, "__builtin_ia32_vinsertf128_si256", IX86_BUILTIN_VINSERTF128SI256, UNKNOWN, (int) V8SI_FTYPE_V8SI_V4SI_INT },
22117
22118   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movshdup256, "__builtin_ia32_movshdup256", IX86_BUILTIN_MOVSHDUP256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
22119   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movsldup256, "__builtin_ia32_movsldup256", IX86_BUILTIN_MOVSLDUP256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
22120   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movddup256, "__builtin_ia32_movddup256", IX86_BUILTIN_MOVDDUP256, UNKNOWN, (int) V4DF_FTYPE_V4DF },
22121
22122   { OPTION_MASK_ISA_AVX, CODE_FOR_sqrtv4df2, "__builtin_ia32_sqrtpd256", IX86_BUILTIN_SQRTPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF },
22123   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_sqrtv8sf2, "__builtin_ia32_sqrtps256", IX86_BUILTIN_SQRTPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
22124   { OPTION_MASK_ISA_AVX, CODE_FOR_sqrtv8sf2, "__builtin_ia32_sqrtps_nr256", IX86_BUILTIN_SQRTPS_NR256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
22125   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_rsqrtv8sf2, "__builtin_ia32_rsqrtps256", IX86_BUILTIN_RSQRTPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
22126   { OPTION_MASK_ISA_AVX, CODE_FOR_rsqrtv8sf2, "__builtin_ia32_rsqrtps_nr256", IX86_BUILTIN_RSQRTPS_NR256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
22127
22128   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_rcpv8sf2, "__builtin_ia32_rcpps256", IX86_BUILTIN_RCPPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
22129
22130   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_roundpd256, "__builtin_ia32_roundpd256", IX86_BUILTIN_ROUNDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_INT },
22131   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_roundps256, "__builtin_ia32_roundps256", IX86_BUILTIN_ROUNDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_INT },
22132
22133   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_unpckhpd256,  "__builtin_ia32_unpckhpd256", IX86_BUILTIN_UNPCKHPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
22134   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_unpcklpd256,  "__builtin_ia32_unpcklpd256", IX86_BUILTIN_UNPCKLPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
22135   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_unpckhps256,  "__builtin_ia32_unpckhps256", IX86_BUILTIN_UNPCKHPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
22136   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_unpcklps256,  "__builtin_ia32_unpcklps256", IX86_BUILTIN_UNPCKLPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
22137
22138   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_si256_si, "__builtin_ia32_si256_si", IX86_BUILTIN_SI256_SI, UNKNOWN, (int) V8SI_FTYPE_V4SI },
22139   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_ps256_ps, "__builtin_ia32_ps256_ps", IX86_BUILTIN_PS256_PS, UNKNOWN, (int) V8SF_FTYPE_V4SF },
22140   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_pd256_pd, "__builtin_ia32_pd256_pd", IX86_BUILTIN_PD256_PD, UNKNOWN, (int) V4DF_FTYPE_V2DF },
22141   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_si_si256, "__builtin_ia32_si_si256", IX86_BUILTIN_SI_SI256, UNKNOWN, (int) V4SI_FTYPE_V8SI },
22142   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_ps_ps256, "__builtin_ia32_ps_ps256", IX86_BUILTIN_PS_PS256, UNKNOWN, (int) V4SF_FTYPE_V8SF },
22143   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_pd_pd256, "__builtin_ia32_pd_pd256", IX86_BUILTIN_PD_PD256, UNKNOWN, (int) V2DF_FTYPE_V4DF },
22144
22145   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd, "__builtin_ia32_vtestzpd", IX86_BUILTIN_VTESTZPD, EQ, (int) INT_FTYPE_V2DF_V2DF_PTEST },
22146   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd, "__builtin_ia32_vtestcpd", IX86_BUILTIN_VTESTCPD, LTU, (int) INT_FTYPE_V2DF_V2DF_PTEST },
22147   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd, "__builtin_ia32_vtestnzcpd", IX86_BUILTIN_VTESTNZCPD, GTU, (int) INT_FTYPE_V2DF_V2DF_PTEST },
22148   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps, "__builtin_ia32_vtestzps", IX86_BUILTIN_VTESTZPS, EQ, (int) INT_FTYPE_V4SF_V4SF_PTEST },
22149   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps, "__builtin_ia32_vtestcps", IX86_BUILTIN_VTESTCPS, LTU, (int) INT_FTYPE_V4SF_V4SF_PTEST },
22150   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps, "__builtin_ia32_vtestnzcps", IX86_BUILTIN_VTESTNZCPS, GTU, (int) INT_FTYPE_V4SF_V4SF_PTEST },
22151   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd256, "__builtin_ia32_vtestzpd256", IX86_BUILTIN_VTESTZPD256, EQ, (int) INT_FTYPE_V4DF_V4DF_PTEST },
22152   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd256, "__builtin_ia32_vtestcpd256", IX86_BUILTIN_VTESTCPD256, LTU, (int) INT_FTYPE_V4DF_V4DF_PTEST },
22153   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd256, "__builtin_ia32_vtestnzcpd256", IX86_BUILTIN_VTESTNZCPD256, GTU, (int) INT_FTYPE_V4DF_V4DF_PTEST },
22154   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps256, "__builtin_ia32_vtestzps256", IX86_BUILTIN_VTESTZPS256, EQ, (int) INT_FTYPE_V8SF_V8SF_PTEST },
22155   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps256, "__builtin_ia32_vtestcps256", IX86_BUILTIN_VTESTCPS256, LTU, (int) INT_FTYPE_V8SF_V8SF_PTEST },
22156   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps256, "__builtin_ia32_vtestnzcps256", IX86_BUILTIN_VTESTNZCPS256, GTU, (int) INT_FTYPE_V8SF_V8SF_PTEST },
22157   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_ptest256, "__builtin_ia32_ptestz256", IX86_BUILTIN_PTESTZ256, EQ, (int) INT_FTYPE_V4DI_V4DI_PTEST },
22158   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_ptest256, "__builtin_ia32_ptestc256", IX86_BUILTIN_PTESTC256, LTU, (int) INT_FTYPE_V4DI_V4DI_PTEST },
22159   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_ptest256, "__builtin_ia32_ptestnzc256", IX86_BUILTIN_PTESTNZC256, GTU, (int) INT_FTYPE_V4DI_V4DI_PTEST },
22160
22161   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movmskpd256, "__builtin_ia32_movmskpd256", IX86_BUILTIN_MOVMSKPD256, UNKNOWN, (int) INT_FTYPE_V4DF  },
22162   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movmskps256, "__builtin_ia32_movmskps256", IX86_BUILTIN_MOVMSKPS256, UNKNOWN, (int) INT_FTYPE_V8SF },
22163
22164   { OPTION_MASK_ISA_ABM, CODE_FOR_clzhi2_abm,   "__builtin_clzs",   IX86_BUILTIN_CLZS,    UNKNOWN,     (int) UINT16_FTYPE_UINT16 },
22165 };
22166
22167 /* FMA4 and XOP.  */
22168 #define MULTI_ARG_3_SF          V4SF_FTYPE_V4SF_V4SF_V4SF
22169 #define MULTI_ARG_3_DF          V2DF_FTYPE_V2DF_V2DF_V2DF
22170 #define MULTI_ARG_3_SF2         V8SF_FTYPE_V8SF_V8SF_V8SF
22171 #define MULTI_ARG_3_DF2         V4DF_FTYPE_V4DF_V4DF_V4DF
22172 #define MULTI_ARG_3_DI          V2DI_FTYPE_V2DI_V2DI_V2DI
22173 #define MULTI_ARG_3_SI          V4SI_FTYPE_V4SI_V4SI_V4SI
22174 #define MULTI_ARG_3_SI_DI       V4SI_FTYPE_V4SI_V4SI_V2DI
22175 #define MULTI_ARG_3_HI          V8HI_FTYPE_V8HI_V8HI_V8HI
22176 #define MULTI_ARG_3_HI_SI       V8HI_FTYPE_V8HI_V8HI_V4SI
22177 #define MULTI_ARG_3_QI          V16QI_FTYPE_V16QI_V16QI_V16QI
22178 #define MULTI_ARG_3_DI2         V4DI_FTYPE_V4DI_V4DI_V4DI
22179 #define MULTI_ARG_3_SI2         V8SI_FTYPE_V8SI_V8SI_V8SI
22180 #define MULTI_ARG_3_HI2         V16HI_FTYPE_V16HI_V16HI_V16HI
22181 #define MULTI_ARG_3_QI2         V32QI_FTYPE_V32QI_V32QI_V32QI
22182 #define MULTI_ARG_2_SF          V4SF_FTYPE_V4SF_V4SF
22183 #define MULTI_ARG_2_DF          V2DF_FTYPE_V2DF_V2DF
22184 #define MULTI_ARG_2_DI          V2DI_FTYPE_V2DI_V2DI
22185 #define MULTI_ARG_2_SI          V4SI_FTYPE_V4SI_V4SI
22186 #define MULTI_ARG_2_HI          V8HI_FTYPE_V8HI_V8HI
22187 #define MULTI_ARG_2_QI          V16QI_FTYPE_V16QI_V16QI
22188 #define MULTI_ARG_2_DI_IMM      V2DI_FTYPE_V2DI_SI
22189 #define MULTI_ARG_2_SI_IMM      V4SI_FTYPE_V4SI_SI
22190 #define MULTI_ARG_2_HI_IMM      V8HI_FTYPE_V8HI_SI
22191 #define MULTI_ARG_2_QI_IMM      V16QI_FTYPE_V16QI_SI
22192 #define MULTI_ARG_2_DI_CMP      V2DI_FTYPE_V2DI_V2DI_CMP
22193 #define MULTI_ARG_2_SI_CMP      V4SI_FTYPE_V4SI_V4SI_CMP
22194 #define MULTI_ARG_2_HI_CMP      V8HI_FTYPE_V8HI_V8HI_CMP
22195 #define MULTI_ARG_2_QI_CMP      V16QI_FTYPE_V16QI_V16QI_CMP
22196 #define MULTI_ARG_2_SF_TF       V4SF_FTYPE_V4SF_V4SF_TF
22197 #define MULTI_ARG_2_DF_TF       V2DF_FTYPE_V2DF_V2DF_TF
22198 #define MULTI_ARG_2_DI_TF       V2DI_FTYPE_V2DI_V2DI_TF
22199 #define MULTI_ARG_2_SI_TF       V4SI_FTYPE_V4SI_V4SI_TF
22200 #define MULTI_ARG_2_HI_TF       V8HI_FTYPE_V8HI_V8HI_TF
22201 #define MULTI_ARG_2_QI_TF       V16QI_FTYPE_V16QI_V16QI_TF
22202 #define MULTI_ARG_1_SF          V4SF_FTYPE_V4SF
22203 #define MULTI_ARG_1_DF          V2DF_FTYPE_V2DF
22204 #define MULTI_ARG_1_SF2         V8SF_FTYPE_V8SF
22205 #define MULTI_ARG_1_DF2         V4DF_FTYPE_V4DF
22206 #define MULTI_ARG_1_DI          V2DI_FTYPE_V2DI
22207 #define MULTI_ARG_1_SI          V4SI_FTYPE_V4SI
22208 #define MULTI_ARG_1_HI          V8HI_FTYPE_V8HI
22209 #define MULTI_ARG_1_QI          V16QI_FTYPE_V16QI
22210 #define MULTI_ARG_1_SI_DI       V2DI_FTYPE_V4SI
22211 #define MULTI_ARG_1_HI_DI       V2DI_FTYPE_V8HI
22212 #define MULTI_ARG_1_HI_SI       V4SI_FTYPE_V8HI
22213 #define MULTI_ARG_1_QI_DI       V2DI_FTYPE_V16QI
22214 #define MULTI_ARG_1_QI_SI       V4SI_FTYPE_V16QI
22215 #define MULTI_ARG_1_QI_HI       V8HI_FTYPE_V16QI
22216
22217 static const struct builtin_description bdesc_multi_arg[] =
22218 {
22219   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_vmfmaddv4sf4,     "__builtin_ia32_vfmaddss",    IX86_BUILTIN_VFMADDSS,    UNKNOWN,      (int)MULTI_ARG_3_SF },
22220   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_vmfmaddv2df4,     "__builtin_ia32_vfmaddsd",    IX86_BUILTIN_VFMADDSD,    UNKNOWN,      (int)MULTI_ARG_3_DF },
22221   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fmaddv4sf4,       "__builtin_ia32_vfmaddps",    IX86_BUILTIN_VFMADDPS,    UNKNOWN,      (int)MULTI_ARG_3_SF },
22222   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fmaddv2df4,       "__builtin_ia32_vfmaddpd",    IX86_BUILTIN_VFMADDPD,    UNKNOWN,      (int)MULTI_ARG_3_DF },
22223   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_vmfmsubv4sf4,     "__builtin_ia32_vfmsubss",    IX86_BUILTIN_VFMSUBSS,    UNKNOWN,      (int)MULTI_ARG_3_SF },
22224   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_vmfmsubv2df4,     "__builtin_ia32_vfmsubsd",    IX86_BUILTIN_VFMSUBSD,    UNKNOWN,      (int)MULTI_ARG_3_DF },
22225   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fmsubv4sf4,       "__builtin_ia32_vfmsubps",    IX86_BUILTIN_VFMSUBPS,    UNKNOWN,      (int)MULTI_ARG_3_SF },
22226   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fmsubv2df4,       "__builtin_ia32_vfmsubpd",    IX86_BUILTIN_VFMSUBPD,    UNKNOWN,      (int)MULTI_ARG_3_DF },
22227     
22228   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_vmfnmaddv4sf4,    "__builtin_ia32_vfnmaddss",   IX86_BUILTIN_VFNMADDSS,   UNKNOWN,      (int)MULTI_ARG_3_SF },
22229   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_vmfnmaddv2df4,    "__builtin_ia32_vfnmaddsd",   IX86_BUILTIN_VFNMADDSD,   UNKNOWN,      (int)MULTI_ARG_3_DF },
22230   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fnmaddv4sf4,      "__builtin_ia32_vfnmaddps",   IX86_BUILTIN_VFNMADDPS,   UNKNOWN,      (int)MULTI_ARG_3_SF },
22231   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fnmaddv2df4,      "__builtin_ia32_vfnmaddpd",   IX86_BUILTIN_VFNMADDPD,   UNKNOWN,      (int)MULTI_ARG_3_DF },
22232   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_vmfnmsubv4sf4,    "__builtin_ia32_vfnmsubss",   IX86_BUILTIN_VFNMSUBSS,   UNKNOWN,      (int)MULTI_ARG_3_SF },
22233   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_vmfnmsubv2df4,    "__builtin_ia32_vfnmsubsd",   IX86_BUILTIN_VFNMSUBSD,   UNKNOWN,      (int)MULTI_ARG_3_DF },
22234   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fnmsubv4sf4,      "__builtin_ia32_vfnmsubps",   IX86_BUILTIN_VFNMSUBPS,   UNKNOWN,      (int)MULTI_ARG_3_SF },
22235   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fnmsubv2df4,      "__builtin_ia32_vfnmsubpd",   IX86_BUILTIN_VFNMSUBPD,   UNKNOWN,      (int)MULTI_ARG_3_DF },
22236
22237   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fmaddsubv4sf4,    "__builtin_ia32_vfmaddsubps", IX86_BUILTIN_VFMADDSUBPS,    UNKNOWN,      (int)MULTI_ARG_3_SF },
22238   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fmaddsubv2df4,    "__builtin_ia32_vfmaddsubpd", IX86_BUILTIN_VFMADDSUBPD,    UNKNOWN,      (int)MULTI_ARG_3_DF },
22239   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fmsubaddv4sf4,    "__builtin_ia32_vfmsubaddps", IX86_BUILTIN_VFMSUBADDPS,    UNKNOWN,      (int)MULTI_ARG_3_SF },
22240   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fmsubaddv2df4,    "__builtin_ia32_vfmsubaddpd", IX86_BUILTIN_VFMSUBADDPD,    UNKNOWN,      (int)MULTI_ARG_3_DF },
22241
22242   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fmaddv8sf4256,       "__builtin_ia32_vfmaddps256",    IX86_BUILTIN_VFMADDPS256,    UNKNOWN,      (int)MULTI_ARG_3_SF2 },
22243   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fmaddv4df4256,       "__builtin_ia32_vfmaddpd256",    IX86_BUILTIN_VFMADDPD256,    UNKNOWN,      (int)MULTI_ARG_3_DF2 },
22244   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fmsubv8sf4256,       "__builtin_ia32_vfmsubps256",    IX86_BUILTIN_VFMSUBPS256,    UNKNOWN,      (int)MULTI_ARG_3_SF2 },
22245   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fmsubv4df4256,       "__builtin_ia32_vfmsubpd256",    IX86_BUILTIN_VFMSUBPD256,    UNKNOWN,      (int)MULTI_ARG_3_DF2 },
22246   
22247   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fnmaddv8sf4256,      "__builtin_ia32_vfnmaddps256",   IX86_BUILTIN_VFNMADDPS256,   UNKNOWN,      (int)MULTI_ARG_3_SF2 },
22248   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fnmaddv4df4256,      "__builtin_ia32_vfnmaddpd256",   IX86_BUILTIN_VFNMADDPD256,   UNKNOWN,      (int)MULTI_ARG_3_DF2 },
22249   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fnmsubv8sf4256,      "__builtin_ia32_vfnmsubps256",   IX86_BUILTIN_VFNMSUBPS256,   UNKNOWN,      (int)MULTI_ARG_3_SF2 },
22250   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fnmsubv4df4256,      "__builtin_ia32_vfnmsubpd256",   IX86_BUILTIN_VFNMSUBPD256,   UNKNOWN,      (int)MULTI_ARG_3_DF2 },
22251
22252   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fmaddsubv8sf4,    "__builtin_ia32_vfmaddsubps256", IX86_BUILTIN_VFMADDSUBPS256,    UNKNOWN,      (int)MULTI_ARG_3_SF2 },
22253   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fmaddsubv4df4,    "__builtin_ia32_vfmaddsubpd256", IX86_BUILTIN_VFMADDSUBPD256,    UNKNOWN,      (int)MULTI_ARG_3_DF2 },
22254   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fmsubaddv8sf4,    "__builtin_ia32_vfmsubaddps256", IX86_BUILTIN_VFMSUBADDPS256,    UNKNOWN,      (int)MULTI_ARG_3_SF2 },
22255   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fmsubaddv4df4,    "__builtin_ia32_vfmsubaddpd256", IX86_BUILTIN_VFMSUBADDPD256,    UNKNOWN,      (int)MULTI_ARG_3_DF2 },
22256
22257   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v2di,        "__builtin_ia32_vpcmov",      IX86_BUILTIN_VPCMOV,      UNKNOWN,      (int)MULTI_ARG_3_DI },
22258   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v2di,        "__builtin_ia32_vpcmov_v2di", IX86_BUILTIN_VPCMOV_V2DI, UNKNOWN,      (int)MULTI_ARG_3_DI },
22259   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v4si,        "__builtin_ia32_vpcmov_v4si", IX86_BUILTIN_VPCMOV_V4SI, UNKNOWN,      (int)MULTI_ARG_3_SI },
22260   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v8hi,        "__builtin_ia32_vpcmov_v8hi", IX86_BUILTIN_VPCMOV_V8HI, UNKNOWN,      (int)MULTI_ARG_3_HI },
22261   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v16qi,       "__builtin_ia32_vpcmov_v16qi",IX86_BUILTIN_VPCMOV_V16QI,UNKNOWN,      (int)MULTI_ARG_3_QI },
22262   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v2df,        "__builtin_ia32_vpcmov_v2df", IX86_BUILTIN_VPCMOV_V2DF, UNKNOWN,      (int)MULTI_ARG_3_DF },
22263   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v4sf,        "__builtin_ia32_vpcmov_v4sf", IX86_BUILTIN_VPCMOV_V4SF, UNKNOWN,      (int)MULTI_ARG_3_SF },
22264
22265   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v4di256,        "__builtin_ia32_vpcmov256",       IX86_BUILTIN_VPCMOV256,       UNKNOWN,      (int)MULTI_ARG_3_DI2 },
22266   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v4di256,        "__builtin_ia32_vpcmov_v4di256",  IX86_BUILTIN_VPCMOV_V4DI256,  UNKNOWN,      (int)MULTI_ARG_3_DI2 },
22267   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v8si256,        "__builtin_ia32_vpcmov_v8si256",  IX86_BUILTIN_VPCMOV_V8SI256,  UNKNOWN,      (int)MULTI_ARG_3_SI2 },
22268   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v16hi256,       "__builtin_ia32_vpcmov_v16hi256", IX86_BUILTIN_VPCMOV_V16HI256, UNKNOWN,      (int)MULTI_ARG_3_HI2 },
22269   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v32qi256,       "__builtin_ia32_vpcmov_v32qi256", IX86_BUILTIN_VPCMOV_V32QI256, UNKNOWN,      (int)MULTI_ARG_3_QI2 },
22270   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v4df256,        "__builtin_ia32_vpcmov_v4df256",  IX86_BUILTIN_VPCMOV_V4DF256,  UNKNOWN,      (int)MULTI_ARG_3_DF2 },
22271   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v8sf256,        "__builtin_ia32_vpcmov_v8sf256",  IX86_BUILTIN_VPCMOV_V8SF256,  UNKNOWN,      (int)MULTI_ARG_3_SF2 },
22272
22273   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pperm,             "__builtin_ia32_vpperm",      IX86_BUILTIN_VPPERM,      UNKNOWN,      (int)MULTI_ARG_3_QI },
22274
22275   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacssww,          "__builtin_ia32_vpmacssww",   IX86_BUILTIN_VPMACSSWW,   UNKNOWN,      (int)MULTI_ARG_3_HI },
22276   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacsww,           "__builtin_ia32_vpmacsww",    IX86_BUILTIN_VPMACSWW,    UNKNOWN,      (int)MULTI_ARG_3_HI },
22277   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacsswd,          "__builtin_ia32_vpmacsswd",   IX86_BUILTIN_VPMACSSWD,   UNKNOWN,      (int)MULTI_ARG_3_HI_SI },
22278   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacswd,           "__builtin_ia32_vpmacswd",    IX86_BUILTIN_VPMACSWD,    UNKNOWN,      (int)MULTI_ARG_3_HI_SI },
22279   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacssdd,          "__builtin_ia32_vpmacssdd",   IX86_BUILTIN_VPMACSSDD,   UNKNOWN,      (int)MULTI_ARG_3_SI },
22280   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacsdd,           "__builtin_ia32_vpmacsdd",    IX86_BUILTIN_VPMACSDD,    UNKNOWN,      (int)MULTI_ARG_3_SI },
22281   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacssdql,         "__builtin_ia32_vpmacssdql",  IX86_BUILTIN_VPMACSSDQL,  UNKNOWN,      (int)MULTI_ARG_3_SI_DI },
22282   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacssdqh,         "__builtin_ia32_vpmacssdqh",  IX86_BUILTIN_VPMACSSDQH,  UNKNOWN,      (int)MULTI_ARG_3_SI_DI },
22283   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacsdql,          "__builtin_ia32_vpmacsdql",   IX86_BUILTIN_VPMACSDQL,   UNKNOWN,      (int)MULTI_ARG_3_SI_DI },
22284   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacsdqh,          "__builtin_ia32_vpmacsdqh",   IX86_BUILTIN_VPMACSDQH,   UNKNOWN,      (int)MULTI_ARG_3_SI_DI },
22285   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmadcsswd,         "__builtin_ia32_vpmadcsswd",  IX86_BUILTIN_VPMADCSSWD,  UNKNOWN,      (int)MULTI_ARG_3_HI_SI },
22286   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmadcswd,          "__builtin_ia32_vpmadcswd",   IX86_BUILTIN_VPMADCSWD,   UNKNOWN,      (int)MULTI_ARG_3_HI_SI },
22287
22288   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_vrotlv2di3,        "__builtin_ia32_vprotq",      IX86_BUILTIN_VPROTQ,      UNKNOWN,      (int)MULTI_ARG_2_DI },
22289   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_vrotlv4si3,        "__builtin_ia32_vprotd",      IX86_BUILTIN_VPROTD,      UNKNOWN,      (int)MULTI_ARG_2_SI },
22290   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_vrotlv8hi3,        "__builtin_ia32_vprotw",      IX86_BUILTIN_VPROTW,      UNKNOWN,      (int)MULTI_ARG_2_HI },
22291   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_vrotlv16qi3,       "__builtin_ia32_vprotb",      IX86_BUILTIN_VPROTB,      UNKNOWN,      (int)MULTI_ARG_2_QI },
22292   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_rotlv2di3,         "__builtin_ia32_vprotqi",     IX86_BUILTIN_VPROTQ_IMM,  UNKNOWN,      (int)MULTI_ARG_2_DI_IMM },
22293   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_rotlv4si3,         "__builtin_ia32_vprotdi",     IX86_BUILTIN_VPROTD_IMM,  UNKNOWN,      (int)MULTI_ARG_2_SI_IMM },
22294   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_rotlv8hi3,         "__builtin_ia32_vprotwi",     IX86_BUILTIN_VPROTW_IMM,  UNKNOWN,      (int)MULTI_ARG_2_HI_IMM },
22295   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_rotlv16qi3,        "__builtin_ia32_vprotbi",     IX86_BUILTIN_VPROTB_IMM,  UNKNOWN,      (int)MULTI_ARG_2_QI_IMM },
22296   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_ashlv2di3,         "__builtin_ia32_vpshaq",      IX86_BUILTIN_VPSHAQ,      UNKNOWN,      (int)MULTI_ARG_2_DI },
22297   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_ashlv4si3,         "__builtin_ia32_vpshad",      IX86_BUILTIN_VPSHAD,      UNKNOWN,      (int)MULTI_ARG_2_SI },
22298   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_ashlv8hi3,         "__builtin_ia32_vpshaw",      IX86_BUILTIN_VPSHAW,      UNKNOWN,      (int)MULTI_ARG_2_HI },
22299   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_ashlv16qi3,        "__builtin_ia32_vpshab",      IX86_BUILTIN_VPSHAB,      UNKNOWN,      (int)MULTI_ARG_2_QI },
22300   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_lshlv2di3,         "__builtin_ia32_vpshlq",      IX86_BUILTIN_VPSHLQ,      UNKNOWN,      (int)MULTI_ARG_2_DI },
22301   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_lshlv4si3,         "__builtin_ia32_vpshld",      IX86_BUILTIN_VPSHLD,      UNKNOWN,      (int)MULTI_ARG_2_SI },
22302   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_lshlv8hi3,         "__builtin_ia32_vpshlw",      IX86_BUILTIN_VPSHLW,      UNKNOWN,      (int)MULTI_ARG_2_HI },
22303   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_lshlv16qi3,        "__builtin_ia32_vpshlb",      IX86_BUILTIN_VPSHLB,      UNKNOWN,      (int)MULTI_ARG_2_QI },
22304
22305   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_vmfrczv4sf2,       "__builtin_ia32_vfrczss",     IX86_BUILTIN_VFRCZSS,     UNKNOWN,      (int)MULTI_ARG_2_SF },
22306   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_vmfrczv2df2,       "__builtin_ia32_vfrczsd",     IX86_BUILTIN_VFRCZSD,     UNKNOWN,      (int)MULTI_ARG_2_DF },
22307   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_frczv4sf2,         "__builtin_ia32_vfrczps",     IX86_BUILTIN_VFRCZPS,     UNKNOWN,      (int)MULTI_ARG_1_SF },
22308   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_frczv2df2,         "__builtin_ia32_vfrczpd",     IX86_BUILTIN_VFRCZPD,     UNKNOWN,      (int)MULTI_ARG_1_DF },
22309   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_frczv8sf2256,         "__builtin_ia32_vfrczps256",  IX86_BUILTIN_VFRCZPS256,  UNKNOWN,      (int)MULTI_ARG_1_SF2 },
22310   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_frczv4df2256,         "__builtin_ia32_vfrczpd256",  IX86_BUILTIN_VFRCZPD256,  UNKNOWN,      (int)MULTI_ARG_1_DF2 },
22311
22312   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddbw,           "__builtin_ia32_vphaddbw",    IX86_BUILTIN_VPHADDBW,    UNKNOWN,      (int)MULTI_ARG_1_QI_HI },
22313   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddbd,           "__builtin_ia32_vphaddbd",    IX86_BUILTIN_VPHADDBD,    UNKNOWN,      (int)MULTI_ARG_1_QI_SI },
22314   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddbq,           "__builtin_ia32_vphaddbq",    IX86_BUILTIN_VPHADDBQ,    UNKNOWN,      (int)MULTI_ARG_1_QI_DI },
22315   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddwd,           "__builtin_ia32_vphaddwd",    IX86_BUILTIN_VPHADDWD,    UNKNOWN,      (int)MULTI_ARG_1_HI_SI },
22316   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddwq,           "__builtin_ia32_vphaddwq",    IX86_BUILTIN_VPHADDWQ,    UNKNOWN,      (int)MULTI_ARG_1_HI_DI },
22317   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phadddq,           "__builtin_ia32_vphadddq",    IX86_BUILTIN_VPHADDDQ,    UNKNOWN,      (int)MULTI_ARG_1_SI_DI },
22318   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddubw,          "__builtin_ia32_vphaddubw",   IX86_BUILTIN_VPHADDUBW,   UNKNOWN,      (int)MULTI_ARG_1_QI_HI },
22319   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddubd,          "__builtin_ia32_vphaddubd",   IX86_BUILTIN_VPHADDUBD,   UNKNOWN,      (int)MULTI_ARG_1_QI_SI },
22320   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddubq,          "__builtin_ia32_vphaddubq",   IX86_BUILTIN_VPHADDUBQ,   UNKNOWN,      (int)MULTI_ARG_1_QI_DI },
22321   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phadduwd,          "__builtin_ia32_vphadduwd",   IX86_BUILTIN_VPHADDUWD,   UNKNOWN,      (int)MULTI_ARG_1_HI_SI },
22322   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phadduwq,          "__builtin_ia32_vphadduwq",   IX86_BUILTIN_VPHADDUWQ,   UNKNOWN,      (int)MULTI_ARG_1_HI_DI },
22323   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddudq,          "__builtin_ia32_vphaddudq",   IX86_BUILTIN_VPHADDUDQ,   UNKNOWN,      (int)MULTI_ARG_1_SI_DI },
22324   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phsubbw,           "__builtin_ia32_vphsubbw",    IX86_BUILTIN_VPHSUBBW,    UNKNOWN,      (int)MULTI_ARG_1_QI_HI },
22325   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phsubwd,           "__builtin_ia32_vphsubwd",    IX86_BUILTIN_VPHSUBWD,    UNKNOWN,      (int)MULTI_ARG_1_HI_SI },
22326   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phsubdq,           "__builtin_ia32_vphsubdq",    IX86_BUILTIN_VPHSUBDQ,    UNKNOWN,      (int)MULTI_ARG_1_SI_DI },
22327
22328   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv16qi3,     "__builtin_ia32_vpcomeqb",    IX86_BUILTIN_VPCOMEQB,    EQ,           (int)MULTI_ARG_2_QI_CMP },
22329   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv16qi3,     "__builtin_ia32_vpcomneb",    IX86_BUILTIN_VPCOMNEB,    NE,           (int)MULTI_ARG_2_QI_CMP },
22330   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv16qi3,     "__builtin_ia32_vpcomneqb",   IX86_BUILTIN_VPCOMNEB,    NE,           (int)MULTI_ARG_2_QI_CMP },
22331   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv16qi3,     "__builtin_ia32_vpcomltb",    IX86_BUILTIN_VPCOMLTB,    LT,           (int)MULTI_ARG_2_QI_CMP },
22332   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv16qi3,     "__builtin_ia32_vpcomleb",    IX86_BUILTIN_VPCOMLEB,    LE,           (int)MULTI_ARG_2_QI_CMP },
22333   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv16qi3,     "__builtin_ia32_vpcomgtb",    IX86_BUILTIN_VPCOMGTB,    GT,           (int)MULTI_ARG_2_QI_CMP },
22334   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv16qi3,     "__builtin_ia32_vpcomgeb",    IX86_BUILTIN_VPCOMGEB,    GE,           (int)MULTI_ARG_2_QI_CMP },
22335
22336   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv8hi3,      "__builtin_ia32_vpcomeqw",    IX86_BUILTIN_VPCOMEQW,    EQ,           (int)MULTI_ARG_2_HI_CMP },
22337   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv8hi3,      "__builtin_ia32_vpcomnew",    IX86_BUILTIN_VPCOMNEW,    NE,           (int)MULTI_ARG_2_HI_CMP },
22338   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv8hi3,      "__builtin_ia32_vpcomneqw",   IX86_BUILTIN_VPCOMNEW,    NE,           (int)MULTI_ARG_2_HI_CMP },
22339   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv8hi3,      "__builtin_ia32_vpcomltw",    IX86_BUILTIN_VPCOMLTW,    LT,           (int)MULTI_ARG_2_HI_CMP },
22340   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv8hi3,      "__builtin_ia32_vpcomlew",    IX86_BUILTIN_VPCOMLEW,    LE,           (int)MULTI_ARG_2_HI_CMP },
22341   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv8hi3,      "__builtin_ia32_vpcomgtw",    IX86_BUILTIN_VPCOMGTW,    GT,           (int)MULTI_ARG_2_HI_CMP },
22342   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv8hi3,      "__builtin_ia32_vpcomgew",    IX86_BUILTIN_VPCOMGEW,    GE,           (int)MULTI_ARG_2_HI_CMP },
22343
22344   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv4si3,      "__builtin_ia32_vpcomeqd",    IX86_BUILTIN_VPCOMEQD,    EQ,           (int)MULTI_ARG_2_SI_CMP },
22345   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv4si3,      "__builtin_ia32_vpcomned",    IX86_BUILTIN_VPCOMNED,    NE,           (int)MULTI_ARG_2_SI_CMP },
22346   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv4si3,      "__builtin_ia32_vpcomneqd",   IX86_BUILTIN_VPCOMNED,    NE,           (int)MULTI_ARG_2_SI_CMP },
22347   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv4si3,      "__builtin_ia32_vpcomltd",    IX86_BUILTIN_VPCOMLTD,    LT,           (int)MULTI_ARG_2_SI_CMP },
22348   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv4si3,      "__builtin_ia32_vpcomled",    IX86_BUILTIN_VPCOMLED,    LE,           (int)MULTI_ARG_2_SI_CMP },
22349   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv4si3,      "__builtin_ia32_vpcomgtd",    IX86_BUILTIN_VPCOMGTD,    GT,           (int)MULTI_ARG_2_SI_CMP },
22350   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv4si3,      "__builtin_ia32_vpcomged",    IX86_BUILTIN_VPCOMGED,    GE,           (int)MULTI_ARG_2_SI_CMP },
22351
22352   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv2di3,      "__builtin_ia32_vpcomeqq",    IX86_BUILTIN_VPCOMEQQ,    EQ,           (int)MULTI_ARG_2_DI_CMP },
22353   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv2di3,      "__builtin_ia32_vpcomneq",    IX86_BUILTIN_VPCOMNEQ,    NE,           (int)MULTI_ARG_2_DI_CMP },
22354   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv2di3,      "__builtin_ia32_vpcomneqq",   IX86_BUILTIN_VPCOMNEQ,    NE,           (int)MULTI_ARG_2_DI_CMP },
22355   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv2di3,      "__builtin_ia32_vpcomltq",    IX86_BUILTIN_VPCOMLTQ,    LT,           (int)MULTI_ARG_2_DI_CMP },
22356   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv2di3,      "__builtin_ia32_vpcomleq",    IX86_BUILTIN_VPCOMLEQ,    LE,           (int)MULTI_ARG_2_DI_CMP },
22357   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv2di3,      "__builtin_ia32_vpcomgtq",    IX86_BUILTIN_VPCOMGTQ,    GT,           (int)MULTI_ARG_2_DI_CMP },
22358   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv2di3,      "__builtin_ia32_vpcomgeq",    IX86_BUILTIN_VPCOMGEQ,    GE,           (int)MULTI_ARG_2_DI_CMP },
22359
22360   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v16qi3,"__builtin_ia32_vpcomequb",   IX86_BUILTIN_VPCOMEQUB,   EQ,           (int)MULTI_ARG_2_QI_CMP },
22361   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v16qi3,"__builtin_ia32_vpcomneub",   IX86_BUILTIN_VPCOMNEUB,   NE,           (int)MULTI_ARG_2_QI_CMP },
22362   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v16qi3,"__builtin_ia32_vpcomnequb",  IX86_BUILTIN_VPCOMNEUB,   NE,           (int)MULTI_ARG_2_QI_CMP },
22363   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv16qi3, "__builtin_ia32_vpcomltub",   IX86_BUILTIN_VPCOMLTUB,   LTU,          (int)MULTI_ARG_2_QI_CMP },
22364   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv16qi3, "__builtin_ia32_vpcomleub",   IX86_BUILTIN_VPCOMLEUB,   LEU,          (int)MULTI_ARG_2_QI_CMP },
22365   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv16qi3, "__builtin_ia32_vpcomgtub",   IX86_BUILTIN_VPCOMGTUB,   GTU,          (int)MULTI_ARG_2_QI_CMP },
22366   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv16qi3, "__builtin_ia32_vpcomgeub",   IX86_BUILTIN_VPCOMGEUB,   GEU,          (int)MULTI_ARG_2_QI_CMP },
22367
22368   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v8hi3, "__builtin_ia32_vpcomequw",   IX86_BUILTIN_VPCOMEQUW,   EQ,           (int)MULTI_ARG_2_HI_CMP },
22369   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v8hi3, "__builtin_ia32_vpcomneuw",   IX86_BUILTIN_VPCOMNEUW,   NE,           (int)MULTI_ARG_2_HI_CMP },
22370   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v8hi3, "__builtin_ia32_vpcomnequw",  IX86_BUILTIN_VPCOMNEUW,   NE,           (int)MULTI_ARG_2_HI_CMP },
22371   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv8hi3,  "__builtin_ia32_vpcomltuw",   IX86_BUILTIN_VPCOMLTUW,   LTU,          (int)MULTI_ARG_2_HI_CMP },
22372   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv8hi3,  "__builtin_ia32_vpcomleuw",   IX86_BUILTIN_VPCOMLEUW,   LEU,          (int)MULTI_ARG_2_HI_CMP },
22373   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv8hi3,  "__builtin_ia32_vpcomgtuw",   IX86_BUILTIN_VPCOMGTUW,   GTU,          (int)MULTI_ARG_2_HI_CMP },
22374   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv8hi3,  "__builtin_ia32_vpcomgeuw",   IX86_BUILTIN_VPCOMGEUW,   GEU,          (int)MULTI_ARG_2_HI_CMP },
22375
22376   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v4si3, "__builtin_ia32_vpcomequd",   IX86_BUILTIN_VPCOMEQUD,   EQ,           (int)MULTI_ARG_2_SI_CMP },
22377   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v4si3, "__builtin_ia32_vpcomneud",   IX86_BUILTIN_VPCOMNEUD,   NE,           (int)MULTI_ARG_2_SI_CMP },
22378   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v4si3, "__builtin_ia32_vpcomnequd",  IX86_BUILTIN_VPCOMNEUD,   NE,           (int)MULTI_ARG_2_SI_CMP },
22379   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv4si3,  "__builtin_ia32_vpcomltud",   IX86_BUILTIN_VPCOMLTUD,   LTU,          (int)MULTI_ARG_2_SI_CMP },
22380   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv4si3,  "__builtin_ia32_vpcomleud",   IX86_BUILTIN_VPCOMLEUD,   LEU,          (int)MULTI_ARG_2_SI_CMP },
22381   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv4si3,  "__builtin_ia32_vpcomgtud",   IX86_BUILTIN_VPCOMGTUD,   GTU,          (int)MULTI_ARG_2_SI_CMP },
22382   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv4si3,  "__builtin_ia32_vpcomgeud",   IX86_BUILTIN_VPCOMGEUD,   GEU,          (int)MULTI_ARG_2_SI_CMP },
22383
22384   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v2di3, "__builtin_ia32_vpcomequq",   IX86_BUILTIN_VPCOMEQUQ,   EQ,           (int)MULTI_ARG_2_DI_CMP },
22385   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v2di3, "__builtin_ia32_vpcomneuq",   IX86_BUILTIN_VPCOMNEUQ,   NE,           (int)MULTI_ARG_2_DI_CMP },
22386   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v2di3, "__builtin_ia32_vpcomnequq",  IX86_BUILTIN_VPCOMNEUQ,   NE,           (int)MULTI_ARG_2_DI_CMP },
22387   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv2di3,  "__builtin_ia32_vpcomltuq",   IX86_BUILTIN_VPCOMLTUQ,   LTU,          (int)MULTI_ARG_2_DI_CMP },
22388   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv2di3,  "__builtin_ia32_vpcomleuq",   IX86_BUILTIN_VPCOMLEUQ,   LEU,          (int)MULTI_ARG_2_DI_CMP },
22389   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv2di3,  "__builtin_ia32_vpcomgtuq",   IX86_BUILTIN_VPCOMGTUQ,   GTU,          (int)MULTI_ARG_2_DI_CMP },
22390   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv2di3,  "__builtin_ia32_vpcomgeuq",   IX86_BUILTIN_VPCOMGEUQ,   GEU,          (int)MULTI_ARG_2_DI_CMP },
22391
22392   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcom_tfv16qi3,     "__builtin_ia32_vpcomfalseb", IX86_BUILTIN_VPCOMFALSEB, (enum rtx_code) PCOM_FALSE,   (int)MULTI_ARG_2_QI_TF },
22393   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcom_tfv8hi3,      "__builtin_ia32_vpcomfalsew", IX86_BUILTIN_VPCOMFALSEW, (enum rtx_code) PCOM_FALSE,   (int)MULTI_ARG_2_HI_TF },
22394   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcom_tfv4si3,      "__builtin_ia32_vpcomfalsed", IX86_BUILTIN_VPCOMFALSED, (enum rtx_code) PCOM_FALSE,   (int)MULTI_ARG_2_SI_TF },
22395   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcom_tfv2di3,      "__builtin_ia32_vpcomfalseq", IX86_BUILTIN_VPCOMFALSEQ, (enum rtx_code) PCOM_FALSE,   (int)MULTI_ARG_2_DI_TF },
22396   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcom_tfv16qi3,     "__builtin_ia32_vpcomfalseub",IX86_BUILTIN_VPCOMFALSEUB,(enum rtx_code) PCOM_FALSE,   (int)MULTI_ARG_2_QI_TF },
22397   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcom_tfv8hi3,      "__builtin_ia32_vpcomfalseuw",IX86_BUILTIN_VPCOMFALSEUW,(enum rtx_code) PCOM_FALSE,   (int)MULTI_ARG_2_HI_TF },
22398   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcom_tfv4si3,      "__builtin_ia32_vpcomfalseud",IX86_BUILTIN_VPCOMFALSEUD,(enum rtx_code) PCOM_FALSE,   (int)MULTI_ARG_2_SI_TF },
22399   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcom_tfv2di3,      "__builtin_ia32_vpcomfalseuq",IX86_BUILTIN_VPCOMFALSEUQ,(enum rtx_code) PCOM_FALSE,   (int)MULTI_ARG_2_DI_TF },
22400
22401   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcom_tfv16qi3,     "__builtin_ia32_vpcomtrueb",  IX86_BUILTIN_VPCOMTRUEB,  (enum rtx_code) PCOM_TRUE,    (int)MULTI_ARG_2_QI_TF },
22402   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcom_tfv8hi3,      "__builtin_ia32_vpcomtruew",  IX86_BUILTIN_VPCOMTRUEW,  (enum rtx_code) PCOM_TRUE,    (int)MULTI_ARG_2_HI_TF },
22403   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcom_tfv4si3,      "__builtin_ia32_vpcomtrued",  IX86_BUILTIN_VPCOMTRUED,  (enum rtx_code) PCOM_TRUE,    (int)MULTI_ARG_2_SI_TF },
22404   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcom_tfv2di3,      "__builtin_ia32_vpcomtrueq",  IX86_BUILTIN_VPCOMTRUEQ,  (enum rtx_code) PCOM_TRUE,    (int)MULTI_ARG_2_DI_TF },
22405   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcom_tfv16qi3,     "__builtin_ia32_vpcomtrueub", IX86_BUILTIN_VPCOMTRUEUB, (enum rtx_code) PCOM_TRUE,    (int)MULTI_ARG_2_QI_TF },
22406   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcom_tfv8hi3,      "__builtin_ia32_vpcomtrueuw", IX86_BUILTIN_VPCOMTRUEUW, (enum rtx_code) PCOM_TRUE,    (int)MULTI_ARG_2_HI_TF },
22407   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcom_tfv4si3,      "__builtin_ia32_vpcomtrueud", IX86_BUILTIN_VPCOMTRUEUD, (enum rtx_code) PCOM_TRUE,    (int)MULTI_ARG_2_SI_TF },
22408   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcom_tfv2di3,      "__builtin_ia32_vpcomtrueuq", IX86_BUILTIN_VPCOMTRUEUQ, (enum rtx_code) PCOM_TRUE,    (int)MULTI_ARG_2_DI_TF },
22409
22410 };
22411
22412 /* Set up all the MMX/SSE builtins, even builtins for instructions that are not
22413    in the current target ISA to allow the user to compile particular modules
22414    with different target specific options that differ from the command line
22415    options.  */
22416 static void
22417 ix86_init_mmx_sse_builtins (void)
22418 {
22419   const struct builtin_description * d;
22420   enum ix86_builtin_func_type ftype;
22421   size_t i;
22422
22423   /* Add all special builtins with variable number of operands.  */
22424   for (i = 0, d = bdesc_special_args;
22425        i < ARRAY_SIZE (bdesc_special_args);
22426        i++, d++)
22427     {
22428       if (d->name == 0)
22429         continue;
22430
22431       ftype = (enum ix86_builtin_func_type) d->flag;
22432       def_builtin (d->mask, d->name, ftype, d->code);
22433     }
22434
22435   /* Add all builtins with variable number of operands.  */
22436   for (i = 0, d = bdesc_args;
22437        i < ARRAY_SIZE (bdesc_args);
22438        i++, d++)
22439     {
22440       if (d->name == 0)
22441         continue;
22442
22443       ftype = (enum ix86_builtin_func_type) d->flag;
22444       def_builtin_const (d->mask, d->name, ftype, d->code);
22445     }
22446
22447   /* pcmpestr[im] insns.  */
22448   for (i = 0, d = bdesc_pcmpestr;
22449        i < ARRAY_SIZE (bdesc_pcmpestr);
22450        i++, d++)
22451     {
22452       if (d->code == IX86_BUILTIN_PCMPESTRM128)
22453         ftype = V16QI_FTYPE_V16QI_INT_V16QI_INT_INT;
22454       else
22455         ftype = INT_FTYPE_V16QI_INT_V16QI_INT_INT;
22456       def_builtin_const (d->mask, d->name, ftype, d->code);
22457     }
22458
22459   /* pcmpistr[im] insns.  */
22460   for (i = 0, d = bdesc_pcmpistr;
22461        i < ARRAY_SIZE (bdesc_pcmpistr);
22462        i++, d++)
22463     {
22464       if (d->code == IX86_BUILTIN_PCMPISTRM128)
22465         ftype = V16QI_FTYPE_V16QI_V16QI_INT;
22466       else
22467         ftype = INT_FTYPE_V16QI_V16QI_INT;
22468       def_builtin_const (d->mask, d->name, ftype, d->code);
22469     }
22470
22471   /* comi/ucomi insns.  */
22472   for (i = 0, d = bdesc_comi; i < ARRAY_SIZE (bdesc_comi); i++, d++)
22473     {
22474       if (d->mask == OPTION_MASK_ISA_SSE2)
22475         ftype = INT_FTYPE_V2DF_V2DF;
22476       else
22477         ftype = INT_FTYPE_V4SF_V4SF;
22478       def_builtin_const (d->mask, d->name, ftype, d->code);
22479     }
22480
22481   /* SSE */
22482   def_builtin (OPTION_MASK_ISA_SSE, "__builtin_ia32_ldmxcsr",
22483                VOID_FTYPE_UNSIGNED, IX86_BUILTIN_LDMXCSR);
22484   def_builtin (OPTION_MASK_ISA_SSE, "__builtin_ia32_stmxcsr",
22485                UNSIGNED_FTYPE_VOID, IX86_BUILTIN_STMXCSR);
22486
22487   /* SSE or 3DNow!A */
22488   def_builtin (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A,
22489                "__builtin_ia32_maskmovq", VOID_FTYPE_V8QI_V8QI_PCHAR,
22490                IX86_BUILTIN_MASKMOVQ);
22491
22492   /* SSE2 */
22493   def_builtin (OPTION_MASK_ISA_SSE2, "__builtin_ia32_maskmovdqu",
22494                VOID_FTYPE_V16QI_V16QI_PCHAR, IX86_BUILTIN_MASKMOVDQU);
22495
22496   def_builtin (OPTION_MASK_ISA_SSE2, "__builtin_ia32_clflush",
22497                VOID_FTYPE_PCVOID, IX86_BUILTIN_CLFLUSH);
22498   x86_mfence = def_builtin (OPTION_MASK_ISA_SSE2, "__builtin_ia32_mfence",
22499                             VOID_FTYPE_VOID, IX86_BUILTIN_MFENCE);
22500
22501   /* SSE3.  */
22502   def_builtin (OPTION_MASK_ISA_SSE3, "__builtin_ia32_monitor",
22503                VOID_FTYPE_PCVOID_UNSIGNED_UNSIGNED, IX86_BUILTIN_MONITOR);
22504   def_builtin (OPTION_MASK_ISA_SSE3, "__builtin_ia32_mwait",
22505                VOID_FTYPE_UNSIGNED_UNSIGNED, IX86_BUILTIN_MWAIT);
22506
22507   /* AES */
22508   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesenc128",
22509                      V2DI_FTYPE_V2DI_V2DI, IX86_BUILTIN_AESENC128);
22510   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesenclast128",
22511                      V2DI_FTYPE_V2DI_V2DI, IX86_BUILTIN_AESENCLAST128);
22512   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesdec128",
22513                      V2DI_FTYPE_V2DI_V2DI, IX86_BUILTIN_AESDEC128);
22514   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesdeclast128",
22515                      V2DI_FTYPE_V2DI_V2DI, IX86_BUILTIN_AESDECLAST128);
22516   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesimc128",
22517                      V2DI_FTYPE_V2DI, IX86_BUILTIN_AESIMC128);
22518   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aeskeygenassist128",
22519                      V2DI_FTYPE_V2DI_INT, IX86_BUILTIN_AESKEYGENASSIST128);
22520
22521   /* PCLMUL */
22522   def_builtin_const (OPTION_MASK_ISA_PCLMUL, "__builtin_ia32_pclmulqdq128",
22523                      V2DI_FTYPE_V2DI_V2DI_INT, IX86_BUILTIN_PCLMULQDQ128);
22524
22525   /* MMX access to the vec_init patterns.  */
22526   def_builtin_const (OPTION_MASK_ISA_MMX, "__builtin_ia32_vec_init_v2si",
22527                      V2SI_FTYPE_INT_INT, IX86_BUILTIN_VEC_INIT_V2SI);
22528
22529   def_builtin_const (OPTION_MASK_ISA_MMX, "__builtin_ia32_vec_init_v4hi",
22530                      V4HI_FTYPE_HI_HI_HI_HI,
22531                      IX86_BUILTIN_VEC_INIT_V4HI);
22532
22533   def_builtin_const (OPTION_MASK_ISA_MMX, "__builtin_ia32_vec_init_v8qi",
22534                      V8QI_FTYPE_QI_QI_QI_QI_QI_QI_QI_QI,
22535                      IX86_BUILTIN_VEC_INIT_V8QI);
22536
22537   /* Access to the vec_extract patterns.  */
22538   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v2df",
22539                      DOUBLE_FTYPE_V2DF_INT, IX86_BUILTIN_VEC_EXT_V2DF);
22540   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v2di",
22541                      DI_FTYPE_V2DI_INT, IX86_BUILTIN_VEC_EXT_V2DI);
22542   def_builtin_const (OPTION_MASK_ISA_SSE, "__builtin_ia32_vec_ext_v4sf",
22543                      FLOAT_FTYPE_V4SF_INT, IX86_BUILTIN_VEC_EXT_V4SF);
22544   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v4si",
22545                      SI_FTYPE_V4SI_INT, IX86_BUILTIN_VEC_EXT_V4SI);
22546   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v8hi",
22547                      HI_FTYPE_V8HI_INT, IX86_BUILTIN_VEC_EXT_V8HI);
22548
22549   def_builtin_const (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A,
22550                      "__builtin_ia32_vec_ext_v4hi",
22551                      HI_FTYPE_V4HI_INT, IX86_BUILTIN_VEC_EXT_V4HI);
22552
22553   def_builtin_const (OPTION_MASK_ISA_MMX, "__builtin_ia32_vec_ext_v2si",
22554                      SI_FTYPE_V2SI_INT, IX86_BUILTIN_VEC_EXT_V2SI);
22555
22556   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v16qi",
22557                      QI_FTYPE_V16QI_INT, IX86_BUILTIN_VEC_EXT_V16QI);
22558
22559   /* Access to the vec_set patterns.  */
22560   def_builtin_const (OPTION_MASK_ISA_SSE4_1 | OPTION_MASK_ISA_64BIT,
22561                      "__builtin_ia32_vec_set_v2di",
22562                      V2DI_FTYPE_V2DI_DI_INT, IX86_BUILTIN_VEC_SET_V2DI);
22563
22564   def_builtin_const (OPTION_MASK_ISA_SSE4_1, "__builtin_ia32_vec_set_v4sf",
22565                      V4SF_FTYPE_V4SF_FLOAT_INT, IX86_BUILTIN_VEC_SET_V4SF);
22566
22567   def_builtin_const (OPTION_MASK_ISA_SSE4_1, "__builtin_ia32_vec_set_v4si",
22568                      V4SI_FTYPE_V4SI_SI_INT, IX86_BUILTIN_VEC_SET_V4SI);
22569
22570   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_set_v8hi",
22571                      V8HI_FTYPE_V8HI_HI_INT, IX86_BUILTIN_VEC_SET_V8HI);
22572
22573   def_builtin_const (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A,
22574                      "__builtin_ia32_vec_set_v4hi",
22575                      V4HI_FTYPE_V4HI_HI_INT, IX86_BUILTIN_VEC_SET_V4HI);
22576
22577   def_builtin_const (OPTION_MASK_ISA_SSE4_1, "__builtin_ia32_vec_set_v16qi",
22578                      V16QI_FTYPE_V16QI_QI_INT, IX86_BUILTIN_VEC_SET_V16QI);
22579
22580   /* Add FMA4 multi-arg argument instructions */
22581   for (i = 0, d = bdesc_multi_arg; i < ARRAY_SIZE (bdesc_multi_arg); i++, d++)
22582     {
22583       if (d->name == 0)
22584         continue;
22585
22586       ftype = (enum ix86_builtin_func_type) d->flag;
22587       def_builtin_const (d->mask, d->name, ftype, d->code);
22588     }
22589 }
22590
22591 /* Internal method for ix86_init_builtins.  */
22592
22593 static void
22594 ix86_init_builtins_va_builtins_abi (void)
22595 {
22596   tree ms_va_ref, sysv_va_ref;
22597   tree fnvoid_va_end_ms, fnvoid_va_end_sysv;
22598   tree fnvoid_va_start_ms, fnvoid_va_start_sysv;
22599   tree fnvoid_va_copy_ms, fnvoid_va_copy_sysv;
22600   tree fnattr_ms = NULL_TREE, fnattr_sysv = NULL_TREE;
22601
22602   if (!TARGET_64BIT)
22603     return;
22604   fnattr_ms = build_tree_list (get_identifier ("ms_abi"), NULL_TREE);
22605   fnattr_sysv = build_tree_list (get_identifier ("sysv_abi"), NULL_TREE);
22606   ms_va_ref = build_reference_type (ms_va_list_type_node);
22607   sysv_va_ref =
22608     build_pointer_type (TREE_TYPE (sysv_va_list_type_node));
22609
22610   fnvoid_va_end_ms =
22611     build_function_type_list (void_type_node, ms_va_ref, NULL_TREE);
22612   fnvoid_va_start_ms =
22613     build_varargs_function_type_list (void_type_node, ms_va_ref, NULL_TREE);
22614   fnvoid_va_end_sysv =
22615     build_function_type_list (void_type_node, sysv_va_ref, NULL_TREE);
22616   fnvoid_va_start_sysv =
22617     build_varargs_function_type_list (void_type_node, sysv_va_ref,
22618                                        NULL_TREE);
22619   fnvoid_va_copy_ms =
22620     build_function_type_list (void_type_node, ms_va_ref, ms_va_list_type_node,
22621                               NULL_TREE);
22622   fnvoid_va_copy_sysv =
22623     build_function_type_list (void_type_node, sysv_va_ref,
22624                               sysv_va_ref, NULL_TREE);
22625
22626   add_builtin_function ("__builtin_ms_va_start", fnvoid_va_start_ms,
22627                         BUILT_IN_VA_START, BUILT_IN_NORMAL, NULL, fnattr_ms);
22628   add_builtin_function ("__builtin_ms_va_end", fnvoid_va_end_ms,
22629                         BUILT_IN_VA_END, BUILT_IN_NORMAL, NULL, fnattr_ms);
22630   add_builtin_function ("__builtin_ms_va_copy", fnvoid_va_copy_ms,
22631                         BUILT_IN_VA_COPY, BUILT_IN_NORMAL, NULL, fnattr_ms);
22632   add_builtin_function ("__builtin_sysv_va_start", fnvoid_va_start_sysv,
22633                         BUILT_IN_VA_START, BUILT_IN_NORMAL, NULL, fnattr_sysv);
22634   add_builtin_function ("__builtin_sysv_va_end", fnvoid_va_end_sysv,
22635                         BUILT_IN_VA_END, BUILT_IN_NORMAL, NULL, fnattr_sysv);
22636   add_builtin_function ("__builtin_sysv_va_copy", fnvoid_va_copy_sysv,
22637                         BUILT_IN_VA_COPY, BUILT_IN_NORMAL, NULL, fnattr_sysv);
22638 }
22639
22640 static void
22641 ix86_init_builtin_types (void)
22642 {
22643   tree float128_type_node, float80_type_node;
22644
22645   /* The __float80 type.  */
22646   float80_type_node = long_double_type_node;
22647   if (TYPE_MODE (float80_type_node) != XFmode)
22648     {
22649       /* The __float80 type.  */
22650       float80_type_node = make_node (REAL_TYPE);
22651
22652       TYPE_PRECISION (float80_type_node) = 80;
22653       layout_type (float80_type_node);
22654     }
22655   (*lang_hooks.types.register_builtin_type) (float80_type_node, "__float80");
22656
22657   /* The __float128 type.  */
22658   float128_type_node = make_node (REAL_TYPE);
22659   TYPE_PRECISION (float128_type_node) = 128;
22660   layout_type (float128_type_node);
22661   (*lang_hooks.types.register_builtin_type) (float128_type_node, "__float128");
22662
22663   /* This macro is built by i386-builtin-types.awk.  */
22664   DEFINE_BUILTIN_PRIMITIVE_TYPES;
22665 }
22666
22667 static void
22668 ix86_init_builtins (void)
22669 {
22670   tree t;
22671
22672   ix86_init_builtin_types ();
22673
22674   /* TFmode support builtins.  */
22675   def_builtin_const (0, "__builtin_infq",
22676                      FLOAT128_FTYPE_VOID, IX86_BUILTIN_INFQ);
22677   def_builtin_const (0, "__builtin_huge_valq",
22678                      FLOAT128_FTYPE_VOID, IX86_BUILTIN_HUGE_VALQ);
22679
22680   /* We will expand them to normal call if SSE2 isn't available since
22681      they are used by libgcc. */
22682   t = ix86_get_builtin_func_type (FLOAT128_FTYPE_FLOAT128);
22683   t = add_builtin_function ("__builtin_fabsq", t, IX86_BUILTIN_FABSQ,
22684                             BUILT_IN_MD, "__fabstf2", NULL_TREE);
22685   TREE_READONLY (t) = 1;
22686   ix86_builtins[(int) IX86_BUILTIN_FABSQ] = t;
22687
22688   t = ix86_get_builtin_func_type (FLOAT128_FTYPE_FLOAT128_FLOAT128);
22689   t = add_builtin_function ("__builtin_copysignq", t, IX86_BUILTIN_COPYSIGNQ,
22690                             BUILT_IN_MD, "__copysigntf3", NULL_TREE);
22691   TREE_READONLY (t) = 1;
22692   ix86_builtins[(int) IX86_BUILTIN_COPYSIGNQ] = t;
22693
22694   ix86_init_mmx_sse_builtins ();
22695
22696   if (TARGET_64BIT)
22697     ix86_init_builtins_va_builtins_abi ();
22698 }
22699
22700 /* Return the ix86 builtin for CODE.  */
22701
22702 static tree
22703 ix86_builtin_decl (unsigned code, bool initialize_p ATTRIBUTE_UNUSED)
22704 {
22705   if (code >= IX86_BUILTIN_MAX)
22706     return error_mark_node;
22707
22708   return ix86_builtins[code];
22709 }
22710
22711 /* Errors in the source file can cause expand_expr to return const0_rtx
22712    where we expect a vector.  To avoid crashing, use one of the vector
22713    clear instructions.  */
22714 static rtx
22715 safe_vector_operand (rtx x, enum machine_mode mode)
22716 {
22717   if (x == const0_rtx)
22718     x = CONST0_RTX (mode);
22719   return x;
22720 }
22721
22722 /* Subroutine of ix86_expand_builtin to take care of binop insns.  */
22723
22724 static rtx
22725 ix86_expand_binop_builtin (enum insn_code icode, tree exp, rtx target)
22726 {
22727   rtx pat;
22728   tree arg0 = CALL_EXPR_ARG (exp, 0);
22729   tree arg1 = CALL_EXPR_ARG (exp, 1);
22730   rtx op0 = expand_normal (arg0);
22731   rtx op1 = expand_normal (arg1);
22732   enum machine_mode tmode = insn_data[icode].operand[0].mode;
22733   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
22734   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
22735
22736   if (VECTOR_MODE_P (mode0))
22737     op0 = safe_vector_operand (op0, mode0);
22738   if (VECTOR_MODE_P (mode1))
22739     op1 = safe_vector_operand (op1, mode1);
22740
22741   if (optimize || !target
22742       || GET_MODE (target) != tmode
22743       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
22744     target = gen_reg_rtx (tmode);
22745
22746   if (GET_MODE (op1) == SImode && mode1 == TImode)
22747     {
22748       rtx x = gen_reg_rtx (V4SImode);
22749       emit_insn (gen_sse2_loadd (x, op1));
22750       op1 = gen_lowpart (TImode, x);
22751     }
22752
22753   if (!(*insn_data[icode].operand[1].predicate) (op0, mode0))
22754     op0 = copy_to_mode_reg (mode0, op0);
22755   if (!(*insn_data[icode].operand[2].predicate) (op1, mode1))
22756     op1 = copy_to_mode_reg (mode1, op1);
22757
22758   pat = GEN_FCN (icode) (target, op0, op1);
22759   if (! pat)
22760     return 0;
22761
22762   emit_insn (pat);
22763
22764   return target;
22765 }
22766
22767 /* Subroutine of ix86_expand_builtin to take care of 2-4 argument insns.  */
22768
22769 static rtx
22770 ix86_expand_multi_arg_builtin (enum insn_code icode, tree exp, rtx target,
22771                                enum ix86_builtin_func_type m_type,
22772                                enum rtx_code sub_code)
22773 {
22774   rtx pat;
22775   int i;
22776   int nargs;
22777   bool comparison_p = false;
22778   bool tf_p = false;
22779   bool last_arg_constant = false;
22780   int num_memory = 0;
22781   struct {
22782     rtx op;
22783     enum machine_mode mode;
22784   } args[4];
22785
22786   enum machine_mode tmode = insn_data[icode].operand[0].mode;
22787
22788   switch (m_type)
22789     {
22790     case MULTI_ARG_3_SF:
22791     case MULTI_ARG_3_DF:
22792     case MULTI_ARG_3_SF2:
22793     case MULTI_ARG_3_DF2:
22794     case MULTI_ARG_3_DI:
22795     case MULTI_ARG_3_SI:
22796     case MULTI_ARG_3_SI_DI:
22797     case MULTI_ARG_3_HI:
22798     case MULTI_ARG_3_HI_SI:
22799     case MULTI_ARG_3_QI:
22800     case MULTI_ARG_3_DI2:
22801     case MULTI_ARG_3_SI2:
22802     case MULTI_ARG_3_HI2:
22803     case MULTI_ARG_3_QI2:
22804       nargs = 3;
22805       break;
22806
22807     case MULTI_ARG_2_SF:
22808     case MULTI_ARG_2_DF:
22809     case MULTI_ARG_2_DI:
22810     case MULTI_ARG_2_SI:
22811     case MULTI_ARG_2_HI:
22812     case MULTI_ARG_2_QI:
22813       nargs = 2;
22814       break;
22815
22816     case MULTI_ARG_2_DI_IMM:
22817     case MULTI_ARG_2_SI_IMM:
22818     case MULTI_ARG_2_HI_IMM:
22819     case MULTI_ARG_2_QI_IMM:
22820       nargs = 2;
22821       last_arg_constant = true;
22822       break;
22823
22824     case MULTI_ARG_1_SF:
22825     case MULTI_ARG_1_DF:
22826     case MULTI_ARG_1_SF2:
22827     case MULTI_ARG_1_DF2:
22828     case MULTI_ARG_1_DI:
22829     case MULTI_ARG_1_SI:
22830     case MULTI_ARG_1_HI:
22831     case MULTI_ARG_1_QI:
22832     case MULTI_ARG_1_SI_DI:
22833     case MULTI_ARG_1_HI_DI:
22834     case MULTI_ARG_1_HI_SI:
22835     case MULTI_ARG_1_QI_DI:
22836     case MULTI_ARG_1_QI_SI:
22837     case MULTI_ARG_1_QI_HI:
22838       nargs = 1;
22839       break;
22840
22841     case MULTI_ARG_2_DI_CMP:
22842     case MULTI_ARG_2_SI_CMP:
22843     case MULTI_ARG_2_HI_CMP:
22844     case MULTI_ARG_2_QI_CMP:
22845       nargs = 2;
22846       comparison_p = true;
22847       break;
22848
22849     case MULTI_ARG_2_SF_TF:
22850     case MULTI_ARG_2_DF_TF:
22851     case MULTI_ARG_2_DI_TF:
22852     case MULTI_ARG_2_SI_TF:
22853     case MULTI_ARG_2_HI_TF:
22854     case MULTI_ARG_2_QI_TF:
22855       nargs = 2;
22856       tf_p = true;
22857       break;
22858
22859     default:
22860       gcc_unreachable ();
22861     }
22862
22863   if (optimize || !target
22864       || GET_MODE (target) != tmode
22865       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
22866     target = gen_reg_rtx (tmode);
22867
22868   gcc_assert (nargs <= 4);
22869
22870   for (i = 0; i < nargs; i++)
22871     {
22872       tree arg = CALL_EXPR_ARG (exp, i);
22873       rtx op = expand_normal (arg);
22874       int adjust = (comparison_p) ? 1 : 0;
22875       enum machine_mode mode = insn_data[icode].operand[i+adjust+1].mode;
22876
22877       if (last_arg_constant && i == nargs-1)
22878         {
22879           if (!CONST_INT_P (op))
22880             {
22881               error ("last argument must be an immediate");
22882               return gen_reg_rtx (tmode);
22883             }
22884         }
22885       else
22886         {
22887           if (VECTOR_MODE_P (mode))
22888             op = safe_vector_operand (op, mode);
22889
22890           /* If we aren't optimizing, only allow one memory operand to be
22891              generated.  */
22892           if (memory_operand (op, mode))
22893             num_memory++;
22894
22895           gcc_assert (GET_MODE (op) == mode || GET_MODE (op) == VOIDmode);
22896
22897           if (optimize
22898               || ! (*insn_data[icode].operand[i+adjust+1].predicate) (op, mode)
22899               || num_memory > 1)
22900             op = force_reg (mode, op);
22901         }
22902
22903       args[i].op = op;
22904       args[i].mode = mode;
22905     }
22906
22907   switch (nargs)
22908     {
22909     case 1:
22910       pat = GEN_FCN (icode) (target, args[0].op);
22911       break;
22912
22913     case 2:
22914       if (tf_p)
22915         pat = GEN_FCN (icode) (target, args[0].op, args[1].op,
22916                                GEN_INT ((int)sub_code));
22917       else if (! comparison_p)
22918         pat = GEN_FCN (icode) (target, args[0].op, args[1].op);
22919       else
22920         {
22921           rtx cmp_op = gen_rtx_fmt_ee (sub_code, GET_MODE (target),
22922                                        args[0].op,
22923                                        args[1].op);
22924
22925           pat = GEN_FCN (icode) (target, cmp_op, args[0].op, args[1].op);
22926         }
22927       break;
22928
22929     case 3:
22930       pat = GEN_FCN (icode) (target, args[0].op, args[1].op, args[2].op);
22931       break;
22932
22933     default:
22934       gcc_unreachable ();
22935     }
22936
22937   if (! pat)
22938     return 0;
22939
22940   emit_insn (pat);
22941   return target;
22942 }
22943
22944 /* Subroutine of ix86_expand_args_builtin to take care of scalar unop
22945    insns with vec_merge.  */
22946
22947 static rtx
22948 ix86_expand_unop_vec_merge_builtin (enum insn_code icode, tree exp,
22949                                     rtx target)
22950 {
22951   rtx pat;
22952   tree arg0 = CALL_EXPR_ARG (exp, 0);
22953   rtx op1, op0 = expand_normal (arg0);
22954   enum machine_mode tmode = insn_data[icode].operand[0].mode;
22955   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
22956
22957   if (optimize || !target
22958       || GET_MODE (target) != tmode
22959       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
22960     target = gen_reg_rtx (tmode);
22961
22962   if (VECTOR_MODE_P (mode0))
22963     op0 = safe_vector_operand (op0, mode0);
22964
22965   if ((optimize && !register_operand (op0, mode0))
22966       || ! (*insn_data[icode].operand[1].predicate) (op0, mode0))
22967     op0 = copy_to_mode_reg (mode0, op0);
22968
22969   op1 = op0;
22970   if (! (*insn_data[icode].operand[2].predicate) (op1, mode0))
22971     op1 = copy_to_mode_reg (mode0, op1);
22972
22973   pat = GEN_FCN (icode) (target, op0, op1);
22974   if (! pat)
22975     return 0;
22976   emit_insn (pat);
22977   return target;
22978 }
22979
22980 /* Subroutine of ix86_expand_builtin to take care of comparison insns.  */
22981
22982 static rtx
22983 ix86_expand_sse_compare (const struct builtin_description *d,
22984                          tree exp, rtx target, bool swap)
22985 {
22986   rtx pat;
22987   tree arg0 = CALL_EXPR_ARG (exp, 0);
22988   tree arg1 = CALL_EXPR_ARG (exp, 1);
22989   rtx op0 = expand_normal (arg0);
22990   rtx op1 = expand_normal (arg1);
22991   rtx op2;
22992   enum machine_mode tmode = insn_data[d->icode].operand[0].mode;
22993   enum machine_mode mode0 = insn_data[d->icode].operand[1].mode;
22994   enum machine_mode mode1 = insn_data[d->icode].operand[2].mode;
22995   enum rtx_code comparison = d->comparison;
22996
22997   if (VECTOR_MODE_P (mode0))
22998     op0 = safe_vector_operand (op0, mode0);
22999   if (VECTOR_MODE_P (mode1))
23000     op1 = safe_vector_operand (op1, mode1);
23001
23002   /* Swap operands if we have a comparison that isn't available in
23003      hardware.  */
23004   if (swap)
23005     {
23006       rtx tmp = gen_reg_rtx (mode1);
23007       emit_move_insn (tmp, op1);
23008       op1 = op0;
23009       op0 = tmp;
23010     }
23011
23012   if (optimize || !target
23013       || GET_MODE (target) != tmode
23014       || ! (*insn_data[d->icode].operand[0].predicate) (target, tmode))
23015     target = gen_reg_rtx (tmode);
23016
23017   if ((optimize && !register_operand (op0, mode0))
23018       || ! (*insn_data[d->icode].operand[1].predicate) (op0, mode0))
23019     op0 = copy_to_mode_reg (mode0, op0);
23020   if ((optimize && !register_operand (op1, mode1))
23021       || ! (*insn_data[d->icode].operand[2].predicate) (op1, mode1))
23022     op1 = copy_to_mode_reg (mode1, op1);
23023
23024   op2 = gen_rtx_fmt_ee (comparison, mode0, op0, op1);
23025   pat = GEN_FCN (d->icode) (target, op0, op1, op2);
23026   if (! pat)
23027     return 0;
23028   emit_insn (pat);
23029   return target;
23030 }
23031
23032 /* Subroutine of ix86_expand_builtin to take care of comi insns.  */
23033
23034 static rtx
23035 ix86_expand_sse_comi (const struct builtin_description *d, tree exp,
23036                       rtx target)
23037 {
23038   rtx pat;
23039   tree arg0 = CALL_EXPR_ARG (exp, 0);
23040   tree arg1 = CALL_EXPR_ARG (exp, 1);
23041   rtx op0 = expand_normal (arg0);
23042   rtx op1 = expand_normal (arg1);
23043   enum machine_mode mode0 = insn_data[d->icode].operand[0].mode;
23044   enum machine_mode mode1 = insn_data[d->icode].operand[1].mode;
23045   enum rtx_code comparison = d->comparison;
23046
23047   if (VECTOR_MODE_P (mode0))
23048     op0 = safe_vector_operand (op0, mode0);
23049   if (VECTOR_MODE_P (mode1))
23050     op1 = safe_vector_operand (op1, mode1);
23051
23052   /* Swap operands if we have a comparison that isn't available in
23053      hardware.  */
23054   if (d->flag & BUILTIN_DESC_SWAP_OPERANDS)
23055     {
23056       rtx tmp = op1;
23057       op1 = op0;
23058       op0 = tmp;
23059     }
23060
23061   target = gen_reg_rtx (SImode);
23062   emit_move_insn (target, const0_rtx);
23063   target = gen_rtx_SUBREG (QImode, target, 0);
23064
23065   if ((optimize && !register_operand (op0, mode0))
23066       || !(*insn_data[d->icode].operand[0].predicate) (op0, mode0))
23067     op0 = copy_to_mode_reg (mode0, op0);
23068   if ((optimize && !register_operand (op1, mode1))
23069       || !(*insn_data[d->icode].operand[1].predicate) (op1, mode1))
23070     op1 = copy_to_mode_reg (mode1, op1);
23071
23072   pat = GEN_FCN (d->icode) (op0, op1);
23073   if (! pat)
23074     return 0;
23075   emit_insn (pat);
23076   emit_insn (gen_rtx_SET (VOIDmode,
23077                           gen_rtx_STRICT_LOW_PART (VOIDmode, target),
23078                           gen_rtx_fmt_ee (comparison, QImode,
23079                                           SET_DEST (pat),
23080                                           const0_rtx)));
23081
23082   return SUBREG_REG (target);
23083 }
23084
23085 /* Subroutine of ix86_expand_builtin to take care of ptest insns.  */
23086
23087 static rtx
23088 ix86_expand_sse_ptest (const struct builtin_description *d, tree exp,
23089                        rtx target)
23090 {
23091   rtx pat;
23092   tree arg0 = CALL_EXPR_ARG (exp, 0);
23093   tree arg1 = CALL_EXPR_ARG (exp, 1);
23094   rtx op0 = expand_normal (arg0);
23095   rtx op1 = expand_normal (arg1);
23096   enum machine_mode mode0 = insn_data[d->icode].operand[0].mode;
23097   enum machine_mode mode1 = insn_data[d->icode].operand[1].mode;
23098   enum rtx_code comparison = d->comparison;
23099
23100   if (VECTOR_MODE_P (mode0))
23101     op0 = safe_vector_operand (op0, mode0);
23102   if (VECTOR_MODE_P (mode1))
23103     op1 = safe_vector_operand (op1, mode1);
23104
23105   target = gen_reg_rtx (SImode);
23106   emit_move_insn (target, const0_rtx);
23107   target = gen_rtx_SUBREG (QImode, target, 0);
23108
23109   if ((optimize && !register_operand (op0, mode0))
23110       || !(*insn_data[d->icode].operand[0].predicate) (op0, mode0))
23111     op0 = copy_to_mode_reg (mode0, op0);
23112   if ((optimize && !register_operand (op1, mode1))
23113       || !(*insn_data[d->icode].operand[1].predicate) (op1, mode1))
23114     op1 = copy_to_mode_reg (mode1, op1);
23115
23116   pat = GEN_FCN (d->icode) (op0, op1);
23117   if (! pat)
23118     return 0;
23119   emit_insn (pat);
23120   emit_insn (gen_rtx_SET (VOIDmode,
23121                           gen_rtx_STRICT_LOW_PART (VOIDmode, target),
23122                           gen_rtx_fmt_ee (comparison, QImode,
23123                                           SET_DEST (pat),
23124                                           const0_rtx)));
23125
23126   return SUBREG_REG (target);
23127 }
23128
23129 /* Subroutine of ix86_expand_builtin to take care of pcmpestr[im] insns.  */
23130
23131 static rtx
23132 ix86_expand_sse_pcmpestr (const struct builtin_description *d,
23133                           tree exp, rtx target)
23134 {
23135   rtx pat;
23136   tree arg0 = CALL_EXPR_ARG (exp, 0);
23137   tree arg1 = CALL_EXPR_ARG (exp, 1);
23138   tree arg2 = CALL_EXPR_ARG (exp, 2);
23139   tree arg3 = CALL_EXPR_ARG (exp, 3);
23140   tree arg4 = CALL_EXPR_ARG (exp, 4);
23141   rtx scratch0, scratch1;
23142   rtx op0 = expand_normal (arg0);
23143   rtx op1 = expand_normal (arg1);
23144   rtx op2 = expand_normal (arg2);
23145   rtx op3 = expand_normal (arg3);
23146   rtx op4 = expand_normal (arg4);
23147   enum machine_mode tmode0, tmode1, modev2, modei3, modev4, modei5, modeimm;
23148
23149   tmode0 = insn_data[d->icode].operand[0].mode;
23150   tmode1 = insn_data[d->icode].operand[1].mode;
23151   modev2 = insn_data[d->icode].operand[2].mode;
23152   modei3 = insn_data[d->icode].operand[3].mode;
23153   modev4 = insn_data[d->icode].operand[4].mode;
23154   modei5 = insn_data[d->icode].operand[5].mode;
23155   modeimm = insn_data[d->icode].operand[6].mode;
23156
23157   if (VECTOR_MODE_P (modev2))
23158     op0 = safe_vector_operand (op0, modev2);
23159   if (VECTOR_MODE_P (modev4))
23160     op2 = safe_vector_operand (op2, modev4);
23161
23162   if (! (*insn_data[d->icode].operand[2].predicate) (op0, modev2))
23163     op0 = copy_to_mode_reg (modev2, op0);
23164   if (! (*insn_data[d->icode].operand[3].predicate) (op1, modei3))
23165     op1 = copy_to_mode_reg (modei3, op1);
23166   if ((optimize && !register_operand (op2, modev4))
23167       || !(*insn_data[d->icode].operand[4].predicate) (op2, modev4))
23168     op2 = copy_to_mode_reg (modev4, op2);
23169   if (! (*insn_data[d->icode].operand[5].predicate) (op3, modei5))
23170     op3 = copy_to_mode_reg (modei5, op3);
23171
23172   if (! (*insn_data[d->icode].operand[6].predicate) (op4, modeimm))
23173     {
23174       error ("the fifth argument must be a 8-bit immediate");
23175       return const0_rtx;
23176     }
23177
23178   if (d->code == IX86_BUILTIN_PCMPESTRI128)
23179     {
23180       if (optimize || !target
23181           || GET_MODE (target) != tmode0
23182           || ! (*insn_data[d->icode].operand[0].predicate) (target, tmode0))
23183         target = gen_reg_rtx (tmode0);
23184
23185       scratch1 = gen_reg_rtx (tmode1);
23186
23187       pat = GEN_FCN (d->icode) (target, scratch1, op0, op1, op2, op3, op4);
23188     }
23189   else if (d->code == IX86_BUILTIN_PCMPESTRM128)
23190     {
23191       if (optimize || !target
23192           || GET_MODE (target) != tmode1
23193           || ! (*insn_data[d->icode].operand[1].predicate) (target, tmode1))
23194         target = gen_reg_rtx (tmode1);
23195
23196       scratch0 = gen_reg_rtx (tmode0);
23197
23198       pat = GEN_FCN (d->icode) (scratch0, target, op0, op1, op2, op3, op4);
23199     }
23200   else
23201     {
23202       gcc_assert (d->flag);
23203
23204       scratch0 = gen_reg_rtx (tmode0);
23205       scratch1 = gen_reg_rtx (tmode1);
23206
23207       pat = GEN_FCN (d->icode) (scratch0, scratch1, op0, op1, op2, op3, op4);
23208     }
23209
23210   if (! pat)
23211     return 0;
23212
23213   emit_insn (pat);
23214
23215   if (d->flag)
23216     {
23217       target = gen_reg_rtx (SImode);
23218       emit_move_insn (target, const0_rtx);
23219       target = gen_rtx_SUBREG (QImode, target, 0);
23220
23221       emit_insn
23222         (gen_rtx_SET (VOIDmode, gen_rtx_STRICT_LOW_PART (VOIDmode, target),
23223                       gen_rtx_fmt_ee (EQ, QImode,
23224                                       gen_rtx_REG ((enum machine_mode) d->flag,
23225                                                    FLAGS_REG),
23226                                       const0_rtx)));
23227       return SUBREG_REG (target);
23228     }
23229   else
23230     return target;
23231 }
23232
23233
23234 /* Subroutine of ix86_expand_builtin to take care of pcmpistr[im] insns.  */
23235
23236 static rtx
23237 ix86_expand_sse_pcmpistr (const struct builtin_description *d,
23238                           tree exp, rtx target)
23239 {
23240   rtx pat;
23241   tree arg0 = CALL_EXPR_ARG (exp, 0);
23242   tree arg1 = CALL_EXPR_ARG (exp, 1);
23243   tree arg2 = CALL_EXPR_ARG (exp, 2);
23244   rtx scratch0, scratch1;
23245   rtx op0 = expand_normal (arg0);
23246   rtx op1 = expand_normal (arg1);
23247   rtx op2 = expand_normal (arg2);
23248   enum machine_mode tmode0, tmode1, modev2, modev3, modeimm;
23249
23250   tmode0 = insn_data[d->icode].operand[0].mode;
23251   tmode1 = insn_data[d->icode].operand[1].mode;
23252   modev2 = insn_data[d->icode].operand[2].mode;
23253   modev3 = insn_data[d->icode].operand[3].mode;
23254   modeimm = insn_data[d->icode].operand[4].mode;
23255
23256   if (VECTOR_MODE_P (modev2))
23257     op0 = safe_vector_operand (op0, modev2);
23258   if (VECTOR_MODE_P (modev3))
23259     op1 = safe_vector_operand (op1, modev3);
23260
23261   if (! (*insn_data[d->icode].operand[2].predicate) (op0, modev2))
23262     op0 = copy_to_mode_reg (modev2, op0);
23263   if ((optimize && !register_operand (op1, modev3))
23264       || !(*insn_data[d->icode].operand[3].predicate) (op1, modev3))
23265     op1 = copy_to_mode_reg (modev3, op1);
23266
23267   if (! (*insn_data[d->icode].operand[4].predicate) (op2, modeimm))
23268     {
23269       error ("the third argument must be a 8-bit immediate");
23270       return const0_rtx;
23271     }
23272
23273   if (d->code == IX86_BUILTIN_PCMPISTRI128)
23274     {
23275       if (optimize || !target
23276           || GET_MODE (target) != tmode0
23277           || ! (*insn_data[d->icode].operand[0].predicate) (target, tmode0))
23278         target = gen_reg_rtx (tmode0);
23279
23280       scratch1 = gen_reg_rtx (tmode1);
23281
23282       pat = GEN_FCN (d->icode) (target, scratch1, op0, op1, op2);
23283     }
23284   else if (d->code == IX86_BUILTIN_PCMPISTRM128)
23285     {
23286       if (optimize || !target
23287           || GET_MODE (target) != tmode1
23288           || ! (*insn_data[d->icode].operand[1].predicate) (target, tmode1))
23289         target = gen_reg_rtx (tmode1);
23290
23291       scratch0 = gen_reg_rtx (tmode0);
23292
23293       pat = GEN_FCN (d->icode) (scratch0, target, op0, op1, op2);
23294     }
23295   else
23296     {
23297       gcc_assert (d->flag);
23298
23299       scratch0 = gen_reg_rtx (tmode0);
23300       scratch1 = gen_reg_rtx (tmode1);
23301
23302       pat = GEN_FCN (d->icode) (scratch0, scratch1, op0, op1, op2);
23303     }
23304
23305   if (! pat)
23306     return 0;
23307
23308   emit_insn (pat);
23309
23310   if (d->flag)
23311     {
23312       target = gen_reg_rtx (SImode);
23313       emit_move_insn (target, const0_rtx);
23314       target = gen_rtx_SUBREG (QImode, target, 0);
23315
23316       emit_insn
23317         (gen_rtx_SET (VOIDmode, gen_rtx_STRICT_LOW_PART (VOIDmode, target),
23318                       gen_rtx_fmt_ee (EQ, QImode,
23319                                       gen_rtx_REG ((enum machine_mode) d->flag,
23320                                                    FLAGS_REG),
23321                                       const0_rtx)));
23322       return SUBREG_REG (target);
23323     }
23324   else
23325     return target;
23326 }
23327
23328 /* Subroutine of ix86_expand_builtin to take care of insns with
23329    variable number of operands.  */
23330
23331 static rtx
23332 ix86_expand_args_builtin (const struct builtin_description *d,
23333                           tree exp, rtx target)
23334 {
23335   rtx pat, real_target;
23336   unsigned int i, nargs;
23337   unsigned int nargs_constant = 0;
23338   int num_memory = 0;
23339   struct
23340     {
23341       rtx op;
23342       enum machine_mode mode;
23343     } args[4];
23344   bool last_arg_count = false;
23345   enum insn_code icode = d->icode;
23346   const struct insn_data *insn_p = &insn_data[icode];
23347   enum machine_mode tmode = insn_p->operand[0].mode;
23348   enum machine_mode rmode = VOIDmode;
23349   bool swap = false;
23350   enum rtx_code comparison = d->comparison;
23351
23352   switch ((enum ix86_builtin_func_type) d->flag)
23353     {
23354     case INT_FTYPE_V8SF_V8SF_PTEST:
23355     case INT_FTYPE_V4DI_V4DI_PTEST:
23356     case INT_FTYPE_V4DF_V4DF_PTEST:
23357     case INT_FTYPE_V4SF_V4SF_PTEST:
23358     case INT_FTYPE_V2DI_V2DI_PTEST:
23359     case INT_FTYPE_V2DF_V2DF_PTEST:
23360       return ix86_expand_sse_ptest (d, exp, target);
23361     case FLOAT128_FTYPE_FLOAT128:
23362     case FLOAT_FTYPE_FLOAT:
23363     case INT_FTYPE_INT:
23364     case UINT64_FTYPE_INT:
23365     case UINT16_FTYPE_UINT16:
23366     case INT64_FTYPE_INT64:
23367     case INT64_FTYPE_V4SF:
23368     case INT64_FTYPE_V2DF:
23369     case INT_FTYPE_V16QI:
23370     case INT_FTYPE_V8QI:
23371     case INT_FTYPE_V8SF:
23372     case INT_FTYPE_V4DF:
23373     case INT_FTYPE_V4SF:
23374     case INT_FTYPE_V2DF:
23375     case V16QI_FTYPE_V16QI:
23376     case V8SI_FTYPE_V8SF:
23377     case V8SI_FTYPE_V4SI:
23378     case V8HI_FTYPE_V8HI:
23379     case V8HI_FTYPE_V16QI:
23380     case V8QI_FTYPE_V8QI:
23381     case V8SF_FTYPE_V8SF:
23382     case V8SF_FTYPE_V8SI:
23383     case V8SF_FTYPE_V4SF:
23384     case V4SI_FTYPE_V4SI:
23385     case V4SI_FTYPE_V16QI:
23386     case V4SI_FTYPE_V4SF:
23387     case V4SI_FTYPE_V8SI:
23388     case V4SI_FTYPE_V8HI:
23389     case V4SI_FTYPE_V4DF:
23390     case V4SI_FTYPE_V2DF:
23391     case V4HI_FTYPE_V4HI:
23392     case V4DF_FTYPE_V4DF:
23393     case V4DF_FTYPE_V4SI:
23394     case V4DF_FTYPE_V4SF:
23395     case V4DF_FTYPE_V2DF:
23396     case V4SF_FTYPE_V4SF:
23397     case V4SF_FTYPE_V4SI:
23398     case V4SF_FTYPE_V8SF:
23399     case V4SF_FTYPE_V4DF:
23400     case V4SF_FTYPE_V2DF:
23401     case V2DI_FTYPE_V2DI:
23402     case V2DI_FTYPE_V16QI:
23403     case V2DI_FTYPE_V8HI:
23404     case V2DI_FTYPE_V4SI:
23405     case V2DF_FTYPE_V2DF:
23406     case V2DF_FTYPE_V4SI:
23407     case V2DF_FTYPE_V4DF:
23408     case V2DF_FTYPE_V4SF:
23409     case V2DF_FTYPE_V2SI:
23410     case V2SI_FTYPE_V2SI:
23411     case V2SI_FTYPE_V4SF:
23412     case V2SI_FTYPE_V2SF:
23413     case V2SI_FTYPE_V2DF:
23414     case V2SF_FTYPE_V2SF:
23415     case V2SF_FTYPE_V2SI:
23416       nargs = 1;
23417       break;
23418     case V4SF_FTYPE_V4SF_VEC_MERGE:
23419     case V2DF_FTYPE_V2DF_VEC_MERGE:
23420       return ix86_expand_unop_vec_merge_builtin (icode, exp, target);
23421     case FLOAT128_FTYPE_FLOAT128_FLOAT128:
23422     case V16QI_FTYPE_V16QI_V16QI:
23423     case V16QI_FTYPE_V8HI_V8HI:
23424     case V8QI_FTYPE_V8QI_V8QI:
23425     case V8QI_FTYPE_V4HI_V4HI:
23426     case V8HI_FTYPE_V8HI_V8HI:
23427     case V8HI_FTYPE_V16QI_V16QI:
23428     case V8HI_FTYPE_V4SI_V4SI:
23429     case V8SF_FTYPE_V8SF_V8SF:
23430     case V8SF_FTYPE_V8SF_V8SI:
23431     case V4SI_FTYPE_V4SI_V4SI:
23432     case V4SI_FTYPE_V8HI_V8HI:
23433     case V4SI_FTYPE_V4SF_V4SF:
23434     case V4SI_FTYPE_V2DF_V2DF:
23435     case V4HI_FTYPE_V4HI_V4HI:
23436     case V4HI_FTYPE_V8QI_V8QI:
23437     case V4HI_FTYPE_V2SI_V2SI:
23438     case V4DF_FTYPE_V4DF_V4DF:
23439     case V4DF_FTYPE_V4DF_V4DI:
23440     case V4SF_FTYPE_V4SF_V4SF:
23441     case V4SF_FTYPE_V4SF_V4SI:
23442     case V4SF_FTYPE_V4SF_V2SI:
23443     case V4SF_FTYPE_V4SF_V2DF:
23444     case V4SF_FTYPE_V4SF_DI:
23445     case V4SF_FTYPE_V4SF_SI:
23446     case V2DI_FTYPE_V2DI_V2DI:
23447     case V2DI_FTYPE_V16QI_V16QI:
23448     case V2DI_FTYPE_V4SI_V4SI:
23449     case V2DI_FTYPE_V2DI_V16QI:
23450     case V2DI_FTYPE_V2DF_V2DF:
23451     case V2SI_FTYPE_V2SI_V2SI:
23452     case V2SI_FTYPE_V4HI_V4HI:
23453     case V2SI_FTYPE_V2SF_V2SF:
23454     case V2DF_FTYPE_V2DF_V2DF:
23455     case V2DF_FTYPE_V2DF_V4SF:
23456     case V2DF_FTYPE_V2DF_V2DI:
23457     case V2DF_FTYPE_V2DF_DI:
23458     case V2DF_FTYPE_V2DF_SI:
23459     case V2SF_FTYPE_V2SF_V2SF:
23460     case V1DI_FTYPE_V1DI_V1DI:
23461     case V1DI_FTYPE_V8QI_V8QI:
23462     case V1DI_FTYPE_V2SI_V2SI:
23463       if (comparison == UNKNOWN)
23464         return ix86_expand_binop_builtin (icode, exp, target);
23465       nargs = 2;
23466       break;
23467     case V4SF_FTYPE_V4SF_V4SF_SWAP:
23468     case V2DF_FTYPE_V2DF_V2DF_SWAP:
23469       gcc_assert (comparison != UNKNOWN);
23470       nargs = 2;
23471       swap = true;
23472       break;
23473     case V8HI_FTYPE_V8HI_V8HI_COUNT:
23474     case V8HI_FTYPE_V8HI_SI_COUNT:
23475     case V4SI_FTYPE_V4SI_V4SI_COUNT:
23476     case V4SI_FTYPE_V4SI_SI_COUNT:
23477     case V4HI_FTYPE_V4HI_V4HI_COUNT:
23478     case V4HI_FTYPE_V4HI_SI_COUNT:
23479     case V2DI_FTYPE_V2DI_V2DI_COUNT:
23480     case V2DI_FTYPE_V2DI_SI_COUNT:
23481     case V2SI_FTYPE_V2SI_V2SI_COUNT:
23482     case V2SI_FTYPE_V2SI_SI_COUNT:
23483     case V1DI_FTYPE_V1DI_V1DI_COUNT:
23484     case V1DI_FTYPE_V1DI_SI_COUNT:
23485       nargs = 2;
23486       last_arg_count = true;
23487       break;
23488     case UINT64_FTYPE_UINT64_UINT64:
23489     case UINT_FTYPE_UINT_UINT:
23490     case UINT_FTYPE_UINT_USHORT:
23491     case UINT_FTYPE_UINT_UCHAR:
23492     case UINT16_FTYPE_UINT16_INT:
23493     case UINT8_FTYPE_UINT8_INT:
23494       nargs = 2;
23495       break;
23496     case V2DI_FTYPE_V2DI_INT_CONVERT:
23497       nargs = 2;
23498       rmode = V1TImode;
23499       nargs_constant = 1;
23500       break;
23501     case V8HI_FTYPE_V8HI_INT:
23502     case V8SF_FTYPE_V8SF_INT:
23503     case V4SI_FTYPE_V4SI_INT:
23504     case V4SI_FTYPE_V8SI_INT:
23505     case V4HI_FTYPE_V4HI_INT:
23506     case V4DF_FTYPE_V4DF_INT:
23507     case V4SF_FTYPE_V4SF_INT:
23508     case V4SF_FTYPE_V8SF_INT:
23509     case V2DI_FTYPE_V2DI_INT:
23510     case V2DF_FTYPE_V2DF_INT:
23511     case V2DF_FTYPE_V4DF_INT:
23512       nargs = 2;
23513       nargs_constant = 1;
23514       break;
23515     case V16QI_FTYPE_V16QI_V16QI_V16QI:
23516     case V8SF_FTYPE_V8SF_V8SF_V8SF:
23517     case V4DF_FTYPE_V4DF_V4DF_V4DF:
23518     case V4SF_FTYPE_V4SF_V4SF_V4SF:
23519     case V2DF_FTYPE_V2DF_V2DF_V2DF:
23520       nargs = 3;
23521       break;
23522     case V16QI_FTYPE_V16QI_V16QI_INT:
23523     case V8HI_FTYPE_V8HI_V8HI_INT:
23524     case V8SI_FTYPE_V8SI_V8SI_INT:
23525     case V8SI_FTYPE_V8SI_V4SI_INT:
23526     case V8SF_FTYPE_V8SF_V8SF_INT: 
23527     case V8SF_FTYPE_V8SF_V4SF_INT: 
23528     case V4SI_FTYPE_V4SI_V4SI_INT:
23529     case V4DF_FTYPE_V4DF_V4DF_INT:
23530     case V4DF_FTYPE_V4DF_V2DF_INT:
23531     case V4SF_FTYPE_V4SF_V4SF_INT:
23532     case V2DI_FTYPE_V2DI_V2DI_INT:
23533     case V2DF_FTYPE_V2DF_V2DF_INT:
23534       nargs = 3;
23535       nargs_constant = 1;
23536       break;
23537     case V2DI_FTYPE_V2DI_V2DI_INT_CONVERT:
23538       nargs = 3;
23539       rmode = V2DImode;
23540       nargs_constant = 1;
23541       break;
23542     case V1DI_FTYPE_V1DI_V1DI_INT_CONVERT:
23543       nargs = 3;
23544       rmode = DImode;
23545       nargs_constant = 1;
23546       break;
23547     case V2DI_FTYPE_V2DI_UINT_UINT:
23548       nargs = 3;
23549       nargs_constant = 2;
23550       break;
23551     case V2DI_FTYPE_V2DI_V2DI_UINT_UINT:
23552       nargs = 4;
23553       nargs_constant = 2;
23554       break;
23555     default:
23556       gcc_unreachable ();
23557     }
23558
23559   gcc_assert (nargs <= ARRAY_SIZE (args));
23560
23561   if (comparison != UNKNOWN)
23562     {
23563       gcc_assert (nargs == 2);
23564       return ix86_expand_sse_compare (d, exp, target, swap);
23565     }
23566
23567   if (rmode == VOIDmode || rmode == tmode)
23568     {
23569       if (optimize
23570           || target == 0
23571           || GET_MODE (target) != tmode
23572           || ! (*insn_p->operand[0].predicate) (target, tmode))
23573         target = gen_reg_rtx (tmode);
23574       real_target = target;
23575     }
23576   else
23577     {
23578       target = gen_reg_rtx (rmode);
23579       real_target = simplify_gen_subreg (tmode, target, rmode, 0);
23580     }
23581
23582   for (i = 0; i < nargs; i++)
23583     {
23584       tree arg = CALL_EXPR_ARG (exp, i);
23585       rtx op = expand_normal (arg);
23586       enum machine_mode mode = insn_p->operand[i + 1].mode;
23587       bool match = (*insn_p->operand[i + 1].predicate) (op, mode);
23588
23589       if (last_arg_count && (i + 1) == nargs)
23590         {
23591           /* SIMD shift insns take either an 8-bit immediate or
23592              register as count.  But builtin functions take int as
23593              count.  If count doesn't match, we put it in register.  */
23594           if (!match)
23595             {
23596               op = simplify_gen_subreg (SImode, op, GET_MODE (op), 0);
23597               if (!(*insn_p->operand[i + 1].predicate) (op, mode))
23598                 op = copy_to_reg (op);
23599             }
23600         }
23601       else if ((nargs - i) <= nargs_constant)
23602         {
23603           if (!match)
23604             switch (icode)
23605               {
23606               case CODE_FOR_sse4_1_roundpd:
23607               case CODE_FOR_sse4_1_roundps:
23608               case CODE_FOR_sse4_1_roundsd:
23609               case CODE_FOR_sse4_1_roundss:
23610               case CODE_FOR_sse4_1_blendps:
23611               case CODE_FOR_avx_blendpd256:
23612               case CODE_FOR_avx_vpermilv4df:
23613               case CODE_FOR_avx_roundpd256:
23614               case CODE_FOR_avx_roundps256:
23615                 error ("the last argument must be a 4-bit immediate");
23616                 return const0_rtx;
23617
23618               case CODE_FOR_sse4_1_blendpd:
23619               case CODE_FOR_avx_vpermilv2df:
23620                 error ("the last argument must be a 2-bit immediate");
23621                 return const0_rtx;
23622
23623               case CODE_FOR_avx_vextractf128v4df:
23624               case CODE_FOR_avx_vextractf128v8sf:
23625               case CODE_FOR_avx_vextractf128v8si:
23626               case CODE_FOR_avx_vinsertf128v4df:
23627               case CODE_FOR_avx_vinsertf128v8sf:
23628               case CODE_FOR_avx_vinsertf128v8si:
23629                 error ("the last argument must be a 1-bit immediate");
23630                 return const0_rtx;
23631
23632               case CODE_FOR_avx_cmpsdv2df3:
23633               case CODE_FOR_avx_cmpssv4sf3:
23634               case CODE_FOR_avx_cmppdv2df3:
23635               case CODE_FOR_avx_cmppsv4sf3:
23636               case CODE_FOR_avx_cmppdv4df3:
23637               case CODE_FOR_avx_cmppsv8sf3:
23638                 error ("the last argument must be a 5-bit immediate");
23639                 return const0_rtx;
23640
23641              default:
23642                 switch (nargs_constant)
23643                   {
23644                   case 2:
23645                     if ((nargs - i) == nargs_constant)
23646                       {
23647                         error ("the next to last argument must be an 8-bit immediate");
23648                         break;
23649                       }
23650                   case 1:
23651                     error ("the last argument must be an 8-bit immediate");
23652                     break;
23653                   default:
23654                     gcc_unreachable ();
23655                   }
23656                 return const0_rtx;
23657               }
23658         }
23659       else
23660         {
23661           if (VECTOR_MODE_P (mode))
23662             op = safe_vector_operand (op, mode);
23663
23664           /* If we aren't optimizing, only allow one memory operand to
23665              be generated.  */
23666           if (memory_operand (op, mode))
23667             num_memory++;
23668
23669           if (GET_MODE (op) == mode || GET_MODE (op) == VOIDmode)
23670             {
23671               if (optimize || !match || num_memory > 1)
23672                 op = copy_to_mode_reg (mode, op);
23673             }
23674           else
23675             {
23676               op = copy_to_reg (op);
23677               op = simplify_gen_subreg (mode, op, GET_MODE (op), 0);
23678             }
23679         }
23680
23681       args[i].op = op;
23682       args[i].mode = mode;
23683     }
23684
23685   switch (nargs)
23686     {
23687     case 1:
23688       pat = GEN_FCN (icode) (real_target, args[0].op);
23689       break;
23690     case 2:
23691       pat = GEN_FCN (icode) (real_target, args[0].op, args[1].op);
23692       break;
23693     case 3:
23694       pat = GEN_FCN (icode) (real_target, args[0].op, args[1].op,
23695                              args[2].op);
23696       break;
23697     case 4:
23698       pat = GEN_FCN (icode) (real_target, args[0].op, args[1].op,
23699                              args[2].op, args[3].op);
23700       break;
23701     default:
23702       gcc_unreachable ();
23703     }
23704
23705   if (! pat)
23706     return 0;
23707
23708   emit_insn (pat);
23709   return target;
23710 }
23711
23712 /* Subroutine of ix86_expand_builtin to take care of special insns
23713    with variable number of operands.  */
23714
23715 static rtx
23716 ix86_expand_special_args_builtin (const struct builtin_description *d,
23717                                     tree exp, rtx target)
23718 {
23719   tree arg;
23720   rtx pat, op;
23721   unsigned int i, nargs, arg_adjust, memory;
23722   struct
23723     {
23724       rtx op;
23725       enum machine_mode mode;
23726     } args[3];
23727   enum insn_code icode = d->icode;
23728   bool last_arg_constant = false;
23729   const struct insn_data *insn_p = &insn_data[icode];
23730   enum machine_mode tmode = insn_p->operand[0].mode;
23731   enum { load, store } klass;
23732
23733   switch ((enum ix86_builtin_func_type) d->flag)
23734     {
23735     case VOID_FTYPE_VOID:
23736       emit_insn (GEN_FCN (icode) (target));
23737       return 0;
23738     case UINT64_FTYPE_VOID:
23739       nargs = 0;
23740       klass = load;
23741       memory = 0;
23742       break;
23743     case UINT64_FTYPE_PUNSIGNED:
23744     case V2DI_FTYPE_PV2DI:
23745     case V32QI_FTYPE_PCCHAR:
23746     case V16QI_FTYPE_PCCHAR:
23747     case V8SF_FTYPE_PCV4SF:
23748     case V8SF_FTYPE_PCFLOAT:
23749     case V4SF_FTYPE_PCFLOAT:
23750     case V4DF_FTYPE_PCV2DF:
23751     case V4DF_FTYPE_PCDOUBLE:
23752     case V2DF_FTYPE_PCDOUBLE:
23753     case VOID_FTYPE_PVOID:
23754       nargs = 1;
23755       klass = load;
23756       memory = 0;
23757       break;
23758     case VOID_FTYPE_PV2SF_V4SF:
23759     case VOID_FTYPE_PV4DI_V4DI:
23760     case VOID_FTYPE_PV2DI_V2DI:
23761     case VOID_FTYPE_PCHAR_V32QI:
23762     case VOID_FTYPE_PCHAR_V16QI:
23763     case VOID_FTYPE_PFLOAT_V8SF:
23764     case VOID_FTYPE_PFLOAT_V4SF:
23765     case VOID_FTYPE_PDOUBLE_V4DF:
23766     case VOID_FTYPE_PDOUBLE_V2DF:
23767     case VOID_FTYPE_PULONGLONG_ULONGLONG:
23768     case VOID_FTYPE_PINT_INT:
23769       nargs = 1;
23770       klass = store;
23771       /* Reserve memory operand for target.  */
23772       memory = ARRAY_SIZE (args);
23773       break;
23774     case V4SF_FTYPE_V4SF_PCV2SF:
23775     case V2DF_FTYPE_V2DF_PCDOUBLE:
23776       nargs = 2;
23777       klass = load;
23778       memory = 1;
23779       break;
23780     case V8SF_FTYPE_PCV8SF_V8SF:
23781     case V4DF_FTYPE_PCV4DF_V4DF:
23782     case V4SF_FTYPE_PCV4SF_V4SF:
23783     case V2DF_FTYPE_PCV2DF_V2DF:
23784       nargs = 2;
23785       klass = load;
23786       memory = 0;
23787       break;
23788     case VOID_FTYPE_PV8SF_V8SF_V8SF:
23789     case VOID_FTYPE_PV4DF_V4DF_V4DF:
23790     case VOID_FTYPE_PV4SF_V4SF_V4SF:
23791     case VOID_FTYPE_PV2DF_V2DF_V2DF:
23792       nargs = 2;
23793       klass = store;
23794       /* Reserve memory operand for target.  */
23795       memory = ARRAY_SIZE (args);
23796       break;
23797     case VOID_FTYPE_UINT_UINT_UINT:
23798     case VOID_FTYPE_UINT64_UINT_UINT:
23799     case UCHAR_FTYPE_UINT_UINT_UINT:
23800     case UCHAR_FTYPE_UINT64_UINT_UINT:
23801       nargs = 3;
23802       klass = load;
23803       memory = ARRAY_SIZE (args);
23804       last_arg_constant = true;
23805       break;
23806     default:
23807       gcc_unreachable ();
23808     }
23809
23810   gcc_assert (nargs <= ARRAY_SIZE (args));
23811
23812   if (klass == store)
23813     {
23814       arg = CALL_EXPR_ARG (exp, 0);
23815       op = expand_normal (arg);
23816       gcc_assert (target == 0);
23817       target = gen_rtx_MEM (tmode, copy_to_mode_reg (Pmode, op));
23818       arg_adjust = 1;
23819     }
23820   else
23821     {
23822       arg_adjust = 0;
23823       if (optimize
23824           || target == 0
23825           || GET_MODE (target) != tmode
23826           || ! (*insn_p->operand[0].predicate) (target, tmode))
23827         target = gen_reg_rtx (tmode);
23828     }
23829
23830   for (i = 0; i < nargs; i++)
23831     {
23832       enum machine_mode mode = insn_p->operand[i + 1].mode;
23833       bool match;
23834
23835       arg = CALL_EXPR_ARG (exp, i + arg_adjust);
23836       op = expand_normal (arg);
23837       match = (*insn_p->operand[i + 1].predicate) (op, mode);
23838
23839       if (last_arg_constant && (i + 1) == nargs)
23840         {
23841           if (!match)
23842             {
23843               if (icode == CODE_FOR_lwp_lwpvalsi3
23844                   || icode == CODE_FOR_lwp_lwpinssi3
23845                   || icode == CODE_FOR_lwp_lwpvaldi3
23846                   || icode == CODE_FOR_lwp_lwpinsdi3)
23847                 error ("the last argument must be a 32-bit immediate");
23848               else
23849                 error ("the last argument must be an 8-bit immediate");
23850               return const0_rtx;
23851             }
23852         }
23853       else
23854         {
23855           if (i == memory)
23856             {
23857               /* This must be the memory operand.  */
23858               op = gen_rtx_MEM (mode, copy_to_mode_reg (Pmode, op));
23859               gcc_assert (GET_MODE (op) == mode
23860                           || GET_MODE (op) == VOIDmode);
23861             }
23862           else
23863             {
23864               /* This must be register.  */
23865               if (VECTOR_MODE_P (mode))
23866                 op = safe_vector_operand (op, mode);
23867
23868               gcc_assert (GET_MODE (op) == mode
23869                           || GET_MODE (op) == VOIDmode);
23870               op = copy_to_mode_reg (mode, op);
23871             }
23872         }
23873
23874       args[i].op = op;
23875       args[i].mode = mode;
23876     }
23877
23878   switch (nargs)
23879     {
23880     case 0:
23881       pat = GEN_FCN (icode) (target);
23882       break;
23883     case 1:
23884       pat = GEN_FCN (icode) (target, args[0].op);
23885       break;
23886     case 2:
23887       pat = GEN_FCN (icode) (target, args[0].op, args[1].op);
23888       break;
23889     case 3:
23890       pat = GEN_FCN (icode) (target, args[0].op, args[1].op, args[2].op);
23891       break;
23892     default:
23893       gcc_unreachable ();
23894     }
23895
23896   if (! pat)
23897     return 0;
23898   emit_insn (pat);
23899   return klass == store ? 0 : target;
23900 }
23901
23902 /* Return the integer constant in ARG.  Constrain it to be in the range
23903    of the subparts of VEC_TYPE; issue an error if not.  */
23904
23905 static int
23906 get_element_number (tree vec_type, tree arg)
23907 {
23908   unsigned HOST_WIDE_INT elt, max = TYPE_VECTOR_SUBPARTS (vec_type) - 1;
23909
23910   if (!host_integerp (arg, 1)
23911       || (elt = tree_low_cst (arg, 1), elt > max))
23912     {
23913       error ("selector must be an integer constant in the range 0..%wi", max);
23914       return 0;
23915     }
23916
23917   return elt;
23918 }
23919
23920 /* A subroutine of ix86_expand_builtin.  These builtins are a wrapper around
23921    ix86_expand_vector_init.  We DO have language-level syntax for this, in
23922    the form of  (type){ init-list }.  Except that since we can't place emms
23923    instructions from inside the compiler, we can't allow the use of MMX
23924    registers unless the user explicitly asks for it.  So we do *not* define
23925    vec_set/vec_extract/vec_init patterns for MMX modes in mmx.md.  Instead
23926    we have builtins invoked by mmintrin.h that gives us license to emit
23927    these sorts of instructions.  */
23928
23929 static rtx
23930 ix86_expand_vec_init_builtin (tree type, tree exp, rtx target)
23931 {
23932   enum machine_mode tmode = TYPE_MODE (type);
23933   enum machine_mode inner_mode = GET_MODE_INNER (tmode);
23934   int i, n_elt = GET_MODE_NUNITS (tmode);
23935   rtvec v = rtvec_alloc (n_elt);
23936
23937   gcc_assert (VECTOR_MODE_P (tmode));
23938   gcc_assert (call_expr_nargs (exp) == n_elt);
23939
23940   for (i = 0; i < n_elt; ++i)
23941     {
23942       rtx x = expand_normal (CALL_EXPR_ARG (exp, i));
23943       RTVEC_ELT (v, i) = gen_lowpart (inner_mode, x);
23944     }
23945
23946   if (!target || !register_operand (target, tmode))
23947     target = gen_reg_rtx (tmode);
23948
23949   ix86_expand_vector_init (true, target, gen_rtx_PARALLEL (tmode, v));
23950   return target;
23951 }
23952
23953 /* A subroutine of ix86_expand_builtin.  These builtins are a wrapper around
23954    ix86_expand_vector_extract.  They would be redundant (for non-MMX) if we
23955    had a language-level syntax for referencing vector elements.  */
23956
23957 static rtx
23958 ix86_expand_vec_ext_builtin (tree exp, rtx target)
23959 {
23960   enum machine_mode tmode, mode0;
23961   tree arg0, arg1;
23962   int elt;
23963   rtx op0;
23964
23965   arg0 = CALL_EXPR_ARG (exp, 0);
23966   arg1 = CALL_EXPR_ARG (exp, 1);
23967
23968   op0 = expand_normal (arg0);
23969   elt = get_element_number (TREE_TYPE (arg0), arg1);
23970
23971   tmode = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0)));
23972   mode0 = TYPE_MODE (TREE_TYPE (arg0));
23973   gcc_assert (VECTOR_MODE_P (mode0));
23974
23975   op0 = force_reg (mode0, op0);
23976
23977   if (optimize || !target || !register_operand (target, tmode))
23978     target = gen_reg_rtx (tmode);
23979
23980   ix86_expand_vector_extract (true, target, op0, elt);
23981
23982   return target;
23983 }
23984
23985 /* A subroutine of ix86_expand_builtin.  These builtins are a wrapper around
23986    ix86_expand_vector_set.  They would be redundant (for non-MMX) if we had
23987    a language-level syntax for referencing vector elements.  */
23988
23989 static rtx
23990 ix86_expand_vec_set_builtin (tree exp)
23991 {
23992   enum machine_mode tmode, mode1;
23993   tree arg0, arg1, arg2;
23994   int elt;
23995   rtx op0, op1, target;
23996
23997   arg0 = CALL_EXPR_ARG (exp, 0);
23998   arg1 = CALL_EXPR_ARG (exp, 1);
23999   arg2 = CALL_EXPR_ARG (exp, 2);
24000
24001   tmode = TYPE_MODE (TREE_TYPE (arg0));
24002   mode1 = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0)));
24003   gcc_assert (VECTOR_MODE_P (tmode));
24004
24005   op0 = expand_expr (arg0, NULL_RTX, tmode, EXPAND_NORMAL);
24006   op1 = expand_expr (arg1, NULL_RTX, mode1, EXPAND_NORMAL);
24007   elt = get_element_number (TREE_TYPE (arg0), arg2);
24008
24009   if (GET_MODE (op1) != mode1 && GET_MODE (op1) != VOIDmode)
24010     op1 = convert_modes (mode1, GET_MODE (op1), op1, true);
24011
24012   op0 = force_reg (tmode, op0);
24013   op1 = force_reg (mode1, op1);
24014
24015   /* OP0 is the source of these builtin functions and shouldn't be
24016      modified.  Create a copy, use it and return it as target.  */
24017   target = gen_reg_rtx (tmode);
24018   emit_move_insn (target, op0);
24019   ix86_expand_vector_set (true, target, op1, elt);
24020
24021   return target;
24022 }
24023
24024 /* Expand an expression EXP that calls a built-in function,
24025    with result going to TARGET if that's convenient
24026    (and in mode MODE if that's convenient).
24027    SUBTARGET may be used as the target for computing one of EXP's operands.
24028    IGNORE is nonzero if the value is to be ignored.  */
24029
24030 static rtx
24031 ix86_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
24032                      enum machine_mode mode ATTRIBUTE_UNUSED,
24033                      int ignore ATTRIBUTE_UNUSED)
24034 {
24035   const struct builtin_description *d;
24036   size_t i;
24037   enum insn_code icode;
24038   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
24039   tree arg0, arg1, arg2;
24040   rtx op0, op1, op2, pat;
24041   enum machine_mode mode0, mode1, mode2;
24042   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
24043
24044   /* Determine whether the builtin function is available under the current ISA.
24045      Originally the builtin was not created if it wasn't applicable to the
24046      current ISA based on the command line switches.  With function specific
24047      options, we need to check in the context of the function making the call
24048      whether it is supported.  */
24049   if (ix86_builtins_isa[fcode].isa
24050       && !(ix86_builtins_isa[fcode].isa & ix86_isa_flags))
24051     {
24052       char *opts = ix86_target_string (ix86_builtins_isa[fcode].isa, 0, NULL,
24053                                        NULL, NULL, false);
24054
24055       if (!opts)
24056         error ("%qE needs unknown isa option", fndecl);
24057       else
24058         {
24059           gcc_assert (opts != NULL);
24060           error ("%qE needs isa option %s", fndecl, opts);
24061           free (opts);
24062         }
24063       return const0_rtx;
24064     }
24065
24066   switch (fcode)
24067     {
24068     case IX86_BUILTIN_MASKMOVQ:
24069     case IX86_BUILTIN_MASKMOVDQU:
24070       icode = (fcode == IX86_BUILTIN_MASKMOVQ
24071                ? CODE_FOR_mmx_maskmovq
24072                : CODE_FOR_sse2_maskmovdqu);
24073       /* Note the arg order is different from the operand order.  */
24074       arg1 = CALL_EXPR_ARG (exp, 0);
24075       arg2 = CALL_EXPR_ARG (exp, 1);
24076       arg0 = CALL_EXPR_ARG (exp, 2);
24077       op0 = expand_normal (arg0);
24078       op1 = expand_normal (arg1);
24079       op2 = expand_normal (arg2);
24080       mode0 = insn_data[icode].operand[0].mode;
24081       mode1 = insn_data[icode].operand[1].mode;
24082       mode2 = insn_data[icode].operand[2].mode;
24083
24084       op0 = force_reg (Pmode, op0);
24085       op0 = gen_rtx_MEM (mode1, op0);
24086
24087       if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
24088         op0 = copy_to_mode_reg (mode0, op0);
24089       if (! (*insn_data[icode].operand[1].predicate) (op1, mode1))
24090         op1 = copy_to_mode_reg (mode1, op1);
24091       if (! (*insn_data[icode].operand[2].predicate) (op2, mode2))
24092         op2 = copy_to_mode_reg (mode2, op2);
24093       pat = GEN_FCN (icode) (op0, op1, op2);
24094       if (! pat)
24095         return 0;
24096       emit_insn (pat);
24097       return 0;
24098
24099     case IX86_BUILTIN_LDMXCSR:
24100       op0 = expand_normal (CALL_EXPR_ARG (exp, 0));
24101       target = assign_386_stack_local (SImode, SLOT_VIRTUAL);
24102       emit_move_insn (target, op0);
24103       emit_insn (gen_sse_ldmxcsr (target));
24104       return 0;
24105
24106     case IX86_BUILTIN_STMXCSR:
24107       target = assign_386_stack_local (SImode, SLOT_VIRTUAL);
24108       emit_insn (gen_sse_stmxcsr (target));
24109       return copy_to_mode_reg (SImode, target);
24110
24111     case IX86_BUILTIN_CLFLUSH:
24112         arg0 = CALL_EXPR_ARG (exp, 0);
24113         op0 = expand_normal (arg0);
24114         icode = CODE_FOR_sse2_clflush;
24115         if (! (*insn_data[icode].operand[0].predicate) (op0, Pmode))
24116             op0 = copy_to_mode_reg (Pmode, op0);
24117
24118         emit_insn (gen_sse2_clflush (op0));
24119         return 0;
24120
24121     case IX86_BUILTIN_MONITOR:
24122       arg0 = CALL_EXPR_ARG (exp, 0);
24123       arg1 = CALL_EXPR_ARG (exp, 1);
24124       arg2 = CALL_EXPR_ARG (exp, 2);
24125       op0 = expand_normal (arg0);
24126       op1 = expand_normal (arg1);
24127       op2 = expand_normal (arg2);
24128       if (!REG_P (op0))
24129         op0 = copy_to_mode_reg (Pmode, op0);
24130       if (!REG_P (op1))
24131         op1 = copy_to_mode_reg (SImode, op1);
24132       if (!REG_P (op2))
24133         op2 = copy_to_mode_reg (SImode, op2);
24134       emit_insn ((*ix86_gen_monitor) (op0, op1, op2));
24135       return 0;
24136
24137     case IX86_BUILTIN_MWAIT:
24138       arg0 = CALL_EXPR_ARG (exp, 0);
24139       arg1 = CALL_EXPR_ARG (exp, 1);
24140       op0 = expand_normal (arg0);
24141       op1 = expand_normal (arg1);
24142       if (!REG_P (op0))
24143         op0 = copy_to_mode_reg (SImode, op0);
24144       if (!REG_P (op1))
24145         op1 = copy_to_mode_reg (SImode, op1);
24146       emit_insn (gen_sse3_mwait (op0, op1));
24147       return 0;
24148
24149     case IX86_BUILTIN_VEC_INIT_V2SI:
24150     case IX86_BUILTIN_VEC_INIT_V4HI:
24151     case IX86_BUILTIN_VEC_INIT_V8QI:
24152       return ix86_expand_vec_init_builtin (TREE_TYPE (exp), exp, target);
24153
24154     case IX86_BUILTIN_VEC_EXT_V2DF:
24155     case IX86_BUILTIN_VEC_EXT_V2DI:
24156     case IX86_BUILTIN_VEC_EXT_V4SF:
24157     case IX86_BUILTIN_VEC_EXT_V4SI:
24158     case IX86_BUILTIN_VEC_EXT_V8HI:
24159     case IX86_BUILTIN_VEC_EXT_V2SI:
24160     case IX86_BUILTIN_VEC_EXT_V4HI:
24161     case IX86_BUILTIN_VEC_EXT_V16QI:
24162       return ix86_expand_vec_ext_builtin (exp, target);
24163
24164     case IX86_BUILTIN_VEC_SET_V2DI:
24165     case IX86_BUILTIN_VEC_SET_V4SF:
24166     case IX86_BUILTIN_VEC_SET_V4SI:
24167     case IX86_BUILTIN_VEC_SET_V8HI:
24168     case IX86_BUILTIN_VEC_SET_V4HI:
24169     case IX86_BUILTIN_VEC_SET_V16QI:
24170       return ix86_expand_vec_set_builtin (exp);
24171
24172     case IX86_BUILTIN_VEC_PERM_V2DF:
24173     case IX86_BUILTIN_VEC_PERM_V4SF:
24174     case IX86_BUILTIN_VEC_PERM_V2DI:
24175     case IX86_BUILTIN_VEC_PERM_V4SI:
24176     case IX86_BUILTIN_VEC_PERM_V8HI:
24177     case IX86_BUILTIN_VEC_PERM_V16QI:
24178     case IX86_BUILTIN_VEC_PERM_V2DI_U:
24179     case IX86_BUILTIN_VEC_PERM_V4SI_U:
24180     case IX86_BUILTIN_VEC_PERM_V8HI_U:
24181     case IX86_BUILTIN_VEC_PERM_V16QI_U:
24182     case IX86_BUILTIN_VEC_PERM_V4DF:
24183     case IX86_BUILTIN_VEC_PERM_V8SF:
24184       return ix86_expand_vec_perm_builtin (exp);
24185
24186     case IX86_BUILTIN_INFQ:
24187     case IX86_BUILTIN_HUGE_VALQ:
24188       {
24189         REAL_VALUE_TYPE inf;
24190         rtx tmp;
24191
24192         real_inf (&inf);
24193         tmp = CONST_DOUBLE_FROM_REAL_VALUE (inf, mode);
24194
24195         tmp = validize_mem (force_const_mem (mode, tmp));
24196
24197         if (target == 0)
24198           target = gen_reg_rtx (mode);
24199
24200         emit_move_insn (target, tmp);
24201         return target;
24202       }
24203
24204     case IX86_BUILTIN_LLWPCB:
24205       arg0 = CALL_EXPR_ARG (exp, 0);
24206       op0 = expand_normal (arg0);
24207       icode = CODE_FOR_lwp_llwpcb;
24208       if (! (*insn_data[icode].operand[0].predicate) (op0, Pmode))
24209         op0 = copy_to_mode_reg (Pmode, op0);
24210       emit_insn (gen_lwp_llwpcb (op0));
24211       return 0;
24212
24213     case IX86_BUILTIN_SLWPCB:
24214       icode = CODE_FOR_lwp_slwpcb;
24215       if (!target
24216           || ! (*insn_data[icode].operand[0].predicate) (target, Pmode))
24217         target = gen_reg_rtx (Pmode);
24218       emit_insn (gen_lwp_slwpcb (target));
24219       return target;
24220
24221     default:
24222       break;
24223     }
24224
24225   for (i = 0, d = bdesc_special_args;
24226        i < ARRAY_SIZE (bdesc_special_args);
24227        i++, d++)
24228     if (d->code == fcode)
24229       return ix86_expand_special_args_builtin (d, exp, target);
24230
24231   for (i = 0, d = bdesc_args;
24232        i < ARRAY_SIZE (bdesc_args);
24233        i++, d++)
24234     if (d->code == fcode)
24235       switch (fcode)
24236         {
24237         case IX86_BUILTIN_FABSQ:
24238         case IX86_BUILTIN_COPYSIGNQ:
24239           if (!TARGET_SSE2)
24240             /* Emit a normal call if SSE2 isn't available.  */
24241             return expand_call (exp, target, ignore);
24242         default:
24243           return ix86_expand_args_builtin (d, exp, target);
24244         }
24245
24246   for (i = 0, d = bdesc_comi; i < ARRAY_SIZE (bdesc_comi); i++, d++)
24247     if (d->code == fcode)
24248       return ix86_expand_sse_comi (d, exp, target);
24249
24250   for (i = 0, d = bdesc_pcmpestr;
24251        i < ARRAY_SIZE (bdesc_pcmpestr);
24252        i++, d++)
24253     if (d->code == fcode)
24254       return ix86_expand_sse_pcmpestr (d, exp, target);
24255
24256   for (i = 0, d = bdesc_pcmpistr;
24257        i < ARRAY_SIZE (bdesc_pcmpistr);
24258        i++, d++)
24259     if (d->code == fcode)
24260       return ix86_expand_sse_pcmpistr (d, exp, target);
24261
24262   for (i = 0, d = bdesc_multi_arg; i < ARRAY_SIZE (bdesc_multi_arg); i++, d++)
24263     if (d->code == fcode)
24264       return ix86_expand_multi_arg_builtin (d->icode, exp, target,
24265                                             (enum ix86_builtin_func_type)
24266                                             d->flag, d->comparison);
24267
24268   gcc_unreachable ();
24269 }
24270
24271 /* Returns a function decl for a vectorized version of the builtin function
24272    with builtin function code FN and the result vector type TYPE, or NULL_TREE
24273    if it is not available.  */
24274
24275 static tree
24276 ix86_builtin_vectorized_function (unsigned int fn, tree type_out,
24277                                   tree type_in)
24278 {
24279   enum machine_mode in_mode, out_mode;
24280   int in_n, out_n;
24281
24282   if (TREE_CODE (type_out) != VECTOR_TYPE
24283       || TREE_CODE (type_in) != VECTOR_TYPE)
24284     return NULL_TREE;
24285
24286   out_mode = TYPE_MODE (TREE_TYPE (type_out));
24287   out_n = TYPE_VECTOR_SUBPARTS (type_out);
24288   in_mode = TYPE_MODE (TREE_TYPE (type_in));
24289   in_n = TYPE_VECTOR_SUBPARTS (type_in);
24290
24291   switch (fn)
24292     {
24293     case BUILT_IN_SQRT:
24294       if (out_mode == DFmode && out_n == 2
24295           && in_mode == DFmode && in_n == 2)
24296         return ix86_builtins[IX86_BUILTIN_SQRTPD];
24297       break;
24298
24299     case BUILT_IN_SQRTF:
24300       if (out_mode == SFmode && out_n == 4
24301           && in_mode == SFmode && in_n == 4)
24302         return ix86_builtins[IX86_BUILTIN_SQRTPS_NR];
24303       break;
24304
24305     case BUILT_IN_LRINT:
24306       if (out_mode == SImode && out_n == 4
24307           && in_mode == DFmode && in_n == 2)
24308         return ix86_builtins[IX86_BUILTIN_VEC_PACK_SFIX];
24309       break;
24310
24311     case BUILT_IN_LRINTF:
24312       if (out_mode == SImode && out_n == 4
24313           && in_mode == SFmode && in_n == 4)
24314         return ix86_builtins[IX86_BUILTIN_CVTPS2DQ];
24315       break;
24316
24317     case BUILT_IN_COPYSIGN:
24318       if (out_mode == DFmode && out_n == 2
24319           && in_mode == DFmode && in_n == 2)
24320         return ix86_builtins[IX86_BUILTIN_CPYSGNPD];
24321       break;
24322
24323     case BUILT_IN_COPYSIGNF:
24324       if (out_mode == SFmode && out_n == 4
24325           && in_mode == SFmode && in_n == 4)
24326         return ix86_builtins[IX86_BUILTIN_CPYSGNPS];
24327       break;
24328
24329     default:
24330       ;
24331     }
24332
24333   /* Dispatch to a handler for a vectorization library.  */
24334   if (ix86_veclib_handler)
24335     return (*ix86_veclib_handler) ((enum built_in_function) fn, type_out,
24336                                    type_in);
24337
24338   return NULL_TREE;
24339 }
24340
24341 /* Handler for an SVML-style interface to
24342    a library with vectorized intrinsics.  */
24343
24344 static tree
24345 ix86_veclibabi_svml (enum built_in_function fn, tree type_out, tree type_in)
24346 {
24347   char name[20];
24348   tree fntype, new_fndecl, args;
24349   unsigned arity;
24350   const char *bname;
24351   enum machine_mode el_mode, in_mode;
24352   int n, in_n;
24353
24354   /* The SVML is suitable for unsafe math only.  */
24355   if (!flag_unsafe_math_optimizations)
24356     return NULL_TREE;
24357
24358   el_mode = TYPE_MODE (TREE_TYPE (type_out));
24359   n = TYPE_VECTOR_SUBPARTS (type_out);
24360   in_mode = TYPE_MODE (TREE_TYPE (type_in));
24361   in_n = TYPE_VECTOR_SUBPARTS (type_in);
24362   if (el_mode != in_mode
24363       || n != in_n)
24364     return NULL_TREE;
24365
24366   switch (fn)
24367     {
24368     case BUILT_IN_EXP:
24369     case BUILT_IN_LOG:
24370     case BUILT_IN_LOG10:
24371     case BUILT_IN_POW:
24372     case BUILT_IN_TANH:
24373     case BUILT_IN_TAN:
24374     case BUILT_IN_ATAN:
24375     case BUILT_IN_ATAN2:
24376     case BUILT_IN_ATANH:
24377     case BUILT_IN_CBRT:
24378     case BUILT_IN_SINH:
24379     case BUILT_IN_SIN:
24380     case BUILT_IN_ASINH:
24381     case BUILT_IN_ASIN:
24382     case BUILT_IN_COSH:
24383     case BUILT_IN_COS:
24384     case BUILT_IN_ACOSH:
24385     case BUILT_IN_ACOS:
24386       if (el_mode != DFmode || n != 2)
24387         return NULL_TREE;
24388       break;
24389
24390     case BUILT_IN_EXPF:
24391     case BUILT_IN_LOGF:
24392     case BUILT_IN_LOG10F:
24393     case BUILT_IN_POWF:
24394     case BUILT_IN_TANHF:
24395     case BUILT_IN_TANF:
24396     case BUILT_IN_ATANF:
24397     case BUILT_IN_ATAN2F:
24398     case BUILT_IN_ATANHF:
24399     case BUILT_IN_CBRTF:
24400     case BUILT_IN_SINHF:
24401     case BUILT_IN_SINF:
24402     case BUILT_IN_ASINHF:
24403     case BUILT_IN_ASINF:
24404     case BUILT_IN_COSHF:
24405     case BUILT_IN_COSF:
24406     case BUILT_IN_ACOSHF:
24407     case BUILT_IN_ACOSF:
24408       if (el_mode != SFmode || n != 4)
24409         return NULL_TREE;
24410       break;
24411
24412     default:
24413       return NULL_TREE;
24414     }
24415
24416   bname = IDENTIFIER_POINTER (DECL_NAME (implicit_built_in_decls[fn]));
24417
24418   if (fn == BUILT_IN_LOGF)
24419     strcpy (name, "vmlsLn4");
24420   else if (fn == BUILT_IN_LOG)
24421     strcpy (name, "vmldLn2");
24422   else if (n == 4)
24423     {
24424       sprintf (name, "vmls%s", bname+10);
24425       name[strlen (name)-1] = '4';
24426     }
24427   else
24428     sprintf (name, "vmld%s2", bname+10);
24429
24430   /* Convert to uppercase. */
24431   name[4] &= ~0x20;
24432
24433   arity = 0;
24434   for (args = DECL_ARGUMENTS (implicit_built_in_decls[fn]); args;
24435        args = TREE_CHAIN (args))
24436     arity++;
24437
24438   if (arity == 1)
24439     fntype = build_function_type_list (type_out, type_in, NULL);
24440   else
24441     fntype = build_function_type_list (type_out, type_in, type_in, NULL);
24442
24443   /* Build a function declaration for the vectorized function.  */
24444   new_fndecl = build_decl (BUILTINS_LOCATION,
24445                            FUNCTION_DECL, get_identifier (name), fntype);
24446   TREE_PUBLIC (new_fndecl) = 1;
24447   DECL_EXTERNAL (new_fndecl) = 1;
24448   DECL_IS_NOVOPS (new_fndecl) = 1;
24449   TREE_READONLY (new_fndecl) = 1;
24450
24451   return new_fndecl;
24452 }
24453
24454 /* Handler for an ACML-style interface to
24455    a library with vectorized intrinsics.  */
24456
24457 static tree
24458 ix86_veclibabi_acml (enum built_in_function fn, tree type_out, tree type_in)
24459 {
24460   char name[20] = "__vr.._";
24461   tree fntype, new_fndecl, args;
24462   unsigned arity;
24463   const char *bname;
24464   enum machine_mode el_mode, in_mode;
24465   int n, in_n;
24466
24467   /* The ACML is 64bits only and suitable for unsafe math only as
24468      it does not correctly support parts of IEEE with the required
24469      precision such as denormals.  */
24470   if (!TARGET_64BIT
24471       || !flag_unsafe_math_optimizations)
24472     return NULL_TREE;
24473
24474   el_mode = TYPE_MODE (TREE_TYPE (type_out));
24475   n = TYPE_VECTOR_SUBPARTS (type_out);
24476   in_mode = TYPE_MODE (TREE_TYPE (type_in));
24477   in_n = TYPE_VECTOR_SUBPARTS (type_in);
24478   if (el_mode != in_mode
24479       || n != in_n)
24480     return NULL_TREE;
24481
24482   switch (fn)
24483     {
24484     case BUILT_IN_SIN:
24485     case BUILT_IN_COS:
24486     case BUILT_IN_EXP:
24487     case BUILT_IN_LOG:
24488     case BUILT_IN_LOG2:
24489     case BUILT_IN_LOG10:
24490       name[4] = 'd';
24491       name[5] = '2';
24492       if (el_mode != DFmode
24493           || n != 2)
24494         return NULL_TREE;
24495       break;
24496
24497     case BUILT_IN_SINF:
24498     case BUILT_IN_COSF:
24499     case BUILT_IN_EXPF:
24500     case BUILT_IN_POWF:
24501     case BUILT_IN_LOGF:
24502     case BUILT_IN_LOG2F:
24503     case BUILT_IN_LOG10F:
24504       name[4] = 's';
24505       name[5] = '4';
24506       if (el_mode != SFmode
24507           || n != 4)
24508         return NULL_TREE;
24509       break;
24510
24511     default:
24512       return NULL_TREE;
24513     }
24514
24515   bname = IDENTIFIER_POINTER (DECL_NAME (implicit_built_in_decls[fn]));
24516   sprintf (name + 7, "%s", bname+10);
24517
24518   arity = 0;
24519   for (args = DECL_ARGUMENTS (implicit_built_in_decls[fn]); args;
24520        args = TREE_CHAIN (args))
24521     arity++;
24522
24523   if (arity == 1)
24524     fntype = build_function_type_list (type_out, type_in, NULL);
24525   else
24526     fntype = build_function_type_list (type_out, type_in, type_in, NULL);
24527
24528   /* Build a function declaration for the vectorized function.  */
24529   new_fndecl = build_decl (BUILTINS_LOCATION,
24530                            FUNCTION_DECL, get_identifier (name), fntype);
24531   TREE_PUBLIC (new_fndecl) = 1;
24532   DECL_EXTERNAL (new_fndecl) = 1;
24533   DECL_IS_NOVOPS (new_fndecl) = 1;
24534   TREE_READONLY (new_fndecl) = 1;
24535
24536   return new_fndecl;
24537 }
24538
24539
24540 /* Returns a decl of a function that implements conversion of an integer vector
24541    into a floating-point vector, or vice-versa. TYPE is the type of the integer
24542    side of the conversion.
24543    Return NULL_TREE if it is not available.  */
24544
24545 static tree
24546 ix86_vectorize_builtin_conversion (unsigned int code, tree type)
24547 {
24548   if (! (TARGET_SSE2 && TREE_CODE (type) == VECTOR_TYPE))
24549     return NULL_TREE;
24550
24551   switch (code)
24552     {
24553     case FLOAT_EXPR:
24554       switch (TYPE_MODE (type))
24555         {
24556         case V4SImode:
24557           return TYPE_UNSIGNED (type)
24558             ? ix86_builtins[IX86_BUILTIN_CVTUDQ2PS]
24559             : ix86_builtins[IX86_BUILTIN_CVTDQ2PS];
24560         default:
24561           return NULL_TREE;
24562         }
24563
24564     case FIX_TRUNC_EXPR:
24565       switch (TYPE_MODE (type))
24566         {
24567         case V4SImode:
24568           return TYPE_UNSIGNED (type)
24569             ? NULL_TREE
24570             : ix86_builtins[IX86_BUILTIN_CVTTPS2DQ];
24571         default:
24572           return NULL_TREE;
24573         }
24574     default:
24575       return NULL_TREE;
24576
24577     }
24578 }
24579
24580 /* Returns a code for a target-specific builtin that implements
24581    reciprocal of the function, or NULL_TREE if not available.  */
24582
24583 static tree
24584 ix86_builtin_reciprocal (unsigned int fn, bool md_fn,
24585                          bool sqrt ATTRIBUTE_UNUSED)
24586 {
24587   if (! (TARGET_SSE_MATH && !optimize_insn_for_size_p ()
24588          && flag_finite_math_only && !flag_trapping_math
24589          && flag_unsafe_math_optimizations))
24590     return NULL_TREE;
24591
24592   if (md_fn)
24593     /* Machine dependent builtins.  */
24594     switch (fn)
24595       {
24596         /* Vectorized version of sqrt to rsqrt conversion.  */
24597       case IX86_BUILTIN_SQRTPS_NR:
24598         return ix86_builtins[IX86_BUILTIN_RSQRTPS_NR];
24599
24600       default:
24601         return NULL_TREE;
24602       }
24603   else
24604     /* Normal builtins.  */
24605     switch (fn)
24606       {
24607         /* Sqrt to rsqrt conversion.  */
24608       case BUILT_IN_SQRTF:
24609         return ix86_builtins[IX86_BUILTIN_RSQRTF];
24610
24611       default:
24612         return NULL_TREE;
24613       }
24614 }
24615 \f
24616 /* Helper for avx_vpermilps256_operand et al.  This is also used by
24617    the expansion functions to turn the parallel back into a mask.
24618    The return value is 0 for no match and the imm8+1 for a match.  */
24619
24620 int
24621 avx_vpermilp_parallel (rtx par, enum machine_mode mode)
24622 {
24623   unsigned i, nelt = GET_MODE_NUNITS (mode);
24624   unsigned mask = 0;
24625   unsigned char ipar[8];
24626
24627   if (XVECLEN (par, 0) != (int) nelt)
24628     return 0;
24629
24630   /* Validate that all of the elements are constants, and not totally
24631      out of range.  Copy the data into an integral array to make the
24632      subsequent checks easier.  */
24633   for (i = 0; i < nelt; ++i)
24634     {
24635       rtx er = XVECEXP (par, 0, i);
24636       unsigned HOST_WIDE_INT ei;
24637
24638       if (!CONST_INT_P (er))
24639         return 0;
24640       ei = INTVAL (er);
24641       if (ei >= 2 * nelt)
24642         return 0;
24643       ipar[i] = ei;
24644     }
24645
24646   switch (mode)
24647     {
24648     case V4DFmode:
24649       /* In the 256-bit DFmode case, we can only move elements within
24650          a 128-bit lane.  */
24651       for (i = 0; i < 2; ++i)
24652         {
24653           if (ipar[i] >= 2)
24654             return 0;
24655           mask |= ipar[i] << i;
24656         }
24657       for (i = 2; i < 4; ++i)
24658         {
24659           if (ipar[i] < 2)
24660             return 0;
24661           mask |= (ipar[i] - 2) << i;
24662         }
24663       break;
24664
24665     case V8SFmode:
24666       /* In the 256-bit SFmode case, we have full freedom of movement
24667          within the low 128-bit lane, but the high 128-bit lane must
24668          mirror the exact same pattern.  */
24669       for (i = 0; i < 4; ++i)
24670         if (ipar[i] + 4 != ipar[i + 4])
24671           return 0;
24672       nelt = 4;
24673       /* FALLTHRU */
24674
24675     case V2DFmode:
24676     case V4SFmode:
24677       /* In the 128-bit case, we've full freedom in the placement of
24678          the elements from the source operand.  */
24679       for (i = 0; i < nelt; ++i)
24680         mask |= ipar[i] << (i * (nelt / 2));
24681       break;
24682
24683     default:
24684       gcc_unreachable ();
24685     }
24686
24687   /* Make sure success has a non-zero value by adding one.  */
24688   return mask + 1;
24689 }
24690
24691 /* Helper for avx_vperm2f128_v4df_operand et al.  This is also used by
24692    the expansion functions to turn the parallel back into a mask.
24693    The return value is 0 for no match and the imm8+1 for a match.  */
24694
24695 int
24696 avx_vperm2f128_parallel (rtx par, enum machine_mode mode)
24697 {
24698   unsigned i, nelt = GET_MODE_NUNITS (mode), nelt2 = nelt / 2;
24699   unsigned mask = 0;
24700   unsigned char ipar[8];
24701
24702   if (XVECLEN (par, 0) != (int) nelt)
24703     return 0;
24704
24705   /* Validate that all of the elements are constants, and not totally
24706      out of range.  Copy the data into an integral array to make the
24707      subsequent checks easier.  */
24708   for (i = 0; i < nelt; ++i)
24709     {
24710       rtx er = XVECEXP (par, 0, i);
24711       unsigned HOST_WIDE_INT ei;
24712
24713       if (!CONST_INT_P (er))
24714         return 0;
24715       ei = INTVAL (er);
24716       if (ei >= 2 * nelt)
24717         return 0;
24718       ipar[i] = ei;
24719     }
24720
24721   /* Validate that the halves of the permute are halves.  */
24722   for (i = 0; i < nelt2 - 1; ++i)
24723     if (ipar[i] + 1 != ipar[i + 1])
24724       return 0;
24725   for (i = nelt2; i < nelt - 1; ++i)
24726     if (ipar[i] + 1 != ipar[i + 1])
24727       return 0;
24728
24729   /* Reconstruct the mask.  */
24730   for (i = 0; i < 2; ++i)
24731     {
24732       unsigned e = ipar[i * nelt2];
24733       if (e % nelt2)
24734         return 0;
24735       e /= nelt2;
24736       mask |= e << (i * 4);
24737     }
24738
24739   /* Make sure success has a non-zero value by adding one.  */
24740   return mask + 1;
24741 }
24742 \f
24743
24744 /* Store OPERAND to the memory after reload is completed.  This means
24745    that we can't easily use assign_stack_local.  */
24746 rtx
24747 ix86_force_to_memory (enum machine_mode mode, rtx operand)
24748 {
24749   rtx result;
24750
24751   gcc_assert (reload_completed);
24752   if (!TARGET_64BIT_MS_ABI && TARGET_RED_ZONE)
24753     {
24754       result = gen_rtx_MEM (mode,
24755                             gen_rtx_PLUS (Pmode,
24756                                           stack_pointer_rtx,
24757                                           GEN_INT (-RED_ZONE_SIZE)));
24758       emit_move_insn (result, operand);
24759     }
24760   else if ((TARGET_64BIT_MS_ABI || !TARGET_RED_ZONE) && TARGET_64BIT)
24761     {
24762       switch (mode)
24763         {
24764         case HImode:
24765         case SImode:
24766           operand = gen_lowpart (DImode, operand);
24767           /* FALLTHRU */
24768         case DImode:
24769           emit_insn (
24770                       gen_rtx_SET (VOIDmode,
24771                                    gen_rtx_MEM (DImode,
24772                                                 gen_rtx_PRE_DEC (DImode,
24773                                                         stack_pointer_rtx)),
24774                                    operand));
24775           break;
24776         default:
24777           gcc_unreachable ();
24778         }
24779       result = gen_rtx_MEM (mode, stack_pointer_rtx);
24780     }
24781   else
24782     {
24783       switch (mode)
24784         {
24785         case DImode:
24786           {
24787             rtx operands[2];
24788             split_di (&operand, 1, operands, operands + 1);
24789             emit_insn (
24790                         gen_rtx_SET (VOIDmode,
24791                                      gen_rtx_MEM (SImode,
24792                                                   gen_rtx_PRE_DEC (Pmode,
24793                                                         stack_pointer_rtx)),
24794                                      operands[1]));
24795             emit_insn (
24796                         gen_rtx_SET (VOIDmode,
24797                                      gen_rtx_MEM (SImode,
24798                                                   gen_rtx_PRE_DEC (Pmode,
24799                                                         stack_pointer_rtx)),
24800                                      operands[0]));
24801           }
24802           break;
24803         case HImode:
24804           /* Store HImodes as SImodes.  */
24805           operand = gen_lowpart (SImode, operand);
24806           /* FALLTHRU */
24807         case SImode:
24808           emit_insn (
24809                       gen_rtx_SET (VOIDmode,
24810                                    gen_rtx_MEM (GET_MODE (operand),
24811                                                 gen_rtx_PRE_DEC (SImode,
24812                                                         stack_pointer_rtx)),
24813                                    operand));
24814           break;
24815         default:
24816           gcc_unreachable ();
24817         }
24818       result = gen_rtx_MEM (mode, stack_pointer_rtx);
24819     }
24820   return result;
24821 }
24822
24823 /* Free operand from the memory.  */
24824 void
24825 ix86_free_from_memory (enum machine_mode mode)
24826 {
24827   if (!TARGET_RED_ZONE || TARGET_64BIT_MS_ABI)
24828     {
24829       int size;
24830
24831       if (mode == DImode || TARGET_64BIT)
24832         size = 8;
24833       else
24834         size = 4;
24835       /* Use LEA to deallocate stack space.  In peephole2 it will be converted
24836          to pop or add instruction if registers are available.  */
24837       emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
24838                               gen_rtx_PLUS (Pmode, stack_pointer_rtx,
24839                                             GEN_INT (size))));
24840     }
24841 }
24842
24843 /* Implement TARGET_IRA_COVER_CLASSES.  If -mfpmath=sse, we prefer
24844    SSE_REGS to FLOAT_REGS if their costs for a pseudo are the
24845    same.  */
24846 static const enum reg_class *
24847 i386_ira_cover_classes (void)
24848 {
24849   static const enum reg_class sse_fpmath_classes[] = {
24850     GENERAL_REGS, SSE_REGS, MMX_REGS, FLOAT_REGS, LIM_REG_CLASSES
24851   };
24852   static const enum reg_class no_sse_fpmath_classes[] = {
24853     GENERAL_REGS, FLOAT_REGS, MMX_REGS, SSE_REGS, LIM_REG_CLASSES
24854   };
24855
24856  return TARGET_SSE_MATH ? sse_fpmath_classes : no_sse_fpmath_classes;
24857 }
24858
24859 /* Put float CONST_DOUBLE in the constant pool instead of fp regs.
24860    QImode must go into class Q_REGS.
24861    Narrow ALL_REGS to GENERAL_REGS.  This supports allowing movsf and
24862    movdf to do mem-to-mem moves through integer regs.  */
24863 enum reg_class
24864 ix86_preferred_reload_class (rtx x, enum reg_class regclass)
24865 {
24866   enum machine_mode mode = GET_MODE (x);
24867
24868   /* We're only allowed to return a subclass of CLASS.  Many of the
24869      following checks fail for NO_REGS, so eliminate that early.  */
24870   if (regclass == NO_REGS)
24871     return NO_REGS;
24872
24873   /* All classes can load zeros.  */
24874   if (x == CONST0_RTX (mode))
24875     return regclass;
24876
24877   /* Force constants into memory if we are loading a (nonzero) constant into
24878      an MMX or SSE register.  This is because there are no MMX/SSE instructions
24879      to load from a constant.  */
24880   if (CONSTANT_P (x)
24881       && (MAYBE_MMX_CLASS_P (regclass) || MAYBE_SSE_CLASS_P (regclass)))
24882     return NO_REGS;
24883
24884   /* Prefer SSE regs only, if we can use them for math.  */
24885   if (TARGET_SSE_MATH && !TARGET_MIX_SSE_I387 && SSE_FLOAT_MODE_P (mode))
24886     return SSE_CLASS_P (regclass) ? regclass : NO_REGS;
24887
24888   /* Floating-point constants need more complex checks.  */
24889   if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) != VOIDmode)
24890     {
24891       /* General regs can load everything.  */
24892       if (reg_class_subset_p (regclass, GENERAL_REGS))
24893         return regclass;
24894
24895       /* Floats can load 0 and 1 plus some others.  Note that we eliminated
24896          zero above.  We only want to wind up preferring 80387 registers if
24897          we plan on doing computation with them.  */
24898       if (TARGET_80387
24899           && standard_80387_constant_p (x))
24900         {
24901           /* Limit class to non-sse.  */
24902           if (regclass == FLOAT_SSE_REGS)
24903             return FLOAT_REGS;
24904           if (regclass == FP_TOP_SSE_REGS)
24905             return FP_TOP_REG;
24906           if (regclass == FP_SECOND_SSE_REGS)
24907             return FP_SECOND_REG;
24908           if (regclass == FLOAT_INT_REGS || regclass == FLOAT_REGS)
24909             return regclass;
24910         }
24911
24912       return NO_REGS;
24913     }
24914
24915   /* Generally when we see PLUS here, it's the function invariant
24916      (plus soft-fp const_int).  Which can only be computed into general
24917      regs.  */
24918   if (GET_CODE (x) == PLUS)
24919     return reg_class_subset_p (regclass, GENERAL_REGS) ? regclass : NO_REGS;
24920
24921   /* QImode constants are easy to load, but non-constant QImode data
24922      must go into Q_REGS.  */
24923   if (GET_MODE (x) == QImode && !CONSTANT_P (x))
24924     {
24925       if (reg_class_subset_p (regclass, Q_REGS))
24926         return regclass;
24927       if (reg_class_subset_p (Q_REGS, regclass))
24928         return Q_REGS;
24929       return NO_REGS;
24930     }
24931
24932   return regclass;
24933 }
24934
24935 /* Discourage putting floating-point values in SSE registers unless
24936    SSE math is being used, and likewise for the 387 registers.  */
24937 enum reg_class
24938 ix86_preferred_output_reload_class (rtx x, enum reg_class regclass)
24939 {
24940   enum machine_mode mode = GET_MODE (x);
24941
24942   /* Restrict the output reload class to the register bank that we are doing
24943      math on.  If we would like not to return a subset of CLASS, reject this
24944      alternative: if reload cannot do this, it will still use its choice.  */
24945   mode = GET_MODE (x);
24946   if (TARGET_SSE_MATH && SSE_FLOAT_MODE_P (mode))
24947     return MAYBE_SSE_CLASS_P (regclass) ? SSE_REGS : NO_REGS;
24948
24949   if (X87_FLOAT_MODE_P (mode))
24950     {
24951       if (regclass == FP_TOP_SSE_REGS)
24952         return FP_TOP_REG;
24953       else if (regclass == FP_SECOND_SSE_REGS)
24954         return FP_SECOND_REG;
24955       else
24956         return FLOAT_CLASS_P (regclass) ? regclass : NO_REGS;
24957     }
24958
24959   return regclass;
24960 }
24961
24962 static enum reg_class
24963 ix86_secondary_reload (bool in_p, rtx x, enum reg_class rclass,
24964                        enum machine_mode mode,
24965                        secondary_reload_info *sri ATTRIBUTE_UNUSED)
24966 {
24967   /* QImode spills from non-QI registers require
24968      intermediate register on 32bit targets.  */
24969   if (!in_p && mode == QImode && !TARGET_64BIT
24970       && (rclass == GENERAL_REGS
24971           || rclass == LEGACY_REGS
24972           || rclass == INDEX_REGS))
24973     {
24974       int regno;
24975
24976       if (REG_P (x))
24977         regno = REGNO (x);
24978       else
24979         regno = -1;
24980
24981       if (regno >= FIRST_PSEUDO_REGISTER || GET_CODE (x) == SUBREG)
24982         regno = true_regnum (x);
24983
24984       /* Return Q_REGS if the operand is in memory.  */
24985       if (regno == -1)
24986         return Q_REGS;
24987     }
24988
24989   return NO_REGS;
24990 }
24991
24992 /* If we are copying between general and FP registers, we need a memory
24993    location. The same is true for SSE and MMX registers.
24994
24995    To optimize register_move_cost performance, allow inline variant.
24996
24997    The macro can't work reliably when one of the CLASSES is class containing
24998    registers from multiple units (SSE, MMX, integer).  We avoid this by never
24999    combining those units in single alternative in the machine description.
25000    Ensure that this constraint holds to avoid unexpected surprises.
25001
25002    When STRICT is false, we are being called from REGISTER_MOVE_COST, so do not
25003    enforce these sanity checks.  */
25004
25005 static inline int
25006 inline_secondary_memory_needed (enum reg_class class1, enum reg_class class2,
25007                               enum machine_mode mode, int strict)
25008 {
25009   if (MAYBE_FLOAT_CLASS_P (class1) != FLOAT_CLASS_P (class1)
25010       || MAYBE_FLOAT_CLASS_P (class2) != FLOAT_CLASS_P (class2)
25011       || MAYBE_SSE_CLASS_P (class1) != SSE_CLASS_P (class1)
25012       || MAYBE_SSE_CLASS_P (class2) != SSE_CLASS_P (class2)
25013       || MAYBE_MMX_CLASS_P (class1) != MMX_CLASS_P (class1)
25014       || MAYBE_MMX_CLASS_P (class2) != MMX_CLASS_P (class2))
25015     {
25016       gcc_assert (!strict);
25017       return true;
25018     }
25019
25020   if (FLOAT_CLASS_P (class1) != FLOAT_CLASS_P (class2))
25021     return true;
25022
25023   /* ??? This is a lie.  We do have moves between mmx/general, and for
25024      mmx/sse2.  But by saying we need secondary memory we discourage the
25025      register allocator from using the mmx registers unless needed.  */
25026   if (MMX_CLASS_P (class1) != MMX_CLASS_P (class2))
25027     return true;
25028
25029   if (SSE_CLASS_P (class1) != SSE_CLASS_P (class2))
25030     {
25031       /* SSE1 doesn't have any direct moves from other classes.  */
25032       if (!TARGET_SSE2)
25033         return true;
25034
25035       /* If the target says that inter-unit moves are more expensive
25036          than moving through memory, then don't generate them.  */
25037       if (!TARGET_INTER_UNIT_MOVES)
25038         return true;
25039
25040       /* Between SSE and general, we have moves no larger than word size.  */
25041       if (GET_MODE_SIZE (mode) > UNITS_PER_WORD)
25042         return true;
25043     }
25044
25045   return false;
25046 }
25047
25048 int
25049 ix86_secondary_memory_needed (enum reg_class class1, enum reg_class class2,
25050                               enum machine_mode mode, int strict)
25051 {
25052   return inline_secondary_memory_needed (class1, class2, mode, strict);
25053 }
25054
25055 /* Return true if the registers in CLASS cannot represent the change from
25056    modes FROM to TO.  */
25057
25058 bool
25059 ix86_cannot_change_mode_class (enum machine_mode from, enum machine_mode to,
25060                                enum reg_class regclass)
25061 {
25062   if (from == to)
25063     return false;
25064
25065   /* x87 registers can't do subreg at all, as all values are reformatted
25066      to extended precision.  */
25067   if (MAYBE_FLOAT_CLASS_P (regclass))
25068     return true;
25069
25070   if (MAYBE_SSE_CLASS_P (regclass) || MAYBE_MMX_CLASS_P (regclass))
25071     {
25072       /* Vector registers do not support QI or HImode loads.  If we don't
25073          disallow a change to these modes, reload will assume it's ok to
25074          drop the subreg from (subreg:SI (reg:HI 100) 0).  This affects
25075          the vec_dupv4hi pattern.  */
25076       if (GET_MODE_SIZE (from) < 4)
25077         return true;
25078
25079       /* Vector registers do not support subreg with nonzero offsets, which
25080          are otherwise valid for integer registers.  Since we can't see
25081          whether we have a nonzero offset from here, prohibit all
25082          nonparadoxical subregs changing size.  */
25083       if (GET_MODE_SIZE (to) < GET_MODE_SIZE (from))
25084         return true;
25085     }
25086
25087   return false;
25088 }
25089
25090 /* Return the cost of moving data of mode M between a
25091    register and memory.  A value of 2 is the default; this cost is
25092    relative to those in `REGISTER_MOVE_COST'.
25093
25094    This function is used extensively by register_move_cost that is used to
25095    build tables at startup.  Make it inline in this case.
25096    When IN is 2, return maximum of in and out move cost.
25097
25098    If moving between registers and memory is more expensive than
25099    between two registers, you should define this macro to express the
25100    relative cost.
25101
25102    Model also increased moving costs of QImode registers in non
25103    Q_REGS classes.
25104  */
25105 static inline int
25106 inline_memory_move_cost (enum machine_mode mode, enum reg_class regclass,
25107                          int in)
25108 {
25109   int cost;
25110   if (FLOAT_CLASS_P (regclass))
25111     {
25112       int index;
25113       switch (mode)
25114         {
25115           case SFmode:
25116             index = 0;
25117             break;
25118           case DFmode:
25119             index = 1;
25120             break;
25121           case XFmode:
25122             index = 2;
25123             break;
25124           default:
25125             return 100;
25126         }
25127       if (in == 2)
25128         return MAX (ix86_cost->fp_load [index], ix86_cost->fp_store [index]);
25129       return in ? ix86_cost->fp_load [index] : ix86_cost->fp_store [index];
25130     }
25131   if (SSE_CLASS_P (regclass))
25132     {
25133       int index;
25134       switch (GET_MODE_SIZE (mode))
25135         {
25136           case 4:
25137             index = 0;
25138             break;
25139           case 8:
25140             index = 1;
25141             break;
25142           case 16:
25143             index = 2;
25144             break;
25145           default:
25146             return 100;
25147         }
25148       if (in == 2)
25149         return MAX (ix86_cost->sse_load [index], ix86_cost->sse_store [index]);
25150       return in ? ix86_cost->sse_load [index] : ix86_cost->sse_store [index];
25151     }
25152   if (MMX_CLASS_P (regclass))
25153     {
25154       int index;
25155       switch (GET_MODE_SIZE (mode))
25156         {
25157           case 4:
25158             index = 0;
25159             break;
25160           case 8:
25161             index = 1;
25162             break;
25163           default:
25164             return 100;
25165         }
25166       if (in)
25167         return MAX (ix86_cost->mmx_load [index], ix86_cost->mmx_store [index]);
25168       return in ? ix86_cost->mmx_load [index] : ix86_cost->mmx_store [index];
25169     }
25170   switch (GET_MODE_SIZE (mode))
25171     {
25172       case 1:
25173         if (Q_CLASS_P (regclass) || TARGET_64BIT)
25174           {
25175             if (!in)
25176               return ix86_cost->int_store[0];
25177             if (TARGET_PARTIAL_REG_DEPENDENCY
25178                 && optimize_function_for_speed_p (cfun))
25179               cost = ix86_cost->movzbl_load;
25180             else
25181               cost = ix86_cost->int_load[0];
25182             if (in == 2)
25183               return MAX (cost, ix86_cost->int_store[0]);
25184             return cost;
25185           }
25186         else
25187           {
25188            if (in == 2)
25189              return MAX (ix86_cost->movzbl_load, ix86_cost->int_store[0] + 4);
25190            if (in)
25191              return ix86_cost->movzbl_load;
25192            else
25193              return ix86_cost->int_store[0] + 4;
25194           }
25195         break;
25196       case 2:
25197         if (in == 2)
25198           return MAX (ix86_cost->int_load[1], ix86_cost->int_store[1]);
25199         return in ? ix86_cost->int_load[1] : ix86_cost->int_store[1];
25200       default:
25201         /* Compute number of 32bit moves needed.  TFmode is moved as XFmode.  */
25202         if (mode == TFmode)
25203           mode = XFmode;
25204         if (in == 2)
25205           cost = MAX (ix86_cost->int_load[2] , ix86_cost->int_store[2]);
25206         else if (in)
25207           cost = ix86_cost->int_load[2];
25208         else
25209           cost = ix86_cost->int_store[2];
25210         return (cost * (((int) GET_MODE_SIZE (mode)
25211                         + UNITS_PER_WORD - 1) / UNITS_PER_WORD));
25212     }
25213 }
25214
25215 int
25216 ix86_memory_move_cost (enum machine_mode mode, enum reg_class regclass, int in)
25217 {
25218   return inline_memory_move_cost (mode, regclass, in);
25219 }
25220
25221
25222 /* Return the cost of moving data from a register in class CLASS1 to
25223    one in class CLASS2.
25224
25225    It is not required that the cost always equal 2 when FROM is the same as TO;
25226    on some machines it is expensive to move between registers if they are not
25227    general registers.  */
25228
25229 int
25230 ix86_register_move_cost (enum machine_mode mode, enum reg_class class1,
25231                          enum reg_class class2)
25232 {
25233   /* In case we require secondary memory, compute cost of the store followed
25234      by load.  In order to avoid bad register allocation choices, we need
25235      for this to be *at least* as high as the symmetric MEMORY_MOVE_COST.  */
25236
25237   if (inline_secondary_memory_needed (class1, class2, mode, 0))
25238     {
25239       int cost = 1;
25240
25241       cost += inline_memory_move_cost (mode, class1, 2);
25242       cost += inline_memory_move_cost (mode, class2, 2);
25243
25244       /* In case of copying from general_purpose_register we may emit multiple
25245          stores followed by single load causing memory size mismatch stall.
25246          Count this as arbitrarily high cost of 20.  */
25247       if (CLASS_MAX_NREGS (class1, mode) > CLASS_MAX_NREGS (class2, mode))
25248         cost += 20;
25249
25250       /* In the case of FP/MMX moves, the registers actually overlap, and we
25251          have to switch modes in order to treat them differently.  */
25252       if ((MMX_CLASS_P (class1) && MAYBE_FLOAT_CLASS_P (class2))
25253           || (MMX_CLASS_P (class2) && MAYBE_FLOAT_CLASS_P (class1)))
25254         cost += 20;
25255
25256       return cost;
25257     }
25258
25259   /* Moves between SSE/MMX and integer unit are expensive.  */
25260   if (MMX_CLASS_P (class1) != MMX_CLASS_P (class2)
25261       || SSE_CLASS_P (class1) != SSE_CLASS_P (class2))
25262
25263     /* ??? By keeping returned value relatively high, we limit the number
25264        of moves between integer and MMX/SSE registers for all targets.
25265        Additionally, high value prevents problem with x86_modes_tieable_p(),
25266        where integer modes in MMX/SSE registers are not tieable
25267        because of missing QImode and HImode moves to, from or between
25268        MMX/SSE registers.  */
25269     return MAX (8, ix86_cost->mmxsse_to_integer);
25270
25271   if (MAYBE_FLOAT_CLASS_P (class1))
25272     return ix86_cost->fp_move;
25273   if (MAYBE_SSE_CLASS_P (class1))
25274     return ix86_cost->sse_move;
25275   if (MAYBE_MMX_CLASS_P (class1))
25276     return ix86_cost->mmx_move;
25277   return 2;
25278 }
25279
25280 /* Return 1 if hard register REGNO can hold a value of machine-mode MODE.  */
25281
25282 bool
25283 ix86_hard_regno_mode_ok (int regno, enum machine_mode mode)
25284 {
25285   /* Flags and only flags can only hold CCmode values.  */
25286   if (CC_REGNO_P (regno))
25287     return GET_MODE_CLASS (mode) == MODE_CC;
25288   if (GET_MODE_CLASS (mode) == MODE_CC
25289       || GET_MODE_CLASS (mode) == MODE_RANDOM
25290       || GET_MODE_CLASS (mode) == MODE_PARTIAL_INT)
25291     return 0;
25292   if (FP_REGNO_P (regno))
25293     return VALID_FP_MODE_P (mode);
25294   if (SSE_REGNO_P (regno))
25295     {
25296       /* We implement the move patterns for all vector modes into and
25297          out of SSE registers, even when no operation instructions
25298          are available.  OImode move is available only when AVX is
25299          enabled.  */
25300       return ((TARGET_AVX && mode == OImode)
25301               || VALID_AVX256_REG_MODE (mode)
25302               || VALID_SSE_REG_MODE (mode)
25303               || VALID_SSE2_REG_MODE (mode)
25304               || VALID_MMX_REG_MODE (mode)
25305               || VALID_MMX_REG_MODE_3DNOW (mode));
25306     }
25307   if (MMX_REGNO_P (regno))
25308     {
25309       /* We implement the move patterns for 3DNOW modes even in MMX mode,
25310          so if the register is available at all, then we can move data of
25311          the given mode into or out of it.  */
25312       return (VALID_MMX_REG_MODE (mode)
25313               || VALID_MMX_REG_MODE_3DNOW (mode));
25314     }
25315
25316   if (mode == QImode)
25317     {
25318       /* Take care for QImode values - they can be in non-QI regs,
25319          but then they do cause partial register stalls.  */
25320       if (regno <= BX_REG || TARGET_64BIT)
25321         return 1;
25322       if (!TARGET_PARTIAL_REG_STALL)
25323         return 1;
25324       return reload_in_progress || reload_completed;
25325     }
25326   /* We handle both integer and floats in the general purpose registers.  */
25327   else if (VALID_INT_MODE_P (mode))
25328     return 1;
25329   else if (VALID_FP_MODE_P (mode))
25330     return 1;
25331   else if (VALID_DFP_MODE_P (mode))
25332     return 1;
25333   /* Lots of MMX code casts 8 byte vector modes to DImode.  If we then go
25334      on to use that value in smaller contexts, this can easily force a
25335      pseudo to be allocated to GENERAL_REGS.  Since this is no worse than
25336      supporting DImode, allow it.  */
25337   else if (VALID_MMX_REG_MODE_3DNOW (mode) || VALID_MMX_REG_MODE (mode))
25338     return 1;
25339
25340   return 0;
25341 }
25342
25343 /* A subroutine of ix86_modes_tieable_p.  Return true if MODE is a
25344    tieable integer mode.  */
25345
25346 static bool
25347 ix86_tieable_integer_mode_p (enum machine_mode mode)
25348 {
25349   switch (mode)
25350     {
25351     case HImode:
25352     case SImode:
25353       return true;
25354
25355     case QImode:
25356       return TARGET_64BIT || !TARGET_PARTIAL_REG_STALL;
25357
25358     case DImode:
25359       return TARGET_64BIT;
25360
25361     default:
25362       return false;
25363     }
25364 }
25365
25366 /* Return true if MODE1 is accessible in a register that can hold MODE2
25367    without copying.  That is, all register classes that can hold MODE2
25368    can also hold MODE1.  */
25369
25370 bool
25371 ix86_modes_tieable_p (enum machine_mode mode1, enum machine_mode mode2)
25372 {
25373   if (mode1 == mode2)
25374     return true;
25375
25376   if (ix86_tieable_integer_mode_p (mode1)
25377       && ix86_tieable_integer_mode_p (mode2))
25378     return true;
25379
25380   /* MODE2 being XFmode implies fp stack or general regs, which means we
25381      can tie any smaller floating point modes to it.  Note that we do not
25382      tie this with TFmode.  */
25383   if (mode2 == XFmode)
25384     return mode1 == SFmode || mode1 == DFmode;
25385
25386   /* MODE2 being DFmode implies fp stack, general or sse regs, which means
25387      that we can tie it with SFmode.  */
25388   if (mode2 == DFmode)
25389     return mode1 == SFmode;
25390
25391   /* If MODE2 is only appropriate for an SSE register, then tie with
25392      any other mode acceptable to SSE registers.  */
25393   if (GET_MODE_SIZE (mode2) == 16
25394       && ix86_hard_regno_mode_ok (FIRST_SSE_REG, mode2))
25395     return (GET_MODE_SIZE (mode1) == 16
25396             && ix86_hard_regno_mode_ok (FIRST_SSE_REG, mode1));
25397
25398   /* If MODE2 is appropriate for an MMX register, then tie
25399      with any other mode acceptable to MMX registers.  */
25400   if (GET_MODE_SIZE (mode2) == 8
25401       && ix86_hard_regno_mode_ok (FIRST_MMX_REG, mode2))
25402     return (GET_MODE_SIZE (mode1) == 8
25403             && ix86_hard_regno_mode_ok (FIRST_MMX_REG, mode1));
25404
25405   return false;
25406 }
25407
25408 /* Compute a (partial) cost for rtx X.  Return true if the complete
25409    cost has been computed, and false if subexpressions should be
25410    scanned.  In either case, *TOTAL contains the cost result.  */
25411
25412 static bool
25413 ix86_rtx_costs (rtx x, int code, int outer_code_i, int *total, bool speed)
25414 {
25415   enum rtx_code outer_code = (enum rtx_code) outer_code_i;
25416   enum machine_mode mode = GET_MODE (x);
25417   const struct processor_costs *cost = speed ? ix86_cost : &ix86_size_cost;
25418
25419   switch (code)
25420     {
25421     case CONST_INT:
25422     case CONST:
25423     case LABEL_REF:
25424     case SYMBOL_REF:
25425       if (TARGET_64BIT && !x86_64_immediate_operand (x, VOIDmode))
25426         *total = 3;
25427       else if (TARGET_64BIT && !x86_64_zext_immediate_operand (x, VOIDmode))
25428         *total = 2;
25429       else if (flag_pic && SYMBOLIC_CONST (x)
25430                && (!TARGET_64BIT
25431                    || (!GET_CODE (x) != LABEL_REF
25432                        && (GET_CODE (x) != SYMBOL_REF
25433                            || !SYMBOL_REF_LOCAL_P (x)))))
25434         *total = 1;
25435       else
25436         *total = 0;
25437       return true;
25438
25439     case CONST_DOUBLE:
25440       if (mode == VOIDmode)
25441         *total = 0;
25442       else
25443         switch (standard_80387_constant_p (x))
25444           {
25445           case 1: /* 0.0 */
25446             *total = 1;
25447             break;
25448           default: /* Other constants */
25449             *total = 2;
25450             break;
25451           case 0:
25452           case -1:
25453             /* Start with (MEM (SYMBOL_REF)), since that's where
25454                it'll probably end up.  Add a penalty for size.  */
25455             *total = (COSTS_N_INSNS (1)
25456                       + (flag_pic != 0 && !TARGET_64BIT)
25457                       + (mode == SFmode ? 0 : mode == DFmode ? 1 : 2));
25458             break;
25459           }
25460       return true;
25461
25462     case ZERO_EXTEND:
25463       /* The zero extensions is often completely free on x86_64, so make
25464          it as cheap as possible.  */
25465       if (TARGET_64BIT && mode == DImode
25466           && GET_MODE (XEXP (x, 0)) == SImode)
25467         *total = 1;
25468       else if (TARGET_ZERO_EXTEND_WITH_AND)
25469         *total = cost->add;
25470       else
25471         *total = cost->movzx;
25472       return false;
25473
25474     case SIGN_EXTEND:
25475       *total = cost->movsx;
25476       return false;
25477
25478     case ASHIFT:
25479       if (CONST_INT_P (XEXP (x, 1))
25480           && (GET_MODE (XEXP (x, 0)) != DImode || TARGET_64BIT))
25481         {
25482           HOST_WIDE_INT value = INTVAL (XEXP (x, 1));
25483           if (value == 1)
25484             {
25485               *total = cost->add;
25486               return false;
25487             }
25488           if ((value == 2 || value == 3)
25489               && cost->lea <= cost->shift_const)
25490             {
25491               *total = cost->lea;
25492               return false;
25493             }
25494         }
25495       /* FALLTHRU */
25496
25497     case ROTATE:
25498     case ASHIFTRT:
25499     case LSHIFTRT:
25500     case ROTATERT:
25501       if (!TARGET_64BIT && GET_MODE (XEXP (x, 0)) == DImode)
25502         {
25503           if (CONST_INT_P (XEXP (x, 1)))
25504             {
25505               if (INTVAL (XEXP (x, 1)) > 32)
25506                 *total = cost->shift_const + COSTS_N_INSNS (2);
25507               else
25508                 *total = cost->shift_const * 2;
25509             }
25510           else
25511             {
25512               if (GET_CODE (XEXP (x, 1)) == AND)
25513                 *total = cost->shift_var * 2;
25514               else
25515                 *total = cost->shift_var * 6 + COSTS_N_INSNS (2);
25516             }
25517         }
25518       else
25519         {
25520           if (CONST_INT_P (XEXP (x, 1)))
25521             *total = cost->shift_const;
25522           else
25523             *total = cost->shift_var;
25524         }
25525       return false;
25526
25527     case MULT:
25528       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
25529         {
25530           /* ??? SSE scalar cost should be used here.  */
25531           *total = cost->fmul;
25532           return false;
25533         }
25534       else if (X87_FLOAT_MODE_P (mode))
25535         {
25536           *total = cost->fmul;
25537           return false;
25538         }
25539       else if (FLOAT_MODE_P (mode))
25540         {
25541           /* ??? SSE vector cost should be used here.  */
25542           *total = cost->fmul;
25543           return false;
25544         }
25545       else
25546         {
25547           rtx op0 = XEXP (x, 0);
25548           rtx op1 = XEXP (x, 1);
25549           int nbits;
25550           if (CONST_INT_P (XEXP (x, 1)))
25551             {
25552               unsigned HOST_WIDE_INT value = INTVAL (XEXP (x, 1));
25553               for (nbits = 0; value != 0; value &= value - 1)
25554                 nbits++;
25555             }
25556           else
25557             /* This is arbitrary.  */
25558             nbits = 7;
25559
25560           /* Compute costs correctly for widening multiplication.  */
25561           if ((GET_CODE (op0) == SIGN_EXTEND || GET_CODE (op0) == ZERO_EXTEND)
25562               && GET_MODE_SIZE (GET_MODE (XEXP (op0, 0))) * 2
25563                  == GET_MODE_SIZE (mode))
25564             {
25565               int is_mulwiden = 0;
25566               enum machine_mode inner_mode = GET_MODE (op0);
25567
25568               if (GET_CODE (op0) == GET_CODE (op1))
25569                 is_mulwiden = 1, op1 = XEXP (op1, 0);
25570               else if (CONST_INT_P (op1))
25571                 {
25572                   if (GET_CODE (op0) == SIGN_EXTEND)
25573                     is_mulwiden = trunc_int_for_mode (INTVAL (op1), inner_mode)
25574                                   == INTVAL (op1);
25575                   else
25576                     is_mulwiden = !(INTVAL (op1) & ~GET_MODE_MASK (inner_mode));
25577                 }
25578
25579               if (is_mulwiden)
25580                 op0 = XEXP (op0, 0), mode = GET_MODE (op0);
25581             }
25582
25583           *total = (cost->mult_init[MODE_INDEX (mode)]
25584                     + nbits * cost->mult_bit
25585                     + rtx_cost (op0, outer_code, speed) + rtx_cost (op1, outer_code, speed));
25586
25587           return true;
25588         }
25589
25590     case DIV:
25591     case UDIV:
25592     case MOD:
25593     case UMOD:
25594       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
25595         /* ??? SSE cost should be used here.  */
25596         *total = cost->fdiv;
25597       else if (X87_FLOAT_MODE_P (mode))
25598         *total = cost->fdiv;
25599       else if (FLOAT_MODE_P (mode))
25600         /* ??? SSE vector cost should be used here.  */
25601         *total = cost->fdiv;
25602       else
25603         *total = cost->divide[MODE_INDEX (mode)];
25604       return false;
25605
25606     case PLUS:
25607       if (GET_MODE_CLASS (mode) == MODE_INT
25608                && GET_MODE_BITSIZE (mode) <= GET_MODE_BITSIZE (Pmode))
25609         {
25610           if (GET_CODE (XEXP (x, 0)) == PLUS
25611               && GET_CODE (XEXP (XEXP (x, 0), 0)) == MULT
25612               && CONST_INT_P (XEXP (XEXP (XEXP (x, 0), 0), 1))
25613               && CONSTANT_P (XEXP (x, 1)))
25614             {
25615               HOST_WIDE_INT val = INTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1));
25616               if (val == 2 || val == 4 || val == 8)
25617                 {
25618                   *total = cost->lea;
25619                   *total += rtx_cost (XEXP (XEXP (x, 0), 1), outer_code, speed);
25620                   *total += rtx_cost (XEXP (XEXP (XEXP (x, 0), 0), 0),
25621                                       outer_code, speed);
25622                   *total += rtx_cost (XEXP (x, 1), outer_code, speed);
25623                   return true;
25624                 }
25625             }
25626           else if (GET_CODE (XEXP (x, 0)) == MULT
25627                    && CONST_INT_P (XEXP (XEXP (x, 0), 1)))
25628             {
25629               HOST_WIDE_INT val = INTVAL (XEXP (XEXP (x, 0), 1));
25630               if (val == 2 || val == 4 || val == 8)
25631                 {
25632                   *total = cost->lea;
25633                   *total += rtx_cost (XEXP (XEXP (x, 0), 0), outer_code, speed);
25634                   *total += rtx_cost (XEXP (x, 1), outer_code, speed);
25635                   return true;
25636                 }
25637             }
25638           else if (GET_CODE (XEXP (x, 0)) == PLUS)
25639             {
25640               *total = cost->lea;
25641               *total += rtx_cost (XEXP (XEXP (x, 0), 0), outer_code, speed);
25642               *total += rtx_cost (XEXP (XEXP (x, 0), 1), outer_code, speed);
25643               *total += rtx_cost (XEXP (x, 1), outer_code, speed);
25644               return true;
25645             }
25646         }
25647       /* FALLTHRU */
25648
25649     case MINUS:
25650       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
25651         {
25652           /* ??? SSE cost should be used here.  */
25653           *total = cost->fadd;
25654           return false;
25655         }
25656       else if (X87_FLOAT_MODE_P (mode))
25657         {
25658           *total = cost->fadd;
25659           return false;
25660         }
25661       else if (FLOAT_MODE_P (mode))
25662         {
25663           /* ??? SSE vector cost should be used here.  */
25664           *total = cost->fadd;
25665           return false;
25666         }
25667       /* FALLTHRU */
25668
25669     case AND:
25670     case IOR:
25671     case XOR:
25672       if (!TARGET_64BIT && mode == DImode)
25673         {
25674           *total = (cost->add * 2
25675                     + (rtx_cost (XEXP (x, 0), outer_code, speed)
25676                        << (GET_MODE (XEXP (x, 0)) != DImode))
25677                     + (rtx_cost (XEXP (x, 1), outer_code, speed)
25678                        << (GET_MODE (XEXP (x, 1)) != DImode)));
25679           return true;
25680         }
25681       /* FALLTHRU */
25682
25683     case NEG:
25684       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
25685         {
25686           /* ??? SSE cost should be used here.  */
25687           *total = cost->fchs;
25688           return false;
25689         }
25690       else if (X87_FLOAT_MODE_P (mode))
25691         {
25692           *total = cost->fchs;
25693           return false;
25694         }
25695       else if (FLOAT_MODE_P (mode))
25696         {
25697           /* ??? SSE vector cost should be used here.  */
25698           *total = cost->fchs;
25699           return false;
25700         }
25701       /* FALLTHRU */
25702
25703     case NOT:
25704       if (!TARGET_64BIT && mode == DImode)
25705         *total = cost->add * 2;
25706       else
25707         *total = cost->add;
25708       return false;
25709
25710     case COMPARE:
25711       if (GET_CODE (XEXP (x, 0)) == ZERO_EXTRACT
25712           && XEXP (XEXP (x, 0), 1) == const1_rtx
25713           && CONST_INT_P (XEXP (XEXP (x, 0), 2))
25714           && XEXP (x, 1) == const0_rtx)
25715         {
25716           /* This kind of construct is implemented using test[bwl].
25717              Treat it as if we had an AND.  */
25718           *total = (cost->add
25719                     + rtx_cost (XEXP (XEXP (x, 0), 0), outer_code, speed)
25720                     + rtx_cost (const1_rtx, outer_code, speed));
25721           return true;
25722         }
25723       return false;
25724
25725     case FLOAT_EXTEND:
25726       if (!(SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH))
25727         *total = 0;
25728       return false;
25729
25730     case ABS:
25731       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
25732         /* ??? SSE cost should be used here.  */
25733         *total = cost->fabs;
25734       else if (X87_FLOAT_MODE_P (mode))
25735         *total = cost->fabs;
25736       else if (FLOAT_MODE_P (mode))
25737         /* ??? SSE vector cost should be used here.  */
25738         *total = cost->fabs;
25739       return false;
25740
25741     case SQRT:
25742       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
25743         /* ??? SSE cost should be used here.  */
25744         *total = cost->fsqrt;
25745       else if (X87_FLOAT_MODE_P (mode))
25746         *total = cost->fsqrt;
25747       else if (FLOAT_MODE_P (mode))
25748         /* ??? SSE vector cost should be used here.  */
25749         *total = cost->fsqrt;
25750       return false;
25751
25752     case UNSPEC:
25753       if (XINT (x, 1) == UNSPEC_TP)
25754         *total = 0;
25755       return false;
25756
25757     case VEC_SELECT:
25758     case VEC_CONCAT:
25759     case VEC_MERGE:
25760     case VEC_DUPLICATE:
25761       /* ??? Assume all of these vector manipulation patterns are
25762          recognizable.  In which case they all pretty much have the
25763          same cost.  */
25764      *total = COSTS_N_INSNS (1);
25765      return true;
25766
25767     default:
25768       return false;
25769     }
25770 }
25771
25772 #if TARGET_MACHO
25773
25774 static int current_machopic_label_num;
25775
25776 /* Given a symbol name and its associated stub, write out the
25777    definition of the stub.  */
25778
25779 void
25780 machopic_output_stub (FILE *file, const char *symb, const char *stub)
25781 {
25782   unsigned int length;
25783   char *binder_name, *symbol_name, lazy_ptr_name[32];
25784   int label = ++current_machopic_label_num;
25785
25786   /* For 64-bit we shouldn't get here.  */
25787   gcc_assert (!TARGET_64BIT);
25788
25789   /* Lose our funky encoding stuff so it doesn't contaminate the stub.  */
25790   symb = (*targetm.strip_name_encoding) (symb);
25791
25792   length = strlen (stub);
25793   binder_name = XALLOCAVEC (char, length + 32);
25794   GEN_BINDER_NAME_FOR_STUB (binder_name, stub, length);
25795
25796   length = strlen (symb);
25797   symbol_name = XALLOCAVEC (char, length + 32);
25798   GEN_SYMBOL_NAME_FOR_SYMBOL (symbol_name, symb, length);
25799
25800   sprintf (lazy_ptr_name, "L%d$lz", label);
25801
25802   if (MACHOPIC_PURE)
25803     switch_to_section (darwin_sections[machopic_picsymbol_stub_section]);
25804   else
25805     switch_to_section (darwin_sections[machopic_symbol_stub_section]);
25806
25807   fprintf (file, "%s:\n", stub);
25808   fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
25809
25810   if (MACHOPIC_PURE)
25811     {
25812       fprintf (file, "\tcall\tLPC$%d\nLPC$%d:\tpopl\t%%eax\n", label, label);
25813       fprintf (file, "\tmovl\t%s-LPC$%d(%%eax),%%edx\n", lazy_ptr_name, label);
25814       fprintf (file, "\tjmp\t*%%edx\n");
25815     }
25816   else
25817     fprintf (file, "\tjmp\t*%s\n", lazy_ptr_name);
25818
25819   fprintf (file, "%s:\n", binder_name);
25820
25821   if (MACHOPIC_PURE)
25822     {
25823       fprintf (file, "\tlea\t%s-LPC$%d(%%eax),%%eax\n", lazy_ptr_name, label);
25824       fputs ("\tpushl\t%eax\n", file);
25825     }
25826   else
25827     fprintf (file, "\tpushl\t$%s\n", lazy_ptr_name);
25828
25829   fputs ("\tjmp\tdyld_stub_binding_helper\n", file);
25830
25831   switch_to_section (darwin_sections[machopic_lazy_symbol_ptr_section]);
25832   fprintf (file, "%s:\n", lazy_ptr_name);
25833   fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
25834   fprintf (file, ASM_LONG "%s\n", binder_name);
25835 }
25836
25837 void
25838 darwin_x86_file_end (void)
25839 {
25840   darwin_file_end ();
25841   ix86_file_end ();
25842 }
25843 #endif /* TARGET_MACHO */
25844
25845 /* Order the registers for register allocator.  */
25846
25847 void
25848 x86_order_regs_for_local_alloc (void)
25849 {
25850    int pos = 0;
25851    int i;
25852
25853    /* First allocate the local general purpose registers.  */
25854    for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
25855      if (GENERAL_REGNO_P (i) && call_used_regs[i])
25856         reg_alloc_order [pos++] = i;
25857
25858    /* Global general purpose registers.  */
25859    for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
25860      if (GENERAL_REGNO_P (i) && !call_used_regs[i])
25861         reg_alloc_order [pos++] = i;
25862
25863    /* x87 registers come first in case we are doing FP math
25864       using them.  */
25865    if (!TARGET_SSE_MATH)
25866      for (i = FIRST_STACK_REG; i <= LAST_STACK_REG; i++)
25867        reg_alloc_order [pos++] = i;
25868
25869    /* SSE registers.  */
25870    for (i = FIRST_SSE_REG; i <= LAST_SSE_REG; i++)
25871      reg_alloc_order [pos++] = i;
25872    for (i = FIRST_REX_SSE_REG; i <= LAST_REX_SSE_REG; i++)
25873      reg_alloc_order [pos++] = i;
25874
25875    /* x87 registers.  */
25876    if (TARGET_SSE_MATH)
25877      for (i = FIRST_STACK_REG; i <= LAST_STACK_REG; i++)
25878        reg_alloc_order [pos++] = i;
25879
25880    for (i = FIRST_MMX_REG; i <= LAST_MMX_REG; i++)
25881      reg_alloc_order [pos++] = i;
25882
25883    /* Initialize the rest of array as we do not allocate some registers
25884       at all.  */
25885    while (pos < FIRST_PSEUDO_REGISTER)
25886      reg_alloc_order [pos++] = 0;
25887 }
25888
25889 /* Handle a "ms_abi" or "sysv" attribute; arguments as in
25890    struct attribute_spec.handler.  */
25891 static tree
25892 ix86_handle_abi_attribute (tree *node, tree name,
25893                               tree args ATTRIBUTE_UNUSED,
25894                               int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
25895 {
25896   if (TREE_CODE (*node) != FUNCTION_TYPE
25897       && TREE_CODE (*node) != METHOD_TYPE
25898       && TREE_CODE (*node) != FIELD_DECL
25899       && TREE_CODE (*node) != TYPE_DECL)
25900     {
25901       warning (OPT_Wattributes, "%qE attribute only applies to functions",
25902                name);
25903       *no_add_attrs = true;
25904       return NULL_TREE;
25905     }
25906   if (!TARGET_64BIT)
25907     {
25908       warning (OPT_Wattributes, "%qE attribute only available for 64-bit",
25909                name);
25910       *no_add_attrs = true;
25911       return NULL_TREE;
25912     }
25913
25914   /* Can combine regparm with all attributes but fastcall.  */
25915   if (is_attribute_p ("ms_abi", name))
25916     {
25917       if (lookup_attribute ("sysv_abi", TYPE_ATTRIBUTES (*node)))
25918         {
25919           error ("ms_abi and sysv_abi attributes are not compatible");
25920         }
25921
25922       return NULL_TREE;
25923     }
25924   else if (is_attribute_p ("sysv_abi", name))
25925     {
25926       if (lookup_attribute ("ms_abi", TYPE_ATTRIBUTES (*node)))
25927         {
25928           error ("ms_abi and sysv_abi attributes are not compatible");
25929         }
25930
25931       return NULL_TREE;
25932     }
25933
25934   return NULL_TREE;
25935 }
25936
25937 /* Handle a "ms_struct" or "gcc_struct" attribute; arguments as in
25938    struct attribute_spec.handler.  */
25939 static tree
25940 ix86_handle_struct_attribute (tree *node, tree name,
25941                               tree args ATTRIBUTE_UNUSED,
25942                               int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
25943 {
25944   tree *type = NULL;
25945   if (DECL_P (*node))
25946     {
25947       if (TREE_CODE (*node) == TYPE_DECL)
25948         type = &TREE_TYPE (*node);
25949     }
25950   else
25951     type = node;
25952
25953   if (!(type && (TREE_CODE (*type) == RECORD_TYPE
25954                  || TREE_CODE (*type) == UNION_TYPE)))
25955     {
25956       warning (OPT_Wattributes, "%qE attribute ignored",
25957                name);
25958       *no_add_attrs = true;
25959     }
25960
25961   else if ((is_attribute_p ("ms_struct", name)
25962             && lookup_attribute ("gcc_struct", TYPE_ATTRIBUTES (*type)))
25963            || ((is_attribute_p ("gcc_struct", name)
25964                 && lookup_attribute ("ms_struct", TYPE_ATTRIBUTES (*type)))))
25965     {
25966       warning (OPT_Wattributes, "%qE incompatible attribute ignored",
25967                name);
25968       *no_add_attrs = true;
25969     }
25970
25971   return NULL_TREE;
25972 }
25973
25974 static tree
25975 ix86_handle_fndecl_attribute (tree *node, tree name,
25976                               tree args ATTRIBUTE_UNUSED,
25977                               int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
25978 {
25979   if (TREE_CODE (*node) != FUNCTION_DECL)
25980     {
25981       warning (OPT_Wattributes, "%qE attribute only applies to functions",
25982                name);
25983       *no_add_attrs = true;
25984       return NULL_TREE;
25985     }
25986
25987   if (TARGET_64BIT)
25988     {
25989       warning (OPT_Wattributes, "%qE attribute only available for 32-bit",
25990                name);
25991       return NULL_TREE;
25992     }
25993
25994 #ifndef HAVE_AS_IX86_SWAP
25995   sorry ("ms_hook_prologue attribute needs assembler swap suffix support");
25996 #endif
25997
25998     return NULL_TREE;
25999 }
26000
26001 static bool
26002 ix86_ms_bitfield_layout_p (const_tree record_type)
26003 {
26004   return (TARGET_MS_BITFIELD_LAYOUT &&
26005           !lookup_attribute ("gcc_struct", TYPE_ATTRIBUTES (record_type)))
26006     || lookup_attribute ("ms_struct", TYPE_ATTRIBUTES (record_type));
26007 }
26008
26009 /* Returns an expression indicating where the this parameter is
26010    located on entry to the FUNCTION.  */
26011
26012 static rtx
26013 x86_this_parameter (tree function)
26014 {
26015   tree type = TREE_TYPE (function);
26016   bool aggr = aggregate_value_p (TREE_TYPE (type), type) != 0;
26017   int nregs;
26018
26019   if (TARGET_64BIT)
26020     {
26021       const int *parm_regs;
26022
26023       if (ix86_function_type_abi (type) == MS_ABI)
26024         parm_regs = x86_64_ms_abi_int_parameter_registers;
26025       else
26026         parm_regs = x86_64_int_parameter_registers;
26027       return gen_rtx_REG (DImode, parm_regs[aggr]);
26028     }
26029
26030   nregs = ix86_function_regparm (type, function);
26031
26032   if (nregs > 0 && !stdarg_p (type))
26033     {
26034       int regno;
26035
26036       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (type)))
26037         regno = aggr ? DX_REG : CX_REG;
26038       else
26039         {
26040           regno = AX_REG;
26041           if (aggr)
26042             {
26043               regno = DX_REG;
26044               if (nregs == 1)
26045                 return gen_rtx_MEM (SImode,
26046                                     plus_constant (stack_pointer_rtx, 4));
26047             }
26048         }
26049       return gen_rtx_REG (SImode, regno);
26050     }
26051
26052   return gen_rtx_MEM (SImode, plus_constant (stack_pointer_rtx, aggr ? 8 : 4));
26053 }
26054
26055 /* Determine whether x86_output_mi_thunk can succeed.  */
26056
26057 static bool
26058 x86_can_output_mi_thunk (const_tree thunk ATTRIBUTE_UNUSED,
26059                          HOST_WIDE_INT delta ATTRIBUTE_UNUSED,
26060                          HOST_WIDE_INT vcall_offset, const_tree function)
26061 {
26062   /* 64-bit can handle anything.  */
26063   if (TARGET_64BIT)
26064     return true;
26065
26066   /* For 32-bit, everything's fine if we have one free register.  */
26067   if (ix86_function_regparm (TREE_TYPE (function), function) < 3)
26068     return true;
26069
26070   /* Need a free register for vcall_offset.  */
26071   if (vcall_offset)
26072     return false;
26073
26074   /* Need a free register for GOT references.  */
26075   if (flag_pic && !(*targetm.binds_local_p) (function))
26076     return false;
26077
26078   /* Otherwise ok.  */
26079   return true;
26080 }
26081
26082 /* Output the assembler code for a thunk function.  THUNK_DECL is the
26083    declaration for the thunk function itself, FUNCTION is the decl for
26084    the target function.  DELTA is an immediate constant offset to be
26085    added to THIS.  If VCALL_OFFSET is nonzero, the word at
26086    *(*this + vcall_offset) should be added to THIS.  */
26087
26088 static void
26089 x86_output_mi_thunk (FILE *file ATTRIBUTE_UNUSED,
26090                      tree thunk ATTRIBUTE_UNUSED, HOST_WIDE_INT delta,
26091                      HOST_WIDE_INT vcall_offset, tree function)
26092 {
26093   rtx xops[3];
26094   rtx this_param = x86_this_parameter (function);
26095   rtx this_reg, tmp;
26096
26097   /* If VCALL_OFFSET, we'll need THIS in a register.  Might as well
26098      pull it in now and let DELTA benefit.  */
26099   if (REG_P (this_param))
26100     this_reg = this_param;
26101   else if (vcall_offset)
26102     {
26103       /* Put the this parameter into %eax.  */
26104       xops[0] = this_param;
26105       xops[1] = this_reg = gen_rtx_REG (Pmode, AX_REG);
26106       output_asm_insn ("mov%z1\t{%0, %1|%1, %0}", xops);
26107     }
26108   else
26109     this_reg = NULL_RTX;
26110
26111   /* Adjust the this parameter by a fixed constant.  */
26112   if (delta)
26113     {
26114       /* Make things pretty and `subl $4,%eax' rather than `addl $-4,%eax'.
26115          Exceptions: -128 encodes smaller than 128, so swap sign and op.  */
26116       bool sub = delta < 0 || delta == 128;
26117       xops[0] = GEN_INT (sub ? -delta : delta);
26118       xops[1] = this_reg ? this_reg : this_param;
26119       if (TARGET_64BIT)
26120         {
26121           if (!x86_64_general_operand (xops[0], DImode))
26122             {
26123               tmp = gen_rtx_REG (DImode, R10_REG);
26124               xops[1] = tmp;
26125               output_asm_insn ("mov{q}\t{%1, %0|%0, %1}", xops);
26126               xops[0] = tmp;
26127               xops[1] = this_param;
26128             }
26129           if (sub)
26130             output_asm_insn ("sub{q}\t{%0, %1|%1, %0}", xops);
26131           else
26132             output_asm_insn ("add{q}\t{%0, %1|%1, %0}", xops);
26133         }
26134       else if (sub)
26135         output_asm_insn ("sub{l}\t{%0, %1|%1, %0}", xops);
26136       else
26137         output_asm_insn ("add{l}\t{%0, %1|%1, %0}", xops);
26138     }
26139
26140   /* Adjust the this parameter by a value stored in the vtable.  */
26141   if (vcall_offset)
26142     {
26143       if (TARGET_64BIT)
26144         tmp = gen_rtx_REG (DImode, R10_REG);
26145       else
26146         {
26147           int tmp_regno = CX_REG;
26148           if (lookup_attribute ("fastcall",
26149                                 TYPE_ATTRIBUTES (TREE_TYPE (function))))
26150             tmp_regno = AX_REG;
26151           tmp = gen_rtx_REG (SImode, tmp_regno);
26152         }
26153
26154       xops[0] = gen_rtx_MEM (Pmode, this_reg);
26155       xops[1] = tmp;
26156       output_asm_insn ("mov%z1\t{%0, %1|%1, %0}", xops);
26157
26158       /* Adjust the this parameter.  */
26159       xops[0] = gen_rtx_MEM (Pmode, plus_constant (tmp, vcall_offset));
26160       if (TARGET_64BIT && !memory_operand (xops[0], Pmode))
26161         {
26162           rtx tmp2 = gen_rtx_REG (DImode, R11_REG);
26163           xops[0] = GEN_INT (vcall_offset);
26164           xops[1] = tmp2;
26165           output_asm_insn ("mov{q}\t{%0, %1|%1, %0}", xops);
26166           xops[0] = gen_rtx_MEM (Pmode, gen_rtx_PLUS (Pmode, tmp, tmp2));
26167         }
26168       xops[1] = this_reg;
26169       output_asm_insn ("add%z1\t{%0, %1|%1, %0}", xops);
26170     }
26171
26172   /* If necessary, drop THIS back to its stack slot.  */
26173   if (this_reg && this_reg != this_param)
26174     {
26175       xops[0] = this_reg;
26176       xops[1] = this_param;
26177       output_asm_insn ("mov%z1\t{%0, %1|%1, %0}", xops);
26178     }
26179
26180   xops[0] = XEXP (DECL_RTL (function), 0);
26181   if (TARGET_64BIT)
26182     {
26183       if (!flag_pic || (*targetm.binds_local_p) (function))
26184         output_asm_insn ("jmp\t%P0", xops);
26185       /* All thunks should be in the same object as their target,
26186          and thus binds_local_p should be true.  */
26187       else if (TARGET_64BIT && cfun->machine->call_abi == MS_ABI)
26188         gcc_unreachable ();
26189       else
26190         {
26191           tmp = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, xops[0]), UNSPEC_GOTPCREL);
26192           tmp = gen_rtx_CONST (Pmode, tmp);
26193           tmp = gen_rtx_MEM (QImode, tmp);
26194           xops[0] = tmp;
26195           output_asm_insn ("jmp\t%A0", xops);
26196         }
26197     }
26198   else
26199     {
26200       if (!flag_pic || (*targetm.binds_local_p) (function))
26201         output_asm_insn ("jmp\t%P0", xops);
26202       else
26203 #if TARGET_MACHO
26204         if (TARGET_MACHO)
26205           {
26206             rtx sym_ref = XEXP (DECL_RTL (function), 0);
26207             tmp = (gen_rtx_SYMBOL_REF
26208                    (Pmode,
26209                     machopic_indirection_name (sym_ref, /*stub_p=*/true)));
26210             tmp = gen_rtx_MEM (QImode, tmp);
26211             xops[0] = tmp;
26212             output_asm_insn ("jmp\t%0", xops);
26213           }
26214         else
26215 #endif /* TARGET_MACHO */
26216         {
26217           tmp = gen_rtx_REG (SImode, CX_REG);
26218           output_set_got (tmp, NULL_RTX);
26219
26220           xops[1] = tmp;
26221           output_asm_insn ("mov{l}\t{%0@GOT(%1), %1|%1, %0@GOT[%1]}", xops);
26222           output_asm_insn ("jmp\t{*}%1", xops);
26223         }
26224     }
26225 }
26226
26227 static void
26228 x86_file_start (void)
26229 {
26230   default_file_start ();
26231 #if TARGET_MACHO
26232   darwin_file_start ();
26233 #endif
26234   if (X86_FILE_START_VERSION_DIRECTIVE)
26235     fputs ("\t.version\t\"01.01\"\n", asm_out_file);
26236   if (X86_FILE_START_FLTUSED)
26237     fputs ("\t.global\t__fltused\n", asm_out_file);
26238   if (ix86_asm_dialect == ASM_INTEL)
26239     fputs ("\t.intel_syntax noprefix\n", asm_out_file);
26240 }
26241
26242 int
26243 x86_field_alignment (tree field, int computed)
26244 {
26245   enum machine_mode mode;
26246   tree type = TREE_TYPE (field);
26247
26248   if (TARGET_64BIT || TARGET_ALIGN_DOUBLE)
26249     return computed;
26250   mode = TYPE_MODE (strip_array_types (type));
26251   if (mode == DFmode || mode == DCmode
26252       || GET_MODE_CLASS (mode) == MODE_INT
26253       || GET_MODE_CLASS (mode) == MODE_COMPLEX_INT)
26254     return MIN (32, computed);
26255   return computed;
26256 }
26257
26258 /* Output assembler code to FILE to increment profiler label # LABELNO
26259    for profiling a function entry.  */
26260 void
26261 x86_function_profiler (FILE *file, int labelno ATTRIBUTE_UNUSED)
26262 {
26263   if (TARGET_64BIT)
26264     {
26265 #ifndef NO_PROFILE_COUNTERS
26266       fprintf (file, "\tleaq\t" LPREFIX "P%d@(%%rip),%%r11\n", labelno);
26267 #endif
26268
26269       if (DEFAULT_ABI == SYSV_ABI && flag_pic)
26270         fputs ("\tcall\t*" MCOUNT_NAME "@GOTPCREL(%rip)\n", file);
26271       else
26272         fputs ("\tcall\t" MCOUNT_NAME "\n", file);
26273     }
26274   else if (flag_pic)
26275     {
26276 #ifndef NO_PROFILE_COUNTERS
26277       fprintf (file, "\tleal\t" LPREFIX "P%d@GOTOFF(%%ebx),%%" PROFILE_COUNT_REGISTER "\n",
26278                labelno);
26279 #endif
26280       fputs ("\tcall\t*" MCOUNT_NAME "@GOT(%ebx)\n", file);
26281     }
26282   else
26283     {
26284 #ifndef NO_PROFILE_COUNTERS
26285       fprintf (file, "\tmovl\t$" LPREFIX "P%d,%%" PROFILE_COUNT_REGISTER "\n",
26286                labelno);
26287 #endif
26288       fputs ("\tcall\t" MCOUNT_NAME "\n", file);
26289     }
26290 }
26291
26292 #ifdef ASM_OUTPUT_MAX_SKIP_PAD
26293 /* We don't have exact information about the insn sizes, but we may assume
26294    quite safely that we are informed about all 1 byte insns and memory
26295    address sizes.  This is enough to eliminate unnecessary padding in
26296    99% of cases.  */
26297
26298 static int
26299 min_insn_size (rtx insn)
26300 {
26301   int l = 0, len;
26302
26303   if (!INSN_P (insn) || !active_insn_p (insn))
26304     return 0;
26305
26306   /* Discard alignments we've emit and jump instructions.  */
26307   if (GET_CODE (PATTERN (insn)) == UNSPEC_VOLATILE
26308       && XINT (PATTERN (insn), 1) == UNSPECV_ALIGN)
26309     return 0;
26310   if (JUMP_TABLE_DATA_P (insn))
26311     return 0;
26312
26313   /* Important case - calls are always 5 bytes.
26314      It is common to have many calls in the row.  */
26315   if (CALL_P (insn)
26316       && symbolic_reference_mentioned_p (PATTERN (insn))
26317       && !SIBLING_CALL_P (insn))
26318     return 5;
26319   len = get_attr_length (insn);
26320   if (len <= 1)
26321     return 1;
26322
26323   /* For normal instructions we rely on get_attr_length being exact,
26324      with a few exceptions.  */
26325   if (!JUMP_P (insn))
26326     {
26327       enum attr_type type = get_attr_type (insn);
26328
26329       switch (type)
26330         {
26331         case TYPE_MULTI:
26332           if (GET_CODE (PATTERN (insn)) == ASM_INPUT
26333               || asm_noperands (PATTERN (insn)) >= 0)
26334             return 0;
26335           break;
26336         case TYPE_OTHER:
26337         case TYPE_FCMP:
26338           break;
26339         default:
26340           /* Otherwise trust get_attr_length.  */
26341           return len;
26342         }
26343
26344       l = get_attr_length_address (insn);
26345       if (l < 4 && symbolic_reference_mentioned_p (PATTERN (insn)))
26346         l = 4;
26347     }
26348   if (l)
26349     return 1+l;
26350   else
26351     return 2;
26352 }
26353
26354 /* AMD K8 core mispredicts jumps when there are more than 3 jumps in 16 byte
26355    window.  */
26356
26357 static void
26358 ix86_avoid_jump_mispredicts (void)
26359 {
26360   rtx insn, start = get_insns ();
26361   int nbytes = 0, njumps = 0;
26362   int isjump = 0;
26363
26364   /* Look for all minimal intervals of instructions containing 4 jumps.
26365      The intervals are bounded by START and INSN.  NBYTES is the total
26366      size of instructions in the interval including INSN and not including
26367      START.  When the NBYTES is smaller than 16 bytes, it is possible
26368      that the end of START and INSN ends up in the same 16byte page.
26369
26370      The smallest offset in the page INSN can start is the case where START
26371      ends on the offset 0.  Offset of INSN is then NBYTES - sizeof (INSN).
26372      We add p2align to 16byte window with maxskip 15 - NBYTES + sizeof (INSN).
26373      */
26374   for (insn = start; insn; insn = NEXT_INSN (insn))
26375     {
26376       int min_size;
26377
26378       if (LABEL_P (insn))
26379         {
26380           int align = label_to_alignment (insn);
26381           int max_skip = label_to_max_skip (insn);
26382
26383           if (max_skip > 15)
26384             max_skip = 15;
26385           /* If align > 3, only up to 16 - max_skip - 1 bytes can be
26386              already in the current 16 byte page, because otherwise
26387              ASM_OUTPUT_MAX_SKIP_ALIGN could skip max_skip or fewer
26388              bytes to reach 16 byte boundary.  */
26389           if (align <= 0
26390               || (align <= 3 && max_skip != (1 << align) - 1))
26391             max_skip = 0;
26392           if (dump_file)
26393             fprintf (dump_file, "Label %i with max_skip %i\n",
26394                      INSN_UID (insn), max_skip);
26395           if (max_skip)
26396             {
26397               while (nbytes + max_skip >= 16)
26398                 {
26399                   start = NEXT_INSN (start);
26400                   if ((JUMP_P (start)
26401                        && GET_CODE (PATTERN (start)) != ADDR_VEC
26402                        && GET_CODE (PATTERN (start)) != ADDR_DIFF_VEC)
26403                       || CALL_P (start))
26404                     njumps--, isjump = 1;
26405                   else
26406                     isjump = 0;
26407                   nbytes -= min_insn_size (start);
26408                 }
26409             }
26410           continue;
26411         }
26412
26413       min_size = min_insn_size (insn);
26414       nbytes += min_size;
26415       if (dump_file)
26416         fprintf (dump_file, "Insn %i estimated to %i bytes\n",
26417                  INSN_UID (insn), min_size);
26418       if ((JUMP_P (insn)
26419            && GET_CODE (PATTERN (insn)) != ADDR_VEC
26420            && GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC)
26421           || CALL_P (insn))
26422         njumps++;
26423       else
26424         continue;
26425
26426       while (njumps > 3)
26427         {
26428           start = NEXT_INSN (start);
26429           if ((JUMP_P (start)
26430                && GET_CODE (PATTERN (start)) != ADDR_VEC
26431                && GET_CODE (PATTERN (start)) != ADDR_DIFF_VEC)
26432               || CALL_P (start))
26433             njumps--, isjump = 1;
26434           else
26435             isjump = 0;
26436           nbytes -= min_insn_size (start);
26437         }
26438       gcc_assert (njumps >= 0);
26439       if (dump_file)
26440         fprintf (dump_file, "Interval %i to %i has %i bytes\n",
26441                  INSN_UID (start), INSN_UID (insn), nbytes);
26442
26443       if (njumps == 3 && isjump && nbytes < 16)
26444         {
26445           int padsize = 15 - nbytes + min_insn_size (insn);
26446
26447           if (dump_file)
26448             fprintf (dump_file, "Padding insn %i by %i bytes!\n",
26449                      INSN_UID (insn), padsize);
26450           emit_insn_before (gen_pad (GEN_INT (padsize)), insn);
26451         }
26452     }
26453 }
26454 #endif
26455
26456 /* AMD Athlon works faster
26457    when RET is not destination of conditional jump or directly preceded
26458    by other jump instruction.  We avoid the penalty by inserting NOP just
26459    before the RET instructions in such cases.  */
26460 static void
26461 ix86_pad_returns (void)
26462 {
26463   edge e;
26464   edge_iterator ei;
26465
26466   FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
26467     {
26468       basic_block bb = e->src;
26469       rtx ret = BB_END (bb);
26470       rtx prev;
26471       bool replace = false;
26472
26473       if (!JUMP_P (ret) || GET_CODE (PATTERN (ret)) != RETURN
26474           || optimize_bb_for_size_p (bb))
26475         continue;
26476       for (prev = PREV_INSN (ret); prev; prev = PREV_INSN (prev))
26477         if (active_insn_p (prev) || LABEL_P (prev))
26478           break;
26479       if (prev && LABEL_P (prev))
26480         {
26481           edge e;
26482           edge_iterator ei;
26483
26484           FOR_EACH_EDGE (e, ei, bb->preds)
26485             if (EDGE_FREQUENCY (e) && e->src->index >= 0
26486                 && !(e->flags & EDGE_FALLTHRU))
26487               replace = true;
26488         }
26489       if (!replace)
26490         {
26491           prev = prev_active_insn (ret);
26492           if (prev
26493               && ((JUMP_P (prev) && any_condjump_p (prev))
26494                   || CALL_P (prev)))
26495             replace = true;
26496           /* Empty functions get branch mispredict even when the jump destination
26497              is not visible to us.  */
26498           if (!prev && cfun->function_frequency > FUNCTION_FREQUENCY_UNLIKELY_EXECUTED)
26499             replace = true;
26500         }
26501       if (replace)
26502         {
26503           emit_jump_insn_before (gen_return_internal_long (), ret);
26504           delete_insn (ret);
26505         }
26506     }
26507 }
26508
26509 /* Implement machine specific optimizations.  We implement padding of returns
26510    for K8 CPUs and pass to avoid 4 jumps in the single 16 byte window.  */
26511 static void
26512 ix86_reorg (void)
26513 {
26514   if (optimize && optimize_function_for_speed_p (cfun))
26515     {
26516       if (TARGET_PAD_RETURNS)
26517         ix86_pad_returns ();
26518 #ifdef ASM_OUTPUT_MAX_SKIP_PAD
26519       if (TARGET_FOUR_JUMP_LIMIT)
26520         ix86_avoid_jump_mispredicts ();
26521 #endif
26522     }
26523 }
26524
26525 /* Return nonzero when QImode register that must be represented via REX prefix
26526    is used.  */
26527 bool
26528 x86_extended_QIreg_mentioned_p (rtx insn)
26529 {
26530   int i;
26531   extract_insn_cached (insn);
26532   for (i = 0; i < recog_data.n_operands; i++)
26533     if (REG_P (recog_data.operand[i])
26534         && REGNO (recog_data.operand[i]) > BX_REG)
26535        return true;
26536   return false;
26537 }
26538
26539 /* Return nonzero when P points to register encoded via REX prefix.
26540    Called via for_each_rtx.  */
26541 static int
26542 extended_reg_mentioned_1 (rtx *p, void *data ATTRIBUTE_UNUSED)
26543 {
26544    unsigned int regno;
26545    if (!REG_P (*p))
26546      return 0;
26547    regno = REGNO (*p);
26548    return REX_INT_REGNO_P (regno) || REX_SSE_REGNO_P (regno);
26549 }
26550
26551 /* Return true when INSN mentions register that must be encoded using REX
26552    prefix.  */
26553 bool
26554 x86_extended_reg_mentioned_p (rtx insn)
26555 {
26556   return for_each_rtx (INSN_P (insn) ? &PATTERN (insn) : &insn,
26557                        extended_reg_mentioned_1, NULL);
26558 }
26559
26560 /* Generate an unsigned DImode/SImode to FP conversion.  This is the same code
26561    optabs would emit if we didn't have TFmode patterns.  */
26562
26563 void
26564 x86_emit_floatuns (rtx operands[2])
26565 {
26566   rtx neglab, donelab, i0, i1, f0, in, out;
26567   enum machine_mode mode, inmode;
26568
26569   inmode = GET_MODE (operands[1]);
26570   gcc_assert (inmode == SImode || inmode == DImode);
26571
26572   out = operands[0];
26573   in = force_reg (inmode, operands[1]);
26574   mode = GET_MODE (out);
26575   neglab = gen_label_rtx ();
26576   donelab = gen_label_rtx ();
26577   f0 = gen_reg_rtx (mode);
26578
26579   emit_cmp_and_jump_insns (in, const0_rtx, LT, const0_rtx, inmode, 0, neglab);
26580
26581   expand_float (out, in, 0);
26582
26583   emit_jump_insn (gen_jump (donelab));
26584   emit_barrier ();
26585
26586   emit_label (neglab);
26587
26588   i0 = expand_simple_binop (inmode, LSHIFTRT, in, const1_rtx, NULL,
26589                             1, OPTAB_DIRECT);
26590   i1 = expand_simple_binop (inmode, AND, in, const1_rtx, NULL,
26591                             1, OPTAB_DIRECT);
26592   i0 = expand_simple_binop (inmode, IOR, i0, i1, i0, 1, OPTAB_DIRECT);
26593
26594   expand_float (f0, i0, 0);
26595
26596   emit_insn (gen_rtx_SET (VOIDmode, out, gen_rtx_PLUS (mode, f0, f0)));
26597
26598   emit_label (donelab);
26599 }
26600 \f
26601 /* AVX does not support 32-byte integer vector operations,
26602    thus the longest vector we are faced with is V16QImode.  */
26603 #define MAX_VECT_LEN    16
26604
26605 struct expand_vec_perm_d
26606 {
26607   rtx target, op0, op1;
26608   unsigned char perm[MAX_VECT_LEN];
26609   enum machine_mode vmode;
26610   unsigned char nelt;
26611   bool testing_p;
26612 };
26613
26614 static bool expand_vec_perm_1 (struct expand_vec_perm_d *d);
26615 static bool expand_vec_perm_broadcast_1 (struct expand_vec_perm_d *d);
26616
26617 /* Get a vector mode of the same size as the original but with elements
26618    twice as wide.  This is only guaranteed to apply to integral vectors.  */
26619
26620 static inline enum machine_mode
26621 get_mode_wider_vector (enum machine_mode o)
26622 {
26623   /* ??? Rely on the ordering that genmodes.c gives to vectors.  */
26624   enum machine_mode n = GET_MODE_WIDER_MODE (o);
26625   gcc_assert (GET_MODE_NUNITS (o) == GET_MODE_NUNITS (n) * 2);
26626   gcc_assert (GET_MODE_SIZE (o) == GET_MODE_SIZE (n));
26627   return n;
26628 }
26629
26630 /* A subroutine of ix86_expand_vector_init.  Store into TARGET a vector
26631    with all elements equal to VAR.  Return true if successful.  */
26632
26633 static bool
26634 ix86_expand_vector_init_duplicate (bool mmx_ok, enum machine_mode mode,
26635                                    rtx target, rtx val)
26636 {
26637   bool ok;
26638
26639   switch (mode)
26640     {
26641     case V2SImode:
26642     case V2SFmode:
26643       if (!mmx_ok)
26644         return false;
26645       /* FALLTHRU */
26646
26647     case V4DFmode:
26648     case V4DImode:
26649     case V8SFmode:
26650     case V8SImode:
26651     case V2DFmode:
26652     case V2DImode:
26653     case V4SFmode:
26654     case V4SImode:
26655       {
26656         rtx insn, dup;
26657
26658         /* First attempt to recognize VAL as-is.  */
26659         dup = gen_rtx_VEC_DUPLICATE (mode, val);
26660         insn = emit_insn (gen_rtx_SET (VOIDmode, target, dup));
26661         if (recog_memoized (insn) < 0)
26662           {
26663             /* If that fails, force VAL into a register.  */
26664             XEXP (dup, 0) = force_reg (GET_MODE_INNER (mode), val);
26665             ok = recog_memoized (insn) >= 0;
26666             gcc_assert (ok);
26667           }
26668       }
26669       return true;
26670
26671     case V4HImode:
26672       if (!mmx_ok)
26673         return false;
26674       if (TARGET_SSE || TARGET_3DNOW_A)
26675         {
26676           rtx x;
26677
26678           val = gen_lowpart (SImode, val);
26679           x = gen_rtx_TRUNCATE (HImode, val);
26680           x = gen_rtx_VEC_DUPLICATE (mode, x);
26681           emit_insn (gen_rtx_SET (VOIDmode, target, x));
26682           return true;
26683         }
26684       goto widen;
26685
26686     case V8QImode:
26687       if (!mmx_ok)
26688         return false;
26689       goto widen;
26690
26691     case V8HImode:
26692       if (TARGET_SSE2)
26693         {
26694           struct expand_vec_perm_d dperm;
26695           rtx tmp1, tmp2;
26696
26697         permute:
26698           memset (&dperm, 0, sizeof (dperm));
26699           dperm.target = target;
26700           dperm.vmode = mode;
26701           dperm.nelt = GET_MODE_NUNITS (mode);
26702           dperm.op0 = dperm.op1 = gen_reg_rtx (mode);
26703
26704           /* Extend to SImode using a paradoxical SUBREG.  */
26705           tmp1 = gen_reg_rtx (SImode);
26706           emit_move_insn (tmp1, gen_lowpart (SImode, val));
26707
26708           /* Insert the SImode value as low element of a V4SImode vector. */
26709           tmp2 = gen_lowpart (V4SImode, dperm.op0);
26710           emit_insn (gen_vec_setv4si_0 (tmp2, CONST0_RTX (V4SImode), tmp1));
26711
26712           ok = (expand_vec_perm_1 (&dperm)
26713                 || expand_vec_perm_broadcast_1 (&dperm));
26714           gcc_assert (ok);
26715           return ok;
26716         }
26717       goto widen;
26718
26719     case V16QImode:
26720       if (TARGET_SSE2)
26721         goto permute;
26722       goto widen;
26723
26724     widen:
26725       /* Replicate the value once into the next wider mode and recurse.  */
26726       {
26727         enum machine_mode smode, wsmode, wvmode;
26728         rtx x;
26729
26730         smode = GET_MODE_INNER (mode);
26731         wvmode = get_mode_wider_vector (mode);
26732         wsmode = GET_MODE_INNER (wvmode);
26733
26734         val = convert_modes (wsmode, smode, val, true);
26735         x = expand_simple_binop (wsmode, ASHIFT, val,
26736                                  GEN_INT (GET_MODE_BITSIZE (smode)),
26737                                  NULL_RTX, 1, OPTAB_LIB_WIDEN);
26738         val = expand_simple_binop (wsmode, IOR, val, x, x, 1, OPTAB_LIB_WIDEN);
26739
26740         x = gen_lowpart (wvmode, target);
26741         ok = ix86_expand_vector_init_duplicate (mmx_ok, wvmode, x, val);
26742         gcc_assert (ok);
26743         return ok;
26744       }
26745
26746     case V16HImode:
26747     case V32QImode:
26748       {
26749         enum machine_mode hvmode = (mode == V16HImode ? V8HImode : V16QImode);
26750         rtx x = gen_reg_rtx (hvmode);
26751
26752         ok = ix86_expand_vector_init_duplicate (false, hvmode, x, val);
26753         gcc_assert (ok);
26754
26755         x = gen_rtx_VEC_CONCAT (mode, x, x);
26756         emit_insn (gen_rtx_SET (VOIDmode, target, x));
26757       }
26758       return true;
26759
26760     default:
26761       return false;
26762     }
26763 }
26764
26765 /* A subroutine of ix86_expand_vector_init.  Store into TARGET a vector
26766    whose ONE_VAR element is VAR, and other elements are zero.  Return true
26767    if successful.  */
26768
26769 static bool
26770 ix86_expand_vector_init_one_nonzero (bool mmx_ok, enum machine_mode mode,
26771                                      rtx target, rtx var, int one_var)
26772 {
26773   enum machine_mode vsimode;
26774   rtx new_target;
26775   rtx x, tmp;
26776   bool use_vector_set = false;
26777
26778   switch (mode)
26779     {
26780     case V2DImode:
26781       /* For SSE4.1, we normally use vector set.  But if the second
26782          element is zero and inter-unit moves are OK, we use movq
26783          instead.  */
26784       use_vector_set = (TARGET_64BIT
26785                         && TARGET_SSE4_1
26786                         && !(TARGET_INTER_UNIT_MOVES
26787                              && one_var == 0));
26788       break;
26789     case V16QImode:
26790     case V4SImode:
26791     case V4SFmode:
26792       use_vector_set = TARGET_SSE4_1;
26793       break;
26794     case V8HImode:
26795       use_vector_set = TARGET_SSE2;
26796       break;
26797     case V4HImode:
26798       use_vector_set = TARGET_SSE || TARGET_3DNOW_A;
26799       break;
26800     case V32QImode:
26801     case V16HImode:
26802     case V8SImode:
26803     case V8SFmode:
26804     case V4DFmode:
26805       use_vector_set = TARGET_AVX;
26806       break;
26807     case V4DImode:
26808       /* Use ix86_expand_vector_set in 64bit mode only.  */
26809       use_vector_set = TARGET_AVX && TARGET_64BIT;
26810       break;
26811     default:
26812       break;
26813     }
26814
26815   if (use_vector_set)
26816     {
26817       emit_insn (gen_rtx_SET (VOIDmode, target, CONST0_RTX (mode)));
26818       var = force_reg (GET_MODE_INNER (mode), var);
26819       ix86_expand_vector_set (mmx_ok, target, var, one_var);
26820       return true; 
26821     }
26822
26823   switch (mode)
26824     {
26825     case V2SFmode:
26826     case V2SImode:
26827       if (!mmx_ok)
26828         return false;
26829       /* FALLTHRU */
26830
26831     case V2DFmode:
26832     case V2DImode:
26833       if (one_var != 0)
26834         return false;
26835       var = force_reg (GET_MODE_INNER (mode), var);
26836       x = gen_rtx_VEC_CONCAT (mode, var, CONST0_RTX (GET_MODE_INNER (mode)));
26837       emit_insn (gen_rtx_SET (VOIDmode, target, x));
26838       return true;
26839
26840     case V4SFmode:
26841     case V4SImode:
26842       if (!REG_P (target) || REGNO (target) < FIRST_PSEUDO_REGISTER)
26843         new_target = gen_reg_rtx (mode);
26844       else
26845         new_target = target;
26846       var = force_reg (GET_MODE_INNER (mode), var);
26847       x = gen_rtx_VEC_DUPLICATE (mode, var);
26848       x = gen_rtx_VEC_MERGE (mode, x, CONST0_RTX (mode), const1_rtx);
26849       emit_insn (gen_rtx_SET (VOIDmode, new_target, x));
26850       if (one_var != 0)
26851         {
26852           /* We need to shuffle the value to the correct position, so
26853              create a new pseudo to store the intermediate result.  */
26854
26855           /* With SSE2, we can use the integer shuffle insns.  */
26856           if (mode != V4SFmode && TARGET_SSE2)
26857             {
26858               emit_insn (gen_sse2_pshufd_1 (new_target, new_target,
26859                                             const1_rtx,
26860                                             GEN_INT (one_var == 1 ? 0 : 1),
26861                                             GEN_INT (one_var == 2 ? 0 : 1),
26862                                             GEN_INT (one_var == 3 ? 0 : 1)));
26863               if (target != new_target)
26864                 emit_move_insn (target, new_target);
26865               return true;
26866             }
26867
26868           /* Otherwise convert the intermediate result to V4SFmode and
26869              use the SSE1 shuffle instructions.  */
26870           if (mode != V4SFmode)
26871             {
26872               tmp = gen_reg_rtx (V4SFmode);
26873               emit_move_insn (tmp, gen_lowpart (V4SFmode, new_target));
26874             }
26875           else
26876             tmp = new_target;
26877
26878           emit_insn (gen_sse_shufps_v4sf (tmp, tmp, tmp,
26879                                        const1_rtx,
26880                                        GEN_INT (one_var == 1 ? 0 : 1),
26881                                        GEN_INT (one_var == 2 ? 0+4 : 1+4),
26882                                        GEN_INT (one_var == 3 ? 0+4 : 1+4)));
26883
26884           if (mode != V4SFmode)
26885             emit_move_insn (target, gen_lowpart (V4SImode, tmp));
26886           else if (tmp != target)
26887             emit_move_insn (target, tmp);
26888         }
26889       else if (target != new_target)
26890         emit_move_insn (target, new_target);
26891       return true;
26892
26893     case V8HImode:
26894     case V16QImode:
26895       vsimode = V4SImode;
26896       goto widen;
26897     case V4HImode:
26898     case V8QImode:
26899       if (!mmx_ok)
26900         return false;
26901       vsimode = V2SImode;
26902       goto widen;
26903     widen:
26904       if (one_var != 0)
26905         return false;
26906
26907       /* Zero extend the variable element to SImode and recurse.  */
26908       var = convert_modes (SImode, GET_MODE_INNER (mode), var, true);
26909
26910       x = gen_reg_rtx (vsimode);
26911       if (!ix86_expand_vector_init_one_nonzero (mmx_ok, vsimode, x,
26912                                                 var, one_var))
26913         gcc_unreachable ();
26914
26915       emit_move_insn (target, gen_lowpart (mode, x));
26916       return true;
26917
26918     default:
26919       return false;
26920     }
26921 }
26922
26923 /* A subroutine of ix86_expand_vector_init.  Store into TARGET a vector
26924    consisting of the values in VALS.  It is known that all elements
26925    except ONE_VAR are constants.  Return true if successful.  */
26926
26927 static bool
26928 ix86_expand_vector_init_one_var (bool mmx_ok, enum machine_mode mode,
26929                                  rtx target, rtx vals, int one_var)
26930 {
26931   rtx var = XVECEXP (vals, 0, one_var);
26932   enum machine_mode wmode;
26933   rtx const_vec, x;
26934
26935   const_vec = copy_rtx (vals);
26936   XVECEXP (const_vec, 0, one_var) = CONST0_RTX (GET_MODE_INNER (mode));
26937   const_vec = gen_rtx_CONST_VECTOR (mode, XVEC (const_vec, 0));
26938
26939   switch (mode)
26940     {
26941     case V2DFmode:
26942     case V2DImode:
26943     case V2SFmode:
26944     case V2SImode:
26945       /* For the two element vectors, it's just as easy to use
26946          the general case.  */
26947       return false;
26948
26949     case V4DImode:
26950       /* Use ix86_expand_vector_set in 64bit mode only.  */
26951       if (!TARGET_64BIT)
26952         return false;
26953     case V4DFmode:
26954     case V8SFmode:
26955     case V8SImode:
26956     case V16HImode:
26957     case V32QImode:
26958     case V4SFmode:
26959     case V4SImode:
26960     case V8HImode:
26961     case V4HImode:
26962       break;
26963
26964     case V16QImode:
26965       if (TARGET_SSE4_1)
26966         break;
26967       wmode = V8HImode;
26968       goto widen;
26969     case V8QImode:
26970       wmode = V4HImode;
26971       goto widen;
26972     widen:
26973       /* There's no way to set one QImode entry easily.  Combine
26974          the variable value with its adjacent constant value, and
26975          promote to an HImode set.  */
26976       x = XVECEXP (vals, 0, one_var ^ 1);
26977       if (one_var & 1)
26978         {
26979           var = convert_modes (HImode, QImode, var, true);
26980           var = expand_simple_binop (HImode, ASHIFT, var, GEN_INT (8),
26981                                      NULL_RTX, 1, OPTAB_LIB_WIDEN);
26982           x = GEN_INT (INTVAL (x) & 0xff);
26983         }
26984       else
26985         {
26986           var = convert_modes (HImode, QImode, var, true);
26987           x = gen_int_mode (INTVAL (x) << 8, HImode);
26988         }
26989       if (x != const0_rtx)
26990         var = expand_simple_binop (HImode, IOR, var, x, var,
26991                                    1, OPTAB_LIB_WIDEN);
26992
26993       x = gen_reg_rtx (wmode);
26994       emit_move_insn (x, gen_lowpart (wmode, const_vec));
26995       ix86_expand_vector_set (mmx_ok, x, var, one_var >> 1);
26996
26997       emit_move_insn (target, gen_lowpart (mode, x));
26998       return true;
26999
27000     default:
27001       return false;
27002     }
27003
27004   emit_move_insn (target, const_vec);
27005   ix86_expand_vector_set (mmx_ok, target, var, one_var);
27006   return true;
27007 }
27008
27009 /* A subroutine of ix86_expand_vector_init_general.  Use vector
27010    concatenate to handle the most general case: all values variable,
27011    and none identical.  */
27012
27013 static void
27014 ix86_expand_vector_init_concat (enum machine_mode mode,
27015                                 rtx target, rtx *ops, int n)
27016 {
27017   enum machine_mode cmode, hmode = VOIDmode;
27018   rtx first[8], second[4];
27019   rtvec v;
27020   int i, j;
27021
27022   switch (n)
27023     {
27024     case 2:
27025       switch (mode)
27026         {
27027         case V8SImode:
27028           cmode = V4SImode;
27029           break;
27030         case V8SFmode:
27031           cmode = V4SFmode;
27032           break;
27033         case V4DImode:
27034           cmode = V2DImode;
27035           break;
27036         case V4DFmode:
27037           cmode = V2DFmode;
27038           break;
27039         case V4SImode:
27040           cmode = V2SImode;
27041           break;
27042         case V4SFmode:
27043           cmode = V2SFmode;
27044           break;
27045         case V2DImode:
27046           cmode = DImode;
27047           break;
27048         case V2SImode:
27049           cmode = SImode;
27050           break;
27051         case V2DFmode:
27052           cmode = DFmode;
27053           break;
27054         case V2SFmode:
27055           cmode = SFmode;
27056           break;
27057         default:
27058           gcc_unreachable ();
27059         }
27060
27061       if (!register_operand (ops[1], cmode))
27062         ops[1] = force_reg (cmode, ops[1]);
27063       if (!register_operand (ops[0], cmode))
27064         ops[0] = force_reg (cmode, ops[0]);
27065       emit_insn (gen_rtx_SET (VOIDmode, target,
27066                               gen_rtx_VEC_CONCAT (mode, ops[0],
27067                                                   ops[1])));
27068       break;
27069
27070     case 4:
27071       switch (mode)
27072         {
27073         case V4DImode:
27074           cmode = V2DImode;
27075           break;
27076         case V4DFmode:
27077           cmode = V2DFmode;
27078           break;
27079         case V4SImode:
27080           cmode = V2SImode;
27081           break;
27082         case V4SFmode:
27083           cmode = V2SFmode;
27084           break;
27085         default:
27086           gcc_unreachable ();
27087         }
27088       goto half;
27089
27090     case 8:
27091       switch (mode)
27092         {
27093         case V8SImode:
27094           cmode = V2SImode;
27095           hmode = V4SImode;
27096           break;
27097         case V8SFmode:
27098           cmode = V2SFmode;
27099           hmode = V4SFmode;
27100           break;
27101         default:
27102           gcc_unreachable ();
27103         }
27104       goto half;
27105
27106 half:
27107       /* FIXME: We process inputs backward to help RA.  PR 36222.  */
27108       i = n - 1;
27109       j = (n >> 1) - 1;
27110       for (; i > 0; i -= 2, j--)
27111         {
27112           first[j] = gen_reg_rtx (cmode);
27113           v = gen_rtvec (2, ops[i - 1], ops[i]);
27114           ix86_expand_vector_init (false, first[j],
27115                                    gen_rtx_PARALLEL (cmode, v));
27116         }
27117
27118       n >>= 1;
27119       if (n > 2)
27120         {
27121           gcc_assert (hmode != VOIDmode);
27122           for (i = j = 0; i < n; i += 2, j++)
27123             {
27124               second[j] = gen_reg_rtx (hmode);
27125               ix86_expand_vector_init_concat (hmode, second [j],
27126                                               &first [i], 2);
27127             }
27128           n >>= 1;
27129           ix86_expand_vector_init_concat (mode, target, second, n);
27130         }
27131       else
27132         ix86_expand_vector_init_concat (mode, target, first, n);
27133       break;
27134
27135     default:
27136       gcc_unreachable ();
27137     }
27138 }
27139
27140 /* A subroutine of ix86_expand_vector_init_general.  Use vector
27141    interleave to handle the most general case: all values variable,
27142    and none identical.  */
27143
27144 static void
27145 ix86_expand_vector_init_interleave (enum machine_mode mode,
27146                                     rtx target, rtx *ops, int n)
27147 {
27148   enum machine_mode first_imode, second_imode, third_imode, inner_mode;
27149   int i, j;
27150   rtx op0, op1;
27151   rtx (*gen_load_even) (rtx, rtx, rtx);
27152   rtx (*gen_interleave_first_low) (rtx, rtx, rtx);
27153   rtx (*gen_interleave_second_low) (rtx, rtx, rtx);
27154   
27155   switch (mode)
27156     {
27157     case V8HImode:
27158       gen_load_even = gen_vec_setv8hi;
27159       gen_interleave_first_low = gen_vec_interleave_lowv4si;
27160       gen_interleave_second_low = gen_vec_interleave_lowv2di;
27161       inner_mode = HImode;
27162       first_imode = V4SImode;
27163       second_imode = V2DImode;
27164       third_imode = VOIDmode;
27165       break;
27166     case V16QImode:
27167       gen_load_even = gen_vec_setv16qi;
27168       gen_interleave_first_low = gen_vec_interleave_lowv8hi;
27169       gen_interleave_second_low = gen_vec_interleave_lowv4si;
27170       inner_mode = QImode;
27171       first_imode = V8HImode;
27172       second_imode = V4SImode;
27173       third_imode = V2DImode;
27174       break;
27175     default:
27176       gcc_unreachable ();
27177     }
27178      
27179   for (i = 0; i < n; i++)
27180     {
27181       /* Extend the odd elment to SImode using a paradoxical SUBREG.  */
27182       op0 = gen_reg_rtx (SImode);
27183       emit_move_insn (op0, gen_lowpart (SImode, ops [i + i]));
27184
27185       /* Insert the SImode value as low element of V4SImode vector. */
27186       op1 = gen_reg_rtx (V4SImode);
27187       op0 = gen_rtx_VEC_MERGE (V4SImode,
27188                                gen_rtx_VEC_DUPLICATE (V4SImode,
27189                                                       op0),
27190                                CONST0_RTX (V4SImode),
27191                                const1_rtx);
27192       emit_insn (gen_rtx_SET (VOIDmode, op1, op0));
27193
27194       /* Cast the V4SImode vector back to a vector in orignal mode.  */
27195       op0 = gen_reg_rtx (mode);
27196       emit_move_insn (op0, gen_lowpart (mode, op1));
27197       
27198       /* Load even elements into the second positon.  */
27199       emit_insn ((*gen_load_even) (op0,
27200                                    force_reg (inner_mode,
27201                                               ops [i + i + 1]),
27202                                    const1_rtx));
27203
27204       /* Cast vector to FIRST_IMODE vector.  */
27205       ops[i] = gen_reg_rtx (first_imode);
27206       emit_move_insn (ops[i], gen_lowpart (first_imode, op0));
27207     }
27208
27209   /* Interleave low FIRST_IMODE vectors.  */
27210   for (i = j = 0; i < n; i += 2, j++)
27211     {
27212       op0 = gen_reg_rtx (first_imode);
27213       emit_insn ((*gen_interleave_first_low) (op0, ops[i], ops[i + 1]));
27214
27215       /* Cast FIRST_IMODE vector to SECOND_IMODE vector.  */
27216       ops[j] = gen_reg_rtx (second_imode);
27217       emit_move_insn (ops[j], gen_lowpart (second_imode, op0));
27218     }
27219
27220   /* Interleave low SECOND_IMODE vectors.  */
27221   switch (second_imode)
27222     {
27223     case V4SImode:
27224       for (i = j = 0; i < n / 2; i += 2, j++)
27225         {
27226           op0 = gen_reg_rtx (second_imode);
27227           emit_insn ((*gen_interleave_second_low) (op0, ops[i],
27228                                                    ops[i + 1]));
27229
27230           /* Cast the SECOND_IMODE vector to the THIRD_IMODE
27231              vector.  */
27232           ops[j] = gen_reg_rtx (third_imode);
27233           emit_move_insn (ops[j], gen_lowpart (third_imode, op0));
27234         }
27235       second_imode = V2DImode;
27236       gen_interleave_second_low = gen_vec_interleave_lowv2di;
27237       /* FALLTHRU */
27238
27239     case V2DImode:
27240       op0 = gen_reg_rtx (second_imode);
27241       emit_insn ((*gen_interleave_second_low) (op0, ops[0],
27242                                                ops[1]));
27243
27244       /* Cast the SECOND_IMODE vector back to a vector on original
27245          mode.  */
27246       emit_insn (gen_rtx_SET (VOIDmode, target,
27247                               gen_lowpart (mode, op0)));
27248       break;
27249
27250     default:
27251       gcc_unreachable ();
27252     }
27253 }
27254
27255 /* A subroutine of ix86_expand_vector_init.  Handle the most general case:
27256    all values variable, and none identical.  */
27257
27258 static void
27259 ix86_expand_vector_init_general (bool mmx_ok, enum machine_mode mode,
27260                                  rtx target, rtx vals)
27261 {
27262   rtx ops[32], op0, op1;
27263   enum machine_mode half_mode = VOIDmode;
27264   int n, i;
27265
27266   switch (mode)
27267     {
27268     case V2SFmode:
27269     case V2SImode:
27270       if (!mmx_ok && !TARGET_SSE)
27271         break;
27272       /* FALLTHRU */
27273
27274     case V8SFmode:
27275     case V8SImode:
27276     case V4DFmode:
27277     case V4DImode:
27278     case V4SFmode:
27279     case V4SImode:
27280     case V2DFmode:
27281     case V2DImode:
27282       n = GET_MODE_NUNITS (mode);
27283       for (i = 0; i < n; i++)
27284         ops[i] = XVECEXP (vals, 0, i);
27285       ix86_expand_vector_init_concat (mode, target, ops, n);
27286       return;
27287
27288     case V32QImode:
27289       half_mode = V16QImode;
27290       goto half;
27291
27292     case V16HImode:
27293       half_mode = V8HImode;
27294       goto half;
27295
27296 half:
27297       n = GET_MODE_NUNITS (mode);
27298       for (i = 0; i < n; i++)
27299         ops[i] = XVECEXP (vals, 0, i);
27300       op0 = gen_reg_rtx (half_mode);
27301       op1 = gen_reg_rtx (half_mode);
27302       ix86_expand_vector_init_interleave (half_mode, op0, ops,
27303                                           n >> 2);
27304       ix86_expand_vector_init_interleave (half_mode, op1,
27305                                           &ops [n >> 1], n >> 2);
27306       emit_insn (gen_rtx_SET (VOIDmode, target,
27307                               gen_rtx_VEC_CONCAT (mode, op0, op1)));
27308       return;
27309
27310     case V16QImode:
27311       if (!TARGET_SSE4_1)
27312         break;
27313       /* FALLTHRU */
27314
27315     case V8HImode:
27316       if (!TARGET_SSE2)
27317         break;
27318
27319       /* Don't use ix86_expand_vector_init_interleave if we can't
27320          move from GPR to SSE register directly.  */ 
27321       if (!TARGET_INTER_UNIT_MOVES)
27322         break;
27323
27324       n = GET_MODE_NUNITS (mode);
27325       for (i = 0; i < n; i++)
27326         ops[i] = XVECEXP (vals, 0, i);
27327       ix86_expand_vector_init_interleave (mode, target, ops, n >> 1);
27328       return;
27329
27330     case V4HImode:
27331     case V8QImode:
27332       break;
27333
27334     default:
27335       gcc_unreachable ();
27336     }
27337
27338     {
27339       int i, j, n_elts, n_words, n_elt_per_word;
27340       enum machine_mode inner_mode;
27341       rtx words[4], shift;
27342
27343       inner_mode = GET_MODE_INNER (mode);
27344       n_elts = GET_MODE_NUNITS (mode);
27345       n_words = GET_MODE_SIZE (mode) / UNITS_PER_WORD;
27346       n_elt_per_word = n_elts / n_words;
27347       shift = GEN_INT (GET_MODE_BITSIZE (inner_mode));
27348
27349       for (i = 0; i < n_words; ++i)
27350         {
27351           rtx word = NULL_RTX;
27352
27353           for (j = 0; j < n_elt_per_word; ++j)
27354             {
27355               rtx elt = XVECEXP (vals, 0, (i+1)*n_elt_per_word - j - 1);
27356               elt = convert_modes (word_mode, inner_mode, elt, true);
27357
27358               if (j == 0)
27359                 word = elt;
27360               else
27361                 {
27362                   word = expand_simple_binop (word_mode, ASHIFT, word, shift,
27363                                               word, 1, OPTAB_LIB_WIDEN);
27364                   word = expand_simple_binop (word_mode, IOR, word, elt,
27365                                               word, 1, OPTAB_LIB_WIDEN);
27366                 }
27367             }
27368
27369           words[i] = word;
27370         }
27371
27372       if (n_words == 1)
27373         emit_move_insn (target, gen_lowpart (mode, words[0]));
27374       else if (n_words == 2)
27375         {
27376           rtx tmp = gen_reg_rtx (mode);
27377           emit_clobber (tmp);
27378           emit_move_insn (gen_lowpart (word_mode, tmp), words[0]);
27379           emit_move_insn (gen_highpart (word_mode, tmp), words[1]);
27380           emit_move_insn (target, tmp);
27381         }
27382       else if (n_words == 4)
27383         {
27384           rtx tmp = gen_reg_rtx (V4SImode);
27385           gcc_assert (word_mode == SImode);
27386           vals = gen_rtx_PARALLEL (V4SImode, gen_rtvec_v (4, words));
27387           ix86_expand_vector_init_general (false, V4SImode, tmp, vals);
27388           emit_move_insn (target, gen_lowpart (mode, tmp));
27389         }
27390       else
27391         gcc_unreachable ();
27392     }
27393 }
27394
27395 /* Initialize vector TARGET via VALS.  Suppress the use of MMX
27396    instructions unless MMX_OK is true.  */
27397
27398 void
27399 ix86_expand_vector_init (bool mmx_ok, rtx target, rtx vals)
27400 {
27401   enum machine_mode mode = GET_MODE (target);
27402   enum machine_mode inner_mode = GET_MODE_INNER (mode);
27403   int n_elts = GET_MODE_NUNITS (mode);
27404   int n_var = 0, one_var = -1;
27405   bool all_same = true, all_const_zero = true;
27406   int i;
27407   rtx x;
27408
27409   for (i = 0; i < n_elts; ++i)
27410     {
27411       x = XVECEXP (vals, 0, i);
27412       if (!(CONST_INT_P (x)
27413             || GET_CODE (x) == CONST_DOUBLE
27414             || GET_CODE (x) == CONST_FIXED))
27415         n_var++, one_var = i;
27416       else if (x != CONST0_RTX (inner_mode))
27417         all_const_zero = false;
27418       if (i > 0 && !rtx_equal_p (x, XVECEXP (vals, 0, 0)))
27419         all_same = false;
27420     }
27421
27422   /* Constants are best loaded from the constant pool.  */
27423   if (n_var == 0)
27424     {
27425       emit_move_insn (target, gen_rtx_CONST_VECTOR (mode, XVEC (vals, 0)));
27426       return;
27427     }
27428
27429   /* If all values are identical, broadcast the value.  */
27430   if (all_same
27431       && ix86_expand_vector_init_duplicate (mmx_ok, mode, target,
27432                                             XVECEXP (vals, 0, 0)))
27433     return;
27434
27435   /* Values where only one field is non-constant are best loaded from
27436      the pool and overwritten via move later.  */
27437   if (n_var == 1)
27438     {
27439       if (all_const_zero
27440           && ix86_expand_vector_init_one_nonzero (mmx_ok, mode, target,
27441                                                   XVECEXP (vals, 0, one_var),
27442                                                   one_var))
27443         return;
27444
27445       if (ix86_expand_vector_init_one_var (mmx_ok, mode, target, vals, one_var))
27446         return;
27447     }
27448
27449   ix86_expand_vector_init_general (mmx_ok, mode, target, vals);
27450 }
27451
27452 void
27453 ix86_expand_vector_set (bool mmx_ok, rtx target, rtx val, int elt)
27454 {
27455   enum machine_mode mode = GET_MODE (target);
27456   enum machine_mode inner_mode = GET_MODE_INNER (mode);
27457   enum machine_mode half_mode;
27458   bool use_vec_merge = false;
27459   rtx tmp;
27460   static rtx (*gen_extract[6][2]) (rtx, rtx)
27461     = {
27462         { gen_vec_extract_lo_v32qi, gen_vec_extract_hi_v32qi },
27463         { gen_vec_extract_lo_v16hi, gen_vec_extract_hi_v16hi },
27464         { gen_vec_extract_lo_v8si, gen_vec_extract_hi_v8si },
27465         { gen_vec_extract_lo_v4di, gen_vec_extract_hi_v4di },
27466         { gen_vec_extract_lo_v8sf, gen_vec_extract_hi_v8sf },
27467         { gen_vec_extract_lo_v4df, gen_vec_extract_hi_v4df }
27468       };
27469   static rtx (*gen_insert[6][2]) (rtx, rtx, rtx)
27470     = {
27471         { gen_vec_set_lo_v32qi, gen_vec_set_hi_v32qi },
27472         { gen_vec_set_lo_v16hi, gen_vec_set_hi_v16hi },
27473         { gen_vec_set_lo_v8si, gen_vec_set_hi_v8si },
27474         { gen_vec_set_lo_v4di, gen_vec_set_hi_v4di },
27475         { gen_vec_set_lo_v8sf, gen_vec_set_hi_v8sf },
27476         { gen_vec_set_lo_v4df, gen_vec_set_hi_v4df }
27477       };
27478   int i, j, n;
27479
27480   switch (mode)
27481     {
27482     case V2SFmode:
27483     case V2SImode:
27484       if (mmx_ok)
27485         {
27486           tmp = gen_reg_rtx (GET_MODE_INNER (mode));
27487           ix86_expand_vector_extract (true, tmp, target, 1 - elt);
27488           if (elt == 0)
27489             tmp = gen_rtx_VEC_CONCAT (mode, tmp, val);
27490           else
27491             tmp = gen_rtx_VEC_CONCAT (mode, val, tmp);
27492           emit_insn (gen_rtx_SET (VOIDmode, target, tmp));
27493           return;
27494         }
27495       break;
27496
27497     case V2DImode:
27498       use_vec_merge = TARGET_SSE4_1;
27499       if (use_vec_merge)
27500         break;
27501
27502     case V2DFmode:
27503       {
27504         rtx op0, op1;
27505
27506         /* For the two element vectors, we implement a VEC_CONCAT with
27507            the extraction of the other element.  */
27508
27509         tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (1, GEN_INT (1 - elt)));
27510         tmp = gen_rtx_VEC_SELECT (inner_mode, target, tmp);
27511
27512         if (elt == 0)
27513           op0 = val, op1 = tmp;
27514         else
27515           op0 = tmp, op1 = val;
27516
27517         tmp = gen_rtx_VEC_CONCAT (mode, op0, op1);
27518         emit_insn (gen_rtx_SET (VOIDmode, target, tmp));
27519       }
27520       return;
27521
27522     case V4SFmode:
27523       use_vec_merge = TARGET_SSE4_1;
27524       if (use_vec_merge)
27525         break;
27526
27527       switch (elt)
27528         {
27529         case 0:
27530           use_vec_merge = true;
27531           break;
27532
27533         case 1:
27534           /* tmp = target = A B C D */
27535           tmp = copy_to_reg (target);
27536           /* target = A A B B */
27537           emit_insn (gen_vec_interleave_lowv4sf (target, target, target));
27538           /* target = X A B B */
27539           ix86_expand_vector_set (false, target, val, 0);
27540           /* target = A X C D  */
27541           emit_insn (gen_sse_shufps_v4sf (target, target, tmp,
27542                                           const1_rtx, const0_rtx,
27543                                           GEN_INT (2+4), GEN_INT (3+4)));
27544           return;
27545
27546         case 2:
27547           /* tmp = target = A B C D */
27548           tmp = copy_to_reg (target);
27549           /* tmp = X B C D */
27550           ix86_expand_vector_set (false, tmp, val, 0);
27551           /* target = A B X D */
27552           emit_insn (gen_sse_shufps_v4sf (target, target, tmp,
27553                                           const0_rtx, const1_rtx,
27554                                           GEN_INT (0+4), GEN_INT (3+4)));
27555           return;
27556
27557         case 3:
27558           /* tmp = target = A B C D */
27559           tmp = copy_to_reg (target);
27560           /* tmp = X B C D */
27561           ix86_expand_vector_set (false, tmp, val, 0);
27562           /* target = A B X D */
27563           emit_insn (gen_sse_shufps_v4sf (target, target, tmp,
27564                                           const0_rtx, const1_rtx,
27565                                           GEN_INT (2+4), GEN_INT (0+4)));
27566           return;
27567
27568         default:
27569           gcc_unreachable ();
27570         }
27571       break;
27572
27573     case V4SImode:
27574       use_vec_merge = TARGET_SSE4_1;
27575       if (use_vec_merge)
27576         break;
27577
27578       /* Element 0 handled by vec_merge below.  */
27579       if (elt == 0)
27580         {
27581           use_vec_merge = true;
27582           break;
27583         }
27584
27585       if (TARGET_SSE2)
27586         {
27587           /* With SSE2, use integer shuffles to swap element 0 and ELT,
27588              store into element 0, then shuffle them back.  */
27589
27590           rtx order[4];
27591
27592           order[0] = GEN_INT (elt);
27593           order[1] = const1_rtx;
27594           order[2] = const2_rtx;
27595           order[3] = GEN_INT (3);
27596           order[elt] = const0_rtx;
27597
27598           emit_insn (gen_sse2_pshufd_1 (target, target, order[0],
27599                                         order[1], order[2], order[3]));
27600
27601           ix86_expand_vector_set (false, target, val, 0);
27602
27603           emit_insn (gen_sse2_pshufd_1 (target, target, order[0],
27604                                         order[1], order[2], order[3]));
27605         }
27606       else
27607         {
27608           /* For SSE1, we have to reuse the V4SF code.  */
27609           ix86_expand_vector_set (false, gen_lowpart (V4SFmode, target),
27610                                   gen_lowpart (SFmode, val), elt);
27611         }
27612       return;
27613
27614     case V8HImode:
27615       use_vec_merge = TARGET_SSE2;
27616       break;
27617     case V4HImode:
27618       use_vec_merge = mmx_ok && (TARGET_SSE || TARGET_3DNOW_A);
27619       break;
27620
27621     case V16QImode:
27622       use_vec_merge = TARGET_SSE4_1;
27623       break;
27624
27625     case V8QImode:
27626       break;
27627
27628     case V32QImode:
27629       half_mode = V16QImode;
27630       j = 0;
27631       n = 16;
27632       goto half;
27633
27634     case V16HImode:
27635       half_mode = V8HImode;
27636       j = 1;
27637       n = 8;
27638       goto half;
27639
27640     case V8SImode:
27641       half_mode = V4SImode;
27642       j = 2;
27643       n = 4;
27644       goto half;
27645
27646     case V4DImode:
27647       half_mode = V2DImode;
27648       j = 3;
27649       n = 2;
27650       goto half;
27651
27652     case V8SFmode:
27653       half_mode = V4SFmode;
27654       j = 4;
27655       n = 4;
27656       goto half;
27657
27658     case V4DFmode:
27659       half_mode = V2DFmode;
27660       j = 5;
27661       n = 2;
27662       goto half;
27663
27664 half:
27665       /* Compute offset.  */
27666       i = elt / n;
27667       elt %= n;
27668
27669       gcc_assert (i <= 1);
27670
27671       /* Extract the half.  */
27672       tmp = gen_reg_rtx (half_mode);
27673       emit_insn ((*gen_extract[j][i]) (tmp, target));
27674
27675       /* Put val in tmp at elt.  */
27676       ix86_expand_vector_set (false, tmp, val, elt);
27677
27678       /* Put it back.  */
27679       emit_insn ((*gen_insert[j][i]) (target, target, tmp));
27680       return;
27681
27682     default:
27683       break;
27684     }
27685
27686   if (use_vec_merge)
27687     {
27688       tmp = gen_rtx_VEC_DUPLICATE (mode, val);
27689       tmp = gen_rtx_VEC_MERGE (mode, tmp, target, GEN_INT (1 << elt));
27690       emit_insn (gen_rtx_SET (VOIDmode, target, tmp));
27691     }
27692   else
27693     {
27694       rtx mem = assign_stack_temp (mode, GET_MODE_SIZE (mode), false);
27695
27696       emit_move_insn (mem, target);
27697
27698       tmp = adjust_address (mem, inner_mode, elt*GET_MODE_SIZE (inner_mode));
27699       emit_move_insn (tmp, val);
27700
27701       emit_move_insn (target, mem);
27702     }
27703 }
27704
27705 void
27706 ix86_expand_vector_extract (bool mmx_ok, rtx target, rtx vec, int elt)
27707 {
27708   enum machine_mode mode = GET_MODE (vec);
27709   enum machine_mode inner_mode = GET_MODE_INNER (mode);
27710   bool use_vec_extr = false;
27711   rtx tmp;
27712
27713   switch (mode)
27714     {
27715     case V2SImode:
27716     case V2SFmode:
27717       if (!mmx_ok)
27718         break;
27719       /* FALLTHRU */
27720
27721     case V2DFmode:
27722     case V2DImode:
27723       use_vec_extr = true;
27724       break;
27725
27726     case V4SFmode:
27727       use_vec_extr = TARGET_SSE4_1;
27728       if (use_vec_extr)
27729         break;
27730
27731       switch (elt)
27732         {
27733         case 0:
27734           tmp = vec;
27735           break;
27736
27737         case 1:
27738         case 3:
27739           tmp = gen_reg_rtx (mode);
27740           emit_insn (gen_sse_shufps_v4sf (tmp, vec, vec,
27741                                        GEN_INT (elt), GEN_INT (elt),
27742                                        GEN_INT (elt+4), GEN_INT (elt+4)));
27743           break;
27744
27745         case 2:
27746           tmp = gen_reg_rtx (mode);
27747           emit_insn (gen_vec_interleave_highv4sf (tmp, vec, vec));
27748           break;
27749
27750         default:
27751           gcc_unreachable ();
27752         }
27753       vec = tmp;
27754       use_vec_extr = true;
27755       elt = 0;
27756       break;
27757
27758     case V4SImode:
27759       use_vec_extr = TARGET_SSE4_1;
27760       if (use_vec_extr)
27761         break;
27762
27763       if (TARGET_SSE2)
27764         {
27765           switch (elt)
27766             {
27767             case 0:
27768               tmp = vec;
27769               break;
27770
27771             case 1:
27772             case 3:
27773               tmp = gen_reg_rtx (mode);
27774               emit_insn (gen_sse2_pshufd_1 (tmp, vec,
27775                                             GEN_INT (elt), GEN_INT (elt),
27776                                             GEN_INT (elt), GEN_INT (elt)));
27777               break;
27778
27779             case 2:
27780               tmp = gen_reg_rtx (mode);
27781               emit_insn (gen_vec_interleave_highv4si (tmp, vec, vec));
27782               break;
27783
27784             default:
27785               gcc_unreachable ();
27786             }
27787           vec = tmp;
27788           use_vec_extr = true;
27789           elt = 0;
27790         }
27791       else
27792         {
27793           /* For SSE1, we have to reuse the V4SF code.  */
27794           ix86_expand_vector_extract (false, gen_lowpart (SFmode, target),
27795                                       gen_lowpart (V4SFmode, vec), elt);
27796           return;
27797         }
27798       break;
27799
27800     case V8HImode:
27801       use_vec_extr = TARGET_SSE2;
27802       break;
27803     case V4HImode:
27804       use_vec_extr = mmx_ok && (TARGET_SSE || TARGET_3DNOW_A);
27805       break;
27806
27807     case V16QImode:
27808       use_vec_extr = TARGET_SSE4_1;
27809       break;
27810
27811     case V8QImode:
27812       /* ??? Could extract the appropriate HImode element and shift.  */
27813     default:
27814       break;
27815     }
27816
27817   if (use_vec_extr)
27818     {
27819       tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (1, GEN_INT (elt)));
27820       tmp = gen_rtx_VEC_SELECT (inner_mode, vec, tmp);
27821
27822       /* Let the rtl optimizers know about the zero extension performed.  */
27823       if (inner_mode == QImode || inner_mode == HImode)
27824         {
27825           tmp = gen_rtx_ZERO_EXTEND (SImode, tmp);
27826           target = gen_lowpart (SImode, target);
27827         }
27828
27829       emit_insn (gen_rtx_SET (VOIDmode, target, tmp));
27830     }
27831   else
27832     {
27833       rtx mem = assign_stack_temp (mode, GET_MODE_SIZE (mode), false);
27834
27835       emit_move_insn (mem, vec);
27836
27837       tmp = adjust_address (mem, inner_mode, elt*GET_MODE_SIZE (inner_mode));
27838       emit_move_insn (target, tmp);
27839     }
27840 }
27841
27842 /* Expand a vector reduction on V4SFmode for SSE1.  FN is the binary
27843    pattern to reduce; DEST is the destination; IN is the input vector.  */
27844
27845 void
27846 ix86_expand_reduc_v4sf (rtx (*fn) (rtx, rtx, rtx), rtx dest, rtx in)
27847 {
27848   rtx tmp1, tmp2, tmp3;
27849
27850   tmp1 = gen_reg_rtx (V4SFmode);
27851   tmp2 = gen_reg_rtx (V4SFmode);
27852   tmp3 = gen_reg_rtx (V4SFmode);
27853
27854   emit_insn (gen_sse_movhlps (tmp1, in, in));
27855   emit_insn (fn (tmp2, tmp1, in));
27856
27857   emit_insn (gen_sse_shufps_v4sf (tmp3, tmp2, tmp2,
27858                                   const1_rtx, const1_rtx,
27859                                   GEN_INT (1+4), GEN_INT (1+4)));
27860   emit_insn (fn (dest, tmp2, tmp3));
27861 }
27862 \f
27863 /* Target hook for scalar_mode_supported_p.  */
27864 static bool
27865 ix86_scalar_mode_supported_p (enum machine_mode mode)
27866 {
27867   if (DECIMAL_FLOAT_MODE_P (mode))
27868     return default_decimal_float_supported_p ();
27869   else if (mode == TFmode)
27870     return true;
27871   else
27872     return default_scalar_mode_supported_p (mode);
27873 }
27874
27875 /* Implements target hook vector_mode_supported_p.  */
27876 static bool
27877 ix86_vector_mode_supported_p (enum machine_mode mode)
27878 {
27879   if (TARGET_SSE && VALID_SSE_REG_MODE (mode))
27880     return true;
27881   if (TARGET_SSE2 && VALID_SSE2_REG_MODE (mode))
27882     return true;
27883   if (TARGET_AVX && VALID_AVX256_REG_MODE (mode))
27884     return true;
27885   if (TARGET_MMX && VALID_MMX_REG_MODE (mode))
27886     return true;
27887   if (TARGET_3DNOW && VALID_MMX_REG_MODE_3DNOW (mode))
27888     return true;
27889   return false;
27890 }
27891
27892 /* Target hook for c_mode_for_suffix.  */
27893 static enum machine_mode
27894 ix86_c_mode_for_suffix (char suffix)
27895 {
27896   if (suffix == 'q')
27897     return TFmode;
27898   if (suffix == 'w')
27899     return XFmode;
27900
27901   return VOIDmode;
27902 }
27903
27904 /* Worker function for TARGET_MD_ASM_CLOBBERS.
27905
27906    We do this in the new i386 backend to maintain source compatibility
27907    with the old cc0-based compiler.  */
27908
27909 static tree
27910 ix86_md_asm_clobbers (tree outputs ATTRIBUTE_UNUSED,
27911                       tree inputs ATTRIBUTE_UNUSED,
27912                       tree clobbers)
27913 {
27914   clobbers = tree_cons (NULL_TREE, build_string (5, "flags"),
27915                         clobbers);
27916   clobbers = tree_cons (NULL_TREE, build_string (4, "fpsr"),
27917                         clobbers);
27918   return clobbers;
27919 }
27920
27921 /* Implements target vector targetm.asm.encode_section_info.  This
27922    is not used by netware.  */
27923
27924 static void ATTRIBUTE_UNUSED
27925 ix86_encode_section_info (tree decl, rtx rtl, int first)
27926 {
27927   default_encode_section_info (decl, rtl, first);
27928
27929   if (TREE_CODE (decl) == VAR_DECL
27930       && (TREE_STATIC (decl) || DECL_EXTERNAL (decl))
27931       && ix86_in_large_data_p (decl))
27932     SYMBOL_REF_FLAGS (XEXP (rtl, 0)) |= SYMBOL_FLAG_FAR_ADDR;
27933 }
27934
27935 /* Worker function for REVERSE_CONDITION.  */
27936
27937 enum rtx_code
27938 ix86_reverse_condition (enum rtx_code code, enum machine_mode mode)
27939 {
27940   return (mode != CCFPmode && mode != CCFPUmode
27941           ? reverse_condition (code)
27942           : reverse_condition_maybe_unordered (code));
27943 }
27944
27945 /* Output code to perform an x87 FP register move, from OPERANDS[1]
27946    to OPERANDS[0].  */
27947
27948 const char *
27949 output_387_reg_move (rtx insn, rtx *operands)
27950 {
27951   if (REG_P (operands[0]))
27952     {
27953       if (REG_P (operands[1])
27954           && find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
27955         {
27956           if (REGNO (operands[0]) == FIRST_STACK_REG)
27957             return output_387_ffreep (operands, 0);
27958           return "fstp\t%y0";
27959         }
27960       if (STACK_TOP_P (operands[0]))
27961         return "fld%Z1\t%y1";
27962       return "fst\t%y0";
27963     }
27964   else if (MEM_P (operands[0]))
27965     {
27966       gcc_assert (REG_P (operands[1]));
27967       if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
27968         return "fstp%Z0\t%y0";
27969       else
27970         {
27971           /* There is no non-popping store to memory for XFmode.
27972              So if we need one, follow the store with a load.  */
27973           if (GET_MODE (operands[0]) == XFmode)
27974             return "fstp%Z0\t%y0\n\tfld%Z0\t%y0";
27975           else
27976             return "fst%Z0\t%y0";
27977         }
27978     }
27979   else
27980     gcc_unreachable();
27981 }
27982
27983 /* Output code to perform a conditional jump to LABEL, if C2 flag in
27984    FP status register is set.  */
27985
27986 void
27987 ix86_emit_fp_unordered_jump (rtx label)
27988 {
27989   rtx reg = gen_reg_rtx (HImode);
27990   rtx temp;
27991
27992   emit_insn (gen_x86_fnstsw_1 (reg));
27993
27994   if (TARGET_SAHF && (TARGET_USE_SAHF || optimize_insn_for_size_p ()))
27995     {
27996       emit_insn (gen_x86_sahf_1 (reg));
27997
27998       temp = gen_rtx_REG (CCmode, FLAGS_REG);
27999       temp = gen_rtx_UNORDERED (VOIDmode, temp, const0_rtx);
28000     }
28001   else
28002     {
28003       emit_insn (gen_testqi_ext_ccno_0 (reg, GEN_INT (0x04)));
28004
28005       temp = gen_rtx_REG (CCNOmode, FLAGS_REG);
28006       temp = gen_rtx_NE (VOIDmode, temp, const0_rtx);
28007     }
28008
28009   temp = gen_rtx_IF_THEN_ELSE (VOIDmode, temp,
28010                               gen_rtx_LABEL_REF (VOIDmode, label),
28011                               pc_rtx);
28012   temp = gen_rtx_SET (VOIDmode, pc_rtx, temp);
28013
28014   emit_jump_insn (temp);
28015   predict_jump (REG_BR_PROB_BASE * 10 / 100);
28016 }
28017
28018 /* Output code to perform a log1p XFmode calculation.  */
28019
28020 void ix86_emit_i387_log1p (rtx op0, rtx op1)
28021 {
28022   rtx label1 = gen_label_rtx ();
28023   rtx label2 = gen_label_rtx ();
28024
28025   rtx tmp = gen_reg_rtx (XFmode);
28026   rtx tmp2 = gen_reg_rtx (XFmode);
28027   rtx test;
28028
28029   emit_insn (gen_absxf2 (tmp, op1));
28030   test = gen_rtx_GE (VOIDmode, tmp,
28031     CONST_DOUBLE_FROM_REAL_VALUE (
28032        REAL_VALUE_ATOF ("0.29289321881345247561810596348408353", XFmode),
28033        XFmode));
28034   emit_jump_insn (gen_cbranchxf4 (test, XEXP (test, 0), XEXP (test, 1), label1));
28035
28036   emit_move_insn (tmp2, standard_80387_constant_rtx (4)); /* fldln2 */
28037   emit_insn (gen_fyl2xp1xf3_i387 (op0, op1, tmp2));
28038   emit_jump (label2);
28039
28040   emit_label (label1);
28041   emit_move_insn (tmp, CONST1_RTX (XFmode));
28042   emit_insn (gen_addxf3 (tmp, op1, tmp));
28043   emit_move_insn (tmp2, standard_80387_constant_rtx (4)); /* fldln2 */
28044   emit_insn (gen_fyl2xxf3_i387 (op0, tmp, tmp2));
28045
28046   emit_label (label2);
28047 }
28048
28049 /* Output code to perform a Newton-Rhapson approximation of a single precision
28050    floating point divide [http://en.wikipedia.org/wiki/N-th_root_algorithm].  */
28051
28052 void ix86_emit_swdivsf (rtx res, rtx a, rtx b, enum machine_mode mode)
28053 {
28054   rtx x0, x1, e0, e1, two;
28055
28056   x0 = gen_reg_rtx (mode);
28057   e0 = gen_reg_rtx (mode);
28058   e1 = gen_reg_rtx (mode);
28059   x1 = gen_reg_rtx (mode);
28060
28061   two = CONST_DOUBLE_FROM_REAL_VALUE (dconst2, SFmode);
28062
28063   if (VECTOR_MODE_P (mode))
28064     two = ix86_build_const_vector (SFmode, true, two);
28065
28066   two = force_reg (mode, two);
28067
28068   /* a / b = a * rcp(b) * (2.0 - b * rcp(b)) */
28069
28070   /* x0 = rcp(b) estimate */
28071   emit_insn (gen_rtx_SET (VOIDmode, x0,
28072                           gen_rtx_UNSPEC (mode, gen_rtvec (1, b),
28073                                           UNSPEC_RCP)));
28074   /* e0 = x0 * a */
28075   emit_insn (gen_rtx_SET (VOIDmode, e0,
28076                           gen_rtx_MULT (mode, x0, a)));
28077   /* e1 = x0 * b */
28078   emit_insn (gen_rtx_SET (VOIDmode, e1,
28079                           gen_rtx_MULT (mode, x0, b)));
28080   /* x1 = 2. - e1 */
28081   emit_insn (gen_rtx_SET (VOIDmode, x1,
28082                           gen_rtx_MINUS (mode, two, e1)));
28083   /* res = e0 * x1 */
28084   emit_insn (gen_rtx_SET (VOIDmode, res,
28085                           gen_rtx_MULT (mode, e0, x1)));
28086 }
28087
28088 /* Output code to perform a Newton-Rhapson approximation of a
28089    single precision floating point [reciprocal] square root.  */
28090
28091 void ix86_emit_swsqrtsf (rtx res, rtx a, enum machine_mode mode,
28092                          bool recip)
28093 {
28094   rtx x0, e0, e1, e2, e3, mthree, mhalf;
28095   REAL_VALUE_TYPE r;
28096
28097   x0 = gen_reg_rtx (mode);
28098   e0 = gen_reg_rtx (mode);
28099   e1 = gen_reg_rtx (mode);
28100   e2 = gen_reg_rtx (mode);
28101   e3 = gen_reg_rtx (mode);
28102
28103   real_from_integer (&r, VOIDmode, -3, -1, 0);
28104   mthree = CONST_DOUBLE_FROM_REAL_VALUE (r, SFmode);
28105
28106   real_arithmetic (&r, NEGATE_EXPR, &dconsthalf, NULL);
28107   mhalf = CONST_DOUBLE_FROM_REAL_VALUE (r, SFmode);
28108
28109   if (VECTOR_MODE_P (mode))
28110     {
28111       mthree = ix86_build_const_vector (SFmode, true, mthree);
28112       mhalf = ix86_build_const_vector (SFmode, true, mhalf);
28113     }
28114
28115   /* sqrt(a)  = -0.5 * a * rsqrtss(a) * (a * rsqrtss(a) * rsqrtss(a) - 3.0)
28116      rsqrt(a) = -0.5     * rsqrtss(a) * (a * rsqrtss(a) * rsqrtss(a) - 3.0) */
28117
28118   /* x0 = rsqrt(a) estimate */
28119   emit_insn (gen_rtx_SET (VOIDmode, x0,
28120                           gen_rtx_UNSPEC (mode, gen_rtvec (1, a),
28121                                           UNSPEC_RSQRT)));
28122
28123   /* If (a == 0.0) Filter out infinity to prevent NaN for sqrt(0.0).  */
28124   if (!recip)
28125     {
28126       rtx zero, mask;
28127
28128       zero = gen_reg_rtx (mode);
28129       mask = gen_reg_rtx (mode);
28130
28131       zero = force_reg (mode, CONST0_RTX(mode));
28132       emit_insn (gen_rtx_SET (VOIDmode, mask,
28133                               gen_rtx_NE (mode, zero, a)));
28134
28135       emit_insn (gen_rtx_SET (VOIDmode, x0,
28136                               gen_rtx_AND (mode, x0, mask)));
28137     }
28138
28139   /* e0 = x0 * a */
28140   emit_insn (gen_rtx_SET (VOIDmode, e0,
28141                           gen_rtx_MULT (mode, x0, a)));
28142   /* e1 = e0 * x0 */
28143   emit_insn (gen_rtx_SET (VOIDmode, e1,
28144                           gen_rtx_MULT (mode, e0, x0)));
28145
28146   /* e2 = e1 - 3. */
28147   mthree = force_reg (mode, mthree);
28148   emit_insn (gen_rtx_SET (VOIDmode, e2,
28149                           gen_rtx_PLUS (mode, e1, mthree)));
28150
28151   mhalf = force_reg (mode, mhalf);
28152   if (recip)
28153     /* e3 = -.5 * x0 */
28154     emit_insn (gen_rtx_SET (VOIDmode, e3,
28155                             gen_rtx_MULT (mode, x0, mhalf)));
28156   else
28157     /* e3 = -.5 * e0 */
28158     emit_insn (gen_rtx_SET (VOIDmode, e3,
28159                             gen_rtx_MULT (mode, e0, mhalf)));
28160   /* ret = e2 * e3 */
28161   emit_insn (gen_rtx_SET (VOIDmode, res,
28162                           gen_rtx_MULT (mode, e2, e3)));
28163 }
28164
28165 /* Solaris implementation of TARGET_ASM_NAMED_SECTION.  */
28166
28167 static void ATTRIBUTE_UNUSED
28168 i386_solaris_elf_named_section (const char *name, unsigned int flags,
28169                                 tree decl)
28170 {
28171   /* With Binutils 2.15, the "@unwind" marker must be specified on
28172      every occurrence of the ".eh_frame" section, not just the first
28173      one.  */
28174   if (TARGET_64BIT
28175       && strcmp (name, ".eh_frame") == 0)
28176     {
28177       fprintf (asm_out_file, "\t.section\t%s,\"%s\",@unwind\n", name,
28178                flags & SECTION_WRITE ? "aw" : "a");
28179       return;
28180     }
28181   default_elf_asm_named_section (name, flags, decl);
28182 }
28183
28184 /* Return the mangling of TYPE if it is an extended fundamental type.  */
28185
28186 static const char *
28187 ix86_mangle_type (const_tree type)
28188 {
28189   type = TYPE_MAIN_VARIANT (type);
28190
28191   if (TREE_CODE (type) != VOID_TYPE && TREE_CODE (type) != BOOLEAN_TYPE
28192       && TREE_CODE (type) != INTEGER_TYPE && TREE_CODE (type) != REAL_TYPE)
28193     return NULL;
28194
28195   switch (TYPE_MODE (type))
28196     {
28197     case TFmode:
28198       /* __float128 is "g".  */
28199       return "g";
28200     case XFmode:
28201       /* "long double" or __float80 is "e".  */
28202       return "e";
28203     default:
28204       return NULL;
28205     }
28206 }
28207
28208 /* For 32-bit code we can save PIC register setup by using
28209    __stack_chk_fail_local hidden function instead of calling
28210    __stack_chk_fail directly.  64-bit code doesn't need to setup any PIC
28211    register, so it is better to call __stack_chk_fail directly.  */
28212
28213 static tree
28214 ix86_stack_protect_fail (void)
28215 {
28216   return TARGET_64BIT
28217          ? default_external_stack_protect_fail ()
28218          : default_hidden_stack_protect_fail ();
28219 }
28220
28221 /* Select a format to encode pointers in exception handling data.  CODE
28222    is 0 for data, 1 for code labels, 2 for function pointers.  GLOBAL is
28223    true if the symbol may be affected by dynamic relocations.
28224
28225    ??? All x86 object file formats are capable of representing this.
28226    After all, the relocation needed is the same as for the call insn.
28227    Whether or not a particular assembler allows us to enter such, I
28228    guess we'll have to see.  */
28229 int
28230 asm_preferred_eh_data_format (int code, int global)
28231 {
28232   if (flag_pic)
28233     {
28234       int type = DW_EH_PE_sdata8;
28235       if (!TARGET_64BIT
28236           || ix86_cmodel == CM_SMALL_PIC
28237           || (ix86_cmodel == CM_MEDIUM_PIC && (global || code)))
28238         type = DW_EH_PE_sdata4;
28239       return (global ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel | type;
28240     }
28241   if (ix86_cmodel == CM_SMALL
28242       || (ix86_cmodel == CM_MEDIUM && code))
28243     return DW_EH_PE_udata4;
28244   return DW_EH_PE_absptr;
28245 }
28246 \f
28247 /* Expand copysign from SIGN to the positive value ABS_VALUE
28248    storing in RESULT.  If MASK is non-null, it shall be a mask to mask out
28249    the sign-bit.  */
28250 static void
28251 ix86_sse_copysign_to_positive (rtx result, rtx abs_value, rtx sign, rtx mask)
28252 {
28253   enum machine_mode mode = GET_MODE (sign);
28254   rtx sgn = gen_reg_rtx (mode);
28255   if (mask == NULL_RTX)
28256     {
28257       mask = ix86_build_signbit_mask (mode, VECTOR_MODE_P (mode), false);
28258       if (!VECTOR_MODE_P (mode))
28259         {
28260           /* We need to generate a scalar mode mask in this case.  */
28261           rtx tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (1, const0_rtx));
28262           tmp = gen_rtx_VEC_SELECT (mode, mask, tmp);
28263           mask = gen_reg_rtx (mode);
28264           emit_insn (gen_rtx_SET (VOIDmode, mask, tmp));
28265         }
28266     }
28267   else
28268     mask = gen_rtx_NOT (mode, mask);
28269   emit_insn (gen_rtx_SET (VOIDmode, sgn,
28270                           gen_rtx_AND (mode, mask, sign)));
28271   emit_insn (gen_rtx_SET (VOIDmode, result,
28272                           gen_rtx_IOR (mode, abs_value, sgn)));
28273 }
28274
28275 /* Expand fabs (OP0) and return a new rtx that holds the result.  The
28276    mask for masking out the sign-bit is stored in *SMASK, if that is
28277    non-null.  */
28278 static rtx
28279 ix86_expand_sse_fabs (rtx op0, rtx *smask)
28280 {
28281   enum machine_mode mode = GET_MODE (op0);
28282   rtx xa, mask;
28283
28284   xa = gen_reg_rtx (mode);
28285   mask = ix86_build_signbit_mask (mode, VECTOR_MODE_P (mode), true);
28286   if (!VECTOR_MODE_P (mode))
28287     {
28288       /* We need to generate a scalar mode mask in this case.  */
28289       rtx tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (1, const0_rtx));
28290       tmp = gen_rtx_VEC_SELECT (mode, mask, tmp);
28291       mask = gen_reg_rtx (mode);
28292       emit_insn (gen_rtx_SET (VOIDmode, mask, tmp));
28293     }
28294   emit_insn (gen_rtx_SET (VOIDmode, xa,
28295                           gen_rtx_AND (mode, op0, mask)));
28296
28297   if (smask)
28298     *smask = mask;
28299
28300   return xa;
28301 }
28302
28303 /* Expands a comparison of OP0 with OP1 using comparison code CODE,
28304    swapping the operands if SWAP_OPERANDS is true.  The expanded
28305    code is a forward jump to a newly created label in case the
28306    comparison is true.  The generated label rtx is returned.  */
28307 static rtx
28308 ix86_expand_sse_compare_and_jump (enum rtx_code code, rtx op0, rtx op1,
28309                                   bool swap_operands)
28310 {
28311   rtx label, tmp;
28312
28313   if (swap_operands)
28314     {
28315       tmp = op0;
28316       op0 = op1;
28317       op1 = tmp;
28318     }
28319
28320   label = gen_label_rtx ();
28321   tmp = gen_rtx_REG (CCFPUmode, FLAGS_REG);
28322   emit_insn (gen_rtx_SET (VOIDmode, tmp,
28323                           gen_rtx_COMPARE (CCFPUmode, op0, op1)));
28324   tmp = gen_rtx_fmt_ee (code, VOIDmode, tmp, const0_rtx);
28325   tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp,
28326                               gen_rtx_LABEL_REF (VOIDmode, label), pc_rtx);
28327   tmp = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, tmp));
28328   JUMP_LABEL (tmp) = label;
28329
28330   return label;
28331 }
28332
28333 /* Expand a mask generating SSE comparison instruction comparing OP0 with OP1
28334    using comparison code CODE.  Operands are swapped for the comparison if
28335    SWAP_OPERANDS is true.  Returns a rtx for the generated mask.  */
28336 static rtx
28337 ix86_expand_sse_compare_mask (enum rtx_code code, rtx op0, rtx op1,
28338                               bool swap_operands)
28339 {
28340   enum machine_mode mode = GET_MODE (op0);
28341   rtx mask = gen_reg_rtx (mode);
28342
28343   if (swap_operands)
28344     {
28345       rtx tmp = op0;
28346       op0 = op1;
28347       op1 = tmp;
28348     }
28349
28350   if (mode == DFmode)
28351     emit_insn (gen_sse2_maskcmpdf3 (mask, op0, op1,
28352                                     gen_rtx_fmt_ee (code, mode, op0, op1)));
28353   else
28354     emit_insn (gen_sse_maskcmpsf3 (mask, op0, op1,
28355                                    gen_rtx_fmt_ee (code, mode, op0, op1)));
28356
28357   return mask;
28358 }
28359
28360 /* Generate and return a rtx of mode MODE for 2**n where n is the number
28361    of bits of the mantissa of MODE, which must be one of DFmode or SFmode.  */
28362 static rtx
28363 ix86_gen_TWO52 (enum machine_mode mode)
28364 {
28365   REAL_VALUE_TYPE TWO52r;
28366   rtx TWO52;
28367
28368   real_ldexp (&TWO52r, &dconst1, mode == DFmode ? 52 : 23);
28369   TWO52 = const_double_from_real_value (TWO52r, mode);
28370   TWO52 = force_reg (mode, TWO52);
28371
28372   return TWO52;
28373 }
28374
28375 /* Expand SSE sequence for computing lround from OP1 storing
28376    into OP0.  */
28377 void
28378 ix86_expand_lround (rtx op0, rtx op1)
28379 {
28380   /* C code for the stuff we're doing below:
28381        tmp = op1 + copysign (nextafter (0.5, 0.0), op1)
28382        return (long)tmp;
28383    */
28384   enum machine_mode mode = GET_MODE (op1);
28385   const struct real_format *fmt;
28386   REAL_VALUE_TYPE pred_half, half_minus_pred_half;
28387   rtx adj;
28388
28389   /* load nextafter (0.5, 0.0) */
28390   fmt = REAL_MODE_FORMAT (mode);
28391   real_2expN (&half_minus_pred_half, -(fmt->p) - 1, mode);
28392   REAL_ARITHMETIC (pred_half, MINUS_EXPR, dconsthalf, half_minus_pred_half);
28393
28394   /* adj = copysign (0.5, op1) */
28395   adj = force_reg (mode, const_double_from_real_value (pred_half, mode));
28396   ix86_sse_copysign_to_positive (adj, adj, force_reg (mode, op1), NULL_RTX);
28397
28398   /* adj = op1 + adj */
28399   adj = expand_simple_binop (mode, PLUS, adj, op1, NULL_RTX, 0, OPTAB_DIRECT);
28400
28401   /* op0 = (imode)adj */
28402   expand_fix (op0, adj, 0);
28403 }
28404
28405 /* Expand SSE2 sequence for computing lround from OPERAND1 storing
28406    into OPERAND0.  */
28407 void
28408 ix86_expand_lfloorceil (rtx op0, rtx op1, bool do_floor)
28409 {
28410   /* C code for the stuff we're doing below (for do_floor):
28411         xi = (long)op1;
28412         xi -= (double)xi > op1 ? 1 : 0;
28413         return xi;
28414    */
28415   enum machine_mode fmode = GET_MODE (op1);
28416   enum machine_mode imode = GET_MODE (op0);
28417   rtx ireg, freg, label, tmp;
28418
28419   /* reg = (long)op1 */
28420   ireg = gen_reg_rtx (imode);
28421   expand_fix (ireg, op1, 0);
28422
28423   /* freg = (double)reg */
28424   freg = gen_reg_rtx (fmode);
28425   expand_float (freg, ireg, 0);
28426
28427   /* ireg = (freg > op1) ? ireg - 1 : ireg */
28428   label = ix86_expand_sse_compare_and_jump (UNLE,
28429                                             freg, op1, !do_floor);
28430   tmp = expand_simple_binop (imode, do_floor ? MINUS : PLUS,
28431                              ireg, const1_rtx, NULL_RTX, 0, OPTAB_DIRECT);
28432   emit_move_insn (ireg, tmp);
28433
28434   emit_label (label);
28435   LABEL_NUSES (label) = 1;
28436
28437   emit_move_insn (op0, ireg);
28438 }
28439
28440 /* Expand rint (IEEE round to nearest) rounding OPERAND1 and storing the
28441    result in OPERAND0.  */
28442 void
28443 ix86_expand_rint (rtx operand0, rtx operand1)
28444 {
28445   /* C code for the stuff we're doing below:
28446         xa = fabs (operand1);
28447         if (!isless (xa, 2**52))
28448           return operand1;
28449         xa = xa + 2**52 - 2**52;
28450         return copysign (xa, operand1);
28451    */
28452   enum machine_mode mode = GET_MODE (operand0);
28453   rtx res, xa, label, TWO52, mask;
28454
28455   res = gen_reg_rtx (mode);
28456   emit_move_insn (res, operand1);
28457
28458   /* xa = abs (operand1) */
28459   xa = ix86_expand_sse_fabs (res, &mask);
28460
28461   /* if (!isless (xa, TWO52)) goto label; */
28462   TWO52 = ix86_gen_TWO52 (mode);
28463   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
28464
28465   xa = expand_simple_binop (mode, PLUS, xa, TWO52, NULL_RTX, 0, OPTAB_DIRECT);
28466   xa = expand_simple_binop (mode, MINUS, xa, TWO52, xa, 0, OPTAB_DIRECT);
28467
28468   ix86_sse_copysign_to_positive (res, xa, res, mask);
28469
28470   emit_label (label);
28471   LABEL_NUSES (label) = 1;
28472
28473   emit_move_insn (operand0, res);
28474 }
28475
28476 /* Expand SSE2 sequence for computing floor or ceil from OPERAND1 storing
28477    into OPERAND0.  */
28478 void
28479 ix86_expand_floorceildf_32 (rtx operand0, rtx operand1, bool do_floor)
28480 {
28481   /* C code for the stuff we expand below.
28482         double xa = fabs (x), x2;
28483         if (!isless (xa, TWO52))
28484           return x;
28485         xa = xa + TWO52 - TWO52;
28486         x2 = copysign (xa, x);
28487      Compensate.  Floor:
28488         if (x2 > x)
28489           x2 -= 1;
28490      Compensate.  Ceil:
28491         if (x2 < x)
28492           x2 -= -1;
28493         return x2;
28494    */
28495   enum machine_mode mode = GET_MODE (operand0);
28496   rtx xa, TWO52, tmp, label, one, res, mask;
28497
28498   TWO52 = ix86_gen_TWO52 (mode);
28499
28500   /* Temporary for holding the result, initialized to the input
28501      operand to ease control flow.  */
28502   res = gen_reg_rtx (mode);
28503   emit_move_insn (res, operand1);
28504
28505   /* xa = abs (operand1) */
28506   xa = ix86_expand_sse_fabs (res, &mask);
28507
28508   /* if (!isless (xa, TWO52)) goto label; */
28509   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
28510
28511   /* xa = xa + TWO52 - TWO52; */
28512   xa = expand_simple_binop (mode, PLUS, xa, TWO52, NULL_RTX, 0, OPTAB_DIRECT);
28513   xa = expand_simple_binop (mode, MINUS, xa, TWO52, xa, 0, OPTAB_DIRECT);
28514
28515   /* xa = copysign (xa, operand1) */
28516   ix86_sse_copysign_to_positive (xa, xa, res, mask);
28517
28518   /* generate 1.0 or -1.0 */
28519   one = force_reg (mode,
28520                    const_double_from_real_value (do_floor
28521                                                  ? dconst1 : dconstm1, mode));
28522
28523   /* Compensate: xa = xa - (xa > operand1 ? 1 : 0) */
28524   tmp = ix86_expand_sse_compare_mask (UNGT, xa, res, !do_floor);
28525   emit_insn (gen_rtx_SET (VOIDmode, tmp,
28526                           gen_rtx_AND (mode, one, tmp)));
28527   /* We always need to subtract here to preserve signed zero.  */
28528   tmp = expand_simple_binop (mode, MINUS,
28529                              xa, tmp, NULL_RTX, 0, OPTAB_DIRECT);
28530   emit_move_insn (res, tmp);
28531
28532   emit_label (label);
28533   LABEL_NUSES (label) = 1;
28534
28535   emit_move_insn (operand0, res);
28536 }
28537
28538 /* Expand SSE2 sequence for computing floor or ceil from OPERAND1 storing
28539    into OPERAND0.  */
28540 void
28541 ix86_expand_floorceil (rtx operand0, rtx operand1, bool do_floor)
28542 {
28543   /* C code for the stuff we expand below.
28544         double xa = fabs (x), x2;
28545         if (!isless (xa, TWO52))
28546           return x;
28547         x2 = (double)(long)x;
28548      Compensate.  Floor:
28549         if (x2 > x)
28550           x2 -= 1;
28551      Compensate.  Ceil:
28552         if (x2 < x)
28553           x2 += 1;
28554         if (HONOR_SIGNED_ZEROS (mode))
28555           return copysign (x2, x);
28556         return x2;
28557    */
28558   enum machine_mode mode = GET_MODE (operand0);
28559   rtx xa, xi, TWO52, tmp, label, one, res, mask;
28560
28561   TWO52 = ix86_gen_TWO52 (mode);
28562
28563   /* Temporary for holding the result, initialized to the input
28564      operand to ease control flow.  */
28565   res = gen_reg_rtx (mode);
28566   emit_move_insn (res, operand1);
28567
28568   /* xa = abs (operand1) */
28569   xa = ix86_expand_sse_fabs (res, &mask);
28570
28571   /* if (!isless (xa, TWO52)) goto label; */
28572   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
28573
28574   /* xa = (double)(long)x */
28575   xi = gen_reg_rtx (mode == DFmode ? DImode : SImode);
28576   expand_fix (xi, res, 0);
28577   expand_float (xa, xi, 0);
28578
28579   /* generate 1.0 */
28580   one = force_reg (mode, const_double_from_real_value (dconst1, mode));
28581
28582   /* Compensate: xa = xa - (xa > operand1 ? 1 : 0) */
28583   tmp = ix86_expand_sse_compare_mask (UNGT, xa, res, !do_floor);
28584   emit_insn (gen_rtx_SET (VOIDmode, tmp,
28585                           gen_rtx_AND (mode, one, tmp)));
28586   tmp = expand_simple_binop (mode, do_floor ? MINUS : PLUS,
28587                              xa, tmp, NULL_RTX, 0, OPTAB_DIRECT);
28588   emit_move_insn (res, tmp);
28589
28590   if (HONOR_SIGNED_ZEROS (mode))
28591     ix86_sse_copysign_to_positive (res, res, force_reg (mode, operand1), mask);
28592
28593   emit_label (label);
28594   LABEL_NUSES (label) = 1;
28595
28596   emit_move_insn (operand0, res);
28597 }
28598
28599 /* Expand SSE sequence for computing round from OPERAND1 storing
28600    into OPERAND0.  Sequence that works without relying on DImode truncation
28601    via cvttsd2siq that is only available on 64bit targets.  */
28602 void
28603 ix86_expand_rounddf_32 (rtx operand0, rtx operand1)
28604 {
28605   /* C code for the stuff we expand below.
28606         double xa = fabs (x), xa2, x2;
28607         if (!isless (xa, TWO52))
28608           return x;
28609      Using the absolute value and copying back sign makes
28610      -0.0 -> -0.0 correct.
28611         xa2 = xa + TWO52 - TWO52;
28612      Compensate.
28613         dxa = xa2 - xa;
28614         if (dxa <= -0.5)
28615           xa2 += 1;
28616         else if (dxa > 0.5)
28617           xa2 -= 1;
28618         x2 = copysign (xa2, x);
28619         return x2;
28620    */
28621   enum machine_mode mode = GET_MODE (operand0);
28622   rtx xa, xa2, dxa, TWO52, tmp, label, half, mhalf, one, res, mask;
28623
28624   TWO52 = ix86_gen_TWO52 (mode);
28625
28626   /* Temporary for holding the result, initialized to the input
28627      operand to ease control flow.  */
28628   res = gen_reg_rtx (mode);
28629   emit_move_insn (res, operand1);
28630
28631   /* xa = abs (operand1) */
28632   xa = ix86_expand_sse_fabs (res, &mask);
28633
28634   /* if (!isless (xa, TWO52)) goto label; */
28635   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
28636
28637   /* xa2 = xa + TWO52 - TWO52; */
28638   xa2 = expand_simple_binop (mode, PLUS, xa, TWO52, NULL_RTX, 0, OPTAB_DIRECT);
28639   xa2 = expand_simple_binop (mode, MINUS, xa2, TWO52, xa2, 0, OPTAB_DIRECT);
28640
28641   /* dxa = xa2 - xa; */
28642   dxa = expand_simple_binop (mode, MINUS, xa2, xa, NULL_RTX, 0, OPTAB_DIRECT);
28643
28644   /* generate 0.5, 1.0 and -0.5 */
28645   half = force_reg (mode, const_double_from_real_value (dconsthalf, mode));
28646   one = expand_simple_binop (mode, PLUS, half, half, NULL_RTX, 0, OPTAB_DIRECT);
28647   mhalf = expand_simple_binop (mode, MINUS, half, one, NULL_RTX,
28648                                0, OPTAB_DIRECT);
28649
28650   /* Compensate.  */
28651   tmp = gen_reg_rtx (mode);
28652   /* xa2 = xa2 - (dxa > 0.5 ? 1 : 0) */
28653   tmp = ix86_expand_sse_compare_mask (UNGT, dxa, half, false);
28654   emit_insn (gen_rtx_SET (VOIDmode, tmp,
28655                           gen_rtx_AND (mode, one, tmp)));
28656   xa2 = expand_simple_binop (mode, MINUS, xa2, tmp, NULL_RTX, 0, OPTAB_DIRECT);
28657   /* xa2 = xa2 + (dxa <= -0.5 ? 1 : 0) */
28658   tmp = ix86_expand_sse_compare_mask (UNGE, mhalf, dxa, false);
28659   emit_insn (gen_rtx_SET (VOIDmode, tmp,
28660                           gen_rtx_AND (mode, one, tmp)));
28661   xa2 = expand_simple_binop (mode, PLUS, xa2, tmp, NULL_RTX, 0, OPTAB_DIRECT);
28662
28663   /* res = copysign (xa2, operand1) */
28664   ix86_sse_copysign_to_positive (res, xa2, force_reg (mode, operand1), mask);
28665
28666   emit_label (label);
28667   LABEL_NUSES (label) = 1;
28668
28669   emit_move_insn (operand0, res);
28670 }
28671
28672 /* Expand SSE sequence for computing trunc from OPERAND1 storing
28673    into OPERAND0.  */
28674 void
28675 ix86_expand_trunc (rtx operand0, rtx operand1)
28676 {
28677   /* C code for SSE variant we expand below.
28678         double xa = fabs (x), x2;
28679         if (!isless (xa, TWO52))
28680           return x;
28681         x2 = (double)(long)x;
28682         if (HONOR_SIGNED_ZEROS (mode))
28683           return copysign (x2, x);
28684         return x2;
28685    */
28686   enum machine_mode mode = GET_MODE (operand0);
28687   rtx xa, xi, TWO52, label, res, mask;
28688
28689   TWO52 = ix86_gen_TWO52 (mode);
28690
28691   /* Temporary for holding the result, initialized to the input
28692      operand to ease control flow.  */
28693   res = gen_reg_rtx (mode);
28694   emit_move_insn (res, operand1);
28695
28696   /* xa = abs (operand1) */
28697   xa = ix86_expand_sse_fabs (res, &mask);
28698
28699   /* if (!isless (xa, TWO52)) goto label; */
28700   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
28701
28702   /* x = (double)(long)x */
28703   xi = gen_reg_rtx (mode == DFmode ? DImode : SImode);
28704   expand_fix (xi, res, 0);
28705   expand_float (res, xi, 0);
28706
28707   if (HONOR_SIGNED_ZEROS (mode))
28708     ix86_sse_copysign_to_positive (res, res, force_reg (mode, operand1), mask);
28709
28710   emit_label (label);
28711   LABEL_NUSES (label) = 1;
28712
28713   emit_move_insn (operand0, res);
28714 }
28715
28716 /* Expand SSE sequence for computing trunc from OPERAND1 storing
28717    into OPERAND0.  */
28718 void
28719 ix86_expand_truncdf_32 (rtx operand0, rtx operand1)
28720 {
28721   enum machine_mode mode = GET_MODE (operand0);
28722   rtx xa, mask, TWO52, label, one, res, smask, tmp;
28723
28724   /* C code for SSE variant we expand below.
28725         double xa = fabs (x), x2;
28726         if (!isless (xa, TWO52))
28727           return x;
28728         xa2 = xa + TWO52 - TWO52;
28729      Compensate:
28730         if (xa2 > xa)
28731           xa2 -= 1.0;
28732         x2 = copysign (xa2, x);
28733         return x2;
28734    */
28735
28736   TWO52 = ix86_gen_TWO52 (mode);
28737
28738   /* Temporary for holding the result, initialized to the input
28739      operand to ease control flow.  */
28740   res = gen_reg_rtx (mode);
28741   emit_move_insn (res, operand1);
28742
28743   /* xa = abs (operand1) */
28744   xa = ix86_expand_sse_fabs (res, &smask);
28745
28746   /* if (!isless (xa, TWO52)) goto label; */
28747   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
28748
28749   /* res = xa + TWO52 - TWO52; */
28750   tmp = expand_simple_binop (mode, PLUS, xa, TWO52, NULL_RTX, 0, OPTAB_DIRECT);
28751   tmp = expand_simple_binop (mode, MINUS, tmp, TWO52, tmp, 0, OPTAB_DIRECT);
28752   emit_move_insn (res, tmp);
28753
28754   /* generate 1.0 */
28755   one = force_reg (mode, const_double_from_real_value (dconst1, mode));
28756
28757   /* Compensate: res = xa2 - (res > xa ? 1 : 0)  */
28758   mask = ix86_expand_sse_compare_mask (UNGT, res, xa, false);
28759   emit_insn (gen_rtx_SET (VOIDmode, mask,
28760                           gen_rtx_AND (mode, mask, one)));
28761   tmp = expand_simple_binop (mode, MINUS,
28762                              res, mask, NULL_RTX, 0, OPTAB_DIRECT);
28763   emit_move_insn (res, tmp);
28764
28765   /* res = copysign (res, operand1) */
28766   ix86_sse_copysign_to_positive (res, res, force_reg (mode, operand1), smask);
28767
28768   emit_label (label);
28769   LABEL_NUSES (label) = 1;
28770
28771   emit_move_insn (operand0, res);
28772 }
28773
28774 /* Expand SSE sequence for computing round from OPERAND1 storing
28775    into OPERAND0.  */
28776 void
28777 ix86_expand_round (rtx operand0, rtx operand1)
28778 {
28779   /* C code for the stuff we're doing below:
28780         double xa = fabs (x);
28781         if (!isless (xa, TWO52))
28782           return x;
28783         xa = (double)(long)(xa + nextafter (0.5, 0.0));
28784         return copysign (xa, x);
28785    */
28786   enum machine_mode mode = GET_MODE (operand0);
28787   rtx res, TWO52, xa, label, xi, half, mask;
28788   const struct real_format *fmt;
28789   REAL_VALUE_TYPE pred_half, half_minus_pred_half;
28790
28791   /* Temporary for holding the result, initialized to the input
28792      operand to ease control flow.  */
28793   res = gen_reg_rtx (mode);
28794   emit_move_insn (res, operand1);
28795
28796   TWO52 = ix86_gen_TWO52 (mode);
28797   xa = ix86_expand_sse_fabs (res, &mask);
28798   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
28799
28800   /* load nextafter (0.5, 0.0) */
28801   fmt = REAL_MODE_FORMAT (mode);
28802   real_2expN (&half_minus_pred_half, -(fmt->p) - 1, mode);
28803   REAL_ARITHMETIC (pred_half, MINUS_EXPR, dconsthalf, half_minus_pred_half);
28804
28805   /* xa = xa + 0.5 */
28806   half = force_reg (mode, const_double_from_real_value (pred_half, mode));
28807   xa = expand_simple_binop (mode, PLUS, xa, half, NULL_RTX, 0, OPTAB_DIRECT);
28808
28809   /* xa = (double)(int64_t)xa */
28810   xi = gen_reg_rtx (mode == DFmode ? DImode : SImode);
28811   expand_fix (xi, xa, 0);
28812   expand_float (xa, xi, 0);
28813
28814   /* res = copysign (xa, operand1) */
28815   ix86_sse_copysign_to_positive (res, xa, force_reg (mode, operand1), mask);
28816
28817   emit_label (label);
28818   LABEL_NUSES (label) = 1;
28819
28820   emit_move_insn (operand0, res);
28821 }
28822 \f
28823
28824 /* Table of valid machine attributes.  */
28825 static const struct attribute_spec ix86_attribute_table[] =
28826 {
28827   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
28828   /* Stdcall attribute says callee is responsible for popping arguments
28829      if they are not variable.  */
28830   { "stdcall",   0, 0, false, true,  true,  ix86_handle_cconv_attribute },
28831   /* Fastcall attribute says callee is responsible for popping arguments
28832      if they are not variable.  */
28833   { "fastcall",  0, 0, false, true,  true,  ix86_handle_cconv_attribute },
28834   /* Cdecl attribute says the callee is a normal C declaration */
28835   { "cdecl",     0, 0, false, true,  true,  ix86_handle_cconv_attribute },
28836   /* Regparm attribute specifies how many integer arguments are to be
28837      passed in registers.  */
28838   { "regparm",   1, 1, false, true,  true,  ix86_handle_cconv_attribute },
28839   /* Sseregparm attribute says we are using x86_64 calling conventions
28840      for FP arguments.  */
28841   { "sseregparm", 0, 0, false, true, true, ix86_handle_cconv_attribute },
28842   /* force_align_arg_pointer says this function realigns the stack at entry.  */
28843   { (const char *)&ix86_force_align_arg_pointer_string, 0, 0,
28844     false, true,  true, ix86_handle_cconv_attribute },
28845 #if TARGET_DLLIMPORT_DECL_ATTRIBUTES
28846   { "dllimport", 0, 0, false, false, false, handle_dll_attribute },
28847   { "dllexport", 0, 0, false, false, false, handle_dll_attribute },
28848   { "shared",    0, 0, true,  false, false, ix86_handle_shared_attribute },
28849 #endif
28850   { "ms_struct", 0, 0, false, false,  false, ix86_handle_struct_attribute },
28851   { "gcc_struct", 0, 0, false, false,  false, ix86_handle_struct_attribute },
28852 #ifdef SUBTARGET_ATTRIBUTE_TABLE
28853   SUBTARGET_ATTRIBUTE_TABLE,
28854 #endif
28855   /* ms_abi and sysv_abi calling convention function attributes.  */
28856   { "ms_abi", 0, 0, false, true, true, ix86_handle_abi_attribute },
28857   { "sysv_abi", 0, 0, false, true, true, ix86_handle_abi_attribute },
28858   { "ms_hook_prologue", 0, 0, true, false, false, ix86_handle_fndecl_attribute },
28859   /* End element.  */
28860   { NULL,        0, 0, false, false, false, NULL }
28861 };
28862
28863 /* Implement targetm.vectorize.builtin_vectorization_cost.  */
28864 static int
28865 ix86_builtin_vectorization_cost (bool runtime_test)
28866 {
28867   /* If the branch of the runtime test is taken - i.e. - the vectorized
28868      version is skipped - this incurs a misprediction cost (because the
28869      vectorized version is expected to be the fall-through).  So we subtract
28870      the latency of a mispredicted branch from the costs that are incured
28871      when the vectorized version is executed.
28872
28873      TODO: The values in individual target tables have to be tuned or new
28874      fields may be needed. For eg. on K8, the default branch path is the
28875      not-taken path. If the taken path is predicted correctly, the minimum
28876      penalty of going down the taken-path is 1 cycle. If the taken-path is
28877      not predicted correctly, then the minimum penalty is 10 cycles.  */
28878
28879   if (runtime_test)
28880     {
28881       return (-(ix86_cost->cond_taken_branch_cost));
28882     }
28883   else
28884     return 0;
28885 }
28886
28887 /* Implement targetm.vectorize.builtin_vec_perm.  */
28888
28889 static tree
28890 ix86_vectorize_builtin_vec_perm (tree vec_type, tree *mask_type)
28891 {
28892   tree itype = TREE_TYPE (vec_type);
28893   bool u = TYPE_UNSIGNED (itype);
28894   enum machine_mode vmode = TYPE_MODE (vec_type);
28895   enum ix86_builtins fcode;
28896   bool ok = TARGET_SSE2;
28897
28898   switch (vmode)
28899     {
28900     case V4DFmode:
28901       ok = TARGET_AVX;
28902       fcode = IX86_BUILTIN_VEC_PERM_V4DF;
28903       goto get_di;
28904     case V2DFmode:
28905       fcode = IX86_BUILTIN_VEC_PERM_V2DF;
28906     get_di:
28907       itype = ix86_get_builtin_type (IX86_BT_DI);
28908       break;
28909
28910     case V8SFmode:
28911       ok = TARGET_AVX;
28912       fcode = IX86_BUILTIN_VEC_PERM_V8SF;
28913       goto get_si;
28914     case V4SFmode:
28915       ok = TARGET_SSE;
28916       fcode = IX86_BUILTIN_VEC_PERM_V4SF;
28917     get_si:
28918       itype = ix86_get_builtin_type (IX86_BT_SI);
28919       break;
28920
28921     case V2DImode:
28922       fcode = u ? IX86_BUILTIN_VEC_PERM_V2DI_U : IX86_BUILTIN_VEC_PERM_V2DI;
28923       break;
28924     case V4SImode:
28925       fcode = u ? IX86_BUILTIN_VEC_PERM_V4SI_U : IX86_BUILTIN_VEC_PERM_V4SI;
28926       break;
28927     case V8HImode:
28928       fcode = u ? IX86_BUILTIN_VEC_PERM_V8HI_U : IX86_BUILTIN_VEC_PERM_V8HI;
28929       break;
28930     case V16QImode:
28931       fcode = u ? IX86_BUILTIN_VEC_PERM_V16QI_U : IX86_BUILTIN_VEC_PERM_V16QI;
28932       break;
28933     default:
28934       ok = false;
28935       break;
28936     }
28937
28938   if (!ok)
28939     return NULL_TREE;
28940
28941   *mask_type = itype;
28942   return ix86_builtins[(int) fcode];
28943 }
28944
28945 /* Return a vector mode with twice as many elements as VMODE.  */
28946 /* ??? Consider moving this to a table generated by genmodes.c.  */
28947
28948 static enum machine_mode
28949 doublesize_vector_mode (enum machine_mode vmode)
28950 {
28951   switch (vmode)
28952     {
28953     case V2SFmode:      return V4SFmode;
28954     case V1DImode:      return V2DImode;
28955     case V2SImode:      return V4SImode;
28956     case V4HImode:      return V8HImode;
28957     case V8QImode:      return V16QImode;
28958
28959     case V2DFmode:      return V4DFmode;
28960     case V4SFmode:      return V8SFmode;
28961     case V2DImode:      return V4DImode;
28962     case V4SImode:      return V8SImode;
28963     case V8HImode:      return V16HImode;
28964     case V16QImode:     return V32QImode;
28965
28966     case V4DFmode:      return V8DFmode;
28967     case V8SFmode:      return V16SFmode;
28968     case V4DImode:      return V8DImode;
28969     case V8SImode:      return V16SImode;
28970     case V16HImode:     return V32HImode;
28971     case V32QImode:     return V64QImode;
28972
28973     default:
28974       gcc_unreachable ();
28975     }
28976 }
28977
28978 /* Construct (set target (vec_select op0 (parallel perm))) and
28979    return true if that's a valid instruction in the active ISA.  */
28980
28981 static bool
28982 expand_vselect (rtx target, rtx op0, const unsigned char *perm, unsigned nelt)
28983 {
28984   rtx rperm[MAX_VECT_LEN], x;
28985   unsigned i;
28986
28987   for (i = 0; i < nelt; ++i)
28988     rperm[i] = GEN_INT (perm[i]);
28989
28990   x = gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (nelt, rperm));
28991   x = gen_rtx_VEC_SELECT (GET_MODE (target), op0, x);
28992   x = gen_rtx_SET (VOIDmode, target, x);
28993
28994   x = emit_insn (x);
28995   if (recog_memoized (x) < 0)
28996     {
28997       remove_insn (x);
28998       return false;
28999     }
29000   return true;
29001 }
29002
29003 /* Similar, but generate a vec_concat from op0 and op1 as well.  */
29004
29005 static bool
29006 expand_vselect_vconcat (rtx target, rtx op0, rtx op1,
29007                         const unsigned char *perm, unsigned nelt)
29008 {
29009   enum machine_mode v2mode;
29010   rtx x;
29011
29012   v2mode = doublesize_vector_mode (GET_MODE (op0));
29013   x = gen_rtx_VEC_CONCAT (v2mode, op0, op1);
29014   return expand_vselect (target, x, perm, nelt);
29015 }
29016
29017 /* A subroutine of ix86_expand_vec_perm_builtin_1.  Try to implement D
29018    in terms of blendp[sd] / pblendw / pblendvb.  */
29019
29020 static bool
29021 expand_vec_perm_blend (struct expand_vec_perm_d *d)
29022 {
29023   enum machine_mode vmode = d->vmode;
29024   unsigned i, mask, nelt = d->nelt;
29025   rtx target, op0, op1, x;
29026
29027   if (!TARGET_SSE4_1 || d->op0 == d->op1)
29028     return false;
29029   if (!(GET_MODE_SIZE (vmode) == 16 || vmode == V4DFmode || vmode == V8SFmode))
29030     return false;
29031
29032   /* This is a blend, not a permute.  Elements must stay in their
29033      respective lanes.  */
29034   for (i = 0; i < nelt; ++i)
29035     {
29036       unsigned e = d->perm[i];
29037       if (!(e == i || e == i + nelt))
29038         return false;
29039     }
29040
29041   if (d->testing_p)
29042     return true;
29043
29044   /* ??? Without SSE4.1, we could implement this with and/andn/or.  This
29045      decision should be extracted elsewhere, so that we only try that
29046      sequence once all budget==3 options have been tried.  */
29047
29048   /* For bytes, see if bytes move in pairs so we can use pblendw with
29049      an immediate argument, rather than pblendvb with a vector argument.  */
29050   if (vmode == V16QImode)
29051     {
29052       bool pblendw_ok = true;
29053       for (i = 0; i < 16 && pblendw_ok; i += 2)
29054         pblendw_ok = (d->perm[i] + 1 == d->perm[i + 1]);
29055
29056       if (!pblendw_ok)
29057         {
29058           rtx rperm[16], vperm;
29059
29060           for (i = 0; i < nelt; ++i)
29061             rperm[i] = (d->perm[i] < nelt ? const0_rtx : constm1_rtx);
29062
29063           vperm = gen_rtx_CONST_VECTOR (V16QImode, gen_rtvec_v (16, rperm));
29064           vperm = force_reg (V16QImode, vperm);
29065
29066           emit_insn (gen_sse4_1_pblendvb (d->target, d->op0, d->op1, vperm));
29067           return true;
29068         }
29069     }
29070
29071   target = d->target;
29072   op0 = d->op0;
29073   op1 = d->op1;
29074   mask = 0;
29075
29076   switch (vmode)
29077     {
29078     case V4DFmode:
29079     case V8SFmode:
29080     case V2DFmode:
29081     case V4SFmode:
29082     case V8HImode:
29083       for (i = 0; i < nelt; ++i)
29084         mask |= (d->perm[i] >= nelt) << i;
29085       break;
29086
29087     case V2DImode:
29088       for (i = 0; i < 2; ++i)
29089         mask |= (d->perm[i] >= 2 ? 15 : 0) << (i * 4);
29090       goto do_subreg;
29091
29092     case V4SImode:
29093       for (i = 0; i < 4; ++i)
29094         mask |= (d->perm[i] >= 4 ? 3 : 0) << (i * 2);
29095       goto do_subreg;
29096
29097     case V16QImode:
29098       for (i = 0; i < 8; ++i)
29099         mask |= (d->perm[i * 2] >= 16) << i;
29100
29101     do_subreg:
29102       vmode = V8HImode;
29103       target = gen_lowpart (vmode, target);
29104       op0 = gen_lowpart (vmode, target);
29105       op1 = gen_lowpart (vmode, target);
29106       break;
29107
29108     default:
29109       gcc_unreachable ();
29110     }
29111
29112   /* This matches five different patterns with the different modes.  */
29113   x = gen_rtx_VEC_MERGE (vmode, op0, op1, GEN_INT (mask));
29114   x = gen_rtx_SET (VOIDmode, target, x);
29115   emit_insn (x);
29116
29117   return true;
29118 }
29119
29120 /* A subroutine of ix86_expand_vec_perm_builtin_1.  Try to implement D
29121    in terms of the variable form of vpermilps.
29122
29123    Note that we will have already failed the immediate input vpermilps,
29124    which requires that the high and low part shuffle be identical; the
29125    variable form doesn't require that.  */
29126
29127 static bool
29128 expand_vec_perm_vpermil (struct expand_vec_perm_d *d)
29129 {
29130   rtx rperm[8], vperm;
29131   unsigned i;
29132
29133   if (!TARGET_AVX || d->vmode != V8SFmode || d->op0 != d->op1)
29134     return false;
29135
29136   /* We can only permute within the 128-bit lane.  */
29137   for (i = 0; i < 8; ++i)
29138     {
29139       unsigned e = d->perm[i];
29140       if (i < 4 ? e >= 4 : e < 4)
29141         return false;
29142     }
29143
29144   if (d->testing_p)
29145     return true;
29146
29147   for (i = 0; i < 8; ++i)
29148     {
29149       unsigned e = d->perm[i];
29150
29151       /* Within each 128-bit lane, the elements of op0 are numbered
29152          from 0 and the elements of op1 are numbered from 4.  */
29153       if (e >= 8 + 4)
29154         e -= 8;
29155       else if (e >= 4)
29156         e -= 4;
29157
29158       rperm[i] = GEN_INT (e);
29159     }
29160
29161   vperm = gen_rtx_CONST_VECTOR (V8SImode, gen_rtvec_v (8, rperm));
29162   vperm = force_reg (V8SImode, vperm);
29163   emit_insn (gen_avx_vpermilvarv8sf3 (d->target, d->op0, vperm));
29164
29165   return true;
29166 }
29167
29168 /* A subroutine of ix86_expand_vec_perm_builtin_1.  Try to implement D
29169    in terms of pshufb or vpperm.  */
29170
29171 static bool
29172 expand_vec_perm_pshufb (struct expand_vec_perm_d *d)
29173 {
29174   unsigned i, nelt, eltsz;
29175   rtx rperm[16], vperm, target, op0, op1;
29176
29177   if (!(d->op0 == d->op1 ? TARGET_SSSE3 : TARGET_XOP))
29178     return false;
29179   if (GET_MODE_SIZE (d->vmode) != 16)
29180     return false;
29181
29182   if (d->testing_p)
29183     return true;
29184
29185   nelt = d->nelt;
29186   eltsz = GET_MODE_SIZE (GET_MODE_INNER (d->vmode));
29187
29188   for (i = 0; i < nelt; ++i)
29189     {
29190       unsigned j, e = d->perm[i];
29191       for (j = 0; j < eltsz; ++j)
29192         rperm[i * eltsz + j] = GEN_INT (e * eltsz + j);
29193     }
29194
29195   vperm = gen_rtx_CONST_VECTOR (V16QImode, gen_rtvec_v (16, rperm));
29196   vperm = force_reg (V16QImode, vperm);
29197
29198   target = gen_lowpart (V16QImode, d->target);
29199   op0 = gen_lowpart (V16QImode, d->op0);
29200   if (d->op0 == d->op1)
29201     emit_insn (gen_ssse3_pshufbv16qi3 (target, op0, vperm));
29202   else
29203     {
29204       op1 = gen_lowpart (V16QImode, d->op1);
29205       emit_insn (gen_xop_pperm (target, op0, op1, vperm));
29206     }
29207
29208   return true;
29209 }
29210
29211 /* A subroutine of ix86_expand_vec_perm_builtin_1.  Try to instantiate D
29212    in a single instruction.  */
29213
29214 static bool
29215 expand_vec_perm_1 (struct expand_vec_perm_d *d)
29216 {
29217   unsigned i, nelt = d->nelt;
29218   unsigned char perm2[MAX_VECT_LEN];
29219
29220   /* Check plain VEC_SELECT first, because AVX has instructions that could
29221      match both SEL and SEL+CONCAT, but the plain SEL will allow a memory
29222      input where SEL+CONCAT may not.  */
29223   if (d->op0 == d->op1)
29224     {
29225       if (expand_vselect (d->target, d->op0, d->perm, nelt))
29226         return true;
29227
29228       /* There are plenty of patterns in sse.md that are written for
29229          SEL+CONCAT and are not replicated for a single op.  Perhaps
29230          that should be changed, to avoid the nastiness here.  */
29231
29232       /* Recognize interleave style patterns, which means incrementing
29233          every other permutation operand.  */
29234       for (i = 0; i < nelt; i += 2)
29235         {
29236           perm2[i] = d->perm[i];
29237           perm2[i+1] = d->perm[i+1] + nelt;
29238         }
29239       if (expand_vselect_vconcat (d->target, d->op0, d->op0, perm2, nelt))
29240         return true;
29241
29242       /* Recognize shufps, which means adding {0, 0, nelt, nelt}.  */
29243       if (nelt >= 4)
29244         {
29245           memcpy (perm2, d->perm, nelt);
29246           for (i = 2; i < nelt; i += 4)
29247             {
29248               perm2[i+0] += nelt;
29249               perm2[i+1] += nelt;
29250             }
29251
29252           if (expand_vselect_vconcat (d->target, d->op0, d->op0, perm2, nelt))
29253             return true;
29254         }
29255     }
29256
29257   /* Finally, try the fully general two operand permute.  */
29258   if (expand_vselect_vconcat (d->target, d->op0, d->op1, d->perm, nelt))
29259     return true;
29260
29261   /* Recognize interleave style patterns with reversed operands.  */
29262   if (d->op0 != d->op1)
29263     {
29264       for (i = 0; i < nelt; ++i)
29265         {
29266           unsigned e = d->perm[i];
29267           if (e >= nelt)
29268             e -= nelt;
29269           else
29270             e += nelt;
29271           perm2[i] = e;
29272         }
29273
29274       if (expand_vselect_vconcat (d->target, d->op1, d->op0, perm2, nelt))
29275         return true;
29276     }
29277
29278   /* Try the SSE4.1 blend variable merge instructions.  */
29279   if (expand_vec_perm_blend (d))
29280     return true;
29281
29282   /* Try one of the AVX vpermil variable permutations.  */
29283   if (expand_vec_perm_vpermil (d))
29284     return true;
29285
29286   /* Try the SSSE3 pshufb or XOP vpperm variable permutation.  */
29287   if (expand_vec_perm_pshufb (d))
29288     return true;
29289
29290   return false;
29291 }
29292
29293 /* A subroutine of ix86_expand_vec_perm_builtin_1.  Try to implement D
29294    in terms of a pair of pshuflw + pshufhw instructions.  */
29295
29296 static bool
29297 expand_vec_perm_pshuflw_pshufhw (struct expand_vec_perm_d *d)
29298 {
29299   unsigned char perm2[MAX_VECT_LEN];
29300   unsigned i;
29301   bool ok;
29302
29303   if (d->vmode != V8HImode || d->op0 != d->op1)
29304     return false;
29305
29306   /* The two permutations only operate in 64-bit lanes.  */
29307   for (i = 0; i < 4; ++i)
29308     if (d->perm[i] >= 4)
29309       return false;
29310   for (i = 4; i < 8; ++i)
29311     if (d->perm[i] < 4)
29312       return false;
29313
29314   if (d->testing_p)
29315     return true;
29316
29317   /* Emit the pshuflw.  */
29318   memcpy (perm2, d->perm, 4);
29319   for (i = 4; i < 8; ++i)
29320     perm2[i] = i;
29321   ok = expand_vselect (d->target, d->op0, perm2, 8);
29322   gcc_assert (ok);
29323
29324   /* Emit the pshufhw.  */
29325   memcpy (perm2 + 4, d->perm + 4, 4);
29326   for (i = 0; i < 4; ++i)
29327     perm2[i] = i;
29328   ok = expand_vselect (d->target, d->target, perm2, 8);
29329   gcc_assert (ok);
29330
29331   return true;
29332 }
29333
29334 /* A subroutine of ix86_expand_vec_perm_builtin_1.  Try to simplify
29335    the permutation using the SSSE3 palignr instruction.  This succeeds
29336    when all of the elements in PERM fit within one vector and we merely
29337    need to shift them down so that a single vector permutation has a
29338    chance to succeed.  */
29339
29340 static bool
29341 expand_vec_perm_palignr (struct expand_vec_perm_d *d)
29342 {
29343   unsigned i, nelt = d->nelt;
29344   unsigned min, max;
29345   bool in_order, ok;
29346   rtx shift;
29347
29348   /* Even with AVX, palignr only operates on 128-bit vectors.  */
29349   if (!TARGET_SSSE3 || GET_MODE_SIZE (d->vmode) != 16)
29350     return false;
29351
29352   min = nelt, max = 0;
29353   for (i = 0; i < nelt; ++i)
29354     {
29355       unsigned e = d->perm[i];
29356       if (e < min)
29357         min = e;
29358       if (e > max)
29359         max = e;
29360     }
29361   if (min == 0 || max - min >= nelt)
29362     return false;
29363
29364   /* Given that we have SSSE3, we know we'll be able to implement the
29365      single operand permutation after the palignr with pshufb.  */
29366   if (d->testing_p)
29367     return true;
29368
29369   shift = GEN_INT (min * GET_MODE_BITSIZE (GET_MODE_INNER (d->vmode)));
29370   emit_insn (gen_ssse3_palignrti (gen_lowpart (TImode, d->target),
29371                                   gen_lowpart (TImode, d->op1),
29372                                   gen_lowpart (TImode, d->op0), shift));
29373
29374   d->op0 = d->op1 = d->target;
29375
29376   in_order = true;
29377   for (i = 0; i < nelt; ++i)
29378     {
29379       unsigned e = d->perm[i] - min;
29380       if (e != i)
29381         in_order = false;
29382       d->perm[i] = e;
29383     }
29384
29385   /* Test for the degenerate case where the alignment by itself
29386      produces the desired permutation.  */
29387   if (in_order)
29388     return true;
29389
29390   ok = expand_vec_perm_1 (d);
29391   gcc_assert (ok);
29392
29393   return ok;
29394 }
29395
29396 /* A subroutine of ix86_expand_vec_perm_builtin_1.  Try to simplify
29397    a two vector permutation into a single vector permutation by using
29398    an interleave operation to merge the vectors.  */
29399
29400 static bool
29401 expand_vec_perm_interleave2 (struct expand_vec_perm_d *d)
29402 {
29403   struct expand_vec_perm_d dremap, dfinal;
29404   unsigned i, nelt = d->nelt, nelt2 = nelt / 2;
29405   unsigned contents, h1, h2, h3, h4;
29406   unsigned char remap[2 * MAX_VECT_LEN];
29407   rtx seq;
29408   bool ok;
29409
29410   if (d->op0 == d->op1)
29411     return false;
29412
29413   /* The 256-bit unpck[lh]p[sd] instructions only operate within the 128-bit
29414      lanes.  We can use similar techniques with the vperm2f128 instruction,
29415      but it requires slightly different logic.  */
29416   if (GET_MODE_SIZE (d->vmode) != 16)
29417     return false;
29418
29419   /* Examine from whence the elements come.  */
29420   contents = 0;
29421   for (i = 0; i < nelt; ++i)
29422     contents |= 1u << d->perm[i];
29423
29424   /* Split the two input vectors into 4 halves.  */
29425   h1 = (1u << nelt2) - 1;
29426   h2 = h1 << nelt2;
29427   h3 = h2 << nelt2;
29428   h4 = h3 << nelt2;
29429
29430   memset (remap, 0xff, sizeof (remap));
29431   dremap = *d;
29432
29433   /* If the elements from the low halves use interleave low, and similarly
29434      for interleave high.  If the elements are from mis-matched halves, we
29435      can use shufps for V4SF/V4SI or do a DImode shuffle.  */
29436   if ((contents & (h1 | h3)) == contents)
29437     {
29438       for (i = 0; i < nelt2; ++i)
29439         {
29440           remap[i] = i * 2;
29441           remap[i + nelt] = i * 2 + 1;
29442           dremap.perm[i * 2] = i;
29443           dremap.perm[i * 2 + 1] = i + nelt;
29444         }
29445     }
29446   else if ((contents & (h2 | h4)) == contents)
29447     {
29448       for (i = 0; i < nelt2; ++i)
29449         {
29450           remap[i + nelt2] = i * 2;
29451           remap[i + nelt + nelt2] = i * 2 + 1;
29452           dremap.perm[i * 2] = i + nelt2;
29453           dremap.perm[i * 2 + 1] = i + nelt + nelt2;
29454         }
29455     }
29456   else if ((contents & (h1 | h4)) == contents)
29457     {
29458       for (i = 0; i < nelt2; ++i)
29459         {
29460           remap[i] = i;
29461           remap[i + nelt + nelt2] = i + nelt2;
29462           dremap.perm[i] = i;
29463           dremap.perm[i + nelt2] = i + nelt + nelt2;
29464         }
29465       if (nelt != 4)
29466         {
29467           dremap.vmode = V2DImode;
29468           dremap.nelt = 2;
29469           dremap.perm[0] = 0;
29470           dremap.perm[1] = 3;
29471         }
29472     }
29473   else if ((contents & (h2 | h3)) == contents)
29474     {
29475       for (i = 0; i < nelt2; ++i)
29476         {
29477           remap[i + nelt2] = i;
29478           remap[i + nelt] = i + nelt2;
29479           dremap.perm[i] = i + nelt2;
29480           dremap.perm[i + nelt2] = i + nelt;
29481         }
29482       if (nelt != 4)
29483         {
29484           dremap.vmode = V2DImode;
29485           dremap.nelt = 2;
29486           dremap.perm[0] = 1;
29487           dremap.perm[1] = 2;
29488         }
29489     }
29490   else
29491     return false;
29492
29493   /* Use the remapping array set up above to move the elements from their
29494      swizzled locations into their final destinations.  */
29495   dfinal = *d;
29496   for (i = 0; i < nelt; ++i)
29497     {
29498       unsigned e = remap[d->perm[i]];
29499       gcc_assert (e < nelt);
29500       dfinal.perm[i] = e;
29501     }
29502   dfinal.op0 = gen_reg_rtx (dfinal.vmode);
29503   dfinal.op1 = dfinal.op0;
29504   dremap.target = dfinal.op0;
29505
29506   /* Test if the final remap can be done with a single insn.  For V4SFmode or
29507      V4SImode this *will* succeed.  For V8HImode or V16QImode it may not.  */
29508   start_sequence ();
29509   ok = expand_vec_perm_1 (&dfinal);
29510   seq = get_insns ();
29511   end_sequence ();
29512
29513   if (!ok)
29514     return false;
29515
29516   if (dremap.vmode != dfinal.vmode)
29517     {
29518       dremap.target = gen_lowpart (dremap.vmode, dremap.target);
29519       dremap.op0 = gen_lowpart (dremap.vmode, dremap.op0);
29520       dremap.op1 = gen_lowpart (dremap.vmode, dremap.op1);
29521     }
29522
29523   ok = expand_vec_perm_1 (&dremap);
29524   gcc_assert (ok);
29525
29526   emit_insn (seq);
29527   return true;
29528 }
29529
29530 /* A subroutine of expand_vec_perm_even_odd_1.  Implement the double-word
29531    permutation with two pshufb insns and an ior.  We should have already
29532    failed all two instruction sequences.  */
29533
29534 static bool
29535 expand_vec_perm_pshufb2 (struct expand_vec_perm_d *d)
29536 {
29537   rtx rperm[2][16], vperm, l, h, op, m128;
29538   unsigned int i, nelt, eltsz;
29539
29540   if (!TARGET_SSSE3 || GET_MODE_SIZE (d->vmode) != 16)
29541     return false;
29542   gcc_assert (d->op0 != d->op1);
29543
29544   nelt = d->nelt;
29545   eltsz = GET_MODE_SIZE (GET_MODE_INNER (d->vmode));
29546   
29547   /* Generate two permutation masks.  If the required element is within
29548      the given vector it is shuffled into the proper lane.  If the required
29549      element is in the other vector, force a zero into the lane by setting
29550      bit 7 in the permutation mask.  */
29551   m128 = GEN_INT (-128);
29552   for (i = 0; i < nelt; ++i)
29553     {
29554       unsigned j, e = d->perm[i];
29555       unsigned which = (e >= nelt);
29556       if (e >= nelt)
29557         e -= nelt;
29558
29559       for (j = 0; j < eltsz; ++j)
29560         {
29561           rperm[which][i*eltsz + j] = GEN_INT (e*eltsz + j);
29562           rperm[1-which][i*eltsz + j] = m128;
29563         }
29564     }
29565
29566   vperm = gen_rtx_CONST_VECTOR (V16QImode, gen_rtvec_v (16, rperm[0]));
29567   vperm = force_reg (V16QImode, vperm);
29568
29569   l = gen_reg_rtx (V16QImode);
29570   op = gen_lowpart (V16QImode, d->op0);
29571   emit_insn (gen_ssse3_pshufbv16qi3 (l, op, vperm));
29572
29573   vperm = gen_rtx_CONST_VECTOR (V16QImode, gen_rtvec_v (16, rperm[1]));
29574   vperm = force_reg (V16QImode, vperm);
29575
29576   h = gen_reg_rtx (V16QImode);
29577   op = gen_lowpart (V16QImode, d->op1);
29578   emit_insn (gen_ssse3_pshufbv16qi3 (h, op, vperm));
29579
29580   op = gen_lowpart (V16QImode, d->target);
29581   emit_insn (gen_iorv16qi3 (op, l, h));
29582
29583   return true;
29584 }
29585
29586 /* A subroutine of ix86_expand_vec_perm_builtin_1.  Implement extract-even
29587    and extract-odd permutations.  */
29588
29589 static bool
29590 expand_vec_perm_even_odd_1 (struct expand_vec_perm_d *d, unsigned odd)
29591 {
29592   rtx t1, t2, t3, t4;
29593
29594   switch (d->vmode)
29595     {
29596     case V4DFmode:
29597       t1 = gen_reg_rtx (V4DFmode);
29598       t2 = gen_reg_rtx (V4DFmode);
29599
29600       /* Shuffle the lanes around into { 0 1 4 5 } and { 2 3 6 7 }.  */
29601       emit_insn (gen_avx_vperm2f128v4df3 (t1, d->op0, d->op1, GEN_INT (0x20)));
29602       emit_insn (gen_avx_vperm2f128v4df3 (t2, d->op0, d->op1, GEN_INT (0x31)));
29603
29604       /* Now an unpck[lh]pd will produce the result required.  */
29605       if (odd)
29606         t3 = gen_avx_unpckhpd256 (d->target, t1, t2);
29607       else
29608         t3 = gen_avx_unpcklpd256 (d->target, t1, t2);
29609       emit_insn (t3);
29610       break;
29611
29612     case V8SFmode:
29613       {
29614         static const unsigned char perm1[8] = { 0, 2, 1, 3, 5, 6, 5, 7 };
29615         static const unsigned char perme[8] = { 0, 1,  8,  9, 4, 5, 12, 13 };
29616         static const unsigned char permo[8] = { 2, 3, 10, 11, 6, 7, 14, 15 };
29617
29618         t1 = gen_reg_rtx (V8SFmode);
29619         t2 = gen_reg_rtx (V8SFmode);
29620         t3 = gen_reg_rtx (V8SFmode);
29621         t4 = gen_reg_rtx (V8SFmode);
29622
29623         /* Shuffle within the 128-bit lanes to produce:
29624            { 0 2 1 3 4 6 5 7 } and { 8 a 9 b c e d f }.  */
29625         expand_vselect (t1, d->op0, perm1, 8);
29626         expand_vselect (t2, d->op1, perm1, 8);
29627
29628         /* Shuffle the lanes around to produce:
29629            { 0 2 1 3 8 a 9 b } and { 4 6 5 7 c e d f }.  */
29630         emit_insn (gen_avx_vperm2f128v8sf3 (t3, t1, t2, GEN_INT (0x20)));
29631         emit_insn (gen_avx_vperm2f128v8sf3 (t4, t1, t2, GEN_INT (0x31)));
29632
29633         /* Now a vpermil2p will produce the result required.  */
29634         /* ??? The vpermil2p requires a vector constant.  Another option
29635            is a unpck[lh]ps to merge the two vectors to produce
29636            { 0 4 2 6 8 c a e } or { 1 5 3 7 9 d b f }.  Then use another
29637            vpermilps to get the elements into the final order.  */
29638         d->op0 = t3;
29639         d->op1 = t4;
29640         memcpy (d->perm, odd ? permo: perme, 8);
29641         expand_vec_perm_vpermil (d);
29642       }
29643       break;
29644
29645     case V2DFmode:
29646     case V4SFmode:
29647     case V2DImode:
29648     case V4SImode:
29649       /* These are always directly implementable by expand_vec_perm_1.  */
29650       gcc_unreachable ();
29651
29652     case V8HImode:
29653       if (TARGET_SSSE3)
29654         return expand_vec_perm_pshufb2 (d);
29655       else
29656         {
29657           /* We need 2*log2(N)-1 operations to achieve odd/even
29658              with interleave. */
29659           t1 = gen_reg_rtx (V8HImode);
29660           t2 = gen_reg_rtx (V8HImode);
29661           emit_insn (gen_vec_interleave_highv8hi (t1, d->op0, d->op1));
29662           emit_insn (gen_vec_interleave_lowv8hi (d->target, d->op0, d->op1));
29663           emit_insn (gen_vec_interleave_highv8hi (t2, d->target, t1));
29664           emit_insn (gen_vec_interleave_lowv8hi (d->target, d->target, t1));
29665           if (odd)
29666             t3 = gen_vec_interleave_highv8hi (d->target, d->target, t2);
29667           else
29668             t3 = gen_vec_interleave_lowv8hi (d->target, d->target, t2);
29669           emit_insn (t3);
29670         }
29671       break;
29672
29673     case V16QImode:
29674       if (TARGET_SSSE3)
29675         return expand_vec_perm_pshufb2 (d);
29676       else
29677         {
29678           t1 = gen_reg_rtx (V16QImode);
29679           t2 = gen_reg_rtx (V16QImode);
29680           t3 = gen_reg_rtx (V16QImode);
29681           emit_insn (gen_vec_interleave_highv16qi (t1, d->op0, d->op1));
29682           emit_insn (gen_vec_interleave_lowv16qi (d->target, d->op0, d->op1));
29683           emit_insn (gen_vec_interleave_highv16qi (t2, d->target, t1));
29684           emit_insn (gen_vec_interleave_lowv16qi (d->target, d->target, t1));
29685           emit_insn (gen_vec_interleave_highv16qi (t3, d->target, t2));
29686           emit_insn (gen_vec_interleave_lowv16qi (d->target, d->target, t2));
29687           if (odd)
29688             t3 = gen_vec_interleave_highv16qi (d->target, d->target, t3);
29689           else
29690             t3 = gen_vec_interleave_lowv16qi (d->target, d->target, t3);
29691           emit_insn (t3);
29692         }
29693       break;
29694
29695     default:
29696       gcc_unreachable ();
29697     }
29698
29699   return true;
29700 }
29701
29702 /* A subroutine of ix86_expand_vec_perm_builtin_1.  Pattern match
29703    extract-even and extract-odd permutations.  */
29704
29705 static bool
29706 expand_vec_perm_even_odd (struct expand_vec_perm_d *d)
29707 {
29708   unsigned i, odd, nelt = d->nelt;
29709
29710   odd = d->perm[0];
29711   if (odd != 0 && odd != 1)
29712     return false;
29713
29714   for (i = 1; i < nelt; ++i)
29715     if (d->perm[i] != 2 * i + odd)
29716       return false;
29717
29718   return expand_vec_perm_even_odd_1 (d, odd);
29719 }
29720
29721 /* A subroutine of ix86_expand_vec_perm_builtin_1.  Implement broadcast
29722    permutations.  We assume that expand_vec_perm_1 has already failed.  */
29723
29724 static bool
29725 expand_vec_perm_broadcast_1 (struct expand_vec_perm_d *d)
29726 {
29727   unsigned elt = d->perm[0], nelt2 = d->nelt / 2;
29728   enum machine_mode vmode = d->vmode;
29729   unsigned char perm2[4];
29730   rtx op0 = d->op0;
29731   bool ok;
29732
29733   switch (vmode)
29734     {
29735     case V4DFmode:
29736     case V8SFmode:
29737       /* These are special-cased in sse.md so that we can optionally
29738          use the vbroadcast instruction.  They expand to two insns
29739          if the input happens to be in a register.  */
29740       gcc_unreachable ();
29741
29742     case V2DFmode:
29743     case V2DImode:
29744     case V4SFmode:
29745     case V4SImode:
29746       /* These are always implementable using standard shuffle patterns.  */
29747       gcc_unreachable ();
29748
29749     case V8HImode:
29750     case V16QImode:
29751       /* These can be implemented via interleave.  We save one insn by
29752          stopping once we have promoted to V4SImode and then use pshufd.  */
29753       do
29754         {
29755           optab otab = vec_interleave_low_optab;
29756
29757           if (elt >= nelt2)
29758             {
29759               otab = vec_interleave_high_optab;
29760               elt -= nelt2;
29761             }
29762           nelt2 /= 2;
29763
29764           op0 = expand_binop (vmode, otab, op0, op0, NULL, 0, OPTAB_DIRECT);
29765           vmode = get_mode_wider_vector (vmode);
29766           op0 = gen_lowpart (vmode, op0);
29767         }
29768       while (vmode != V4SImode);
29769
29770       memset (perm2, elt, 4);
29771       ok = expand_vselect (gen_lowpart (V4SImode, d->target), op0, perm2, 4);
29772       gcc_assert (ok);
29773       return true;
29774
29775     default:
29776       gcc_unreachable ();
29777     }
29778 }
29779
29780 /* A subroutine of ix86_expand_vec_perm_builtin_1.  Pattern match
29781    broadcast permutations.  */
29782
29783 static bool
29784 expand_vec_perm_broadcast (struct expand_vec_perm_d *d)
29785 {
29786   unsigned i, elt, nelt = d->nelt;
29787
29788   if (d->op0 != d->op1)
29789     return false;
29790
29791   elt = d->perm[0];
29792   for (i = 1; i < nelt; ++i)
29793     if (d->perm[i] != elt)
29794       return false;
29795
29796   return expand_vec_perm_broadcast_1 (d);
29797 }
29798
29799 /* The guts of ix86_expand_vec_perm_builtin, also used by the ok hook.
29800    With all of the interface bits taken care of, perform the expansion
29801    in D and return true on success.  */
29802
29803 static bool
29804 ix86_expand_vec_perm_builtin_1 (struct expand_vec_perm_d *d)
29805 {
29806   /* Try a single instruction expansion.  */
29807   if (expand_vec_perm_1 (d))
29808     return true;
29809
29810   /* Try sequences of two instructions.  */
29811
29812   if (expand_vec_perm_pshuflw_pshufhw (d))
29813     return true;
29814
29815   if (expand_vec_perm_palignr (d))
29816     return true;
29817
29818   if (expand_vec_perm_interleave2 (d))
29819     return true;
29820
29821   if (expand_vec_perm_broadcast (d))
29822     return true;
29823
29824   /* Try sequences of three instructions.  */
29825
29826   if (expand_vec_perm_pshufb2 (d))
29827     return true;
29828
29829   /* ??? Look for narrow permutations whose element orderings would
29830      allow the promotion to a wider mode.  */
29831
29832   /* ??? Look for sequences of interleave or a wider permute that place
29833      the data into the correct lanes for a half-vector shuffle like
29834      pshuf[lh]w or vpermilps.  */
29835
29836   /* ??? Look for sequences of interleave that produce the desired results.
29837      The combinatorics of punpck[lh] get pretty ugly... */
29838
29839   if (expand_vec_perm_even_odd (d))
29840     return true;
29841
29842   return false;
29843 }
29844
29845 /* Extract the values from the vector CST into the permutation array in D.
29846    Return 0 on error, 1 if all values from the permutation come from the
29847    first vector, 2 if all values from the second vector, and 3 otherwise.  */
29848
29849 static int
29850 extract_vec_perm_cst (struct expand_vec_perm_d *d, tree cst)
29851 {
29852   tree list = TREE_VECTOR_CST_ELTS (cst);
29853   unsigned i, nelt = d->nelt;
29854   int ret = 0;
29855
29856   for (i = 0; i < nelt; ++i, list = TREE_CHAIN (list))
29857     {
29858       unsigned HOST_WIDE_INT e;
29859
29860       if (!host_integerp (TREE_VALUE (list), 1))
29861         return 0;
29862       e = tree_low_cst (TREE_VALUE (list), 1);
29863       if (e >= 2 * nelt)
29864         return 0;
29865
29866       ret |= (e < nelt ? 1 : 2);
29867       d->perm[i] = e;
29868     }
29869   gcc_assert (list == NULL);
29870
29871   /* For all elements from second vector, fold the elements to first.  */
29872   if (ret == 2)
29873     for (i = 0; i < nelt; ++i)
29874       d->perm[i] -= nelt;
29875
29876   return ret;
29877 }
29878
29879 static rtx
29880 ix86_expand_vec_perm_builtin (tree exp)
29881 {
29882   struct expand_vec_perm_d d;
29883   tree arg0, arg1, arg2;
29884
29885   arg0 = CALL_EXPR_ARG (exp, 0);
29886   arg1 = CALL_EXPR_ARG (exp, 1);
29887   arg2 = CALL_EXPR_ARG (exp, 2);
29888
29889   d.vmode = TYPE_MODE (TREE_TYPE (arg0));
29890   d.nelt = GET_MODE_NUNITS (d.vmode);
29891   d.testing_p = false;
29892   gcc_assert (VECTOR_MODE_P (d.vmode));
29893
29894   if (TREE_CODE (arg2) != VECTOR_CST)
29895     {
29896       error_at (EXPR_LOCATION (exp),
29897                 "vector permutation requires vector constant");
29898       goto exit_error;
29899     }
29900
29901   switch (extract_vec_perm_cst (&d, arg2))
29902     {
29903     default:
29904       gcc_unreachable();
29905
29906     case 0:
29907       error_at (EXPR_LOCATION (exp), "invalid vector permutation constant");
29908       goto exit_error;
29909
29910     case 3:
29911       if (!operand_equal_p (arg0, arg1, 0))
29912         {
29913           d.op0 = expand_expr (arg0, NULL_RTX, d.vmode, EXPAND_NORMAL);
29914           d.op0 = force_reg (d.vmode, d.op0);
29915           d.op1 = expand_expr (arg1, NULL_RTX, d.vmode, EXPAND_NORMAL);
29916           d.op1 = force_reg (d.vmode, d.op1);
29917           break;
29918         }
29919
29920       /* The elements of PERM do not suggest that only the first operand
29921          is used, but both operands are identical.  Allow easier matching
29922          of the permutation by folding the permutation into the single
29923          input vector.  */
29924       {
29925         unsigned i, nelt = d.nelt;
29926         for (i = 0; i < nelt; ++i)
29927           if (d.perm[i] >= nelt)
29928             d.perm[i] -= nelt;
29929       }
29930       /* FALLTHRU */
29931
29932     case 1:
29933       d.op0 = expand_expr (arg0, NULL_RTX, d.vmode, EXPAND_NORMAL);
29934       d.op0 = force_reg (d.vmode, d.op0);
29935       d.op1 = d.op0;
29936       break;
29937
29938     case 2:
29939       d.op0 = expand_expr (arg1, NULL_RTX, d.vmode, EXPAND_NORMAL);
29940       d.op0 = force_reg (d.vmode, d.op0);
29941       d.op1 = d.op0;
29942       break;
29943     }
29944  
29945   d.target = gen_reg_rtx (d.vmode);
29946   if (ix86_expand_vec_perm_builtin_1 (&d))
29947     return d.target;
29948
29949   /* For compiler generated permutations, we should never got here, because
29950      the compiler should also be checking the ok hook.  But since this is a
29951      builtin the user has access too, so don't abort.  */
29952   switch (d.nelt)
29953     {
29954     case 2:
29955       sorry ("vector permutation (%d %d)", d.perm[0], d.perm[1]);
29956       break;
29957     case 4:
29958       sorry ("vector permutation (%d %d %d %d)",
29959              d.perm[0], d.perm[1], d.perm[2], d.perm[3]);
29960       break;
29961     case 8:
29962       sorry ("vector permutation (%d %d %d %d %d %d %d %d)",
29963              d.perm[0], d.perm[1], d.perm[2], d.perm[3],
29964              d.perm[4], d.perm[5], d.perm[6], d.perm[7]);
29965       break;
29966     case 16:
29967       sorry ("vector permutation "
29968              "(%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d)",
29969              d.perm[0], d.perm[1], d.perm[2], d.perm[3],
29970              d.perm[4], d.perm[5], d.perm[6], d.perm[7],
29971              d.perm[8], d.perm[9], d.perm[10], d.perm[11],
29972              d.perm[12], d.perm[13], d.perm[14], d.perm[15]);
29973       break;
29974     default:
29975       gcc_unreachable ();
29976     }
29977  exit_error:
29978   return CONST0_RTX (d.vmode);
29979 }
29980
29981 /* Implement targetm.vectorize.builtin_vec_perm_ok.  */
29982
29983 static bool
29984 ix86_vectorize_builtin_vec_perm_ok (tree vec_type, tree mask)
29985 {
29986   struct expand_vec_perm_d d;
29987   int vec_mask;
29988   bool ret, one_vec;
29989
29990   d.vmode = TYPE_MODE (vec_type);
29991   d.nelt = GET_MODE_NUNITS (d.vmode);
29992   d.testing_p = true;
29993
29994   /* Given sufficient ISA support we can just return true here
29995      for selected vector modes.  */
29996   if (GET_MODE_SIZE (d.vmode) == 16)
29997     {
29998       /* All implementable with a single vpperm insn.  */
29999       if (TARGET_XOP)
30000         return true;
30001       /* All implementable with 2 pshufb + 1 ior.  */
30002       if (TARGET_SSSE3)
30003         return true;
30004       /* All implementable with shufpd or unpck[lh]pd.  */
30005       if (d.nelt == 2)
30006         return true;
30007     }
30008
30009   vec_mask = extract_vec_perm_cst (&d, mask);
30010
30011   /* This hook is cannot be called in response to something that the
30012      user does (unlike the builtin expander) so we shouldn't ever see
30013      an error generated from the extract.  */
30014   gcc_assert (vec_mask > 0 && vec_mask <= 3);
30015   one_vec = (vec_mask != 3);
30016   
30017   /* Implementable with shufps or pshufd.  */
30018   if (one_vec && (d.vmode == V4SFmode || d.vmode == V4SImode))
30019     return true;
30020
30021   /* Otherwise we have to go through the motions and see if we can
30022      figure out how to generate the requested permutation.  */
30023   d.target = gen_raw_REG (d.vmode, LAST_VIRTUAL_REGISTER + 1);
30024   d.op1 = d.op0 = gen_raw_REG (d.vmode, LAST_VIRTUAL_REGISTER + 2);
30025   if (!one_vec)
30026     d.op1 = gen_raw_REG (d.vmode, LAST_VIRTUAL_REGISTER + 3);
30027
30028   start_sequence ();
30029   ret = ix86_expand_vec_perm_builtin_1 (&d);
30030   end_sequence ();
30031
30032   return ret;
30033 }
30034
30035 void
30036 ix86_expand_vec_extract_even_odd (rtx targ, rtx op0, rtx op1, unsigned odd)
30037 {
30038   struct expand_vec_perm_d d;
30039   unsigned i, nelt;
30040
30041   d.target = targ;
30042   d.op0 = op0;
30043   d.op1 = op1;
30044   d.vmode = GET_MODE (targ);
30045   d.nelt = nelt = GET_MODE_NUNITS (d.vmode);
30046   d.testing_p = false;
30047
30048   for (i = 0; i < nelt; ++i)
30049     d.perm[i] = i * 2 + odd;
30050
30051   /* We'll either be able to implement the permutation directly...  */
30052   if (expand_vec_perm_1 (&d))
30053     return;
30054
30055   /* ... or we use the special-case patterns.  */
30056   expand_vec_perm_even_odd_1 (&d, odd);
30057 }
30058 \f
30059 /* This function returns the calling abi specific va_list type node.
30060    It returns  the FNDECL specific va_list type.  */
30061
30062 tree
30063 ix86_fn_abi_va_list (tree fndecl)
30064 {
30065   if (!TARGET_64BIT)
30066     return va_list_type_node;
30067   gcc_assert (fndecl != NULL_TREE);
30068
30069   if (ix86_function_abi ((const_tree) fndecl) == MS_ABI)
30070     return ms_va_list_type_node;
30071   else
30072     return sysv_va_list_type_node;
30073 }
30074
30075 /* Returns the canonical va_list type specified by TYPE. If there
30076    is no valid TYPE provided, it return NULL_TREE.  */
30077
30078 tree
30079 ix86_canonical_va_list_type (tree type)
30080 {
30081   tree wtype, htype;
30082
30083   /* Resolve references and pointers to va_list type.  */
30084   if (INDIRECT_REF_P (type))
30085     type = TREE_TYPE (type);
30086   else if (POINTER_TYPE_P (type) && POINTER_TYPE_P (TREE_TYPE(type)))
30087     type = TREE_TYPE (type);
30088
30089   if (TARGET_64BIT)
30090     {
30091       wtype = va_list_type_node;
30092           gcc_assert (wtype != NULL_TREE);
30093       htype = type;
30094       if (TREE_CODE (wtype) == ARRAY_TYPE)
30095         {
30096           /* If va_list is an array type, the argument may have decayed
30097              to a pointer type, e.g. by being passed to another function.
30098              In that case, unwrap both types so that we can compare the
30099              underlying records.  */
30100           if (TREE_CODE (htype) == ARRAY_TYPE
30101               || POINTER_TYPE_P (htype))
30102             {
30103               wtype = TREE_TYPE (wtype);
30104               htype = TREE_TYPE (htype);
30105             }
30106         }
30107       if (TYPE_MAIN_VARIANT (wtype) == TYPE_MAIN_VARIANT (htype))
30108         return va_list_type_node;
30109       wtype = sysv_va_list_type_node;
30110           gcc_assert (wtype != NULL_TREE);
30111       htype = type;
30112       if (TREE_CODE (wtype) == ARRAY_TYPE)
30113         {
30114           /* If va_list is an array type, the argument may have decayed
30115              to a pointer type, e.g. by being passed to another function.
30116              In that case, unwrap both types so that we can compare the
30117              underlying records.  */
30118           if (TREE_CODE (htype) == ARRAY_TYPE
30119               || POINTER_TYPE_P (htype))
30120             {
30121               wtype = TREE_TYPE (wtype);
30122               htype = TREE_TYPE (htype);
30123             }
30124         }
30125       if (TYPE_MAIN_VARIANT (wtype) == TYPE_MAIN_VARIANT (htype))
30126         return sysv_va_list_type_node;
30127       wtype = ms_va_list_type_node;
30128           gcc_assert (wtype != NULL_TREE);
30129       htype = type;
30130       if (TREE_CODE (wtype) == ARRAY_TYPE)
30131         {
30132           /* If va_list is an array type, the argument may have decayed
30133              to a pointer type, e.g. by being passed to another function.
30134              In that case, unwrap both types so that we can compare the
30135              underlying records.  */
30136           if (TREE_CODE (htype) == ARRAY_TYPE
30137               || POINTER_TYPE_P (htype))
30138             {
30139               wtype = TREE_TYPE (wtype);
30140               htype = TREE_TYPE (htype);
30141             }
30142         }
30143       if (TYPE_MAIN_VARIANT (wtype) == TYPE_MAIN_VARIANT (htype))
30144         return ms_va_list_type_node;
30145       return NULL_TREE;
30146     }
30147   return std_canonical_va_list_type (type);
30148 }
30149
30150 /* Iterate through the target-specific builtin types for va_list.
30151     IDX denotes the iterator, *PTREE is set to the result type of
30152     the va_list builtin, and *PNAME to its internal type.
30153     Returns zero if there is no element for this index, otherwise
30154     IDX should be increased upon the next call.
30155     Note, do not iterate a base builtin's name like __builtin_va_list.
30156     Used from c_common_nodes_and_builtins.  */
30157
30158 int
30159 ix86_enum_va_list (int idx, const char **pname, tree *ptree)
30160 {
30161   if (!TARGET_64BIT)
30162     return 0;
30163   switch (idx) {
30164   case 0:
30165     *ptree = ms_va_list_type_node;
30166     *pname = "__builtin_ms_va_list";
30167     break;
30168   case 1:
30169     *ptree = sysv_va_list_type_node;
30170     *pname = "__builtin_sysv_va_list";
30171     break;
30172   default:
30173     return 0;
30174   }
30175   return 1;
30176 }
30177
30178 /* Initialize the GCC target structure.  */
30179 #undef TARGET_RETURN_IN_MEMORY
30180 #define TARGET_RETURN_IN_MEMORY ix86_return_in_memory
30181
30182 #undef TARGET_LEGITIMIZE_ADDRESS
30183 #define TARGET_LEGITIMIZE_ADDRESS ix86_legitimize_address
30184
30185 #undef TARGET_ATTRIBUTE_TABLE
30186 #define TARGET_ATTRIBUTE_TABLE ix86_attribute_table
30187 #if TARGET_DLLIMPORT_DECL_ATTRIBUTES
30188 #  undef TARGET_MERGE_DECL_ATTRIBUTES
30189 #  define TARGET_MERGE_DECL_ATTRIBUTES merge_dllimport_decl_attributes
30190 #endif
30191
30192 #undef TARGET_COMP_TYPE_ATTRIBUTES
30193 #define TARGET_COMP_TYPE_ATTRIBUTES ix86_comp_type_attributes
30194
30195 #undef TARGET_INIT_BUILTINS
30196 #define TARGET_INIT_BUILTINS ix86_init_builtins
30197 #undef TARGET_BUILTIN_DECL
30198 #define TARGET_BUILTIN_DECL ix86_builtin_decl
30199 #undef TARGET_EXPAND_BUILTIN
30200 #define TARGET_EXPAND_BUILTIN ix86_expand_builtin
30201
30202 #undef TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION
30203 #define TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION \
30204   ix86_builtin_vectorized_function
30205
30206 #undef TARGET_VECTORIZE_BUILTIN_CONVERSION
30207 #define TARGET_VECTORIZE_BUILTIN_CONVERSION ix86_vectorize_builtin_conversion
30208
30209 #undef TARGET_BUILTIN_RECIPROCAL
30210 #define TARGET_BUILTIN_RECIPROCAL ix86_builtin_reciprocal
30211
30212 #undef TARGET_ASM_FUNCTION_EPILOGUE
30213 #define TARGET_ASM_FUNCTION_EPILOGUE ix86_output_function_epilogue
30214
30215 #undef TARGET_ENCODE_SECTION_INFO
30216 #ifndef SUBTARGET_ENCODE_SECTION_INFO
30217 #define TARGET_ENCODE_SECTION_INFO ix86_encode_section_info
30218 #else
30219 #define TARGET_ENCODE_SECTION_INFO SUBTARGET_ENCODE_SECTION_INFO
30220 #endif
30221
30222 #undef TARGET_ASM_OPEN_PAREN
30223 #define TARGET_ASM_OPEN_PAREN ""
30224 #undef TARGET_ASM_CLOSE_PAREN
30225 #define TARGET_ASM_CLOSE_PAREN ""
30226
30227 #undef TARGET_ASM_BYTE_OP
30228 #define TARGET_ASM_BYTE_OP ASM_BYTE
30229
30230 #undef TARGET_ASM_ALIGNED_HI_OP
30231 #define TARGET_ASM_ALIGNED_HI_OP ASM_SHORT
30232 #undef TARGET_ASM_ALIGNED_SI_OP
30233 #define TARGET_ASM_ALIGNED_SI_OP ASM_LONG
30234 #ifdef ASM_QUAD
30235 #undef TARGET_ASM_ALIGNED_DI_OP
30236 #define TARGET_ASM_ALIGNED_DI_OP ASM_QUAD
30237 #endif
30238
30239 #undef TARGET_ASM_UNALIGNED_HI_OP
30240 #define TARGET_ASM_UNALIGNED_HI_OP TARGET_ASM_ALIGNED_HI_OP
30241 #undef TARGET_ASM_UNALIGNED_SI_OP
30242 #define TARGET_ASM_UNALIGNED_SI_OP TARGET_ASM_ALIGNED_SI_OP
30243 #undef TARGET_ASM_UNALIGNED_DI_OP
30244 #define TARGET_ASM_UNALIGNED_DI_OP TARGET_ASM_ALIGNED_DI_OP
30245
30246 #undef TARGET_SCHED_ADJUST_COST
30247 #define TARGET_SCHED_ADJUST_COST ix86_adjust_cost
30248 #undef TARGET_SCHED_ISSUE_RATE
30249 #define TARGET_SCHED_ISSUE_RATE ix86_issue_rate
30250 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
30251 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD \
30252   ia32_multipass_dfa_lookahead
30253
30254 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
30255 #define TARGET_FUNCTION_OK_FOR_SIBCALL ix86_function_ok_for_sibcall
30256
30257 #ifdef HAVE_AS_TLS
30258 #undef TARGET_HAVE_TLS
30259 #define TARGET_HAVE_TLS true
30260 #endif
30261 #undef TARGET_CANNOT_FORCE_CONST_MEM
30262 #define TARGET_CANNOT_FORCE_CONST_MEM ix86_cannot_force_const_mem
30263 #undef TARGET_USE_BLOCKS_FOR_CONSTANT_P
30264 #define TARGET_USE_BLOCKS_FOR_CONSTANT_P hook_bool_mode_const_rtx_true
30265
30266 #undef TARGET_DELEGITIMIZE_ADDRESS
30267 #define TARGET_DELEGITIMIZE_ADDRESS ix86_delegitimize_address
30268
30269 #undef TARGET_MS_BITFIELD_LAYOUT_P
30270 #define TARGET_MS_BITFIELD_LAYOUT_P ix86_ms_bitfield_layout_p
30271
30272 #if TARGET_MACHO
30273 #undef TARGET_BINDS_LOCAL_P
30274 #define TARGET_BINDS_LOCAL_P darwin_binds_local_p
30275 #endif
30276 #if TARGET_DLLIMPORT_DECL_ATTRIBUTES
30277 #undef TARGET_BINDS_LOCAL_P
30278 #define TARGET_BINDS_LOCAL_P i386_pe_binds_local_p
30279 #endif
30280
30281 #undef TARGET_ASM_OUTPUT_MI_THUNK
30282 #define TARGET_ASM_OUTPUT_MI_THUNK x86_output_mi_thunk
30283 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
30284 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK x86_can_output_mi_thunk
30285
30286 #undef TARGET_ASM_FILE_START
30287 #define TARGET_ASM_FILE_START x86_file_start
30288
30289 #undef TARGET_DEFAULT_TARGET_FLAGS
30290 #define TARGET_DEFAULT_TARGET_FLAGS     \
30291   (TARGET_DEFAULT                       \
30292    | TARGET_SUBTARGET_DEFAULT           \
30293    | TARGET_TLS_DIRECT_SEG_REFS_DEFAULT \
30294    | MASK_FUSED_MADD)
30295
30296 #undef TARGET_HANDLE_OPTION
30297 #define TARGET_HANDLE_OPTION ix86_handle_option
30298
30299 #undef TARGET_RTX_COSTS
30300 #define TARGET_RTX_COSTS ix86_rtx_costs
30301 #undef TARGET_ADDRESS_COST
30302 #define TARGET_ADDRESS_COST ix86_address_cost
30303
30304 #undef TARGET_FIXED_CONDITION_CODE_REGS
30305 #define TARGET_FIXED_CONDITION_CODE_REGS ix86_fixed_condition_code_regs
30306 #undef TARGET_CC_MODES_COMPATIBLE
30307 #define TARGET_CC_MODES_COMPATIBLE ix86_cc_modes_compatible
30308
30309 #undef TARGET_MACHINE_DEPENDENT_REORG
30310 #define TARGET_MACHINE_DEPENDENT_REORG ix86_reorg
30311
30312 #undef TARGET_BUILTIN_SETJMP_FRAME_VALUE
30313 #define TARGET_BUILTIN_SETJMP_FRAME_VALUE ix86_builtin_setjmp_frame_value
30314
30315 #undef TARGET_BUILD_BUILTIN_VA_LIST
30316 #define TARGET_BUILD_BUILTIN_VA_LIST ix86_build_builtin_va_list
30317
30318 #undef TARGET_FN_ABI_VA_LIST
30319 #define TARGET_FN_ABI_VA_LIST ix86_fn_abi_va_list
30320
30321 #undef TARGET_CANONICAL_VA_LIST_TYPE
30322 #define TARGET_CANONICAL_VA_LIST_TYPE ix86_canonical_va_list_type
30323
30324 #undef TARGET_EXPAND_BUILTIN_VA_START
30325 #define TARGET_EXPAND_BUILTIN_VA_START ix86_va_start
30326
30327 #undef TARGET_MD_ASM_CLOBBERS
30328 #define TARGET_MD_ASM_CLOBBERS ix86_md_asm_clobbers
30329
30330 #undef TARGET_PROMOTE_PROTOTYPES
30331 #define TARGET_PROMOTE_PROTOTYPES hook_bool_const_tree_true
30332 #undef TARGET_STRUCT_VALUE_RTX
30333 #define TARGET_STRUCT_VALUE_RTX ix86_struct_value_rtx
30334 #undef TARGET_SETUP_INCOMING_VARARGS
30335 #define TARGET_SETUP_INCOMING_VARARGS ix86_setup_incoming_varargs
30336 #undef TARGET_MUST_PASS_IN_STACK
30337 #define TARGET_MUST_PASS_IN_STACK ix86_must_pass_in_stack
30338 #undef TARGET_PASS_BY_REFERENCE
30339 #define TARGET_PASS_BY_REFERENCE ix86_pass_by_reference
30340 #undef TARGET_INTERNAL_ARG_POINTER
30341 #define TARGET_INTERNAL_ARG_POINTER ix86_internal_arg_pointer
30342 #undef TARGET_UPDATE_STACK_BOUNDARY
30343 #define TARGET_UPDATE_STACK_BOUNDARY ix86_update_stack_boundary
30344 #undef TARGET_GET_DRAP_RTX
30345 #define TARGET_GET_DRAP_RTX ix86_get_drap_rtx
30346 #undef TARGET_STRICT_ARGUMENT_NAMING
30347 #define TARGET_STRICT_ARGUMENT_NAMING hook_bool_CUMULATIVE_ARGS_true
30348 #undef TARGET_STATIC_CHAIN
30349 #define TARGET_STATIC_CHAIN ix86_static_chain
30350 #undef TARGET_TRAMPOLINE_INIT
30351 #define TARGET_TRAMPOLINE_INIT ix86_trampoline_init
30352
30353 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
30354 #define TARGET_GIMPLIFY_VA_ARG_EXPR ix86_gimplify_va_arg
30355
30356 #undef TARGET_SCALAR_MODE_SUPPORTED_P
30357 #define TARGET_SCALAR_MODE_SUPPORTED_P ix86_scalar_mode_supported_p
30358
30359 #undef TARGET_VECTOR_MODE_SUPPORTED_P
30360 #define TARGET_VECTOR_MODE_SUPPORTED_P ix86_vector_mode_supported_p
30361
30362 #undef TARGET_C_MODE_FOR_SUFFIX
30363 #define TARGET_C_MODE_FOR_SUFFIX ix86_c_mode_for_suffix
30364
30365 #ifdef HAVE_AS_TLS
30366 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
30367 #define TARGET_ASM_OUTPUT_DWARF_DTPREL i386_output_dwarf_dtprel
30368 #endif
30369
30370 #ifdef SUBTARGET_INSERT_ATTRIBUTES
30371 #undef TARGET_INSERT_ATTRIBUTES
30372 #define TARGET_INSERT_ATTRIBUTES SUBTARGET_INSERT_ATTRIBUTES
30373 #endif
30374
30375 #undef TARGET_MANGLE_TYPE
30376 #define TARGET_MANGLE_TYPE ix86_mangle_type
30377
30378 #undef TARGET_STACK_PROTECT_FAIL
30379 #define TARGET_STACK_PROTECT_FAIL ix86_stack_protect_fail
30380
30381 #undef TARGET_FUNCTION_VALUE
30382 #define TARGET_FUNCTION_VALUE ix86_function_value
30383
30384 #undef TARGET_SECONDARY_RELOAD
30385 #define TARGET_SECONDARY_RELOAD ix86_secondary_reload
30386
30387 #undef TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST
30388 #define TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST \
30389   ix86_builtin_vectorization_cost
30390 #undef TARGET_VECTORIZE_BUILTIN_VEC_PERM
30391 #define TARGET_VECTORIZE_BUILTIN_VEC_PERM \
30392   ix86_vectorize_builtin_vec_perm
30393 #undef TARGET_VECTORIZE_BUILTIN_VEC_PERM_OK
30394 #define TARGET_VECTORIZE_BUILTIN_VEC_PERM_OK \
30395   ix86_vectorize_builtin_vec_perm_ok
30396
30397 #undef TARGET_SET_CURRENT_FUNCTION
30398 #define TARGET_SET_CURRENT_FUNCTION ix86_set_current_function
30399
30400 #undef TARGET_OPTION_VALID_ATTRIBUTE_P
30401 #define TARGET_OPTION_VALID_ATTRIBUTE_P ix86_valid_target_attribute_p
30402
30403 #undef TARGET_OPTION_SAVE
30404 #define TARGET_OPTION_SAVE ix86_function_specific_save
30405
30406 #undef TARGET_OPTION_RESTORE
30407 #define TARGET_OPTION_RESTORE ix86_function_specific_restore
30408
30409 #undef TARGET_OPTION_PRINT
30410 #define TARGET_OPTION_PRINT ix86_function_specific_print
30411
30412 #undef TARGET_CAN_INLINE_P
30413 #define TARGET_CAN_INLINE_P ix86_can_inline_p
30414
30415 #undef TARGET_EXPAND_TO_RTL_HOOK
30416 #define TARGET_EXPAND_TO_RTL_HOOK ix86_maybe_switch_abi
30417
30418 #undef TARGET_LEGITIMATE_ADDRESS_P
30419 #define TARGET_LEGITIMATE_ADDRESS_P ix86_legitimate_address_p
30420
30421 #undef TARGET_IRA_COVER_CLASSES
30422 #define TARGET_IRA_COVER_CLASSES i386_ira_cover_classes
30423
30424 #undef TARGET_FRAME_POINTER_REQUIRED
30425 #define TARGET_FRAME_POINTER_REQUIRED ix86_frame_pointer_required
30426
30427 #undef TARGET_CAN_ELIMINATE
30428 #define TARGET_CAN_ELIMINATE ix86_can_eliminate
30429
30430 struct gcc_target targetm = TARGET_INITIALIZER;
30431 \f
30432 #include "gt-i386.h"