OSDN Git Service

da7e8f93eefe6ea953fd4c2e29c4eba5c25352f1
[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 int x86_builtin_vectorization_cost (bool);
58 static rtx legitimize_dllimport_symbol (rtx, bool);
59
60 #ifndef CHECK_STACK_LIMIT
61 #define CHECK_STACK_LIMIT (-1)
62 #endif
63
64 /* Return index of given mode in mult and division cost tables.  */
65 #define MODE_INDEX(mode)                                        \
66   ((mode) == QImode ? 0                                         \
67    : (mode) == HImode ? 1                                       \
68    : (mode) == SImode ? 2                                       \
69    : (mode) == DImode ? 3                                       \
70    : 4)
71
72 /* Processor costs (relative to an add) */
73 /* We assume COSTS_N_INSNS is defined as (N)*4 and an addition is 2 bytes.  */
74 #define COSTS_N_BYTES(N) ((N) * 2)
75
76 #define DUMMY_STRINGOP_ALGS {libcall, {{-1, libcall}}}
77
78 const
79 struct processor_costs ix86_size_cost = {/* costs for tuning for size */
80   COSTS_N_BYTES (2),                    /* cost of an add instruction */
81   COSTS_N_BYTES (3),                    /* cost of a lea instruction */
82   COSTS_N_BYTES (2),                    /* variable shift costs */
83   COSTS_N_BYTES (3),                    /* constant shift costs */
84   {COSTS_N_BYTES (3),                   /* cost of starting multiply for QI */
85    COSTS_N_BYTES (3),                   /*                               HI */
86    COSTS_N_BYTES (3),                   /*                               SI */
87    COSTS_N_BYTES (3),                   /*                               DI */
88    COSTS_N_BYTES (5)},                  /*                            other */
89   0,                                    /* cost of multiply per each bit set */
90   {COSTS_N_BYTES (3),                   /* cost of a divide/mod for QI */
91    COSTS_N_BYTES (3),                   /*                          HI */
92    COSTS_N_BYTES (3),                   /*                          SI */
93    COSTS_N_BYTES (3),                   /*                          DI */
94    COSTS_N_BYTES (5)},                  /*                       other */
95   COSTS_N_BYTES (3),                    /* cost of movsx */
96   COSTS_N_BYTES (3),                    /* cost of movzx */
97   0,                                    /* "large" insn */
98   2,                                    /* MOVE_RATIO */
99   2,                                    /* cost for loading QImode using movzbl */
100   {2, 2, 2},                            /* cost of loading integer registers
101                                            in QImode, HImode and SImode.
102                                            Relative to reg-reg move (2).  */
103   {2, 2, 2},                            /* cost of storing integer registers */
104   2,                                    /* cost of reg,reg fld/fst */
105   {2, 2, 2},                            /* cost of loading fp registers
106                                            in SFmode, DFmode and XFmode */
107   {2, 2, 2},                            /* cost of storing fp registers
108                                            in SFmode, DFmode and XFmode */
109   3,                                    /* cost of moving MMX register */
110   {3, 3},                               /* cost of loading MMX registers
111                                            in SImode and DImode */
112   {3, 3},                               /* cost of storing MMX registers
113                                            in SImode and DImode */
114   3,                                    /* cost of moving SSE register */
115   {3, 3, 3},                            /* cost of loading SSE registers
116                                            in SImode, DImode and TImode */
117   {3, 3, 3},                            /* cost of storing SSE registers
118                                            in SImode, DImode and TImode */
119   3,                                    /* MMX or SSE register to integer */
120   0,                                    /* size of l1 cache  */
121   0,                                    /* size of l2 cache  */
122   0,                                    /* size of prefetch block */
123   0,                                    /* number of parallel prefetches */
124   2,                                    /* Branch cost */
125   COSTS_N_BYTES (2),                    /* cost of FADD and FSUB insns.  */
126   COSTS_N_BYTES (2),                    /* cost of FMUL instruction.  */
127   COSTS_N_BYTES (2),                    /* cost of FDIV instruction.  */
128   COSTS_N_BYTES (2),                    /* cost of FABS instruction.  */
129   COSTS_N_BYTES (2),                    /* cost of FCHS instruction.  */
130   COSTS_N_BYTES (2),                    /* cost of FSQRT instruction.  */
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    {rep_prefix_1_byte, {{-1, rep_prefix_1_byte}}}},
135   1,                                    /* scalar_stmt_cost.  */
136   1,                                    /* scalar load_cost.  */
137   1,                                    /* scalar_store_cost.  */
138   1,                                    /* vec_stmt_cost.  */
139   1,                                    /* vec_to_scalar_cost.  */
140   1,                                    /* scalar_to_vec_cost.  */
141   1,                                    /* vec_align_load_cost.  */
142   1,                                    /* vec_unalign_load_cost.  */
143   1,                                    /* vec_store_cost.  */
144   1,                                    /* cond_taken_branch_cost.  */
145   1,                                    /* cond_not_taken_branch_cost.  */
146 };
147
148 /* Processor costs (relative to an add) */
149 static const
150 struct processor_costs i386_cost = {    /* 386 specific costs */
151   COSTS_N_INSNS (1),                    /* cost of an add instruction */
152   COSTS_N_INSNS (1),                    /* cost of a lea instruction */
153   COSTS_N_INSNS (3),                    /* variable shift costs */
154   COSTS_N_INSNS (2),                    /* constant shift costs */
155   {COSTS_N_INSNS (6),                   /* cost of starting multiply for QI */
156    COSTS_N_INSNS (6),                   /*                               HI */
157    COSTS_N_INSNS (6),                   /*                               SI */
158    COSTS_N_INSNS (6),                   /*                               DI */
159    COSTS_N_INSNS (6)},                  /*                               other */
160   COSTS_N_INSNS (1),                    /* cost of multiply per each bit set */
161   {COSTS_N_INSNS (23),                  /* cost of a divide/mod for QI */
162    COSTS_N_INSNS (23),                  /*                          HI */
163    COSTS_N_INSNS (23),                  /*                          SI */
164    COSTS_N_INSNS (23),                  /*                          DI */
165    COSTS_N_INSNS (23)},                 /*                          other */
166   COSTS_N_INSNS (3),                    /* cost of movsx */
167   COSTS_N_INSNS (2),                    /* cost of movzx */
168   15,                                   /* "large" insn */
169   3,                                    /* MOVE_RATIO */
170   4,                                    /* cost for loading QImode using movzbl */
171   {2, 4, 2},                            /* cost of loading integer registers
172                                            in QImode, HImode and SImode.
173                                            Relative to reg-reg move (2).  */
174   {2, 4, 2},                            /* cost of storing integer registers */
175   2,                                    /* cost of reg,reg fld/fst */
176   {8, 8, 8},                            /* cost of loading fp registers
177                                            in SFmode, DFmode and XFmode */
178   {8, 8, 8},                            /* cost of storing fp registers
179                                            in SFmode, DFmode and XFmode */
180   2,                                    /* cost of moving MMX register */
181   {4, 8},                               /* cost of loading MMX registers
182                                            in SImode and DImode */
183   {4, 8},                               /* cost of storing MMX registers
184                                            in SImode and DImode */
185   2,                                    /* cost of moving SSE register */
186   {4, 8, 16},                           /* cost of loading SSE registers
187                                            in SImode, DImode and TImode */
188   {4, 8, 16},                           /* cost of storing SSE registers
189                                            in SImode, DImode and TImode */
190   3,                                    /* MMX or SSE register to integer */
191   0,                                    /* size of l1 cache  */
192   0,                                    /* size of l2 cache  */
193   0,                                    /* size of prefetch block */
194   0,                                    /* number of parallel prefetches */
195   1,                                    /* Branch cost */
196   COSTS_N_INSNS (23),                   /* cost of FADD and FSUB insns.  */
197   COSTS_N_INSNS (27),                   /* cost of FMUL instruction.  */
198   COSTS_N_INSNS (88),                   /* cost of FDIV instruction.  */
199   COSTS_N_INSNS (22),                   /* cost of FABS instruction.  */
200   COSTS_N_INSNS (24),                   /* cost of FCHS instruction.  */
201   COSTS_N_INSNS (122),                  /* cost of FSQRT instruction.  */
202   {{rep_prefix_1_byte, {{-1, rep_prefix_1_byte}}},
203    DUMMY_STRINGOP_ALGS},
204   {{rep_prefix_1_byte, {{-1, rep_prefix_1_byte}}},
205    DUMMY_STRINGOP_ALGS},
206   1,                                    /* scalar_stmt_cost.  */
207   1,                                    /* scalar load_cost.  */
208   1,                                    /* scalar_store_cost.  */
209   1,                                    /* vec_stmt_cost.  */
210   1,                                    /* vec_to_scalar_cost.  */
211   1,                                    /* scalar_to_vec_cost.  */
212   1,                                    /* vec_align_load_cost.  */
213   2,                                    /* vec_unalign_load_cost.  */
214   1,                                    /* vec_store_cost.  */
215   3,                                    /* cond_taken_branch_cost.  */
216   1,                                    /* cond_not_taken_branch_cost.  */
217 };
218
219 static const
220 struct processor_costs i486_cost = {    /* 486 specific costs */
221   COSTS_N_INSNS (1),                    /* cost of an add instruction */
222   COSTS_N_INSNS (1),                    /* cost of a lea instruction */
223   COSTS_N_INSNS (3),                    /* variable shift costs */
224   COSTS_N_INSNS (2),                    /* constant shift costs */
225   {COSTS_N_INSNS (12),                  /* cost of starting multiply for QI */
226    COSTS_N_INSNS (12),                  /*                               HI */
227    COSTS_N_INSNS (12),                  /*                               SI */
228    COSTS_N_INSNS (12),                  /*                               DI */
229    COSTS_N_INSNS (12)},                 /*                               other */
230   1,                                    /* cost of multiply per each bit set */
231   {COSTS_N_INSNS (40),                  /* cost of a divide/mod for QI */
232    COSTS_N_INSNS (40),                  /*                          HI */
233    COSTS_N_INSNS (40),                  /*                          SI */
234    COSTS_N_INSNS (40),                  /*                          DI */
235    COSTS_N_INSNS (40)},                 /*                          other */
236   COSTS_N_INSNS (3),                    /* cost of movsx */
237   COSTS_N_INSNS (2),                    /* cost of movzx */
238   15,                                   /* "large" insn */
239   3,                                    /* MOVE_RATIO */
240   4,                                    /* cost for loading QImode using movzbl */
241   {2, 4, 2},                            /* cost of loading integer registers
242                                            in QImode, HImode and SImode.
243                                            Relative to reg-reg move (2).  */
244   {2, 4, 2},                            /* cost of storing integer registers */
245   2,                                    /* cost of reg,reg fld/fst */
246   {8, 8, 8},                            /* cost of loading fp registers
247                                            in SFmode, DFmode and XFmode */
248   {8, 8, 8},                            /* cost of storing fp registers
249                                            in SFmode, DFmode and XFmode */
250   2,                                    /* cost of moving MMX register */
251   {4, 8},                               /* cost of loading MMX registers
252                                            in SImode and DImode */
253   {4, 8},                               /* cost of storing MMX registers
254                                            in SImode and DImode */
255   2,                                    /* cost of moving SSE register */
256   {4, 8, 16},                           /* cost of loading SSE registers
257                                            in SImode, DImode and TImode */
258   {4, 8, 16},                           /* cost of storing SSE registers
259                                            in SImode, DImode and TImode */
260   3,                                    /* MMX or SSE register to integer */
261   4,                                    /* size of l1 cache.  486 has 8kB cache
262                                            shared for code and data, so 4kB is
263                                            not really precise.  */
264   4,                                    /* size of l2 cache  */
265   0,                                    /* size of prefetch block */
266   0,                                    /* number of parallel prefetches */
267   1,                                    /* Branch cost */
268   COSTS_N_INSNS (8),                    /* cost of FADD and FSUB insns.  */
269   COSTS_N_INSNS (16),                   /* cost of FMUL instruction.  */
270   COSTS_N_INSNS (73),                   /* cost of FDIV instruction.  */
271   COSTS_N_INSNS (3),                    /* cost of FABS instruction.  */
272   COSTS_N_INSNS (3),                    /* cost of FCHS instruction.  */
273   COSTS_N_INSNS (83),                   /* cost of FSQRT instruction.  */
274   {{rep_prefix_4_byte, {{-1, rep_prefix_4_byte}}},
275    DUMMY_STRINGOP_ALGS},
276   {{rep_prefix_4_byte, {{-1, rep_prefix_4_byte}}},
277    DUMMY_STRINGOP_ALGS},
278   1,                                    /* scalar_stmt_cost.  */
279   1,                                    /* scalar load_cost.  */
280   1,                                    /* scalar_store_cost.  */
281   1,                                    /* vec_stmt_cost.  */
282   1,                                    /* vec_to_scalar_cost.  */
283   1,                                    /* scalar_to_vec_cost.  */
284   1,                                    /* vec_align_load_cost.  */
285   2,                                    /* vec_unalign_load_cost.  */
286   1,                                    /* vec_store_cost.  */
287   3,                                    /* cond_taken_branch_cost.  */
288   1,                                    /* cond_not_taken_branch_cost.  */
289 };
290
291 static const
292 struct processor_costs pentium_cost = {
293   COSTS_N_INSNS (1),                    /* cost of an add instruction */
294   COSTS_N_INSNS (1),                    /* cost of a lea instruction */
295   COSTS_N_INSNS (4),                    /* variable shift costs */
296   COSTS_N_INSNS (1),                    /* constant shift costs */
297   {COSTS_N_INSNS (11),                  /* cost of starting multiply for QI */
298    COSTS_N_INSNS (11),                  /*                               HI */
299    COSTS_N_INSNS (11),                  /*                               SI */
300    COSTS_N_INSNS (11),                  /*                               DI */
301    COSTS_N_INSNS (11)},                 /*                               other */
302   0,                                    /* cost of multiply per each bit set */
303   {COSTS_N_INSNS (25),                  /* cost of a divide/mod for QI */
304    COSTS_N_INSNS (25),                  /*                          HI */
305    COSTS_N_INSNS (25),                  /*                          SI */
306    COSTS_N_INSNS (25),                  /*                          DI */
307    COSTS_N_INSNS (25)},                 /*                          other */
308   COSTS_N_INSNS (3),                    /* cost of movsx */
309   COSTS_N_INSNS (2),                    /* cost of movzx */
310   8,                                    /* "large" insn */
311   6,                                    /* MOVE_RATIO */
312   6,                                    /* cost for loading QImode using movzbl */
313   {2, 4, 2},                            /* cost of loading integer registers
314                                            in QImode, HImode and SImode.
315                                            Relative to reg-reg move (2).  */
316   {2, 4, 2},                            /* cost of storing integer registers */
317   2,                                    /* cost of reg,reg fld/fst */
318   {2, 2, 6},                            /* cost of loading fp registers
319                                            in SFmode, DFmode and XFmode */
320   {4, 4, 6},                            /* cost of storing fp registers
321                                            in SFmode, DFmode and XFmode */
322   8,                                    /* cost of moving MMX register */
323   {8, 8},                               /* cost of loading MMX registers
324                                            in SImode and DImode */
325   {8, 8},                               /* cost of storing MMX registers
326                                            in SImode and DImode */
327   2,                                    /* cost of moving SSE register */
328   {4, 8, 16},                           /* cost of loading SSE registers
329                                            in SImode, DImode and TImode */
330   {4, 8, 16},                           /* cost of storing SSE registers
331                                            in SImode, DImode and TImode */
332   3,                                    /* MMX or SSE register to integer */
333   8,                                    /* size of l1 cache.  */
334   8,                                    /* size of l2 cache  */
335   0,                                    /* size of prefetch block */
336   0,                                    /* number of parallel prefetches */
337   2,                                    /* Branch cost */
338   COSTS_N_INSNS (3),                    /* cost of FADD and FSUB insns.  */
339   COSTS_N_INSNS (3),                    /* cost of FMUL instruction.  */
340   COSTS_N_INSNS (39),                   /* cost of FDIV instruction.  */
341   COSTS_N_INSNS (1),                    /* cost of FABS instruction.  */
342   COSTS_N_INSNS (1),                    /* cost of FCHS instruction.  */
343   COSTS_N_INSNS (70),                   /* cost of FSQRT instruction.  */
344   {{libcall, {{256, rep_prefix_4_byte}, {-1, libcall}}},
345    DUMMY_STRINGOP_ALGS},
346   {{libcall, {{-1, rep_prefix_4_byte}}},
347    DUMMY_STRINGOP_ALGS},
348   1,                                    /* scalar_stmt_cost.  */
349   1,                                    /* scalar load_cost.  */
350   1,                                    /* scalar_store_cost.  */
351   1,                                    /* vec_stmt_cost.  */
352   1,                                    /* vec_to_scalar_cost.  */
353   1,                                    /* scalar_to_vec_cost.  */
354   1,                                    /* vec_align_load_cost.  */
355   2,                                    /* vec_unalign_load_cost.  */
356   1,                                    /* vec_store_cost.  */
357   3,                                    /* cond_taken_branch_cost.  */
358   1,                                    /* cond_not_taken_branch_cost.  */
359 };
360
361 static const
362 struct processor_costs pentiumpro_cost = {
363   COSTS_N_INSNS (1),                    /* cost of an add instruction */
364   COSTS_N_INSNS (1),                    /* cost of a lea instruction */
365   COSTS_N_INSNS (1),                    /* variable shift costs */
366   COSTS_N_INSNS (1),                    /* constant shift costs */
367   {COSTS_N_INSNS (4),                   /* cost of starting multiply for QI */
368    COSTS_N_INSNS (4),                   /*                               HI */
369    COSTS_N_INSNS (4),                   /*                               SI */
370    COSTS_N_INSNS (4),                   /*                               DI */
371    COSTS_N_INSNS (4)},                  /*                               other */
372   0,                                    /* cost of multiply per each bit set */
373   {COSTS_N_INSNS (17),                  /* cost of a divide/mod for QI */
374    COSTS_N_INSNS (17),                  /*                          HI */
375    COSTS_N_INSNS (17),                  /*                          SI */
376    COSTS_N_INSNS (17),                  /*                          DI */
377    COSTS_N_INSNS (17)},                 /*                          other */
378   COSTS_N_INSNS (1),                    /* cost of movsx */
379   COSTS_N_INSNS (1),                    /* cost of movzx */
380   8,                                    /* "large" insn */
381   6,                                    /* MOVE_RATIO */
382   2,                                    /* cost for loading QImode using movzbl */
383   {4, 4, 4},                            /* cost of loading integer registers
384                                            in QImode, HImode and SImode.
385                                            Relative to reg-reg move (2).  */
386   {2, 2, 2},                            /* cost of storing integer registers */
387   2,                                    /* cost of reg,reg fld/fst */
388   {2, 2, 6},                            /* cost of loading fp registers
389                                            in SFmode, DFmode and XFmode */
390   {4, 4, 6},                            /* cost of storing fp registers
391                                            in SFmode, DFmode and XFmode */
392   2,                                    /* cost of moving MMX register */
393   {2, 2},                               /* cost of loading MMX registers
394                                            in SImode and DImode */
395   {2, 2},                               /* cost of storing MMX registers
396                                            in SImode and DImode */
397   2,                                    /* cost of moving SSE register */
398   {2, 2, 8},                            /* cost of loading SSE registers
399                                            in SImode, DImode and TImode */
400   {2, 2, 8},                            /* cost of storing SSE registers
401                                            in SImode, DImode and TImode */
402   3,                                    /* MMX or SSE register to integer */
403   8,                                    /* size of l1 cache.  */
404   256,                                  /* size of l2 cache  */
405   32,                                   /* size of prefetch block */
406   6,                                    /* number of parallel prefetches */
407   2,                                    /* Branch cost */
408   COSTS_N_INSNS (3),                    /* cost of FADD and FSUB insns.  */
409   COSTS_N_INSNS (5),                    /* cost of FMUL instruction.  */
410   COSTS_N_INSNS (56),                   /* cost of FDIV instruction.  */
411   COSTS_N_INSNS (2),                    /* cost of FABS instruction.  */
412   COSTS_N_INSNS (2),                    /* cost of FCHS instruction.  */
413   COSTS_N_INSNS (56),                   /* cost of FSQRT instruction.  */
414   /* PentiumPro has optimized rep instructions for blocks aligned by 8 bytes (we ensure
415      the alignment).  For small blocks inline loop is still a noticeable win, for bigger
416      blocks either rep movsl or rep movsb is way to go.  Rep movsb has apparently
417      more expensive startup time in CPU, but after 4K the difference is down in the noise.
418    */
419   {{rep_prefix_4_byte, {{128, loop}, {1024, unrolled_loop},
420                         {8192, rep_prefix_4_byte}, {-1, rep_prefix_1_byte}}},
421    DUMMY_STRINGOP_ALGS},
422   {{rep_prefix_4_byte, {{1024, unrolled_loop},
423                         {8192, rep_prefix_4_byte}, {-1, libcall}}},
424    DUMMY_STRINGOP_ALGS},
425   1,                                    /* scalar_stmt_cost.  */
426   1,                                    /* scalar load_cost.  */
427   1,                                    /* scalar_store_cost.  */
428   1,                                    /* vec_stmt_cost.  */
429   1,                                    /* vec_to_scalar_cost.  */
430   1,                                    /* scalar_to_vec_cost.  */
431   1,                                    /* vec_align_load_cost.  */
432   2,                                    /* vec_unalign_load_cost.  */
433   1,                                    /* vec_store_cost.  */
434   3,                                    /* cond_taken_branch_cost.  */
435   1,                                    /* cond_not_taken_branch_cost.  */
436 };
437
438 static const
439 struct processor_costs geode_cost = {
440   COSTS_N_INSNS (1),                    /* cost of an add instruction */
441   COSTS_N_INSNS (1),                    /* cost of a lea instruction */
442   COSTS_N_INSNS (2),                    /* variable shift costs */
443   COSTS_N_INSNS (1),                    /* constant shift costs */
444   {COSTS_N_INSNS (3),                   /* cost of starting multiply for QI */
445    COSTS_N_INSNS (4),                   /*                               HI */
446    COSTS_N_INSNS (7),                   /*                               SI */
447    COSTS_N_INSNS (7),                   /*                               DI */
448    COSTS_N_INSNS (7)},                  /*                               other */
449   0,                                    /* cost of multiply per each bit set */
450   {COSTS_N_INSNS (15),                  /* cost of a divide/mod for QI */
451    COSTS_N_INSNS (23),                  /*                          HI */
452    COSTS_N_INSNS (39),                  /*                          SI */
453    COSTS_N_INSNS (39),                  /*                          DI */
454    COSTS_N_INSNS (39)},                 /*                          other */
455   COSTS_N_INSNS (1),                    /* cost of movsx */
456   COSTS_N_INSNS (1),                    /* cost of movzx */
457   8,                                    /* "large" insn */
458   4,                                    /* MOVE_RATIO */
459   1,                                    /* cost for loading QImode using movzbl */
460   {1, 1, 1},                            /* cost of loading integer registers
461                                            in QImode, HImode and SImode.
462                                            Relative to reg-reg move (2).  */
463   {1, 1, 1},                            /* cost of storing integer registers */
464   1,                                    /* cost of reg,reg fld/fst */
465   {1, 1, 1},                            /* cost of loading fp registers
466                                            in SFmode, DFmode and XFmode */
467   {4, 6, 6},                            /* cost of storing fp registers
468                                            in SFmode, DFmode and XFmode */
469
470   1,                                    /* cost of moving MMX register */
471   {1, 1},                               /* cost of loading MMX registers
472                                            in SImode and DImode */
473   {1, 1},                               /* cost of storing MMX registers
474                                            in SImode and DImode */
475   1,                                    /* cost of moving SSE register */
476   {1, 1, 1},                            /* cost of loading SSE registers
477                                            in SImode, DImode and TImode */
478   {1, 1, 1},                            /* cost of storing SSE registers
479                                            in SImode, DImode and TImode */
480   1,                                    /* MMX or SSE register to integer */
481   64,                                   /* size of l1 cache.  */
482   128,                                  /* size of l2 cache.  */
483   32,                                   /* size of prefetch block */
484   1,                                    /* number of parallel prefetches */
485   1,                                    /* Branch cost */
486   COSTS_N_INSNS (6),                    /* cost of FADD and FSUB insns.  */
487   COSTS_N_INSNS (11),                   /* cost of FMUL instruction.  */
488   COSTS_N_INSNS (47),                   /* cost of FDIV instruction.  */
489   COSTS_N_INSNS (1),                    /* cost of FABS instruction.  */
490   COSTS_N_INSNS (1),                    /* cost of FCHS instruction.  */
491   COSTS_N_INSNS (54),                   /* cost of FSQRT instruction.  */
492   {{libcall, {{256, rep_prefix_4_byte}, {-1, libcall}}},
493    DUMMY_STRINGOP_ALGS},
494   {{libcall, {{256, rep_prefix_4_byte}, {-1, libcall}}},
495    DUMMY_STRINGOP_ALGS},
496   1,                                    /* scalar_stmt_cost.  */
497   1,                                    /* scalar load_cost.  */
498   1,                                    /* scalar_store_cost.  */
499   1,                                    /* vec_stmt_cost.  */
500   1,                                    /* vec_to_scalar_cost.  */
501   1,                                    /* scalar_to_vec_cost.  */
502   1,                                    /* vec_align_load_cost.  */
503   2,                                    /* vec_unalign_load_cost.  */
504   1,                                    /* vec_store_cost.  */
505   3,                                    /* cond_taken_branch_cost.  */
506   1,                                    /* cond_not_taken_branch_cost.  */
507 };
508
509 static const
510 struct processor_costs k6_cost = {
511   COSTS_N_INSNS (1),                    /* cost of an add instruction */
512   COSTS_N_INSNS (2),                    /* cost of a lea instruction */
513   COSTS_N_INSNS (1),                    /* variable shift costs */
514   COSTS_N_INSNS (1),                    /* constant shift costs */
515   {COSTS_N_INSNS (3),                   /* cost of starting multiply for QI */
516    COSTS_N_INSNS (3),                   /*                               HI */
517    COSTS_N_INSNS (3),                   /*                               SI */
518    COSTS_N_INSNS (3),                   /*                               DI */
519    COSTS_N_INSNS (3)},                  /*                               other */
520   0,                                    /* cost of multiply per each bit set */
521   {COSTS_N_INSNS (18),                  /* cost of a divide/mod for QI */
522    COSTS_N_INSNS (18),                  /*                          HI */
523    COSTS_N_INSNS (18),                  /*                          SI */
524    COSTS_N_INSNS (18),                  /*                          DI */
525    COSTS_N_INSNS (18)},                 /*                          other */
526   COSTS_N_INSNS (2),                    /* cost of movsx */
527   COSTS_N_INSNS (2),                    /* cost of movzx */
528   8,                                    /* "large" insn */
529   4,                                    /* MOVE_RATIO */
530   3,                                    /* cost for loading QImode using movzbl */
531   {4, 5, 4},                            /* cost of loading integer registers
532                                            in QImode, HImode and SImode.
533                                            Relative to reg-reg move (2).  */
534   {2, 3, 2},                            /* cost of storing integer registers */
535   4,                                    /* cost of reg,reg fld/fst */
536   {6, 6, 6},                            /* cost of loading fp registers
537                                            in SFmode, DFmode and XFmode */
538   {4, 4, 4},                            /* cost of storing fp registers
539                                            in SFmode, DFmode and XFmode */
540   2,                                    /* cost of moving MMX register */
541   {2, 2},                               /* cost of loading MMX registers
542                                            in SImode and DImode */
543   {2, 2},                               /* cost of storing MMX registers
544                                            in SImode and DImode */
545   2,                                    /* cost of moving SSE register */
546   {2, 2, 8},                            /* cost of loading SSE registers
547                                            in SImode, DImode and TImode */
548   {2, 2, 8},                            /* cost of storing SSE registers
549                                            in SImode, DImode and TImode */
550   6,                                    /* MMX or SSE register to integer */
551   32,                                   /* size of l1 cache.  */
552   32,                                   /* size of l2 cache.  Some models
553                                            have integrated l2 cache, but
554                                            optimizing for k6 is not important
555                                            enough to worry about that.  */
556   32,                                   /* size of prefetch block */
557   1,                                    /* number of parallel prefetches */
558   1,                                    /* Branch cost */
559   COSTS_N_INSNS (2),                    /* cost of FADD and FSUB insns.  */
560   COSTS_N_INSNS (2),                    /* cost of FMUL instruction.  */
561   COSTS_N_INSNS (56),                   /* cost of FDIV instruction.  */
562   COSTS_N_INSNS (2),                    /* cost of FABS instruction.  */
563   COSTS_N_INSNS (2),                    /* cost of FCHS instruction.  */
564   COSTS_N_INSNS (56),                   /* cost of FSQRT instruction.  */
565   {{libcall, {{256, rep_prefix_4_byte}, {-1, libcall}}},
566    DUMMY_STRINGOP_ALGS},
567   {{libcall, {{256, rep_prefix_4_byte}, {-1, libcall}}},
568    DUMMY_STRINGOP_ALGS},
569   1,                                    /* scalar_stmt_cost.  */
570   1,                                    /* scalar load_cost.  */
571   1,                                    /* scalar_store_cost.  */
572   1,                                    /* vec_stmt_cost.  */
573   1,                                    /* vec_to_scalar_cost.  */
574   1,                                    /* scalar_to_vec_cost.  */
575   1,                                    /* vec_align_load_cost.  */
576   2,                                    /* vec_unalign_load_cost.  */
577   1,                                    /* vec_store_cost.  */
578   3,                                    /* cond_taken_branch_cost.  */
579   1,                                    /* cond_not_taken_branch_cost.  */
580 };
581
582 static const
583 struct processor_costs athlon_cost = {
584   COSTS_N_INSNS (1),                    /* cost of an add instruction */
585   COSTS_N_INSNS (2),                    /* cost of a lea instruction */
586   COSTS_N_INSNS (1),                    /* variable shift costs */
587   COSTS_N_INSNS (1),                    /* constant shift costs */
588   {COSTS_N_INSNS (5),                   /* cost of starting multiply for QI */
589    COSTS_N_INSNS (5),                   /*                               HI */
590    COSTS_N_INSNS (5),                   /*                               SI */
591    COSTS_N_INSNS (5),                   /*                               DI */
592    COSTS_N_INSNS (5)},                  /*                               other */
593   0,                                    /* cost of multiply per each bit set */
594   {COSTS_N_INSNS (18),                  /* cost of a divide/mod for QI */
595    COSTS_N_INSNS (26),                  /*                          HI */
596    COSTS_N_INSNS (42),                  /*                          SI */
597    COSTS_N_INSNS (74),                  /*                          DI */
598    COSTS_N_INSNS (74)},                 /*                          other */
599   COSTS_N_INSNS (1),                    /* cost of movsx */
600   COSTS_N_INSNS (1),                    /* cost of movzx */
601   8,                                    /* "large" insn */
602   9,                                    /* MOVE_RATIO */
603   4,                                    /* cost for loading QImode using movzbl */
604   {3, 4, 3},                            /* cost of loading integer registers
605                                            in QImode, HImode and SImode.
606                                            Relative to reg-reg move (2).  */
607   {3, 4, 3},                            /* cost of storing integer registers */
608   4,                                    /* cost of reg,reg fld/fst */
609   {4, 4, 12},                           /* cost of loading fp registers
610                                            in SFmode, DFmode and XFmode */
611   {6, 6, 8},                            /* cost of storing fp registers
612                                            in SFmode, DFmode and XFmode */
613   2,                                    /* cost of moving MMX register */
614   {4, 4},                               /* cost of loading MMX registers
615                                            in SImode and DImode */
616   {4, 4},                               /* cost of storing MMX registers
617                                            in SImode and DImode */
618   2,                                    /* cost of moving SSE register */
619   {4, 4, 6},                            /* cost of loading SSE registers
620                                            in SImode, DImode and TImode */
621   {4, 4, 5},                            /* cost of storing SSE registers
622                                            in SImode, DImode and TImode */
623   5,                                    /* MMX or SSE register to integer */
624   64,                                   /* size of l1 cache.  */
625   256,                                  /* size of l2 cache.  */
626   64,                                   /* size of prefetch block */
627   6,                                    /* number of parallel prefetches */
628   5,                                    /* Branch cost */
629   COSTS_N_INSNS (4),                    /* cost of FADD and FSUB insns.  */
630   COSTS_N_INSNS (4),                    /* cost of FMUL instruction.  */
631   COSTS_N_INSNS (24),                   /* cost of FDIV instruction.  */
632   COSTS_N_INSNS (2),                    /* cost of FABS instruction.  */
633   COSTS_N_INSNS (2),                    /* cost of FCHS instruction.  */
634   COSTS_N_INSNS (35),                   /* cost of FSQRT instruction.  */
635   /* For some reason, Athlon deals better with REP prefix (relative to loops)
636      compared to K8. Alignment becomes important after 8 bytes for memcpy and
637      128 bytes for memset.  */
638   {{libcall, {{2048, rep_prefix_4_byte}, {-1, libcall}}},
639    DUMMY_STRINGOP_ALGS},
640   {{libcall, {{2048, rep_prefix_4_byte}, {-1, libcall}}},
641    DUMMY_STRINGOP_ALGS},
642   1,                                    /* scalar_stmt_cost.  */
643   1,                                    /* scalar load_cost.  */
644   1,                                    /* scalar_store_cost.  */
645   1,                                    /* vec_stmt_cost.  */
646   1,                                    /* vec_to_scalar_cost.  */
647   1,                                    /* scalar_to_vec_cost.  */
648   1,                                    /* vec_align_load_cost.  */
649   2,                                    /* vec_unalign_load_cost.  */
650   1,                                    /* vec_store_cost.  */
651   3,                                    /* cond_taken_branch_cost.  */
652   1,                                    /* cond_not_taken_branch_cost.  */
653 };
654
655 static const
656 struct processor_costs k8_cost = {
657   COSTS_N_INSNS (1),                    /* cost of an add instruction */
658   COSTS_N_INSNS (2),                    /* cost of a lea instruction */
659   COSTS_N_INSNS (1),                    /* variable shift costs */
660   COSTS_N_INSNS (1),                    /* constant shift costs */
661   {COSTS_N_INSNS (3),                   /* cost of starting multiply for QI */
662    COSTS_N_INSNS (4),                   /*                               HI */
663    COSTS_N_INSNS (3),                   /*                               SI */
664    COSTS_N_INSNS (4),                   /*                               DI */
665    COSTS_N_INSNS (5)},                  /*                               other */
666   0,                                    /* cost of multiply per each bit set */
667   {COSTS_N_INSNS (18),                  /* cost of a divide/mod for QI */
668    COSTS_N_INSNS (26),                  /*                          HI */
669    COSTS_N_INSNS (42),                  /*                          SI */
670    COSTS_N_INSNS (74),                  /*                          DI */
671    COSTS_N_INSNS (74)},                 /*                          other */
672   COSTS_N_INSNS (1),                    /* cost of movsx */
673   COSTS_N_INSNS (1),                    /* cost of movzx */
674   8,                                    /* "large" insn */
675   9,                                    /* MOVE_RATIO */
676   4,                                    /* cost for loading QImode using movzbl */
677   {3, 4, 3},                            /* cost of loading integer registers
678                                            in QImode, HImode and SImode.
679                                            Relative to reg-reg move (2).  */
680   {3, 4, 3},                            /* cost of storing integer registers */
681   4,                                    /* cost of reg,reg fld/fst */
682   {4, 4, 12},                           /* cost of loading fp registers
683                                            in SFmode, DFmode and XFmode */
684   {6, 6, 8},                            /* cost of storing fp registers
685                                            in SFmode, DFmode and XFmode */
686   2,                                    /* cost of moving MMX register */
687   {3, 3},                               /* cost of loading MMX registers
688                                            in SImode and DImode */
689   {4, 4},                               /* cost of storing MMX registers
690                                            in SImode and DImode */
691   2,                                    /* cost of moving SSE register */
692   {4, 3, 6},                            /* cost of loading SSE registers
693                                            in SImode, DImode and TImode */
694   {4, 4, 5},                            /* cost of storing SSE registers
695                                            in SImode, DImode and TImode */
696   5,                                    /* MMX or SSE register to integer */
697   64,                                   /* size of l1 cache.  */
698   512,                                  /* size of l2 cache.  */
699   64,                                   /* size of prefetch block */
700   /* New AMD processors never drop prefetches; if they cannot be performed
701      immediately, they are queued.  We set number of simultaneous prefetches
702      to a large constant to reflect this (it probably is not a good idea not
703      to limit number of prefetches at all, as their execution also takes some
704      time).  */
705   100,                                  /* number of parallel prefetches */
706   3,                                    /* Branch cost */
707   COSTS_N_INSNS (4),                    /* cost of FADD and FSUB insns.  */
708   COSTS_N_INSNS (4),                    /* cost of FMUL instruction.  */
709   COSTS_N_INSNS (19),                   /* cost of FDIV instruction.  */
710   COSTS_N_INSNS (2),                    /* cost of FABS instruction.  */
711   COSTS_N_INSNS (2),                    /* cost of FCHS instruction.  */
712   COSTS_N_INSNS (35),                   /* cost of FSQRT instruction.  */
713   /* K8 has optimized REP instruction for medium sized blocks, but for very small
714      blocks it is better to use loop. For large blocks, libcall can do
715      nontemporary accesses and beat inline considerably.  */
716   {{libcall, {{6, loop}, {14, unrolled_loop}, {-1, rep_prefix_4_byte}}},
717    {libcall, {{16, loop}, {8192, rep_prefix_8_byte}, {-1, libcall}}}},
718   {{libcall, {{8, loop}, {24, unrolled_loop},
719               {2048, rep_prefix_4_byte}, {-1, libcall}}},
720    {libcall, {{48, unrolled_loop}, {8192, rep_prefix_8_byte}, {-1, libcall}}}},
721   4,                                    /* scalar_stmt_cost.  */
722   2,                                    /* scalar load_cost.  */
723   2,                                    /* scalar_store_cost.  */
724   5,                                    /* vec_stmt_cost.  */
725   0,                                    /* vec_to_scalar_cost.  */
726   2,                                    /* scalar_to_vec_cost.  */
727   2,                                    /* vec_align_load_cost.  */
728   3,                                    /* vec_unalign_load_cost.  */
729   3,                                    /* vec_store_cost.  */
730   3,                                    /* cond_taken_branch_cost.  */
731   2,                                    /* cond_not_taken_branch_cost.  */
732 };
733
734 struct processor_costs amdfam10_cost = {
735   COSTS_N_INSNS (1),                    /* cost of an add instruction */
736   COSTS_N_INSNS (2),                    /* cost of a lea instruction */
737   COSTS_N_INSNS (1),                    /* variable shift costs */
738   COSTS_N_INSNS (1),                    /* constant shift costs */
739   {COSTS_N_INSNS (3),                   /* cost of starting multiply for QI */
740    COSTS_N_INSNS (4),                   /*                               HI */
741    COSTS_N_INSNS (3),                   /*                               SI */
742    COSTS_N_INSNS (4),                   /*                               DI */
743    COSTS_N_INSNS (5)},                  /*                               other */
744   0,                                    /* cost of multiply per each bit set */
745   {COSTS_N_INSNS (19),                  /* cost of a divide/mod for QI */
746    COSTS_N_INSNS (35),                  /*                          HI */
747    COSTS_N_INSNS (51),                  /*                          SI */
748    COSTS_N_INSNS (83),                  /*                          DI */
749    COSTS_N_INSNS (83)},                 /*                          other */
750   COSTS_N_INSNS (1),                    /* cost of movsx */
751   COSTS_N_INSNS (1),                    /* cost of movzx */
752   8,                                    /* "large" insn */
753   9,                                    /* MOVE_RATIO */
754   4,                                    /* cost for loading QImode using movzbl */
755   {3, 4, 3},                            /* cost of loading integer registers
756                                            in QImode, HImode and SImode.
757                                            Relative to reg-reg move (2).  */
758   {3, 4, 3},                            /* cost of storing integer registers */
759   4,                                    /* cost of reg,reg fld/fst */
760   {4, 4, 12},                           /* cost of loading fp registers
761                                            in SFmode, DFmode and XFmode */
762   {6, 6, 8},                            /* cost of storing fp registers
763                                            in SFmode, DFmode and XFmode */
764   2,                                    /* cost of moving MMX register */
765   {3, 3},                               /* cost of loading MMX registers
766                                            in SImode and DImode */
767   {4, 4},                               /* cost of storing MMX registers
768                                            in SImode and DImode */
769   2,                                    /* cost of moving SSE register */
770   {4, 4, 3},                            /* cost of loading SSE registers
771                                            in SImode, DImode and TImode */
772   {4, 4, 5},                            /* cost of storing SSE registers
773                                            in SImode, DImode and TImode */
774   3,                                    /* MMX or SSE register to integer */
775                                         /* On K8
776                                             MOVD reg64, xmmreg  Double  FSTORE 4
777                                             MOVD reg32, xmmreg  Double  FSTORE 4
778                                            On AMDFAM10
779                                             MOVD reg64, xmmreg  Double  FADD 3
780                                                                 1/1  1/1
781                                             MOVD reg32, xmmreg  Double  FADD 3
782                                                                 1/1  1/1 */
783   64,                                   /* size of l1 cache.  */
784   512,                                  /* size of l2 cache.  */
785   64,                                   /* size of prefetch block */
786   /* New AMD processors never drop prefetches; if they cannot be performed
787      immediately, they are queued.  We set number of simultaneous prefetches
788      to a large constant to reflect this (it probably is not a good idea not
789      to limit number of prefetches at all, as their execution also takes some
790      time).  */
791   100,                                  /* number of parallel prefetches */
792   2,                                    /* Branch cost */
793   COSTS_N_INSNS (4),                    /* cost of FADD and FSUB insns.  */
794   COSTS_N_INSNS (4),                    /* cost of FMUL instruction.  */
795   COSTS_N_INSNS (19),                   /* cost of FDIV instruction.  */
796   COSTS_N_INSNS (2),                    /* cost of FABS instruction.  */
797   COSTS_N_INSNS (2),                    /* cost of FCHS instruction.  */
798   COSTS_N_INSNS (35),                   /* cost of FSQRT instruction.  */
799
800   /* AMDFAM10 has optimized REP instruction for medium sized blocks, but for
801      very small blocks it is better to use loop. For large blocks, libcall can
802      do nontemporary accesses and beat inline considerably.  */
803   {{libcall, {{6, loop}, {14, unrolled_loop}, {-1, rep_prefix_4_byte}}},
804    {libcall, {{16, loop}, {8192, rep_prefix_8_byte}, {-1, libcall}}}},
805   {{libcall, {{8, loop}, {24, unrolled_loop},
806               {2048, rep_prefix_4_byte}, {-1, libcall}}},
807    {libcall, {{48, unrolled_loop}, {8192, rep_prefix_8_byte}, {-1, libcall}}}},
808   4,                                    /* scalar_stmt_cost.  */
809   2,                                    /* scalar load_cost.  */
810   2,                                    /* scalar_store_cost.  */
811   6,                                    /* vec_stmt_cost.  */
812   0,                                    /* vec_to_scalar_cost.  */
813   2,                                    /* scalar_to_vec_cost.  */
814   2,                                    /* vec_align_load_cost.  */
815   2,                                    /* vec_unalign_load_cost.  */
816   2,                                    /* vec_store_cost.  */
817   2,                                    /* cond_taken_branch_cost.  */
818   1,                                    /* cond_not_taken_branch_cost.  */
819 };
820
821 static const
822 struct processor_costs pentium4_cost = {
823   COSTS_N_INSNS (1),                    /* cost of an add instruction */
824   COSTS_N_INSNS (3),                    /* cost of a lea instruction */
825   COSTS_N_INSNS (4),                    /* variable shift costs */
826   COSTS_N_INSNS (4),                    /* constant shift costs */
827   {COSTS_N_INSNS (15),                  /* cost of starting multiply for QI */
828    COSTS_N_INSNS (15),                  /*                               HI */
829    COSTS_N_INSNS (15),                  /*                               SI */
830    COSTS_N_INSNS (15),                  /*                               DI */
831    COSTS_N_INSNS (15)},                 /*                               other */
832   0,                                    /* cost of multiply per each bit set */
833   {COSTS_N_INSNS (56),                  /* cost of a divide/mod for QI */
834    COSTS_N_INSNS (56),                  /*                          HI */
835    COSTS_N_INSNS (56),                  /*                          SI */
836    COSTS_N_INSNS (56),                  /*                          DI */
837    COSTS_N_INSNS (56)},                 /*                          other */
838   COSTS_N_INSNS (1),                    /* cost of movsx */
839   COSTS_N_INSNS (1),                    /* cost of movzx */
840   16,                                   /* "large" insn */
841   6,                                    /* MOVE_RATIO */
842   2,                                    /* cost for loading QImode using movzbl */
843   {4, 5, 4},                            /* cost of loading integer registers
844                                            in QImode, HImode and SImode.
845                                            Relative to reg-reg move (2).  */
846   {2, 3, 2},                            /* cost of storing integer registers */
847   2,                                    /* cost of reg,reg fld/fst */
848   {2, 2, 6},                            /* cost of loading fp registers
849                                            in SFmode, DFmode and XFmode */
850   {4, 4, 6},                            /* cost of storing fp registers
851                                            in SFmode, DFmode and XFmode */
852   2,                                    /* cost of moving MMX register */
853   {2, 2},                               /* cost of loading MMX registers
854                                            in SImode and DImode */
855   {2, 2},                               /* cost of storing MMX registers
856                                            in SImode and DImode */
857   12,                                   /* cost of moving SSE register */
858   {12, 12, 12},                         /* cost of loading SSE registers
859                                            in SImode, DImode and TImode */
860   {2, 2, 8},                            /* cost of storing SSE registers
861                                            in SImode, DImode and TImode */
862   10,                                   /* MMX or SSE register to integer */
863   8,                                    /* size of l1 cache.  */
864   256,                                  /* size of l2 cache.  */
865   64,                                   /* size of prefetch block */
866   6,                                    /* number of parallel prefetches */
867   2,                                    /* Branch cost */
868   COSTS_N_INSNS (5),                    /* cost of FADD and FSUB insns.  */
869   COSTS_N_INSNS (7),                    /* cost of FMUL instruction.  */
870   COSTS_N_INSNS (43),                   /* cost of FDIV instruction.  */
871   COSTS_N_INSNS (2),                    /* cost of FABS instruction.  */
872   COSTS_N_INSNS (2),                    /* cost of FCHS instruction.  */
873   COSTS_N_INSNS (43),                   /* cost of FSQRT instruction.  */
874   {{libcall, {{12, loop_1_byte}, {-1, rep_prefix_4_byte}}},
875    DUMMY_STRINGOP_ALGS},
876   {{libcall, {{6, loop_1_byte}, {48, loop}, {20480, rep_prefix_4_byte},
877    {-1, libcall}}},
878    DUMMY_STRINGOP_ALGS},
879   1,                                    /* scalar_stmt_cost.  */
880   1,                                    /* scalar load_cost.  */
881   1,                                    /* scalar_store_cost.  */
882   1,                                    /* vec_stmt_cost.  */
883   1,                                    /* vec_to_scalar_cost.  */
884   1,                                    /* scalar_to_vec_cost.  */
885   1,                                    /* vec_align_load_cost.  */
886   2,                                    /* vec_unalign_load_cost.  */
887   1,                                    /* vec_store_cost.  */
888   3,                                    /* cond_taken_branch_cost.  */
889   1,                                    /* cond_not_taken_branch_cost.  */
890 };
891
892 static const
893 struct processor_costs nocona_cost = {
894   COSTS_N_INSNS (1),                    /* cost of an add instruction */
895   COSTS_N_INSNS (1),                    /* cost of a lea instruction */
896   COSTS_N_INSNS (1),                    /* variable shift costs */
897   COSTS_N_INSNS (1),                    /* constant shift costs */
898   {COSTS_N_INSNS (10),                  /* cost of starting multiply for QI */
899    COSTS_N_INSNS (10),                  /*                               HI */
900    COSTS_N_INSNS (10),                  /*                               SI */
901    COSTS_N_INSNS (10),                  /*                               DI */
902    COSTS_N_INSNS (10)},                 /*                               other */
903   0,                                    /* cost of multiply per each bit set */
904   {COSTS_N_INSNS (66),                  /* cost of a divide/mod for QI */
905    COSTS_N_INSNS (66),                  /*                          HI */
906    COSTS_N_INSNS (66),                  /*                          SI */
907    COSTS_N_INSNS (66),                  /*                          DI */
908    COSTS_N_INSNS (66)},                 /*                          other */
909   COSTS_N_INSNS (1),                    /* cost of movsx */
910   COSTS_N_INSNS (1),                    /* cost of movzx */
911   16,                                   /* "large" insn */
912   17,                                   /* MOVE_RATIO */
913   4,                                    /* cost for loading QImode using movzbl */
914   {4, 4, 4},                            /* cost of loading integer registers
915                                            in QImode, HImode and SImode.
916                                            Relative to reg-reg move (2).  */
917   {4, 4, 4},                            /* cost of storing integer registers */
918   3,                                    /* cost of reg,reg fld/fst */
919   {12, 12, 12},                         /* cost of loading fp registers
920                                            in SFmode, DFmode and XFmode */
921   {4, 4, 4},                            /* cost of storing fp registers
922                                            in SFmode, DFmode and XFmode */
923   6,                                    /* cost of moving MMX register */
924   {12, 12},                             /* cost of loading MMX registers
925                                            in SImode and DImode */
926   {12, 12},                             /* cost of storing MMX registers
927                                            in SImode and DImode */
928   6,                                    /* cost of moving SSE register */
929   {12, 12, 12},                         /* cost of loading SSE registers
930                                            in SImode, DImode and TImode */
931   {12, 12, 12},                         /* cost of storing SSE registers
932                                            in SImode, DImode and TImode */
933   8,                                    /* MMX or SSE register to integer */
934   8,                                    /* size of l1 cache.  */
935   1024,                                 /* size of l2 cache.  */
936   128,                                  /* size of prefetch block */
937   8,                                    /* number of parallel prefetches */
938   1,                                    /* Branch cost */
939   COSTS_N_INSNS (6),                    /* cost of FADD and FSUB insns.  */
940   COSTS_N_INSNS (8),                    /* cost of FMUL instruction.  */
941   COSTS_N_INSNS (40),                   /* cost of FDIV instruction.  */
942   COSTS_N_INSNS (3),                    /* cost of FABS instruction.  */
943   COSTS_N_INSNS (3),                    /* cost of FCHS instruction.  */
944   COSTS_N_INSNS (44),                   /* cost of FSQRT instruction.  */
945   {{libcall, {{12, loop_1_byte}, {-1, rep_prefix_4_byte}}},
946    {libcall, {{32, loop}, {20000, rep_prefix_8_byte},
947               {100000, unrolled_loop}, {-1, libcall}}}},
948   {{libcall, {{6, loop_1_byte}, {48, loop}, {20480, rep_prefix_4_byte},
949    {-1, libcall}}},
950    {libcall, {{24, loop}, {64, unrolled_loop},
951               {8192, rep_prefix_8_byte}, {-1, libcall}}}},
952   1,                                    /* scalar_stmt_cost.  */
953   1,                                    /* scalar load_cost.  */
954   1,                                    /* scalar_store_cost.  */
955   1,                                    /* vec_stmt_cost.  */
956   1,                                    /* vec_to_scalar_cost.  */
957   1,                                    /* scalar_to_vec_cost.  */
958   1,                                    /* vec_align_load_cost.  */
959   2,                                    /* vec_unalign_load_cost.  */
960   1,                                    /* vec_store_cost.  */
961   3,                                    /* cond_taken_branch_cost.  */
962   1,                                    /* cond_not_taken_branch_cost.  */
963 };
964
965 static const
966 struct processor_costs core2_cost = {
967   COSTS_N_INSNS (1),                    /* cost of an add instruction */
968   COSTS_N_INSNS (1) + 1,                /* cost of a lea instruction */
969   COSTS_N_INSNS (1),                    /* variable shift costs */
970   COSTS_N_INSNS (1),                    /* constant shift costs */
971   {COSTS_N_INSNS (3),                   /* cost of starting multiply for QI */
972    COSTS_N_INSNS (3),                   /*                               HI */
973    COSTS_N_INSNS (3),                   /*                               SI */
974    COSTS_N_INSNS (3),                   /*                               DI */
975    COSTS_N_INSNS (3)},                  /*                               other */
976   0,                                    /* cost of multiply per each bit set */
977   {COSTS_N_INSNS (22),                  /* cost of a divide/mod for QI */
978    COSTS_N_INSNS (22),                  /*                          HI */
979    COSTS_N_INSNS (22),                  /*                          SI */
980    COSTS_N_INSNS (22),                  /*                          DI */
981    COSTS_N_INSNS (22)},                 /*                          other */
982   COSTS_N_INSNS (1),                    /* cost of movsx */
983   COSTS_N_INSNS (1),                    /* cost of movzx */
984   8,                                    /* "large" insn */
985   16,                                   /* MOVE_RATIO */
986   2,                                    /* cost for loading QImode using movzbl */
987   {6, 6, 6},                            /* cost of loading integer registers
988                                            in QImode, HImode and SImode.
989                                            Relative to reg-reg move (2).  */
990   {4, 4, 4},                            /* cost of storing integer registers */
991   2,                                    /* cost of reg,reg fld/fst */
992   {6, 6, 6},                            /* cost of loading fp registers
993                                            in SFmode, DFmode and XFmode */
994   {4, 4, 4},                            /* cost of storing fp registers
995                                            in SFmode, DFmode and XFmode */
996   2,                                    /* cost of moving MMX register */
997   {6, 6},                               /* cost of loading MMX registers
998                                            in SImode and DImode */
999   {4, 4},                               /* cost of storing MMX registers
1000                                            in SImode and DImode */
1001   2,                                    /* cost of moving SSE register */
1002   {6, 6, 6},                            /* cost of loading SSE registers
1003                                            in SImode, DImode and TImode */
1004   {4, 4, 4},                            /* cost of storing SSE registers
1005                                            in SImode, DImode and TImode */
1006   2,                                    /* MMX or SSE register to integer */
1007   32,                                   /* size of l1 cache.  */
1008   2048,                                 /* size of l2 cache.  */
1009   128,                                  /* size of prefetch block */
1010   8,                                    /* number of parallel prefetches */
1011   3,                                    /* Branch cost */
1012   COSTS_N_INSNS (3),                    /* cost of FADD and FSUB insns.  */
1013   COSTS_N_INSNS (5),                    /* cost of FMUL instruction.  */
1014   COSTS_N_INSNS (32),                   /* cost of FDIV instruction.  */
1015   COSTS_N_INSNS (1),                    /* cost of FABS instruction.  */
1016   COSTS_N_INSNS (1),                    /* cost of FCHS instruction.  */
1017   COSTS_N_INSNS (58),                   /* cost of FSQRT instruction.  */
1018   {{libcall, {{11, loop}, {-1, rep_prefix_4_byte}}},
1019    {libcall, {{32, loop}, {64, rep_prefix_4_byte},
1020               {8192, rep_prefix_8_byte}, {-1, libcall}}}},
1021   {{libcall, {{8, loop}, {15, unrolled_loop},
1022               {2048, rep_prefix_4_byte}, {-1, libcall}}},
1023    {libcall, {{24, loop}, {32, unrolled_loop},
1024               {8192, rep_prefix_8_byte}, {-1, libcall}}}},
1025   1,                                    /* scalar_stmt_cost.  */
1026   1,                                    /* scalar load_cost.  */
1027   1,                                    /* scalar_store_cost.  */
1028   1,                                    /* vec_stmt_cost.  */
1029   1,                                    /* vec_to_scalar_cost.  */
1030   1,                                    /* scalar_to_vec_cost.  */
1031   1,                                    /* vec_align_load_cost.  */
1032   2,                                    /* vec_unalign_load_cost.  */
1033   1,                                    /* vec_store_cost.  */
1034   3,                                    /* cond_taken_branch_cost.  */
1035   1,                                    /* cond_not_taken_branch_cost.  */
1036 };
1037
1038 static const
1039 struct processor_costs atom_cost = {
1040   COSTS_N_INSNS (1),                    /* cost of an add instruction */
1041   COSTS_N_INSNS (1) + 1,                /* cost of a lea instruction */
1042   COSTS_N_INSNS (1),                    /* variable shift costs */
1043   COSTS_N_INSNS (1),                    /* constant shift costs */
1044   {COSTS_N_INSNS (3),                   /* cost of starting multiply for QI */
1045    COSTS_N_INSNS (4),                   /*                               HI */
1046    COSTS_N_INSNS (3),                   /*                               SI */
1047    COSTS_N_INSNS (4),                   /*                               DI */
1048    COSTS_N_INSNS (2)},                  /*                               other */
1049   0,                                    /* cost of multiply per each bit set */
1050   {COSTS_N_INSNS (18),                  /* cost of a divide/mod for QI */
1051    COSTS_N_INSNS (26),                  /*                          HI */
1052    COSTS_N_INSNS (42),                  /*                          SI */
1053    COSTS_N_INSNS (74),                  /*                          DI */
1054    COSTS_N_INSNS (74)},                 /*                          other */
1055   COSTS_N_INSNS (1),                    /* cost of movsx */
1056   COSTS_N_INSNS (1),                    /* cost of movzx */
1057   8,                                    /* "large" insn */
1058   17,                                   /* MOVE_RATIO */
1059   2,                                    /* cost for loading QImode using movzbl */
1060   {4, 4, 4},                            /* cost of loading integer registers
1061                                            in QImode, HImode and SImode.
1062                                            Relative to reg-reg move (2).  */
1063   {4, 4, 4},                            /* cost of storing integer registers */
1064   4,                                    /* cost of reg,reg fld/fst */
1065   {12, 12, 12},                         /* cost of loading fp registers
1066                                            in SFmode, DFmode and XFmode */
1067   {6, 6, 8},                            /* cost of storing fp registers
1068                                            in SFmode, DFmode and XFmode */
1069   2,                                    /* cost of moving MMX register */
1070   {8, 8},                               /* cost of loading MMX registers
1071                                            in SImode and DImode */
1072   {8, 8},                               /* cost of storing MMX registers
1073                                            in SImode and DImode */
1074   2,                                    /* cost of moving SSE register */
1075   {8, 8, 8},                            /* cost of loading SSE registers
1076                                            in SImode, DImode and TImode */
1077   {8, 8, 8},                            /* cost of storing SSE registers
1078                                            in SImode, DImode and TImode */
1079   5,                                    /* MMX or SSE register to integer */
1080   32,                                   /* size of l1 cache.  */
1081   256,                                  /* size of l2 cache.  */
1082   64,                                   /* size of prefetch block */
1083   6,                                    /* number of parallel prefetches */
1084   3,                                    /* Branch cost */
1085   COSTS_N_INSNS (8),                    /* cost of FADD and FSUB insns.  */
1086   COSTS_N_INSNS (8),                    /* cost of FMUL instruction.  */
1087   COSTS_N_INSNS (20),                   /* cost of FDIV instruction.  */
1088   COSTS_N_INSNS (8),                    /* cost of FABS instruction.  */
1089   COSTS_N_INSNS (8),                    /* cost of FCHS instruction.  */
1090   COSTS_N_INSNS (40),                   /* cost of FSQRT instruction.  */
1091   {{libcall, {{11, loop}, {-1, rep_prefix_4_byte}}},
1092    {libcall, {{32, loop}, {64, rep_prefix_4_byte},
1093           {8192, rep_prefix_8_byte}, {-1, libcall}}}},
1094   {{libcall, {{8, loop}, {15, unrolled_loop},
1095           {2048, rep_prefix_4_byte}, {-1, libcall}}},
1096    {libcall, {{24, loop}, {32, unrolled_loop},
1097           {8192, rep_prefix_8_byte}, {-1, libcall}}}},
1098   1,                                    /* scalar_stmt_cost.  */
1099   1,                                    /* scalar load_cost.  */
1100   1,                                    /* scalar_store_cost.  */
1101   1,                                    /* vec_stmt_cost.  */
1102   1,                                    /* vec_to_scalar_cost.  */
1103   1,                                    /* scalar_to_vec_cost.  */
1104   1,                                    /* vec_align_load_cost.  */
1105   2,                                    /* vec_unalign_load_cost.  */
1106   1,                                    /* vec_store_cost.  */
1107   3,                                    /* cond_taken_branch_cost.  */
1108   1,                                    /* cond_not_taken_branch_cost.  */
1109 };
1110
1111 /* Generic64 should produce code tuned for Nocona and K8.  */
1112 static const
1113 struct processor_costs generic64_cost = {
1114   COSTS_N_INSNS (1),                    /* cost of an add instruction */
1115   /* On all chips taken into consideration lea is 2 cycles and more.  With
1116      this cost however our current implementation of synth_mult results in
1117      use of unnecessary temporary registers causing regression on several
1118      SPECfp benchmarks.  */
1119   COSTS_N_INSNS (1) + 1,                /* cost of a lea instruction */
1120   COSTS_N_INSNS (1),                    /* variable shift costs */
1121   COSTS_N_INSNS (1),                    /* constant shift costs */
1122   {COSTS_N_INSNS (3),                   /* cost of starting multiply for QI */
1123    COSTS_N_INSNS (4),                   /*                               HI */
1124    COSTS_N_INSNS (3),                   /*                               SI */
1125    COSTS_N_INSNS (4),                   /*                               DI */
1126    COSTS_N_INSNS (2)},                  /*                               other */
1127   0,                                    /* cost of multiply per each bit set */
1128   {COSTS_N_INSNS (18),                  /* cost of a divide/mod for QI */
1129    COSTS_N_INSNS (26),                  /*                          HI */
1130    COSTS_N_INSNS (42),                  /*                          SI */
1131    COSTS_N_INSNS (74),                  /*                          DI */
1132    COSTS_N_INSNS (74)},                 /*                          other */
1133   COSTS_N_INSNS (1),                    /* cost of movsx */
1134   COSTS_N_INSNS (1),                    /* cost of movzx */
1135   8,                                    /* "large" insn */
1136   17,                                   /* MOVE_RATIO */
1137   4,                                    /* cost for loading QImode using movzbl */
1138   {4, 4, 4},                            /* cost of loading integer registers
1139                                            in QImode, HImode and SImode.
1140                                            Relative to reg-reg move (2).  */
1141   {4, 4, 4},                            /* cost of storing integer registers */
1142   4,                                    /* cost of reg,reg fld/fst */
1143   {12, 12, 12},                         /* cost of loading fp registers
1144                                            in SFmode, DFmode and XFmode */
1145   {6, 6, 8},                            /* cost of storing fp registers
1146                                            in SFmode, DFmode and XFmode */
1147   2,                                    /* cost of moving MMX register */
1148   {8, 8},                               /* cost of loading MMX registers
1149                                            in SImode and DImode */
1150   {8, 8},                               /* cost of storing MMX registers
1151                                            in SImode and DImode */
1152   2,                                    /* cost of moving SSE register */
1153   {8, 8, 8},                            /* cost of loading SSE registers
1154                                            in SImode, DImode and TImode */
1155   {8, 8, 8},                            /* cost of storing SSE registers
1156                                            in SImode, DImode and TImode */
1157   5,                                    /* MMX or SSE register to integer */
1158   32,                                   /* size of l1 cache.  */
1159   512,                                  /* size of l2 cache.  */
1160   64,                                   /* size of prefetch block */
1161   6,                                    /* number of parallel prefetches */
1162   /* Benchmarks shows large regressions on K8 sixtrack benchmark when this value
1163      is increased to perhaps more appropriate value of 5.  */
1164   3,                                    /* Branch cost */
1165   COSTS_N_INSNS (8),                    /* cost of FADD and FSUB insns.  */
1166   COSTS_N_INSNS (8),                    /* cost of FMUL instruction.  */
1167   COSTS_N_INSNS (20),                   /* cost of FDIV instruction.  */
1168   COSTS_N_INSNS (8),                    /* cost of FABS instruction.  */
1169   COSTS_N_INSNS (8),                    /* cost of FCHS instruction.  */
1170   COSTS_N_INSNS (40),                   /* cost of FSQRT instruction.  */
1171   {DUMMY_STRINGOP_ALGS,
1172    {libcall, {{32, loop}, {8192, rep_prefix_8_byte}, {-1, libcall}}}},
1173   {DUMMY_STRINGOP_ALGS,
1174    {libcall, {{32, loop}, {8192, rep_prefix_8_byte}, {-1, libcall}}}},
1175   1,                                    /* scalar_stmt_cost.  */
1176   1,                                    /* scalar load_cost.  */
1177   1,                                    /* scalar_store_cost.  */
1178   1,                                    /* vec_stmt_cost.  */
1179   1,                                    /* vec_to_scalar_cost.  */
1180   1,                                    /* scalar_to_vec_cost.  */
1181   1,                                    /* vec_align_load_cost.  */
1182   2,                                    /* vec_unalign_load_cost.  */
1183   1,                                    /* vec_store_cost.  */
1184   3,                                    /* cond_taken_branch_cost.  */
1185   1,                                    /* cond_not_taken_branch_cost.  */
1186 };
1187
1188 /* Generic32 should produce code tuned for Athlon, PPro, Pentium4, Nocona and K8.  */
1189 static const
1190 struct processor_costs generic32_cost = {
1191   COSTS_N_INSNS (1),                    /* cost of an add instruction */
1192   COSTS_N_INSNS (1) + 1,                /* cost of a lea instruction */
1193   COSTS_N_INSNS (1),                    /* variable shift costs */
1194   COSTS_N_INSNS (1),                    /* constant shift costs */
1195   {COSTS_N_INSNS (3),                   /* cost of starting multiply for QI */
1196    COSTS_N_INSNS (4),                   /*                               HI */
1197    COSTS_N_INSNS (3),                   /*                               SI */
1198    COSTS_N_INSNS (4),                   /*                               DI */
1199    COSTS_N_INSNS (2)},                  /*                               other */
1200   0,                                    /* cost of multiply per each bit set */
1201   {COSTS_N_INSNS (18),                  /* cost of a divide/mod for QI */
1202    COSTS_N_INSNS (26),                  /*                          HI */
1203    COSTS_N_INSNS (42),                  /*                          SI */
1204    COSTS_N_INSNS (74),                  /*                          DI */
1205    COSTS_N_INSNS (74)},                 /*                          other */
1206   COSTS_N_INSNS (1),                    /* cost of movsx */
1207   COSTS_N_INSNS (1),                    /* cost of movzx */
1208   8,                                    /* "large" insn */
1209   17,                                   /* MOVE_RATIO */
1210   4,                                    /* cost for loading QImode using movzbl */
1211   {4, 4, 4},                            /* cost of loading integer registers
1212                                            in QImode, HImode and SImode.
1213                                            Relative to reg-reg move (2).  */
1214   {4, 4, 4},                            /* cost of storing integer registers */
1215   4,                                    /* cost of reg,reg fld/fst */
1216   {12, 12, 12},                         /* cost of loading fp registers
1217                                            in SFmode, DFmode and XFmode */
1218   {6, 6, 8},                            /* cost of storing fp registers
1219                                            in SFmode, DFmode and XFmode */
1220   2,                                    /* cost of moving MMX register */
1221   {8, 8},                               /* cost of loading MMX registers
1222                                            in SImode and DImode */
1223   {8, 8},                               /* cost of storing MMX registers
1224                                            in SImode and DImode */
1225   2,                                    /* cost of moving SSE register */
1226   {8, 8, 8},                            /* cost of loading SSE registers
1227                                            in SImode, DImode and TImode */
1228   {8, 8, 8},                            /* cost of storing SSE registers
1229                                            in SImode, DImode and TImode */
1230   5,                                    /* MMX or SSE register to integer */
1231   32,                                   /* size of l1 cache.  */
1232   256,                                  /* size of l2 cache.  */
1233   64,                                   /* size of prefetch block */
1234   6,                                    /* number of parallel prefetches */
1235   3,                                    /* Branch cost */
1236   COSTS_N_INSNS (8),                    /* cost of FADD and FSUB insns.  */
1237   COSTS_N_INSNS (8),                    /* cost of FMUL instruction.  */
1238   COSTS_N_INSNS (20),                   /* cost of FDIV instruction.  */
1239   COSTS_N_INSNS (8),                    /* cost of FABS instruction.  */
1240   COSTS_N_INSNS (8),                    /* cost of FCHS instruction.  */
1241   COSTS_N_INSNS (40),                   /* cost of FSQRT instruction.  */
1242   {{libcall, {{32, loop}, {8192, rep_prefix_4_byte}, {-1, libcall}}},
1243    DUMMY_STRINGOP_ALGS},
1244   {{libcall, {{32, loop}, {8192, rep_prefix_4_byte}, {-1, libcall}}},
1245    DUMMY_STRINGOP_ALGS},
1246   1,                                    /* scalar_stmt_cost.  */
1247   1,                                    /* scalar load_cost.  */
1248   1,                                    /* scalar_store_cost.  */
1249   1,                                    /* vec_stmt_cost.  */
1250   1,                                    /* vec_to_scalar_cost.  */
1251   1,                                    /* scalar_to_vec_cost.  */
1252   1,                                    /* vec_align_load_cost.  */
1253   2,                                    /* vec_unalign_load_cost.  */
1254   1,                                    /* vec_store_cost.  */
1255   3,                                    /* cond_taken_branch_cost.  */
1256   1,                                    /* cond_not_taken_branch_cost.  */
1257 };
1258
1259 const struct processor_costs *ix86_cost = &pentium_cost;
1260
1261 /* Processor feature/optimization bitmasks.  */
1262 #define m_386 (1<<PROCESSOR_I386)
1263 #define m_486 (1<<PROCESSOR_I486)
1264 #define m_PENT (1<<PROCESSOR_PENTIUM)
1265 #define m_PPRO (1<<PROCESSOR_PENTIUMPRO)
1266 #define m_PENT4  (1<<PROCESSOR_PENTIUM4)
1267 #define m_NOCONA  (1<<PROCESSOR_NOCONA)
1268 #define m_CORE2  (1<<PROCESSOR_CORE2)
1269 #define m_ATOM  (1<<PROCESSOR_ATOM)
1270
1271 #define m_GEODE  (1<<PROCESSOR_GEODE)
1272 #define m_K6  (1<<PROCESSOR_K6)
1273 #define m_K6_GEODE  (m_K6 | m_GEODE)
1274 #define m_K8  (1<<PROCESSOR_K8)
1275 #define m_ATHLON  (1<<PROCESSOR_ATHLON)
1276 #define m_ATHLON_K8  (m_K8 | m_ATHLON)
1277 #define m_AMDFAM10  (1<<PROCESSOR_AMDFAM10)
1278 #define m_AMD_MULTIPLE  (m_K8 | m_ATHLON | m_AMDFAM10)
1279
1280 #define m_GENERIC32 (1<<PROCESSOR_GENERIC32)
1281 #define m_GENERIC64 (1<<PROCESSOR_GENERIC64)
1282
1283 /* Generic instruction choice should be common subset of supported CPUs
1284    (PPro/PENT4/NOCONA/CORE2/Athlon/K8).  */
1285 #define m_GENERIC (m_GENERIC32 | m_GENERIC64)
1286
1287 /* Feature tests against the various tunings.  */
1288 unsigned char ix86_tune_features[X86_TUNE_LAST];
1289
1290 /* Feature tests against the various tunings used to create ix86_tune_features
1291    based on the processor mask.  */
1292 static unsigned int initial_ix86_tune_features[X86_TUNE_LAST] = {
1293   /* X86_TUNE_USE_LEAVE: Leave does not affect Nocona SPEC2000 results
1294      negatively, so enabling for Generic64 seems like good code size
1295      tradeoff.  We can't enable it for 32bit generic because it does not
1296      work well with PPro base chips.  */
1297   m_386 | m_K6_GEODE | m_AMD_MULTIPLE | m_CORE2 | m_GENERIC64,
1298
1299   /* X86_TUNE_PUSH_MEMORY */
1300   m_386 | m_K6_GEODE | m_AMD_MULTIPLE | m_PENT4
1301   | m_NOCONA | m_CORE2 | m_GENERIC,
1302
1303   /* X86_TUNE_ZERO_EXTEND_WITH_AND */
1304   m_486 | m_PENT,
1305
1306   /* X86_TUNE_UNROLL_STRLEN */
1307   m_486 | m_PENT | m_ATOM | m_PPRO | m_AMD_MULTIPLE | m_K6
1308   | m_CORE2 | m_GENERIC,
1309
1310   /* X86_TUNE_DEEP_BRANCH_PREDICTION */
1311   m_ATOM | m_PPRO | m_K6_GEODE | m_AMD_MULTIPLE | m_PENT4 | m_GENERIC,
1312
1313   /* X86_TUNE_BRANCH_PREDICTION_HINTS: Branch hints were put in P4 based
1314      on simulation result. But after P4 was made, no performance benefit
1315      was observed with branch hints.  It also increases the code size.
1316      As a result, icc never generates branch hints.  */
1317   0,
1318
1319   /* X86_TUNE_DOUBLE_WITH_ADD */
1320   ~m_386,
1321
1322   /* X86_TUNE_USE_SAHF */
1323   m_ATOM | m_PPRO | m_K6_GEODE | m_K8 | m_AMDFAM10 | m_PENT4
1324   | m_NOCONA | m_CORE2 | m_GENERIC,
1325
1326   /* X86_TUNE_MOVX: Enable to zero extend integer registers to avoid
1327      partial dependencies.  */
1328   m_AMD_MULTIPLE | m_ATOM | m_PPRO | m_PENT4 | m_NOCONA
1329   | m_CORE2 | m_GENERIC | m_GEODE /* m_386 | m_K6 */,
1330
1331   /* X86_TUNE_PARTIAL_REG_STALL: We probably ought to watch for partial
1332      register stalls on Generic32 compilation setting as well.  However
1333      in current implementation the partial register stalls are not eliminated
1334      very well - they can be introduced via subregs synthesized by combine
1335      and can happen in caller/callee saving sequences.  Because this option
1336      pays back little on PPro based chips and is in conflict with partial reg
1337      dependencies used by Athlon/P4 based chips, it is better to leave it off
1338      for generic32 for now.  */
1339   m_PPRO,
1340
1341   /* X86_TUNE_PARTIAL_FLAG_REG_STALL */
1342   m_CORE2 | m_GENERIC,
1343
1344   /* X86_TUNE_USE_HIMODE_FIOP */
1345   m_386 | m_486 | m_K6_GEODE,
1346
1347   /* X86_TUNE_USE_SIMODE_FIOP */
1348   ~(m_PPRO | m_AMD_MULTIPLE | m_PENT | m_ATOM | m_CORE2 | m_GENERIC),
1349
1350   /* X86_TUNE_USE_MOV0 */
1351   m_K6,
1352
1353   /* X86_TUNE_USE_CLTD */
1354   ~(m_PENT | m_ATOM | m_K6 | m_CORE2 | m_GENERIC),
1355
1356   /* X86_TUNE_USE_XCHGB: Use xchgb %rh,%rl instead of rolw/rorw $8,rx.  */
1357   m_PENT4,
1358
1359   /* X86_TUNE_SPLIT_LONG_MOVES */
1360   m_PPRO,
1361
1362   /* X86_TUNE_READ_MODIFY_WRITE */
1363   ~m_PENT,
1364
1365   /* X86_TUNE_READ_MODIFY */
1366   ~(m_PENT | m_PPRO),
1367
1368   /* X86_TUNE_PROMOTE_QIMODE */
1369   m_K6_GEODE | m_PENT | m_ATOM | m_386 | m_486 | m_AMD_MULTIPLE
1370   | m_CORE2 | m_GENERIC /* | m_PENT4 ? */,
1371
1372   /* X86_TUNE_FAST_PREFIX */
1373   ~(m_PENT | m_486 | m_386),
1374
1375   /* X86_TUNE_SINGLE_STRINGOP */
1376   m_386 | m_PENT4 | m_NOCONA,
1377
1378   /* X86_TUNE_QIMODE_MATH */
1379   ~0,
1380
1381   /* X86_TUNE_HIMODE_MATH: On PPro this flag is meant to avoid partial
1382      register stalls.  Just like X86_TUNE_PARTIAL_REG_STALL this option
1383      might be considered for Generic32 if our scheme for avoiding partial
1384      stalls was more effective.  */
1385   ~m_PPRO,
1386
1387   /* X86_TUNE_PROMOTE_QI_REGS */
1388   0,
1389
1390   /* X86_TUNE_PROMOTE_HI_REGS */
1391   m_PPRO,
1392
1393   /* X86_TUNE_ADD_ESP_4: Enable if add/sub is preferred over 1/2 push/pop.  */
1394   m_ATOM | m_AMD_MULTIPLE | m_K6_GEODE | m_PENT4 | m_NOCONA
1395   | m_CORE2 | m_GENERIC,
1396
1397   /* X86_TUNE_ADD_ESP_8 */
1398   m_AMD_MULTIPLE | m_ATOM | m_PPRO | m_K6_GEODE | m_386
1399   | m_486 | m_PENT4 | m_NOCONA | m_CORE2 | m_GENERIC,
1400
1401   /* X86_TUNE_SUB_ESP_4 */
1402   m_AMD_MULTIPLE | m_ATOM | m_PPRO | m_PENT4 | m_NOCONA | m_CORE2
1403   | m_GENERIC,
1404
1405   /* X86_TUNE_SUB_ESP_8 */
1406   m_AMD_MULTIPLE | m_ATOM | m_PPRO | m_386 | m_486
1407   | m_PENT4 | m_NOCONA | m_CORE2 | m_GENERIC,
1408
1409   /* X86_TUNE_INTEGER_DFMODE_MOVES: Enable if integer moves are preferred
1410      for DFmode copies */
1411   ~(m_AMD_MULTIPLE | m_ATOM | m_PENT4 | m_NOCONA | m_PPRO | m_CORE2
1412     | m_GENERIC | m_GEODE),
1413
1414   /* X86_TUNE_PARTIAL_REG_DEPENDENCY */
1415   m_AMD_MULTIPLE | m_ATOM | m_PENT4 | m_NOCONA | m_CORE2 | m_GENERIC,
1416
1417   /* X86_TUNE_SSE_PARTIAL_REG_DEPENDENCY: In the Generic model we have a
1418      conflict here in between PPro/Pentium4 based chips that thread 128bit
1419      SSE registers as single units versus K8 based chips that divide SSE
1420      registers to two 64bit halves.  This knob promotes all store destinations
1421      to be 128bit to allow register renaming on 128bit SSE units, but usually
1422      results in one extra microop on 64bit SSE units.  Experimental results
1423      shows that disabling this option on P4 brings over 20% SPECfp regression,
1424      while enabling it on K8 brings roughly 2.4% regression that can be partly
1425      masked by careful scheduling of moves.  */
1426   m_ATOM | m_PENT4 | m_NOCONA | m_PPRO | m_CORE2 | m_GENERIC
1427   | m_AMDFAM10,
1428
1429   /* X86_TUNE_SSE_UNALIGNED_MOVE_OPTIMAL */
1430   m_AMDFAM10,
1431
1432   /* X86_TUNE_SSE_SPLIT_REGS: Set for machines where the type and dependencies
1433      are resolved on SSE register parts instead of whole registers, so we may
1434      maintain just lower part of scalar values in proper format leaving the
1435      upper part undefined.  */
1436   m_ATHLON_K8,
1437
1438   /* X86_TUNE_SSE_TYPELESS_STORES */
1439   m_AMD_MULTIPLE,
1440
1441   /* X86_TUNE_SSE_LOAD0_BY_PXOR */
1442   m_PPRO | m_PENT4 | m_NOCONA,
1443
1444   /* X86_TUNE_MEMORY_MISMATCH_STALL */
1445   m_AMD_MULTIPLE | m_ATOM | m_PENT4 | m_NOCONA | m_CORE2 | m_GENERIC,
1446
1447   /* X86_TUNE_PROLOGUE_USING_MOVE */
1448   m_ATHLON_K8 | m_ATOM | m_PPRO | m_CORE2 | m_GENERIC,
1449
1450   /* X86_TUNE_EPILOGUE_USING_MOVE */
1451   m_ATHLON_K8 | m_ATOM | m_PPRO | m_CORE2 | m_GENERIC,
1452
1453   /* X86_TUNE_SHIFT1 */
1454   ~m_486,
1455
1456   /* X86_TUNE_USE_FFREEP */
1457   m_AMD_MULTIPLE,
1458
1459   /* X86_TUNE_INTER_UNIT_MOVES */
1460   ~(m_AMD_MULTIPLE | m_ATOM | m_GENERIC),
1461
1462   /* X86_TUNE_INTER_UNIT_CONVERSIONS */
1463   ~(m_AMDFAM10),
1464
1465   /* X86_TUNE_FOUR_JUMP_LIMIT: Some CPU cores are not able to predict more
1466      than 4 branch instructions in the 16 byte window.  */
1467   m_ATOM | m_PPRO | m_AMD_MULTIPLE | m_PENT4 | m_NOCONA | m_CORE2
1468   | m_GENERIC,
1469
1470   /* X86_TUNE_SCHEDULE */
1471   m_PPRO | m_AMD_MULTIPLE | m_K6_GEODE | m_PENT | m_ATOM | m_CORE2
1472   | m_GENERIC,
1473
1474   /* X86_TUNE_USE_BT */
1475   m_AMD_MULTIPLE | m_ATOM | m_CORE2 | m_GENERIC,
1476
1477   /* X86_TUNE_USE_INCDEC */
1478   ~(m_PENT4 | m_NOCONA | m_GENERIC | m_ATOM),
1479
1480   /* X86_TUNE_PAD_RETURNS */
1481   m_AMD_MULTIPLE | m_CORE2 | m_GENERIC,
1482
1483   /* X86_TUNE_EXT_80387_CONSTANTS */
1484   m_K6_GEODE | m_ATHLON_K8 | m_ATOM | m_PENT4 | m_NOCONA | m_PPRO
1485   | m_CORE2 | m_GENERIC,
1486
1487   /* X86_TUNE_SHORTEN_X87_SSE */
1488   ~m_K8,
1489
1490   /* X86_TUNE_AVOID_VECTOR_DECODE */
1491   m_K8 | m_GENERIC64,
1492
1493   /* X86_TUNE_PROMOTE_HIMODE_IMUL: Modern CPUs have same latency for HImode
1494      and SImode multiply, but 386 and 486 do HImode multiply faster.  */
1495   ~(m_386 | m_486),
1496
1497   /* X86_TUNE_SLOW_IMUL_IMM32_MEM: Imul of 32-bit constant and memory is
1498      vector path on AMD machines.  */
1499   m_K8 | m_GENERIC64 | m_AMDFAM10,
1500
1501   /* X86_TUNE_SLOW_IMUL_IMM8: Imul of 8-bit constant is vector path on AMD
1502      machines.  */
1503   m_K8 | m_GENERIC64 | m_AMDFAM10,
1504
1505   /* X86_TUNE_MOVE_M1_VIA_OR: On pentiums, it is faster to load -1 via OR
1506      than a MOV.  */
1507   m_PENT,
1508
1509   /* X86_TUNE_NOT_UNPAIRABLE: NOT is not pairable on Pentium, while XOR is,
1510      but one byte longer.  */
1511   m_PENT,
1512
1513   /* X86_TUNE_NOT_VECTORMODE: On AMD K6, NOT is vector decoded with memory
1514      operand that cannot be represented using a modRM byte.  The XOR
1515      replacement is long decoded, so this split helps here as well.  */
1516   m_K6,
1517
1518   /* X86_TUNE_USE_VECTOR_FP_CONVERTS: Prefer vector packed SSE conversion
1519      from FP to FP. */
1520   m_AMDFAM10 | m_GENERIC,
1521
1522   /* X86_TUNE_USE_VECTOR_CONVERTS: Prefer vector packed SSE conversion
1523      from integer to FP. */
1524   m_AMDFAM10,
1525
1526   /* X86_TUNE_FUSE_CMP_AND_BRANCH: Fuse a compare or test instruction
1527      with a subsequent conditional jump instruction into a single
1528      compare-and-branch uop.  */
1529   m_CORE2,
1530
1531   /* X86_TUNE_OPT_AGU: Optimize for Address Generation Unit. This flag
1532      will impact LEA instruction selection. */
1533   m_ATOM,
1534 };
1535
1536 /* Feature tests against the various architecture variations.  */
1537 unsigned char ix86_arch_features[X86_ARCH_LAST];
1538
1539 /* Feature tests against the various architecture variations, used to create
1540    ix86_arch_features based on the processor mask.  */
1541 static unsigned int initial_ix86_arch_features[X86_ARCH_LAST] = {
1542   /* X86_ARCH_CMOVE: Conditional move was added for pentiumpro.  */
1543   ~(m_386 | m_486 | m_PENT | m_K6),
1544
1545   /* X86_ARCH_CMPXCHG: Compare and exchange was added for 80486.  */
1546   ~m_386,
1547
1548   /* X86_ARCH_CMPXCHG8B: Compare and exchange 8 bytes was added for pentium. */
1549   ~(m_386 | m_486),
1550
1551   /* X86_ARCH_XADD: Exchange and add was added for 80486.  */
1552   ~m_386,
1553
1554   /* X86_ARCH_BSWAP: Byteswap was added for 80486.  */
1555   ~m_386,
1556
1557   /* X86_ARCH_CALL_ESP: P6 processors will jump to the address after
1558      the decrement (so they will execute return address as code).  See
1559      Pentium Pro errata 70, Pentium 2 errata A33, Pentium 3 errata E17.  */
1560   ~(m_386 | m_486 | m_PENT | m_PPRO),
1561 };
1562
1563 static const unsigned int x86_accumulate_outgoing_args
1564   = m_AMD_MULTIPLE | m_ATOM | m_PENT4 | m_NOCONA | m_PPRO | m_CORE2
1565     | m_GENERIC;
1566
1567 static const unsigned int x86_arch_always_fancy_math_387
1568   = m_PENT | m_ATOM | m_PPRO | m_AMD_MULTIPLE | m_PENT4
1569     | m_NOCONA | m_CORE2 | m_GENERIC;
1570
1571 static enum stringop_alg stringop_alg = no_stringop;
1572
1573 /* In case the average insn count for single function invocation is
1574    lower than this constant, emit fast (but longer) prologue and
1575    epilogue code.  */
1576 #define FAST_PROLOGUE_INSN_COUNT 20
1577
1578 /* Names for 8 (low), 8 (high), and 16-bit registers, respectively.  */
1579 static const char *const qi_reg_name[] = QI_REGISTER_NAMES;
1580 static const char *const qi_high_reg_name[] = QI_HIGH_REGISTER_NAMES;
1581 static const char *const hi_reg_name[] = HI_REGISTER_NAMES;
1582
1583 /* Array of the smallest class containing reg number REGNO, indexed by
1584    REGNO.  Used by REGNO_REG_CLASS in i386.h.  */
1585
1586 enum reg_class const regclass_map[FIRST_PSEUDO_REGISTER] =
1587 {
1588   /* ax, dx, cx, bx */
1589   AREG, DREG, CREG, BREG,
1590   /* si, di, bp, sp */
1591   SIREG, DIREG, NON_Q_REGS, NON_Q_REGS,
1592   /* FP registers */
1593   FP_TOP_REG, FP_SECOND_REG, FLOAT_REGS, FLOAT_REGS,
1594   FLOAT_REGS, FLOAT_REGS, FLOAT_REGS, FLOAT_REGS,
1595   /* arg pointer */
1596   NON_Q_REGS,
1597   /* flags, fpsr, fpcr, frame */
1598   NO_REGS, NO_REGS, NO_REGS, NON_Q_REGS,
1599   /* SSE registers */
1600   SSE_FIRST_REG, SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS,
1601   SSE_REGS, SSE_REGS,
1602   /* MMX registers */
1603   MMX_REGS, MMX_REGS, MMX_REGS, MMX_REGS, MMX_REGS, MMX_REGS,
1604   MMX_REGS, MMX_REGS,
1605   /* REX registers */
1606   NON_Q_REGS, NON_Q_REGS, NON_Q_REGS, NON_Q_REGS,
1607   NON_Q_REGS, NON_Q_REGS, NON_Q_REGS, NON_Q_REGS,
1608   /* SSE REX registers */
1609   SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS,
1610   SSE_REGS, SSE_REGS,
1611 };
1612
1613 /* The "default" register map used in 32bit mode.  */
1614
1615 int const dbx_register_map[FIRST_PSEUDO_REGISTER] =
1616 {
1617   0, 2, 1, 3, 6, 7, 4, 5,               /* general regs */
1618   12, 13, 14, 15, 16, 17, 18, 19,       /* fp regs */
1619   -1, -1, -1, -1, -1,                   /* arg, flags, fpsr, fpcr, frame */
1620   21, 22, 23, 24, 25, 26, 27, 28,       /* SSE */
1621   29, 30, 31, 32, 33, 34, 35, 36,       /* MMX */
1622   -1, -1, -1, -1, -1, -1, -1, -1,       /* extended integer registers */
1623   -1, -1, -1, -1, -1, -1, -1, -1,       /* extended SSE registers */
1624 };
1625
1626 /* The "default" register map used in 64bit mode.  */
1627
1628 int const dbx64_register_map[FIRST_PSEUDO_REGISTER] =
1629 {
1630   0, 1, 2, 3, 4, 5, 6, 7,               /* general regs */
1631   33, 34, 35, 36, 37, 38, 39, 40,       /* fp regs */
1632   -1, -1, -1, -1, -1,                   /* arg, flags, fpsr, fpcr, frame */
1633   17, 18, 19, 20, 21, 22, 23, 24,       /* SSE */
1634   41, 42, 43, 44, 45, 46, 47, 48,       /* MMX */
1635   8,9,10,11,12,13,14,15,                /* extended integer registers */
1636   25, 26, 27, 28, 29, 30, 31, 32,       /* extended SSE registers */
1637 };
1638
1639 /* Define the register numbers to be used in Dwarf debugging information.
1640    The SVR4 reference port C compiler uses the following register numbers
1641    in its Dwarf output code:
1642         0 for %eax (gcc regno = 0)
1643         1 for %ecx (gcc regno = 2)
1644         2 for %edx (gcc regno = 1)
1645         3 for %ebx (gcc regno = 3)
1646         4 for %esp (gcc regno = 7)
1647         5 for %ebp (gcc regno = 6)
1648         6 for %esi (gcc regno = 4)
1649         7 for %edi (gcc regno = 5)
1650    The following three DWARF register numbers are never generated by
1651    the SVR4 C compiler or by the GNU compilers, but SDB on x86/svr4
1652    believes these numbers have these meanings.
1653         8  for %eip    (no gcc equivalent)
1654         9  for %eflags (gcc regno = 17)
1655         10 for %trapno (no gcc equivalent)
1656    It is not at all clear how we should number the FP stack registers
1657    for the x86 architecture.  If the version of SDB on x86/svr4 were
1658    a bit less brain dead with respect to floating-point then we would
1659    have a precedent to follow with respect to DWARF register numbers
1660    for x86 FP registers, but the SDB on x86/svr4 is so completely
1661    broken with respect to FP registers that it is hardly worth thinking
1662    of it as something to strive for compatibility with.
1663    The version of x86/svr4 SDB I have at the moment does (partially)
1664    seem to believe that DWARF register number 11 is associated with
1665    the x86 register %st(0), but that's about all.  Higher DWARF
1666    register numbers don't seem to be associated with anything in
1667    particular, and even for DWARF regno 11, SDB only seems to under-
1668    stand that it should say that a variable lives in %st(0) (when
1669    asked via an `=' command) if we said it was in DWARF regno 11,
1670    but SDB still prints garbage when asked for the value of the
1671    variable in question (via a `/' command).
1672    (Also note that the labels SDB prints for various FP stack regs
1673    when doing an `x' command are all wrong.)
1674    Note that these problems generally don't affect the native SVR4
1675    C compiler because it doesn't allow the use of -O with -g and
1676    because when it is *not* optimizing, it allocates a memory
1677    location for each floating-point variable, and the memory
1678    location is what gets described in the DWARF AT_location
1679    attribute for the variable in question.
1680    Regardless of the severe mental illness of the x86/svr4 SDB, we
1681    do something sensible here and we use the following DWARF
1682    register numbers.  Note that these are all stack-top-relative
1683    numbers.
1684         11 for %st(0) (gcc regno = 8)
1685         12 for %st(1) (gcc regno = 9)
1686         13 for %st(2) (gcc regno = 10)
1687         14 for %st(3) (gcc regno = 11)
1688         15 for %st(4) (gcc regno = 12)
1689         16 for %st(5) (gcc regno = 13)
1690         17 for %st(6) (gcc regno = 14)
1691         18 for %st(7) (gcc regno = 15)
1692 */
1693 int const svr4_dbx_register_map[FIRST_PSEUDO_REGISTER] =
1694 {
1695   0, 2, 1, 3, 6, 7, 5, 4,               /* general regs */
1696   11, 12, 13, 14, 15, 16, 17, 18,       /* fp regs */
1697   -1, 9, -1, -1, -1,                    /* arg, flags, fpsr, fpcr, frame */
1698   21, 22, 23, 24, 25, 26, 27, 28,       /* SSE registers */
1699   29, 30, 31, 32, 33, 34, 35, 36,       /* MMX registers */
1700   -1, -1, -1, -1, -1, -1, -1, -1,       /* extended integer registers */
1701   -1, -1, -1, -1, -1, -1, -1, -1,       /* extended SSE registers */
1702 };
1703
1704 /* Test and compare insns in i386.md store the information needed to
1705    generate branch and scc insns here.  */
1706
1707 rtx ix86_compare_op0 = NULL_RTX;
1708 rtx ix86_compare_op1 = NULL_RTX;
1709
1710 /* Define parameter passing and return registers.  */
1711
1712 static int const x86_64_int_parameter_registers[6] =
1713 {
1714   DI_REG, SI_REG, DX_REG, CX_REG, R8_REG, R9_REG
1715 };
1716
1717 static int const x86_64_ms_abi_int_parameter_registers[4] =
1718 {
1719   CX_REG, DX_REG, R8_REG, R9_REG
1720 };
1721
1722 static int const x86_64_int_return_registers[4] =
1723 {
1724   AX_REG, DX_REG, DI_REG, SI_REG
1725 };
1726
1727 /* Define the structure for the machine field in struct function.  */
1728
1729 struct GTY(()) stack_local_entry {
1730   unsigned short mode;
1731   unsigned short n;
1732   rtx rtl;
1733   struct stack_local_entry *next;
1734 };
1735
1736 /* Structure describing stack frame layout.
1737    Stack grows downward:
1738
1739    [arguments]
1740                                               <- ARG_POINTER
1741    saved pc
1742
1743    saved frame pointer if frame_pointer_needed
1744                                               <- HARD_FRAME_POINTER
1745    [saved regs]
1746
1747    [padding0]
1748
1749    [saved SSE regs]
1750
1751    [padding1]          \
1752                         )
1753    [va_arg registers]  (
1754                         > to_allocate         <- FRAME_POINTER
1755    [frame]             (
1756                         )
1757    [padding2]          /
1758   */
1759 struct ix86_frame
1760 {
1761   int padding0;
1762   int nsseregs;
1763   int nregs;
1764   int padding1;
1765   int va_arg_size;
1766   HOST_WIDE_INT frame;
1767   int padding2;
1768   int outgoing_arguments_size;
1769   int red_zone_size;
1770
1771   HOST_WIDE_INT to_allocate;
1772   /* The offsets relative to ARG_POINTER.  */
1773   HOST_WIDE_INT frame_pointer_offset;
1774   HOST_WIDE_INT hard_frame_pointer_offset;
1775   HOST_WIDE_INT stack_pointer_offset;
1776
1777   /* When save_regs_using_mov is set, emit prologue using
1778      move instead of push instructions.  */
1779   bool save_regs_using_mov;
1780 };
1781
1782 /* Code model option.  */
1783 enum cmodel ix86_cmodel;
1784 /* Asm dialect.  */
1785 enum asm_dialect ix86_asm_dialect = ASM_ATT;
1786 /* TLS dialects.  */
1787 enum tls_dialect ix86_tls_dialect = TLS_DIALECT_GNU;
1788
1789 /* Which unit we are generating floating point math for.  */
1790 enum fpmath_unit ix86_fpmath;
1791
1792 /* Which cpu are we scheduling for.  */
1793 enum attr_cpu ix86_schedule;
1794
1795 /* Which cpu are we optimizing for.  */
1796 enum processor_type ix86_tune;
1797
1798 /* Which instruction set architecture to use.  */
1799 enum processor_type ix86_arch;
1800
1801 /* true if sse prefetch instruction is not NOOP.  */
1802 int x86_prefetch_sse;
1803
1804 /* ix86_regparm_string as a number */
1805 static int ix86_regparm;
1806
1807 /* -mstackrealign option */
1808 extern int ix86_force_align_arg_pointer;
1809 static const char ix86_force_align_arg_pointer_string[]
1810   = "force_align_arg_pointer";
1811
1812 static rtx (*ix86_gen_leave) (void);
1813 static rtx (*ix86_gen_pop1) (rtx);
1814 static rtx (*ix86_gen_add3) (rtx, rtx, rtx);
1815 static rtx (*ix86_gen_sub3) (rtx, rtx, rtx);
1816 static rtx (*ix86_gen_sub3_carry) (rtx, rtx, rtx, rtx);
1817 static rtx (*ix86_gen_one_cmpl2) (rtx, rtx);
1818 static rtx (*ix86_gen_monitor) (rtx, rtx, rtx);
1819 static rtx (*ix86_gen_andsp) (rtx, rtx, rtx);
1820
1821 /* Preferred alignment for stack boundary in bits.  */
1822 unsigned int ix86_preferred_stack_boundary;
1823
1824 /* Alignment for incoming stack boundary in bits specified at
1825    command line.  */
1826 static unsigned int ix86_user_incoming_stack_boundary;
1827
1828 /* Default alignment for incoming stack boundary in bits.  */
1829 static unsigned int ix86_default_incoming_stack_boundary;
1830
1831 /* Alignment for incoming stack boundary in bits.  */
1832 unsigned int ix86_incoming_stack_boundary;
1833
1834 /* The abi used by target.  */
1835 enum calling_abi ix86_abi;
1836
1837 /* Values 1-5: see jump.c */
1838 int ix86_branch_cost;
1839
1840 /* Calling abi specific va_list type nodes.  */
1841 static GTY(()) tree sysv_va_list_type_node;
1842 static GTY(()) tree ms_va_list_type_node;
1843
1844 /* Variables which are this size or smaller are put in the data/bss
1845    or ldata/lbss sections.  */
1846
1847 int ix86_section_threshold = 65536;
1848
1849 /* Prefix built by ASM_GENERATE_INTERNAL_LABEL.  */
1850 char internal_label_prefix[16];
1851 int internal_label_prefix_len;
1852
1853 /* Fence to use after loop using movnt.  */
1854 tree x86_mfence;
1855
1856 /* Register class used for passing given 64bit part of the argument.
1857    These represent classes as documented by the PS ABI, with the exception
1858    of SSESF, SSEDF classes, that are basically SSE class, just gcc will
1859    use SF or DFmode move instead of DImode to avoid reformatting penalties.
1860
1861    Similarly we play games with INTEGERSI_CLASS to use cheaper SImode moves
1862    whenever possible (upper half does contain padding).  */
1863 enum x86_64_reg_class
1864   {
1865     X86_64_NO_CLASS,
1866     X86_64_INTEGER_CLASS,
1867     X86_64_INTEGERSI_CLASS,
1868     X86_64_SSE_CLASS,
1869     X86_64_SSESF_CLASS,
1870     X86_64_SSEDF_CLASS,
1871     X86_64_SSEUP_CLASS,
1872     X86_64_X87_CLASS,
1873     X86_64_X87UP_CLASS,
1874     X86_64_COMPLEX_X87_CLASS,
1875     X86_64_MEMORY_CLASS
1876   };
1877
1878 #define MAX_CLASSES 4
1879
1880 /* Table of constants used by fldpi, fldln2, etc....  */
1881 static REAL_VALUE_TYPE ext_80387_constants_table [5];
1882 static bool ext_80387_constants_init = 0;
1883
1884 \f
1885 static struct machine_function * ix86_init_machine_status (void);
1886 static rtx ix86_function_value (const_tree, const_tree, bool);
1887 static rtx ix86_static_chain (const_tree, bool);
1888 static int ix86_function_regparm (const_tree, const_tree);
1889 static void ix86_compute_frame_layout (struct ix86_frame *);
1890 static bool ix86_expand_vector_init_one_nonzero (bool, enum machine_mode,
1891                                                  rtx, rtx, int);
1892 static void ix86_add_new_builtins (int);
1893
1894 enum ix86_function_specific_strings
1895 {
1896   IX86_FUNCTION_SPECIFIC_ARCH,
1897   IX86_FUNCTION_SPECIFIC_TUNE,
1898   IX86_FUNCTION_SPECIFIC_FPMATH,
1899   IX86_FUNCTION_SPECIFIC_MAX
1900 };
1901
1902 static char *ix86_target_string (int, int, const char *, const char *,
1903                                  const char *, bool);
1904 static void ix86_debug_options (void) ATTRIBUTE_UNUSED;
1905 static void ix86_function_specific_save (struct cl_target_option *);
1906 static void ix86_function_specific_restore (struct cl_target_option *);
1907 static void ix86_function_specific_print (FILE *, int,
1908                                           struct cl_target_option *);
1909 static bool ix86_valid_target_attribute_p (tree, tree, tree, int);
1910 static bool ix86_valid_target_attribute_inner_p (tree, char *[]);
1911 static bool ix86_can_inline_p (tree, tree);
1912 static void ix86_set_current_function (tree);
1913 static unsigned int ix86_minimum_incoming_stack_boundary (bool);
1914
1915 static enum calling_abi ix86_function_abi (const_tree);
1916
1917 \f
1918 /* The svr4 ABI for the i386 says that records and unions are returned
1919    in memory.  */
1920 #ifndef DEFAULT_PCC_STRUCT_RETURN
1921 #define DEFAULT_PCC_STRUCT_RETURN 1
1922 #endif
1923
1924 /* Whether -mtune= or -march= were specified */
1925 static int ix86_tune_defaulted;
1926 static int ix86_arch_specified;
1927
1928 /* Bit flags that specify the ISA we are compiling for.  */
1929 int ix86_isa_flags = TARGET_64BIT_DEFAULT | TARGET_SUBTARGET_ISA_DEFAULT;
1930
1931 /* A mask of ix86_isa_flags that includes bit X if X
1932    was set or cleared on the command line.  */
1933 static int ix86_isa_flags_explicit;
1934
1935 /* Define a set of ISAs which are available when a given ISA is
1936    enabled.  MMX and SSE ISAs are handled separately.  */
1937
1938 #define OPTION_MASK_ISA_MMX_SET OPTION_MASK_ISA_MMX
1939 #define OPTION_MASK_ISA_3DNOW_SET \
1940   (OPTION_MASK_ISA_3DNOW | OPTION_MASK_ISA_MMX_SET)
1941
1942 #define OPTION_MASK_ISA_SSE_SET OPTION_MASK_ISA_SSE
1943 #define OPTION_MASK_ISA_SSE2_SET \
1944   (OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_SSE_SET)
1945 #define OPTION_MASK_ISA_SSE3_SET \
1946   (OPTION_MASK_ISA_SSE3 | OPTION_MASK_ISA_SSE2_SET)
1947 #define OPTION_MASK_ISA_SSSE3_SET \
1948   (OPTION_MASK_ISA_SSSE3 | OPTION_MASK_ISA_SSE3_SET)
1949 #define OPTION_MASK_ISA_SSE4_1_SET \
1950   (OPTION_MASK_ISA_SSE4_1 | OPTION_MASK_ISA_SSSE3_SET)
1951 #define OPTION_MASK_ISA_SSE4_2_SET \
1952   (OPTION_MASK_ISA_SSE4_2 | OPTION_MASK_ISA_SSE4_1_SET)
1953 #define OPTION_MASK_ISA_AVX_SET \
1954   (OPTION_MASK_ISA_AVX | OPTION_MASK_ISA_SSE4_2_SET)
1955 #define OPTION_MASK_ISA_FMA_SET \
1956   (OPTION_MASK_ISA_FMA | OPTION_MASK_ISA_AVX_SET)
1957
1958 /* SSE4 includes both SSE4.1 and SSE4.2. -msse4 should be the same
1959    as -msse4.2.  */
1960 #define OPTION_MASK_ISA_SSE4_SET OPTION_MASK_ISA_SSE4_2_SET
1961
1962 #define OPTION_MASK_ISA_SSE4A_SET \
1963   (OPTION_MASK_ISA_SSE4A | OPTION_MASK_ISA_SSE3_SET)
1964 #define OPTION_MASK_ISA_FMA4_SET \
1965   (OPTION_MASK_ISA_FMA4 | OPTION_MASK_ISA_SSE4A_SET \
1966    | OPTION_MASK_ISA_AVX_SET)
1967 #define OPTION_MASK_ISA_XOP_SET \
1968   (OPTION_MASK_ISA_XOP | OPTION_MASK_ISA_FMA4_SET)
1969 #define OPTION_MASK_ISA_LWP_SET \
1970   OPTION_MASK_ISA_LWP
1971
1972 /* AES and PCLMUL need SSE2 because they use xmm registers */
1973 #define OPTION_MASK_ISA_AES_SET \
1974   (OPTION_MASK_ISA_AES | OPTION_MASK_ISA_SSE2_SET)
1975 #define OPTION_MASK_ISA_PCLMUL_SET \
1976   (OPTION_MASK_ISA_PCLMUL | OPTION_MASK_ISA_SSE2_SET)
1977
1978 #define OPTION_MASK_ISA_ABM_SET \
1979   (OPTION_MASK_ISA_ABM | OPTION_MASK_ISA_POPCNT)
1980
1981 #define OPTION_MASK_ISA_POPCNT_SET OPTION_MASK_ISA_POPCNT
1982 #define OPTION_MASK_ISA_CX16_SET OPTION_MASK_ISA_CX16
1983 #define OPTION_MASK_ISA_SAHF_SET OPTION_MASK_ISA_SAHF
1984 #define OPTION_MASK_ISA_MOVBE_SET OPTION_MASK_ISA_MOVBE
1985 #define OPTION_MASK_ISA_CRC32_SET OPTION_MASK_ISA_CRC32
1986
1987 /* Define a set of ISAs which aren't available when a given ISA is
1988    disabled.  MMX and SSE ISAs are handled separately.  */
1989
1990 #define OPTION_MASK_ISA_MMX_UNSET \
1991   (OPTION_MASK_ISA_MMX | OPTION_MASK_ISA_3DNOW_UNSET)
1992 #define OPTION_MASK_ISA_3DNOW_UNSET \
1993   (OPTION_MASK_ISA_3DNOW | OPTION_MASK_ISA_3DNOW_A_UNSET)
1994 #define OPTION_MASK_ISA_3DNOW_A_UNSET OPTION_MASK_ISA_3DNOW_A
1995
1996 #define OPTION_MASK_ISA_SSE_UNSET \
1997   (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_SSE2_UNSET)
1998 #define OPTION_MASK_ISA_SSE2_UNSET \
1999   (OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_SSE3_UNSET)
2000 #define OPTION_MASK_ISA_SSE3_UNSET \
2001   (OPTION_MASK_ISA_SSE3 \
2002    | OPTION_MASK_ISA_SSSE3_UNSET \
2003    | OPTION_MASK_ISA_SSE4A_UNSET )
2004 #define OPTION_MASK_ISA_SSSE3_UNSET \
2005   (OPTION_MASK_ISA_SSSE3 | OPTION_MASK_ISA_SSE4_1_UNSET)
2006 #define OPTION_MASK_ISA_SSE4_1_UNSET \
2007   (OPTION_MASK_ISA_SSE4_1 | OPTION_MASK_ISA_SSE4_2_UNSET)
2008 #define OPTION_MASK_ISA_SSE4_2_UNSET \
2009   (OPTION_MASK_ISA_SSE4_2 | OPTION_MASK_ISA_AVX_UNSET )
2010 #define OPTION_MASK_ISA_AVX_UNSET \
2011   (OPTION_MASK_ISA_AVX | OPTION_MASK_ISA_FMA_UNSET \
2012    | OPTION_MASK_ISA_FMA4_UNSET)
2013 #define OPTION_MASK_ISA_FMA_UNSET OPTION_MASK_ISA_FMA
2014
2015 /* SSE4 includes both SSE4.1 and SSE4.2.  -mno-sse4 should the same
2016    as -mno-sse4.1. */
2017 #define OPTION_MASK_ISA_SSE4_UNSET OPTION_MASK_ISA_SSE4_1_UNSET
2018
2019 #define OPTION_MASK_ISA_SSE4A_UNSET \
2020   (OPTION_MASK_ISA_SSE4A | OPTION_MASK_ISA_FMA4_UNSET)
2021
2022 #define OPTION_MASK_ISA_FMA4_UNSET \
2023   (OPTION_MASK_ISA_FMA4 | OPTION_MASK_ISA_XOP_UNSET)
2024 #define OPTION_MASK_ISA_XOP_UNSET OPTION_MASK_ISA_XOP
2025 #define OPTION_MASK_ISA_LWP_UNSET OPTION_MASK_ISA_LWP
2026
2027 #define OPTION_MASK_ISA_AES_UNSET OPTION_MASK_ISA_AES
2028 #define OPTION_MASK_ISA_PCLMUL_UNSET OPTION_MASK_ISA_PCLMUL
2029 #define OPTION_MASK_ISA_ABM_UNSET OPTION_MASK_ISA_ABM
2030 #define OPTION_MASK_ISA_POPCNT_UNSET OPTION_MASK_ISA_POPCNT
2031 #define OPTION_MASK_ISA_CX16_UNSET OPTION_MASK_ISA_CX16
2032 #define OPTION_MASK_ISA_SAHF_UNSET OPTION_MASK_ISA_SAHF
2033 #define OPTION_MASK_ISA_MOVBE_UNSET OPTION_MASK_ISA_MOVBE
2034 #define OPTION_MASK_ISA_CRC32_UNSET OPTION_MASK_ISA_CRC32
2035
2036 /* Vectorization library interface and handlers.  */
2037 tree (*ix86_veclib_handler)(enum built_in_function, tree, tree) = NULL;
2038 static tree ix86_veclibabi_svml (enum built_in_function, tree, tree);
2039 static tree ix86_veclibabi_acml (enum built_in_function, tree, tree);
2040
2041 /* Processor target table, indexed by processor number */
2042 struct ptt
2043 {
2044   const struct processor_costs *cost;           /* Processor costs */
2045   const int align_loop;                         /* Default alignments.  */
2046   const int align_loop_max_skip;
2047   const int align_jump;
2048   const int align_jump_max_skip;
2049   const int align_func;
2050 };
2051
2052 static const struct ptt processor_target_table[PROCESSOR_max] =
2053 {
2054   {&i386_cost, 4, 3, 4, 3, 4},
2055   {&i486_cost, 16, 15, 16, 15, 16},
2056   {&pentium_cost, 16, 7, 16, 7, 16},
2057   {&pentiumpro_cost, 16, 15, 16, 10, 16},
2058   {&geode_cost, 0, 0, 0, 0, 0},
2059   {&k6_cost, 32, 7, 32, 7, 32},
2060   {&athlon_cost, 16, 7, 16, 7, 16},
2061   {&pentium4_cost, 0, 0, 0, 0, 0},
2062   {&k8_cost, 16, 7, 16, 7, 16},
2063   {&nocona_cost, 0, 0, 0, 0, 0},
2064   {&core2_cost, 16, 10, 16, 10, 16},
2065   {&generic32_cost, 16, 7, 16, 7, 16},
2066   {&generic64_cost, 16, 10, 16, 10, 16},
2067   {&amdfam10_cost, 32, 24, 32, 7, 32},
2068   {&atom_cost, 16, 7, 16, 7, 16}
2069 };
2070
2071 static const char *const cpu_names[TARGET_CPU_DEFAULT_max] =
2072 {
2073   "generic",
2074   "i386",
2075   "i486",
2076   "pentium",
2077   "pentium-mmx",
2078   "pentiumpro",
2079   "pentium2",
2080   "pentium3",
2081   "pentium4",
2082   "pentium-m",
2083   "prescott",
2084   "nocona",
2085   "core2",
2086   "atom",
2087   "geode",
2088   "k6",
2089   "k6-2",
2090   "k6-3",
2091   "athlon",
2092   "athlon-4",
2093   "k8",
2094   "amdfam10"
2095 };
2096 \f
2097 /* Implement TARGET_HANDLE_OPTION.  */
2098
2099 static bool
2100 ix86_handle_option (size_t code, const char *arg ATTRIBUTE_UNUSED, int value)
2101 {
2102   switch (code)
2103     {
2104     case OPT_mmmx:
2105       if (value)
2106         {
2107           ix86_isa_flags |= OPTION_MASK_ISA_MMX_SET;
2108           ix86_isa_flags_explicit |= OPTION_MASK_ISA_MMX_SET;
2109         }
2110       else
2111         {
2112           ix86_isa_flags &= ~OPTION_MASK_ISA_MMX_UNSET;
2113           ix86_isa_flags_explicit |= OPTION_MASK_ISA_MMX_UNSET;
2114         }
2115       return true;
2116
2117     case OPT_m3dnow:
2118       if (value)
2119         {
2120           ix86_isa_flags |= OPTION_MASK_ISA_3DNOW_SET;
2121           ix86_isa_flags_explicit |= OPTION_MASK_ISA_3DNOW_SET;
2122         }
2123       else
2124         {
2125           ix86_isa_flags &= ~OPTION_MASK_ISA_3DNOW_UNSET;
2126           ix86_isa_flags_explicit |= OPTION_MASK_ISA_3DNOW_UNSET;
2127         }
2128       return true;
2129
2130     case OPT_m3dnowa:
2131       return false;
2132
2133     case OPT_msse:
2134       if (value)
2135         {
2136           ix86_isa_flags |= OPTION_MASK_ISA_SSE_SET;
2137           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE_SET;
2138         }
2139       else
2140         {
2141           ix86_isa_flags &= ~OPTION_MASK_ISA_SSE_UNSET;
2142           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE_UNSET;
2143         }
2144       return true;
2145
2146     case OPT_msse2:
2147       if (value)
2148         {
2149           ix86_isa_flags |= OPTION_MASK_ISA_SSE2_SET;
2150           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE2_SET;
2151         }
2152       else
2153         {
2154           ix86_isa_flags &= ~OPTION_MASK_ISA_SSE2_UNSET;
2155           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE2_UNSET;
2156         }
2157       return true;
2158
2159     case OPT_msse3:
2160       if (value)
2161         {
2162           ix86_isa_flags |= OPTION_MASK_ISA_SSE3_SET;
2163           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE3_SET;
2164         }
2165       else
2166         {
2167           ix86_isa_flags &= ~OPTION_MASK_ISA_SSE3_UNSET;
2168           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE3_UNSET;
2169         }
2170       return true;
2171
2172     case OPT_mssse3:
2173       if (value)
2174         {
2175           ix86_isa_flags |= OPTION_MASK_ISA_SSSE3_SET;
2176           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSSE3_SET;
2177         }
2178       else
2179         {
2180           ix86_isa_flags &= ~OPTION_MASK_ISA_SSSE3_UNSET;
2181           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSSE3_UNSET;
2182         }
2183       return true;
2184
2185     case OPT_msse4_1:
2186       if (value)
2187         {
2188           ix86_isa_flags |= OPTION_MASK_ISA_SSE4_1_SET;
2189           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_1_SET;
2190         }
2191       else
2192         {
2193           ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4_1_UNSET;
2194           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_1_UNSET;
2195         }
2196       return true;
2197
2198     case OPT_msse4_2:
2199       if (value)
2200         {
2201           ix86_isa_flags |= OPTION_MASK_ISA_SSE4_2_SET;
2202           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_2_SET;
2203         }
2204       else
2205         {
2206           ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4_2_UNSET;
2207           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_2_UNSET;
2208         }
2209       return true;
2210
2211     case OPT_mavx:
2212       if (value)
2213         {
2214           ix86_isa_flags |= OPTION_MASK_ISA_AVX_SET;
2215           ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX_SET;
2216         }
2217       else
2218         {
2219           ix86_isa_flags &= ~OPTION_MASK_ISA_AVX_UNSET;
2220           ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX_UNSET;
2221         }
2222       return true;
2223
2224     case OPT_mfma:
2225       if (value)
2226         {
2227           ix86_isa_flags |= OPTION_MASK_ISA_FMA_SET;
2228           ix86_isa_flags_explicit |= OPTION_MASK_ISA_FMA_SET;
2229         }
2230       else
2231         {
2232           ix86_isa_flags &= ~OPTION_MASK_ISA_FMA_UNSET;
2233           ix86_isa_flags_explicit |= OPTION_MASK_ISA_FMA_UNSET;
2234         }
2235       return true;
2236
2237     case OPT_msse4:
2238       ix86_isa_flags |= OPTION_MASK_ISA_SSE4_SET;
2239       ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_SET;
2240       return true;
2241
2242     case OPT_mno_sse4:
2243       ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4_UNSET;
2244       ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_UNSET;
2245       return true;
2246
2247     case OPT_msse4a:
2248       if (value)
2249         {
2250           ix86_isa_flags |= OPTION_MASK_ISA_SSE4A_SET;
2251           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4A_SET;
2252         }
2253       else
2254         {
2255           ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4A_UNSET;
2256           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4A_UNSET;
2257         }
2258       return true;
2259
2260     case OPT_mfma4:
2261       if (value)
2262         {
2263           ix86_isa_flags |= OPTION_MASK_ISA_FMA4_SET;
2264           ix86_isa_flags_explicit |= OPTION_MASK_ISA_FMA4_SET;
2265         }
2266       else
2267         {
2268           ix86_isa_flags &= ~OPTION_MASK_ISA_FMA4_UNSET;
2269           ix86_isa_flags_explicit |= OPTION_MASK_ISA_FMA4_UNSET;
2270         }
2271       return true;
2272
2273    case OPT_mxop:
2274       if (value)
2275         {
2276           ix86_isa_flags |= OPTION_MASK_ISA_XOP_SET;
2277           ix86_isa_flags_explicit |= OPTION_MASK_ISA_XOP_SET;
2278         }
2279       else
2280         {
2281           ix86_isa_flags &= ~OPTION_MASK_ISA_XOP_UNSET;
2282           ix86_isa_flags_explicit |= OPTION_MASK_ISA_XOP_UNSET;
2283         }
2284       return true;
2285
2286    case OPT_mlwp:
2287       if (value)
2288         {
2289           ix86_isa_flags |= OPTION_MASK_ISA_LWP_SET;
2290           ix86_isa_flags_explicit |= OPTION_MASK_ISA_LWP_SET;
2291         }
2292       else
2293         {
2294           ix86_isa_flags &= ~OPTION_MASK_ISA_LWP_UNSET;
2295           ix86_isa_flags_explicit |= OPTION_MASK_ISA_LWP_UNSET;
2296         }
2297       return true;
2298
2299     case OPT_mabm:
2300       if (value)
2301         {
2302           ix86_isa_flags |= OPTION_MASK_ISA_ABM_SET;
2303           ix86_isa_flags_explicit |= OPTION_MASK_ISA_ABM_SET;
2304         }
2305       else
2306         {
2307           ix86_isa_flags &= ~OPTION_MASK_ISA_ABM_UNSET;
2308           ix86_isa_flags_explicit |= OPTION_MASK_ISA_ABM_UNSET;
2309         }
2310       return true;
2311
2312     case OPT_mpopcnt:
2313       if (value)
2314         {
2315           ix86_isa_flags |= OPTION_MASK_ISA_POPCNT_SET;
2316           ix86_isa_flags_explicit |= OPTION_MASK_ISA_POPCNT_SET;
2317         }
2318       else
2319         {
2320           ix86_isa_flags &= ~OPTION_MASK_ISA_POPCNT_UNSET;
2321           ix86_isa_flags_explicit |= OPTION_MASK_ISA_POPCNT_UNSET;
2322         }
2323       return true;
2324
2325     case OPT_msahf:
2326       if (value)
2327         {
2328           ix86_isa_flags |= OPTION_MASK_ISA_SAHF_SET;
2329           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SAHF_SET;
2330         }
2331       else
2332         {
2333           ix86_isa_flags &= ~OPTION_MASK_ISA_SAHF_UNSET;
2334           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SAHF_UNSET;
2335         }
2336       return true;
2337
2338     case OPT_mcx16:
2339       if (value)
2340         {
2341           ix86_isa_flags |= OPTION_MASK_ISA_CX16_SET;
2342           ix86_isa_flags_explicit |= OPTION_MASK_ISA_CX16_SET;
2343         }
2344       else
2345         {
2346           ix86_isa_flags &= ~OPTION_MASK_ISA_CX16_UNSET;
2347           ix86_isa_flags_explicit |= OPTION_MASK_ISA_CX16_UNSET;
2348         }
2349       return true;
2350
2351     case OPT_mmovbe:
2352       if (value)
2353         {
2354           ix86_isa_flags |= OPTION_MASK_ISA_MOVBE_SET;
2355           ix86_isa_flags_explicit |= OPTION_MASK_ISA_MOVBE_SET;
2356         }
2357       else
2358         {
2359           ix86_isa_flags &= ~OPTION_MASK_ISA_MOVBE_UNSET;
2360           ix86_isa_flags_explicit |= OPTION_MASK_ISA_MOVBE_UNSET;
2361         }
2362       return true;
2363
2364     case OPT_mcrc32:
2365       if (value)
2366         {
2367           ix86_isa_flags |= OPTION_MASK_ISA_CRC32_SET;
2368           ix86_isa_flags_explicit |= OPTION_MASK_ISA_CRC32_SET;
2369         }
2370       else
2371         {
2372           ix86_isa_flags &= ~OPTION_MASK_ISA_CRC32_UNSET;
2373           ix86_isa_flags_explicit |= OPTION_MASK_ISA_CRC32_UNSET;
2374         }
2375       return true;
2376
2377     case OPT_maes:
2378       if (value)
2379         {
2380           ix86_isa_flags |= OPTION_MASK_ISA_AES_SET;
2381           ix86_isa_flags_explicit |= OPTION_MASK_ISA_AES_SET;
2382         }
2383       else
2384         {
2385           ix86_isa_flags &= ~OPTION_MASK_ISA_AES_UNSET;
2386           ix86_isa_flags_explicit |= OPTION_MASK_ISA_AES_UNSET;
2387         }
2388       return true;
2389
2390     case OPT_mpclmul:
2391       if (value)
2392         {
2393           ix86_isa_flags |= OPTION_MASK_ISA_PCLMUL_SET;
2394           ix86_isa_flags_explicit |= OPTION_MASK_ISA_PCLMUL_SET;
2395         }
2396       else
2397         {
2398           ix86_isa_flags &= ~OPTION_MASK_ISA_PCLMUL_UNSET;
2399           ix86_isa_flags_explicit |= OPTION_MASK_ISA_PCLMUL_UNSET;
2400         }
2401       return true;
2402
2403     default:
2404       return true;
2405     }
2406 }
2407 \f
2408 /* Return a string the documents the current -m options.  The caller is
2409    responsible for freeing the string.  */
2410
2411 static char *
2412 ix86_target_string (int isa, int flags, const char *arch, const char *tune,
2413                     const char *fpmath, bool add_nl_p)
2414 {
2415   struct ix86_target_opts
2416   {
2417     const char *option;         /* option string */
2418     int mask;                   /* isa mask options */
2419   };
2420
2421   /* This table is ordered so that options like -msse4.2 that imply
2422      preceding options while match those first.  */
2423   static struct ix86_target_opts isa_opts[] =
2424   {
2425     { "-m64",           OPTION_MASK_ISA_64BIT },
2426     { "-mfma4",         OPTION_MASK_ISA_FMA4 },
2427     { "-mxop",          OPTION_MASK_ISA_XOP },
2428     { "-mlwp",          OPTION_MASK_ISA_LWP },
2429     { "-msse4a",        OPTION_MASK_ISA_SSE4A },
2430     { "-msse4.2",       OPTION_MASK_ISA_SSE4_2 },
2431     { "-msse4.1",       OPTION_MASK_ISA_SSE4_1 },
2432     { "-mssse3",        OPTION_MASK_ISA_SSSE3 },
2433     { "-msse3",         OPTION_MASK_ISA_SSE3 },
2434     { "-msse2",         OPTION_MASK_ISA_SSE2 },
2435     { "-msse",          OPTION_MASK_ISA_SSE },
2436     { "-m3dnow",        OPTION_MASK_ISA_3DNOW },
2437     { "-m3dnowa",       OPTION_MASK_ISA_3DNOW_A },
2438     { "-mmmx",          OPTION_MASK_ISA_MMX },
2439     { "-mabm",          OPTION_MASK_ISA_ABM },
2440     { "-mpopcnt",       OPTION_MASK_ISA_POPCNT },
2441     { "-mmovbe",        OPTION_MASK_ISA_MOVBE },
2442     { "-mcrc32",        OPTION_MASK_ISA_CRC32 },
2443     { "-maes",          OPTION_MASK_ISA_AES },
2444     { "-mpclmul",       OPTION_MASK_ISA_PCLMUL },
2445   };
2446
2447   /* Flag options.  */
2448   static struct ix86_target_opts flag_opts[] =
2449   {
2450     { "-m128bit-long-double",           MASK_128BIT_LONG_DOUBLE },
2451     { "-m80387",                        MASK_80387 },
2452     { "-maccumulate-outgoing-args",     MASK_ACCUMULATE_OUTGOING_ARGS },
2453     { "-malign-double",                 MASK_ALIGN_DOUBLE },
2454     { "-mcld",                          MASK_CLD },
2455     { "-mfp-ret-in-387",                MASK_FLOAT_RETURNS },
2456     { "-mieee-fp",                      MASK_IEEE_FP },
2457     { "-minline-all-stringops",         MASK_INLINE_ALL_STRINGOPS },
2458     { "-minline-stringops-dynamically", MASK_INLINE_STRINGOPS_DYNAMICALLY },
2459     { "-mms-bitfields",                 MASK_MS_BITFIELD_LAYOUT },
2460     { "-mno-align-stringops",           MASK_NO_ALIGN_STRINGOPS },
2461     { "-mno-fancy-math-387",            MASK_NO_FANCY_MATH_387 },
2462     { "-mno-push-args",                 MASK_NO_PUSH_ARGS },
2463     { "-mno-red-zone",                  MASK_NO_RED_ZONE },
2464     { "-momit-leaf-frame-pointer",      MASK_OMIT_LEAF_FRAME_POINTER },
2465     { "-mrecip",                        MASK_RECIP },
2466     { "-mrtd",                          MASK_RTD },
2467     { "-msseregparm",                   MASK_SSEREGPARM },
2468     { "-mstack-arg-probe",              MASK_STACK_PROBE },
2469     { "-mtls-direct-seg-refs",          MASK_TLS_DIRECT_SEG_REFS },
2470   };
2471
2472   const char *opts[ARRAY_SIZE (isa_opts) + ARRAY_SIZE (flag_opts) + 6][2];
2473
2474   char isa_other[40];
2475   char target_other[40];
2476   unsigned num = 0;
2477   unsigned i, j;
2478   char *ret;
2479   char *ptr;
2480   size_t len;
2481   size_t line_len;
2482   size_t sep_len;
2483
2484   memset (opts, '\0', sizeof (opts));
2485
2486   /* Add -march= option.  */
2487   if (arch)
2488     {
2489       opts[num][0] = "-march=";
2490       opts[num++][1] = arch;
2491     }
2492
2493   /* Add -mtune= option.  */
2494   if (tune)
2495     {
2496       opts[num][0] = "-mtune=";
2497       opts[num++][1] = tune;
2498     }
2499
2500   /* Pick out the options in isa options.  */
2501   for (i = 0; i < ARRAY_SIZE (isa_opts); i++)
2502     {
2503       if ((isa & isa_opts[i].mask) != 0)
2504         {
2505           opts[num++][0] = isa_opts[i].option;
2506           isa &= ~ isa_opts[i].mask;
2507         }
2508     }
2509
2510   if (isa && add_nl_p)
2511     {
2512       opts[num++][0] = isa_other;
2513       sprintf (isa_other, "(other isa: 0x%x)", isa);
2514     }
2515
2516   /* Add flag options.  */
2517   for (i = 0; i < ARRAY_SIZE (flag_opts); i++)
2518     {
2519       if ((flags & flag_opts[i].mask) != 0)
2520         {
2521           opts[num++][0] = flag_opts[i].option;
2522           flags &= ~ flag_opts[i].mask;
2523         }
2524     }
2525
2526   if (flags && add_nl_p)
2527     {
2528       opts[num++][0] = target_other;
2529       sprintf (target_other, "(other flags: 0x%x)", isa);
2530     }
2531
2532   /* Add -fpmath= option.  */
2533   if (fpmath)
2534     {
2535       opts[num][0] = "-mfpmath=";
2536       opts[num++][1] = fpmath;
2537     }
2538
2539   /* Any options?  */
2540   if (num == 0)
2541     return NULL;
2542
2543   gcc_assert (num < ARRAY_SIZE (opts));
2544
2545   /* Size the string.  */
2546   len = 0;
2547   sep_len = (add_nl_p) ? 3 : 1;
2548   for (i = 0; i < num; i++)
2549     {
2550       len += sep_len;
2551       for (j = 0; j < 2; j++)
2552         if (opts[i][j])
2553           len += strlen (opts[i][j]);
2554     }
2555
2556   /* Build the string.  */
2557   ret = ptr = (char *) xmalloc (len);
2558   line_len = 0;
2559
2560   for (i = 0; i < num; i++)
2561     {
2562       size_t len2[2];
2563
2564       for (j = 0; j < 2; j++)
2565         len2[j] = (opts[i][j]) ? strlen (opts[i][j]) : 0;
2566
2567       if (i != 0)
2568         {
2569           *ptr++ = ' ';
2570           line_len++;
2571
2572           if (add_nl_p && line_len + len2[0] + len2[1] > 70)
2573             {
2574               *ptr++ = '\\';
2575               *ptr++ = '\n';
2576               line_len = 0;
2577             }
2578         }
2579
2580       for (j = 0; j < 2; j++)
2581         if (opts[i][j])
2582           {
2583             memcpy (ptr, opts[i][j], len2[j]);
2584             ptr += len2[j];
2585             line_len += len2[j];
2586           }
2587     }
2588
2589   *ptr = '\0';
2590   gcc_assert (ret + len >= ptr);
2591
2592   return ret;
2593 }
2594
2595 /* Function that is callable from the debugger to print the current
2596    options.  */
2597 void
2598 ix86_debug_options (void)
2599 {
2600   char *opts = ix86_target_string (ix86_isa_flags, target_flags,
2601                                    ix86_arch_string, ix86_tune_string,
2602                                    ix86_fpmath_string, true);
2603
2604   if (opts)
2605     {
2606       fprintf (stderr, "%s\n\n", opts);
2607       free (opts);
2608     }
2609   else
2610     fputs ("<no options>\n\n", stderr);
2611
2612   return;
2613 }
2614 \f
2615 /* Sometimes certain combinations of command options do not make
2616    sense on a particular target machine.  You can define a macro
2617    `OVERRIDE_OPTIONS' to take account of this.  This macro, if
2618    defined, is executed once just after all the command options have
2619    been parsed.
2620
2621    Don't use this macro to turn on various extra optimizations for
2622    `-O'.  That is what `OPTIMIZATION_OPTIONS' is for.  */
2623
2624 void
2625 override_options (bool main_args_p)
2626 {
2627   int i;
2628   unsigned int ix86_arch_mask, ix86_tune_mask;
2629   const char *prefix;
2630   const char *suffix;
2631   const char *sw;
2632
2633   /* Comes from final.c -- no real reason to change it.  */
2634 #define MAX_CODE_ALIGN 16
2635
2636   enum pta_flags
2637     {
2638       PTA_SSE = 1 << 0,
2639       PTA_SSE2 = 1 << 1,
2640       PTA_SSE3 = 1 << 2,
2641       PTA_MMX = 1 << 3,
2642       PTA_PREFETCH_SSE = 1 << 4,
2643       PTA_3DNOW = 1 << 5,
2644       PTA_3DNOW_A = 1 << 6,
2645       PTA_64BIT = 1 << 7,
2646       PTA_SSSE3 = 1 << 8,
2647       PTA_CX16 = 1 << 9,
2648       PTA_POPCNT = 1 << 10,
2649       PTA_ABM = 1 << 11,
2650       PTA_SSE4A = 1 << 12,
2651       PTA_NO_SAHF = 1 << 13,
2652       PTA_SSE4_1 = 1 << 14,
2653       PTA_SSE4_2 = 1 << 15,
2654       PTA_AES = 1 << 16,
2655       PTA_PCLMUL = 1 << 17,
2656       PTA_AVX = 1 << 18,
2657       PTA_FMA = 1 << 19,
2658       PTA_MOVBE = 1 << 20,
2659       PTA_FMA4 = 1 << 21,
2660       PTA_XOP = 1 << 22,
2661       PTA_LWP = 1 << 23
2662     };
2663
2664   static struct pta
2665     {
2666       const char *const name;           /* processor name or nickname.  */
2667       const enum processor_type processor;
2668       const enum attr_cpu schedule;
2669       const unsigned /*enum pta_flags*/ flags;
2670     }
2671   const processor_alias_table[] =
2672     {
2673       {"i386", PROCESSOR_I386, CPU_NONE, 0},
2674       {"i486", PROCESSOR_I486, CPU_NONE, 0},
2675       {"i586", PROCESSOR_PENTIUM, CPU_PENTIUM, 0},
2676       {"pentium", PROCESSOR_PENTIUM, CPU_PENTIUM, 0},
2677       {"pentium-mmx", PROCESSOR_PENTIUM, CPU_PENTIUM, PTA_MMX},
2678       {"winchip-c6", PROCESSOR_I486, CPU_NONE, PTA_MMX},
2679       {"winchip2", PROCESSOR_I486, CPU_NONE, PTA_MMX | PTA_3DNOW},
2680       {"c3", PROCESSOR_I486, CPU_NONE, PTA_MMX | PTA_3DNOW},
2681       {"c3-2", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO, PTA_MMX | PTA_SSE},
2682       {"i686", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO, 0},
2683       {"pentiumpro", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO, 0},
2684       {"pentium2", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO, PTA_MMX},
2685       {"pentium3", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO,
2686         PTA_MMX | PTA_SSE},
2687       {"pentium3m", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO,
2688         PTA_MMX | PTA_SSE},
2689       {"pentium-m", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO,
2690         PTA_MMX | PTA_SSE | PTA_SSE2},
2691       {"pentium4", PROCESSOR_PENTIUM4, CPU_NONE,
2692         PTA_MMX |PTA_SSE | PTA_SSE2},
2693       {"pentium4m", PROCESSOR_PENTIUM4, CPU_NONE,
2694         PTA_MMX | PTA_SSE | PTA_SSE2},
2695       {"prescott", PROCESSOR_NOCONA, CPU_NONE,
2696         PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3},
2697       {"nocona", PROCESSOR_NOCONA, CPU_NONE,
2698         PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
2699         | PTA_CX16 | PTA_NO_SAHF},
2700       {"core2", PROCESSOR_CORE2, CPU_CORE2,
2701         PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
2702         | PTA_SSSE3 | PTA_CX16},
2703       {"atom", PROCESSOR_ATOM, CPU_ATOM,
2704         PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
2705         | PTA_SSSE3 | PTA_CX16 | PTA_MOVBE},
2706       {"geode", PROCESSOR_GEODE, CPU_GEODE,
2707         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A |PTA_PREFETCH_SSE},
2708       {"k6", PROCESSOR_K6, CPU_K6, PTA_MMX},
2709       {"k6-2", PROCESSOR_K6, CPU_K6, PTA_MMX | PTA_3DNOW},
2710       {"k6-3", PROCESSOR_K6, CPU_K6, PTA_MMX | PTA_3DNOW},
2711       {"athlon", PROCESSOR_ATHLON, CPU_ATHLON,
2712         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_PREFETCH_SSE},
2713       {"athlon-tbird", PROCESSOR_ATHLON, CPU_ATHLON,
2714         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_PREFETCH_SSE},
2715       {"athlon-4", PROCESSOR_ATHLON, CPU_ATHLON,
2716         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE},
2717       {"athlon-xp", PROCESSOR_ATHLON, CPU_ATHLON,
2718         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE},
2719       {"athlon-mp", PROCESSOR_ATHLON, CPU_ATHLON,
2720         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE},
2721       {"x86-64", PROCESSOR_K8, CPU_K8,
2722         PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_NO_SAHF},
2723       {"k8", PROCESSOR_K8, CPU_K8,
2724         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2725         | PTA_SSE2 | PTA_NO_SAHF},
2726       {"k8-sse3", PROCESSOR_K8, CPU_K8,
2727         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2728         | PTA_SSE2 | PTA_SSE3 | PTA_NO_SAHF},
2729       {"opteron", PROCESSOR_K8, CPU_K8,
2730         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2731         | PTA_SSE2 | PTA_NO_SAHF},
2732       {"opteron-sse3", PROCESSOR_K8, CPU_K8,
2733         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2734         | PTA_SSE2 | PTA_SSE3 | PTA_NO_SAHF},
2735       {"athlon64", PROCESSOR_K8, CPU_K8,
2736         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2737         | PTA_SSE2 | PTA_NO_SAHF},
2738       {"athlon64-sse3", PROCESSOR_K8, CPU_K8,
2739         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2740         | PTA_SSE2 | PTA_SSE3 | PTA_NO_SAHF},
2741       {"athlon-fx", PROCESSOR_K8, CPU_K8,
2742         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2743         | PTA_SSE2 | PTA_NO_SAHF},
2744       {"amdfam10", PROCESSOR_AMDFAM10, CPU_AMDFAM10,
2745         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2746         | PTA_SSE2 | PTA_SSE3 | PTA_SSE4A | PTA_CX16 | PTA_ABM},
2747       {"barcelona", PROCESSOR_AMDFAM10, CPU_AMDFAM10,
2748         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2749         | PTA_SSE2 | PTA_SSE3 | PTA_SSE4A | PTA_CX16 | PTA_ABM},
2750       {"generic32", PROCESSOR_GENERIC32, CPU_PENTIUMPRO,
2751         0 /* flags are only used for -march switch.  */ },
2752       {"generic64", PROCESSOR_GENERIC64, CPU_GENERIC64,
2753         PTA_64BIT /* flags are only used for -march switch.  */ },
2754     };
2755
2756   int const pta_size = ARRAY_SIZE (processor_alias_table);
2757
2758   /* Set up prefix/suffix so the error messages refer to either the command
2759      line argument, or the attribute(target).  */
2760   if (main_args_p)
2761     {
2762       prefix = "-m";
2763       suffix = "";
2764       sw = "switch";
2765     }
2766   else
2767     {
2768       prefix = "option(\"";
2769       suffix = "\")";
2770       sw = "attribute";
2771     }
2772
2773 #ifdef SUBTARGET_OVERRIDE_OPTIONS
2774   SUBTARGET_OVERRIDE_OPTIONS;
2775 #endif
2776
2777 #ifdef SUBSUBTARGET_OVERRIDE_OPTIONS
2778   SUBSUBTARGET_OVERRIDE_OPTIONS;
2779 #endif
2780
2781   /* -fPIC is the default for x86_64.  */
2782   if (TARGET_MACHO && TARGET_64BIT)
2783     flag_pic = 2;
2784
2785   /* Set the default values for switches whose default depends on TARGET_64BIT
2786      in case they weren't overwritten by command line options.  */
2787   if (TARGET_64BIT)
2788     {
2789       /* Mach-O doesn't support omitting the frame pointer for now.  */
2790       if (flag_omit_frame_pointer == 2)
2791         flag_omit_frame_pointer = (TARGET_MACHO ? 0 : 1);
2792       if (flag_asynchronous_unwind_tables == 2)
2793         flag_asynchronous_unwind_tables = 1;
2794       if (flag_pcc_struct_return == 2)
2795         flag_pcc_struct_return = 0;
2796     }
2797   else
2798     {
2799       if (flag_omit_frame_pointer == 2)
2800         flag_omit_frame_pointer = 0;
2801       if (flag_asynchronous_unwind_tables == 2)
2802         flag_asynchronous_unwind_tables = 0;
2803       if (flag_pcc_struct_return == 2)
2804         flag_pcc_struct_return = DEFAULT_PCC_STRUCT_RETURN;
2805     }
2806
2807   /* Need to check -mtune=generic first.  */
2808   if (ix86_tune_string)
2809     {
2810       if (!strcmp (ix86_tune_string, "generic")
2811           || !strcmp (ix86_tune_string, "i686")
2812           /* As special support for cross compilers we read -mtune=native
2813              as -mtune=generic.  With native compilers we won't see the
2814              -mtune=native, as it was changed by the driver.  */
2815           || !strcmp (ix86_tune_string, "native"))
2816         {
2817           if (TARGET_64BIT)
2818             ix86_tune_string = "generic64";
2819           else
2820             ix86_tune_string = "generic32";
2821         }
2822       /* If this call is for setting the option attribute, allow the
2823          generic32/generic64 that was previously set.  */
2824       else if (!main_args_p
2825                && (!strcmp (ix86_tune_string, "generic32")
2826                    || !strcmp (ix86_tune_string, "generic64")))
2827         ;
2828       else if (!strncmp (ix86_tune_string, "generic", 7))
2829         error ("bad value (%s) for %stune=%s %s",
2830                ix86_tune_string, prefix, suffix, sw);
2831     }
2832   else
2833     {
2834       if (ix86_arch_string)
2835         ix86_tune_string = ix86_arch_string;
2836       if (!ix86_tune_string)
2837         {
2838           ix86_tune_string = cpu_names[TARGET_CPU_DEFAULT];
2839           ix86_tune_defaulted = 1;
2840         }
2841
2842       /* ix86_tune_string is set to ix86_arch_string or defaulted.  We
2843          need to use a sensible tune option.  */
2844       if (!strcmp (ix86_tune_string, "generic")
2845           || !strcmp (ix86_tune_string, "x86-64")
2846           || !strcmp (ix86_tune_string, "i686"))
2847         {
2848           if (TARGET_64BIT)
2849             ix86_tune_string = "generic64";
2850           else
2851             ix86_tune_string = "generic32";
2852         }
2853     }
2854   if (ix86_stringop_string)
2855     {
2856       if (!strcmp (ix86_stringop_string, "rep_byte"))
2857         stringop_alg = rep_prefix_1_byte;
2858       else if (!strcmp (ix86_stringop_string, "libcall"))
2859         stringop_alg = libcall;
2860       else if (!strcmp (ix86_stringop_string, "rep_4byte"))
2861         stringop_alg = rep_prefix_4_byte;
2862       else if (!strcmp (ix86_stringop_string, "rep_8byte")
2863                && TARGET_64BIT)
2864         /* rep; movq isn't available in 32-bit code.  */
2865         stringop_alg = rep_prefix_8_byte;
2866       else if (!strcmp (ix86_stringop_string, "byte_loop"))
2867         stringop_alg = loop_1_byte;
2868       else if (!strcmp (ix86_stringop_string, "loop"))
2869         stringop_alg = loop;
2870       else if (!strcmp (ix86_stringop_string, "unrolled_loop"))
2871         stringop_alg = unrolled_loop;
2872       else
2873         error ("bad value (%s) for %sstringop-strategy=%s %s",
2874                ix86_stringop_string, prefix, suffix, sw);
2875     }
2876   if (!strcmp (ix86_tune_string, "x86-64"))
2877     warning (OPT_Wdeprecated, "%stune=x86-64%s is deprecated.  Use "
2878              "%stune=k8%s or %stune=generic%s instead as appropriate.",
2879              prefix, suffix, prefix, suffix, prefix, suffix);
2880
2881   if (!ix86_arch_string)
2882     ix86_arch_string = TARGET_64BIT ? "x86-64" : "i386";
2883   else
2884     ix86_arch_specified = 1;
2885
2886   if (!strcmp (ix86_arch_string, "generic"))
2887     error ("generic CPU can be used only for %stune=%s %s",
2888            prefix, suffix, sw);
2889   if (!strncmp (ix86_arch_string, "generic", 7))
2890     error ("bad value (%s) for %sarch=%s %s",
2891            ix86_arch_string, prefix, suffix, sw);
2892
2893   /* Validate -mabi= value.  */
2894   if (ix86_abi_string)
2895     {
2896       if (strcmp (ix86_abi_string, "sysv") == 0)
2897         ix86_abi = SYSV_ABI;
2898       else if (strcmp (ix86_abi_string, "ms") == 0)
2899         ix86_abi = MS_ABI;
2900       else
2901         error ("unknown ABI (%s) for %sabi=%s %s",
2902                ix86_abi_string, prefix, suffix, sw);
2903     }
2904   else
2905     ix86_abi = DEFAULT_ABI;
2906
2907   if (ix86_cmodel_string != 0)
2908     {
2909       if (!strcmp (ix86_cmodel_string, "small"))
2910         ix86_cmodel = flag_pic ? CM_SMALL_PIC : CM_SMALL;
2911       else if (!strcmp (ix86_cmodel_string, "medium"))
2912         ix86_cmodel = flag_pic ? CM_MEDIUM_PIC : CM_MEDIUM;
2913       else if (!strcmp (ix86_cmodel_string, "large"))
2914         ix86_cmodel = flag_pic ? CM_LARGE_PIC : CM_LARGE;
2915       else if (flag_pic)
2916         error ("code model %s does not support PIC mode", ix86_cmodel_string);
2917       else if (!strcmp (ix86_cmodel_string, "32"))
2918         ix86_cmodel = CM_32;
2919       else if (!strcmp (ix86_cmodel_string, "kernel") && !flag_pic)
2920         ix86_cmodel = CM_KERNEL;
2921       else
2922         error ("bad value (%s) for %scmodel=%s %s",
2923                ix86_cmodel_string, prefix, suffix, sw);
2924     }
2925   else
2926     {
2927       /* For TARGET_64BIT and MS_ABI, force pic on, in order to enable the
2928          use of rip-relative addressing.  This eliminates fixups that
2929          would otherwise be needed if this object is to be placed in a
2930          DLL, and is essentially just as efficient as direct addressing.  */
2931       if (TARGET_64BIT && DEFAULT_ABI == MS_ABI)
2932         ix86_cmodel = CM_SMALL_PIC, flag_pic = 1;
2933       else if (TARGET_64BIT)
2934         ix86_cmodel = flag_pic ? CM_SMALL_PIC : CM_SMALL;
2935       else
2936         ix86_cmodel = CM_32;
2937     }
2938   if (ix86_asm_string != 0)
2939     {
2940       if (! TARGET_MACHO
2941           && !strcmp (ix86_asm_string, "intel"))
2942         ix86_asm_dialect = ASM_INTEL;
2943       else if (!strcmp (ix86_asm_string, "att"))
2944         ix86_asm_dialect = ASM_ATT;
2945       else
2946         error ("bad value (%s) for %sasm=%s %s",
2947                ix86_asm_string, prefix, suffix, sw);
2948     }
2949   if ((TARGET_64BIT == 0) != (ix86_cmodel == CM_32))
2950     error ("code model %qs not supported in the %s bit mode",
2951            ix86_cmodel_string, TARGET_64BIT ? "64" : "32");
2952   if ((TARGET_64BIT != 0) != ((ix86_isa_flags & OPTION_MASK_ISA_64BIT) != 0))
2953     sorry ("%i-bit mode not compiled in",
2954            (ix86_isa_flags & OPTION_MASK_ISA_64BIT) ? 64 : 32);
2955
2956   for (i = 0; i < pta_size; i++)
2957     if (! strcmp (ix86_arch_string, processor_alias_table[i].name))
2958       {
2959         ix86_schedule = processor_alias_table[i].schedule;
2960         ix86_arch = processor_alias_table[i].processor;
2961         /* Default cpu tuning to the architecture.  */
2962         ix86_tune = ix86_arch;
2963
2964         if (TARGET_64BIT && !(processor_alias_table[i].flags & PTA_64BIT))
2965           error ("CPU you selected does not support x86-64 "
2966                  "instruction set");
2967
2968         if (processor_alias_table[i].flags & PTA_MMX
2969             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_MMX))
2970           ix86_isa_flags |= OPTION_MASK_ISA_MMX;
2971         if (processor_alias_table[i].flags & PTA_3DNOW
2972             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_3DNOW))
2973           ix86_isa_flags |= OPTION_MASK_ISA_3DNOW;
2974         if (processor_alias_table[i].flags & PTA_3DNOW_A
2975             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_3DNOW_A))
2976           ix86_isa_flags |= OPTION_MASK_ISA_3DNOW_A;
2977         if (processor_alias_table[i].flags & PTA_SSE
2978             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE))
2979           ix86_isa_flags |= OPTION_MASK_ISA_SSE;
2980         if (processor_alias_table[i].flags & PTA_SSE2
2981             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE2))
2982           ix86_isa_flags |= OPTION_MASK_ISA_SSE2;
2983         if (processor_alias_table[i].flags & PTA_SSE3
2984             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE3))
2985           ix86_isa_flags |= OPTION_MASK_ISA_SSE3;
2986         if (processor_alias_table[i].flags & PTA_SSSE3
2987             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSSE3))
2988           ix86_isa_flags |= OPTION_MASK_ISA_SSSE3;
2989         if (processor_alias_table[i].flags & PTA_SSE4_1
2990             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE4_1))
2991           ix86_isa_flags |= OPTION_MASK_ISA_SSE4_1;
2992         if (processor_alias_table[i].flags & PTA_SSE4_2
2993             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE4_2))
2994           ix86_isa_flags |= OPTION_MASK_ISA_SSE4_2;
2995         if (processor_alias_table[i].flags & PTA_AVX
2996             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_AVX))
2997           ix86_isa_flags |= OPTION_MASK_ISA_AVX;
2998         if (processor_alias_table[i].flags & PTA_FMA
2999             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_FMA))
3000           ix86_isa_flags |= OPTION_MASK_ISA_FMA;
3001         if (processor_alias_table[i].flags & PTA_SSE4A
3002             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE4A))
3003           ix86_isa_flags |= OPTION_MASK_ISA_SSE4A;
3004         if (processor_alias_table[i].flags & PTA_FMA4
3005             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_FMA4))
3006           ix86_isa_flags |= OPTION_MASK_ISA_FMA4;
3007         if (processor_alias_table[i].flags & PTA_XOP
3008             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_XOP))
3009           ix86_isa_flags |= OPTION_MASK_ISA_XOP;
3010         if (processor_alias_table[i].flags & PTA_LWP
3011             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_LWP))
3012           ix86_isa_flags |= OPTION_MASK_ISA_LWP;
3013         if (processor_alias_table[i].flags & PTA_ABM
3014             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_ABM))
3015           ix86_isa_flags |= OPTION_MASK_ISA_ABM;
3016         if (processor_alias_table[i].flags & PTA_CX16
3017             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_CX16))
3018           ix86_isa_flags |= OPTION_MASK_ISA_CX16;
3019         if (processor_alias_table[i].flags & (PTA_POPCNT | PTA_ABM)
3020             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_POPCNT))
3021           ix86_isa_flags |= OPTION_MASK_ISA_POPCNT;
3022         if (!(TARGET_64BIT && (processor_alias_table[i].flags & PTA_NO_SAHF))
3023             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SAHF))
3024           ix86_isa_flags |= OPTION_MASK_ISA_SAHF;
3025         if (processor_alias_table[i].flags & PTA_MOVBE
3026             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_MOVBE))
3027           ix86_isa_flags |= OPTION_MASK_ISA_MOVBE;
3028         if (processor_alias_table[i].flags & PTA_AES
3029             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_AES))
3030           ix86_isa_flags |= OPTION_MASK_ISA_AES;
3031         if (processor_alias_table[i].flags & PTA_PCLMUL
3032             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_PCLMUL))
3033           ix86_isa_flags |= OPTION_MASK_ISA_PCLMUL;
3034         if (processor_alias_table[i].flags & (PTA_PREFETCH_SSE | PTA_SSE))
3035           x86_prefetch_sse = true;
3036
3037         break;
3038       }
3039
3040   if (i == pta_size)
3041     error ("bad value (%s) for %sarch=%s %s",
3042            ix86_arch_string, prefix, suffix, sw);
3043
3044   ix86_arch_mask = 1u << ix86_arch;
3045   for (i = 0; i < X86_ARCH_LAST; ++i)
3046     ix86_arch_features[i] = !!(initial_ix86_arch_features[i] & ix86_arch_mask);
3047
3048   for (i = 0; i < pta_size; i++)
3049     if (! strcmp (ix86_tune_string, processor_alias_table[i].name))
3050       {
3051         ix86_schedule = processor_alias_table[i].schedule;
3052         ix86_tune = processor_alias_table[i].processor;
3053         if (TARGET_64BIT && !(processor_alias_table[i].flags & PTA_64BIT))
3054           {
3055             if (ix86_tune_defaulted)
3056               {
3057                 ix86_tune_string = "x86-64";
3058                 for (i = 0; i < pta_size; i++)
3059                   if (! strcmp (ix86_tune_string,
3060                                 processor_alias_table[i].name))
3061                     break;
3062                 ix86_schedule = processor_alias_table[i].schedule;
3063                 ix86_tune = processor_alias_table[i].processor;
3064               }
3065             else
3066               error ("CPU you selected does not support x86-64 "
3067                      "instruction set");
3068           }
3069         /* Intel CPUs have always interpreted SSE prefetch instructions as
3070            NOPs; so, we can enable SSE prefetch instructions even when
3071            -mtune (rather than -march) points us to a processor that has them.
3072            However, the VIA C3 gives a SIGILL, so we only do that for i686 and
3073            higher processors.  */
3074         if (TARGET_CMOVE
3075             && (processor_alias_table[i].flags & (PTA_PREFETCH_SSE | PTA_SSE)))
3076           x86_prefetch_sse = true;
3077         break;
3078       }
3079   if (i == pta_size)
3080     error ("bad value (%s) for %stune=%s %s",
3081            ix86_tune_string, prefix, suffix, sw);
3082
3083   ix86_tune_mask = 1u << ix86_tune;
3084   for (i = 0; i < X86_TUNE_LAST; ++i)
3085     ix86_tune_features[i] = !!(initial_ix86_tune_features[i] & ix86_tune_mask);
3086
3087   if (optimize_size)
3088     ix86_cost = &ix86_size_cost;
3089   else
3090     ix86_cost = processor_target_table[ix86_tune].cost;
3091
3092   /* Arrange to set up i386_stack_locals for all functions.  */
3093   init_machine_status = ix86_init_machine_status;
3094
3095   /* Validate -mregparm= value.  */
3096   if (ix86_regparm_string)
3097     {
3098       if (TARGET_64BIT)
3099         warning (0, "%sregparm%s is ignored in 64-bit mode", prefix, suffix);
3100       i = atoi (ix86_regparm_string);
3101       if (i < 0 || i > REGPARM_MAX)
3102         error ("%sregparm=%d%s is not between 0 and %d",
3103                prefix, i, suffix, REGPARM_MAX);
3104       else
3105         ix86_regparm = i;
3106     }
3107   if (TARGET_64BIT)
3108     ix86_regparm = REGPARM_MAX;
3109
3110   /* If the user has provided any of the -malign-* options,
3111      warn and use that value only if -falign-* is not set.
3112      Remove this code in GCC 3.2 or later.  */
3113   if (ix86_align_loops_string)
3114     {
3115       warning (0, "%salign-loops%s is obsolete, use -falign-loops%s",
3116                prefix, suffix, suffix);
3117       if (align_loops == 0)
3118         {
3119           i = atoi (ix86_align_loops_string);
3120           if (i < 0 || i > MAX_CODE_ALIGN)
3121             error ("%salign-loops=%d%s is not between 0 and %d",
3122                    prefix, i, suffix, MAX_CODE_ALIGN);
3123           else
3124             align_loops = 1 << i;
3125         }
3126     }
3127
3128   if (ix86_align_jumps_string)
3129     {
3130       warning (0, "%salign-jumps%s is obsolete, use -falign-jumps%s",
3131                prefix, suffix, suffix);
3132       if (align_jumps == 0)
3133         {
3134           i = atoi (ix86_align_jumps_string);
3135           if (i < 0 || i > MAX_CODE_ALIGN)
3136             error ("%salign-loops=%d%s is not between 0 and %d",
3137                    prefix, i, suffix, MAX_CODE_ALIGN);
3138           else
3139             align_jumps = 1 << i;
3140         }
3141     }
3142
3143   if (ix86_align_funcs_string)
3144     {
3145       warning (0, "%salign-functions%s is obsolete, use -falign-functions%s",
3146                prefix, suffix, suffix);
3147       if (align_functions == 0)
3148         {
3149           i = atoi (ix86_align_funcs_string);
3150           if (i < 0 || i > MAX_CODE_ALIGN)
3151             error ("%salign-loops=%d%s is not between 0 and %d",
3152                    prefix, i, suffix, MAX_CODE_ALIGN);
3153           else
3154             align_functions = 1 << i;
3155         }
3156     }
3157
3158   /* Default align_* from the processor table.  */
3159   if (align_loops == 0)
3160     {
3161       align_loops = processor_target_table[ix86_tune].align_loop;
3162       align_loops_max_skip = processor_target_table[ix86_tune].align_loop_max_skip;
3163     }
3164   if (align_jumps == 0)
3165     {
3166       align_jumps = processor_target_table[ix86_tune].align_jump;
3167       align_jumps_max_skip = processor_target_table[ix86_tune].align_jump_max_skip;
3168     }
3169   if (align_functions == 0)
3170     {
3171       align_functions = processor_target_table[ix86_tune].align_func;
3172     }
3173
3174   /* Validate -mbranch-cost= value, or provide default.  */
3175   ix86_branch_cost = ix86_cost->branch_cost;
3176   if (ix86_branch_cost_string)
3177     {
3178       i = atoi (ix86_branch_cost_string);
3179       if (i < 0 || i > 5)
3180         error ("%sbranch-cost=%d%s is not between 0 and 5", prefix, i, suffix);
3181       else
3182         ix86_branch_cost = i;
3183     }
3184   if (ix86_section_threshold_string)
3185     {
3186       i = atoi (ix86_section_threshold_string);
3187       if (i < 0)
3188         error ("%slarge-data-threshold=%d%s is negative", prefix, i, suffix);
3189       else
3190         ix86_section_threshold = i;
3191     }
3192
3193   if (ix86_tls_dialect_string)
3194     {
3195       if (strcmp (ix86_tls_dialect_string, "gnu") == 0)
3196         ix86_tls_dialect = TLS_DIALECT_GNU;
3197       else if (strcmp (ix86_tls_dialect_string, "gnu2") == 0)
3198         ix86_tls_dialect = TLS_DIALECT_GNU2;
3199       else if (strcmp (ix86_tls_dialect_string, "sun") == 0)
3200         ix86_tls_dialect = TLS_DIALECT_SUN;
3201       else
3202         error ("bad value (%s) for %stls-dialect=%s %s",
3203                ix86_tls_dialect_string, prefix, suffix, sw);
3204     }
3205
3206   if (ix87_precision_string)
3207     {
3208       i = atoi (ix87_precision_string);
3209       if (i != 32 && i != 64 && i != 80)
3210         error ("pc%d is not valid precision setting (32, 64 or 80)", i);
3211     }
3212
3213   if (TARGET_64BIT)
3214     {
3215       target_flags |= TARGET_SUBTARGET64_DEFAULT & ~target_flags_explicit;
3216
3217       /* Enable by default the SSE and MMX builtins.  Do allow the user to
3218          explicitly disable any of these.  In particular, disabling SSE and
3219          MMX for kernel code is extremely useful.  */
3220       if (!ix86_arch_specified)
3221       ix86_isa_flags
3222         |= ((OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_MMX
3223              | TARGET_SUBTARGET64_ISA_DEFAULT) & ~ix86_isa_flags_explicit);
3224
3225       if (TARGET_RTD)
3226         warning (0, "%srtd%s is ignored in 64bit mode", prefix, suffix);
3227     }
3228   else
3229     {
3230       target_flags |= TARGET_SUBTARGET32_DEFAULT & ~target_flags_explicit;
3231
3232       if (!ix86_arch_specified)
3233       ix86_isa_flags
3234         |= TARGET_SUBTARGET32_ISA_DEFAULT & ~ix86_isa_flags_explicit;
3235
3236       /* i386 ABI does not specify red zone.  It still makes sense to use it
3237          when programmer takes care to stack from being destroyed.  */
3238       if (!(target_flags_explicit & MASK_NO_RED_ZONE))
3239         target_flags |= MASK_NO_RED_ZONE;
3240     }
3241
3242   /* Keep nonleaf frame pointers.  */
3243   if (flag_omit_frame_pointer)
3244     target_flags &= ~MASK_OMIT_LEAF_FRAME_POINTER;
3245   else if (TARGET_OMIT_LEAF_FRAME_POINTER)
3246     flag_omit_frame_pointer = 1;
3247
3248   /* If we're doing fast math, we don't care about comparison order
3249      wrt NaNs.  This lets us use a shorter comparison sequence.  */
3250   if (flag_finite_math_only)
3251     target_flags &= ~MASK_IEEE_FP;
3252
3253   /* If the architecture always has an FPU, turn off NO_FANCY_MATH_387,
3254      since the insns won't need emulation.  */
3255   if (x86_arch_always_fancy_math_387 & ix86_arch_mask)
3256     target_flags &= ~MASK_NO_FANCY_MATH_387;
3257
3258   /* Likewise, if the target doesn't have a 387, or we've specified
3259      software floating point, don't use 387 inline intrinsics.  */
3260   if (!TARGET_80387)
3261     target_flags |= MASK_NO_FANCY_MATH_387;
3262
3263   /* Turn on MMX builtins for -msse.  */
3264   if (TARGET_SSE)
3265     {
3266       ix86_isa_flags |= OPTION_MASK_ISA_MMX & ~ix86_isa_flags_explicit;
3267       x86_prefetch_sse = true;
3268     }
3269
3270   /* Turn on popcnt instruction for -msse4.2 or -mabm.  */
3271   if (TARGET_SSE4_2 || TARGET_ABM)
3272     ix86_isa_flags |= OPTION_MASK_ISA_POPCNT & ~ix86_isa_flags_explicit;
3273
3274   /* Validate -mpreferred-stack-boundary= value or default it to
3275      PREFERRED_STACK_BOUNDARY_DEFAULT.  */
3276   ix86_preferred_stack_boundary = PREFERRED_STACK_BOUNDARY_DEFAULT;
3277   if (ix86_preferred_stack_boundary_string)
3278     {
3279       i = atoi (ix86_preferred_stack_boundary_string);
3280       if (i < (TARGET_64BIT ? 4 : 2) || i > 12)
3281         error ("%spreferred-stack-boundary=%d%s is not between %d and 12",
3282                prefix, i, suffix, TARGET_64BIT ? 4 : 2);
3283       else
3284         ix86_preferred_stack_boundary = (1 << i) * BITS_PER_UNIT;
3285     }
3286
3287   /* Set the default value for -mstackrealign.  */
3288   if (ix86_force_align_arg_pointer == -1)
3289     ix86_force_align_arg_pointer = STACK_REALIGN_DEFAULT;
3290
3291   ix86_default_incoming_stack_boundary = PREFERRED_STACK_BOUNDARY;
3292
3293   /* Validate -mincoming-stack-boundary= value or default it to
3294      MIN_STACK_BOUNDARY/PREFERRED_STACK_BOUNDARY.  */
3295   ix86_incoming_stack_boundary = ix86_default_incoming_stack_boundary;
3296   if (ix86_incoming_stack_boundary_string)
3297     {
3298       i = atoi (ix86_incoming_stack_boundary_string);
3299       if (i < (TARGET_64BIT ? 4 : 2) || i > 12)
3300         error ("-mincoming-stack-boundary=%d is not between %d and 12",
3301                i, TARGET_64BIT ? 4 : 2);
3302       else
3303         {
3304           ix86_user_incoming_stack_boundary = (1 << i) * BITS_PER_UNIT;
3305           ix86_incoming_stack_boundary
3306             = ix86_user_incoming_stack_boundary;
3307         }
3308     }
3309
3310   /* Accept -msseregparm only if at least SSE support is enabled.  */
3311   if (TARGET_SSEREGPARM
3312       && ! TARGET_SSE)
3313     error ("%ssseregparm%s used without SSE enabled", prefix, suffix);
3314
3315   ix86_fpmath = TARGET_FPMATH_DEFAULT;
3316   if (ix86_fpmath_string != 0)
3317     {
3318       if (! strcmp (ix86_fpmath_string, "387"))
3319         ix86_fpmath = FPMATH_387;
3320       else if (! strcmp (ix86_fpmath_string, "sse"))
3321         {
3322           if (!TARGET_SSE)
3323             {
3324               warning (0, "SSE instruction set disabled, using 387 arithmetics");
3325               ix86_fpmath = FPMATH_387;
3326             }
3327           else
3328             ix86_fpmath = FPMATH_SSE;
3329         }
3330       else if (! strcmp (ix86_fpmath_string, "387,sse")
3331                || ! strcmp (ix86_fpmath_string, "387+sse")
3332                || ! strcmp (ix86_fpmath_string, "sse,387")
3333                || ! strcmp (ix86_fpmath_string, "sse+387")
3334                || ! strcmp (ix86_fpmath_string, "both"))
3335         {
3336           if (!TARGET_SSE)
3337             {
3338               warning (0, "SSE instruction set disabled, using 387 arithmetics");
3339               ix86_fpmath = FPMATH_387;
3340             }
3341           else if (!TARGET_80387)
3342             {
3343               warning (0, "387 instruction set disabled, using SSE arithmetics");
3344               ix86_fpmath = FPMATH_SSE;
3345             }
3346           else
3347             ix86_fpmath = (enum fpmath_unit) (FPMATH_SSE | FPMATH_387);
3348         }
3349       else
3350         error ("bad value (%s) for %sfpmath=%s %s",
3351                ix86_fpmath_string, prefix, suffix, sw);
3352     }
3353
3354   /* If the i387 is disabled, then do not return values in it. */
3355   if (!TARGET_80387)
3356     target_flags &= ~MASK_FLOAT_RETURNS;
3357
3358   /* Use external vectorized library in vectorizing intrinsics.  */
3359   if (ix86_veclibabi_string)
3360     {
3361       if (strcmp (ix86_veclibabi_string, "svml") == 0)
3362         ix86_veclib_handler = ix86_veclibabi_svml;
3363       else if (strcmp (ix86_veclibabi_string, "acml") == 0)
3364         ix86_veclib_handler = ix86_veclibabi_acml;
3365       else
3366         error ("unknown vectorization library ABI type (%s) for "
3367                "%sveclibabi=%s %s", ix86_veclibabi_string,
3368                prefix, suffix, sw);
3369     }
3370
3371   if ((x86_accumulate_outgoing_args & ix86_tune_mask)
3372       && !(target_flags_explicit & MASK_ACCUMULATE_OUTGOING_ARGS)
3373       && !optimize_size)
3374     target_flags |= MASK_ACCUMULATE_OUTGOING_ARGS;
3375
3376   /* ??? Unwind info is not correct around the CFG unless either a frame
3377      pointer is present or M_A_O_A is set.  Fixing this requires rewriting
3378      unwind info generation to be aware of the CFG and propagating states
3379      around edges.  */
3380   if ((flag_unwind_tables || flag_asynchronous_unwind_tables
3381        || flag_exceptions || flag_non_call_exceptions)
3382       && flag_omit_frame_pointer
3383       && !(target_flags & MASK_ACCUMULATE_OUTGOING_ARGS))
3384     {
3385       if (target_flags_explicit & MASK_ACCUMULATE_OUTGOING_ARGS)
3386         warning (0, "unwind tables currently require either a frame pointer "
3387                  "or %saccumulate-outgoing-args%s for correctness",
3388                  prefix, suffix);
3389       target_flags |= MASK_ACCUMULATE_OUTGOING_ARGS;
3390     }
3391
3392   /* If stack probes are required, the space used for large function
3393      arguments on the stack must also be probed, so enable
3394      -maccumulate-outgoing-args so this happens in the prologue.  */
3395   if (TARGET_STACK_PROBE
3396       && !(target_flags & MASK_ACCUMULATE_OUTGOING_ARGS))
3397     {
3398       if (target_flags_explicit & MASK_ACCUMULATE_OUTGOING_ARGS)
3399         warning (0, "stack probing requires %saccumulate-outgoing-args%s "
3400                  "for correctness", prefix, suffix);
3401       target_flags |= MASK_ACCUMULATE_OUTGOING_ARGS;
3402     }
3403
3404   /* For sane SSE instruction set generation we need fcomi instruction.
3405      It is safe to enable all CMOVE instructions.  */
3406   if (TARGET_SSE)
3407     TARGET_CMOVE = 1;
3408
3409   /* Figure out what ASM_GENERATE_INTERNAL_LABEL builds as a prefix.  */
3410   {
3411     char *p;
3412     ASM_GENERATE_INTERNAL_LABEL (internal_label_prefix, "LX", 0);
3413     p = strchr (internal_label_prefix, 'X');
3414     internal_label_prefix_len = p - internal_label_prefix;
3415     *p = '\0';
3416   }
3417
3418   /* When scheduling description is not available, disable scheduler pass
3419      so it won't slow down the compilation and make x87 code slower.  */
3420   if (!TARGET_SCHEDULE)
3421     flag_schedule_insns_after_reload = flag_schedule_insns = 0;
3422
3423   if (!PARAM_SET_P (PARAM_SIMULTANEOUS_PREFETCHES))
3424     set_param_value ("simultaneous-prefetches",
3425                      ix86_cost->simultaneous_prefetches);
3426   if (!PARAM_SET_P (PARAM_L1_CACHE_LINE_SIZE))
3427     set_param_value ("l1-cache-line-size", ix86_cost->prefetch_block);
3428   if (!PARAM_SET_P (PARAM_L1_CACHE_SIZE))
3429     set_param_value ("l1-cache-size", ix86_cost->l1_cache_size);
3430   if (!PARAM_SET_P (PARAM_L2_CACHE_SIZE))
3431     set_param_value ("l2-cache-size", ix86_cost->l2_cache_size);
3432
3433   /* If using typedef char *va_list, signal that __builtin_va_start (&ap, 0)
3434      can be optimized to ap = __builtin_next_arg (0).  */
3435   if (!TARGET_64BIT)
3436     targetm.expand_builtin_va_start = NULL;
3437
3438   if (TARGET_64BIT)
3439     {
3440       ix86_gen_leave = gen_leave_rex64;
3441       ix86_gen_pop1 = gen_popdi1;
3442       ix86_gen_add3 = gen_adddi3;
3443       ix86_gen_sub3 = gen_subdi3;
3444       ix86_gen_sub3_carry = gen_subdi3_carry;
3445       ix86_gen_one_cmpl2 = gen_one_cmpldi2;
3446       ix86_gen_monitor = gen_sse3_monitor64;
3447       ix86_gen_andsp = gen_anddi3;
3448     }
3449   else
3450     {
3451       ix86_gen_leave = gen_leave;
3452       ix86_gen_pop1 = gen_popsi1;
3453       ix86_gen_add3 = gen_addsi3;
3454       ix86_gen_sub3 = gen_subsi3;
3455       ix86_gen_sub3_carry = gen_subsi3_carry;
3456       ix86_gen_one_cmpl2 = gen_one_cmplsi2;
3457       ix86_gen_monitor = gen_sse3_monitor;
3458       ix86_gen_andsp = gen_andsi3;
3459     }
3460
3461 #ifdef USE_IX86_CLD
3462   /* Use -mcld by default for 32-bit code if configured with --enable-cld.  */
3463   if (!TARGET_64BIT)
3464     target_flags |= MASK_CLD & ~target_flags_explicit;
3465 #endif
3466
3467   /* Save the initial options in case the user does function specific options */
3468   if (main_args_p)
3469     target_option_default_node = target_option_current_node
3470       = build_target_option_node ();
3471 }
3472
3473 /* Update register usage after having seen the compiler flags.  */
3474
3475 void
3476 ix86_conditional_register_usage (void)
3477 {
3478   int i;
3479   unsigned int j;
3480
3481   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
3482     {
3483       if (fixed_regs[i] > 1)
3484         fixed_regs[i] = (fixed_regs[i] == (TARGET_64BIT ? 3 : 2));
3485       if (call_used_regs[i] > 1)
3486         call_used_regs[i] = (call_used_regs[i] == (TARGET_64BIT ? 3 : 2));
3487     }
3488
3489   /* The PIC register, if it exists, is fixed.  */
3490   j = PIC_OFFSET_TABLE_REGNUM;
3491   if (j != INVALID_REGNUM)
3492     fixed_regs[j] = call_used_regs[j] = 1;
3493
3494   /* The MS_ABI changes the set of call-used registers.  */
3495   if (TARGET_64BIT && ix86_cfun_abi () == MS_ABI)
3496     {
3497       call_used_regs[SI_REG] = 0;
3498       call_used_regs[DI_REG] = 0;
3499       call_used_regs[XMM6_REG] = 0;
3500       call_used_regs[XMM7_REG] = 0;
3501       for (i = FIRST_REX_SSE_REG; i <= LAST_REX_SSE_REG; i++)
3502         call_used_regs[i] = 0;
3503     }
3504
3505   /* The default setting of CLOBBERED_REGS is for 32-bit; add in the
3506      other call-clobbered regs for 64-bit.  */
3507   if (TARGET_64BIT)
3508     {
3509       CLEAR_HARD_REG_SET (reg_class_contents[(int)CLOBBERED_REGS]);
3510
3511       for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
3512         if (TEST_HARD_REG_BIT (reg_class_contents[(int)GENERAL_REGS], i)
3513             && call_used_regs[i])
3514           SET_HARD_REG_BIT (reg_class_contents[(int)CLOBBERED_REGS], i);
3515     }
3516
3517   /* If MMX is disabled, squash the registers.  */
3518   if (! TARGET_MMX)
3519     for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
3520       if (TEST_HARD_REG_BIT (reg_class_contents[(int)MMX_REGS], i))
3521         fixed_regs[i] = call_used_regs[i] = 1, reg_names[i] = "";
3522
3523   /* If SSE is disabled, squash the registers.  */
3524   if (! TARGET_SSE)
3525     for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
3526       if (TEST_HARD_REG_BIT (reg_class_contents[(int)SSE_REGS], i))
3527         fixed_regs[i] = call_used_regs[i] = 1, reg_names[i] = "";
3528
3529   /* If the FPU is disabled, squash the registers.  */
3530   if (! (TARGET_80387 || TARGET_FLOAT_RETURNS_IN_80387))
3531     for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
3532       if (TEST_HARD_REG_BIT (reg_class_contents[(int)FLOAT_REGS], i))
3533         fixed_regs[i] = call_used_regs[i] = 1, reg_names[i] = "";
3534
3535   /* If 32-bit, squash the 64-bit registers.  */
3536   if (! TARGET_64BIT)
3537     {
3538       for (i = FIRST_REX_INT_REG; i <= LAST_REX_INT_REG; i++)
3539         reg_names[i] = "";
3540       for (i = FIRST_REX_SSE_REG; i <= LAST_REX_SSE_REG; i++)
3541         reg_names[i] = "";
3542     }
3543 }
3544
3545 \f
3546 /* Save the current options */
3547
3548 static void
3549 ix86_function_specific_save (struct cl_target_option *ptr)
3550 {
3551   ptr->arch = ix86_arch;
3552   ptr->schedule = ix86_schedule;
3553   ptr->tune = ix86_tune;
3554   ptr->fpmath = ix86_fpmath;
3555   ptr->branch_cost = ix86_branch_cost;
3556   ptr->tune_defaulted = ix86_tune_defaulted;
3557   ptr->arch_specified = ix86_arch_specified;
3558   ptr->ix86_isa_flags_explicit = ix86_isa_flags_explicit;
3559   ptr->target_flags_explicit = target_flags_explicit;
3560
3561   /* The fields are char but the variables are not; make sure the
3562      values fit in the fields.  */
3563   gcc_assert (ptr->arch == ix86_arch);
3564   gcc_assert (ptr->schedule == ix86_schedule);
3565   gcc_assert (ptr->tune == ix86_tune);
3566   gcc_assert (ptr->fpmath == ix86_fpmath);
3567   gcc_assert (ptr->branch_cost == ix86_branch_cost);
3568 }
3569
3570 /* Restore the current options */
3571
3572 static void
3573 ix86_function_specific_restore (struct cl_target_option *ptr)
3574 {
3575   enum processor_type old_tune = ix86_tune;
3576   enum processor_type old_arch = ix86_arch;
3577   unsigned int ix86_arch_mask, ix86_tune_mask;
3578   int i;
3579
3580   ix86_arch = (enum processor_type) ptr->arch;
3581   ix86_schedule = (enum attr_cpu) ptr->schedule;
3582   ix86_tune = (enum processor_type) ptr->tune;
3583   ix86_fpmath = (enum fpmath_unit) ptr->fpmath;
3584   ix86_branch_cost = ptr->branch_cost;
3585   ix86_tune_defaulted = ptr->tune_defaulted;
3586   ix86_arch_specified = ptr->arch_specified;
3587   ix86_isa_flags_explicit = ptr->ix86_isa_flags_explicit;
3588   target_flags_explicit = ptr->target_flags_explicit;
3589
3590   /* Recreate the arch feature tests if the arch changed */
3591   if (old_arch != ix86_arch)
3592     {
3593       ix86_arch_mask = 1u << ix86_arch;
3594       for (i = 0; i < X86_ARCH_LAST; ++i)
3595         ix86_arch_features[i]
3596           = !!(initial_ix86_arch_features[i] & ix86_arch_mask);
3597     }
3598
3599   /* Recreate the tune optimization tests */
3600   if (old_tune != ix86_tune)
3601     {
3602       ix86_tune_mask = 1u << ix86_tune;
3603       for (i = 0; i < X86_TUNE_LAST; ++i)
3604         ix86_tune_features[i]
3605           = !!(initial_ix86_tune_features[i] & ix86_tune_mask);
3606     }
3607 }
3608
3609 /* Print the current options */
3610
3611 static void
3612 ix86_function_specific_print (FILE *file, int indent,
3613                               struct cl_target_option *ptr)
3614 {
3615   char *target_string
3616     = ix86_target_string (ptr->ix86_isa_flags, ptr->target_flags,
3617                           NULL, NULL, NULL, false);
3618
3619   fprintf (file, "%*sarch = %d (%s)\n",
3620            indent, "",
3621            ptr->arch,
3622            ((ptr->arch < TARGET_CPU_DEFAULT_max)
3623             ? cpu_names[ptr->arch]
3624             : "<unknown>"));
3625
3626   fprintf (file, "%*stune = %d (%s)\n",
3627            indent, "",
3628            ptr->tune,
3629            ((ptr->tune < TARGET_CPU_DEFAULT_max)
3630             ? cpu_names[ptr->tune]
3631             : "<unknown>"));
3632
3633   fprintf (file, "%*sfpmath = %d%s%s\n", indent, "", ptr->fpmath,
3634            (ptr->fpmath & FPMATH_387) ? ", 387" : "",
3635            (ptr->fpmath & FPMATH_SSE) ? ", sse" : "");
3636   fprintf (file, "%*sbranch_cost = %d\n", indent, "", ptr->branch_cost);
3637
3638   if (target_string)
3639     {
3640       fprintf (file, "%*s%s\n", indent, "", target_string);
3641       free (target_string);
3642     }
3643 }
3644
3645 \f
3646 /* Inner function to process the attribute((target(...))), take an argument and
3647    set the current options from the argument. If we have a list, recursively go
3648    over the list.  */
3649
3650 static bool
3651 ix86_valid_target_attribute_inner_p (tree args, char *p_strings[])
3652 {
3653   char *next_optstr;
3654   bool ret = true;
3655
3656 #define IX86_ATTR_ISA(S,O)   { S, sizeof (S)-1, ix86_opt_isa, O, 0 }
3657 #define IX86_ATTR_STR(S,O)   { S, sizeof (S)-1, ix86_opt_str, O, 0 }
3658 #define IX86_ATTR_YES(S,O,M) { S, sizeof (S)-1, ix86_opt_yes, O, M }
3659 #define IX86_ATTR_NO(S,O,M)  { S, sizeof (S)-1, ix86_opt_no,  O, M }
3660
3661   enum ix86_opt_type
3662   {
3663     ix86_opt_unknown,
3664     ix86_opt_yes,
3665     ix86_opt_no,
3666     ix86_opt_str,
3667     ix86_opt_isa
3668   };
3669
3670   static const struct
3671   {
3672     const char *string;
3673     size_t len;
3674     enum ix86_opt_type type;
3675     int opt;
3676     int mask;
3677   } attrs[] = {
3678     /* isa options */
3679     IX86_ATTR_ISA ("3dnow",     OPT_m3dnow),
3680     IX86_ATTR_ISA ("abm",       OPT_mabm),
3681     IX86_ATTR_ISA ("aes",       OPT_maes),
3682     IX86_ATTR_ISA ("avx",       OPT_mavx),
3683     IX86_ATTR_ISA ("mmx",       OPT_mmmx),
3684     IX86_ATTR_ISA ("pclmul",    OPT_mpclmul),
3685     IX86_ATTR_ISA ("popcnt",    OPT_mpopcnt),
3686     IX86_ATTR_ISA ("sse",       OPT_msse),
3687     IX86_ATTR_ISA ("sse2",      OPT_msse2),
3688     IX86_ATTR_ISA ("sse3",      OPT_msse3),
3689     IX86_ATTR_ISA ("sse4",      OPT_msse4),
3690     IX86_ATTR_ISA ("sse4.1",    OPT_msse4_1),
3691     IX86_ATTR_ISA ("sse4.2",    OPT_msse4_2),
3692     IX86_ATTR_ISA ("sse4a",     OPT_msse4a),
3693     IX86_ATTR_ISA ("ssse3",     OPT_mssse3),
3694     IX86_ATTR_ISA ("fma4",      OPT_mfma4),
3695     IX86_ATTR_ISA ("xop",       OPT_mxop),
3696     IX86_ATTR_ISA ("lwp",       OPT_mlwp),
3697
3698     /* string options */
3699     IX86_ATTR_STR ("arch=",     IX86_FUNCTION_SPECIFIC_ARCH),
3700     IX86_ATTR_STR ("fpmath=",   IX86_FUNCTION_SPECIFIC_FPMATH),
3701     IX86_ATTR_STR ("tune=",     IX86_FUNCTION_SPECIFIC_TUNE),
3702
3703     /* flag options */
3704     IX86_ATTR_YES ("cld",
3705                    OPT_mcld,
3706                    MASK_CLD),
3707
3708     IX86_ATTR_NO ("fancy-math-387",
3709                   OPT_mfancy_math_387,
3710                   MASK_NO_FANCY_MATH_387),
3711
3712     IX86_ATTR_YES ("ieee-fp",
3713                    OPT_mieee_fp,
3714                    MASK_IEEE_FP),
3715
3716     IX86_ATTR_YES ("inline-all-stringops",
3717                    OPT_minline_all_stringops,
3718                    MASK_INLINE_ALL_STRINGOPS),
3719
3720     IX86_ATTR_YES ("inline-stringops-dynamically",
3721                    OPT_minline_stringops_dynamically,
3722                    MASK_INLINE_STRINGOPS_DYNAMICALLY),
3723
3724     IX86_ATTR_NO ("align-stringops",
3725                   OPT_mno_align_stringops,
3726                   MASK_NO_ALIGN_STRINGOPS),
3727
3728     IX86_ATTR_YES ("recip",
3729                    OPT_mrecip,
3730                    MASK_RECIP),
3731
3732   };
3733
3734   /* If this is a list, recurse to get the options.  */
3735   if (TREE_CODE (args) == TREE_LIST)
3736     {
3737       bool ret = true;
3738
3739       for (; args; args = TREE_CHAIN (args))
3740         if (TREE_VALUE (args)
3741             && !ix86_valid_target_attribute_inner_p (TREE_VALUE (args), p_strings))
3742           ret = false;
3743
3744       return ret;
3745     }
3746
3747   else if (TREE_CODE (args) != STRING_CST)
3748     gcc_unreachable ();
3749
3750   /* Handle multiple arguments separated by commas.  */
3751   next_optstr = ASTRDUP (TREE_STRING_POINTER (args));
3752
3753   while (next_optstr && *next_optstr != '\0')
3754     {
3755       char *p = next_optstr;
3756       char *orig_p = p;
3757       char *comma = strchr (next_optstr, ',');
3758       const char *opt_string;
3759       size_t len, opt_len;
3760       int opt;
3761       bool opt_set_p;
3762       char ch;
3763       unsigned i;
3764       enum ix86_opt_type type = ix86_opt_unknown;
3765       int mask = 0;
3766
3767       if (comma)
3768         {
3769           *comma = '\0';
3770           len = comma - next_optstr;
3771           next_optstr = comma + 1;
3772         }
3773       else
3774         {
3775           len = strlen (p);
3776           next_optstr = NULL;
3777         }
3778
3779       /* Recognize no-xxx.  */
3780       if (len > 3 && p[0] == 'n' && p[1] == 'o' && p[2] == '-')
3781         {
3782           opt_set_p = false;
3783           p += 3;
3784           len -= 3;
3785         }
3786       else
3787         opt_set_p = true;
3788
3789       /* Find the option.  */
3790       ch = *p;
3791       opt = N_OPTS;
3792       for (i = 0; i < ARRAY_SIZE (attrs); i++)
3793         {
3794           type = attrs[i].type;
3795           opt_len = attrs[i].len;
3796           if (ch == attrs[i].string[0]
3797               && ((type != ix86_opt_str) ? len == opt_len : len > opt_len)
3798               && memcmp (p, attrs[i].string, opt_len) == 0)
3799             {
3800               opt = attrs[i].opt;
3801               mask = attrs[i].mask;
3802               opt_string = attrs[i].string;
3803               break;
3804             }
3805         }
3806
3807       /* Process the option.  */
3808       if (opt == N_OPTS)
3809         {
3810           error ("attribute(target(\"%s\")) is unknown", orig_p);
3811           ret = false;
3812         }
3813
3814       else if (type == ix86_opt_isa)
3815         ix86_handle_option (opt, p, opt_set_p);
3816
3817       else if (type == ix86_opt_yes || type == ix86_opt_no)
3818         {
3819           if (type == ix86_opt_no)
3820             opt_set_p = !opt_set_p;
3821
3822           if (opt_set_p)
3823             target_flags |= mask;
3824           else
3825             target_flags &= ~mask;
3826         }
3827
3828       else if (type == ix86_opt_str)
3829         {
3830           if (p_strings[opt])
3831             {
3832               error ("option(\"%s\") was already specified", opt_string);
3833               ret = false;
3834             }
3835           else
3836             p_strings[opt] = xstrdup (p + opt_len);
3837         }
3838
3839       else
3840         gcc_unreachable ();
3841     }
3842
3843   return ret;
3844 }
3845
3846 /* Return a TARGET_OPTION_NODE tree of the target options listed or NULL.  */
3847
3848 tree
3849 ix86_valid_target_attribute_tree (tree args)
3850 {
3851   const char *orig_arch_string = ix86_arch_string;
3852   const char *orig_tune_string = ix86_tune_string;
3853   const char *orig_fpmath_string = ix86_fpmath_string;
3854   int orig_tune_defaulted = ix86_tune_defaulted;
3855   int orig_arch_specified = ix86_arch_specified;
3856   char *option_strings[IX86_FUNCTION_SPECIFIC_MAX] = { NULL, NULL, NULL };
3857   tree t = NULL_TREE;
3858   int i;
3859   struct cl_target_option *def
3860     = TREE_TARGET_OPTION (target_option_default_node);
3861
3862   /* Process each of the options on the chain.  */
3863   if (! ix86_valid_target_attribute_inner_p (args, option_strings))
3864     return NULL_TREE;
3865
3866   /* If the changed options are different from the default, rerun override_options,
3867      and then save the options away.  The string options are are attribute options,
3868      and will be undone when we copy the save structure.  */
3869   if (ix86_isa_flags != def->ix86_isa_flags
3870       || target_flags != def->target_flags
3871       || option_strings[IX86_FUNCTION_SPECIFIC_ARCH]
3872       || option_strings[IX86_FUNCTION_SPECIFIC_TUNE]
3873       || option_strings[IX86_FUNCTION_SPECIFIC_FPMATH])
3874     {
3875       /* If we are using the default tune= or arch=, undo the string assigned,
3876          and use the default.  */
3877       if (option_strings[IX86_FUNCTION_SPECIFIC_ARCH])
3878         ix86_arch_string = option_strings[IX86_FUNCTION_SPECIFIC_ARCH];
3879       else if (!orig_arch_specified)
3880         ix86_arch_string = NULL;
3881
3882       if (option_strings[IX86_FUNCTION_SPECIFIC_TUNE])
3883         ix86_tune_string = option_strings[IX86_FUNCTION_SPECIFIC_TUNE];
3884       else if (orig_tune_defaulted)
3885         ix86_tune_string = NULL;
3886
3887       /* If fpmath= is not set, and we now have sse2 on 32-bit, use it.  */
3888       if (option_strings[IX86_FUNCTION_SPECIFIC_FPMATH])
3889         ix86_fpmath_string = option_strings[IX86_FUNCTION_SPECIFIC_FPMATH];
3890       else if (!TARGET_64BIT && TARGET_SSE)
3891         ix86_fpmath_string = "sse,387";
3892
3893       /* Do any overrides, such as arch=xxx, or tune=xxx support.  */
3894       override_options (false);
3895
3896       /* Add any builtin functions with the new isa if any.  */
3897       ix86_add_new_builtins (ix86_isa_flags);
3898
3899       /* Save the current options unless we are validating options for
3900          #pragma.  */
3901       t = build_target_option_node ();
3902
3903       ix86_arch_string = orig_arch_string;
3904       ix86_tune_string = orig_tune_string;
3905       ix86_fpmath_string = orig_fpmath_string;
3906
3907       /* Free up memory allocated to hold the strings */
3908       for (i = 0; i < IX86_FUNCTION_SPECIFIC_MAX; i++)
3909         if (option_strings[i])
3910           free (option_strings[i]);
3911     }
3912
3913   return t;
3914 }
3915
3916 /* Hook to validate attribute((target("string"))).  */
3917
3918 static bool
3919 ix86_valid_target_attribute_p (tree fndecl,
3920                                tree ARG_UNUSED (name),
3921                                tree args,
3922                                int ARG_UNUSED (flags))
3923 {
3924   struct cl_target_option cur_target;
3925   bool ret = true;
3926   tree old_optimize = build_optimization_node ();
3927   tree new_target, new_optimize;
3928   tree func_optimize = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl);
3929
3930   /* If the function changed the optimization levels as well as setting target
3931      options, start with the optimizations specified.  */
3932   if (func_optimize && func_optimize != old_optimize)
3933     cl_optimization_restore (TREE_OPTIMIZATION (func_optimize));
3934
3935   /* The target attributes may also change some optimization flags, so update
3936      the optimization options if necessary.  */
3937   cl_target_option_save (&cur_target);
3938   new_target = ix86_valid_target_attribute_tree (args);
3939   new_optimize = build_optimization_node ();
3940
3941   if (!new_target)
3942     ret = false;
3943
3944   else if (fndecl)
3945     {
3946       DECL_FUNCTION_SPECIFIC_TARGET (fndecl) = new_target;
3947
3948       if (old_optimize != new_optimize)
3949         DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl) = new_optimize;
3950     }
3951
3952   cl_target_option_restore (&cur_target);
3953
3954   if (old_optimize != new_optimize)
3955     cl_optimization_restore (TREE_OPTIMIZATION (old_optimize));
3956
3957   return ret;
3958 }
3959
3960 \f
3961 /* Hook to determine if one function can safely inline another.  */
3962
3963 static bool
3964 ix86_can_inline_p (tree caller, tree callee)
3965 {
3966   bool ret = false;
3967   tree caller_tree = DECL_FUNCTION_SPECIFIC_TARGET (caller);
3968   tree callee_tree = DECL_FUNCTION_SPECIFIC_TARGET (callee);
3969
3970   /* If callee has no option attributes, then it is ok to inline.  */
3971   if (!callee_tree)
3972     ret = true;
3973
3974   /* If caller has no option attributes, but callee does then it is not ok to
3975      inline.  */
3976   else if (!caller_tree)
3977     ret = false;
3978
3979   else
3980     {
3981       struct cl_target_option *caller_opts = TREE_TARGET_OPTION (caller_tree);
3982       struct cl_target_option *callee_opts = TREE_TARGET_OPTION (callee_tree);
3983
3984       /* Callee's isa options should a subset of the caller's, i.e. a SSE4 function
3985          can inline a SSE2 function but a SSE2 function can't inline a SSE4
3986          function.  */
3987       if ((caller_opts->ix86_isa_flags & callee_opts->ix86_isa_flags)
3988           != callee_opts->ix86_isa_flags)
3989         ret = false;
3990
3991       /* See if we have the same non-isa options.  */
3992       else if (caller_opts->target_flags != callee_opts->target_flags)
3993         ret = false;
3994
3995       /* See if arch, tune, etc. are the same.  */
3996       else if (caller_opts->arch != callee_opts->arch)
3997         ret = false;
3998
3999       else if (caller_opts->tune != callee_opts->tune)
4000         ret = false;
4001
4002       else if (caller_opts->fpmath != callee_opts->fpmath)
4003         ret = false;
4004
4005       else if (caller_opts->branch_cost != callee_opts->branch_cost)
4006         ret = false;
4007
4008       else
4009         ret = true;
4010     }
4011
4012   return ret;
4013 }
4014
4015 \f
4016 /* Remember the last target of ix86_set_current_function.  */
4017 static GTY(()) tree ix86_previous_fndecl;
4018
4019 /* Establish appropriate back-end context for processing the function
4020    FNDECL.  The argument might be NULL to indicate processing at top
4021    level, outside of any function scope.  */
4022 static void
4023 ix86_set_current_function (tree fndecl)
4024 {
4025   /* Only change the context if the function changes.  This hook is called
4026      several times in the course of compiling a function, and we don't want to
4027      slow things down too much or call target_reinit when it isn't safe.  */
4028   if (fndecl && fndecl != ix86_previous_fndecl)
4029     {
4030       tree old_tree = (ix86_previous_fndecl
4031                        ? DECL_FUNCTION_SPECIFIC_TARGET (ix86_previous_fndecl)
4032                        : NULL_TREE);
4033
4034       tree new_tree = (fndecl
4035                        ? DECL_FUNCTION_SPECIFIC_TARGET (fndecl)
4036                        : NULL_TREE);
4037
4038       ix86_previous_fndecl = fndecl;
4039       if (old_tree == new_tree)
4040         ;
4041
4042       else if (new_tree)
4043         {
4044           cl_target_option_restore (TREE_TARGET_OPTION (new_tree));
4045           target_reinit ();
4046         }
4047
4048       else if (old_tree)
4049         {
4050           struct cl_target_option *def
4051             = TREE_TARGET_OPTION (target_option_current_node);
4052
4053           cl_target_option_restore (def);
4054           target_reinit ();
4055         }
4056     }
4057 }
4058
4059 \f
4060 /* Return true if this goes in large data/bss.  */
4061
4062 static bool
4063 ix86_in_large_data_p (tree exp)
4064 {
4065   if (ix86_cmodel != CM_MEDIUM && ix86_cmodel != CM_MEDIUM_PIC)
4066     return false;
4067
4068   /* Functions are never large data.  */
4069   if (TREE_CODE (exp) == FUNCTION_DECL)
4070     return false;
4071
4072   if (TREE_CODE (exp) == VAR_DECL && DECL_SECTION_NAME (exp))
4073     {
4074       const char *section = TREE_STRING_POINTER (DECL_SECTION_NAME (exp));
4075       if (strcmp (section, ".ldata") == 0
4076           || strcmp (section, ".lbss") == 0)
4077         return true;
4078       return false;
4079     }
4080   else
4081     {
4082       HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (exp));
4083
4084       /* If this is an incomplete type with size 0, then we can't put it
4085          in data because it might be too big when completed.  */
4086       if (!size || size > ix86_section_threshold)
4087         return true;
4088     }
4089
4090   return false;
4091 }
4092
4093 /* Switch to the appropriate section for output of DECL.
4094    DECL is either a `VAR_DECL' node or a constant of some sort.
4095    RELOC indicates whether forming the initial value of DECL requires
4096    link-time relocations.  */
4097
4098 static section * x86_64_elf_select_section (tree, int, unsigned HOST_WIDE_INT)
4099         ATTRIBUTE_UNUSED;
4100
4101 static section *
4102 x86_64_elf_select_section (tree decl, int reloc,
4103                            unsigned HOST_WIDE_INT align)
4104 {
4105   if ((ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_MEDIUM_PIC)
4106       && ix86_in_large_data_p (decl))
4107     {
4108       const char *sname = NULL;
4109       unsigned int flags = SECTION_WRITE;
4110       switch (categorize_decl_for_section (decl, reloc))
4111         {
4112         case SECCAT_DATA:
4113           sname = ".ldata";
4114           break;
4115         case SECCAT_DATA_REL:
4116           sname = ".ldata.rel";
4117           break;
4118         case SECCAT_DATA_REL_LOCAL:
4119           sname = ".ldata.rel.local";
4120           break;
4121         case SECCAT_DATA_REL_RO:
4122           sname = ".ldata.rel.ro";
4123           break;
4124         case SECCAT_DATA_REL_RO_LOCAL:
4125           sname = ".ldata.rel.ro.local";
4126           break;
4127         case SECCAT_BSS:
4128           sname = ".lbss";
4129           flags |= SECTION_BSS;
4130           break;
4131         case SECCAT_RODATA:
4132         case SECCAT_RODATA_MERGE_STR:
4133         case SECCAT_RODATA_MERGE_STR_INIT:
4134         case SECCAT_RODATA_MERGE_CONST:
4135           sname = ".lrodata";
4136           flags = 0;
4137           break;
4138         case SECCAT_SRODATA:
4139         case SECCAT_SDATA:
4140         case SECCAT_SBSS:
4141           gcc_unreachable ();
4142         case SECCAT_TEXT:
4143         case SECCAT_TDATA:
4144         case SECCAT_TBSS:
4145           /* We don't split these for medium model.  Place them into
4146              default sections and hope for best.  */
4147           break;
4148         case SECCAT_EMUTLS_VAR:
4149         case SECCAT_EMUTLS_TMPL:
4150           gcc_unreachable ();
4151         }
4152       if (sname)
4153         {
4154           /* We might get called with string constants, but get_named_section
4155              doesn't like them as they are not DECLs.  Also, we need to set
4156              flags in that case.  */
4157           if (!DECL_P (decl))
4158             return get_section (sname, flags, NULL);
4159           return get_named_section (decl, sname, reloc);
4160         }
4161     }
4162   return default_elf_select_section (decl, reloc, align);
4163 }
4164
4165 /* Build up a unique section name, expressed as a
4166    STRING_CST node, and assign it to DECL_SECTION_NAME (decl).
4167    RELOC indicates whether the initial value of EXP requires
4168    link-time relocations.  */
4169
4170 static void ATTRIBUTE_UNUSED
4171 x86_64_elf_unique_section (tree decl, int reloc)
4172 {
4173   if ((ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_MEDIUM_PIC)
4174       && ix86_in_large_data_p (decl))
4175     {
4176       const char *prefix = NULL;
4177       /* We only need to use .gnu.linkonce if we don't have COMDAT groups.  */
4178       bool one_only = DECL_ONE_ONLY (decl) && !HAVE_COMDAT_GROUP;
4179
4180       switch (categorize_decl_for_section (decl, reloc))
4181         {
4182         case SECCAT_DATA:
4183         case SECCAT_DATA_REL:
4184         case SECCAT_DATA_REL_LOCAL:
4185         case SECCAT_DATA_REL_RO:
4186         case SECCAT_DATA_REL_RO_LOCAL:
4187           prefix = one_only ? ".ld" : ".ldata";
4188           break;
4189         case SECCAT_BSS:
4190           prefix = one_only ? ".lb" : ".lbss";
4191           break;
4192         case SECCAT_RODATA:
4193         case SECCAT_RODATA_MERGE_STR:
4194         case SECCAT_RODATA_MERGE_STR_INIT:
4195         case SECCAT_RODATA_MERGE_CONST:
4196           prefix = one_only ? ".lr" : ".lrodata";
4197           break;
4198         case SECCAT_SRODATA:
4199         case SECCAT_SDATA:
4200         case SECCAT_SBSS:
4201           gcc_unreachable ();
4202         case SECCAT_TEXT:
4203         case SECCAT_TDATA:
4204         case SECCAT_TBSS:
4205           /* We don't split these for medium model.  Place them into
4206              default sections and hope for best.  */
4207           break;
4208         case SECCAT_EMUTLS_VAR:
4209           prefix = targetm.emutls.var_section;
4210           break;
4211         case SECCAT_EMUTLS_TMPL:
4212           prefix = targetm.emutls.tmpl_section;
4213           break;
4214         }
4215       if (prefix)
4216         {
4217           const char *name, *linkonce;
4218           char *string;
4219
4220           name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
4221           name = targetm.strip_name_encoding (name);
4222           
4223           /* If we're using one_only, then there needs to be a .gnu.linkonce
4224              prefix to the section name.  */
4225           linkonce = one_only ? ".gnu.linkonce" : "";
4226   
4227           string = ACONCAT ((linkonce, prefix, ".", name, NULL));
4228           
4229           DECL_SECTION_NAME (decl) = build_string (strlen (string), string);
4230           return;
4231         }
4232     }
4233   default_unique_section (decl, reloc);
4234 }
4235
4236 #ifdef COMMON_ASM_OP
4237 /* This says how to output assembler code to declare an
4238    uninitialized external linkage data object.
4239
4240    For medium model x86-64 we need to use .largecomm opcode for
4241    large objects.  */
4242 void
4243 x86_elf_aligned_common (FILE *file,
4244                         const char *name, unsigned HOST_WIDE_INT size,
4245                         int align)
4246 {
4247   if ((ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_MEDIUM_PIC)
4248       && size > (unsigned int)ix86_section_threshold)
4249     fputs (".largecomm\t", file);
4250   else
4251     fputs (COMMON_ASM_OP, file);
4252   assemble_name (file, name);
4253   fprintf (file, "," HOST_WIDE_INT_PRINT_UNSIGNED ",%u\n",
4254            size, align / BITS_PER_UNIT);
4255 }
4256 #endif
4257
4258 /* Utility function for targets to use in implementing
4259    ASM_OUTPUT_ALIGNED_BSS.  */
4260
4261 void
4262 x86_output_aligned_bss (FILE *file, tree decl ATTRIBUTE_UNUSED,
4263                         const char *name, unsigned HOST_WIDE_INT size,
4264                         int align)
4265 {
4266   if ((ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_MEDIUM_PIC)
4267       && size > (unsigned int)ix86_section_threshold)
4268     switch_to_section (get_named_section (decl, ".lbss", 0));
4269   else
4270     switch_to_section (bss_section);
4271   ASM_OUTPUT_ALIGN (file, floor_log2 (align / BITS_PER_UNIT));
4272 #ifdef ASM_DECLARE_OBJECT_NAME
4273   last_assemble_variable_decl = decl;
4274   ASM_DECLARE_OBJECT_NAME (file, name, decl);
4275 #else
4276   /* Standard thing is just output label for the object.  */
4277   ASM_OUTPUT_LABEL (file, name);
4278 #endif /* ASM_DECLARE_OBJECT_NAME */
4279   ASM_OUTPUT_SKIP (file, size ? size : 1);
4280 }
4281 \f
4282 void
4283 optimization_options (int level, int size ATTRIBUTE_UNUSED)
4284 {
4285   /* For -O2 and beyond, turn off -fschedule-insns by default.  It tends to
4286      make the problem with not enough registers even worse.  */
4287 #ifdef INSN_SCHEDULING
4288   if (level > 1)
4289     flag_schedule_insns = 0;
4290 #endif
4291
4292   if (TARGET_MACHO)
4293     /* The Darwin libraries never set errno, so we might as well
4294        avoid calling them when that's the only reason we would.  */
4295     flag_errno_math = 0;
4296
4297   /* The default values of these switches depend on the TARGET_64BIT
4298      that is not known at this moment.  Mark these values with 2 and
4299      let user the to override these.  In case there is no command line option
4300      specifying them, we will set the defaults in override_options.  */
4301   if (optimize >= 1)
4302     flag_omit_frame_pointer = 2;
4303   flag_pcc_struct_return = 2;
4304   flag_asynchronous_unwind_tables = 2;
4305   flag_vect_cost_model = 1;
4306 #ifdef SUBTARGET_OPTIMIZATION_OPTIONS
4307   SUBTARGET_OPTIMIZATION_OPTIONS;
4308 #endif
4309 }
4310 \f
4311 /* Decide whether we can make a sibling call to a function.  DECL is the
4312    declaration of the function being targeted by the call and EXP is the
4313    CALL_EXPR representing the call.  */
4314
4315 static bool
4316 ix86_function_ok_for_sibcall (tree decl, tree exp)
4317 {
4318   tree type, decl_or_type;
4319   rtx a, b;
4320
4321   /* If we are generating position-independent code, we cannot sibcall
4322      optimize any indirect call, or a direct call to a global function,
4323      as the PLT requires %ebx be live.  */
4324   if (!TARGET_64BIT && flag_pic && (!decl || !targetm.binds_local_p (decl)))
4325     return false;
4326
4327   /* If we need to align the outgoing stack, then sibcalling would
4328      unalign the stack, which may break the called function.  */
4329   if (ix86_minimum_incoming_stack_boundary (true)
4330       < PREFERRED_STACK_BOUNDARY)
4331     return false;
4332
4333   if (decl)
4334     {
4335       decl_or_type = decl;
4336       type = TREE_TYPE (decl);
4337     }
4338   else
4339     {
4340       /* We're looking at the CALL_EXPR, we need the type of the function.  */
4341       type = CALL_EXPR_FN (exp);                /* pointer expression */
4342       type = TREE_TYPE (type);                  /* pointer type */
4343       type = TREE_TYPE (type);                  /* function type */
4344       decl_or_type = type;
4345     }
4346
4347   /* Check that the return value locations are the same.  Like
4348      if we are returning floats on the 80387 register stack, we cannot
4349      make a sibcall from a function that doesn't return a float to a
4350      function that does or, conversely, from a function that does return
4351      a float to a function that doesn't; the necessary stack adjustment
4352      would not be executed.  This is also the place we notice
4353      differences in the return value ABI.  Note that it is ok for one
4354      of the functions to have void return type as long as the return
4355      value of the other is passed in a register.  */
4356   a = ix86_function_value (TREE_TYPE (exp), decl_or_type, false);
4357   b = ix86_function_value (TREE_TYPE (DECL_RESULT (cfun->decl)),
4358                            cfun->decl, false);
4359   if (STACK_REG_P (a) || STACK_REG_P (b))
4360     {
4361       if (!rtx_equal_p (a, b))
4362         return false;
4363     }
4364   else if (VOID_TYPE_P (TREE_TYPE (DECL_RESULT (cfun->decl))))
4365     ;
4366   else if (!rtx_equal_p (a, b))
4367     return false;
4368
4369   if (TARGET_64BIT)
4370     {
4371       /* The SYSV ABI has more call-clobbered registers;
4372          disallow sibcalls from MS to SYSV.  */
4373       if (cfun->machine->call_abi == MS_ABI
4374           && ix86_function_type_abi (type) == SYSV_ABI)
4375         return false;
4376     }
4377   else
4378     {
4379       /* If this call is indirect, we'll need to be able to use a
4380          call-clobbered register for the address of the target function.
4381          Make sure that all such registers are not used for passing
4382          parameters.  Note that DLLIMPORT functions are indirect.  */
4383       if (!decl
4384           || (TARGET_DLLIMPORT_DECL_ATTRIBUTES && DECL_DLLIMPORT_P (decl)))
4385         {
4386           if (ix86_function_regparm (type, NULL) >= 3)
4387             {
4388               /* ??? Need to count the actual number of registers to be used,
4389                  not the possible number of registers.  Fix later.  */
4390               return false;
4391             }
4392         }
4393     }
4394
4395   /* Otherwise okay.  That also includes certain types of indirect calls.  */
4396   return true;
4397 }
4398
4399 /* Handle "cdecl", "stdcall", "fastcall", "regparm" and "sseregparm"
4400    calling convention attributes;
4401    arguments as in struct attribute_spec.handler.  */
4402
4403 static tree
4404 ix86_handle_cconv_attribute (tree *node, tree name,
4405                                    tree args,
4406                                    int flags ATTRIBUTE_UNUSED,
4407                                    bool *no_add_attrs)
4408 {
4409   if (TREE_CODE (*node) != FUNCTION_TYPE
4410       && TREE_CODE (*node) != METHOD_TYPE
4411       && TREE_CODE (*node) != FIELD_DECL
4412       && TREE_CODE (*node) != TYPE_DECL)
4413     {
4414       warning (OPT_Wattributes, "%qE attribute only applies to functions",
4415                name);
4416       *no_add_attrs = true;
4417       return NULL_TREE;
4418     }
4419
4420   /* Can combine regparm with all attributes but fastcall.  */
4421   if (is_attribute_p ("regparm", name))
4422     {
4423       tree cst;
4424
4425       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (*node)))
4426         {
4427           error ("fastcall and regparm attributes are not compatible");
4428         }
4429
4430       cst = TREE_VALUE (args);
4431       if (TREE_CODE (cst) != INTEGER_CST)
4432         {
4433           warning (OPT_Wattributes,
4434                    "%qE attribute requires an integer constant argument",
4435                    name);
4436           *no_add_attrs = true;
4437         }
4438       else if (compare_tree_int (cst, REGPARM_MAX) > 0)
4439         {
4440           warning (OPT_Wattributes, "argument to %qE attribute larger than %d",
4441                    name, REGPARM_MAX);
4442           *no_add_attrs = true;
4443         }
4444
4445       return NULL_TREE;
4446     }
4447
4448   if (TARGET_64BIT)
4449     {
4450       /* Do not warn when emulating the MS ABI.  */
4451       if (TREE_CODE (*node) != FUNCTION_TYPE
4452           || ix86_function_type_abi (*node) != MS_ABI)
4453         warning (OPT_Wattributes, "%qE attribute ignored",
4454                  name);
4455       *no_add_attrs = true;
4456       return NULL_TREE;
4457     }
4458
4459   /* Can combine fastcall with stdcall (redundant) and sseregparm.  */
4460   if (is_attribute_p ("fastcall", name))
4461     {
4462       if (lookup_attribute ("cdecl", TYPE_ATTRIBUTES (*node)))
4463         {
4464           error ("fastcall and cdecl attributes are not compatible");
4465         }
4466       if (lookup_attribute ("stdcall", TYPE_ATTRIBUTES (*node)))
4467         {
4468           error ("fastcall and stdcall attributes are not compatible");
4469         }
4470       if (lookup_attribute ("regparm", TYPE_ATTRIBUTES (*node)))
4471         {
4472           error ("fastcall and regparm attributes are not compatible");
4473         }
4474     }
4475
4476   /* Can combine stdcall with fastcall (redundant), regparm and
4477      sseregparm.  */
4478   else if (is_attribute_p ("stdcall", name))
4479     {
4480       if (lookup_attribute ("cdecl", TYPE_ATTRIBUTES (*node)))
4481         {
4482           error ("stdcall and cdecl attributes are not compatible");
4483         }
4484       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (*node)))
4485         {
4486           error ("stdcall and fastcall attributes are not compatible");
4487         }
4488     }
4489
4490   /* Can combine cdecl with regparm and sseregparm.  */
4491   else if (is_attribute_p ("cdecl", name))
4492     {
4493       if (lookup_attribute ("stdcall", TYPE_ATTRIBUTES (*node)))
4494         {
4495           error ("stdcall and cdecl attributes are not compatible");
4496         }
4497       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (*node)))
4498         {
4499           error ("fastcall and cdecl attributes are not compatible");
4500         }
4501     }
4502
4503   /* Can combine sseregparm with all attributes.  */
4504
4505   return NULL_TREE;
4506 }
4507
4508 /* Return 0 if the attributes for two types are incompatible, 1 if they
4509    are compatible, and 2 if they are nearly compatible (which causes a
4510    warning to be generated).  */
4511
4512 static int
4513 ix86_comp_type_attributes (const_tree type1, const_tree type2)
4514 {
4515   /* Check for mismatch of non-default calling convention.  */
4516   const char *const rtdstr = TARGET_RTD ? "cdecl" : "stdcall";
4517
4518   if (TREE_CODE (type1) != FUNCTION_TYPE
4519       && TREE_CODE (type1) != METHOD_TYPE)
4520     return 1;
4521
4522   /* Check for mismatched fastcall/regparm types.  */
4523   if ((!lookup_attribute ("fastcall", TYPE_ATTRIBUTES (type1))
4524        != !lookup_attribute ("fastcall", TYPE_ATTRIBUTES (type2)))
4525       || (ix86_function_regparm (type1, NULL)
4526           != ix86_function_regparm (type2, NULL)))
4527     return 0;
4528
4529   /* Check for mismatched sseregparm types.  */
4530   if (!lookup_attribute ("sseregparm", TYPE_ATTRIBUTES (type1))
4531       != !lookup_attribute ("sseregparm", TYPE_ATTRIBUTES (type2)))
4532     return 0;
4533
4534   /* Check for mismatched return types (cdecl vs stdcall).  */
4535   if (!lookup_attribute (rtdstr, TYPE_ATTRIBUTES (type1))
4536       != !lookup_attribute (rtdstr, TYPE_ATTRIBUTES (type2)))
4537     return 0;
4538
4539   return 1;
4540 }
4541 \f
4542 /* Return the regparm value for a function with the indicated TYPE and DECL.
4543    DECL may be NULL when calling function indirectly
4544    or considering a libcall.  */
4545
4546 static int
4547 ix86_function_regparm (const_tree type, const_tree decl)
4548 {
4549   tree attr;
4550   int regparm;
4551
4552   if (TARGET_64BIT)
4553     return (ix86_function_type_abi (type) == SYSV_ABI
4554             ? X86_64_REGPARM_MAX : X86_64_MS_REGPARM_MAX);
4555
4556   regparm = ix86_regparm;
4557   attr = lookup_attribute ("regparm", TYPE_ATTRIBUTES (type));
4558   if (attr)
4559     {
4560       regparm = TREE_INT_CST_LOW (TREE_VALUE (TREE_VALUE (attr)));
4561       return regparm;
4562     }
4563
4564   if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (type)))
4565     return 2;
4566
4567   /* Use register calling convention for local functions when possible.  */
4568   if (decl
4569       && TREE_CODE (decl) == FUNCTION_DECL
4570       && optimize
4571       && !profile_flag)
4572     {
4573       /* FIXME: remove this CONST_CAST when cgraph.[ch] is constified.  */
4574       struct cgraph_local_info *i = cgraph_local_info (CONST_CAST_TREE (decl));
4575       if (i && i->local)
4576         {
4577           int local_regparm, globals = 0, regno;
4578
4579           /* Make sure no regparm register is taken by a
4580              fixed register variable.  */
4581           for (local_regparm = 0; local_regparm < REGPARM_MAX; local_regparm++)
4582             if (fixed_regs[local_regparm])
4583               break;
4584
4585           /* We don't want to use regparm(3) for nested functions as
4586              these use a static chain pointer in the third argument.  */
4587           if (local_regparm == 3 && DECL_STATIC_CHAIN (decl))
4588             local_regparm = 2;
4589
4590           /* Each fixed register usage increases register pressure,
4591              so less registers should be used for argument passing.
4592              This functionality can be overriden by an explicit
4593              regparm value.  */
4594           for (regno = 0; regno <= DI_REG; regno++)
4595             if (fixed_regs[regno])
4596               globals++;
4597
4598           local_regparm
4599             = globals < local_regparm ? local_regparm - globals : 0;
4600
4601           if (local_regparm > regparm)
4602             regparm = local_regparm;
4603         }
4604     }
4605
4606   return regparm;
4607 }
4608
4609 /* Return 1 or 2, if we can pass up to SSE_REGPARM_MAX SFmode (1) and
4610    DFmode (2) arguments in SSE registers for a function with the
4611    indicated TYPE and DECL.  DECL may be NULL when calling function
4612    indirectly or considering a libcall.  Otherwise return 0.  */
4613
4614 static int
4615 ix86_function_sseregparm (const_tree type, const_tree decl, bool warn)
4616 {
4617   gcc_assert (!TARGET_64BIT);
4618
4619   /* Use SSE registers to pass SFmode and DFmode arguments if requested
4620      by the sseregparm attribute.  */
4621   if (TARGET_SSEREGPARM
4622       || (type && lookup_attribute ("sseregparm", TYPE_ATTRIBUTES (type))))
4623     {
4624       if (!TARGET_SSE)
4625         {
4626           if (warn)
4627             {
4628               if (decl)
4629                 error ("Calling %qD with attribute sseregparm without "
4630                        "SSE/SSE2 enabled", decl);
4631               else
4632                 error ("Calling %qT with attribute sseregparm without "
4633                        "SSE/SSE2 enabled", type);
4634             }
4635           return 0;
4636         }
4637
4638       return 2;
4639     }
4640
4641   /* For local functions, pass up to SSE_REGPARM_MAX SFmode
4642      (and DFmode for SSE2) arguments in SSE registers.  */
4643   if (decl && TARGET_SSE_MATH && optimize && !profile_flag)
4644     {
4645       /* FIXME: remove this CONST_CAST when cgraph.[ch] is constified.  */
4646       struct cgraph_local_info *i = cgraph_local_info (CONST_CAST_TREE(decl));
4647       if (i && i->local)
4648         return TARGET_SSE2 ? 2 : 1;
4649     }
4650
4651   return 0;
4652 }
4653
4654 /* Return true if EAX is live at the start of the function.  Used by
4655    ix86_expand_prologue to determine if we need special help before
4656    calling allocate_stack_worker.  */
4657
4658 static bool
4659 ix86_eax_live_at_start_p (void)
4660 {
4661   /* Cheat.  Don't bother working forward from ix86_function_regparm
4662      to the function type to whether an actual argument is located in
4663      eax.  Instead just look at cfg info, which is still close enough
4664      to correct at this point.  This gives false positives for broken
4665      functions that might use uninitialized data that happens to be
4666      allocated in eax, but who cares?  */
4667   return REGNO_REG_SET_P (df_get_live_out (ENTRY_BLOCK_PTR), 0);
4668 }
4669
4670 /* Value is the number of bytes of arguments automatically
4671    popped when returning from a subroutine call.
4672    FUNDECL is the declaration node of the function (as a tree),
4673    FUNTYPE is the data type of the function (as a tree),
4674    or for a library call it is an identifier node for the subroutine name.
4675    SIZE is the number of bytes of arguments passed on the stack.
4676
4677    On the 80386, the RTD insn may be used to pop them if the number
4678      of args is fixed, but if the number is variable then the caller
4679      must pop them all.  RTD can't be used for library calls now
4680      because the library is compiled with the Unix compiler.
4681    Use of RTD is a selectable option, since it is incompatible with
4682    standard Unix calling sequences.  If the option is not selected,
4683    the caller must always pop the args.
4684
4685    The attribute stdcall is equivalent to RTD on a per module basis.  */
4686
4687 int
4688 ix86_return_pops_args (tree fundecl, tree funtype, int size)
4689 {
4690   int rtd;
4691
4692   /* None of the 64-bit ABIs pop arguments.  */
4693   if (TARGET_64BIT)
4694     return 0;
4695
4696   rtd = TARGET_RTD && (!fundecl || TREE_CODE (fundecl) != IDENTIFIER_NODE);
4697
4698   /* Cdecl functions override -mrtd, and never pop the stack.  */
4699   if (! lookup_attribute ("cdecl", TYPE_ATTRIBUTES (funtype)))
4700     {
4701       /* Stdcall and fastcall functions will pop the stack if not
4702          variable args.  */
4703       if (lookup_attribute ("stdcall", TYPE_ATTRIBUTES (funtype))
4704           || lookup_attribute ("fastcall", TYPE_ATTRIBUTES (funtype)))
4705         rtd = 1;
4706
4707       if (rtd && ! stdarg_p (funtype))
4708         return size;
4709     }
4710
4711   /* Lose any fake structure return argument if it is passed on the stack.  */
4712   if (aggregate_value_p (TREE_TYPE (funtype), fundecl)
4713       && !KEEP_AGGREGATE_RETURN_POINTER)
4714     {
4715       int nregs = ix86_function_regparm (funtype, fundecl);
4716       if (nregs == 0)
4717         return GET_MODE_SIZE (Pmode);
4718     }
4719
4720   return 0;
4721 }
4722 \f
4723 /* Argument support functions.  */
4724
4725 /* Return true when register may be used to pass function parameters.  */
4726 bool
4727 ix86_function_arg_regno_p (int regno)
4728 {
4729   int i;
4730   const int *parm_regs;
4731
4732   if (!TARGET_64BIT)
4733     {
4734       if (TARGET_MACHO)
4735         return (regno < REGPARM_MAX
4736                 || (TARGET_SSE && SSE_REGNO_P (regno) && !fixed_regs[regno]));
4737       else
4738         return (regno < REGPARM_MAX
4739                 || (TARGET_MMX && MMX_REGNO_P (regno)
4740                     && (regno < FIRST_MMX_REG + MMX_REGPARM_MAX))
4741                 || (TARGET_SSE && SSE_REGNO_P (regno)
4742                     && (regno < FIRST_SSE_REG + SSE_REGPARM_MAX)));
4743     }
4744
4745   if (TARGET_MACHO)
4746     {
4747       if (SSE_REGNO_P (regno) && TARGET_SSE)
4748         return true;
4749     }
4750   else
4751     {
4752       if (TARGET_SSE && SSE_REGNO_P (regno)
4753           && (regno < FIRST_SSE_REG + SSE_REGPARM_MAX))
4754         return true;
4755     }
4756
4757   /* TODO: The function should depend on current function ABI but
4758      builtins.c would need updating then. Therefore we use the
4759      default ABI.  */
4760
4761   /* RAX is used as hidden argument to va_arg functions.  */
4762   if (ix86_abi == SYSV_ABI && regno == AX_REG)
4763     return true;
4764
4765   if (ix86_abi == MS_ABI)
4766     parm_regs = x86_64_ms_abi_int_parameter_registers;
4767   else
4768     parm_regs = x86_64_int_parameter_registers;
4769   for (i = 0; i < (ix86_abi == MS_ABI
4770                    ? X86_64_MS_REGPARM_MAX : X86_64_REGPARM_MAX); i++)
4771     if (regno == parm_regs[i])
4772       return true;
4773   return false;
4774 }
4775
4776 /* Return if we do not know how to pass TYPE solely in registers.  */
4777
4778 static bool
4779 ix86_must_pass_in_stack (enum machine_mode mode, const_tree type)
4780 {
4781   if (must_pass_in_stack_var_size_or_pad (mode, type))
4782     return true;
4783
4784   /* For 32-bit, we want TImode aggregates to go on the stack.  But watch out!
4785      The layout_type routine is crafty and tries to trick us into passing
4786      currently unsupported vector types on the stack by using TImode.  */
4787   return (!TARGET_64BIT && mode == TImode
4788           && type && TREE_CODE (type) != VECTOR_TYPE);
4789 }
4790
4791 /* It returns the size, in bytes, of the area reserved for arguments passed
4792    in registers for the function represented by fndecl dependent to the used
4793    abi format.  */
4794 int
4795 ix86_reg_parm_stack_space (const_tree fndecl)
4796 {
4797   enum calling_abi call_abi = SYSV_ABI;
4798   if (fndecl != NULL_TREE && TREE_CODE (fndecl) == FUNCTION_DECL)
4799     call_abi = ix86_function_abi (fndecl);
4800   else
4801     call_abi = ix86_function_type_abi (fndecl);
4802   if (call_abi == MS_ABI)
4803     return 32;
4804   return 0;
4805 }
4806
4807 /* Returns value SYSV_ABI, MS_ABI dependent on fntype, specifying the
4808    call abi used.  */
4809 enum calling_abi
4810 ix86_function_type_abi (const_tree fntype)
4811 {
4812   if (TARGET_64BIT && fntype != NULL)
4813     {
4814       enum calling_abi abi = ix86_abi;
4815       if (abi == SYSV_ABI)
4816         {
4817           if (lookup_attribute ("ms_abi", TYPE_ATTRIBUTES (fntype)))
4818             abi = MS_ABI;
4819         }
4820       else if (lookup_attribute ("sysv_abi", TYPE_ATTRIBUTES (fntype)))
4821         abi = SYSV_ABI;
4822       return abi;
4823     }
4824   return ix86_abi;
4825 }
4826
4827 static bool
4828 ix86_function_ms_hook_prologue (const_tree fntype)
4829 {
4830   if (!TARGET_64BIT)
4831     {
4832       if (lookup_attribute ("ms_hook_prologue", DECL_ATTRIBUTES (fntype)))
4833         {
4834           if (decl_function_context (fntype) != NULL_TREE)
4835           {
4836             error_at (DECL_SOURCE_LOCATION (fntype),
4837                 "ms_hook_prologue is not compatible with nested function");
4838           }
4839
4840           return true;
4841         }
4842     }
4843   return false;
4844 }
4845
4846 static enum calling_abi
4847 ix86_function_abi (const_tree fndecl)
4848 {
4849   if (! fndecl)
4850     return ix86_abi;
4851   return ix86_function_type_abi (TREE_TYPE (fndecl));
4852 }
4853
4854 /* Returns value SYSV_ABI, MS_ABI dependent on cfun, specifying the
4855    call abi used.  */
4856 enum calling_abi
4857 ix86_cfun_abi (void)
4858 {
4859   if (! cfun || ! TARGET_64BIT)
4860     return ix86_abi;
4861   return cfun->machine->call_abi;
4862 }
4863
4864 /* regclass.c  */
4865 extern void init_regs (void);
4866
4867 /* Implementation of call abi switching target hook. Specific to FNDECL
4868    the specific call register sets are set. See also CONDITIONAL_REGISTER_USAGE
4869    for more details.  */
4870 void
4871 ix86_call_abi_override (const_tree fndecl)
4872 {
4873   if (fndecl == NULL_TREE)
4874     cfun->machine->call_abi = ix86_abi;
4875   else
4876     cfun->machine->call_abi = ix86_function_type_abi (TREE_TYPE (fndecl));
4877 }
4878
4879 /* MS and SYSV ABI have different set of call used registers.  Avoid expensive
4880    re-initialization of init_regs each time we switch function context since
4881    this is needed only during RTL expansion.  */
4882 static void
4883 ix86_maybe_switch_abi (void)
4884 {
4885   if (TARGET_64BIT &&
4886       call_used_regs[SI_REG] == (cfun->machine->call_abi == MS_ABI))
4887     reinit_regs ();
4888 }
4889
4890 /* Initialize a variable CUM of type CUMULATIVE_ARGS
4891    for a call to a function whose data type is FNTYPE.
4892    For a library call, FNTYPE is 0.  */
4893
4894 void
4895 init_cumulative_args (CUMULATIVE_ARGS *cum,  /* Argument info to initialize */
4896                       tree fntype,      /* tree ptr for function decl */
4897                       rtx libname,      /* SYMBOL_REF of library name or 0 */
4898                       tree fndecl)
4899 {
4900   struct cgraph_local_info *i = fndecl ? cgraph_local_info (fndecl) : NULL;
4901   memset (cum, 0, sizeof (*cum));
4902
4903   if (fndecl)
4904    cum->call_abi = ix86_function_abi (fndecl);
4905   else
4906    cum->call_abi = ix86_function_type_abi (fntype);
4907   /* Set up the number of registers to use for passing arguments.  */
4908
4909   if (cum->call_abi == MS_ABI && !ACCUMULATE_OUTGOING_ARGS)
4910     sorry ("ms_abi attribute requires -maccumulate-outgoing-args "
4911            "or subtarget optimization implying it");
4912   cum->nregs = ix86_regparm;
4913   if (TARGET_64BIT)
4914     {
4915       if (cum->call_abi != ix86_abi)
4916         cum->nregs = (ix86_abi != SYSV_ABI
4917                       ? X86_64_REGPARM_MAX : X86_64_MS_REGPARM_MAX);
4918     }
4919   if (TARGET_SSE)
4920     {
4921       cum->sse_nregs = SSE_REGPARM_MAX;
4922       if (TARGET_64BIT)
4923         {
4924           if (cum->call_abi != ix86_abi)
4925             cum->sse_nregs = (ix86_abi != SYSV_ABI
4926                               ? X86_64_SSE_REGPARM_MAX
4927                               : X86_64_MS_SSE_REGPARM_MAX);
4928         }
4929     }
4930   if (TARGET_MMX)
4931     cum->mmx_nregs = MMX_REGPARM_MAX;
4932   cum->warn_avx = true;
4933   cum->warn_sse = true;
4934   cum->warn_mmx = true;
4935
4936   /* Because type might mismatch in between caller and callee, we need to
4937      use actual type of function for local calls.
4938      FIXME: cgraph_analyze can be told to actually record if function uses
4939      va_start so for local functions maybe_vaarg can be made aggressive
4940      helping K&R code.
4941      FIXME: once typesytem is fixed, we won't need this code anymore.  */
4942   if (i && i->local)
4943     fntype = TREE_TYPE (fndecl);
4944   cum->maybe_vaarg = (fntype
4945                       ? (!prototype_p (fntype) || stdarg_p (fntype))
4946                       : !libname);
4947
4948   if (!TARGET_64BIT)
4949     {
4950       /* If there are variable arguments, then we won't pass anything
4951          in registers in 32-bit mode. */
4952       if (stdarg_p (fntype))
4953         {
4954           cum->nregs = 0;
4955           cum->sse_nregs = 0;
4956           cum->mmx_nregs = 0;
4957           cum->warn_avx = 0;
4958           cum->warn_sse = 0;
4959           cum->warn_mmx = 0;
4960           return;
4961         }
4962
4963       /* Use ecx and edx registers if function has fastcall attribute,
4964          else look for regparm information.  */
4965       if (fntype)
4966         {
4967           if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (fntype)))
4968             {
4969               cum->nregs = 2;
4970               cum->fastcall = 1;
4971             }
4972           else
4973             cum->nregs = ix86_function_regparm (fntype, fndecl);
4974         }
4975
4976       /* Set up the number of SSE registers used for passing SFmode
4977          and DFmode arguments.  Warn for mismatching ABI.  */
4978       cum->float_in_sse = ix86_function_sseregparm (fntype, fndecl, true);
4979     }
4980 }
4981
4982 /* Return the "natural" mode for TYPE.  In most cases, this is just TYPE_MODE.
4983    But in the case of vector types, it is some vector mode.
4984
4985    When we have only some of our vector isa extensions enabled, then there
4986    are some modes for which vector_mode_supported_p is false.  For these
4987    modes, the generic vector support in gcc will choose some non-vector mode
4988    in order to implement the type.  By computing the natural mode, we'll
4989    select the proper ABI location for the operand and not depend on whatever
4990    the middle-end decides to do with these vector types.
4991
4992    The midde-end can't deal with the vector types > 16 bytes.  In this
4993    case, we return the original mode and warn ABI change if CUM isn't
4994    NULL.  */
4995
4996 static enum machine_mode
4997 type_natural_mode (const_tree type, CUMULATIVE_ARGS *cum)
4998 {
4999   enum machine_mode mode = TYPE_MODE (type);
5000
5001   if (TREE_CODE (type) == VECTOR_TYPE && !VECTOR_MODE_P (mode))
5002     {
5003       HOST_WIDE_INT size = int_size_in_bytes (type);
5004       if ((size == 8 || size == 16 || size == 32)
5005           /* ??? Generic code allows us to create width 1 vectors.  Ignore.  */
5006           && TYPE_VECTOR_SUBPARTS (type) > 1)
5007         {
5008           enum machine_mode innermode = TYPE_MODE (TREE_TYPE (type));
5009
5010           if (TREE_CODE (TREE_TYPE (type)) == REAL_TYPE)
5011             mode = MIN_MODE_VECTOR_FLOAT;
5012           else
5013             mode = MIN_MODE_VECTOR_INT;
5014
5015           /* Get the mode which has this inner mode and number of units.  */
5016           for (; mode != VOIDmode; mode = GET_MODE_WIDER_MODE (mode))
5017             if (GET_MODE_NUNITS (mode) == TYPE_VECTOR_SUBPARTS (type)
5018                 && GET_MODE_INNER (mode) == innermode)
5019               {
5020                 if (size == 32 && !TARGET_AVX)
5021                   {
5022                     static bool warnedavx;
5023
5024                     if (cum
5025                         && !warnedavx 
5026                         && cum->warn_avx)
5027                       {
5028                         warnedavx = true;
5029                         warning (0, "AVX vector argument without AVX "
5030                                  "enabled changes the ABI");
5031                       }
5032                     return TYPE_MODE (type);
5033                   }
5034                 else
5035                   return mode;
5036               }
5037
5038           gcc_unreachable ();
5039         }
5040     }
5041
5042   return mode;
5043 }
5044
5045 /* We want to pass a value in REGNO whose "natural" mode is MODE.  However,
5046    this may not agree with the mode that the type system has chosen for the
5047    register, which is ORIG_MODE.  If ORIG_MODE is not BLKmode, then we can
5048    go ahead and use it.  Otherwise we have to build a PARALLEL instead.  */
5049
5050 static rtx
5051 gen_reg_or_parallel (enum machine_mode mode, enum machine_mode orig_mode,
5052                      unsigned int regno)
5053 {
5054   rtx tmp;
5055
5056   if (orig_mode != BLKmode)
5057     tmp = gen_rtx_REG (orig_mode, regno);
5058   else
5059     {
5060       tmp = gen_rtx_REG (mode, regno);
5061       tmp = gen_rtx_EXPR_LIST (VOIDmode, tmp, const0_rtx);
5062       tmp = gen_rtx_PARALLEL (orig_mode, gen_rtvec (1, tmp));
5063     }
5064
5065   return tmp;
5066 }
5067
5068 /* x86-64 register passing implementation.  See x86-64 ABI for details.  Goal
5069    of this code is to classify each 8bytes of incoming argument by the register
5070    class and assign registers accordingly.  */
5071
5072 /* Return the union class of CLASS1 and CLASS2.
5073    See the x86-64 PS ABI for details.  */
5074
5075 static enum x86_64_reg_class
5076 merge_classes (enum x86_64_reg_class class1, enum x86_64_reg_class class2)
5077 {
5078   /* Rule #1: If both classes are equal, this is the resulting class.  */
5079   if (class1 == class2)
5080     return class1;
5081
5082   /* Rule #2: If one of the classes is NO_CLASS, the resulting class is
5083      the other class.  */
5084   if (class1 == X86_64_NO_CLASS)
5085     return class2;
5086   if (class2 == X86_64_NO_CLASS)
5087     return class1;
5088
5089   /* Rule #3: If one of the classes is MEMORY, the result is MEMORY.  */
5090   if (class1 == X86_64_MEMORY_CLASS || class2 == X86_64_MEMORY_CLASS)
5091     return X86_64_MEMORY_CLASS;
5092
5093   /* Rule #4: If one of the classes is INTEGER, the result is INTEGER.  */
5094   if ((class1 == X86_64_INTEGERSI_CLASS && class2 == X86_64_SSESF_CLASS)
5095       || (class2 == X86_64_INTEGERSI_CLASS && class1 == X86_64_SSESF_CLASS))
5096     return X86_64_INTEGERSI_CLASS;
5097   if (class1 == X86_64_INTEGER_CLASS || class1 == X86_64_INTEGERSI_CLASS
5098       || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS)
5099     return X86_64_INTEGER_CLASS;
5100
5101   /* Rule #5: If one of the classes is X87, X87UP, or COMPLEX_X87 class,
5102      MEMORY is used.  */
5103   if (class1 == X86_64_X87_CLASS
5104       || class1 == X86_64_X87UP_CLASS
5105       || class1 == X86_64_COMPLEX_X87_CLASS
5106       || class2 == X86_64_X87_CLASS
5107       || class2 == X86_64_X87UP_CLASS
5108       || class2 == X86_64_COMPLEX_X87_CLASS)
5109     return X86_64_MEMORY_CLASS;
5110
5111   /* Rule #6: Otherwise class SSE is used.  */
5112   return X86_64_SSE_CLASS;
5113 }
5114
5115 /* Classify the argument of type TYPE and mode MODE.
5116    CLASSES will be filled by the register class used to pass each word
5117    of the operand.  The number of words is returned.  In case the parameter
5118    should be passed in memory, 0 is returned. As a special case for zero
5119    sized containers, classes[0] will be NO_CLASS and 1 is returned.
5120
5121    BIT_OFFSET is used internally for handling records and specifies offset
5122    of the offset in bits modulo 256 to avoid overflow cases.
5123
5124    See the x86-64 PS ABI for details.
5125 */
5126
5127 static int
5128 classify_argument (enum machine_mode mode, const_tree type,
5129                    enum x86_64_reg_class classes[MAX_CLASSES], int bit_offset)
5130 {
5131   HOST_WIDE_INT bytes =
5132     (mode == BLKmode) ? int_size_in_bytes (type) : (int) GET_MODE_SIZE (mode);
5133   int words = (bytes + (bit_offset % 64) / 8 + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
5134
5135   /* Variable sized entities are always passed/returned in memory.  */
5136   if (bytes < 0)
5137     return 0;
5138
5139   if (mode != VOIDmode
5140       && targetm.calls.must_pass_in_stack (mode, type))
5141     return 0;
5142
5143   if (type && AGGREGATE_TYPE_P (type))
5144     {
5145       int i;
5146       tree field;
5147       enum x86_64_reg_class subclasses[MAX_CLASSES];
5148
5149       /* On x86-64 we pass structures larger than 32 bytes on the stack.  */
5150       if (bytes > 32)
5151         return 0;
5152
5153       for (i = 0; i < words; i++)
5154         classes[i] = X86_64_NO_CLASS;
5155
5156       /* Zero sized arrays or structures are NO_CLASS.  We return 0 to
5157          signalize memory class, so handle it as special case.  */
5158       if (!words)
5159         {
5160           classes[0] = X86_64_NO_CLASS;
5161           return 1;
5162         }
5163
5164       /* Classify each field of record and merge classes.  */
5165       switch (TREE_CODE (type))
5166         {
5167         case RECORD_TYPE:
5168           /* And now merge the fields of structure.  */
5169           for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
5170             {
5171               if (TREE_CODE (field) == FIELD_DECL)
5172                 {
5173                   int num;
5174
5175                   if (TREE_TYPE (field) == error_mark_node)
5176                     continue;
5177
5178                   /* Bitfields are always classified as integer.  Handle them
5179                      early, since later code would consider them to be
5180                      misaligned integers.  */
5181                   if (DECL_BIT_FIELD (field))
5182                     {
5183                       for (i = (int_bit_position (field) + (bit_offset % 64)) / 8 / 8;
5184                            i < ((int_bit_position (field) + (bit_offset % 64))
5185                                 + tree_low_cst (DECL_SIZE (field), 0)
5186                                 + 63) / 8 / 8; i++)
5187                         classes[i] =
5188                           merge_classes (X86_64_INTEGER_CLASS,
5189                                          classes[i]);
5190                     }
5191                   else
5192                     {
5193                       int pos;
5194
5195                       type = TREE_TYPE (field);
5196
5197                       /* Flexible array member is ignored.  */
5198                       if (TYPE_MODE (type) == BLKmode
5199                           && TREE_CODE (type) == ARRAY_TYPE
5200                           && TYPE_SIZE (type) == NULL_TREE
5201                           && TYPE_DOMAIN (type) != NULL_TREE
5202                           && (TYPE_MAX_VALUE (TYPE_DOMAIN (type))
5203                               == NULL_TREE))
5204                         {
5205                           static bool warned;
5206                           
5207                           if (!warned && warn_psabi)
5208                             {
5209                               warned = true;
5210                               inform (input_location,
5211                                       "The ABI of passing struct with"
5212                                       " a flexible array member has"
5213                                       " changed in GCC 4.4");
5214                             }
5215                           continue;
5216                         }
5217                       num = classify_argument (TYPE_MODE (type), type,
5218                                                subclasses,
5219                                                (int_bit_position (field)
5220                                                 + bit_offset) % 256);
5221                       if (!num)
5222                         return 0;
5223                       pos = (int_bit_position (field) + (bit_offset % 64)) / 8 / 8;
5224                       for (i = 0; i < num && (i + pos) < words; i++)
5225                         classes[i + pos] =
5226                           merge_classes (subclasses[i], classes[i + pos]);
5227                     }
5228                 }
5229             }
5230           break;
5231
5232         case ARRAY_TYPE:
5233           /* Arrays are handled as small records.  */
5234           {
5235             int num;
5236             num = classify_argument (TYPE_MODE (TREE_TYPE (type)),
5237                                      TREE_TYPE (type), subclasses, bit_offset);
5238             if (!num)
5239               return 0;
5240
5241             /* The partial classes are now full classes.  */
5242             if (subclasses[0] == X86_64_SSESF_CLASS && bytes != 4)
5243               subclasses[0] = X86_64_SSE_CLASS;
5244             if (subclasses[0] == X86_64_INTEGERSI_CLASS
5245                 && !((bit_offset % 64) == 0 && bytes == 4))
5246               subclasses[0] = X86_64_INTEGER_CLASS;
5247
5248             for (i = 0; i < words; i++)
5249               classes[i] = subclasses[i % num];
5250
5251             break;
5252           }
5253         case UNION_TYPE:
5254         case QUAL_UNION_TYPE:
5255           /* Unions are similar to RECORD_TYPE but offset is always 0.
5256              */
5257           for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
5258             {
5259               if (TREE_CODE (field) == FIELD_DECL)
5260                 {
5261                   int num;
5262
5263                   if (TREE_TYPE (field) == error_mark_node)
5264                     continue;
5265
5266                   num = classify_argument (TYPE_MODE (TREE_TYPE (field)),
5267                                            TREE_TYPE (field), subclasses,
5268                                            bit_offset);
5269                   if (!num)
5270                     return 0;
5271                   for (i = 0; i < num; i++)
5272                     classes[i] = merge_classes (subclasses[i], classes[i]);
5273                 }
5274             }
5275           break;
5276
5277         default:
5278           gcc_unreachable ();
5279         }
5280
5281       if (words > 2)
5282         {
5283           /* When size > 16 bytes, if the first one isn't
5284              X86_64_SSE_CLASS or any other ones aren't
5285              X86_64_SSEUP_CLASS, everything should be passed in
5286              memory.  */
5287           if (classes[0] != X86_64_SSE_CLASS)
5288               return 0;
5289
5290           for (i = 1; i < words; i++)
5291             if (classes[i] != X86_64_SSEUP_CLASS)
5292               return 0;
5293         }
5294
5295       /* Final merger cleanup.  */
5296       for (i = 0; i < words; i++)
5297         {
5298           /* If one class is MEMORY, everything should be passed in
5299              memory.  */
5300           if (classes[i] == X86_64_MEMORY_CLASS)
5301             return 0;
5302
5303           /* The X86_64_SSEUP_CLASS should be always preceded by
5304              X86_64_SSE_CLASS or X86_64_SSEUP_CLASS.  */
5305           if (classes[i] == X86_64_SSEUP_CLASS
5306               && classes[i - 1] != X86_64_SSE_CLASS
5307               && classes[i - 1] != X86_64_SSEUP_CLASS)
5308             {
5309               /* The first one should never be X86_64_SSEUP_CLASS.  */
5310               gcc_assert (i != 0);
5311               classes[i] = X86_64_SSE_CLASS;
5312             }
5313
5314           /*  If X86_64_X87UP_CLASS isn't preceded by X86_64_X87_CLASS,
5315                everything should be passed in memory.  */
5316           if (classes[i] == X86_64_X87UP_CLASS
5317               && (classes[i - 1] != X86_64_X87_CLASS))
5318             {
5319               static bool warned;
5320
5321               /* The first one should never be X86_64_X87UP_CLASS.  */
5322               gcc_assert (i != 0);
5323               if (!warned && warn_psabi)
5324                 {
5325                   warned = true;
5326                   inform (input_location,
5327                           "The ABI of passing union with long double"
5328                           " has changed in GCC 4.4");
5329                 }
5330               return 0;
5331             }
5332         }
5333       return words;
5334     }
5335
5336   /* Compute alignment needed.  We align all types to natural boundaries with
5337      exception of XFmode that is aligned to 64bits.  */
5338   if (mode != VOIDmode && mode != BLKmode)
5339     {
5340       int mode_alignment = GET_MODE_BITSIZE (mode);
5341
5342       if (mode == XFmode)
5343         mode_alignment = 128;
5344       else if (mode == XCmode)
5345         mode_alignment = 256;
5346       if (COMPLEX_MODE_P (mode))
5347         mode_alignment /= 2;
5348       /* Misaligned fields are always returned in memory.  */
5349       if (bit_offset % mode_alignment)
5350         return 0;
5351     }
5352
5353   /* for V1xx modes, just use the base mode */
5354   if (VECTOR_MODE_P (mode) && mode != V1DImode
5355       && GET_MODE_SIZE (GET_MODE_INNER (mode)) == bytes)
5356     mode = GET_MODE_INNER (mode);
5357
5358   /* Classification of atomic types.  */
5359   switch (mode)
5360     {
5361     case SDmode:
5362     case DDmode:
5363       classes[0] = X86_64_SSE_CLASS;
5364       return 1;
5365     case TDmode:
5366       classes[0] = X86_64_SSE_CLASS;
5367       classes[1] = X86_64_SSEUP_CLASS;
5368       return 2;
5369     case DImode:
5370     case SImode:
5371     case HImode:
5372     case QImode:
5373     case CSImode:
5374     case CHImode:
5375     case CQImode:
5376       {
5377         int size = (bit_offset % 64)+ (int) GET_MODE_BITSIZE (mode);
5378
5379         if (size <= 32)
5380           {
5381             classes[0] = X86_64_INTEGERSI_CLASS;
5382             return 1;
5383           }
5384         else if (size <= 64)
5385           {
5386             classes[0] = X86_64_INTEGER_CLASS;
5387             return 1;
5388           }
5389         else if (size <= 64+32)
5390           {
5391             classes[0] = X86_64_INTEGER_CLASS;
5392             classes[1] = X86_64_INTEGERSI_CLASS;
5393             return 2;
5394           }
5395         else if (size <= 64+64)
5396           {
5397             classes[0] = classes[1] = X86_64_INTEGER_CLASS;
5398             return 2;
5399           }
5400         else
5401           gcc_unreachable ();
5402       }
5403     case CDImode:
5404     case TImode:
5405       classes[0] = classes[1] = X86_64_INTEGER_CLASS;
5406       return 2;
5407     case COImode:
5408     case OImode:
5409       /* OImode shouldn't be used directly.  */
5410       gcc_unreachable ();
5411     case CTImode:
5412       return 0;
5413     case SFmode:
5414       if (!(bit_offset % 64))
5415         classes[0] = X86_64_SSESF_CLASS;
5416       else
5417         classes[0] = X86_64_SSE_CLASS;
5418       return 1;
5419     case DFmode:
5420       classes[0] = X86_64_SSEDF_CLASS;
5421       return 1;
5422     case XFmode:
5423       classes[0] = X86_64_X87_CLASS;
5424       classes[1] = X86_64_X87UP_CLASS;
5425       return 2;
5426     case TFmode:
5427       classes[0] = X86_64_SSE_CLASS;
5428       classes[1] = X86_64_SSEUP_CLASS;
5429       return 2;
5430     case SCmode:
5431       classes[0] = X86_64_SSE_CLASS;
5432       if (!(bit_offset % 64))
5433         return 1;
5434       else
5435         {
5436           static bool warned;
5437
5438           if (!warned && warn_psabi)
5439             {
5440               warned = true;
5441               inform (input_location,
5442                       "The ABI of passing structure with complex float"
5443                       " member has changed in GCC 4.4");
5444             }
5445           classes[1] = X86_64_SSESF_CLASS;
5446           return 2;
5447         }
5448     case DCmode:
5449       classes[0] = X86_64_SSEDF_CLASS;
5450       classes[1] = X86_64_SSEDF_CLASS;
5451       return 2;
5452     case XCmode:
5453       classes[0] = X86_64_COMPLEX_X87_CLASS;
5454       return 1;
5455     case TCmode:
5456       /* This modes is larger than 16 bytes.  */
5457       return 0;
5458     case V8SFmode:
5459     case V8SImode:
5460     case V32QImode:
5461     case V16HImode:
5462     case V4DFmode:
5463     case V4DImode:
5464       classes[0] = X86_64_SSE_CLASS;
5465       classes[1] = X86_64_SSEUP_CLASS;
5466       classes[2] = X86_64_SSEUP_CLASS;
5467       classes[3] = X86_64_SSEUP_CLASS;
5468       return 4;
5469     case V4SFmode:
5470     case V4SImode:
5471     case V16QImode:
5472     case V8HImode:
5473     case V2DFmode:
5474     case V2DImode:
5475       classes[0] = X86_64_SSE_CLASS;
5476       classes[1] = X86_64_SSEUP_CLASS;
5477       return 2;
5478     case V1DImode:
5479     case V2SFmode:
5480     case V2SImode:
5481     case V4HImode:
5482     case V8QImode:
5483       classes[0] = X86_64_SSE_CLASS;
5484       return 1;
5485     case BLKmode:
5486     case VOIDmode:
5487       return 0;
5488     default:
5489       gcc_assert (VECTOR_MODE_P (mode));
5490
5491       if (bytes > 16)
5492         return 0;
5493
5494       gcc_assert (GET_MODE_CLASS (GET_MODE_INNER (mode)) == MODE_INT);
5495
5496       if (bit_offset + GET_MODE_BITSIZE (mode) <= 32)
5497         classes[0] = X86_64_INTEGERSI_CLASS;
5498       else
5499         classes[0] = X86_64_INTEGER_CLASS;
5500       classes[1] = X86_64_INTEGER_CLASS;
5501       return 1 + (bytes > 8);
5502     }
5503 }
5504
5505 /* Examine the argument and return set number of register required in each
5506    class.  Return 0 iff parameter should be passed in memory.  */
5507 static int
5508 examine_argument (enum machine_mode mode, const_tree type, int in_return,
5509                   int *int_nregs, int *sse_nregs)
5510 {
5511   enum x86_64_reg_class regclass[MAX_CLASSES];
5512   int n = classify_argument (mode, type, regclass, 0);
5513
5514   *int_nregs = 0;
5515   *sse_nregs = 0;
5516   if (!n)
5517     return 0;
5518   for (n--; n >= 0; n--)
5519     switch (regclass[n])
5520       {
5521       case X86_64_INTEGER_CLASS:
5522       case X86_64_INTEGERSI_CLASS:
5523         (*int_nregs)++;
5524         break;
5525       case X86_64_SSE_CLASS:
5526       case X86_64_SSESF_CLASS:
5527       case X86_64_SSEDF_CLASS:
5528         (*sse_nregs)++;
5529         break;
5530       case X86_64_NO_CLASS:
5531       case X86_64_SSEUP_CLASS:
5532         break;
5533       case X86_64_X87_CLASS:
5534       case X86_64_X87UP_CLASS:
5535         if (!in_return)
5536           return 0;
5537         break;
5538       case X86_64_COMPLEX_X87_CLASS:
5539         return in_return ? 2 : 0;
5540       case X86_64_MEMORY_CLASS:
5541         gcc_unreachable ();
5542       }
5543   return 1;
5544 }
5545
5546 /* Construct container for the argument used by GCC interface.  See
5547    FUNCTION_ARG for the detailed description.  */
5548
5549 static rtx
5550 construct_container (enum machine_mode mode, enum machine_mode orig_mode,
5551                      const_tree type, int in_return, int nintregs, int nsseregs,
5552                      const int *intreg, int sse_regno)
5553 {
5554   /* The following variables hold the static issued_error state.  */
5555   static bool issued_sse_arg_error;
5556   static bool issued_sse_ret_error;
5557   static bool issued_x87_ret_error;
5558
5559   enum machine_mode tmpmode;
5560   int bytes =
5561     (mode == BLKmode) ? int_size_in_bytes (type) : (int) GET_MODE_SIZE (mode);
5562   enum x86_64_reg_class regclass[MAX_CLASSES];
5563   int n;
5564   int i;
5565   int nexps = 0;
5566   int needed_sseregs, needed_intregs;
5567   rtx exp[MAX_CLASSES];
5568   rtx ret;
5569
5570   n = classify_argument (mode, type, regclass, 0);
5571   if (!n)
5572     return NULL;
5573   if (!examine_argument (mode, type, in_return, &needed_intregs,
5574                          &needed_sseregs))
5575     return NULL;
5576   if (needed_intregs > nintregs || needed_sseregs > nsseregs)
5577     return NULL;
5578
5579   /* We allowed the user to turn off SSE for kernel mode.  Don't crash if
5580      some less clueful developer tries to use floating-point anyway.  */
5581   if (needed_sseregs && !TARGET_SSE)
5582     {
5583       if (in_return)
5584         {
5585           if (!issued_sse_ret_error)
5586             {
5587               error ("SSE register return with SSE disabled");
5588               issued_sse_ret_error = true;
5589             }
5590         }
5591       else if (!issued_sse_arg_error)
5592         {
5593           error ("SSE register argument with SSE disabled");
5594           issued_sse_arg_error = true;
5595         }
5596       return NULL;
5597     }
5598
5599   /* Likewise, error if the ABI requires us to return values in the
5600      x87 registers and the user specified -mno-80387.  */
5601   if (!TARGET_80387 && in_return)
5602     for (i = 0; i < n; i++)
5603       if (regclass[i] == X86_64_X87_CLASS
5604           || regclass[i] == X86_64_X87UP_CLASS
5605           || regclass[i] == X86_64_COMPLEX_X87_CLASS)
5606         {
5607           if (!issued_x87_ret_error)
5608             {
5609               error ("x87 register return with x87 disabled");
5610               issued_x87_ret_error = true;
5611             }
5612           return NULL;
5613         }
5614
5615   /* First construct simple cases.  Avoid SCmode, since we want to use
5616      single register to pass this type.  */
5617   if (n == 1 && mode != SCmode)
5618     switch (regclass[0])
5619       {
5620       case X86_64_INTEGER_CLASS:
5621       case X86_64_INTEGERSI_CLASS:
5622         return gen_rtx_REG (mode, intreg[0]);
5623       case X86_64_SSE_CLASS:
5624       case X86_64_SSESF_CLASS:
5625       case X86_64_SSEDF_CLASS:
5626         if (mode != BLKmode)
5627           return gen_reg_or_parallel (mode, orig_mode, 
5628                                       SSE_REGNO (sse_regno));
5629         break;
5630       case X86_64_X87_CLASS:
5631       case X86_64_COMPLEX_X87_CLASS:
5632         return gen_rtx_REG (mode, FIRST_STACK_REG);
5633       case X86_64_NO_CLASS:
5634         /* Zero sized array, struct or class.  */
5635         return NULL;
5636       default:
5637         gcc_unreachable ();
5638       }
5639   if (n == 2 && regclass[0] == X86_64_SSE_CLASS
5640       && regclass[1] == X86_64_SSEUP_CLASS && mode != BLKmode)
5641     return gen_rtx_REG (mode, SSE_REGNO (sse_regno));
5642   if (n == 4
5643       && regclass[0] == X86_64_SSE_CLASS
5644       && regclass[1] == X86_64_SSEUP_CLASS
5645       && regclass[2] == X86_64_SSEUP_CLASS
5646       && regclass[3] == X86_64_SSEUP_CLASS
5647       && mode != BLKmode)
5648     return gen_rtx_REG (mode, SSE_REGNO (sse_regno));
5649
5650   if (n == 2
5651       && regclass[0] == X86_64_X87_CLASS && regclass[1] == X86_64_X87UP_CLASS)
5652     return gen_rtx_REG (XFmode, FIRST_STACK_REG);
5653   if (n == 2 && regclass[0] == X86_64_INTEGER_CLASS
5654       && regclass[1] == X86_64_INTEGER_CLASS
5655       && (mode == CDImode || mode == TImode || mode == TFmode)
5656       && intreg[0] + 1 == intreg[1])
5657     return gen_rtx_REG (mode, intreg[0]);
5658
5659   /* Otherwise figure out the entries of the PARALLEL.  */
5660   for (i = 0; i < n; i++)
5661     {
5662       int pos;
5663
5664       switch (regclass[i])
5665         {
5666           case X86_64_NO_CLASS:
5667             break;
5668           case X86_64_INTEGER_CLASS:
5669           case X86_64_INTEGERSI_CLASS:
5670             /* Merge TImodes on aligned occasions here too.  */
5671             if (i * 8 + 8 > bytes)
5672               tmpmode = mode_for_size ((bytes - i * 8) * BITS_PER_UNIT, MODE_INT, 0);
5673             else if (regclass[i] == X86_64_INTEGERSI_CLASS)
5674               tmpmode = SImode;
5675             else
5676               tmpmode = DImode;
5677             /* We've requested 24 bytes we don't have mode for.  Use DImode.  */
5678             if (tmpmode == BLKmode)
5679               tmpmode = DImode;
5680             exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
5681                                                gen_rtx_REG (tmpmode, *intreg),
5682                                                GEN_INT (i*8));
5683             intreg++;
5684             break;
5685           case X86_64_SSESF_CLASS:
5686             exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
5687                                                gen_rtx_REG (SFmode,
5688                                                             SSE_REGNO (sse_regno)),
5689                                                GEN_INT (i*8));
5690             sse_regno++;
5691             break;
5692           case X86_64_SSEDF_CLASS:
5693             exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
5694                                                gen_rtx_REG (DFmode,
5695                                                             SSE_REGNO (sse_regno)),
5696                                                GEN_INT (i*8));
5697             sse_regno++;
5698             break;
5699           case X86_64_SSE_CLASS:
5700             pos = i;
5701             switch (n)
5702               {
5703               case 1:
5704                 tmpmode = DImode;
5705                 break;
5706               case 2:
5707                 if (i == 0 && regclass[1] == X86_64_SSEUP_CLASS)
5708                   {
5709                     tmpmode = TImode;
5710                     i++;
5711                   }
5712                 else
5713                   tmpmode = DImode;
5714                 break;
5715               case 4:
5716                 gcc_assert (i == 0
5717                             && regclass[1] == X86_64_SSEUP_CLASS
5718                             && regclass[2] == X86_64_SSEUP_CLASS
5719                             && regclass[3] == X86_64_SSEUP_CLASS);
5720                 tmpmode = OImode;
5721                 i += 3;
5722                 break;
5723               default:
5724                 gcc_unreachable ();
5725               }
5726             exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
5727                                                gen_rtx_REG (tmpmode,
5728                                                             SSE_REGNO (sse_regno)),
5729                                                GEN_INT (pos*8));
5730             sse_regno++;
5731             break;
5732           default:
5733             gcc_unreachable ();
5734         }
5735     }
5736
5737   /* Empty aligned struct, union or class.  */
5738   if (nexps == 0)
5739     return NULL;
5740
5741   ret =  gen_rtx_PARALLEL (mode, rtvec_alloc (nexps));
5742   for (i = 0; i < nexps; i++)
5743     XVECEXP (ret, 0, i) = exp [i];
5744   return ret;
5745 }
5746
5747 /* Update the data in CUM to advance over an argument of mode MODE
5748    and data type TYPE.  (TYPE is null for libcalls where that information
5749    may not be available.)  */
5750
5751 static void
5752 function_arg_advance_32 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5753                          tree type, HOST_WIDE_INT bytes, HOST_WIDE_INT words)
5754 {
5755   switch (mode)
5756     {
5757     default:
5758       break;
5759
5760     case BLKmode:
5761       if (bytes < 0)
5762         break;
5763       /* FALLTHRU */
5764
5765     case DImode:
5766     case SImode:
5767     case HImode:
5768     case QImode:
5769       cum->words += words;
5770       cum->nregs -= words;
5771       cum->regno += words;
5772
5773       if (cum->nregs <= 0)
5774         {
5775           cum->nregs = 0;
5776           cum->regno = 0;
5777         }
5778       break;
5779
5780     case OImode:
5781       /* OImode shouldn't be used directly.  */
5782       gcc_unreachable ();
5783
5784     case DFmode:
5785       if (cum->float_in_sse < 2)
5786         break;
5787     case SFmode:
5788       if (cum->float_in_sse < 1)
5789         break;
5790       /* FALLTHRU */
5791
5792     case V8SFmode:
5793     case V8SImode:
5794     case V32QImode:
5795     case V16HImode:
5796     case V4DFmode:
5797     case V4DImode:
5798     case TImode:
5799     case V16QImode:
5800     case V8HImode:
5801     case V4SImode:
5802     case V2DImode:
5803     case V4SFmode:
5804     case V2DFmode:
5805       if (!type || !AGGREGATE_TYPE_P (type))
5806         {
5807           cum->sse_words += words;
5808           cum->sse_nregs -= 1;
5809           cum->sse_regno += 1;
5810           if (cum->sse_nregs <= 0)
5811             {
5812               cum->sse_nregs = 0;
5813               cum->sse_regno = 0;
5814             }
5815         }
5816       break;
5817
5818     case V8QImode:
5819     case V4HImode:
5820     case V2SImode:
5821     case V2SFmode:
5822     case V1DImode:
5823       if (!type || !AGGREGATE_TYPE_P (type))
5824         {
5825           cum->mmx_words += words;
5826           cum->mmx_nregs -= 1;
5827           cum->mmx_regno += 1;
5828           if (cum->mmx_nregs <= 0)
5829             {
5830               cum->mmx_nregs = 0;
5831               cum->mmx_regno = 0;
5832             }
5833         }
5834       break;
5835     }
5836 }
5837
5838 static void
5839 function_arg_advance_64 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5840                          tree type, HOST_WIDE_INT words, int named)
5841 {
5842   int int_nregs, sse_nregs;
5843
5844   /* Unnamed 256bit vector mode parameters are passed on stack.  */
5845   if (!named && VALID_AVX256_REG_MODE (mode))
5846     return;
5847
5848   if (!examine_argument (mode, type, 0, &int_nregs, &sse_nregs))
5849     cum->words += words;
5850   else if (sse_nregs <= cum->sse_nregs && int_nregs <= cum->nregs)
5851     {
5852       cum->nregs -= int_nregs;
5853       cum->sse_nregs -= sse_nregs;
5854       cum->regno += int_nregs;
5855       cum->sse_regno += sse_nregs;
5856     }
5857   else
5858     cum->words += words;
5859 }
5860
5861 static void
5862 function_arg_advance_ms_64 (CUMULATIVE_ARGS *cum, HOST_WIDE_INT bytes,
5863                             HOST_WIDE_INT words)
5864 {
5865   /* Otherwise, this should be passed indirect.  */
5866   gcc_assert (bytes == 1 || bytes == 2 || bytes == 4 || bytes == 8);
5867
5868   cum->words += words;
5869   if (cum->nregs > 0)
5870     {
5871       cum->nregs -= 1;
5872       cum->regno += 1;
5873     }
5874 }
5875
5876 void
5877 function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5878                       tree type, int named)
5879 {
5880   HOST_WIDE_INT bytes, words;
5881
5882   if (mode == BLKmode)
5883     bytes = int_size_in_bytes (type);
5884   else
5885     bytes = GET_MODE_SIZE (mode);
5886   words = (bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
5887
5888   if (type)
5889     mode = type_natural_mode (type, NULL);
5890
5891   if (TARGET_64BIT && (cum ? cum->call_abi : ix86_abi) == MS_ABI)
5892     function_arg_advance_ms_64 (cum, bytes, words);
5893   else if (TARGET_64BIT)
5894     function_arg_advance_64 (cum, mode, type, words, named);
5895   else
5896     function_arg_advance_32 (cum, mode, type, bytes, words);
5897 }
5898
5899 /* Define where to put the arguments to a function.
5900    Value is zero to push the argument on the stack,
5901    or a hard register in which to store the argument.
5902
5903    MODE is the argument's machine mode.
5904    TYPE is the data type of the argument (as a tree).
5905     This is null for libcalls where that information may
5906     not be available.
5907    CUM is a variable of type CUMULATIVE_ARGS which gives info about
5908     the preceding args and about the function being called.
5909    NAMED is nonzero if this argument is a named parameter
5910     (otherwise it is an extra parameter matching an ellipsis).  */
5911
5912 static rtx
5913 function_arg_32 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5914                  enum machine_mode orig_mode, tree type,
5915                  HOST_WIDE_INT bytes, HOST_WIDE_INT words)
5916 {
5917   static bool warnedsse, warnedmmx;
5918
5919   /* Avoid the AL settings for the Unix64 ABI.  */
5920   if (mode == VOIDmode)
5921     return constm1_rtx;
5922
5923   switch (mode)
5924     {
5925     default:
5926       break;
5927
5928     case BLKmode:
5929       if (bytes < 0)
5930         break;
5931       /* FALLTHRU */
5932     case DImode:
5933     case SImode:
5934     case HImode:
5935     case QImode:
5936       if (words <= cum->nregs)
5937         {
5938           int regno = cum->regno;
5939
5940           /* Fastcall allocates the first two DWORD (SImode) or
5941             smaller arguments to ECX and EDX if it isn't an
5942             aggregate type .  */
5943           if (cum->fastcall)
5944             {
5945               if (mode == BLKmode
5946                   || mode == DImode
5947                   || (type && AGGREGATE_TYPE_P (type)))
5948                 break;
5949
5950               /* ECX not EAX is the first allocated register.  */
5951               if (regno == AX_REG)
5952                 regno = CX_REG;
5953             }
5954           return gen_rtx_REG (mode, regno);
5955         }
5956       break;
5957
5958     case DFmode:
5959       if (cum->float_in_sse < 2)
5960         break;
5961     case SFmode:
5962       if (cum->float_in_sse < 1)
5963         break;
5964       /* FALLTHRU */
5965     case TImode:
5966       /* In 32bit, we pass TImode in xmm registers.  */
5967     case V16QImode:
5968     case V8HImode:
5969     case V4SImode:
5970     case V2DImode:
5971     case V4SFmode:
5972     case V2DFmode:
5973       if (!type || !AGGREGATE_TYPE_P (type))
5974         {
5975           if (!TARGET_SSE && !warnedsse && cum->warn_sse)
5976             {
5977               warnedsse = true;
5978               warning (0, "SSE vector argument without SSE enabled "
5979                        "changes the ABI");
5980             }
5981           if (cum->sse_nregs)
5982             return gen_reg_or_parallel (mode, orig_mode,
5983                                         cum->sse_regno + FIRST_SSE_REG);
5984         }
5985       break;
5986
5987     case OImode:
5988       /* OImode shouldn't be used directly.  */
5989       gcc_unreachable ();
5990
5991     case V8SFmode:
5992     case V8SImode:
5993     case V32QImode:
5994     case V16HImode:
5995     case V4DFmode:
5996     case V4DImode:
5997       if (!type || !AGGREGATE_TYPE_P (type))
5998         {
5999           if (cum->sse_nregs)
6000             return gen_reg_or_parallel (mode, orig_mode,
6001                                         cum->sse_regno + FIRST_SSE_REG);
6002         }
6003       break;
6004
6005     case V8QImode:
6006     case V4HImode:
6007     case V2SImode:
6008     case V2SFmode:
6009     case V1DImode:
6010       if (!type || !AGGREGATE_TYPE_P (type))
6011         {
6012           if (!TARGET_MMX && !warnedmmx && cum->warn_mmx)
6013             {
6014               warnedmmx = true;
6015               warning (0, "MMX vector argument without MMX enabled "
6016                        "changes the ABI");
6017             }
6018           if (cum->mmx_nregs)
6019             return gen_reg_or_parallel (mode, orig_mode,
6020                                         cum->mmx_regno + FIRST_MMX_REG);
6021         }
6022       break;
6023     }
6024
6025   return NULL_RTX;
6026 }
6027
6028 static rtx
6029 function_arg_64 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
6030                  enum machine_mode orig_mode, tree type, int named)
6031 {
6032   /* Handle a hidden AL argument containing number of registers
6033      for varargs x86-64 functions.  */
6034   if (mode == VOIDmode)
6035     return GEN_INT (cum->maybe_vaarg
6036                     ? (cum->sse_nregs < 0
6037                        ? (cum->call_abi == ix86_abi
6038                           ? SSE_REGPARM_MAX
6039                           : (ix86_abi != SYSV_ABI
6040                              ? X86_64_SSE_REGPARM_MAX
6041                              : X86_64_MS_SSE_REGPARM_MAX))
6042                        : cum->sse_regno)
6043                     : -1);
6044
6045   switch (mode)
6046     {
6047     default:
6048       break;
6049
6050     case V8SFmode:
6051     case V8SImode:
6052     case V32QImode:
6053     case V16HImode:
6054     case V4DFmode:
6055     case V4DImode:
6056       /* Unnamed 256bit vector mode parameters are passed on stack.  */
6057       if (!named)
6058         return NULL;
6059       break;
6060     }
6061
6062   return construct_container (mode, orig_mode, type, 0, cum->nregs,
6063                               cum->sse_nregs,
6064                               &x86_64_int_parameter_registers [cum->regno],
6065                               cum->sse_regno);
6066 }
6067
6068 static rtx
6069 function_arg_ms_64 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
6070                     enum machine_mode orig_mode, int named,
6071                     HOST_WIDE_INT bytes)
6072 {
6073   unsigned int regno;
6074
6075   /* We need to add clobber for MS_ABI->SYSV ABI calls in expand_call.
6076      We use value of -2 to specify that current function call is MSABI.  */
6077   if (mode == VOIDmode)
6078     return GEN_INT (-2);
6079
6080   /* If we've run out of registers, it goes on the stack.  */
6081   if (cum->nregs == 0)
6082     return NULL_RTX;
6083
6084   regno = x86_64_ms_abi_int_parameter_registers[cum->regno];
6085
6086   /* Only floating point modes are passed in anything but integer regs.  */
6087   if (TARGET_SSE && (mode == SFmode || mode == DFmode))
6088     {
6089       if (named)
6090         regno = cum->regno + FIRST_SSE_REG;
6091       else
6092         {
6093           rtx t1, t2;
6094
6095           /* Unnamed floating parameters are passed in both the
6096              SSE and integer registers.  */
6097           t1 = gen_rtx_REG (mode, cum->regno + FIRST_SSE_REG);
6098           t2 = gen_rtx_REG (mode, regno);
6099           t1 = gen_rtx_EXPR_LIST (VOIDmode, t1, const0_rtx);
6100           t2 = gen_rtx_EXPR_LIST (VOIDmode, t2, const0_rtx);
6101           return gen_rtx_PARALLEL (mode, gen_rtvec (2, t1, t2));
6102         }
6103     }
6104   /* Handle aggregated types passed in register.  */
6105   if (orig_mode == BLKmode)
6106     {
6107       if (bytes > 0 && bytes <= 8)
6108         mode = (bytes > 4 ? DImode : SImode);
6109       if (mode == BLKmode)
6110         mode = DImode;
6111     }
6112
6113   return gen_reg_or_parallel (mode, orig_mode, regno);
6114 }
6115
6116 rtx
6117 function_arg (CUMULATIVE_ARGS *cum, enum machine_mode omode,
6118               tree type, int named)
6119 {
6120   enum machine_mode mode = omode;
6121   HOST_WIDE_INT bytes, words;
6122
6123   if (mode == BLKmode)
6124     bytes = int_size_in_bytes (type);
6125   else
6126     bytes = GET_MODE_SIZE (mode);
6127   words = (bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
6128
6129   /* To simplify the code below, represent vector types with a vector mode
6130      even if MMX/SSE are not active.  */
6131   if (type && TREE_CODE (type) == VECTOR_TYPE)
6132     mode = type_natural_mode (type, cum);
6133
6134   if (TARGET_64BIT && (cum ? cum->call_abi : ix86_abi) == MS_ABI)
6135     return function_arg_ms_64 (cum, mode, omode, named, bytes);
6136   else if (TARGET_64BIT)
6137     return function_arg_64 (cum, mode, omode, type, named);
6138   else
6139     return function_arg_32 (cum, mode, omode, type, bytes, words);
6140 }
6141
6142 /* A C expression that indicates when an argument must be passed by
6143    reference.  If nonzero for an argument, a copy of that argument is
6144    made in memory and a pointer to the argument is passed instead of
6145    the argument itself.  The pointer is passed in whatever way is
6146    appropriate for passing a pointer to that type.  */
6147
6148 static bool
6149 ix86_pass_by_reference (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
6150                         enum machine_mode mode ATTRIBUTE_UNUSED,
6151                         const_tree type, bool named ATTRIBUTE_UNUSED)
6152 {
6153   /* See Windows x64 Software Convention.  */
6154   if (TARGET_64BIT && (cum ? cum->call_abi : ix86_abi) == MS_ABI)
6155     {
6156       int msize = (int) GET_MODE_SIZE (mode);
6157       if (type)
6158         {
6159           /* Arrays are passed by reference.  */
6160           if (TREE_CODE (type) == ARRAY_TYPE)
6161             return true;
6162
6163           if (AGGREGATE_TYPE_P (type))
6164             {
6165               /* Structs/unions of sizes other than 8, 16, 32, or 64 bits
6166                  are passed by reference.  */
6167               msize = int_size_in_bytes (type);
6168             }
6169         }
6170
6171       /* __m128 is passed by reference.  */
6172       switch (msize) {
6173       case 1: case 2: case 4: case 8:
6174         break;
6175       default:
6176         return true;
6177       }
6178     }
6179   else if (TARGET_64BIT && type && int_size_in_bytes (type) == -1)
6180     return 1;
6181
6182   return 0;
6183 }
6184
6185 /* Return true when TYPE should be 128bit aligned for 32bit argument passing
6186    ABI.  */
6187 static bool
6188 contains_aligned_value_p (tree type)
6189 {
6190   enum machine_mode mode = TYPE_MODE (type);
6191   if (((TARGET_SSE && SSE_REG_MODE_P (mode))
6192        || mode == TDmode
6193        || mode == TFmode
6194        || mode == TCmode)
6195       && (!TYPE_USER_ALIGN (type) || TYPE_ALIGN (type) > 128))
6196     return true;
6197   if (TYPE_ALIGN (type) < 128)
6198     return false;
6199
6200   if (AGGREGATE_TYPE_P (type))
6201     {
6202       /* Walk the aggregates recursively.  */
6203       switch (TREE_CODE (type))
6204         {
6205         case RECORD_TYPE:
6206         case UNION_TYPE:
6207         case QUAL_UNION_TYPE:
6208           {
6209             tree field;
6210
6211             /* Walk all the structure fields.  */
6212             for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
6213               {
6214                 if (TREE_CODE (field) == FIELD_DECL
6215                     && contains_aligned_value_p (TREE_TYPE (field)))
6216                   return true;
6217               }
6218             break;
6219           }
6220
6221         case ARRAY_TYPE:
6222           /* Just for use if some languages passes arrays by value.  */
6223           if (contains_aligned_value_p (TREE_TYPE (type)))
6224             return true;
6225           break;
6226
6227         default:
6228           gcc_unreachable ();
6229         }
6230     }
6231   return false;
6232 }
6233
6234 /* Gives the alignment boundary, in bits, of an argument with the
6235    specified mode and type.  */
6236
6237 int
6238 ix86_function_arg_boundary (enum machine_mode mode, tree type)
6239 {
6240   int align;
6241   if (type)
6242     {
6243       /* Since canonical type is used for call, we convert it to
6244          canonical type if needed.  */
6245       if (!TYPE_STRUCTURAL_EQUALITY_P (type))
6246         type = TYPE_CANONICAL (type);
6247       align = TYPE_ALIGN (type);
6248     }
6249   else
6250     align = GET_MODE_ALIGNMENT (mode);
6251   if (align < PARM_BOUNDARY)
6252     align = PARM_BOUNDARY;
6253   /* In 32bit, only _Decimal128 and __float128 are aligned to their
6254      natural boundaries.  */
6255   if (!TARGET_64BIT && mode != TDmode && mode != TFmode)
6256     {
6257       /* i386 ABI defines all arguments to be 4 byte aligned.  We have to
6258          make an exception for SSE modes since these require 128bit
6259          alignment.
6260
6261          The handling here differs from field_alignment.  ICC aligns MMX
6262          arguments to 4 byte boundaries, while structure fields are aligned
6263          to 8 byte boundaries.  */
6264       if (!type)
6265         {
6266           if (!(TARGET_SSE && SSE_REG_MODE_P (mode)))
6267             align = PARM_BOUNDARY;
6268         }
6269       else
6270         {
6271           if (!contains_aligned_value_p (type))
6272             align = PARM_BOUNDARY;
6273         }
6274     }
6275   if (align > BIGGEST_ALIGNMENT)
6276     align = BIGGEST_ALIGNMENT;
6277   return align;
6278 }
6279
6280 /* Return true if N is a possible register number of function value.  */
6281
6282 bool
6283 ix86_function_value_regno_p (int regno)
6284 {
6285   switch (regno)
6286     {
6287     case 0:
6288       return true;
6289
6290     case FIRST_FLOAT_REG:
6291       /* TODO: The function should depend on current function ABI but
6292        builtins.c would need updating then. Therefore we use the
6293        default ABI.  */
6294       if (TARGET_64BIT && ix86_abi == MS_ABI)
6295         return false;
6296       return TARGET_FLOAT_RETURNS_IN_80387;
6297
6298     case FIRST_SSE_REG:
6299       return TARGET_SSE;
6300
6301     case FIRST_MMX_REG:
6302       if (TARGET_MACHO || TARGET_64BIT)
6303         return false;
6304       return TARGET_MMX;
6305     }
6306
6307   return false;
6308 }
6309
6310 /* Define how to find the value returned by a function.
6311    VALTYPE is the data type of the value (as a tree).
6312    If the precise function being called is known, FUNC is its FUNCTION_DECL;
6313    otherwise, FUNC is 0.  */
6314
6315 static rtx
6316 function_value_32 (enum machine_mode orig_mode, enum machine_mode mode,
6317                    const_tree fntype, const_tree fn)
6318 {
6319   unsigned int regno;
6320
6321   /* 8-byte vector modes in %mm0. See ix86_return_in_memory for where
6322      we normally prevent this case when mmx is not available.  However
6323      some ABIs may require the result to be returned like DImode.  */
6324   if (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 8)
6325     regno = TARGET_MMX ? FIRST_MMX_REG : 0;
6326
6327   /* 16-byte vector modes in %xmm0.  See ix86_return_in_memory for where
6328      we prevent this case when sse is not available.  However some ABIs
6329      may require the result to be returned like integer TImode.  */
6330   else if (mode == TImode
6331            || (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 16))
6332     regno = TARGET_SSE ? FIRST_SSE_REG : 0;
6333
6334   /* 32-byte vector modes in %ymm0.   */
6335   else if (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 32)
6336     regno = TARGET_AVX ? FIRST_SSE_REG : 0;
6337
6338   /* Floating point return values in %st(0) (unless -mno-fp-ret-in-387).  */
6339   else if (X87_FLOAT_MODE_P (mode) && TARGET_FLOAT_RETURNS_IN_80387)
6340     regno = FIRST_FLOAT_REG;
6341   else
6342     /* Most things go in %eax.  */
6343     regno = AX_REG;
6344
6345   /* Override FP return register with %xmm0 for local functions when
6346      SSE math is enabled or for functions with sseregparm attribute.  */
6347   if ((fn || fntype) && (mode == SFmode || mode == DFmode))
6348     {
6349       int sse_level = ix86_function_sseregparm (fntype, fn, false);
6350       if ((sse_level >= 1 && mode == SFmode)
6351           || (sse_level == 2 && mode == DFmode))
6352         regno = FIRST_SSE_REG;
6353     }
6354
6355   /* OImode shouldn't be used directly.  */
6356   gcc_assert (mode != OImode);
6357
6358   return gen_rtx_REG (orig_mode, regno);
6359 }
6360
6361 static rtx
6362 function_value_64 (enum machine_mode orig_mode, enum machine_mode mode,
6363                    const_tree valtype)
6364 {
6365   rtx ret;
6366
6367   /* Handle libcalls, which don't provide a type node.  */
6368   if (valtype == NULL)
6369     {
6370       switch (mode)
6371         {
6372         case SFmode:
6373         case SCmode:
6374         case DFmode:
6375         case DCmode:
6376         case TFmode:
6377         case SDmode:
6378         case DDmode:
6379         case TDmode:
6380           return gen_rtx_REG (mode, FIRST_SSE_REG);
6381         case XFmode:
6382         case XCmode:
6383           return gen_rtx_REG (mode, FIRST_FLOAT_REG);
6384         case TCmode:
6385           return NULL;
6386         default:
6387           return gen_rtx_REG (mode, AX_REG);
6388         }
6389     }
6390
6391   ret = construct_container (mode, orig_mode, valtype, 1,
6392                              X86_64_REGPARM_MAX, X86_64_SSE_REGPARM_MAX,
6393                              x86_64_int_return_registers, 0);
6394
6395   /* For zero sized structures, construct_container returns NULL, but we
6396      need to keep rest of compiler happy by returning meaningful value.  */
6397   if (!ret)
6398     ret = gen_rtx_REG (orig_mode, AX_REG);
6399
6400   return ret;
6401 }
6402
6403 static rtx
6404 function_value_ms_64 (enum machine_mode orig_mode, enum machine_mode mode)
6405 {
6406   unsigned int regno = AX_REG;
6407
6408   if (TARGET_SSE)
6409     {
6410       switch (GET_MODE_SIZE (mode))
6411         {
6412         case 16:
6413           if((SCALAR_INT_MODE_P (mode) || VECTOR_MODE_P (mode))
6414              && !COMPLEX_MODE_P (mode))
6415             regno = FIRST_SSE_REG;
6416           break;
6417         case 8:
6418         case 4:
6419           if (mode == SFmode || mode == DFmode)
6420             regno = FIRST_SSE_REG;
6421           break;
6422         default:
6423           break;
6424         }
6425     }
6426   return gen_rtx_REG (orig_mode, regno);
6427 }
6428
6429 static rtx
6430 ix86_function_value_1 (const_tree valtype, const_tree fntype_or_decl,
6431                        enum machine_mode orig_mode, enum machine_mode mode)
6432 {
6433   const_tree fn, fntype;
6434
6435   fn = NULL_TREE;
6436   if (fntype_or_decl && DECL_P (fntype_or_decl))
6437     fn = fntype_or_decl;
6438   fntype = fn ? TREE_TYPE (fn) : fntype_or_decl;
6439
6440   if (TARGET_64BIT && ix86_function_type_abi (fntype) == MS_ABI)
6441     return function_value_ms_64 (orig_mode, mode);
6442   else if (TARGET_64BIT)
6443     return function_value_64 (orig_mode, mode, valtype);
6444   else
6445     return function_value_32 (orig_mode, mode, fntype, fn);
6446 }
6447
6448 static rtx
6449 ix86_function_value (const_tree valtype, const_tree fntype_or_decl,
6450                      bool outgoing ATTRIBUTE_UNUSED)
6451 {
6452   enum machine_mode mode, orig_mode;
6453
6454   orig_mode = TYPE_MODE (valtype);
6455   mode = type_natural_mode (valtype, NULL);
6456   return ix86_function_value_1 (valtype, fntype_or_decl, orig_mode, mode);
6457 }
6458
6459 rtx
6460 ix86_libcall_value (enum machine_mode mode)
6461 {
6462   return ix86_function_value_1 (NULL, NULL, mode, mode);
6463 }
6464
6465 /* Return true iff type is returned in memory.  */
6466
6467 static int ATTRIBUTE_UNUSED
6468 return_in_memory_32 (const_tree type, enum machine_mode mode)
6469 {
6470   HOST_WIDE_INT size;
6471
6472   if (mode == BLKmode)
6473     return 1;
6474
6475   size = int_size_in_bytes (type);
6476
6477   if (MS_AGGREGATE_RETURN && AGGREGATE_TYPE_P (type) && size <= 8)
6478     return 0;
6479
6480   if (VECTOR_MODE_P (mode) || mode == TImode)
6481     {
6482       /* User-created vectors small enough to fit in EAX.  */
6483       if (size < 8)
6484         return 0;
6485
6486       /* MMX/3dNow values are returned in MM0,
6487          except when it doesn't exits.  */
6488       if (size == 8)
6489         return (TARGET_MMX ? 0 : 1);
6490
6491       /* SSE values are returned in XMM0, except when it doesn't exist.  */
6492       if (size == 16)
6493         return (TARGET_SSE ? 0 : 1);
6494
6495       /* AVX values are returned in YMM0, except when it doesn't exist.  */
6496       if (size == 32)
6497         return TARGET_AVX ? 0 : 1;
6498     }
6499
6500   if (mode == XFmode)
6501     return 0;
6502
6503   if (size > 12)
6504     return 1;
6505
6506   /* OImode shouldn't be used directly.  */
6507   gcc_assert (mode != OImode);
6508
6509   return 0;
6510 }
6511
6512 static int ATTRIBUTE_UNUSED
6513 return_in_memory_64 (const_tree type, enum machine_mode mode)
6514 {
6515   int needed_intregs, needed_sseregs;
6516   return !examine_argument (mode, type, 1, &needed_intregs, &needed_sseregs);
6517 }
6518
6519 static int ATTRIBUTE_UNUSED
6520 return_in_memory_ms_64 (const_tree type, enum machine_mode mode)
6521 {
6522   HOST_WIDE_INT size = int_size_in_bytes (type);
6523
6524   /* __m128 is returned in xmm0.  */
6525   if ((SCALAR_INT_MODE_P (mode) || VECTOR_MODE_P (mode))
6526       && !COMPLEX_MODE_P (mode) && (GET_MODE_SIZE (mode) == 16 || size == 16))
6527     return 0;
6528
6529   /* Otherwise, the size must be exactly in [1248]. */
6530   return (size != 1 && size != 2 && size != 4 && size != 8);
6531 }
6532
6533 static bool
6534 ix86_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
6535 {
6536 #ifdef SUBTARGET_RETURN_IN_MEMORY
6537   return SUBTARGET_RETURN_IN_MEMORY (type, fntype);
6538 #else
6539   const enum machine_mode mode = type_natural_mode (type, NULL);
6540  
6541   if (TARGET_64BIT)
6542     {
6543       if (ix86_function_type_abi (fntype) == MS_ABI)
6544         return return_in_memory_ms_64 (type, mode);
6545       else
6546         return return_in_memory_64 (type, mode);
6547     }
6548   else
6549     return return_in_memory_32 (type, mode);
6550 #endif
6551 }
6552
6553 /* Return false iff TYPE is returned in memory.  This version is used
6554    on Solaris 10.  It is similar to the generic ix86_return_in_memory,
6555    but differs notably in that when MMX is available, 8-byte vectors
6556    are returned in memory, rather than in MMX registers.  */
6557
6558 bool
6559 ix86_sol10_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
6560 {
6561   int size;
6562   enum machine_mode mode = type_natural_mode (type, NULL);
6563
6564   if (TARGET_64BIT)
6565     return return_in_memory_64 (type, mode);
6566
6567   if (mode == BLKmode)
6568     return 1;
6569
6570   size = int_size_in_bytes (type);
6571
6572   if (VECTOR_MODE_P (mode))
6573     {
6574       /* Return in memory only if MMX registers *are* available.  This
6575          seems backwards, but it is consistent with the existing
6576          Solaris x86 ABI.  */
6577       if (size == 8)
6578         return TARGET_MMX;
6579       if (size == 16)
6580         return !TARGET_SSE;
6581     }
6582   else if (mode == TImode)
6583     return !TARGET_SSE;
6584   else if (mode == XFmode)
6585     return 0;
6586
6587   return size > 12;
6588 }
6589
6590 /* When returning SSE vector types, we have a choice of either
6591      (1) being abi incompatible with a -march switch, or
6592      (2) generating an error.
6593    Given no good solution, I think the safest thing is one warning.
6594    The user won't be able to use -Werror, but....
6595
6596    Choose the STRUCT_VALUE_RTX hook because that's (at present) only
6597    called in response to actually generating a caller or callee that
6598    uses such a type.  As opposed to TARGET_RETURN_IN_MEMORY, which is called
6599    via aggregate_value_p for general type probing from tree-ssa.  */
6600
6601 static rtx
6602 ix86_struct_value_rtx (tree type, int incoming ATTRIBUTE_UNUSED)
6603 {
6604   static bool warnedsse, warnedmmx;
6605
6606   if (!TARGET_64BIT && type)
6607     {
6608       /* Look at the return type of the function, not the function type.  */
6609       enum machine_mode mode = TYPE_MODE (TREE_TYPE (type));
6610
6611       if (!TARGET_SSE && !warnedsse)
6612         {
6613           if (mode == TImode
6614               || (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 16))
6615             {
6616               warnedsse = true;
6617               warning (0, "SSE vector return without SSE enabled "
6618                        "changes the ABI");
6619             }
6620         }
6621
6622       if (!TARGET_MMX && !warnedmmx)
6623         {
6624           if (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 8)
6625             {
6626               warnedmmx = true;
6627               warning (0, "MMX vector return without MMX enabled "
6628                        "changes the ABI");
6629             }
6630         }
6631     }
6632
6633   return NULL;
6634 }
6635
6636 \f
6637 /* Create the va_list data type.  */
6638
6639 /* Returns the calling convention specific va_list date type.
6640    The argument ABI can be DEFAULT_ABI, MS_ABI, or SYSV_ABI.  */
6641
6642 static tree
6643 ix86_build_builtin_va_list_abi (enum calling_abi abi)
6644 {
6645   tree f_gpr, f_fpr, f_ovf, f_sav, record, type_decl;
6646
6647   /* For i386 we use plain pointer to argument area.  */
6648   if (!TARGET_64BIT || abi == MS_ABI)
6649     return build_pointer_type (char_type_node);
6650
6651   record = (*lang_hooks.types.make_type) (RECORD_TYPE);
6652   type_decl = build_decl (BUILTINS_LOCATION,
6653                           TYPE_DECL, get_identifier ("__va_list_tag"), record);
6654
6655   f_gpr = build_decl (BUILTINS_LOCATION,
6656                       FIELD_DECL, get_identifier ("gp_offset"),
6657                       unsigned_type_node);
6658   f_fpr = build_decl (BUILTINS_LOCATION,
6659                       FIELD_DECL, get_identifier ("fp_offset"),
6660                       unsigned_type_node);
6661   f_ovf = build_decl (BUILTINS_LOCATION,
6662                       FIELD_DECL, get_identifier ("overflow_arg_area"),
6663                       ptr_type_node);
6664   f_sav = build_decl (BUILTINS_LOCATION,
6665                       FIELD_DECL, get_identifier ("reg_save_area"),
6666                       ptr_type_node);
6667
6668   va_list_gpr_counter_field = f_gpr;
6669   va_list_fpr_counter_field = f_fpr;
6670
6671   DECL_FIELD_CONTEXT (f_gpr) = record;
6672   DECL_FIELD_CONTEXT (f_fpr) = record;
6673   DECL_FIELD_CONTEXT (f_ovf) = record;
6674   DECL_FIELD_CONTEXT (f_sav) = record;
6675
6676   TREE_CHAIN (record) = type_decl;
6677   TYPE_NAME (record) = type_decl;
6678   TYPE_FIELDS (record) = f_gpr;
6679   TREE_CHAIN (f_gpr) = f_fpr;
6680   TREE_CHAIN (f_fpr) = f_ovf;
6681   TREE_CHAIN (f_ovf) = f_sav;
6682
6683   layout_type (record);
6684
6685   /* The correct type is an array type of one element.  */
6686   return build_array_type (record, build_index_type (size_zero_node));
6687 }
6688
6689 /* Setup the builtin va_list data type and for 64-bit the additional
6690    calling convention specific va_list data types.  */
6691
6692 static tree
6693 ix86_build_builtin_va_list (void)
6694 {
6695   tree ret = ix86_build_builtin_va_list_abi (ix86_abi);
6696
6697   /* Initialize abi specific va_list builtin types.  */
6698   if (TARGET_64BIT)
6699     {
6700       tree t;
6701       if (ix86_abi == MS_ABI)
6702         {
6703           t = ix86_build_builtin_va_list_abi (SYSV_ABI);
6704           if (TREE_CODE (t) != RECORD_TYPE)
6705             t = build_variant_type_copy (t);
6706           sysv_va_list_type_node = t;
6707         }
6708       else
6709         {
6710           t = ret;
6711           if (TREE_CODE (t) != RECORD_TYPE)
6712             t = build_variant_type_copy (t);
6713           sysv_va_list_type_node = t;
6714         }
6715       if (ix86_abi != MS_ABI)
6716         {
6717           t = ix86_build_builtin_va_list_abi (MS_ABI);
6718           if (TREE_CODE (t) != RECORD_TYPE)
6719             t = build_variant_type_copy (t);
6720           ms_va_list_type_node = t;
6721         }
6722       else
6723         {
6724           t = ret;
6725           if (TREE_CODE (t) != RECORD_TYPE)
6726             t = build_variant_type_copy (t);
6727           ms_va_list_type_node = t;
6728         }
6729     }
6730
6731   return ret;
6732 }
6733
6734 /* Worker function for TARGET_SETUP_INCOMING_VARARGS.  */
6735
6736 static void
6737 setup_incoming_varargs_64 (CUMULATIVE_ARGS *cum)
6738 {
6739   rtx save_area, mem;
6740   rtx label;
6741   rtx label_ref;
6742   rtx tmp_reg;
6743   rtx nsse_reg;
6744   alias_set_type set;
6745   int i;
6746   int regparm = ix86_regparm;
6747
6748   if (cum->call_abi != ix86_abi)
6749     regparm = (ix86_abi != SYSV_ABI
6750                ? X86_64_REGPARM_MAX : X86_64_MS_REGPARM_MAX);
6751
6752   /* GPR size of varargs save area.  */
6753   if (cfun->va_list_gpr_size)
6754     ix86_varargs_gpr_size = X86_64_REGPARM_MAX * UNITS_PER_WORD;
6755   else
6756     ix86_varargs_gpr_size = 0;
6757
6758   /* FPR size of varargs save area.  We don't need it if we don't pass
6759      anything in SSE registers.  */
6760   if (cum->sse_nregs && cfun->va_list_fpr_size)
6761     ix86_varargs_fpr_size = X86_64_SSE_REGPARM_MAX * 16;
6762   else
6763     ix86_varargs_fpr_size = 0;
6764
6765   if (! ix86_varargs_gpr_size && ! ix86_varargs_fpr_size)
6766     return;
6767
6768   save_area = frame_pointer_rtx;
6769   set = get_varargs_alias_set ();
6770
6771   for (i = cum->regno;
6772        i < regparm
6773        && i < cum->regno + cfun->va_list_gpr_size / UNITS_PER_WORD;
6774        i++)
6775     {
6776       mem = gen_rtx_MEM (Pmode,
6777                          plus_constant (save_area, i * UNITS_PER_WORD));
6778       MEM_NOTRAP_P (mem) = 1;
6779       set_mem_alias_set (mem, set);
6780       emit_move_insn (mem, gen_rtx_REG (Pmode,
6781                                         x86_64_int_parameter_registers[i]));
6782     }
6783
6784   if (ix86_varargs_fpr_size)
6785     {
6786       /* Now emit code to save SSE registers.  The AX parameter contains number
6787          of SSE parameter registers used to call this function.  We use
6788          sse_prologue_save insn template that produces computed jump across
6789          SSE saves.  We need some preparation work to get this working.  */
6790
6791       label = gen_label_rtx ();
6792       label_ref = gen_rtx_LABEL_REF (Pmode, label);
6793
6794       /* Compute address to jump to :
6795          label - eax*4 + nnamed_sse_arguments*4 Or
6796          label - eax*5 + nnamed_sse_arguments*5 for AVX.  */
6797       tmp_reg = gen_reg_rtx (Pmode);
6798       nsse_reg = gen_reg_rtx (Pmode);
6799       emit_insn (gen_zero_extendqidi2 (nsse_reg, gen_rtx_REG (QImode, AX_REG)));
6800       emit_insn (gen_rtx_SET (VOIDmode, tmp_reg,
6801                               gen_rtx_MULT (Pmode, nsse_reg,
6802                                             GEN_INT (4))));
6803
6804       /* vmovaps is one byte longer than movaps.  */
6805       if (TARGET_AVX)
6806         emit_insn (gen_rtx_SET (VOIDmode, tmp_reg,
6807                                 gen_rtx_PLUS (Pmode, tmp_reg,
6808                                               nsse_reg)));
6809
6810       if (cum->sse_regno)
6811         emit_move_insn
6812           (nsse_reg,
6813            gen_rtx_CONST (DImode,
6814                           gen_rtx_PLUS (DImode,
6815                                         label_ref,
6816                                         GEN_INT (cum->sse_regno
6817                                                  * (TARGET_AVX ? 5 : 4)))));
6818       else
6819         emit_move_insn (nsse_reg, label_ref);
6820       emit_insn (gen_subdi3 (nsse_reg, nsse_reg, tmp_reg));
6821
6822       /* Compute address of memory block we save into.  We always use pointer
6823          pointing 127 bytes after first byte to store - this is needed to keep
6824          instruction size limited by 4 bytes (5 bytes for AVX) with one
6825          byte displacement.  */
6826       tmp_reg = gen_reg_rtx (Pmode);
6827       emit_insn (gen_rtx_SET (VOIDmode, tmp_reg,
6828                               plus_constant (save_area,
6829                                              ix86_varargs_gpr_size + 127)));
6830       mem = gen_rtx_MEM (BLKmode, plus_constant (tmp_reg, -127));
6831       MEM_NOTRAP_P (mem) = 1;
6832       set_mem_alias_set (mem, set);
6833       set_mem_align (mem, BITS_PER_WORD);
6834
6835       /* And finally do the dirty job!  */
6836       emit_insn (gen_sse_prologue_save (mem, nsse_reg,
6837                                         GEN_INT (cum->sse_regno), label));
6838     }
6839 }
6840
6841 static void
6842 setup_incoming_varargs_ms_64 (CUMULATIVE_ARGS *cum)
6843 {
6844   alias_set_type set = get_varargs_alias_set ();
6845   int i;
6846
6847   for (i = cum->regno; i < X86_64_MS_REGPARM_MAX; i++)
6848     {
6849       rtx reg, mem;
6850
6851       mem = gen_rtx_MEM (Pmode,
6852                          plus_constant (virtual_incoming_args_rtx,
6853                                         i * UNITS_PER_WORD));
6854       MEM_NOTRAP_P (mem) = 1;
6855       set_mem_alias_set (mem, set);
6856
6857       reg = gen_rtx_REG (Pmode, x86_64_ms_abi_int_parameter_registers[i]);
6858       emit_move_insn (mem, reg);
6859     }
6860 }
6861
6862 static void
6863 ix86_setup_incoming_varargs (CUMULATIVE_ARGS *cum, enum machine_mode mode,
6864                              tree type, int *pretend_size ATTRIBUTE_UNUSED,
6865                              int no_rtl)
6866 {
6867   CUMULATIVE_ARGS next_cum;
6868   tree fntype;
6869
6870   /* This argument doesn't appear to be used anymore.  Which is good,
6871      because the old code here didn't suppress rtl generation.  */
6872   gcc_assert (!no_rtl);
6873
6874   if (!TARGET_64BIT)
6875     return;
6876
6877   fntype = TREE_TYPE (current_function_decl);
6878
6879   /* For varargs, we do not want to skip the dummy va_dcl argument.
6880      For stdargs, we do want to skip the last named argument.  */
6881   next_cum = *cum;
6882   if (stdarg_p (fntype))
6883     function_arg_advance (&next_cum, mode, type, 1);
6884
6885   if (cum->call_abi == MS_ABI)
6886     setup_incoming_varargs_ms_64 (&next_cum);
6887   else
6888     setup_incoming_varargs_64 (&next_cum);
6889 }
6890
6891 /* Checks if TYPE is of kind va_list char *.  */
6892
6893 static bool
6894 is_va_list_char_pointer (tree type)
6895 {
6896   tree canonic;
6897
6898   /* For 32-bit it is always true.  */
6899   if (!TARGET_64BIT)
6900     return true;
6901   canonic = ix86_canonical_va_list_type (type);
6902   return (canonic == ms_va_list_type_node
6903           || (ix86_abi == MS_ABI && canonic == va_list_type_node));
6904 }
6905
6906 /* Implement va_start.  */
6907
6908 static void
6909 ix86_va_start (tree valist, rtx nextarg)
6910 {
6911   HOST_WIDE_INT words, n_gpr, n_fpr;
6912   tree f_gpr, f_fpr, f_ovf, f_sav;
6913   tree gpr, fpr, ovf, sav, t;
6914   tree type;
6915
6916   /* Only 64bit target needs something special.  */
6917   if (!TARGET_64BIT || is_va_list_char_pointer (TREE_TYPE (valist)))
6918     {
6919       std_expand_builtin_va_start (valist, nextarg);
6920       return;
6921     }
6922
6923   f_gpr = TYPE_FIELDS (TREE_TYPE (sysv_va_list_type_node));
6924   f_fpr = TREE_CHAIN (f_gpr);
6925   f_ovf = TREE_CHAIN (f_fpr);
6926   f_sav = TREE_CHAIN (f_ovf);
6927
6928   valist = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (valist)), valist);
6929   gpr = build3 (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr, NULL_TREE);
6930   fpr = build3 (COMPONENT_REF, TREE_TYPE (f_fpr), valist, f_fpr, NULL_TREE);
6931   ovf = build3 (COMPONENT_REF, TREE_TYPE (f_ovf), valist, f_ovf, NULL_TREE);
6932   sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), valist, f_sav, NULL_TREE);
6933
6934   /* Count number of gp and fp argument registers used.  */
6935   words = crtl->args.info.words;
6936   n_gpr = crtl->args.info.regno;
6937   n_fpr = crtl->args.info.sse_regno;
6938
6939   if (cfun->va_list_gpr_size)
6940     {
6941       type = TREE_TYPE (gpr);
6942       t = build2 (MODIFY_EXPR, type,
6943                   gpr, build_int_cst (type, n_gpr * 8));
6944       TREE_SIDE_EFFECTS (t) = 1;
6945       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
6946     }
6947
6948   if (TARGET_SSE && cfun->va_list_fpr_size)
6949     {
6950       type = TREE_TYPE (fpr);
6951       t = build2 (MODIFY_EXPR, type, fpr,
6952                   build_int_cst (type, n_fpr * 16 + 8*X86_64_REGPARM_MAX));
6953       TREE_SIDE_EFFECTS (t) = 1;
6954       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
6955     }
6956
6957   /* Find the overflow area.  */
6958   type = TREE_TYPE (ovf);
6959   t = make_tree (type, crtl->args.internal_arg_pointer);
6960   if (words != 0)
6961     t = build2 (POINTER_PLUS_EXPR, type, t,
6962                 size_int (words * UNITS_PER_WORD));
6963   t = build2 (MODIFY_EXPR, type, ovf, t);
6964   TREE_SIDE_EFFECTS (t) = 1;
6965   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
6966
6967   if (ix86_varargs_gpr_size || ix86_varargs_fpr_size)
6968     {
6969       /* Find the register save area.
6970          Prologue of the function save it right above stack frame.  */
6971       type = TREE_TYPE (sav);
6972       t = make_tree (type, frame_pointer_rtx);
6973       if (!ix86_varargs_gpr_size)
6974         t = build2 (POINTER_PLUS_EXPR, type, t,
6975                     size_int (-8 * X86_64_REGPARM_MAX));
6976       t = build2 (MODIFY_EXPR, type, sav, t);
6977       TREE_SIDE_EFFECTS (t) = 1;
6978       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
6979     }
6980 }
6981
6982 /* Implement va_arg.  */
6983
6984 static tree
6985 ix86_gimplify_va_arg (tree valist, tree type, gimple_seq *pre_p,
6986                       gimple_seq *post_p)
6987 {
6988   static const int intreg[6] = { 0, 1, 2, 3, 4, 5 };
6989   tree f_gpr, f_fpr, f_ovf, f_sav;
6990   tree gpr, fpr, ovf, sav, t;
6991   int size, rsize;
6992   tree lab_false, lab_over = NULL_TREE;
6993   tree addr, t2;
6994   rtx container;
6995   int indirect_p = 0;
6996   tree ptrtype;
6997   enum machine_mode nat_mode;
6998   int arg_boundary;
6999
7000   /* Only 64bit target needs something special.  */
7001   if (!TARGET_64BIT || is_va_list_char_pointer (TREE_TYPE (valist)))
7002     return std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
7003
7004   f_gpr = TYPE_FIELDS (TREE_TYPE (sysv_va_list_type_node));
7005   f_fpr = TREE_CHAIN (f_gpr);
7006   f_ovf = TREE_CHAIN (f_fpr);
7007   f_sav = TREE_CHAIN (f_ovf);
7008
7009   gpr = build3 (COMPONENT_REF, TREE_TYPE (f_gpr),
7010                 build_va_arg_indirect_ref (valist), f_gpr, NULL_TREE);
7011   valist = build_va_arg_indirect_ref (valist);
7012   fpr = build3 (COMPONENT_REF, TREE_TYPE (f_fpr), valist, f_fpr, NULL_TREE);
7013   ovf = build3 (COMPONENT_REF, TREE_TYPE (f_ovf), valist, f_ovf, NULL_TREE);
7014   sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), valist, f_sav, NULL_TREE);
7015
7016   indirect_p = pass_by_reference (NULL, TYPE_MODE (type), type, false);
7017   if (indirect_p)
7018     type = build_pointer_type (type);
7019   size = int_size_in_bytes (type);
7020   rsize = (size + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
7021
7022   nat_mode = type_natural_mode (type, NULL);
7023   switch (nat_mode)
7024     {
7025     case V8SFmode:
7026     case V8SImode:
7027     case V32QImode:
7028     case V16HImode:
7029     case V4DFmode:
7030     case V4DImode:
7031       /* Unnamed 256bit vector mode parameters are passed on stack.  */
7032       if (ix86_cfun_abi () == SYSV_ABI)
7033         {
7034           container = NULL;
7035           break;
7036         }
7037
7038     default:
7039       container = construct_container (nat_mode, TYPE_MODE (type),
7040                                        type, 0, X86_64_REGPARM_MAX,
7041                                        X86_64_SSE_REGPARM_MAX, intreg,
7042                                        0);
7043       break;
7044     }
7045
7046   /* Pull the value out of the saved registers.  */
7047
7048   addr = create_tmp_var (ptr_type_node, "addr");
7049
7050   if (container)
7051     {
7052       int needed_intregs, needed_sseregs;
7053       bool need_temp;
7054       tree int_addr, sse_addr;
7055
7056       lab_false = create_artificial_label (UNKNOWN_LOCATION);
7057       lab_over = create_artificial_label (UNKNOWN_LOCATION);
7058
7059       examine_argument (nat_mode, type, 0, &needed_intregs, &needed_sseregs);
7060
7061       need_temp = (!REG_P (container)
7062                    && ((needed_intregs && TYPE_ALIGN (type) > 64)
7063                        || TYPE_ALIGN (type) > 128));
7064
7065       /* In case we are passing structure, verify that it is consecutive block
7066          on the register save area.  If not we need to do moves.  */
7067       if (!need_temp && !REG_P (container))
7068         {
7069           /* Verify that all registers are strictly consecutive  */
7070           if (SSE_REGNO_P (REGNO (XEXP (XVECEXP (container, 0, 0), 0))))
7071             {
7072               int i;
7073
7074               for (i = 0; i < XVECLEN (container, 0) && !need_temp; i++)
7075                 {
7076                   rtx slot = XVECEXP (container, 0, i);
7077                   if (REGNO (XEXP (slot, 0)) != FIRST_SSE_REG + (unsigned int) i
7078                       || INTVAL (XEXP (slot, 1)) != i * 16)
7079                     need_temp = 1;
7080                 }
7081             }
7082           else
7083             {
7084               int i;
7085
7086               for (i = 0; i < XVECLEN (container, 0) && !need_temp; i++)
7087                 {
7088                   rtx slot = XVECEXP (container, 0, i);
7089                   if (REGNO (XEXP (slot, 0)) != (unsigned int) i
7090                       || INTVAL (XEXP (slot, 1)) != i * 8)
7091                     need_temp = 1;
7092                 }
7093             }
7094         }
7095       if (!need_temp)
7096         {
7097           int_addr = addr;
7098           sse_addr = addr;
7099         }
7100       else
7101         {
7102           int_addr = create_tmp_var (ptr_type_node, "int_addr");
7103           sse_addr = create_tmp_var (ptr_type_node, "sse_addr");
7104         }
7105
7106       /* First ensure that we fit completely in registers.  */
7107       if (needed_intregs)
7108         {
7109           t = build_int_cst (TREE_TYPE (gpr),
7110                              (X86_64_REGPARM_MAX - needed_intregs + 1) * 8);
7111           t = build2 (GE_EXPR, boolean_type_node, gpr, t);
7112           t2 = build1 (GOTO_EXPR, void_type_node, lab_false);
7113           t = build3 (COND_EXPR, void_type_node, t, t2, NULL_TREE);
7114           gimplify_and_add (t, pre_p);
7115         }
7116       if (needed_sseregs)
7117         {
7118           t = build_int_cst (TREE_TYPE (fpr),
7119                              (X86_64_SSE_REGPARM_MAX - needed_sseregs + 1) * 16
7120                              + X86_64_REGPARM_MAX * 8);
7121           t = build2 (GE_EXPR, boolean_type_node, fpr, t);
7122           t2 = build1 (GOTO_EXPR, void_type_node, lab_false);
7123           t = build3 (COND_EXPR, void_type_node, t, t2, NULL_TREE);
7124           gimplify_and_add (t, pre_p);
7125         }
7126
7127       /* Compute index to start of area used for integer regs.  */
7128       if (needed_intregs)
7129         {
7130           /* int_addr = gpr + sav; */
7131           t = fold_convert (sizetype, gpr);
7132           t = build2 (POINTER_PLUS_EXPR, ptr_type_node, sav, t);
7133           gimplify_assign (int_addr, t, pre_p);
7134         }
7135       if (needed_sseregs)
7136         {
7137           /* sse_addr = fpr + sav; */
7138           t = fold_convert (sizetype, fpr);
7139           t = build2 (POINTER_PLUS_EXPR, ptr_type_node, sav, t);
7140           gimplify_assign (sse_addr, t, pre_p);
7141         }
7142       if (need_temp)
7143         {
7144           int i;
7145           tree temp = create_tmp_var (type, "va_arg_tmp");
7146
7147           /* addr = &temp; */
7148           t = build1 (ADDR_EXPR, build_pointer_type (type), temp);
7149           gimplify_assign (addr, t, pre_p);
7150
7151           for (i = 0; i < XVECLEN (container, 0); i++)
7152             {
7153               rtx slot = XVECEXP (container, 0, i);
7154               rtx reg = XEXP (slot, 0);
7155               enum machine_mode mode = GET_MODE (reg);
7156               tree piece_type = lang_hooks.types.type_for_mode (mode, 1);
7157               tree addr_type = build_pointer_type (piece_type);
7158               tree daddr_type = build_pointer_type_for_mode (piece_type,
7159                                                              ptr_mode, true);
7160               tree src_addr, src;
7161               int src_offset;
7162               tree dest_addr, dest;
7163
7164               if (SSE_REGNO_P (REGNO (reg)))
7165                 {
7166                   src_addr = sse_addr;
7167                   src_offset = (REGNO (reg) - FIRST_SSE_REG) * 16;
7168                 }
7169               else
7170                 {
7171                   src_addr = int_addr;
7172                   src_offset = REGNO (reg) * 8;
7173                 }
7174               src_addr = fold_convert (addr_type, src_addr);
7175               src_addr = fold_build2 (POINTER_PLUS_EXPR, addr_type, src_addr,
7176                                       size_int (src_offset));
7177               src = build_va_arg_indirect_ref (src_addr);
7178
7179               dest_addr = fold_convert (daddr_type, addr);
7180               dest_addr = fold_build2 (POINTER_PLUS_EXPR, daddr_type, dest_addr,
7181                                        size_int (INTVAL (XEXP (slot, 1))));
7182               dest = build_va_arg_indirect_ref (dest_addr);
7183
7184               gimplify_assign (dest, src, pre_p);
7185             }
7186         }
7187
7188       if (needed_intregs)
7189         {
7190           t = build2 (PLUS_EXPR, TREE_TYPE (gpr), gpr,
7191                       build_int_cst (TREE_TYPE (gpr), needed_intregs * 8));
7192           gimplify_assign (gpr, t, pre_p);
7193         }
7194
7195       if (needed_sseregs)
7196         {
7197           t = build2 (PLUS_EXPR, TREE_TYPE (fpr), fpr,
7198                       build_int_cst (TREE_TYPE (fpr), needed_sseregs * 16));
7199           gimplify_assign (fpr, t, pre_p);
7200         }
7201
7202       gimple_seq_add_stmt (pre_p, gimple_build_goto (lab_over));
7203
7204       gimple_seq_add_stmt (pre_p, gimple_build_label (lab_false));
7205     }
7206
7207   /* ... otherwise out of the overflow area.  */
7208
7209   /* When we align parameter on stack for caller, if the parameter
7210      alignment is beyond MAX_SUPPORTED_STACK_ALIGNMENT, it will be
7211      aligned at MAX_SUPPORTED_STACK_ALIGNMENT.  We will match callee
7212      here with caller.  */
7213   arg_boundary = FUNCTION_ARG_BOUNDARY (VOIDmode, type);
7214   if ((unsigned int) arg_boundary > MAX_SUPPORTED_STACK_ALIGNMENT)
7215     arg_boundary = MAX_SUPPORTED_STACK_ALIGNMENT;
7216
7217   /* Care for on-stack alignment if needed.  */
7218   if (arg_boundary <= 64
7219       || integer_zerop (TYPE_SIZE (type)))
7220     t = ovf;
7221  else
7222     {
7223       HOST_WIDE_INT align = arg_boundary / 8;
7224       t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ovf), ovf,
7225                   size_int (align - 1));
7226       t = fold_convert (sizetype, t);
7227       t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t,
7228                   size_int (-align));
7229       t = fold_convert (TREE_TYPE (ovf), t);
7230     }
7231   gimplify_expr (&t, pre_p, NULL, is_gimple_val, fb_rvalue);
7232   gimplify_assign (addr, t, pre_p);
7233
7234   t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t,
7235               size_int (rsize * UNITS_PER_WORD));
7236   gimplify_assign (unshare_expr (ovf), t, pre_p);
7237
7238   if (container)
7239     gimple_seq_add_stmt (pre_p, gimple_build_label (lab_over));
7240
7241   ptrtype = build_pointer_type_for_mode (type, ptr_mode, true);
7242   addr = fold_convert (ptrtype, addr);
7243
7244   if (indirect_p)
7245     addr = build_va_arg_indirect_ref (addr);
7246   return build_va_arg_indirect_ref (addr);
7247 }
7248 \f
7249 /* Return nonzero if OPNUM's MEM should be matched
7250    in movabs* patterns.  */
7251
7252 int
7253 ix86_check_movabs (rtx insn, int opnum)
7254 {
7255   rtx set, mem;
7256
7257   set = PATTERN (insn);
7258   if (GET_CODE (set) == PARALLEL)
7259     set = XVECEXP (set, 0, 0);
7260   gcc_assert (GET_CODE (set) == SET);
7261   mem = XEXP (set, opnum);
7262   while (GET_CODE (mem) == SUBREG)
7263     mem = SUBREG_REG (mem);
7264   gcc_assert (MEM_P (mem));
7265   return (volatile_ok || !MEM_VOLATILE_P (mem));
7266 }
7267 \f
7268 /* Initialize the table of extra 80387 mathematical constants.  */
7269
7270 static void
7271 init_ext_80387_constants (void)
7272 {
7273   static const char * cst[5] =
7274   {
7275     "0.3010299956639811952256464283594894482",  /* 0: fldlg2  */
7276     "0.6931471805599453094286904741849753009",  /* 1: fldln2  */
7277     "1.4426950408889634073876517827983434472",  /* 2: fldl2e  */
7278     "3.3219280948873623478083405569094566090",  /* 3: fldl2t  */
7279     "3.1415926535897932385128089594061862044",  /* 4: fldpi   */
7280   };
7281   int i;
7282
7283   for (i = 0; i < 5; i++)
7284     {
7285       real_from_string (&ext_80387_constants_table[i], cst[i]);
7286       /* Ensure each constant is rounded to XFmode precision.  */
7287       real_convert (&ext_80387_constants_table[i],
7288                     XFmode, &ext_80387_constants_table[i]);
7289     }
7290
7291   ext_80387_constants_init = 1;
7292 }
7293
7294 /* Return true if the constant is something that can be loaded with
7295    a special instruction.  */
7296
7297 int
7298 standard_80387_constant_p (rtx x)
7299 {
7300   enum machine_mode mode = GET_MODE (x);
7301
7302   REAL_VALUE_TYPE r;
7303
7304   if (!(X87_FLOAT_MODE_P (mode) && (GET_CODE (x) == CONST_DOUBLE)))
7305     return -1;
7306
7307   if (x == CONST0_RTX (mode))
7308     return 1;
7309   if (x == CONST1_RTX (mode))
7310     return 2;
7311
7312   REAL_VALUE_FROM_CONST_DOUBLE (r, x);
7313
7314   /* For XFmode constants, try to find a special 80387 instruction when
7315      optimizing for size or on those CPUs that benefit from them.  */
7316   if (mode == XFmode
7317       && (optimize_function_for_size_p (cfun) || TARGET_EXT_80387_CONSTANTS))
7318     {
7319       int i;
7320
7321       if (! ext_80387_constants_init)
7322         init_ext_80387_constants ();
7323
7324       for (i = 0; i < 5; i++)
7325         if (real_identical (&r, &ext_80387_constants_table[i]))
7326           return i + 3;
7327     }
7328
7329   /* Load of the constant -0.0 or -1.0 will be split as
7330      fldz;fchs or fld1;fchs sequence.  */
7331   if (real_isnegzero (&r))
7332     return 8;
7333   if (real_identical (&r, &dconstm1))
7334     return 9;
7335
7336   return 0;
7337 }
7338
7339 /* Return the opcode of the special instruction to be used to load
7340    the constant X.  */
7341
7342 const char *
7343 standard_80387_constant_opcode (rtx x)
7344 {
7345   switch (standard_80387_constant_p (x))
7346     {
7347     case 1:
7348       return "fldz";
7349     case 2:
7350       return "fld1";
7351     case 3:
7352       return "fldlg2";
7353     case 4:
7354       return "fldln2";
7355     case 5:
7356       return "fldl2e";
7357     case 6:
7358       return "fldl2t";
7359     case 7:
7360       return "fldpi";
7361     case 8:
7362     case 9:
7363       return "#";
7364     default:
7365       gcc_unreachable ();
7366     }
7367 }
7368
7369 /* Return the CONST_DOUBLE representing the 80387 constant that is
7370    loaded by the specified special instruction.  The argument IDX
7371    matches the return value from standard_80387_constant_p.  */
7372
7373 rtx
7374 standard_80387_constant_rtx (int idx)
7375 {
7376   int i;
7377
7378   if (! ext_80387_constants_init)
7379     init_ext_80387_constants ();
7380
7381   switch (idx)
7382     {
7383     case 3:
7384     case 4:
7385     case 5:
7386     case 6:
7387     case 7:
7388       i = idx - 3;
7389       break;
7390
7391     default:
7392       gcc_unreachable ();
7393     }
7394
7395   return CONST_DOUBLE_FROM_REAL_VALUE (ext_80387_constants_table[i],
7396                                        XFmode);
7397 }
7398
7399 /* Return 1 if X is all 0s and 2 if x is all 1s
7400    in supported SSE vector mode.  */
7401
7402 int
7403 standard_sse_constant_p (rtx x)
7404 {
7405   enum machine_mode mode = GET_MODE (x);
7406
7407   if (x == const0_rtx || x == CONST0_RTX (GET_MODE (x)))
7408     return 1;
7409   if (vector_all_ones_operand (x, mode))
7410     switch (mode)
7411       {
7412       case V16QImode:
7413       case V8HImode:
7414       case V4SImode:
7415       case V2DImode:
7416         if (TARGET_SSE2)
7417           return 2;
7418       default:
7419         break;
7420       }
7421
7422   return 0;
7423 }
7424
7425 /* Return the opcode of the special instruction to be used to load
7426    the constant X.  */
7427
7428 const char *
7429 standard_sse_constant_opcode (rtx insn, rtx x)
7430 {
7431   switch (standard_sse_constant_p (x))
7432     {
7433     case 1:
7434       switch (get_attr_mode (insn))
7435         {
7436         case MODE_V4SF:
7437           return TARGET_AVX ? "vxorps\t%0, %0, %0" : "xorps\t%0, %0";
7438         case MODE_V2DF:
7439           return TARGET_AVX ? "vxorpd\t%0, %0, %0" : "xorpd\t%0, %0";
7440         case MODE_TI:
7441           return TARGET_AVX ? "vpxor\t%0, %0, %0" : "pxor\t%0, %0";
7442         case MODE_V8SF:
7443           return "vxorps\t%x0, %x0, %x0";
7444         case MODE_V4DF:
7445           return "vxorpd\t%x0, %x0, %x0";
7446         case MODE_OI:
7447           return "vpxor\t%x0, %x0, %x0";
7448         default:
7449           break;
7450         }
7451     case 2:
7452       return TARGET_AVX ? "vpcmpeqd\t%0, %0, %0" : "pcmpeqd\t%0, %0";
7453     default:
7454       break;
7455     }
7456   gcc_unreachable ();
7457 }
7458
7459 /* Returns 1 if OP contains a symbol reference */
7460
7461 int
7462 symbolic_reference_mentioned_p (rtx op)
7463 {
7464   const char *fmt;
7465   int i;
7466
7467   if (GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == LABEL_REF)
7468     return 1;
7469
7470   fmt = GET_RTX_FORMAT (GET_CODE (op));
7471   for (i = GET_RTX_LENGTH (GET_CODE (op)) - 1; i >= 0; i--)
7472     {
7473       if (fmt[i] == 'E')
7474         {
7475           int j;
7476
7477           for (j = XVECLEN (op, i) - 1; j >= 0; j--)
7478             if (symbolic_reference_mentioned_p (XVECEXP (op, i, j)))
7479               return 1;
7480         }
7481
7482       else if (fmt[i] == 'e' && symbolic_reference_mentioned_p (XEXP (op, i)))
7483         return 1;
7484     }
7485
7486   return 0;
7487 }
7488
7489 /* Return 1 if it is appropriate to emit `ret' instructions in the
7490    body of a function.  Do this only if the epilogue is simple, needing a
7491    couple of insns.  Prior to reloading, we can't tell how many registers
7492    must be saved, so return 0 then.  Return 0 if there is no frame
7493    marker to de-allocate.  */
7494
7495 int
7496 ix86_can_use_return_insn_p (void)
7497 {
7498   struct ix86_frame frame;
7499
7500   if (! reload_completed || frame_pointer_needed)
7501     return 0;
7502
7503   /* Don't allow more than 32 pop, since that's all we can do
7504      with one instruction.  */
7505   if (crtl->args.pops_args
7506       && crtl->args.size >= 32768)
7507     return 0;
7508
7509   ix86_compute_frame_layout (&frame);
7510   return frame.to_allocate == 0 && frame.padding0 == 0
7511          && (frame.nregs + frame.nsseregs) == 0;
7512 }
7513 \f
7514 /* Value should be nonzero if functions must have frame pointers.
7515    Zero means the frame pointer need not be set up (and parms may
7516    be accessed via the stack pointer) in functions that seem suitable.  */
7517
7518 static bool
7519 ix86_frame_pointer_required (void)
7520 {
7521   /* If we accessed previous frames, then the generated code expects
7522      to be able to access the saved ebp value in our frame.  */
7523   if (cfun->machine->accesses_prev_frame)
7524     return true;
7525
7526   /* Several x86 os'es need a frame pointer for other reasons,
7527      usually pertaining to setjmp.  */
7528   if (SUBTARGET_FRAME_POINTER_REQUIRED)
7529     return true;
7530
7531   /* In override_options, TARGET_OMIT_LEAF_FRAME_POINTER turns off
7532      the frame pointer by default.  Turn it back on now if we've not
7533      got a leaf function.  */
7534   if (TARGET_OMIT_LEAF_FRAME_POINTER
7535       && (!current_function_is_leaf
7536           || ix86_current_function_calls_tls_descriptor))
7537     return true;
7538
7539   if (crtl->profile)
7540     return true;
7541
7542   return false;
7543 }
7544
7545 /* Record that the current function accesses previous call frames.  */
7546
7547 void
7548 ix86_setup_frame_addresses (void)
7549 {
7550   cfun->machine->accesses_prev_frame = 1;
7551 }
7552 \f
7553 #ifndef USE_HIDDEN_LINKONCE
7554 # if (defined(HAVE_GAS_HIDDEN) && (SUPPORTS_ONE_ONLY - 0)) || TARGET_MACHO
7555 #  define USE_HIDDEN_LINKONCE 1
7556 # else
7557 #  define USE_HIDDEN_LINKONCE 0
7558 # endif
7559 #endif
7560
7561 static int pic_labels_used;
7562
7563 /* Fills in the label name that should be used for a pc thunk for
7564    the given register.  */
7565
7566 static void
7567 get_pc_thunk_name (char name[32], unsigned int regno)
7568 {
7569   gcc_assert (!TARGET_64BIT);
7570
7571   if (USE_HIDDEN_LINKONCE)
7572     sprintf (name, "__i686.get_pc_thunk.%s", reg_names[regno]);
7573   else
7574     ASM_GENERATE_INTERNAL_LABEL (name, "LPR", regno);
7575 }
7576
7577
7578 /* This function generates code for -fpic that loads %ebx with
7579    the return address of the caller and then returns.  */
7580
7581 void
7582 ix86_file_end (void)
7583 {
7584   rtx xops[2];
7585   int regno;
7586
7587   for (regno = 0; regno < 8; ++regno)
7588     {
7589       char name[32];
7590
7591       if (! ((pic_labels_used >> regno) & 1))
7592         continue;
7593
7594       get_pc_thunk_name (name, regno);
7595
7596 #if TARGET_MACHO
7597       if (TARGET_MACHO)
7598         {
7599           switch_to_section (darwin_sections[text_coal_section]);
7600           fputs ("\t.weak_definition\t", asm_out_file);
7601           assemble_name (asm_out_file, name);
7602           fputs ("\n\t.private_extern\t", asm_out_file);
7603           assemble_name (asm_out_file, name);
7604           fputs ("\n", asm_out_file);
7605           ASM_OUTPUT_LABEL (asm_out_file, name);
7606         }
7607       else
7608 #endif
7609       if (USE_HIDDEN_LINKONCE)
7610         {
7611           tree decl;
7612
7613           decl = build_decl (BUILTINS_LOCATION,
7614                              FUNCTION_DECL, get_identifier (name),
7615                              error_mark_node);
7616           TREE_PUBLIC (decl) = 1;
7617           TREE_STATIC (decl) = 1;
7618           DECL_COMDAT_GROUP (decl) = DECL_ASSEMBLER_NAME (decl);
7619
7620           (*targetm.asm_out.unique_section) (decl, 0);
7621           switch_to_section (get_named_section (decl, NULL, 0));
7622
7623           (*targetm.asm_out.globalize_label) (asm_out_file, name);
7624           fputs ("\t.hidden\t", asm_out_file);
7625           assemble_name (asm_out_file, name);
7626           putc ('\n', asm_out_file);
7627           ASM_DECLARE_FUNCTION_NAME (asm_out_file, name, decl);
7628         }
7629       else
7630         {
7631           switch_to_section (text_section);
7632           ASM_OUTPUT_LABEL (asm_out_file, name);
7633         }
7634
7635       xops[0] = gen_rtx_REG (Pmode, regno);
7636       xops[1] = gen_rtx_MEM (Pmode, stack_pointer_rtx);
7637       output_asm_insn ("mov%z0\t{%1, %0|%0, %1}", xops);
7638       output_asm_insn ("ret", xops);
7639     }
7640
7641   if (NEED_INDICATE_EXEC_STACK)
7642     file_end_indicate_exec_stack ();
7643 }
7644
7645 /* Emit code for the SET_GOT patterns.  */
7646
7647 const char *
7648 output_set_got (rtx dest, rtx label ATTRIBUTE_UNUSED)
7649 {
7650   rtx xops[3];
7651
7652   xops[0] = dest;
7653
7654   if (TARGET_VXWORKS_RTP && flag_pic)
7655     {
7656       /* Load (*VXWORKS_GOTT_BASE) into the PIC register.  */
7657       xops[2] = gen_rtx_MEM (Pmode,
7658                              gen_rtx_SYMBOL_REF (Pmode, VXWORKS_GOTT_BASE));
7659       output_asm_insn ("mov{l}\t{%2, %0|%0, %2}", xops);
7660
7661       /* Load (*VXWORKS_GOTT_BASE)[VXWORKS_GOTT_INDEX] into the PIC register.
7662          Use %P and a local symbol in order to print VXWORKS_GOTT_INDEX as
7663          an unadorned address.  */
7664       xops[2] = gen_rtx_SYMBOL_REF (Pmode, VXWORKS_GOTT_INDEX);
7665       SYMBOL_REF_FLAGS (xops[2]) |= SYMBOL_FLAG_LOCAL;
7666       output_asm_insn ("mov{l}\t{%P2(%0), %0|%0, DWORD PTR %P2[%0]}", xops);
7667       return "";
7668     }
7669
7670   xops[1] = gen_rtx_SYMBOL_REF (Pmode, GOT_SYMBOL_NAME);
7671
7672   if (! TARGET_DEEP_BRANCH_PREDICTION || !flag_pic)
7673     {
7674       xops[2] = gen_rtx_LABEL_REF (Pmode, label ? label : gen_label_rtx ());
7675
7676       if (!flag_pic)
7677         output_asm_insn ("mov%z0\t{%2, %0|%0, %2}", xops);
7678       else
7679         output_asm_insn ("call\t%a2", xops);
7680
7681 #if TARGET_MACHO
7682       /* Output the Mach-O "canonical" label name ("Lxx$pb") here too.  This
7683          is what will be referenced by the Mach-O PIC subsystem.  */
7684       if (!label)
7685         ASM_OUTPUT_LABEL (asm_out_file, MACHOPIC_FUNCTION_BASE_NAME);
7686 #endif
7687
7688       (*targetm.asm_out.internal_label) (asm_out_file, "L",
7689                                  CODE_LABEL_NUMBER (XEXP (xops[2], 0)));
7690
7691       if (flag_pic)
7692         output_asm_insn ("pop%z0\t%0", xops);
7693     }
7694   else
7695     {
7696       char name[32];
7697       get_pc_thunk_name (name, REGNO (dest));
7698       pic_labels_used |= 1 << REGNO (dest);
7699
7700       xops[2] = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (name));
7701       xops[2] = gen_rtx_MEM (QImode, xops[2]);
7702       output_asm_insn ("call\t%X2", xops);
7703       /* Output the Mach-O "canonical" label name ("Lxx$pb") here too.  This
7704          is what will be referenced by the Mach-O PIC subsystem.  */
7705 #if TARGET_MACHO
7706       if (!label)
7707         ASM_OUTPUT_LABEL (asm_out_file, MACHOPIC_FUNCTION_BASE_NAME);
7708       else
7709         targetm.asm_out.internal_label (asm_out_file, "L",
7710                                            CODE_LABEL_NUMBER (label));
7711 #endif
7712     }
7713
7714   if (TARGET_MACHO)
7715     return "";
7716
7717   if (!flag_pic || TARGET_DEEP_BRANCH_PREDICTION)
7718     output_asm_insn ("add%z0\t{%1, %0|%0, %1}", xops);
7719   else
7720     output_asm_insn ("add%z0\t{%1+[.-%a2], %0|%0, %1+(.-%a2)}", xops);
7721
7722   return "";
7723 }
7724
7725 /* Generate an "push" pattern for input ARG.  */
7726
7727 static rtx
7728 gen_push (rtx arg)
7729 {
7730   if (ix86_cfa_state->reg == stack_pointer_rtx)
7731     ix86_cfa_state->offset += UNITS_PER_WORD;
7732
7733   return gen_rtx_SET (VOIDmode,
7734                       gen_rtx_MEM (Pmode,
7735                                    gen_rtx_PRE_DEC (Pmode,
7736                                                     stack_pointer_rtx)),
7737                       arg);
7738 }
7739
7740 /* Return >= 0 if there is an unused call-clobbered register available
7741    for the entire function.  */
7742
7743 static unsigned int
7744 ix86_select_alt_pic_regnum (void)
7745 {
7746   if (current_function_is_leaf && !crtl->profile
7747       && !ix86_current_function_calls_tls_descriptor)
7748     {
7749       int i, drap;
7750       /* Can't use the same register for both PIC and DRAP.  */
7751       if (crtl->drap_reg)
7752         drap = REGNO (crtl->drap_reg);
7753       else
7754         drap = -1;
7755       for (i = 2; i >= 0; --i)
7756         if (i != drap && !df_regs_ever_live_p (i))
7757           return i;
7758     }
7759
7760   return INVALID_REGNUM;
7761 }
7762
7763 /* Return 1 if we need to save REGNO.  */
7764 static int
7765 ix86_save_reg (unsigned int regno, int maybe_eh_return)
7766 {
7767   if (pic_offset_table_rtx
7768       && regno == REAL_PIC_OFFSET_TABLE_REGNUM
7769       && (df_regs_ever_live_p (REAL_PIC_OFFSET_TABLE_REGNUM)
7770           || crtl->profile
7771           || crtl->calls_eh_return
7772           || crtl->uses_const_pool))
7773     {
7774       if (ix86_select_alt_pic_regnum () != INVALID_REGNUM)
7775         return 0;
7776       return 1;
7777     }
7778
7779   if (crtl->calls_eh_return && maybe_eh_return)
7780     {
7781       unsigned i;
7782       for (i = 0; ; i++)
7783         {
7784           unsigned test = EH_RETURN_DATA_REGNO (i);
7785           if (test == INVALID_REGNUM)
7786             break;
7787           if (test == regno)
7788             return 1;
7789         }
7790     }
7791
7792   if (crtl->drap_reg && regno == REGNO (crtl->drap_reg))
7793     return 1;
7794
7795   return (df_regs_ever_live_p (regno)
7796           && !call_used_regs[regno]
7797           && !fixed_regs[regno]
7798           && (regno != HARD_FRAME_POINTER_REGNUM || !frame_pointer_needed));
7799 }
7800
7801 /* Return number of saved general prupose registers.  */
7802
7803 static int
7804 ix86_nsaved_regs (void)
7805 {
7806   int nregs = 0;
7807   int regno;
7808
7809   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
7810     if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
7811       nregs ++;
7812   return nregs;
7813 }
7814
7815 /* Return number of saved SSE registrers.  */
7816
7817 static int
7818 ix86_nsaved_sseregs (void)
7819 {
7820   int nregs = 0;
7821   int regno;
7822
7823   if (ix86_cfun_abi () != MS_ABI)
7824     return 0;
7825   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
7826     if (SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
7827       nregs ++;
7828   return nregs;
7829 }
7830
7831 /* Given FROM and TO register numbers, say whether this elimination is
7832    allowed.  If stack alignment is needed, we can only replace argument
7833    pointer with hard frame pointer, or replace frame pointer with stack
7834    pointer.  Otherwise, frame pointer elimination is automatically
7835    handled and all other eliminations are valid.  */
7836
7837 static bool
7838 ix86_can_eliminate (const int from, const int to)
7839 {
7840   if (stack_realign_fp)
7841     return ((from == ARG_POINTER_REGNUM
7842              && to == HARD_FRAME_POINTER_REGNUM)
7843             || (from == FRAME_POINTER_REGNUM
7844                 && to == STACK_POINTER_REGNUM));
7845   else
7846     return to == STACK_POINTER_REGNUM ? !frame_pointer_needed : true;
7847 }
7848
7849 /* Return the offset between two registers, one to be eliminated, and the other
7850    its replacement, at the start of a routine.  */
7851
7852 HOST_WIDE_INT
7853 ix86_initial_elimination_offset (int from, int to)
7854 {
7855   struct ix86_frame frame;
7856   ix86_compute_frame_layout (&frame);
7857
7858   if (from == ARG_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
7859     return frame.hard_frame_pointer_offset;
7860   else if (from == FRAME_POINTER_REGNUM
7861            && to == HARD_FRAME_POINTER_REGNUM)
7862     return frame.hard_frame_pointer_offset - frame.frame_pointer_offset;
7863   else
7864     {
7865       gcc_assert (to == STACK_POINTER_REGNUM);
7866
7867       if (from == ARG_POINTER_REGNUM)
7868         return frame.stack_pointer_offset;
7869
7870       gcc_assert (from == FRAME_POINTER_REGNUM);
7871       return frame.stack_pointer_offset - frame.frame_pointer_offset;
7872     }
7873 }
7874
7875 /* In a dynamically-aligned function, we can't know the offset from
7876    stack pointer to frame pointer, so we must ensure that setjmp
7877    eliminates fp against the hard fp (%ebp) rather than trying to
7878    index from %esp up to the top of the frame across a gap that is
7879    of unknown (at compile-time) size.  */
7880 static rtx
7881 ix86_builtin_setjmp_frame_value (void)
7882 {
7883   return stack_realign_fp ? hard_frame_pointer_rtx : virtual_stack_vars_rtx;
7884 }
7885
7886 /* Fill structure ix86_frame about frame of currently computed function.  */
7887
7888 static void
7889 ix86_compute_frame_layout (struct ix86_frame *frame)
7890 {
7891   unsigned int stack_alignment_needed;
7892   HOST_WIDE_INT offset;
7893   unsigned int preferred_alignment;
7894   HOST_WIDE_INT size = get_frame_size ();
7895
7896   frame->nregs = ix86_nsaved_regs ();
7897   frame->nsseregs = ix86_nsaved_sseregs ();
7898
7899   stack_alignment_needed = crtl->stack_alignment_needed / BITS_PER_UNIT;
7900   preferred_alignment = crtl->preferred_stack_boundary / BITS_PER_UNIT;
7901
7902   /* MS ABI seem to require stack alignment to be always 16 except for function
7903      prologues.  */
7904   if (ix86_cfun_abi () == MS_ABI && preferred_alignment < 16)
7905     {
7906       preferred_alignment = 16;
7907       stack_alignment_needed = 16;
7908       crtl->preferred_stack_boundary = 128;
7909       crtl->stack_alignment_needed = 128;
7910     }
7911
7912   gcc_assert (!size || stack_alignment_needed);
7913   gcc_assert (preferred_alignment >= STACK_BOUNDARY / BITS_PER_UNIT);
7914   gcc_assert (preferred_alignment <= stack_alignment_needed);
7915
7916   /* During reload iteration the amount of registers saved can change.
7917      Recompute the value as needed.  Do not recompute when amount of registers
7918      didn't change as reload does multiple calls to the function and does not
7919      expect the decision to change within single iteration.  */
7920   if (!optimize_function_for_size_p (cfun)
7921       && cfun->machine->use_fast_prologue_epilogue_nregs != frame->nregs)
7922     {
7923       int count = frame->nregs;
7924
7925       cfun->machine->use_fast_prologue_epilogue_nregs = count;
7926       /* The fast prologue uses move instead of push to save registers.  This
7927          is significantly longer, but also executes faster as modern hardware
7928          can execute the moves in parallel, but can't do that for push/pop.
7929
7930          Be careful about choosing what prologue to emit:  When function takes
7931          many instructions to execute we may use slow version as well as in
7932          case function is known to be outside hot spot (this is known with
7933          feedback only).  Weight the size of function by number of registers
7934          to save as it is cheap to use one or two push instructions but very
7935          slow to use many of them.  */
7936       if (count)
7937         count = (count - 1) * FAST_PROLOGUE_INSN_COUNT;
7938       if (cfun->function_frequency < FUNCTION_FREQUENCY_NORMAL
7939           || (flag_branch_probabilities
7940               && cfun->function_frequency < FUNCTION_FREQUENCY_HOT))
7941         cfun->machine->use_fast_prologue_epilogue = false;
7942       else
7943         cfun->machine->use_fast_prologue_epilogue
7944            = !expensive_function_p (count);
7945     }
7946   if (TARGET_PROLOGUE_USING_MOVE
7947       && cfun->machine->use_fast_prologue_epilogue)
7948     frame->save_regs_using_mov = true;
7949   else
7950     frame->save_regs_using_mov = false;
7951
7952   /* Skip return address.  */
7953   offset = UNITS_PER_WORD;
7954
7955   /* Skip pushed static chain.  */
7956   if (ix86_static_chain_on_stack)
7957     offset += UNITS_PER_WORD;
7958
7959   /* Skip saved base pointer.  */
7960   if (frame_pointer_needed)
7961     offset += UNITS_PER_WORD;
7962
7963   frame->hard_frame_pointer_offset = offset;
7964
7965   /* Set offset to aligned because the realigned frame starts from
7966      here.  */
7967   if (stack_realign_fp)
7968     offset = (offset + stack_alignment_needed -1) & -stack_alignment_needed;
7969
7970   /* Register save area */
7971   offset += frame->nregs * UNITS_PER_WORD;
7972
7973   /* Align SSE reg save area.  */
7974   if (frame->nsseregs)
7975     frame->padding0 = ((offset + 16 - 1) & -16) - offset;
7976   else
7977     frame->padding0 = 0;
7978   
7979   /* SSE register save area.  */
7980   offset += frame->padding0 + frame->nsseregs * 16;
7981
7982   /* Va-arg area */
7983   frame->va_arg_size = ix86_varargs_gpr_size + ix86_varargs_fpr_size;
7984   offset += frame->va_arg_size;
7985
7986   /* Align start of frame for local function.  */
7987   frame->padding1 = ((offset + stack_alignment_needed - 1)
7988                      & -stack_alignment_needed) - offset;
7989
7990   offset += frame->padding1;
7991
7992   /* Frame pointer points here.  */
7993   frame->frame_pointer_offset = offset;
7994
7995   offset += size;
7996
7997   /* Add outgoing arguments area.  Can be skipped if we eliminated
7998      all the function calls as dead code.
7999      Skipping is however impossible when function calls alloca.  Alloca
8000      expander assumes that last crtl->outgoing_args_size
8001      of stack frame are unused.  */
8002   if (ACCUMULATE_OUTGOING_ARGS
8003       && (!current_function_is_leaf || cfun->calls_alloca
8004           || ix86_current_function_calls_tls_descriptor))
8005     {
8006       offset += crtl->outgoing_args_size;
8007       frame->outgoing_arguments_size = crtl->outgoing_args_size;
8008     }
8009   else
8010     frame->outgoing_arguments_size = 0;
8011
8012   /* Align stack boundary.  Only needed if we're calling another function
8013      or using alloca.  */
8014   if (!current_function_is_leaf || cfun->calls_alloca
8015       || ix86_current_function_calls_tls_descriptor)
8016     frame->padding2 = ((offset + preferred_alignment - 1)
8017                        & -preferred_alignment) - offset;
8018   else
8019     frame->padding2 = 0;
8020
8021   offset += frame->padding2;
8022
8023   /* We've reached end of stack frame.  */
8024   frame->stack_pointer_offset = offset;
8025
8026   /* Size prologue needs to allocate.  */
8027   frame->to_allocate =
8028     (size + frame->padding1 + frame->padding2
8029      + frame->outgoing_arguments_size + frame->va_arg_size);
8030
8031   if ((!frame->to_allocate && frame->nregs <= 1)
8032       || (TARGET_64BIT && frame->to_allocate >= (HOST_WIDE_INT) 0x80000000))
8033     frame->save_regs_using_mov = false;
8034
8035   if (!TARGET_64BIT_MS_ABI && TARGET_RED_ZONE
8036       && current_function_sp_is_unchanging
8037       && current_function_is_leaf
8038       && !ix86_current_function_calls_tls_descriptor)
8039     {
8040       frame->red_zone_size = frame->to_allocate;
8041       if (frame->save_regs_using_mov)
8042         frame->red_zone_size += frame->nregs * UNITS_PER_WORD;
8043       if (frame->red_zone_size > RED_ZONE_SIZE - RED_ZONE_RESERVE)
8044         frame->red_zone_size = RED_ZONE_SIZE - RED_ZONE_RESERVE;
8045     }
8046   else
8047     frame->red_zone_size = 0;
8048   frame->to_allocate -= frame->red_zone_size;
8049   frame->stack_pointer_offset -= frame->red_zone_size;
8050 }
8051
8052 /* Emit code to save registers in the prologue.  */
8053
8054 static void
8055 ix86_emit_save_regs (void)
8056 {
8057   unsigned int regno;
8058   rtx insn;
8059
8060   for (regno = FIRST_PSEUDO_REGISTER - 1; regno-- > 0; )
8061     if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
8062       {
8063         insn = emit_insn (gen_push (gen_rtx_REG (Pmode, regno)));
8064         RTX_FRAME_RELATED_P (insn) = 1;
8065       }
8066 }
8067
8068 /* Emit code to save registers using MOV insns.  First register
8069    is restored from POINTER + OFFSET.  */
8070 static void
8071 ix86_emit_save_regs_using_mov (rtx pointer, HOST_WIDE_INT offset)
8072 {
8073   unsigned int regno;
8074   rtx insn;
8075
8076   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
8077     if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
8078       {
8079         insn = emit_move_insn (adjust_address (gen_rtx_MEM (Pmode, pointer),
8080                                                Pmode, offset),
8081                                gen_rtx_REG (Pmode, regno));
8082         RTX_FRAME_RELATED_P (insn) = 1;
8083         offset += UNITS_PER_WORD;
8084       }
8085 }
8086
8087 /* Emit code to save registers using MOV insns.  First register
8088    is restored from POINTER + OFFSET.  */
8089 static void
8090 ix86_emit_save_sse_regs_using_mov (rtx pointer, HOST_WIDE_INT offset)
8091 {
8092   unsigned int regno;
8093   rtx insn;
8094   rtx mem;
8095
8096   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
8097     if (SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
8098       {
8099         mem = adjust_address (gen_rtx_MEM (TImode, pointer), TImode, offset);
8100         set_mem_align (mem, 128);
8101         insn = emit_move_insn (mem, gen_rtx_REG (TImode, regno));
8102         RTX_FRAME_RELATED_P (insn) = 1;
8103         offset += 16;
8104       }
8105 }
8106
8107 static GTY(()) rtx queued_cfa_restores;
8108
8109 /* Add a REG_CFA_RESTORE REG note to INSN or queue them until next stack
8110    manipulation insn.  Don't add it if the previously
8111    saved value will be left untouched within stack red-zone till return,
8112    as unwinders can find the same value in the register and
8113    on the stack.  */
8114
8115 static void
8116 ix86_add_cfa_restore_note (rtx insn, rtx reg, HOST_WIDE_INT red_offset)
8117 {
8118   if (TARGET_RED_ZONE
8119       && !TARGET_64BIT_MS_ABI
8120       && red_offset + RED_ZONE_SIZE >= 0
8121       && crtl->args.pops_args < 65536)
8122     return;
8123
8124   if (insn)
8125     {
8126       add_reg_note (insn, REG_CFA_RESTORE, reg);
8127       RTX_FRAME_RELATED_P (insn) = 1;
8128     }
8129   else
8130     queued_cfa_restores
8131       = alloc_reg_note (REG_CFA_RESTORE, reg, queued_cfa_restores);
8132 }
8133
8134 /* Add queued REG_CFA_RESTORE notes if any to INSN.  */
8135
8136 static void
8137 ix86_add_queued_cfa_restore_notes (rtx insn)
8138 {
8139   rtx last;
8140   if (!queued_cfa_restores)
8141     return;
8142   for (last = queued_cfa_restores; XEXP (last, 1); last = XEXP (last, 1))
8143     ;
8144   XEXP (last, 1) = REG_NOTES (insn);
8145   REG_NOTES (insn) = queued_cfa_restores;
8146   queued_cfa_restores = NULL_RTX;
8147   RTX_FRAME_RELATED_P (insn) = 1;
8148 }
8149
8150 /* Expand prologue or epilogue stack adjustment.
8151    The pattern exist to put a dependency on all ebp-based memory accesses.
8152    STYLE should be negative if instructions should be marked as frame related,
8153    zero if %r11 register is live and cannot be freely used and positive
8154    otherwise.  */
8155
8156 static void
8157 pro_epilogue_adjust_stack (rtx dest, rtx src, rtx offset,
8158                            int style, bool set_cfa)
8159 {
8160   rtx insn;
8161
8162   if (! TARGET_64BIT)
8163     insn = emit_insn (gen_pro_epilogue_adjust_stack_1 (dest, src, offset));
8164   else if (x86_64_immediate_operand (offset, DImode))
8165     insn = emit_insn (gen_pro_epilogue_adjust_stack_rex64 (dest, src, offset));
8166   else
8167     {
8168       rtx r11;
8169       /* r11 is used by indirect sibcall return as well, set before the
8170          epilogue and used after the epilogue.  ATM indirect sibcall
8171          shouldn't be used together with huge frame sizes in one
8172          function because of the frame_size check in sibcall.c.  */
8173       gcc_assert (style);
8174       r11 = gen_rtx_REG (DImode, R11_REG);
8175       insn = emit_insn (gen_rtx_SET (DImode, r11, offset));
8176       if (style < 0)
8177         RTX_FRAME_RELATED_P (insn) = 1;
8178       insn = emit_insn (gen_pro_epilogue_adjust_stack_rex64_2 (dest, src, r11,
8179                                                                offset));
8180     }
8181
8182   if (style >= 0)
8183     ix86_add_queued_cfa_restore_notes (insn);
8184
8185   if (set_cfa)
8186     {
8187       rtx r;
8188
8189       gcc_assert (ix86_cfa_state->reg == src);
8190       ix86_cfa_state->offset += INTVAL (offset);
8191       ix86_cfa_state->reg = dest;
8192     
8193       r = gen_rtx_PLUS (Pmode, src, offset);
8194       r = gen_rtx_SET (VOIDmode, dest, r);
8195       add_reg_note (insn, REG_CFA_ADJUST_CFA, r);
8196       RTX_FRAME_RELATED_P (insn) = 1;
8197     }
8198   else if (style < 0)
8199     RTX_FRAME_RELATED_P (insn) = 1;
8200 }
8201
8202 /* Find an available register to be used as dynamic realign argument
8203    pointer regsiter.  Such a register will be written in prologue and
8204    used in begin of body, so it must not be
8205         1. parameter passing register.
8206         2. GOT pointer.
8207    We reuse static-chain register if it is available.  Otherwise, we
8208    use DI for i386 and R13 for x86-64.  We chose R13 since it has
8209    shorter encoding.
8210
8211    Return: the regno of chosen register.  */
8212
8213 static unsigned int 
8214 find_drap_reg (void)
8215 {
8216   tree decl = cfun->decl;
8217
8218   if (TARGET_64BIT)
8219     {
8220       /* Use R13 for nested function or function need static chain.
8221          Since function with tail call may use any caller-saved
8222          registers in epilogue, DRAP must not use caller-saved
8223          register in such case.  */
8224       if (DECL_STATIC_CHAIN (decl) || crtl->tail_call_emit)
8225         return R13_REG;
8226
8227       return R10_REG;
8228     }
8229   else
8230     {
8231       /* Use DI for nested function or function need static chain.
8232          Since function with tail call may use any caller-saved
8233          registers in epilogue, DRAP must not use caller-saved
8234          register in such case.  */
8235       if (DECL_STATIC_CHAIN (decl) || crtl->tail_call_emit)
8236         return DI_REG;
8237     
8238       /* Reuse static chain register if it isn't used for parameter
8239          passing.  */
8240       if (ix86_function_regparm (TREE_TYPE (decl), decl) <= 2
8241           && !lookup_attribute ("fastcall",
8242                                 TYPE_ATTRIBUTES (TREE_TYPE (decl))))
8243         return CX_REG;
8244       else
8245         return DI_REG;
8246     }
8247 }
8248
8249 /* Return minimum incoming stack alignment.  */
8250
8251 static unsigned int
8252 ix86_minimum_incoming_stack_boundary (bool sibcall)
8253 {
8254   unsigned int incoming_stack_boundary;
8255
8256   /* Prefer the one specified at command line. */
8257   if (ix86_user_incoming_stack_boundary)
8258     incoming_stack_boundary = ix86_user_incoming_stack_boundary;
8259   /* In 32bit, use MIN_STACK_BOUNDARY for incoming stack boundary
8260      if -mstackrealign is used, it isn't used for sibcall check and 
8261      estimated stack alignment is 128bit.  */
8262   else if (!sibcall
8263            && !TARGET_64BIT
8264            && ix86_force_align_arg_pointer
8265            && crtl->stack_alignment_estimated == 128)
8266     incoming_stack_boundary = MIN_STACK_BOUNDARY;
8267   else
8268     incoming_stack_boundary = ix86_default_incoming_stack_boundary;
8269
8270   /* Incoming stack alignment can be changed on individual functions
8271      via force_align_arg_pointer attribute.  We use the smallest
8272      incoming stack boundary.  */
8273   if (incoming_stack_boundary > MIN_STACK_BOUNDARY
8274       && lookup_attribute (ix86_force_align_arg_pointer_string,
8275                            TYPE_ATTRIBUTES (TREE_TYPE (current_function_decl))))
8276     incoming_stack_boundary = MIN_STACK_BOUNDARY;
8277
8278   /* The incoming stack frame has to be aligned at least at
8279      parm_stack_boundary.  */
8280   if (incoming_stack_boundary < crtl->parm_stack_boundary)
8281     incoming_stack_boundary = crtl->parm_stack_boundary;
8282
8283   /* Stack at entrance of main is aligned by runtime.  We use the
8284      smallest incoming stack boundary. */
8285   if (incoming_stack_boundary > MAIN_STACK_BOUNDARY
8286       && DECL_NAME (current_function_decl)
8287       && MAIN_NAME_P (DECL_NAME (current_function_decl))
8288       && DECL_FILE_SCOPE_P (current_function_decl))
8289     incoming_stack_boundary = MAIN_STACK_BOUNDARY;
8290
8291   return incoming_stack_boundary;
8292 }
8293
8294 /* Update incoming stack boundary and estimated stack alignment.  */
8295
8296 static void
8297 ix86_update_stack_boundary (void)
8298 {
8299   ix86_incoming_stack_boundary
8300     = ix86_minimum_incoming_stack_boundary (false);
8301
8302   /* x86_64 vararg needs 16byte stack alignment for register save
8303      area.  */
8304   if (TARGET_64BIT
8305       && cfun->stdarg
8306       && crtl->stack_alignment_estimated < 128)
8307     crtl->stack_alignment_estimated = 128;
8308 }
8309
8310 /* Handle the TARGET_GET_DRAP_RTX hook.  Return NULL if no DRAP is
8311    needed or an rtx for DRAP otherwise.  */
8312
8313 static rtx
8314 ix86_get_drap_rtx (void)
8315 {
8316   if (ix86_force_drap || !ACCUMULATE_OUTGOING_ARGS)
8317     crtl->need_drap = true;
8318
8319   if (stack_realign_drap)
8320     {
8321       /* Assign DRAP to vDRAP and returns vDRAP */
8322       unsigned int regno = find_drap_reg ();
8323       rtx drap_vreg;
8324       rtx arg_ptr;
8325       rtx seq, insn;
8326
8327       arg_ptr = gen_rtx_REG (Pmode, regno);
8328       crtl->drap_reg = arg_ptr;
8329
8330       start_sequence ();
8331       drap_vreg = copy_to_reg (arg_ptr);
8332       seq = get_insns ();
8333       end_sequence ();
8334       
8335       insn = emit_insn_before (seq, NEXT_INSN (entry_of_function ()));
8336       RTX_FRAME_RELATED_P (insn) = 1;
8337       return drap_vreg;
8338     }
8339   else
8340     return NULL;
8341 }
8342
8343 /* Handle the TARGET_INTERNAL_ARG_POINTER hook.  */
8344
8345 static rtx
8346 ix86_internal_arg_pointer (void)
8347 {
8348   return virtual_incoming_args_rtx;
8349 }
8350
8351 /* Finalize stack_realign_needed flag, which will guide prologue/epilogue
8352    to be generated in correct form.  */
8353 static void 
8354 ix86_finalize_stack_realign_flags (void)
8355 {
8356   /* Check if stack realign is really needed after reload, and 
8357      stores result in cfun */
8358   unsigned int incoming_stack_boundary
8359     = (crtl->parm_stack_boundary > ix86_incoming_stack_boundary
8360        ? crtl->parm_stack_boundary : ix86_incoming_stack_boundary);
8361   unsigned int stack_realign = (incoming_stack_boundary
8362                                 < (current_function_is_leaf
8363                                    ? crtl->max_used_stack_slot_alignment
8364                                    : crtl->stack_alignment_needed));
8365
8366   if (crtl->stack_realign_finalized)
8367     {
8368       /* After stack_realign_needed is finalized, we can't no longer
8369          change it.  */
8370       gcc_assert (crtl->stack_realign_needed == stack_realign);
8371     }
8372   else
8373     {
8374       crtl->stack_realign_needed = stack_realign;
8375       crtl->stack_realign_finalized = true;
8376     }
8377 }
8378
8379 /* Expand the prologue into a bunch of separate insns.  */
8380
8381 void
8382 ix86_expand_prologue (void)
8383 {
8384   rtx insn;
8385   bool pic_reg_used;
8386   struct ix86_frame frame;
8387   HOST_WIDE_INT allocate;
8388   int gen_frame_pointer = frame_pointer_needed;
8389
8390   ix86_finalize_stack_realign_flags ();
8391
8392   /* DRAP should not coexist with stack_realign_fp */
8393   gcc_assert (!(crtl->drap_reg && stack_realign_fp));
8394
8395   /* Initialize CFA state for before the prologue.  */
8396   ix86_cfa_state->reg = stack_pointer_rtx;
8397   ix86_cfa_state->offset = INCOMING_FRAME_SP_OFFSET;
8398
8399   ix86_compute_frame_layout (&frame);
8400
8401   if (ix86_function_ms_hook_prologue (current_function_decl))
8402     {
8403       rtx push, mov;
8404
8405       /* Make sure the function starts with
8406          8b ff     movl.s %edi,%edi
8407          55        push   %ebp
8408          8b ec     movl.s %esp,%ebp
8409
8410          This matches the hookable function prologue in Win32 API
8411          functions in Microsoft Windows XP Service Pack 2 and newer.
8412          Wine uses this to enable Windows apps to hook the Win32 API
8413          functions provided by Wine.  */
8414       insn = emit_insn (gen_vswapmov (gen_rtx_REG (SImode, DI_REG),
8415                                       gen_rtx_REG (SImode, DI_REG)));
8416       push = emit_insn (gen_push (hard_frame_pointer_rtx));
8417       mov = emit_insn (gen_vswapmov (hard_frame_pointer_rtx,
8418                                      stack_pointer_rtx));
8419
8420       if (frame_pointer_needed && !(crtl->drap_reg
8421                                     && crtl->stack_realign_needed))
8422         {
8423           /* The push %ebp and movl.s %esp, %ebp already set up
8424              the frame pointer.  No need to do this again. */
8425           gen_frame_pointer = 0;
8426           RTX_FRAME_RELATED_P (push) = 1;
8427           RTX_FRAME_RELATED_P (mov) = 1;
8428           if (ix86_cfa_state->reg == stack_pointer_rtx)
8429             ix86_cfa_state->reg = hard_frame_pointer_rtx;
8430         }
8431       else
8432         /* If the frame pointer is not needed, pop %ebp again. This
8433            could be optimized for cases where ebp needs to be backed up
8434            for some other reason.  If stack realignment is needed, pop
8435            the base pointer again, align the stack, and later regenerate
8436            the frame pointer setup.  The frame pointer generated by the
8437            hook prologue is not aligned, so it can't be used.  */
8438         insn = emit_insn ((*ix86_gen_pop1) (hard_frame_pointer_rtx));
8439     }
8440
8441   /* The first insn of a function that accepts its static chain on the
8442      stack is to push the register that would be filled in by a direct
8443      call.  This insn will be skipped by the trampoline.  */
8444   if (ix86_static_chain_on_stack)
8445     {
8446       rtx t;
8447
8448       insn = emit_insn (gen_push (ix86_static_chain (cfun->decl, false)));
8449       emit_insn (gen_blockage ());
8450
8451       /* We don't want to interpret this push insn as a register save,
8452          only as a stack adjustment.  The real copy of the register as
8453          a save will be done later, if needed.  */
8454       t = plus_constant (stack_pointer_rtx, -UNITS_PER_WORD);
8455       t = gen_rtx_SET (VOIDmode, stack_pointer_rtx, t);
8456       add_reg_note (insn, REG_CFA_ADJUST_CFA, t);
8457       RTX_FRAME_RELATED_P (insn) = 1;
8458     }
8459
8460   /* Emit prologue code to adjust stack alignment and setup DRAP, in case
8461      of DRAP is needed and stack realignment is really needed after reload */
8462   if (crtl->drap_reg && crtl->stack_realign_needed)
8463     {
8464       rtx x, y;
8465       int align_bytes = crtl->stack_alignment_needed / BITS_PER_UNIT;
8466       int param_ptr_offset = UNITS_PER_WORD;
8467
8468       if (ix86_static_chain_on_stack)
8469         param_ptr_offset += UNITS_PER_WORD;
8470       if (!call_used_regs[REGNO (crtl->drap_reg)])
8471         param_ptr_offset += UNITS_PER_WORD;
8472
8473       gcc_assert (stack_realign_drap);
8474
8475       /* Grab the argument pointer.  */
8476       x = plus_constant (stack_pointer_rtx, param_ptr_offset);
8477       y = crtl->drap_reg;
8478
8479       /* Only need to push parameter pointer reg if it is caller
8480          saved reg */
8481       if (!call_used_regs[REGNO (crtl->drap_reg)])
8482         {
8483           /* Push arg pointer reg */
8484           insn = emit_insn (gen_push (y));
8485           RTX_FRAME_RELATED_P (insn) = 1;
8486         }
8487
8488       insn = emit_insn (gen_rtx_SET (VOIDmode, y, x));
8489       RTX_FRAME_RELATED_P (insn) = 1; 
8490       ix86_cfa_state->reg = crtl->drap_reg;
8491
8492       /* Align the stack.  */
8493       insn = emit_insn ((*ix86_gen_andsp) (stack_pointer_rtx,
8494                                            stack_pointer_rtx,
8495                                            GEN_INT (-align_bytes)));
8496       RTX_FRAME_RELATED_P (insn) = 1;
8497
8498       /* Replicate the return address on the stack so that return
8499          address can be reached via (argp - 1) slot.  This is needed
8500          to implement macro RETURN_ADDR_RTX and intrinsic function
8501          expand_builtin_return_addr etc.  */
8502       x = crtl->drap_reg;
8503       x = gen_frame_mem (Pmode,
8504                          plus_constant (x, -UNITS_PER_WORD));
8505       insn = emit_insn (gen_push (x));
8506       RTX_FRAME_RELATED_P (insn) = 1;
8507     }
8508
8509   /* Note: AT&T enter does NOT have reversed args.  Enter is probably
8510      slower on all targets.  Also sdb doesn't like it.  */
8511
8512   if (gen_frame_pointer)
8513     {
8514       insn = emit_insn (gen_push (hard_frame_pointer_rtx));
8515       RTX_FRAME_RELATED_P (insn) = 1;
8516
8517       insn = emit_move_insn (hard_frame_pointer_rtx, stack_pointer_rtx);
8518       RTX_FRAME_RELATED_P (insn) = 1;
8519
8520       if (ix86_cfa_state->reg == stack_pointer_rtx)
8521         ix86_cfa_state->reg = hard_frame_pointer_rtx;
8522     }
8523
8524   if (stack_realign_fp)
8525     {
8526       int align_bytes = crtl->stack_alignment_needed / BITS_PER_UNIT;
8527       gcc_assert (align_bytes > MIN_STACK_BOUNDARY / BITS_PER_UNIT);
8528
8529       /* Align the stack.  */
8530       insn = emit_insn ((*ix86_gen_andsp) (stack_pointer_rtx,
8531                                            stack_pointer_rtx,
8532                                            GEN_INT (-align_bytes)));
8533       RTX_FRAME_RELATED_P (insn) = 1;
8534     }
8535
8536   allocate = frame.to_allocate + frame.nsseregs * 16 + frame.padding0;
8537
8538   if (!frame.save_regs_using_mov)
8539     ix86_emit_save_regs ();
8540   else
8541     allocate += frame.nregs * UNITS_PER_WORD;
8542
8543   /* When using red zone we may start register saving before allocating
8544      the stack frame saving one cycle of the prologue. However I will
8545      avoid doing this if I am going to have to probe the stack since
8546      at least on x86_64 the stack probe can turn into a call that clobbers
8547      a red zone location */
8548   if (!TARGET_64BIT_MS_ABI && TARGET_RED_ZONE && frame.save_regs_using_mov
8549       && (! TARGET_STACK_PROBE || allocate < CHECK_STACK_LIMIT))
8550     ix86_emit_save_regs_using_mov ((frame_pointer_needed
8551                                      && !crtl->stack_realign_needed) 
8552                                    ? hard_frame_pointer_rtx
8553                                    : stack_pointer_rtx,
8554                                    -frame.nregs * UNITS_PER_WORD);
8555
8556   if (allocate == 0)
8557     ;
8558   else if (! TARGET_STACK_PROBE || allocate < CHECK_STACK_LIMIT)
8559     pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
8560                                GEN_INT (-allocate), -1,
8561                                ix86_cfa_state->reg == stack_pointer_rtx);
8562   else
8563     {
8564       /* Only valid for Win32.  */
8565       rtx eax = gen_rtx_REG (Pmode, AX_REG);
8566       bool eax_live;
8567       rtx t;
8568
8569       gcc_assert (!TARGET_64BIT || cfun->machine->call_abi == MS_ABI);
8570
8571       if (cfun->machine->call_abi == MS_ABI)
8572         eax_live = false;
8573       else
8574         eax_live = ix86_eax_live_at_start_p ();
8575
8576       if (eax_live)
8577         {
8578           emit_insn (gen_push (eax));
8579           allocate -= UNITS_PER_WORD;
8580         }
8581
8582       emit_move_insn (eax, GEN_INT (allocate));
8583
8584       if (TARGET_64BIT)
8585         insn = gen_allocate_stack_worker_64 (eax, eax);
8586       else
8587         insn = gen_allocate_stack_worker_32 (eax, eax);
8588       insn = emit_insn (insn);
8589
8590       if (ix86_cfa_state->reg == stack_pointer_rtx)
8591         {
8592           ix86_cfa_state->offset += allocate;
8593           t = gen_rtx_PLUS (Pmode, stack_pointer_rtx, GEN_INT (-allocate));
8594           t = gen_rtx_SET (VOIDmode, stack_pointer_rtx, t);
8595           add_reg_note (insn, REG_CFA_ADJUST_CFA, t);
8596           RTX_FRAME_RELATED_P (insn) = 1;
8597         }
8598
8599       if (eax_live)
8600         {
8601           if (frame_pointer_needed)
8602             t = plus_constant (hard_frame_pointer_rtx,
8603                                allocate
8604                                - frame.to_allocate
8605                                - frame.nregs * UNITS_PER_WORD);
8606           else
8607             t = plus_constant (stack_pointer_rtx, allocate);
8608           emit_move_insn (eax, gen_rtx_MEM (Pmode, t));
8609         }
8610     }
8611
8612   if (frame.save_regs_using_mov
8613       && !(!TARGET_64BIT_MS_ABI && TARGET_RED_ZONE
8614          && (! TARGET_STACK_PROBE || allocate < CHECK_STACK_LIMIT)))
8615     {
8616       if (!frame_pointer_needed
8617           || !(frame.to_allocate + frame.padding0)
8618           || crtl->stack_realign_needed)
8619         ix86_emit_save_regs_using_mov (stack_pointer_rtx,
8620                                        frame.to_allocate
8621                                        + frame.nsseregs * 16 + frame.padding0);
8622       else
8623         ix86_emit_save_regs_using_mov (hard_frame_pointer_rtx,
8624                                        -frame.nregs * UNITS_PER_WORD);
8625     }
8626   if (!frame_pointer_needed
8627       || !(frame.to_allocate + frame.padding0)
8628       || crtl->stack_realign_needed)
8629     ix86_emit_save_sse_regs_using_mov (stack_pointer_rtx,
8630                                        frame.to_allocate);
8631   else
8632     ix86_emit_save_sse_regs_using_mov (hard_frame_pointer_rtx,
8633                                        - frame.nregs * UNITS_PER_WORD
8634                                        - frame.nsseregs * 16
8635                                        - frame.padding0);
8636
8637   pic_reg_used = false;
8638   if (pic_offset_table_rtx
8639       && (df_regs_ever_live_p (REAL_PIC_OFFSET_TABLE_REGNUM)
8640           || crtl->profile))
8641     {
8642       unsigned int alt_pic_reg_used = ix86_select_alt_pic_regnum ();
8643
8644       if (alt_pic_reg_used != INVALID_REGNUM)
8645         SET_REGNO (pic_offset_table_rtx, alt_pic_reg_used);
8646
8647       pic_reg_used = true;
8648     }
8649
8650   if (pic_reg_used)
8651     {
8652       if (TARGET_64BIT)
8653         {
8654           if (ix86_cmodel == CM_LARGE_PIC)
8655             {
8656               rtx tmp_reg = gen_rtx_REG (DImode, R11_REG);
8657               rtx label = gen_label_rtx ();
8658               emit_label (label);
8659               LABEL_PRESERVE_P (label) = 1;
8660               gcc_assert (REGNO (pic_offset_table_rtx) != REGNO (tmp_reg));
8661               insn = emit_insn (gen_set_rip_rex64 (pic_offset_table_rtx, label));
8662               insn = emit_insn (gen_set_got_offset_rex64 (tmp_reg, label));
8663               insn = emit_insn (gen_adddi3 (pic_offset_table_rtx,
8664                                             pic_offset_table_rtx, tmp_reg));
8665             }
8666           else
8667             insn = emit_insn (gen_set_got_rex64 (pic_offset_table_rtx));
8668         }
8669       else
8670         insn = emit_insn (gen_set_got (pic_offset_table_rtx));
8671     }
8672
8673   /* In the pic_reg_used case, make sure that the got load isn't deleted
8674      when mcount needs it.  Blockage to avoid call movement across mcount
8675      call is emitted in generic code after the NOTE_INSN_PROLOGUE_END
8676      note.  */
8677   if (crtl->profile && pic_reg_used)
8678     emit_insn (gen_prologue_use (pic_offset_table_rtx));
8679
8680   if (crtl->drap_reg && !crtl->stack_realign_needed)
8681     {
8682       /* vDRAP is setup but after reload it turns out stack realign
8683          isn't necessary, here we will emit prologue to setup DRAP
8684          without stack realign adjustment */
8685       rtx x;
8686       int drap_bp_offset = UNITS_PER_WORD * 2;
8687
8688       if (ix86_static_chain_on_stack)
8689         drap_bp_offset += UNITS_PER_WORD;
8690       x = plus_constant (hard_frame_pointer_rtx, drap_bp_offset);
8691       insn = emit_insn (gen_rtx_SET (VOIDmode, crtl->drap_reg, x));
8692     }
8693
8694   /* Prevent instructions from being scheduled into register save push
8695      sequence when access to the redzone area is done through frame pointer.
8696      The offset between the frame pointer and the stack pointer is calculated
8697      relative to the value of the stack pointer at the end of the function
8698      prologue, and moving instructions that access redzone area via frame
8699      pointer inside push sequence violates this assumption.  */
8700   if (frame_pointer_needed && frame.red_zone_size)
8701     emit_insn (gen_memory_blockage ());
8702
8703   /* Emit cld instruction if stringops are used in the function.  */
8704   if (TARGET_CLD && ix86_current_function_needs_cld)
8705     emit_insn (gen_cld ());
8706 }
8707
8708 /* Emit code to restore REG using a POP insn.  */
8709
8710 static void
8711 ix86_emit_restore_reg_using_pop (rtx reg, HOST_WIDE_INT red_offset)
8712 {
8713   rtx insn = emit_insn (ix86_gen_pop1 (reg));
8714
8715   if (ix86_cfa_state->reg == crtl->drap_reg
8716       && REGNO (reg) == REGNO (crtl->drap_reg))
8717     {
8718       /* Previously we'd represented the CFA as an expression
8719          like *(%ebp - 8).  We've just popped that value from
8720          the stack, which means we need to reset the CFA to
8721          the drap register.  This will remain until we restore
8722          the stack pointer.  */
8723       add_reg_note (insn, REG_CFA_DEF_CFA, reg);
8724       RTX_FRAME_RELATED_P (insn) = 1;
8725       return;
8726     }
8727
8728   if (ix86_cfa_state->reg == stack_pointer_rtx)
8729     {
8730       ix86_cfa_state->offset -= UNITS_PER_WORD;
8731       add_reg_note (insn, REG_CFA_ADJUST_CFA,
8732                     copy_rtx (XVECEXP (PATTERN (insn), 0, 1)));
8733       RTX_FRAME_RELATED_P (insn) = 1;
8734     }
8735
8736   /* When the frame pointer is the CFA, and we pop it, we are
8737      swapping back to the stack pointer as the CFA.  This happens
8738      for stack frames that don't allocate other data, so we assume
8739      the stack pointer is now pointing at the return address, i.e.
8740      the function entry state, which makes the offset be 1 word.  */
8741   else if (ix86_cfa_state->reg == hard_frame_pointer_rtx
8742            && reg == hard_frame_pointer_rtx)
8743     {
8744       ix86_cfa_state->reg = stack_pointer_rtx;
8745       ix86_cfa_state->offset -= UNITS_PER_WORD;
8746
8747       add_reg_note (insn, REG_CFA_DEF_CFA,
8748                     gen_rtx_PLUS (Pmode, stack_pointer_rtx,
8749                                   GEN_INT (ix86_cfa_state->offset)));
8750       RTX_FRAME_RELATED_P (insn) = 1;
8751     }
8752
8753   ix86_add_cfa_restore_note (insn, reg, red_offset);
8754 }
8755
8756 /* Emit code to restore saved registers using POP insns.  */
8757
8758 static void
8759 ix86_emit_restore_regs_using_pop (HOST_WIDE_INT red_offset)
8760 {
8761   int regno;
8762
8763   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
8764     if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, false))
8765       {
8766         ix86_emit_restore_reg_using_pop (gen_rtx_REG (Pmode, regno),
8767                                          red_offset);
8768         red_offset += UNITS_PER_WORD;
8769       }
8770 }
8771
8772 /* Emit code and notes for the LEAVE instruction.  */
8773
8774 static void
8775 ix86_emit_leave (HOST_WIDE_INT red_offset)
8776 {
8777   rtx insn = emit_insn (ix86_gen_leave ());
8778
8779   ix86_add_queued_cfa_restore_notes (insn);
8780
8781   if (ix86_cfa_state->reg == hard_frame_pointer_rtx)
8782     {
8783       ix86_cfa_state->reg = stack_pointer_rtx;
8784       ix86_cfa_state->offset -= UNITS_PER_WORD;
8785
8786       add_reg_note (insn, REG_CFA_ADJUST_CFA, 
8787                     copy_rtx (XVECEXP (PATTERN (insn), 0, 0)));
8788       RTX_FRAME_RELATED_P (insn) = 1;
8789       ix86_add_cfa_restore_note (insn, hard_frame_pointer_rtx, red_offset);
8790     }
8791 }
8792
8793 /* Emit code to restore saved registers using MOV insns.  First register
8794    is restored from POINTER + OFFSET.  */
8795 static void
8796 ix86_emit_restore_regs_using_mov (rtx pointer, HOST_WIDE_INT offset,
8797                                   HOST_WIDE_INT red_offset,
8798                                   int maybe_eh_return)
8799 {
8800   unsigned int regno;
8801   rtx base_address = gen_rtx_MEM (Pmode, pointer);
8802   rtx insn;
8803
8804   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
8805     if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, maybe_eh_return))
8806       {
8807         rtx reg = gen_rtx_REG (Pmode, regno);
8808
8809         /* Ensure that adjust_address won't be forced to produce pointer
8810            out of range allowed by x86-64 instruction set.  */
8811         if (TARGET_64BIT && offset != trunc_int_for_mode (offset, SImode))
8812           {
8813             rtx r11;
8814
8815             r11 = gen_rtx_REG (DImode, R11_REG);
8816             emit_move_insn (r11, GEN_INT (offset));
8817             emit_insn (gen_adddi3 (r11, r11, pointer));
8818             base_address = gen_rtx_MEM (Pmode, r11);
8819             offset = 0;
8820           }
8821         insn = emit_move_insn (reg,
8822                                adjust_address (base_address, Pmode, offset));
8823         offset += UNITS_PER_WORD;
8824
8825         if (ix86_cfa_state->reg == crtl->drap_reg
8826             && regno == REGNO (crtl->drap_reg))
8827           {
8828             /* Previously we'd represented the CFA as an expression
8829                like *(%ebp - 8).  We've just popped that value from
8830                the stack, which means we need to reset the CFA to
8831                the drap register.  This will remain until we restore
8832                the stack pointer.  */
8833             add_reg_note (insn, REG_CFA_DEF_CFA, reg);
8834             RTX_FRAME_RELATED_P (insn) = 1;
8835           }
8836         else
8837           ix86_add_cfa_restore_note (NULL_RTX, reg, red_offset);
8838
8839         red_offset += UNITS_PER_WORD;
8840       }
8841 }
8842
8843 /* Emit code to restore saved registers using MOV insns.  First register
8844    is restored from POINTER + OFFSET.  */
8845 static void
8846 ix86_emit_restore_sse_regs_using_mov (rtx pointer, HOST_WIDE_INT offset,
8847                                       HOST_WIDE_INT red_offset,
8848                                       int maybe_eh_return)
8849 {
8850   int regno;
8851   rtx base_address = gen_rtx_MEM (TImode, pointer);
8852   rtx mem, insn;
8853
8854   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
8855     if (SSE_REGNO_P (regno) && ix86_save_reg (regno, maybe_eh_return))
8856       {
8857         rtx reg = gen_rtx_REG (TImode, regno);
8858
8859         /* Ensure that adjust_address won't be forced to produce pointer
8860            out of range allowed by x86-64 instruction set.  */
8861         if (TARGET_64BIT && offset != trunc_int_for_mode (offset, SImode))
8862           {
8863             rtx r11;
8864
8865             r11 = gen_rtx_REG (DImode, R11_REG);
8866             emit_move_insn (r11, GEN_INT (offset));
8867             emit_insn (gen_adddi3 (r11, r11, pointer));
8868             base_address = gen_rtx_MEM (TImode, r11);
8869             offset = 0;
8870           }
8871         mem = adjust_address (base_address, TImode, offset);
8872         set_mem_align (mem, 128);
8873         insn = emit_move_insn (reg, mem);
8874         offset += 16;
8875
8876         ix86_add_cfa_restore_note (NULL_RTX, reg, red_offset);
8877
8878         red_offset += 16;
8879       }
8880 }
8881
8882 /* Restore function stack, frame, and registers.  */
8883
8884 void
8885 ix86_expand_epilogue (int style)
8886 {
8887   int sp_valid;
8888   struct ix86_frame frame;
8889   HOST_WIDE_INT offset, red_offset;
8890   struct machine_cfa_state cfa_state_save = *ix86_cfa_state;
8891   bool using_drap;
8892
8893   ix86_finalize_stack_realign_flags ();
8894
8895  /* When stack is realigned, SP must be valid.  */
8896   sp_valid = (!frame_pointer_needed
8897               || current_function_sp_is_unchanging
8898               || stack_realign_fp);
8899
8900   ix86_compute_frame_layout (&frame);
8901
8902   /* See the comment about red zone and frame
8903      pointer usage in ix86_expand_prologue.  */
8904   if (frame_pointer_needed && frame.red_zone_size)
8905     emit_insn (gen_memory_blockage ()); 
8906
8907   using_drap = crtl->drap_reg && crtl->stack_realign_needed;
8908   gcc_assert (!using_drap || ix86_cfa_state->reg == crtl->drap_reg);
8909
8910   /* Calculate start of saved registers relative to ebp.  Special care
8911      must be taken for the normal return case of a function using
8912      eh_return: the eax and edx registers are marked as saved, but not
8913      restored along this path.  */
8914   offset = frame.nregs;
8915   if (crtl->calls_eh_return && style != 2)
8916     offset -= 2;
8917   offset *= -UNITS_PER_WORD;
8918   offset -= frame.nsseregs * 16 + frame.padding0;
8919
8920   /* Calculate start of saved registers relative to esp on entry of the
8921      function.  When realigning stack, this needs to be the most negative
8922      value possible at runtime.  */
8923   red_offset = offset;
8924   if (using_drap)
8925     red_offset -= crtl->stack_alignment_needed / BITS_PER_UNIT
8926                   + UNITS_PER_WORD;
8927   else if (stack_realign_fp)
8928     red_offset -= crtl->stack_alignment_needed / BITS_PER_UNIT
8929                   - UNITS_PER_WORD;
8930   if (ix86_static_chain_on_stack)
8931     red_offset -= UNITS_PER_WORD;
8932   if (frame_pointer_needed)
8933     red_offset -= UNITS_PER_WORD;
8934
8935   /* If we're only restoring one register and sp is not valid then
8936      using a move instruction to restore the register since it's
8937      less work than reloading sp and popping the register.
8938
8939      The default code result in stack adjustment using add/lea instruction,
8940      while this code results in LEAVE instruction (or discrete equivalent),
8941      so it is profitable in some other cases as well.  Especially when there
8942      are no registers to restore.  We also use this code when TARGET_USE_LEAVE
8943      and there is exactly one register to pop. This heuristic may need some
8944      tuning in future.  */
8945   if ((!sp_valid && (frame.nregs + frame.nsseregs) <= 1)
8946       || (TARGET_EPILOGUE_USING_MOVE
8947           && cfun->machine->use_fast_prologue_epilogue
8948           && ((frame.nregs + frame.nsseregs) > 1
8949               || (frame.to_allocate + frame.padding0) != 0))
8950       || (frame_pointer_needed && !(frame.nregs + frame.nsseregs)
8951           && (frame.to_allocate + frame.padding0) != 0)
8952       || (frame_pointer_needed && TARGET_USE_LEAVE
8953           && cfun->machine->use_fast_prologue_epilogue
8954           && (frame.nregs + frame.nsseregs) == 1)
8955       || crtl->calls_eh_return)
8956     {
8957       /* Restore registers.  We can use ebp or esp to address the memory
8958          locations.  If both are available, default to ebp, since offsets
8959          are known to be small.  Only exception is esp pointing directly
8960          to the end of block of saved registers, where we may simplify
8961          addressing mode.  
8962
8963          If we are realigning stack with bp and sp, regs restore can't
8964          be addressed by bp. sp must be used instead.  */
8965
8966       if (!frame_pointer_needed
8967           || (sp_valid && !(frame.to_allocate + frame.padding0)) 
8968           || stack_realign_fp)
8969         {
8970           ix86_emit_restore_sse_regs_using_mov (stack_pointer_rtx,
8971                                                 frame.to_allocate, red_offset,
8972                                                 style == 2);
8973           ix86_emit_restore_regs_using_mov (stack_pointer_rtx,
8974                                             frame.to_allocate
8975                                             + frame.nsseregs * 16
8976                                             + frame.padding0,
8977                                             red_offset
8978                                             + frame.nsseregs * 16
8979                                             + frame.padding0, style == 2);
8980         }
8981       else
8982         {
8983           ix86_emit_restore_sse_regs_using_mov (hard_frame_pointer_rtx,
8984                                                 offset, red_offset,
8985                                                 style == 2);
8986           ix86_emit_restore_regs_using_mov (hard_frame_pointer_rtx,
8987                                             offset
8988                                             + frame.nsseregs * 16
8989                                             + frame.padding0,
8990                                             red_offset
8991                                             + frame.nsseregs * 16
8992                                             + frame.padding0, style == 2);
8993         }
8994
8995       red_offset -= offset;
8996
8997       /* eh_return epilogues need %ecx added to the stack pointer.  */
8998       if (style == 2)
8999         {
9000           rtx tmp, sa = EH_RETURN_STACKADJ_RTX;
9001
9002           /* Stack align doesn't work with eh_return.  */
9003           gcc_assert (!crtl->stack_realign_needed);
9004           /* Neither does regparm nested functions.  */
9005           gcc_assert (!ix86_static_chain_on_stack);
9006
9007           if (frame_pointer_needed)
9008             {
9009               tmp = gen_rtx_PLUS (Pmode, hard_frame_pointer_rtx, sa);
9010               tmp = plus_constant (tmp, UNITS_PER_WORD);
9011               tmp = emit_insn (gen_rtx_SET (VOIDmode, sa, tmp));
9012
9013               tmp = gen_rtx_MEM (Pmode, hard_frame_pointer_rtx);
9014               tmp = emit_move_insn (hard_frame_pointer_rtx, tmp);
9015
9016               /* Note that we use SA as a temporary CFA, as the return
9017                  address is at the proper place relative to it.  We
9018                  pretend this happens at the FP restore insn because
9019                  prior to this insn the FP would be stored at the wrong
9020                  offset relative to SA, and after this insn we have no
9021                  other reasonable register to use for the CFA.  We don't
9022                  bother resetting the CFA to the SP for the duration of
9023                  the return insn.  */
9024               add_reg_note (tmp, REG_CFA_DEF_CFA,
9025                             plus_constant (sa, UNITS_PER_WORD));
9026               ix86_add_queued_cfa_restore_notes (tmp);
9027               add_reg_note (tmp, REG_CFA_RESTORE, hard_frame_pointer_rtx);
9028               RTX_FRAME_RELATED_P (tmp) = 1;
9029               ix86_cfa_state->reg = sa;
9030               ix86_cfa_state->offset = UNITS_PER_WORD;
9031
9032               pro_epilogue_adjust_stack (stack_pointer_rtx, sa,
9033                                          const0_rtx, style, false);
9034             }
9035           else
9036             {
9037               tmp = gen_rtx_PLUS (Pmode, stack_pointer_rtx, sa);
9038               tmp = plus_constant (tmp, (frame.to_allocate
9039                                          + frame.nregs * UNITS_PER_WORD
9040                                          + frame.nsseregs * 16
9041                                          + frame.padding0));
9042               tmp = emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx, tmp));
9043               ix86_add_queued_cfa_restore_notes (tmp);
9044
9045               gcc_assert (ix86_cfa_state->reg == stack_pointer_rtx);
9046               if (ix86_cfa_state->offset != UNITS_PER_WORD)
9047                 {
9048                   ix86_cfa_state->offset = UNITS_PER_WORD;
9049                   add_reg_note (tmp, REG_CFA_DEF_CFA,
9050                                 plus_constant (stack_pointer_rtx,
9051                                                UNITS_PER_WORD));
9052                   RTX_FRAME_RELATED_P (tmp) = 1;
9053                 }
9054             }
9055         }
9056       else if (!frame_pointer_needed)
9057         pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
9058                                    GEN_INT (frame.to_allocate
9059                                             + frame.nregs * UNITS_PER_WORD
9060                                             + frame.nsseregs * 16
9061                                             + frame.padding0),
9062                                    style, !using_drap);
9063       /* If not an i386, mov & pop is faster than "leave".  */
9064       else if (TARGET_USE_LEAVE || optimize_function_for_size_p (cfun)
9065                || !cfun->machine->use_fast_prologue_epilogue)
9066         ix86_emit_leave (red_offset);
9067       else
9068         {
9069           pro_epilogue_adjust_stack (stack_pointer_rtx,
9070                                      hard_frame_pointer_rtx,
9071                                      const0_rtx, style, !using_drap);
9072
9073           ix86_emit_restore_reg_using_pop (hard_frame_pointer_rtx, red_offset);
9074         }
9075     }
9076   else
9077     {
9078       /* First step is to deallocate the stack frame so that we can
9079          pop the registers.
9080
9081          If we realign stack with frame pointer, then stack pointer
9082          won't be able to recover via lea $offset(%bp), %sp, because
9083          there is a padding area between bp and sp for realign. 
9084          "add $to_allocate, %sp" must be used instead.  */
9085       if (!sp_valid)
9086         {
9087           gcc_assert (frame_pointer_needed);
9088           gcc_assert (!stack_realign_fp);
9089           pro_epilogue_adjust_stack (stack_pointer_rtx,
9090                                      hard_frame_pointer_rtx,
9091                                      GEN_INT (offset), style, false);
9092           ix86_emit_restore_sse_regs_using_mov (stack_pointer_rtx,
9093                                                 0, red_offset,
9094                                                 style == 2);
9095           pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
9096                                      GEN_INT (frame.nsseregs * 16
9097                                               + frame.padding0),
9098                                      style, false);
9099         }
9100       else if (frame.to_allocate || frame.padding0 || frame.nsseregs)
9101         {
9102           ix86_emit_restore_sse_regs_using_mov (stack_pointer_rtx,
9103                                                 frame.to_allocate, red_offset,
9104                                                 style == 2);
9105           pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
9106                                      GEN_INT (frame.to_allocate
9107                                               + frame.nsseregs * 16
9108                                               + frame.padding0), style,
9109                                      !using_drap && !frame_pointer_needed);
9110         }
9111
9112       ix86_emit_restore_regs_using_pop (red_offset + frame.nsseregs * 16
9113                                         + frame.padding0);
9114       red_offset -= offset;
9115
9116       if (frame_pointer_needed)
9117         {
9118           /* Leave results in shorter dependency chains on CPUs that are
9119              able to grok it fast.  */
9120           if (TARGET_USE_LEAVE)
9121             ix86_emit_leave (red_offset);
9122           else
9123             {
9124               /* For stack realigned really happens, recover stack 
9125                  pointer to hard frame pointer is a must, if not using 
9126                  leave.  */
9127               if (stack_realign_fp)
9128                 pro_epilogue_adjust_stack (stack_pointer_rtx,
9129                                            hard_frame_pointer_rtx,
9130                                            const0_rtx, style, !using_drap);
9131               ix86_emit_restore_reg_using_pop (hard_frame_pointer_rtx,
9132                                                red_offset);
9133             }
9134         }
9135     }
9136
9137   if (using_drap)
9138     {
9139       int param_ptr_offset = UNITS_PER_WORD;
9140       rtx insn;
9141
9142       gcc_assert (stack_realign_drap);
9143
9144       if (ix86_static_chain_on_stack)
9145         param_ptr_offset += UNITS_PER_WORD;
9146       if (!call_used_regs[REGNO (crtl->drap_reg)])
9147         param_ptr_offset += UNITS_PER_WORD;
9148
9149       insn = emit_insn ((*ix86_gen_add3) (stack_pointer_rtx,
9150                                           crtl->drap_reg,
9151                                           GEN_INT (-param_ptr_offset)));
9152
9153       ix86_cfa_state->reg = stack_pointer_rtx;
9154       ix86_cfa_state->offset = param_ptr_offset;
9155
9156       add_reg_note (insn, REG_CFA_DEF_CFA,
9157                     gen_rtx_PLUS (Pmode, ix86_cfa_state->reg,
9158                                   GEN_INT (ix86_cfa_state->offset)));
9159       RTX_FRAME_RELATED_P (insn) = 1;
9160
9161       if (!call_used_regs[REGNO (crtl->drap_reg)])
9162         ix86_emit_restore_reg_using_pop (crtl->drap_reg, -UNITS_PER_WORD);
9163     }
9164
9165   /* Remove the saved static chain from the stack.  The use of ECX is
9166      merely as a scratch register, not as the actual static chain.  */
9167   if (ix86_static_chain_on_stack)
9168     {
9169       rtx r, insn;
9170
9171       gcc_assert (ix86_cfa_state->reg == stack_pointer_rtx);
9172       ix86_cfa_state->offset += UNITS_PER_WORD;
9173     
9174       r = gen_rtx_REG (Pmode, CX_REG);
9175       insn = emit_insn (ix86_gen_pop1 (r));
9176
9177       r = plus_constant (stack_pointer_rtx, UNITS_PER_WORD);
9178       r = gen_rtx_SET (VOIDmode, stack_pointer_rtx, r);
9179       add_reg_note (insn, REG_CFA_ADJUST_CFA, r);
9180       RTX_FRAME_RELATED_P (insn) = 1;
9181     }
9182
9183   /* Sibcall epilogues don't want a return instruction.  */
9184   if (style == 0)
9185     {
9186       *ix86_cfa_state = cfa_state_save;
9187       return;
9188     }
9189
9190   if (crtl->args.pops_args && crtl->args.size)
9191     {
9192       rtx popc = GEN_INT (crtl->args.pops_args);
9193
9194       /* i386 can only pop 64K bytes.  If asked to pop more, pop return
9195          address, do explicit add, and jump indirectly to the caller.  */
9196
9197       if (crtl->args.pops_args >= 65536)
9198         {
9199           rtx ecx = gen_rtx_REG (SImode, CX_REG);
9200           rtx insn;
9201
9202           /* There is no "pascal" calling convention in any 64bit ABI.  */
9203           gcc_assert (!TARGET_64BIT);
9204
9205           insn = emit_insn (gen_popsi1 (ecx));
9206           ix86_cfa_state->offset -= UNITS_PER_WORD;
9207
9208           add_reg_note (insn, REG_CFA_ADJUST_CFA,
9209                         copy_rtx (XVECEXP (PATTERN (insn), 0, 1)));
9210           add_reg_note (insn, REG_CFA_REGISTER,
9211                         gen_rtx_SET (VOIDmode, ecx, pc_rtx));
9212           RTX_FRAME_RELATED_P (insn) = 1;
9213
9214           pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
9215                                      popc, -1, true);
9216           emit_jump_insn (gen_return_indirect_internal (ecx));
9217         }
9218       else
9219         emit_jump_insn (gen_return_pop_internal (popc));
9220     }
9221   else
9222     emit_jump_insn (gen_return_internal ());
9223
9224   /* Restore the state back to the state from the prologue,
9225      so that it's correct for the next epilogue.  */
9226   *ix86_cfa_state = cfa_state_save;
9227 }
9228
9229 /* Reset from the function's potential modifications.  */
9230
9231 static void
9232 ix86_output_function_epilogue (FILE *file ATTRIBUTE_UNUSED,
9233                                HOST_WIDE_INT size ATTRIBUTE_UNUSED)
9234 {
9235   if (pic_offset_table_rtx)
9236     SET_REGNO (pic_offset_table_rtx, REAL_PIC_OFFSET_TABLE_REGNUM);
9237 #if TARGET_MACHO
9238   /* Mach-O doesn't support labels at the end of objects, so if
9239      it looks like we might want one, insert a NOP.  */
9240   {
9241     rtx insn = get_last_insn ();
9242     while (insn
9243            && NOTE_P (insn)
9244            && NOTE_KIND (insn) != NOTE_INSN_DELETED_LABEL)
9245       insn = PREV_INSN (insn);
9246     if (insn
9247         && (LABEL_P (insn)
9248             || (NOTE_P (insn)
9249                 && NOTE_KIND (insn) == NOTE_INSN_DELETED_LABEL)))
9250       fputs ("\tnop\n", file);
9251   }
9252 #endif
9253
9254 }
9255 \f
9256 /* Extract the parts of an RTL expression that is a valid memory address
9257    for an instruction.  Return 0 if the structure of the address is
9258    grossly off.  Return -1 if the address contains ASHIFT, so it is not
9259    strictly valid, but still used for computing length of lea instruction.  */
9260
9261 int
9262 ix86_decompose_address (rtx addr, struct ix86_address *out)
9263 {
9264   rtx base = NULL_RTX, index = NULL_RTX, disp = NULL_RTX;
9265   rtx base_reg, index_reg;
9266   HOST_WIDE_INT scale = 1;
9267   rtx scale_rtx = NULL_RTX;
9268   int retval = 1;
9269   enum ix86_address_seg seg = SEG_DEFAULT;
9270
9271   if (REG_P (addr) || GET_CODE (addr) == SUBREG)
9272     base = addr;
9273   else if (GET_CODE (addr) == PLUS)
9274     {
9275       rtx addends[4], op;
9276       int n = 0, i;
9277
9278       op = addr;
9279       do
9280         {
9281           if (n >= 4)
9282             return 0;
9283           addends[n++] = XEXP (op, 1);
9284           op = XEXP (op, 0);
9285         }
9286       while (GET_CODE (op) == PLUS);
9287       if (n >= 4)
9288         return 0;
9289       addends[n] = op;
9290
9291       for (i = n; i >= 0; --i)
9292         {
9293           op = addends[i];
9294           switch (GET_CODE (op))
9295             {
9296             case MULT:
9297               if (index)
9298                 return 0;
9299               index = XEXP (op, 0);
9300               scale_rtx = XEXP (op, 1);
9301               break;
9302
9303             case UNSPEC:
9304               if (XINT (op, 1) == UNSPEC_TP
9305                   && TARGET_TLS_DIRECT_SEG_REFS
9306                   && seg == SEG_DEFAULT)
9307                 seg = TARGET_64BIT ? SEG_FS : SEG_GS;
9308               else
9309                 return 0;
9310               break;
9311
9312             case REG:
9313             case SUBREG:
9314               if (!base)
9315                 base = op;
9316               else if (!index)
9317                 index = op;
9318               else
9319                 return 0;
9320               break;
9321
9322             case CONST:
9323             case CONST_INT:
9324             case SYMBOL_REF:
9325             case LABEL_REF:
9326               if (disp)
9327                 return 0;
9328               disp = op;
9329               break;
9330
9331             default:
9332               return 0;
9333             }
9334         }
9335     }
9336   else if (GET_CODE (addr) == MULT)
9337     {
9338       index = XEXP (addr, 0);           /* index*scale */
9339       scale_rtx = XEXP (addr, 1);
9340     }
9341   else if (GET_CODE (addr) == ASHIFT)
9342     {
9343       rtx tmp;
9344
9345       /* We're called for lea too, which implements ashift on occasion.  */
9346       index = XEXP (addr, 0);
9347       tmp = XEXP (addr, 1);
9348       if (!CONST_INT_P (tmp))
9349         return 0;
9350       scale = INTVAL (tmp);
9351       if ((unsigned HOST_WIDE_INT) scale > 3)
9352         return 0;
9353       scale = 1 << scale;
9354       retval = -1;
9355     }
9356   else
9357     disp = addr;                        /* displacement */
9358
9359   /* Extract the integral value of scale.  */
9360   if (scale_rtx)
9361     {
9362       if (!CONST_INT_P (scale_rtx))
9363         return 0;
9364       scale = INTVAL (scale_rtx);
9365     }
9366
9367   base_reg = base && GET_CODE (base) == SUBREG ? SUBREG_REG (base) : base;
9368   index_reg = index && GET_CODE (index) == SUBREG ? SUBREG_REG (index) : index;
9369
9370   /* Avoid useless 0 displacement.  */
9371   if (disp == const0_rtx && (base || index))
9372     disp = NULL_RTX;
9373
9374   /* Allow arg pointer and stack pointer as index if there is not scaling.  */
9375   if (base_reg && index_reg && scale == 1
9376       && (index_reg == arg_pointer_rtx
9377           || index_reg == frame_pointer_rtx
9378           || (REG_P (index_reg) && REGNO (index_reg) == STACK_POINTER_REGNUM)))
9379     {
9380       rtx tmp;
9381       tmp = base, base = index, index = tmp;
9382       tmp = base_reg, base_reg = index_reg, index_reg = tmp;
9383     }
9384
9385   /* Special case: %ebp cannot be encoded as a base without a displacement.
9386      Similarly %r13.  */
9387   if (!disp
9388       && base_reg
9389       && (base_reg == hard_frame_pointer_rtx
9390           || base_reg == frame_pointer_rtx
9391           || base_reg == arg_pointer_rtx
9392           || (REG_P (base_reg)
9393               && (REGNO (base_reg) == HARD_FRAME_POINTER_REGNUM
9394                   || REGNO (base_reg) == R13_REG))))
9395     disp = const0_rtx;
9396
9397   /* Special case: on K6, [%esi] makes the instruction vector decoded.
9398      Avoid this by transforming to [%esi+0].
9399      Reload calls address legitimization without cfun defined, so we need
9400      to test cfun for being non-NULL. */
9401   if (TARGET_K6 && cfun && optimize_function_for_speed_p (cfun)
9402       && base_reg && !index_reg && !disp
9403       && REG_P (base_reg)
9404       && REGNO_REG_CLASS (REGNO (base_reg)) == SIREG)
9405     disp = const0_rtx;
9406
9407   /* Special case: encode reg+reg instead of reg*2.  */
9408   if (!base && index && scale == 2)
9409     base = index, base_reg = index_reg, scale = 1;
9410
9411   /* Special case: scaling cannot be encoded without base or displacement.  */
9412   if (!base && !disp && index && scale != 1)
9413     disp = const0_rtx;
9414
9415   out->base = base;
9416   out->index = index;
9417   out->disp = disp;
9418   out->scale = scale;
9419   out->seg = seg;
9420
9421   return retval;
9422 }
9423 \f
9424 /* Return cost of the memory address x.
9425    For i386, it is better to use a complex address than let gcc copy
9426    the address into a reg and make a new pseudo.  But not if the address
9427    requires to two regs - that would mean more pseudos with longer
9428    lifetimes.  */
9429 static int
9430 ix86_address_cost (rtx x, bool speed ATTRIBUTE_UNUSED)
9431 {
9432   struct ix86_address parts;
9433   int cost = 1;
9434   int ok = ix86_decompose_address (x, &parts);
9435
9436   gcc_assert (ok);
9437
9438   if (parts.base && GET_CODE (parts.base) == SUBREG)
9439     parts.base = SUBREG_REG (parts.base);
9440   if (parts.index && GET_CODE (parts.index) == SUBREG)
9441     parts.index = SUBREG_REG (parts.index);
9442
9443   /* Attempt to minimize number of registers in the address.  */
9444   if ((parts.base
9445        && (!REG_P (parts.base) || REGNO (parts.base) >= FIRST_PSEUDO_REGISTER))
9446       || (parts.index
9447           && (!REG_P (parts.index)
9448               || REGNO (parts.index) >= FIRST_PSEUDO_REGISTER)))
9449     cost++;
9450
9451   if (parts.base
9452       && (!REG_P (parts.base) || REGNO (parts.base) >= FIRST_PSEUDO_REGISTER)
9453       && parts.index
9454       && (!REG_P (parts.index) || REGNO (parts.index) >= FIRST_PSEUDO_REGISTER)
9455       && parts.base != parts.index)
9456     cost++;
9457
9458   /* AMD-K6 don't like addresses with ModR/M set to 00_xxx_100b,
9459      since it's predecode logic can't detect the length of instructions
9460      and it degenerates to vector decoded.  Increase cost of such
9461      addresses here.  The penalty is minimally 2 cycles.  It may be worthwhile
9462      to split such addresses or even refuse such addresses at all.
9463
9464      Following addressing modes are affected:
9465       [base+scale*index]
9466       [scale*index+disp]
9467       [base+index]
9468
9469      The first and last case  may be avoidable by explicitly coding the zero in
9470      memory address, but I don't have AMD-K6 machine handy to check this
9471      theory.  */
9472
9473   if (TARGET_K6
9474       && ((!parts.disp && parts.base && parts.index && parts.scale != 1)
9475           || (parts.disp && !parts.base && parts.index && parts.scale != 1)
9476           || (!parts.disp && parts.base && parts.index && parts.scale == 1)))
9477     cost += 10;
9478
9479   return cost;
9480 }
9481 \f
9482 /* Allow {LABEL | SYMBOL}_REF - SYMBOL_REF-FOR-PICBASE for Mach-O as
9483    this is used for to form addresses to local data when -fPIC is in
9484    use.  */
9485
9486 static bool
9487 darwin_local_data_pic (rtx disp)
9488 {
9489   return (GET_CODE (disp) == UNSPEC
9490           && XINT (disp, 1) == UNSPEC_MACHOPIC_OFFSET);
9491 }
9492
9493 /* Determine if a given RTX is a valid constant.  We already know this
9494    satisfies CONSTANT_P.  */
9495
9496 bool
9497 legitimate_constant_p (rtx x)
9498 {
9499   switch (GET_CODE (x))
9500     {
9501     case CONST:
9502       x = XEXP (x, 0);
9503
9504       if (GET_CODE (x) == PLUS)
9505         {
9506           if (!CONST_INT_P (XEXP (x, 1)))
9507             return false;
9508           x = XEXP (x, 0);
9509         }
9510
9511       if (TARGET_MACHO && darwin_local_data_pic (x))
9512         return true;
9513
9514       /* Only some unspecs are valid as "constants".  */
9515       if (GET_CODE (x) == UNSPEC)
9516         switch (XINT (x, 1))
9517           {
9518           case UNSPEC_GOT:
9519           case UNSPEC_GOTOFF:
9520           case UNSPEC_PLTOFF:
9521             return TARGET_64BIT;
9522           case UNSPEC_TPOFF:
9523           case UNSPEC_NTPOFF:
9524             x = XVECEXP (x, 0, 0);
9525             return (GET_CODE (x) == SYMBOL_REF
9526                     && SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_EXEC);
9527           case UNSPEC_DTPOFF:
9528             x = XVECEXP (x, 0, 0);
9529             return (GET_CODE (x) == SYMBOL_REF
9530                     && SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_DYNAMIC);
9531           default:
9532             return false;
9533           }
9534
9535       /* We must have drilled down to a symbol.  */
9536       if (GET_CODE (x) == LABEL_REF)
9537         return true;
9538       if (GET_CODE (x) != SYMBOL_REF)
9539         return false;
9540       /* FALLTHRU */
9541
9542     case SYMBOL_REF:
9543       /* TLS symbols are never valid.  */
9544       if (SYMBOL_REF_TLS_MODEL (x))
9545         return false;
9546
9547       /* DLLIMPORT symbols are never valid.  */
9548       if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
9549           && SYMBOL_REF_DLLIMPORT_P (x))
9550         return false;
9551       break;
9552
9553     case CONST_DOUBLE:
9554       if (GET_MODE (x) == TImode
9555           && x != CONST0_RTX (TImode)
9556           && !TARGET_64BIT)
9557         return false;
9558       break;
9559
9560     case CONST_VECTOR:
9561       if (!standard_sse_constant_p (x))
9562         return false;
9563
9564     default:
9565       break;
9566     }
9567
9568   /* Otherwise we handle everything else in the move patterns.  */
9569   return true;
9570 }
9571
9572 /* Determine if it's legal to put X into the constant pool.  This
9573    is not possible for the address of thread-local symbols, which
9574    is checked above.  */
9575
9576 static bool
9577 ix86_cannot_force_const_mem (rtx x)
9578 {
9579   /* We can always put integral constants and vectors in memory.  */
9580   switch (GET_CODE (x))
9581     {
9582     case CONST_INT:
9583     case CONST_DOUBLE:
9584     case CONST_VECTOR:
9585       return false;
9586
9587     default:
9588       break;
9589     }
9590   return !legitimate_constant_p (x);
9591 }
9592
9593
9594 /* Nonzero if the constant value X is a legitimate general operand
9595    when generating PIC code.  It is given that flag_pic is on and
9596    that X satisfies CONSTANT_P or is a CONST_DOUBLE.  */
9597
9598 bool
9599 legitimate_pic_operand_p (rtx x)
9600 {
9601   rtx inner;
9602
9603   switch (GET_CODE (x))
9604     {
9605     case CONST:
9606       inner = XEXP (x, 0);
9607       if (GET_CODE (inner) == PLUS
9608           && CONST_INT_P (XEXP (inner, 1)))
9609         inner = XEXP (inner, 0);
9610
9611       /* Only some unspecs are valid as "constants".  */
9612       if (GET_CODE (inner) == UNSPEC)
9613         switch (XINT (inner, 1))
9614           {
9615           case UNSPEC_GOT:
9616           case UNSPEC_GOTOFF:
9617           case UNSPEC_PLTOFF:
9618             return TARGET_64BIT;
9619           case UNSPEC_TPOFF:
9620             x = XVECEXP (inner, 0, 0);
9621             return (GET_CODE (x) == SYMBOL_REF
9622                     && SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_EXEC);
9623           case UNSPEC_MACHOPIC_OFFSET:
9624             return legitimate_pic_address_disp_p (x);
9625           default:
9626             return false;
9627           }
9628       /* FALLTHRU */
9629
9630     case SYMBOL_REF:
9631     case LABEL_REF:
9632       return legitimate_pic_address_disp_p (x);
9633
9634     default:
9635       return true;
9636     }
9637 }
9638
9639 /* Determine if a given CONST RTX is a valid memory displacement
9640    in PIC mode.  */
9641
9642 int
9643 legitimate_pic_address_disp_p (rtx disp)
9644 {
9645   bool saw_plus;
9646
9647   /* In 64bit mode we can allow direct addresses of symbols and labels
9648      when they are not dynamic symbols.  */
9649   if (TARGET_64BIT)
9650     {
9651       rtx op0 = disp, op1;
9652
9653       switch (GET_CODE (disp))
9654         {
9655         case LABEL_REF:
9656           return true;
9657
9658         case CONST:
9659           if (GET_CODE (XEXP (disp, 0)) != PLUS)
9660             break;
9661           op0 = XEXP (XEXP (disp, 0), 0);
9662           op1 = XEXP (XEXP (disp, 0), 1);
9663           if (!CONST_INT_P (op1)
9664               || INTVAL (op1) >= 16*1024*1024
9665               || INTVAL (op1) < -16*1024*1024)
9666             break;
9667           if (GET_CODE (op0) == LABEL_REF)
9668             return true;
9669           if (GET_CODE (op0) != SYMBOL_REF)
9670             break;
9671           /* FALLTHRU */
9672
9673         case SYMBOL_REF:
9674           /* TLS references should always be enclosed in UNSPEC.  */
9675           if (SYMBOL_REF_TLS_MODEL (op0))
9676             return false;
9677           if (!SYMBOL_REF_FAR_ADDR_P (op0) && SYMBOL_REF_LOCAL_P (op0)
9678               && ix86_cmodel != CM_LARGE_PIC)
9679             return true;
9680           break;
9681
9682         default:
9683           break;
9684         }
9685     }
9686   if (GET_CODE (disp) != CONST)
9687     return 0;
9688   disp = XEXP (disp, 0);
9689
9690   if (TARGET_64BIT)
9691     {
9692       /* We are unsafe to allow PLUS expressions.  This limit allowed distance
9693          of GOT tables.  We should not need these anyway.  */
9694       if (GET_CODE (disp) != UNSPEC
9695           || (XINT (disp, 1) != UNSPEC_GOTPCREL
9696               && XINT (disp, 1) != UNSPEC_GOTOFF
9697               && XINT (disp, 1) != UNSPEC_PLTOFF))
9698         return 0;
9699
9700       if (GET_CODE (XVECEXP (disp, 0, 0)) != SYMBOL_REF
9701           && GET_CODE (XVECEXP (disp, 0, 0)) != LABEL_REF)
9702         return 0;
9703       return 1;
9704     }
9705
9706   saw_plus = false;
9707   if (GET_CODE (disp) == PLUS)
9708     {
9709       if (!CONST_INT_P (XEXP (disp, 1)))
9710         return 0;
9711       disp = XEXP (disp, 0);
9712       saw_plus = true;
9713     }
9714
9715   if (TARGET_MACHO && darwin_local_data_pic (disp))
9716     return 1;
9717
9718   if (GET_CODE (disp) != UNSPEC)
9719     return 0;
9720
9721   switch (XINT (disp, 1))
9722     {
9723     case UNSPEC_GOT:
9724       if (saw_plus)
9725         return false;
9726       /* We need to check for both symbols and labels because VxWorks loads
9727          text labels with @GOT rather than @GOTOFF.  See gotoff_operand for
9728          details.  */
9729       return (GET_CODE (XVECEXP (disp, 0, 0)) == SYMBOL_REF
9730               || GET_CODE (XVECEXP (disp, 0, 0)) == LABEL_REF);
9731     case UNSPEC_GOTOFF:
9732       /* Refuse GOTOFF in 64bit mode since it is always 64bit when used.
9733          While ABI specify also 32bit relocation but we don't produce it in
9734          small PIC model at all.  */
9735       if ((GET_CODE (XVECEXP (disp, 0, 0)) == SYMBOL_REF
9736            || GET_CODE (XVECEXP (disp, 0, 0)) == LABEL_REF)
9737           && !TARGET_64BIT)
9738         return gotoff_operand (XVECEXP (disp, 0, 0), Pmode);
9739       return false;
9740     case UNSPEC_GOTTPOFF:
9741     case UNSPEC_GOTNTPOFF:
9742     case UNSPEC_INDNTPOFF:
9743       if (saw_plus)
9744         return false;
9745       disp = XVECEXP (disp, 0, 0);
9746       return (GET_CODE (disp) == SYMBOL_REF
9747               && SYMBOL_REF_TLS_MODEL (disp) == TLS_MODEL_INITIAL_EXEC);
9748     case UNSPEC_NTPOFF:
9749       disp = XVECEXP (disp, 0, 0);
9750       return (GET_CODE (disp) == SYMBOL_REF
9751               && SYMBOL_REF_TLS_MODEL (disp) == TLS_MODEL_LOCAL_EXEC);
9752     case UNSPEC_DTPOFF:
9753       disp = XVECEXP (disp, 0, 0);
9754       return (GET_CODE (disp) == SYMBOL_REF
9755               && SYMBOL_REF_TLS_MODEL (disp) == TLS_MODEL_LOCAL_DYNAMIC);
9756     }
9757
9758   return 0;
9759 }
9760
9761 /* Recognizes RTL expressions that are valid memory addresses for an
9762    instruction.  The MODE argument is the machine mode for the MEM
9763    expression that wants to use this address.
9764
9765    It only recognizes address in canonical form.  LEGITIMIZE_ADDRESS should
9766    convert common non-canonical forms to canonical form so that they will
9767    be recognized.  */
9768
9769 static bool
9770 ix86_legitimate_address_p (enum machine_mode mode ATTRIBUTE_UNUSED,
9771                            rtx addr, bool strict)
9772 {
9773   struct ix86_address parts;
9774   rtx base, index, disp;
9775   HOST_WIDE_INT scale;
9776
9777   if (ix86_decompose_address (addr, &parts) <= 0)
9778     /* Decomposition failed.  */
9779     return false;
9780
9781   base = parts.base;
9782   index = parts.index;
9783   disp = parts.disp;
9784   scale = parts.scale;
9785
9786   /* Validate base register.
9787
9788      Don't allow SUBREG's that span more than a word here.  It can lead to spill
9789      failures when the base is one word out of a two word structure, which is
9790      represented internally as a DImode int.  */
9791
9792   if (base)
9793     {
9794       rtx reg;
9795
9796       if (REG_P (base))
9797         reg = base;
9798       else if (GET_CODE (base) == SUBREG
9799                && REG_P (SUBREG_REG (base))
9800                && GET_MODE_SIZE (GET_MODE (SUBREG_REG (base)))
9801                   <= UNITS_PER_WORD)
9802         reg = SUBREG_REG (base);
9803       else
9804         /* Base is not a register.  */
9805         return false;
9806
9807       if (GET_MODE (base) != Pmode)
9808         /* Base is not in Pmode.  */
9809         return false;
9810
9811       if ((strict && ! REG_OK_FOR_BASE_STRICT_P (reg))
9812           || (! strict && ! REG_OK_FOR_BASE_NONSTRICT_P (reg)))
9813         /* Base is not valid.  */
9814         return false;
9815     }
9816
9817   /* Validate index register.
9818
9819      Don't allow SUBREG's that span more than a word here -- same as above.  */
9820
9821   if (index)
9822     {
9823       rtx reg;
9824
9825       if (REG_P (index))
9826         reg = index;
9827       else if (GET_CODE (index) == SUBREG
9828                && REG_P (SUBREG_REG (index))
9829                && GET_MODE_SIZE (GET_MODE (SUBREG_REG (index)))
9830                   <= UNITS_PER_WORD)
9831         reg = SUBREG_REG (index);
9832       else
9833         /* Index is not a register.  */
9834         return false;
9835
9836       if (GET_MODE (index) != Pmode)
9837         /* Index is not in Pmode.  */
9838         return false;
9839
9840       if ((strict && ! REG_OK_FOR_INDEX_STRICT_P (reg))
9841           || (! strict && ! REG_OK_FOR_INDEX_NONSTRICT_P (reg)))
9842         /* Index is not valid.  */
9843         return false;
9844     }
9845
9846   /* Validate scale factor.  */
9847   if (scale != 1)
9848     {
9849       if (!index)
9850         /* Scale without index.  */
9851         return false;
9852
9853       if (scale != 2 && scale != 4 && scale != 8)
9854         /* Scale is not a valid multiplier.  */
9855         return false;
9856     }
9857
9858   /* Validate displacement.  */
9859   if (disp)
9860     {
9861       if (GET_CODE (disp) == CONST
9862           && GET_CODE (XEXP (disp, 0)) == UNSPEC
9863           && XINT (XEXP (disp, 0), 1) != UNSPEC_MACHOPIC_OFFSET)
9864         switch (XINT (XEXP (disp, 0), 1))
9865           {
9866           /* Refuse GOTOFF and GOT in 64bit mode since it is always 64bit when
9867              used.  While ABI specify also 32bit relocations, we don't produce
9868              them at all and use IP relative instead.  */
9869           case UNSPEC_GOT:
9870           case UNSPEC_GOTOFF:
9871             gcc_assert (flag_pic);
9872             if (!TARGET_64BIT)
9873               goto is_legitimate_pic;
9874
9875             /* 64bit address unspec.  */
9876             return false;
9877
9878           case UNSPEC_GOTPCREL:
9879             gcc_assert (flag_pic);
9880             goto is_legitimate_pic;
9881
9882           case UNSPEC_GOTTPOFF:
9883           case UNSPEC_GOTNTPOFF:
9884           case UNSPEC_INDNTPOFF:
9885           case UNSPEC_NTPOFF:
9886           case UNSPEC_DTPOFF:
9887             break;
9888
9889           default:
9890             /* Invalid address unspec.  */
9891             return false;
9892           }
9893
9894       else if (SYMBOLIC_CONST (disp)
9895                && (flag_pic
9896                    || (TARGET_MACHO
9897 #if TARGET_MACHO
9898                        && MACHOPIC_INDIRECT
9899                        && !machopic_operand_p (disp)
9900 #endif
9901                )))
9902         {
9903
9904         is_legitimate_pic:
9905           if (TARGET_64BIT && (index || base))
9906             {
9907               /* foo@dtpoff(%rX) is ok.  */
9908               if (GET_CODE (disp) != CONST
9909                   || GET_CODE (XEXP (disp, 0)) != PLUS
9910                   || GET_CODE (XEXP (XEXP (disp, 0), 0)) != UNSPEC
9911                   || !CONST_INT_P (XEXP (XEXP (disp, 0), 1))
9912                   || (XINT (XEXP (XEXP (disp, 0), 0), 1) != UNSPEC_DTPOFF
9913                       && XINT (XEXP (XEXP (disp, 0), 0), 1) != UNSPEC_NTPOFF))
9914                 /* Non-constant pic memory reference.  */
9915                 return false;
9916             }
9917           else if (! legitimate_pic_address_disp_p (disp))
9918             /* Displacement is an invalid pic construct.  */
9919             return false;
9920
9921           /* This code used to verify that a symbolic pic displacement
9922              includes the pic_offset_table_rtx register.
9923
9924              While this is good idea, unfortunately these constructs may
9925              be created by "adds using lea" optimization for incorrect
9926              code like:
9927
9928              int a;
9929              int foo(int i)
9930                {
9931                  return *(&a+i);
9932                }
9933
9934              This code is nonsensical, but results in addressing
9935              GOT table with pic_offset_table_rtx base.  We can't
9936              just refuse it easily, since it gets matched by
9937              "addsi3" pattern, that later gets split to lea in the
9938              case output register differs from input.  While this
9939              can be handled by separate addsi pattern for this case
9940              that never results in lea, this seems to be easier and
9941              correct fix for crash to disable this test.  */
9942         }
9943       else if (GET_CODE (disp) != LABEL_REF
9944                && !CONST_INT_P (disp)
9945                && (GET_CODE (disp) != CONST
9946                    || !legitimate_constant_p (disp))
9947                && (GET_CODE (disp) != SYMBOL_REF
9948                    || !legitimate_constant_p (disp)))
9949         /* Displacement is not constant.  */
9950         return false;
9951       else if (TARGET_64BIT
9952                && !x86_64_immediate_operand (disp, VOIDmode))
9953         /* Displacement is out of range.  */
9954         return false;
9955     }
9956
9957   /* Everything looks valid.  */
9958   return true;
9959 }
9960
9961 /* Determine if a given RTX is a valid constant address.  */
9962
9963 bool
9964 constant_address_p (rtx x)
9965 {
9966   return CONSTANT_P (x) && ix86_legitimate_address_p (Pmode, x, 1);
9967 }
9968 \f
9969 /* Return a unique alias set for the GOT.  */
9970
9971 static alias_set_type
9972 ix86_GOT_alias_set (void)
9973 {
9974   static alias_set_type set = -1;
9975   if (set == -1)
9976     set = new_alias_set ();
9977   return set;
9978 }
9979
9980 /* Return a legitimate reference for ORIG (an address) using the
9981    register REG.  If REG is 0, a new pseudo is generated.
9982
9983    There are two types of references that must be handled:
9984
9985    1. Global data references must load the address from the GOT, via
9986       the PIC reg.  An insn is emitted to do this load, and the reg is
9987       returned.
9988
9989    2. Static data references, constant pool addresses, and code labels
9990       compute the address as an offset from the GOT, whose base is in
9991       the PIC reg.  Static data objects have SYMBOL_FLAG_LOCAL set to
9992       differentiate them from global data objects.  The returned
9993       address is the PIC reg + an unspec constant.
9994
9995    TARGET_LEGITIMATE_ADDRESS_P rejects symbolic references unless the PIC
9996    reg also appears in the address.  */
9997
9998 static rtx
9999 legitimize_pic_address (rtx orig, rtx reg)
10000 {
10001   rtx addr = orig;
10002   rtx new_rtx = orig;
10003   rtx base;
10004
10005 #if TARGET_MACHO
10006   if (TARGET_MACHO && !TARGET_64BIT)
10007     {
10008       if (reg == 0)
10009         reg = gen_reg_rtx (Pmode);
10010       /* Use the generic Mach-O PIC machinery.  */
10011       return machopic_legitimize_pic_address (orig, GET_MODE (orig), reg);
10012     }
10013 #endif
10014
10015   if (TARGET_64BIT && legitimate_pic_address_disp_p (addr))
10016     new_rtx = addr;
10017   else if (TARGET_64BIT
10018            && ix86_cmodel != CM_SMALL_PIC
10019            && gotoff_operand (addr, Pmode))
10020     {
10021       rtx tmpreg;
10022       /* This symbol may be referenced via a displacement from the PIC
10023          base address (@GOTOFF).  */
10024
10025       if (reload_in_progress)
10026         df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
10027       if (GET_CODE (addr) == CONST)
10028         addr = XEXP (addr, 0);
10029       if (GET_CODE (addr) == PLUS)
10030           {
10031             new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, XEXP (addr, 0)),
10032                                       UNSPEC_GOTOFF);
10033             new_rtx = gen_rtx_PLUS (Pmode, new_rtx, XEXP (addr, 1));
10034           }
10035         else
10036           new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOTOFF);
10037       new_rtx = gen_rtx_CONST (Pmode, new_rtx);
10038       if (!reg)
10039         tmpreg = gen_reg_rtx (Pmode);
10040       else
10041         tmpreg = reg;
10042       emit_move_insn (tmpreg, new_rtx);
10043
10044       if (reg != 0)
10045         {
10046           new_rtx = expand_simple_binop (Pmode, PLUS, reg, pic_offset_table_rtx,
10047                                          tmpreg, 1, OPTAB_DIRECT);
10048           new_rtx = reg;
10049         }
10050       else new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, tmpreg);
10051     }
10052   else if (!TARGET_64BIT && gotoff_operand (addr, Pmode))
10053     {
10054       /* This symbol may be referenced via a displacement from the PIC
10055          base address (@GOTOFF).  */
10056
10057       if (reload_in_progress)
10058         df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
10059       if (GET_CODE (addr) == CONST)
10060         addr = XEXP (addr, 0);
10061       if (GET_CODE (addr) == PLUS)
10062           {
10063             new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, XEXP (addr, 0)),
10064                                       UNSPEC_GOTOFF);
10065             new_rtx = gen_rtx_PLUS (Pmode, new_rtx, XEXP (addr, 1));
10066           }
10067         else
10068           new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOTOFF);
10069       new_rtx = gen_rtx_CONST (Pmode, new_rtx);
10070       new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, new_rtx);
10071
10072       if (reg != 0)
10073         {
10074           emit_move_insn (reg, new_rtx);
10075           new_rtx = reg;
10076         }
10077     }
10078   else if ((GET_CODE (addr) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (addr) == 0)
10079            /* We can't use @GOTOFF for text labels on VxWorks;
10080               see gotoff_operand.  */
10081            || (TARGET_VXWORKS_RTP && GET_CODE (addr) == LABEL_REF))
10082     {
10083       if (TARGET_DLLIMPORT_DECL_ATTRIBUTES)
10084         {
10085           if (GET_CODE (addr) == SYMBOL_REF && SYMBOL_REF_DLLIMPORT_P (addr))
10086             return legitimize_dllimport_symbol (addr, true);
10087           if (GET_CODE (addr) == CONST && GET_CODE (XEXP (addr, 0)) == PLUS
10088               && GET_CODE (XEXP (XEXP (addr, 0), 0)) == SYMBOL_REF
10089               && SYMBOL_REF_DLLIMPORT_P (XEXP (XEXP (addr, 0), 0)))
10090             {
10091               rtx t = legitimize_dllimport_symbol (XEXP (XEXP (addr, 0), 0), true);
10092               return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (addr, 0), 1));
10093             }
10094         }
10095
10096       if (TARGET_64BIT && ix86_cmodel != CM_LARGE_PIC)
10097         {
10098           new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOTPCREL);
10099           new_rtx = gen_rtx_CONST (Pmode, new_rtx);
10100           new_rtx = gen_const_mem (Pmode, new_rtx);
10101           set_mem_alias_set (new_rtx, ix86_GOT_alias_set ());
10102
10103           if (reg == 0)
10104             reg = gen_reg_rtx (Pmode);
10105           /* Use directly gen_movsi, otherwise the address is loaded
10106              into register for CSE.  We don't want to CSE this addresses,
10107              instead we CSE addresses from the GOT table, so skip this.  */
10108           emit_insn (gen_movsi (reg, new_rtx));
10109           new_rtx = reg;
10110         }
10111       else
10112         {
10113           /* This symbol must be referenced via a load from the
10114              Global Offset Table (@GOT).  */
10115
10116           if (reload_in_progress)
10117             df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
10118           new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOT);
10119           new_rtx = gen_rtx_CONST (Pmode, new_rtx);
10120           if (TARGET_64BIT)
10121             new_rtx = force_reg (Pmode, new_rtx);
10122           new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, new_rtx);
10123           new_rtx = gen_const_mem (Pmode, new_rtx);
10124           set_mem_alias_set (new_rtx, ix86_GOT_alias_set ());
10125
10126           if (reg == 0)
10127             reg = gen_reg_rtx (Pmode);
10128           emit_move_insn (reg, new_rtx);
10129           new_rtx = reg;
10130         }
10131     }
10132   else
10133     {
10134       if (CONST_INT_P (addr)
10135           && !x86_64_immediate_operand (addr, VOIDmode))
10136         {
10137           if (reg)
10138             {
10139               emit_move_insn (reg, addr);
10140               new_rtx = reg;
10141             }
10142           else
10143             new_rtx = force_reg (Pmode, addr);
10144         }
10145       else if (GET_CODE (addr) == CONST)
10146         {
10147           addr = XEXP (addr, 0);
10148
10149           /* We must match stuff we generate before.  Assume the only
10150              unspecs that can get here are ours.  Not that we could do
10151              anything with them anyway....  */
10152           if (GET_CODE (addr) == UNSPEC
10153               || (GET_CODE (addr) == PLUS
10154                   && GET_CODE (XEXP (addr, 0)) == UNSPEC))
10155             return orig;
10156           gcc_assert (GET_CODE (addr) == PLUS);
10157         }
10158       if (GET_CODE (addr) == PLUS)
10159         {
10160           rtx op0 = XEXP (addr, 0), op1 = XEXP (addr, 1);
10161
10162           /* Check first to see if this is a constant offset from a @GOTOFF
10163              symbol reference.  */
10164           if (gotoff_operand (op0, Pmode)
10165               && CONST_INT_P (op1))
10166             {
10167               if (!TARGET_64BIT)
10168                 {
10169                   if (reload_in_progress)
10170                     df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
10171                   new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, op0),
10172                                             UNSPEC_GOTOFF);
10173                   new_rtx = gen_rtx_PLUS (Pmode, new_rtx, op1);
10174                   new_rtx = gen_rtx_CONST (Pmode, new_rtx);
10175                   new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, new_rtx);
10176
10177                   if (reg != 0)
10178                     {
10179                       emit_move_insn (reg, new_rtx);
10180                       new_rtx = reg;
10181                     }
10182                 }
10183               else
10184                 {
10185                   if (INTVAL (op1) < -16*1024*1024
10186                       || INTVAL (op1) >= 16*1024*1024)
10187                     {
10188                       if (!x86_64_immediate_operand (op1, Pmode))
10189                         op1 = force_reg (Pmode, op1);
10190                       new_rtx = gen_rtx_PLUS (Pmode, force_reg (Pmode, op0), op1);
10191                     }
10192                 }
10193             }
10194           else
10195             {
10196               base = legitimize_pic_address (XEXP (addr, 0), reg);
10197               new_rtx  = legitimize_pic_address (XEXP (addr, 1),
10198                                                  base == reg ? NULL_RTX : reg);
10199
10200               if (CONST_INT_P (new_rtx))
10201                 new_rtx = plus_constant (base, INTVAL (new_rtx));
10202               else
10203                 {
10204                   if (GET_CODE (new_rtx) == PLUS && CONSTANT_P (XEXP (new_rtx, 1)))
10205                     {
10206                       base = gen_rtx_PLUS (Pmode, base, XEXP (new_rtx, 0));
10207                       new_rtx = XEXP (new_rtx, 1);
10208                     }
10209                   new_rtx = gen_rtx_PLUS (Pmode, base, new_rtx);
10210                 }
10211             }
10212         }
10213     }
10214   return new_rtx;
10215 }
10216 \f
10217 /* Load the thread pointer.  If TO_REG is true, force it into a register.  */
10218
10219 static rtx
10220 get_thread_pointer (int to_reg)
10221 {
10222   rtx tp, reg, insn;
10223
10224   tp = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx), UNSPEC_TP);
10225   if (!to_reg)
10226     return tp;
10227
10228   reg = gen_reg_rtx (Pmode);
10229   insn = gen_rtx_SET (VOIDmode, reg, tp);
10230   insn = emit_insn (insn);
10231
10232   return reg;
10233 }
10234
10235 /* A subroutine of ix86_legitimize_address and ix86_expand_move.  FOR_MOV is
10236    false if we expect this to be used for a memory address and true if
10237    we expect to load the address into a register.  */
10238
10239 static rtx
10240 legitimize_tls_address (rtx x, enum tls_model model, int for_mov)
10241 {
10242   rtx dest, base, off, pic, tp;
10243   int type;
10244
10245   switch (model)
10246     {
10247     case TLS_MODEL_GLOBAL_DYNAMIC:
10248       dest = gen_reg_rtx (Pmode);
10249       tp = TARGET_GNU2_TLS ? get_thread_pointer (1) : 0;
10250
10251       if (TARGET_64BIT && ! TARGET_GNU2_TLS)
10252         {
10253           rtx rax = gen_rtx_REG (Pmode, AX_REG), insns;
10254
10255           start_sequence ();
10256           emit_call_insn (gen_tls_global_dynamic_64 (rax, x));
10257           insns = get_insns ();
10258           end_sequence ();
10259
10260           RTL_CONST_CALL_P (insns) = 1;
10261           emit_libcall_block (insns, dest, rax, x);
10262         }
10263       else if (TARGET_64BIT && TARGET_GNU2_TLS)
10264         emit_insn (gen_tls_global_dynamic_64 (dest, x));
10265       else
10266         emit_insn (gen_tls_global_dynamic_32 (dest, x));
10267
10268       if (TARGET_GNU2_TLS)
10269         {
10270           dest = force_reg (Pmode, gen_rtx_PLUS (Pmode, tp, dest));
10271
10272           set_unique_reg_note (get_last_insn (), REG_EQUIV, x);
10273         }
10274       break;
10275
10276     case TLS_MODEL_LOCAL_DYNAMIC:
10277       base = gen_reg_rtx (Pmode);
10278       tp = TARGET_GNU2_TLS ? get_thread_pointer (1) : 0;
10279
10280       if (TARGET_64BIT && ! TARGET_GNU2_TLS)
10281         {
10282           rtx rax = gen_rtx_REG (Pmode, AX_REG), insns, note;
10283
10284           start_sequence ();
10285           emit_call_insn (gen_tls_local_dynamic_base_64 (rax));
10286           insns = get_insns ();
10287           end_sequence ();
10288
10289           note = gen_rtx_EXPR_LIST (VOIDmode, const0_rtx, NULL);
10290           note = gen_rtx_EXPR_LIST (VOIDmode, ix86_tls_get_addr (), note);
10291           RTL_CONST_CALL_P (insns) = 1;
10292           emit_libcall_block (insns, base, rax, note);
10293         }
10294       else if (TARGET_64BIT && TARGET_GNU2_TLS)
10295         emit_insn (gen_tls_local_dynamic_base_64 (base));
10296       else
10297         emit_insn (gen_tls_local_dynamic_base_32 (base));
10298
10299       if (TARGET_GNU2_TLS)
10300         {
10301           rtx x = ix86_tls_module_base ();
10302
10303           set_unique_reg_note (get_last_insn (), REG_EQUIV,
10304                                gen_rtx_MINUS (Pmode, x, tp));
10305         }
10306
10307       off = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, x), UNSPEC_DTPOFF);
10308       off = gen_rtx_CONST (Pmode, off);
10309
10310       dest = force_reg (Pmode, gen_rtx_PLUS (Pmode, base, off));
10311
10312       if (TARGET_GNU2_TLS)
10313         {
10314           dest = force_reg (Pmode, gen_rtx_PLUS (Pmode, dest, tp));
10315
10316           set_unique_reg_note (get_last_insn (), REG_EQUIV, x);
10317         }
10318
10319       break;
10320
10321     case TLS_MODEL_INITIAL_EXEC:
10322       if (TARGET_64BIT)
10323         {
10324           pic = NULL;
10325           type = UNSPEC_GOTNTPOFF;
10326         }
10327       else if (flag_pic)
10328         {
10329           if (reload_in_progress)
10330             df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
10331           pic = pic_offset_table_rtx;
10332           type = TARGET_ANY_GNU_TLS ? UNSPEC_GOTNTPOFF : UNSPEC_GOTTPOFF;
10333         }
10334       else if (!TARGET_ANY_GNU_TLS)
10335         {
10336           pic = gen_reg_rtx (Pmode);
10337           emit_insn (gen_set_got (pic));
10338           type = UNSPEC_GOTTPOFF;
10339         }
10340       else
10341         {
10342           pic = NULL;
10343           type = UNSPEC_INDNTPOFF;
10344         }
10345
10346       off = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, x), type);
10347       off = gen_rtx_CONST (Pmode, off);
10348       if (pic)
10349         off = gen_rtx_PLUS (Pmode, pic, off);
10350       off = gen_const_mem (Pmode, off);
10351       set_mem_alias_set (off, ix86_GOT_alias_set ());
10352
10353       if (TARGET_64BIT || TARGET_ANY_GNU_TLS)
10354         {
10355           base = get_thread_pointer (for_mov || !TARGET_TLS_DIRECT_SEG_REFS);
10356           off = force_reg (Pmode, off);
10357           return gen_rtx_PLUS (Pmode, base, off);
10358         }
10359       else
10360         {
10361           base = get_thread_pointer (true);
10362           dest = gen_reg_rtx (Pmode);
10363           emit_insn (gen_subsi3 (dest, base, off));
10364         }
10365       break;
10366
10367     case TLS_MODEL_LOCAL_EXEC:
10368       off = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, x),
10369                             (TARGET_64BIT || TARGET_ANY_GNU_TLS)
10370                             ? UNSPEC_NTPOFF : UNSPEC_TPOFF);
10371       off = gen_rtx_CONST (Pmode, off);
10372
10373       if (TARGET_64BIT || TARGET_ANY_GNU_TLS)
10374         {
10375           base = get_thread_pointer (for_mov || !TARGET_TLS_DIRECT_SEG_REFS);
10376           return gen_rtx_PLUS (Pmode, base, off);
10377         }
10378       else
10379         {
10380           base = get_thread_pointer (true);
10381           dest = gen_reg_rtx (Pmode);
10382           emit_insn (gen_subsi3 (dest, base, off));
10383         }
10384       break;
10385
10386     default:
10387       gcc_unreachable ();
10388     }
10389
10390   return dest;
10391 }
10392
10393 /* Create or return the unique __imp_DECL dllimport symbol corresponding
10394    to symbol DECL.  */
10395
10396 static GTY((if_marked ("tree_map_marked_p"), param_is (struct tree_map)))
10397   htab_t dllimport_map;
10398
10399 static tree
10400 get_dllimport_decl (tree decl)
10401 {
10402   struct tree_map *h, in;
10403   void **loc;
10404   const char *name;
10405   const char *prefix;
10406   size_t namelen, prefixlen;
10407   char *imp_name;
10408   tree to;
10409   rtx rtl;
10410
10411   if (!dllimport_map)
10412     dllimport_map = htab_create_ggc (512, tree_map_hash, tree_map_eq, 0);
10413
10414   in.hash = htab_hash_pointer (decl);
10415   in.base.from = decl;
10416   loc = htab_find_slot_with_hash (dllimport_map, &in, in.hash, INSERT);
10417   h = (struct tree_map *) *loc;
10418   if (h)
10419     return h->to;
10420
10421   *loc = h = GGC_NEW (struct tree_map);
10422   h->hash = in.hash;
10423   h->base.from = decl;
10424   h->to = to = build_decl (DECL_SOURCE_LOCATION (decl),
10425                            VAR_DECL, NULL, ptr_type_node);
10426   DECL_ARTIFICIAL (to) = 1;
10427   DECL_IGNORED_P (to) = 1;
10428   DECL_EXTERNAL (to) = 1;
10429   TREE_READONLY (to) = 1;
10430
10431   name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
10432   name = targetm.strip_name_encoding (name);
10433   prefix = name[0] == FASTCALL_PREFIX || user_label_prefix[0] == 0
10434     ? "*__imp_" : "*__imp__";
10435   namelen = strlen (name);
10436   prefixlen = strlen (prefix);
10437   imp_name = (char *) alloca (namelen + prefixlen + 1);
10438   memcpy (imp_name, prefix, prefixlen);
10439   memcpy (imp_name + prefixlen, name, namelen + 1);
10440
10441   name = ggc_alloc_string (imp_name, namelen + prefixlen);
10442   rtl = gen_rtx_SYMBOL_REF (Pmode, name);
10443   SET_SYMBOL_REF_DECL (rtl, to);
10444   SYMBOL_REF_FLAGS (rtl) = SYMBOL_FLAG_LOCAL;
10445
10446   rtl = gen_const_mem (Pmode, rtl);
10447   set_mem_alias_set (rtl, ix86_GOT_alias_set ());
10448
10449   SET_DECL_RTL (to, rtl);
10450   SET_DECL_ASSEMBLER_NAME (to, get_identifier (name));
10451
10452   return to;
10453 }
10454
10455 /* Expand SYMBOL into its corresponding dllimport symbol.  WANT_REG is
10456    true if we require the result be a register.  */
10457
10458 static rtx
10459 legitimize_dllimport_symbol (rtx symbol, bool want_reg)
10460 {
10461   tree imp_decl;
10462   rtx x;
10463
10464   gcc_assert (SYMBOL_REF_DECL (symbol));
10465   imp_decl = get_dllimport_decl (SYMBOL_REF_DECL (symbol));
10466
10467   x = DECL_RTL (imp_decl);
10468   if (want_reg)
10469     x = force_reg (Pmode, x);
10470   return x;
10471 }
10472
10473 /* Try machine-dependent ways of modifying an illegitimate address
10474    to be legitimate.  If we find one, return the new, valid address.
10475    This macro is used in only one place: `memory_address' in explow.c.
10476
10477    OLDX is the address as it was before break_out_memory_refs was called.
10478    In some cases it is useful to look at this to decide what needs to be done.
10479
10480    It is always safe for this macro to do nothing.  It exists to recognize
10481    opportunities to optimize the output.
10482
10483    For the 80386, we handle X+REG by loading X into a register R and
10484    using R+REG.  R will go in a general reg and indexing will be used.
10485    However, if REG is a broken-out memory address or multiplication,
10486    nothing needs to be done because REG can certainly go in a general reg.
10487
10488    When -fpic is used, special handling is needed for symbolic references.
10489    See comments by legitimize_pic_address in i386.c for details.  */
10490
10491 static rtx
10492 ix86_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED,
10493                          enum machine_mode mode)
10494 {
10495   int changed = 0;
10496   unsigned log;
10497
10498   log = GET_CODE (x) == SYMBOL_REF ? SYMBOL_REF_TLS_MODEL (x) : 0;
10499   if (log)
10500     return legitimize_tls_address (x, (enum tls_model) log, false);
10501   if (GET_CODE (x) == CONST
10502       && GET_CODE (XEXP (x, 0)) == PLUS
10503       && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
10504       && (log = SYMBOL_REF_TLS_MODEL (XEXP (XEXP (x, 0), 0))))
10505     {
10506       rtx t = legitimize_tls_address (XEXP (XEXP (x, 0), 0),
10507                                       (enum tls_model) log, false);
10508       return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (x, 0), 1));
10509     }
10510
10511   if (TARGET_DLLIMPORT_DECL_ATTRIBUTES)
10512     {
10513       if (GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_DLLIMPORT_P (x))
10514         return legitimize_dllimport_symbol (x, true);
10515       if (GET_CODE (x) == CONST
10516           && GET_CODE (XEXP (x, 0)) == PLUS
10517           && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
10518           && SYMBOL_REF_DLLIMPORT_P (XEXP (XEXP (x, 0), 0)))
10519         {
10520           rtx t = legitimize_dllimport_symbol (XEXP (XEXP (x, 0), 0), true);
10521           return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (x, 0), 1));
10522         }
10523     }
10524
10525   if (flag_pic && SYMBOLIC_CONST (x))
10526     return legitimize_pic_address (x, 0);
10527
10528   /* Canonicalize shifts by 0, 1, 2, 3 into multiply */
10529   if (GET_CODE (x) == ASHIFT
10530       && CONST_INT_P (XEXP (x, 1))
10531       && (unsigned HOST_WIDE_INT) INTVAL (XEXP (x, 1)) < 4)
10532     {
10533       changed = 1;
10534       log = INTVAL (XEXP (x, 1));
10535       x = gen_rtx_MULT (Pmode, force_reg (Pmode, XEXP (x, 0)),
10536                         GEN_INT (1 << log));
10537     }
10538
10539   if (GET_CODE (x) == PLUS)
10540     {
10541       /* Canonicalize shifts by 0, 1, 2, 3 into multiply.  */
10542
10543       if (GET_CODE (XEXP (x, 0)) == ASHIFT
10544           && CONST_INT_P (XEXP (XEXP (x, 0), 1))
10545           && (unsigned HOST_WIDE_INT) INTVAL (XEXP (XEXP (x, 0), 1)) < 4)
10546         {
10547           changed = 1;
10548           log = INTVAL (XEXP (XEXP (x, 0), 1));
10549           XEXP (x, 0) = gen_rtx_MULT (Pmode,
10550                                       force_reg (Pmode, XEXP (XEXP (x, 0), 0)),
10551                                       GEN_INT (1 << log));
10552         }
10553
10554       if (GET_CODE (XEXP (x, 1)) == ASHIFT
10555           && CONST_INT_P (XEXP (XEXP (x, 1), 1))
10556           && (unsigned HOST_WIDE_INT) INTVAL (XEXP (XEXP (x, 1), 1)) < 4)
10557         {
10558           changed = 1;
10559           log = INTVAL (XEXP (XEXP (x, 1), 1));
10560           XEXP (x, 1) = gen_rtx_MULT (Pmode,
10561                                       force_reg (Pmode, XEXP (XEXP (x, 1), 0)),
10562                                       GEN_INT (1 << log));
10563         }
10564
10565       /* Put multiply first if it isn't already.  */
10566       if (GET_CODE (XEXP (x, 1)) == MULT)
10567         {
10568           rtx tmp = XEXP (x, 0);
10569           XEXP (x, 0) = XEXP (x, 1);
10570           XEXP (x, 1) = tmp;
10571           changed = 1;
10572         }
10573
10574       /* Canonicalize (plus (mult (reg) (const)) (plus (reg) (const)))
10575          into (plus (plus (mult (reg) (const)) (reg)) (const)).  This can be
10576          created by virtual register instantiation, register elimination, and
10577          similar optimizations.  */
10578       if (GET_CODE (XEXP (x, 0)) == MULT && GET_CODE (XEXP (x, 1)) == PLUS)
10579         {
10580           changed = 1;
10581           x = gen_rtx_PLUS (Pmode,
10582                             gen_rtx_PLUS (Pmode, XEXP (x, 0),
10583                                           XEXP (XEXP (x, 1), 0)),
10584                             XEXP (XEXP (x, 1), 1));
10585         }
10586
10587       /* Canonicalize
10588          (plus (plus (mult (reg) (const)) (plus (reg) (const))) const)
10589          into (plus (plus (mult (reg) (const)) (reg)) (const)).  */
10590       else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 0)) == PLUS
10591                && GET_CODE (XEXP (XEXP (x, 0), 0)) == MULT
10592                && GET_CODE (XEXP (XEXP (x, 0), 1)) == PLUS
10593                && CONSTANT_P (XEXP (x, 1)))
10594         {
10595           rtx constant;
10596           rtx other = NULL_RTX;
10597
10598           if (CONST_INT_P (XEXP (x, 1)))
10599             {
10600               constant = XEXP (x, 1);
10601               other = XEXP (XEXP (XEXP (x, 0), 1), 1);
10602             }
10603           else if (CONST_INT_P (XEXP (XEXP (XEXP (x, 0), 1), 1)))
10604             {
10605               constant = XEXP (XEXP (XEXP (x, 0), 1), 1);
10606               other = XEXP (x, 1);
10607             }
10608           else
10609             constant = 0;
10610
10611           if (constant)
10612             {
10613               changed = 1;
10614               x = gen_rtx_PLUS (Pmode,
10615                                 gen_rtx_PLUS (Pmode, XEXP (XEXP (x, 0), 0),
10616                                               XEXP (XEXP (XEXP (x, 0), 1), 0)),
10617                                 plus_constant (other, INTVAL (constant)));
10618             }
10619         }
10620
10621       if (changed && ix86_legitimate_address_p (mode, x, FALSE))
10622         return x;
10623
10624       if (GET_CODE (XEXP (x, 0)) == MULT)
10625         {
10626           changed = 1;
10627           XEXP (x, 0) = force_operand (XEXP (x, 0), 0);
10628         }
10629
10630       if (GET_CODE (XEXP (x, 1)) == MULT)
10631         {
10632           changed = 1;
10633           XEXP (x, 1) = force_operand (XEXP (x, 1), 0);
10634         }
10635
10636       if (changed
10637           && REG_P (XEXP (x, 1))
10638           && REG_P (XEXP (x, 0)))
10639         return x;
10640
10641       if (flag_pic && SYMBOLIC_CONST (XEXP (x, 1)))
10642         {
10643           changed = 1;
10644           x = legitimize_pic_address (x, 0);
10645         }
10646
10647       if (changed && ix86_legitimate_address_p (mode, x, FALSE))
10648         return x;
10649
10650       if (REG_P (XEXP (x, 0)))
10651         {
10652           rtx temp = gen_reg_rtx (Pmode);
10653           rtx val  = force_operand (XEXP (x, 1), temp);
10654           if (val != temp)
10655             emit_move_insn (temp, val);
10656
10657           XEXP (x, 1) = temp;
10658           return x;
10659         }
10660
10661       else if (REG_P (XEXP (x, 1)))
10662         {
10663           rtx temp = gen_reg_rtx (Pmode);
10664           rtx val  = force_operand (XEXP (x, 0), temp);
10665           if (val != temp)
10666             emit_move_insn (temp, val);
10667
10668           XEXP (x, 0) = temp;
10669           return x;
10670         }
10671     }
10672
10673   return x;
10674 }
10675 \f
10676 /* Print an integer constant expression in assembler syntax.  Addition
10677    and subtraction are the only arithmetic that may appear in these
10678    expressions.  FILE is the stdio stream to write to, X is the rtx, and
10679    CODE is the operand print code from the output string.  */
10680
10681 static void
10682 output_pic_addr_const (FILE *file, rtx x, int code)
10683 {
10684   char buf[256];
10685
10686   switch (GET_CODE (x))
10687     {
10688     case PC:
10689       gcc_assert (flag_pic);
10690       putc ('.', file);
10691       break;
10692
10693     case SYMBOL_REF:
10694       if (! TARGET_MACHO || TARGET_64BIT)
10695         output_addr_const (file, x);
10696       else
10697         {
10698           const char *name = XSTR (x, 0);
10699
10700           /* Mark the decl as referenced so that cgraph will
10701              output the function.  */
10702           if (SYMBOL_REF_DECL (x))
10703             mark_decl_referenced (SYMBOL_REF_DECL (x));
10704
10705 #if TARGET_MACHO
10706           if (MACHOPIC_INDIRECT
10707               && machopic_classify_symbol (x) == MACHOPIC_UNDEFINED_FUNCTION)
10708             name = machopic_indirection_name (x, /*stub_p=*/true);
10709 #endif
10710           assemble_name (file, name);
10711         }
10712       if (!TARGET_MACHO && !(TARGET_64BIT && DEFAULT_ABI == MS_ABI)
10713           && code == 'P' && ! SYMBOL_REF_LOCAL_P (x))
10714         fputs ("@PLT", file);
10715       break;
10716
10717     case LABEL_REF:
10718       x = XEXP (x, 0);
10719       /* FALLTHRU */
10720     case CODE_LABEL:
10721       ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (x));
10722       assemble_name (asm_out_file, buf);
10723       break;
10724
10725     case CONST_INT:
10726       fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (x));
10727       break;
10728
10729     case CONST:
10730       /* This used to output parentheses around the expression,
10731          but that does not work on the 386 (either ATT or BSD assembler).  */
10732       output_pic_addr_const (file, XEXP (x, 0), code);
10733       break;
10734
10735     case CONST_DOUBLE:
10736       if (GET_MODE (x) == VOIDmode)
10737         {
10738           /* We can use %d if the number is <32 bits and positive.  */
10739           if (CONST_DOUBLE_HIGH (x) || CONST_DOUBLE_LOW (x) < 0)
10740             fprintf (file, "0x%lx%08lx",
10741                      (unsigned long) CONST_DOUBLE_HIGH (x),
10742                      (unsigned long) CONST_DOUBLE_LOW (x));
10743           else
10744             fprintf (file, HOST_WIDE_INT_PRINT_DEC, CONST_DOUBLE_LOW (x));
10745         }
10746       else
10747         /* We can't handle floating point constants;
10748            PRINT_OPERAND must handle them.  */
10749         output_operand_lossage ("floating constant misused");
10750       break;
10751
10752     case PLUS:
10753       /* Some assemblers need integer constants to appear first.  */
10754       if (CONST_INT_P (XEXP (x, 0)))
10755         {
10756           output_pic_addr_const (file, XEXP (x, 0), code);
10757           putc ('+', file);
10758           output_pic_addr_const (file, XEXP (x, 1), code);
10759         }
10760       else
10761         {
10762           gcc_assert (CONST_INT_P (XEXP (x, 1)));
10763           output_pic_addr_const (file, XEXP (x, 1), code);
10764           putc ('+', file);
10765           output_pic_addr_const (file, XEXP (x, 0), code);
10766         }
10767       break;
10768
10769     case MINUS:
10770       if (!TARGET_MACHO)
10771         putc (ASSEMBLER_DIALECT == ASM_INTEL ? '(' : '[', file);
10772       output_pic_addr_const (file, XEXP (x, 0), code);
10773       putc ('-', file);
10774       output_pic_addr_const (file, XEXP (x, 1), code);
10775       if (!TARGET_MACHO)
10776         putc (ASSEMBLER_DIALECT == ASM_INTEL ? ')' : ']', file);
10777       break;
10778
10779      case UNSPEC:
10780        gcc_assert (XVECLEN (x, 0) == 1);
10781        output_pic_addr_const (file, XVECEXP (x, 0, 0), code);
10782        switch (XINT (x, 1))
10783         {
10784         case UNSPEC_GOT:
10785           fputs ("@GOT", file);
10786           break;
10787         case UNSPEC_GOTOFF:
10788           fputs ("@GOTOFF", file);
10789           break;
10790         case UNSPEC_PLTOFF:
10791           fputs ("@PLTOFF", file);
10792           break;
10793         case UNSPEC_GOTPCREL:
10794           fputs (ASSEMBLER_DIALECT == ASM_ATT ?
10795                  "@GOTPCREL(%rip)" : "@GOTPCREL[rip]", file);
10796           break;
10797         case UNSPEC_GOTTPOFF:
10798           /* FIXME: This might be @TPOFF in Sun ld too.  */
10799           fputs ("@GOTTPOFF", file);
10800           break;
10801         case UNSPEC_TPOFF:
10802           fputs ("@TPOFF", file);
10803           break;
10804         case UNSPEC_NTPOFF:
10805           if (TARGET_64BIT)
10806             fputs ("@TPOFF", file);
10807           else
10808             fputs ("@NTPOFF", file);
10809           break;
10810         case UNSPEC_DTPOFF:
10811           fputs ("@DTPOFF", file);
10812           break;
10813         case UNSPEC_GOTNTPOFF:
10814           if (TARGET_64BIT)
10815             fputs (ASSEMBLER_DIALECT == ASM_ATT ?
10816                    "@GOTTPOFF(%rip)": "@GOTTPOFF[rip]", file);
10817           else
10818             fputs ("@GOTNTPOFF", file);
10819           break;
10820         case UNSPEC_INDNTPOFF:
10821           fputs ("@INDNTPOFF", file);
10822           break;
10823 #if TARGET_MACHO
10824         case UNSPEC_MACHOPIC_OFFSET:
10825           putc ('-', file);
10826           machopic_output_function_base_name (file);
10827           break;
10828 #endif
10829         default:
10830           output_operand_lossage ("invalid UNSPEC as operand");
10831           break;
10832         }
10833        break;
10834
10835     default:
10836       output_operand_lossage ("invalid expression as operand");
10837     }
10838 }
10839
10840 /* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL.
10841    We need to emit DTP-relative relocations.  */
10842
10843 static void ATTRIBUTE_UNUSED
10844 i386_output_dwarf_dtprel (FILE *file, int size, rtx x)
10845 {
10846   fputs (ASM_LONG, file);
10847   output_addr_const (file, x);
10848   fputs ("@DTPOFF", file);
10849   switch (size)
10850     {
10851     case 4:
10852       break;
10853     case 8:
10854       fputs (", 0", file);
10855       break;
10856     default:
10857       gcc_unreachable ();
10858    }
10859 }
10860
10861 /* Return true if X is a representation of the PIC register.  This copes
10862    with calls from ix86_find_base_term, where the register might have
10863    been replaced by a cselib value.  */
10864
10865 static bool
10866 ix86_pic_register_p (rtx x)
10867 {
10868   if (GET_CODE (x) == VALUE && CSELIB_VAL_PTR (x))
10869     return (pic_offset_table_rtx
10870             && rtx_equal_for_cselib_p (x, pic_offset_table_rtx));
10871   else
10872     return REG_P (x) && REGNO (x) == PIC_OFFSET_TABLE_REGNUM;
10873 }
10874
10875 /* In the name of slightly smaller debug output, and to cater to
10876    general assembler lossage, recognize PIC+GOTOFF and turn it back
10877    into a direct symbol reference.
10878
10879    On Darwin, this is necessary to avoid a crash, because Darwin
10880    has a different PIC label for each routine but the DWARF debugging
10881    information is not associated with any particular routine, so it's
10882    necessary to remove references to the PIC label from RTL stored by
10883    the DWARF output code.  */
10884
10885 static rtx
10886 ix86_delegitimize_address (rtx x)
10887 {
10888   rtx orig_x = delegitimize_mem_from_attrs (x);
10889   /* reg_addend is NULL or a multiple of some register.  */
10890   rtx reg_addend = NULL_RTX;
10891   /* const_addend is NULL or a const_int.  */
10892   rtx const_addend = NULL_RTX;
10893   /* This is the result, or NULL.  */
10894   rtx result = NULL_RTX;
10895
10896   x = orig_x;
10897
10898   if (MEM_P (x))
10899     x = XEXP (x, 0);
10900
10901   if (TARGET_64BIT)
10902     {
10903       if (GET_CODE (x) != CONST
10904           || GET_CODE (XEXP (x, 0)) != UNSPEC
10905           || XINT (XEXP (x, 0), 1) != UNSPEC_GOTPCREL
10906           || !MEM_P (orig_x))
10907         return orig_x;
10908       return XVECEXP (XEXP (x, 0), 0, 0);
10909     }
10910
10911   if (GET_CODE (x) != PLUS
10912       || GET_CODE (XEXP (x, 1)) != CONST)
10913     return orig_x;
10914
10915   if (ix86_pic_register_p (XEXP (x, 0)))
10916     /* %ebx + GOT/GOTOFF */
10917     ;
10918   else if (GET_CODE (XEXP (x, 0)) == PLUS)
10919     {
10920       /* %ebx + %reg * scale + GOT/GOTOFF */
10921       reg_addend = XEXP (x, 0);
10922       if (ix86_pic_register_p (XEXP (reg_addend, 0)))
10923         reg_addend = XEXP (reg_addend, 1);
10924       else if (ix86_pic_register_p (XEXP (reg_addend, 1)))
10925         reg_addend = XEXP (reg_addend, 0);
10926       else
10927         return orig_x;
10928       if (!REG_P (reg_addend)
10929           && GET_CODE (reg_addend) != MULT
10930           && GET_CODE (reg_addend) != ASHIFT)
10931         return orig_x;
10932     }
10933   else
10934     return orig_x;
10935
10936   x = XEXP (XEXP (x, 1), 0);
10937   if (GET_CODE (x) == PLUS
10938       && CONST_INT_P (XEXP (x, 1)))
10939     {
10940       const_addend = XEXP (x, 1);
10941       x = XEXP (x, 0);
10942     }
10943
10944   if (GET_CODE (x) == UNSPEC
10945       && ((XINT (x, 1) == UNSPEC_GOT && MEM_P (orig_x))
10946           || (XINT (x, 1) == UNSPEC_GOTOFF && !MEM_P (orig_x))))
10947     result = XVECEXP (x, 0, 0);
10948
10949   if (TARGET_MACHO && darwin_local_data_pic (x)
10950       && !MEM_P (orig_x))
10951     result = XVECEXP (x, 0, 0);
10952
10953   if (! result)
10954     return orig_x;
10955
10956   if (const_addend)
10957     result = gen_rtx_CONST (Pmode, gen_rtx_PLUS (Pmode, result, const_addend));
10958   if (reg_addend)
10959     result = gen_rtx_PLUS (Pmode, reg_addend, result);
10960   return result;
10961 }
10962
10963 /* If X is a machine specific address (i.e. a symbol or label being
10964    referenced as a displacement from the GOT implemented using an
10965    UNSPEC), then return the base term.  Otherwise return X.  */
10966
10967 rtx
10968 ix86_find_base_term (rtx x)
10969 {
10970   rtx term;
10971
10972   if (TARGET_64BIT)
10973     {
10974       if (GET_CODE (x) != CONST)
10975         return x;
10976       term = XEXP (x, 0);
10977       if (GET_CODE (term) == PLUS
10978           && (CONST_INT_P (XEXP (term, 1))
10979               || GET_CODE (XEXP (term, 1)) == CONST_DOUBLE))
10980         term = XEXP (term, 0);
10981       if (GET_CODE (term) != UNSPEC
10982           || XINT (term, 1) != UNSPEC_GOTPCREL)
10983         return x;
10984
10985       return XVECEXP (term, 0, 0);
10986     }
10987
10988   return ix86_delegitimize_address (x);
10989 }
10990 \f
10991 static void
10992 put_condition_code (enum rtx_code code, enum machine_mode mode, int reverse,
10993                     int fp, FILE *file)
10994 {
10995   const char *suffix;
10996
10997   if (mode == CCFPmode || mode == CCFPUmode)
10998     {
10999       code = ix86_fp_compare_code_to_integer (code);
11000       mode = CCmode;
11001     }
11002   if (reverse)
11003     code = reverse_condition (code);
11004
11005   switch (code)
11006     {
11007     case EQ:
11008       switch (mode)
11009         {
11010         case CCAmode:
11011           suffix = "a";
11012           break;
11013
11014         case CCCmode:
11015           suffix = "c";
11016           break;
11017
11018         case CCOmode:
11019           suffix = "o";
11020           break;
11021
11022         case CCSmode:
11023           suffix = "s";
11024           break;
11025
11026         default:
11027           suffix = "e";
11028         }
11029       break;
11030     case NE:
11031       switch (mode)
11032         {
11033         case CCAmode:
11034           suffix = "na";
11035           break;
11036
11037         case CCCmode:
11038           suffix = "nc";
11039           break;
11040
11041         case CCOmode:
11042           suffix = "no";
11043           break;
11044
11045         case CCSmode:
11046           suffix = "ns";
11047           break;
11048
11049         default:
11050           suffix = "ne";
11051         }
11052       break;
11053     case GT:
11054       gcc_assert (mode == CCmode || mode == CCNOmode || mode == CCGCmode);
11055       suffix = "g";
11056       break;
11057     case GTU:
11058       /* ??? Use "nbe" instead of "a" for fcmov lossage on some assemblers.
11059          Those same assemblers have the same but opposite lossage on cmov.  */
11060       if (mode == CCmode)
11061         suffix = fp ? "nbe" : "a";
11062       else if (mode == CCCmode)
11063         suffix = "b";
11064       else
11065         gcc_unreachable ();
11066       break;
11067     case LT:
11068       switch (mode)
11069         {
11070         case CCNOmode:
11071         case CCGOCmode:
11072           suffix = "s";
11073           break;
11074
11075         case CCmode:
11076         case CCGCmode:
11077           suffix = "l";
11078           break;
11079
11080         default:
11081           gcc_unreachable ();
11082         }
11083       break;
11084     case LTU:
11085       gcc_assert (mode == CCmode || mode == CCCmode);
11086       suffix = "b";
11087       break;
11088     case GE:
11089       switch (mode)
11090         {
11091         case CCNOmode:
11092         case CCGOCmode:
11093           suffix = "ns";
11094           break;
11095
11096         case CCmode:
11097         case CCGCmode:
11098           suffix = "ge";
11099           break;
11100
11101         default:
11102           gcc_unreachable ();
11103         }
11104       break;
11105     case GEU:
11106       /* ??? As above.  */
11107       gcc_assert (mode == CCmode || mode == CCCmode);
11108       suffix = fp ? "nb" : "ae";
11109       break;
11110     case LE:
11111       gcc_assert (mode == CCmode || mode == CCGCmode || mode == CCNOmode);
11112       suffix = "le";
11113       break;
11114     case LEU:
11115       /* ??? As above.  */
11116       if (mode == CCmode)
11117         suffix = "be";
11118       else if (mode == CCCmode)
11119         suffix = fp ? "nb" : "ae";
11120       else
11121         gcc_unreachable ();
11122       break;
11123     case UNORDERED:
11124       suffix = fp ? "u" : "p";
11125       break;
11126     case ORDERED:
11127       suffix = fp ? "nu" : "np";
11128       break;
11129     default:
11130       gcc_unreachable ();
11131     }
11132   fputs (suffix, file);
11133 }
11134
11135 /* Print the name of register X to FILE based on its machine mode and number.
11136    If CODE is 'w', pretend the mode is HImode.
11137    If CODE is 'b', pretend the mode is QImode.
11138    If CODE is 'k', pretend the mode is SImode.
11139    If CODE is 'q', pretend the mode is DImode.
11140    If CODE is 'x', pretend the mode is V4SFmode.
11141    If CODE is 't', pretend the mode is V8SFmode.
11142    If CODE is 'h', pretend the reg is the 'high' byte register.
11143    If CODE is 'y', print "st(0)" instead of "st", if the reg is stack op.
11144    If CODE is 'd', duplicate the operand for AVX instruction.
11145  */
11146
11147 void
11148 print_reg (rtx x, int code, FILE *file)
11149 {
11150   const char *reg;
11151   bool duplicated = code == 'd' && TARGET_AVX;
11152
11153   gcc_assert (x == pc_rtx
11154               || (REGNO (x) != ARG_POINTER_REGNUM
11155                   && REGNO (x) != FRAME_POINTER_REGNUM
11156                   && REGNO (x) != FLAGS_REG
11157                   && REGNO (x) != FPSR_REG
11158                   && REGNO (x) != FPCR_REG));
11159
11160   if (ASSEMBLER_DIALECT == ASM_ATT)
11161     putc ('%', file);
11162
11163   if (x == pc_rtx)
11164     {
11165       gcc_assert (TARGET_64BIT);
11166       fputs ("rip", file);
11167       return;
11168     }
11169
11170   if (code == 'w' || MMX_REG_P (x))
11171     code = 2;
11172   else if (code == 'b')
11173     code = 1;
11174   else if (code == 'k')
11175     code = 4;
11176   else if (code == 'q')
11177     code = 8;
11178   else if (code == 'y')
11179     code = 3;
11180   else if (code == 'h')
11181     code = 0;
11182   else if (code == 'x')
11183     code = 16;
11184   else if (code == 't')
11185     code = 32;
11186   else
11187     code = GET_MODE_SIZE (GET_MODE (x));
11188
11189   /* Irritatingly, AMD extended registers use different naming convention
11190      from the normal registers.  */
11191   if (REX_INT_REG_P (x))
11192     {
11193       gcc_assert (TARGET_64BIT);
11194       switch (code)
11195         {
11196           case 0:
11197             error ("extended registers have no high halves");
11198             break;
11199           case 1:
11200             fprintf (file, "r%ib", REGNO (x) - FIRST_REX_INT_REG + 8);
11201             break;
11202           case 2:
11203             fprintf (file, "r%iw", REGNO (x) - FIRST_REX_INT_REG + 8);
11204             break;
11205           case 4:
11206             fprintf (file, "r%id", REGNO (x) - FIRST_REX_INT_REG + 8);
11207             break;
11208           case 8:
11209             fprintf (file, "r%i", REGNO (x) - FIRST_REX_INT_REG + 8);
11210             break;
11211           default:
11212             error ("unsupported operand size for extended register");
11213             break;
11214         }
11215       return;
11216     }
11217
11218   reg = NULL;
11219   switch (code)
11220     {
11221     case 3:
11222       if (STACK_TOP_P (x))
11223         {
11224           reg = "st(0)";
11225           break;
11226         }
11227       /* FALLTHRU */
11228     case 8:
11229     case 4:
11230     case 12:
11231       if (! ANY_FP_REG_P (x))
11232         putc (code == 8 && TARGET_64BIT ? 'r' : 'e', file);
11233       /* FALLTHRU */
11234     case 16:
11235     case 2:
11236     normal:
11237       reg = hi_reg_name[REGNO (x)];
11238       break;
11239     case 1:
11240       if (REGNO (x) >= ARRAY_SIZE (qi_reg_name))
11241         goto normal;
11242       reg = qi_reg_name[REGNO (x)];
11243       break;
11244     case 0:
11245       if (REGNO (x) >= ARRAY_SIZE (qi_high_reg_name))
11246         goto normal;
11247       reg = qi_high_reg_name[REGNO (x)];
11248       break;
11249     case 32:
11250       if (SSE_REG_P (x))
11251         {
11252           gcc_assert (!duplicated);
11253           putc ('y', file);
11254           fputs (hi_reg_name[REGNO (x)] + 1, file);
11255           return;
11256         }
11257       break;
11258     default:
11259       gcc_unreachable ();
11260     }
11261
11262   fputs (reg, file);
11263   if (duplicated)
11264     {
11265       if (ASSEMBLER_DIALECT == ASM_ATT)
11266         fprintf (file, ", %%%s", reg);
11267       else
11268         fprintf (file, ", %s", reg);
11269     }
11270 }
11271
11272 /* Locate some local-dynamic symbol still in use by this function
11273    so that we can print its name in some tls_local_dynamic_base
11274    pattern.  */
11275
11276 static int
11277 get_some_local_dynamic_name_1 (rtx *px, void *data ATTRIBUTE_UNUSED)
11278 {
11279   rtx x = *px;
11280
11281   if (GET_CODE (x) == SYMBOL_REF
11282       && SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_DYNAMIC)
11283     {
11284       cfun->machine->some_ld_name = XSTR (x, 0);
11285       return 1;
11286     }
11287
11288   return 0;
11289 }
11290
11291 static const char *
11292 get_some_local_dynamic_name (void)
11293 {
11294   rtx insn;
11295
11296   if (cfun->machine->some_ld_name)
11297     return cfun->machine->some_ld_name;
11298
11299   for (insn = get_insns (); insn ; insn = NEXT_INSN (insn))
11300     if (INSN_P (insn)
11301         && for_each_rtx (&PATTERN (insn), get_some_local_dynamic_name_1, 0))
11302       return cfun->machine->some_ld_name;
11303
11304   return NULL;
11305 }
11306
11307 /* Meaning of CODE:
11308    L,W,B,Q,S,T -- print the opcode suffix for specified size of operand.
11309    C -- print opcode suffix for set/cmov insn.
11310    c -- like C, but print reversed condition
11311    E,e -- likewise, but for compare-and-branch fused insn.
11312    F,f -- likewise, but for floating-point.
11313    O -- if HAVE_AS_IX86_CMOV_SUN_SYNTAX, expand to "w.", "l." or "q.",
11314         otherwise nothing
11315    R -- print the prefix for register names.
11316    z -- print the opcode suffix for the size of the current operand.
11317    Z -- likewise, with special suffixes for x87 instructions.
11318    * -- print a star (in certain assembler syntax)
11319    A -- print an absolute memory reference.
11320    w -- print the operand as if it's a "word" (HImode) even if it isn't.
11321    s -- print a shift double count, followed by the assemblers argument
11322         delimiter.
11323    b -- print the QImode name of the register for the indicated operand.
11324         %b0 would print %al if operands[0] is reg 0.
11325    w --  likewise, print the HImode name of the register.
11326    k --  likewise, print the SImode name of the register.
11327    q --  likewise, print the DImode name of the register.
11328    x --  likewise, print the V4SFmode name of the register.
11329    t --  likewise, print the V8SFmode name of the register.
11330    h -- print the QImode name for a "high" register, either ah, bh, ch or dh.
11331    y -- print "st(0)" instead of "st" as a register.
11332    d -- print duplicated register operand for AVX instruction.
11333    D -- print condition for SSE cmp instruction.
11334    P -- if PIC, print an @PLT suffix.
11335    X -- don't print any sort of PIC '@' suffix for a symbol.
11336    & -- print some in-use local-dynamic symbol name.
11337    H -- print a memory address offset by 8; used for sse high-parts
11338    Y -- print condition for XOP pcom* instruction.
11339    + -- print a branch hint as 'cs' or 'ds' prefix
11340    ; -- print a semicolon (after prefixes due to bug in older gas).
11341  */
11342
11343 void
11344 print_operand (FILE *file, rtx x, int code)
11345 {
11346   if (code)
11347     {
11348       switch (code)
11349         {
11350         case '*':
11351           if (ASSEMBLER_DIALECT == ASM_ATT)
11352             putc ('*', file);
11353           return;
11354
11355         case '&':
11356           {
11357             const char *name = get_some_local_dynamic_name ();
11358             if (name == NULL)
11359               output_operand_lossage ("'%%&' used without any "
11360                                       "local dynamic TLS references");
11361             else
11362               assemble_name (file, name);
11363             return;
11364           }
11365
11366         case 'A':
11367           switch (ASSEMBLER_DIALECT)
11368             {
11369             case ASM_ATT:
11370               putc ('*', file);
11371               break;
11372
11373             case ASM_INTEL:
11374               /* Intel syntax. For absolute addresses, registers should not
11375                  be surrounded by braces.  */
11376               if (!REG_P (x))
11377                 {
11378                   putc ('[', file);
11379                   PRINT_OPERAND (file, x, 0);
11380                   putc (']', file);
11381                   return;
11382                 }
11383               break;
11384
11385             default:
11386               gcc_unreachable ();
11387             }
11388
11389           PRINT_OPERAND (file, x, 0);
11390           return;
11391
11392
11393         case 'L':
11394           if (ASSEMBLER_DIALECT == ASM_ATT)
11395             putc ('l', file);
11396           return;
11397
11398         case 'W':
11399           if (ASSEMBLER_DIALECT == ASM_ATT)
11400             putc ('w', file);
11401           return;
11402
11403         case 'B':
11404           if (ASSEMBLER_DIALECT == ASM_ATT)
11405             putc ('b', file);
11406           return;
11407
11408         case 'Q':
11409           if (ASSEMBLER_DIALECT == ASM_ATT)
11410             putc ('l', file);
11411           return;
11412
11413         case 'S':
11414           if (ASSEMBLER_DIALECT == ASM_ATT)
11415             putc ('s', file);
11416           return;
11417
11418         case 'T':
11419           if (ASSEMBLER_DIALECT == ASM_ATT)
11420             putc ('t', file);
11421           return;
11422
11423         case 'z':
11424           if (GET_MODE_CLASS (GET_MODE (x)) == MODE_INT)
11425             {
11426               /* Opcodes don't get size suffixes if using Intel opcodes.  */
11427               if (ASSEMBLER_DIALECT == ASM_INTEL)
11428                 return;
11429
11430               switch (GET_MODE_SIZE (GET_MODE (x)))
11431                 {
11432                 case 1:
11433                   putc ('b', file);
11434                   return;
11435
11436                 case 2:
11437                   putc ('w', file);
11438                   return;
11439
11440                 case 4:
11441                   putc ('l', file);
11442                   return;
11443
11444                 case 8:
11445                   putc ('q', file);
11446                   return;
11447
11448                 default:
11449                   output_operand_lossage
11450                     ("invalid operand size for operand code '%c'", code);
11451                   return;
11452                 }
11453             }
11454
11455           if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
11456             warning
11457               (0, "non-integer operand used with operand code '%c'", code);
11458           /* FALLTHRU */
11459
11460         case 'Z':
11461           /* 387 opcodes don't get size suffixes if using Intel opcodes.  */
11462           if (ASSEMBLER_DIALECT == ASM_INTEL)
11463             return;
11464
11465           if (GET_MODE_CLASS (GET_MODE (x)) == MODE_INT)
11466             {
11467               switch (GET_MODE_SIZE (GET_MODE (x)))
11468                 {
11469                 case 2:
11470 #ifdef HAVE_AS_IX86_FILDS
11471                   putc ('s', file);
11472 #endif
11473                   return;
11474
11475                 case 4:
11476                   putc ('l', file);
11477                   return;
11478
11479                 case 8:
11480 #ifdef HAVE_AS_IX86_FILDQ
11481                   putc ('q', file);
11482 #else
11483                   fputs ("ll", file);
11484 #endif
11485                   return;
11486
11487                 default:
11488                   break;
11489                 }
11490             }
11491           else if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
11492             {
11493               /* 387 opcodes don't get size suffixes
11494                  if the operands are registers.  */
11495               if (STACK_REG_P (x))
11496                 return;
11497
11498               switch (GET_MODE_SIZE (GET_MODE (x)))
11499                 {
11500                 case 4:
11501                   putc ('s', file);
11502                   return;
11503
11504                 case 8:
11505                   putc ('l', file);
11506                   return;
11507
11508                 case 12:
11509                 case 16:
11510                   putc ('t', file);
11511                   return;
11512
11513                 default:
11514                   break;
11515                 }
11516             }
11517           else
11518             {
11519               output_operand_lossage
11520                 ("invalid operand type used with operand code '%c'", code);
11521               return;
11522             }
11523
11524           output_operand_lossage
11525             ("invalid operand size for operand code '%c'", code);
11526           return;
11527             
11528         case 'd':
11529         case 'b':
11530         case 'w':
11531         case 'k':
11532         case 'q':
11533         case 'h':
11534         case 't':
11535         case 'y':
11536         case 'x':
11537         case 'X':
11538         case 'P':
11539           break;
11540
11541         case 's':
11542           if (CONST_INT_P (x) || ! SHIFT_DOUBLE_OMITS_COUNT)
11543             {
11544               PRINT_OPERAND (file, x, 0);
11545               fputs (", ", file);
11546             }
11547           return;
11548
11549         case 'D':
11550           /* Little bit of braindamage here.  The SSE compare instructions
11551              does use completely different names for the comparisons that the
11552              fp conditional moves.  */
11553           if (TARGET_AVX)
11554             {
11555               switch (GET_CODE (x))
11556                 {
11557                 case EQ:
11558                   fputs ("eq", file);
11559                   break;
11560                 case UNEQ:
11561                   fputs ("eq_us", file);
11562                   break;
11563                 case LT:
11564                   fputs ("lt", file);
11565                   break;
11566                 case UNLT:
11567                   fputs ("nge", file);
11568                   break;
11569                 case LE:
11570                   fputs ("le", file);
11571                   break;
11572                 case UNLE:
11573                   fputs ("ngt", file);
11574                   break;
11575                 case UNORDERED:
11576                   fputs ("unord", file);
11577                   break;
11578                 case NE:
11579                   fputs ("neq", file);
11580                   break;
11581                 case LTGT:
11582                   fputs ("neq_oq", file);
11583                   break;
11584                 case GE:
11585                   fputs ("ge", file);
11586                   break;
11587                 case UNGE:
11588                   fputs ("nlt", file);
11589                   break;
11590                 case GT:
11591                   fputs ("gt", file);
11592                   break;
11593                 case UNGT:
11594                   fputs ("nle", file);
11595                   break;
11596                 case ORDERED:
11597                   fputs ("ord", file);
11598                   break;
11599                 default:
11600                   output_operand_lossage ("operand is not a condition code, invalid operand code 'D'");
11601                   return;
11602                 }
11603             }
11604           else
11605             {
11606               switch (GET_CODE (x))
11607                 {
11608                 case EQ:
11609                 case UNEQ:
11610                   fputs ("eq", file);
11611                   break;
11612                 case LT:
11613                 case UNLT:
11614                   fputs ("lt", file);
11615                   break;
11616                 case LE:
11617                 case UNLE:
11618                   fputs ("le", file);
11619                   break;
11620                 case UNORDERED:
11621                   fputs ("unord", file);
11622                   break;
11623                 case NE:
11624                 case LTGT:
11625                   fputs ("neq", file);
11626                   break;
11627                 case UNGE:
11628                 case GE:
11629                   fputs ("nlt", file);
11630                   break;
11631                 case UNGT:
11632                 case GT:
11633                   fputs ("nle", file);
11634                   break;
11635                 case ORDERED:
11636                   fputs ("ord", file);
11637                   break;
11638                 default:
11639                   output_operand_lossage ("operand is not a condition code, 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, invalid operand code 'D'");
11814               return;
11815             }
11816           return;
11817
11818         case ';':
11819 #if TARGET_MACHO
11820           fputs (" ; ", file);
11821 #else
11822           putc (' ', file);
11823 #endif
11824           return;
11825
11826         default:
11827             output_operand_lossage ("invalid operand code '%c'", code);
11828         }
11829     }
11830
11831   if (REG_P (x))
11832     print_reg (x, code, file);
11833
11834   else if (MEM_P (x))
11835     {
11836       /* No `byte ptr' prefix for call instructions or BLKmode operands.  */
11837       if (ASSEMBLER_DIALECT == ASM_INTEL && code != 'X' && code != 'P'
11838           && GET_MODE (x) != BLKmode)
11839         {
11840           const char * size;
11841           switch (GET_MODE_SIZE (GET_MODE (x)))
11842             {
11843             case 1: size = "BYTE"; break;
11844             case 2: size = "WORD"; break;
11845             case 4: size = "DWORD"; break;
11846             case 8: size = "QWORD"; break;
11847             case 12: size = "XWORD"; break;
11848             case 16:
11849               if (GET_MODE (x) == XFmode)
11850                 size = "XWORD";
11851               else
11852                 size = "XMMWORD";
11853               break;
11854             default:
11855               gcc_unreachable ();
11856             }
11857
11858           /* Check for explicit size override (codes 'b', 'w' and 'k')  */
11859           if (code == 'b')
11860             size = "BYTE";
11861           else if (code == 'w')
11862             size = "WORD";
11863           else if (code == 'k')
11864             size = "DWORD";
11865
11866           fputs (size, file);
11867           fputs (" PTR ", file);
11868         }
11869
11870       x = XEXP (x, 0);
11871       /* Avoid (%rip) for call operands.  */
11872       if (CONSTANT_ADDRESS_P (x) && code == 'P'
11873           && !CONST_INT_P (x))
11874         output_addr_const (file, x);
11875       else if (this_is_asm_operands && ! address_operand (x, VOIDmode))
11876         output_operand_lossage ("invalid constraints for operand");
11877       else
11878         output_address (x);
11879     }
11880
11881   else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == SFmode)
11882     {
11883       REAL_VALUE_TYPE r;
11884       long l;
11885
11886       REAL_VALUE_FROM_CONST_DOUBLE (r, x);
11887       REAL_VALUE_TO_TARGET_SINGLE (r, l);
11888
11889       if (ASSEMBLER_DIALECT == ASM_ATT)
11890         putc ('$', file);
11891       fprintf (file, "0x%08lx", (long unsigned int) l);
11892     }
11893
11894   /* These float cases don't actually occur as immediate operands.  */
11895   else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == DFmode)
11896     {
11897       char dstr[30];
11898
11899       real_to_decimal (dstr, CONST_DOUBLE_REAL_VALUE (x), sizeof (dstr), 0, 1);
11900       fputs (dstr, file);
11901     }
11902
11903   else if (GET_CODE (x) == CONST_DOUBLE
11904            && GET_MODE (x) == XFmode)
11905     {
11906       char dstr[30];
11907
11908       real_to_decimal (dstr, CONST_DOUBLE_REAL_VALUE (x), sizeof (dstr), 0, 1);
11909       fputs (dstr, file);
11910     }
11911
11912   else
11913     {
11914       /* We have patterns that allow zero sets of memory, for instance.
11915          In 64-bit mode, we should probably support all 8-byte vectors,
11916          since we can in fact encode that into an immediate.  */
11917       if (GET_CODE (x) == CONST_VECTOR)
11918         {
11919           gcc_assert (x == CONST0_RTX (GET_MODE (x)));
11920           x = const0_rtx;
11921         }
11922
11923       if (code != 'P')
11924         {
11925           if (CONST_INT_P (x) || GET_CODE (x) == CONST_DOUBLE)
11926             {
11927               if (ASSEMBLER_DIALECT == ASM_ATT)
11928                 putc ('$', file);
11929             }
11930           else if (GET_CODE (x) == CONST || GET_CODE (x) == SYMBOL_REF
11931                    || GET_CODE (x) == LABEL_REF)
11932             {
11933               if (ASSEMBLER_DIALECT == ASM_ATT)
11934                 putc ('$', file);
11935               else
11936                 fputs ("OFFSET FLAT:", file);
11937             }
11938         }
11939       if (CONST_INT_P (x))
11940         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (x));
11941       else if (flag_pic)
11942         output_pic_addr_const (file, x, code);
11943       else
11944         output_addr_const (file, x);
11945     }
11946 }
11947 \f
11948 /* Print a memory operand whose address is ADDR.  */
11949
11950 void
11951 print_operand_address (FILE *file, rtx addr)
11952 {
11953   struct ix86_address parts;
11954   rtx base, index, disp;
11955   int scale;
11956   int ok = ix86_decompose_address (addr, &parts);
11957
11958   gcc_assert (ok);
11959
11960   base = parts.base;
11961   index = parts.index;
11962   disp = parts.disp;
11963   scale = parts.scale;
11964
11965   switch (parts.seg)
11966     {
11967     case SEG_DEFAULT:
11968       break;
11969     case SEG_FS:
11970     case SEG_GS:
11971       if (ASSEMBLER_DIALECT == ASM_ATT)
11972         putc ('%', file);
11973       fputs ((parts.seg == SEG_FS ? "fs:" : "gs:"), file);
11974       break;
11975     default:
11976       gcc_unreachable ();
11977     }
11978
11979   /* Use one byte shorter RIP relative addressing for 64bit mode.  */
11980   if (TARGET_64BIT && !base && !index)
11981     {
11982       rtx symbol = disp;
11983
11984       if (GET_CODE (disp) == CONST
11985           && GET_CODE (XEXP (disp, 0)) == PLUS
11986           && CONST_INT_P (XEXP (XEXP (disp, 0), 1)))
11987         symbol = XEXP (XEXP (disp, 0), 0);
11988
11989       if (GET_CODE (symbol) == LABEL_REF
11990           || (GET_CODE (symbol) == SYMBOL_REF
11991               && SYMBOL_REF_TLS_MODEL (symbol) == 0))
11992         base = pc_rtx;
11993     }
11994   if (!base && !index)
11995     {
11996       /* Displacement only requires special attention.  */
11997
11998       if (CONST_INT_P (disp))
11999         {
12000           if (ASSEMBLER_DIALECT == ASM_INTEL && parts.seg == SEG_DEFAULT)
12001             fputs ("ds:", file);
12002           fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (disp));
12003         }
12004       else if (flag_pic)
12005         output_pic_addr_const (file, disp, 0);
12006       else
12007         output_addr_const (file, disp);
12008     }
12009   else
12010     {
12011       if (ASSEMBLER_DIALECT == ASM_ATT)
12012         {
12013           if (disp)
12014             {
12015               if (flag_pic)
12016                 output_pic_addr_const (file, disp, 0);
12017               else if (GET_CODE (disp) == LABEL_REF)
12018                 output_asm_label (disp);
12019               else
12020                 output_addr_const (file, disp);
12021             }
12022
12023           putc ('(', file);
12024           if (base)
12025             print_reg (base, 0, file);
12026           if (index)
12027             {
12028               putc (',', file);
12029               print_reg (index, 0, file);
12030               if (scale != 1)
12031                 fprintf (file, ",%d", scale);
12032             }
12033           putc (')', file);
12034         }
12035       else
12036         {
12037           rtx offset = NULL_RTX;
12038
12039           if (disp)
12040             {
12041               /* Pull out the offset of a symbol; print any symbol itself.  */
12042               if (GET_CODE (disp) == CONST
12043                   && GET_CODE (XEXP (disp, 0)) == PLUS
12044                   && CONST_INT_P (XEXP (XEXP (disp, 0), 1)))
12045                 {
12046                   offset = XEXP (XEXP (disp, 0), 1);
12047                   disp = gen_rtx_CONST (VOIDmode,
12048                                         XEXP (XEXP (disp, 0), 0));
12049                 }
12050
12051               if (flag_pic)
12052                 output_pic_addr_const (file, disp, 0);
12053               else if (GET_CODE (disp) == LABEL_REF)
12054                 output_asm_label (disp);
12055               else if (CONST_INT_P (disp))
12056                 offset = disp;
12057               else
12058                 output_addr_const (file, disp);
12059             }
12060
12061           putc ('[', file);
12062           if (base)
12063             {
12064               print_reg (base, 0, file);
12065               if (offset)
12066                 {
12067                   if (INTVAL (offset) >= 0)
12068                     putc ('+', file);
12069                   fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (offset));
12070                 }
12071             }
12072           else if (offset)
12073             fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (offset));
12074           else
12075             putc ('0', file);
12076
12077           if (index)
12078             {
12079               putc ('+', file);
12080               print_reg (index, 0, file);
12081               if (scale != 1)
12082                 fprintf (file, "*%d", scale);
12083             }
12084           putc (']', file);
12085         }
12086     }
12087 }
12088
12089 bool
12090 output_addr_const_extra (FILE *file, rtx x)
12091 {
12092   rtx op;
12093
12094   if (GET_CODE (x) != UNSPEC)
12095     return false;
12096
12097   op = XVECEXP (x, 0, 0);
12098   switch (XINT (x, 1))
12099     {
12100     case UNSPEC_GOTTPOFF:
12101       output_addr_const (file, op);
12102       /* FIXME: This might be @TPOFF in Sun ld.  */
12103       fputs ("@GOTTPOFF", file);
12104       break;
12105     case UNSPEC_TPOFF:
12106       output_addr_const (file, op);
12107       fputs ("@TPOFF", file);
12108       break;
12109     case UNSPEC_NTPOFF:
12110       output_addr_const (file, op);
12111       if (TARGET_64BIT)
12112         fputs ("@TPOFF", file);
12113       else
12114         fputs ("@NTPOFF", file);
12115       break;
12116     case UNSPEC_DTPOFF:
12117       output_addr_const (file, op);
12118       fputs ("@DTPOFF", file);
12119       break;
12120     case UNSPEC_GOTNTPOFF:
12121       output_addr_const (file, op);
12122       if (TARGET_64BIT)
12123         fputs (ASSEMBLER_DIALECT == ASM_ATT ?
12124                "@GOTTPOFF(%rip)" : "@GOTTPOFF[rip]", file);
12125       else
12126         fputs ("@GOTNTPOFF", file);
12127       break;
12128     case UNSPEC_INDNTPOFF:
12129       output_addr_const (file, op);
12130       fputs ("@INDNTPOFF", file);
12131       break;
12132 #if TARGET_MACHO
12133     case UNSPEC_MACHOPIC_OFFSET:
12134       output_addr_const (file, op);
12135       putc ('-', file);
12136       machopic_output_function_base_name (file);
12137       break;
12138 #endif
12139
12140     default:
12141       return false;
12142     }
12143
12144   return true;
12145 }
12146 \f
12147 /* Split one or more DImode RTL references into pairs of SImode
12148    references.  The RTL can be REG, offsettable MEM, integer constant, or
12149    CONST_DOUBLE.  "operands" is a pointer to an array of DImode RTL to
12150    split and "num" is its length.  lo_half and hi_half are output arrays
12151    that parallel "operands".  */
12152
12153 void
12154 split_di (rtx operands[], int num, rtx lo_half[], rtx hi_half[])
12155 {
12156   while (num--)
12157     {
12158       rtx op = operands[num];
12159
12160       /* simplify_subreg refuse to split volatile memory addresses,
12161          but we still have to handle it.  */
12162       if (MEM_P (op))
12163         {
12164           lo_half[num] = adjust_address (op, SImode, 0);
12165           hi_half[num] = adjust_address (op, SImode, 4);
12166         }
12167       else
12168         {
12169           lo_half[num] = simplify_gen_subreg (SImode, op,
12170                                               GET_MODE (op) == VOIDmode
12171                                               ? DImode : GET_MODE (op), 0);
12172           hi_half[num] = simplify_gen_subreg (SImode, op,
12173                                               GET_MODE (op) == VOIDmode
12174                                               ? DImode : GET_MODE (op), 4);
12175         }
12176     }
12177 }
12178 /* Split one or more TImode RTL references into pairs of DImode
12179    references.  The RTL can be REG, offsettable MEM, integer constant, or
12180    CONST_DOUBLE.  "operands" is a pointer to an array of DImode RTL to
12181    split and "num" is its length.  lo_half and hi_half are output arrays
12182    that parallel "operands".  */
12183
12184 void
12185 split_ti (rtx operands[], int num, rtx lo_half[], rtx hi_half[])
12186 {
12187   while (num--)
12188     {
12189       rtx op = operands[num];
12190
12191       /* simplify_subreg refuse to split volatile memory addresses, but we
12192          still have to handle it.  */
12193       if (MEM_P (op))
12194         {
12195           lo_half[num] = adjust_address (op, DImode, 0);
12196           hi_half[num] = adjust_address (op, DImode, 8);
12197         }
12198       else
12199         {
12200           lo_half[num] = simplify_gen_subreg (DImode, op, TImode, 0);
12201           hi_half[num] = simplify_gen_subreg (DImode, op, TImode, 8);
12202         }
12203     }
12204 }
12205 \f
12206 /* Output code to perform a 387 binary operation in INSN, one of PLUS,
12207    MINUS, MULT or DIV.  OPERANDS are the insn operands, where operands[3]
12208    is the expression of the binary operation.  The output may either be
12209    emitted here, or returned to the caller, like all output_* functions.
12210
12211    There is no guarantee that the operands are the same mode, as they
12212    might be within FLOAT or FLOAT_EXTEND expressions.  */
12213
12214 #ifndef SYSV386_COMPAT
12215 /* Set to 1 for compatibility with brain-damaged assemblers.  No-one
12216    wants to fix the assemblers because that causes incompatibility
12217    with gcc.  No-one wants to fix gcc because that causes
12218    incompatibility with assemblers...  You can use the option of
12219    -DSYSV386_COMPAT=0 if you recompile both gcc and gas this way.  */
12220 #define SYSV386_COMPAT 1
12221 #endif
12222
12223 const char *
12224 output_387_binary_op (rtx insn, rtx *operands)
12225 {
12226   static char buf[40];
12227   const char *p;
12228   const char *ssep;
12229   int is_sse = SSE_REG_P (operands[0]) || SSE_REG_P (operands[1]) || SSE_REG_P (operands[2]);
12230
12231 #ifdef ENABLE_CHECKING
12232   /* Even if we do not want to check the inputs, this documents input
12233      constraints.  Which helps in understanding the following code.  */
12234   if (STACK_REG_P (operands[0])
12235       && ((REG_P (operands[1])
12236            && REGNO (operands[0]) == REGNO (operands[1])
12237            && (STACK_REG_P (operands[2]) || MEM_P (operands[2])))
12238           || (REG_P (operands[2])
12239               && REGNO (operands[0]) == REGNO (operands[2])
12240               && (STACK_REG_P (operands[1]) || MEM_P (operands[1]))))
12241       && (STACK_TOP_P (operands[1]) || STACK_TOP_P (operands[2])))
12242     ; /* ok */
12243   else
12244     gcc_assert (is_sse);
12245 #endif
12246
12247   switch (GET_CODE (operands[3]))
12248     {
12249     case PLUS:
12250       if (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
12251           || GET_MODE_CLASS (GET_MODE (operands[2])) == MODE_INT)
12252         p = "fiadd";
12253       else
12254         p = "fadd";
12255       ssep = "vadd";
12256       break;
12257
12258     case MINUS:
12259       if (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
12260           || GET_MODE_CLASS (GET_MODE (operands[2])) == MODE_INT)
12261         p = "fisub";
12262       else
12263         p = "fsub";
12264       ssep = "vsub";
12265       break;
12266
12267     case MULT:
12268       if (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
12269           || GET_MODE_CLASS (GET_MODE (operands[2])) == MODE_INT)
12270         p = "fimul";
12271       else
12272         p = "fmul";
12273       ssep = "vmul";
12274       break;
12275
12276     case DIV:
12277       if (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
12278           || GET_MODE_CLASS (GET_MODE (operands[2])) == MODE_INT)
12279         p = "fidiv";
12280       else
12281         p = "fdiv";
12282       ssep = "vdiv";
12283       break;
12284
12285     default:
12286       gcc_unreachable ();
12287     }
12288
12289   if (is_sse)
12290    {
12291      if (TARGET_AVX)
12292        {
12293          strcpy (buf, ssep);
12294          if (GET_MODE (operands[0]) == SFmode)
12295            strcat (buf, "ss\t{%2, %1, %0|%0, %1, %2}");
12296          else
12297            strcat (buf, "sd\t{%2, %1, %0|%0, %1, %2}");
12298        }
12299      else
12300        {
12301          strcpy (buf, ssep + 1);
12302          if (GET_MODE (operands[0]) == SFmode)
12303            strcat (buf, "ss\t{%2, %0|%0, %2}");
12304          else
12305            strcat (buf, "sd\t{%2, %0|%0, %2}");
12306        }
12307       return buf;
12308    }
12309   strcpy (buf, p);
12310
12311   switch (GET_CODE (operands[3]))
12312     {
12313     case MULT:
12314     case PLUS:
12315       if (REG_P (operands[2]) && REGNO (operands[0]) == REGNO (operands[2]))
12316         {
12317           rtx temp = operands[2];
12318           operands[2] = operands[1];
12319           operands[1] = temp;
12320         }
12321
12322       /* know operands[0] == operands[1].  */
12323
12324       if (MEM_P (operands[2]))
12325         {
12326           p = "%Z2\t%2";
12327           break;
12328         }
12329
12330       if (find_regno_note (insn, REG_DEAD, REGNO (operands[2])))
12331         {
12332           if (STACK_TOP_P (operands[0]))
12333             /* How is it that we are storing to a dead operand[2]?
12334                Well, presumably operands[1] is dead too.  We can't
12335                store the result to st(0) as st(0) gets popped on this
12336                instruction.  Instead store to operands[2] (which I
12337                think has to be st(1)).  st(1) will be popped later.
12338                gcc <= 2.8.1 didn't have this check and generated
12339                assembly code that the Unixware assembler rejected.  */
12340             p = "p\t{%0, %2|%2, %0}";   /* st(1) = st(0) op st(1); pop */
12341           else
12342             p = "p\t{%2, %0|%0, %2}";   /* st(r1) = st(r1) op st(0); pop */
12343           break;
12344         }
12345
12346       if (STACK_TOP_P (operands[0]))
12347         p = "\t{%y2, %0|%0, %y2}";      /* st(0) = st(0) op st(r2) */
12348       else
12349         p = "\t{%2, %0|%0, %2}";        /* st(r1) = st(r1) op st(0) */
12350       break;
12351
12352     case MINUS:
12353     case DIV:
12354       if (MEM_P (operands[1]))
12355         {
12356           p = "r%Z1\t%1";
12357           break;
12358         }
12359
12360       if (MEM_P (operands[2]))
12361         {
12362           p = "%Z2\t%2";
12363           break;
12364         }
12365
12366       if (find_regno_note (insn, REG_DEAD, REGNO (operands[2])))
12367         {
12368 #if SYSV386_COMPAT
12369           /* The SystemV/386 SVR3.2 assembler, and probably all AT&T
12370              derived assemblers, confusingly reverse the direction of
12371              the operation for fsub{r} and fdiv{r} when the
12372              destination register is not st(0).  The Intel assembler
12373              doesn't have this brain damage.  Read !SYSV386_COMPAT to
12374              figure out what the hardware really does.  */
12375           if (STACK_TOP_P (operands[0]))
12376             p = "{p\t%0, %2|rp\t%2, %0}";
12377           else
12378             p = "{rp\t%2, %0|p\t%0, %2}";
12379 #else
12380           if (STACK_TOP_P (operands[0]))
12381             /* As above for fmul/fadd, we can't store to st(0).  */
12382             p = "rp\t{%0, %2|%2, %0}";  /* st(1) = st(0) op st(1); pop */
12383           else
12384             p = "p\t{%2, %0|%0, %2}";   /* st(r1) = st(r1) op st(0); pop */
12385 #endif
12386           break;
12387         }
12388
12389       if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
12390         {
12391 #if SYSV386_COMPAT
12392           if (STACK_TOP_P (operands[0]))
12393             p = "{rp\t%0, %1|p\t%1, %0}";
12394           else
12395             p = "{p\t%1, %0|rp\t%0, %1}";
12396 #else
12397           if (STACK_TOP_P (operands[0]))
12398             p = "p\t{%0, %1|%1, %0}";   /* st(1) = st(1) op st(0); pop */
12399           else
12400             p = "rp\t{%1, %0|%0, %1}";  /* st(r2) = st(0) op st(r2); pop */
12401 #endif
12402           break;
12403         }
12404
12405       if (STACK_TOP_P (operands[0]))
12406         {
12407           if (STACK_TOP_P (operands[1]))
12408             p = "\t{%y2, %0|%0, %y2}";  /* st(0) = st(0) op st(r2) */
12409           else
12410             p = "r\t{%y1, %0|%0, %y1}"; /* st(0) = st(r1) op st(0) */
12411           break;
12412         }
12413       else if (STACK_TOP_P (operands[1]))
12414         {
12415 #if SYSV386_COMPAT
12416           p = "{\t%1, %0|r\t%0, %1}";
12417 #else
12418           p = "r\t{%1, %0|%0, %1}";     /* st(r2) = st(0) op st(r2) */
12419 #endif
12420         }
12421       else
12422         {
12423 #if SYSV386_COMPAT
12424           p = "{r\t%2, %0|\t%0, %2}";
12425 #else
12426           p = "\t{%2, %0|%0, %2}";      /* st(r1) = st(r1) op st(0) */
12427 #endif
12428         }
12429       break;
12430
12431     default:
12432       gcc_unreachable ();
12433     }
12434
12435   strcat (buf, p);
12436   return buf;
12437 }
12438
12439 /* Return needed mode for entity in optimize_mode_switching pass.  */
12440
12441 int
12442 ix86_mode_needed (int entity, rtx insn)
12443 {
12444   enum attr_i387_cw mode;
12445
12446   /* The mode UNINITIALIZED is used to store control word after a
12447      function call or ASM pattern.  The mode ANY specify that function
12448      has no requirements on the control word and make no changes in the
12449      bits we are interested in.  */
12450
12451   if (CALL_P (insn)
12452       || (NONJUMP_INSN_P (insn)
12453           && (asm_noperands (PATTERN (insn)) >= 0
12454               || GET_CODE (PATTERN (insn)) == ASM_INPUT)))
12455     return I387_CW_UNINITIALIZED;
12456
12457   if (recog_memoized (insn) < 0)
12458     return I387_CW_ANY;
12459
12460   mode = get_attr_i387_cw (insn);
12461
12462   switch (entity)
12463     {
12464     case I387_TRUNC:
12465       if (mode == I387_CW_TRUNC)
12466         return mode;
12467       break;
12468
12469     case I387_FLOOR:
12470       if (mode == I387_CW_FLOOR)
12471         return mode;
12472       break;
12473
12474     case I387_CEIL:
12475       if (mode == I387_CW_CEIL)
12476         return mode;
12477       break;
12478
12479     case I387_MASK_PM:
12480       if (mode == I387_CW_MASK_PM)
12481         return mode;
12482       break;
12483
12484     default:
12485       gcc_unreachable ();
12486     }
12487
12488   return I387_CW_ANY;
12489 }
12490
12491 /* Output code to initialize control word copies used by trunc?f?i and
12492    rounding patterns.  CURRENT_MODE is set to current control word,
12493    while NEW_MODE is set to new control word.  */
12494
12495 void
12496 emit_i387_cw_initialization (int mode)
12497 {
12498   rtx stored_mode = assign_386_stack_local (HImode, SLOT_CW_STORED);
12499   rtx new_mode;
12500
12501   enum ix86_stack_slot slot;
12502
12503   rtx reg = gen_reg_rtx (HImode);
12504
12505   emit_insn (gen_x86_fnstcw_1 (stored_mode));
12506   emit_move_insn (reg, copy_rtx (stored_mode));
12507
12508   if (TARGET_64BIT || TARGET_PARTIAL_REG_STALL
12509       || optimize_function_for_size_p (cfun))
12510     {
12511       switch (mode)
12512         {
12513         case I387_CW_TRUNC:
12514           /* round toward zero (truncate) */
12515           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0c00)));
12516           slot = SLOT_CW_TRUNC;
12517           break;
12518
12519         case I387_CW_FLOOR:
12520           /* round down toward -oo */
12521           emit_insn (gen_andhi3 (reg, reg, GEN_INT (~0x0c00)));
12522           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0400)));
12523           slot = SLOT_CW_FLOOR;
12524           break;
12525
12526         case I387_CW_CEIL:
12527           /* round up toward +oo */
12528           emit_insn (gen_andhi3 (reg, reg, GEN_INT (~0x0c00)));
12529           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0800)));
12530           slot = SLOT_CW_CEIL;
12531           break;
12532
12533         case I387_CW_MASK_PM:
12534           /* mask precision exception for nearbyint() */
12535           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0020)));
12536           slot = SLOT_CW_MASK_PM;
12537           break;
12538
12539         default:
12540           gcc_unreachable ();
12541         }
12542     }
12543   else
12544     {
12545       switch (mode)
12546         {
12547         case I387_CW_TRUNC:
12548           /* round toward zero (truncate) */
12549           emit_insn (gen_movsi_insv_1 (reg, GEN_INT (0xc)));
12550           slot = SLOT_CW_TRUNC;
12551           break;
12552
12553         case I387_CW_FLOOR:
12554           /* round down toward -oo */
12555           emit_insn (gen_movsi_insv_1 (reg, GEN_INT (0x4)));
12556           slot = SLOT_CW_FLOOR;
12557           break;
12558
12559         case I387_CW_CEIL:
12560           /* round up toward +oo */
12561           emit_insn (gen_movsi_insv_1 (reg, GEN_INT (0x8)));
12562           slot = SLOT_CW_CEIL;
12563           break;
12564
12565         case I387_CW_MASK_PM:
12566           /* mask precision exception for nearbyint() */
12567           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0020)));
12568           slot = SLOT_CW_MASK_PM;
12569           break;
12570
12571         default:
12572           gcc_unreachable ();
12573         }
12574     }
12575
12576   gcc_assert (slot < MAX_386_STACK_LOCALS);
12577
12578   new_mode = assign_386_stack_local (HImode, slot);
12579   emit_move_insn (new_mode, reg);
12580 }
12581
12582 /* Output code for INSN to convert a float to a signed int.  OPERANDS
12583    are the insn operands.  The output may be [HSD]Imode and the input
12584    operand may be [SDX]Fmode.  */
12585
12586 const char *
12587 output_fix_trunc (rtx insn, rtx *operands, int fisttp)
12588 {
12589   int stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
12590   int dimode_p = GET_MODE (operands[0]) == DImode;
12591   int round_mode = get_attr_i387_cw (insn);
12592
12593   /* Jump through a hoop or two for DImode, since the hardware has no
12594      non-popping instruction.  We used to do this a different way, but
12595      that was somewhat fragile and broke with post-reload splitters.  */
12596   if ((dimode_p || fisttp) && !stack_top_dies)
12597     output_asm_insn ("fld\t%y1", operands);
12598
12599   gcc_assert (STACK_TOP_P (operands[1]));
12600   gcc_assert (MEM_P (operands[0]));
12601   gcc_assert (GET_MODE (operands[1]) != TFmode);
12602
12603   if (fisttp)
12604       output_asm_insn ("fisttp%Z0\t%0", operands);
12605   else
12606     {
12607       if (round_mode != I387_CW_ANY)
12608         output_asm_insn ("fldcw\t%3", operands);
12609       if (stack_top_dies || dimode_p)
12610         output_asm_insn ("fistp%Z0\t%0", operands);
12611       else
12612         output_asm_insn ("fist%Z0\t%0", operands);
12613       if (round_mode != I387_CW_ANY)
12614         output_asm_insn ("fldcw\t%2", operands);
12615     }
12616
12617   return "";
12618 }
12619
12620 /* Output code for x87 ffreep insn.  The OPNO argument, which may only
12621    have the values zero or one, indicates the ffreep insn's operand
12622    from the OPERANDS array.  */
12623
12624 static const char *
12625 output_387_ffreep (rtx *operands ATTRIBUTE_UNUSED, int opno)
12626 {
12627   if (TARGET_USE_FFREEP)
12628 #ifdef HAVE_AS_IX86_FFREEP
12629     return opno ? "ffreep\t%y1" : "ffreep\t%y0";
12630 #else
12631     {
12632       static char retval[32];
12633       int regno = REGNO (operands[opno]);
12634
12635       gcc_assert (FP_REGNO_P (regno));
12636
12637       regno -= FIRST_STACK_REG;
12638
12639       snprintf (retval, sizeof (retval), ASM_SHORT "0xc%ddf", regno);
12640       return retval;
12641     }
12642 #endif
12643
12644   return opno ? "fstp\t%y1" : "fstp\t%y0";
12645 }
12646
12647
12648 /* Output code for INSN to compare OPERANDS.  EFLAGS_P is 1 when fcomi
12649    should be used.  UNORDERED_P is true when fucom should be used.  */
12650
12651 const char *
12652 output_fp_compare (rtx insn, rtx *operands, int eflags_p, int unordered_p)
12653 {
12654   int stack_top_dies;
12655   rtx cmp_op0, cmp_op1;
12656   int is_sse = SSE_REG_P (operands[0]) || SSE_REG_P (operands[1]);
12657
12658   if (eflags_p)
12659     {
12660       cmp_op0 = operands[0];
12661       cmp_op1 = operands[1];
12662     }
12663   else
12664     {
12665       cmp_op0 = operands[1];
12666       cmp_op1 = operands[2];
12667     }
12668
12669   if (is_sse)
12670     {
12671       static const char ucomiss[] = "vucomiss\t{%1, %0|%0, %1}";
12672       static const char ucomisd[] = "vucomisd\t{%1, %0|%0, %1}";
12673       static const char comiss[] = "vcomiss\t{%1, %0|%0, %1}";
12674       static const char comisd[] = "vcomisd\t{%1, %0|%0, %1}";
12675
12676       if (GET_MODE (operands[0]) == SFmode)
12677         if (unordered_p)
12678           return &ucomiss[TARGET_AVX ? 0 : 1];
12679         else
12680           return &comiss[TARGET_AVX ? 0 : 1];
12681       else
12682         if (unordered_p)
12683           return &ucomisd[TARGET_AVX ? 0 : 1];
12684         else
12685           return &comisd[TARGET_AVX ? 0 : 1];
12686     }
12687
12688   gcc_assert (STACK_TOP_P (cmp_op0));
12689
12690   stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
12691
12692   if (cmp_op1 == CONST0_RTX (GET_MODE (cmp_op1)))
12693     {
12694       if (stack_top_dies)
12695         {
12696           output_asm_insn ("ftst\n\tfnstsw\t%0", operands);
12697           return output_387_ffreep (operands, 1);
12698         }
12699       else
12700         return "ftst\n\tfnstsw\t%0";
12701     }
12702
12703   if (STACK_REG_P (cmp_op1)
12704       && stack_top_dies
12705       && find_regno_note (insn, REG_DEAD, REGNO (cmp_op1))
12706       && REGNO (cmp_op1) != FIRST_STACK_REG)
12707     {
12708       /* If both the top of the 387 stack dies, and the other operand
12709          is also a stack register that dies, then this must be a
12710          `fcompp' float compare */
12711
12712       if (eflags_p)
12713         {
12714           /* There is no double popping fcomi variant.  Fortunately,
12715              eflags is immune from the fstp's cc clobbering.  */
12716           if (unordered_p)
12717             output_asm_insn ("fucomip\t{%y1, %0|%0, %y1}", operands);
12718           else
12719             output_asm_insn ("fcomip\t{%y1, %0|%0, %y1}", operands);
12720           return output_387_ffreep (operands, 0);
12721         }
12722       else
12723         {
12724           if (unordered_p)
12725             return "fucompp\n\tfnstsw\t%0";
12726           else
12727             return "fcompp\n\tfnstsw\t%0";
12728         }
12729     }
12730   else
12731     {
12732       /* Encoded here as eflags_p | intmode | unordered_p | stack_top_dies.  */
12733
12734       static const char * const alt[16] =
12735       {
12736         "fcom%Z2\t%y2\n\tfnstsw\t%0",
12737         "fcomp%Z2\t%y2\n\tfnstsw\t%0",
12738         "fucom%Z2\t%y2\n\tfnstsw\t%0",
12739         "fucomp%Z2\t%y2\n\tfnstsw\t%0",
12740
12741         "ficom%Z2\t%y2\n\tfnstsw\t%0",
12742         "ficomp%Z2\t%y2\n\tfnstsw\t%0",
12743         NULL,
12744         NULL,
12745
12746         "fcomi\t{%y1, %0|%0, %y1}",
12747         "fcomip\t{%y1, %0|%0, %y1}",
12748         "fucomi\t{%y1, %0|%0, %y1}",
12749         "fucomip\t{%y1, %0|%0, %y1}",
12750
12751         NULL,
12752         NULL,
12753         NULL,
12754         NULL
12755       };
12756
12757       int mask;
12758       const char *ret;
12759
12760       mask  = eflags_p << 3;
12761       mask |= (GET_MODE_CLASS (GET_MODE (cmp_op1)) == MODE_INT) << 2;
12762       mask |= unordered_p << 1;
12763       mask |= stack_top_dies;
12764
12765       gcc_assert (mask < 16);
12766       ret = alt[mask];
12767       gcc_assert (ret);
12768
12769       return ret;
12770     }
12771 }
12772
12773 void
12774 ix86_output_addr_vec_elt (FILE *file, int value)
12775 {
12776   const char *directive = ASM_LONG;
12777
12778 #ifdef ASM_QUAD
12779   if (TARGET_64BIT)
12780     directive = ASM_QUAD;
12781 #else
12782   gcc_assert (!TARGET_64BIT);
12783 #endif
12784
12785   fprintf (file, "%s" LPREFIX "%d\n", directive, value);
12786 }
12787
12788 void
12789 ix86_output_addr_diff_elt (FILE *file, int value, int rel)
12790 {
12791   const char *directive = ASM_LONG;
12792
12793 #ifdef ASM_QUAD
12794   if (TARGET_64BIT && CASE_VECTOR_MODE == DImode)
12795     directive = ASM_QUAD;
12796 #else
12797   gcc_assert (!TARGET_64BIT);
12798 #endif
12799   /* We can't use @GOTOFF for text labels on VxWorks; see gotoff_operand.  */
12800   if (TARGET_64BIT || TARGET_VXWORKS_RTP)
12801     fprintf (file, "%s" LPREFIX "%d-" LPREFIX "%d\n",
12802              directive, value, rel);
12803   else if (HAVE_AS_GOTOFF_IN_DATA)
12804     fprintf (file, ASM_LONG LPREFIX "%d@GOTOFF\n", value);
12805 #if TARGET_MACHO
12806   else if (TARGET_MACHO)
12807     {
12808       fprintf (file, ASM_LONG LPREFIX "%d-", value);
12809       machopic_output_function_base_name (file);
12810       putc ('\n', file);
12811     }
12812 #endif
12813   else
12814     asm_fprintf (file, ASM_LONG "%U%s+[.-" LPREFIX "%d]\n",
12815                  GOT_SYMBOL_NAME, value);
12816 }
12817 \f
12818 /* Generate either "mov $0, reg" or "xor reg, reg", as appropriate
12819    for the target.  */
12820
12821 void
12822 ix86_expand_clear (rtx dest)
12823 {
12824   rtx tmp;
12825
12826   /* We play register width games, which are only valid after reload.  */
12827   gcc_assert (reload_completed);
12828
12829   /* Avoid HImode and its attendant prefix byte.  */
12830   if (GET_MODE_SIZE (GET_MODE (dest)) < 4)
12831     dest = gen_rtx_REG (SImode, REGNO (dest));
12832   tmp = gen_rtx_SET (VOIDmode, dest, const0_rtx);
12833
12834   /* This predicate should match that for movsi_xor and movdi_xor_rex64.  */
12835   if (!TARGET_USE_MOV0 || optimize_insn_for_speed_p ())
12836     {
12837       rtx clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
12838       tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, tmp, clob));
12839     }
12840
12841   emit_insn (tmp);
12842 }
12843
12844 /* X is an unchanging MEM.  If it is a constant pool reference, return
12845    the constant pool rtx, else NULL.  */
12846
12847 rtx
12848 maybe_get_pool_constant (rtx x)
12849 {
12850   x = ix86_delegitimize_address (XEXP (x, 0));
12851
12852   if (GET_CODE (x) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (x))
12853     return get_pool_constant (x);
12854
12855   return NULL_RTX;
12856 }
12857
12858 void
12859 ix86_expand_move (enum machine_mode mode, rtx operands[])
12860 {
12861   rtx op0, op1;
12862   enum tls_model model;
12863
12864   op0 = operands[0];
12865   op1 = operands[1];
12866
12867   if (GET_CODE (op1) == SYMBOL_REF)
12868     {
12869       model = SYMBOL_REF_TLS_MODEL (op1);
12870       if (model)
12871         {
12872           op1 = legitimize_tls_address (op1, model, true);
12873           op1 = force_operand (op1, op0);
12874           if (op1 == op0)
12875             return;
12876         }
12877       else if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
12878                && SYMBOL_REF_DLLIMPORT_P (op1))
12879         op1 = legitimize_dllimport_symbol (op1, false);
12880     }
12881   else if (GET_CODE (op1) == CONST
12882            && GET_CODE (XEXP (op1, 0)) == PLUS
12883            && GET_CODE (XEXP (XEXP (op1, 0), 0)) == SYMBOL_REF)
12884     {
12885       rtx addend = XEXP (XEXP (op1, 0), 1);
12886       rtx symbol = XEXP (XEXP (op1, 0), 0);
12887       rtx tmp = NULL;
12888
12889       model = SYMBOL_REF_TLS_MODEL (symbol);
12890       if (model)
12891         tmp = legitimize_tls_address (symbol, model, true);
12892       else if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
12893                && SYMBOL_REF_DLLIMPORT_P (symbol))
12894         tmp = legitimize_dllimport_symbol (symbol, true);
12895
12896       if (tmp)
12897         {
12898           tmp = force_operand (tmp, NULL);
12899           tmp = expand_simple_binop (Pmode, PLUS, tmp, addend,
12900                                      op0, 1, OPTAB_DIRECT);
12901           if (tmp == op0)
12902             return;
12903         }
12904     }
12905
12906   if (flag_pic && mode == Pmode && symbolic_operand (op1, Pmode))
12907     {
12908       if (TARGET_MACHO && !TARGET_64BIT)
12909         {
12910 #if TARGET_MACHO
12911           if (MACHOPIC_PURE)
12912             {
12913               rtx temp = ((reload_in_progress
12914                            || ((op0 && REG_P (op0))
12915                                && mode == Pmode))
12916                           ? op0 : gen_reg_rtx (Pmode));
12917               op1 = machopic_indirect_data_reference (op1, temp);
12918               op1 = machopic_legitimize_pic_address (op1, mode,
12919                                                      temp == op1 ? 0 : temp);
12920             }
12921           else if (MACHOPIC_INDIRECT)
12922             op1 = machopic_indirect_data_reference (op1, 0);
12923           if (op0 == op1)
12924             return;
12925 #endif
12926         }
12927       else
12928         {
12929           if (MEM_P (op0))
12930             op1 = force_reg (Pmode, op1);
12931           else if (!TARGET_64BIT || !x86_64_movabs_operand (op1, Pmode))
12932             {
12933               rtx reg = can_create_pseudo_p () ? NULL_RTX : op0;
12934               op1 = legitimize_pic_address (op1, reg);
12935               if (op0 == op1)
12936                 return;
12937             }
12938         }
12939     }
12940   else
12941     {
12942       if (MEM_P (op0)
12943           && (PUSH_ROUNDING (GET_MODE_SIZE (mode)) != GET_MODE_SIZE (mode)
12944               || !push_operand (op0, mode))
12945           && MEM_P (op1))
12946         op1 = force_reg (mode, op1);
12947
12948       if (push_operand (op0, mode)
12949           && ! general_no_elim_operand (op1, mode))
12950         op1 = copy_to_mode_reg (mode, op1);
12951
12952       /* Force large constants in 64bit compilation into register
12953          to get them CSEed.  */
12954       if (can_create_pseudo_p ()
12955           && (mode == DImode) && TARGET_64BIT
12956           && immediate_operand (op1, mode)
12957           && !x86_64_zext_immediate_operand (op1, VOIDmode)
12958           && !register_operand (op0, mode)
12959           && optimize)
12960         op1 = copy_to_mode_reg (mode, op1);
12961
12962       if (can_create_pseudo_p ()
12963           && FLOAT_MODE_P (mode)
12964           && GET_CODE (op1) == CONST_DOUBLE)
12965         {
12966           /* If we are loading a floating point constant to a register,
12967              force the value to memory now, since we'll get better code
12968              out the back end.  */
12969
12970           op1 = validize_mem (force_const_mem (mode, op1));
12971           if (!register_operand (op0, mode))
12972             {
12973               rtx temp = gen_reg_rtx (mode);
12974               emit_insn (gen_rtx_SET (VOIDmode, temp, op1));
12975               emit_move_insn (op0, temp);
12976               return;
12977             }
12978         }
12979     }
12980
12981   emit_insn (gen_rtx_SET (VOIDmode, op0, op1));
12982 }
12983
12984 void
12985 ix86_expand_vector_move (enum machine_mode mode, rtx operands[])
12986 {
12987   rtx op0 = operands[0], op1 = operands[1];
12988   unsigned int align = GET_MODE_ALIGNMENT (mode);
12989
12990   /* Force constants other than zero into memory.  We do not know how
12991      the instructions used to build constants modify the upper 64 bits
12992      of the register, once we have that information we may be able
12993      to handle some of them more efficiently.  */
12994   if (can_create_pseudo_p ()
12995       && register_operand (op0, mode)
12996       && (CONSTANT_P (op1)
12997           || (GET_CODE (op1) == SUBREG
12998               && CONSTANT_P (SUBREG_REG (op1))))
12999       && !standard_sse_constant_p (op1))
13000     op1 = validize_mem (force_const_mem (mode, op1));
13001
13002   /* We need to check memory alignment for SSE mode since attribute
13003      can make operands unaligned.  */
13004   if (can_create_pseudo_p ()
13005       && SSE_REG_MODE_P (mode)
13006       && ((MEM_P (op0) && (MEM_ALIGN (op0) < align))
13007           || (MEM_P (op1) && (MEM_ALIGN (op1) < align))))
13008     {
13009       rtx tmp[2];
13010
13011       /* ix86_expand_vector_move_misalign() does not like constants ... */
13012       if (CONSTANT_P (op1)
13013           || (GET_CODE (op1) == SUBREG
13014               && CONSTANT_P (SUBREG_REG (op1))))
13015         op1 = validize_mem (force_const_mem (mode, op1));
13016
13017       /* ... nor both arguments in memory.  */
13018       if (!register_operand (op0, mode)
13019           && !register_operand (op1, mode))
13020         op1 = force_reg (mode, op1);
13021
13022       tmp[0] = op0; tmp[1] = op1;
13023       ix86_expand_vector_move_misalign (mode, tmp);
13024       return;
13025     }
13026
13027   /* Make operand1 a register if it isn't already.  */
13028   if (can_create_pseudo_p ()
13029       && !register_operand (op0, mode)
13030       && !register_operand (op1, mode))
13031     {
13032       emit_move_insn (op0, force_reg (GET_MODE (op0), op1));
13033       return;
13034     }
13035
13036   emit_insn (gen_rtx_SET (VOIDmode, op0, op1));
13037 }
13038
13039 /* Implement the movmisalign patterns for SSE.  Non-SSE modes go
13040    straight to ix86_expand_vector_move.  */
13041 /* Code generation for scalar reg-reg moves of single and double precision data:
13042      if (x86_sse_partial_reg_dependency == true | x86_sse_split_regs == true)
13043        movaps reg, reg
13044      else
13045        movss reg, reg
13046      if (x86_sse_partial_reg_dependency == true)
13047        movapd reg, reg
13048      else
13049        movsd reg, reg
13050
13051    Code generation for scalar loads of double precision data:
13052      if (x86_sse_split_regs == true)
13053        movlpd mem, reg      (gas syntax)
13054      else
13055        movsd mem, reg
13056
13057    Code generation for unaligned packed loads of single precision data
13058    (x86_sse_unaligned_move_optimal overrides x86_sse_partial_reg_dependency):
13059      if (x86_sse_unaligned_move_optimal)
13060        movups mem, reg
13061
13062      if (x86_sse_partial_reg_dependency == true)
13063        {
13064          xorps  reg, reg
13065          movlps mem, reg
13066          movhps mem+8, reg
13067        }
13068      else
13069        {
13070          movlps mem, reg
13071          movhps mem+8, reg
13072        }
13073
13074    Code generation for unaligned packed loads of double precision data
13075    (x86_sse_unaligned_move_optimal overrides x86_sse_split_regs):
13076      if (x86_sse_unaligned_move_optimal)
13077        movupd mem, reg
13078
13079      if (x86_sse_split_regs == true)
13080        {
13081          movlpd mem, reg
13082          movhpd mem+8, reg
13083        }
13084      else
13085        {
13086          movsd  mem, reg
13087          movhpd mem+8, reg
13088        }
13089  */
13090
13091 void
13092 ix86_expand_vector_move_misalign (enum machine_mode mode, rtx operands[])
13093 {
13094   rtx op0, op1, m;
13095
13096   op0 = operands[0];
13097   op1 = operands[1];
13098
13099   if (TARGET_AVX)
13100     {
13101       switch (GET_MODE_CLASS (mode))
13102         {
13103         case MODE_VECTOR_INT:
13104         case MODE_INT:
13105           switch (GET_MODE_SIZE (mode))
13106             {
13107             case 16:
13108               op0 = gen_lowpart (V16QImode, op0);
13109               op1 = gen_lowpart (V16QImode, op1);
13110               emit_insn (gen_avx_movdqu (op0, op1));
13111               break;
13112             case 32:
13113               op0 = gen_lowpart (V32QImode, op0);
13114               op1 = gen_lowpart (V32QImode, op1);
13115               emit_insn (gen_avx_movdqu256 (op0, op1));
13116               break;
13117             default:
13118               gcc_unreachable ();
13119             }
13120           break;
13121         case MODE_VECTOR_FLOAT:
13122           op0 = gen_lowpart (mode, op0);
13123           op1 = gen_lowpart (mode, op1);
13124
13125           switch (mode)
13126             { 
13127             case V4SFmode:
13128               emit_insn (gen_avx_movups (op0, op1));
13129               break;
13130             case V8SFmode:
13131               emit_insn (gen_avx_movups256 (op0, op1));
13132               break;
13133             case V2DFmode:
13134               emit_insn (gen_avx_movupd (op0, op1));
13135               break;
13136             case V4DFmode:
13137               emit_insn (gen_avx_movupd256 (op0, op1));
13138               break;
13139             default:
13140               gcc_unreachable ();
13141             }
13142           break;
13143
13144         default:
13145           gcc_unreachable ();
13146         }
13147
13148       return;
13149     }
13150
13151   if (MEM_P (op1))
13152     {
13153       /* If we're optimizing for size, movups is the smallest.  */
13154       if (optimize_insn_for_size_p ())
13155         {
13156           op0 = gen_lowpart (V4SFmode, op0);
13157           op1 = gen_lowpart (V4SFmode, op1);
13158           emit_insn (gen_sse_movups (op0, op1));
13159           return;
13160         }
13161
13162       /* ??? If we have typed data, then it would appear that using
13163          movdqu is the only way to get unaligned data loaded with
13164          integer type.  */
13165       if (TARGET_SSE2 && GET_MODE_CLASS (mode) == MODE_VECTOR_INT)
13166         {
13167           op0 = gen_lowpart (V16QImode, op0);
13168           op1 = gen_lowpart (V16QImode, op1);
13169           emit_insn (gen_sse2_movdqu (op0, op1));
13170           return;
13171         }
13172
13173       if (TARGET_SSE2 && mode == V2DFmode)
13174         {
13175           rtx zero;
13176
13177           if (TARGET_SSE_UNALIGNED_MOVE_OPTIMAL)
13178             {
13179               op0 = gen_lowpart (V2DFmode, op0);
13180               op1 = gen_lowpart (V2DFmode, op1);
13181               emit_insn (gen_sse2_movupd (op0, op1));
13182               return;
13183             }
13184
13185           /* When SSE registers are split into halves, we can avoid
13186              writing to the top half twice.  */
13187           if (TARGET_SSE_SPLIT_REGS)
13188             {
13189               emit_clobber (op0);
13190               zero = op0;
13191             }
13192           else
13193             {
13194               /* ??? Not sure about the best option for the Intel chips.
13195                  The following would seem to satisfy; the register is
13196                  entirely cleared, breaking the dependency chain.  We
13197                  then store to the upper half, with a dependency depth
13198                  of one.  A rumor has it that Intel recommends two movsd
13199                  followed by an unpacklpd, but this is unconfirmed.  And
13200                  given that the dependency depth of the unpacklpd would
13201                  still be one, I'm not sure why this would be better.  */
13202               zero = CONST0_RTX (V2DFmode);
13203             }
13204
13205           m = adjust_address (op1, DFmode, 0);
13206           emit_insn (gen_sse2_loadlpd (op0, zero, m));
13207           m = adjust_address (op1, DFmode, 8);
13208           emit_insn (gen_sse2_loadhpd (op0, op0, m));
13209         }
13210       else
13211         {
13212           if (TARGET_SSE_UNALIGNED_MOVE_OPTIMAL)
13213             {
13214               op0 = gen_lowpart (V4SFmode, op0);
13215               op1 = gen_lowpart (V4SFmode, op1);
13216               emit_insn (gen_sse_movups (op0, op1));
13217               return;
13218             }
13219
13220           if (TARGET_SSE_PARTIAL_REG_DEPENDENCY)
13221             emit_move_insn (op0, CONST0_RTX (mode));
13222           else
13223             emit_clobber (op0);
13224
13225           if (mode != V4SFmode)
13226             op0 = gen_lowpart (V4SFmode, op0);
13227           m = adjust_address (op1, V2SFmode, 0);
13228           emit_insn (gen_sse_loadlps (op0, op0, m));
13229           m = adjust_address (op1, V2SFmode, 8);
13230           emit_insn (gen_sse_loadhps (op0, op0, m));
13231         }
13232     }
13233   else if (MEM_P (op0))
13234     {
13235       /* If we're optimizing for size, movups is the smallest.  */
13236       if (optimize_insn_for_size_p ())
13237         {
13238           op0 = gen_lowpart (V4SFmode, op0);
13239           op1 = gen_lowpart (V4SFmode, op1);
13240           emit_insn (gen_sse_movups (op0, op1));
13241           return;
13242         }
13243
13244       /* ??? Similar to above, only less clear because of quote
13245          typeless stores unquote.  */
13246       if (TARGET_SSE2 && !TARGET_SSE_TYPELESS_STORES
13247           && GET_MODE_CLASS (mode) == MODE_VECTOR_INT)
13248         {
13249           op0 = gen_lowpart (V16QImode, op0);
13250           op1 = gen_lowpart (V16QImode, op1);
13251           emit_insn (gen_sse2_movdqu (op0, op1));
13252           return;
13253         }
13254
13255       if (TARGET_SSE2 && mode == V2DFmode)
13256         {
13257           m = adjust_address (op0, DFmode, 0);
13258           emit_insn (gen_sse2_storelpd (m, op1));
13259           m = adjust_address (op0, DFmode, 8);
13260           emit_insn (gen_sse2_storehpd (m, op1));
13261         }
13262       else
13263         {
13264           if (mode != V4SFmode)
13265             op1 = gen_lowpart (V4SFmode, op1);
13266           m = adjust_address (op0, V2SFmode, 0);
13267           emit_insn (gen_sse_storelps (m, op1));
13268           m = adjust_address (op0, V2SFmode, 8);
13269           emit_insn (gen_sse_storehps (m, op1));
13270         }
13271     }
13272   else
13273     gcc_unreachable ();
13274 }
13275
13276 /* Expand a push in MODE.  This is some mode for which we do not support
13277    proper push instructions, at least from the registers that we expect
13278    the value to live in.  */
13279
13280 void
13281 ix86_expand_push (enum machine_mode mode, rtx x)
13282 {
13283   rtx tmp;
13284
13285   tmp = expand_simple_binop (Pmode, PLUS, stack_pointer_rtx,
13286                              GEN_INT (-GET_MODE_SIZE (mode)),
13287                              stack_pointer_rtx, 1, OPTAB_DIRECT);
13288   if (tmp != stack_pointer_rtx)
13289     emit_move_insn (stack_pointer_rtx, tmp);
13290
13291   tmp = gen_rtx_MEM (mode, stack_pointer_rtx);
13292
13293   /* When we push an operand onto stack, it has to be aligned at least
13294      at the function argument boundary.  However since we don't have
13295      the argument type, we can't determine the actual argument
13296      boundary.  */
13297   emit_move_insn (tmp, x);
13298 }
13299
13300 /* Helper function of ix86_fixup_binary_operands to canonicalize
13301    operand order.  Returns true if the operands should be swapped.  */
13302
13303 static bool
13304 ix86_swap_binary_operands_p (enum rtx_code code, enum machine_mode mode,
13305                              rtx operands[])
13306 {
13307   rtx dst = operands[0];
13308   rtx src1 = operands[1];
13309   rtx src2 = operands[2];
13310
13311   /* If the operation is not commutative, we can't do anything.  */
13312   if (GET_RTX_CLASS (code) != RTX_COMM_ARITH)
13313     return false;
13314
13315   /* Highest priority is that src1 should match dst.  */
13316   if (rtx_equal_p (dst, src1))
13317     return false;
13318   if (rtx_equal_p (dst, src2))
13319     return true;
13320
13321   /* Next highest priority is that immediate constants come second.  */
13322   if (immediate_operand (src2, mode))
13323     return false;
13324   if (immediate_operand (src1, mode))
13325     return true;
13326
13327   /* Lowest priority is that memory references should come second.  */
13328   if (MEM_P (src2))
13329     return false;
13330   if (MEM_P (src1))
13331     return true;
13332
13333   return false;
13334 }
13335
13336
13337 /* Fix up OPERANDS to satisfy ix86_binary_operator_ok.  Return the
13338    destination to use for the operation.  If different from the true
13339    destination in operands[0], a copy operation will be required.  */
13340
13341 rtx
13342 ix86_fixup_binary_operands (enum rtx_code code, enum machine_mode mode,
13343                             rtx operands[])
13344 {
13345   rtx dst = operands[0];
13346   rtx src1 = operands[1];
13347   rtx src2 = operands[2];
13348
13349   /* Canonicalize operand order.  */
13350   if (ix86_swap_binary_operands_p (code, mode, operands))
13351     {
13352       rtx temp;
13353
13354       /* It is invalid to swap operands of different modes.  */
13355       gcc_assert (GET_MODE (src1) == GET_MODE (src2));
13356
13357       temp = src1;
13358       src1 = src2;
13359       src2 = temp;
13360     }
13361
13362   /* Both source operands cannot be in memory.  */
13363   if (MEM_P (src1) && MEM_P (src2))
13364     {
13365       /* Optimization: Only read from memory once.  */
13366       if (rtx_equal_p (src1, src2))
13367         {
13368           src2 = force_reg (mode, src2);
13369           src1 = src2;
13370         }
13371       else
13372         src2 = force_reg (mode, src2);
13373     }
13374
13375   /* If the destination is memory, and we do not have matching source
13376      operands, do things in registers.  */
13377   if (MEM_P (dst) && !rtx_equal_p (dst, src1))
13378     dst = gen_reg_rtx (mode);
13379
13380   /* Source 1 cannot be a constant.  */
13381   if (CONSTANT_P (src1))
13382     src1 = force_reg (mode, src1);
13383
13384   /* Source 1 cannot be a non-matching memory.  */
13385   if (MEM_P (src1) && !rtx_equal_p (dst, src1))
13386     src1 = force_reg (mode, src1);
13387
13388   operands[1] = src1;
13389   operands[2] = src2;
13390   return dst;
13391 }
13392
13393 /* Similarly, but assume that the destination has already been
13394    set up properly.  */
13395
13396 void
13397 ix86_fixup_binary_operands_no_copy (enum rtx_code code,
13398                                     enum machine_mode mode, rtx operands[])
13399 {
13400   rtx dst = ix86_fixup_binary_operands (code, mode, operands);
13401   gcc_assert (dst == operands[0]);
13402 }
13403
13404 /* Attempt to expand a binary operator.  Make the expansion closer to the
13405    actual machine, then just general_operand, which will allow 3 separate
13406    memory references (one output, two input) in a single insn.  */
13407
13408 void
13409 ix86_expand_binary_operator (enum rtx_code code, enum machine_mode mode,
13410                              rtx operands[])
13411 {
13412   rtx src1, src2, dst, op, clob;
13413
13414   dst = ix86_fixup_binary_operands (code, mode, operands);
13415   src1 = operands[1];
13416   src2 = operands[2];
13417
13418  /* Emit the instruction.  */
13419
13420   op = gen_rtx_SET (VOIDmode, dst, gen_rtx_fmt_ee (code, mode, src1, src2));
13421   if (reload_in_progress)
13422     {
13423       /* Reload doesn't know about the flags register, and doesn't know that
13424          it doesn't want to clobber it.  We can only do this with PLUS.  */
13425       gcc_assert (code == PLUS);
13426       emit_insn (op);
13427     }
13428   else
13429     {
13430       clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
13431       emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, op, clob)));
13432     }
13433
13434   /* Fix up the destination if needed.  */
13435   if (dst != operands[0])
13436     emit_move_insn (operands[0], dst);
13437 }
13438
13439 /* Return TRUE or FALSE depending on whether the binary operator meets the
13440    appropriate constraints.  */
13441
13442 int
13443 ix86_binary_operator_ok (enum rtx_code code, enum machine_mode mode,
13444                          rtx operands[3])
13445 {
13446   rtx dst = operands[0];
13447   rtx src1 = operands[1];
13448   rtx src2 = operands[2];
13449
13450   /* Both source operands cannot be in memory.  */
13451   if (MEM_P (src1) && MEM_P (src2))
13452     return 0;
13453
13454   /* Canonicalize operand order for commutative operators.  */
13455   if (ix86_swap_binary_operands_p (code, mode, operands))
13456     {
13457       rtx temp = src1;
13458       src1 = src2;
13459       src2 = temp;
13460     }
13461
13462   /* If the destination is memory, we must have a matching source operand.  */
13463   if (MEM_P (dst) && !rtx_equal_p (dst, src1))
13464       return 0;
13465
13466   /* Source 1 cannot be a constant.  */
13467   if (CONSTANT_P (src1))
13468     return 0;
13469
13470   /* Source 1 cannot be a non-matching memory.  */
13471   if (MEM_P (src1) && !rtx_equal_p (dst, src1))
13472     return 0;
13473
13474   return 1;
13475 }
13476
13477 /* Attempt to expand a unary operator.  Make the expansion closer to the
13478    actual machine, then just general_operand, which will allow 2 separate
13479    memory references (one output, one input) in a single insn.  */
13480
13481 void
13482 ix86_expand_unary_operator (enum rtx_code code, enum machine_mode mode,
13483                             rtx operands[])
13484 {
13485   int matching_memory;
13486   rtx src, dst, op, clob;
13487
13488   dst = operands[0];
13489   src = operands[1];
13490
13491   /* If the destination is memory, and we do not have matching source
13492      operands, do things in registers.  */
13493   matching_memory = 0;
13494   if (MEM_P (dst))
13495     {
13496       if (rtx_equal_p (dst, src))
13497         matching_memory = 1;
13498       else
13499         dst = gen_reg_rtx (mode);
13500     }
13501
13502   /* When source operand is memory, destination must match.  */
13503   if (MEM_P (src) && !matching_memory)
13504     src = force_reg (mode, src);
13505
13506   /* Emit the instruction.  */
13507
13508   op = gen_rtx_SET (VOIDmode, dst, gen_rtx_fmt_e (code, mode, src));
13509   if (reload_in_progress || code == NOT)
13510     {
13511       /* Reload doesn't know about the flags register, and doesn't know that
13512          it doesn't want to clobber it.  */
13513       gcc_assert (code == NOT);
13514       emit_insn (op);
13515     }
13516   else
13517     {
13518       clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
13519       emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, op, clob)));
13520     }
13521
13522   /* Fix up the destination if needed.  */
13523   if (dst != operands[0])
13524     emit_move_insn (operands[0], dst);
13525 }
13526
13527 #define LEA_SEARCH_THRESHOLD 12
13528
13529 /* Search backward for non-agu definition of register number REGNO1
13530    or register number REGNO2 in INSN's basic block until 
13531    1. Pass LEA_SEARCH_THRESHOLD instructions, or
13532    2. Reach BB boundary, or
13533    3. Reach agu definition.
13534    Returns the distance between the non-agu definition point and INSN.
13535    If no definition point, returns -1.  */
13536
13537 static int
13538 distance_non_agu_define (unsigned int regno1, unsigned int regno2,
13539                          rtx insn)
13540 {
13541   basic_block bb = BLOCK_FOR_INSN (insn);
13542   int distance = 0;
13543   df_ref *def_rec;
13544   enum attr_type insn_type;
13545
13546   if (insn != BB_HEAD (bb))
13547     {
13548       rtx prev = PREV_INSN (insn);
13549       while (prev && distance < LEA_SEARCH_THRESHOLD)
13550         {
13551           if (INSN_P (prev))
13552             {
13553               distance++;
13554               for (def_rec = DF_INSN_DEFS (prev); *def_rec; def_rec++)
13555                 if (DF_REF_TYPE (*def_rec) == DF_REF_REG_DEF
13556                     && !DF_REF_IS_ARTIFICIAL (*def_rec)
13557                     && (regno1 == DF_REF_REGNO (*def_rec)
13558                         || regno2 == DF_REF_REGNO (*def_rec)))
13559                   {
13560                     insn_type = get_attr_type (prev);
13561                     if (insn_type != TYPE_LEA)
13562                       goto done;
13563                   }
13564             }
13565           if (prev == BB_HEAD (bb))
13566             break;
13567           prev = PREV_INSN (prev);
13568         }
13569     }
13570   
13571   if (distance < LEA_SEARCH_THRESHOLD)
13572     {
13573       edge e;
13574       edge_iterator ei;
13575       bool simple_loop = false;
13576   
13577       FOR_EACH_EDGE (e, ei, bb->preds)
13578         if (e->src == bb)
13579           {
13580             simple_loop = true;
13581             break;
13582           }
13583   
13584       if (simple_loop)
13585         {
13586           rtx prev = BB_END (bb);
13587           while (prev
13588                  && prev != insn
13589                  && distance < LEA_SEARCH_THRESHOLD)
13590             {
13591               if (INSN_P (prev))
13592                 {
13593                   distance++;
13594                   for (def_rec = DF_INSN_DEFS (prev); *def_rec; def_rec++)
13595                     if (DF_REF_TYPE (*def_rec) == DF_REF_REG_DEF
13596                         && !DF_REF_IS_ARTIFICIAL (*def_rec)
13597                         && (regno1 == DF_REF_REGNO (*def_rec)
13598                             || regno2 == DF_REF_REGNO (*def_rec)))
13599                       {
13600                         insn_type = get_attr_type (prev);
13601                         if (insn_type != TYPE_LEA)
13602                           goto done;
13603                       }
13604                 }
13605               prev = PREV_INSN (prev);
13606             }
13607         }
13608     }
13609
13610   distance = -1;
13611
13612 done:
13613   /* get_attr_type may modify recog data.  We want to make sure
13614      that recog data is valid for instruction INSN, on which
13615      distance_non_agu_define is called.  INSN is unchanged here.  */
13616   extract_insn_cached (insn);
13617   return distance;
13618 }
13619
13620 /* Return the distance between INSN and the next insn that uses 
13621    register number REGNO0 in memory address.  Return -1 if no such
13622    a use is found within LEA_SEARCH_THRESHOLD or REGNO0 is set.  */
13623
13624 static int
13625 distance_agu_use (unsigned int regno0, rtx insn)
13626 {
13627   basic_block bb = BLOCK_FOR_INSN (insn);
13628   int distance = 0;
13629   df_ref *def_rec;
13630   df_ref *use_rec;
13631
13632   if (insn != BB_END (bb))
13633     {
13634       rtx next = NEXT_INSN (insn);
13635       while (next && distance < LEA_SEARCH_THRESHOLD)
13636         {
13637           if (INSN_P (next))
13638             {
13639               distance++;
13640
13641               for (use_rec = DF_INSN_USES (next); *use_rec; use_rec++)
13642                 if ((DF_REF_TYPE (*use_rec) == DF_REF_REG_MEM_LOAD
13643                      || DF_REF_TYPE (*use_rec) == DF_REF_REG_MEM_STORE)
13644                     && regno0 == DF_REF_REGNO (*use_rec))
13645                   {
13646                     /* Return DISTANCE if OP0 is used in memory
13647                        address in NEXT.  */
13648                     return distance;
13649                   }
13650
13651               for (def_rec = DF_INSN_DEFS (next); *def_rec; def_rec++)
13652                 if (DF_REF_TYPE (*def_rec) == DF_REF_REG_DEF
13653                     && !DF_REF_IS_ARTIFICIAL (*def_rec)
13654                     && regno0 == DF_REF_REGNO (*def_rec))
13655                   {
13656                     /* Return -1 if OP0 is set in NEXT.  */
13657                     return -1;
13658                   }
13659             }
13660           if (next == BB_END (bb))
13661             break;
13662           next = NEXT_INSN (next);
13663         }
13664     }
13665
13666   if (distance < LEA_SEARCH_THRESHOLD)
13667     {
13668       edge e;
13669       edge_iterator ei;
13670       bool simple_loop = false;
13671   
13672       FOR_EACH_EDGE (e, ei, bb->succs)
13673         if (e->dest == bb)
13674           {
13675             simple_loop = true;
13676             break;
13677           }
13678   
13679       if (simple_loop)
13680         {
13681           rtx next = BB_HEAD (bb);
13682           while (next
13683                  && next != insn
13684                  && distance < LEA_SEARCH_THRESHOLD)
13685             {
13686               if (INSN_P (next))
13687                 {
13688                   distance++;
13689
13690                   for (use_rec = DF_INSN_USES (next); *use_rec; use_rec++)
13691                     if ((DF_REF_TYPE (*use_rec) == DF_REF_REG_MEM_LOAD
13692                          || DF_REF_TYPE (*use_rec) == DF_REF_REG_MEM_STORE)
13693                         && regno0 == DF_REF_REGNO (*use_rec))
13694                       {
13695                         /* Return DISTANCE if OP0 is used in memory
13696                            address in NEXT.  */
13697                         return distance;
13698                       }
13699
13700                   for (def_rec = DF_INSN_DEFS (next); *def_rec; def_rec++)
13701                     if (DF_REF_TYPE (*def_rec) == DF_REF_REG_DEF
13702                         && !DF_REF_IS_ARTIFICIAL (*def_rec)
13703                         && regno0 == DF_REF_REGNO (*def_rec))
13704                       {
13705                         /* Return -1 if OP0 is set in NEXT.  */
13706                         return -1;
13707                       }
13708
13709                 }
13710               next = NEXT_INSN (next);
13711             }
13712         }
13713     }  
13714
13715   return -1;
13716 }
13717
13718 /* Define this macro to tune LEA priority vs ADD, it take effect when
13719    there is a dilemma of choicing LEA or ADD
13720    Negative value: ADD is more preferred than LEA
13721    Zero: Netrual
13722    Positive value: LEA is more preferred than ADD*/
13723 #define IX86_LEA_PRIORITY 2
13724
13725 /* Return true if it is ok to optimize an ADD operation to LEA
13726    operation to avoid flag register consumation.  For the processors
13727    like ATOM, if the destination register of LEA holds an actual
13728    address which will be used soon, LEA is better and otherwise ADD
13729    is better.  */
13730
13731 bool
13732 ix86_lea_for_add_ok (enum rtx_code code ATTRIBUTE_UNUSED,
13733                      rtx insn, rtx operands[])
13734 {
13735   unsigned int regno0 = true_regnum (operands[0]);
13736   unsigned int regno1 = true_regnum (operands[1]);
13737   unsigned int regno2;
13738
13739   if (!TARGET_OPT_AGU || optimize_function_for_size_p (cfun))
13740     return regno0 != regno1;
13741
13742   regno2 = true_regnum (operands[2]);
13743
13744   /* If a = b + c, (a!=b && a!=c), must use lea form. */
13745   if (regno0 != regno1 && regno0 != regno2)
13746     return true;
13747   else    
13748     {
13749       int dist_define, dist_use;
13750       dist_define = distance_non_agu_define (regno1, regno2, insn);
13751       if (dist_define <= 0)
13752         return true;
13753
13754       /* If this insn has both backward non-agu dependence and forward
13755          agu dependence, the one with short distance take effect. */
13756       dist_use = distance_agu_use (regno0, insn);
13757       if (dist_use <= 0
13758           || (dist_define + IX86_LEA_PRIORITY) < dist_use)
13759         return false;
13760
13761       return true;
13762     }
13763 }
13764
13765 /* Return true if destination reg of SET_BODY is shift count of
13766    USE_BODY.  */
13767
13768 static bool
13769 ix86_dep_by_shift_count_body (const_rtx set_body, const_rtx use_body)
13770 {
13771   rtx set_dest;
13772   rtx shift_rtx;
13773   int i;
13774
13775   /* Retrieve destination of SET_BODY.  */
13776   switch (GET_CODE (set_body))
13777     {
13778     case SET:
13779       set_dest = SET_DEST (set_body);
13780       if (!set_dest || !REG_P (set_dest))
13781         return false;
13782       break;
13783     case PARALLEL:
13784       for (i = XVECLEN (set_body, 0) - 1; i >= 0; i--)
13785         if (ix86_dep_by_shift_count_body (XVECEXP (set_body, 0, i),
13786                                           use_body))
13787           return true;
13788     default:
13789       return false;
13790       break;
13791     }
13792
13793   /* Retrieve shift count of USE_BODY.  */
13794   switch (GET_CODE (use_body))
13795     {
13796     case SET:
13797       shift_rtx = XEXP (use_body, 1);
13798       break;
13799     case PARALLEL:
13800       for (i = XVECLEN (use_body, 0) - 1; i >= 0; i--)
13801         if (ix86_dep_by_shift_count_body (set_body,
13802                                           XVECEXP (use_body, 0, i)))
13803           return true;
13804     default:
13805       return false;
13806       break;
13807     }
13808
13809   if (shift_rtx 
13810       && (GET_CODE (shift_rtx) == ASHIFT
13811           || GET_CODE (shift_rtx) == LSHIFTRT
13812           || GET_CODE (shift_rtx) == ASHIFTRT
13813           || GET_CODE (shift_rtx) == ROTATE
13814           || GET_CODE (shift_rtx) == ROTATERT))
13815     {
13816       rtx shift_count = XEXP (shift_rtx, 1);
13817
13818       /* Return true if shift count is dest of SET_BODY.  */
13819       if (REG_P (shift_count)
13820           && true_regnum (set_dest) == true_regnum (shift_count))
13821         return true;
13822     }
13823
13824   return false;
13825 }
13826
13827 /* Return true if destination reg of SET_INSN is shift count of
13828    USE_INSN.  */
13829
13830 bool
13831 ix86_dep_by_shift_count (const_rtx set_insn, const_rtx use_insn)
13832 {
13833   return ix86_dep_by_shift_count_body (PATTERN (set_insn),
13834                                        PATTERN (use_insn));
13835 }
13836
13837 /* Return TRUE or FALSE depending on whether the unary operator meets the
13838    appropriate constraints.  */
13839
13840 int
13841 ix86_unary_operator_ok (enum rtx_code code ATTRIBUTE_UNUSED,
13842                         enum machine_mode mode ATTRIBUTE_UNUSED,
13843                         rtx operands[2] ATTRIBUTE_UNUSED)
13844 {
13845   /* If one of operands is memory, source and destination must match.  */
13846   if ((MEM_P (operands[0])
13847        || MEM_P (operands[1]))
13848       && ! rtx_equal_p (operands[0], operands[1]))
13849     return FALSE;
13850   return TRUE;
13851 }
13852
13853 /* Post-reload splitter for converting an SF or DFmode value in an
13854    SSE register into an unsigned SImode.  */
13855
13856 void
13857 ix86_split_convert_uns_si_sse (rtx operands[])
13858 {
13859   enum machine_mode vecmode;
13860   rtx value, large, zero_or_two31, input, two31, x;
13861
13862   large = operands[1];
13863   zero_or_two31 = operands[2];
13864   input = operands[3];
13865   two31 = operands[4];
13866   vecmode = GET_MODE (large);
13867   value = gen_rtx_REG (vecmode, REGNO (operands[0]));
13868
13869   /* Load up the value into the low element.  We must ensure that the other
13870      elements are valid floats -- zero is the easiest such value.  */
13871   if (MEM_P (input))
13872     {
13873       if (vecmode == V4SFmode)
13874         emit_insn (gen_vec_setv4sf_0 (value, CONST0_RTX (V4SFmode), input));
13875       else
13876         emit_insn (gen_sse2_loadlpd (value, CONST0_RTX (V2DFmode), input));
13877     }
13878   else
13879     {
13880       input = gen_rtx_REG (vecmode, REGNO (input));
13881       emit_move_insn (value, CONST0_RTX (vecmode));
13882       if (vecmode == V4SFmode)
13883         emit_insn (gen_sse_movss (value, value, input));
13884       else
13885         emit_insn (gen_sse2_movsd (value, value, input));
13886     }
13887
13888   emit_move_insn (large, two31);
13889   emit_move_insn (zero_or_two31, MEM_P (two31) ? large : two31);
13890
13891   x = gen_rtx_fmt_ee (LE, vecmode, large, value);
13892   emit_insn (gen_rtx_SET (VOIDmode, large, x));
13893
13894   x = gen_rtx_AND (vecmode, zero_or_two31, large);
13895   emit_insn (gen_rtx_SET (VOIDmode, zero_or_two31, x));
13896
13897   x = gen_rtx_MINUS (vecmode, value, zero_or_two31);
13898   emit_insn (gen_rtx_SET (VOIDmode, value, x));
13899
13900   large = gen_rtx_REG (V4SImode, REGNO (large));
13901   emit_insn (gen_ashlv4si3 (large, large, GEN_INT (31)));
13902
13903   x = gen_rtx_REG (V4SImode, REGNO (value));
13904   if (vecmode == V4SFmode)
13905     emit_insn (gen_sse2_cvttps2dq (x, value));
13906   else
13907     emit_insn (gen_sse2_cvttpd2dq (x, value));
13908   value = x;
13909
13910   emit_insn (gen_xorv4si3 (value, value, large));
13911 }
13912
13913 /* Convert an unsigned DImode value into a DFmode, using only SSE.
13914    Expects the 64-bit DImode to be supplied in a pair of integral
13915    registers.  Requires SSE2; will use SSE3 if available.  For x86_32,
13916    -mfpmath=sse, !optimize_size only.  */
13917
13918 void
13919 ix86_expand_convert_uns_didf_sse (rtx target, rtx input)
13920 {
13921   REAL_VALUE_TYPE bias_lo_rvt, bias_hi_rvt;
13922   rtx int_xmm, fp_xmm;
13923   rtx biases, exponents;
13924   rtx x;
13925
13926   int_xmm = gen_reg_rtx (V4SImode);
13927   if (TARGET_INTER_UNIT_MOVES)
13928     emit_insn (gen_movdi_to_sse (int_xmm, input));
13929   else if (TARGET_SSE_SPLIT_REGS)
13930     {
13931       emit_clobber (int_xmm);
13932       emit_move_insn (gen_lowpart (DImode, int_xmm), input);
13933     }
13934   else
13935     {
13936       x = gen_reg_rtx (V2DImode);
13937       ix86_expand_vector_init_one_nonzero (false, V2DImode, x, input, 0);
13938       emit_move_insn (int_xmm, gen_lowpart (V4SImode, x));
13939     }
13940
13941   x = gen_rtx_CONST_VECTOR (V4SImode,
13942                             gen_rtvec (4, GEN_INT (0x43300000UL),
13943                                        GEN_INT (0x45300000UL),
13944                                        const0_rtx, const0_rtx));
13945   exponents = validize_mem (force_const_mem (V4SImode, x));
13946
13947   /* int_xmm = {0x45300000UL, fp_xmm/hi, 0x43300000, fp_xmm/lo } */
13948   emit_insn (gen_sse2_punpckldq (int_xmm, int_xmm, exponents));
13949
13950   /* Concatenating (juxtaposing) (0x43300000UL ## fp_value_low_xmm)
13951      yields a valid DF value equal to (0x1.0p52 + double(fp_value_lo_xmm)).
13952      Similarly (0x45300000UL ## fp_value_hi_xmm) yields
13953      (0x1.0p84 + double(fp_value_hi_xmm)).
13954      Note these exponents differ by 32.  */
13955
13956   fp_xmm = copy_to_mode_reg (V2DFmode, gen_lowpart (V2DFmode, int_xmm));
13957
13958   /* Subtract off those 0x1.0p52 and 0x1.0p84 biases, to produce values
13959      in [0,2**32-1] and [0]+[2**32,2**64-1] respectively.  */
13960   real_ldexp (&bias_lo_rvt, &dconst1, 52);
13961   real_ldexp (&bias_hi_rvt, &dconst1, 84);
13962   biases = const_double_from_real_value (bias_lo_rvt, DFmode);
13963   x = const_double_from_real_value (bias_hi_rvt, DFmode);
13964   biases = gen_rtx_CONST_VECTOR (V2DFmode, gen_rtvec (2, biases, x));
13965   biases = validize_mem (force_const_mem (V2DFmode, biases));
13966   emit_insn (gen_subv2df3 (fp_xmm, fp_xmm, biases));
13967
13968   /* Add the upper and lower DFmode values together.  */
13969   if (TARGET_SSE3)
13970     emit_insn (gen_sse3_haddv2df3 (fp_xmm, fp_xmm, fp_xmm));
13971   else
13972     {
13973       x = copy_to_mode_reg (V2DFmode, fp_xmm);
13974       emit_insn (gen_sse2_unpckhpd (fp_xmm, fp_xmm, fp_xmm));
13975       emit_insn (gen_addv2df3 (fp_xmm, fp_xmm, x));
13976     }
13977
13978   ix86_expand_vector_extract (false, target, fp_xmm, 0);
13979 }
13980
13981 /* Not used, but eases macroization of patterns.  */
13982 void
13983 ix86_expand_convert_uns_sixf_sse (rtx target ATTRIBUTE_UNUSED,
13984                                   rtx input ATTRIBUTE_UNUSED)
13985 {
13986   gcc_unreachable ();
13987 }
13988
13989 /* Convert an unsigned SImode value into a DFmode.  Only currently used
13990    for SSE, but applicable anywhere.  */
13991
13992 void
13993 ix86_expand_convert_uns_sidf_sse (rtx target, rtx input)
13994 {
13995   REAL_VALUE_TYPE TWO31r;
13996   rtx x, fp;
13997
13998   x = expand_simple_binop (SImode, PLUS, input, GEN_INT (-2147483647 - 1),
13999                            NULL, 1, OPTAB_DIRECT);
14000
14001   fp = gen_reg_rtx (DFmode);
14002   emit_insn (gen_floatsidf2 (fp, x));
14003
14004   real_ldexp (&TWO31r, &dconst1, 31);
14005   x = const_double_from_real_value (TWO31r, DFmode);
14006
14007   x = expand_simple_binop (DFmode, PLUS, fp, x, target, 0, OPTAB_DIRECT);
14008   if (x != target)
14009     emit_move_insn (target, x);
14010 }
14011
14012 /* Convert a signed DImode value into a DFmode.  Only used for SSE in
14013    32-bit mode; otherwise we have a direct convert instruction.  */
14014
14015 void
14016 ix86_expand_convert_sign_didf_sse (rtx target, rtx input)
14017 {
14018   REAL_VALUE_TYPE TWO32r;
14019   rtx fp_lo, fp_hi, x;
14020
14021   fp_lo = gen_reg_rtx (DFmode);
14022   fp_hi = gen_reg_rtx (DFmode);
14023
14024   emit_insn (gen_floatsidf2 (fp_hi, gen_highpart (SImode, input)));
14025
14026   real_ldexp (&TWO32r, &dconst1, 32);
14027   x = const_double_from_real_value (TWO32r, DFmode);
14028   fp_hi = expand_simple_binop (DFmode, MULT, fp_hi, x, fp_hi, 0, OPTAB_DIRECT);
14029
14030   ix86_expand_convert_uns_sidf_sse (fp_lo, gen_lowpart (SImode, input));
14031
14032   x = expand_simple_binop (DFmode, PLUS, fp_hi, fp_lo, target,
14033                            0, OPTAB_DIRECT);
14034   if (x != target)
14035     emit_move_insn (target, x);
14036 }
14037
14038 /* Convert an unsigned SImode value into a SFmode, using only SSE.
14039    For x86_32, -mfpmath=sse, !optimize_size only.  */
14040 void
14041 ix86_expand_convert_uns_sisf_sse (rtx target, rtx input)
14042 {
14043   REAL_VALUE_TYPE ONE16r;
14044   rtx fp_hi, fp_lo, int_hi, int_lo, x;
14045
14046   real_ldexp (&ONE16r, &dconst1, 16);
14047   x = const_double_from_real_value (ONE16r, SFmode);
14048   int_lo = expand_simple_binop (SImode, AND, input, GEN_INT(0xffff),
14049                                       NULL, 0, OPTAB_DIRECT);
14050   int_hi = expand_simple_binop (SImode, LSHIFTRT, input, GEN_INT(16),
14051                                       NULL, 0, OPTAB_DIRECT);
14052   fp_hi = gen_reg_rtx (SFmode);
14053   fp_lo = gen_reg_rtx (SFmode);
14054   emit_insn (gen_floatsisf2 (fp_hi, int_hi));
14055   emit_insn (gen_floatsisf2 (fp_lo, int_lo));
14056   fp_hi = expand_simple_binop (SFmode, MULT, fp_hi, x, fp_hi,
14057                                0, OPTAB_DIRECT);
14058   fp_hi = expand_simple_binop (SFmode, PLUS, fp_hi, fp_lo, target,
14059                                0, OPTAB_DIRECT);
14060   if (!rtx_equal_p (target, fp_hi))
14061     emit_move_insn (target, fp_hi);
14062 }
14063
14064 /* A subroutine of ix86_build_signbit_mask.  If VECT is true,
14065    then replicate the value for all elements of the vector
14066    register.  */
14067
14068 rtx
14069 ix86_build_const_vector (enum machine_mode mode, bool vect, rtx value)
14070 {
14071   rtvec v;
14072   switch (mode)
14073     {
14074     case SImode:
14075       gcc_assert (vect);
14076       v = gen_rtvec (4, value, value, value, value);
14077       return gen_rtx_CONST_VECTOR (V4SImode, v);
14078
14079     case DImode:
14080       gcc_assert (vect);
14081       v = gen_rtvec (2, value, value);
14082       return gen_rtx_CONST_VECTOR (V2DImode, v);
14083
14084     case SFmode:
14085       if (vect)
14086         v = gen_rtvec (4, value, value, value, value);
14087       else
14088         v = gen_rtvec (4, value, CONST0_RTX (SFmode),
14089                        CONST0_RTX (SFmode), CONST0_RTX (SFmode));
14090       return gen_rtx_CONST_VECTOR (V4SFmode, v);
14091
14092     case DFmode:
14093       if (vect)
14094         v = gen_rtvec (2, value, value);
14095       else
14096         v = gen_rtvec (2, value, CONST0_RTX (DFmode));
14097       return gen_rtx_CONST_VECTOR (V2DFmode, v);
14098
14099     default:
14100       gcc_unreachable ();
14101     }
14102 }
14103
14104 /* A subroutine of ix86_expand_fp_absneg_operator, copysign expanders
14105    and ix86_expand_int_vcond.  Create a mask for the sign bit in MODE
14106    for an SSE register.  If VECT is true, then replicate the mask for
14107    all elements of the vector register.  If INVERT is true, then create
14108    a mask excluding the sign bit.  */
14109
14110 rtx
14111 ix86_build_signbit_mask (enum machine_mode mode, bool vect, bool invert)
14112 {
14113   enum machine_mode vec_mode, imode;
14114   HOST_WIDE_INT hi, lo;
14115   int shift = 63;
14116   rtx v;
14117   rtx mask;
14118
14119   /* Find the sign bit, sign extended to 2*HWI.  */
14120   switch (mode)
14121     {
14122     case SImode:
14123     case SFmode:
14124       imode = SImode;
14125       vec_mode = (mode == SImode) ? V4SImode : V4SFmode;
14126       lo = 0x80000000, hi = lo < 0;
14127       break;
14128
14129     case DImode:
14130     case DFmode:
14131       imode = DImode;
14132       vec_mode = (mode == DImode) ? V2DImode : V2DFmode;
14133       if (HOST_BITS_PER_WIDE_INT >= 64)
14134         lo = (HOST_WIDE_INT)1 << shift, hi = -1;
14135       else
14136         lo = 0, hi = (HOST_WIDE_INT)1 << (shift - HOST_BITS_PER_WIDE_INT);
14137       break;
14138
14139     case TImode:
14140     case TFmode:
14141       vec_mode = VOIDmode;
14142       if (HOST_BITS_PER_WIDE_INT >= 64)
14143         {
14144           imode = TImode;
14145           lo = 0, hi = (HOST_WIDE_INT)1 << shift;
14146         }
14147       else
14148         {
14149           rtvec vec;
14150
14151           imode = DImode;
14152           lo = 0, hi = (HOST_WIDE_INT)1 << (shift - HOST_BITS_PER_WIDE_INT);
14153
14154           if (invert)
14155             {
14156               lo = ~lo, hi = ~hi;
14157               v = constm1_rtx;
14158             }
14159           else
14160             v = const0_rtx;
14161
14162           mask = immed_double_const (lo, hi, imode);
14163
14164           vec = gen_rtvec (2, v, mask);
14165           v = gen_rtx_CONST_VECTOR (V2DImode, vec);
14166           v = copy_to_mode_reg (mode, gen_lowpart (mode, v));
14167
14168           return v;
14169         }
14170      break;
14171
14172     default:
14173       gcc_unreachable ();
14174     }
14175
14176   if (invert)
14177     lo = ~lo, hi = ~hi;
14178
14179   /* Force this value into the low part of a fp vector constant.  */
14180   mask = immed_double_const (lo, hi, imode);
14181   mask = gen_lowpart (mode, mask);
14182
14183   if (vec_mode == VOIDmode)
14184     return force_reg (mode, mask);
14185
14186   v = ix86_build_const_vector (mode, vect, mask);
14187   return force_reg (vec_mode, v);
14188 }
14189
14190 /* Generate code for floating point ABS or NEG.  */
14191
14192 void
14193 ix86_expand_fp_absneg_operator (enum rtx_code code, enum machine_mode mode,
14194                                 rtx operands[])
14195 {
14196   rtx mask, set, use, clob, dst, src;
14197   bool use_sse = false;
14198   bool vector_mode = VECTOR_MODE_P (mode);
14199   enum machine_mode elt_mode = mode;
14200
14201   if (vector_mode)
14202     {
14203       elt_mode = GET_MODE_INNER (mode);
14204       use_sse = true;
14205     }
14206   else if (mode == TFmode)
14207     use_sse = true;
14208   else if (TARGET_SSE_MATH)
14209     use_sse = SSE_FLOAT_MODE_P (mode);
14210
14211   /* NEG and ABS performed with SSE use bitwise mask operations.
14212      Create the appropriate mask now.  */
14213   if (use_sse)
14214     mask = ix86_build_signbit_mask (elt_mode, vector_mode, code == ABS);
14215   else
14216     mask = NULL_RTX;
14217
14218   dst = operands[0];
14219   src = operands[1];
14220
14221   if (vector_mode)
14222     {
14223       set = gen_rtx_fmt_ee (code == NEG ? XOR : AND, mode, src, mask);
14224       set = gen_rtx_SET (VOIDmode, dst, set);
14225       emit_insn (set);
14226     }
14227   else
14228     {
14229       set = gen_rtx_fmt_e (code, mode, src);
14230       set = gen_rtx_SET (VOIDmode, dst, set);
14231       if (mask)
14232         {
14233           use = gen_rtx_USE (VOIDmode, mask);
14234           clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
14235           emit_insn (gen_rtx_PARALLEL (VOIDmode,
14236                                        gen_rtvec (3, set, use, clob)));
14237         }
14238       else
14239         emit_insn (set);
14240     }
14241 }
14242
14243 /* Expand a copysign operation.  Special case operand 0 being a constant.  */
14244
14245 void
14246 ix86_expand_copysign (rtx operands[])
14247 {
14248   enum machine_mode mode;
14249   rtx dest, op0, op1, mask, nmask;
14250
14251   dest = operands[0];
14252   op0 = operands[1];
14253   op1 = operands[2];
14254
14255   mode = GET_MODE (dest);
14256
14257   if (GET_CODE (op0) == CONST_DOUBLE)
14258     {
14259       rtx (*copysign_insn)(rtx, rtx, rtx, rtx);
14260
14261       if (real_isneg (CONST_DOUBLE_REAL_VALUE (op0)))
14262         op0 = simplify_unary_operation (ABS, mode, op0, mode);
14263
14264       if (mode == SFmode || mode == DFmode)
14265         {
14266           enum machine_mode vmode;
14267
14268           vmode = mode == SFmode ? V4SFmode : V2DFmode;
14269
14270           if (op0 == CONST0_RTX (mode))
14271             op0 = CONST0_RTX (vmode);
14272           else
14273             {
14274               rtx v = ix86_build_const_vector (mode, false, op0);
14275
14276               op0 = force_reg (vmode, v);
14277             }
14278         }
14279       else if (op0 != CONST0_RTX (mode))
14280         op0 = force_reg (mode, op0);
14281
14282       mask = ix86_build_signbit_mask (mode, 0, 0);
14283
14284       if (mode == SFmode)
14285         copysign_insn = gen_copysignsf3_const;
14286       else if (mode == DFmode)
14287         copysign_insn = gen_copysigndf3_const;
14288       else
14289         copysign_insn = gen_copysigntf3_const;
14290
14291         emit_insn (copysign_insn (dest, op0, op1, mask));
14292     }
14293   else
14294     {
14295       rtx (*copysign_insn)(rtx, rtx, rtx, rtx, rtx, rtx);
14296
14297       nmask = ix86_build_signbit_mask (mode, 0, 1);
14298       mask = ix86_build_signbit_mask (mode, 0, 0);
14299
14300       if (mode == SFmode)
14301         copysign_insn = gen_copysignsf3_var;
14302       else if (mode == DFmode)
14303         copysign_insn = gen_copysigndf3_var;
14304       else
14305         copysign_insn = gen_copysigntf3_var;
14306
14307       emit_insn (copysign_insn (dest, NULL_RTX, op0, op1, nmask, mask));
14308     }
14309 }
14310
14311 /* Deconstruct a copysign operation into bit masks.  Operand 0 is known to
14312    be a constant, and so has already been expanded into a vector constant.  */
14313
14314 void
14315 ix86_split_copysign_const (rtx operands[])
14316 {
14317   enum machine_mode mode, vmode;
14318   rtx dest, op0, mask, x;
14319
14320   dest = operands[0];
14321   op0 = operands[1];
14322   mask = operands[3];
14323
14324   mode = GET_MODE (dest);
14325   vmode = GET_MODE (mask);
14326
14327   dest = simplify_gen_subreg (vmode, dest, mode, 0);
14328   x = gen_rtx_AND (vmode, dest, mask);
14329   emit_insn (gen_rtx_SET (VOIDmode, dest, x));
14330
14331   if (op0 != CONST0_RTX (vmode))
14332     {
14333       x = gen_rtx_IOR (vmode, dest, op0);
14334       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
14335     }
14336 }
14337
14338 /* Deconstruct a copysign operation into bit masks.  Operand 0 is variable,
14339    so we have to do two masks.  */
14340
14341 void
14342 ix86_split_copysign_var (rtx operands[])
14343 {
14344   enum machine_mode mode, vmode;
14345   rtx dest, scratch, op0, op1, mask, nmask, x;
14346
14347   dest = operands[0];
14348   scratch = operands[1];
14349   op0 = operands[2];
14350   op1 = operands[3];
14351   nmask = operands[4];
14352   mask = operands[5];
14353
14354   mode = GET_MODE (dest);
14355   vmode = GET_MODE (mask);
14356
14357   if (rtx_equal_p (op0, op1))
14358     {
14359       /* Shouldn't happen often (it's useless, obviously), but when it does
14360          we'd generate incorrect code if we continue below.  */
14361       emit_move_insn (dest, op0);
14362       return;
14363     }
14364
14365   if (REG_P (mask) && REGNO (dest) == REGNO (mask))     /* alternative 0 */
14366     {
14367       gcc_assert (REGNO (op1) == REGNO (scratch));
14368
14369       x = gen_rtx_AND (vmode, scratch, mask);
14370       emit_insn (gen_rtx_SET (VOIDmode, scratch, x));
14371
14372       dest = mask;
14373       op0 = simplify_gen_subreg (vmode, op0, mode, 0);
14374       x = gen_rtx_NOT (vmode, dest);
14375       x = gen_rtx_AND (vmode, x, op0);
14376       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
14377     }
14378   else
14379     {
14380       if (REGNO (op1) == REGNO (scratch))               /* alternative 1,3 */
14381         {
14382           x = gen_rtx_AND (vmode, scratch, mask);
14383         }
14384       else                                              /* alternative 2,4 */
14385         {
14386           gcc_assert (REGNO (mask) == REGNO (scratch));
14387           op1 = simplify_gen_subreg (vmode, op1, mode, 0);
14388           x = gen_rtx_AND (vmode, scratch, op1);
14389         }
14390       emit_insn (gen_rtx_SET (VOIDmode, scratch, x));
14391
14392       if (REGNO (op0) == REGNO (dest))                  /* alternative 1,2 */
14393         {
14394           dest = simplify_gen_subreg (vmode, op0, mode, 0);
14395           x = gen_rtx_AND (vmode, dest, nmask);
14396         }
14397       else                                              /* alternative 3,4 */
14398         {
14399           gcc_assert (REGNO (nmask) == REGNO (dest));
14400           dest = nmask;
14401           op0 = simplify_gen_subreg (vmode, op0, mode, 0);
14402           x = gen_rtx_AND (vmode, dest, op0);
14403         }
14404       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
14405     }
14406
14407   x = gen_rtx_IOR (vmode, dest, scratch);
14408   emit_insn (gen_rtx_SET (VOIDmode, dest, x));
14409 }
14410
14411 /* Return TRUE or FALSE depending on whether the first SET in INSN
14412    has source and destination with matching CC modes, and that the
14413    CC mode is at least as constrained as REQ_MODE.  */
14414
14415 int
14416 ix86_match_ccmode (rtx insn, enum machine_mode req_mode)
14417 {
14418   rtx set;
14419   enum machine_mode set_mode;
14420
14421   set = PATTERN (insn);
14422   if (GET_CODE (set) == PARALLEL)
14423     set = XVECEXP (set, 0, 0);
14424   gcc_assert (GET_CODE (set) == SET);
14425   gcc_assert (GET_CODE (SET_SRC (set)) == COMPARE);
14426
14427   set_mode = GET_MODE (SET_DEST (set));
14428   switch (set_mode)
14429     {
14430     case CCNOmode:
14431       if (req_mode != CCNOmode
14432           && (req_mode != CCmode
14433               || XEXP (SET_SRC (set), 1) != const0_rtx))
14434         return 0;
14435       break;
14436     case CCmode:
14437       if (req_mode == CCGCmode)
14438         return 0;
14439       /* FALLTHRU */
14440     case CCGCmode:
14441       if (req_mode == CCGOCmode || req_mode == CCNOmode)
14442         return 0;
14443       /* FALLTHRU */
14444     case CCGOCmode:
14445       if (req_mode == CCZmode)
14446         return 0;
14447       /* FALLTHRU */
14448     case CCAmode:
14449     case CCCmode:
14450     case CCOmode:
14451     case CCSmode:
14452     case CCZmode:
14453       break;
14454
14455     default:
14456       gcc_unreachable ();
14457     }
14458
14459   return (GET_MODE (SET_SRC (set)) == set_mode);
14460 }
14461
14462 /* Generate insn patterns to do an integer compare of OPERANDS.  */
14463
14464 static rtx
14465 ix86_expand_int_compare (enum rtx_code code, rtx op0, rtx op1)
14466 {
14467   enum machine_mode cmpmode;
14468   rtx tmp, flags;
14469
14470   cmpmode = SELECT_CC_MODE (code, op0, op1);
14471   flags = gen_rtx_REG (cmpmode, FLAGS_REG);
14472
14473   /* This is very simple, but making the interface the same as in the
14474      FP case makes the rest of the code easier.  */
14475   tmp = gen_rtx_COMPARE (cmpmode, op0, op1);
14476   emit_insn (gen_rtx_SET (VOIDmode, flags, tmp));
14477
14478   /* Return the test that should be put into the flags user, i.e.
14479      the bcc, scc, or cmov instruction.  */
14480   return gen_rtx_fmt_ee (code, VOIDmode, flags, const0_rtx);
14481 }
14482
14483 /* Figure out whether to use ordered or unordered fp comparisons.
14484    Return the appropriate mode to use.  */
14485
14486 enum machine_mode
14487 ix86_fp_compare_mode (enum rtx_code code ATTRIBUTE_UNUSED)
14488 {
14489   /* ??? In order to make all comparisons reversible, we do all comparisons
14490      non-trapping when compiling for IEEE.  Once gcc is able to distinguish
14491      all forms trapping and nontrapping comparisons, we can make inequality
14492      comparisons trapping again, since it results in better code when using
14493      FCOM based compares.  */
14494   return TARGET_IEEE_FP ? CCFPUmode : CCFPmode;
14495 }
14496
14497 enum machine_mode
14498 ix86_cc_mode (enum rtx_code code, rtx op0, rtx op1)
14499 {
14500   enum machine_mode mode = GET_MODE (op0);
14501
14502   if (SCALAR_FLOAT_MODE_P (mode))
14503     {
14504       gcc_assert (!DECIMAL_FLOAT_MODE_P (mode));
14505       return ix86_fp_compare_mode (code);
14506     }
14507
14508   switch (code)
14509     {
14510       /* Only zero flag is needed.  */
14511     case EQ:                    /* ZF=0 */
14512     case NE:                    /* ZF!=0 */
14513       return CCZmode;
14514       /* Codes needing carry flag.  */
14515     case GEU:                   /* CF=0 */
14516     case LTU:                   /* CF=1 */
14517       /* Detect overflow checks.  They need just the carry flag.  */
14518       if (GET_CODE (op0) == PLUS
14519           && rtx_equal_p (op1, XEXP (op0, 0)))
14520         return CCCmode;
14521       else
14522         return CCmode;
14523     case GTU:                   /* CF=0 & ZF=0 */
14524     case LEU:                   /* CF=1 | ZF=1 */
14525       /* Detect overflow checks.  They need just the carry flag.  */
14526       if (GET_CODE (op0) == MINUS
14527           && rtx_equal_p (op1, XEXP (op0, 0)))
14528         return CCCmode;
14529       else
14530         return CCmode;
14531       /* Codes possibly doable only with sign flag when
14532          comparing against zero.  */
14533     case GE:                    /* SF=OF   or   SF=0 */
14534     case LT:                    /* SF<>OF  or   SF=1 */
14535       if (op1 == const0_rtx)
14536         return CCGOCmode;
14537       else
14538         /* For other cases Carry flag is not required.  */
14539         return CCGCmode;
14540       /* Codes doable only with sign flag when comparing
14541          against zero, but we miss jump instruction for it
14542          so we need to use relational tests against overflow
14543          that thus needs to be zero.  */
14544     case GT:                    /* ZF=0 & SF=OF */
14545     case LE:                    /* ZF=1 | SF<>OF */
14546       if (op1 == const0_rtx)
14547         return CCNOmode;
14548       else
14549         return CCGCmode;
14550       /* strcmp pattern do (use flags) and combine may ask us for proper
14551          mode.  */
14552     case USE:
14553       return CCmode;
14554     default:
14555       gcc_unreachable ();
14556     }
14557 }
14558
14559 /* Return the fixed registers used for condition codes.  */
14560
14561 static bool
14562 ix86_fixed_condition_code_regs (unsigned int *p1, unsigned int *p2)
14563 {
14564   *p1 = FLAGS_REG;
14565   *p2 = FPSR_REG;
14566   return true;
14567 }
14568
14569 /* If two condition code modes are compatible, return a condition code
14570    mode which is compatible with both.  Otherwise, return
14571    VOIDmode.  */
14572
14573 static enum machine_mode
14574 ix86_cc_modes_compatible (enum machine_mode m1, enum machine_mode m2)
14575 {
14576   if (m1 == m2)
14577     return m1;
14578
14579   if (GET_MODE_CLASS (m1) != MODE_CC || GET_MODE_CLASS (m2) != MODE_CC)
14580     return VOIDmode;
14581
14582   if ((m1 == CCGCmode && m2 == CCGOCmode)
14583       || (m1 == CCGOCmode && m2 == CCGCmode))
14584     return CCGCmode;
14585
14586   switch (m1)
14587     {
14588     default:
14589       gcc_unreachable ();
14590
14591     case CCmode:
14592     case CCGCmode:
14593     case CCGOCmode:
14594     case CCNOmode:
14595     case CCAmode:
14596     case CCCmode:
14597     case CCOmode:
14598     case CCSmode:
14599     case CCZmode:
14600       switch (m2)
14601         {
14602         default:
14603           return VOIDmode;
14604
14605         case CCmode:
14606         case CCGCmode:
14607         case CCGOCmode:
14608         case CCNOmode:
14609         case CCAmode:
14610         case CCCmode:
14611         case CCOmode:
14612         case CCSmode:
14613         case CCZmode:
14614           return CCmode;
14615         }
14616
14617     case CCFPmode:
14618     case CCFPUmode:
14619       /* These are only compatible with themselves, which we already
14620          checked above.  */
14621       return VOIDmode;
14622     }
14623 }
14624
14625
14626 /* Return a comparison we can do and that it is equivalent to 
14627    swap_condition (code) apart possibly from orderedness.
14628    But, never change orderedness if TARGET_IEEE_FP, returning
14629    UNKNOWN in that case if necessary.  */
14630
14631 static enum rtx_code
14632 ix86_fp_swap_condition (enum rtx_code code)
14633 {
14634   switch (code)
14635     {
14636     case GT:                   /* GTU - CF=0 & ZF=0 */
14637       return TARGET_IEEE_FP ? UNKNOWN : UNLT;
14638     case GE:                   /* GEU - CF=0 */
14639       return TARGET_IEEE_FP ? UNKNOWN : UNLE;
14640     case UNLT:                 /* LTU - CF=1 */
14641       return TARGET_IEEE_FP ? UNKNOWN : GT;
14642     case UNLE:                 /* LEU - CF=1 | ZF=1 */
14643       return TARGET_IEEE_FP ? UNKNOWN : GE;
14644     default:
14645       return swap_condition (code);
14646     }
14647 }
14648
14649 /* Return cost of comparison CODE using the best strategy for performance.
14650    All following functions do use number of instructions as a cost metrics.
14651    In future this should be tweaked to compute bytes for optimize_size and
14652    take into account performance of various instructions on various CPUs.  */
14653
14654 static int
14655 ix86_fp_comparison_cost (enum rtx_code code)
14656 {
14657   int arith_cost;
14658
14659   /* The cost of code using bit-twiddling on %ah.  */
14660   switch (code)
14661     {
14662     case UNLE:
14663     case UNLT:
14664     case LTGT:
14665     case GT:
14666     case GE:
14667     case UNORDERED:
14668     case ORDERED:
14669     case UNEQ:
14670       arith_cost = 4;
14671       break;
14672     case LT:
14673     case NE:
14674     case EQ:
14675     case UNGE:
14676       arith_cost = TARGET_IEEE_FP ? 5 : 4;
14677       break;
14678     case LE:
14679     case UNGT:
14680       arith_cost = TARGET_IEEE_FP ? 6 : 4;
14681       break;
14682     default:
14683       gcc_unreachable ();
14684     }
14685
14686   switch (ix86_fp_comparison_strategy (code))
14687     {
14688     case IX86_FPCMP_COMI:
14689       return arith_cost > 4 ? 3 : 2;
14690     case IX86_FPCMP_SAHF:
14691       return arith_cost > 4 ? 4 : 3;
14692     default:
14693       return arith_cost;
14694     }
14695 }
14696
14697 /* Return strategy to use for floating-point.  We assume that fcomi is always
14698    preferrable where available, since that is also true when looking at size
14699    (2 bytes, vs. 3 for fnstsw+sahf and at least 5 for fnstsw+test).  */
14700
14701 enum ix86_fpcmp_strategy
14702 ix86_fp_comparison_strategy (enum rtx_code code ATTRIBUTE_UNUSED)
14703 {
14704   /* Do fcomi/sahf based test when profitable.  */
14705
14706   if (TARGET_CMOVE)
14707     return IX86_FPCMP_COMI;
14708
14709   if (TARGET_SAHF && (TARGET_USE_SAHF || optimize_function_for_size_p (cfun)))
14710     return IX86_FPCMP_SAHF;
14711
14712   return IX86_FPCMP_ARITH;
14713 }
14714
14715 /* Swap, force into registers, or otherwise massage the two operands
14716    to a fp comparison.  The operands are updated in place; the new
14717    comparison code is returned.  */
14718
14719 static enum rtx_code
14720 ix86_prepare_fp_compare_args (enum rtx_code code, rtx *pop0, rtx *pop1)
14721 {
14722   enum machine_mode fpcmp_mode = ix86_fp_compare_mode (code);
14723   rtx op0 = *pop0, op1 = *pop1;
14724   enum machine_mode op_mode = GET_MODE (op0);
14725   int is_sse = TARGET_SSE_MATH && SSE_FLOAT_MODE_P (op_mode);
14726
14727   /* All of the unordered compare instructions only work on registers.
14728      The same is true of the fcomi compare instructions.  The XFmode
14729      compare instructions require registers except when comparing
14730      against zero or when converting operand 1 from fixed point to
14731      floating point.  */
14732
14733   if (!is_sse
14734       && (fpcmp_mode == CCFPUmode
14735           || (op_mode == XFmode
14736               && ! (standard_80387_constant_p (op0) == 1
14737                     || standard_80387_constant_p (op1) == 1)
14738               && GET_CODE (op1) != FLOAT)
14739           || ix86_fp_comparison_strategy (code) == IX86_FPCMP_COMI))
14740     {
14741       op0 = force_reg (op_mode, op0);
14742       op1 = force_reg (op_mode, op1);
14743     }
14744   else
14745     {
14746       /* %%% We only allow op1 in memory; op0 must be st(0).  So swap
14747          things around if they appear profitable, otherwise force op0
14748          into a register.  */
14749
14750       if (standard_80387_constant_p (op0) == 0
14751           || (MEM_P (op0)
14752               && ! (standard_80387_constant_p (op1) == 0
14753                     || MEM_P (op1))))
14754         {
14755           enum rtx_code new_code = ix86_fp_swap_condition (code);
14756           if (new_code != UNKNOWN)
14757             {
14758               rtx tmp;
14759               tmp = op0, op0 = op1, op1 = tmp;
14760               code = new_code;
14761             }
14762         }
14763
14764       if (!REG_P (op0))
14765         op0 = force_reg (op_mode, op0);
14766
14767       if (CONSTANT_P (op1))
14768         {
14769           int tmp = standard_80387_constant_p (op1);
14770           if (tmp == 0)
14771             op1 = validize_mem (force_const_mem (op_mode, op1));
14772           else if (tmp == 1)
14773             {
14774               if (TARGET_CMOVE)
14775                 op1 = force_reg (op_mode, op1);
14776             }
14777           else
14778             op1 = force_reg (op_mode, op1);
14779         }
14780     }
14781
14782   /* Try to rearrange the comparison to make it cheaper.  */
14783   if (ix86_fp_comparison_cost (code)
14784       > ix86_fp_comparison_cost (swap_condition (code))
14785       && (REG_P (op1) || can_create_pseudo_p ()))
14786     {
14787       rtx tmp;
14788       tmp = op0, op0 = op1, op1 = tmp;
14789       code = swap_condition (code);
14790       if (!REG_P (op0))
14791         op0 = force_reg (op_mode, op0);
14792     }
14793
14794   *pop0 = op0;
14795   *pop1 = op1;
14796   return code;
14797 }
14798
14799 /* Convert comparison codes we use to represent FP comparison to integer
14800    code that will result in proper branch.  Return UNKNOWN if no such code
14801    is available.  */
14802
14803 enum rtx_code
14804 ix86_fp_compare_code_to_integer (enum rtx_code code)
14805 {
14806   switch (code)
14807     {
14808     case GT:
14809       return GTU;
14810     case GE:
14811       return GEU;
14812     case ORDERED:
14813     case UNORDERED:
14814       return code;
14815       break;
14816     case UNEQ:
14817       return EQ;
14818       break;
14819     case UNLT:
14820       return LTU;
14821       break;
14822     case UNLE:
14823       return LEU;
14824       break;
14825     case LTGT:
14826       return NE;
14827       break;
14828     default:
14829       return UNKNOWN;
14830     }
14831 }
14832
14833 /* Generate insn patterns to do a floating point compare of OPERANDS.  */
14834
14835 static rtx
14836 ix86_expand_fp_compare (enum rtx_code code, rtx op0, rtx op1, rtx scratch)
14837 {
14838   enum machine_mode fpcmp_mode, intcmp_mode;
14839   rtx tmp, tmp2;
14840
14841   fpcmp_mode = ix86_fp_compare_mode (code);
14842   code = ix86_prepare_fp_compare_args (code, &op0, &op1);
14843
14844   /* Do fcomi/sahf based test when profitable.  */
14845   switch (ix86_fp_comparison_strategy (code))
14846     {
14847     case IX86_FPCMP_COMI:
14848       intcmp_mode = fpcmp_mode;
14849       tmp = gen_rtx_COMPARE (fpcmp_mode, op0, op1);
14850       tmp = gen_rtx_SET (VOIDmode, gen_rtx_REG (fpcmp_mode, FLAGS_REG),
14851                          tmp);
14852       emit_insn (tmp);
14853       break;
14854
14855     case IX86_FPCMP_SAHF:
14856       intcmp_mode = fpcmp_mode;
14857       tmp = gen_rtx_COMPARE (fpcmp_mode, op0, op1);
14858       tmp = gen_rtx_SET (VOIDmode, gen_rtx_REG (fpcmp_mode, FLAGS_REG),
14859                          tmp);
14860
14861       if (!scratch)
14862         scratch = gen_reg_rtx (HImode);
14863       tmp2 = gen_rtx_CLOBBER (VOIDmode, scratch);
14864       emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, tmp, tmp2)));
14865       break;
14866
14867     case IX86_FPCMP_ARITH:
14868       /* Sadness wrt reg-stack pops killing fpsr -- gotta get fnstsw first.  */
14869       tmp = gen_rtx_COMPARE (fpcmp_mode, op0, op1);
14870       tmp2 = gen_rtx_UNSPEC (HImode, gen_rtvec (1, tmp), UNSPEC_FNSTSW);
14871       if (!scratch)
14872         scratch = gen_reg_rtx (HImode);
14873       emit_insn (gen_rtx_SET (VOIDmode, scratch, tmp2));
14874
14875       /* In the unordered case, we have to check C2 for NaN's, which
14876          doesn't happen to work out to anything nice combination-wise.
14877          So do some bit twiddling on the value we've got in AH to come
14878          up with an appropriate set of condition codes.  */
14879
14880       intcmp_mode = CCNOmode;
14881       switch (code)
14882         {
14883         case GT:
14884         case UNGT:
14885           if (code == GT || !TARGET_IEEE_FP)
14886             {
14887               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x45)));
14888               code = EQ;
14889             }
14890           else
14891             {
14892               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
14893               emit_insn (gen_addqi_ext_1 (scratch, scratch, constm1_rtx));
14894               emit_insn (gen_cmpqi_ext_3 (scratch, GEN_INT (0x44)));
14895               intcmp_mode = CCmode;
14896               code = GEU;
14897             }
14898           break;
14899         case LT:
14900         case UNLT:
14901           if (code == LT && TARGET_IEEE_FP)
14902             {
14903               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
14904               emit_insn (gen_cmpqi_ext_3 (scratch, const1_rtx));
14905               intcmp_mode = CCmode;
14906               code = EQ;
14907             }
14908           else
14909             {
14910               emit_insn (gen_testqi_ext_ccno_0 (scratch, const1_rtx));
14911               code = NE;
14912             }
14913           break;
14914         case GE:
14915         case UNGE:
14916           if (code == GE || !TARGET_IEEE_FP)
14917             {
14918               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x05)));
14919               code = EQ;
14920             }
14921           else
14922             {
14923               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
14924               emit_insn (gen_xorqi_cc_ext_1 (scratch, scratch, const1_rtx));
14925               code = NE;
14926             }
14927           break;
14928         case LE:
14929         case UNLE:
14930           if (code == LE && TARGET_IEEE_FP)
14931             {
14932               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
14933               emit_insn (gen_addqi_ext_1 (scratch, scratch, constm1_rtx));
14934               emit_insn (gen_cmpqi_ext_3 (scratch, GEN_INT (0x40)));
14935               intcmp_mode = CCmode;
14936               code = LTU;
14937             }
14938           else
14939             {
14940               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x45)));
14941               code = NE;
14942             }
14943           break;
14944         case EQ:
14945         case UNEQ:
14946           if (code == EQ && TARGET_IEEE_FP)
14947             {
14948               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
14949               emit_insn (gen_cmpqi_ext_3 (scratch, GEN_INT (0x40)));
14950               intcmp_mode = CCmode;
14951               code = EQ;
14952             }
14953           else
14954             {
14955               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x40)));
14956               code = NE;
14957             }
14958           break;
14959         case NE:
14960         case LTGT:
14961           if (code == NE && TARGET_IEEE_FP)
14962             {
14963               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
14964               emit_insn (gen_xorqi_cc_ext_1 (scratch, scratch,
14965                                              GEN_INT (0x40)));
14966               code = NE;
14967             }
14968           else
14969             {
14970               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x40)));
14971               code = EQ;
14972             }
14973           break;
14974
14975         case UNORDERED:
14976           emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x04)));
14977           code = NE;
14978           break;
14979         case ORDERED:
14980           emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x04)));
14981           code = EQ;
14982           break;
14983
14984         default:
14985           gcc_unreachable ();
14986         }
14987         break;
14988
14989     default:
14990       gcc_unreachable();
14991     }
14992
14993   /* Return the test that should be put into the flags user, i.e.
14994      the bcc, scc, or cmov instruction.  */
14995   return gen_rtx_fmt_ee (code, VOIDmode,
14996                          gen_rtx_REG (intcmp_mode, FLAGS_REG),
14997                          const0_rtx);
14998 }
14999
15000 rtx
15001 ix86_expand_compare (enum rtx_code code)
15002 {
15003   rtx op0, op1, ret;
15004   op0 = ix86_compare_op0;
15005   op1 = ix86_compare_op1;
15006
15007   if (GET_MODE_CLASS (GET_MODE (ix86_compare_op0)) == MODE_CC)
15008     ret = gen_rtx_fmt_ee (code, VOIDmode, ix86_compare_op0, ix86_compare_op1);
15009
15010   else if (SCALAR_FLOAT_MODE_P (GET_MODE (op0)))
15011     {
15012       gcc_assert (!DECIMAL_FLOAT_MODE_P (GET_MODE (op0)));
15013       ret = ix86_expand_fp_compare (code, op0, op1, NULL_RTX);
15014     }
15015   else
15016     ret = ix86_expand_int_compare (code, op0, op1);
15017
15018   return ret;
15019 }
15020
15021 void
15022 ix86_expand_branch (enum rtx_code code, rtx label)
15023 {
15024   rtx tmp;
15025
15026   switch (GET_MODE (ix86_compare_op0))
15027     {
15028     case SFmode:
15029     case DFmode:
15030     case XFmode:
15031     case QImode:
15032     case HImode:
15033     case SImode:
15034       simple:
15035       tmp = ix86_expand_compare (code);
15036       tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp,
15037                                   gen_rtx_LABEL_REF (VOIDmode, label),
15038                                   pc_rtx);
15039       emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, tmp));
15040       return;
15041
15042     case DImode:
15043       if (TARGET_64BIT)
15044         goto simple;
15045     case TImode:
15046       /* Expand DImode branch into multiple compare+branch.  */
15047       {
15048         rtx lo[2], hi[2], label2;
15049         enum rtx_code code1, code2, code3;
15050         enum machine_mode submode;
15051
15052         if (CONSTANT_P (ix86_compare_op0) && ! CONSTANT_P (ix86_compare_op1))
15053           {
15054             tmp = ix86_compare_op0;
15055             ix86_compare_op0 = ix86_compare_op1;
15056             ix86_compare_op1 = tmp;
15057             code = swap_condition (code);
15058           }
15059         if (GET_MODE (ix86_compare_op0) == DImode)
15060           {
15061             split_di (&ix86_compare_op0, 1, lo+0, hi+0);
15062             split_di (&ix86_compare_op1, 1, lo+1, hi+1);
15063             submode = SImode;
15064           }
15065         else
15066           {
15067             split_ti (&ix86_compare_op0, 1, lo+0, hi+0);
15068             split_ti (&ix86_compare_op1, 1, lo+1, hi+1);
15069             submode = DImode;
15070           }
15071
15072         /* When comparing for equality, we can use (hi0^hi1)|(lo0^lo1) to
15073            avoid two branches.  This costs one extra insn, so disable when
15074            optimizing for size.  */
15075
15076         if ((code == EQ || code == NE)
15077             && (!optimize_insn_for_size_p ()
15078                 || hi[1] == const0_rtx || lo[1] == const0_rtx))
15079           {
15080             rtx xor0, xor1;
15081
15082             xor1 = hi[0];
15083             if (hi[1] != const0_rtx)
15084               xor1 = expand_binop (submode, xor_optab, xor1, hi[1],
15085                                    NULL_RTX, 0, OPTAB_WIDEN);
15086
15087             xor0 = lo[0];
15088             if (lo[1] != const0_rtx)
15089               xor0 = expand_binop (submode, xor_optab, xor0, lo[1],
15090                                    NULL_RTX, 0, OPTAB_WIDEN);
15091
15092             tmp = expand_binop (submode, ior_optab, xor1, xor0,
15093                                 NULL_RTX, 0, OPTAB_WIDEN);
15094
15095             ix86_compare_op0 = tmp;
15096             ix86_compare_op1 = const0_rtx;
15097             ix86_expand_branch (code, label);
15098             return;
15099           }
15100
15101         /* Otherwise, if we are doing less-than or greater-or-equal-than,
15102            op1 is a constant and the low word is zero, then we can just
15103            examine the high word.  Similarly for low word -1 and
15104            less-or-equal-than or greater-than.  */
15105
15106         if (CONST_INT_P (hi[1]))
15107           switch (code)
15108             {
15109             case LT: case LTU: case GE: case GEU:
15110               if (lo[1] == const0_rtx)
15111                 {
15112                   ix86_compare_op0 = hi[0];
15113                   ix86_compare_op1 = hi[1];
15114                   ix86_expand_branch (code, label);
15115                   return;
15116                 }
15117               break;
15118             case LE: case LEU: case GT: case GTU:
15119               if (lo[1] == constm1_rtx)
15120                 {
15121                   ix86_compare_op0 = hi[0];
15122                   ix86_compare_op1 = hi[1];
15123                   ix86_expand_branch (code, label);
15124                   return;
15125                 }
15126               break;
15127             default:
15128               break;
15129             }
15130
15131         /* Otherwise, we need two or three jumps.  */
15132
15133         label2 = gen_label_rtx ();
15134
15135         code1 = code;
15136         code2 = swap_condition (code);
15137         code3 = unsigned_condition (code);
15138
15139         switch (code)
15140           {
15141           case LT: case GT: case LTU: case GTU:
15142             break;
15143
15144           case LE:   code1 = LT;  code2 = GT;  break;
15145           case GE:   code1 = GT;  code2 = LT;  break;
15146           case LEU:  code1 = LTU; code2 = GTU; break;
15147           case GEU:  code1 = GTU; code2 = LTU; break;
15148
15149           case EQ:   code1 = UNKNOWN; code2 = NE;  break;
15150           case NE:   code2 = UNKNOWN; break;
15151
15152           default:
15153             gcc_unreachable ();
15154           }
15155
15156         /*
15157          * a < b =>
15158          *    if (hi(a) < hi(b)) goto true;
15159          *    if (hi(a) > hi(b)) goto false;
15160          *    if (lo(a) < lo(b)) goto true;
15161          *  false:
15162          */
15163
15164         ix86_compare_op0 = hi[0];
15165         ix86_compare_op1 = hi[1];
15166
15167         if (code1 != UNKNOWN)
15168           ix86_expand_branch (code1, label);
15169         if (code2 != UNKNOWN)
15170           ix86_expand_branch (code2, label2);
15171
15172         ix86_compare_op0 = lo[0];
15173         ix86_compare_op1 = lo[1];
15174         ix86_expand_branch (code3, label);
15175
15176         if (code2 != UNKNOWN)
15177           emit_label (label2);
15178         return;
15179       }
15180
15181     default:
15182       /* If we have already emitted a compare insn, go straight to simple.
15183          ix86_expand_compare won't emit anything if ix86_compare_emitted
15184          is non NULL.  */
15185       gcc_assert (GET_MODE_CLASS (GET_MODE (ix86_compare_op0)) == MODE_CC);
15186       goto simple;
15187     }
15188 }
15189
15190 /* Split branch based on floating point condition.  */
15191 void
15192 ix86_split_fp_branch (enum rtx_code code, rtx op1, rtx op2,
15193                       rtx target1, rtx target2, rtx tmp, rtx pushed)
15194 {
15195   rtx condition;
15196   rtx i;
15197
15198   if (target2 != pc_rtx)
15199     {
15200       rtx tmp = target2;
15201       code = reverse_condition_maybe_unordered (code);
15202       target2 = target1;
15203       target1 = tmp;
15204     }
15205
15206   condition = ix86_expand_fp_compare (code, op1, op2,
15207                                       tmp);
15208
15209   /* Remove pushed operand from stack.  */
15210   if (pushed)
15211     ix86_free_from_memory (GET_MODE (pushed));
15212
15213   i = emit_jump_insn (gen_rtx_SET
15214                       (VOIDmode, pc_rtx,
15215                        gen_rtx_IF_THEN_ELSE (VOIDmode,
15216                                              condition, target1, target2)));
15217   if (split_branch_probability >= 0)
15218     add_reg_note (i, REG_BR_PROB, GEN_INT (split_branch_probability));
15219 }
15220
15221 void
15222 ix86_expand_setcc (enum rtx_code code, rtx dest)
15223 {
15224   rtx ret;
15225
15226   gcc_assert (GET_MODE (dest) == QImode);
15227
15228   ret = ix86_expand_compare (code);
15229   PUT_MODE (ret, QImode);
15230   emit_insn (gen_rtx_SET (VOIDmode, dest, ret));
15231 }
15232
15233 /* Expand comparison setting or clearing carry flag.  Return true when
15234    successful and set pop for the operation.  */
15235 static bool
15236 ix86_expand_carry_flag_compare (enum rtx_code code, rtx op0, rtx op1, rtx *pop)
15237 {
15238   enum machine_mode mode =
15239     GET_MODE (op0) != VOIDmode ? GET_MODE (op0) : GET_MODE (op1);
15240
15241   /* Do not handle DImode compares that go through special path.  */
15242   if (mode == (TARGET_64BIT ? TImode : DImode))
15243     return false;
15244
15245   if (SCALAR_FLOAT_MODE_P (mode))
15246     {
15247       rtx compare_op, compare_seq;
15248
15249       gcc_assert (!DECIMAL_FLOAT_MODE_P (mode));
15250
15251       /* Shortcut:  following common codes never translate
15252          into carry flag compares.  */
15253       if (code == EQ || code == NE || code == UNEQ || code == LTGT
15254           || code == ORDERED || code == UNORDERED)
15255         return false;
15256
15257       /* These comparisons require zero flag; swap operands so they won't.  */
15258       if ((code == GT || code == UNLE || code == LE || code == UNGT)
15259           && !TARGET_IEEE_FP)
15260         {
15261           rtx tmp = op0;
15262           op0 = op1;
15263           op1 = tmp;
15264           code = swap_condition (code);
15265         }
15266
15267       /* Try to expand the comparison and verify that we end up with
15268          carry flag based comparison.  This fails to be true only when
15269          we decide to expand comparison using arithmetic that is not
15270          too common scenario.  */
15271       start_sequence ();
15272       compare_op = ix86_expand_fp_compare (code, op0, op1, NULL_RTX);
15273       compare_seq = get_insns ();
15274       end_sequence ();
15275
15276       if (GET_MODE (XEXP (compare_op, 0)) == CCFPmode
15277           || GET_MODE (XEXP (compare_op, 0)) == CCFPUmode)
15278         code = ix86_fp_compare_code_to_integer (GET_CODE (compare_op));
15279       else
15280         code = GET_CODE (compare_op);
15281
15282       if (code != LTU && code != GEU)
15283         return false;
15284
15285       emit_insn (compare_seq);
15286       *pop = compare_op;
15287       return true;
15288     }
15289
15290   if (!INTEGRAL_MODE_P (mode))
15291     return false;
15292
15293   switch (code)
15294     {
15295     case LTU:
15296     case GEU:
15297       break;
15298
15299     /* Convert a==0 into (unsigned)a<1.  */
15300     case EQ:
15301     case NE:
15302       if (op1 != const0_rtx)
15303         return false;
15304       op1 = const1_rtx;
15305       code = (code == EQ ? LTU : GEU);
15306       break;
15307
15308     /* Convert a>b into b<a or a>=b-1.  */
15309     case GTU:
15310     case LEU:
15311       if (CONST_INT_P (op1))
15312         {
15313           op1 = gen_int_mode (INTVAL (op1) + 1, GET_MODE (op0));
15314           /* Bail out on overflow.  We still can swap operands but that
15315              would force loading of the constant into register.  */
15316           if (op1 == const0_rtx
15317               || !x86_64_immediate_operand (op1, GET_MODE (op1)))
15318             return false;
15319           code = (code == GTU ? GEU : LTU);
15320         }
15321       else
15322         {
15323           rtx tmp = op1;
15324           op1 = op0;
15325           op0 = tmp;
15326           code = (code == GTU ? LTU : GEU);
15327         }
15328       break;
15329
15330     /* Convert a>=0 into (unsigned)a<0x80000000.  */
15331     case LT:
15332     case GE:
15333       if (mode == DImode || op1 != const0_rtx)
15334         return false;
15335       op1 = gen_int_mode (1 << (GET_MODE_BITSIZE (mode) - 1), mode);
15336       code = (code == LT ? GEU : LTU);
15337       break;
15338     case LE:
15339     case GT:
15340       if (mode == DImode || op1 != constm1_rtx)
15341         return false;
15342       op1 = gen_int_mode (1 << (GET_MODE_BITSIZE (mode) - 1), mode);
15343       code = (code == LE ? GEU : LTU);
15344       break;
15345
15346     default:
15347       return false;
15348     }
15349   /* Swapping operands may cause constant to appear as first operand.  */
15350   if (!nonimmediate_operand (op0, VOIDmode))
15351     {
15352       if (!can_create_pseudo_p ())
15353         return false;
15354       op0 = force_reg (mode, op0);
15355     }
15356   ix86_compare_op0 = op0;
15357   ix86_compare_op1 = op1;
15358   *pop = ix86_expand_compare (code);
15359   gcc_assert (GET_CODE (*pop) == LTU || GET_CODE (*pop) == GEU);
15360   return true;
15361 }
15362
15363 int
15364 ix86_expand_int_movcc (rtx operands[])
15365 {
15366   enum rtx_code code = GET_CODE (operands[1]), compare_code;
15367   rtx compare_seq, compare_op;
15368   enum machine_mode mode = GET_MODE (operands[0]);
15369   bool sign_bit_compare_p = false;;
15370
15371   start_sequence ();
15372   ix86_compare_op0 = XEXP (operands[1], 0);
15373   ix86_compare_op1 = XEXP (operands[1], 1);
15374   compare_op = ix86_expand_compare (code);
15375   compare_seq = get_insns ();
15376   end_sequence ();
15377
15378   compare_code = GET_CODE (compare_op);
15379
15380   if ((ix86_compare_op1 == const0_rtx && (code == GE || code == LT))
15381       || (ix86_compare_op1 == constm1_rtx && (code == GT || code == LE)))
15382     sign_bit_compare_p = true;
15383
15384   /* Don't attempt mode expansion here -- if we had to expand 5 or 6
15385      HImode insns, we'd be swallowed in word prefix ops.  */
15386
15387   if ((mode != HImode || TARGET_FAST_PREFIX)
15388       && (mode != (TARGET_64BIT ? TImode : DImode))
15389       && CONST_INT_P (operands[2])
15390       && CONST_INT_P (operands[3]))
15391     {
15392       rtx out = operands[0];
15393       HOST_WIDE_INT ct = INTVAL (operands[2]);
15394       HOST_WIDE_INT cf = INTVAL (operands[3]);
15395       HOST_WIDE_INT diff;
15396
15397       diff = ct - cf;
15398       /*  Sign bit compares are better done using shifts than we do by using
15399           sbb.  */
15400       if (sign_bit_compare_p
15401           || ix86_expand_carry_flag_compare (code, ix86_compare_op0,
15402                                              ix86_compare_op1, &compare_op))
15403         {
15404           /* Detect overlap between destination and compare sources.  */
15405           rtx tmp = out;
15406
15407           if (!sign_bit_compare_p)
15408             {
15409               bool fpcmp = false;
15410
15411               compare_code = GET_CODE (compare_op);
15412
15413               if (GET_MODE (XEXP (compare_op, 0)) == CCFPmode
15414                   || GET_MODE (XEXP (compare_op, 0)) == CCFPUmode)
15415                 {
15416                   fpcmp = true;
15417                   compare_code = ix86_fp_compare_code_to_integer (compare_code);
15418                 }
15419
15420               /* To simplify rest of code, restrict to the GEU case.  */
15421               if (compare_code == LTU)
15422                 {
15423                   HOST_WIDE_INT tmp = ct;
15424                   ct = cf;
15425                   cf = tmp;
15426                   compare_code = reverse_condition (compare_code);
15427                   code = reverse_condition (code);
15428                 }
15429               else
15430                 {
15431                   if (fpcmp)
15432                     PUT_CODE (compare_op,
15433                               reverse_condition_maybe_unordered
15434                                 (GET_CODE (compare_op)));
15435                   else
15436                     PUT_CODE (compare_op, reverse_condition (GET_CODE (compare_op)));
15437                 }
15438               diff = ct - cf;
15439
15440               if (reg_overlap_mentioned_p (out, ix86_compare_op0)
15441                   || reg_overlap_mentioned_p (out, ix86_compare_op1))
15442                 tmp = gen_reg_rtx (mode);
15443
15444               if (mode == DImode)
15445                 emit_insn (gen_x86_movdicc_0_m1 (tmp, compare_op));
15446               else
15447                 emit_insn (gen_x86_movsicc_0_m1 (gen_lowpart (SImode, tmp),
15448                                                  compare_op));
15449             }
15450           else
15451             {
15452               if (code == GT || code == GE)
15453                 code = reverse_condition (code);
15454               else
15455                 {
15456                   HOST_WIDE_INT tmp = ct;
15457                   ct = cf;
15458                   cf = tmp;
15459                   diff = ct - cf;
15460                 }
15461               tmp = emit_store_flag (tmp, code, ix86_compare_op0,
15462                                      ix86_compare_op1, VOIDmode, 0, -1);
15463             }
15464
15465           if (diff == 1)
15466             {
15467               /*
15468                * cmpl op0,op1
15469                * sbbl dest,dest
15470                * [addl dest, ct]
15471                *
15472                * Size 5 - 8.
15473                */
15474               if (ct)
15475                 tmp = expand_simple_binop (mode, PLUS,
15476                                            tmp, GEN_INT (ct),
15477                                            copy_rtx (tmp), 1, OPTAB_DIRECT);
15478             }
15479           else if (cf == -1)
15480             {
15481               /*
15482                * cmpl op0,op1
15483                * sbbl dest,dest
15484                * orl $ct, dest
15485                *
15486                * Size 8.
15487                */
15488               tmp = expand_simple_binop (mode, IOR,
15489                                          tmp, GEN_INT (ct),
15490                                          copy_rtx (tmp), 1, OPTAB_DIRECT);
15491             }
15492           else if (diff == -1 && ct)
15493             {
15494               /*
15495                * cmpl op0,op1
15496                * sbbl dest,dest
15497                * notl dest
15498                * [addl dest, cf]
15499                *
15500                * Size 8 - 11.
15501                */
15502               tmp = expand_simple_unop (mode, NOT, tmp, copy_rtx (tmp), 1);
15503               if (cf)
15504                 tmp = expand_simple_binop (mode, PLUS,
15505                                            copy_rtx (tmp), GEN_INT (cf),
15506                                            copy_rtx (tmp), 1, OPTAB_DIRECT);
15507             }
15508           else
15509             {
15510               /*
15511                * cmpl op0,op1
15512                * sbbl dest,dest
15513                * [notl dest]
15514                * andl cf - ct, dest
15515                * [addl dest, ct]
15516                *
15517                * Size 8 - 11.
15518                */
15519
15520               if (cf == 0)
15521                 {
15522                   cf = ct;
15523                   ct = 0;
15524                   tmp = expand_simple_unop (mode, NOT, tmp, copy_rtx (tmp), 1);
15525                 }
15526
15527               tmp = expand_simple_binop (mode, AND,
15528                                          copy_rtx (tmp),
15529                                          gen_int_mode (cf - ct, mode),
15530                                          copy_rtx (tmp), 1, OPTAB_DIRECT);
15531               if (ct)
15532                 tmp = expand_simple_binop (mode, PLUS,
15533                                            copy_rtx (tmp), GEN_INT (ct),
15534                                            copy_rtx (tmp), 1, OPTAB_DIRECT);
15535             }
15536
15537           if (!rtx_equal_p (tmp, out))
15538             emit_move_insn (copy_rtx (out), copy_rtx (tmp));
15539
15540           return 1; /* DONE */
15541         }
15542
15543       if (diff < 0)
15544         {
15545           enum machine_mode cmp_mode = GET_MODE (ix86_compare_op0);
15546
15547           HOST_WIDE_INT tmp;
15548           tmp = ct, ct = cf, cf = tmp;
15549           diff = -diff;
15550
15551           if (SCALAR_FLOAT_MODE_P (cmp_mode))
15552             {
15553               gcc_assert (!DECIMAL_FLOAT_MODE_P (cmp_mode));
15554
15555               /* We may be reversing unordered compare to normal compare, that
15556                  is not valid in general (we may convert non-trapping condition
15557                  to trapping one), however on i386 we currently emit all
15558                  comparisons unordered.  */
15559               compare_code = reverse_condition_maybe_unordered (compare_code);
15560               code = reverse_condition_maybe_unordered (code);
15561             }
15562           else
15563             {
15564               compare_code = reverse_condition (compare_code);
15565               code = reverse_condition (code);
15566             }
15567         }
15568
15569       compare_code = UNKNOWN;
15570       if (GET_MODE_CLASS (GET_MODE (ix86_compare_op0)) == MODE_INT
15571           && CONST_INT_P (ix86_compare_op1))
15572         {
15573           if (ix86_compare_op1 == const0_rtx
15574               && (code == LT || code == GE))
15575             compare_code = code;
15576           else if (ix86_compare_op1 == constm1_rtx)
15577             {
15578               if (code == LE)
15579                 compare_code = LT;
15580               else if (code == GT)
15581                 compare_code = GE;
15582             }
15583         }
15584
15585       /* Optimize dest = (op0 < 0) ? -1 : cf.  */
15586       if (compare_code != UNKNOWN
15587           && GET_MODE (ix86_compare_op0) == GET_MODE (out)
15588           && (cf == -1 || ct == -1))
15589         {
15590           /* If lea code below could be used, only optimize
15591              if it results in a 2 insn sequence.  */
15592
15593           if (! (diff == 1 || diff == 2 || diff == 4 || diff == 8
15594                  || diff == 3 || diff == 5 || diff == 9)
15595               || (compare_code == LT && ct == -1)
15596               || (compare_code == GE && cf == -1))
15597             {
15598               /*
15599                * notl op1       (if necessary)
15600                * sarl $31, op1
15601                * orl cf, op1
15602                */
15603               if (ct != -1)
15604                 {
15605                   cf = ct;
15606                   ct = -1;
15607                   code = reverse_condition (code);
15608                 }
15609
15610               out = emit_store_flag (out, code, ix86_compare_op0,
15611                                      ix86_compare_op1, VOIDmode, 0, -1);
15612
15613               out = expand_simple_binop (mode, IOR,
15614                                          out, GEN_INT (cf),
15615                                          out, 1, OPTAB_DIRECT);
15616               if (out != operands[0])
15617                 emit_move_insn (operands[0], out);
15618
15619               return 1; /* DONE */
15620             }
15621         }
15622
15623
15624       if ((diff == 1 || diff == 2 || diff == 4 || diff == 8
15625            || diff == 3 || diff == 5 || diff == 9)
15626           && ((mode != QImode && mode != HImode) || !TARGET_PARTIAL_REG_STALL)
15627           && (mode != DImode
15628               || x86_64_immediate_operand (GEN_INT (cf), VOIDmode)))
15629         {
15630           /*
15631            * xorl dest,dest
15632            * cmpl op1,op2
15633            * setcc dest
15634            * lea cf(dest*(ct-cf)),dest
15635            *
15636            * Size 14.
15637            *
15638            * This also catches the degenerate setcc-only case.
15639            */
15640
15641           rtx tmp;
15642           int nops;
15643
15644           out = emit_store_flag (out, code, ix86_compare_op0,
15645                                  ix86_compare_op1, VOIDmode, 0, 1);
15646
15647           nops = 0;
15648           /* On x86_64 the lea instruction operates on Pmode, so we need
15649              to get arithmetics done in proper mode to match.  */
15650           if (diff == 1)
15651             tmp = copy_rtx (out);
15652           else
15653             {
15654               rtx out1;
15655               out1 = copy_rtx (out);
15656               tmp = gen_rtx_MULT (mode, out1, GEN_INT (diff & ~1));
15657               nops++;
15658               if (diff & 1)
15659                 {
15660                   tmp = gen_rtx_PLUS (mode, tmp, out1);
15661                   nops++;
15662                 }
15663             }
15664           if (cf != 0)
15665             {
15666               tmp = gen_rtx_PLUS (mode, tmp, GEN_INT (cf));
15667               nops++;
15668             }
15669           if (!rtx_equal_p (tmp, out))
15670             {
15671               if (nops == 1)
15672                 out = force_operand (tmp, copy_rtx (out));
15673               else
15674                 emit_insn (gen_rtx_SET (VOIDmode, copy_rtx (out), copy_rtx (tmp)));
15675             }
15676           if (!rtx_equal_p (out, operands[0]))
15677             emit_move_insn (operands[0], copy_rtx (out));
15678
15679           return 1; /* DONE */
15680         }
15681
15682       /*
15683        * General case:                  Jumpful:
15684        *   xorl dest,dest               cmpl op1, op2
15685        *   cmpl op1, op2                movl ct, dest
15686        *   setcc dest                   jcc 1f
15687        *   decl dest                    movl cf, dest
15688        *   andl (cf-ct),dest            1:
15689        *   addl ct,dest
15690        *
15691        * Size 20.                       Size 14.
15692        *
15693        * This is reasonably steep, but branch mispredict costs are
15694        * high on modern cpus, so consider failing only if optimizing
15695        * for space.
15696        */
15697
15698       if ((!TARGET_CMOVE || (mode == QImode && TARGET_PARTIAL_REG_STALL))
15699           && BRANCH_COST (optimize_insn_for_speed_p (),
15700                           false) >= 2)
15701         {
15702           if (cf == 0)
15703             {
15704               enum machine_mode cmp_mode = GET_MODE (ix86_compare_op0);
15705
15706               cf = ct;
15707               ct = 0;
15708
15709               if (SCALAR_FLOAT_MODE_P (cmp_mode))
15710                 {
15711                   gcc_assert (!DECIMAL_FLOAT_MODE_P (cmp_mode));
15712
15713                   /* We may be reversing unordered compare to normal compare,
15714                      that is not valid in general (we may convert non-trapping
15715                      condition to trapping one), however on i386 we currently
15716                      emit all comparisons unordered.  */
15717                   code = reverse_condition_maybe_unordered (code);
15718                 }
15719               else
15720                 {
15721                   code = reverse_condition (code);
15722                   if (compare_code != UNKNOWN)
15723                     compare_code = reverse_condition (compare_code);
15724                 }
15725             }
15726
15727           if (compare_code != UNKNOWN)
15728             {
15729               /* notl op1       (if needed)
15730                  sarl $31, op1
15731                  andl (cf-ct), op1
15732                  addl ct, op1
15733
15734                  For x < 0 (resp. x <= -1) there will be no notl,
15735                  so if possible swap the constants to get rid of the
15736                  complement.
15737                  True/false will be -1/0 while code below (store flag
15738                  followed by decrement) is 0/-1, so the constants need
15739                  to be exchanged once more.  */
15740
15741               if (compare_code == GE || !cf)
15742                 {
15743                   code = reverse_condition (code);
15744                   compare_code = LT;
15745                 }
15746               else
15747                 {
15748                   HOST_WIDE_INT tmp = cf;
15749                   cf = ct;
15750                   ct = tmp;
15751                 }
15752
15753               out = emit_store_flag (out, code, ix86_compare_op0,
15754                                      ix86_compare_op1, VOIDmode, 0, -1);
15755             }
15756           else
15757             {
15758               out = emit_store_flag (out, code, ix86_compare_op0,
15759                                      ix86_compare_op1, VOIDmode, 0, 1);
15760
15761               out = expand_simple_binop (mode, PLUS, copy_rtx (out), constm1_rtx,
15762                                          copy_rtx (out), 1, OPTAB_DIRECT);
15763             }
15764
15765           out = expand_simple_binop (mode, AND, copy_rtx (out),
15766                                      gen_int_mode (cf - ct, mode),
15767                                      copy_rtx (out), 1, OPTAB_DIRECT);
15768           if (ct)
15769             out = expand_simple_binop (mode, PLUS, copy_rtx (out), GEN_INT (ct),
15770                                        copy_rtx (out), 1, OPTAB_DIRECT);
15771           if (!rtx_equal_p (out, operands[0]))
15772             emit_move_insn (operands[0], copy_rtx (out));
15773
15774           return 1; /* DONE */
15775         }
15776     }
15777
15778   if (!TARGET_CMOVE || (mode == QImode && TARGET_PARTIAL_REG_STALL))
15779     {
15780       /* Try a few things more with specific constants and a variable.  */
15781
15782       optab op;
15783       rtx var, orig_out, out, tmp;
15784
15785       if (BRANCH_COST (optimize_insn_for_speed_p (), false) <= 2)
15786         return 0; /* FAIL */
15787
15788       /* If one of the two operands is an interesting constant, load a
15789          constant with the above and mask it in with a logical operation.  */
15790
15791       if (CONST_INT_P (operands[2]))
15792         {
15793           var = operands[3];
15794           if (INTVAL (operands[2]) == 0 && operands[3] != constm1_rtx)
15795             operands[3] = constm1_rtx, op = and_optab;
15796           else if (INTVAL (operands[2]) == -1 && operands[3] != const0_rtx)
15797             operands[3] = const0_rtx, op = ior_optab;
15798           else
15799             return 0; /* FAIL */
15800         }
15801       else if (CONST_INT_P (operands[3]))
15802         {
15803           var = operands[2];
15804           if (INTVAL (operands[3]) == 0 && operands[2] != constm1_rtx)
15805             operands[2] = constm1_rtx, op = and_optab;
15806           else if (INTVAL (operands[3]) == -1 && operands[3] != const0_rtx)
15807             operands[2] = const0_rtx, op = ior_optab;
15808           else
15809             return 0; /* FAIL */
15810         }
15811       else
15812         return 0; /* FAIL */
15813
15814       orig_out = operands[0];
15815       tmp = gen_reg_rtx (mode);
15816       operands[0] = tmp;
15817
15818       /* Recurse to get the constant loaded.  */
15819       if (ix86_expand_int_movcc (operands) == 0)
15820         return 0; /* FAIL */
15821
15822       /* Mask in the interesting variable.  */
15823       out = expand_binop (mode, op, var, tmp, orig_out, 0,
15824                           OPTAB_WIDEN);
15825       if (!rtx_equal_p (out, orig_out))
15826         emit_move_insn (copy_rtx (orig_out), copy_rtx (out));
15827
15828       return 1; /* DONE */
15829     }
15830
15831   /*
15832    * For comparison with above,
15833    *
15834    * movl cf,dest
15835    * movl ct,tmp
15836    * cmpl op1,op2
15837    * cmovcc tmp,dest
15838    *
15839    * Size 15.
15840    */
15841
15842   if (! nonimmediate_operand (operands[2], mode))
15843     operands[2] = force_reg (mode, operands[2]);
15844   if (! nonimmediate_operand (operands[3], mode))
15845     operands[3] = force_reg (mode, operands[3]);
15846
15847   if (! register_operand (operands[2], VOIDmode)
15848       && (mode == QImode
15849           || ! register_operand (operands[3], VOIDmode)))
15850     operands[2] = force_reg (mode, operands[2]);
15851
15852   if (mode == QImode
15853       && ! register_operand (operands[3], VOIDmode))
15854     operands[3] = force_reg (mode, operands[3]);
15855
15856   emit_insn (compare_seq);
15857   emit_insn (gen_rtx_SET (VOIDmode, operands[0],
15858                           gen_rtx_IF_THEN_ELSE (mode,
15859                                                 compare_op, operands[2],
15860                                                 operands[3])));
15861
15862   return 1; /* DONE */
15863 }
15864
15865 /* Swap, force into registers, or otherwise massage the two operands
15866    to an sse comparison with a mask result.  Thus we differ a bit from
15867    ix86_prepare_fp_compare_args which expects to produce a flags result.
15868
15869    The DEST operand exists to help determine whether to commute commutative
15870    operators.  The POP0/POP1 operands are updated in place.  The new
15871    comparison code is returned, or UNKNOWN if not implementable.  */
15872
15873 static enum rtx_code
15874 ix86_prepare_sse_fp_compare_args (rtx dest, enum rtx_code code,
15875                                   rtx *pop0, rtx *pop1)
15876 {
15877   rtx tmp;
15878
15879   switch (code)
15880     {
15881     case LTGT:
15882     case UNEQ:
15883       /* We have no LTGT as an operator.  We could implement it with
15884          NE & ORDERED, but this requires an extra temporary.  It's
15885          not clear that it's worth it.  */
15886       return UNKNOWN;
15887
15888     case LT:
15889     case LE:
15890     case UNGT:
15891     case UNGE:
15892       /* These are supported directly.  */
15893       break;
15894
15895     case EQ:
15896     case NE:
15897     case UNORDERED:
15898     case ORDERED:
15899       /* For commutative operators, try to canonicalize the destination
15900          operand to be first in the comparison - this helps reload to
15901          avoid extra moves.  */
15902       if (!dest || !rtx_equal_p (dest, *pop1))
15903         break;
15904       /* FALLTHRU */
15905
15906     case GE:
15907     case GT:
15908     case UNLE:
15909     case UNLT:
15910       /* These are not supported directly.  Swap the comparison operands
15911          to transform into something that is supported.  */
15912       tmp = *pop0;
15913       *pop0 = *pop1;
15914       *pop1 = tmp;
15915       code = swap_condition (code);
15916       break;
15917
15918     default:
15919       gcc_unreachable ();
15920     }
15921
15922   return code;
15923 }
15924
15925 /* Detect conditional moves that exactly match min/max operational
15926    semantics.  Note that this is IEEE safe, as long as we don't
15927    interchange the operands.
15928
15929    Returns FALSE if this conditional move doesn't match a MIN/MAX,
15930    and TRUE if the operation is successful and instructions are emitted.  */
15931
15932 static bool
15933 ix86_expand_sse_fp_minmax (rtx dest, enum rtx_code code, rtx cmp_op0,
15934                            rtx cmp_op1, rtx if_true, rtx if_false)
15935 {
15936   enum machine_mode mode;
15937   bool is_min;
15938   rtx tmp;
15939
15940   if (code == LT)
15941     ;
15942   else if (code == UNGE)
15943     {
15944       tmp = if_true;
15945       if_true = if_false;
15946       if_false = tmp;
15947     }
15948   else
15949     return false;
15950
15951   if (rtx_equal_p (cmp_op0, if_true) && rtx_equal_p (cmp_op1, if_false))
15952     is_min = true;
15953   else if (rtx_equal_p (cmp_op1, if_true) && rtx_equal_p (cmp_op0, if_false))
15954     is_min = false;
15955   else
15956     return false;
15957
15958   mode = GET_MODE (dest);
15959
15960   /* We want to check HONOR_NANS and HONOR_SIGNED_ZEROS here,
15961      but MODE may be a vector mode and thus not appropriate.  */
15962   if (!flag_finite_math_only || !flag_unsafe_math_optimizations)
15963     {
15964       int u = is_min ? UNSPEC_IEEE_MIN : UNSPEC_IEEE_MAX;
15965       rtvec v;
15966
15967       if_true = force_reg (mode, if_true);
15968       v = gen_rtvec (2, if_true, if_false);
15969       tmp = gen_rtx_UNSPEC (mode, v, u);
15970     }
15971   else
15972     {
15973       code = is_min ? SMIN : SMAX;
15974       tmp = gen_rtx_fmt_ee (code, mode, if_true, if_false);
15975     }
15976
15977   emit_insn (gen_rtx_SET (VOIDmode, dest, tmp));
15978   return true;
15979 }
15980
15981 /* Expand an sse vector comparison.  Return the register with the result.  */
15982
15983 static rtx
15984 ix86_expand_sse_cmp (rtx dest, enum rtx_code code, rtx cmp_op0, rtx cmp_op1,
15985                      rtx op_true, rtx op_false)
15986 {
15987   enum machine_mode mode = GET_MODE (dest);
15988   rtx x;
15989
15990   cmp_op0 = force_reg (mode, cmp_op0);
15991   if (!nonimmediate_operand (cmp_op1, mode))
15992     cmp_op1 = force_reg (mode, cmp_op1);
15993
15994   if (optimize
15995       || reg_overlap_mentioned_p (dest, op_true)
15996       || reg_overlap_mentioned_p (dest, op_false))
15997     dest = gen_reg_rtx (mode);
15998
15999   x = gen_rtx_fmt_ee (code, mode, cmp_op0, cmp_op1);
16000   emit_insn (gen_rtx_SET (VOIDmode, dest, x));
16001
16002   return dest;
16003 }
16004
16005 /* Expand DEST = CMP ? OP_TRUE : OP_FALSE into a sequence of logical
16006    operations.  This is used for both scalar and vector conditional moves.  */
16007
16008 static void
16009 ix86_expand_sse_movcc (rtx dest, rtx cmp, rtx op_true, rtx op_false)
16010 {
16011   enum machine_mode mode = GET_MODE (dest);
16012   rtx t2, t3, x;
16013
16014   if (op_false == CONST0_RTX (mode))
16015     {
16016       op_true = force_reg (mode, op_true);
16017       x = gen_rtx_AND (mode, cmp, op_true);
16018       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
16019     }
16020   else if (op_true == CONST0_RTX (mode))
16021     {
16022       op_false = force_reg (mode, op_false);
16023       x = gen_rtx_NOT (mode, cmp);
16024       x = gen_rtx_AND (mode, x, op_false);
16025       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
16026     }
16027   else if (TARGET_XOP)
16028     {
16029       rtx pcmov = gen_rtx_SET (mode, dest,
16030                                gen_rtx_IF_THEN_ELSE (mode, cmp,
16031                                                      op_true,
16032                                                      op_false));
16033       emit_insn (pcmov);
16034     }
16035   else
16036     {
16037       op_true = force_reg (mode, op_true);
16038       op_false = force_reg (mode, op_false);
16039
16040       t2 = gen_reg_rtx (mode);
16041       if (optimize)
16042         t3 = gen_reg_rtx (mode);
16043       else
16044         t3 = dest;
16045
16046       x = gen_rtx_AND (mode, op_true, cmp);
16047       emit_insn (gen_rtx_SET (VOIDmode, t2, x));
16048
16049       x = gen_rtx_NOT (mode, cmp);
16050       x = gen_rtx_AND (mode, x, op_false);
16051       emit_insn (gen_rtx_SET (VOIDmode, t3, x));
16052
16053       x = gen_rtx_IOR (mode, t3, t2);
16054       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
16055     }
16056 }
16057
16058 /* Expand a floating-point conditional move.  Return true if successful.  */
16059
16060 int
16061 ix86_expand_fp_movcc (rtx operands[])
16062 {
16063   enum machine_mode mode = GET_MODE (operands[0]);
16064   enum rtx_code code = GET_CODE (operands[1]);
16065   rtx tmp, compare_op;
16066
16067   ix86_compare_op0 = XEXP (operands[1], 0);
16068   ix86_compare_op1 = XEXP (operands[1], 1);
16069   if (TARGET_SSE_MATH && SSE_FLOAT_MODE_P (mode))
16070     {
16071       enum machine_mode cmode;
16072
16073       /* Since we've no cmove for sse registers, don't force bad register
16074          allocation just to gain access to it.  Deny movcc when the
16075          comparison mode doesn't match the move mode.  */
16076       cmode = GET_MODE (ix86_compare_op0);
16077       if (cmode == VOIDmode)
16078         cmode = GET_MODE (ix86_compare_op1);
16079       if (cmode != mode)
16080         return 0;
16081
16082       code = ix86_prepare_sse_fp_compare_args (operands[0], code,
16083                                                &ix86_compare_op0,
16084                                                &ix86_compare_op1);
16085       if (code == UNKNOWN)
16086         return 0;
16087
16088       if (ix86_expand_sse_fp_minmax (operands[0], code, ix86_compare_op0,
16089                                      ix86_compare_op1, operands[2],
16090                                      operands[3]))
16091         return 1;
16092
16093       tmp = ix86_expand_sse_cmp (operands[0], code, ix86_compare_op0,
16094                                  ix86_compare_op1, operands[2], operands[3]);
16095       ix86_expand_sse_movcc (operands[0], tmp, operands[2], operands[3]);
16096       return 1;
16097     }
16098
16099   /* The floating point conditional move instructions don't directly
16100      support conditions resulting from a signed integer comparison.  */
16101
16102   compare_op = ix86_expand_compare (code);
16103   if (!fcmov_comparison_operator (compare_op, VOIDmode))
16104     {
16105       tmp = gen_reg_rtx (QImode);
16106       ix86_expand_setcc (code, tmp);
16107       code = NE;
16108       ix86_compare_op0 = tmp;
16109       ix86_compare_op1 = const0_rtx;
16110       compare_op = ix86_expand_compare (code);
16111     }
16112
16113   emit_insn (gen_rtx_SET (VOIDmode, operands[0],
16114                           gen_rtx_IF_THEN_ELSE (mode, compare_op,
16115                                                 operands[2], operands[3])));
16116
16117   return 1;
16118 }
16119
16120 /* Expand a floating-point vector conditional move; a vcond operation
16121    rather than a movcc operation.  */
16122
16123 bool
16124 ix86_expand_fp_vcond (rtx operands[])
16125 {
16126   enum rtx_code code = GET_CODE (operands[3]);
16127   rtx cmp;
16128
16129   code = ix86_prepare_sse_fp_compare_args (operands[0], code,
16130                                            &operands[4], &operands[5]);
16131   if (code == UNKNOWN)
16132     return false;
16133
16134   if (ix86_expand_sse_fp_minmax (operands[0], code, operands[4],
16135                                  operands[5], operands[1], operands[2]))
16136     return true;
16137
16138   cmp = ix86_expand_sse_cmp (operands[0], code, operands[4], operands[5],
16139                              operands[1], operands[2]);
16140   ix86_expand_sse_movcc (operands[0], cmp, operands[1], operands[2]);
16141   return true;
16142 }
16143
16144 /* Expand a signed/unsigned integral vector conditional move.  */
16145
16146 bool
16147 ix86_expand_int_vcond (rtx operands[])
16148 {
16149   enum machine_mode mode = GET_MODE (operands[0]);
16150   enum rtx_code code = GET_CODE (operands[3]);
16151   bool negate = false;
16152   rtx x, cop0, cop1;
16153
16154   cop0 = operands[4];
16155   cop1 = operands[5];
16156
16157   /* XOP supports all of the comparisons on all vector int types.  */
16158   if (!TARGET_XOP)
16159     {
16160   /* Canonicalize the comparison to EQ, GT, GTU.  */
16161   switch (code)
16162     {
16163     case EQ:
16164     case GT:
16165     case GTU:
16166       break;
16167
16168     case NE:
16169     case LE:
16170     case LEU:
16171       code = reverse_condition (code);
16172       negate = true;
16173       break;
16174
16175     case GE:
16176     case GEU:
16177       code = reverse_condition (code);
16178       negate = true;
16179       /* FALLTHRU */
16180
16181     case LT:
16182     case LTU:
16183       code = swap_condition (code);
16184       x = cop0, cop0 = cop1, cop1 = x;
16185       break;
16186
16187     default:
16188       gcc_unreachable ();
16189     }
16190
16191   /* Only SSE4.1/SSE4.2 supports V2DImode.  */
16192   if (mode == V2DImode)
16193     {
16194       switch (code)
16195         {
16196         case EQ:
16197           /* SSE4.1 supports EQ.  */
16198           if (!TARGET_SSE4_1)
16199             return false;
16200           break;
16201
16202         case GT:
16203         case GTU:
16204           /* SSE4.2 supports GT/GTU.  */
16205           if (!TARGET_SSE4_2)
16206             return false;
16207           break;
16208
16209         default:
16210           gcc_unreachable ();
16211         }
16212     }
16213
16214   /* Unsigned parallel compare is not supported by the hardware.  Play some
16215      tricks to turn this into a signed comparison against 0.  */
16216   if (code == GTU)
16217     {
16218       cop0 = force_reg (mode, cop0);
16219
16220       switch (mode)
16221         {
16222         case V4SImode:
16223         case V2DImode:
16224           {
16225             rtx t1, t2, mask;
16226
16227             /* Perform a parallel modulo subtraction.  */
16228             t1 = gen_reg_rtx (mode);
16229             emit_insn ((mode == V4SImode
16230                         ? gen_subv4si3
16231                         : gen_subv2di3) (t1, cop0, cop1));
16232
16233             /* Extract the original sign bit of op0.  */
16234             mask = ix86_build_signbit_mask (GET_MODE_INNER (mode),
16235                                             true, false);
16236             t2 = gen_reg_rtx (mode);
16237             emit_insn ((mode == V4SImode
16238                         ? gen_andv4si3
16239                         : gen_andv2di3) (t2, cop0, mask));
16240
16241             /* XOR it back into the result of the subtraction.  This results
16242                in the sign bit set iff we saw unsigned underflow.  */
16243             x = gen_reg_rtx (mode);
16244             emit_insn ((mode == V4SImode
16245                         ? gen_xorv4si3
16246                         : gen_xorv2di3) (x, t1, t2));
16247
16248             code = GT;
16249           }
16250           break;
16251
16252         case V16QImode:
16253         case V8HImode:
16254           /* Perform a parallel unsigned saturating subtraction.  */
16255           x = gen_reg_rtx (mode);
16256           emit_insn (gen_rtx_SET (VOIDmode, x,
16257                                   gen_rtx_US_MINUS (mode, cop0, cop1)));
16258
16259           code = EQ;
16260           negate = !negate;
16261           break;
16262
16263         default:
16264           gcc_unreachable ();
16265         }
16266
16267       cop0 = x;
16268       cop1 = CONST0_RTX (mode);
16269     }
16270     }
16271
16272   x = ix86_expand_sse_cmp (operands[0], code, cop0, cop1,
16273                            operands[1+negate], operands[2-negate]);
16274
16275   ix86_expand_sse_movcc (operands[0], x, operands[1+negate],
16276                          operands[2-negate]);
16277   return true;
16278 }
16279
16280 /* Unpack OP[1] into the next wider integer vector type.  UNSIGNED_P is
16281    true if we should do zero extension, else sign extension.  HIGH_P is
16282    true if we want the N/2 high elements, else the low elements.  */
16283
16284 void
16285 ix86_expand_sse_unpack (rtx operands[2], bool unsigned_p, bool high_p)
16286 {
16287   enum machine_mode imode = GET_MODE (operands[1]);
16288   rtx (*unpack)(rtx, rtx, rtx);
16289   rtx se, dest;
16290
16291   switch (imode)
16292     {
16293     case V16QImode:
16294       if (high_p)
16295         unpack = gen_vec_interleave_highv16qi;
16296       else
16297         unpack = gen_vec_interleave_lowv16qi;
16298       break;
16299     case V8HImode:
16300       if (high_p)
16301         unpack = gen_vec_interleave_highv8hi;
16302       else
16303         unpack = gen_vec_interleave_lowv8hi;
16304       break;
16305     case V4SImode:
16306       if (high_p)
16307         unpack = gen_vec_interleave_highv4si;
16308       else
16309         unpack = gen_vec_interleave_lowv4si;
16310       break;
16311     default:
16312       gcc_unreachable ();
16313     }
16314
16315   dest = gen_lowpart (imode, operands[0]);
16316
16317   if (unsigned_p)
16318     se = force_reg (imode, CONST0_RTX (imode));
16319   else
16320     se = ix86_expand_sse_cmp (gen_reg_rtx (imode), GT, CONST0_RTX (imode),
16321                               operands[1], pc_rtx, pc_rtx);
16322
16323   emit_insn (unpack (dest, operands[1], se));
16324 }
16325
16326 /* This function performs the same task as ix86_expand_sse_unpack,
16327    but with SSE4.1 instructions.  */
16328
16329 void
16330 ix86_expand_sse4_unpack (rtx operands[2], bool unsigned_p, bool high_p)
16331 {
16332   enum machine_mode imode = GET_MODE (operands[1]);
16333   rtx (*unpack)(rtx, rtx);
16334   rtx src, dest;
16335
16336   switch (imode)
16337     {
16338     case V16QImode:
16339       if (unsigned_p)
16340         unpack = gen_sse4_1_zero_extendv8qiv8hi2;
16341       else
16342         unpack = gen_sse4_1_extendv8qiv8hi2;
16343       break;
16344     case V8HImode:
16345       if (unsigned_p)
16346         unpack = gen_sse4_1_zero_extendv4hiv4si2;
16347       else
16348         unpack = gen_sse4_1_extendv4hiv4si2;
16349       break;
16350     case V4SImode:
16351       if (unsigned_p)
16352         unpack = gen_sse4_1_zero_extendv2siv2di2;
16353       else
16354         unpack = gen_sse4_1_extendv2siv2di2;
16355       break;
16356     default:
16357       gcc_unreachable ();
16358     }
16359
16360   dest = operands[0];
16361   if (high_p)
16362     {
16363       /* Shift higher 8 bytes to lower 8 bytes.  */
16364       src = gen_reg_rtx (imode);
16365       emit_insn (gen_sse2_lshrti3 (gen_lowpart (TImode, src),
16366                                    gen_lowpart (TImode, operands[1]),
16367                                    GEN_INT (64)));
16368     }
16369   else
16370     src = operands[1];
16371
16372   emit_insn (unpack (dest, src));
16373 }
16374
16375 /* Expand conditional increment or decrement using adb/sbb instructions.
16376    The default case using setcc followed by the conditional move can be
16377    done by generic code.  */
16378 int
16379 ix86_expand_int_addcc (rtx operands[])
16380 {
16381   enum rtx_code code = GET_CODE (operands[1]);
16382   rtx (*insn)(rtx, rtx, rtx, rtx);
16383   rtx compare_op;
16384   rtx val = const0_rtx;
16385   bool fpcmp = false;
16386   enum machine_mode mode = GET_MODE (operands[0]);
16387
16388   ix86_compare_op0 = XEXP (operands[1], 0);
16389   ix86_compare_op1 = XEXP (operands[1], 1);
16390   if (operands[3] != const1_rtx
16391       && operands[3] != constm1_rtx)
16392     return 0;
16393   if (!ix86_expand_carry_flag_compare (code, ix86_compare_op0,
16394                                        ix86_compare_op1, &compare_op))
16395      return 0;
16396   code = GET_CODE (compare_op);
16397
16398   if (GET_MODE (XEXP (compare_op, 0)) == CCFPmode
16399       || GET_MODE (XEXP (compare_op, 0)) == CCFPUmode)
16400     {
16401       fpcmp = true;
16402       code = ix86_fp_compare_code_to_integer (code);
16403     }
16404
16405   if (code != LTU)
16406     {
16407       val = constm1_rtx;
16408       if (fpcmp)
16409         PUT_CODE (compare_op,
16410                   reverse_condition_maybe_unordered
16411                     (GET_CODE (compare_op)));
16412       else
16413         PUT_CODE (compare_op, reverse_condition (GET_CODE (compare_op)));
16414     }
16415   PUT_MODE (compare_op, mode);
16416
16417   /* Construct either adc or sbb insn.  */
16418   if ((code == LTU) == (operands[3] == constm1_rtx))
16419     {
16420       switch (GET_MODE (operands[0]))
16421         {
16422           case QImode:
16423             insn = gen_subqi3_carry;
16424             break;
16425           case HImode:
16426             insn = gen_subhi3_carry;
16427             break;
16428           case SImode:
16429             insn = gen_subsi3_carry;
16430             break;
16431           case DImode:
16432             insn = gen_subdi3_carry;
16433             break;
16434           default:
16435             gcc_unreachable ();
16436         }
16437     }
16438   else
16439     {
16440       switch (GET_MODE (operands[0]))
16441         {
16442           case QImode:
16443             insn = gen_addqi3_carry;
16444             break;
16445           case HImode:
16446             insn = gen_addhi3_carry;
16447             break;
16448           case SImode:
16449             insn = gen_addsi3_carry;
16450             break;
16451           case DImode:
16452             insn = gen_adddi3_carry;
16453             break;
16454           default:
16455             gcc_unreachable ();
16456         }
16457     }
16458   emit_insn (insn (operands[0], operands[2], val, compare_op));
16459
16460   return 1; /* DONE */
16461 }
16462
16463
16464 /* Split operands 0 and 1 into SImode parts.  Similar to split_di, but
16465    works for floating pointer parameters and nonoffsetable memories.
16466    For pushes, it returns just stack offsets; the values will be saved
16467    in the right order.  Maximally three parts are generated.  */
16468
16469 static int
16470 ix86_split_to_parts (rtx operand, rtx *parts, enum machine_mode mode)
16471 {
16472   int size;
16473
16474   if (!TARGET_64BIT)
16475     size = mode==XFmode ? 3 : GET_MODE_SIZE (mode) / 4;
16476   else
16477     size = (GET_MODE_SIZE (mode) + 4) / 8;
16478
16479   gcc_assert (!REG_P (operand) || !MMX_REGNO_P (REGNO (operand)));
16480   gcc_assert (size >= 2 && size <= 4);
16481
16482   /* Optimize constant pool reference to immediates.  This is used by fp
16483      moves, that force all constants to memory to allow combining.  */
16484   if (MEM_P (operand) && MEM_READONLY_P (operand))
16485     {
16486       rtx tmp = maybe_get_pool_constant (operand);
16487       if (tmp)
16488         operand = tmp;
16489     }
16490
16491   if (MEM_P (operand) && !offsettable_memref_p (operand))
16492     {
16493       /* The only non-offsetable memories we handle are pushes.  */
16494       int ok = push_operand (operand, VOIDmode);
16495
16496       gcc_assert (ok);
16497
16498       operand = copy_rtx (operand);
16499       PUT_MODE (operand, Pmode);
16500       parts[0] = parts[1] = parts[2] = parts[3] = operand;
16501       return size;
16502     }
16503
16504   if (GET_CODE (operand) == CONST_VECTOR)
16505     {
16506       enum machine_mode imode = int_mode_for_mode (mode);
16507       /* Caution: if we looked through a constant pool memory above,
16508          the operand may actually have a different mode now.  That's
16509          ok, since we want to pun this all the way back to an integer.  */
16510       operand = simplify_subreg (imode, operand, GET_MODE (operand), 0);
16511       gcc_assert (operand != NULL);
16512       mode = imode;
16513     }
16514
16515   if (!TARGET_64BIT)
16516     {
16517       if (mode == DImode)
16518         split_di (&operand, 1, &parts[0], &parts[1]);
16519       else
16520         {
16521           int i;
16522
16523           if (REG_P (operand))
16524             {
16525               gcc_assert (reload_completed);
16526               for (i = 0; i < size; i++)
16527                 parts[i] = gen_rtx_REG (SImode, REGNO (operand) + i);
16528             }
16529           else if (offsettable_memref_p (operand))
16530             {
16531               operand = adjust_address (operand, SImode, 0);
16532               parts[0] = operand;
16533               for (i = 1; i < size; i++)
16534                 parts[i] = adjust_address (operand, SImode, 4 * i);
16535             }
16536           else if (GET_CODE (operand) == CONST_DOUBLE)
16537             {
16538               REAL_VALUE_TYPE r;
16539               long l[4];
16540
16541               REAL_VALUE_FROM_CONST_DOUBLE (r, operand);
16542               switch (mode)
16543                 {
16544                 case TFmode:
16545                   real_to_target (l, &r, mode);
16546                   parts[3] = gen_int_mode (l[3], SImode);
16547                   parts[2] = gen_int_mode (l[2], SImode);
16548                   break;
16549                 case XFmode:
16550                   REAL_VALUE_TO_TARGET_LONG_DOUBLE (r, l);
16551                   parts[2] = gen_int_mode (l[2], SImode);
16552                   break;
16553                 case DFmode:
16554                   REAL_VALUE_TO_TARGET_DOUBLE (r, l);
16555                   break;
16556                 default:
16557                   gcc_unreachable ();
16558                 }
16559               parts[1] = gen_int_mode (l[1], SImode);
16560               parts[0] = gen_int_mode (l[0], SImode);
16561             }
16562           else
16563             gcc_unreachable ();
16564         }
16565     }
16566   else
16567     {
16568       if (mode == TImode)
16569         split_ti (&operand, 1, &parts[0], &parts[1]);
16570       if (mode == XFmode || mode == TFmode)
16571         {
16572           enum machine_mode upper_mode = mode==XFmode ? SImode : DImode;
16573           if (REG_P (operand))
16574             {
16575               gcc_assert (reload_completed);
16576               parts[0] = gen_rtx_REG (DImode, REGNO (operand) + 0);
16577               parts[1] = gen_rtx_REG (upper_mode, REGNO (operand) + 1);
16578             }
16579           else if (offsettable_memref_p (operand))
16580             {
16581               operand = adjust_address (operand, DImode, 0);
16582               parts[0] = operand;
16583               parts[1] = adjust_address (operand, upper_mode, 8);
16584             }
16585           else if (GET_CODE (operand) == CONST_DOUBLE)
16586             {
16587               REAL_VALUE_TYPE r;
16588               long l[4];
16589
16590               REAL_VALUE_FROM_CONST_DOUBLE (r, operand);
16591               real_to_target (l, &r, mode);
16592
16593               /* Do not use shift by 32 to avoid warning on 32bit systems.  */
16594               if (HOST_BITS_PER_WIDE_INT >= 64)
16595                 parts[0]
16596                   = gen_int_mode
16597                       ((l[0] & (((HOST_WIDE_INT) 2 << 31) - 1))
16598                        + ((((HOST_WIDE_INT) l[1]) << 31) << 1),
16599                        DImode);
16600               else
16601                 parts[0] = immed_double_const (l[0], l[1], DImode);
16602
16603               if (upper_mode == SImode)
16604                 parts[1] = gen_int_mode (l[2], SImode);
16605               else if (HOST_BITS_PER_WIDE_INT >= 64)
16606                 parts[1]
16607                   = gen_int_mode
16608                       ((l[2] & (((HOST_WIDE_INT) 2 << 31) - 1))
16609                        + ((((HOST_WIDE_INT) l[3]) << 31) << 1),
16610                        DImode);
16611               else
16612                 parts[1] = immed_double_const (l[2], l[3], DImode);
16613             }
16614           else
16615             gcc_unreachable ();
16616         }
16617     }
16618
16619   return size;
16620 }
16621
16622 /* Emit insns to perform a move or push of DI, DF, XF, and TF values.
16623    Return false when normal moves are needed; true when all required
16624    insns have been emitted.  Operands 2-4 contain the input values
16625    int the correct order; operands 5-7 contain the output values.  */
16626
16627 void
16628 ix86_split_long_move (rtx operands[])
16629 {
16630   rtx part[2][4];
16631   int nparts, i, j;
16632   int push = 0;
16633   int collisions = 0;
16634   enum machine_mode mode = GET_MODE (operands[0]);
16635   bool collisionparts[4];
16636
16637   /* The DFmode expanders may ask us to move double.
16638      For 64bit target this is single move.  By hiding the fact
16639      here we simplify i386.md splitters.  */
16640   if (GET_MODE_SIZE (GET_MODE (operands[0])) == 8 && TARGET_64BIT)
16641     {
16642       /* Optimize constant pool reference to immediates.  This is used by
16643          fp moves, that force all constants to memory to allow combining.  */
16644
16645       if (MEM_P (operands[1])
16646           && GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF
16647           && CONSTANT_POOL_ADDRESS_P (XEXP (operands[1], 0)))
16648         operands[1] = get_pool_constant (XEXP (operands[1], 0));
16649       if (push_operand (operands[0], VOIDmode))
16650         {
16651           operands[0] = copy_rtx (operands[0]);
16652           PUT_MODE (operands[0], Pmode);
16653         }
16654       else
16655         operands[0] = gen_lowpart (DImode, operands[0]);
16656       operands[1] = gen_lowpart (DImode, operands[1]);
16657       emit_move_insn (operands[0], operands[1]);
16658       return;
16659     }
16660
16661   /* The only non-offsettable memory we handle is push.  */
16662   if (push_operand (operands[0], VOIDmode))
16663     push = 1;
16664   else
16665     gcc_assert (!MEM_P (operands[0])
16666                 || offsettable_memref_p (operands[0]));
16667
16668   nparts = ix86_split_to_parts (operands[1], part[1], GET_MODE (operands[0]));
16669   ix86_split_to_parts (operands[0], part[0], GET_MODE (operands[0]));
16670
16671   /* When emitting push, take care for source operands on the stack.  */
16672   if (push && MEM_P (operands[1])
16673       && reg_overlap_mentioned_p (stack_pointer_rtx, operands[1]))
16674     {
16675       rtx src_base = XEXP (part[1][nparts - 1], 0);
16676
16677       /* Compensate for the stack decrement by 4.  */
16678       if (!TARGET_64BIT && nparts == 3
16679           && mode == XFmode && TARGET_128BIT_LONG_DOUBLE)
16680         src_base = plus_constant (src_base, 4);
16681
16682       /* src_base refers to the stack pointer and is
16683          automatically decreased by emitted push.  */
16684       for (i = 0; i < nparts; i++)
16685         part[1][i] = change_address (part[1][i],
16686                                      GET_MODE (part[1][i]), src_base);
16687     }
16688
16689   /* We need to do copy in the right order in case an address register
16690      of the source overlaps the destination.  */
16691   if (REG_P (part[0][0]) && MEM_P (part[1][0]))
16692     {
16693       rtx tmp;
16694
16695       for (i = 0; i < nparts; i++)
16696         {
16697           collisionparts[i]
16698             = reg_overlap_mentioned_p (part[0][i], XEXP (part[1][0], 0));
16699           if (collisionparts[i])
16700             collisions++;
16701         }
16702
16703       /* Collision in the middle part can be handled by reordering.  */
16704       if (collisions == 1 && nparts == 3 && collisionparts [1])
16705         {
16706           tmp = part[0][1]; part[0][1] = part[0][2]; part[0][2] = tmp;
16707           tmp = part[1][1]; part[1][1] = part[1][2]; part[1][2] = tmp;
16708         }
16709       else if (collisions == 1
16710                && nparts == 4
16711                && (collisionparts [1] || collisionparts [2]))
16712         {
16713           if (collisionparts [1])
16714             {
16715               tmp = part[0][1]; part[0][1] = part[0][2]; part[0][2] = tmp;
16716               tmp = part[1][1]; part[1][1] = part[1][2]; part[1][2] = tmp;
16717             }
16718           else
16719             {
16720               tmp = part[0][2]; part[0][2] = part[0][3]; part[0][3] = tmp;
16721               tmp = part[1][2]; part[1][2] = part[1][3]; part[1][3] = tmp;
16722             }
16723         }
16724
16725       /* If there are more collisions, we can't handle it by reordering.
16726          Do an lea to the last part and use only one colliding move.  */
16727       else if (collisions > 1)
16728         {
16729           rtx base;
16730
16731           collisions = 1;
16732
16733           base = part[0][nparts - 1];
16734
16735           /* Handle the case when the last part isn't valid for lea.
16736              Happens in 64-bit mode storing the 12-byte XFmode.  */
16737           if (GET_MODE (base) != Pmode)
16738             base = gen_rtx_REG (Pmode, REGNO (base));
16739
16740           emit_insn (gen_rtx_SET (VOIDmode, base, XEXP (part[1][0], 0)));
16741           part[1][0] = replace_equiv_address (part[1][0], base);
16742           for (i = 1; i < nparts; i++)
16743             {
16744               tmp = plus_constant (base, UNITS_PER_WORD * i);
16745               part[1][i] = replace_equiv_address (part[1][i], tmp);
16746             }
16747         }
16748     }
16749
16750   if (push)
16751     {
16752       if (!TARGET_64BIT)
16753         {
16754           if (nparts == 3)
16755             {
16756               if (TARGET_128BIT_LONG_DOUBLE && mode == XFmode)
16757                 emit_insn (gen_addsi3 (stack_pointer_rtx,
16758                                        stack_pointer_rtx, GEN_INT (-4)));
16759               emit_move_insn (part[0][2], part[1][2]);
16760             }
16761           else if (nparts == 4)
16762             {
16763               emit_move_insn (part[0][3], part[1][3]);
16764               emit_move_insn (part[0][2], part[1][2]);
16765             }
16766         }
16767       else
16768         {
16769           /* In 64bit mode we don't have 32bit push available.  In case this is
16770              register, it is OK - we will just use larger counterpart.  We also
16771              retype memory - these comes from attempt to avoid REX prefix on
16772              moving of second half of TFmode value.  */
16773           if (GET_MODE (part[1][1]) == SImode)
16774             {
16775               switch (GET_CODE (part[1][1]))
16776                 {
16777                 case MEM:
16778                   part[1][1] = adjust_address (part[1][1], DImode, 0);
16779                   break;
16780
16781                 case REG:
16782                   part[1][1] = gen_rtx_REG (DImode, REGNO (part[1][1]));
16783                   break;
16784
16785                 default:
16786                   gcc_unreachable ();
16787                 }
16788
16789               if (GET_MODE (part[1][0]) == SImode)
16790                 part[1][0] = part[1][1];
16791             }
16792         }
16793       emit_move_insn (part[0][1], part[1][1]);
16794       emit_move_insn (part[0][0], part[1][0]);
16795       return;
16796     }
16797
16798   /* Choose correct order to not overwrite the source before it is copied.  */
16799   if ((REG_P (part[0][0])
16800        && REG_P (part[1][1])
16801        && (REGNO (part[0][0]) == REGNO (part[1][1])
16802            || (nparts == 3
16803                && REGNO (part[0][0]) == REGNO (part[1][2]))
16804            || (nparts == 4
16805                && REGNO (part[0][0]) == REGNO (part[1][3]))))
16806       || (collisions > 0
16807           && reg_overlap_mentioned_p (part[0][0], XEXP (part[1][0], 0))))
16808     {
16809       for (i = 0, j = nparts - 1; i < nparts; i++, j--)
16810         {
16811           operands[2 + i] = part[0][j];
16812           operands[6 + i] = part[1][j];
16813         }
16814     }
16815   else
16816     {
16817       for (i = 0; i < nparts; i++)
16818         {
16819           operands[2 + i] = part[0][i];
16820           operands[6 + i] = part[1][i];
16821         }
16822     }
16823
16824   /* If optimizing for size, attempt to locally unCSE nonzero constants.  */
16825   if (optimize_insn_for_size_p ())
16826     {
16827       for (j = 0; j < nparts - 1; j++)
16828         if (CONST_INT_P (operands[6 + j])
16829             && operands[6 + j] != const0_rtx
16830             && REG_P (operands[2 + j]))
16831           for (i = j; i < nparts - 1; i++)
16832             if (CONST_INT_P (operands[7 + i])
16833                 && INTVAL (operands[7 + i]) == INTVAL (operands[6 + j]))
16834               operands[7 + i] = operands[2 + j];
16835     }
16836
16837   for (i = 0; i < nparts; i++)
16838     emit_move_insn (operands[2 + i], operands[6 + i]);
16839
16840   return;
16841 }
16842
16843 /* Helper function of ix86_split_ashl used to generate an SImode/DImode
16844    left shift by a constant, either using a single shift or
16845    a sequence of add instructions.  */
16846
16847 static void
16848 ix86_expand_ashl_const (rtx operand, int count, enum machine_mode mode)
16849 {
16850   if (count == 1)
16851     {
16852       emit_insn ((mode == DImode
16853                   ? gen_addsi3
16854                   : gen_adddi3) (operand, operand, operand));
16855     }
16856   else if (!optimize_insn_for_size_p ()
16857            && count * ix86_cost->add <= ix86_cost->shift_const)
16858     {
16859       int i;
16860       for (i=0; i<count; i++)
16861         {
16862           emit_insn ((mode == DImode
16863                       ? gen_addsi3
16864                       : gen_adddi3) (operand, operand, operand));
16865         }
16866     }
16867   else
16868     emit_insn ((mode == DImode
16869                 ? gen_ashlsi3
16870                 : gen_ashldi3) (operand, operand, GEN_INT (count)));
16871 }
16872
16873 void
16874 ix86_split_ashl (rtx *operands, rtx scratch, enum machine_mode mode)
16875 {
16876   rtx low[2], high[2];
16877   int count;
16878   const int single_width = mode == DImode ? 32 : 64;
16879
16880   if (CONST_INT_P (operands[2]))
16881     {
16882       (mode == DImode ? split_di : split_ti) (operands, 2, low, high);
16883       count = INTVAL (operands[2]) & (single_width * 2 - 1);
16884
16885       if (count >= single_width)
16886         {
16887           emit_move_insn (high[0], low[1]);
16888           emit_move_insn (low[0], const0_rtx);
16889
16890           if (count > single_width)
16891             ix86_expand_ashl_const (high[0], count - single_width, mode);
16892         }
16893       else
16894         {
16895           if (!rtx_equal_p (operands[0], operands[1]))
16896             emit_move_insn (operands[0], operands[1]);
16897           emit_insn ((mode == DImode
16898                      ? gen_x86_shld
16899                      : gen_x86_64_shld) (high[0], low[0], GEN_INT (count)));
16900           ix86_expand_ashl_const (low[0], count, mode);
16901         }
16902       return;
16903     }
16904
16905   (mode == DImode ? split_di : split_ti) (operands, 1, low, high);
16906
16907   if (operands[1] == const1_rtx)
16908     {
16909       /* Assuming we've chosen a QImode capable registers, then 1 << N
16910          can be done with two 32/64-bit shifts, no branches, no cmoves.  */
16911       if (ANY_QI_REG_P (low[0]) && ANY_QI_REG_P (high[0]))
16912         {
16913           rtx s, d, flags = gen_rtx_REG (CCZmode, FLAGS_REG);
16914
16915           ix86_expand_clear (low[0]);
16916           ix86_expand_clear (high[0]);
16917           emit_insn (gen_testqi_ccz_1 (operands[2], GEN_INT (single_width)));
16918
16919           d = gen_lowpart (QImode, low[0]);
16920           d = gen_rtx_STRICT_LOW_PART (VOIDmode, d);
16921           s = gen_rtx_EQ (QImode, flags, const0_rtx);
16922           emit_insn (gen_rtx_SET (VOIDmode, d, s));
16923
16924           d = gen_lowpart (QImode, high[0]);
16925           d = gen_rtx_STRICT_LOW_PART (VOIDmode, d);
16926           s = gen_rtx_NE (QImode, flags, const0_rtx);
16927           emit_insn (gen_rtx_SET (VOIDmode, d, s));
16928         }
16929
16930       /* Otherwise, we can get the same results by manually performing
16931          a bit extract operation on bit 5/6, and then performing the two
16932          shifts.  The two methods of getting 0/1 into low/high are exactly
16933          the same size.  Avoiding the shift in the bit extract case helps
16934          pentium4 a bit; no one else seems to care much either way.  */
16935       else
16936         {
16937           rtx x;
16938
16939           if (TARGET_PARTIAL_REG_STALL && !optimize_insn_for_size_p ())
16940             x = gen_rtx_ZERO_EXTEND (mode == DImode ? SImode : DImode, operands[2]);
16941           else
16942             x = gen_lowpart (mode == DImode ? SImode : DImode, operands[2]);
16943           emit_insn (gen_rtx_SET (VOIDmode, high[0], x));
16944
16945           emit_insn ((mode == DImode
16946                       ? gen_lshrsi3
16947                       : gen_lshrdi3) (high[0], high[0],
16948                                       GEN_INT (mode == DImode ? 5 : 6)));
16949           emit_insn ((mode == DImode
16950                       ? gen_andsi3
16951                       : gen_anddi3) (high[0], high[0], const1_rtx));
16952           emit_move_insn (low[0], high[0]);
16953           emit_insn ((mode == DImode
16954                       ? gen_xorsi3
16955                       : gen_xordi3) (low[0], low[0], const1_rtx));
16956         }
16957
16958       emit_insn ((mode == DImode
16959                     ? gen_ashlsi3
16960                     : gen_ashldi3) (low[0], low[0], operands[2]));
16961       emit_insn ((mode == DImode
16962                     ? gen_ashlsi3
16963                     : gen_ashldi3) (high[0], high[0], operands[2]));
16964       return;
16965     }
16966
16967   if (operands[1] == constm1_rtx)
16968     {
16969       /* For -1 << N, we can avoid the shld instruction, because we
16970          know that we're shifting 0...31/63 ones into a -1.  */
16971       emit_move_insn (low[0], constm1_rtx);
16972       if (optimize_insn_for_size_p ())
16973         emit_move_insn (high[0], low[0]);
16974       else
16975         emit_move_insn (high[0], constm1_rtx);
16976     }
16977   else
16978     {
16979       if (!rtx_equal_p (operands[0], operands[1]))
16980         emit_move_insn (operands[0], operands[1]);
16981
16982       (mode == DImode ? split_di : split_ti) (operands, 1, low, high);
16983       emit_insn ((mode == DImode
16984                   ? gen_x86_shld
16985                   : gen_x86_64_shld) (high[0], low[0], operands[2]));
16986     }
16987
16988   emit_insn ((mode == DImode ? gen_ashlsi3 : gen_ashldi3) (low[0], low[0], operands[2]));
16989
16990   if (TARGET_CMOVE && scratch)
16991     {
16992       ix86_expand_clear (scratch);
16993       emit_insn ((mode == DImode
16994                   ? gen_x86_shift_adj_1
16995                   : gen_x86_64_shift_adj_1) (high[0], low[0], operands[2],
16996                                              scratch));
16997     }
16998   else
16999     emit_insn ((mode == DImode
17000                 ? gen_x86_shift_adj_2
17001                 : gen_x86_64_shift_adj_2) (high[0], low[0], operands[2]));
17002 }
17003
17004 void
17005 ix86_split_ashr (rtx *operands, rtx scratch, enum machine_mode mode)
17006 {
17007   rtx low[2], high[2];
17008   int count;
17009   const int single_width = mode == DImode ? 32 : 64;
17010
17011   if (CONST_INT_P (operands[2]))
17012     {
17013       (mode == DImode ? split_di : split_ti) (operands, 2, low, high);
17014       count = INTVAL (operands[2]) & (single_width * 2 - 1);
17015
17016       if (count == single_width * 2 - 1)
17017         {
17018           emit_move_insn (high[0], high[1]);
17019           emit_insn ((mode == DImode
17020                       ? gen_ashrsi3
17021                       : gen_ashrdi3) (high[0], high[0],
17022                                       GEN_INT (single_width - 1)));
17023           emit_move_insn (low[0], high[0]);
17024
17025         }
17026       else if (count >= single_width)
17027         {
17028           emit_move_insn (low[0], high[1]);
17029           emit_move_insn (high[0], low[0]);
17030           emit_insn ((mode == DImode
17031                       ? gen_ashrsi3
17032                       : gen_ashrdi3) (high[0], high[0],
17033                                       GEN_INT (single_width - 1)));
17034           if (count > single_width)
17035             emit_insn ((mode == DImode
17036                         ? gen_ashrsi3
17037                         : gen_ashrdi3) (low[0], low[0],
17038                                         GEN_INT (count - single_width)));
17039         }
17040       else
17041         {
17042           if (!rtx_equal_p (operands[0], operands[1]))
17043             emit_move_insn (operands[0], operands[1]);
17044           emit_insn ((mode == DImode
17045                       ? gen_x86_shrd
17046                       : gen_x86_64_shrd) (low[0], high[0], GEN_INT (count)));
17047           emit_insn ((mode == DImode
17048                       ? gen_ashrsi3
17049                       : gen_ashrdi3) (high[0], high[0], GEN_INT (count)));
17050         }
17051     }
17052   else
17053     {
17054       if (!rtx_equal_p (operands[0], operands[1]))
17055         emit_move_insn (operands[0], operands[1]);
17056
17057       (mode == DImode ? split_di : split_ti) (operands, 1, low, high);
17058
17059       emit_insn ((mode == DImode
17060                   ? gen_x86_shrd
17061                   : gen_x86_64_shrd) (low[0], high[0], operands[2]));
17062       emit_insn ((mode == DImode
17063                   ? gen_ashrsi3
17064                   : gen_ashrdi3)  (high[0], high[0], operands[2]));
17065
17066       if (TARGET_CMOVE && scratch)
17067         {
17068           emit_move_insn (scratch, high[0]);
17069           emit_insn ((mode == DImode
17070                       ? gen_ashrsi3
17071                       : gen_ashrdi3) (scratch, scratch,
17072                                       GEN_INT (single_width - 1)));
17073           emit_insn ((mode == DImode
17074                       ? gen_x86_shift_adj_1
17075                       : gen_x86_64_shift_adj_1) (low[0], high[0], operands[2],
17076                                                  scratch));
17077         }
17078       else
17079         emit_insn ((mode == DImode
17080                     ? gen_x86_shift_adj_3
17081                     : gen_x86_64_shift_adj_3) (low[0], high[0], operands[2]));
17082     }
17083 }
17084
17085 void
17086 ix86_split_lshr (rtx *operands, rtx scratch, enum machine_mode mode)
17087 {
17088   rtx low[2], high[2];
17089   int count;
17090   const int single_width = mode == DImode ? 32 : 64;
17091
17092   if (CONST_INT_P (operands[2]))
17093     {
17094       (mode == DImode ? split_di : split_ti) (operands, 2, low, high);
17095       count = INTVAL (operands[2]) & (single_width * 2 - 1);
17096
17097       if (count >= single_width)
17098         {
17099           emit_move_insn (low[0], high[1]);
17100           ix86_expand_clear (high[0]);
17101
17102           if (count > single_width)
17103             emit_insn ((mode == DImode
17104                         ? gen_lshrsi3
17105                         : gen_lshrdi3) (low[0], low[0],
17106                                         GEN_INT (count - single_width)));
17107         }
17108       else
17109         {
17110           if (!rtx_equal_p (operands[0], operands[1]))
17111             emit_move_insn (operands[0], operands[1]);
17112           emit_insn ((mode == DImode
17113                       ? gen_x86_shrd
17114                       : gen_x86_64_shrd) (low[0], high[0], GEN_INT (count)));
17115           emit_insn ((mode == DImode
17116                       ? gen_lshrsi3
17117                       : gen_lshrdi3) (high[0], high[0], GEN_INT (count)));
17118         }
17119     }
17120   else
17121     {
17122       if (!rtx_equal_p (operands[0], operands[1]))
17123         emit_move_insn (operands[0], operands[1]);
17124
17125       (mode == DImode ? split_di : split_ti) (operands, 1, low, high);
17126
17127       emit_insn ((mode == DImode
17128                   ? gen_x86_shrd
17129                   : gen_x86_64_shrd) (low[0], high[0], operands[2]));
17130       emit_insn ((mode == DImode
17131                   ? gen_lshrsi3
17132                   : gen_lshrdi3) (high[0], high[0], operands[2]));
17133
17134       /* Heh.  By reversing the arguments, we can reuse this pattern.  */
17135       if (TARGET_CMOVE && scratch)
17136         {
17137           ix86_expand_clear (scratch);
17138           emit_insn ((mode == DImode
17139                       ? gen_x86_shift_adj_1
17140                       : gen_x86_64_shift_adj_1) (low[0], high[0], operands[2],
17141                                                  scratch));
17142         }
17143       else
17144         emit_insn ((mode == DImode
17145                     ? gen_x86_shift_adj_2
17146                     : gen_x86_64_shift_adj_2) (low[0], high[0], operands[2]));
17147     }
17148 }
17149
17150 /* Predict just emitted jump instruction to be taken with probability PROB.  */
17151 static void
17152 predict_jump (int prob)
17153 {
17154   rtx insn = get_last_insn ();
17155   gcc_assert (JUMP_P (insn));
17156   add_reg_note (insn, REG_BR_PROB, GEN_INT (prob));
17157 }
17158
17159 /* Helper function for the string operations below.  Dest VARIABLE whether
17160    it is aligned to VALUE bytes.  If true, jump to the label.  */
17161 static rtx
17162 ix86_expand_aligntest (rtx variable, int value, bool epilogue)
17163 {
17164   rtx label = gen_label_rtx ();
17165   rtx tmpcount = gen_reg_rtx (GET_MODE (variable));
17166   if (GET_MODE (variable) == DImode)
17167     emit_insn (gen_anddi3 (tmpcount, variable, GEN_INT (value)));
17168   else
17169     emit_insn (gen_andsi3 (tmpcount, variable, GEN_INT (value)));
17170   emit_cmp_and_jump_insns (tmpcount, const0_rtx, EQ, 0, GET_MODE (variable),
17171                            1, label);
17172   if (epilogue)
17173     predict_jump (REG_BR_PROB_BASE * 50 / 100);
17174   else
17175     predict_jump (REG_BR_PROB_BASE * 90 / 100);
17176   return label;
17177 }
17178
17179 /* Adjust COUNTER by the VALUE.  */
17180 static void
17181 ix86_adjust_counter (rtx countreg, HOST_WIDE_INT value)
17182 {
17183   if (GET_MODE (countreg) == DImode)
17184     emit_insn (gen_adddi3 (countreg, countreg, GEN_INT (-value)));
17185   else
17186     emit_insn (gen_addsi3 (countreg, countreg, GEN_INT (-value)));
17187 }
17188
17189 /* Zero extend possibly SImode EXP to Pmode register.  */
17190 rtx
17191 ix86_zero_extend_to_Pmode (rtx exp)
17192 {
17193   rtx r;
17194   if (GET_MODE (exp) == VOIDmode)
17195     return force_reg (Pmode, exp);
17196   if (GET_MODE (exp) == Pmode)
17197     return copy_to_mode_reg (Pmode, exp);
17198   r = gen_reg_rtx (Pmode);
17199   emit_insn (gen_zero_extendsidi2 (r, exp));
17200   return r;
17201 }
17202
17203 /* Divide COUNTREG by SCALE.  */
17204 static rtx
17205 scale_counter (rtx countreg, int scale)
17206 {
17207   rtx sc;
17208
17209   if (scale == 1)
17210     return countreg;
17211   if (CONST_INT_P (countreg))
17212     return GEN_INT (INTVAL (countreg) / scale);
17213   gcc_assert (REG_P (countreg));
17214
17215   sc = expand_simple_binop (GET_MODE (countreg), LSHIFTRT, countreg,
17216                             GEN_INT (exact_log2 (scale)),
17217                             NULL, 1, OPTAB_DIRECT);
17218   return sc;
17219 }
17220
17221 /* Return mode for the memcpy/memset loop counter.  Prefer SImode over
17222    DImode for constant loop counts.  */
17223
17224 static enum machine_mode
17225 counter_mode (rtx count_exp)
17226 {
17227   if (GET_MODE (count_exp) != VOIDmode)
17228     return GET_MODE (count_exp);
17229   if (!CONST_INT_P (count_exp))
17230     return Pmode;
17231   if (TARGET_64BIT && (INTVAL (count_exp) & ~0xffffffff))
17232     return DImode;
17233   return SImode;
17234 }
17235
17236 /* When SRCPTR is non-NULL, output simple loop to move memory
17237    pointer to SRCPTR to DESTPTR via chunks of MODE unrolled UNROLL times,
17238    overall size is COUNT specified in bytes.  When SRCPTR is NULL, output the
17239    equivalent loop to set memory by VALUE (supposed to be in MODE).
17240
17241    The size is rounded down to whole number of chunk size moved at once.
17242    SRCMEM and DESTMEM provide MEMrtx to feed proper aliasing info.  */
17243
17244
17245 static void
17246 expand_set_or_movmem_via_loop (rtx destmem, rtx srcmem,
17247                                rtx destptr, rtx srcptr, rtx value,
17248                                rtx count, enum machine_mode mode, int unroll,
17249                                int expected_size)
17250 {
17251   rtx out_label, top_label, iter, tmp;
17252   enum machine_mode iter_mode = counter_mode (count);
17253   rtx piece_size = GEN_INT (GET_MODE_SIZE (mode) * unroll);
17254   rtx piece_size_mask = GEN_INT (~((GET_MODE_SIZE (mode) * unroll) - 1));
17255   rtx size;
17256   rtx x_addr;
17257   rtx y_addr;
17258   int i;
17259
17260   top_label = gen_label_rtx ();
17261   out_label = gen_label_rtx ();
17262   iter = gen_reg_rtx (iter_mode);
17263
17264   size = expand_simple_binop (iter_mode, AND, count, piece_size_mask,
17265                               NULL, 1, OPTAB_DIRECT);
17266   /* Those two should combine.  */
17267   if (piece_size == const1_rtx)
17268     {
17269       emit_cmp_and_jump_insns (size, const0_rtx, EQ, NULL_RTX, iter_mode,
17270                                true, out_label);
17271       predict_jump (REG_BR_PROB_BASE * 10 / 100);
17272     }
17273   emit_move_insn (iter, const0_rtx);
17274
17275   emit_label (top_label);
17276
17277   tmp = convert_modes (Pmode, iter_mode, iter, true);
17278   x_addr = gen_rtx_PLUS (Pmode, destptr, tmp);
17279   destmem = change_address (destmem, mode, x_addr);
17280
17281   if (srcmem)
17282     {
17283       y_addr = gen_rtx_PLUS (Pmode, srcptr, copy_rtx (tmp));
17284       srcmem = change_address (srcmem, mode, y_addr);
17285
17286       /* When unrolling for chips that reorder memory reads and writes,
17287          we can save registers by using single temporary.
17288          Also using 4 temporaries is overkill in 32bit mode.  */
17289       if (!TARGET_64BIT && 0)
17290         {
17291           for (i = 0; i < unroll; i++)
17292             {
17293               if (i)
17294                 {
17295                   destmem =
17296                     adjust_address (copy_rtx (destmem), mode, GET_MODE_SIZE (mode));
17297                   srcmem =
17298                     adjust_address (copy_rtx (srcmem), mode, GET_MODE_SIZE (mode));
17299                 }
17300               emit_move_insn (destmem, srcmem);
17301             }
17302         }
17303       else
17304         {
17305           rtx tmpreg[4];
17306           gcc_assert (unroll <= 4);
17307           for (i = 0; i < unroll; i++)
17308             {
17309               tmpreg[i] = gen_reg_rtx (mode);
17310               if (i)
17311                 {
17312                   srcmem =
17313                     adjust_address (copy_rtx (srcmem), mode, GET_MODE_SIZE (mode));
17314                 }
17315               emit_move_insn (tmpreg[i], srcmem);
17316             }
17317           for (i = 0; i < unroll; i++)
17318             {
17319               if (i)
17320                 {
17321                   destmem =
17322                     adjust_address (copy_rtx (destmem), mode, GET_MODE_SIZE (mode));
17323                 }
17324               emit_move_insn (destmem, tmpreg[i]);
17325             }
17326         }
17327     }
17328   else
17329     for (i = 0; i < unroll; i++)
17330       {
17331         if (i)
17332           destmem =
17333             adjust_address (copy_rtx (destmem), mode, GET_MODE_SIZE (mode));
17334         emit_move_insn (destmem, value);
17335       }
17336
17337   tmp = expand_simple_binop (iter_mode, PLUS, iter, piece_size, iter,
17338                              true, OPTAB_LIB_WIDEN);
17339   if (tmp != iter)
17340     emit_move_insn (iter, tmp);
17341
17342   emit_cmp_and_jump_insns (iter, size, LT, NULL_RTX, iter_mode,
17343                            true, top_label);
17344   if (expected_size != -1)
17345     {
17346       expected_size /= GET_MODE_SIZE (mode) * unroll;
17347       if (expected_size == 0)
17348         predict_jump (0);
17349       else if (expected_size > REG_BR_PROB_BASE)
17350         predict_jump (REG_BR_PROB_BASE - 1);
17351       else
17352         predict_jump (REG_BR_PROB_BASE - (REG_BR_PROB_BASE + expected_size / 2) / expected_size);
17353     }
17354   else
17355     predict_jump (REG_BR_PROB_BASE * 80 / 100);
17356   iter = ix86_zero_extend_to_Pmode (iter);
17357   tmp = expand_simple_binop (Pmode, PLUS, destptr, iter, destptr,
17358                              true, OPTAB_LIB_WIDEN);
17359   if (tmp != destptr)
17360     emit_move_insn (destptr, tmp);
17361   if (srcptr)
17362     {
17363       tmp = expand_simple_binop (Pmode, PLUS, srcptr, iter, srcptr,
17364                                  true, OPTAB_LIB_WIDEN);
17365       if (tmp != srcptr)
17366         emit_move_insn (srcptr, tmp);
17367     }
17368   emit_label (out_label);
17369 }
17370
17371 /* Output "rep; mov" instruction.
17372    Arguments have same meaning as for previous function */
17373 static void
17374 expand_movmem_via_rep_mov (rtx destmem, rtx srcmem,
17375                            rtx destptr, rtx srcptr,
17376                            rtx count,
17377                            enum machine_mode mode)
17378 {
17379   rtx destexp;
17380   rtx srcexp;
17381   rtx countreg;
17382
17383   /* If the size is known, it is shorter to use rep movs.  */
17384   if (mode == QImode && CONST_INT_P (count)
17385       && !(INTVAL (count) & 3))
17386     mode = SImode;
17387
17388   if (destptr != XEXP (destmem, 0) || GET_MODE (destmem) != BLKmode)
17389     destmem = adjust_automodify_address_nv (destmem, BLKmode, destptr, 0);
17390   if (srcptr != XEXP (srcmem, 0) || GET_MODE (srcmem) != BLKmode)
17391     srcmem = adjust_automodify_address_nv (srcmem, BLKmode, srcptr, 0);
17392   countreg = ix86_zero_extend_to_Pmode (scale_counter (count, GET_MODE_SIZE (mode)));
17393   if (mode != QImode)
17394     {
17395       destexp = gen_rtx_ASHIFT (Pmode, countreg,
17396                                 GEN_INT (exact_log2 (GET_MODE_SIZE (mode))));
17397       destexp = gen_rtx_PLUS (Pmode, destexp, destptr);
17398       srcexp = gen_rtx_ASHIFT (Pmode, countreg,
17399                                GEN_INT (exact_log2 (GET_MODE_SIZE (mode))));
17400       srcexp = gen_rtx_PLUS (Pmode, srcexp, srcptr);
17401     }
17402   else
17403     {
17404       destexp = gen_rtx_PLUS (Pmode, destptr, countreg);
17405       srcexp = gen_rtx_PLUS (Pmode, srcptr, countreg);
17406     }
17407   if (CONST_INT_P (count))
17408     {
17409       count = GEN_INT (INTVAL (count)
17410                        & ~((HOST_WIDE_INT) GET_MODE_SIZE (mode) - 1));
17411       destmem = shallow_copy_rtx (destmem);
17412       srcmem = shallow_copy_rtx (srcmem);
17413       set_mem_size (destmem, count);
17414       set_mem_size (srcmem, count);
17415     }
17416   else
17417     {
17418       if (MEM_SIZE (destmem))
17419         set_mem_size (destmem, NULL_RTX);
17420       if (MEM_SIZE (srcmem))
17421         set_mem_size (srcmem, NULL_RTX);
17422     }
17423   emit_insn (gen_rep_mov (destptr, destmem, srcptr, srcmem, countreg,
17424                           destexp, srcexp));
17425 }
17426
17427 /* Output "rep; stos" instruction.
17428    Arguments have same meaning as for previous function */
17429 static void
17430 expand_setmem_via_rep_stos (rtx destmem, rtx destptr, rtx value,
17431                             rtx count, enum machine_mode mode,
17432                             rtx orig_value)
17433 {
17434   rtx destexp;
17435   rtx countreg;
17436
17437   if (destptr != XEXP (destmem, 0) || GET_MODE (destmem) != BLKmode)
17438     destmem = adjust_automodify_address_nv (destmem, BLKmode, destptr, 0);
17439   value = force_reg (mode, gen_lowpart (mode, value));
17440   countreg = ix86_zero_extend_to_Pmode (scale_counter (count, GET_MODE_SIZE (mode)));
17441   if (mode != QImode)
17442     {
17443       destexp = gen_rtx_ASHIFT (Pmode, countreg,
17444                                 GEN_INT (exact_log2 (GET_MODE_SIZE (mode))));
17445       destexp = gen_rtx_PLUS (Pmode, destexp, destptr);
17446     }
17447   else
17448     destexp = gen_rtx_PLUS (Pmode, destptr, countreg);
17449   if (orig_value == const0_rtx && CONST_INT_P (count))
17450     {
17451       count = GEN_INT (INTVAL (count)
17452                        & ~((HOST_WIDE_INT) GET_MODE_SIZE (mode) - 1));
17453       destmem = shallow_copy_rtx (destmem);
17454       set_mem_size (destmem, count);
17455     }
17456   else if (MEM_SIZE (destmem))
17457     set_mem_size (destmem, NULL_RTX);
17458   emit_insn (gen_rep_stos (destptr, countreg, destmem, value, destexp));
17459 }
17460
17461 static void
17462 emit_strmov (rtx destmem, rtx srcmem,
17463              rtx destptr, rtx srcptr, enum machine_mode mode, int offset)
17464 {
17465   rtx src = adjust_automodify_address_nv (srcmem, mode, srcptr, offset);
17466   rtx dest = adjust_automodify_address_nv (destmem, mode, destptr, offset);
17467   emit_insn (gen_strmov (destptr, dest, srcptr, src));
17468 }
17469
17470 /* Output code to copy at most count & (max_size - 1) bytes from SRC to DEST.  */
17471 static void
17472 expand_movmem_epilogue (rtx destmem, rtx srcmem,
17473                         rtx destptr, rtx srcptr, rtx count, int max_size)
17474 {
17475   rtx src, dest;
17476   if (CONST_INT_P (count))
17477     {
17478       HOST_WIDE_INT countval = INTVAL (count);
17479       int offset = 0;
17480
17481       if ((countval & 0x10) && max_size > 16)
17482         {
17483           if (TARGET_64BIT)
17484             {
17485               emit_strmov (destmem, srcmem, destptr, srcptr, DImode, offset);
17486               emit_strmov (destmem, srcmem, destptr, srcptr, DImode, offset + 8);
17487             }
17488           else
17489             gcc_unreachable ();
17490           offset += 16;
17491         }
17492       if ((countval & 0x08) && max_size > 8)
17493         {
17494           if (TARGET_64BIT)
17495             emit_strmov (destmem, srcmem, destptr, srcptr, DImode, offset);
17496           else
17497             {
17498               emit_strmov (destmem, srcmem, destptr, srcptr, SImode, offset);
17499               emit_strmov (destmem, srcmem, destptr, srcptr, SImode, offset + 4);
17500             }
17501           offset += 8;
17502         }
17503       if ((countval & 0x04) && max_size > 4)
17504         {
17505           emit_strmov (destmem, srcmem, destptr, srcptr, SImode, offset);
17506           offset += 4;
17507         }
17508       if ((countval & 0x02) && max_size > 2)
17509         {
17510           emit_strmov (destmem, srcmem, destptr, srcptr, HImode, offset);
17511           offset += 2;
17512         }
17513       if ((countval & 0x01) && max_size > 1)
17514         {
17515           emit_strmov (destmem, srcmem, destptr, srcptr, QImode, offset);
17516           offset += 1;
17517         }
17518       return;
17519     }
17520   if (max_size > 8)
17521     {
17522       count = expand_simple_binop (GET_MODE (count), AND, count, GEN_INT (max_size - 1),
17523                                     count, 1, OPTAB_DIRECT);
17524       expand_set_or_movmem_via_loop (destmem, srcmem, destptr, srcptr, NULL,
17525                                      count, QImode, 1, 4);
17526       return;
17527     }
17528
17529   /* When there are stringops, we can cheaply increase dest and src pointers.
17530      Otherwise we save code size by maintaining offset (zero is readily
17531      available from preceding rep operation) and using x86 addressing modes.
17532    */
17533   if (TARGET_SINGLE_STRINGOP)
17534     {
17535       if (max_size > 4)
17536         {
17537           rtx label = ix86_expand_aligntest (count, 4, true);
17538           src = change_address (srcmem, SImode, srcptr);
17539           dest = change_address (destmem, SImode, destptr);
17540           emit_insn (gen_strmov (destptr, dest, srcptr, src));
17541           emit_label (label);
17542           LABEL_NUSES (label) = 1;
17543         }
17544       if (max_size > 2)
17545         {
17546           rtx label = ix86_expand_aligntest (count, 2, true);
17547           src = change_address (srcmem, HImode, srcptr);
17548           dest = change_address (destmem, HImode, destptr);
17549           emit_insn (gen_strmov (destptr, dest, srcptr, src));
17550           emit_label (label);
17551           LABEL_NUSES (label) = 1;
17552         }
17553       if (max_size > 1)
17554         {
17555           rtx label = ix86_expand_aligntest (count, 1, true);
17556           src = change_address (srcmem, QImode, srcptr);
17557           dest = change_address (destmem, QImode, destptr);
17558           emit_insn (gen_strmov (destptr, dest, srcptr, src));
17559           emit_label (label);
17560           LABEL_NUSES (label) = 1;
17561         }
17562     }
17563   else
17564     {
17565       rtx offset = force_reg (Pmode, const0_rtx);
17566       rtx tmp;
17567
17568       if (max_size > 4)
17569         {
17570           rtx label = ix86_expand_aligntest (count, 4, true);
17571           src = change_address (srcmem, SImode, srcptr);
17572           dest = change_address (destmem, SImode, destptr);
17573           emit_move_insn (dest, src);
17574           tmp = expand_simple_binop (Pmode, PLUS, offset, GEN_INT (4), NULL,
17575                                      true, OPTAB_LIB_WIDEN);
17576           if (tmp != offset)
17577             emit_move_insn (offset, tmp);
17578           emit_label (label);
17579           LABEL_NUSES (label) = 1;
17580         }
17581       if (max_size > 2)
17582         {
17583           rtx label = ix86_expand_aligntest (count, 2, true);
17584           tmp = gen_rtx_PLUS (Pmode, srcptr, offset);
17585           src = change_address (srcmem, HImode, tmp);
17586           tmp = gen_rtx_PLUS (Pmode, destptr, offset);
17587           dest = change_address (destmem, HImode, tmp);
17588           emit_move_insn (dest, src);
17589           tmp = expand_simple_binop (Pmode, PLUS, offset, GEN_INT (2), tmp,
17590                                      true, OPTAB_LIB_WIDEN);
17591           if (tmp != offset)
17592             emit_move_insn (offset, tmp);
17593           emit_label (label);
17594           LABEL_NUSES (label) = 1;
17595         }
17596       if (max_size > 1)
17597         {
17598           rtx label = ix86_expand_aligntest (count, 1, true);
17599           tmp = gen_rtx_PLUS (Pmode, srcptr, offset);
17600           src = change_address (srcmem, QImode, tmp);
17601           tmp = gen_rtx_PLUS (Pmode, destptr, offset);
17602           dest = change_address (destmem, QImode, tmp);
17603           emit_move_insn (dest, src);
17604           emit_label (label);
17605           LABEL_NUSES (label) = 1;
17606         }
17607     }
17608 }
17609
17610 /* Output code to set at most count & (max_size - 1) bytes starting by DEST.  */
17611 static void
17612 expand_setmem_epilogue_via_loop (rtx destmem, rtx destptr, rtx value,
17613                                  rtx count, int max_size)
17614 {
17615   count =
17616     expand_simple_binop (counter_mode (count), AND, count,
17617                          GEN_INT (max_size - 1), count, 1, OPTAB_DIRECT);
17618   expand_set_or_movmem_via_loop (destmem, NULL, destptr, NULL,
17619                                  gen_lowpart (QImode, value), count, QImode,
17620                                  1, max_size / 2);
17621 }
17622
17623 /* Output code to set at most count & (max_size - 1) bytes starting by DEST.  */
17624 static void
17625 expand_setmem_epilogue (rtx destmem, rtx destptr, rtx value, rtx count, int max_size)
17626 {
17627   rtx dest;
17628
17629   if (CONST_INT_P (count))
17630     {
17631       HOST_WIDE_INT countval = INTVAL (count);
17632       int offset = 0;
17633
17634       if ((countval & 0x10) && max_size > 16)
17635         {
17636           if (TARGET_64BIT)
17637             {
17638               dest = adjust_automodify_address_nv (destmem, DImode, destptr, offset);
17639               emit_insn (gen_strset (destptr, dest, value));
17640               dest = adjust_automodify_address_nv (destmem, DImode, destptr, offset + 8);
17641               emit_insn (gen_strset (destptr, dest, value));
17642             }
17643           else
17644             gcc_unreachable ();
17645           offset += 16;
17646         }
17647       if ((countval & 0x08) && max_size > 8)
17648         {
17649           if (TARGET_64BIT)
17650             {
17651               dest = adjust_automodify_address_nv (destmem, DImode, destptr, offset);
17652               emit_insn (gen_strset (destptr, dest, value));
17653             }
17654           else
17655             {
17656               dest = adjust_automodify_address_nv (destmem, SImode, destptr, offset);
17657               emit_insn (gen_strset (destptr, dest, value));
17658               dest = adjust_automodify_address_nv (destmem, SImode, destptr, offset + 4);
17659               emit_insn (gen_strset (destptr, dest, value));
17660             }
17661           offset += 8;
17662         }
17663       if ((countval & 0x04) && max_size > 4)
17664         {
17665           dest = adjust_automodify_address_nv (destmem, SImode, destptr, offset);
17666           emit_insn (gen_strset (destptr, dest, gen_lowpart (SImode, value)));
17667           offset += 4;
17668         }
17669       if ((countval & 0x02) && max_size > 2)
17670         {
17671           dest = adjust_automodify_address_nv (destmem, HImode, destptr, offset);
17672           emit_insn (gen_strset (destptr, dest, gen_lowpart (HImode, value)));
17673           offset += 2;
17674         }
17675       if ((countval & 0x01) && max_size > 1)
17676         {
17677           dest = adjust_automodify_address_nv (destmem, QImode, destptr, offset);
17678           emit_insn (gen_strset (destptr, dest, gen_lowpart (QImode, value)));
17679           offset += 1;
17680         }
17681       return;
17682     }
17683   if (max_size > 32)
17684     {
17685       expand_setmem_epilogue_via_loop (destmem, destptr, value, count, max_size);
17686       return;
17687     }
17688   if (max_size > 16)
17689     {
17690       rtx label = ix86_expand_aligntest (count, 16, true);
17691       if (TARGET_64BIT)
17692         {
17693           dest = change_address (destmem, DImode, destptr);
17694           emit_insn (gen_strset (destptr, dest, value));
17695           emit_insn (gen_strset (destptr, dest, value));
17696         }
17697       else
17698         {
17699           dest = change_address (destmem, SImode, destptr);
17700           emit_insn (gen_strset (destptr, dest, value));
17701           emit_insn (gen_strset (destptr, dest, value));
17702           emit_insn (gen_strset (destptr, dest, value));
17703           emit_insn (gen_strset (destptr, dest, value));
17704         }
17705       emit_label (label);
17706       LABEL_NUSES (label) = 1;
17707     }
17708   if (max_size > 8)
17709     {
17710       rtx label = ix86_expand_aligntest (count, 8, true);
17711       if (TARGET_64BIT)
17712         {
17713           dest = change_address (destmem, DImode, destptr);
17714           emit_insn (gen_strset (destptr, dest, value));
17715         }
17716       else
17717         {
17718           dest = change_address (destmem, SImode, destptr);
17719           emit_insn (gen_strset (destptr, dest, value));
17720           emit_insn (gen_strset (destptr, dest, value));
17721         }
17722       emit_label (label);
17723       LABEL_NUSES (label) = 1;
17724     }
17725   if (max_size > 4)
17726     {
17727       rtx label = ix86_expand_aligntest (count, 4, true);
17728       dest = change_address (destmem, SImode, destptr);
17729       emit_insn (gen_strset (destptr, dest, gen_lowpart (SImode, value)));
17730       emit_label (label);
17731       LABEL_NUSES (label) = 1;
17732     }
17733   if (max_size > 2)
17734     {
17735       rtx label = ix86_expand_aligntest (count, 2, true);
17736       dest = change_address (destmem, HImode, destptr);
17737       emit_insn (gen_strset (destptr, dest, gen_lowpart (HImode, value)));
17738       emit_label (label);
17739       LABEL_NUSES (label) = 1;
17740     }
17741   if (max_size > 1)
17742     {
17743       rtx label = ix86_expand_aligntest (count, 1, true);
17744       dest = change_address (destmem, QImode, destptr);
17745       emit_insn (gen_strset (destptr, dest, gen_lowpart (QImode, value)));
17746       emit_label (label);
17747       LABEL_NUSES (label) = 1;
17748     }
17749 }
17750
17751 /* Copy enough from DEST to SRC to align DEST known to by aligned by ALIGN to
17752    DESIRED_ALIGNMENT.  */
17753 static void
17754 expand_movmem_prologue (rtx destmem, rtx srcmem,
17755                         rtx destptr, rtx srcptr, rtx count,
17756                         int align, int desired_alignment)
17757 {
17758   if (align <= 1 && desired_alignment > 1)
17759     {
17760       rtx label = ix86_expand_aligntest (destptr, 1, false);
17761       srcmem = change_address (srcmem, QImode, srcptr);
17762       destmem = change_address (destmem, QImode, destptr);
17763       emit_insn (gen_strmov (destptr, destmem, srcptr, srcmem));
17764       ix86_adjust_counter (count, 1);
17765       emit_label (label);
17766       LABEL_NUSES (label) = 1;
17767     }
17768   if (align <= 2 && desired_alignment > 2)
17769     {
17770       rtx label = ix86_expand_aligntest (destptr, 2, false);
17771       srcmem = change_address (srcmem, HImode, srcptr);
17772       destmem = change_address (destmem, HImode, destptr);
17773       emit_insn (gen_strmov (destptr, destmem, srcptr, srcmem));
17774       ix86_adjust_counter (count, 2);
17775       emit_label (label);
17776       LABEL_NUSES (label) = 1;
17777     }
17778   if (align <= 4 && desired_alignment > 4)
17779     {
17780       rtx label = ix86_expand_aligntest (destptr, 4, false);
17781       srcmem = change_address (srcmem, SImode, srcptr);
17782       destmem = change_address (destmem, SImode, destptr);
17783       emit_insn (gen_strmov (destptr, destmem, srcptr, srcmem));
17784       ix86_adjust_counter (count, 4);
17785       emit_label (label);
17786       LABEL_NUSES (label) = 1;
17787     }
17788   gcc_assert (desired_alignment <= 8);
17789 }
17790
17791 /* Copy enough from DST to SRC to align DST known to DESIRED_ALIGN.
17792    ALIGN_BYTES is how many bytes need to be copied.  */
17793 static rtx
17794 expand_constant_movmem_prologue (rtx dst, rtx *srcp, rtx destreg, rtx srcreg,
17795                                  int desired_align, int align_bytes)
17796 {
17797   rtx src = *srcp;
17798   rtx src_size, dst_size;
17799   int off = 0;
17800   int src_align_bytes = get_mem_align_offset (src, desired_align * BITS_PER_UNIT);
17801   if (src_align_bytes >= 0)
17802     src_align_bytes = desired_align - src_align_bytes;
17803   src_size = MEM_SIZE (src);
17804   dst_size = MEM_SIZE (dst);
17805   if (align_bytes & 1)
17806     {
17807       dst = adjust_automodify_address_nv (dst, QImode, destreg, 0);
17808       src = adjust_automodify_address_nv (src, QImode, srcreg, 0);
17809       off = 1;
17810       emit_insn (gen_strmov (destreg, dst, srcreg, src));
17811     }
17812   if (align_bytes & 2)
17813     {
17814       dst = adjust_automodify_address_nv (dst, HImode, destreg, off);
17815       src = adjust_automodify_address_nv (src, HImode, srcreg, off);
17816       if (MEM_ALIGN (dst) < 2 * BITS_PER_UNIT)
17817         set_mem_align (dst, 2 * BITS_PER_UNIT);
17818       if (src_align_bytes >= 0
17819           && (src_align_bytes & 1) == (align_bytes & 1)
17820           && MEM_ALIGN (src) < 2 * BITS_PER_UNIT)
17821         set_mem_align (src, 2 * BITS_PER_UNIT);
17822       off = 2;
17823       emit_insn (gen_strmov (destreg, dst, srcreg, src));
17824     }
17825   if (align_bytes & 4)
17826     {
17827       dst = adjust_automodify_address_nv (dst, SImode, destreg, off);
17828       src = adjust_automodify_address_nv (src, SImode, srcreg, off);
17829       if (MEM_ALIGN (dst) < 4 * BITS_PER_UNIT)
17830         set_mem_align (dst, 4 * BITS_PER_UNIT);
17831       if (src_align_bytes >= 0)
17832         {
17833           unsigned int src_align = 0;
17834           if ((src_align_bytes & 3) == (align_bytes & 3))
17835             src_align = 4;
17836           else if ((src_align_bytes & 1) == (align_bytes & 1))
17837             src_align = 2;
17838           if (MEM_ALIGN (src) < src_align * BITS_PER_UNIT)
17839             set_mem_align (src, src_align * BITS_PER_UNIT);
17840         }
17841       off = 4;
17842       emit_insn (gen_strmov (destreg, dst, srcreg, src));
17843     }
17844   dst = adjust_automodify_address_nv (dst, BLKmode, destreg, off);
17845   src = adjust_automodify_address_nv (src, BLKmode, srcreg, off);
17846   if (MEM_ALIGN (dst) < (unsigned int) desired_align * BITS_PER_UNIT)
17847     set_mem_align (dst, desired_align * BITS_PER_UNIT);
17848   if (src_align_bytes >= 0)
17849     {
17850       unsigned int src_align = 0;
17851       if ((src_align_bytes & 7) == (align_bytes & 7))
17852         src_align = 8;
17853       else if ((src_align_bytes & 3) == (align_bytes & 3))
17854         src_align = 4;
17855       else if ((src_align_bytes & 1) == (align_bytes & 1))
17856         src_align = 2;
17857       if (src_align > (unsigned int) desired_align)
17858         src_align = desired_align;
17859       if (MEM_ALIGN (src) < src_align * BITS_PER_UNIT)
17860         set_mem_align (src, src_align * BITS_PER_UNIT);
17861     }
17862   if (dst_size)
17863     set_mem_size (dst, GEN_INT (INTVAL (dst_size) - align_bytes));
17864   if (src_size)
17865     set_mem_size (dst, GEN_INT (INTVAL (src_size) - align_bytes));
17866   *srcp = src;
17867   return dst;
17868 }
17869
17870 /* Set enough from DEST to align DEST known to by aligned by ALIGN to
17871    DESIRED_ALIGNMENT.  */
17872 static void
17873 expand_setmem_prologue (rtx destmem, rtx destptr, rtx value, rtx count,
17874                         int align, int desired_alignment)
17875 {
17876   if (align <= 1 && desired_alignment > 1)
17877     {
17878       rtx label = ix86_expand_aligntest (destptr, 1, false);
17879       destmem = change_address (destmem, QImode, destptr);
17880       emit_insn (gen_strset (destptr, destmem, gen_lowpart (QImode, value)));
17881       ix86_adjust_counter (count, 1);
17882       emit_label (label);
17883       LABEL_NUSES (label) = 1;
17884     }
17885   if (align <= 2 && desired_alignment > 2)
17886     {
17887       rtx label = ix86_expand_aligntest (destptr, 2, false);
17888       destmem = change_address (destmem, HImode, destptr);
17889       emit_insn (gen_strset (destptr, destmem, gen_lowpart (HImode, value)));
17890       ix86_adjust_counter (count, 2);
17891       emit_label (label);
17892       LABEL_NUSES (label) = 1;
17893     }
17894   if (align <= 4 && desired_alignment > 4)
17895     {
17896       rtx label = ix86_expand_aligntest (destptr, 4, false);
17897       destmem = change_address (destmem, SImode, destptr);
17898       emit_insn (gen_strset (destptr, destmem, gen_lowpart (SImode, value)));
17899       ix86_adjust_counter (count, 4);
17900       emit_label (label);
17901       LABEL_NUSES (label) = 1;
17902     }
17903   gcc_assert (desired_alignment <= 8);
17904 }
17905
17906 /* Set enough from DST to align DST known to by aligned by ALIGN to
17907    DESIRED_ALIGN.  ALIGN_BYTES is how many bytes need to be stored.  */
17908 static rtx
17909 expand_constant_setmem_prologue (rtx dst, rtx destreg, rtx value,
17910                                  int desired_align, int align_bytes)
17911 {
17912   int off = 0;
17913   rtx dst_size = MEM_SIZE (dst);
17914   if (align_bytes & 1)
17915     {
17916       dst = adjust_automodify_address_nv (dst, QImode, destreg, 0);
17917       off = 1;
17918       emit_insn (gen_strset (destreg, dst,
17919                              gen_lowpart (QImode, value)));
17920     }
17921   if (align_bytes & 2)
17922     {
17923       dst = adjust_automodify_address_nv (dst, HImode, destreg, off);
17924       if (MEM_ALIGN (dst) < 2 * BITS_PER_UNIT)
17925         set_mem_align (dst, 2 * BITS_PER_UNIT);
17926       off = 2;
17927       emit_insn (gen_strset (destreg, dst,
17928                              gen_lowpart (HImode, value)));
17929     }
17930   if (align_bytes & 4)
17931     {
17932       dst = adjust_automodify_address_nv (dst, SImode, destreg, off);
17933       if (MEM_ALIGN (dst) < 4 * BITS_PER_UNIT)
17934         set_mem_align (dst, 4 * BITS_PER_UNIT);
17935       off = 4;
17936       emit_insn (gen_strset (destreg, dst,
17937                              gen_lowpart (SImode, value)));
17938     }
17939   dst = adjust_automodify_address_nv (dst, BLKmode, destreg, off);
17940   if (MEM_ALIGN (dst) < (unsigned int) desired_align * BITS_PER_UNIT)
17941     set_mem_align (dst, desired_align * BITS_PER_UNIT);
17942   if (dst_size)
17943     set_mem_size (dst, GEN_INT (INTVAL (dst_size) - align_bytes));
17944   return dst;
17945 }
17946
17947 /* Given COUNT and EXPECTED_SIZE, decide on codegen of string operation.  */
17948 static enum stringop_alg
17949 decide_alg (HOST_WIDE_INT count, HOST_WIDE_INT expected_size, bool memset,
17950             int *dynamic_check)
17951 {
17952   const struct stringop_algs * algs;
17953   bool optimize_for_speed;
17954   /* Algorithms using the rep prefix want at least edi and ecx;
17955      additionally, memset wants eax and memcpy wants esi.  Don't
17956      consider such algorithms if the user has appropriated those
17957      registers for their own purposes.  */
17958   bool rep_prefix_usable = !(fixed_regs[CX_REG] || fixed_regs[DI_REG]
17959                              || (memset
17960                                  ? fixed_regs[AX_REG] : fixed_regs[SI_REG]));
17961
17962 #define ALG_USABLE_P(alg) (rep_prefix_usable                    \
17963                            || (alg != rep_prefix_1_byte         \
17964                                && alg != rep_prefix_4_byte      \
17965                                && alg != rep_prefix_8_byte))
17966   const struct processor_costs *cost;
17967   
17968   /* Even if the string operation call is cold, we still might spend a lot
17969      of time processing large blocks.  */
17970   if (optimize_function_for_size_p (cfun)
17971       || (optimize_insn_for_size_p ()
17972           && expected_size != -1 && expected_size < 256))
17973     optimize_for_speed = false;
17974   else
17975     optimize_for_speed = true;
17976
17977   cost = optimize_for_speed ? ix86_cost : &ix86_size_cost;
17978
17979   *dynamic_check = -1;
17980   if (memset)
17981     algs = &cost->memset[TARGET_64BIT != 0];
17982   else
17983     algs = &cost->memcpy[TARGET_64BIT != 0];
17984   if (stringop_alg != no_stringop && ALG_USABLE_P (stringop_alg))
17985     return stringop_alg;
17986   /* rep; movq or rep; movl is the smallest variant.  */
17987   else if (!optimize_for_speed)
17988     {
17989       if (!count || (count & 3))
17990         return rep_prefix_usable ? rep_prefix_1_byte : loop_1_byte;
17991       else
17992         return rep_prefix_usable ? rep_prefix_4_byte : loop;
17993     }
17994   /* Very tiny blocks are best handled via the loop, REP is expensive to setup.
17995    */
17996   else if (expected_size != -1 && expected_size < 4)
17997     return loop_1_byte;
17998   else if (expected_size != -1)
17999     {
18000       unsigned int i;
18001       enum stringop_alg alg = libcall;
18002       for (i = 0; i < NAX_STRINGOP_ALGS; i++)
18003         {
18004           /* We get here if the algorithms that were not libcall-based
18005              were rep-prefix based and we are unable to use rep prefixes
18006              based on global register usage.  Break out of the loop and
18007              use the heuristic below.  */
18008           if (algs->size[i].max == 0)
18009             break;
18010           if (algs->size[i].max >= expected_size || algs->size[i].max == -1)
18011             {
18012               enum stringop_alg candidate = algs->size[i].alg;
18013
18014               if (candidate != libcall && ALG_USABLE_P (candidate))
18015                 alg = candidate;
18016               /* Honor TARGET_INLINE_ALL_STRINGOPS by picking
18017                  last non-libcall inline algorithm.  */
18018               if (TARGET_INLINE_ALL_STRINGOPS)
18019                 {
18020                   /* When the current size is best to be copied by a libcall,
18021                      but we are still forced to inline, run the heuristic below
18022                      that will pick code for medium sized blocks.  */
18023                   if (alg != libcall)
18024                     return alg;
18025                   break;
18026                 }
18027               else if (ALG_USABLE_P (candidate))
18028                 return candidate;
18029             }
18030         }
18031       gcc_assert (TARGET_INLINE_ALL_STRINGOPS || !rep_prefix_usable);
18032     }
18033   /* When asked to inline the call anyway, try to pick meaningful choice.
18034      We look for maximal size of block that is faster to copy by hand and
18035      take blocks of at most of that size guessing that average size will
18036      be roughly half of the block.
18037
18038      If this turns out to be bad, we might simply specify the preferred
18039      choice in ix86_costs.  */
18040   if ((TARGET_INLINE_ALL_STRINGOPS || TARGET_INLINE_STRINGOPS_DYNAMICALLY)
18041       && (algs->unknown_size == libcall || !ALG_USABLE_P (algs->unknown_size)))
18042     {
18043       int max = -1;
18044       enum stringop_alg alg;
18045       int i;
18046       bool any_alg_usable_p = true;
18047
18048       for (i = 0; i < NAX_STRINGOP_ALGS; i++)
18049         {
18050           enum stringop_alg candidate = algs->size[i].alg;
18051           any_alg_usable_p = any_alg_usable_p && ALG_USABLE_P (candidate);
18052
18053           if (candidate != libcall && candidate
18054               && ALG_USABLE_P (candidate))
18055               max = algs->size[i].max;
18056         }
18057       /* If there aren't any usable algorithms, then recursing on
18058          smaller sizes isn't going to find anything.  Just return the
18059          simple byte-at-a-time copy loop.  */
18060       if (!any_alg_usable_p)
18061         {
18062           /* Pick something reasonable.  */
18063           if (TARGET_INLINE_STRINGOPS_DYNAMICALLY)
18064             *dynamic_check = 128;
18065           return loop_1_byte;
18066         }
18067       if (max == -1)
18068         max = 4096;
18069       alg = decide_alg (count, max / 2, memset, dynamic_check);
18070       gcc_assert (*dynamic_check == -1);
18071       gcc_assert (alg != libcall);
18072       if (TARGET_INLINE_STRINGOPS_DYNAMICALLY)
18073         *dynamic_check = max;
18074       return alg;
18075     }
18076   return ALG_USABLE_P (algs->unknown_size) ? algs->unknown_size : libcall;
18077 #undef ALG_USABLE_P
18078 }
18079
18080 /* Decide on alignment.  We know that the operand is already aligned to ALIGN
18081    (ALIGN can be based on profile feedback and thus it is not 100% guaranteed).  */
18082 static int
18083 decide_alignment (int align,
18084                   enum stringop_alg alg,
18085                   int expected_size)
18086 {
18087   int desired_align = 0;
18088   switch (alg)
18089     {
18090       case no_stringop:
18091         gcc_unreachable ();
18092       case loop:
18093       case unrolled_loop:
18094         desired_align = GET_MODE_SIZE (Pmode);
18095         break;
18096       case rep_prefix_8_byte:
18097         desired_align = 8;
18098         break;
18099       case rep_prefix_4_byte:
18100         /* PentiumPro has special logic triggering for 8 byte aligned blocks.
18101            copying whole cacheline at once.  */
18102         if (TARGET_PENTIUMPRO)
18103           desired_align = 8;
18104         else
18105           desired_align = 4;
18106         break;
18107       case rep_prefix_1_byte:
18108         /* PentiumPro has special logic triggering for 8 byte aligned blocks.
18109            copying whole cacheline at once.  */
18110         if (TARGET_PENTIUMPRO)
18111           desired_align = 8;
18112         else
18113           desired_align = 1;
18114         break;
18115       case loop_1_byte:
18116         desired_align = 1;
18117         break;
18118       case libcall:
18119         return 0;
18120     }
18121
18122   if (optimize_size)
18123     desired_align = 1;
18124   if (desired_align < align)
18125     desired_align = align;
18126   if (expected_size != -1 && expected_size < 4)
18127     desired_align = align;
18128   return desired_align;
18129 }
18130
18131 /* Return the smallest power of 2 greater than VAL.  */
18132 static int
18133 smallest_pow2_greater_than (int val)
18134 {
18135   int ret = 1;
18136   while (ret <= val)
18137     ret <<= 1;
18138   return ret;
18139 }
18140
18141 /* Expand string move (memcpy) operation.  Use i386 string operations when
18142    profitable.  expand_setmem contains similar code.  The code depends upon
18143    architecture, block size and alignment, but always has the same
18144    overall structure:
18145
18146    1) Prologue guard: Conditional that jumps up to epilogues for small
18147       blocks that can be handled by epilogue alone.  This is faster but
18148       also needed for correctness, since prologue assume the block is larger
18149       than the desired alignment.
18150
18151       Optional dynamic check for size and libcall for large
18152       blocks is emitted here too, with -minline-stringops-dynamically.
18153
18154    2) Prologue: copy first few bytes in order to get destination aligned
18155       to DESIRED_ALIGN.  It is emitted only when ALIGN is less than
18156       DESIRED_ALIGN and and up to DESIRED_ALIGN - ALIGN bytes can be copied.
18157       We emit either a jump tree on power of two sized blocks, or a byte loop.
18158
18159    3) Main body: the copying loop itself, copying in SIZE_NEEDED chunks
18160       with specified algorithm.
18161
18162    4) Epilogue: code copying tail of the block that is too small to be
18163       handled by main body (or up to size guarded by prologue guard).  */
18164
18165 int
18166 ix86_expand_movmem (rtx dst, rtx src, rtx count_exp, rtx align_exp,
18167                     rtx expected_align_exp, rtx expected_size_exp)
18168 {
18169   rtx destreg;
18170   rtx srcreg;
18171   rtx label = NULL;
18172   rtx tmp;
18173   rtx jump_around_label = NULL;
18174   HOST_WIDE_INT align = 1;
18175   unsigned HOST_WIDE_INT count = 0;
18176   HOST_WIDE_INT expected_size = -1;
18177   int size_needed = 0, epilogue_size_needed;
18178   int desired_align = 0, align_bytes = 0;
18179   enum stringop_alg alg;
18180   int dynamic_check;
18181   bool need_zero_guard = false;
18182
18183   if (CONST_INT_P (align_exp))
18184     align = INTVAL (align_exp);
18185   /* i386 can do misaligned access on reasonably increased cost.  */
18186   if (CONST_INT_P (expected_align_exp)
18187       && INTVAL (expected_align_exp) > align)
18188     align = INTVAL (expected_align_exp);
18189   /* ALIGN is the minimum of destination and source alignment, but we care here
18190      just about destination alignment.  */
18191   else if (MEM_ALIGN (dst) > (unsigned HOST_WIDE_INT) align * BITS_PER_UNIT)
18192     align = MEM_ALIGN (dst) / BITS_PER_UNIT;
18193
18194   if (CONST_INT_P (count_exp))
18195     count = expected_size = INTVAL (count_exp);
18196   if (CONST_INT_P (expected_size_exp) && count == 0)
18197     expected_size = INTVAL (expected_size_exp);
18198
18199   /* Make sure we don't need to care about overflow later on.  */
18200   if (count > ((unsigned HOST_WIDE_INT) 1 << 30))
18201     return 0;
18202
18203   /* Step 0: Decide on preferred algorithm, desired alignment and
18204      size of chunks to be copied by main loop.  */
18205
18206   alg = decide_alg (count, expected_size, false, &dynamic_check);
18207   desired_align = decide_alignment (align, alg, expected_size);
18208
18209   if (!TARGET_ALIGN_STRINGOPS)
18210     align = desired_align;
18211
18212   if (alg == libcall)
18213     return 0;
18214   gcc_assert (alg != no_stringop);
18215   if (!count)
18216     count_exp = copy_to_mode_reg (GET_MODE (count_exp), count_exp);
18217   destreg = copy_to_mode_reg (Pmode, XEXP (dst, 0));
18218   srcreg = copy_to_mode_reg (Pmode, XEXP (src, 0));
18219   switch (alg)
18220     {
18221     case libcall:
18222     case no_stringop:
18223       gcc_unreachable ();
18224     case loop:
18225       need_zero_guard = true;
18226       size_needed = GET_MODE_SIZE (Pmode);
18227       break;
18228     case unrolled_loop:
18229       need_zero_guard = true;
18230       size_needed = GET_MODE_SIZE (Pmode) * (TARGET_64BIT ? 4 : 2);
18231       break;
18232     case rep_prefix_8_byte:
18233       size_needed = 8;
18234       break;
18235     case rep_prefix_4_byte:
18236       size_needed = 4;
18237       break;
18238     case rep_prefix_1_byte:
18239       size_needed = 1;
18240       break;
18241     case loop_1_byte:
18242       need_zero_guard = true;
18243       size_needed = 1;
18244       break;
18245     }
18246
18247   epilogue_size_needed = size_needed;
18248
18249   /* Step 1: Prologue guard.  */
18250
18251   /* Alignment code needs count to be in register.  */
18252   if (CONST_INT_P (count_exp) && desired_align > align)
18253     {
18254       if (INTVAL (count_exp) > desired_align
18255           && INTVAL (count_exp) > size_needed)
18256         {
18257           align_bytes
18258             = get_mem_align_offset (dst, desired_align * BITS_PER_UNIT);
18259           if (align_bytes <= 0)
18260             align_bytes = 0;
18261           else
18262             align_bytes = desired_align - align_bytes;
18263         }
18264       if (align_bytes == 0)
18265         count_exp = force_reg (counter_mode (count_exp), count_exp);
18266     }
18267   gcc_assert (desired_align >= 1 && align >= 1);
18268
18269   /* Ensure that alignment prologue won't copy past end of block.  */
18270   if (size_needed > 1 || (desired_align > 1 && desired_align > align))
18271     {
18272       epilogue_size_needed = MAX (size_needed - 1, desired_align - align);
18273       /* Epilogue always copies COUNT_EXP & EPILOGUE_SIZE_NEEDED bytes.
18274          Make sure it is power of 2.  */
18275       epilogue_size_needed = smallest_pow2_greater_than (epilogue_size_needed);
18276
18277       if (count)
18278         {
18279           if (count < (unsigned HOST_WIDE_INT)epilogue_size_needed)
18280             {
18281               /* If main algorithm works on QImode, no epilogue is needed.
18282                  For small sizes just don't align anything.  */
18283               if (size_needed == 1)
18284                 desired_align = align;
18285               else
18286                 goto epilogue;
18287             }
18288         }
18289       else
18290         {
18291           label = gen_label_rtx ();
18292           emit_cmp_and_jump_insns (count_exp,
18293                                    GEN_INT (epilogue_size_needed),
18294                                    LTU, 0, counter_mode (count_exp), 1, label);
18295           if (expected_size == -1 || expected_size < epilogue_size_needed)
18296             predict_jump (REG_BR_PROB_BASE * 60 / 100);
18297           else
18298             predict_jump (REG_BR_PROB_BASE * 20 / 100);
18299         }
18300     }
18301
18302   /* Emit code to decide on runtime whether library call or inline should be
18303      used.  */
18304   if (dynamic_check != -1)
18305     {
18306       if (CONST_INT_P (count_exp))
18307         {
18308           if (UINTVAL (count_exp) >= (unsigned HOST_WIDE_INT)dynamic_check)
18309             {
18310               emit_block_move_via_libcall (dst, src, count_exp, false);
18311               count_exp = const0_rtx;
18312               goto epilogue;
18313             }
18314         }
18315       else
18316         {
18317           rtx hot_label = gen_label_rtx ();
18318           jump_around_label = gen_label_rtx ();
18319           emit_cmp_and_jump_insns (count_exp, GEN_INT (dynamic_check - 1),
18320                                    LEU, 0, GET_MODE (count_exp), 1, hot_label);
18321           predict_jump (REG_BR_PROB_BASE * 90 / 100);
18322           emit_block_move_via_libcall (dst, src, count_exp, false);
18323           emit_jump (jump_around_label);
18324           emit_label (hot_label);
18325         }
18326     }
18327
18328   /* Step 2: Alignment prologue.  */
18329
18330   if (desired_align > align)
18331     {
18332       if (align_bytes == 0)
18333         {
18334           /* Except for the first move in epilogue, we no longer know
18335              constant offset in aliasing info.  It don't seems to worth
18336              the pain to maintain it for the first move, so throw away
18337              the info early.  */
18338           src = change_address (src, BLKmode, srcreg);
18339           dst = change_address (dst, BLKmode, destreg);
18340           expand_movmem_prologue (dst, src, destreg, srcreg, count_exp, align,
18341                                   desired_align);
18342         }
18343       else
18344         {
18345           /* If we know how many bytes need to be stored before dst is
18346              sufficiently aligned, maintain aliasing info accurately.  */
18347           dst = expand_constant_movmem_prologue (dst, &src, destreg, srcreg,
18348                                                  desired_align, align_bytes);
18349           count_exp = plus_constant (count_exp, -align_bytes);
18350           count -= align_bytes;
18351         }
18352       if (need_zero_guard
18353           && (count < (unsigned HOST_WIDE_INT) size_needed
18354               || (align_bytes == 0
18355                   && count < ((unsigned HOST_WIDE_INT) size_needed
18356                               + desired_align - align))))
18357         {
18358           /* It is possible that we copied enough so the main loop will not
18359              execute.  */
18360           gcc_assert (size_needed > 1);
18361           if (label == NULL_RTX)
18362             label = gen_label_rtx ();
18363           emit_cmp_and_jump_insns (count_exp,
18364                                    GEN_INT (size_needed),
18365                                    LTU, 0, counter_mode (count_exp), 1, label);
18366           if (expected_size == -1
18367               || expected_size < (desired_align - align) / 2 + size_needed)
18368             predict_jump (REG_BR_PROB_BASE * 20 / 100);
18369           else
18370             predict_jump (REG_BR_PROB_BASE * 60 / 100);
18371         }
18372     }
18373   if (label && size_needed == 1)
18374     {
18375       emit_label (label);
18376       LABEL_NUSES (label) = 1;
18377       label = NULL;
18378       epilogue_size_needed = 1;
18379     }
18380   else if (label == NULL_RTX)
18381     epilogue_size_needed = size_needed;
18382
18383   /* Step 3: Main loop.  */
18384
18385   switch (alg)
18386     {
18387     case libcall:
18388     case no_stringop:
18389       gcc_unreachable ();
18390     case loop_1_byte:
18391       expand_set_or_movmem_via_loop (dst, src, destreg, srcreg, NULL,
18392                                      count_exp, QImode, 1, expected_size);
18393       break;
18394     case loop:
18395       expand_set_or_movmem_via_loop (dst, src, destreg, srcreg, NULL,
18396                                      count_exp, Pmode, 1, expected_size);
18397       break;
18398     case unrolled_loop:
18399       /* Unroll only by factor of 2 in 32bit mode, since we don't have enough
18400          registers for 4 temporaries anyway.  */
18401       expand_set_or_movmem_via_loop (dst, src, destreg, srcreg, NULL,
18402                                      count_exp, Pmode, TARGET_64BIT ? 4 : 2,
18403                                      expected_size);
18404       break;
18405     case rep_prefix_8_byte:
18406       expand_movmem_via_rep_mov (dst, src, destreg, srcreg, count_exp,
18407                                  DImode);
18408       break;
18409     case rep_prefix_4_byte:
18410       expand_movmem_via_rep_mov (dst, src, destreg, srcreg, count_exp,
18411                                  SImode);
18412       break;
18413     case rep_prefix_1_byte:
18414       expand_movmem_via_rep_mov (dst, src, destreg, srcreg, count_exp,
18415                                  QImode);
18416       break;
18417     }
18418   /* Adjust properly the offset of src and dest memory for aliasing.  */
18419   if (CONST_INT_P (count_exp))
18420     {
18421       src = adjust_automodify_address_nv (src, BLKmode, srcreg,
18422                                           (count / size_needed) * size_needed);
18423       dst = adjust_automodify_address_nv (dst, BLKmode, destreg,
18424                                           (count / size_needed) * size_needed);
18425     }
18426   else
18427     {
18428       src = change_address (src, BLKmode, srcreg);
18429       dst = change_address (dst, BLKmode, destreg);
18430     }
18431
18432   /* Step 4: Epilogue to copy the remaining bytes.  */
18433  epilogue:
18434   if (label)
18435     {
18436       /* When the main loop is done, COUNT_EXP might hold original count,
18437          while we want to copy only COUNT_EXP & SIZE_NEEDED bytes.
18438          Epilogue code will actually copy COUNT_EXP & EPILOGUE_SIZE_NEEDED
18439          bytes. Compensate if needed.  */
18440
18441       if (size_needed < epilogue_size_needed)
18442         {
18443           tmp =
18444             expand_simple_binop (counter_mode (count_exp), AND, count_exp,
18445                                  GEN_INT (size_needed - 1), count_exp, 1,
18446                                  OPTAB_DIRECT);
18447           if (tmp != count_exp)
18448             emit_move_insn (count_exp, tmp);
18449         }
18450       emit_label (label);
18451       LABEL_NUSES (label) = 1;
18452     }
18453
18454   if (count_exp != const0_rtx && epilogue_size_needed > 1)
18455     expand_movmem_epilogue (dst, src, destreg, srcreg, count_exp,
18456                             epilogue_size_needed);
18457   if (jump_around_label)
18458     emit_label (jump_around_label);
18459   return 1;
18460 }
18461
18462 /* Helper function for memcpy.  For QImode value 0xXY produce
18463    0xXYXYXYXY of wide specified by MODE.  This is essentially
18464    a * 0x10101010, but we can do slightly better than
18465    synth_mult by unwinding the sequence by hand on CPUs with
18466    slow multiply.  */
18467 static rtx
18468 promote_duplicated_reg (enum machine_mode mode, rtx val)
18469 {
18470   enum machine_mode valmode = GET_MODE (val);
18471   rtx tmp;
18472   int nops = mode == DImode ? 3 : 2;
18473
18474   gcc_assert (mode == SImode || mode == DImode);
18475   if (val == const0_rtx)
18476     return copy_to_mode_reg (mode, const0_rtx);
18477   if (CONST_INT_P (val))
18478     {
18479       HOST_WIDE_INT v = INTVAL (val) & 255;
18480
18481       v |= v << 8;
18482       v |= v << 16;
18483       if (mode == DImode)
18484         v |= (v << 16) << 16;
18485       return copy_to_mode_reg (mode, gen_int_mode (v, mode));
18486     }
18487
18488   if (valmode == VOIDmode)
18489     valmode = QImode;
18490   if (valmode != QImode)
18491     val = gen_lowpart (QImode, val);
18492   if (mode == QImode)
18493     return val;
18494   if (!TARGET_PARTIAL_REG_STALL)
18495     nops--;
18496   if (ix86_cost->mult_init[mode == DImode ? 3 : 2]
18497       + ix86_cost->mult_bit * (mode == DImode ? 8 : 4)
18498       <= (ix86_cost->shift_const + ix86_cost->add) * nops
18499           + (COSTS_N_INSNS (TARGET_PARTIAL_REG_STALL == 0)))
18500     {
18501       rtx reg = convert_modes (mode, QImode, val, true);
18502       tmp = promote_duplicated_reg (mode, const1_rtx);
18503       return expand_simple_binop (mode, MULT, reg, tmp, NULL, 1,
18504                                   OPTAB_DIRECT);
18505     }
18506   else
18507     {
18508       rtx reg = convert_modes (mode, QImode, val, true);
18509
18510       if (!TARGET_PARTIAL_REG_STALL)
18511         if (mode == SImode)
18512           emit_insn (gen_movsi_insv_1 (reg, reg));
18513         else
18514           emit_insn (gen_movdi_insv_1_rex64 (reg, reg));
18515       else
18516         {
18517           tmp = expand_simple_binop (mode, ASHIFT, reg, GEN_INT (8),
18518                                      NULL, 1, OPTAB_DIRECT);
18519           reg =
18520             expand_simple_binop (mode, IOR, reg, tmp, reg, 1, OPTAB_DIRECT);
18521         }
18522       tmp = expand_simple_binop (mode, ASHIFT, reg, GEN_INT (16),
18523                                  NULL, 1, OPTAB_DIRECT);
18524       reg = expand_simple_binop (mode, IOR, reg, tmp, reg, 1, OPTAB_DIRECT);
18525       if (mode == SImode)
18526         return reg;
18527       tmp = expand_simple_binop (mode, ASHIFT, reg, GEN_INT (32),
18528                                  NULL, 1, OPTAB_DIRECT);
18529       reg = expand_simple_binop (mode, IOR, reg, tmp, reg, 1, OPTAB_DIRECT);
18530       return reg;
18531     }
18532 }
18533
18534 /* Duplicate value VAL using promote_duplicated_reg into maximal size that will
18535    be needed by main loop copying SIZE_NEEDED chunks and prologue getting
18536    alignment from ALIGN to DESIRED_ALIGN.  */
18537 static rtx
18538 promote_duplicated_reg_to_size (rtx val, int size_needed, int desired_align, int align)
18539 {
18540   rtx promoted_val;
18541
18542   if (TARGET_64BIT
18543       && (size_needed > 4 || (desired_align > align && desired_align > 4)))
18544     promoted_val = promote_duplicated_reg (DImode, val);
18545   else if (size_needed > 2 || (desired_align > align && desired_align > 2))
18546     promoted_val = promote_duplicated_reg (SImode, val);
18547   else if (size_needed > 1 || (desired_align > align && desired_align > 1))
18548     promoted_val = promote_duplicated_reg (HImode, val);
18549   else
18550     promoted_val = val;
18551
18552   return promoted_val;
18553 }
18554
18555 /* Expand string clear operation (bzero).  Use i386 string operations when
18556    profitable.  See expand_movmem comment for explanation of individual
18557    steps performed.  */
18558 int
18559 ix86_expand_setmem (rtx dst, rtx count_exp, rtx val_exp, rtx align_exp,
18560                     rtx expected_align_exp, rtx expected_size_exp)
18561 {
18562   rtx destreg;
18563   rtx label = NULL;
18564   rtx tmp;
18565   rtx jump_around_label = NULL;
18566   HOST_WIDE_INT align = 1;
18567   unsigned HOST_WIDE_INT count = 0;
18568   HOST_WIDE_INT expected_size = -1;
18569   int size_needed = 0, epilogue_size_needed;
18570   int desired_align = 0, align_bytes = 0;
18571   enum stringop_alg alg;
18572   rtx promoted_val = NULL;
18573   bool force_loopy_epilogue = false;
18574   int dynamic_check;
18575   bool need_zero_guard = false;
18576
18577   if (CONST_INT_P (align_exp))
18578     align = INTVAL (align_exp);
18579   /* i386 can do misaligned access on reasonably increased cost.  */
18580   if (CONST_INT_P (expected_align_exp)
18581       && INTVAL (expected_align_exp) > align)
18582     align = INTVAL (expected_align_exp);
18583   if (CONST_INT_P (count_exp))
18584     count = expected_size = INTVAL (count_exp);
18585   if (CONST_INT_P (expected_size_exp) && count == 0)
18586     expected_size = INTVAL (expected_size_exp);
18587
18588   /* Make sure we don't need to care about overflow later on.  */
18589   if (count > ((unsigned HOST_WIDE_INT) 1 << 30))
18590     return 0;
18591
18592   /* Step 0: Decide on preferred algorithm, desired alignment and
18593      size of chunks to be copied by main loop.  */
18594
18595   alg = decide_alg (count, expected_size, true, &dynamic_check);
18596   desired_align = decide_alignment (align, alg, expected_size);
18597
18598   if (!TARGET_ALIGN_STRINGOPS)
18599     align = desired_align;
18600
18601   if (alg == libcall)
18602     return 0;
18603   gcc_assert (alg != no_stringop);
18604   if (!count)
18605     count_exp = copy_to_mode_reg (counter_mode (count_exp), count_exp);
18606   destreg = copy_to_mode_reg (Pmode, XEXP (dst, 0));
18607   switch (alg)
18608     {
18609     case libcall:
18610     case no_stringop:
18611       gcc_unreachable ();
18612     case loop:
18613       need_zero_guard = true;
18614       size_needed = GET_MODE_SIZE (Pmode);
18615       break;
18616     case unrolled_loop:
18617       need_zero_guard = true;
18618       size_needed = GET_MODE_SIZE (Pmode) * 4;
18619       break;
18620     case rep_prefix_8_byte:
18621       size_needed = 8;
18622       break;
18623     case rep_prefix_4_byte:
18624       size_needed = 4;
18625       break;
18626     case rep_prefix_1_byte:
18627       size_needed = 1;
18628       break;
18629     case loop_1_byte:
18630       need_zero_guard = true;
18631       size_needed = 1;
18632       break;
18633     }
18634   epilogue_size_needed = size_needed;
18635
18636   /* Step 1: Prologue guard.  */
18637
18638   /* Alignment code needs count to be in register.  */
18639   if (CONST_INT_P (count_exp) && desired_align > align)
18640     {
18641       if (INTVAL (count_exp) > desired_align
18642           && INTVAL (count_exp) > size_needed)
18643         {
18644           align_bytes
18645             = get_mem_align_offset (dst, desired_align * BITS_PER_UNIT);
18646           if (align_bytes <= 0)
18647             align_bytes = 0;
18648           else
18649             align_bytes = desired_align - align_bytes;
18650         }
18651       if (align_bytes == 0)
18652         {
18653           enum machine_mode mode = SImode;
18654           if (TARGET_64BIT && (count & ~0xffffffff))
18655             mode = DImode;
18656           count_exp = force_reg (mode, count_exp);
18657         }
18658     }
18659   /* Do the cheap promotion to allow better CSE across the
18660      main loop and epilogue (ie one load of the big constant in the
18661      front of all code.  */
18662   if (CONST_INT_P (val_exp))
18663     promoted_val = promote_duplicated_reg_to_size (val_exp, size_needed,
18664                                                    desired_align, align);
18665   /* Ensure that alignment prologue won't copy past end of block.  */
18666   if (size_needed > 1 || (desired_align > 1 && desired_align > align))
18667     {
18668       epilogue_size_needed = MAX (size_needed - 1, desired_align - align);
18669       /* Epilogue always copies COUNT_EXP & (EPILOGUE_SIZE_NEEDED - 1) bytes.
18670          Make sure it is power of 2.  */
18671       epilogue_size_needed = smallest_pow2_greater_than (epilogue_size_needed);
18672
18673       /* To improve performance of small blocks, we jump around the VAL
18674          promoting mode.  This mean that if the promoted VAL is not constant,
18675          we might not use it in the epilogue and have to use byte
18676          loop variant.  */
18677       if (epilogue_size_needed > 2 && !promoted_val)
18678         force_loopy_epilogue = true;
18679       if (count)
18680         {
18681           if (count < (unsigned HOST_WIDE_INT)epilogue_size_needed)
18682             {
18683               /* If main algorithm works on QImode, no epilogue is needed.
18684                  For small sizes just don't align anything.  */
18685               if (size_needed == 1)
18686                 desired_align = align;
18687               else
18688                 goto epilogue;
18689             }
18690         }
18691       else
18692         {
18693           label = gen_label_rtx ();
18694           emit_cmp_and_jump_insns (count_exp,
18695                                    GEN_INT (epilogue_size_needed),
18696                                    LTU, 0, counter_mode (count_exp), 1, label);
18697           if (expected_size == -1 || expected_size <= epilogue_size_needed)
18698             predict_jump (REG_BR_PROB_BASE * 60 / 100);
18699           else
18700             predict_jump (REG_BR_PROB_BASE * 20 / 100);
18701         }
18702     }
18703   if (dynamic_check != -1)
18704     {
18705       rtx hot_label = gen_label_rtx ();
18706       jump_around_label = gen_label_rtx ();
18707       emit_cmp_and_jump_insns (count_exp, GEN_INT (dynamic_check - 1),
18708                                LEU, 0, counter_mode (count_exp), 1, hot_label);
18709       predict_jump (REG_BR_PROB_BASE * 90 / 100);
18710       set_storage_via_libcall (dst, count_exp, val_exp, false);
18711       emit_jump (jump_around_label);
18712       emit_label (hot_label);
18713     }
18714
18715   /* Step 2: Alignment prologue.  */
18716
18717   /* Do the expensive promotion once we branched off the small blocks.  */
18718   if (!promoted_val)
18719     promoted_val = promote_duplicated_reg_to_size (val_exp, size_needed,
18720                                                    desired_align, align);
18721   gcc_assert (desired_align >= 1 && align >= 1);
18722
18723   if (desired_align > align)
18724     {
18725       if (align_bytes == 0)
18726         {
18727           /* Except for the first move in epilogue, we no longer know
18728              constant offset in aliasing info.  It don't seems to worth
18729              the pain to maintain it for the first move, so throw away
18730              the info early.  */
18731           dst = change_address (dst, BLKmode, destreg);
18732           expand_setmem_prologue (dst, destreg, promoted_val, count_exp, align,
18733                                   desired_align);
18734         }
18735       else
18736         {
18737           /* If we know how many bytes need to be stored before dst is
18738              sufficiently aligned, maintain aliasing info accurately.  */
18739           dst = expand_constant_setmem_prologue (dst, destreg, promoted_val,
18740                                                  desired_align, align_bytes);
18741           count_exp = plus_constant (count_exp, -align_bytes);
18742           count -= align_bytes;
18743         }
18744       if (need_zero_guard
18745           && (count < (unsigned HOST_WIDE_INT) size_needed
18746               || (align_bytes == 0
18747                   && count < ((unsigned HOST_WIDE_INT) size_needed
18748                               + desired_align - align))))
18749         {
18750           /* It is possible that we copied enough so the main loop will not
18751              execute.  */
18752           gcc_assert (size_needed > 1);
18753           if (label == NULL_RTX)
18754             label = gen_label_rtx ();
18755           emit_cmp_and_jump_insns (count_exp,
18756                                    GEN_INT (size_needed),
18757                                    LTU, 0, counter_mode (count_exp), 1, label);
18758           if (expected_size == -1
18759               || expected_size < (desired_align - align) / 2 + size_needed)
18760             predict_jump (REG_BR_PROB_BASE * 20 / 100);
18761           else
18762             predict_jump (REG_BR_PROB_BASE * 60 / 100);
18763         }
18764     }
18765   if (label && size_needed == 1)
18766     {
18767       emit_label (label);
18768       LABEL_NUSES (label) = 1;
18769       label = NULL;
18770       promoted_val = val_exp;
18771       epilogue_size_needed = 1;
18772     }
18773   else if (label == NULL_RTX)
18774     epilogue_size_needed = size_needed;
18775
18776   /* Step 3: Main loop.  */
18777
18778   switch (alg)
18779     {
18780     case libcall:
18781     case no_stringop:
18782       gcc_unreachable ();
18783     case loop_1_byte:
18784       expand_set_or_movmem_via_loop (dst, NULL, destreg, NULL, promoted_val,
18785                                      count_exp, QImode, 1, expected_size);
18786       break;
18787     case loop:
18788       expand_set_or_movmem_via_loop (dst, NULL, destreg, NULL, promoted_val,
18789                                      count_exp, Pmode, 1, expected_size);
18790       break;
18791     case unrolled_loop:
18792       expand_set_or_movmem_via_loop (dst, NULL, destreg, NULL, promoted_val,
18793                                      count_exp, Pmode, 4, expected_size);
18794       break;
18795     case rep_prefix_8_byte:
18796       expand_setmem_via_rep_stos (dst, destreg, promoted_val, count_exp,
18797                                   DImode, val_exp);
18798       break;
18799     case rep_prefix_4_byte:
18800       expand_setmem_via_rep_stos (dst, destreg, promoted_val, count_exp,
18801                                   SImode, val_exp);
18802       break;
18803     case rep_prefix_1_byte:
18804       expand_setmem_via_rep_stos (dst, destreg, promoted_val, count_exp,
18805                                   QImode, val_exp);
18806       break;
18807     }
18808   /* Adjust properly the offset of src and dest memory for aliasing.  */
18809   if (CONST_INT_P (count_exp))
18810     dst = adjust_automodify_address_nv (dst, BLKmode, destreg,
18811                                         (count / size_needed) * size_needed);
18812   else
18813     dst = change_address (dst, BLKmode, destreg);
18814
18815   /* Step 4: Epilogue to copy the remaining bytes.  */
18816
18817   if (label)
18818     {
18819       /* When the main loop is done, COUNT_EXP might hold original count,
18820          while we want to copy only COUNT_EXP & SIZE_NEEDED bytes.
18821          Epilogue code will actually copy COUNT_EXP & EPILOGUE_SIZE_NEEDED
18822          bytes. Compensate if needed.  */
18823
18824       if (size_needed < epilogue_size_needed)
18825         {
18826           tmp =
18827             expand_simple_binop (counter_mode (count_exp), AND, count_exp,
18828                                  GEN_INT (size_needed - 1), count_exp, 1,
18829                                  OPTAB_DIRECT);
18830           if (tmp != count_exp)
18831             emit_move_insn (count_exp, tmp);
18832         }
18833       emit_label (label);
18834       LABEL_NUSES (label) = 1;
18835     }
18836  epilogue:
18837   if (count_exp != const0_rtx && epilogue_size_needed > 1)
18838     {
18839       if (force_loopy_epilogue)
18840         expand_setmem_epilogue_via_loop (dst, destreg, val_exp, count_exp,
18841                                          epilogue_size_needed);
18842       else
18843         expand_setmem_epilogue (dst, destreg, promoted_val, count_exp,
18844                                 epilogue_size_needed);
18845     }
18846   if (jump_around_label)
18847     emit_label (jump_around_label);
18848   return 1;
18849 }
18850
18851 /* Expand the appropriate insns for doing strlen if not just doing
18852    repnz; scasb
18853
18854    out = result, initialized with the start address
18855    align_rtx = alignment of the address.
18856    scratch = scratch register, initialized with the startaddress when
18857         not aligned, otherwise undefined
18858
18859    This is just the body. It needs the initializations mentioned above and
18860    some address computing at the end.  These things are done in i386.md.  */
18861
18862 static void
18863 ix86_expand_strlensi_unroll_1 (rtx out, rtx src, rtx align_rtx)
18864 {
18865   int align;
18866   rtx tmp;
18867   rtx align_2_label = NULL_RTX;
18868   rtx align_3_label = NULL_RTX;
18869   rtx align_4_label = gen_label_rtx ();
18870   rtx end_0_label = gen_label_rtx ();
18871   rtx mem;
18872   rtx tmpreg = gen_reg_rtx (SImode);
18873   rtx scratch = gen_reg_rtx (SImode);
18874   rtx cmp;
18875
18876   align = 0;
18877   if (CONST_INT_P (align_rtx))
18878     align = INTVAL (align_rtx);
18879
18880   /* Loop to check 1..3 bytes for null to get an aligned pointer.  */
18881
18882   /* Is there a known alignment and is it less than 4?  */
18883   if (align < 4)
18884     {
18885       rtx scratch1 = gen_reg_rtx (Pmode);
18886       emit_move_insn (scratch1, out);
18887       /* Is there a known alignment and is it not 2? */
18888       if (align != 2)
18889         {
18890           align_3_label = gen_label_rtx (); /* Label when aligned to 3-byte */
18891           align_2_label = gen_label_rtx (); /* Label when aligned to 2-byte */
18892
18893           /* Leave just the 3 lower bits.  */
18894           align_rtx = expand_binop (Pmode, and_optab, scratch1, GEN_INT (3),
18895                                     NULL_RTX, 0, OPTAB_WIDEN);
18896
18897           emit_cmp_and_jump_insns (align_rtx, const0_rtx, EQ, NULL,
18898                                    Pmode, 1, align_4_label);
18899           emit_cmp_and_jump_insns (align_rtx, const2_rtx, EQ, NULL,
18900                                    Pmode, 1, align_2_label);
18901           emit_cmp_and_jump_insns (align_rtx, const2_rtx, GTU, NULL,
18902                                    Pmode, 1, align_3_label);
18903         }
18904       else
18905         {
18906           /* Since the alignment is 2, we have to check 2 or 0 bytes;
18907              check if is aligned to 4 - byte.  */
18908
18909           align_rtx = expand_binop (Pmode, and_optab, scratch1, const2_rtx,
18910                                     NULL_RTX, 0, OPTAB_WIDEN);
18911
18912           emit_cmp_and_jump_insns (align_rtx, const0_rtx, EQ, NULL,
18913                                    Pmode, 1, align_4_label);
18914         }
18915
18916       mem = change_address (src, QImode, out);
18917
18918       /* Now compare the bytes.  */
18919
18920       /* Compare the first n unaligned byte on a byte per byte basis.  */
18921       emit_cmp_and_jump_insns (mem, const0_rtx, EQ, NULL,
18922                                QImode, 1, end_0_label);
18923
18924       /* Increment the address.  */
18925       emit_insn ((*ix86_gen_add3) (out, out, const1_rtx));
18926
18927       /* Not needed with an alignment of 2 */
18928       if (align != 2)
18929         {
18930           emit_label (align_2_label);
18931
18932           emit_cmp_and_jump_insns (mem, const0_rtx, EQ, NULL, QImode, 1,
18933                                    end_0_label);
18934
18935           emit_insn ((*ix86_gen_add3) (out, out, const1_rtx));
18936
18937           emit_label (align_3_label);
18938         }
18939
18940       emit_cmp_and_jump_insns (mem, const0_rtx, EQ, NULL, QImode, 1,
18941                                end_0_label);
18942
18943       emit_insn ((*ix86_gen_add3) (out, out, const1_rtx));
18944     }
18945
18946   /* Generate loop to check 4 bytes at a time.  It is not a good idea to
18947      align this loop.  It gives only huge programs, but does not help to
18948      speed up.  */
18949   emit_label (align_4_label);
18950
18951   mem = change_address (src, SImode, out);
18952   emit_move_insn (scratch, mem);
18953   emit_insn ((*ix86_gen_add3) (out, out, GEN_INT (4)));
18954
18955   /* This formula yields a nonzero result iff one of the bytes is zero.
18956      This saves three branches inside loop and many cycles.  */
18957
18958   emit_insn (gen_addsi3 (tmpreg, scratch, GEN_INT (-0x01010101)));
18959   emit_insn (gen_one_cmplsi2 (scratch, scratch));
18960   emit_insn (gen_andsi3 (tmpreg, tmpreg, scratch));
18961   emit_insn (gen_andsi3 (tmpreg, tmpreg,
18962                          gen_int_mode (0x80808080, SImode)));
18963   emit_cmp_and_jump_insns (tmpreg, const0_rtx, EQ, 0, SImode, 1,
18964                            align_4_label);
18965
18966   if (TARGET_CMOVE)
18967     {
18968        rtx reg = gen_reg_rtx (SImode);
18969        rtx reg2 = gen_reg_rtx (Pmode);
18970        emit_move_insn (reg, tmpreg);
18971        emit_insn (gen_lshrsi3 (reg, reg, GEN_INT (16)));
18972
18973        /* If zero is not in the first two bytes, move two bytes forward.  */
18974        emit_insn (gen_testsi_ccno_1 (tmpreg, GEN_INT (0x8080)));
18975        tmp = gen_rtx_REG (CCNOmode, FLAGS_REG);
18976        tmp = gen_rtx_EQ (VOIDmode, tmp, const0_rtx);
18977        emit_insn (gen_rtx_SET (VOIDmode, tmpreg,
18978                                gen_rtx_IF_THEN_ELSE (SImode, tmp,
18979                                                      reg,
18980                                                      tmpreg)));
18981        /* Emit lea manually to avoid clobbering of flags.  */
18982        emit_insn (gen_rtx_SET (SImode, reg2,
18983                                gen_rtx_PLUS (Pmode, out, const2_rtx)));
18984
18985        tmp = gen_rtx_REG (CCNOmode, FLAGS_REG);
18986        tmp = gen_rtx_EQ (VOIDmode, tmp, const0_rtx);
18987        emit_insn (gen_rtx_SET (VOIDmode, out,
18988                                gen_rtx_IF_THEN_ELSE (Pmode, tmp,
18989                                                      reg2,
18990                                                      out)));
18991
18992     }
18993   else
18994     {
18995        rtx end_2_label = gen_label_rtx ();
18996        /* Is zero in the first two bytes? */
18997
18998        emit_insn (gen_testsi_ccno_1 (tmpreg, GEN_INT (0x8080)));
18999        tmp = gen_rtx_REG (CCNOmode, FLAGS_REG);
19000        tmp = gen_rtx_NE (VOIDmode, tmp, const0_rtx);
19001        tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp,
19002                             gen_rtx_LABEL_REF (VOIDmode, end_2_label),
19003                             pc_rtx);
19004        tmp = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, tmp));
19005        JUMP_LABEL (tmp) = end_2_label;
19006
19007        /* Not in the first two.  Move two bytes forward.  */
19008        emit_insn (gen_lshrsi3 (tmpreg, tmpreg, GEN_INT (16)));
19009        emit_insn ((*ix86_gen_add3) (out, out, const2_rtx));
19010
19011        emit_label (end_2_label);
19012
19013     }
19014
19015   /* Avoid branch in fixing the byte.  */
19016   tmpreg = gen_lowpart (QImode, tmpreg);
19017   emit_insn (gen_addqi3_cc (tmpreg, tmpreg, tmpreg));
19018   cmp = gen_rtx_LTU (Pmode, gen_rtx_REG (CCmode, FLAGS_REG), const0_rtx);
19019   emit_insn ((*ix86_gen_sub3_carry) (out, out, GEN_INT (3), cmp));
19020
19021   emit_label (end_0_label);
19022 }
19023
19024 /* Expand strlen.  */
19025
19026 int
19027 ix86_expand_strlen (rtx out, rtx src, rtx eoschar, rtx align)
19028 {
19029   rtx addr, scratch1, scratch2, scratch3, scratch4;
19030
19031   /* The generic case of strlen expander is long.  Avoid it's
19032      expanding unless TARGET_INLINE_ALL_STRINGOPS.  */
19033
19034   if (TARGET_UNROLL_STRLEN && eoschar == const0_rtx && optimize > 1
19035       && !TARGET_INLINE_ALL_STRINGOPS
19036       && !optimize_insn_for_size_p ()
19037       && (!CONST_INT_P (align) || INTVAL (align) < 4))
19038     return 0;
19039
19040   addr = force_reg (Pmode, XEXP (src, 0));
19041   scratch1 = gen_reg_rtx (Pmode);
19042
19043   if (TARGET_UNROLL_STRLEN && eoschar == const0_rtx && optimize > 1
19044       && !optimize_insn_for_size_p ())
19045     {
19046       /* Well it seems that some optimizer does not combine a call like
19047          foo(strlen(bar), strlen(bar));
19048          when the move and the subtraction is done here.  It does calculate
19049          the length just once when these instructions are done inside of
19050          output_strlen_unroll().  But I think since &bar[strlen(bar)] is
19051          often used and I use one fewer register for the lifetime of
19052          output_strlen_unroll() this is better.  */
19053
19054       emit_move_insn (out, addr);
19055
19056       ix86_expand_strlensi_unroll_1 (out, src, align);
19057
19058       /* strlensi_unroll_1 returns the address of the zero at the end of
19059          the string, like memchr(), so compute the length by subtracting
19060          the start address.  */
19061       emit_insn ((*ix86_gen_sub3) (out, out, addr));
19062     }
19063   else
19064     {
19065       rtx unspec;
19066
19067       /* Can't use this if the user has appropriated eax, ecx, or edi.  */
19068       if (fixed_regs[AX_REG] || fixed_regs[CX_REG] || fixed_regs[DI_REG])
19069         return false;
19070
19071       scratch2 = gen_reg_rtx (Pmode);
19072       scratch3 = gen_reg_rtx (Pmode);
19073       scratch4 = force_reg (Pmode, constm1_rtx);
19074
19075       emit_move_insn (scratch3, addr);
19076       eoschar = force_reg (QImode, eoschar);
19077
19078       src = replace_equiv_address_nv (src, scratch3);
19079
19080       /* If .md starts supporting :P, this can be done in .md.  */
19081       unspec = gen_rtx_UNSPEC (Pmode, gen_rtvec (4, src, eoschar, align,
19082                                                  scratch4), UNSPEC_SCAS);
19083       emit_insn (gen_strlenqi_1 (scratch1, scratch3, unspec));
19084       emit_insn ((*ix86_gen_one_cmpl2) (scratch2, scratch1));
19085       emit_insn ((*ix86_gen_add3) (out, scratch2, constm1_rtx));
19086     }
19087   return 1;
19088 }
19089
19090 /* For given symbol (function) construct code to compute address of it's PLT
19091    entry in large x86-64 PIC model.  */
19092 rtx
19093 construct_plt_address (rtx symbol)
19094 {
19095   rtx tmp = gen_reg_rtx (Pmode);
19096   rtx unspec = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, symbol), UNSPEC_PLTOFF);
19097
19098   gcc_assert (GET_CODE (symbol) == SYMBOL_REF);
19099   gcc_assert (ix86_cmodel == CM_LARGE_PIC);
19100
19101   emit_move_insn (tmp, gen_rtx_CONST (Pmode, unspec));
19102   emit_insn (gen_adddi3 (tmp, tmp, pic_offset_table_rtx));
19103   return tmp;
19104 }
19105
19106 void
19107 ix86_expand_call (rtx retval, rtx fnaddr, rtx callarg1,
19108                   rtx callarg2,
19109                   rtx pop, int sibcall)
19110 {
19111   rtx use = NULL, call;
19112
19113   if (pop == const0_rtx)
19114     pop = NULL;
19115   gcc_assert (!TARGET_64BIT || !pop);
19116
19117   if (TARGET_MACHO && !TARGET_64BIT)
19118     {
19119 #if TARGET_MACHO
19120       if (flag_pic && GET_CODE (XEXP (fnaddr, 0)) == SYMBOL_REF)
19121         fnaddr = machopic_indirect_call_target (fnaddr);
19122 #endif
19123     }
19124   else
19125     {
19126       /* Static functions and indirect calls don't need the pic register.  */
19127       if (flag_pic && (!TARGET_64BIT || ix86_cmodel == CM_LARGE_PIC)
19128           && GET_CODE (XEXP (fnaddr, 0)) == SYMBOL_REF
19129           && ! SYMBOL_REF_LOCAL_P (XEXP (fnaddr, 0)))
19130         use_reg (&use, pic_offset_table_rtx);
19131     }
19132
19133   if (TARGET_64BIT && INTVAL (callarg2) >= 0)
19134     {
19135       rtx al = gen_rtx_REG (QImode, AX_REG);
19136       emit_move_insn (al, callarg2);
19137       use_reg (&use, al);
19138     }
19139
19140   if (ix86_cmodel == CM_LARGE_PIC
19141       && MEM_P (fnaddr) 
19142       && GET_CODE (XEXP (fnaddr, 0)) == SYMBOL_REF
19143       && !local_symbolic_operand (XEXP (fnaddr, 0), VOIDmode))
19144     fnaddr = gen_rtx_MEM (QImode, construct_plt_address (XEXP (fnaddr, 0)));
19145   else if (sibcall
19146            ? !sibcall_insn_operand (XEXP (fnaddr, 0), Pmode)
19147            : !call_insn_operand (XEXP (fnaddr, 0), Pmode))
19148     {
19149       fnaddr = copy_to_mode_reg (Pmode, XEXP (fnaddr, 0));
19150       fnaddr = gen_rtx_MEM (QImode, fnaddr);
19151     }
19152
19153   call = gen_rtx_CALL (VOIDmode, fnaddr, callarg1);
19154   if (retval)
19155     call = gen_rtx_SET (VOIDmode, retval, call);
19156   if (pop)
19157     {
19158       pop = gen_rtx_PLUS (Pmode, stack_pointer_rtx, pop);
19159       pop = gen_rtx_SET (VOIDmode, stack_pointer_rtx, pop);
19160       call = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, call, pop));
19161     }
19162   if (TARGET_64BIT
19163       && ix86_cfun_abi () == MS_ABI
19164       && (!callarg2 || INTVAL (callarg2) != -2))
19165     {
19166       /* We need to represent that SI and DI registers are clobbered
19167          by SYSV calls.  */
19168       static int clobbered_registers[] = {
19169         XMM6_REG, XMM7_REG, XMM8_REG,
19170         XMM9_REG, XMM10_REG, XMM11_REG,
19171         XMM12_REG, XMM13_REG, XMM14_REG,
19172         XMM15_REG, SI_REG, DI_REG
19173       };
19174       unsigned int i;
19175       rtx vec[ARRAY_SIZE (clobbered_registers) + 2];
19176       rtx unspec = gen_rtx_UNSPEC (VOIDmode, gen_rtvec (1, const0_rtx),
19177                                    UNSPEC_MS_TO_SYSV_CALL);
19178
19179       vec[0] = call;
19180       vec[1] = unspec;
19181       for (i = 0; i < ARRAY_SIZE (clobbered_registers); i++)
19182         vec[i + 2] = gen_rtx_CLOBBER (SSE_REGNO_P (clobbered_registers[i])
19183                                       ? TImode : DImode,
19184                                       gen_rtx_REG
19185                                         (SSE_REGNO_P (clobbered_registers[i])
19186                                                       ? TImode : DImode,
19187                                          clobbered_registers[i]));
19188
19189       call = gen_rtx_PARALLEL (VOIDmode,
19190                                gen_rtvec_v (ARRAY_SIZE (clobbered_registers)
19191                                + 2, vec));
19192     }
19193
19194   call = emit_call_insn (call);
19195   if (use)
19196     CALL_INSN_FUNCTION_USAGE (call) = use;
19197 }
19198
19199 \f
19200 /* Clear stack slot assignments remembered from previous functions.
19201    This is called from INIT_EXPANDERS once before RTL is emitted for each
19202    function.  */
19203
19204 static struct machine_function *
19205 ix86_init_machine_status (void)
19206 {
19207   struct machine_function *f;
19208
19209   f = GGC_CNEW (struct machine_function);
19210   f->use_fast_prologue_epilogue_nregs = -1;
19211   f->tls_descriptor_call_expanded_p = 0;
19212   f->call_abi = ix86_abi;
19213
19214   return f;
19215 }
19216
19217 /* Return a MEM corresponding to a stack slot with mode MODE.
19218    Allocate a new slot if necessary.
19219
19220    The RTL for a function can have several slots available: N is
19221    which slot to use.  */
19222
19223 rtx
19224 assign_386_stack_local (enum machine_mode mode, enum ix86_stack_slot n)
19225 {
19226   struct stack_local_entry *s;
19227
19228   gcc_assert (n < MAX_386_STACK_LOCALS);
19229
19230   /* Virtual slot is valid only before vregs are instantiated.  */
19231   gcc_assert ((n == SLOT_VIRTUAL) == !virtuals_instantiated);
19232
19233   for (s = ix86_stack_locals; s; s = s->next)
19234     if (s->mode == mode && s->n == n)
19235       return copy_rtx (s->rtl);
19236
19237   s = (struct stack_local_entry *)
19238     ggc_alloc (sizeof (struct stack_local_entry));
19239   s->n = n;
19240   s->mode = mode;
19241   s->rtl = assign_stack_local (mode, GET_MODE_SIZE (mode), 0);
19242
19243   s->next = ix86_stack_locals;
19244   ix86_stack_locals = s;
19245   return s->rtl;
19246 }
19247
19248 /* Construct the SYMBOL_REF for the tls_get_addr function.  */
19249
19250 static GTY(()) rtx ix86_tls_symbol;
19251 rtx
19252 ix86_tls_get_addr (void)
19253 {
19254
19255   if (!ix86_tls_symbol)
19256     {
19257       ix86_tls_symbol = gen_rtx_SYMBOL_REF (Pmode,
19258                                             (TARGET_ANY_GNU_TLS
19259                                              && !TARGET_64BIT)
19260                                             ? "___tls_get_addr"
19261                                             : "__tls_get_addr");
19262     }
19263
19264   return ix86_tls_symbol;
19265 }
19266
19267 /* Construct the SYMBOL_REF for the _TLS_MODULE_BASE_ symbol.  */
19268
19269 static GTY(()) rtx ix86_tls_module_base_symbol;
19270 rtx
19271 ix86_tls_module_base (void)
19272 {
19273
19274   if (!ix86_tls_module_base_symbol)
19275     {
19276       ix86_tls_module_base_symbol = gen_rtx_SYMBOL_REF (Pmode,
19277                                                         "_TLS_MODULE_BASE_");
19278       SYMBOL_REF_FLAGS (ix86_tls_module_base_symbol)
19279         |= TLS_MODEL_GLOBAL_DYNAMIC << SYMBOL_FLAG_TLS_SHIFT;
19280     }
19281
19282   return ix86_tls_module_base_symbol;
19283 }
19284 \f
19285 /* Calculate the length of the memory address in the instruction
19286    encoding.  Does not include the one-byte modrm, opcode, or prefix.  */
19287
19288 int
19289 memory_address_length (rtx addr)
19290 {
19291   struct ix86_address parts;
19292   rtx base, index, disp;
19293   int len;
19294   int ok;
19295
19296   if (GET_CODE (addr) == PRE_DEC
19297       || GET_CODE (addr) == POST_INC
19298       || GET_CODE (addr) == PRE_MODIFY
19299       || GET_CODE (addr) == POST_MODIFY)
19300     return 0;
19301
19302   ok = ix86_decompose_address (addr, &parts);
19303   gcc_assert (ok);
19304
19305   if (parts.base && GET_CODE (parts.base) == SUBREG)
19306     parts.base = SUBREG_REG (parts.base);
19307   if (parts.index && GET_CODE (parts.index) == SUBREG)
19308     parts.index = SUBREG_REG (parts.index);
19309
19310   base = parts.base;
19311   index = parts.index;
19312   disp = parts.disp;
19313   len = 0;
19314
19315   /* Rule of thumb:
19316        - esp as the base always wants an index,
19317        - ebp as the base always wants a displacement,
19318        - r12 as the base always wants an index,
19319        - r13 as the base always wants a displacement.  */
19320
19321   /* Register Indirect.  */
19322   if (base && !index && !disp)
19323     {
19324       /* esp (for its index) and ebp (for its displacement) need
19325          the two-byte modrm form.  Similarly for r12 and r13 in 64-bit
19326          code.  */
19327       if (REG_P (addr)
19328           && (addr == arg_pointer_rtx
19329               || addr == frame_pointer_rtx
19330               || REGNO (addr) == SP_REG
19331               || REGNO (addr) == BP_REG
19332               || REGNO (addr) == R12_REG
19333               || REGNO (addr) == R13_REG))
19334         len = 1;
19335     }
19336
19337   /* Direct Addressing.  In 64-bit mode mod 00 r/m 5
19338      is not disp32, but disp32(%rip), so for disp32
19339      SIB byte is needed, unless print_operand_address
19340      optimizes it into disp32(%rip) or (%rip) is implied
19341      by UNSPEC.  */
19342   else if (disp && !base && !index)
19343     {
19344       len = 4;
19345       if (TARGET_64BIT)
19346         {
19347           rtx symbol = disp;
19348
19349           if (GET_CODE (disp) == CONST)
19350             symbol = XEXP (disp, 0);
19351           if (GET_CODE (symbol) == PLUS
19352               && CONST_INT_P (XEXP (symbol, 1)))
19353             symbol = XEXP (symbol, 0);
19354
19355           if (GET_CODE (symbol) != LABEL_REF
19356               && (GET_CODE (symbol) != SYMBOL_REF
19357                   || SYMBOL_REF_TLS_MODEL (symbol) != 0)
19358               && (GET_CODE (symbol) != UNSPEC
19359                   || (XINT (symbol, 1) != UNSPEC_GOTPCREL
19360                       && XINT (symbol, 1) != UNSPEC_GOTNTPOFF)))
19361             len += 1;
19362         }
19363     }
19364
19365   else
19366     {
19367       /* Find the length of the displacement constant.  */
19368       if (disp)
19369         {
19370           if (base && satisfies_constraint_K (disp))
19371             len = 1;
19372           else
19373             len = 4;
19374         }
19375       /* ebp always wants a displacement.  Similarly r13.  */
19376       else if (base && REG_P (base)
19377                && (REGNO (base) == BP_REG || REGNO (base) == R13_REG))
19378         len = 1;
19379
19380       /* An index requires the two-byte modrm form....  */
19381       if (index
19382           /* ...like esp (or r12), which always wants an index.  */
19383           || base == arg_pointer_rtx
19384           || base == frame_pointer_rtx
19385           || (base && REG_P (base)
19386               && (REGNO (base) == SP_REG || REGNO (base) == R12_REG)))
19387         len += 1;
19388     }
19389
19390   switch (parts.seg)
19391     {
19392     case SEG_FS:
19393     case SEG_GS:
19394       len += 1;
19395       break;
19396     default:
19397       break;
19398     }
19399
19400   return len;
19401 }
19402
19403 /* Compute default value for "length_immediate" attribute.  When SHORTFORM
19404    is set, expect that insn have 8bit immediate alternative.  */
19405 int
19406 ix86_attr_length_immediate_default (rtx insn, int shortform)
19407 {
19408   int len = 0;
19409   int i;
19410   extract_insn_cached (insn);
19411   for (i = recog_data.n_operands - 1; i >= 0; --i)
19412     if (CONSTANT_P (recog_data.operand[i]))
19413       {
19414         enum attr_mode mode = get_attr_mode (insn);
19415
19416         gcc_assert (!len);
19417         if (shortform && CONST_INT_P (recog_data.operand[i]))
19418           {
19419             HOST_WIDE_INT ival = INTVAL (recog_data.operand[i]);
19420             switch (mode)
19421               {
19422               case MODE_QI:
19423                 len = 1;
19424                 continue;
19425               case MODE_HI:
19426                 ival = trunc_int_for_mode (ival, HImode);
19427                 break;
19428               case MODE_SI:
19429                 ival = trunc_int_for_mode (ival, SImode);
19430                 break;
19431               default:
19432                 break;
19433               }
19434             if (IN_RANGE (ival, -128, 127))
19435               {
19436                 len = 1;
19437                 continue;
19438               }
19439           }
19440         switch (mode)
19441           {
19442           case MODE_QI:
19443             len = 1;
19444             break;
19445           case MODE_HI:
19446             len = 2;
19447             break;
19448           case MODE_SI:
19449             len = 4;
19450             break;
19451           /* Immediates for DImode instructions are encoded as 32bit sign extended values.  */
19452           case MODE_DI:
19453             len = 4;
19454             break;
19455           default:
19456             fatal_insn ("unknown insn mode", insn);
19457         }
19458       }
19459   return len;
19460 }
19461 /* Compute default value for "length_address" attribute.  */
19462 int
19463 ix86_attr_length_address_default (rtx insn)
19464 {
19465   int i;
19466
19467   if (get_attr_type (insn) == TYPE_LEA)
19468     {
19469       rtx set = PATTERN (insn), addr;
19470
19471       if (GET_CODE (set) == PARALLEL)
19472         set = XVECEXP (set, 0, 0);
19473
19474       gcc_assert (GET_CODE (set) == SET);
19475
19476       addr = SET_SRC (set);
19477       if (TARGET_64BIT && get_attr_mode (insn) == MODE_SI)
19478         {
19479           if (GET_CODE (addr) == ZERO_EXTEND)
19480             addr = XEXP (addr, 0);
19481           if (GET_CODE (addr) == SUBREG)
19482             addr = SUBREG_REG (addr);
19483         }
19484
19485       return memory_address_length (addr);
19486     }
19487
19488   extract_insn_cached (insn);
19489   for (i = recog_data.n_operands - 1; i >= 0; --i)
19490     if (MEM_P (recog_data.operand[i]))
19491       {
19492         constrain_operands_cached (reload_completed);
19493         if (which_alternative != -1)
19494           {
19495             const char *constraints = recog_data.constraints[i];
19496             int alt = which_alternative;
19497
19498             while (*constraints == '=' || *constraints == '+')
19499               constraints++;
19500             while (alt-- > 0)
19501               while (*constraints++ != ',')
19502                 ;
19503             /* Skip ignored operands.  */
19504             if (*constraints == 'X')
19505               continue;
19506           }
19507         return memory_address_length (XEXP (recog_data.operand[i], 0));
19508       }
19509   return 0;
19510 }
19511
19512 /* Compute default value for "length_vex" attribute. It includes
19513    2 or 3 byte VEX prefix and 1 opcode byte.  */
19514
19515 int
19516 ix86_attr_length_vex_default (rtx insn, int has_0f_opcode,
19517                               int has_vex_w)
19518 {
19519   int i;
19520
19521   /* Only 0f opcode can use 2 byte VEX prefix and  VEX W bit uses 3
19522      byte VEX prefix.  */
19523   if (!has_0f_opcode || has_vex_w)
19524     return 3 + 1;
19525
19526  /* We can always use 2 byte VEX prefix in 32bit.  */
19527   if (!TARGET_64BIT)
19528     return 2 + 1;
19529
19530   extract_insn_cached (insn);
19531
19532   for (i = recog_data.n_operands - 1; i >= 0; --i)
19533     if (REG_P (recog_data.operand[i]))
19534       {
19535         /* REX.W bit uses 3 byte VEX prefix.  */
19536         if (GET_MODE (recog_data.operand[i]) == DImode
19537             && GENERAL_REG_P (recog_data.operand[i]))
19538           return 3 + 1;
19539       }
19540     else
19541       {
19542         /* REX.X or REX.B bits use 3 byte VEX prefix.  */
19543         if (MEM_P (recog_data.operand[i])
19544             && x86_extended_reg_mentioned_p (recog_data.operand[i]))
19545           return 3 + 1;
19546       }
19547
19548   return 2 + 1;
19549 }
19550 \f
19551 /* Return the maximum number of instructions a cpu can issue.  */
19552
19553 static int
19554 ix86_issue_rate (void)
19555 {
19556   switch (ix86_tune)
19557     {
19558     case PROCESSOR_PENTIUM:
19559     case PROCESSOR_ATOM:
19560     case PROCESSOR_K6:
19561       return 2;
19562
19563     case PROCESSOR_PENTIUMPRO:
19564     case PROCESSOR_PENTIUM4:
19565     case PROCESSOR_ATHLON:
19566     case PROCESSOR_K8:
19567     case PROCESSOR_AMDFAM10:
19568     case PROCESSOR_NOCONA:
19569     case PROCESSOR_GENERIC32:
19570     case PROCESSOR_GENERIC64:
19571       return 3;
19572
19573     case PROCESSOR_CORE2:
19574       return 4;
19575
19576     default:
19577       return 1;
19578     }
19579 }
19580
19581 /* A subroutine of ix86_adjust_cost -- return true iff INSN reads flags set
19582    by DEP_INSN and nothing set by DEP_INSN.  */
19583
19584 static int
19585 ix86_flags_dependent (rtx insn, rtx dep_insn, enum attr_type insn_type)
19586 {
19587   rtx set, set2;
19588
19589   /* Simplify the test for uninteresting insns.  */
19590   if (insn_type != TYPE_SETCC
19591       && insn_type != TYPE_ICMOV
19592       && insn_type != TYPE_FCMOV
19593       && insn_type != TYPE_IBR)
19594     return 0;
19595
19596   if ((set = single_set (dep_insn)) != 0)
19597     {
19598       set = SET_DEST (set);
19599       set2 = NULL_RTX;
19600     }
19601   else if (GET_CODE (PATTERN (dep_insn)) == PARALLEL
19602            && XVECLEN (PATTERN (dep_insn), 0) == 2
19603            && GET_CODE (XVECEXP (PATTERN (dep_insn), 0, 0)) == SET
19604            && GET_CODE (XVECEXP (PATTERN (dep_insn), 0, 1)) == SET)
19605     {
19606       set = SET_DEST (XVECEXP (PATTERN (dep_insn), 0, 0));
19607       set2 = SET_DEST (XVECEXP (PATTERN (dep_insn), 0, 0));
19608     }
19609   else
19610     return 0;
19611
19612   if (!REG_P (set) || REGNO (set) != FLAGS_REG)
19613     return 0;
19614
19615   /* This test is true if the dependent insn reads the flags but
19616      not any other potentially set register.  */
19617   if (!reg_overlap_mentioned_p (set, PATTERN (insn)))
19618     return 0;
19619
19620   if (set2 && reg_overlap_mentioned_p (set2, PATTERN (insn)))
19621     return 0;
19622
19623   return 1;
19624 }
19625
19626 /* Return true iff USE_INSN has a memory address with operands set by
19627    SET_INSN.  */
19628
19629 bool
19630 ix86_agi_dependent (rtx set_insn, rtx use_insn)
19631 {
19632   int i;
19633   extract_insn_cached (use_insn);
19634   for (i = recog_data.n_operands - 1; i >= 0; --i)
19635     if (MEM_P (recog_data.operand[i]))
19636       {
19637         rtx addr = XEXP (recog_data.operand[i], 0);
19638         return modified_in_p (addr, set_insn) != 0;
19639       }
19640   return false;
19641 }
19642
19643 static int
19644 ix86_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
19645 {
19646   enum attr_type insn_type, dep_insn_type;
19647   enum attr_memory memory;
19648   rtx set, set2;
19649   int dep_insn_code_number;
19650
19651   /* Anti and output dependencies have zero cost on all CPUs.  */
19652   if (REG_NOTE_KIND (link) != 0)
19653     return 0;
19654
19655   dep_insn_code_number = recog_memoized (dep_insn);
19656
19657   /* If we can't recognize the insns, we can't really do anything.  */
19658   if (dep_insn_code_number < 0 || recog_memoized (insn) < 0)
19659     return cost;
19660
19661   insn_type = get_attr_type (insn);
19662   dep_insn_type = get_attr_type (dep_insn);
19663
19664   switch (ix86_tune)
19665     {
19666     case PROCESSOR_PENTIUM:
19667       /* Address Generation Interlock adds a cycle of latency.  */
19668       if (insn_type == TYPE_LEA)
19669         {
19670           rtx addr = PATTERN (insn);
19671
19672           if (GET_CODE (addr) == PARALLEL)
19673             addr = XVECEXP (addr, 0, 0);
19674
19675           gcc_assert (GET_CODE (addr) == SET);
19676
19677           addr = SET_SRC (addr);
19678           if (modified_in_p (addr, dep_insn))
19679             cost += 1;
19680         }
19681       else if (ix86_agi_dependent (dep_insn, insn))
19682         cost += 1;
19683
19684       /* ??? Compares pair with jump/setcc.  */
19685       if (ix86_flags_dependent (insn, dep_insn, insn_type))
19686         cost = 0;
19687
19688       /* Floating point stores require value to be ready one cycle earlier.  */
19689       if (insn_type == TYPE_FMOV
19690           && get_attr_memory (insn) == MEMORY_STORE
19691           && !ix86_agi_dependent (dep_insn, insn))
19692         cost += 1;
19693       break;
19694
19695     case PROCESSOR_PENTIUMPRO:
19696       memory = get_attr_memory (insn);
19697
19698       /* INT->FP conversion is expensive.  */
19699       if (get_attr_fp_int_src (dep_insn))
19700         cost += 5;
19701
19702       /* There is one cycle extra latency between an FP op and a store.  */
19703       if (insn_type == TYPE_FMOV
19704           && (set = single_set (dep_insn)) != NULL_RTX
19705           && (set2 = single_set (insn)) != NULL_RTX
19706           && rtx_equal_p (SET_DEST (set), SET_SRC (set2))
19707           && MEM_P (SET_DEST (set2)))
19708         cost += 1;
19709
19710       /* Show ability of reorder buffer to hide latency of load by executing
19711          in parallel with previous instruction in case
19712          previous instruction is not needed to compute the address.  */
19713       if ((memory == MEMORY_LOAD || memory == MEMORY_BOTH)
19714           && !ix86_agi_dependent (dep_insn, insn))
19715         {
19716           /* Claim moves to take one cycle, as core can issue one load
19717              at time and the next load can start cycle later.  */
19718           if (dep_insn_type == TYPE_IMOV
19719               || dep_insn_type == TYPE_FMOV)
19720             cost = 1;
19721           else if (cost > 1)
19722             cost--;
19723         }
19724       break;
19725
19726     case PROCESSOR_K6:
19727       memory = get_attr_memory (insn);
19728
19729       /* The esp dependency is resolved before the instruction is really
19730          finished.  */
19731       if ((insn_type == TYPE_PUSH || insn_type == TYPE_POP)
19732           && (dep_insn_type == TYPE_PUSH || dep_insn_type == TYPE_POP))
19733         return 1;
19734
19735       /* INT->FP conversion is expensive.  */
19736       if (get_attr_fp_int_src (dep_insn))
19737         cost += 5;
19738
19739       /* Show ability of reorder buffer to hide latency of load by executing
19740          in parallel with previous instruction in case
19741          previous instruction is not needed to compute the address.  */
19742       if ((memory == MEMORY_LOAD || memory == MEMORY_BOTH)
19743           && !ix86_agi_dependent (dep_insn, insn))
19744         {
19745           /* Claim moves to take one cycle, as core can issue one load
19746              at time and the next load can start cycle later.  */
19747           if (dep_insn_type == TYPE_IMOV
19748               || dep_insn_type == TYPE_FMOV)
19749             cost = 1;
19750           else if (cost > 2)
19751             cost -= 2;
19752           else
19753             cost = 1;
19754         }
19755       break;
19756
19757     case PROCESSOR_ATHLON:
19758     case PROCESSOR_K8:
19759     case PROCESSOR_AMDFAM10:
19760     case PROCESSOR_ATOM:
19761     case PROCESSOR_GENERIC32:
19762     case PROCESSOR_GENERIC64:
19763       memory = get_attr_memory (insn);
19764
19765       /* Show ability of reorder buffer to hide latency of load by executing
19766          in parallel with previous instruction in case
19767          previous instruction is not needed to compute the address.  */
19768       if ((memory == MEMORY_LOAD || memory == MEMORY_BOTH)
19769           && !ix86_agi_dependent (dep_insn, insn))
19770         {
19771           enum attr_unit unit = get_attr_unit (insn);
19772           int loadcost = 3;
19773
19774           /* Because of the difference between the length of integer and
19775              floating unit pipeline preparation stages, the memory operands
19776              for floating point are cheaper.
19777
19778              ??? For Athlon it the difference is most probably 2.  */
19779           if (unit == UNIT_INTEGER || unit == UNIT_UNKNOWN)
19780             loadcost = 3;
19781           else
19782             loadcost = TARGET_ATHLON ? 2 : 0;
19783
19784           if (cost >= loadcost)
19785             cost -= loadcost;
19786           else
19787             cost = 0;
19788         }
19789
19790     default:
19791       break;
19792     }
19793
19794   return cost;
19795 }
19796
19797 /* How many alternative schedules to try.  This should be as wide as the
19798    scheduling freedom in the DFA, but no wider.  Making this value too
19799    large results extra work for the scheduler.  */
19800
19801 static int
19802 ia32_multipass_dfa_lookahead (void)
19803 {
19804   switch (ix86_tune)
19805     {
19806     case PROCESSOR_PENTIUM:
19807       return 2;
19808
19809     case PROCESSOR_PENTIUMPRO:
19810     case PROCESSOR_K6:
19811       return 1;
19812
19813     default:
19814       return 0;
19815     }
19816 }
19817
19818 \f
19819 /* Compute the alignment given to a constant that is being placed in memory.
19820    EXP is the constant and ALIGN is the alignment that the object would
19821    ordinarily have.
19822    The value of this function is used instead of that alignment to align
19823    the object.  */
19824
19825 int
19826 ix86_constant_alignment (tree exp, int align)
19827 {
19828   if (TREE_CODE (exp) == REAL_CST || TREE_CODE (exp) == VECTOR_CST
19829       || TREE_CODE (exp) == INTEGER_CST)
19830     {
19831       if (TYPE_MODE (TREE_TYPE (exp)) == DFmode && align < 64)
19832         return 64;
19833       else if (ALIGN_MODE_128 (TYPE_MODE (TREE_TYPE (exp))) && align < 128)
19834         return 128;
19835     }
19836   else if (!optimize_size && TREE_CODE (exp) == STRING_CST
19837            && TREE_STRING_LENGTH (exp) >= 31 && align < BITS_PER_WORD)
19838     return BITS_PER_WORD;
19839
19840   return align;
19841 }
19842
19843 /* Compute the alignment for a static variable.
19844    TYPE is the data type, and ALIGN is the alignment that
19845    the object would ordinarily have.  The value of this function is used
19846    instead of that alignment to align the object.  */
19847
19848 int
19849 ix86_data_alignment (tree type, int align)
19850 {
19851   int max_align = optimize_size ? BITS_PER_WORD : MIN (256, MAX_OFILE_ALIGNMENT);
19852
19853   if (AGGREGATE_TYPE_P (type)
19854       && TYPE_SIZE (type)
19855       && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
19856       && (TREE_INT_CST_LOW (TYPE_SIZE (type)) >= (unsigned) max_align
19857           || TREE_INT_CST_HIGH (TYPE_SIZE (type)))
19858       && align < max_align)
19859     align = max_align;
19860
19861   /* x86-64 ABI requires arrays greater than 16 bytes to be aligned
19862      to 16byte boundary.  */
19863   if (TARGET_64BIT)
19864     {
19865       if (AGGREGATE_TYPE_P (type)
19866            && TYPE_SIZE (type)
19867            && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
19868            && (TREE_INT_CST_LOW (TYPE_SIZE (type)) >= 128
19869                || TREE_INT_CST_HIGH (TYPE_SIZE (type))) && align < 128)
19870         return 128;
19871     }
19872
19873   if (TREE_CODE (type) == ARRAY_TYPE)
19874     {
19875       if (TYPE_MODE (TREE_TYPE (type)) == DFmode && align < 64)
19876         return 64;
19877       if (ALIGN_MODE_128 (TYPE_MODE (TREE_TYPE (type))) && align < 128)
19878         return 128;
19879     }
19880   else if (TREE_CODE (type) == COMPLEX_TYPE)
19881     {
19882
19883       if (TYPE_MODE (type) == DCmode && align < 64)
19884         return 64;
19885       if ((TYPE_MODE (type) == XCmode
19886            || TYPE_MODE (type) == TCmode) && align < 128)
19887         return 128;
19888     }
19889   else if ((TREE_CODE (type) == RECORD_TYPE
19890             || TREE_CODE (type) == UNION_TYPE
19891             || TREE_CODE (type) == QUAL_UNION_TYPE)
19892            && TYPE_FIELDS (type))
19893     {
19894       if (DECL_MODE (TYPE_FIELDS (type)) == DFmode && align < 64)
19895         return 64;
19896       if (ALIGN_MODE_128 (DECL_MODE (TYPE_FIELDS (type))) && align < 128)
19897         return 128;
19898     }
19899   else if (TREE_CODE (type) == REAL_TYPE || TREE_CODE (type) == VECTOR_TYPE
19900            || TREE_CODE (type) == INTEGER_TYPE)
19901     {
19902       if (TYPE_MODE (type) == DFmode && align < 64)
19903         return 64;
19904       if (ALIGN_MODE_128 (TYPE_MODE (type)) && align < 128)
19905         return 128;
19906     }
19907
19908   return align;
19909 }
19910
19911 /* Compute the alignment for a local variable or a stack slot.  EXP is
19912    the data type or decl itself, MODE is the widest mode available and
19913    ALIGN is the alignment that the object would ordinarily have.  The
19914    value of this macro is used instead of that alignment to align the
19915    object.  */
19916
19917 unsigned int
19918 ix86_local_alignment (tree exp, enum machine_mode mode,
19919                       unsigned int align)
19920 {
19921   tree type, decl;
19922
19923   if (exp && DECL_P (exp))
19924     {
19925       type = TREE_TYPE (exp);
19926       decl = exp;
19927     }
19928   else
19929     {
19930       type = exp;
19931       decl = NULL;
19932     }
19933
19934   /* Don't do dynamic stack realignment for long long objects with
19935      -mpreferred-stack-boundary=2.  */
19936   if (!TARGET_64BIT
19937       && align == 64
19938       && ix86_preferred_stack_boundary < 64
19939       && (mode == DImode || (type && TYPE_MODE (type) == DImode))
19940       && (!type || !TYPE_USER_ALIGN (type))
19941       && (!decl || !DECL_USER_ALIGN (decl)))
19942     align = 32;
19943
19944   /* If TYPE is NULL, we are allocating a stack slot for caller-save
19945      register in MODE.  We will return the largest alignment of XF
19946      and DF.  */
19947   if (!type)
19948     {
19949       if (mode == XFmode && align < GET_MODE_ALIGNMENT (DFmode))
19950         align = GET_MODE_ALIGNMENT (DFmode);
19951       return align;
19952     }
19953
19954   /* x86-64 ABI requires arrays greater than 16 bytes to be aligned
19955      to 16byte boundary.  */
19956   if (TARGET_64BIT)
19957     {
19958       if (AGGREGATE_TYPE_P (type)
19959            && TYPE_SIZE (type)
19960            && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
19961            && (TREE_INT_CST_LOW (TYPE_SIZE (type)) >= 16
19962                || TREE_INT_CST_HIGH (TYPE_SIZE (type))) && align < 128)
19963         return 128;
19964     }
19965   if (TREE_CODE (type) == ARRAY_TYPE)
19966     {
19967       if (TYPE_MODE (TREE_TYPE (type)) == DFmode && align < 64)
19968         return 64;
19969       if (ALIGN_MODE_128 (TYPE_MODE (TREE_TYPE (type))) && align < 128)
19970         return 128;
19971     }
19972   else if (TREE_CODE (type) == COMPLEX_TYPE)
19973     {
19974       if (TYPE_MODE (type) == DCmode && align < 64)
19975         return 64;
19976       if ((TYPE_MODE (type) == XCmode
19977            || TYPE_MODE (type) == TCmode) && align < 128)
19978         return 128;
19979     }
19980   else if ((TREE_CODE (type) == RECORD_TYPE
19981             || TREE_CODE (type) == UNION_TYPE
19982             || TREE_CODE (type) == QUAL_UNION_TYPE)
19983            && TYPE_FIELDS (type))
19984     {
19985       if (DECL_MODE (TYPE_FIELDS (type)) == DFmode && align < 64)
19986         return 64;
19987       if (ALIGN_MODE_128 (DECL_MODE (TYPE_FIELDS (type))) && align < 128)
19988         return 128;
19989     }
19990   else if (TREE_CODE (type) == REAL_TYPE || TREE_CODE (type) == VECTOR_TYPE
19991            || TREE_CODE (type) == INTEGER_TYPE)
19992     {
19993
19994       if (TYPE_MODE (type) == DFmode && align < 64)
19995         return 64;
19996       if (ALIGN_MODE_128 (TYPE_MODE (type)) && align < 128)
19997         return 128;
19998     }
19999   return align;
20000 }
20001
20002 /* Compute the minimum required alignment for dynamic stack realignment
20003    purposes for a local variable, parameter or a stack slot.  EXP is
20004    the data type or decl itself, MODE is its mode and ALIGN is the
20005    alignment that the object would ordinarily have.  */
20006
20007 unsigned int
20008 ix86_minimum_alignment (tree exp, enum machine_mode mode,
20009                         unsigned int align)
20010 {
20011   tree type, decl;
20012
20013   if (TARGET_64BIT || align != 64 || ix86_preferred_stack_boundary >= 64)
20014     return align;
20015
20016   if (exp && DECL_P (exp))
20017     {
20018       type = TREE_TYPE (exp);
20019       decl = exp;
20020     }
20021   else
20022     {
20023       type = exp;
20024       decl = NULL;
20025     }
20026
20027   /* Don't do dynamic stack realignment for long long objects with
20028      -mpreferred-stack-boundary=2.  */
20029   if ((mode == DImode || (type && TYPE_MODE (type) == DImode))
20030       && (!type || !TYPE_USER_ALIGN (type))
20031       && (!decl || !DECL_USER_ALIGN (decl)))
20032     return 32;
20033
20034   return align;
20035 }
20036 \f
20037 /* Find a location for the static chain incoming to a nested function.
20038    This is a register, unless all free registers are used by arguments.  */
20039
20040 static rtx
20041 ix86_static_chain (const_tree fndecl, bool incoming_p)
20042 {
20043   unsigned regno;
20044
20045   if (!DECL_STATIC_CHAIN (fndecl))
20046     return NULL;
20047
20048   if (TARGET_64BIT)
20049     {
20050       /* We always use R10 in 64-bit mode.  */
20051       regno = R10_REG;
20052     }
20053   else
20054     {
20055       tree fntype;
20056       /* By default in 32-bit mode we use ECX to pass the static chain.  */
20057       regno = CX_REG;
20058
20059       fntype = TREE_TYPE (fndecl);
20060       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (fntype)))
20061         {
20062           /* Fastcall functions use ecx/edx for arguments, which leaves
20063              us with EAX for the static chain.  */
20064           regno = AX_REG;
20065         }
20066       else if (ix86_function_regparm (fntype, fndecl) == 3)
20067         {
20068           /* For regparm 3, we have no free call-clobbered registers in
20069              which to store the static chain.  In order to implement this,
20070              we have the trampoline push the static chain to the stack.
20071              However, we can't push a value below the return address when
20072              we call the nested function directly, so we have to use an
20073              alternate entry point.  For this we use ESI, and have the
20074              alternate entry point push ESI, so that things appear the
20075              same once we're executing the nested function.  */
20076           if (incoming_p)
20077             {
20078               if (fndecl == current_function_decl)
20079                 ix86_static_chain_on_stack = true;
20080               return gen_frame_mem (SImode,
20081                                     plus_constant (arg_pointer_rtx, -8));
20082             }
20083           regno = SI_REG;
20084         }
20085     }
20086
20087   return gen_rtx_REG (Pmode, regno);
20088 }
20089
20090 /* Emit RTL insns to initialize the variable parts of a trampoline.
20091    FNDECL is the decl of the target address; M_TRAMP is a MEM for 
20092    the trampoline, and CHAIN_VALUE is an RTX for the static chain
20093    to be passed to the target function.  */
20094
20095 static void
20096 ix86_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
20097 {
20098   rtx mem, fnaddr;
20099
20100   fnaddr = XEXP (DECL_RTL (fndecl), 0);
20101
20102   if (!TARGET_64BIT)
20103     {
20104       rtx disp, chain;
20105       int opcode;
20106
20107       /* Depending on the static chain location, either load a register
20108          with a constant, or push the constant to the stack.  All of the
20109          instructions are the same size.  */
20110       chain = ix86_static_chain (fndecl, true);
20111       if (REG_P (chain))
20112         {
20113           if (REGNO (chain) == CX_REG)
20114             opcode = 0xb9;
20115           else if (REGNO (chain) == AX_REG)
20116             opcode = 0xb8;
20117           else
20118             gcc_unreachable ();
20119         }
20120       else
20121         opcode = 0x68;
20122
20123       mem = adjust_address (m_tramp, QImode, 0);
20124       emit_move_insn (mem, gen_int_mode (opcode, QImode));
20125
20126       mem = adjust_address (m_tramp, SImode, 1);
20127       emit_move_insn (mem, chain_value);
20128
20129       /* Compute offset from the end of the jmp to the target function.
20130          In the case in which the trampoline stores the static chain on
20131          the stack, we need to skip the first insn which pushes the
20132          (call-saved) register static chain; this push is 1 byte.  */
20133       disp = expand_binop (SImode, sub_optab, fnaddr,
20134                            plus_constant (XEXP (m_tramp, 0),
20135                                           MEM_P (chain) ? 9 : 10),
20136                            NULL_RTX, 1, OPTAB_DIRECT);
20137
20138       mem = adjust_address (m_tramp, QImode, 5);
20139       emit_move_insn (mem, gen_int_mode (0xe9, QImode));
20140
20141       mem = adjust_address (m_tramp, SImode, 6);
20142       emit_move_insn (mem, disp);
20143     }
20144   else
20145     {
20146       int offset = 0;
20147
20148       /* Load the function address to r11.  Try to load address using
20149          the shorter movl instead of movabs.  We may want to support
20150          movq for kernel mode, but kernel does not use trampolines at
20151          the moment.  */
20152       if (x86_64_zext_immediate_operand (fnaddr, VOIDmode))
20153         {
20154           fnaddr = copy_to_mode_reg (DImode, fnaddr);
20155
20156           mem = adjust_address (m_tramp, HImode, offset);
20157           emit_move_insn (mem, gen_int_mode (0xbb41, HImode));
20158
20159           mem = adjust_address (m_tramp, SImode, offset + 2);
20160           emit_move_insn (mem, gen_lowpart (SImode, fnaddr));
20161           offset += 6;
20162         }
20163       else
20164         {
20165           mem = adjust_address (m_tramp, HImode, offset);
20166           emit_move_insn (mem, gen_int_mode (0xbb49, HImode));
20167
20168           mem = adjust_address (m_tramp, DImode, offset + 2);
20169           emit_move_insn (mem, fnaddr);
20170           offset += 10;
20171         }
20172
20173       /* Load static chain using movabs to r10.  */
20174       mem = adjust_address (m_tramp, HImode, offset);
20175       emit_move_insn (mem, gen_int_mode (0xba49, HImode));
20176
20177       mem = adjust_address (m_tramp, DImode, offset + 2);
20178       emit_move_insn (mem, chain_value);
20179       offset += 10;
20180
20181       /* Jump to r11; the last (unused) byte is a nop, only there to
20182          pad the write out to a single 32-bit store.  */
20183       mem = adjust_address (m_tramp, SImode, offset);
20184       emit_move_insn (mem, gen_int_mode (0x90e3ff49, SImode));
20185       offset += 4;
20186
20187       gcc_assert (offset <= TRAMPOLINE_SIZE);
20188     }
20189
20190 #ifdef ENABLE_EXECUTE_STACK
20191 #ifdef CHECK_EXECUTE_STACK_ENABLED
20192   if (CHECK_EXECUTE_STACK_ENABLED)
20193 #endif
20194   emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__enable_execute_stack"),
20195                      LCT_NORMAL, VOIDmode, 1, XEXP (m_tramp, 0), Pmode);
20196 #endif
20197 }
20198 \f
20199 /* Codes for all the SSE/MMX builtins.  */
20200 enum ix86_builtins
20201 {
20202   IX86_BUILTIN_ADDPS,
20203   IX86_BUILTIN_ADDSS,
20204   IX86_BUILTIN_DIVPS,
20205   IX86_BUILTIN_DIVSS,
20206   IX86_BUILTIN_MULPS,
20207   IX86_BUILTIN_MULSS,
20208   IX86_BUILTIN_SUBPS,
20209   IX86_BUILTIN_SUBSS,
20210
20211   IX86_BUILTIN_CMPEQPS,
20212   IX86_BUILTIN_CMPLTPS,
20213   IX86_BUILTIN_CMPLEPS,
20214   IX86_BUILTIN_CMPGTPS,
20215   IX86_BUILTIN_CMPGEPS,
20216   IX86_BUILTIN_CMPNEQPS,
20217   IX86_BUILTIN_CMPNLTPS,
20218   IX86_BUILTIN_CMPNLEPS,
20219   IX86_BUILTIN_CMPNGTPS,
20220   IX86_BUILTIN_CMPNGEPS,
20221   IX86_BUILTIN_CMPORDPS,
20222   IX86_BUILTIN_CMPUNORDPS,
20223   IX86_BUILTIN_CMPEQSS,
20224   IX86_BUILTIN_CMPLTSS,
20225   IX86_BUILTIN_CMPLESS,
20226   IX86_BUILTIN_CMPNEQSS,
20227   IX86_BUILTIN_CMPNLTSS,
20228   IX86_BUILTIN_CMPNLESS,
20229   IX86_BUILTIN_CMPNGTSS,
20230   IX86_BUILTIN_CMPNGESS,
20231   IX86_BUILTIN_CMPORDSS,
20232   IX86_BUILTIN_CMPUNORDSS,
20233
20234   IX86_BUILTIN_COMIEQSS,
20235   IX86_BUILTIN_COMILTSS,
20236   IX86_BUILTIN_COMILESS,
20237   IX86_BUILTIN_COMIGTSS,
20238   IX86_BUILTIN_COMIGESS,
20239   IX86_BUILTIN_COMINEQSS,
20240   IX86_BUILTIN_UCOMIEQSS,
20241   IX86_BUILTIN_UCOMILTSS,
20242   IX86_BUILTIN_UCOMILESS,
20243   IX86_BUILTIN_UCOMIGTSS,
20244   IX86_BUILTIN_UCOMIGESS,
20245   IX86_BUILTIN_UCOMINEQSS,
20246
20247   IX86_BUILTIN_CVTPI2PS,
20248   IX86_BUILTIN_CVTPS2PI,
20249   IX86_BUILTIN_CVTSI2SS,
20250   IX86_BUILTIN_CVTSI642SS,
20251   IX86_BUILTIN_CVTSS2SI,
20252   IX86_BUILTIN_CVTSS2SI64,
20253   IX86_BUILTIN_CVTTPS2PI,
20254   IX86_BUILTIN_CVTTSS2SI,
20255   IX86_BUILTIN_CVTTSS2SI64,
20256
20257   IX86_BUILTIN_MAXPS,
20258   IX86_BUILTIN_MAXSS,
20259   IX86_BUILTIN_MINPS,
20260   IX86_BUILTIN_MINSS,
20261
20262   IX86_BUILTIN_LOADUPS,
20263   IX86_BUILTIN_STOREUPS,
20264   IX86_BUILTIN_MOVSS,
20265
20266   IX86_BUILTIN_MOVHLPS,
20267   IX86_BUILTIN_MOVLHPS,
20268   IX86_BUILTIN_LOADHPS,
20269   IX86_BUILTIN_LOADLPS,
20270   IX86_BUILTIN_STOREHPS,
20271   IX86_BUILTIN_STORELPS,
20272
20273   IX86_BUILTIN_MASKMOVQ,
20274   IX86_BUILTIN_MOVMSKPS,
20275   IX86_BUILTIN_PMOVMSKB,
20276
20277   IX86_BUILTIN_MOVNTPS,
20278   IX86_BUILTIN_MOVNTQ,
20279
20280   IX86_BUILTIN_LOADDQU,
20281   IX86_BUILTIN_STOREDQU,
20282
20283   IX86_BUILTIN_PACKSSWB,
20284   IX86_BUILTIN_PACKSSDW,
20285   IX86_BUILTIN_PACKUSWB,
20286
20287   IX86_BUILTIN_PADDB,
20288   IX86_BUILTIN_PADDW,
20289   IX86_BUILTIN_PADDD,
20290   IX86_BUILTIN_PADDQ,
20291   IX86_BUILTIN_PADDSB,
20292   IX86_BUILTIN_PADDSW,
20293   IX86_BUILTIN_PADDUSB,
20294   IX86_BUILTIN_PADDUSW,
20295   IX86_BUILTIN_PSUBB,
20296   IX86_BUILTIN_PSUBW,
20297   IX86_BUILTIN_PSUBD,
20298   IX86_BUILTIN_PSUBQ,
20299   IX86_BUILTIN_PSUBSB,
20300   IX86_BUILTIN_PSUBSW,
20301   IX86_BUILTIN_PSUBUSB,
20302   IX86_BUILTIN_PSUBUSW,
20303
20304   IX86_BUILTIN_PAND,
20305   IX86_BUILTIN_PANDN,
20306   IX86_BUILTIN_POR,
20307   IX86_BUILTIN_PXOR,
20308
20309   IX86_BUILTIN_PAVGB,
20310   IX86_BUILTIN_PAVGW,
20311
20312   IX86_BUILTIN_PCMPEQB,
20313   IX86_BUILTIN_PCMPEQW,
20314   IX86_BUILTIN_PCMPEQD,
20315   IX86_BUILTIN_PCMPGTB,
20316   IX86_BUILTIN_PCMPGTW,
20317   IX86_BUILTIN_PCMPGTD,
20318
20319   IX86_BUILTIN_PMADDWD,
20320
20321   IX86_BUILTIN_PMAXSW,
20322   IX86_BUILTIN_PMAXUB,
20323   IX86_BUILTIN_PMINSW,
20324   IX86_BUILTIN_PMINUB,
20325
20326   IX86_BUILTIN_PMULHUW,
20327   IX86_BUILTIN_PMULHW,
20328   IX86_BUILTIN_PMULLW,
20329
20330   IX86_BUILTIN_PSADBW,
20331   IX86_BUILTIN_PSHUFW,
20332
20333   IX86_BUILTIN_PSLLW,
20334   IX86_BUILTIN_PSLLD,
20335   IX86_BUILTIN_PSLLQ,
20336   IX86_BUILTIN_PSRAW,
20337   IX86_BUILTIN_PSRAD,
20338   IX86_BUILTIN_PSRLW,
20339   IX86_BUILTIN_PSRLD,
20340   IX86_BUILTIN_PSRLQ,
20341   IX86_BUILTIN_PSLLWI,
20342   IX86_BUILTIN_PSLLDI,
20343   IX86_BUILTIN_PSLLQI,
20344   IX86_BUILTIN_PSRAWI,
20345   IX86_BUILTIN_PSRADI,
20346   IX86_BUILTIN_PSRLWI,
20347   IX86_BUILTIN_PSRLDI,
20348   IX86_BUILTIN_PSRLQI,
20349
20350   IX86_BUILTIN_PUNPCKHBW,
20351   IX86_BUILTIN_PUNPCKHWD,
20352   IX86_BUILTIN_PUNPCKHDQ,
20353   IX86_BUILTIN_PUNPCKLBW,
20354   IX86_BUILTIN_PUNPCKLWD,
20355   IX86_BUILTIN_PUNPCKLDQ,
20356
20357   IX86_BUILTIN_SHUFPS,
20358
20359   IX86_BUILTIN_RCPPS,
20360   IX86_BUILTIN_RCPSS,
20361   IX86_BUILTIN_RSQRTPS,
20362   IX86_BUILTIN_RSQRTPS_NR,
20363   IX86_BUILTIN_RSQRTSS,
20364   IX86_BUILTIN_RSQRTF,
20365   IX86_BUILTIN_SQRTPS,
20366   IX86_BUILTIN_SQRTPS_NR,
20367   IX86_BUILTIN_SQRTSS,
20368
20369   IX86_BUILTIN_UNPCKHPS,
20370   IX86_BUILTIN_UNPCKLPS,
20371
20372   IX86_BUILTIN_ANDPS,
20373   IX86_BUILTIN_ANDNPS,
20374   IX86_BUILTIN_ORPS,
20375   IX86_BUILTIN_XORPS,
20376
20377   IX86_BUILTIN_EMMS,
20378   IX86_BUILTIN_LDMXCSR,
20379   IX86_BUILTIN_STMXCSR,
20380   IX86_BUILTIN_SFENCE,
20381
20382   /* 3DNow! Original */
20383   IX86_BUILTIN_FEMMS,
20384   IX86_BUILTIN_PAVGUSB,
20385   IX86_BUILTIN_PF2ID,
20386   IX86_BUILTIN_PFACC,
20387   IX86_BUILTIN_PFADD,
20388   IX86_BUILTIN_PFCMPEQ,
20389   IX86_BUILTIN_PFCMPGE,
20390   IX86_BUILTIN_PFCMPGT,
20391   IX86_BUILTIN_PFMAX,
20392   IX86_BUILTIN_PFMIN,
20393   IX86_BUILTIN_PFMUL,
20394   IX86_BUILTIN_PFRCP,
20395   IX86_BUILTIN_PFRCPIT1,
20396   IX86_BUILTIN_PFRCPIT2,
20397   IX86_BUILTIN_PFRSQIT1,
20398   IX86_BUILTIN_PFRSQRT,
20399   IX86_BUILTIN_PFSUB,
20400   IX86_BUILTIN_PFSUBR,
20401   IX86_BUILTIN_PI2FD,
20402   IX86_BUILTIN_PMULHRW,
20403
20404   /* 3DNow! Athlon Extensions */
20405   IX86_BUILTIN_PF2IW,
20406   IX86_BUILTIN_PFNACC,
20407   IX86_BUILTIN_PFPNACC,
20408   IX86_BUILTIN_PI2FW,
20409   IX86_BUILTIN_PSWAPDSI,
20410   IX86_BUILTIN_PSWAPDSF,
20411
20412   /* SSE2 */
20413   IX86_BUILTIN_ADDPD,
20414   IX86_BUILTIN_ADDSD,
20415   IX86_BUILTIN_DIVPD,
20416   IX86_BUILTIN_DIVSD,
20417   IX86_BUILTIN_MULPD,
20418   IX86_BUILTIN_MULSD,
20419   IX86_BUILTIN_SUBPD,
20420   IX86_BUILTIN_SUBSD,
20421
20422   IX86_BUILTIN_CMPEQPD,
20423   IX86_BUILTIN_CMPLTPD,
20424   IX86_BUILTIN_CMPLEPD,
20425   IX86_BUILTIN_CMPGTPD,
20426   IX86_BUILTIN_CMPGEPD,
20427   IX86_BUILTIN_CMPNEQPD,
20428   IX86_BUILTIN_CMPNLTPD,
20429   IX86_BUILTIN_CMPNLEPD,
20430   IX86_BUILTIN_CMPNGTPD,
20431   IX86_BUILTIN_CMPNGEPD,
20432   IX86_BUILTIN_CMPORDPD,
20433   IX86_BUILTIN_CMPUNORDPD,
20434   IX86_BUILTIN_CMPEQSD,
20435   IX86_BUILTIN_CMPLTSD,
20436   IX86_BUILTIN_CMPLESD,
20437   IX86_BUILTIN_CMPNEQSD,
20438   IX86_BUILTIN_CMPNLTSD,
20439   IX86_BUILTIN_CMPNLESD,
20440   IX86_BUILTIN_CMPORDSD,
20441   IX86_BUILTIN_CMPUNORDSD,
20442
20443   IX86_BUILTIN_COMIEQSD,
20444   IX86_BUILTIN_COMILTSD,
20445   IX86_BUILTIN_COMILESD,
20446   IX86_BUILTIN_COMIGTSD,
20447   IX86_BUILTIN_COMIGESD,
20448   IX86_BUILTIN_COMINEQSD,
20449   IX86_BUILTIN_UCOMIEQSD,
20450   IX86_BUILTIN_UCOMILTSD,
20451   IX86_BUILTIN_UCOMILESD,
20452   IX86_BUILTIN_UCOMIGTSD,
20453   IX86_BUILTIN_UCOMIGESD,
20454   IX86_BUILTIN_UCOMINEQSD,
20455
20456   IX86_BUILTIN_MAXPD,
20457   IX86_BUILTIN_MAXSD,
20458   IX86_BUILTIN_MINPD,
20459   IX86_BUILTIN_MINSD,
20460
20461   IX86_BUILTIN_ANDPD,
20462   IX86_BUILTIN_ANDNPD,
20463   IX86_BUILTIN_ORPD,
20464   IX86_BUILTIN_XORPD,
20465
20466   IX86_BUILTIN_SQRTPD,
20467   IX86_BUILTIN_SQRTSD,
20468
20469   IX86_BUILTIN_UNPCKHPD,
20470   IX86_BUILTIN_UNPCKLPD,
20471
20472   IX86_BUILTIN_SHUFPD,
20473
20474   IX86_BUILTIN_LOADUPD,
20475   IX86_BUILTIN_STOREUPD,
20476   IX86_BUILTIN_MOVSD,
20477
20478   IX86_BUILTIN_LOADHPD,
20479   IX86_BUILTIN_LOADLPD,
20480
20481   IX86_BUILTIN_CVTDQ2PD,
20482   IX86_BUILTIN_CVTDQ2PS,
20483
20484   IX86_BUILTIN_CVTPD2DQ,
20485   IX86_BUILTIN_CVTPD2PI,
20486   IX86_BUILTIN_CVTPD2PS,
20487   IX86_BUILTIN_CVTTPD2DQ,
20488   IX86_BUILTIN_CVTTPD2PI,
20489
20490   IX86_BUILTIN_CVTPI2PD,
20491   IX86_BUILTIN_CVTSI2SD,
20492   IX86_BUILTIN_CVTSI642SD,
20493
20494   IX86_BUILTIN_CVTSD2SI,
20495   IX86_BUILTIN_CVTSD2SI64,
20496   IX86_BUILTIN_CVTSD2SS,
20497   IX86_BUILTIN_CVTSS2SD,
20498   IX86_BUILTIN_CVTTSD2SI,
20499   IX86_BUILTIN_CVTTSD2SI64,
20500
20501   IX86_BUILTIN_CVTPS2DQ,
20502   IX86_BUILTIN_CVTPS2PD,
20503   IX86_BUILTIN_CVTTPS2DQ,
20504
20505   IX86_BUILTIN_MOVNTI,
20506   IX86_BUILTIN_MOVNTPD,
20507   IX86_BUILTIN_MOVNTDQ,
20508
20509   IX86_BUILTIN_MOVQ128,
20510
20511   /* SSE2 MMX */
20512   IX86_BUILTIN_MASKMOVDQU,
20513   IX86_BUILTIN_MOVMSKPD,
20514   IX86_BUILTIN_PMOVMSKB128,
20515
20516   IX86_BUILTIN_PACKSSWB128,
20517   IX86_BUILTIN_PACKSSDW128,
20518   IX86_BUILTIN_PACKUSWB128,
20519
20520   IX86_BUILTIN_PADDB128,
20521   IX86_BUILTIN_PADDW128,
20522   IX86_BUILTIN_PADDD128,
20523   IX86_BUILTIN_PADDQ128,
20524   IX86_BUILTIN_PADDSB128,
20525   IX86_BUILTIN_PADDSW128,
20526   IX86_BUILTIN_PADDUSB128,
20527   IX86_BUILTIN_PADDUSW128,
20528   IX86_BUILTIN_PSUBB128,
20529   IX86_BUILTIN_PSUBW128,
20530   IX86_BUILTIN_PSUBD128,
20531   IX86_BUILTIN_PSUBQ128,
20532   IX86_BUILTIN_PSUBSB128,
20533   IX86_BUILTIN_PSUBSW128,
20534   IX86_BUILTIN_PSUBUSB128,
20535   IX86_BUILTIN_PSUBUSW128,
20536
20537   IX86_BUILTIN_PAND128,
20538   IX86_BUILTIN_PANDN128,
20539   IX86_BUILTIN_POR128,
20540   IX86_BUILTIN_PXOR128,
20541
20542   IX86_BUILTIN_PAVGB128,
20543   IX86_BUILTIN_PAVGW128,
20544
20545   IX86_BUILTIN_PCMPEQB128,
20546   IX86_BUILTIN_PCMPEQW128,
20547   IX86_BUILTIN_PCMPEQD128,
20548   IX86_BUILTIN_PCMPGTB128,
20549   IX86_BUILTIN_PCMPGTW128,
20550   IX86_BUILTIN_PCMPGTD128,
20551
20552   IX86_BUILTIN_PMADDWD128,
20553
20554   IX86_BUILTIN_PMAXSW128,
20555   IX86_BUILTIN_PMAXUB128,
20556   IX86_BUILTIN_PMINSW128,
20557   IX86_BUILTIN_PMINUB128,
20558
20559   IX86_BUILTIN_PMULUDQ,
20560   IX86_BUILTIN_PMULUDQ128,
20561   IX86_BUILTIN_PMULHUW128,
20562   IX86_BUILTIN_PMULHW128,
20563   IX86_BUILTIN_PMULLW128,
20564
20565   IX86_BUILTIN_PSADBW128,
20566   IX86_BUILTIN_PSHUFHW,
20567   IX86_BUILTIN_PSHUFLW,
20568   IX86_BUILTIN_PSHUFD,
20569
20570   IX86_BUILTIN_PSLLDQI128,
20571   IX86_BUILTIN_PSLLWI128,
20572   IX86_BUILTIN_PSLLDI128,
20573   IX86_BUILTIN_PSLLQI128,
20574   IX86_BUILTIN_PSRAWI128,
20575   IX86_BUILTIN_PSRADI128,
20576   IX86_BUILTIN_PSRLDQI128,
20577   IX86_BUILTIN_PSRLWI128,
20578   IX86_BUILTIN_PSRLDI128,
20579   IX86_BUILTIN_PSRLQI128,
20580
20581   IX86_BUILTIN_PSLLDQ128,
20582   IX86_BUILTIN_PSLLW128,
20583   IX86_BUILTIN_PSLLD128,
20584   IX86_BUILTIN_PSLLQ128,
20585   IX86_BUILTIN_PSRAW128,
20586   IX86_BUILTIN_PSRAD128,
20587   IX86_BUILTIN_PSRLW128,
20588   IX86_BUILTIN_PSRLD128,
20589   IX86_BUILTIN_PSRLQ128,
20590
20591   IX86_BUILTIN_PUNPCKHBW128,
20592   IX86_BUILTIN_PUNPCKHWD128,
20593   IX86_BUILTIN_PUNPCKHDQ128,
20594   IX86_BUILTIN_PUNPCKHQDQ128,
20595   IX86_BUILTIN_PUNPCKLBW128,
20596   IX86_BUILTIN_PUNPCKLWD128,
20597   IX86_BUILTIN_PUNPCKLDQ128,
20598   IX86_BUILTIN_PUNPCKLQDQ128,
20599
20600   IX86_BUILTIN_CLFLUSH,
20601   IX86_BUILTIN_MFENCE,
20602   IX86_BUILTIN_LFENCE,
20603
20604   IX86_BUILTIN_BSRSI,
20605   IX86_BUILTIN_BSRDI,
20606   IX86_BUILTIN_RDPMC,
20607   IX86_BUILTIN_RDTSC,
20608   IX86_BUILTIN_RDTSCP,
20609   IX86_BUILTIN_ROLQI,
20610   IX86_BUILTIN_ROLHI,
20611   IX86_BUILTIN_RORQI,
20612   IX86_BUILTIN_RORHI,
20613
20614   /* SSE3.  */
20615   IX86_BUILTIN_ADDSUBPS,
20616   IX86_BUILTIN_HADDPS,
20617   IX86_BUILTIN_HSUBPS,
20618   IX86_BUILTIN_MOVSHDUP,
20619   IX86_BUILTIN_MOVSLDUP,
20620   IX86_BUILTIN_ADDSUBPD,
20621   IX86_BUILTIN_HADDPD,
20622   IX86_BUILTIN_HSUBPD,
20623   IX86_BUILTIN_LDDQU,
20624
20625   IX86_BUILTIN_MONITOR,
20626   IX86_BUILTIN_MWAIT,
20627
20628   /* SSSE3.  */
20629   IX86_BUILTIN_PHADDW,
20630   IX86_BUILTIN_PHADDD,
20631   IX86_BUILTIN_PHADDSW,
20632   IX86_BUILTIN_PHSUBW,
20633   IX86_BUILTIN_PHSUBD,
20634   IX86_BUILTIN_PHSUBSW,
20635   IX86_BUILTIN_PMADDUBSW,
20636   IX86_BUILTIN_PMULHRSW,
20637   IX86_BUILTIN_PSHUFB,
20638   IX86_BUILTIN_PSIGNB,
20639   IX86_BUILTIN_PSIGNW,
20640   IX86_BUILTIN_PSIGND,
20641   IX86_BUILTIN_PALIGNR,
20642   IX86_BUILTIN_PABSB,
20643   IX86_BUILTIN_PABSW,
20644   IX86_BUILTIN_PABSD,
20645
20646   IX86_BUILTIN_PHADDW128,
20647   IX86_BUILTIN_PHADDD128,
20648   IX86_BUILTIN_PHADDSW128,
20649   IX86_BUILTIN_PHSUBW128,
20650   IX86_BUILTIN_PHSUBD128,
20651   IX86_BUILTIN_PHSUBSW128,
20652   IX86_BUILTIN_PMADDUBSW128,
20653   IX86_BUILTIN_PMULHRSW128,
20654   IX86_BUILTIN_PSHUFB128,
20655   IX86_BUILTIN_PSIGNB128,
20656   IX86_BUILTIN_PSIGNW128,
20657   IX86_BUILTIN_PSIGND128,
20658   IX86_BUILTIN_PALIGNR128,
20659   IX86_BUILTIN_PABSB128,
20660   IX86_BUILTIN_PABSW128,
20661   IX86_BUILTIN_PABSD128,
20662
20663   /* AMDFAM10 - SSE4A New Instructions.  */
20664   IX86_BUILTIN_MOVNTSD,
20665   IX86_BUILTIN_MOVNTSS,
20666   IX86_BUILTIN_EXTRQI,
20667   IX86_BUILTIN_EXTRQ,
20668   IX86_BUILTIN_INSERTQI,
20669   IX86_BUILTIN_INSERTQ,
20670
20671   /* SSE4.1.  */
20672   IX86_BUILTIN_BLENDPD,
20673   IX86_BUILTIN_BLENDPS,
20674   IX86_BUILTIN_BLENDVPD,
20675   IX86_BUILTIN_BLENDVPS,
20676   IX86_BUILTIN_PBLENDVB128,
20677   IX86_BUILTIN_PBLENDW128,
20678
20679   IX86_BUILTIN_DPPD,
20680   IX86_BUILTIN_DPPS,
20681
20682   IX86_BUILTIN_INSERTPS128,
20683
20684   IX86_BUILTIN_MOVNTDQA,
20685   IX86_BUILTIN_MPSADBW128,
20686   IX86_BUILTIN_PACKUSDW128,
20687   IX86_BUILTIN_PCMPEQQ,
20688   IX86_BUILTIN_PHMINPOSUW128,
20689
20690   IX86_BUILTIN_PMAXSB128,
20691   IX86_BUILTIN_PMAXSD128,
20692   IX86_BUILTIN_PMAXUD128,
20693   IX86_BUILTIN_PMAXUW128,
20694
20695   IX86_BUILTIN_PMINSB128,
20696   IX86_BUILTIN_PMINSD128,
20697   IX86_BUILTIN_PMINUD128,
20698   IX86_BUILTIN_PMINUW128,
20699
20700   IX86_BUILTIN_PMOVSXBW128,
20701   IX86_BUILTIN_PMOVSXBD128,
20702   IX86_BUILTIN_PMOVSXBQ128,
20703   IX86_BUILTIN_PMOVSXWD128,
20704   IX86_BUILTIN_PMOVSXWQ128,
20705   IX86_BUILTIN_PMOVSXDQ128,
20706
20707   IX86_BUILTIN_PMOVZXBW128,
20708   IX86_BUILTIN_PMOVZXBD128,
20709   IX86_BUILTIN_PMOVZXBQ128,
20710   IX86_BUILTIN_PMOVZXWD128,
20711   IX86_BUILTIN_PMOVZXWQ128,
20712   IX86_BUILTIN_PMOVZXDQ128,
20713
20714   IX86_BUILTIN_PMULDQ128,
20715   IX86_BUILTIN_PMULLD128,
20716
20717   IX86_BUILTIN_ROUNDPD,
20718   IX86_BUILTIN_ROUNDPS,
20719   IX86_BUILTIN_ROUNDSD,
20720   IX86_BUILTIN_ROUNDSS,
20721
20722   IX86_BUILTIN_PTESTZ,
20723   IX86_BUILTIN_PTESTC,
20724   IX86_BUILTIN_PTESTNZC,
20725
20726   IX86_BUILTIN_VEC_INIT_V2SI,
20727   IX86_BUILTIN_VEC_INIT_V4HI,
20728   IX86_BUILTIN_VEC_INIT_V8QI,
20729   IX86_BUILTIN_VEC_EXT_V2DF,
20730   IX86_BUILTIN_VEC_EXT_V2DI,
20731   IX86_BUILTIN_VEC_EXT_V4SF,
20732   IX86_BUILTIN_VEC_EXT_V4SI,
20733   IX86_BUILTIN_VEC_EXT_V8HI,
20734   IX86_BUILTIN_VEC_EXT_V2SI,
20735   IX86_BUILTIN_VEC_EXT_V4HI,
20736   IX86_BUILTIN_VEC_EXT_V16QI,
20737   IX86_BUILTIN_VEC_SET_V2DI,
20738   IX86_BUILTIN_VEC_SET_V4SF,
20739   IX86_BUILTIN_VEC_SET_V4SI,
20740   IX86_BUILTIN_VEC_SET_V8HI,
20741   IX86_BUILTIN_VEC_SET_V4HI,
20742   IX86_BUILTIN_VEC_SET_V16QI,
20743
20744   IX86_BUILTIN_VEC_PACK_SFIX,
20745
20746   /* SSE4.2.  */
20747   IX86_BUILTIN_CRC32QI,
20748   IX86_BUILTIN_CRC32HI,
20749   IX86_BUILTIN_CRC32SI,
20750   IX86_BUILTIN_CRC32DI,
20751
20752   IX86_BUILTIN_PCMPESTRI128,
20753   IX86_BUILTIN_PCMPESTRM128,
20754   IX86_BUILTIN_PCMPESTRA128,
20755   IX86_BUILTIN_PCMPESTRC128,
20756   IX86_BUILTIN_PCMPESTRO128,
20757   IX86_BUILTIN_PCMPESTRS128,
20758   IX86_BUILTIN_PCMPESTRZ128,
20759   IX86_BUILTIN_PCMPISTRI128,
20760   IX86_BUILTIN_PCMPISTRM128,
20761   IX86_BUILTIN_PCMPISTRA128,
20762   IX86_BUILTIN_PCMPISTRC128,
20763   IX86_BUILTIN_PCMPISTRO128,
20764   IX86_BUILTIN_PCMPISTRS128,
20765   IX86_BUILTIN_PCMPISTRZ128,
20766
20767   IX86_BUILTIN_PCMPGTQ,
20768
20769   /* AES instructions */
20770   IX86_BUILTIN_AESENC128,
20771   IX86_BUILTIN_AESENCLAST128,
20772   IX86_BUILTIN_AESDEC128,
20773   IX86_BUILTIN_AESDECLAST128,
20774   IX86_BUILTIN_AESIMC128,
20775   IX86_BUILTIN_AESKEYGENASSIST128,
20776
20777   /* PCLMUL instruction */
20778   IX86_BUILTIN_PCLMULQDQ128,
20779
20780   /* AVX */
20781   IX86_BUILTIN_ADDPD256,
20782   IX86_BUILTIN_ADDPS256,
20783   IX86_BUILTIN_ADDSUBPD256,
20784   IX86_BUILTIN_ADDSUBPS256,
20785   IX86_BUILTIN_ANDPD256,
20786   IX86_BUILTIN_ANDPS256,
20787   IX86_BUILTIN_ANDNPD256,
20788   IX86_BUILTIN_ANDNPS256,
20789   IX86_BUILTIN_BLENDPD256,
20790   IX86_BUILTIN_BLENDPS256,
20791   IX86_BUILTIN_BLENDVPD256,
20792   IX86_BUILTIN_BLENDVPS256,
20793   IX86_BUILTIN_DIVPD256,
20794   IX86_BUILTIN_DIVPS256,
20795   IX86_BUILTIN_DPPS256,
20796   IX86_BUILTIN_HADDPD256,
20797   IX86_BUILTIN_HADDPS256,
20798   IX86_BUILTIN_HSUBPD256,
20799   IX86_BUILTIN_HSUBPS256,
20800   IX86_BUILTIN_MAXPD256,
20801   IX86_BUILTIN_MAXPS256,
20802   IX86_BUILTIN_MINPD256,
20803   IX86_BUILTIN_MINPS256,
20804   IX86_BUILTIN_MULPD256,
20805   IX86_BUILTIN_MULPS256,
20806   IX86_BUILTIN_ORPD256,
20807   IX86_BUILTIN_ORPS256,
20808   IX86_BUILTIN_SHUFPD256,
20809   IX86_BUILTIN_SHUFPS256,
20810   IX86_BUILTIN_SUBPD256,
20811   IX86_BUILTIN_SUBPS256,
20812   IX86_BUILTIN_XORPD256,
20813   IX86_BUILTIN_XORPS256,
20814   IX86_BUILTIN_CMPSD,
20815   IX86_BUILTIN_CMPSS,
20816   IX86_BUILTIN_CMPPD,
20817   IX86_BUILTIN_CMPPS,
20818   IX86_BUILTIN_CMPPD256,
20819   IX86_BUILTIN_CMPPS256,
20820   IX86_BUILTIN_CVTDQ2PD256,
20821   IX86_BUILTIN_CVTDQ2PS256,
20822   IX86_BUILTIN_CVTPD2PS256,
20823   IX86_BUILTIN_CVTPS2DQ256,
20824   IX86_BUILTIN_CVTPS2PD256,
20825   IX86_BUILTIN_CVTTPD2DQ256,
20826   IX86_BUILTIN_CVTPD2DQ256,
20827   IX86_BUILTIN_CVTTPS2DQ256,
20828   IX86_BUILTIN_EXTRACTF128PD256,
20829   IX86_BUILTIN_EXTRACTF128PS256,
20830   IX86_BUILTIN_EXTRACTF128SI256,
20831   IX86_BUILTIN_VZEROALL,
20832   IX86_BUILTIN_VZEROUPPER,
20833   IX86_BUILTIN_VZEROUPPER_REX64,
20834   IX86_BUILTIN_VPERMILVARPD,
20835   IX86_BUILTIN_VPERMILVARPS,
20836   IX86_BUILTIN_VPERMILVARPD256,
20837   IX86_BUILTIN_VPERMILVARPS256,
20838   IX86_BUILTIN_VPERMILPD,
20839   IX86_BUILTIN_VPERMILPS,
20840   IX86_BUILTIN_VPERMILPD256,
20841   IX86_BUILTIN_VPERMILPS256,
20842   IX86_BUILTIN_VPERM2F128PD256,
20843   IX86_BUILTIN_VPERM2F128PS256,
20844   IX86_BUILTIN_VPERM2F128SI256,
20845   IX86_BUILTIN_VBROADCASTSS,
20846   IX86_BUILTIN_VBROADCASTSD256,
20847   IX86_BUILTIN_VBROADCASTSS256,
20848   IX86_BUILTIN_VBROADCASTPD256,
20849   IX86_BUILTIN_VBROADCASTPS256,
20850   IX86_BUILTIN_VINSERTF128PD256,
20851   IX86_BUILTIN_VINSERTF128PS256,
20852   IX86_BUILTIN_VINSERTF128SI256,
20853   IX86_BUILTIN_LOADUPD256,
20854   IX86_BUILTIN_LOADUPS256,
20855   IX86_BUILTIN_STOREUPD256,
20856   IX86_BUILTIN_STOREUPS256,
20857   IX86_BUILTIN_LDDQU256,
20858   IX86_BUILTIN_MOVNTDQ256,
20859   IX86_BUILTIN_MOVNTPD256,
20860   IX86_BUILTIN_MOVNTPS256,
20861   IX86_BUILTIN_LOADDQU256,
20862   IX86_BUILTIN_STOREDQU256,
20863   IX86_BUILTIN_MASKLOADPD,
20864   IX86_BUILTIN_MASKLOADPS,
20865   IX86_BUILTIN_MASKSTOREPD,
20866   IX86_BUILTIN_MASKSTOREPS,
20867   IX86_BUILTIN_MASKLOADPD256,
20868   IX86_BUILTIN_MASKLOADPS256,
20869   IX86_BUILTIN_MASKSTOREPD256,
20870   IX86_BUILTIN_MASKSTOREPS256,
20871   IX86_BUILTIN_MOVSHDUP256,
20872   IX86_BUILTIN_MOVSLDUP256,
20873   IX86_BUILTIN_MOVDDUP256,
20874
20875   IX86_BUILTIN_SQRTPD256,
20876   IX86_BUILTIN_SQRTPS256,
20877   IX86_BUILTIN_SQRTPS_NR256,
20878   IX86_BUILTIN_RSQRTPS256,
20879   IX86_BUILTIN_RSQRTPS_NR256,
20880
20881   IX86_BUILTIN_RCPPS256,
20882
20883   IX86_BUILTIN_ROUNDPD256,
20884   IX86_BUILTIN_ROUNDPS256,
20885
20886   IX86_BUILTIN_UNPCKHPD256,
20887   IX86_BUILTIN_UNPCKLPD256,
20888   IX86_BUILTIN_UNPCKHPS256,
20889   IX86_BUILTIN_UNPCKLPS256,
20890
20891   IX86_BUILTIN_SI256_SI,
20892   IX86_BUILTIN_PS256_PS,
20893   IX86_BUILTIN_PD256_PD,
20894   IX86_BUILTIN_SI_SI256,
20895   IX86_BUILTIN_PS_PS256,
20896   IX86_BUILTIN_PD_PD256,
20897
20898   IX86_BUILTIN_VTESTZPD,
20899   IX86_BUILTIN_VTESTCPD,
20900   IX86_BUILTIN_VTESTNZCPD,
20901   IX86_BUILTIN_VTESTZPS,
20902   IX86_BUILTIN_VTESTCPS,
20903   IX86_BUILTIN_VTESTNZCPS,
20904   IX86_BUILTIN_VTESTZPD256,
20905   IX86_BUILTIN_VTESTCPD256,
20906   IX86_BUILTIN_VTESTNZCPD256,
20907   IX86_BUILTIN_VTESTZPS256,
20908   IX86_BUILTIN_VTESTCPS256,
20909   IX86_BUILTIN_VTESTNZCPS256,
20910   IX86_BUILTIN_PTESTZ256,
20911   IX86_BUILTIN_PTESTC256,
20912   IX86_BUILTIN_PTESTNZC256,
20913
20914   IX86_BUILTIN_MOVMSKPD256,
20915   IX86_BUILTIN_MOVMSKPS256,
20916
20917   /* TFmode support builtins.  */
20918   IX86_BUILTIN_INFQ,
20919   IX86_BUILTIN_HUGE_VALQ,
20920   IX86_BUILTIN_FABSQ,
20921   IX86_BUILTIN_COPYSIGNQ,
20922
20923   /* Vectorizer support builtins.  */
20924   IX86_BUILTIN_CPYSGNPS,
20925   IX86_BUILTIN_CPYSGNPD,
20926
20927   IX86_BUILTIN_CVTUDQ2PS,
20928
20929   /* FMA4 and XOP instructions.  */
20930   IX86_BUILTIN_VFMADDSS,
20931   IX86_BUILTIN_VFMADDSD,
20932   IX86_BUILTIN_VFMADDPS,
20933   IX86_BUILTIN_VFMADDPD,
20934   IX86_BUILTIN_VFMSUBSS,
20935   IX86_BUILTIN_VFMSUBSD,
20936   IX86_BUILTIN_VFMSUBPS,
20937   IX86_BUILTIN_VFMSUBPD,
20938   IX86_BUILTIN_VFMADDSUBPS,
20939   IX86_BUILTIN_VFMADDSUBPD,
20940   IX86_BUILTIN_VFMSUBADDPS,
20941   IX86_BUILTIN_VFMSUBADDPD,
20942   IX86_BUILTIN_VFNMADDSS,
20943   IX86_BUILTIN_VFNMADDSD,
20944   IX86_BUILTIN_VFNMADDPS,
20945   IX86_BUILTIN_VFNMADDPD,
20946   IX86_BUILTIN_VFNMSUBSS,
20947   IX86_BUILTIN_VFNMSUBSD,
20948   IX86_BUILTIN_VFNMSUBPS,
20949   IX86_BUILTIN_VFNMSUBPD,
20950   IX86_BUILTIN_VFMADDPS256,
20951   IX86_BUILTIN_VFMADDPD256,
20952   IX86_BUILTIN_VFMSUBPS256,
20953   IX86_BUILTIN_VFMSUBPD256,
20954   IX86_BUILTIN_VFMADDSUBPS256,
20955   IX86_BUILTIN_VFMADDSUBPD256,
20956   IX86_BUILTIN_VFMSUBADDPS256,
20957   IX86_BUILTIN_VFMSUBADDPD256,
20958   IX86_BUILTIN_VFNMADDPS256,
20959   IX86_BUILTIN_VFNMADDPD256,
20960   IX86_BUILTIN_VFNMSUBPS256,
20961   IX86_BUILTIN_VFNMSUBPD256,
20962
20963   IX86_BUILTIN_VPCMOV,
20964   IX86_BUILTIN_VPCMOV_V2DI,
20965   IX86_BUILTIN_VPCMOV_V4SI,
20966   IX86_BUILTIN_VPCMOV_V8HI,
20967   IX86_BUILTIN_VPCMOV_V16QI,
20968   IX86_BUILTIN_VPCMOV_V4SF,
20969   IX86_BUILTIN_VPCMOV_V2DF,
20970   IX86_BUILTIN_VPCMOV256,
20971   IX86_BUILTIN_VPCMOV_V4DI256,
20972   IX86_BUILTIN_VPCMOV_V8SI256,
20973   IX86_BUILTIN_VPCMOV_V16HI256,
20974   IX86_BUILTIN_VPCMOV_V32QI256,
20975   IX86_BUILTIN_VPCMOV_V8SF256,
20976   IX86_BUILTIN_VPCMOV_V4DF256,
20977
20978   IX86_BUILTIN_VPPERM,
20979
20980   IX86_BUILTIN_VPMACSSWW,
20981   IX86_BUILTIN_VPMACSWW,
20982   IX86_BUILTIN_VPMACSSWD,
20983   IX86_BUILTIN_VPMACSWD,
20984   IX86_BUILTIN_VPMACSSDD,
20985   IX86_BUILTIN_VPMACSDD,
20986   IX86_BUILTIN_VPMACSSDQL,
20987   IX86_BUILTIN_VPMACSSDQH,
20988   IX86_BUILTIN_VPMACSDQL,
20989   IX86_BUILTIN_VPMACSDQH,
20990   IX86_BUILTIN_VPMADCSSWD,
20991   IX86_BUILTIN_VPMADCSWD,
20992
20993   IX86_BUILTIN_VPHADDBW,
20994   IX86_BUILTIN_VPHADDBD,
20995   IX86_BUILTIN_VPHADDBQ,
20996   IX86_BUILTIN_VPHADDWD,
20997   IX86_BUILTIN_VPHADDWQ,
20998   IX86_BUILTIN_VPHADDDQ,
20999   IX86_BUILTIN_VPHADDUBW,
21000   IX86_BUILTIN_VPHADDUBD,
21001   IX86_BUILTIN_VPHADDUBQ,
21002   IX86_BUILTIN_VPHADDUWD,
21003   IX86_BUILTIN_VPHADDUWQ,
21004   IX86_BUILTIN_VPHADDUDQ,
21005   IX86_BUILTIN_VPHSUBBW,
21006   IX86_BUILTIN_VPHSUBWD,
21007   IX86_BUILTIN_VPHSUBDQ,
21008
21009   IX86_BUILTIN_VPROTB,
21010   IX86_BUILTIN_VPROTW,
21011   IX86_BUILTIN_VPROTD,
21012   IX86_BUILTIN_VPROTQ,
21013   IX86_BUILTIN_VPROTB_IMM,
21014   IX86_BUILTIN_VPROTW_IMM,
21015   IX86_BUILTIN_VPROTD_IMM,
21016   IX86_BUILTIN_VPROTQ_IMM,
21017
21018   IX86_BUILTIN_VPSHLB,
21019   IX86_BUILTIN_VPSHLW,
21020   IX86_BUILTIN_VPSHLD,
21021   IX86_BUILTIN_VPSHLQ,
21022   IX86_BUILTIN_VPSHAB,
21023   IX86_BUILTIN_VPSHAW,
21024   IX86_BUILTIN_VPSHAD,
21025   IX86_BUILTIN_VPSHAQ,
21026
21027   IX86_BUILTIN_VFRCZSS,
21028   IX86_BUILTIN_VFRCZSD,
21029   IX86_BUILTIN_VFRCZPS,
21030   IX86_BUILTIN_VFRCZPD,
21031   IX86_BUILTIN_VFRCZPS256,
21032   IX86_BUILTIN_VFRCZPD256,
21033
21034   IX86_BUILTIN_VPCOMEQUB,
21035   IX86_BUILTIN_VPCOMNEUB,
21036   IX86_BUILTIN_VPCOMLTUB,
21037   IX86_BUILTIN_VPCOMLEUB,
21038   IX86_BUILTIN_VPCOMGTUB,
21039   IX86_BUILTIN_VPCOMGEUB,
21040   IX86_BUILTIN_VPCOMFALSEUB,
21041   IX86_BUILTIN_VPCOMTRUEUB,
21042
21043   IX86_BUILTIN_VPCOMEQUW,
21044   IX86_BUILTIN_VPCOMNEUW,
21045   IX86_BUILTIN_VPCOMLTUW,
21046   IX86_BUILTIN_VPCOMLEUW,
21047   IX86_BUILTIN_VPCOMGTUW,
21048   IX86_BUILTIN_VPCOMGEUW,
21049   IX86_BUILTIN_VPCOMFALSEUW,
21050   IX86_BUILTIN_VPCOMTRUEUW,
21051
21052   IX86_BUILTIN_VPCOMEQUD,
21053   IX86_BUILTIN_VPCOMNEUD,
21054   IX86_BUILTIN_VPCOMLTUD,
21055   IX86_BUILTIN_VPCOMLEUD,
21056   IX86_BUILTIN_VPCOMGTUD,
21057   IX86_BUILTIN_VPCOMGEUD,
21058   IX86_BUILTIN_VPCOMFALSEUD,
21059   IX86_BUILTIN_VPCOMTRUEUD,
21060
21061   IX86_BUILTIN_VPCOMEQUQ,
21062   IX86_BUILTIN_VPCOMNEUQ,
21063   IX86_BUILTIN_VPCOMLTUQ,
21064   IX86_BUILTIN_VPCOMLEUQ,
21065   IX86_BUILTIN_VPCOMGTUQ,
21066   IX86_BUILTIN_VPCOMGEUQ,
21067   IX86_BUILTIN_VPCOMFALSEUQ,
21068   IX86_BUILTIN_VPCOMTRUEUQ,
21069
21070   IX86_BUILTIN_VPCOMEQB,
21071   IX86_BUILTIN_VPCOMNEB,
21072   IX86_BUILTIN_VPCOMLTB,
21073   IX86_BUILTIN_VPCOMLEB,
21074   IX86_BUILTIN_VPCOMGTB,
21075   IX86_BUILTIN_VPCOMGEB,
21076   IX86_BUILTIN_VPCOMFALSEB,
21077   IX86_BUILTIN_VPCOMTRUEB,
21078
21079   IX86_BUILTIN_VPCOMEQW,
21080   IX86_BUILTIN_VPCOMNEW,
21081   IX86_BUILTIN_VPCOMLTW,
21082   IX86_BUILTIN_VPCOMLEW,
21083   IX86_BUILTIN_VPCOMGTW,
21084   IX86_BUILTIN_VPCOMGEW,
21085   IX86_BUILTIN_VPCOMFALSEW,
21086   IX86_BUILTIN_VPCOMTRUEW,
21087
21088   IX86_BUILTIN_VPCOMEQD,
21089   IX86_BUILTIN_VPCOMNED,
21090   IX86_BUILTIN_VPCOMLTD,
21091   IX86_BUILTIN_VPCOMLED,
21092   IX86_BUILTIN_VPCOMGTD,
21093   IX86_BUILTIN_VPCOMGED,
21094   IX86_BUILTIN_VPCOMFALSED,
21095   IX86_BUILTIN_VPCOMTRUED,
21096
21097   IX86_BUILTIN_VPCOMEQQ,
21098   IX86_BUILTIN_VPCOMNEQ,
21099   IX86_BUILTIN_VPCOMLTQ,
21100   IX86_BUILTIN_VPCOMLEQ,
21101   IX86_BUILTIN_VPCOMGTQ,
21102   IX86_BUILTIN_VPCOMGEQ,
21103   IX86_BUILTIN_VPCOMFALSEQ,
21104   IX86_BUILTIN_VPCOMTRUEQ,
21105
21106   /* LWP instructions.  */
21107   IX86_BUILTIN_LLWPCB16,
21108   IX86_BUILTIN_LLWPCB32,
21109   IX86_BUILTIN_LLWPCB64,
21110   IX86_BUILTIN_SLWPCB16,
21111   IX86_BUILTIN_SLWPCB32,
21112   IX86_BUILTIN_SLWPCB64,
21113   IX86_BUILTIN_LWPVAL16,
21114   IX86_BUILTIN_LWPVAL32,
21115   IX86_BUILTIN_LWPVAL64,
21116   IX86_BUILTIN_LWPINS16,
21117   IX86_BUILTIN_LWPINS32,
21118   IX86_BUILTIN_LWPINS64,
21119
21120   IX86_BUILTIN_MAX
21121 };
21122
21123 /* Table for the ix86 builtin decls.  */
21124 static GTY(()) tree ix86_builtins[(int) IX86_BUILTIN_MAX];
21125
21126 /* Table of all of the builtin functions that are possible with different ISA's
21127    but are waiting to be built until a function is declared to use that
21128    ISA.  */
21129 struct GTY(()) builtin_isa {
21130   tree type;                    /* builtin type to use in the declaration */
21131   const char *name;             /* function name */
21132   int isa;                      /* isa_flags this builtin is defined for */
21133   bool const_p;                 /* true if the declaration is constant */
21134 };
21135
21136 static GTY(()) struct builtin_isa ix86_builtins_isa[(int) IX86_BUILTIN_MAX];
21137
21138
21139 /* Add an ix86 target builtin function with CODE, NAME and TYPE.  Save the MASK
21140  * of which isa_flags to use in the ix86_builtins_isa array.  Stores the
21141  * function decl in the ix86_builtins array.  Returns the function decl or
21142  * NULL_TREE, if the builtin was not added.
21143  *
21144  * If the front end has a special hook for builtin functions, delay adding
21145  * builtin functions that aren't in the current ISA until the ISA is changed
21146  * with function specific optimization.  Doing so, can save about 300K for the
21147  * default compiler.  When the builtin is expanded, check at that time whether
21148  * it is valid.
21149  *
21150  * If the front end doesn't have a special hook, record all builtins, even if
21151  * it isn't an instruction set in the current ISA in case the user uses
21152  * function specific options for a different ISA, so that we don't get scope
21153  * errors if a builtin is added in the middle of a function scope.  */
21154
21155 static inline tree
21156 def_builtin (int mask, const char *name, tree type, enum ix86_builtins code)
21157 {
21158   tree decl = NULL_TREE;
21159
21160   if (!(mask & OPTION_MASK_ISA_64BIT) || TARGET_64BIT)
21161     {
21162       ix86_builtins_isa[(int) code].isa = mask;
21163
21164       if ((mask & ix86_isa_flags) != 0
21165           || (lang_hooks.builtin_function
21166               == lang_hooks.builtin_function_ext_scope))
21167
21168         {
21169           decl = add_builtin_function (name, type, code, BUILT_IN_MD, NULL,
21170                                        NULL_TREE);
21171           ix86_builtins[(int) code] = decl;
21172           ix86_builtins_isa[(int) code].type = NULL_TREE;
21173         }
21174       else
21175         {
21176           ix86_builtins[(int) code] = NULL_TREE;
21177           ix86_builtins_isa[(int) code].const_p = false;
21178           ix86_builtins_isa[(int) code].type = type;
21179           ix86_builtins_isa[(int) code].name = name;
21180         }
21181     }
21182
21183   return decl;
21184 }
21185
21186 /* Like def_builtin, but also marks the function decl "const".  */
21187
21188 static inline tree
21189 def_builtin_const (int mask, const char *name, tree type,
21190                    enum ix86_builtins code)
21191 {
21192   tree decl = def_builtin (mask, name, type, code);
21193   if (decl)
21194     TREE_READONLY (decl) = 1;
21195   else
21196     ix86_builtins_isa[(int) code].const_p = true;
21197
21198   return decl;
21199 }
21200
21201 /* Add any new builtin functions for a given ISA that may not have been
21202    declared.  This saves a bit of space compared to adding all of the
21203    declarations to the tree, even if we didn't use them.  */
21204
21205 static void
21206 ix86_add_new_builtins (int isa)
21207 {
21208   int i;
21209   tree decl;
21210
21211   for (i = 0; i < (int)IX86_BUILTIN_MAX; i++)
21212     {
21213       if ((ix86_builtins_isa[i].isa & isa) != 0
21214           && ix86_builtins_isa[i].type != NULL_TREE)
21215         {
21216           decl = add_builtin_function_ext_scope (ix86_builtins_isa[i].name,
21217                                                  ix86_builtins_isa[i].type,
21218                                                  i, BUILT_IN_MD, NULL,
21219                                                  NULL_TREE);
21220
21221           ix86_builtins[i] = decl;
21222           ix86_builtins_isa[i].type = NULL_TREE;
21223           if (ix86_builtins_isa[i].const_p)
21224             TREE_READONLY (decl) = 1;
21225         }
21226     }
21227 }
21228
21229 /* Bits for builtin_description.flag.  */
21230
21231 /* Set when we don't support the comparison natively, and should
21232    swap_comparison in order to support it.  */
21233 #define BUILTIN_DESC_SWAP_OPERANDS      1
21234
21235 struct builtin_description
21236 {
21237   const unsigned int mask;
21238   const enum insn_code icode;
21239   const char *const name;
21240   const enum ix86_builtins code;
21241   const enum rtx_code comparison;
21242   const int flag;
21243 };
21244
21245 static const struct builtin_description bdesc_comi[] =
21246 {
21247   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comieq", IX86_BUILTIN_COMIEQSS, UNEQ, 0 },
21248   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comilt", IX86_BUILTIN_COMILTSS, UNLT, 0 },
21249   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comile", IX86_BUILTIN_COMILESS, UNLE, 0 },
21250   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comigt", IX86_BUILTIN_COMIGTSS, GT, 0 },
21251   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comige", IX86_BUILTIN_COMIGESS, GE, 0 },
21252   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comineq", IX86_BUILTIN_COMINEQSS, LTGT, 0 },
21253   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomieq", IX86_BUILTIN_UCOMIEQSS, UNEQ, 0 },
21254   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomilt", IX86_BUILTIN_UCOMILTSS, UNLT, 0 },
21255   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomile", IX86_BUILTIN_UCOMILESS, UNLE, 0 },
21256   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomigt", IX86_BUILTIN_UCOMIGTSS, GT, 0 },
21257   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomige", IX86_BUILTIN_UCOMIGESS, GE, 0 },
21258   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomineq", IX86_BUILTIN_UCOMINEQSS, LTGT, 0 },
21259   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdeq", IX86_BUILTIN_COMIEQSD, UNEQ, 0 },
21260   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdlt", IX86_BUILTIN_COMILTSD, UNLT, 0 },
21261   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdle", IX86_BUILTIN_COMILESD, UNLE, 0 },
21262   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdgt", IX86_BUILTIN_COMIGTSD, GT, 0 },
21263   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdge", IX86_BUILTIN_COMIGESD, GE, 0 },
21264   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdneq", IX86_BUILTIN_COMINEQSD, LTGT, 0 },
21265   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdeq", IX86_BUILTIN_UCOMIEQSD, UNEQ, 0 },
21266   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdlt", IX86_BUILTIN_UCOMILTSD, UNLT, 0 },
21267   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdle", IX86_BUILTIN_UCOMILESD, UNLE, 0 },
21268   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdgt", IX86_BUILTIN_UCOMIGTSD, GT, 0 },
21269   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdge", IX86_BUILTIN_UCOMIGESD, GE, 0 },
21270   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdneq", IX86_BUILTIN_UCOMINEQSD, LTGT, 0 },
21271 };
21272
21273 static const struct builtin_description bdesc_pcmpestr[] =
21274 {
21275   /* SSE4.2 */
21276   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestri128", IX86_BUILTIN_PCMPESTRI128, UNKNOWN, 0 },
21277   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestrm128", IX86_BUILTIN_PCMPESTRM128, UNKNOWN, 0 },
21278   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestria128", IX86_BUILTIN_PCMPESTRA128, UNKNOWN, (int) CCAmode },
21279   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestric128", IX86_BUILTIN_PCMPESTRC128, UNKNOWN, (int) CCCmode },
21280   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestrio128", IX86_BUILTIN_PCMPESTRO128, UNKNOWN, (int) CCOmode },
21281   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestris128", IX86_BUILTIN_PCMPESTRS128, UNKNOWN, (int) CCSmode },
21282   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestriz128", IX86_BUILTIN_PCMPESTRZ128, UNKNOWN, (int) CCZmode },
21283 };
21284
21285 static const struct builtin_description bdesc_pcmpistr[] =
21286 {
21287   /* SSE4.2 */
21288   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistri128", IX86_BUILTIN_PCMPISTRI128, UNKNOWN, 0 },
21289   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistrm128", IX86_BUILTIN_PCMPISTRM128, UNKNOWN, 0 },
21290   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistria128", IX86_BUILTIN_PCMPISTRA128, UNKNOWN, (int) CCAmode },
21291   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistric128", IX86_BUILTIN_PCMPISTRC128, UNKNOWN, (int) CCCmode },
21292   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistrio128", IX86_BUILTIN_PCMPISTRO128, UNKNOWN, (int) CCOmode },
21293   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistris128", IX86_BUILTIN_PCMPISTRS128, UNKNOWN, (int) CCSmode },
21294   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistriz128", IX86_BUILTIN_PCMPISTRZ128, UNKNOWN, (int) CCZmode },
21295 };
21296
21297 /* Special builtin types */
21298 enum ix86_special_builtin_type
21299 {
21300   SPECIAL_FTYPE_UNKNOWN,
21301   VOID_FTYPE_VOID,
21302   UINT64_FTYPE_VOID,
21303   UINT64_FTYPE_PUNSIGNED,
21304   V32QI_FTYPE_PCCHAR,
21305   V16QI_FTYPE_PCCHAR,
21306   V8SF_FTYPE_PCV4SF,
21307   V8SF_FTYPE_PCFLOAT,
21308   V4DF_FTYPE_PCV2DF,
21309   V4DF_FTYPE_PCDOUBLE,
21310   V4SF_FTYPE_PCFLOAT,
21311   V2DF_FTYPE_PCDOUBLE,
21312   V8SF_FTYPE_PCV8SF_V8SF,
21313   V4DF_FTYPE_PCV4DF_V4DF,
21314   V4SF_FTYPE_V4SF_PCV2SF,
21315   V4SF_FTYPE_PCV4SF_V4SF,
21316   V2DF_FTYPE_V2DF_PCDOUBLE,
21317   V2DF_FTYPE_PCV2DF_V2DF,
21318   V2DI_FTYPE_PV2DI,
21319   VOID_FTYPE_PV2SF_V4SF,
21320   VOID_FTYPE_PV4DI_V4DI,
21321   VOID_FTYPE_PV2DI_V2DI,
21322   VOID_FTYPE_PCHAR_V32QI,
21323   VOID_FTYPE_PCHAR_V16QI,
21324   VOID_FTYPE_PFLOAT_V8SF,
21325   VOID_FTYPE_PFLOAT_V4SF,
21326   VOID_FTYPE_PDOUBLE_V4DF,
21327   VOID_FTYPE_PDOUBLE_V2DF,
21328   VOID_FTYPE_PDI_DI,
21329   VOID_FTYPE_PINT_INT,
21330   VOID_FTYPE_PV8SF_V8SF_V8SF,
21331   VOID_FTYPE_PV4DF_V4DF_V4DF,
21332   VOID_FTYPE_PV4SF_V4SF_V4SF,
21333   VOID_FTYPE_PV2DF_V2DF_V2DF,
21334   VOID_FTYPE_USHORT_UINT_USHORT,
21335   VOID_FTYPE_UINT_UINT_UINT,
21336   VOID_FTYPE_UINT64_UINT_UINT,
21337   UCHAR_FTYPE_USHORT_UINT_USHORT,
21338   UCHAR_FTYPE_UINT_UINT_UINT,
21339   UCHAR_FTYPE_UINT64_UINT_UINT
21340 };
21341
21342 /* Builtin types */
21343 enum ix86_builtin_type
21344 {
21345   FTYPE_UNKNOWN,
21346   FLOAT128_FTYPE_FLOAT128,
21347   FLOAT_FTYPE_FLOAT,
21348   FLOAT128_FTYPE_FLOAT128_FLOAT128,
21349   INT_FTYPE_V8SF_V8SF_PTEST,
21350   INT_FTYPE_V4DI_V4DI_PTEST,
21351   INT_FTYPE_V4DF_V4DF_PTEST,
21352   INT_FTYPE_V4SF_V4SF_PTEST,
21353   INT_FTYPE_V2DI_V2DI_PTEST,
21354   INT_FTYPE_V2DF_V2DF_PTEST,
21355   INT_FTYPE_INT,
21356   UINT64_FTYPE_INT,
21357   INT64_FTYPE_INT64,
21358   INT64_FTYPE_V4SF,
21359   INT64_FTYPE_V2DF,
21360   INT_FTYPE_V16QI,
21361   INT_FTYPE_V8QI,
21362   INT_FTYPE_V8SF,
21363   INT_FTYPE_V4DF,
21364   INT_FTYPE_V4SF,
21365   INT_FTYPE_V2DF,
21366   V16QI_FTYPE_V16QI,
21367   V8SI_FTYPE_V8SF,
21368   V8SI_FTYPE_V4SI,
21369   V8HI_FTYPE_V8HI,
21370   V8HI_FTYPE_V16QI,
21371   V8QI_FTYPE_V8QI,
21372   V8SF_FTYPE_V8SF,
21373   V8SF_FTYPE_V8SI,
21374   V8SF_FTYPE_V4SF,
21375   V4SI_FTYPE_V4SI,
21376   V4SI_FTYPE_V16QI,
21377   V4SI_FTYPE_V8SI,
21378   V4SI_FTYPE_V8HI,
21379   V4SI_FTYPE_V4DF,
21380   V4SI_FTYPE_V4SF,
21381   V4SI_FTYPE_V2DF,
21382   V4HI_FTYPE_V4HI,
21383   V4DF_FTYPE_V4DF,
21384   V4DF_FTYPE_V4SI,
21385   V4DF_FTYPE_V4SF,
21386   V4DF_FTYPE_V2DF,
21387   V4SF_FTYPE_V4DF,
21388   V4SF_FTYPE_V4SF,
21389   V4SF_FTYPE_V4SF_VEC_MERGE,
21390   V4SF_FTYPE_V8SF,
21391   V4SF_FTYPE_V4SI,
21392   V4SF_FTYPE_V2DF,
21393   V2DI_FTYPE_V2DI,
21394   V2DI_FTYPE_V16QI,
21395   V2DI_FTYPE_V8HI,
21396   V2DI_FTYPE_V4SI,
21397   V2DF_FTYPE_V2DF,
21398   V2DF_FTYPE_V2DF_VEC_MERGE,
21399   V2DF_FTYPE_V4SI,
21400   V2DF_FTYPE_V4DF,
21401   V2DF_FTYPE_V4SF,
21402   V2DF_FTYPE_V2SI,
21403   V2SI_FTYPE_V2SI,
21404   V2SI_FTYPE_V4SF,
21405   V2SI_FTYPE_V2SF,
21406   V2SI_FTYPE_V2DF,
21407   V2SF_FTYPE_V2SF,
21408   V2SF_FTYPE_V2SI,
21409   V16QI_FTYPE_V16QI_V16QI,
21410   V16QI_FTYPE_V8HI_V8HI,
21411   V8QI_FTYPE_V8QI_V8QI,
21412   V8QI_FTYPE_V4HI_V4HI,
21413   V8HI_FTYPE_V8HI_V8HI,
21414   V8HI_FTYPE_V8HI_V8HI_COUNT,
21415   V8HI_FTYPE_V16QI_V16QI,
21416   V8HI_FTYPE_V4SI_V4SI,
21417   V8HI_FTYPE_V8HI_SI_COUNT,
21418   V8SF_FTYPE_V8SF_V8SF,
21419   V8SF_FTYPE_V8SF_V8SI,
21420   V4SI_FTYPE_V4SI_V4SI,
21421   V4SI_FTYPE_V4SI_V4SI_COUNT,
21422   V4SI_FTYPE_V8HI_V8HI,
21423   V4SI_FTYPE_V4SF_V4SF,
21424   V4SI_FTYPE_V2DF_V2DF,
21425   V4SI_FTYPE_V4SI_SI_COUNT,
21426   V4HI_FTYPE_V4HI_V4HI,
21427   V4HI_FTYPE_V4HI_V4HI_COUNT,
21428   V4HI_FTYPE_V8QI_V8QI,
21429   V4HI_FTYPE_V2SI_V2SI,
21430   V4HI_FTYPE_V4HI_SI_COUNT,
21431   V4DF_FTYPE_V4DF_V4DF,
21432   V4DF_FTYPE_V4DF_V4DI,
21433   V4SF_FTYPE_V4SF_V4SF,
21434   V4SF_FTYPE_V4SF_V4SF_SWAP,
21435   V4SF_FTYPE_V4SF_V4SI,
21436   V4SF_FTYPE_V4SF_V2SI,
21437   V4SF_FTYPE_V4SF_V2DF,
21438   V4SF_FTYPE_V4SF_DI,
21439   V4SF_FTYPE_V4SF_SI,
21440   V2DI_FTYPE_V2DI_V2DI,
21441   V2DI_FTYPE_V2DI_V2DI_COUNT,
21442   V2DI_FTYPE_V16QI_V16QI,
21443   V2DI_FTYPE_V4SI_V4SI,
21444   V2DI_FTYPE_V2DI_V16QI,
21445   V2DI_FTYPE_V2DF_V2DF,
21446   V2DI_FTYPE_V2DI_SI_COUNT,
21447   V2SI_FTYPE_V2SI_V2SI,
21448   V2SI_FTYPE_V2SI_V2SI_COUNT,
21449   V2SI_FTYPE_V4HI_V4HI,
21450   V2SI_FTYPE_V2SF_V2SF,
21451   V2SI_FTYPE_V2SI_SI_COUNT,
21452   V2DF_FTYPE_V2DF_V2DF,
21453   V2DF_FTYPE_V2DF_V2DF_SWAP,
21454   V2DF_FTYPE_V2DF_V4SF,
21455   V2DF_FTYPE_V2DF_V2DI,
21456   V2DF_FTYPE_V2DF_DI,
21457   V2DF_FTYPE_V2DF_SI,
21458   V2SF_FTYPE_V2SF_V2SF,
21459   V1DI_FTYPE_V1DI_V1DI,
21460   V1DI_FTYPE_V1DI_V1DI_COUNT,
21461   V1DI_FTYPE_V8QI_V8QI,
21462   V1DI_FTYPE_V2SI_V2SI,
21463   V1DI_FTYPE_V1DI_SI_COUNT,
21464   UINT64_FTYPE_UINT64_UINT64,
21465   UINT_FTYPE_UINT_UINT,
21466   UINT_FTYPE_UINT_USHORT,
21467   UINT_FTYPE_UINT_UCHAR,
21468   UINT16_FTYPE_UINT16_INT,
21469   UINT8_FTYPE_UINT8_INT,
21470   V8HI_FTYPE_V8HI_INT,
21471   V4SI_FTYPE_V4SI_INT,
21472   V4HI_FTYPE_V4HI_INT,
21473   V8SF_FTYPE_V8SF_INT,
21474   V4SI_FTYPE_V8SI_INT,
21475   V4SF_FTYPE_V8SF_INT,
21476   V2DF_FTYPE_V4DF_INT,
21477   V4DF_FTYPE_V4DF_INT,
21478   V4SF_FTYPE_V4SF_INT,
21479   V2DI_FTYPE_V2DI_INT,
21480   V2DI2TI_FTYPE_V2DI_INT,
21481   V2DF_FTYPE_V2DF_INT,
21482   V16QI_FTYPE_V16QI_V16QI_V16QI,
21483   V8SF_FTYPE_V8SF_V8SF_V8SF,
21484   V4DF_FTYPE_V4DF_V4DF_V4DF,
21485   V4SF_FTYPE_V4SF_V4SF_V4SF,
21486   V2DF_FTYPE_V2DF_V2DF_V2DF,
21487   V16QI_FTYPE_V16QI_V16QI_INT,
21488   V8SI_FTYPE_V8SI_V8SI_INT,
21489   V8SI_FTYPE_V8SI_V4SI_INT,
21490   V8HI_FTYPE_V8HI_V8HI_INT,
21491   V8SF_FTYPE_V8SF_V8SF_INT,
21492   V8SF_FTYPE_V8SF_V4SF_INT,
21493   V4SI_FTYPE_V4SI_V4SI_INT,
21494   V4DF_FTYPE_V4DF_V4DF_INT,
21495   V4DF_FTYPE_V4DF_V2DF_INT,
21496   V4SF_FTYPE_V4SF_V4SF_INT,
21497   V2DI_FTYPE_V2DI_V2DI_INT,
21498   V2DI2TI_FTYPE_V2DI_V2DI_INT,
21499   V1DI2DI_FTYPE_V1DI_V1DI_INT,
21500   V2DF_FTYPE_V2DF_V2DF_INT,
21501   V2DI_FTYPE_V2DI_UINT_UINT,
21502   V2DI_FTYPE_V2DI_V2DI_UINT_UINT
21503 };
21504
21505 /* Special builtins with variable number of arguments.  */
21506 static const struct builtin_description bdesc_special_args[] =
21507 {
21508   { ~OPTION_MASK_ISA_64BIT, CODE_FOR_rdtsc, "__builtin_ia32_rdtsc", IX86_BUILTIN_RDTSC, UNKNOWN, (int) UINT64_FTYPE_VOID },
21509   { ~OPTION_MASK_ISA_64BIT, CODE_FOR_rdtscp, "__builtin_ia32_rdtscp", IX86_BUILTIN_RDTSCP, UNKNOWN, (int) UINT64_FTYPE_PUNSIGNED },
21510
21511   /* MMX */
21512   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_emms, "__builtin_ia32_emms", IX86_BUILTIN_EMMS, UNKNOWN, (int) VOID_FTYPE_VOID },
21513
21514   /* 3DNow! */
21515   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_femms, "__builtin_ia32_femms", IX86_BUILTIN_FEMMS, UNKNOWN, (int) VOID_FTYPE_VOID },
21516
21517   /* SSE */
21518   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movups, "__builtin_ia32_storeups", IX86_BUILTIN_STOREUPS, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V4SF },
21519   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movntv4sf, "__builtin_ia32_movntps", IX86_BUILTIN_MOVNTPS, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V4SF },
21520   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movups, "__builtin_ia32_loadups", IX86_BUILTIN_LOADUPS, UNKNOWN, (int) V4SF_FTYPE_PCFLOAT },
21521
21522   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_loadhps_exp, "__builtin_ia32_loadhps", IX86_BUILTIN_LOADHPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_PCV2SF },
21523   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_loadlps_exp, "__builtin_ia32_loadlps", IX86_BUILTIN_LOADLPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_PCV2SF },
21524   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_storehps, "__builtin_ia32_storehps", IX86_BUILTIN_STOREHPS, UNKNOWN, (int) VOID_FTYPE_PV2SF_V4SF },
21525   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_storelps, "__builtin_ia32_storelps", IX86_BUILTIN_STORELPS, UNKNOWN, (int) VOID_FTYPE_PV2SF_V4SF },
21526
21527   /* SSE or 3DNow!A  */
21528   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, CODE_FOR_sse_sfence, "__builtin_ia32_sfence", IX86_BUILTIN_SFENCE, UNKNOWN, (int) VOID_FTYPE_VOID },
21529   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, CODE_FOR_sse_movntdi, "__builtin_ia32_movntq", IX86_BUILTIN_MOVNTQ, UNKNOWN, (int) VOID_FTYPE_PDI_DI },
21530
21531   /* SSE2 */
21532   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_lfence, "__builtin_ia32_lfence", IX86_BUILTIN_LFENCE, UNKNOWN, (int) VOID_FTYPE_VOID },
21533   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_mfence, 0, IX86_BUILTIN_MFENCE, UNKNOWN, (int) VOID_FTYPE_VOID },
21534   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movupd, "__builtin_ia32_storeupd", IX86_BUILTIN_STOREUPD, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V2DF },
21535   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movdqu, "__builtin_ia32_storedqu", IX86_BUILTIN_STOREDQU, UNKNOWN, (int) VOID_FTYPE_PCHAR_V16QI },
21536   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movntv2df, "__builtin_ia32_movntpd", IX86_BUILTIN_MOVNTPD, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V2DF },
21537   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movntv2di, "__builtin_ia32_movntdq", IX86_BUILTIN_MOVNTDQ, UNKNOWN, (int) VOID_FTYPE_PV2DI_V2DI },
21538   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movntsi, "__builtin_ia32_movnti", IX86_BUILTIN_MOVNTI, UNKNOWN, (int) VOID_FTYPE_PINT_INT },
21539   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movupd, "__builtin_ia32_loadupd", IX86_BUILTIN_LOADUPD, UNKNOWN, (int) V2DF_FTYPE_PCDOUBLE },
21540   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movdqu, "__builtin_ia32_loaddqu", IX86_BUILTIN_LOADDQU, UNKNOWN, (int) V16QI_FTYPE_PCCHAR },
21541
21542   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_loadhpd_exp, "__builtin_ia32_loadhpd", IX86_BUILTIN_LOADHPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_PCDOUBLE },
21543   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_loadlpd_exp, "__builtin_ia32_loadlpd", IX86_BUILTIN_LOADLPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_PCDOUBLE },
21544
21545   /* SSE3 */
21546   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_lddqu, "__builtin_ia32_lddqu", IX86_BUILTIN_LDDQU, UNKNOWN, (int) V16QI_FTYPE_PCCHAR },
21547
21548   /* SSE4.1 */
21549   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_movntdqa, "__builtin_ia32_movntdqa", IX86_BUILTIN_MOVNTDQA, UNKNOWN, (int) V2DI_FTYPE_PV2DI },
21550
21551   /* SSE4A */
21552   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_vmmovntv2df, "__builtin_ia32_movntsd", IX86_BUILTIN_MOVNTSD, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V2DF },
21553   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_vmmovntv4sf, "__builtin_ia32_movntss", IX86_BUILTIN_MOVNTSS, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V4SF },
21554
21555   /* AVX */
21556   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vzeroall, "__builtin_ia32_vzeroall", IX86_BUILTIN_VZEROALL, UNKNOWN, (int) VOID_FTYPE_VOID },
21557   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vzeroupper, 0, IX86_BUILTIN_VZEROUPPER, UNKNOWN, (int) VOID_FTYPE_VOID },
21558   { OPTION_MASK_ISA_AVX | OPTION_MASK_ISA_64BIT, CODE_FOR_avx_vzeroupper_rex64, 0, IX86_BUILTIN_VZEROUPPER_REX64, UNKNOWN, (int) VOID_FTYPE_VOID },
21559
21560   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vbroadcastss, "__builtin_ia32_vbroadcastss", IX86_BUILTIN_VBROADCASTSS, UNKNOWN, (int) V4SF_FTYPE_PCFLOAT },
21561   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vbroadcastsd256, "__builtin_ia32_vbroadcastsd256", IX86_BUILTIN_VBROADCASTSD256, UNKNOWN, (int) V4DF_FTYPE_PCDOUBLE },
21562   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vbroadcastss256, "__builtin_ia32_vbroadcastss256", IX86_BUILTIN_VBROADCASTSS256, UNKNOWN, (int) V8SF_FTYPE_PCFLOAT },
21563   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vbroadcastf128_pd256, "__builtin_ia32_vbroadcastf128_pd256", IX86_BUILTIN_VBROADCASTPD256, UNKNOWN, (int) V4DF_FTYPE_PCV2DF },
21564   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vbroadcastf128_ps256, "__builtin_ia32_vbroadcastf128_ps256", IX86_BUILTIN_VBROADCASTPS256, UNKNOWN, (int) V8SF_FTYPE_PCV4SF },
21565
21566   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movupd256, "__builtin_ia32_loadupd256", IX86_BUILTIN_LOADUPD256, UNKNOWN, (int) V4DF_FTYPE_PCDOUBLE },
21567   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movups256, "__builtin_ia32_loadups256", IX86_BUILTIN_LOADUPS256, UNKNOWN, (int) V8SF_FTYPE_PCFLOAT },
21568   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movupd256, "__builtin_ia32_storeupd256", IX86_BUILTIN_STOREUPD256, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V4DF },
21569   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movups256, "__builtin_ia32_storeups256", IX86_BUILTIN_STOREUPS256, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V8SF },
21570   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movdqu256, "__builtin_ia32_loaddqu256", IX86_BUILTIN_LOADDQU256, UNKNOWN, (int) V32QI_FTYPE_PCCHAR },
21571   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movdqu256, "__builtin_ia32_storedqu256", IX86_BUILTIN_STOREDQU256, UNKNOWN, (int) VOID_FTYPE_PCHAR_V32QI },
21572   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_lddqu256, "__builtin_ia32_lddqu256", IX86_BUILTIN_LDDQU256, UNKNOWN, (int) V32QI_FTYPE_PCCHAR },
21573
21574   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movntv4di, "__builtin_ia32_movntdq256", IX86_BUILTIN_MOVNTDQ256, UNKNOWN, (int) VOID_FTYPE_PV4DI_V4DI },
21575   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movntv4df, "__builtin_ia32_movntpd256", IX86_BUILTIN_MOVNTPD256, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V4DF },
21576   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movntv8sf, "__builtin_ia32_movntps256", IX86_BUILTIN_MOVNTPS256, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V8SF },
21577
21578   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskloadpd, "__builtin_ia32_maskloadpd", IX86_BUILTIN_MASKLOADPD, UNKNOWN, (int) V2DF_FTYPE_PCV2DF_V2DF },
21579   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskloadps, "__builtin_ia32_maskloadps", IX86_BUILTIN_MASKLOADPS, UNKNOWN, (int) V4SF_FTYPE_PCV4SF_V4SF },
21580   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskloadpd256, "__builtin_ia32_maskloadpd256", IX86_BUILTIN_MASKLOADPD256, UNKNOWN, (int) V4DF_FTYPE_PCV4DF_V4DF },
21581   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskloadps256, "__builtin_ia32_maskloadps256", IX86_BUILTIN_MASKLOADPS256, UNKNOWN, (int) V8SF_FTYPE_PCV8SF_V8SF },
21582   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskstorepd, "__builtin_ia32_maskstorepd", IX86_BUILTIN_MASKSTOREPD, UNKNOWN, (int) VOID_FTYPE_PV2DF_V2DF_V2DF },
21583   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskstoreps, "__builtin_ia32_maskstoreps", IX86_BUILTIN_MASKSTOREPS, UNKNOWN, (int) VOID_FTYPE_PV4SF_V4SF_V4SF },
21584   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskstorepd256, "__builtin_ia32_maskstorepd256", IX86_BUILTIN_MASKSTOREPD256, UNKNOWN, (int) VOID_FTYPE_PV4DF_V4DF_V4DF },
21585   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskstoreps256, "__builtin_ia32_maskstoreps256", IX86_BUILTIN_MASKSTOREPS256, UNKNOWN, (int) VOID_FTYPE_PV8SF_V8SF_V8SF },
21586
21587   { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_llwpcbhi1,   "__builtin_ia32_llwpcb16",   IX86_BUILTIN_LLWPCB16,    UNKNOWN,     (int) VOID_FTYPE_VOID },
21588   { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_llwpcbsi1,   "__builtin_ia32_llwpcb32",   IX86_BUILTIN_LLWPCB32,    UNKNOWN,     (int) VOID_FTYPE_VOID },
21589   { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_llwpcbdi1,   "__builtin_ia32_llwpcb64",   IX86_BUILTIN_LLWPCB64,    UNKNOWN,     (int) VOID_FTYPE_VOID },
21590
21591   { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_slwpcbhi1,   "__builtin_ia32_slwpcb16",   IX86_BUILTIN_SLWPCB16,    UNKNOWN,     (int) VOID_FTYPE_VOID },
21592   { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_slwpcbsi1,   "__builtin_ia32_slwpcb32",   IX86_BUILTIN_SLWPCB32,    UNKNOWN,     (int) VOID_FTYPE_VOID },
21593   { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_slwpcbdi1,   "__builtin_ia32_slwpcb64",   IX86_BUILTIN_SLWPCB64,    UNKNOWN,     (int) VOID_FTYPE_VOID },
21594
21595   { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_lwpvalhi3,   "__builtin_ia32_lwpval16", IX86_BUILTIN_LWPVAL16,  UNKNOWN,     (int) VOID_FTYPE_USHORT_UINT_USHORT },
21596   { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_lwpvalsi3,   "__builtin_ia32_lwpval32", IX86_BUILTIN_LWPVAL64,  UNKNOWN,     (int) VOID_FTYPE_UINT_UINT_UINT },
21597   { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_lwpvaldi3,   "__builtin_ia32_lwpval64", IX86_BUILTIN_LWPVAL64,  UNKNOWN,     (int) VOID_FTYPE_UINT64_UINT_UINT },
21598   { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_lwpinshi3,   "__builtin_ia32_lwpins16", IX86_BUILTIN_LWPINS16,  UNKNOWN,     (int) UCHAR_FTYPE_USHORT_UINT_USHORT },
21599   { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_lwpinssi3,   "__builtin_ia32_lwpins32", IX86_BUILTIN_LWPINS64,  UNKNOWN,     (int) UCHAR_FTYPE_UINT_UINT_UINT },
21600   { OPTION_MASK_ISA_LWP, CODE_FOR_lwp_lwpinsdi3,   "__builtin_ia32_lwpins64", IX86_BUILTIN_LWPINS64,  UNKNOWN,     (int) UCHAR_FTYPE_UINT64_UINT_UINT },
21601
21602 };
21603
21604 /* Builtins with variable number of arguments.  */
21605 static const struct builtin_description bdesc_args[] =
21606 {
21607   { ~OPTION_MASK_ISA_64BIT, CODE_FOR_bsr, "__builtin_ia32_bsrsi", IX86_BUILTIN_BSRSI, UNKNOWN, (int) INT_FTYPE_INT },
21608   { OPTION_MASK_ISA_64BIT, CODE_FOR_bsr_rex64, "__builtin_ia32_bsrdi", IX86_BUILTIN_BSRDI, UNKNOWN, (int) INT64_FTYPE_INT64 },
21609   { ~OPTION_MASK_ISA_64BIT, CODE_FOR_rdpmc, "__builtin_ia32_rdpmc", IX86_BUILTIN_RDPMC, UNKNOWN, (int) UINT64_FTYPE_INT },
21610   { ~OPTION_MASK_ISA_64BIT, CODE_FOR_rotlqi3, "__builtin_ia32_rolqi", IX86_BUILTIN_ROLQI, UNKNOWN, (int) UINT8_FTYPE_UINT8_INT },
21611   { ~OPTION_MASK_ISA_64BIT, CODE_FOR_rotlhi3, "__builtin_ia32_rolhi", IX86_BUILTIN_ROLHI, UNKNOWN, (int) UINT16_FTYPE_UINT16_INT },
21612   { ~OPTION_MASK_ISA_64BIT, CODE_FOR_rotrqi3, "__builtin_ia32_rorqi", IX86_BUILTIN_RORQI, UNKNOWN, (int) UINT8_FTYPE_UINT8_INT },
21613   { ~OPTION_MASK_ISA_64BIT, CODE_FOR_rotrhi3, "__builtin_ia32_rorhi", IX86_BUILTIN_RORHI, UNKNOWN, (int) UINT16_FTYPE_UINT16_INT },
21614
21615   /* MMX */
21616   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_addv8qi3, "__builtin_ia32_paddb", IX86_BUILTIN_PADDB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21617   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_addv4hi3, "__builtin_ia32_paddw", IX86_BUILTIN_PADDW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21618   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_addv2si3, "__builtin_ia32_paddd", IX86_BUILTIN_PADDD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21619   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_subv8qi3, "__builtin_ia32_psubb", IX86_BUILTIN_PSUBB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21620   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_subv4hi3, "__builtin_ia32_psubw", IX86_BUILTIN_PSUBW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21621   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_subv2si3, "__builtin_ia32_psubd", IX86_BUILTIN_PSUBD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21622
21623   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ssaddv8qi3, "__builtin_ia32_paddsb", IX86_BUILTIN_PADDSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21624   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ssaddv4hi3, "__builtin_ia32_paddsw", IX86_BUILTIN_PADDSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21625   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_sssubv8qi3, "__builtin_ia32_psubsb", IX86_BUILTIN_PSUBSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21626   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_sssubv4hi3, "__builtin_ia32_psubsw", IX86_BUILTIN_PSUBSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21627   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_usaddv8qi3, "__builtin_ia32_paddusb", IX86_BUILTIN_PADDUSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21628   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_usaddv4hi3, "__builtin_ia32_paddusw", IX86_BUILTIN_PADDUSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21629   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ussubv8qi3, "__builtin_ia32_psubusb", IX86_BUILTIN_PSUBUSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21630   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ussubv4hi3, "__builtin_ia32_psubusw", IX86_BUILTIN_PSUBUSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21631
21632   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_mulv4hi3, "__builtin_ia32_pmullw", IX86_BUILTIN_PMULLW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21633   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_smulv4hi3_highpart, "__builtin_ia32_pmulhw", IX86_BUILTIN_PMULHW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21634
21635   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_andv2si3, "__builtin_ia32_pand", IX86_BUILTIN_PAND, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21636   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_andnotv2si3, "__builtin_ia32_pandn", IX86_BUILTIN_PANDN, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21637   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_iorv2si3, "__builtin_ia32_por", IX86_BUILTIN_POR, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21638   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_xorv2si3, "__builtin_ia32_pxor", IX86_BUILTIN_PXOR, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21639
21640   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_eqv8qi3, "__builtin_ia32_pcmpeqb", IX86_BUILTIN_PCMPEQB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21641   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_eqv4hi3, "__builtin_ia32_pcmpeqw", IX86_BUILTIN_PCMPEQW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21642   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_eqv2si3, "__builtin_ia32_pcmpeqd", IX86_BUILTIN_PCMPEQD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21643   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_gtv8qi3, "__builtin_ia32_pcmpgtb", IX86_BUILTIN_PCMPGTB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21644   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_gtv4hi3, "__builtin_ia32_pcmpgtw", IX86_BUILTIN_PCMPGTW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21645   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_gtv2si3, "__builtin_ia32_pcmpgtd", IX86_BUILTIN_PCMPGTD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21646
21647   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpckhbw, "__builtin_ia32_punpckhbw", IX86_BUILTIN_PUNPCKHBW, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21648   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpckhwd, "__builtin_ia32_punpckhwd", IX86_BUILTIN_PUNPCKHWD, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21649   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpckhdq, "__builtin_ia32_punpckhdq", IX86_BUILTIN_PUNPCKHDQ, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21650   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpcklbw, "__builtin_ia32_punpcklbw", IX86_BUILTIN_PUNPCKLBW, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21651   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpcklwd, "__builtin_ia32_punpcklwd", IX86_BUILTIN_PUNPCKLWD, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI},
21652   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpckldq, "__builtin_ia32_punpckldq", IX86_BUILTIN_PUNPCKLDQ, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI},
21653
21654   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_packsswb, "__builtin_ia32_packsswb", IX86_BUILTIN_PACKSSWB, UNKNOWN, (int) V8QI_FTYPE_V4HI_V4HI },
21655   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_packssdw, "__builtin_ia32_packssdw", IX86_BUILTIN_PACKSSDW, UNKNOWN, (int) V4HI_FTYPE_V2SI_V2SI },
21656   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_packuswb, "__builtin_ia32_packuswb", IX86_BUILTIN_PACKUSWB, UNKNOWN, (int) V8QI_FTYPE_V4HI_V4HI },
21657
21658   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_pmaddwd, "__builtin_ia32_pmaddwd", IX86_BUILTIN_PMADDWD, UNKNOWN, (int) V2SI_FTYPE_V4HI_V4HI },
21659
21660   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv4hi3, "__builtin_ia32_psllwi", IX86_BUILTIN_PSLLWI, UNKNOWN, (int) V4HI_FTYPE_V4HI_SI_COUNT },
21661   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv2si3, "__builtin_ia32_pslldi", IX86_BUILTIN_PSLLDI, UNKNOWN, (int) V2SI_FTYPE_V2SI_SI_COUNT },
21662   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv1di3, "__builtin_ia32_psllqi", IX86_BUILTIN_PSLLQI, UNKNOWN, (int) V1DI_FTYPE_V1DI_SI_COUNT },
21663   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv4hi3, "__builtin_ia32_psllw", IX86_BUILTIN_PSLLW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI_COUNT },
21664   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv2si3, "__builtin_ia32_pslld", IX86_BUILTIN_PSLLD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI_COUNT },
21665   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv1di3, "__builtin_ia32_psllq", IX86_BUILTIN_PSLLQ, UNKNOWN, (int) V1DI_FTYPE_V1DI_V1DI_COUNT },
21666
21667   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv4hi3, "__builtin_ia32_psrlwi", IX86_BUILTIN_PSRLWI, UNKNOWN, (int) V4HI_FTYPE_V4HI_SI_COUNT },
21668   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv2si3, "__builtin_ia32_psrldi", IX86_BUILTIN_PSRLDI, UNKNOWN, (int) V2SI_FTYPE_V2SI_SI_COUNT },
21669   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv1di3, "__builtin_ia32_psrlqi", IX86_BUILTIN_PSRLQI, UNKNOWN, (int) V1DI_FTYPE_V1DI_SI_COUNT },
21670   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv4hi3, "__builtin_ia32_psrlw", IX86_BUILTIN_PSRLW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI_COUNT },
21671   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv2si3, "__builtin_ia32_psrld", IX86_BUILTIN_PSRLD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI_COUNT },
21672   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv1di3, "__builtin_ia32_psrlq", IX86_BUILTIN_PSRLQ, UNKNOWN, (int) V1DI_FTYPE_V1DI_V1DI_COUNT },
21673
21674   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashrv4hi3, "__builtin_ia32_psrawi", IX86_BUILTIN_PSRAWI, UNKNOWN, (int) V4HI_FTYPE_V4HI_SI_COUNT },
21675   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashrv2si3, "__builtin_ia32_psradi", IX86_BUILTIN_PSRADI, UNKNOWN, (int) V2SI_FTYPE_V2SI_SI_COUNT },
21676   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashrv4hi3, "__builtin_ia32_psraw", IX86_BUILTIN_PSRAW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI_COUNT },
21677   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashrv2si3, "__builtin_ia32_psrad", IX86_BUILTIN_PSRAD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI_COUNT },
21678
21679   /* 3DNow! */
21680   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_pf2id, "__builtin_ia32_pf2id", IX86_BUILTIN_PF2ID, UNKNOWN, (int) V2SI_FTYPE_V2SF },
21681   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_floatv2si2, "__builtin_ia32_pi2fd", IX86_BUILTIN_PI2FD, UNKNOWN, (int) V2SF_FTYPE_V2SI },
21682   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rcpv2sf2, "__builtin_ia32_pfrcp", IX86_BUILTIN_PFRCP, UNKNOWN, (int) V2SF_FTYPE_V2SF },
21683   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rsqrtv2sf2, "__builtin_ia32_pfrsqrt", IX86_BUILTIN_PFRSQRT, UNKNOWN, (int) V2SF_FTYPE_V2SF },
21684
21685   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_uavgv8qi3, "__builtin_ia32_pavgusb", IX86_BUILTIN_PAVGUSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21686   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_haddv2sf3, "__builtin_ia32_pfacc", IX86_BUILTIN_PFACC, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21687   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_addv2sf3, "__builtin_ia32_pfadd", IX86_BUILTIN_PFADD, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21688   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_eqv2sf3, "__builtin_ia32_pfcmpeq", IX86_BUILTIN_PFCMPEQ, UNKNOWN, (int) V2SI_FTYPE_V2SF_V2SF },
21689   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_gev2sf3, "__builtin_ia32_pfcmpge", IX86_BUILTIN_PFCMPGE, UNKNOWN, (int) V2SI_FTYPE_V2SF_V2SF },
21690   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_gtv2sf3, "__builtin_ia32_pfcmpgt", IX86_BUILTIN_PFCMPGT, UNKNOWN, (int) V2SI_FTYPE_V2SF_V2SF },
21691   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_smaxv2sf3, "__builtin_ia32_pfmax", IX86_BUILTIN_PFMAX, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21692   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_sminv2sf3, "__builtin_ia32_pfmin", IX86_BUILTIN_PFMIN, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21693   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_mulv2sf3, "__builtin_ia32_pfmul", IX86_BUILTIN_PFMUL, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21694   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rcpit1v2sf3, "__builtin_ia32_pfrcpit1", IX86_BUILTIN_PFRCPIT1, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21695   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rcpit2v2sf3, "__builtin_ia32_pfrcpit2", IX86_BUILTIN_PFRCPIT2, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21696   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rsqit1v2sf3, "__builtin_ia32_pfrsqit1", IX86_BUILTIN_PFRSQIT1, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21697   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_subv2sf3, "__builtin_ia32_pfsub", IX86_BUILTIN_PFSUB, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21698   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_subrv2sf3, "__builtin_ia32_pfsubr", IX86_BUILTIN_PFSUBR, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21699   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_pmulhrwv4hi3, "__builtin_ia32_pmulhrw", IX86_BUILTIN_PMULHRW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21700
21701   /* 3DNow!A */
21702   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pf2iw, "__builtin_ia32_pf2iw", IX86_BUILTIN_PF2IW, UNKNOWN, (int) V2SI_FTYPE_V2SF },
21703   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pi2fw, "__builtin_ia32_pi2fw", IX86_BUILTIN_PI2FW, UNKNOWN, (int) V2SF_FTYPE_V2SI },
21704   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pswapdv2si2, "__builtin_ia32_pswapdsi", IX86_BUILTIN_PSWAPDSI, UNKNOWN, (int) V2SI_FTYPE_V2SI },
21705   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pswapdv2sf2, "__builtin_ia32_pswapdsf", IX86_BUILTIN_PSWAPDSF, UNKNOWN, (int) V2SF_FTYPE_V2SF },
21706   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_hsubv2sf3, "__builtin_ia32_pfnacc", IX86_BUILTIN_PFNACC, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21707   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_addsubv2sf3, "__builtin_ia32_pfpnacc", IX86_BUILTIN_PFPNACC, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21708
21709   /* SSE */
21710   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movmskps, "__builtin_ia32_movmskps", IX86_BUILTIN_MOVMSKPS, UNKNOWN, (int) INT_FTYPE_V4SF },
21711   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_sqrtv4sf2, "__builtin_ia32_sqrtps", IX86_BUILTIN_SQRTPS, UNKNOWN, (int) V4SF_FTYPE_V4SF },
21712   { OPTION_MASK_ISA_SSE, CODE_FOR_sqrtv4sf2, "__builtin_ia32_sqrtps_nr", IX86_BUILTIN_SQRTPS_NR, UNKNOWN, (int) V4SF_FTYPE_V4SF },
21713   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_rsqrtv4sf2, "__builtin_ia32_rsqrtps", IX86_BUILTIN_RSQRTPS, UNKNOWN, (int) V4SF_FTYPE_V4SF },
21714   { OPTION_MASK_ISA_SSE, CODE_FOR_rsqrtv4sf2, "__builtin_ia32_rsqrtps_nr", IX86_BUILTIN_RSQRTPS_NR, UNKNOWN, (int) V4SF_FTYPE_V4SF },
21715   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_rcpv4sf2, "__builtin_ia32_rcpps", IX86_BUILTIN_RCPPS, UNKNOWN, (int) V4SF_FTYPE_V4SF },
21716   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvtps2pi, "__builtin_ia32_cvtps2pi", IX86_BUILTIN_CVTPS2PI, UNKNOWN, (int) V2SI_FTYPE_V4SF },
21717   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvtss2si, "__builtin_ia32_cvtss2si", IX86_BUILTIN_CVTSS2SI, UNKNOWN, (int) INT_FTYPE_V4SF },
21718   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_64BIT, CODE_FOR_sse_cvtss2siq, "__builtin_ia32_cvtss2si64", IX86_BUILTIN_CVTSS2SI64, UNKNOWN, (int) INT64_FTYPE_V4SF },
21719   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvttps2pi, "__builtin_ia32_cvttps2pi", IX86_BUILTIN_CVTTPS2PI, UNKNOWN, (int) V2SI_FTYPE_V4SF },
21720   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvttss2si, "__builtin_ia32_cvttss2si", IX86_BUILTIN_CVTTSS2SI, UNKNOWN, (int) INT_FTYPE_V4SF },
21721   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_64BIT, CODE_FOR_sse_cvttss2siq, "__builtin_ia32_cvttss2si64", IX86_BUILTIN_CVTTSS2SI64, UNKNOWN, (int) INT64_FTYPE_V4SF },
21722
21723   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_shufps, "__builtin_ia32_shufps", IX86_BUILTIN_SHUFPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
21724
21725   { OPTION_MASK_ISA_SSE, CODE_FOR_addv4sf3, "__builtin_ia32_addps", IX86_BUILTIN_ADDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21726   { OPTION_MASK_ISA_SSE, CODE_FOR_subv4sf3, "__builtin_ia32_subps", IX86_BUILTIN_SUBPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21727   { OPTION_MASK_ISA_SSE, CODE_FOR_mulv4sf3, "__builtin_ia32_mulps", IX86_BUILTIN_MULPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21728   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_divv4sf3, "__builtin_ia32_divps", IX86_BUILTIN_DIVPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21729   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmaddv4sf3,  "__builtin_ia32_addss", IX86_BUILTIN_ADDSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21730   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmsubv4sf3,  "__builtin_ia32_subss", IX86_BUILTIN_SUBSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21731   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmulv4sf3,  "__builtin_ia32_mulss", IX86_BUILTIN_MULSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21732   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmdivv4sf3,  "__builtin_ia32_divss", IX86_BUILTIN_DIVSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21733
21734   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpeqps", IX86_BUILTIN_CMPEQPS, EQ, (int) V4SF_FTYPE_V4SF_V4SF },
21735   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpltps", IX86_BUILTIN_CMPLTPS, LT, (int) V4SF_FTYPE_V4SF_V4SF },
21736   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpleps", IX86_BUILTIN_CMPLEPS, LE, (int) V4SF_FTYPE_V4SF_V4SF },
21737   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpgtps", IX86_BUILTIN_CMPGTPS, LT, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
21738   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpgeps", IX86_BUILTIN_CMPGEPS, LE, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
21739   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpunordps", IX86_BUILTIN_CMPUNORDPS, UNORDERED, (int) V4SF_FTYPE_V4SF_V4SF },
21740   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpneqps", IX86_BUILTIN_CMPNEQPS, NE, (int) V4SF_FTYPE_V4SF_V4SF },
21741   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpnltps", IX86_BUILTIN_CMPNLTPS, UNGE, (int) V4SF_FTYPE_V4SF_V4SF },
21742   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpnleps", IX86_BUILTIN_CMPNLEPS, UNGT, (int) V4SF_FTYPE_V4SF_V4SF },
21743   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpngtps", IX86_BUILTIN_CMPNGTPS, UNGE, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
21744   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpngeps", IX86_BUILTIN_CMPNGEPS, UNGT, (int) V4SF_FTYPE_V4SF_V4SF_SWAP},
21745   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpordps", IX86_BUILTIN_CMPORDPS, ORDERED, (int) V4SF_FTYPE_V4SF_V4SF },
21746   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpeqss", IX86_BUILTIN_CMPEQSS, EQ, (int) V4SF_FTYPE_V4SF_V4SF },
21747   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpltss", IX86_BUILTIN_CMPLTSS, LT, (int) V4SF_FTYPE_V4SF_V4SF },
21748   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpless", IX86_BUILTIN_CMPLESS, LE, (int) V4SF_FTYPE_V4SF_V4SF },
21749   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpunordss", IX86_BUILTIN_CMPUNORDSS, UNORDERED, (int) V4SF_FTYPE_V4SF_V4SF },
21750   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpneqss", IX86_BUILTIN_CMPNEQSS, NE, (int) V4SF_FTYPE_V4SF_V4SF },
21751   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpnltss", IX86_BUILTIN_CMPNLTSS, UNGE, (int) V4SF_FTYPE_V4SF_V4SF },
21752   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpnless", IX86_BUILTIN_CMPNLESS, UNGT, (int) V4SF_FTYPE_V4SF_V4SF },
21753   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpngtss", IX86_BUILTIN_CMPNGTSS, UNGE, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
21754   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpngess", IX86_BUILTIN_CMPNGESS, UNGT, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
21755   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpordss", IX86_BUILTIN_CMPORDSS, ORDERED, (int) V4SF_FTYPE_V4SF_V4SF },
21756
21757   { OPTION_MASK_ISA_SSE, CODE_FOR_sminv4sf3, "__builtin_ia32_minps", IX86_BUILTIN_MINPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21758   { OPTION_MASK_ISA_SSE, CODE_FOR_smaxv4sf3, "__builtin_ia32_maxps", IX86_BUILTIN_MAXPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21759   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmsminv4sf3, "__builtin_ia32_minss", IX86_BUILTIN_MINSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21760   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmsmaxv4sf3, "__builtin_ia32_maxss", IX86_BUILTIN_MAXSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21761
21762   { OPTION_MASK_ISA_SSE, CODE_FOR_andv4sf3, "__builtin_ia32_andps", IX86_BUILTIN_ANDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21763   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_andnotv4sf3,  "__builtin_ia32_andnps", IX86_BUILTIN_ANDNPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21764   { OPTION_MASK_ISA_SSE, CODE_FOR_iorv4sf3, "__builtin_ia32_orps", IX86_BUILTIN_ORPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21765   { OPTION_MASK_ISA_SSE, CODE_FOR_xorv4sf3,  "__builtin_ia32_xorps", IX86_BUILTIN_XORPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21766
21767   { OPTION_MASK_ISA_SSE, CODE_FOR_copysignv4sf3,  "__builtin_ia32_copysignps", IX86_BUILTIN_CPYSGNPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21768
21769   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movss,  "__builtin_ia32_movss", IX86_BUILTIN_MOVSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21770   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movhlps_exp,  "__builtin_ia32_movhlps", IX86_BUILTIN_MOVHLPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21771   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movlhps_exp,  "__builtin_ia32_movlhps", IX86_BUILTIN_MOVLHPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21772   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_unpckhps, "__builtin_ia32_unpckhps", IX86_BUILTIN_UNPCKHPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21773   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_unpcklps, "__builtin_ia32_unpcklps", IX86_BUILTIN_UNPCKLPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21774
21775   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvtpi2ps, "__builtin_ia32_cvtpi2ps", IX86_BUILTIN_CVTPI2PS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V2SI },
21776   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvtsi2ss, "__builtin_ia32_cvtsi2ss", IX86_BUILTIN_CVTSI2SS, UNKNOWN, (int) V4SF_FTYPE_V4SF_SI },
21777   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_64BIT, CODE_FOR_sse_cvtsi2ssq, "__builtin_ia32_cvtsi642ss", IX86_BUILTIN_CVTSI642SS, UNKNOWN, V4SF_FTYPE_V4SF_DI },
21778
21779   { OPTION_MASK_ISA_SSE, CODE_FOR_rsqrtsf2, "__builtin_ia32_rsqrtf", IX86_BUILTIN_RSQRTF, UNKNOWN, (int) FLOAT_FTYPE_FLOAT },
21780
21781   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmsqrtv4sf2, "__builtin_ia32_sqrtss", IX86_BUILTIN_SQRTSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_VEC_MERGE },
21782   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmrsqrtv4sf2, "__builtin_ia32_rsqrtss", IX86_BUILTIN_RSQRTSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_VEC_MERGE },
21783   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmrcpv4sf2, "__builtin_ia32_rcpss", IX86_BUILTIN_RCPSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_VEC_MERGE },
21784
21785   /* SSE MMX or 3Dnow!A */
21786   { 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 },
21787   { 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 },
21788   { 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 },
21789
21790   { 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 },
21791   { 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 },
21792   { 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 },
21793   { 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 },
21794
21795   { 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 },
21796   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pmovmskb, "__builtin_ia32_pmovmskb", IX86_BUILTIN_PMOVMSKB, UNKNOWN, (int) INT_FTYPE_V8QI },
21797
21798   { 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 },
21799
21800   /* SSE2 */
21801   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_shufpd, "__builtin_ia32_shufpd", IX86_BUILTIN_SHUFPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
21802
21803   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movmskpd, "__builtin_ia32_movmskpd", IX86_BUILTIN_MOVMSKPD, UNKNOWN, (int) INT_FTYPE_V2DF  },
21804   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pmovmskb, "__builtin_ia32_pmovmskb128", IX86_BUILTIN_PMOVMSKB128, UNKNOWN, (int) INT_FTYPE_V16QI },
21805   { OPTION_MASK_ISA_SSE2, CODE_FOR_sqrtv2df2, "__builtin_ia32_sqrtpd", IX86_BUILTIN_SQRTPD, UNKNOWN, (int) V2DF_FTYPE_V2DF },
21806   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtdq2pd, "__builtin_ia32_cvtdq2pd", IX86_BUILTIN_CVTDQ2PD, UNKNOWN, (int) V2DF_FTYPE_V4SI },
21807   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtdq2ps, "__builtin_ia32_cvtdq2ps", IX86_BUILTIN_CVTDQ2PS, UNKNOWN, (int) V4SF_FTYPE_V4SI },
21808   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtudq2ps, "__builtin_ia32_cvtudq2ps", IX86_BUILTIN_CVTUDQ2PS, UNKNOWN, (int) V4SF_FTYPE_V4SI },
21809
21810   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtpd2dq, "__builtin_ia32_cvtpd2dq", IX86_BUILTIN_CVTPD2DQ, UNKNOWN, (int) V4SI_FTYPE_V2DF },
21811   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtpd2pi, "__builtin_ia32_cvtpd2pi", IX86_BUILTIN_CVTPD2PI, UNKNOWN, (int) V2SI_FTYPE_V2DF },
21812   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtpd2ps, "__builtin_ia32_cvtpd2ps", IX86_BUILTIN_CVTPD2PS, UNKNOWN, (int) V4SF_FTYPE_V2DF },
21813   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvttpd2dq, "__builtin_ia32_cvttpd2dq", IX86_BUILTIN_CVTTPD2DQ, UNKNOWN, (int) V4SI_FTYPE_V2DF },
21814   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvttpd2pi, "__builtin_ia32_cvttpd2pi", IX86_BUILTIN_CVTTPD2PI, UNKNOWN, (int) V2SI_FTYPE_V2DF },
21815
21816   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtpi2pd, "__builtin_ia32_cvtpi2pd", IX86_BUILTIN_CVTPI2PD, UNKNOWN, (int) V2DF_FTYPE_V2SI },
21817
21818   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtsd2si, "__builtin_ia32_cvtsd2si", IX86_BUILTIN_CVTSD2SI, UNKNOWN, (int) INT_FTYPE_V2DF },
21819   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvttsd2si, "__builtin_ia32_cvttsd2si", IX86_BUILTIN_CVTTSD2SI, UNKNOWN, (int) INT_FTYPE_V2DF },
21820   { OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_64BIT, CODE_FOR_sse2_cvtsd2siq, "__builtin_ia32_cvtsd2si64", IX86_BUILTIN_CVTSD2SI64, UNKNOWN, (int) INT64_FTYPE_V2DF },
21821   { OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_64BIT, CODE_FOR_sse2_cvttsd2siq, "__builtin_ia32_cvttsd2si64", IX86_BUILTIN_CVTTSD2SI64, UNKNOWN, (int) INT64_FTYPE_V2DF },
21822
21823   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtps2dq, "__builtin_ia32_cvtps2dq", IX86_BUILTIN_CVTPS2DQ, UNKNOWN, (int) V4SI_FTYPE_V4SF },
21824   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtps2pd, "__builtin_ia32_cvtps2pd", IX86_BUILTIN_CVTPS2PD, UNKNOWN, (int) V2DF_FTYPE_V4SF },
21825   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvttps2dq, "__builtin_ia32_cvttps2dq", IX86_BUILTIN_CVTTPS2DQ, UNKNOWN, (int) V4SI_FTYPE_V4SF },
21826
21827   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv2df3, "__builtin_ia32_addpd", IX86_BUILTIN_ADDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21828   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv2df3, "__builtin_ia32_subpd", IX86_BUILTIN_SUBPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21829   { OPTION_MASK_ISA_SSE2, CODE_FOR_mulv2df3, "__builtin_ia32_mulpd", IX86_BUILTIN_MULPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21830   { OPTION_MASK_ISA_SSE2, CODE_FOR_divv2df3, "__builtin_ia32_divpd", IX86_BUILTIN_DIVPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21831   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmaddv2df3,  "__builtin_ia32_addsd", IX86_BUILTIN_ADDSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21832   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmsubv2df3,  "__builtin_ia32_subsd", IX86_BUILTIN_SUBSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21833   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmulv2df3,  "__builtin_ia32_mulsd", IX86_BUILTIN_MULSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21834   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmdivv2df3,  "__builtin_ia32_divsd", IX86_BUILTIN_DIVSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21835
21836   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpeqpd", IX86_BUILTIN_CMPEQPD, EQ, (int) V2DF_FTYPE_V2DF_V2DF },
21837   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpltpd", IX86_BUILTIN_CMPLTPD, LT, (int) V2DF_FTYPE_V2DF_V2DF },
21838   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmplepd", IX86_BUILTIN_CMPLEPD, LE, (int) V2DF_FTYPE_V2DF_V2DF },
21839   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpgtpd", IX86_BUILTIN_CMPGTPD, LT, (int) V2DF_FTYPE_V2DF_V2DF_SWAP },
21840   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpgepd", IX86_BUILTIN_CMPGEPD, LE, (int) V2DF_FTYPE_V2DF_V2DF_SWAP},
21841   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpunordpd", IX86_BUILTIN_CMPUNORDPD, UNORDERED, (int) V2DF_FTYPE_V2DF_V2DF },
21842   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpneqpd", IX86_BUILTIN_CMPNEQPD, NE, (int) V2DF_FTYPE_V2DF_V2DF },
21843   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpnltpd", IX86_BUILTIN_CMPNLTPD, UNGE, (int) V2DF_FTYPE_V2DF_V2DF },
21844   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpnlepd", IX86_BUILTIN_CMPNLEPD, UNGT, (int) V2DF_FTYPE_V2DF_V2DF },
21845   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpngtpd", IX86_BUILTIN_CMPNGTPD, UNGE, (int) V2DF_FTYPE_V2DF_V2DF_SWAP },
21846   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpngepd", IX86_BUILTIN_CMPNGEPD, UNGT, (int) V2DF_FTYPE_V2DF_V2DF_SWAP },
21847   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpordpd", IX86_BUILTIN_CMPORDPD, ORDERED, (int) V2DF_FTYPE_V2DF_V2DF },
21848   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpeqsd", IX86_BUILTIN_CMPEQSD, EQ, (int) V2DF_FTYPE_V2DF_V2DF },
21849   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpltsd", IX86_BUILTIN_CMPLTSD, LT, (int) V2DF_FTYPE_V2DF_V2DF },
21850   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmplesd", IX86_BUILTIN_CMPLESD, LE, (int) V2DF_FTYPE_V2DF_V2DF },
21851   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpunordsd", IX86_BUILTIN_CMPUNORDSD, UNORDERED, (int) V2DF_FTYPE_V2DF_V2DF },
21852   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpneqsd", IX86_BUILTIN_CMPNEQSD, NE, (int) V2DF_FTYPE_V2DF_V2DF },
21853   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpnltsd", IX86_BUILTIN_CMPNLTSD, UNGE, (int) V2DF_FTYPE_V2DF_V2DF },
21854   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpnlesd", IX86_BUILTIN_CMPNLESD, UNGT, (int) V2DF_FTYPE_V2DF_V2DF },
21855   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpordsd", IX86_BUILTIN_CMPORDSD, ORDERED, (int) V2DF_FTYPE_V2DF_V2DF },
21856
21857   { OPTION_MASK_ISA_SSE2, CODE_FOR_sminv2df3, "__builtin_ia32_minpd", IX86_BUILTIN_MINPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21858   { OPTION_MASK_ISA_SSE2, CODE_FOR_smaxv2df3, "__builtin_ia32_maxpd", IX86_BUILTIN_MAXPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21859   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmsminv2df3, "__builtin_ia32_minsd", IX86_BUILTIN_MINSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21860   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmsmaxv2df3, "__builtin_ia32_maxsd", IX86_BUILTIN_MAXSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21861
21862   { OPTION_MASK_ISA_SSE2, CODE_FOR_andv2df3, "__builtin_ia32_andpd", IX86_BUILTIN_ANDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21863   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_andnotv2df3,  "__builtin_ia32_andnpd", IX86_BUILTIN_ANDNPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21864   { OPTION_MASK_ISA_SSE2, CODE_FOR_iorv2df3, "__builtin_ia32_orpd", IX86_BUILTIN_ORPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21865   { OPTION_MASK_ISA_SSE2, CODE_FOR_xorv2df3,  "__builtin_ia32_xorpd", IX86_BUILTIN_XORPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21866
21867   { OPTION_MASK_ISA_SSE2, CODE_FOR_copysignv2df3,  "__builtin_ia32_copysignpd", IX86_BUILTIN_CPYSGNPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21868
21869   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movsd,  "__builtin_ia32_movsd", IX86_BUILTIN_MOVSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21870   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_unpckhpd_exp, "__builtin_ia32_unpckhpd", IX86_BUILTIN_UNPCKHPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21871   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_unpcklpd_exp, "__builtin_ia32_unpcklpd", IX86_BUILTIN_UNPCKLPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21872
21873   { 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 },
21874
21875   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv16qi3, "__builtin_ia32_paddb128", IX86_BUILTIN_PADDB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21876   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv8hi3, "__builtin_ia32_paddw128", IX86_BUILTIN_PADDW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21877   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv4si3, "__builtin_ia32_paddd128", IX86_BUILTIN_PADDD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21878   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv2di3, "__builtin_ia32_paddq128", IX86_BUILTIN_PADDQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21879   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv16qi3, "__builtin_ia32_psubb128", IX86_BUILTIN_PSUBB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21880   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv8hi3, "__builtin_ia32_psubw128", IX86_BUILTIN_PSUBW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21881   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv4si3, "__builtin_ia32_psubd128", IX86_BUILTIN_PSUBD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21882   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv2di3, "__builtin_ia32_psubq128", IX86_BUILTIN_PSUBQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21883
21884   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ssaddv16qi3, "__builtin_ia32_paddsb128", IX86_BUILTIN_PADDSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21885   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ssaddv8hi3, "__builtin_ia32_paddsw128", IX86_BUILTIN_PADDSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21886   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_sssubv16qi3, "__builtin_ia32_psubsb128", IX86_BUILTIN_PSUBSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21887   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_sssubv8hi3, "__builtin_ia32_psubsw128", IX86_BUILTIN_PSUBSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21888   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_usaddv16qi3, "__builtin_ia32_paddusb128", IX86_BUILTIN_PADDUSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21889   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_usaddv8hi3, "__builtin_ia32_paddusw128", IX86_BUILTIN_PADDUSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21890   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ussubv16qi3, "__builtin_ia32_psubusb128", IX86_BUILTIN_PSUBUSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21891   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ussubv8hi3, "__builtin_ia32_psubusw128", IX86_BUILTIN_PSUBUSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21892
21893   { OPTION_MASK_ISA_SSE2, CODE_FOR_mulv8hi3, "__builtin_ia32_pmullw128", IX86_BUILTIN_PMULLW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21894   { OPTION_MASK_ISA_SSE2, CODE_FOR_smulv8hi3_highpart, "__builtin_ia32_pmulhw128", IX86_BUILTIN_PMULHW128, UNKNOWN,(int) V8HI_FTYPE_V8HI_V8HI },
21895
21896   { OPTION_MASK_ISA_SSE2, CODE_FOR_andv2di3, "__builtin_ia32_pand128", IX86_BUILTIN_PAND128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21897   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_andnotv2di3, "__builtin_ia32_pandn128", IX86_BUILTIN_PANDN128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21898   { OPTION_MASK_ISA_SSE2, CODE_FOR_iorv2di3, "__builtin_ia32_por128", IX86_BUILTIN_POR128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21899   { OPTION_MASK_ISA_SSE2, CODE_FOR_xorv2di3, "__builtin_ia32_pxor128", IX86_BUILTIN_PXOR128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21900
21901   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_uavgv16qi3, "__builtin_ia32_pavgb128", IX86_BUILTIN_PAVGB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21902   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_uavgv8hi3, "__builtin_ia32_pavgw128", IX86_BUILTIN_PAVGW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21903
21904   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_eqv16qi3, "__builtin_ia32_pcmpeqb128", IX86_BUILTIN_PCMPEQB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21905   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_eqv8hi3, "__builtin_ia32_pcmpeqw128", IX86_BUILTIN_PCMPEQW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21906   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_eqv4si3, "__builtin_ia32_pcmpeqd128", IX86_BUILTIN_PCMPEQD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI  },
21907   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_gtv16qi3, "__builtin_ia32_pcmpgtb128", IX86_BUILTIN_PCMPGTB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21908   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_gtv8hi3, "__builtin_ia32_pcmpgtw128", IX86_BUILTIN_PCMPGTW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21909   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_gtv4si3, "__builtin_ia32_pcmpgtd128", IX86_BUILTIN_PCMPGTD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI  },
21910
21911   { OPTION_MASK_ISA_SSE2, CODE_FOR_umaxv16qi3, "__builtin_ia32_pmaxub128", IX86_BUILTIN_PMAXUB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21912   { OPTION_MASK_ISA_SSE2, CODE_FOR_smaxv8hi3, "__builtin_ia32_pmaxsw128", IX86_BUILTIN_PMAXSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21913   { OPTION_MASK_ISA_SSE2, CODE_FOR_uminv16qi3, "__builtin_ia32_pminub128", IX86_BUILTIN_PMINUB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21914   { OPTION_MASK_ISA_SSE2, CODE_FOR_sminv8hi3, "__builtin_ia32_pminsw128", IX86_BUILTIN_PMINSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21915
21916   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_punpckhbw, "__builtin_ia32_punpckhbw128", IX86_BUILTIN_PUNPCKHBW128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21917   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_punpckhwd, "__builtin_ia32_punpckhwd128", IX86_BUILTIN_PUNPCKHWD128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI  },
21918   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_punpckhdq, "__builtin_ia32_punpckhdq128", IX86_BUILTIN_PUNPCKHDQ128, UNKNOWN,  (int) V4SI_FTYPE_V4SI_V4SI },
21919   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_punpckhqdq, "__builtin_ia32_punpckhqdq128", IX86_BUILTIN_PUNPCKHQDQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21920   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_punpcklbw, "__builtin_ia32_punpcklbw128", IX86_BUILTIN_PUNPCKLBW128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21921   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_punpcklwd, "__builtin_ia32_punpcklwd128", IX86_BUILTIN_PUNPCKLWD128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21922   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_punpckldq, "__builtin_ia32_punpckldq128", IX86_BUILTIN_PUNPCKLDQ128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21923   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_punpcklqdq, "__builtin_ia32_punpcklqdq128", IX86_BUILTIN_PUNPCKLQDQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21924
21925   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_packsswb, "__builtin_ia32_packsswb128", IX86_BUILTIN_PACKSSWB128, UNKNOWN, (int) V16QI_FTYPE_V8HI_V8HI },
21926   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_packssdw, "__builtin_ia32_packssdw128", IX86_BUILTIN_PACKSSDW128, UNKNOWN, (int) V8HI_FTYPE_V4SI_V4SI },
21927   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_packuswb, "__builtin_ia32_packuswb128", IX86_BUILTIN_PACKUSWB128, UNKNOWN, (int) V16QI_FTYPE_V8HI_V8HI },
21928
21929   { OPTION_MASK_ISA_SSE2, CODE_FOR_umulv8hi3_highpart, "__builtin_ia32_pmulhuw128", IX86_BUILTIN_PMULHUW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21930   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_psadbw, "__builtin_ia32_psadbw128", IX86_BUILTIN_PSADBW128, UNKNOWN, (int) V2DI_FTYPE_V16QI_V16QI },
21931
21932   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_umulv1siv1di3, "__builtin_ia32_pmuludq", IX86_BUILTIN_PMULUDQ, UNKNOWN, (int) V1DI_FTYPE_V2SI_V2SI },
21933   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_umulv2siv2di3, "__builtin_ia32_pmuludq128", IX86_BUILTIN_PMULUDQ128, UNKNOWN, (int) V2DI_FTYPE_V4SI_V4SI },
21934
21935   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pmaddwd, "__builtin_ia32_pmaddwd128", IX86_BUILTIN_PMADDWD128, UNKNOWN, (int) V4SI_FTYPE_V8HI_V8HI },
21936
21937   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtsi2sd, "__builtin_ia32_cvtsi2sd", IX86_BUILTIN_CVTSI2SD, UNKNOWN, (int) V2DF_FTYPE_V2DF_SI },
21938   { OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_64BIT, CODE_FOR_sse2_cvtsi2sdq, "__builtin_ia32_cvtsi642sd", IX86_BUILTIN_CVTSI642SD, UNKNOWN, (int) V2DF_FTYPE_V2DF_DI },
21939   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtsd2ss, "__builtin_ia32_cvtsd2ss", IX86_BUILTIN_CVTSD2SS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V2DF },
21940   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtss2sd, "__builtin_ia32_cvtss2sd", IX86_BUILTIN_CVTSS2SD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V4SF },
21941
21942   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ashlti3, "__builtin_ia32_pslldqi128", IX86_BUILTIN_PSLLDQI128, UNKNOWN, (int) V2DI2TI_FTYPE_V2DI_INT },
21943   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv8hi3, "__builtin_ia32_psllwi128", IX86_BUILTIN_PSLLWI128, UNKNOWN, (int) V8HI_FTYPE_V8HI_SI_COUNT },
21944   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv4si3, "__builtin_ia32_pslldi128", IX86_BUILTIN_PSLLDI128, UNKNOWN, (int) V4SI_FTYPE_V4SI_SI_COUNT },
21945   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv2di3, "__builtin_ia32_psllqi128", IX86_BUILTIN_PSLLQI128, UNKNOWN, (int) V2DI_FTYPE_V2DI_SI_COUNT },
21946   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv8hi3, "__builtin_ia32_psllw128", IX86_BUILTIN_PSLLW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI_COUNT },
21947   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv4si3, "__builtin_ia32_pslld128", IX86_BUILTIN_PSLLD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI_COUNT },
21948   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv2di3, "__builtin_ia32_psllq128", IX86_BUILTIN_PSLLQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_COUNT },
21949
21950   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_lshrti3, "__builtin_ia32_psrldqi128", IX86_BUILTIN_PSRLDQI128, UNKNOWN, (int) V2DI2TI_FTYPE_V2DI_INT },
21951   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv8hi3, "__builtin_ia32_psrlwi128", IX86_BUILTIN_PSRLWI128, UNKNOWN, (int) V8HI_FTYPE_V8HI_SI_COUNT },
21952   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv4si3, "__builtin_ia32_psrldi128", IX86_BUILTIN_PSRLDI128, UNKNOWN, (int) V4SI_FTYPE_V4SI_SI_COUNT },
21953   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv2di3, "__builtin_ia32_psrlqi128", IX86_BUILTIN_PSRLQI128, UNKNOWN, (int) V2DI_FTYPE_V2DI_SI_COUNT },
21954   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv8hi3, "__builtin_ia32_psrlw128", IX86_BUILTIN_PSRLW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI_COUNT },
21955   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv4si3, "__builtin_ia32_psrld128", IX86_BUILTIN_PSRLD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI_COUNT },
21956   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv2di3, "__builtin_ia32_psrlq128", IX86_BUILTIN_PSRLQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_COUNT },
21957
21958   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashrv8hi3, "__builtin_ia32_psrawi128", IX86_BUILTIN_PSRAWI128, UNKNOWN, (int) V8HI_FTYPE_V8HI_SI_COUNT },
21959   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashrv4si3, "__builtin_ia32_psradi128", IX86_BUILTIN_PSRADI128, UNKNOWN, (int) V4SI_FTYPE_V4SI_SI_COUNT },
21960   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashrv8hi3, "__builtin_ia32_psraw128", IX86_BUILTIN_PSRAW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI_COUNT },
21961   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashrv4si3, "__builtin_ia32_psrad128", IX86_BUILTIN_PSRAD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI_COUNT },
21962
21963   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pshufd, "__builtin_ia32_pshufd", IX86_BUILTIN_PSHUFD, UNKNOWN, (int) V4SI_FTYPE_V4SI_INT },
21964   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pshuflw, "__builtin_ia32_pshuflw", IX86_BUILTIN_PSHUFLW, UNKNOWN, (int) V8HI_FTYPE_V8HI_INT },
21965   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pshufhw, "__builtin_ia32_pshufhw", IX86_BUILTIN_PSHUFHW, UNKNOWN, (int) V8HI_FTYPE_V8HI_INT },
21966
21967   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmsqrtv2df2, "__builtin_ia32_sqrtsd", IX86_BUILTIN_SQRTSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_VEC_MERGE },
21968
21969   { OPTION_MASK_ISA_SSE2, CODE_FOR_abstf2, 0, IX86_BUILTIN_FABSQ, UNKNOWN, (int) FLOAT128_FTYPE_FLOAT128 },
21970   { OPTION_MASK_ISA_SSE2, CODE_FOR_copysigntf3, 0, IX86_BUILTIN_COPYSIGNQ, UNKNOWN, (int) FLOAT128_FTYPE_FLOAT128_FLOAT128 },
21971
21972   { OPTION_MASK_ISA_SSE, CODE_FOR_sse2_movq128, "__builtin_ia32_movq128", IX86_BUILTIN_MOVQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI },
21973
21974   /* SSE2 MMX */
21975   { OPTION_MASK_ISA_SSE2, CODE_FOR_mmx_addv1di3, "__builtin_ia32_paddq", IX86_BUILTIN_PADDQ, UNKNOWN, (int) V1DI_FTYPE_V1DI_V1DI },
21976   { OPTION_MASK_ISA_SSE2, CODE_FOR_mmx_subv1di3, "__builtin_ia32_psubq", IX86_BUILTIN_PSUBQ, UNKNOWN, (int) V1DI_FTYPE_V1DI_V1DI },
21977
21978   /* SSE3 */
21979   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_movshdup, "__builtin_ia32_movshdup", IX86_BUILTIN_MOVSHDUP, UNKNOWN, (int) V4SF_FTYPE_V4SF},
21980   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_movsldup, "__builtin_ia32_movsldup", IX86_BUILTIN_MOVSLDUP, UNKNOWN, (int) V4SF_FTYPE_V4SF },
21981
21982   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_addsubv4sf3, "__builtin_ia32_addsubps", IX86_BUILTIN_ADDSUBPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21983   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_addsubv2df3, "__builtin_ia32_addsubpd", IX86_BUILTIN_ADDSUBPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21984   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_haddv4sf3, "__builtin_ia32_haddps", IX86_BUILTIN_HADDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21985   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_haddv2df3, "__builtin_ia32_haddpd", IX86_BUILTIN_HADDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21986   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_hsubv4sf3, "__builtin_ia32_hsubps", IX86_BUILTIN_HSUBPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21987   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_hsubv2df3, "__builtin_ia32_hsubpd", IX86_BUILTIN_HSUBPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21988
21989   /* SSSE3 */
21990   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv16qi2, "__builtin_ia32_pabsb128", IX86_BUILTIN_PABSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI },
21991   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv8qi2, "__builtin_ia32_pabsb", IX86_BUILTIN_PABSB, UNKNOWN, (int) V8QI_FTYPE_V8QI },
21992   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv8hi2, "__builtin_ia32_pabsw128", IX86_BUILTIN_PABSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI },
21993   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv4hi2, "__builtin_ia32_pabsw", IX86_BUILTIN_PABSW, UNKNOWN, (int) V4HI_FTYPE_V4HI },
21994   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv4si2, "__builtin_ia32_pabsd128", IX86_BUILTIN_PABSD128, UNKNOWN, (int) V4SI_FTYPE_V4SI },
21995   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv2si2, "__builtin_ia32_pabsd", IX86_BUILTIN_PABSD, UNKNOWN, (int) V2SI_FTYPE_V2SI },
21996
21997   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phaddwv8hi3, "__builtin_ia32_phaddw128", IX86_BUILTIN_PHADDW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21998   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phaddwv4hi3, "__builtin_ia32_phaddw", IX86_BUILTIN_PHADDW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21999   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phadddv4si3, "__builtin_ia32_phaddd128", IX86_BUILTIN_PHADDD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
22000   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phadddv2si3, "__builtin_ia32_phaddd", IX86_BUILTIN_PHADDD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
22001   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phaddswv8hi3, "__builtin_ia32_phaddsw128", IX86_BUILTIN_PHADDSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
22002   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phaddswv4hi3, "__builtin_ia32_phaddsw", IX86_BUILTIN_PHADDSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
22003   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubwv8hi3, "__builtin_ia32_phsubw128", IX86_BUILTIN_PHSUBW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
22004   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubwv4hi3, "__builtin_ia32_phsubw", IX86_BUILTIN_PHSUBW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
22005   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubdv4si3, "__builtin_ia32_phsubd128", IX86_BUILTIN_PHSUBD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
22006   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubdv2si3, "__builtin_ia32_phsubd", IX86_BUILTIN_PHSUBD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
22007   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubswv8hi3, "__builtin_ia32_phsubsw128", IX86_BUILTIN_PHSUBSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
22008   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubswv4hi3, "__builtin_ia32_phsubsw", IX86_BUILTIN_PHSUBSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
22009   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pmaddubsw128, "__builtin_ia32_pmaddubsw128", IX86_BUILTIN_PMADDUBSW128, UNKNOWN, (int) V8HI_FTYPE_V16QI_V16QI },
22010   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pmaddubsw, "__builtin_ia32_pmaddubsw", IX86_BUILTIN_PMADDUBSW, UNKNOWN, (int) V4HI_FTYPE_V8QI_V8QI },
22011   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pmulhrswv8hi3, "__builtin_ia32_pmulhrsw128", IX86_BUILTIN_PMULHRSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
22012   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pmulhrswv4hi3, "__builtin_ia32_pmulhrsw", IX86_BUILTIN_PMULHRSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
22013   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pshufbv16qi3, "__builtin_ia32_pshufb128", IX86_BUILTIN_PSHUFB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
22014   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pshufbv8qi3, "__builtin_ia32_pshufb", IX86_BUILTIN_PSHUFB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
22015   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv16qi3, "__builtin_ia32_psignb128", IX86_BUILTIN_PSIGNB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
22016   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv8qi3, "__builtin_ia32_psignb", IX86_BUILTIN_PSIGNB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
22017   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv8hi3, "__builtin_ia32_psignw128", IX86_BUILTIN_PSIGNW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
22018   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv4hi3, "__builtin_ia32_psignw", IX86_BUILTIN_PSIGNW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
22019   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv4si3, "__builtin_ia32_psignd128", IX86_BUILTIN_PSIGND128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
22020   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv2si3, "__builtin_ia32_psignd", IX86_BUILTIN_PSIGND, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
22021
22022   /* SSSE3.  */
22023   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_palignrti, "__builtin_ia32_palignr128", IX86_BUILTIN_PALIGNR128, UNKNOWN, (int) V2DI2TI_FTYPE_V2DI_V2DI_INT },
22024   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_palignrdi, "__builtin_ia32_palignr", IX86_BUILTIN_PALIGNR, UNKNOWN, (int) V1DI2DI_FTYPE_V1DI_V1DI_INT },
22025
22026   /* SSE4.1 */
22027   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_blendpd, "__builtin_ia32_blendpd", IX86_BUILTIN_BLENDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
22028   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_blendps, "__builtin_ia32_blendps", IX86_BUILTIN_BLENDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
22029   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_blendvpd, "__builtin_ia32_blendvpd", IX86_BUILTIN_BLENDVPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_V2DF },
22030   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_blendvps, "__builtin_ia32_blendvps", IX86_BUILTIN_BLENDVPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_V4SF },
22031   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_dppd, "__builtin_ia32_dppd", IX86_BUILTIN_DPPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
22032   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_dpps, "__builtin_ia32_dpps", IX86_BUILTIN_DPPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
22033   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_insertps, "__builtin_ia32_insertps128", IX86_BUILTIN_INSERTPS128, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
22034   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_mpsadbw, "__builtin_ia32_mpsadbw128", IX86_BUILTIN_MPSADBW128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI_INT },
22035   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_pblendvb, "__builtin_ia32_pblendvb128", IX86_BUILTIN_PBLENDVB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI_V16QI },
22036   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_pblendw, "__builtin_ia32_pblendw128", IX86_BUILTIN_PBLENDW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI_INT },
22037
22038   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_extendv8qiv8hi2, "__builtin_ia32_pmovsxbw128", IX86_BUILTIN_PMOVSXBW128, UNKNOWN, (int) V8HI_FTYPE_V16QI },
22039   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_extendv4qiv4si2, "__builtin_ia32_pmovsxbd128", IX86_BUILTIN_PMOVSXBD128, UNKNOWN, (int) V4SI_FTYPE_V16QI },
22040   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_extendv2qiv2di2, "__builtin_ia32_pmovsxbq128", IX86_BUILTIN_PMOVSXBQ128, UNKNOWN, (int) V2DI_FTYPE_V16QI },
22041   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_extendv4hiv4si2, "__builtin_ia32_pmovsxwd128", IX86_BUILTIN_PMOVSXWD128, UNKNOWN, (int) V4SI_FTYPE_V8HI },
22042   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_extendv2hiv2di2, "__builtin_ia32_pmovsxwq128", IX86_BUILTIN_PMOVSXWQ128, UNKNOWN, (int) V2DI_FTYPE_V8HI },
22043   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_extendv2siv2di2, "__builtin_ia32_pmovsxdq128", IX86_BUILTIN_PMOVSXDQ128, UNKNOWN, (int) V2DI_FTYPE_V4SI },
22044   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv8qiv8hi2, "__builtin_ia32_pmovzxbw128", IX86_BUILTIN_PMOVZXBW128, UNKNOWN, (int) V8HI_FTYPE_V16QI },
22045   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv4qiv4si2, "__builtin_ia32_pmovzxbd128", IX86_BUILTIN_PMOVZXBD128, UNKNOWN, (int) V4SI_FTYPE_V16QI },
22046   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv2qiv2di2, "__builtin_ia32_pmovzxbq128", IX86_BUILTIN_PMOVZXBQ128, UNKNOWN, (int) V2DI_FTYPE_V16QI },
22047   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv4hiv4si2, "__builtin_ia32_pmovzxwd128", IX86_BUILTIN_PMOVZXWD128, UNKNOWN, (int) V4SI_FTYPE_V8HI },
22048   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv2hiv2di2, "__builtin_ia32_pmovzxwq128", IX86_BUILTIN_PMOVZXWQ128, UNKNOWN, (int) V2DI_FTYPE_V8HI },
22049   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv2siv2di2, "__builtin_ia32_pmovzxdq128", IX86_BUILTIN_PMOVZXDQ128, UNKNOWN, (int) V2DI_FTYPE_V4SI },
22050   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_phminposuw, "__builtin_ia32_phminposuw128", IX86_BUILTIN_PHMINPOSUW128, UNKNOWN, (int) V8HI_FTYPE_V8HI },
22051
22052   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_packusdw, "__builtin_ia32_packusdw128", IX86_BUILTIN_PACKUSDW128, UNKNOWN, (int) V8HI_FTYPE_V4SI_V4SI },
22053   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_eqv2di3, "__builtin_ia32_pcmpeqq", IX86_BUILTIN_PCMPEQQ, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
22054   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_smaxv16qi3, "__builtin_ia32_pmaxsb128", IX86_BUILTIN_PMAXSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
22055   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_smaxv4si3, "__builtin_ia32_pmaxsd128", IX86_BUILTIN_PMAXSD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
22056   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_umaxv4si3, "__builtin_ia32_pmaxud128", IX86_BUILTIN_PMAXUD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
22057   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_umaxv8hi3, "__builtin_ia32_pmaxuw128", IX86_BUILTIN_PMAXUW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
22058   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sminv16qi3, "__builtin_ia32_pminsb128", IX86_BUILTIN_PMINSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
22059   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sminv4si3, "__builtin_ia32_pminsd128", IX86_BUILTIN_PMINSD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
22060   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_uminv4si3, "__builtin_ia32_pminud128", IX86_BUILTIN_PMINUD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
22061   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_uminv8hi3, "__builtin_ia32_pminuw128", IX86_BUILTIN_PMINUW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
22062   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_mulv2siv2di3, "__builtin_ia32_pmuldq128", IX86_BUILTIN_PMULDQ128, UNKNOWN, (int) V2DI_FTYPE_V4SI_V4SI },
22063   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_mulv4si3, "__builtin_ia32_pmulld128", IX86_BUILTIN_PMULLD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
22064
22065   /* SSE4.1 */
22066   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_roundpd, "__builtin_ia32_roundpd", IX86_BUILTIN_ROUNDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_INT },
22067   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_roundps, "__builtin_ia32_roundps", IX86_BUILTIN_ROUNDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_INT },
22068   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_roundsd, "__builtin_ia32_roundsd", IX86_BUILTIN_ROUNDSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
22069   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_roundss, "__builtin_ia32_roundss", IX86_BUILTIN_ROUNDSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
22070
22071   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_ptest, "__builtin_ia32_ptestz128", IX86_BUILTIN_PTESTZ, EQ, (int) INT_FTYPE_V2DI_V2DI_PTEST },
22072   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_ptest, "__builtin_ia32_ptestc128", IX86_BUILTIN_PTESTC, LTU, (int) INT_FTYPE_V2DI_V2DI_PTEST },
22073   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_ptest, "__builtin_ia32_ptestnzc128", IX86_BUILTIN_PTESTNZC, GTU, (int) INT_FTYPE_V2DI_V2DI_PTEST },
22074
22075   /* SSE4.2 */
22076   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_gtv2di3, "__builtin_ia32_pcmpgtq", IX86_BUILTIN_PCMPGTQ, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
22077   { 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 },
22078   { 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 },
22079   { 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 },
22080   { 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 },
22081
22082   /* SSE4A */
22083   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_extrqi, "__builtin_ia32_extrqi", IX86_BUILTIN_EXTRQI, UNKNOWN, (int) V2DI_FTYPE_V2DI_UINT_UINT },
22084   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_extrq, "__builtin_ia32_extrq", IX86_BUILTIN_EXTRQ, UNKNOWN, (int) V2DI_FTYPE_V2DI_V16QI },
22085   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_insertqi, "__builtin_ia32_insertqi", IX86_BUILTIN_INSERTQI, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_UINT_UINT },
22086   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_insertq, "__builtin_ia32_insertq", IX86_BUILTIN_INSERTQ, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
22087
22088   /* AES */
22089   { OPTION_MASK_ISA_SSE2, CODE_FOR_aeskeygenassist, 0, IX86_BUILTIN_AESKEYGENASSIST128, UNKNOWN, (int) V2DI_FTYPE_V2DI_INT },
22090   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesimc, 0, IX86_BUILTIN_AESIMC128, UNKNOWN, (int) V2DI_FTYPE_V2DI },
22091
22092   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesenc, 0, IX86_BUILTIN_AESENC128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
22093   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesenclast, 0, IX86_BUILTIN_AESENCLAST128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
22094   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesdec, 0, IX86_BUILTIN_AESDEC128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
22095   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesdeclast, 0, IX86_BUILTIN_AESDECLAST128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
22096
22097   /* PCLMUL */
22098   { OPTION_MASK_ISA_SSE2, CODE_FOR_pclmulqdq, 0, IX86_BUILTIN_PCLMULQDQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_INT },
22099
22100   /* AVX */
22101   { OPTION_MASK_ISA_AVX, CODE_FOR_addv4df3, "__builtin_ia32_addpd256", IX86_BUILTIN_ADDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
22102   { OPTION_MASK_ISA_AVX, CODE_FOR_addv8sf3, "__builtin_ia32_addps256", IX86_BUILTIN_ADDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
22103   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_addsubv4df3, "__builtin_ia32_addsubpd256", IX86_BUILTIN_ADDSUBPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
22104   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_addsubv8sf3, "__builtin_ia32_addsubps256", IX86_BUILTIN_ADDSUBPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
22105   { OPTION_MASK_ISA_AVX, CODE_FOR_andv4df3, "__builtin_ia32_andpd256", IX86_BUILTIN_ANDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
22106   { OPTION_MASK_ISA_AVX, CODE_FOR_andv8sf3, "__builtin_ia32_andps256", IX86_BUILTIN_ANDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
22107   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_andnotv4df3, "__builtin_ia32_andnpd256", IX86_BUILTIN_ANDNPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
22108   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_andnotv8sf3, "__builtin_ia32_andnps256", IX86_BUILTIN_ANDNPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
22109   { OPTION_MASK_ISA_AVX, CODE_FOR_divv4df3, "__builtin_ia32_divpd256", IX86_BUILTIN_DIVPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
22110   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_divv8sf3, "__builtin_ia32_divps256", IX86_BUILTIN_DIVPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
22111   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_haddv4df3, "__builtin_ia32_haddpd256", IX86_BUILTIN_HADDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
22112   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_hsubv8sf3, "__builtin_ia32_hsubps256", IX86_BUILTIN_HSUBPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
22113   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_hsubv4df3, "__builtin_ia32_hsubpd256", IX86_BUILTIN_HSUBPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
22114   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_haddv8sf3, "__builtin_ia32_haddps256", IX86_BUILTIN_HADDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
22115   { OPTION_MASK_ISA_AVX, CODE_FOR_smaxv4df3, "__builtin_ia32_maxpd256", IX86_BUILTIN_MAXPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
22116   { OPTION_MASK_ISA_AVX, CODE_FOR_smaxv8sf3, "__builtin_ia32_maxps256", IX86_BUILTIN_MAXPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
22117   { OPTION_MASK_ISA_AVX, CODE_FOR_sminv4df3, "__builtin_ia32_minpd256", IX86_BUILTIN_MINPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
22118   { OPTION_MASK_ISA_AVX, CODE_FOR_sminv8sf3, "__builtin_ia32_minps256", IX86_BUILTIN_MINPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
22119   { OPTION_MASK_ISA_AVX, CODE_FOR_mulv4df3, "__builtin_ia32_mulpd256", IX86_BUILTIN_MULPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
22120   { OPTION_MASK_ISA_AVX, CODE_FOR_mulv8sf3, "__builtin_ia32_mulps256", IX86_BUILTIN_MULPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
22121   { OPTION_MASK_ISA_AVX, CODE_FOR_iorv4df3, "__builtin_ia32_orpd256", IX86_BUILTIN_ORPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
22122   { OPTION_MASK_ISA_AVX, CODE_FOR_iorv8sf3, "__builtin_ia32_orps256", IX86_BUILTIN_ORPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
22123   { OPTION_MASK_ISA_AVX, CODE_FOR_subv4df3, "__builtin_ia32_subpd256", IX86_BUILTIN_SUBPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
22124   { OPTION_MASK_ISA_AVX, CODE_FOR_subv8sf3, "__builtin_ia32_subps256", IX86_BUILTIN_SUBPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
22125   { OPTION_MASK_ISA_AVX, CODE_FOR_xorv4df3, "__builtin_ia32_xorpd256", IX86_BUILTIN_XORPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
22126   { OPTION_MASK_ISA_AVX, CODE_FOR_xorv8sf3, "__builtin_ia32_xorps256", IX86_BUILTIN_XORPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
22127
22128   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilvarv2df3, "__builtin_ia32_vpermilvarpd", IX86_BUILTIN_VPERMILVARPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DI },
22129   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilvarv4sf3, "__builtin_ia32_vpermilvarps", IX86_BUILTIN_VPERMILVARPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SI },
22130   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilvarv4df3, "__builtin_ia32_vpermilvarpd256", IX86_BUILTIN_VPERMILVARPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DI },
22131   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilvarv8sf3, "__builtin_ia32_vpermilvarps256", IX86_BUILTIN_VPERMILVARPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SI },
22132
22133   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_blendpd256, "__builtin_ia32_blendpd256", IX86_BUILTIN_BLENDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_INT },
22134   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_blendps256, "__builtin_ia32_blendps256", IX86_BUILTIN_BLENDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
22135   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_blendvpd256, "__builtin_ia32_blendvpd256", IX86_BUILTIN_BLENDVPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_V4DF },
22136   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_blendvps256, "__builtin_ia32_blendvps256", IX86_BUILTIN_BLENDVPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_V8SF },
22137   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_dpps256, "__builtin_ia32_dpps256", IX86_BUILTIN_DPPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
22138   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_shufpd256, "__builtin_ia32_shufpd256", IX86_BUILTIN_SHUFPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_INT },
22139   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_shufps256, "__builtin_ia32_shufps256", IX86_BUILTIN_SHUFPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
22140   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmpsdv2df3, "__builtin_ia32_cmpsd", IX86_BUILTIN_CMPSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
22141   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmpssv4sf3, "__builtin_ia32_cmpss", IX86_BUILTIN_CMPSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
22142   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmppdv2df3, "__builtin_ia32_cmppd", IX86_BUILTIN_CMPPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
22143   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmppsv4sf3, "__builtin_ia32_cmpps", IX86_BUILTIN_CMPPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
22144   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmppdv4df3, "__builtin_ia32_cmppd256", IX86_BUILTIN_CMPPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_INT },
22145   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmppsv8sf3, "__builtin_ia32_cmpps256", IX86_BUILTIN_CMPPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
22146   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vextractf128v4df, "__builtin_ia32_vextractf128_pd256", IX86_BUILTIN_EXTRACTF128PD256, UNKNOWN, (int) V2DF_FTYPE_V4DF_INT },
22147   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vextractf128v8sf, "__builtin_ia32_vextractf128_ps256", IX86_BUILTIN_EXTRACTF128PS256, UNKNOWN, (int) V4SF_FTYPE_V8SF_INT },
22148   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vextractf128v8si, "__builtin_ia32_vextractf128_si256", IX86_BUILTIN_EXTRACTF128SI256, UNKNOWN, (int) V4SI_FTYPE_V8SI_INT },
22149   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtdq2pd256, "__builtin_ia32_cvtdq2pd256", IX86_BUILTIN_CVTDQ2PD256, UNKNOWN, (int) V4DF_FTYPE_V4SI },
22150   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtdq2ps256, "__builtin_ia32_cvtdq2ps256", IX86_BUILTIN_CVTDQ2PS256, UNKNOWN, (int) V8SF_FTYPE_V8SI },
22151   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtpd2ps256, "__builtin_ia32_cvtpd2ps256", IX86_BUILTIN_CVTPD2PS256, UNKNOWN, (int) V4SF_FTYPE_V4DF },
22152   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtps2dq256, "__builtin_ia32_cvtps2dq256", IX86_BUILTIN_CVTPS2DQ256, UNKNOWN, (int) V8SI_FTYPE_V8SF },
22153   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtps2pd256, "__builtin_ia32_cvtps2pd256", IX86_BUILTIN_CVTPS2PD256, UNKNOWN, (int) V4DF_FTYPE_V4SF },
22154   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvttpd2dq256, "__builtin_ia32_cvttpd2dq256", IX86_BUILTIN_CVTTPD2DQ256, UNKNOWN, (int) V4SI_FTYPE_V4DF },
22155   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtpd2dq256, "__builtin_ia32_cvtpd2dq256", IX86_BUILTIN_CVTPD2DQ256, UNKNOWN, (int) V4SI_FTYPE_V4DF },
22156   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvttps2dq256, "__builtin_ia32_cvttps2dq256", IX86_BUILTIN_CVTTPS2DQ256, UNKNOWN, (int) V8SI_FTYPE_V8SF },
22157   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vperm2f128v4df3, "__builtin_ia32_vperm2f128_pd256", IX86_BUILTIN_VPERM2F128PD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_INT },
22158   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vperm2f128v8sf3, "__builtin_ia32_vperm2f128_ps256", IX86_BUILTIN_VPERM2F128PS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
22159   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vperm2f128v8si3, "__builtin_ia32_vperm2f128_si256", IX86_BUILTIN_VPERM2F128SI256, UNKNOWN, (int) V8SI_FTYPE_V8SI_V8SI_INT },
22160   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilv2df, "__builtin_ia32_vpermilpd", IX86_BUILTIN_VPERMILPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_INT },
22161   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilv4sf, "__builtin_ia32_vpermilps", IX86_BUILTIN_VPERMILPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_INT },
22162   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilv4df, "__builtin_ia32_vpermilpd256", IX86_BUILTIN_VPERMILPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_INT },
22163   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilv8sf, "__builtin_ia32_vpermilps256", IX86_BUILTIN_VPERMILPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_INT },
22164   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vinsertf128v4df, "__builtin_ia32_vinsertf128_pd256", IX86_BUILTIN_VINSERTF128PD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V2DF_INT },
22165   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vinsertf128v8sf, "__builtin_ia32_vinsertf128_ps256", IX86_BUILTIN_VINSERTF128PS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V4SF_INT },
22166   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vinsertf128v8si, "__builtin_ia32_vinsertf128_si256", IX86_BUILTIN_VINSERTF128SI256, UNKNOWN, (int) V8SI_FTYPE_V8SI_V4SI_INT },
22167
22168   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movshdup256, "__builtin_ia32_movshdup256", IX86_BUILTIN_MOVSHDUP256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
22169   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movsldup256, "__builtin_ia32_movsldup256", IX86_BUILTIN_MOVSLDUP256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
22170   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movddup256, "__builtin_ia32_movddup256", IX86_BUILTIN_MOVDDUP256, UNKNOWN, (int) V4DF_FTYPE_V4DF },
22171
22172   { OPTION_MASK_ISA_AVX, CODE_FOR_sqrtv4df2, "__builtin_ia32_sqrtpd256", IX86_BUILTIN_SQRTPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF },
22173   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_sqrtv8sf2, "__builtin_ia32_sqrtps256", IX86_BUILTIN_SQRTPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
22174   { OPTION_MASK_ISA_AVX, CODE_FOR_sqrtv8sf2, "__builtin_ia32_sqrtps_nr256", IX86_BUILTIN_SQRTPS_NR256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
22175   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_rsqrtv8sf2, "__builtin_ia32_rsqrtps256", IX86_BUILTIN_RSQRTPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
22176   { OPTION_MASK_ISA_AVX, CODE_FOR_rsqrtv8sf2, "__builtin_ia32_rsqrtps_nr256", IX86_BUILTIN_RSQRTPS_NR256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
22177
22178   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_rcpv8sf2, "__builtin_ia32_rcpps256", IX86_BUILTIN_RCPPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
22179
22180   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_roundpd256, "__builtin_ia32_roundpd256", IX86_BUILTIN_ROUNDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_INT },
22181   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_roundps256, "__builtin_ia32_roundps256", IX86_BUILTIN_ROUNDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_INT },
22182
22183   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_unpckhpd256,  "__builtin_ia32_unpckhpd256", IX86_BUILTIN_UNPCKHPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
22184   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_unpcklpd256,  "__builtin_ia32_unpcklpd256", IX86_BUILTIN_UNPCKLPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
22185   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_unpckhps256,  "__builtin_ia32_unpckhps256", IX86_BUILTIN_UNPCKHPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
22186   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_unpcklps256,  "__builtin_ia32_unpcklps256", IX86_BUILTIN_UNPCKLPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
22187
22188   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_si256_si, "__builtin_ia32_si256_si", IX86_BUILTIN_SI256_SI, UNKNOWN, (int) V8SI_FTYPE_V4SI },
22189   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_ps256_ps, "__builtin_ia32_ps256_ps", IX86_BUILTIN_PS256_PS, UNKNOWN, (int) V8SF_FTYPE_V4SF },
22190   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_pd256_pd, "__builtin_ia32_pd256_pd", IX86_BUILTIN_PD256_PD, UNKNOWN, (int) V4DF_FTYPE_V2DF },
22191   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_si_si256, "__builtin_ia32_si_si256", IX86_BUILTIN_SI_SI256, UNKNOWN, (int) V4SI_FTYPE_V8SI },
22192   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_ps_ps256, "__builtin_ia32_ps_ps256", IX86_BUILTIN_PS_PS256, UNKNOWN, (int) V4SF_FTYPE_V8SF },
22193   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_pd_pd256, "__builtin_ia32_pd_pd256", IX86_BUILTIN_PD_PD256, UNKNOWN, (int) V2DF_FTYPE_V4DF },
22194
22195   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd, "__builtin_ia32_vtestzpd", IX86_BUILTIN_VTESTZPD, EQ, (int) INT_FTYPE_V2DF_V2DF_PTEST },
22196   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd, "__builtin_ia32_vtestcpd", IX86_BUILTIN_VTESTCPD, LTU, (int) INT_FTYPE_V2DF_V2DF_PTEST },
22197   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd, "__builtin_ia32_vtestnzcpd", IX86_BUILTIN_VTESTNZCPD, GTU, (int) INT_FTYPE_V2DF_V2DF_PTEST },
22198   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps, "__builtin_ia32_vtestzps", IX86_BUILTIN_VTESTZPS, EQ, (int) INT_FTYPE_V4SF_V4SF_PTEST },
22199   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps, "__builtin_ia32_vtestcps", IX86_BUILTIN_VTESTCPS, LTU, (int) INT_FTYPE_V4SF_V4SF_PTEST },
22200   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps, "__builtin_ia32_vtestnzcps", IX86_BUILTIN_VTESTNZCPS, GTU, (int) INT_FTYPE_V4SF_V4SF_PTEST },
22201   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd256, "__builtin_ia32_vtestzpd256", IX86_BUILTIN_VTESTZPD256, EQ, (int) INT_FTYPE_V4DF_V4DF_PTEST },
22202   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd256, "__builtin_ia32_vtestcpd256", IX86_BUILTIN_VTESTCPD256, LTU, (int) INT_FTYPE_V4DF_V4DF_PTEST },
22203   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd256, "__builtin_ia32_vtestnzcpd256", IX86_BUILTIN_VTESTNZCPD256, GTU, (int) INT_FTYPE_V4DF_V4DF_PTEST },
22204   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps256, "__builtin_ia32_vtestzps256", IX86_BUILTIN_VTESTZPS256, EQ, (int) INT_FTYPE_V8SF_V8SF_PTEST },
22205   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps256, "__builtin_ia32_vtestcps256", IX86_BUILTIN_VTESTCPS256, LTU, (int) INT_FTYPE_V8SF_V8SF_PTEST },
22206   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps256, "__builtin_ia32_vtestnzcps256", IX86_BUILTIN_VTESTNZCPS256, GTU, (int) INT_FTYPE_V8SF_V8SF_PTEST },
22207   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_ptest256, "__builtin_ia32_ptestz256", IX86_BUILTIN_PTESTZ256, EQ, (int) INT_FTYPE_V4DI_V4DI_PTEST },
22208   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_ptest256, "__builtin_ia32_ptestc256", IX86_BUILTIN_PTESTC256, LTU, (int) INT_FTYPE_V4DI_V4DI_PTEST },
22209   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_ptest256, "__builtin_ia32_ptestnzc256", IX86_BUILTIN_PTESTNZC256, GTU, (int) INT_FTYPE_V4DI_V4DI_PTEST },
22210
22211   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movmskpd256, "__builtin_ia32_movmskpd256", IX86_BUILTIN_MOVMSKPD256, UNKNOWN, (int) INT_FTYPE_V4DF  },
22212   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movmskps256, "__builtin_ia32_movmskps256", IX86_BUILTIN_MOVMSKPS256, UNKNOWN, (int) INT_FTYPE_V8SF },
22213 };
22214
22215 /* FMA4 and XOP.  */
22216 enum multi_arg_type {
22217   MULTI_ARG_UNKNOWN,
22218   MULTI_ARG_3_SF,
22219   MULTI_ARG_3_DF,
22220   MULTI_ARG_3_SF2,
22221   MULTI_ARG_3_DF2,
22222   MULTI_ARG_3_DI,
22223   MULTI_ARG_3_SI,
22224   MULTI_ARG_3_SI_DI,
22225   MULTI_ARG_3_HI,
22226   MULTI_ARG_3_HI_SI,
22227   MULTI_ARG_3_QI,
22228   MULTI_ARG_3_DI2,
22229   MULTI_ARG_3_SI2,
22230   MULTI_ARG_3_HI2,
22231   MULTI_ARG_3_QI2,
22232   MULTI_ARG_2_SF,
22233   MULTI_ARG_2_DF,
22234   MULTI_ARG_2_DI,
22235   MULTI_ARG_2_SI,
22236   MULTI_ARG_2_HI,
22237   MULTI_ARG_2_QI,
22238   MULTI_ARG_2_DI_IMM,
22239   MULTI_ARG_2_SI_IMM,
22240   MULTI_ARG_2_HI_IMM,
22241   MULTI_ARG_2_QI_IMM,
22242   MULTI_ARG_2_DI_CMP,
22243   MULTI_ARG_2_SI_CMP,
22244   MULTI_ARG_2_HI_CMP,
22245   MULTI_ARG_2_QI_CMP,
22246   MULTI_ARG_2_DI_TF,
22247   MULTI_ARG_2_SI_TF,
22248   MULTI_ARG_2_HI_TF,
22249   MULTI_ARG_2_QI_TF,
22250   MULTI_ARG_2_SF_TF,
22251   MULTI_ARG_2_DF_TF,
22252   MULTI_ARG_1_SF,
22253   MULTI_ARG_1_DF,
22254   MULTI_ARG_1_SF2,
22255   MULTI_ARG_1_DF2,
22256   MULTI_ARG_1_DI,
22257   MULTI_ARG_1_SI,
22258   MULTI_ARG_1_HI,
22259   MULTI_ARG_1_QI,
22260   MULTI_ARG_1_SI_DI,
22261   MULTI_ARG_1_HI_DI,
22262   MULTI_ARG_1_HI_SI,
22263   MULTI_ARG_1_QI_DI,
22264   MULTI_ARG_1_QI_SI,
22265   MULTI_ARG_1_QI_HI
22266
22267 };
22268
22269 static const struct builtin_description bdesc_multi_arg[] =
22270 {
22271   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_vmfmaddv4sf4,     "__builtin_ia32_vfmaddss",    IX86_BUILTIN_VFMADDSS,    UNKNOWN,      (int)MULTI_ARG_3_SF },
22272   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_vmfmaddv2df4,     "__builtin_ia32_vfmaddsd",    IX86_BUILTIN_VFMADDSD,    UNKNOWN,      (int)MULTI_ARG_3_DF },
22273   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fmaddv4sf4,       "__builtin_ia32_vfmaddps",    IX86_BUILTIN_VFMADDPS,    UNKNOWN,      (int)MULTI_ARG_3_SF },
22274   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fmaddv2df4,       "__builtin_ia32_vfmaddpd",    IX86_BUILTIN_VFMADDPD,    UNKNOWN,      (int)MULTI_ARG_3_DF },
22275   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_vmfmsubv4sf4,     "__builtin_ia32_vfmsubss",    IX86_BUILTIN_VFMSUBSS,    UNKNOWN,      (int)MULTI_ARG_3_SF },
22276   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_vmfmsubv2df4,     "__builtin_ia32_vfmsubsd",    IX86_BUILTIN_VFMSUBSD,    UNKNOWN,      (int)MULTI_ARG_3_DF },
22277   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fmsubv4sf4,       "__builtin_ia32_vfmsubps",    IX86_BUILTIN_VFMSUBPS,    UNKNOWN,      (int)MULTI_ARG_3_SF },
22278   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fmsubv2df4,       "__builtin_ia32_vfmsubpd",    IX86_BUILTIN_VFMSUBPD,    UNKNOWN,      (int)MULTI_ARG_3_DF },
22279     
22280   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_vmfnmaddv4sf4,    "__builtin_ia32_vfnmaddss",   IX86_BUILTIN_VFNMADDSS,   UNKNOWN,      (int)MULTI_ARG_3_SF },
22281   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_vmfnmaddv2df4,    "__builtin_ia32_vfnmaddsd",   IX86_BUILTIN_VFNMADDSD,   UNKNOWN,      (int)MULTI_ARG_3_DF },
22282   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fnmaddv4sf4,      "__builtin_ia32_vfnmaddps",   IX86_BUILTIN_VFNMADDPS,   UNKNOWN,      (int)MULTI_ARG_3_SF },
22283   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fnmaddv2df4,      "__builtin_ia32_vfnmaddpd",   IX86_BUILTIN_VFNMADDPD,   UNKNOWN,      (int)MULTI_ARG_3_DF },
22284   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_vmfnmsubv4sf4,    "__builtin_ia32_vfnmsubss",   IX86_BUILTIN_VFNMSUBSS,   UNKNOWN,      (int)MULTI_ARG_3_SF },
22285   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_vmfnmsubv2df4,    "__builtin_ia32_vfnmsubsd",   IX86_BUILTIN_VFNMSUBSD,   UNKNOWN,      (int)MULTI_ARG_3_DF },
22286   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fnmsubv4sf4,      "__builtin_ia32_vfnmsubps",   IX86_BUILTIN_VFNMSUBPS,   UNKNOWN,      (int)MULTI_ARG_3_SF },
22287   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fnmsubv2df4,      "__builtin_ia32_vfnmsubpd",   IX86_BUILTIN_VFNMSUBPD,   UNKNOWN,      (int)MULTI_ARG_3_DF },
22288
22289   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fmaddsubv4sf4,    "__builtin_ia32_vfmaddsubps", IX86_BUILTIN_VFMADDSUBPS,    UNKNOWN,      (int)MULTI_ARG_3_SF },
22290   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fmaddsubv2df4,    "__builtin_ia32_vfmaddsubpd", IX86_BUILTIN_VFMADDSUBPD,    UNKNOWN,      (int)MULTI_ARG_3_DF },
22291   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fmsubaddv4sf4,    "__builtin_ia32_vfmsubaddps", IX86_BUILTIN_VFMSUBADDPS,    UNKNOWN,      (int)MULTI_ARG_3_SF },
22292   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fmsubaddv2df4,    "__builtin_ia32_vfmsubaddpd", IX86_BUILTIN_VFMSUBADDPD,    UNKNOWN,      (int)MULTI_ARG_3_DF },
22293
22294   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fmaddv8sf4256,       "__builtin_ia32_vfmaddps256",    IX86_BUILTIN_VFMADDPS256,    UNKNOWN,      (int)MULTI_ARG_3_SF2 },
22295   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fmaddv4df4256,       "__builtin_ia32_vfmaddpd256",    IX86_BUILTIN_VFMADDPD256,    UNKNOWN,      (int)MULTI_ARG_3_DF2 },
22296   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fmsubv8sf4256,       "__builtin_ia32_vfmsubps256",    IX86_BUILTIN_VFMSUBPS256,    UNKNOWN,      (int)MULTI_ARG_3_SF2 },
22297   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fmsubv4df4256,       "__builtin_ia32_vfmsubpd256",    IX86_BUILTIN_VFMSUBPD256,    UNKNOWN,      (int)MULTI_ARG_3_DF2 },
22298   
22299   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fnmaddv8sf4256,      "__builtin_ia32_vfnmaddps256",   IX86_BUILTIN_VFNMADDPS256,   UNKNOWN,      (int)MULTI_ARG_3_SF2 },
22300   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fnmaddv4df4256,      "__builtin_ia32_vfnmaddpd256",   IX86_BUILTIN_VFNMADDPD256,   UNKNOWN,      (int)MULTI_ARG_3_DF2 },
22301   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fnmsubv8sf4256,      "__builtin_ia32_vfnmsubps256",   IX86_BUILTIN_VFNMSUBPS256,   UNKNOWN,      (int)MULTI_ARG_3_SF2 },
22302   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fnmsubv4df4256,      "__builtin_ia32_vfnmsubpd256",   IX86_BUILTIN_VFNMSUBPD256,   UNKNOWN,      (int)MULTI_ARG_3_DF2 },
22303
22304   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fmaddsubv8sf4,    "__builtin_ia32_vfmaddsubps256", IX86_BUILTIN_VFMADDSUBPS256,    UNKNOWN,      (int)MULTI_ARG_3_SF2 },
22305   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fmaddsubv4df4,    "__builtin_ia32_vfmaddsubpd256", IX86_BUILTIN_VFMADDSUBPD256,    UNKNOWN,      (int)MULTI_ARG_3_DF2 },
22306   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fmsubaddv8sf4,    "__builtin_ia32_vfmsubaddps256", IX86_BUILTIN_VFMSUBADDPS256,    UNKNOWN,      (int)MULTI_ARG_3_SF2 },
22307   { OPTION_MASK_ISA_FMA4, CODE_FOR_fma4i_fmsubaddv4df4,    "__builtin_ia32_vfmsubaddpd256", IX86_BUILTIN_VFMSUBADDPD256,    UNKNOWN,      (int)MULTI_ARG_3_DF2 },
22308
22309   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v2di,        "__builtin_ia32_vpcmov",      IX86_BUILTIN_VPCMOV,      UNKNOWN,      (int)MULTI_ARG_3_DI },
22310   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v2di,        "__builtin_ia32_vpcmov_v2di", IX86_BUILTIN_VPCMOV_V2DI, UNKNOWN,      (int)MULTI_ARG_3_DI },
22311   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v4si,        "__builtin_ia32_vpcmov_v4si", IX86_BUILTIN_VPCMOV_V4SI, UNKNOWN,      (int)MULTI_ARG_3_SI },
22312   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v8hi,        "__builtin_ia32_vpcmov_v8hi", IX86_BUILTIN_VPCMOV_V8HI, UNKNOWN,      (int)MULTI_ARG_3_HI },
22313   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v16qi,       "__builtin_ia32_vpcmov_v16qi",IX86_BUILTIN_VPCMOV_V16QI,UNKNOWN,      (int)MULTI_ARG_3_QI },
22314   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v2df,        "__builtin_ia32_vpcmov_v2df", IX86_BUILTIN_VPCMOV_V2DF, UNKNOWN,      (int)MULTI_ARG_3_DF },
22315   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v4sf,        "__builtin_ia32_vpcmov_v4sf", IX86_BUILTIN_VPCMOV_V4SF, UNKNOWN,      (int)MULTI_ARG_3_SF },
22316
22317   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v4di256,        "__builtin_ia32_vpcmov256",       IX86_BUILTIN_VPCMOV256,       UNKNOWN,      (int)MULTI_ARG_3_DI2 },
22318   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v4di256,        "__builtin_ia32_vpcmov_v4di256",  IX86_BUILTIN_VPCMOV_V4DI256,  UNKNOWN,      (int)MULTI_ARG_3_DI2 },
22319   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v8si256,        "__builtin_ia32_vpcmov_v8si256",  IX86_BUILTIN_VPCMOV_V8SI256,  UNKNOWN,      (int)MULTI_ARG_3_SI2 },
22320   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v16hi256,       "__builtin_ia32_vpcmov_v16hi256", IX86_BUILTIN_VPCMOV_V16HI256, UNKNOWN,      (int)MULTI_ARG_3_HI2 },
22321   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v32qi256,       "__builtin_ia32_vpcmov_v32qi256", IX86_BUILTIN_VPCMOV_V32QI256, UNKNOWN,      (int)MULTI_ARG_3_QI2 },
22322   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v4df256,        "__builtin_ia32_vpcmov_v4df256",  IX86_BUILTIN_VPCMOV_V4DF256,  UNKNOWN,      (int)MULTI_ARG_3_DF2 },
22323   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pcmov_v8sf256,        "__builtin_ia32_vpcmov_v8sf256",  IX86_BUILTIN_VPCMOV_V8SF256,  UNKNOWN,      (int)MULTI_ARG_3_SF2 },
22324
22325   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pperm,             "__builtin_ia32_vpperm",      IX86_BUILTIN_VPPERM,      UNKNOWN,      (int)MULTI_ARG_3_QI },
22326
22327   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacssww,          "__builtin_ia32_vpmacssww",   IX86_BUILTIN_VPMACSSWW,   UNKNOWN,      (int)MULTI_ARG_3_HI },
22328   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacsww,           "__builtin_ia32_vpmacsww",    IX86_BUILTIN_VPMACSWW,    UNKNOWN,      (int)MULTI_ARG_3_HI },
22329   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacsswd,          "__builtin_ia32_vpmacsswd",   IX86_BUILTIN_VPMACSSWD,   UNKNOWN,      (int)MULTI_ARG_3_HI_SI },
22330   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacswd,           "__builtin_ia32_vpmacswd",    IX86_BUILTIN_VPMACSWD,    UNKNOWN,      (int)MULTI_ARG_3_HI_SI },
22331   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacssdd,          "__builtin_ia32_vpmacssdd",   IX86_BUILTIN_VPMACSSDD,   UNKNOWN,      (int)MULTI_ARG_3_SI },
22332   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacsdd,           "__builtin_ia32_vpmacsdd",    IX86_BUILTIN_VPMACSDD,    UNKNOWN,      (int)MULTI_ARG_3_SI },
22333   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacssdql,         "__builtin_ia32_vpmacssdql",  IX86_BUILTIN_VPMACSSDQL,  UNKNOWN,      (int)MULTI_ARG_3_SI_DI },
22334   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacssdqh,         "__builtin_ia32_vpmacssdqh",  IX86_BUILTIN_VPMACSSDQH,  UNKNOWN,      (int)MULTI_ARG_3_SI_DI },
22335   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacsdql,          "__builtin_ia32_vpmacsdql",   IX86_BUILTIN_VPMACSDQL,   UNKNOWN,      (int)MULTI_ARG_3_SI_DI },
22336   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmacsdqh,          "__builtin_ia32_vpmacsdqh",   IX86_BUILTIN_VPMACSDQH,   UNKNOWN,      (int)MULTI_ARG_3_SI_DI },
22337   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmadcsswd,         "__builtin_ia32_vpmadcsswd",  IX86_BUILTIN_VPMADCSSWD,  UNKNOWN,      (int)MULTI_ARG_3_HI_SI },
22338   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_pmadcswd,          "__builtin_ia32_vpmadcswd",   IX86_BUILTIN_VPMADCSWD,   UNKNOWN,      (int)MULTI_ARG_3_HI_SI },
22339
22340   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_vrotlv2di3,        "__builtin_ia32_vprotq",      IX86_BUILTIN_VPROTQ,      UNKNOWN,      (int)MULTI_ARG_2_DI },
22341   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_vrotlv4si3,        "__builtin_ia32_vprotd",      IX86_BUILTIN_VPROTD,      UNKNOWN,      (int)MULTI_ARG_2_SI },
22342   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_vrotlv8hi3,        "__builtin_ia32_vprotw",      IX86_BUILTIN_VPROTW,      UNKNOWN,      (int)MULTI_ARG_2_HI },
22343   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_vrotlv16qi3,       "__builtin_ia32_vprotb",      IX86_BUILTIN_VPROTB,      UNKNOWN,      (int)MULTI_ARG_2_QI },
22344   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_rotlv2di3,         "__builtin_ia32_vprotqi",     IX86_BUILTIN_VPROTQ_IMM,  UNKNOWN,      (int)MULTI_ARG_2_DI_IMM },
22345   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_rotlv4si3,         "__builtin_ia32_vprotdi",     IX86_BUILTIN_VPROTD_IMM,  UNKNOWN,      (int)MULTI_ARG_2_SI_IMM },
22346   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_rotlv8hi3,         "__builtin_ia32_vprotwi",     IX86_BUILTIN_VPROTW_IMM,  UNKNOWN,      (int)MULTI_ARG_2_HI_IMM },
22347   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_rotlv16qi3,        "__builtin_ia32_vprotbi",     IX86_BUILTIN_VPROTB_IMM,  UNKNOWN,      (int)MULTI_ARG_2_QI_IMM },
22348   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_ashlv2di3,         "__builtin_ia32_vpshaq",      IX86_BUILTIN_VPSHAQ,      UNKNOWN,      (int)MULTI_ARG_2_DI },
22349   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_ashlv4si3,         "__builtin_ia32_vpshad",      IX86_BUILTIN_VPSHAD,      UNKNOWN,      (int)MULTI_ARG_2_SI },
22350   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_ashlv8hi3,         "__builtin_ia32_vpshaw",      IX86_BUILTIN_VPSHAW,      UNKNOWN,      (int)MULTI_ARG_2_HI },
22351   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_ashlv16qi3,        "__builtin_ia32_vpshab",      IX86_BUILTIN_VPSHAB,      UNKNOWN,      (int)MULTI_ARG_2_QI },
22352   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_lshlv2di3,         "__builtin_ia32_vpshlq",      IX86_BUILTIN_VPSHLQ,      UNKNOWN,      (int)MULTI_ARG_2_DI },
22353   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_lshlv4si3,         "__builtin_ia32_vpshld",      IX86_BUILTIN_VPSHLD,      UNKNOWN,      (int)MULTI_ARG_2_SI },
22354   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_lshlv8hi3,         "__builtin_ia32_vpshlw",      IX86_BUILTIN_VPSHLW,      UNKNOWN,      (int)MULTI_ARG_2_HI },
22355   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_lshlv16qi3,        "__builtin_ia32_vpshlb",      IX86_BUILTIN_VPSHLB,      UNKNOWN,      (int)MULTI_ARG_2_QI },
22356
22357   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_vmfrczv4sf2,       "__builtin_ia32_vfrczss",     IX86_BUILTIN_VFRCZSS,     UNKNOWN,      (int)MULTI_ARG_2_SF },
22358   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_vmfrczv2df2,       "__builtin_ia32_vfrczsd",     IX86_BUILTIN_VFRCZSD,     UNKNOWN,      (int)MULTI_ARG_2_DF },
22359   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_frczv4sf2,         "__builtin_ia32_vfrczps",     IX86_BUILTIN_VFRCZPS,     UNKNOWN,      (int)MULTI_ARG_1_SF },
22360   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_frczv2df2,         "__builtin_ia32_vfrczpd",     IX86_BUILTIN_VFRCZPD,     UNKNOWN,      (int)MULTI_ARG_1_DF },
22361   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_frczv8sf2256,         "__builtin_ia32_vfrczps256",  IX86_BUILTIN_VFRCZPS256,  UNKNOWN,      (int)MULTI_ARG_1_SF2 },
22362   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_frczv4df2256,         "__builtin_ia32_vfrczpd256",  IX86_BUILTIN_VFRCZPD256,  UNKNOWN,      (int)MULTI_ARG_1_DF2 },
22363
22364   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddbw,           "__builtin_ia32_vphaddbw",    IX86_BUILTIN_VPHADDBW,    UNKNOWN,      (int)MULTI_ARG_1_QI_HI },
22365   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddbd,           "__builtin_ia32_vphaddbd",    IX86_BUILTIN_VPHADDBD,    UNKNOWN,      (int)MULTI_ARG_1_QI_SI },
22366   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddbq,           "__builtin_ia32_vphaddbq",    IX86_BUILTIN_VPHADDBQ,    UNKNOWN,      (int)MULTI_ARG_1_QI_DI },
22367   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddwd,           "__builtin_ia32_vphaddwd",    IX86_BUILTIN_VPHADDWD,    UNKNOWN,      (int)MULTI_ARG_1_HI_SI },
22368   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddwq,           "__builtin_ia32_vphaddwq",    IX86_BUILTIN_VPHADDWQ,    UNKNOWN,      (int)MULTI_ARG_1_HI_DI },
22369   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phadddq,           "__builtin_ia32_vphadddq",    IX86_BUILTIN_VPHADDDQ,    UNKNOWN,      (int)MULTI_ARG_1_SI_DI },
22370   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddubw,          "__builtin_ia32_vphaddubw",   IX86_BUILTIN_VPHADDUBW,   UNKNOWN,      (int)MULTI_ARG_1_QI_HI },
22371   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddubd,          "__builtin_ia32_vphaddubd",   IX86_BUILTIN_VPHADDUBD,   UNKNOWN,      (int)MULTI_ARG_1_QI_SI },
22372   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddubq,          "__builtin_ia32_vphaddubq",   IX86_BUILTIN_VPHADDUBQ,   UNKNOWN,      (int)MULTI_ARG_1_QI_DI },
22373   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phadduwd,          "__builtin_ia32_vphadduwd",   IX86_BUILTIN_VPHADDUWD,   UNKNOWN,      (int)MULTI_ARG_1_HI_SI },
22374   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phadduwq,          "__builtin_ia32_vphadduwq",   IX86_BUILTIN_VPHADDUWQ,   UNKNOWN,      (int)MULTI_ARG_1_HI_DI },
22375   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phaddudq,          "__builtin_ia32_vphaddudq",   IX86_BUILTIN_VPHADDUDQ,   UNKNOWN,      (int)MULTI_ARG_1_SI_DI },
22376   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phsubbw,           "__builtin_ia32_vphsubbw",    IX86_BUILTIN_VPHSUBBW,    UNKNOWN,      (int)MULTI_ARG_1_QI_HI },
22377   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phsubwd,           "__builtin_ia32_vphsubwd",    IX86_BUILTIN_VPHSUBWD,    UNKNOWN,      (int)MULTI_ARG_1_HI_SI },
22378   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_phsubdq,           "__builtin_ia32_vphsubdq",    IX86_BUILTIN_VPHSUBDQ,    UNKNOWN,      (int)MULTI_ARG_1_SI_DI },
22379
22380   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv16qi3,     "__builtin_ia32_vpcomeqb",    IX86_BUILTIN_VPCOMEQB,    EQ,           (int)MULTI_ARG_2_QI_CMP },
22381   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv16qi3,     "__builtin_ia32_vpcomneb",    IX86_BUILTIN_VPCOMNEB,    NE,           (int)MULTI_ARG_2_QI_CMP },
22382   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv16qi3,     "__builtin_ia32_vpcomneqb",   IX86_BUILTIN_VPCOMNEB,    NE,           (int)MULTI_ARG_2_QI_CMP },
22383   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv16qi3,     "__builtin_ia32_vpcomltb",    IX86_BUILTIN_VPCOMLTB,    LT,           (int)MULTI_ARG_2_QI_CMP },
22384   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv16qi3,     "__builtin_ia32_vpcomleb",    IX86_BUILTIN_VPCOMLEB,    LE,           (int)MULTI_ARG_2_QI_CMP },
22385   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv16qi3,     "__builtin_ia32_vpcomgtb",    IX86_BUILTIN_VPCOMGTB,    GT,           (int)MULTI_ARG_2_QI_CMP },
22386   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv16qi3,     "__builtin_ia32_vpcomgeb",    IX86_BUILTIN_VPCOMGEB,    GE,           (int)MULTI_ARG_2_QI_CMP },
22387
22388   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv8hi3,      "__builtin_ia32_vpcomeqw",    IX86_BUILTIN_VPCOMEQW,    EQ,           (int)MULTI_ARG_2_HI_CMP },
22389   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv8hi3,      "__builtin_ia32_vpcomnew",    IX86_BUILTIN_VPCOMNEW,    NE,           (int)MULTI_ARG_2_HI_CMP },
22390   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv8hi3,      "__builtin_ia32_vpcomneqw",   IX86_BUILTIN_VPCOMNEW,    NE,           (int)MULTI_ARG_2_HI_CMP },
22391   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv8hi3,      "__builtin_ia32_vpcomltw",    IX86_BUILTIN_VPCOMLTW,    LT,           (int)MULTI_ARG_2_HI_CMP },
22392   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv8hi3,      "__builtin_ia32_vpcomlew",    IX86_BUILTIN_VPCOMLEW,    LE,           (int)MULTI_ARG_2_HI_CMP },
22393   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv8hi3,      "__builtin_ia32_vpcomgtw",    IX86_BUILTIN_VPCOMGTW,    GT,           (int)MULTI_ARG_2_HI_CMP },
22394   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv8hi3,      "__builtin_ia32_vpcomgew",    IX86_BUILTIN_VPCOMGEW,    GE,           (int)MULTI_ARG_2_HI_CMP },
22395
22396   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv4si3,      "__builtin_ia32_vpcomeqd",    IX86_BUILTIN_VPCOMEQD,    EQ,           (int)MULTI_ARG_2_SI_CMP },
22397   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv4si3,      "__builtin_ia32_vpcomned",    IX86_BUILTIN_VPCOMNED,    NE,           (int)MULTI_ARG_2_SI_CMP },
22398   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv4si3,      "__builtin_ia32_vpcomneqd",   IX86_BUILTIN_VPCOMNED,    NE,           (int)MULTI_ARG_2_SI_CMP },
22399   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv4si3,      "__builtin_ia32_vpcomltd",    IX86_BUILTIN_VPCOMLTD,    LT,           (int)MULTI_ARG_2_SI_CMP },
22400   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv4si3,      "__builtin_ia32_vpcomled",    IX86_BUILTIN_VPCOMLED,    LE,           (int)MULTI_ARG_2_SI_CMP },
22401   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv4si3,      "__builtin_ia32_vpcomgtd",    IX86_BUILTIN_VPCOMGTD,    GT,           (int)MULTI_ARG_2_SI_CMP },
22402   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv4si3,      "__builtin_ia32_vpcomged",    IX86_BUILTIN_VPCOMGED,    GE,           (int)MULTI_ARG_2_SI_CMP },
22403
22404   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv2di3,      "__builtin_ia32_vpcomeqq",    IX86_BUILTIN_VPCOMEQQ,    EQ,           (int)MULTI_ARG_2_DI_CMP },
22405   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv2di3,      "__builtin_ia32_vpcomneq",    IX86_BUILTIN_VPCOMNEQ,    NE,           (int)MULTI_ARG_2_DI_CMP },
22406   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv2di3,      "__builtin_ia32_vpcomneqq",   IX86_BUILTIN_VPCOMNEQ,    NE,           (int)MULTI_ARG_2_DI_CMP },
22407   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv2di3,      "__builtin_ia32_vpcomltq",    IX86_BUILTIN_VPCOMLTQ,    LT,           (int)MULTI_ARG_2_DI_CMP },
22408   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv2di3,      "__builtin_ia32_vpcomleq",    IX86_BUILTIN_VPCOMLEQ,    LE,           (int)MULTI_ARG_2_DI_CMP },
22409   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv2di3,      "__builtin_ia32_vpcomgtq",    IX86_BUILTIN_VPCOMGTQ,    GT,           (int)MULTI_ARG_2_DI_CMP },
22410   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmpv2di3,      "__builtin_ia32_vpcomgeq",    IX86_BUILTIN_VPCOMGEQ,    GE,           (int)MULTI_ARG_2_DI_CMP },
22411
22412   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v16qi3,"__builtin_ia32_vpcomequb",   IX86_BUILTIN_VPCOMEQUB,   EQ,           (int)MULTI_ARG_2_QI_CMP },
22413   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v16qi3,"__builtin_ia32_vpcomneub",   IX86_BUILTIN_VPCOMNEUB,   NE,           (int)MULTI_ARG_2_QI_CMP },
22414   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v16qi3,"__builtin_ia32_vpcomnequb",  IX86_BUILTIN_VPCOMNEUB,   NE,           (int)MULTI_ARG_2_QI_CMP },
22415   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv16qi3, "__builtin_ia32_vpcomltub",   IX86_BUILTIN_VPCOMLTUB,   LTU,          (int)MULTI_ARG_2_QI_CMP },
22416   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv16qi3, "__builtin_ia32_vpcomleub",   IX86_BUILTIN_VPCOMLEUB,   LEU,          (int)MULTI_ARG_2_QI_CMP },
22417   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv16qi3, "__builtin_ia32_vpcomgtub",   IX86_BUILTIN_VPCOMGTUB,   GTU,          (int)MULTI_ARG_2_QI_CMP },
22418   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv16qi3, "__builtin_ia32_vpcomgeub",   IX86_BUILTIN_VPCOMGEUB,   GEU,          (int)MULTI_ARG_2_QI_CMP },
22419
22420   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v8hi3, "__builtin_ia32_vpcomequw",   IX86_BUILTIN_VPCOMEQUW,   EQ,           (int)MULTI_ARG_2_HI_CMP },
22421   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v8hi3, "__builtin_ia32_vpcomneuw",   IX86_BUILTIN_VPCOMNEUW,   NE,           (int)MULTI_ARG_2_HI_CMP },
22422   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v8hi3, "__builtin_ia32_vpcomnequw",  IX86_BUILTIN_VPCOMNEUW,   NE,           (int)MULTI_ARG_2_HI_CMP },
22423   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv8hi3,  "__builtin_ia32_vpcomltuw",   IX86_BUILTIN_VPCOMLTUW,   LTU,          (int)MULTI_ARG_2_HI_CMP },
22424   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv8hi3,  "__builtin_ia32_vpcomleuw",   IX86_BUILTIN_VPCOMLEUW,   LEU,          (int)MULTI_ARG_2_HI_CMP },
22425   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv8hi3,  "__builtin_ia32_vpcomgtuw",   IX86_BUILTIN_VPCOMGTUW,   GTU,          (int)MULTI_ARG_2_HI_CMP },
22426   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv8hi3,  "__builtin_ia32_vpcomgeuw",   IX86_BUILTIN_VPCOMGEUW,   GEU,          (int)MULTI_ARG_2_HI_CMP },
22427
22428   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v4si3, "__builtin_ia32_vpcomequd",   IX86_BUILTIN_VPCOMEQUD,   EQ,           (int)MULTI_ARG_2_SI_CMP },
22429   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v4si3, "__builtin_ia32_vpcomneud",   IX86_BUILTIN_VPCOMNEUD,   NE,           (int)MULTI_ARG_2_SI_CMP },
22430   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v4si3, "__builtin_ia32_vpcomnequd",  IX86_BUILTIN_VPCOMNEUD,   NE,           (int)MULTI_ARG_2_SI_CMP },
22431   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv4si3,  "__builtin_ia32_vpcomltud",   IX86_BUILTIN_VPCOMLTUD,   LTU,          (int)MULTI_ARG_2_SI_CMP },
22432   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv4si3,  "__builtin_ia32_vpcomleud",   IX86_BUILTIN_VPCOMLEUD,   LEU,          (int)MULTI_ARG_2_SI_CMP },
22433   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv4si3,  "__builtin_ia32_vpcomgtud",   IX86_BUILTIN_VPCOMGTUD,   GTU,          (int)MULTI_ARG_2_SI_CMP },
22434   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv4si3,  "__builtin_ia32_vpcomgeud",   IX86_BUILTIN_VPCOMGEUD,   GEU,          (int)MULTI_ARG_2_SI_CMP },
22435
22436   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v2di3, "__builtin_ia32_vpcomequq",   IX86_BUILTIN_VPCOMEQUQ,   EQ,           (int)MULTI_ARG_2_DI_CMP },
22437   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v2di3, "__builtin_ia32_vpcomneuq",   IX86_BUILTIN_VPCOMNEUQ,   NE,           (int)MULTI_ARG_2_DI_CMP },
22438   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_uns2v2di3, "__builtin_ia32_vpcomnequq",  IX86_BUILTIN_VPCOMNEUQ,   NE,           (int)MULTI_ARG_2_DI_CMP },
22439   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv2di3,  "__builtin_ia32_vpcomltuq",   IX86_BUILTIN_VPCOMLTUQ,   LTU,          (int)MULTI_ARG_2_DI_CMP },
22440   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv2di3,  "__builtin_ia32_vpcomleuq",   IX86_BUILTIN_VPCOMLEUQ,   LEU,          (int)MULTI_ARG_2_DI_CMP },
22441   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv2di3,  "__builtin_ia32_vpcomgtuq",   IX86_BUILTIN_VPCOMGTUQ,   GTU,          (int)MULTI_ARG_2_DI_CMP },
22442   { OPTION_MASK_ISA_XOP, CODE_FOR_xop_maskcmp_unsv2di3,  "__builtin_ia32_vpcomgeuq",   IX86_BUILTIN_VPCOMGEUQ,   GEU,          (int)MULTI_ARG_2_DI_CMP },
22443
22444   { 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 },
22445   { 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 },
22446   { 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 },
22447   { 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 },
22448   { 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 },
22449   { 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 },
22450   { 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 },
22451   { 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 },
22452
22453   { 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 },
22454   { 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 },
22455   { 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 },
22456   { 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 },
22457   { 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 },
22458   { 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 },
22459   { 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 },
22460   { 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 },
22461
22462 };
22463
22464 /* Set up all the MMX/SSE builtins, even builtins for instructions that are not
22465    in the current target ISA to allow the user to compile particular modules
22466    with different target specific options that differ from the command line
22467    options.  */
22468 static void
22469 ix86_init_mmx_sse_builtins (void)
22470 {
22471   const struct builtin_description * d;
22472   size_t i;
22473
22474   tree V16QI_type_node = build_vector_type_for_mode (char_type_node, V16QImode);
22475   tree V2SI_type_node = build_vector_type_for_mode (intSI_type_node, V2SImode);
22476   tree V1DI_type_node
22477     = build_vector_type_for_mode (long_long_integer_type_node, V1DImode);
22478   tree V2SF_type_node = build_vector_type_for_mode (float_type_node, V2SFmode);
22479   tree V2DI_type_node
22480     = build_vector_type_for_mode (long_long_integer_type_node, V2DImode);
22481   tree V2DF_type_node = build_vector_type_for_mode (double_type_node, V2DFmode);
22482   tree V4SF_type_node = build_vector_type_for_mode (float_type_node, V4SFmode);
22483   tree V4SI_type_node = build_vector_type_for_mode (intSI_type_node, V4SImode);
22484   tree V4HI_type_node = build_vector_type_for_mode (intHI_type_node, V4HImode);
22485   tree V8QI_type_node = build_vector_type_for_mode (char_type_node, V8QImode);
22486   tree V8HI_type_node = build_vector_type_for_mode (intHI_type_node, V8HImode);
22487
22488   tree pchar_type_node = build_pointer_type (char_type_node);
22489   tree pcchar_type_node
22490     = build_pointer_type (build_type_variant (char_type_node, 1, 0));
22491   tree pfloat_type_node = build_pointer_type (float_type_node);
22492   tree pcfloat_type_node
22493     = build_pointer_type (build_type_variant (float_type_node, 1, 0));
22494   tree pv2sf_type_node = build_pointer_type (V2SF_type_node);
22495   tree pcv2sf_type_node
22496     = build_pointer_type (build_type_variant (V2SF_type_node, 1, 0));
22497   tree pv2di_type_node = build_pointer_type (V2DI_type_node);
22498   tree pdi_type_node = build_pointer_type (long_long_unsigned_type_node);
22499
22500   /* Comparisons.  */
22501   tree int_ftype_v4sf_v4sf
22502     = build_function_type_list (integer_type_node,
22503                                 V4SF_type_node, V4SF_type_node, NULL_TREE);
22504   tree v4si_ftype_v4sf_v4sf
22505     = build_function_type_list (V4SI_type_node,
22506                                 V4SF_type_node, V4SF_type_node, NULL_TREE);
22507   /* MMX/SSE/integer conversions.  */
22508   tree int_ftype_v4sf
22509     = build_function_type_list (integer_type_node,
22510                                 V4SF_type_node, NULL_TREE);
22511   tree int64_ftype_v4sf
22512     = build_function_type_list (long_long_integer_type_node,
22513                                 V4SF_type_node, NULL_TREE);
22514   tree int_ftype_v8qi
22515     = build_function_type_list (integer_type_node, V8QI_type_node, NULL_TREE);
22516   tree v4sf_ftype_v4sf_int
22517     = build_function_type_list (V4SF_type_node,
22518                                 V4SF_type_node, integer_type_node, NULL_TREE);
22519   tree v4sf_ftype_v4sf_int64
22520     = build_function_type_list (V4SF_type_node,
22521                                 V4SF_type_node, long_long_integer_type_node,
22522                                 NULL_TREE);
22523   tree v4sf_ftype_v4sf_v2si
22524     = build_function_type_list (V4SF_type_node,
22525                                 V4SF_type_node, V2SI_type_node, NULL_TREE);
22526
22527   /* Miscellaneous.  */
22528   tree v8qi_ftype_v4hi_v4hi
22529     = build_function_type_list (V8QI_type_node,
22530                                 V4HI_type_node, V4HI_type_node, NULL_TREE);
22531   tree v4hi_ftype_v2si_v2si
22532     = build_function_type_list (V4HI_type_node,
22533                                 V2SI_type_node, V2SI_type_node, NULL_TREE);
22534   tree v4sf_ftype_v4sf_v4sf_int
22535     = build_function_type_list (V4SF_type_node,
22536                                 V4SF_type_node, V4SF_type_node,
22537                                 integer_type_node, NULL_TREE);
22538   tree v2si_ftype_v4hi_v4hi
22539     = build_function_type_list (V2SI_type_node,
22540                                 V4HI_type_node, V4HI_type_node, NULL_TREE);
22541   tree v4hi_ftype_v4hi_int
22542     = build_function_type_list (V4HI_type_node,
22543                                 V4HI_type_node, integer_type_node, NULL_TREE);
22544   tree v2si_ftype_v2si_int
22545     = build_function_type_list (V2SI_type_node,
22546                                 V2SI_type_node, integer_type_node, NULL_TREE);
22547   tree v1di_ftype_v1di_int
22548     = build_function_type_list (V1DI_type_node,
22549                                 V1DI_type_node, integer_type_node, NULL_TREE);
22550
22551   tree void_ftype_void
22552     = build_function_type (void_type_node, void_list_node);
22553   tree void_ftype_unsigned
22554     = build_function_type_list (void_type_node, unsigned_type_node, NULL_TREE);
22555   tree void_ftype_unsigned_unsigned
22556     = build_function_type_list (void_type_node, unsigned_type_node,
22557                                 unsigned_type_node, NULL_TREE);
22558   tree void_ftype_pcvoid_unsigned_unsigned
22559     = build_function_type_list (void_type_node, const_ptr_type_node,
22560                                 unsigned_type_node, unsigned_type_node,
22561                                 NULL_TREE);
22562   tree unsigned_ftype_void
22563     = build_function_type (unsigned_type_node, void_list_node);
22564   tree v2si_ftype_v4sf
22565     = build_function_type_list (V2SI_type_node, V4SF_type_node, NULL_TREE);
22566   /* Loads/stores.  */
22567   tree void_ftype_v8qi_v8qi_pchar
22568     = build_function_type_list (void_type_node,
22569                                 V8QI_type_node, V8QI_type_node,
22570                                 pchar_type_node, NULL_TREE);
22571   tree v4sf_ftype_pcfloat
22572     = build_function_type_list (V4SF_type_node, pcfloat_type_node, NULL_TREE);
22573   tree v4sf_ftype_v4sf_pcv2sf
22574     = build_function_type_list (V4SF_type_node,
22575                                 V4SF_type_node, pcv2sf_type_node, NULL_TREE);
22576   tree void_ftype_pv2sf_v4sf
22577     = build_function_type_list (void_type_node,
22578                                 pv2sf_type_node, V4SF_type_node, NULL_TREE);
22579   tree void_ftype_pfloat_v4sf
22580     = build_function_type_list (void_type_node,
22581                                 pfloat_type_node, V4SF_type_node, NULL_TREE);
22582   tree void_ftype_pdi_di
22583     = build_function_type_list (void_type_node,
22584                                 pdi_type_node, long_long_unsigned_type_node,
22585                                 NULL_TREE);
22586   tree void_ftype_pv2di_v2di
22587     = build_function_type_list (void_type_node,
22588                                 pv2di_type_node, V2DI_type_node, NULL_TREE);
22589   /* Normal vector unops.  */
22590   tree v4sf_ftype_v4sf
22591     = build_function_type_list (V4SF_type_node, V4SF_type_node, NULL_TREE);
22592   tree v16qi_ftype_v16qi
22593     = build_function_type_list (V16QI_type_node, V16QI_type_node, NULL_TREE);
22594   tree v8hi_ftype_v8hi
22595     = build_function_type_list (V8HI_type_node, V8HI_type_node, NULL_TREE);
22596   tree v4si_ftype_v4si
22597     = build_function_type_list (V4SI_type_node, V4SI_type_node, NULL_TREE);
22598   tree v8qi_ftype_v8qi
22599     = build_function_type_list (V8QI_type_node, V8QI_type_node, NULL_TREE);
22600   tree v4hi_ftype_v4hi
22601     = build_function_type_list (V4HI_type_node, V4HI_type_node, NULL_TREE);
22602
22603   /* Normal vector binops.  */
22604   tree v4sf_ftype_v4sf_v4sf
22605     = build_function_type_list (V4SF_type_node,
22606                                 V4SF_type_node, V4SF_type_node, NULL_TREE);
22607   tree v8qi_ftype_v8qi_v8qi
22608     = build_function_type_list (V8QI_type_node,
22609                                 V8QI_type_node, V8QI_type_node, NULL_TREE);
22610   tree v4hi_ftype_v4hi_v4hi
22611     = build_function_type_list (V4HI_type_node,
22612                                 V4HI_type_node, V4HI_type_node, NULL_TREE);
22613   tree v2si_ftype_v2si_v2si
22614     = build_function_type_list (V2SI_type_node,
22615                                 V2SI_type_node, V2SI_type_node, NULL_TREE);
22616   tree v1di_ftype_v1di_v1di
22617     = build_function_type_list (V1DI_type_node,
22618                                 V1DI_type_node, V1DI_type_node, NULL_TREE);
22619   tree v1di_ftype_v1di_v1di_int
22620     = build_function_type_list (V1DI_type_node,
22621                                 V1DI_type_node, V1DI_type_node,
22622                                 integer_type_node, NULL_TREE);
22623   tree v2si_ftype_v2sf
22624     = build_function_type_list (V2SI_type_node, V2SF_type_node, NULL_TREE);
22625   tree v2sf_ftype_v2si
22626     = build_function_type_list (V2SF_type_node, V2SI_type_node, NULL_TREE);
22627   tree v2si_ftype_v2si
22628     = build_function_type_list (V2SI_type_node, V2SI_type_node, NULL_TREE);
22629   tree v2sf_ftype_v2sf
22630     = build_function_type_list (V2SF_type_node, V2SF_type_node, NULL_TREE);
22631   tree v2sf_ftype_v2sf_v2sf
22632     = build_function_type_list (V2SF_type_node,
22633                                 V2SF_type_node, V2SF_type_node, NULL_TREE);
22634   tree v2si_ftype_v2sf_v2sf
22635     = build_function_type_list (V2SI_type_node,
22636                                 V2SF_type_node, V2SF_type_node, NULL_TREE);
22637   tree pint_type_node    = build_pointer_type (integer_type_node);
22638   tree pdouble_type_node = build_pointer_type (double_type_node);
22639   tree pcdouble_type_node = build_pointer_type (
22640                                 build_type_variant (double_type_node, 1, 0));
22641   tree int_ftype_v2df_v2df
22642     = build_function_type_list (integer_type_node,
22643                                 V2DF_type_node, V2DF_type_node, NULL_TREE);
22644
22645   tree void_ftype_pcvoid
22646     = build_function_type_list (void_type_node, const_ptr_type_node, NULL_TREE);
22647   tree v4sf_ftype_v4si
22648     = build_function_type_list (V4SF_type_node, V4SI_type_node, NULL_TREE);
22649   tree v4si_ftype_v4sf
22650     = build_function_type_list (V4SI_type_node, V4SF_type_node, NULL_TREE);
22651   tree v2df_ftype_v4si
22652     = build_function_type_list (V2DF_type_node, V4SI_type_node, NULL_TREE);
22653   tree v4si_ftype_v2df
22654     = build_function_type_list (V4SI_type_node, V2DF_type_node, NULL_TREE);
22655   tree v4si_ftype_v2df_v2df
22656     = build_function_type_list (V4SI_type_node,
22657                                 V2DF_type_node, V2DF_type_node, NULL_TREE);
22658   tree v2si_ftype_v2df
22659     = build_function_type_list (V2SI_type_node, V2DF_type_node, NULL_TREE);
22660   tree v4sf_ftype_v2df
22661     = build_function_type_list (V4SF_type_node, V2DF_type_node, NULL_TREE);
22662   tree v2df_ftype_v2si
22663     = build_function_type_list (V2DF_type_node, V2SI_type_node, NULL_TREE);
22664   tree v2df_ftype_v4sf
22665     = build_function_type_list (V2DF_type_node, V4SF_type_node, NULL_TREE);
22666   tree int_ftype_v2df
22667     = build_function_type_list (integer_type_node, V2DF_type_node, NULL_TREE);
22668   tree int64_ftype_v2df
22669     = build_function_type_list (long_long_integer_type_node,
22670                                 V2DF_type_node, NULL_TREE);
22671   tree v2df_ftype_v2df_int
22672     = build_function_type_list (V2DF_type_node,
22673                                 V2DF_type_node, integer_type_node, NULL_TREE);
22674   tree v2df_ftype_v2df_int64
22675     = build_function_type_list (V2DF_type_node,
22676                                 V2DF_type_node, long_long_integer_type_node,
22677                                 NULL_TREE);
22678   tree v4sf_ftype_v4sf_v2df
22679     = build_function_type_list (V4SF_type_node,
22680                                 V4SF_type_node, V2DF_type_node, NULL_TREE);
22681   tree v2df_ftype_v2df_v4sf
22682     = build_function_type_list (V2DF_type_node,
22683                                 V2DF_type_node, V4SF_type_node, NULL_TREE);
22684   tree v2df_ftype_v2df_v2df_int
22685     = build_function_type_list (V2DF_type_node,
22686                                 V2DF_type_node, V2DF_type_node,
22687                                 integer_type_node,
22688                                 NULL_TREE);
22689   tree v2df_ftype_v2df_pcdouble
22690     = build_function_type_list (V2DF_type_node,
22691                                 V2DF_type_node, pcdouble_type_node, NULL_TREE);
22692   tree void_ftype_pdouble_v2df
22693     = build_function_type_list (void_type_node,
22694                                 pdouble_type_node, V2DF_type_node, NULL_TREE);
22695   tree void_ftype_pint_int
22696     = build_function_type_list (void_type_node,
22697                                 pint_type_node, integer_type_node, NULL_TREE);
22698   tree void_ftype_v16qi_v16qi_pchar
22699     = build_function_type_list (void_type_node,
22700                                 V16QI_type_node, V16QI_type_node,
22701                                 pchar_type_node, NULL_TREE);
22702   tree v2df_ftype_pcdouble
22703     = build_function_type_list (V2DF_type_node, pcdouble_type_node, NULL_TREE);
22704   tree v2df_ftype_v2df_v2df
22705     = build_function_type_list (V2DF_type_node,
22706                                 V2DF_type_node, V2DF_type_node, NULL_TREE);
22707   tree v16qi_ftype_v16qi_v16qi
22708     = build_function_type_list (V16QI_type_node,
22709                                 V16QI_type_node, V16QI_type_node, NULL_TREE);
22710   tree v8hi_ftype_v8hi_v8hi
22711     = build_function_type_list (V8HI_type_node,
22712                                 V8HI_type_node, V8HI_type_node, NULL_TREE);
22713   tree v4si_ftype_v4si_v4si
22714     = build_function_type_list (V4SI_type_node,
22715                                 V4SI_type_node, V4SI_type_node, NULL_TREE);
22716   tree v2di_ftype_v2di_v2di
22717     = build_function_type_list (V2DI_type_node,
22718                                 V2DI_type_node, V2DI_type_node, NULL_TREE);
22719   tree v2di_ftype_v2df_v2df
22720     = build_function_type_list (V2DI_type_node,
22721                                 V2DF_type_node, V2DF_type_node, NULL_TREE);
22722   tree v2df_ftype_v2df
22723     = build_function_type_list (V2DF_type_node, V2DF_type_node, NULL_TREE);
22724   tree v2di_ftype_v2di_int
22725     = build_function_type_list (V2DI_type_node,
22726                                 V2DI_type_node, integer_type_node, NULL_TREE);
22727   tree v2di_ftype_v2di_v2di_int
22728     = build_function_type_list (V2DI_type_node, V2DI_type_node,
22729                                 V2DI_type_node, integer_type_node, NULL_TREE);
22730   tree v4si_ftype_v4si_int
22731     = build_function_type_list (V4SI_type_node,
22732                                 V4SI_type_node, integer_type_node, NULL_TREE);
22733   tree v8hi_ftype_v8hi_int
22734     = build_function_type_list (V8HI_type_node,
22735                                 V8HI_type_node, integer_type_node, NULL_TREE);
22736   tree v4si_ftype_v8hi_v8hi
22737     = build_function_type_list (V4SI_type_node,
22738                                 V8HI_type_node, V8HI_type_node, NULL_TREE);
22739   tree v1di_ftype_v8qi_v8qi
22740     = build_function_type_list (V1DI_type_node,
22741                                 V8QI_type_node, V8QI_type_node, NULL_TREE);
22742   tree v1di_ftype_v2si_v2si
22743     = build_function_type_list (V1DI_type_node,
22744                                 V2SI_type_node, V2SI_type_node, NULL_TREE);
22745   tree v2di_ftype_v16qi_v16qi
22746     = build_function_type_list (V2DI_type_node,
22747                                 V16QI_type_node, V16QI_type_node, NULL_TREE);
22748   tree v2di_ftype_v4si_v4si
22749     = build_function_type_list (V2DI_type_node,
22750                                 V4SI_type_node, V4SI_type_node, NULL_TREE);
22751   tree int_ftype_v16qi
22752     = build_function_type_list (integer_type_node, V16QI_type_node, NULL_TREE);
22753   tree v16qi_ftype_pcchar
22754     = build_function_type_list (V16QI_type_node, pcchar_type_node, NULL_TREE);
22755   tree void_ftype_pchar_v16qi
22756     = build_function_type_list (void_type_node,
22757                                 pchar_type_node, V16QI_type_node, NULL_TREE);
22758
22759   tree v2di_ftype_v2di_unsigned_unsigned
22760     = build_function_type_list (V2DI_type_node, V2DI_type_node,
22761                                 unsigned_type_node, unsigned_type_node,
22762                                 NULL_TREE);
22763   tree v2di_ftype_v2di_v2di_unsigned_unsigned
22764     = build_function_type_list (V2DI_type_node, V2DI_type_node, V2DI_type_node,
22765                                 unsigned_type_node, unsigned_type_node,
22766                                 NULL_TREE);
22767   tree v2di_ftype_v2di_v16qi
22768     = build_function_type_list (V2DI_type_node, V2DI_type_node, V16QI_type_node,
22769                                 NULL_TREE);
22770   tree v2df_ftype_v2df_v2df_v2df
22771     = build_function_type_list (V2DF_type_node,
22772                                 V2DF_type_node, V2DF_type_node,
22773                                 V2DF_type_node, NULL_TREE);
22774   tree v4sf_ftype_v4sf_v4sf_v4sf
22775     = build_function_type_list (V4SF_type_node,
22776                                 V4SF_type_node, V4SF_type_node,
22777                                 V4SF_type_node, NULL_TREE);
22778   tree v8hi_ftype_v16qi
22779     = build_function_type_list (V8HI_type_node, V16QI_type_node,
22780                                 NULL_TREE);
22781   tree v4si_ftype_v16qi
22782     = build_function_type_list (V4SI_type_node, V16QI_type_node,
22783                                 NULL_TREE);
22784   tree v2di_ftype_v16qi
22785     = build_function_type_list (V2DI_type_node, V16QI_type_node,
22786                                 NULL_TREE);
22787   tree v4si_ftype_v8hi
22788     = build_function_type_list (V4SI_type_node, V8HI_type_node,
22789                                 NULL_TREE);
22790   tree v2di_ftype_v8hi
22791     = build_function_type_list (V2DI_type_node, V8HI_type_node,
22792                                 NULL_TREE);
22793   tree v2di_ftype_v4si
22794     = build_function_type_list (V2DI_type_node, V4SI_type_node,
22795                                 NULL_TREE);
22796   tree v2di_ftype_pv2di
22797     = build_function_type_list (V2DI_type_node, pv2di_type_node,
22798                                 NULL_TREE);
22799   tree v16qi_ftype_v16qi_v16qi_int
22800     = build_function_type_list (V16QI_type_node, V16QI_type_node,
22801                                 V16QI_type_node, integer_type_node,
22802                                 NULL_TREE);
22803   tree v16qi_ftype_v16qi_v16qi_v16qi
22804     = build_function_type_list (V16QI_type_node, V16QI_type_node,
22805                                 V16QI_type_node, V16QI_type_node,
22806                                 NULL_TREE);
22807   tree v8hi_ftype_v8hi_v8hi_int
22808     = build_function_type_list (V8HI_type_node, V8HI_type_node,
22809                                 V8HI_type_node, integer_type_node,
22810                                 NULL_TREE);
22811   tree v4si_ftype_v4si_v4si_int
22812     = build_function_type_list (V4SI_type_node, V4SI_type_node,
22813                                 V4SI_type_node, integer_type_node,
22814                                 NULL_TREE);
22815   tree int_ftype_v2di_v2di
22816     = build_function_type_list (integer_type_node,
22817                                 V2DI_type_node, V2DI_type_node,
22818                                 NULL_TREE);
22819   tree int_ftype_v16qi_int_v16qi_int_int
22820     = build_function_type_list (integer_type_node,
22821                                 V16QI_type_node,
22822                                 integer_type_node,
22823                                 V16QI_type_node,
22824                                 integer_type_node,
22825                                 integer_type_node,
22826                                 NULL_TREE);
22827   tree v16qi_ftype_v16qi_int_v16qi_int_int
22828     = build_function_type_list (V16QI_type_node,
22829                                 V16QI_type_node,
22830                                 integer_type_node,
22831                                 V16QI_type_node,
22832                                 integer_type_node,
22833                                 integer_type_node,
22834                                 NULL_TREE);
22835   tree int_ftype_v16qi_v16qi_int
22836     = build_function_type_list (integer_type_node,
22837                                 V16QI_type_node,
22838                                 V16QI_type_node,
22839                                 integer_type_node,
22840                                 NULL_TREE);
22841
22842   /* AVX builtins  */
22843   tree V32QI_type_node = build_vector_type_for_mode (char_type_node,
22844                                                      V32QImode);
22845   tree V8SI_type_node = build_vector_type_for_mode (intSI_type_node,
22846                                                     V8SImode);
22847   tree V8SF_type_node = build_vector_type_for_mode (float_type_node,
22848                                                     V8SFmode);
22849   tree V4DI_type_node = build_vector_type_for_mode (long_long_integer_type_node,
22850                                                     V4DImode);
22851   tree V4DF_type_node = build_vector_type_for_mode (double_type_node,
22852                                                     V4DFmode);
22853   tree V16HI_type_node = build_vector_type_for_mode (intHI_type_node,
22854                                                      V16HImode);
22855   tree v8sf_ftype_v8sf
22856     = build_function_type_list (V8SF_type_node,
22857                                 V8SF_type_node,
22858                                 NULL_TREE);
22859   tree v8si_ftype_v8sf
22860     = build_function_type_list (V8SI_type_node,
22861                                 V8SF_type_node,
22862                                 NULL_TREE);
22863   tree v8sf_ftype_v8si
22864     = build_function_type_list (V8SF_type_node,
22865                                 V8SI_type_node,
22866                                 NULL_TREE);
22867   tree v4si_ftype_v4df
22868     = build_function_type_list (V4SI_type_node,
22869                                 V4DF_type_node,
22870                                 NULL_TREE);
22871   tree v4df_ftype_v4df
22872     = build_function_type_list (V4DF_type_node,
22873                                 V4DF_type_node,
22874                                 NULL_TREE);
22875   tree v4df_ftype_v4si
22876     = build_function_type_list (V4DF_type_node,
22877                                 V4SI_type_node,
22878                                 NULL_TREE);
22879   tree v4df_ftype_v4sf
22880     = build_function_type_list (V4DF_type_node,
22881                                 V4SF_type_node,
22882                                 NULL_TREE);
22883   tree v4sf_ftype_v4df
22884     = build_function_type_list (V4SF_type_node,
22885                                 V4DF_type_node,
22886                                 NULL_TREE);
22887   tree v8sf_ftype_v8sf_v8sf
22888     = build_function_type_list (V8SF_type_node,
22889                                 V8SF_type_node, V8SF_type_node,
22890                                 NULL_TREE);
22891   tree v4df_ftype_v4df_v4df
22892     = build_function_type_list (V4DF_type_node,
22893                                 V4DF_type_node, V4DF_type_node,
22894                                 NULL_TREE);
22895   tree v8sf_ftype_v8sf_int
22896     = build_function_type_list (V8SF_type_node,
22897                                 V8SF_type_node, integer_type_node,
22898                                 NULL_TREE);
22899   tree v4si_ftype_v8si_int
22900     = build_function_type_list (V4SI_type_node,
22901                                 V8SI_type_node, integer_type_node,
22902                                 NULL_TREE);
22903   tree v4df_ftype_v4df_int
22904     = build_function_type_list (V4DF_type_node,
22905                                 V4DF_type_node, integer_type_node,
22906                                 NULL_TREE);
22907   tree v4sf_ftype_v8sf_int
22908     = build_function_type_list (V4SF_type_node,
22909                                 V8SF_type_node, integer_type_node,
22910                                 NULL_TREE);
22911   tree v2df_ftype_v4df_int
22912     = build_function_type_list (V2DF_type_node,
22913                                 V4DF_type_node, integer_type_node,
22914                                 NULL_TREE);
22915   tree v8sf_ftype_v8sf_v8sf_int
22916     = build_function_type_list (V8SF_type_node,
22917                                 V8SF_type_node, V8SF_type_node,
22918                                 integer_type_node,
22919                                 NULL_TREE);
22920   tree v8sf_ftype_v8sf_v8sf_v8sf
22921     = build_function_type_list (V8SF_type_node,
22922                                 V8SF_type_node, V8SF_type_node,
22923                                 V8SF_type_node,
22924                                 NULL_TREE);
22925   tree v4df_ftype_v4df_v4df_v4df
22926     = build_function_type_list (V4DF_type_node,
22927                                 V4DF_type_node, V4DF_type_node,
22928                                 V4DF_type_node,
22929                                 NULL_TREE);
22930   tree v8si_ftype_v8si_v8si_int
22931     = build_function_type_list (V8SI_type_node,
22932                                 V8SI_type_node, V8SI_type_node,
22933                                 integer_type_node,
22934                                 NULL_TREE);
22935   tree v4df_ftype_v4df_v4df_int
22936     = build_function_type_list (V4DF_type_node,
22937                                 V4DF_type_node, V4DF_type_node,
22938                                 integer_type_node,
22939                                 NULL_TREE);
22940   tree v8sf_ftype_pcfloat
22941     = build_function_type_list (V8SF_type_node,
22942                                 pcfloat_type_node,
22943                                 NULL_TREE);
22944   tree v4df_ftype_pcdouble
22945     = build_function_type_list (V4DF_type_node,
22946                                 pcdouble_type_node,
22947                                 NULL_TREE);
22948   tree pcv4sf_type_node
22949     = build_pointer_type (build_type_variant (V4SF_type_node, 1, 0));
22950   tree pcv2df_type_node
22951     = build_pointer_type (build_type_variant (V2DF_type_node, 1, 0));
22952   tree v8sf_ftype_pcv4sf
22953     = build_function_type_list (V8SF_type_node,
22954                                 pcv4sf_type_node,
22955                                 NULL_TREE);
22956   tree v4df_ftype_pcv2df
22957     = build_function_type_list (V4DF_type_node,
22958                                 pcv2df_type_node,
22959                                 NULL_TREE);
22960   tree v32qi_ftype_pcchar
22961     = build_function_type_list (V32QI_type_node,
22962                                 pcchar_type_node,
22963                                 NULL_TREE);
22964   tree void_ftype_pchar_v32qi
22965     = build_function_type_list (void_type_node,
22966                                 pchar_type_node, V32QI_type_node,
22967                                 NULL_TREE);
22968   tree v8si_ftype_v8si_v4si_int
22969     = build_function_type_list (V8SI_type_node,
22970                                 V8SI_type_node, V4SI_type_node,
22971                                 integer_type_node,
22972                                 NULL_TREE);
22973   tree pv4di_type_node = build_pointer_type (V4DI_type_node);
22974   tree void_ftype_pv4di_v4di
22975     = build_function_type_list (void_type_node,
22976                                 pv4di_type_node, V4DI_type_node,
22977                                 NULL_TREE);
22978   tree v8sf_ftype_v8sf_v4sf_int
22979     = build_function_type_list (V8SF_type_node,
22980                                 V8SF_type_node, V4SF_type_node,
22981                                 integer_type_node,
22982                                 NULL_TREE);
22983   tree v4df_ftype_v4df_v2df_int
22984     = build_function_type_list (V4DF_type_node,
22985                                 V4DF_type_node, V2DF_type_node,
22986                                 integer_type_node,
22987                                 NULL_TREE);
22988   tree void_ftype_pfloat_v8sf
22989     = build_function_type_list (void_type_node,
22990                                 pfloat_type_node, V8SF_type_node,
22991                                 NULL_TREE);
22992   tree void_ftype_pdouble_v4df
22993     = build_function_type_list (void_type_node,
22994                                 pdouble_type_node, V4DF_type_node,
22995                                 NULL_TREE);
22996   tree pv8sf_type_node = build_pointer_type (V8SF_type_node);
22997   tree pv4sf_type_node = build_pointer_type (V4SF_type_node);
22998   tree pv4df_type_node = build_pointer_type (V4DF_type_node);
22999   tree pv2df_type_node = build_pointer_type (V2DF_type_node);
23000   tree pcv8sf_type_node
23001     = build_pointer_type (build_type_variant (V8SF_type_node, 1, 0));
23002   tree pcv4df_type_node
23003     = build_pointer_type (build_type_variant (V4DF_type_node, 1, 0));
23004   tree v8sf_ftype_pcv8sf_v8sf
23005     = build_function_type_list (V8SF_type_node,
23006                                 pcv8sf_type_node, V8SF_type_node,
23007                                 NULL_TREE);
23008   tree v4df_ftype_pcv4df_v4df
23009     = build_function_type_list (V4DF_type_node,
23010                                 pcv4df_type_node, V4DF_type_node,
23011                                 NULL_TREE);
23012   tree v4sf_ftype_pcv4sf_v4sf
23013     = build_function_type_list (V4SF_type_node,
23014                                 pcv4sf_type_node, V4SF_type_node,
23015                                 NULL_TREE);
23016   tree v2df_ftype_pcv2df_v2df
23017     = build_function_type_list (V2DF_type_node,
23018                                 pcv2df_type_node, V2DF_type_node,
23019                                 NULL_TREE);
23020   tree void_ftype_pv8sf_v8sf_v8sf
23021     = build_function_type_list (void_type_node,
23022                                 pv8sf_type_node, V8SF_type_node,
23023                                 V8SF_type_node,
23024                                 NULL_TREE);
23025   tree void_ftype_pv4df_v4df_v4df
23026     = build_function_type_list (void_type_node,
23027                                 pv4df_type_node, V4DF_type_node,
23028                                 V4DF_type_node,
23029                                 NULL_TREE);
23030   tree void_ftype_pv4sf_v4sf_v4sf
23031     = build_function_type_list (void_type_node,
23032                                 pv4sf_type_node, V4SF_type_node,
23033                                 V4SF_type_node,
23034                                 NULL_TREE);
23035   tree void_ftype_pv2df_v2df_v2df
23036     = build_function_type_list (void_type_node,
23037                                 pv2df_type_node, V2DF_type_node,
23038                                 V2DF_type_node,
23039                                 NULL_TREE);
23040   tree v4df_ftype_v2df
23041     = build_function_type_list (V4DF_type_node,
23042                                 V2DF_type_node,
23043                                 NULL_TREE);
23044   tree v8sf_ftype_v4sf
23045     = build_function_type_list (V8SF_type_node,
23046                                 V4SF_type_node,
23047                                 NULL_TREE);
23048   tree v8si_ftype_v4si
23049     = build_function_type_list (V8SI_type_node,
23050                                 V4SI_type_node,
23051                                 NULL_TREE);
23052   tree v2df_ftype_v4df
23053     = build_function_type_list (V2DF_type_node,
23054                                 V4DF_type_node,
23055                                 NULL_TREE);
23056   tree v4sf_ftype_v8sf
23057     = build_function_type_list (V4SF_type_node,
23058                                 V8SF_type_node,
23059                                 NULL_TREE);
23060   tree v4si_ftype_v8si
23061     = build_function_type_list (V4SI_type_node,
23062                                 V8SI_type_node,
23063                                 NULL_TREE);
23064   tree int_ftype_v4df
23065     = build_function_type_list (integer_type_node,
23066                                 V4DF_type_node,
23067                                 NULL_TREE);
23068   tree int_ftype_v8sf
23069     = build_function_type_list (integer_type_node,
23070                                 V8SF_type_node,
23071                                 NULL_TREE);
23072   tree int_ftype_v8sf_v8sf
23073     = build_function_type_list (integer_type_node,
23074                                 V8SF_type_node, V8SF_type_node,
23075                                 NULL_TREE);
23076   tree int_ftype_v4di_v4di
23077     = build_function_type_list (integer_type_node,
23078                                 V4DI_type_node, V4DI_type_node,
23079                                 NULL_TREE);
23080   tree int_ftype_v4df_v4df
23081     = build_function_type_list (integer_type_node,
23082                                 V4DF_type_node, V4DF_type_node,
23083                                 NULL_TREE);
23084   tree v8sf_ftype_v8sf_v8si
23085     = build_function_type_list (V8SF_type_node,
23086                                 V8SF_type_node, V8SI_type_node,
23087                                 NULL_TREE);
23088   tree v4df_ftype_v4df_v4di
23089     = build_function_type_list (V4DF_type_node,
23090                                 V4DF_type_node, V4DI_type_node,
23091                                 NULL_TREE);
23092   tree v4sf_ftype_v4sf_v4si
23093     = build_function_type_list (V4SF_type_node,
23094                                 V4SF_type_node, V4SI_type_node, NULL_TREE);
23095   tree v2df_ftype_v2df_v2di
23096     = build_function_type_list (V2DF_type_node,
23097                                 V2DF_type_node, V2DI_type_node, NULL_TREE);
23098
23099   /* XOP instructions */
23100   tree v2di_ftype_v2di_v2di_v2di
23101     = build_function_type_list (V2DI_type_node,
23102                                 V2DI_type_node,
23103                                 V2DI_type_node,
23104                                 V2DI_type_node,
23105                                 NULL_TREE);
23106
23107   tree v4di_ftype_v4di_v4di_v4di
23108     = build_function_type_list (V4DI_type_node,
23109                                 V4DI_type_node,
23110                                 V4DI_type_node,
23111                                 V4DI_type_node,
23112                                 NULL_TREE);
23113
23114   tree v4si_ftype_v4si_v4si_v4si
23115     = build_function_type_list (V4SI_type_node,
23116                                 V4SI_type_node,
23117                                 V4SI_type_node,
23118                                 V4SI_type_node,
23119                                 NULL_TREE);
23120
23121   tree v8si_ftype_v8si_v8si_v8si
23122     = build_function_type_list (V8SI_type_node,
23123                                 V8SI_type_node,
23124                                 V8SI_type_node,
23125                                 V8SI_type_node,
23126                                 NULL_TREE);
23127
23128   tree v32qi_ftype_v32qi_v32qi_v32qi
23129     = build_function_type_list (V32QI_type_node,
23130                                 V32QI_type_node,
23131                                 V32QI_type_node,
23132                                 V32QI_type_node,
23133                                 NULL_TREE);
23134
23135   tree v4si_ftype_v4si_v4si_v2di
23136     = build_function_type_list (V4SI_type_node,
23137                                 V4SI_type_node,
23138                                 V4SI_type_node,
23139                                 V2DI_type_node,
23140                                 NULL_TREE);
23141
23142   tree v8hi_ftype_v8hi_v8hi_v8hi
23143     = build_function_type_list (V8HI_type_node,
23144                                 V8HI_type_node,
23145                                 V8HI_type_node,
23146                                 V8HI_type_node,
23147                                 NULL_TREE);
23148
23149   tree v16hi_ftype_v16hi_v16hi_v16hi
23150     = build_function_type_list (V16HI_type_node,
23151                                 V16HI_type_node,
23152                                 V16HI_type_node,
23153                                 V16HI_type_node,
23154                                 NULL_TREE);
23155
23156   tree v8hi_ftype_v8hi_v8hi_v4si
23157     = build_function_type_list (V8HI_type_node,
23158                                 V8HI_type_node,
23159                                 V8HI_type_node,
23160                                 V4SI_type_node,
23161                                 NULL_TREE);
23162
23163   tree v2di_ftype_v2di_si
23164     = build_function_type_list (V2DI_type_node,
23165                                 V2DI_type_node,
23166                                 integer_type_node,
23167                                 NULL_TREE);
23168
23169   tree v4si_ftype_v4si_si
23170     = build_function_type_list (V4SI_type_node,
23171                                 V4SI_type_node,
23172                                 integer_type_node,
23173                                 NULL_TREE);
23174
23175   tree v8hi_ftype_v8hi_si
23176     = build_function_type_list (V8HI_type_node,
23177                                 V8HI_type_node,
23178                                 integer_type_node,
23179                                 NULL_TREE);
23180
23181   tree v16qi_ftype_v16qi_si
23182     = build_function_type_list (V16QI_type_node,
23183                                 V16QI_type_node,
23184                                 integer_type_node,
23185                                 NULL_TREE);
23186
23187   tree v2di_ftype_v2di
23188     = build_function_type_list (V2DI_type_node, V2DI_type_node, NULL_TREE);
23189
23190   tree v16qi_ftype_v8hi_v8hi
23191     = build_function_type_list (V16QI_type_node,
23192                                 V8HI_type_node, V8HI_type_node,
23193                                 NULL_TREE);
23194   tree v8hi_ftype_v4si_v4si
23195     = build_function_type_list (V8HI_type_node,
23196                                 V4SI_type_node, V4SI_type_node,
23197                                 NULL_TREE);
23198   tree v8hi_ftype_v16qi_v16qi 
23199     = build_function_type_list (V8HI_type_node,
23200                                 V16QI_type_node, V16QI_type_node,
23201                                 NULL_TREE);
23202   tree v4hi_ftype_v8qi_v8qi 
23203     = build_function_type_list (V4HI_type_node,
23204                                 V8QI_type_node, V8QI_type_node,
23205                                 NULL_TREE);
23206   tree unsigned_ftype_unsigned_uchar
23207     = build_function_type_list (unsigned_type_node,
23208                                 unsigned_type_node,
23209                                 unsigned_char_type_node,
23210                                 NULL_TREE);
23211   tree unsigned_ftype_unsigned_ushort
23212     = build_function_type_list (unsigned_type_node,
23213                                 unsigned_type_node,
23214                                 short_unsigned_type_node,
23215                                 NULL_TREE);
23216   tree unsigned_ftype_unsigned_unsigned
23217     = build_function_type_list (unsigned_type_node,
23218                                 unsigned_type_node,
23219                                 unsigned_type_node,
23220                                 NULL_TREE);
23221   tree uint64_ftype_uint64_uint64
23222     = build_function_type_list (long_long_unsigned_type_node,
23223                                 long_long_unsigned_type_node,
23224                                 long_long_unsigned_type_node,
23225                                 NULL_TREE);
23226   tree float_ftype_float
23227     = build_function_type_list (float_type_node,
23228                                 float_type_node,
23229                                 NULL_TREE);
23230
23231   /* Integer intrinsics.  */
23232   tree uint64_ftype_void
23233     = build_function_type (long_long_unsigned_type_node,
23234                            void_list_node);
23235   tree int_ftype_int
23236     = build_function_type_list (integer_type_node,
23237                                 integer_type_node, NULL_TREE);
23238   tree int64_ftype_int64
23239     = build_function_type_list (long_long_integer_type_node,
23240                                 long_long_integer_type_node,
23241                                 NULL_TREE);
23242   tree uint64_ftype_int
23243     = build_function_type_list (long_long_unsigned_type_node,
23244                                 integer_type_node, NULL_TREE);
23245   tree punsigned_type_node = build_pointer_type (unsigned_type_node);
23246   tree uint64_ftype_punsigned
23247     = build_function_type_list (long_long_unsigned_type_node,
23248                                 punsigned_type_node, NULL_TREE);
23249   tree ushort_ftype_ushort_int
23250     = build_function_type_list (short_unsigned_type_node,
23251                                 short_unsigned_type_node,
23252                                 integer_type_node,
23253                                 NULL_TREE);
23254   tree uchar_ftype_uchar_int
23255     = build_function_type_list (unsigned_char_type_node,
23256                                 unsigned_char_type_node,
23257                                 integer_type_node,
23258                                 NULL_TREE);
23259
23260   /* LWP instructions.  */
23261
23262   tree void_ftype_ushort_unsigned_ushort
23263     = build_function_type_list (void_type_node,
23264                                 short_unsigned_type_node,
23265                                 unsigned_type_node,
23266                                 short_unsigned_type_node,
23267                                 NULL_TREE);
23268
23269   tree void_ftype_unsigned_unsigned_unsigned
23270     = build_function_type_list (void_type_node,
23271                                 unsigned_type_node,
23272                                 unsigned_type_node,
23273                                 unsigned_type_node,
23274                                 NULL_TREE);
23275
23276   tree void_ftype_uint64_unsigned_unsigned
23277     = build_function_type_list (void_type_node,
23278                                 long_long_unsigned_type_node,
23279                                 unsigned_type_node,
23280                                 unsigned_type_node,
23281                                 NULL_TREE);
23282
23283   tree uchar_ftype_ushort_unsigned_ushort
23284     = build_function_type_list (unsigned_char_type_node,
23285                                 short_unsigned_type_node,
23286                                 unsigned_type_node,
23287                                 short_unsigned_type_node,
23288                                 NULL_TREE);
23289
23290   tree uchar_ftype_unsigned_unsigned_unsigned
23291     = build_function_type_list (unsigned_char_type_node,
23292                                 unsigned_type_node,
23293                                 unsigned_type_node,
23294                                 unsigned_type_node,
23295                                 NULL_TREE);
23296
23297   tree uchar_ftype_uint64_unsigned_unsigned
23298     = build_function_type_list (unsigned_char_type_node,
23299                                 long_long_unsigned_type_node,
23300                                 unsigned_type_node,
23301                                 unsigned_type_node,
23302                                 NULL_TREE);
23303
23304   tree ftype;
23305
23306   /* Add all special builtins with variable number of operands.  */
23307   for (i = 0, d = bdesc_special_args;
23308        i < ARRAY_SIZE (bdesc_special_args);
23309        i++, d++)
23310     {
23311       tree type;
23312
23313       if (d->name == 0)
23314         continue;
23315
23316       switch ((enum ix86_special_builtin_type) d->flag)
23317         {
23318         case VOID_FTYPE_VOID:
23319           type = void_ftype_void;
23320           break;
23321         case UINT64_FTYPE_VOID:
23322           type = uint64_ftype_void;
23323           break;
23324         case UINT64_FTYPE_PUNSIGNED:
23325           type = uint64_ftype_punsigned;
23326           break;
23327         case V32QI_FTYPE_PCCHAR:
23328           type = v32qi_ftype_pcchar;
23329           break;
23330         case V16QI_FTYPE_PCCHAR:
23331           type = v16qi_ftype_pcchar;
23332           break;
23333         case V8SF_FTYPE_PCV4SF:
23334           type = v8sf_ftype_pcv4sf;
23335           break;
23336         case V8SF_FTYPE_PCFLOAT:
23337           type = v8sf_ftype_pcfloat;
23338           break;
23339         case V4DF_FTYPE_PCV2DF:
23340           type = v4df_ftype_pcv2df;
23341           break;
23342         case V4DF_FTYPE_PCDOUBLE:
23343           type = v4df_ftype_pcdouble;
23344           break;
23345         case V4SF_FTYPE_PCFLOAT:
23346           type = v4sf_ftype_pcfloat;
23347           break;
23348         case V2DI_FTYPE_PV2DI:
23349           type = v2di_ftype_pv2di;
23350           break;
23351         case V2DF_FTYPE_PCDOUBLE:
23352           type = v2df_ftype_pcdouble;
23353           break;
23354         case V8SF_FTYPE_PCV8SF_V8SF:
23355           type = v8sf_ftype_pcv8sf_v8sf;
23356           break;
23357         case V4DF_FTYPE_PCV4DF_V4DF:
23358           type = v4df_ftype_pcv4df_v4df;
23359           break;
23360         case V4SF_FTYPE_V4SF_PCV2SF:
23361           type = v4sf_ftype_v4sf_pcv2sf;
23362           break;
23363         case V4SF_FTYPE_PCV4SF_V4SF:
23364           type = v4sf_ftype_pcv4sf_v4sf;
23365           break;
23366         case V2DF_FTYPE_V2DF_PCDOUBLE:
23367           type = v2df_ftype_v2df_pcdouble;
23368           break;
23369         case V2DF_FTYPE_PCV2DF_V2DF:
23370           type = v2df_ftype_pcv2df_v2df;
23371           break;
23372         case VOID_FTYPE_PV2SF_V4SF:
23373           type = void_ftype_pv2sf_v4sf;
23374           break;
23375         case VOID_FTYPE_PV4DI_V4DI:
23376           type = void_ftype_pv4di_v4di;
23377           break;
23378         case VOID_FTYPE_PV2DI_V2DI:
23379           type = void_ftype_pv2di_v2di;
23380           break;
23381         case VOID_FTYPE_PCHAR_V32QI:
23382           type = void_ftype_pchar_v32qi;
23383           break;
23384         case VOID_FTYPE_PCHAR_V16QI:
23385           type = void_ftype_pchar_v16qi;
23386           break;
23387         case VOID_FTYPE_PFLOAT_V8SF:
23388           type = void_ftype_pfloat_v8sf;
23389           break;
23390         case VOID_FTYPE_PFLOAT_V4SF:
23391           type = void_ftype_pfloat_v4sf;
23392           break;
23393         case VOID_FTYPE_PDOUBLE_V4DF:
23394           type = void_ftype_pdouble_v4df;
23395           break;
23396         case VOID_FTYPE_PDOUBLE_V2DF:
23397           type = void_ftype_pdouble_v2df;
23398           break;
23399         case VOID_FTYPE_PDI_DI:
23400           type = void_ftype_pdi_di;
23401           break;
23402         case VOID_FTYPE_PINT_INT:
23403           type = void_ftype_pint_int;
23404           break;
23405         case VOID_FTYPE_PV8SF_V8SF_V8SF:
23406           type = void_ftype_pv8sf_v8sf_v8sf;
23407           break;
23408         case VOID_FTYPE_PV4DF_V4DF_V4DF:
23409           type = void_ftype_pv4df_v4df_v4df;
23410           break;
23411         case VOID_FTYPE_PV4SF_V4SF_V4SF:
23412           type = void_ftype_pv4sf_v4sf_v4sf;
23413           break;
23414         case VOID_FTYPE_PV2DF_V2DF_V2DF:
23415           type = void_ftype_pv2df_v2df_v2df;
23416           break;
23417         case VOID_FTYPE_USHORT_UINT_USHORT:
23418           type = void_ftype_ushort_unsigned_ushort;
23419           break;
23420         case VOID_FTYPE_UINT_UINT_UINT:
23421           type = void_ftype_unsigned_unsigned_unsigned;
23422           break;
23423         case VOID_FTYPE_UINT64_UINT_UINT:
23424           type = void_ftype_uint64_unsigned_unsigned;
23425           break;
23426         case UCHAR_FTYPE_USHORT_UINT_USHORT:
23427           type = uchar_ftype_ushort_unsigned_ushort;
23428           break;
23429         case UCHAR_FTYPE_UINT_UINT_UINT:
23430           type = uchar_ftype_unsigned_unsigned_unsigned;
23431           break;
23432         case UCHAR_FTYPE_UINT64_UINT_UINT:
23433           type = uchar_ftype_uint64_unsigned_unsigned;
23434           break;
23435
23436         default:
23437           gcc_unreachable ();
23438         }
23439
23440       def_builtin (d->mask, d->name, type, d->code);
23441     }
23442
23443   /* Add all builtins with variable number of operands.  */
23444   for (i = 0, d = bdesc_args;
23445        i < ARRAY_SIZE (bdesc_args);
23446        i++, d++)
23447     {
23448       tree type;
23449
23450       if (d->name == 0)
23451         continue;
23452
23453       switch ((enum ix86_builtin_type) d->flag)
23454         {
23455         case FLOAT_FTYPE_FLOAT:
23456           type = float_ftype_float;
23457           break;
23458         case INT_FTYPE_V8SF_V8SF_PTEST:
23459           type = int_ftype_v8sf_v8sf;
23460           break;
23461         case INT_FTYPE_V4DI_V4DI_PTEST:
23462           type = int_ftype_v4di_v4di;
23463           break;
23464         case INT_FTYPE_V4DF_V4DF_PTEST:
23465           type = int_ftype_v4df_v4df;
23466           break;
23467         case INT_FTYPE_V4SF_V4SF_PTEST:
23468           type = int_ftype_v4sf_v4sf;
23469           break;
23470         case INT_FTYPE_V2DI_V2DI_PTEST:
23471           type = int_ftype_v2di_v2di;
23472           break;
23473         case INT_FTYPE_V2DF_V2DF_PTEST:
23474           type = int_ftype_v2df_v2df;
23475           break;
23476         case INT_FTYPE_INT:
23477           type = int_ftype_int;
23478           break;
23479         case UINT64_FTYPE_INT:
23480           type = uint64_ftype_int;
23481           break;
23482         case INT64_FTYPE_INT64:
23483           type = int64_ftype_int64;
23484           break;
23485         case INT64_FTYPE_V4SF:
23486           type = int64_ftype_v4sf;
23487           break;
23488         case INT64_FTYPE_V2DF:
23489           type = int64_ftype_v2df;
23490           break;
23491         case INT_FTYPE_V16QI:
23492           type = int_ftype_v16qi;
23493           break;
23494         case INT_FTYPE_V8QI:
23495           type = int_ftype_v8qi;
23496           break;
23497         case INT_FTYPE_V8SF:
23498           type = int_ftype_v8sf;
23499           break;
23500         case INT_FTYPE_V4DF:
23501           type = int_ftype_v4df;
23502           break;
23503         case INT_FTYPE_V4SF:
23504           type = int_ftype_v4sf;
23505           break;
23506         case INT_FTYPE_V2DF:
23507           type = int_ftype_v2df;
23508           break;
23509         case V16QI_FTYPE_V16QI:
23510           type = v16qi_ftype_v16qi;
23511           break;
23512         case V8SI_FTYPE_V8SF:
23513           type = v8si_ftype_v8sf;
23514           break;
23515         case V8SI_FTYPE_V4SI:
23516           type = v8si_ftype_v4si;
23517           break;
23518         case V8HI_FTYPE_V8HI:
23519           type = v8hi_ftype_v8hi;
23520           break;
23521         case V8HI_FTYPE_V16QI:
23522           type = v8hi_ftype_v16qi;
23523           break;
23524         case V8QI_FTYPE_V8QI:
23525           type = v8qi_ftype_v8qi;
23526           break;
23527         case V8SF_FTYPE_V8SF:
23528           type = v8sf_ftype_v8sf;
23529           break;
23530         case V8SF_FTYPE_V8SI:
23531           type = v8sf_ftype_v8si;
23532           break;
23533         case V8SF_FTYPE_V4SF:
23534           type = v8sf_ftype_v4sf;
23535           break;
23536         case V4SI_FTYPE_V4DF:
23537           type = v4si_ftype_v4df;
23538           break;
23539         case V4SI_FTYPE_V4SI:
23540           type = v4si_ftype_v4si;
23541           break;
23542         case V4SI_FTYPE_V16QI:
23543           type = v4si_ftype_v16qi;
23544           break;
23545         case V4SI_FTYPE_V8SI:
23546           type = v4si_ftype_v8si;
23547           break;
23548         case V4SI_FTYPE_V8HI:
23549           type = v4si_ftype_v8hi;
23550           break;
23551         case V4SI_FTYPE_V4SF:
23552           type = v4si_ftype_v4sf;
23553           break;
23554         case V4SI_FTYPE_V2DF:
23555           type = v4si_ftype_v2df;
23556           break;
23557         case V4HI_FTYPE_V4HI:
23558           type = v4hi_ftype_v4hi;
23559           break;
23560         case V4DF_FTYPE_V4DF:
23561           type = v4df_ftype_v4df;
23562           break;
23563         case V4DF_FTYPE_V4SI:
23564           type = v4df_ftype_v4si;
23565           break;
23566         case V4DF_FTYPE_V4SF:
23567           type = v4df_ftype_v4sf;
23568           break;
23569         case V4DF_FTYPE_V2DF:
23570           type = v4df_ftype_v2df;
23571           break;
23572         case V4SF_FTYPE_V4SF:
23573         case V4SF_FTYPE_V4SF_VEC_MERGE:
23574           type = v4sf_ftype_v4sf;
23575           break;
23576         case V4SF_FTYPE_V8SF:
23577           type = v4sf_ftype_v8sf;
23578           break;
23579         case V4SF_FTYPE_V4SI:
23580           type = v4sf_ftype_v4si;
23581           break;
23582         case V4SF_FTYPE_V4DF:
23583           type = v4sf_ftype_v4df;
23584           break;
23585         case V4SF_FTYPE_V2DF:
23586           type = v4sf_ftype_v2df;
23587           break;
23588         case V2DI_FTYPE_V2DI:
23589           type = v2di_ftype_v2di;
23590           break;
23591         case V2DI_FTYPE_V16QI:
23592           type = v2di_ftype_v16qi;
23593           break;
23594         case V2DI_FTYPE_V8HI:
23595           type = v2di_ftype_v8hi;
23596           break;
23597         case V2DI_FTYPE_V4SI:
23598           type = v2di_ftype_v4si;
23599           break;
23600         case V2SI_FTYPE_V2SI:
23601           type = v2si_ftype_v2si;
23602           break;
23603         case V2SI_FTYPE_V4SF:
23604           type = v2si_ftype_v4sf;
23605           break;
23606         case V2SI_FTYPE_V2DF:
23607           type = v2si_ftype_v2df;
23608           break;
23609         case V2SI_FTYPE_V2SF:
23610           type = v2si_ftype_v2sf;
23611           break;
23612         case V2DF_FTYPE_V4DF:
23613           type = v2df_ftype_v4df;
23614           break;
23615         case V2DF_FTYPE_V4SF:
23616           type = v2df_ftype_v4sf;
23617           break;
23618         case V2DF_FTYPE_V2DF:
23619         case V2DF_FTYPE_V2DF_VEC_MERGE:
23620           type = v2df_ftype_v2df;
23621           break;
23622         case V2DF_FTYPE_V2SI:
23623           type = v2df_ftype_v2si;
23624           break;
23625         case V2DF_FTYPE_V4SI:
23626           type = v2df_ftype_v4si;
23627           break;
23628         case V2SF_FTYPE_V2SF:
23629           type = v2sf_ftype_v2sf;
23630           break;
23631         case V2SF_FTYPE_V2SI:
23632           type = v2sf_ftype_v2si;
23633           break;
23634         case V16QI_FTYPE_V16QI_V16QI:
23635           type = v16qi_ftype_v16qi_v16qi;
23636           break;
23637         case V16QI_FTYPE_V8HI_V8HI:
23638           type = v16qi_ftype_v8hi_v8hi;
23639           break;
23640         case V8QI_FTYPE_V8QI_V8QI:
23641           type = v8qi_ftype_v8qi_v8qi;
23642           break;
23643         case V8QI_FTYPE_V4HI_V4HI:
23644           type = v8qi_ftype_v4hi_v4hi;
23645           break;
23646         case V8HI_FTYPE_V8HI_V8HI:
23647         case V8HI_FTYPE_V8HI_V8HI_COUNT:
23648           type = v8hi_ftype_v8hi_v8hi;
23649           break;
23650         case V8HI_FTYPE_V16QI_V16QI:
23651           type = v8hi_ftype_v16qi_v16qi;
23652           break;
23653         case V8HI_FTYPE_V4SI_V4SI:
23654           type = v8hi_ftype_v4si_v4si;
23655           break;
23656         case V8HI_FTYPE_V8HI_SI_COUNT:
23657           type = v8hi_ftype_v8hi_int;
23658           break;
23659         case V8SF_FTYPE_V8SF_V8SF:
23660           type = v8sf_ftype_v8sf_v8sf;
23661           break;
23662         case V8SF_FTYPE_V8SF_V8SI:
23663           type = v8sf_ftype_v8sf_v8si;
23664           break;
23665         case V4SI_FTYPE_V4SI_V4SI:
23666         case V4SI_FTYPE_V4SI_V4SI_COUNT:
23667           type = v4si_ftype_v4si_v4si;
23668           break;
23669         case V4SI_FTYPE_V8HI_V8HI:
23670           type = v4si_ftype_v8hi_v8hi;
23671           break;
23672         case V4SI_FTYPE_V4SF_V4SF:
23673           type = v4si_ftype_v4sf_v4sf;
23674           break;
23675         case V4SI_FTYPE_V2DF_V2DF:
23676           type = v4si_ftype_v2df_v2df;
23677           break;
23678         case V4SI_FTYPE_V4SI_SI_COUNT:
23679           type = v4si_ftype_v4si_int;
23680           break;
23681         case V4HI_FTYPE_V4HI_V4HI:
23682         case V4HI_FTYPE_V4HI_V4HI_COUNT:
23683           type = v4hi_ftype_v4hi_v4hi;
23684           break;
23685         case V4HI_FTYPE_V8QI_V8QI:
23686           type = v4hi_ftype_v8qi_v8qi;
23687           break;
23688         case V4HI_FTYPE_V2SI_V2SI:
23689           type = v4hi_ftype_v2si_v2si;
23690           break;
23691         case V4HI_FTYPE_V4HI_SI_COUNT:
23692           type = v4hi_ftype_v4hi_int;
23693           break;
23694         case V4DF_FTYPE_V4DF_V4DF:
23695           type = v4df_ftype_v4df_v4df;
23696           break;
23697         case V4DF_FTYPE_V4DF_V4DI:
23698           type = v4df_ftype_v4df_v4di;
23699           break;
23700         case V4SF_FTYPE_V4SF_V4SF:
23701         case V4SF_FTYPE_V4SF_V4SF_SWAP:
23702           type = v4sf_ftype_v4sf_v4sf;
23703           break;
23704         case V4SF_FTYPE_V4SF_V4SI:
23705           type = v4sf_ftype_v4sf_v4si;
23706           break;
23707         case V4SF_FTYPE_V4SF_V2SI:
23708           type = v4sf_ftype_v4sf_v2si;
23709           break;
23710         case V4SF_FTYPE_V4SF_V2DF:
23711           type = v4sf_ftype_v4sf_v2df;
23712           break;
23713         case V4SF_FTYPE_V4SF_DI:
23714           type = v4sf_ftype_v4sf_int64;
23715           break;
23716         case V4SF_FTYPE_V4SF_SI:
23717           type = v4sf_ftype_v4sf_int;
23718           break;
23719         case V2DI_FTYPE_V2DI_V2DI:
23720         case V2DI_FTYPE_V2DI_V2DI_COUNT:
23721           type = v2di_ftype_v2di_v2di;
23722           break;
23723         case V2DI_FTYPE_V16QI_V16QI:
23724           type = v2di_ftype_v16qi_v16qi;
23725           break;
23726         case V2DI_FTYPE_V4SI_V4SI:
23727           type = v2di_ftype_v4si_v4si;
23728           break;
23729         case V2DI_FTYPE_V2DI_V16QI:
23730           type = v2di_ftype_v2di_v16qi;
23731           break;
23732         case V2DI_FTYPE_V2DF_V2DF:
23733           type = v2di_ftype_v2df_v2df;
23734           break;
23735         case V2DI_FTYPE_V2DI_SI_COUNT:
23736           type = v2di_ftype_v2di_int;
23737           break;
23738         case V2SI_FTYPE_V2SI_V2SI:
23739         case V2SI_FTYPE_V2SI_V2SI_COUNT:
23740           type = v2si_ftype_v2si_v2si;
23741           break;
23742         case V2SI_FTYPE_V4HI_V4HI:
23743           type = v2si_ftype_v4hi_v4hi;
23744           break;
23745         case V2SI_FTYPE_V2SF_V2SF:
23746           type = v2si_ftype_v2sf_v2sf;
23747           break;
23748         case V2SI_FTYPE_V2SI_SI_COUNT:
23749           type = v2si_ftype_v2si_int;
23750           break;
23751         case V2DF_FTYPE_V2DF_V2DF:
23752         case V2DF_FTYPE_V2DF_V2DF_SWAP:
23753           type = v2df_ftype_v2df_v2df;
23754           break;
23755         case V2DF_FTYPE_V2DF_V4SF:
23756           type = v2df_ftype_v2df_v4sf;
23757           break;
23758         case V2DF_FTYPE_V2DF_V2DI:
23759           type = v2df_ftype_v2df_v2di;
23760           break;
23761         case V2DF_FTYPE_V2DF_DI:
23762           type = v2df_ftype_v2df_int64;
23763           break;
23764         case V2DF_FTYPE_V2DF_SI:
23765           type = v2df_ftype_v2df_int;
23766           break;
23767         case V2SF_FTYPE_V2SF_V2SF:
23768           type = v2sf_ftype_v2sf_v2sf;
23769           break;
23770         case V1DI_FTYPE_V1DI_V1DI:
23771         case V1DI_FTYPE_V1DI_V1DI_COUNT:
23772           type = v1di_ftype_v1di_v1di;
23773           break;
23774         case V1DI_FTYPE_V8QI_V8QI:
23775           type = v1di_ftype_v8qi_v8qi;
23776           break;
23777         case V1DI_FTYPE_V2SI_V2SI:
23778           type = v1di_ftype_v2si_v2si;
23779           break;
23780         case V1DI_FTYPE_V1DI_SI_COUNT:
23781           type = v1di_ftype_v1di_int;
23782           break;
23783         case UINT64_FTYPE_UINT64_UINT64:
23784           type = uint64_ftype_uint64_uint64;
23785           break;
23786         case UINT_FTYPE_UINT_UINT:
23787           type = unsigned_ftype_unsigned_unsigned;
23788           break;
23789         case UINT_FTYPE_UINT_USHORT:
23790           type = unsigned_ftype_unsigned_ushort;
23791           break;
23792         case UINT_FTYPE_UINT_UCHAR:
23793           type = unsigned_ftype_unsigned_uchar;
23794           break;
23795         case UINT16_FTYPE_UINT16_INT:
23796           type = ushort_ftype_ushort_int;
23797           break;
23798         case UINT8_FTYPE_UINT8_INT:
23799           type = uchar_ftype_uchar_int;
23800           break;
23801         case V8HI_FTYPE_V8HI_INT:
23802           type = v8hi_ftype_v8hi_int;
23803           break;
23804         case V8SF_FTYPE_V8SF_INT:
23805           type = v8sf_ftype_v8sf_int;
23806           break;
23807         case V4SI_FTYPE_V4SI_INT:
23808           type = v4si_ftype_v4si_int;
23809           break;
23810         case V4SI_FTYPE_V8SI_INT:
23811           type = v4si_ftype_v8si_int;
23812           break;
23813         case V4HI_FTYPE_V4HI_INT:
23814           type = v4hi_ftype_v4hi_int;
23815           break;
23816         case V4DF_FTYPE_V4DF_INT:
23817           type = v4df_ftype_v4df_int;
23818           break;
23819         case V4SF_FTYPE_V4SF_INT:
23820           type = v4sf_ftype_v4sf_int;
23821           break;
23822         case V4SF_FTYPE_V8SF_INT:
23823           type = v4sf_ftype_v8sf_int;
23824           break;
23825         case V2DI_FTYPE_V2DI_INT:
23826         case V2DI2TI_FTYPE_V2DI_INT:
23827           type = v2di_ftype_v2di_int;
23828           break;
23829         case V2DF_FTYPE_V2DF_INT:
23830           type = v2df_ftype_v2df_int;
23831           break;
23832         case V2DF_FTYPE_V4DF_INT:
23833           type = v2df_ftype_v4df_int;
23834           break;
23835         case V16QI_FTYPE_V16QI_V16QI_V16QI:
23836           type = v16qi_ftype_v16qi_v16qi_v16qi;
23837           break;
23838         case V8SF_FTYPE_V8SF_V8SF_V8SF:
23839           type = v8sf_ftype_v8sf_v8sf_v8sf;
23840           break;
23841         case V4DF_FTYPE_V4DF_V4DF_V4DF:
23842           type = v4df_ftype_v4df_v4df_v4df;
23843           break;
23844         case V4SF_FTYPE_V4SF_V4SF_V4SF:
23845           type = v4sf_ftype_v4sf_v4sf_v4sf;
23846           break;
23847         case V2DF_FTYPE_V2DF_V2DF_V2DF:
23848           type = v2df_ftype_v2df_v2df_v2df;
23849           break;
23850         case V16QI_FTYPE_V16QI_V16QI_INT:
23851           type = v16qi_ftype_v16qi_v16qi_int;
23852           break;
23853         case V8SI_FTYPE_V8SI_V8SI_INT:
23854           type = v8si_ftype_v8si_v8si_int;
23855           break;
23856         case V8SI_FTYPE_V8SI_V4SI_INT:
23857           type = v8si_ftype_v8si_v4si_int;
23858           break;
23859         case V8HI_FTYPE_V8HI_V8HI_INT:
23860           type = v8hi_ftype_v8hi_v8hi_int;
23861           break;
23862         case V8SF_FTYPE_V8SF_V8SF_INT:
23863           type = v8sf_ftype_v8sf_v8sf_int;
23864           break;
23865         case V8SF_FTYPE_V8SF_V4SF_INT:
23866           type = v8sf_ftype_v8sf_v4sf_int;
23867           break;
23868         case V4SI_FTYPE_V4SI_V4SI_INT:
23869           type = v4si_ftype_v4si_v4si_int;
23870           break;
23871         case V4DF_FTYPE_V4DF_V4DF_INT:
23872           type = v4df_ftype_v4df_v4df_int;
23873           break;
23874         case V4DF_FTYPE_V4DF_V2DF_INT:
23875           type = v4df_ftype_v4df_v2df_int;
23876           break;
23877         case V4SF_FTYPE_V4SF_V4SF_INT:
23878           type = v4sf_ftype_v4sf_v4sf_int;
23879           break;
23880         case V2DI_FTYPE_V2DI_V2DI_INT:
23881         case V2DI2TI_FTYPE_V2DI_V2DI_INT:
23882           type = v2di_ftype_v2di_v2di_int;
23883           break;
23884         case V2DF_FTYPE_V2DF_V2DF_INT:
23885           type = v2df_ftype_v2df_v2df_int;
23886           break;
23887         case V2DI_FTYPE_V2DI_UINT_UINT:
23888           type = v2di_ftype_v2di_unsigned_unsigned;
23889           break;
23890         case V2DI_FTYPE_V2DI_V2DI_UINT_UINT:
23891           type = v2di_ftype_v2di_v2di_unsigned_unsigned;
23892           break;
23893         case V1DI2DI_FTYPE_V1DI_V1DI_INT:
23894           type = v1di_ftype_v1di_v1di_int;
23895           break;
23896         default:
23897           gcc_unreachable ();
23898         }
23899
23900       def_builtin_const (d->mask, d->name, type, d->code);
23901     }
23902
23903   /* pcmpestr[im] insns.  */
23904   for (i = 0, d = bdesc_pcmpestr;
23905        i < ARRAY_SIZE (bdesc_pcmpestr);
23906        i++, d++)
23907     {
23908       if (d->code == IX86_BUILTIN_PCMPESTRM128)
23909         ftype = v16qi_ftype_v16qi_int_v16qi_int_int;
23910       else
23911         ftype = int_ftype_v16qi_int_v16qi_int_int;
23912       def_builtin_const (d->mask, d->name, ftype, d->code);
23913     }
23914
23915   /* pcmpistr[im] insns.  */
23916   for (i = 0, d = bdesc_pcmpistr;
23917        i < ARRAY_SIZE (bdesc_pcmpistr);
23918        i++, d++)
23919     {
23920       if (d->code == IX86_BUILTIN_PCMPISTRM128)
23921         ftype = v16qi_ftype_v16qi_v16qi_int;
23922       else
23923         ftype = int_ftype_v16qi_v16qi_int;
23924       def_builtin_const (d->mask, d->name, ftype, d->code);
23925     }
23926
23927   /* comi/ucomi insns.  */
23928   for (i = 0, d = bdesc_comi; i < ARRAY_SIZE (bdesc_comi); i++, d++)
23929     if (d->mask == OPTION_MASK_ISA_SSE2)
23930       def_builtin_const (d->mask, d->name, int_ftype_v2df_v2df, d->code);
23931     else
23932       def_builtin_const (d->mask, d->name, int_ftype_v4sf_v4sf, d->code);
23933
23934   /* SSE */
23935   def_builtin (OPTION_MASK_ISA_SSE, "__builtin_ia32_ldmxcsr", void_ftype_unsigned, IX86_BUILTIN_LDMXCSR);
23936   def_builtin (OPTION_MASK_ISA_SSE, "__builtin_ia32_stmxcsr", unsigned_ftype_void, IX86_BUILTIN_STMXCSR);
23937
23938   /* SSE or 3DNow!A */
23939   def_builtin (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, "__builtin_ia32_maskmovq", void_ftype_v8qi_v8qi_pchar, IX86_BUILTIN_MASKMOVQ);
23940
23941   /* SSE2 */
23942   def_builtin (OPTION_MASK_ISA_SSE2, "__builtin_ia32_maskmovdqu", void_ftype_v16qi_v16qi_pchar, IX86_BUILTIN_MASKMOVDQU);
23943
23944   def_builtin (OPTION_MASK_ISA_SSE2, "__builtin_ia32_clflush", void_ftype_pcvoid, IX86_BUILTIN_CLFLUSH);
23945   x86_mfence = def_builtin (OPTION_MASK_ISA_SSE2, "__builtin_ia32_mfence", void_ftype_void, IX86_BUILTIN_MFENCE);
23946
23947   /* SSE3.  */
23948   def_builtin (OPTION_MASK_ISA_SSE3, "__builtin_ia32_monitor", void_ftype_pcvoid_unsigned_unsigned, IX86_BUILTIN_MONITOR);
23949   def_builtin (OPTION_MASK_ISA_SSE3, "__builtin_ia32_mwait", void_ftype_unsigned_unsigned, IX86_BUILTIN_MWAIT);
23950
23951   /* AES */
23952   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesenc128", v2di_ftype_v2di_v2di, IX86_BUILTIN_AESENC128);
23953   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesenclast128", v2di_ftype_v2di_v2di, IX86_BUILTIN_AESENCLAST128);
23954   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesdec128", v2di_ftype_v2di_v2di, IX86_BUILTIN_AESDEC128);
23955   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesdeclast128", v2di_ftype_v2di_v2di, IX86_BUILTIN_AESDECLAST128);
23956   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesimc128", v2di_ftype_v2di, IX86_BUILTIN_AESIMC128);
23957   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aeskeygenassist128", v2di_ftype_v2di_int, IX86_BUILTIN_AESKEYGENASSIST128);
23958
23959   /* PCLMUL */
23960   def_builtin_const (OPTION_MASK_ISA_PCLMUL, "__builtin_ia32_pclmulqdq128", v2di_ftype_v2di_v2di_int, IX86_BUILTIN_PCLMULQDQ128);
23961
23962   /* AVX */
23963   def_builtin (OPTION_MASK_ISA_AVX, "__builtin_ia32_vzeroupper", void_ftype_void,
23964                TARGET_64BIT ? IX86_BUILTIN_VZEROUPPER_REX64 : IX86_BUILTIN_VZEROUPPER);
23965
23966   /* Access to the vec_init patterns.  */
23967   ftype = build_function_type_list (V2SI_type_node, integer_type_node,
23968                                     integer_type_node, NULL_TREE);
23969   def_builtin_const (OPTION_MASK_ISA_MMX, "__builtin_ia32_vec_init_v2si", ftype, IX86_BUILTIN_VEC_INIT_V2SI);
23970
23971   ftype = build_function_type_list (V4HI_type_node, short_integer_type_node,
23972                                     short_integer_type_node,
23973                                     short_integer_type_node,
23974                                     short_integer_type_node, NULL_TREE);
23975   def_builtin_const (OPTION_MASK_ISA_MMX, "__builtin_ia32_vec_init_v4hi", ftype, IX86_BUILTIN_VEC_INIT_V4HI);
23976
23977   ftype = build_function_type_list (V8QI_type_node, char_type_node,
23978                                     char_type_node, char_type_node,
23979                                     char_type_node, char_type_node,
23980                                     char_type_node, char_type_node,
23981                                     char_type_node, NULL_TREE);
23982   def_builtin_const (OPTION_MASK_ISA_MMX, "__builtin_ia32_vec_init_v8qi", ftype, IX86_BUILTIN_VEC_INIT_V8QI);
23983
23984   /* Access to the vec_extract patterns.  */
23985   ftype = build_function_type_list (double_type_node, V2DF_type_node,
23986                                     integer_type_node, NULL_TREE);
23987   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v2df", ftype, IX86_BUILTIN_VEC_EXT_V2DF);
23988
23989   ftype = build_function_type_list (long_long_integer_type_node,
23990                                     V2DI_type_node, integer_type_node,
23991                                     NULL_TREE);
23992   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v2di", ftype, IX86_BUILTIN_VEC_EXT_V2DI);
23993
23994   ftype = build_function_type_list (float_type_node, V4SF_type_node,
23995                                     integer_type_node, NULL_TREE);
23996   def_builtin_const (OPTION_MASK_ISA_SSE, "__builtin_ia32_vec_ext_v4sf", ftype, IX86_BUILTIN_VEC_EXT_V4SF);
23997
23998   ftype = build_function_type_list (intSI_type_node, V4SI_type_node,
23999                                     integer_type_node, NULL_TREE);
24000   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v4si", ftype, IX86_BUILTIN_VEC_EXT_V4SI);
24001
24002   ftype = build_function_type_list (intHI_type_node, V8HI_type_node,
24003                                     integer_type_node, NULL_TREE);
24004   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v8hi", ftype, IX86_BUILTIN_VEC_EXT_V8HI);
24005
24006   ftype = build_function_type_list (intHI_type_node, V4HI_type_node,
24007                                     integer_type_node, NULL_TREE);
24008   def_builtin_const (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, "__builtin_ia32_vec_ext_v4hi", ftype, IX86_BUILTIN_VEC_EXT_V4HI);
24009
24010   ftype = build_function_type_list (intSI_type_node, V2SI_type_node,
24011                                     integer_type_node, NULL_TREE);
24012   def_builtin_const (OPTION_MASK_ISA_MMX, "__builtin_ia32_vec_ext_v2si", ftype, IX86_BUILTIN_VEC_EXT_V2SI);
24013
24014   ftype = build_function_type_list (intQI_type_node, V16QI_type_node,
24015                                     integer_type_node, NULL_TREE);
24016   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v16qi", ftype, IX86_BUILTIN_VEC_EXT_V16QI);
24017
24018   /* Access to the vec_set patterns.  */
24019   ftype = build_function_type_list (V2DI_type_node, V2DI_type_node,
24020                                     intDI_type_node,
24021                                     integer_type_node, NULL_TREE);
24022   def_builtin_const (OPTION_MASK_ISA_SSE4_1 | OPTION_MASK_ISA_64BIT, "__builtin_ia32_vec_set_v2di", ftype, IX86_BUILTIN_VEC_SET_V2DI);
24023
24024   ftype = build_function_type_list (V4SF_type_node, V4SF_type_node,
24025                                     float_type_node,
24026                                     integer_type_node, NULL_TREE);
24027   def_builtin_const (OPTION_MASK_ISA_SSE4_1, "__builtin_ia32_vec_set_v4sf", ftype, IX86_BUILTIN_VEC_SET_V4SF);
24028
24029   ftype = build_function_type_list (V4SI_type_node, V4SI_type_node,
24030                                     intSI_type_node,
24031                                     integer_type_node, NULL_TREE);
24032   def_builtin_const (OPTION_MASK_ISA_SSE4_1, "__builtin_ia32_vec_set_v4si", ftype, IX86_BUILTIN_VEC_SET_V4SI);
24033
24034   ftype = build_function_type_list (V8HI_type_node, V8HI_type_node,
24035                                     intHI_type_node,
24036                                     integer_type_node, NULL_TREE);
24037   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_set_v8hi", ftype, IX86_BUILTIN_VEC_SET_V8HI);
24038
24039   ftype = build_function_type_list (V4HI_type_node, V4HI_type_node,
24040                                     intHI_type_node,
24041                                     integer_type_node, NULL_TREE);
24042   def_builtin_const (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, "__builtin_ia32_vec_set_v4hi", ftype, IX86_BUILTIN_VEC_SET_V4HI);
24043
24044   ftype = build_function_type_list (V16QI_type_node, V16QI_type_node,
24045                                     intQI_type_node,
24046                                     integer_type_node, NULL_TREE);
24047   def_builtin_const (OPTION_MASK_ISA_SSE4_1, "__builtin_ia32_vec_set_v16qi", ftype, IX86_BUILTIN_VEC_SET_V16QI);
24048   /* Add FMA4 multi-arg argument instructions */
24049   for (i = 0, d = bdesc_multi_arg; i < ARRAY_SIZE (bdesc_multi_arg); i++, d++)
24050     {
24051       tree mtype = NULL_TREE;
24052
24053       if (d->name == 0)
24054         continue;
24055
24056       switch ((enum multi_arg_type)d->flag)
24057         {
24058         case MULTI_ARG_3_SF:     mtype = v4sf_ftype_v4sf_v4sf_v4sf;     break;
24059         case MULTI_ARG_3_DF:     mtype = v2df_ftype_v2df_v2df_v2df;     break;
24060         case MULTI_ARG_3_SF2:    mtype = v8sf_ftype_v8sf_v8sf_v8sf;     break;
24061         case MULTI_ARG_3_DF2:    mtype = v4df_ftype_v4df_v4df_v4df;     break;
24062         case MULTI_ARG_3_DI:     mtype = v2di_ftype_v2di_v2di_v2di;     break;
24063         case MULTI_ARG_3_SI:     mtype = v4si_ftype_v4si_v4si_v4si;     break;
24064         case MULTI_ARG_3_SI_DI:  mtype = v4si_ftype_v4si_v4si_v2di;     break;
24065         case MULTI_ARG_3_HI:     mtype = v8hi_ftype_v8hi_v8hi_v8hi;     break;
24066         case MULTI_ARG_3_HI_SI:  mtype = v8hi_ftype_v8hi_v8hi_v4si;     break;
24067         case MULTI_ARG_3_QI:     mtype = v16qi_ftype_v16qi_v16qi_v16qi; break;
24068         case MULTI_ARG_3_DI2:    mtype = v4di_ftype_v4di_v4di_v4di;     break;
24069         case MULTI_ARG_3_SI2:    mtype = v8si_ftype_v8si_v8si_v8si;     break;
24070         case MULTI_ARG_3_HI2:    mtype = v16hi_ftype_v16hi_v16hi_v16hi; break;
24071         case MULTI_ARG_3_QI2:    mtype = v32qi_ftype_v32qi_v32qi_v32qi; break;
24072         case MULTI_ARG_2_SF:     mtype = v4sf_ftype_v4sf_v4sf;          break;
24073         case MULTI_ARG_2_DF:     mtype = v2df_ftype_v2df_v2df;          break;
24074         case MULTI_ARG_2_DI:     mtype = v2di_ftype_v2di_v2di;          break;
24075         case MULTI_ARG_2_SI:     mtype = v4si_ftype_v4si_v4si;          break;
24076         case MULTI_ARG_2_HI:     mtype = v8hi_ftype_v8hi_v8hi;          break;
24077         case MULTI_ARG_2_QI:     mtype = v16qi_ftype_v16qi_v16qi;       break;
24078         case MULTI_ARG_2_DI_IMM: mtype = v2di_ftype_v2di_si;            break;
24079         case MULTI_ARG_2_SI_IMM: mtype = v4si_ftype_v4si_si;            break;
24080         case MULTI_ARG_2_HI_IMM: mtype = v8hi_ftype_v8hi_si;            break;
24081         case MULTI_ARG_2_QI_IMM: mtype = v16qi_ftype_v16qi_si;          break;
24082         case MULTI_ARG_2_DI_CMP: mtype = v2di_ftype_v2di_v2di;          break;
24083         case MULTI_ARG_2_SI_CMP: mtype = v4si_ftype_v4si_v4si;          break;
24084         case MULTI_ARG_2_HI_CMP: mtype = v8hi_ftype_v8hi_v8hi;          break;
24085         case MULTI_ARG_2_QI_CMP: mtype = v16qi_ftype_v16qi_v16qi;       break;
24086         case MULTI_ARG_2_SF_TF:  mtype = v4sf_ftype_v4sf_v4sf;          break;
24087         case MULTI_ARG_2_DF_TF:  mtype = v2df_ftype_v2df_v2df;          break;
24088         case MULTI_ARG_2_DI_TF:  mtype = v2di_ftype_v2di_v2di;          break;
24089         case MULTI_ARG_2_SI_TF:  mtype = v4si_ftype_v4si_v4si;          break;
24090         case MULTI_ARG_2_HI_TF:  mtype = v8hi_ftype_v8hi_v8hi;          break;
24091         case MULTI_ARG_2_QI_TF:  mtype = v16qi_ftype_v16qi_v16qi;       break;
24092         case MULTI_ARG_1_SF:     mtype = v4sf_ftype_v4sf;               break;
24093         case MULTI_ARG_1_DF:     mtype = v2df_ftype_v2df;               break;
24094         case MULTI_ARG_1_SF2:    mtype = v8sf_ftype_v8sf;               break;
24095         case MULTI_ARG_1_DF2:    mtype = v4df_ftype_v4df;               break;
24096         case MULTI_ARG_1_DI:     mtype = v2di_ftype_v2di;               break;
24097         case MULTI_ARG_1_SI:     mtype = v4si_ftype_v4si;               break;
24098         case MULTI_ARG_1_HI:     mtype = v8hi_ftype_v8hi;               break;
24099         case MULTI_ARG_1_QI:     mtype = v16qi_ftype_v16qi;             break;
24100         case MULTI_ARG_1_SI_DI:  mtype = v2di_ftype_v4si;               break;
24101         case MULTI_ARG_1_HI_DI:  mtype = v2di_ftype_v8hi;               break;
24102         case MULTI_ARG_1_HI_SI:  mtype = v4si_ftype_v8hi;               break;
24103         case MULTI_ARG_1_QI_DI:  mtype = v2di_ftype_v16qi;              break;
24104         case MULTI_ARG_1_QI_SI:  mtype = v4si_ftype_v16qi;              break;
24105         case MULTI_ARG_1_QI_HI:  mtype = v8hi_ftype_v16qi;              break;
24106
24107         case MULTI_ARG_UNKNOWN:
24108         default:
24109           gcc_unreachable ();
24110         }
24111
24112       if (mtype)
24113         def_builtin_const (d->mask, d->name, mtype, d->code);
24114     }
24115 }
24116
24117 /* Internal method for ix86_init_builtins.  */
24118
24119 static void
24120 ix86_init_builtins_va_builtins_abi (void)
24121 {
24122   tree ms_va_ref, sysv_va_ref;
24123   tree fnvoid_va_end_ms, fnvoid_va_end_sysv;
24124   tree fnvoid_va_start_ms, fnvoid_va_start_sysv;
24125   tree fnvoid_va_copy_ms, fnvoid_va_copy_sysv;
24126   tree fnattr_ms = NULL_TREE, fnattr_sysv = NULL_TREE;
24127
24128   if (!TARGET_64BIT)
24129     return;
24130   fnattr_ms = build_tree_list (get_identifier ("ms_abi"), NULL_TREE);
24131   fnattr_sysv = build_tree_list (get_identifier ("sysv_abi"), NULL_TREE);
24132   ms_va_ref = build_reference_type (ms_va_list_type_node);
24133   sysv_va_ref =
24134     build_pointer_type (TREE_TYPE (sysv_va_list_type_node));
24135
24136   fnvoid_va_end_ms =
24137     build_function_type_list (void_type_node, ms_va_ref, NULL_TREE);
24138   fnvoid_va_start_ms =
24139     build_varargs_function_type_list (void_type_node, ms_va_ref, NULL_TREE);
24140   fnvoid_va_end_sysv =
24141     build_function_type_list (void_type_node, sysv_va_ref, NULL_TREE);
24142   fnvoid_va_start_sysv =
24143     build_varargs_function_type_list (void_type_node, sysv_va_ref,
24144                                        NULL_TREE);
24145   fnvoid_va_copy_ms =
24146     build_function_type_list (void_type_node, ms_va_ref, ms_va_list_type_node,
24147                               NULL_TREE);
24148   fnvoid_va_copy_sysv =
24149     build_function_type_list (void_type_node, sysv_va_ref,
24150                               sysv_va_ref, NULL_TREE);
24151
24152   add_builtin_function ("__builtin_ms_va_start", fnvoid_va_start_ms,
24153                         BUILT_IN_VA_START, BUILT_IN_NORMAL, NULL, fnattr_ms);
24154   add_builtin_function ("__builtin_ms_va_end", fnvoid_va_end_ms,
24155                         BUILT_IN_VA_END, BUILT_IN_NORMAL, NULL, fnattr_ms);
24156   add_builtin_function ("__builtin_ms_va_copy", fnvoid_va_copy_ms,
24157                         BUILT_IN_VA_COPY, BUILT_IN_NORMAL, NULL, fnattr_ms);
24158   add_builtin_function ("__builtin_sysv_va_start", fnvoid_va_start_sysv,
24159                         BUILT_IN_VA_START, BUILT_IN_NORMAL, NULL, fnattr_sysv);
24160   add_builtin_function ("__builtin_sysv_va_end", fnvoid_va_end_sysv,
24161                         BUILT_IN_VA_END, BUILT_IN_NORMAL, NULL, fnattr_sysv);
24162   add_builtin_function ("__builtin_sysv_va_copy", fnvoid_va_copy_sysv,
24163                         BUILT_IN_VA_COPY, BUILT_IN_NORMAL, NULL, fnattr_sysv);
24164 }
24165
24166 static void
24167 ix86_init_builtins (void)
24168 {
24169   tree float128_type_node = make_node (REAL_TYPE);
24170   tree ftype, decl;
24171
24172   /* The __float80 type.  */
24173   if (TYPE_MODE (long_double_type_node) == XFmode)
24174     (*lang_hooks.types.register_builtin_type) (long_double_type_node,
24175                                                "__float80");
24176   else
24177     {
24178       /* The __float80 type.  */
24179       tree float80_type_node = make_node (REAL_TYPE);
24180
24181       TYPE_PRECISION (float80_type_node) = 80;
24182       layout_type (float80_type_node);
24183       (*lang_hooks.types.register_builtin_type) (float80_type_node,
24184                                                  "__float80");
24185     }
24186
24187   /* The __float128 type.  */
24188   TYPE_PRECISION (float128_type_node) = 128;
24189   layout_type (float128_type_node);
24190   (*lang_hooks.types.register_builtin_type) (float128_type_node,
24191                                              "__float128");
24192
24193   /* TFmode support builtins.  */
24194   ftype = build_function_type (float128_type_node, void_list_node);
24195   decl = add_builtin_function ("__builtin_infq", ftype,
24196                                IX86_BUILTIN_INFQ, BUILT_IN_MD,
24197                                NULL, NULL_TREE);
24198   ix86_builtins[(int) IX86_BUILTIN_INFQ] = decl;
24199
24200   decl = add_builtin_function ("__builtin_huge_valq", ftype,
24201                                IX86_BUILTIN_HUGE_VALQ, BUILT_IN_MD,
24202                                NULL, NULL_TREE);
24203   ix86_builtins[(int) IX86_BUILTIN_HUGE_VALQ] = decl;
24204
24205   /* We will expand them to normal call if SSE2 isn't available since
24206      they are used by libgcc. */
24207   ftype = build_function_type_list (float128_type_node,
24208                                     float128_type_node,
24209                                     NULL_TREE);
24210   decl = add_builtin_function ("__builtin_fabsq", ftype,
24211                                IX86_BUILTIN_FABSQ, BUILT_IN_MD,
24212                                "__fabstf2", NULL_TREE);
24213   ix86_builtins[(int) IX86_BUILTIN_FABSQ] = decl;
24214   TREE_READONLY (decl) = 1;
24215
24216   ftype = build_function_type_list (float128_type_node,
24217                                     float128_type_node,
24218                                     float128_type_node,
24219                                     NULL_TREE);
24220   decl = add_builtin_function ("__builtin_copysignq", ftype,
24221                                IX86_BUILTIN_COPYSIGNQ, BUILT_IN_MD,
24222                                "__copysigntf3", NULL_TREE);
24223   ix86_builtins[(int) IX86_BUILTIN_COPYSIGNQ] = decl;
24224   TREE_READONLY (decl) = 1;
24225
24226   ix86_init_mmx_sse_builtins ();
24227   if (TARGET_64BIT)
24228     ix86_init_builtins_va_builtins_abi ();
24229 }
24230
24231 /* Return the ix86 builtin for CODE.  */
24232
24233 static tree
24234 ix86_builtin_decl (unsigned code, bool initialize_p ATTRIBUTE_UNUSED)
24235 {
24236   if (code >= IX86_BUILTIN_MAX)
24237     return error_mark_node;
24238
24239   return ix86_builtins[code];
24240 }
24241
24242 /* Errors in the source file can cause expand_expr to return const0_rtx
24243    where we expect a vector.  To avoid crashing, use one of the vector
24244    clear instructions.  */
24245 static rtx
24246 safe_vector_operand (rtx x, enum machine_mode mode)
24247 {
24248   if (x == const0_rtx)
24249     x = CONST0_RTX (mode);
24250   return x;
24251 }
24252
24253 /* Subroutine of ix86_expand_builtin to take care of binop insns.  */
24254
24255 static rtx
24256 ix86_expand_binop_builtin (enum insn_code icode, tree exp, rtx target)
24257 {
24258   rtx pat;
24259   tree arg0 = CALL_EXPR_ARG (exp, 0);
24260   tree arg1 = CALL_EXPR_ARG (exp, 1);
24261   rtx op0 = expand_normal (arg0);
24262   rtx op1 = expand_normal (arg1);
24263   enum machine_mode tmode = insn_data[icode].operand[0].mode;
24264   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
24265   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
24266
24267   if (VECTOR_MODE_P (mode0))
24268     op0 = safe_vector_operand (op0, mode0);
24269   if (VECTOR_MODE_P (mode1))
24270     op1 = safe_vector_operand (op1, mode1);
24271
24272   if (optimize || !target
24273       || GET_MODE (target) != tmode
24274       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
24275     target = gen_reg_rtx (tmode);
24276
24277   if (GET_MODE (op1) == SImode && mode1 == TImode)
24278     {
24279       rtx x = gen_reg_rtx (V4SImode);
24280       emit_insn (gen_sse2_loadd (x, op1));
24281       op1 = gen_lowpart (TImode, x);
24282     }
24283
24284   if (!(*insn_data[icode].operand[1].predicate) (op0, mode0))
24285     op0 = copy_to_mode_reg (mode0, op0);
24286   if (!(*insn_data[icode].operand[2].predicate) (op1, mode1))
24287     op1 = copy_to_mode_reg (mode1, op1);
24288
24289   pat = GEN_FCN (icode) (target, op0, op1);
24290   if (! pat)
24291     return 0;
24292
24293   emit_insn (pat);
24294
24295   return target;
24296 }
24297
24298 /* Subroutine of ix86_expand_builtin to take care of 2-4 argument insns.  */
24299
24300 static rtx
24301 ix86_expand_multi_arg_builtin (enum insn_code icode, tree exp, rtx target,
24302                                enum multi_arg_type m_type,
24303                                enum rtx_code sub_code)
24304 {
24305   rtx pat;
24306   int i;
24307   int nargs;
24308   bool comparison_p = false;
24309   bool tf_p = false;
24310   bool last_arg_constant = false;
24311   int num_memory = 0;
24312   struct {
24313     rtx op;
24314     enum machine_mode mode;
24315   } args[4];
24316
24317   enum machine_mode tmode = insn_data[icode].operand[0].mode;
24318
24319   switch (m_type)
24320     {
24321     case MULTI_ARG_3_SF:
24322     case MULTI_ARG_3_DF:
24323     case MULTI_ARG_3_SF2:
24324     case MULTI_ARG_3_DF2:
24325     case MULTI_ARG_3_DI:
24326     case MULTI_ARG_3_SI:
24327     case MULTI_ARG_3_SI_DI:
24328     case MULTI_ARG_3_HI:
24329     case MULTI_ARG_3_HI_SI:
24330     case MULTI_ARG_3_QI:
24331     case MULTI_ARG_3_DI2:
24332     case MULTI_ARG_3_SI2:
24333     case MULTI_ARG_3_HI2:
24334     case MULTI_ARG_3_QI2:
24335       nargs = 3;
24336       break;
24337
24338     case MULTI_ARG_2_SF:
24339     case MULTI_ARG_2_DF:
24340     case MULTI_ARG_2_DI:
24341     case MULTI_ARG_2_SI:
24342     case MULTI_ARG_2_HI:
24343     case MULTI_ARG_2_QI:
24344       nargs = 2;
24345       break;
24346
24347     case MULTI_ARG_2_DI_IMM:
24348     case MULTI_ARG_2_SI_IMM:
24349     case MULTI_ARG_2_HI_IMM:
24350     case MULTI_ARG_2_QI_IMM:
24351       nargs = 2;
24352       last_arg_constant = true;
24353       break;
24354
24355     case MULTI_ARG_1_SF:
24356     case MULTI_ARG_1_DF:
24357     case MULTI_ARG_1_SF2:
24358     case MULTI_ARG_1_DF2:
24359     case MULTI_ARG_1_DI:
24360     case MULTI_ARG_1_SI:
24361     case MULTI_ARG_1_HI:
24362     case MULTI_ARG_1_QI:
24363     case MULTI_ARG_1_SI_DI:
24364     case MULTI_ARG_1_HI_DI:
24365     case MULTI_ARG_1_HI_SI:
24366     case MULTI_ARG_1_QI_DI:
24367     case MULTI_ARG_1_QI_SI:
24368     case MULTI_ARG_1_QI_HI:
24369       nargs = 1;
24370       break;
24371
24372     case MULTI_ARG_2_DI_CMP:
24373     case MULTI_ARG_2_SI_CMP:
24374     case MULTI_ARG_2_HI_CMP:
24375     case MULTI_ARG_2_QI_CMP:
24376       nargs = 2;
24377       comparison_p = true;
24378       break;
24379
24380     case MULTI_ARG_2_SF_TF:
24381     case MULTI_ARG_2_DF_TF:
24382     case MULTI_ARG_2_DI_TF:
24383     case MULTI_ARG_2_SI_TF:
24384     case MULTI_ARG_2_HI_TF:
24385     case MULTI_ARG_2_QI_TF:
24386       nargs = 2;
24387       tf_p = true;
24388       break;
24389
24390     case MULTI_ARG_UNKNOWN:
24391     default:
24392       gcc_unreachable ();
24393     }
24394
24395   if (optimize || !target
24396       || GET_MODE (target) != tmode
24397       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
24398     target = gen_reg_rtx (tmode);
24399
24400   gcc_assert (nargs <= 4);
24401
24402   for (i = 0; i < nargs; i++)
24403     {
24404       tree arg = CALL_EXPR_ARG (exp, i);
24405       rtx op = expand_normal (arg);
24406       int adjust = (comparison_p) ? 1 : 0;
24407       enum machine_mode mode = insn_data[icode].operand[i+adjust+1].mode;
24408
24409       if (last_arg_constant && i == nargs-1)
24410         {
24411           if (!CONST_INT_P (op))
24412             {
24413               error ("last argument must be an immediate");
24414               return gen_reg_rtx (tmode);
24415             }
24416         }
24417       else
24418         {
24419           if (VECTOR_MODE_P (mode))
24420             op = safe_vector_operand (op, mode);
24421
24422           /* If we aren't optimizing, only allow one memory operand to be
24423              generated.  */
24424           if (memory_operand (op, mode))
24425             num_memory++;
24426
24427           gcc_assert (GET_MODE (op) == mode || GET_MODE (op) == VOIDmode);
24428
24429           if (optimize
24430               || ! (*insn_data[icode].operand[i+adjust+1].predicate) (op, mode)
24431               || num_memory > 1)
24432             op = force_reg (mode, op);
24433         }
24434
24435       args[i].op = op;
24436       args[i].mode = mode;
24437     }
24438
24439   switch (nargs)
24440     {
24441     case 1:
24442       pat = GEN_FCN (icode) (target, args[0].op);
24443       break;
24444
24445     case 2:
24446       if (tf_p)
24447         pat = GEN_FCN (icode) (target, args[0].op, args[1].op,
24448                                GEN_INT ((int)sub_code));
24449       else if (! comparison_p)
24450         pat = GEN_FCN (icode) (target, args[0].op, args[1].op);
24451       else
24452         {
24453           rtx cmp_op = gen_rtx_fmt_ee (sub_code, GET_MODE (target),
24454                                        args[0].op,
24455                                        args[1].op);
24456
24457           pat = GEN_FCN (icode) (target, cmp_op, args[0].op, args[1].op);
24458         }
24459       break;
24460
24461     case 3:
24462       pat = GEN_FCN (icode) (target, args[0].op, args[1].op, args[2].op);
24463       break;
24464
24465     default:
24466       gcc_unreachable ();
24467     }
24468
24469   if (! pat)
24470     return 0;
24471
24472   emit_insn (pat);
24473   return target;
24474 }
24475
24476 /* Subroutine of ix86_expand_args_builtin to take care of scalar unop
24477    insns with vec_merge.  */
24478
24479 static rtx
24480 ix86_expand_unop_vec_merge_builtin (enum insn_code icode, tree exp,
24481                                     rtx target)
24482 {
24483   rtx pat;
24484   tree arg0 = CALL_EXPR_ARG (exp, 0);
24485   rtx op1, op0 = expand_normal (arg0);
24486   enum machine_mode tmode = insn_data[icode].operand[0].mode;
24487   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
24488
24489   if (optimize || !target
24490       || GET_MODE (target) != tmode
24491       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
24492     target = gen_reg_rtx (tmode);
24493
24494   if (VECTOR_MODE_P (mode0))
24495     op0 = safe_vector_operand (op0, mode0);
24496
24497   if ((optimize && !register_operand (op0, mode0))
24498       || ! (*insn_data[icode].operand[1].predicate) (op0, mode0))
24499     op0 = copy_to_mode_reg (mode0, op0);
24500
24501   op1 = op0;
24502   if (! (*insn_data[icode].operand[2].predicate) (op1, mode0))
24503     op1 = copy_to_mode_reg (mode0, op1);
24504
24505   pat = GEN_FCN (icode) (target, op0, op1);
24506   if (! pat)
24507     return 0;
24508   emit_insn (pat);
24509   return target;
24510 }
24511
24512 /* Subroutine of ix86_expand_builtin to take care of comparison insns.  */
24513
24514 static rtx
24515 ix86_expand_sse_compare (const struct builtin_description *d,
24516                          tree exp, rtx target, bool swap)
24517 {
24518   rtx pat;
24519   tree arg0 = CALL_EXPR_ARG (exp, 0);
24520   tree arg1 = CALL_EXPR_ARG (exp, 1);
24521   rtx op0 = expand_normal (arg0);
24522   rtx op1 = expand_normal (arg1);
24523   rtx op2;
24524   enum machine_mode tmode = insn_data[d->icode].operand[0].mode;
24525   enum machine_mode mode0 = insn_data[d->icode].operand[1].mode;
24526   enum machine_mode mode1 = insn_data[d->icode].operand[2].mode;
24527   enum rtx_code comparison = d->comparison;
24528
24529   if (VECTOR_MODE_P (mode0))
24530     op0 = safe_vector_operand (op0, mode0);
24531   if (VECTOR_MODE_P (mode1))
24532     op1 = safe_vector_operand (op1, mode1);
24533
24534   /* Swap operands if we have a comparison that isn't available in
24535      hardware.  */
24536   if (swap)
24537     {
24538       rtx tmp = gen_reg_rtx (mode1);
24539       emit_move_insn (tmp, op1);
24540       op1 = op0;
24541       op0 = tmp;
24542     }
24543
24544   if (optimize || !target
24545       || GET_MODE (target) != tmode
24546       || ! (*insn_data[d->icode].operand[0].predicate) (target, tmode))
24547     target = gen_reg_rtx (tmode);
24548
24549   if ((optimize && !register_operand (op0, mode0))
24550       || ! (*insn_data[d->icode].operand[1].predicate) (op0, mode0))
24551     op0 = copy_to_mode_reg (mode0, op0);
24552   if ((optimize && !register_operand (op1, mode1))
24553       || ! (*insn_data[d->icode].operand[2].predicate) (op1, mode1))
24554     op1 = copy_to_mode_reg (mode1, op1);
24555
24556   op2 = gen_rtx_fmt_ee (comparison, mode0, op0, op1);
24557   pat = GEN_FCN (d->icode) (target, op0, op1, op2);
24558   if (! pat)
24559     return 0;
24560   emit_insn (pat);
24561   return target;
24562 }
24563
24564 /* Subroutine of ix86_expand_builtin to take care of comi insns.  */
24565
24566 static rtx
24567 ix86_expand_sse_comi (const struct builtin_description *d, tree exp,
24568                       rtx target)
24569 {
24570   rtx pat;
24571   tree arg0 = CALL_EXPR_ARG (exp, 0);
24572   tree arg1 = CALL_EXPR_ARG (exp, 1);
24573   rtx op0 = expand_normal (arg0);
24574   rtx op1 = expand_normal (arg1);
24575   enum machine_mode mode0 = insn_data[d->icode].operand[0].mode;
24576   enum machine_mode mode1 = insn_data[d->icode].operand[1].mode;
24577   enum rtx_code comparison = d->comparison;
24578
24579   if (VECTOR_MODE_P (mode0))
24580     op0 = safe_vector_operand (op0, mode0);
24581   if (VECTOR_MODE_P (mode1))
24582     op1 = safe_vector_operand (op1, mode1);
24583
24584   /* Swap operands if we have a comparison that isn't available in
24585      hardware.  */
24586   if (d->flag & BUILTIN_DESC_SWAP_OPERANDS)
24587     {
24588       rtx tmp = op1;
24589       op1 = op0;
24590       op0 = tmp;
24591     }
24592
24593   target = gen_reg_rtx (SImode);
24594   emit_move_insn (target, const0_rtx);
24595   target = gen_rtx_SUBREG (QImode, target, 0);
24596
24597   if ((optimize && !register_operand (op0, mode0))
24598       || !(*insn_data[d->icode].operand[0].predicate) (op0, mode0))
24599     op0 = copy_to_mode_reg (mode0, op0);
24600   if ((optimize && !register_operand (op1, mode1))
24601       || !(*insn_data[d->icode].operand[1].predicate) (op1, mode1))
24602     op1 = copy_to_mode_reg (mode1, op1);
24603
24604   pat = GEN_FCN (d->icode) (op0, op1);
24605   if (! pat)
24606     return 0;
24607   emit_insn (pat);
24608   emit_insn (gen_rtx_SET (VOIDmode,
24609                           gen_rtx_STRICT_LOW_PART (VOIDmode, target),
24610                           gen_rtx_fmt_ee (comparison, QImode,
24611                                           SET_DEST (pat),
24612                                           const0_rtx)));
24613
24614   return SUBREG_REG (target);
24615 }
24616
24617 /* Subroutine of ix86_expand_builtin to take care of ptest insns.  */
24618
24619 static rtx
24620 ix86_expand_sse_ptest (const struct builtin_description *d, tree exp,
24621                        rtx target)
24622 {
24623   rtx pat;
24624   tree arg0 = CALL_EXPR_ARG (exp, 0);
24625   tree arg1 = CALL_EXPR_ARG (exp, 1);
24626   rtx op0 = expand_normal (arg0);
24627   rtx op1 = expand_normal (arg1);
24628   enum machine_mode mode0 = insn_data[d->icode].operand[0].mode;
24629   enum machine_mode mode1 = insn_data[d->icode].operand[1].mode;
24630   enum rtx_code comparison = d->comparison;
24631
24632   if (VECTOR_MODE_P (mode0))
24633     op0 = safe_vector_operand (op0, mode0);
24634   if (VECTOR_MODE_P (mode1))
24635     op1 = safe_vector_operand (op1, mode1);
24636
24637   target = gen_reg_rtx (SImode);
24638   emit_move_insn (target, const0_rtx);
24639   target = gen_rtx_SUBREG (QImode, target, 0);
24640
24641   if ((optimize && !register_operand (op0, mode0))
24642       || !(*insn_data[d->icode].operand[0].predicate) (op0, mode0))
24643     op0 = copy_to_mode_reg (mode0, op0);
24644   if ((optimize && !register_operand (op1, mode1))
24645       || !(*insn_data[d->icode].operand[1].predicate) (op1, mode1))
24646     op1 = copy_to_mode_reg (mode1, op1);
24647
24648   pat = GEN_FCN (d->icode) (op0, op1);
24649   if (! pat)
24650     return 0;
24651   emit_insn (pat);
24652   emit_insn (gen_rtx_SET (VOIDmode,
24653                           gen_rtx_STRICT_LOW_PART (VOIDmode, target),
24654                           gen_rtx_fmt_ee (comparison, QImode,
24655                                           SET_DEST (pat),
24656                                           const0_rtx)));
24657
24658   return SUBREG_REG (target);
24659 }
24660
24661 /* Subroutine of ix86_expand_builtin to take care of pcmpestr[im] insns.  */
24662
24663 static rtx
24664 ix86_expand_sse_pcmpestr (const struct builtin_description *d,
24665                           tree exp, rtx target)
24666 {
24667   rtx pat;
24668   tree arg0 = CALL_EXPR_ARG (exp, 0);
24669   tree arg1 = CALL_EXPR_ARG (exp, 1);
24670   tree arg2 = CALL_EXPR_ARG (exp, 2);
24671   tree arg3 = CALL_EXPR_ARG (exp, 3);
24672   tree arg4 = CALL_EXPR_ARG (exp, 4);
24673   rtx scratch0, scratch1;
24674   rtx op0 = expand_normal (arg0);
24675   rtx op1 = expand_normal (arg1);
24676   rtx op2 = expand_normal (arg2);
24677   rtx op3 = expand_normal (arg3);
24678   rtx op4 = expand_normal (arg4);
24679   enum machine_mode tmode0, tmode1, modev2, modei3, modev4, modei5, modeimm;
24680
24681   tmode0 = insn_data[d->icode].operand[0].mode;
24682   tmode1 = insn_data[d->icode].operand[1].mode;
24683   modev2 = insn_data[d->icode].operand[2].mode;
24684   modei3 = insn_data[d->icode].operand[3].mode;
24685   modev4 = insn_data[d->icode].operand[4].mode;
24686   modei5 = insn_data[d->icode].operand[5].mode;
24687   modeimm = insn_data[d->icode].operand[6].mode;
24688
24689   if (VECTOR_MODE_P (modev2))
24690     op0 = safe_vector_operand (op0, modev2);
24691   if (VECTOR_MODE_P (modev4))
24692     op2 = safe_vector_operand (op2, modev4);
24693
24694   if (! (*insn_data[d->icode].operand[2].predicate) (op0, modev2))
24695     op0 = copy_to_mode_reg (modev2, op0);
24696   if (! (*insn_data[d->icode].operand[3].predicate) (op1, modei3))
24697     op1 = copy_to_mode_reg (modei3, op1);
24698   if ((optimize && !register_operand (op2, modev4))
24699       || !(*insn_data[d->icode].operand[4].predicate) (op2, modev4))
24700     op2 = copy_to_mode_reg (modev4, op2);
24701   if (! (*insn_data[d->icode].operand[5].predicate) (op3, modei5))
24702     op3 = copy_to_mode_reg (modei5, op3);
24703
24704   if (! (*insn_data[d->icode].operand[6].predicate) (op4, modeimm))
24705     {
24706       error ("the fifth argument must be a 8-bit immediate");
24707       return const0_rtx;
24708     }
24709
24710   if (d->code == IX86_BUILTIN_PCMPESTRI128)
24711     {
24712       if (optimize || !target
24713           || GET_MODE (target) != tmode0
24714           || ! (*insn_data[d->icode].operand[0].predicate) (target, tmode0))
24715         target = gen_reg_rtx (tmode0);
24716
24717       scratch1 = gen_reg_rtx (tmode1);
24718
24719       pat = GEN_FCN (d->icode) (target, scratch1, op0, op1, op2, op3, op4);
24720     }
24721   else if (d->code == IX86_BUILTIN_PCMPESTRM128)
24722     {
24723       if (optimize || !target
24724           || GET_MODE (target) != tmode1
24725           || ! (*insn_data[d->icode].operand[1].predicate) (target, tmode1))
24726         target = gen_reg_rtx (tmode1);
24727
24728       scratch0 = gen_reg_rtx (tmode0);
24729
24730       pat = GEN_FCN (d->icode) (scratch0, target, op0, op1, op2, op3, op4);
24731     }
24732   else
24733     {
24734       gcc_assert (d->flag);
24735
24736       scratch0 = gen_reg_rtx (tmode0);
24737       scratch1 = gen_reg_rtx (tmode1);
24738
24739       pat = GEN_FCN (d->icode) (scratch0, scratch1, op0, op1, op2, op3, op4);
24740     }
24741
24742   if (! pat)
24743     return 0;
24744
24745   emit_insn (pat);
24746
24747   if (d->flag)
24748     {
24749       target = gen_reg_rtx (SImode);
24750       emit_move_insn (target, const0_rtx);
24751       target = gen_rtx_SUBREG (QImode, target, 0);
24752
24753       emit_insn
24754         (gen_rtx_SET (VOIDmode, gen_rtx_STRICT_LOW_PART (VOIDmode, target),
24755                       gen_rtx_fmt_ee (EQ, QImode,
24756                                       gen_rtx_REG ((enum machine_mode) d->flag,
24757                                                    FLAGS_REG),
24758                                       const0_rtx)));
24759       return SUBREG_REG (target);
24760     }
24761   else
24762     return target;
24763 }
24764
24765
24766 /* Subroutine of ix86_expand_builtin to take care of pcmpistr[im] insns.  */
24767
24768 static rtx
24769 ix86_expand_sse_pcmpistr (const struct builtin_description *d,
24770                           tree exp, rtx target)
24771 {
24772   rtx pat;
24773   tree arg0 = CALL_EXPR_ARG (exp, 0);
24774   tree arg1 = CALL_EXPR_ARG (exp, 1);
24775   tree arg2 = CALL_EXPR_ARG (exp, 2);
24776   rtx scratch0, scratch1;
24777   rtx op0 = expand_normal (arg0);
24778   rtx op1 = expand_normal (arg1);
24779   rtx op2 = expand_normal (arg2);
24780   enum machine_mode tmode0, tmode1, modev2, modev3, modeimm;
24781
24782   tmode0 = insn_data[d->icode].operand[0].mode;
24783   tmode1 = insn_data[d->icode].operand[1].mode;
24784   modev2 = insn_data[d->icode].operand[2].mode;
24785   modev3 = insn_data[d->icode].operand[3].mode;
24786   modeimm = insn_data[d->icode].operand[4].mode;
24787
24788   if (VECTOR_MODE_P (modev2))
24789     op0 = safe_vector_operand (op0, modev2);
24790   if (VECTOR_MODE_P (modev3))
24791     op1 = safe_vector_operand (op1, modev3);
24792
24793   if (! (*insn_data[d->icode].operand[2].predicate) (op0, modev2))
24794     op0 = copy_to_mode_reg (modev2, op0);
24795   if ((optimize && !register_operand (op1, modev3))
24796       || !(*insn_data[d->icode].operand[3].predicate) (op1, modev3))
24797     op1 = copy_to_mode_reg (modev3, op1);
24798
24799   if (! (*insn_data[d->icode].operand[4].predicate) (op2, modeimm))
24800     {
24801       error ("the third argument must be a 8-bit immediate");
24802       return const0_rtx;
24803     }
24804
24805   if (d->code == IX86_BUILTIN_PCMPISTRI128)
24806     {
24807       if (optimize || !target
24808           || GET_MODE (target) != tmode0
24809           || ! (*insn_data[d->icode].operand[0].predicate) (target, tmode0))
24810         target = gen_reg_rtx (tmode0);
24811
24812       scratch1 = gen_reg_rtx (tmode1);
24813
24814       pat = GEN_FCN (d->icode) (target, scratch1, op0, op1, op2);
24815     }
24816   else if (d->code == IX86_BUILTIN_PCMPISTRM128)
24817     {
24818       if (optimize || !target
24819           || GET_MODE (target) != tmode1
24820           || ! (*insn_data[d->icode].operand[1].predicate) (target, tmode1))
24821         target = gen_reg_rtx (tmode1);
24822
24823       scratch0 = gen_reg_rtx (tmode0);
24824
24825       pat = GEN_FCN (d->icode) (scratch0, target, op0, op1, op2);
24826     }
24827   else
24828     {
24829       gcc_assert (d->flag);
24830
24831       scratch0 = gen_reg_rtx (tmode0);
24832       scratch1 = gen_reg_rtx (tmode1);
24833
24834       pat = GEN_FCN (d->icode) (scratch0, scratch1, op0, op1, op2);
24835     }
24836
24837   if (! pat)
24838     return 0;
24839
24840   emit_insn (pat);
24841
24842   if (d->flag)
24843     {
24844       target = gen_reg_rtx (SImode);
24845       emit_move_insn (target, const0_rtx);
24846       target = gen_rtx_SUBREG (QImode, target, 0);
24847
24848       emit_insn
24849         (gen_rtx_SET (VOIDmode, gen_rtx_STRICT_LOW_PART (VOIDmode, target),
24850                       gen_rtx_fmt_ee (EQ, QImode,
24851                                       gen_rtx_REG ((enum machine_mode) d->flag,
24852                                                    FLAGS_REG),
24853                                       const0_rtx)));
24854       return SUBREG_REG (target);
24855     }
24856   else
24857     return target;
24858 }
24859
24860 /* Subroutine of ix86_expand_builtin to take care of insns with
24861    variable number of operands.  */
24862
24863 static rtx
24864 ix86_expand_args_builtin (const struct builtin_description *d,
24865                           tree exp, rtx target)
24866 {
24867   rtx pat, real_target;
24868   unsigned int i, nargs;
24869   unsigned int nargs_constant = 0;
24870   int num_memory = 0;
24871   struct
24872     {
24873       rtx op;
24874       enum machine_mode mode;
24875     } args[4];
24876   bool last_arg_count = false;
24877   enum insn_code icode = d->icode;
24878   const struct insn_data *insn_p = &insn_data[icode];
24879   enum machine_mode tmode = insn_p->operand[0].mode;
24880   enum machine_mode rmode = VOIDmode;
24881   bool swap = false;
24882   enum rtx_code comparison = d->comparison;
24883
24884   switch ((enum ix86_builtin_type) d->flag)
24885     {
24886     case INT_FTYPE_V8SF_V8SF_PTEST:
24887     case INT_FTYPE_V4DI_V4DI_PTEST:
24888     case INT_FTYPE_V4DF_V4DF_PTEST:
24889     case INT_FTYPE_V4SF_V4SF_PTEST:
24890     case INT_FTYPE_V2DI_V2DI_PTEST:
24891     case INT_FTYPE_V2DF_V2DF_PTEST:
24892       return ix86_expand_sse_ptest (d, exp, target);
24893     case FLOAT128_FTYPE_FLOAT128:
24894     case FLOAT_FTYPE_FLOAT:
24895     case INT_FTYPE_INT:
24896     case UINT64_FTYPE_INT:
24897     case INT64_FTYPE_INT64:
24898     case INT64_FTYPE_V4SF:
24899     case INT64_FTYPE_V2DF:
24900     case INT_FTYPE_V16QI:
24901     case INT_FTYPE_V8QI:
24902     case INT_FTYPE_V8SF:
24903     case INT_FTYPE_V4DF:
24904     case INT_FTYPE_V4SF:
24905     case INT_FTYPE_V2DF:
24906     case V16QI_FTYPE_V16QI:
24907     case V8SI_FTYPE_V8SF:
24908     case V8SI_FTYPE_V4SI:
24909     case V8HI_FTYPE_V8HI:
24910     case V8HI_FTYPE_V16QI:
24911     case V8QI_FTYPE_V8QI:
24912     case V8SF_FTYPE_V8SF:
24913     case V8SF_FTYPE_V8SI:
24914     case V8SF_FTYPE_V4SF:
24915     case V4SI_FTYPE_V4SI:
24916     case V4SI_FTYPE_V16QI:
24917     case V4SI_FTYPE_V4SF:
24918     case V4SI_FTYPE_V8SI:
24919     case V4SI_FTYPE_V8HI:
24920     case V4SI_FTYPE_V4DF:
24921     case V4SI_FTYPE_V2DF:
24922     case V4HI_FTYPE_V4HI:
24923     case V4DF_FTYPE_V4DF:
24924     case V4DF_FTYPE_V4SI:
24925     case V4DF_FTYPE_V4SF:
24926     case V4DF_FTYPE_V2DF:
24927     case V4SF_FTYPE_V4SF:
24928     case V4SF_FTYPE_V4SI:
24929     case V4SF_FTYPE_V8SF:
24930     case V4SF_FTYPE_V4DF:
24931     case V4SF_FTYPE_V2DF:
24932     case V2DI_FTYPE_V2DI:
24933     case V2DI_FTYPE_V16QI:
24934     case V2DI_FTYPE_V8HI:
24935     case V2DI_FTYPE_V4SI:
24936     case V2DF_FTYPE_V2DF:
24937     case V2DF_FTYPE_V4SI:
24938     case V2DF_FTYPE_V4DF:
24939     case V2DF_FTYPE_V4SF:
24940     case V2DF_FTYPE_V2SI:
24941     case V2SI_FTYPE_V2SI:
24942     case V2SI_FTYPE_V4SF:
24943     case V2SI_FTYPE_V2SF:
24944     case V2SI_FTYPE_V2DF:
24945     case V2SF_FTYPE_V2SF:
24946     case V2SF_FTYPE_V2SI:
24947       nargs = 1;
24948       break;
24949     case V4SF_FTYPE_V4SF_VEC_MERGE:
24950     case V2DF_FTYPE_V2DF_VEC_MERGE:
24951       return ix86_expand_unop_vec_merge_builtin (icode, exp, target);
24952     case FLOAT128_FTYPE_FLOAT128_FLOAT128:
24953     case V16QI_FTYPE_V16QI_V16QI:
24954     case V16QI_FTYPE_V8HI_V8HI:
24955     case V8QI_FTYPE_V8QI_V8QI:
24956     case V8QI_FTYPE_V4HI_V4HI:
24957     case V8HI_FTYPE_V8HI_V8HI:
24958     case V8HI_FTYPE_V16QI_V16QI:
24959     case V8HI_FTYPE_V4SI_V4SI:
24960     case V8SF_FTYPE_V8SF_V8SF:
24961     case V8SF_FTYPE_V8SF_V8SI:
24962     case V4SI_FTYPE_V4SI_V4SI:
24963     case V4SI_FTYPE_V8HI_V8HI:
24964     case V4SI_FTYPE_V4SF_V4SF:
24965     case V4SI_FTYPE_V2DF_V2DF:
24966     case V4HI_FTYPE_V4HI_V4HI:
24967     case V4HI_FTYPE_V8QI_V8QI:
24968     case V4HI_FTYPE_V2SI_V2SI:
24969     case V4DF_FTYPE_V4DF_V4DF:
24970     case V4DF_FTYPE_V4DF_V4DI:
24971     case V4SF_FTYPE_V4SF_V4SF:
24972     case V4SF_FTYPE_V4SF_V4SI:
24973     case V4SF_FTYPE_V4SF_V2SI:
24974     case V4SF_FTYPE_V4SF_V2DF:
24975     case V4SF_FTYPE_V4SF_DI:
24976     case V4SF_FTYPE_V4SF_SI:
24977     case V2DI_FTYPE_V2DI_V2DI:
24978     case V2DI_FTYPE_V16QI_V16QI:
24979     case V2DI_FTYPE_V4SI_V4SI:
24980     case V2DI_FTYPE_V2DI_V16QI:
24981     case V2DI_FTYPE_V2DF_V2DF:
24982     case V2SI_FTYPE_V2SI_V2SI:
24983     case V2SI_FTYPE_V4HI_V4HI:
24984     case V2SI_FTYPE_V2SF_V2SF:
24985     case V2DF_FTYPE_V2DF_V2DF:
24986     case V2DF_FTYPE_V2DF_V4SF:
24987     case V2DF_FTYPE_V2DF_V2DI:
24988     case V2DF_FTYPE_V2DF_DI:
24989     case V2DF_FTYPE_V2DF_SI:
24990     case V2SF_FTYPE_V2SF_V2SF:
24991     case V1DI_FTYPE_V1DI_V1DI:
24992     case V1DI_FTYPE_V8QI_V8QI:
24993     case V1DI_FTYPE_V2SI_V2SI:
24994       if (comparison == UNKNOWN)
24995         return ix86_expand_binop_builtin (icode, exp, target);
24996       nargs = 2;
24997       break;
24998     case V4SF_FTYPE_V4SF_V4SF_SWAP:
24999     case V2DF_FTYPE_V2DF_V2DF_SWAP:
25000       gcc_assert (comparison != UNKNOWN);
25001       nargs = 2;
25002       swap = true;
25003       break;
25004     case V8HI_FTYPE_V8HI_V8HI_COUNT:
25005     case V8HI_FTYPE_V8HI_SI_COUNT:
25006     case V4SI_FTYPE_V4SI_V4SI_COUNT:
25007     case V4SI_FTYPE_V4SI_SI_COUNT:
25008     case V4HI_FTYPE_V4HI_V4HI_COUNT:
25009     case V4HI_FTYPE_V4HI_SI_COUNT:
25010     case V2DI_FTYPE_V2DI_V2DI_COUNT:
25011     case V2DI_FTYPE_V2DI_SI_COUNT:
25012     case V2SI_FTYPE_V2SI_V2SI_COUNT:
25013     case V2SI_FTYPE_V2SI_SI_COUNT:
25014     case V1DI_FTYPE_V1DI_V1DI_COUNT:
25015     case V1DI_FTYPE_V1DI_SI_COUNT:
25016       nargs = 2;
25017       last_arg_count = true;
25018       break;
25019     case UINT64_FTYPE_UINT64_UINT64:
25020     case UINT_FTYPE_UINT_UINT:
25021     case UINT_FTYPE_UINT_USHORT:
25022     case UINT_FTYPE_UINT_UCHAR:
25023     case UINT16_FTYPE_UINT16_INT:
25024     case UINT8_FTYPE_UINT8_INT:
25025       nargs = 2;
25026       break;
25027     case V2DI2TI_FTYPE_V2DI_INT:
25028       nargs = 2;
25029       rmode = V2DImode;
25030       nargs_constant = 1;
25031       break;
25032     case V8HI_FTYPE_V8HI_INT:
25033     case V8SF_FTYPE_V8SF_INT:
25034     case V4SI_FTYPE_V4SI_INT:
25035     case V4SI_FTYPE_V8SI_INT:
25036     case V4HI_FTYPE_V4HI_INT:
25037     case V4DF_FTYPE_V4DF_INT:
25038     case V4SF_FTYPE_V4SF_INT:
25039     case V4SF_FTYPE_V8SF_INT:
25040     case V2DI_FTYPE_V2DI_INT:
25041     case V2DF_FTYPE_V2DF_INT:
25042     case V2DF_FTYPE_V4DF_INT:
25043       nargs = 2;
25044       nargs_constant = 1;
25045       break;
25046     case V16QI_FTYPE_V16QI_V16QI_V16QI:
25047     case V8SF_FTYPE_V8SF_V8SF_V8SF:
25048     case V4DF_FTYPE_V4DF_V4DF_V4DF:
25049     case V4SF_FTYPE_V4SF_V4SF_V4SF:
25050     case V2DF_FTYPE_V2DF_V2DF_V2DF:
25051       nargs = 3;
25052       break;
25053     case V16QI_FTYPE_V16QI_V16QI_INT:
25054     case V8HI_FTYPE_V8HI_V8HI_INT:
25055     case V8SI_FTYPE_V8SI_V8SI_INT:
25056     case V8SI_FTYPE_V8SI_V4SI_INT:
25057     case V8SF_FTYPE_V8SF_V8SF_INT: 
25058     case V8SF_FTYPE_V8SF_V4SF_INT: 
25059     case V4SI_FTYPE_V4SI_V4SI_INT:
25060     case V4DF_FTYPE_V4DF_V4DF_INT:
25061     case V4DF_FTYPE_V4DF_V2DF_INT:
25062     case V4SF_FTYPE_V4SF_V4SF_INT:
25063     case V2DI_FTYPE_V2DI_V2DI_INT:
25064     case V2DF_FTYPE_V2DF_V2DF_INT:
25065       nargs = 3;
25066       nargs_constant = 1;
25067       break;
25068     case V2DI2TI_FTYPE_V2DI_V2DI_INT:
25069       nargs = 3;
25070       rmode = V2DImode;
25071       nargs_constant = 1;
25072       break;
25073     case V1DI2DI_FTYPE_V1DI_V1DI_INT:
25074       nargs = 3;
25075       rmode = DImode;
25076       nargs_constant = 1;
25077       break;
25078     case V2DI_FTYPE_V2DI_UINT_UINT:
25079       nargs = 3;
25080       nargs_constant = 2;
25081       break;
25082     case V2DI_FTYPE_V2DI_V2DI_UINT_UINT:
25083       nargs = 4;
25084       nargs_constant = 2;
25085       break;
25086     default:
25087       gcc_unreachable ();
25088     }
25089
25090   gcc_assert (nargs <= ARRAY_SIZE (args));
25091
25092   if (comparison != UNKNOWN)
25093     {
25094       gcc_assert (nargs == 2);
25095       return ix86_expand_sse_compare (d, exp, target, swap);
25096     }
25097
25098   if (rmode == VOIDmode || rmode == tmode)
25099     {
25100       if (optimize
25101           || target == 0
25102           || GET_MODE (target) != tmode
25103           || ! (*insn_p->operand[0].predicate) (target, tmode))
25104         target = gen_reg_rtx (tmode);
25105       real_target = target;
25106     }
25107   else
25108     {
25109       target = gen_reg_rtx (rmode);
25110       real_target = simplify_gen_subreg (tmode, target, rmode, 0);
25111     }
25112
25113   for (i = 0; i < nargs; i++)
25114     {
25115       tree arg = CALL_EXPR_ARG (exp, i);
25116       rtx op = expand_normal (arg);
25117       enum machine_mode mode = insn_p->operand[i + 1].mode;
25118       bool match = (*insn_p->operand[i + 1].predicate) (op, mode);
25119
25120       if (last_arg_count && (i + 1) == nargs)
25121         {
25122           /* SIMD shift insns take either an 8-bit immediate or
25123              register as count.  But builtin functions take int as
25124              count.  If count doesn't match, we put it in register.  */
25125           if (!match)
25126             {
25127               op = simplify_gen_subreg (SImode, op, GET_MODE (op), 0);
25128               if (!(*insn_p->operand[i + 1].predicate) (op, mode))
25129                 op = copy_to_reg (op);
25130             }
25131         }
25132       else if ((nargs - i) <= nargs_constant)
25133         {
25134           if (!match)
25135             switch (icode)
25136               {
25137               case CODE_FOR_sse4_1_roundpd:
25138               case CODE_FOR_sse4_1_roundps:
25139               case CODE_FOR_sse4_1_roundsd:
25140               case CODE_FOR_sse4_1_roundss:
25141               case CODE_FOR_sse4_1_blendps:
25142               case CODE_FOR_avx_blendpd256:
25143               case CODE_FOR_avx_vpermilv4df:
25144               case CODE_FOR_avx_roundpd256:
25145               case CODE_FOR_avx_roundps256:
25146                 error ("the last argument must be a 4-bit immediate");
25147                 return const0_rtx;
25148
25149               case CODE_FOR_sse4_1_blendpd:
25150               case CODE_FOR_avx_vpermilv2df:
25151                 error ("the last argument must be a 2-bit immediate");
25152                 return const0_rtx;
25153
25154               case CODE_FOR_avx_vextractf128v4df:
25155               case CODE_FOR_avx_vextractf128v8sf:
25156               case CODE_FOR_avx_vextractf128v8si:
25157               case CODE_FOR_avx_vinsertf128v4df:
25158               case CODE_FOR_avx_vinsertf128v8sf:
25159               case CODE_FOR_avx_vinsertf128v8si:
25160                 error ("the last argument must be a 1-bit immediate");
25161                 return const0_rtx;
25162
25163               case CODE_FOR_avx_cmpsdv2df3:
25164               case CODE_FOR_avx_cmpssv4sf3:
25165               case CODE_FOR_avx_cmppdv2df3:
25166               case CODE_FOR_avx_cmppsv4sf3:
25167               case CODE_FOR_avx_cmppdv4df3:
25168               case CODE_FOR_avx_cmppsv8sf3:
25169                 error ("the last argument must be a 5-bit immediate");
25170                 return const0_rtx;
25171
25172              default:
25173                 switch (nargs_constant)
25174                   {
25175                   case 2:
25176                     if ((nargs - i) == nargs_constant)
25177                       {
25178                         error ("the next to last argument must be an 8-bit immediate");
25179                         break;
25180                       }
25181                   case 1:
25182                     error ("the last argument must be an 8-bit immediate");
25183                     break;
25184                   default:
25185                     gcc_unreachable ();
25186                   }
25187                 return const0_rtx;
25188               }
25189         }
25190       else
25191         {
25192           if (VECTOR_MODE_P (mode))
25193             op = safe_vector_operand (op, mode);
25194
25195           /* If we aren't optimizing, only allow one memory operand to
25196              be generated.  */
25197           if (memory_operand (op, mode))
25198             num_memory++;
25199
25200           if (GET_MODE (op) == mode || GET_MODE (op) == VOIDmode)
25201             {
25202               if (optimize || !match || num_memory > 1)
25203                 op = copy_to_mode_reg (mode, op);
25204             }
25205           else
25206             {
25207               op = copy_to_reg (op);
25208               op = simplify_gen_subreg (mode, op, GET_MODE (op), 0);
25209             }
25210         }
25211
25212       args[i].op = op;
25213       args[i].mode = mode;
25214     }
25215
25216   switch (nargs)
25217     {
25218     case 1:
25219       pat = GEN_FCN (icode) (real_target, args[0].op);
25220       break;
25221     case 2:
25222       pat = GEN_FCN (icode) (real_target, args[0].op, args[1].op);
25223       break;
25224     case 3:
25225       pat = GEN_FCN (icode) (real_target, args[0].op, args[1].op,
25226                              args[2].op);
25227       break;
25228     case 4:
25229       pat = GEN_FCN (icode) (real_target, args[0].op, args[1].op,
25230                              args[2].op, args[3].op);
25231       break;
25232     default:
25233       gcc_unreachable ();
25234     }
25235
25236   if (! pat)
25237     return 0;
25238
25239   emit_insn (pat);
25240   return target;
25241 }
25242
25243 /* Subroutine of ix86_expand_builtin to take care of special insns
25244    with variable number of operands.  */
25245
25246 static rtx
25247 ix86_expand_special_args_builtin (const struct builtin_description *d,
25248                                     tree exp, rtx target)
25249 {
25250   tree arg;
25251   rtx pat, op;
25252   unsigned int i, nargs, arg_adjust, memory;
25253   struct
25254     {
25255       rtx op;
25256       enum machine_mode mode;
25257     } args[2];
25258   enum insn_code icode = d->icode;
25259   bool last_arg_constant = false;
25260   const struct insn_data *insn_p = &insn_data[icode];
25261   enum machine_mode tmode = insn_p->operand[0].mode;
25262   enum { load, store } klass;
25263
25264   switch ((enum ix86_special_builtin_type) d->flag)
25265     {
25266     case VOID_FTYPE_VOID:
25267       emit_insn (GEN_FCN (icode) (target));
25268       return 0;
25269     case UINT64_FTYPE_VOID:
25270       nargs = 0;
25271       klass = load;
25272       memory = 0;
25273       break;
25274     case UINT64_FTYPE_PUNSIGNED:
25275     case V2DI_FTYPE_PV2DI:
25276     case V32QI_FTYPE_PCCHAR:
25277     case V16QI_FTYPE_PCCHAR:
25278     case V8SF_FTYPE_PCV4SF:
25279     case V8SF_FTYPE_PCFLOAT:
25280     case V4SF_FTYPE_PCFLOAT:
25281     case V4DF_FTYPE_PCV2DF:
25282     case V4DF_FTYPE_PCDOUBLE:
25283     case V2DF_FTYPE_PCDOUBLE:
25284       nargs = 1;
25285       klass = load;
25286       memory = 0;
25287       break;
25288     case VOID_FTYPE_PV2SF_V4SF:
25289     case VOID_FTYPE_PV4DI_V4DI:
25290     case VOID_FTYPE_PV2DI_V2DI:
25291     case VOID_FTYPE_PCHAR_V32QI:
25292     case VOID_FTYPE_PCHAR_V16QI:
25293     case VOID_FTYPE_PFLOAT_V8SF:
25294     case VOID_FTYPE_PFLOAT_V4SF:
25295     case VOID_FTYPE_PDOUBLE_V4DF:
25296     case VOID_FTYPE_PDOUBLE_V2DF:
25297     case VOID_FTYPE_PDI_DI:
25298     case VOID_FTYPE_PINT_INT:
25299       nargs = 1;
25300       klass = store;
25301       /* Reserve memory operand for target.  */
25302       memory = ARRAY_SIZE (args);
25303       break;
25304     case V4SF_FTYPE_V4SF_PCV2SF:
25305     case V2DF_FTYPE_V2DF_PCDOUBLE:
25306       nargs = 2;
25307       klass = load;
25308       memory = 1;
25309       break;
25310     case V8SF_FTYPE_PCV8SF_V8SF:
25311     case V4DF_FTYPE_PCV4DF_V4DF:
25312     case V4SF_FTYPE_PCV4SF_V4SF:
25313     case V2DF_FTYPE_PCV2DF_V2DF:
25314       nargs = 2;
25315       klass = load;
25316       memory = 0;
25317       break;
25318     case VOID_FTYPE_PV8SF_V8SF_V8SF:
25319     case VOID_FTYPE_PV4DF_V4DF_V4DF:
25320     case VOID_FTYPE_PV4SF_V4SF_V4SF:
25321     case VOID_FTYPE_PV2DF_V2DF_V2DF:
25322       nargs = 2;
25323       klass = store;
25324       /* Reserve memory operand for target.  */
25325       memory = ARRAY_SIZE (args);
25326       break;
25327     case VOID_FTYPE_USHORT_UINT_USHORT:
25328     case VOID_FTYPE_UINT_UINT_UINT:
25329     case VOID_FTYPE_UINT64_UINT_UINT:
25330     case UCHAR_FTYPE_USHORT_UINT_USHORT:
25331     case UCHAR_FTYPE_UINT_UINT_UINT:
25332     case UCHAR_FTYPE_UINT64_UINT_UINT:
25333       nargs = 3;
25334       klass = store;
25335       memory = 0;
25336       break;
25337     default:
25338       gcc_unreachable ();
25339     }
25340
25341   gcc_assert (nargs <= ARRAY_SIZE (args));
25342
25343   if (klass == store)
25344     {
25345       arg = CALL_EXPR_ARG (exp, 0);
25346       op = expand_normal (arg);
25347       gcc_assert (target == 0);
25348       target = gen_rtx_MEM (tmode, copy_to_mode_reg (Pmode, op));
25349       arg_adjust = 1;
25350     }
25351   else
25352     {
25353       arg_adjust = 0;
25354       if (optimize
25355           || target == 0
25356           || GET_MODE (target) != tmode
25357           || ! (*insn_p->operand[0].predicate) (target, tmode))
25358         target = gen_reg_rtx (tmode);
25359     }
25360
25361   for (i = 0; i < nargs; i++)
25362     {
25363       enum machine_mode mode = insn_p->operand[i + 1].mode;
25364       bool match;
25365
25366       arg = CALL_EXPR_ARG (exp, i + arg_adjust);
25367       op = expand_normal (arg);
25368       match = (*insn_p->operand[i + 1].predicate) (op, mode);
25369
25370       if (last_arg_constant && (i + 1) == nargs)
25371         {
25372           if (!match)
25373             switch (icode)
25374               {
25375              default:
25376                 error ("the last argument must be an 8-bit immediate");
25377                 return const0_rtx;
25378               }
25379         }
25380       else
25381         {
25382           if (i == memory)
25383             {
25384               /* This must be the memory operand.  */
25385               op = gen_rtx_MEM (mode, copy_to_mode_reg (Pmode, op));
25386               gcc_assert (GET_MODE (op) == mode
25387                           || GET_MODE (op) == VOIDmode);
25388             }
25389           else
25390             {
25391               /* This must be register.  */
25392               if (VECTOR_MODE_P (mode))
25393                 op = safe_vector_operand (op, mode);
25394
25395               gcc_assert (GET_MODE (op) == mode
25396                           || GET_MODE (op) == VOIDmode);
25397               op = copy_to_mode_reg (mode, op);
25398             }
25399         }
25400
25401       args[i].op = op;
25402       args[i].mode = mode;
25403     }
25404
25405   switch (nargs)
25406     {
25407     case 0:
25408       pat = GEN_FCN (icode) (target);
25409       break;
25410     case 1:
25411       pat = GEN_FCN (icode) (target, args[0].op);
25412       break;
25413     case 2:
25414       pat = GEN_FCN (icode) (target, args[0].op, args[1].op);
25415       break;
25416     default:
25417       gcc_unreachable ();
25418     }
25419
25420   if (! pat)
25421     return 0;
25422   emit_insn (pat);
25423   return klass == store ? 0 : target;
25424 }
25425
25426 /* Return the integer constant in ARG.  Constrain it to be in the range
25427    of the subparts of VEC_TYPE; issue an error if not.  */
25428
25429 static int
25430 get_element_number (tree vec_type, tree arg)
25431 {
25432   unsigned HOST_WIDE_INT elt, max = TYPE_VECTOR_SUBPARTS (vec_type) - 1;
25433
25434   if (!host_integerp (arg, 1)
25435       || (elt = tree_low_cst (arg, 1), elt > max))
25436     {
25437       error ("selector must be an integer constant in the range 0..%wi", max);
25438       return 0;
25439     }
25440
25441   return elt;
25442 }
25443
25444 /* A subroutine of ix86_expand_builtin.  These builtins are a wrapper around
25445    ix86_expand_vector_init.  We DO have language-level syntax for this, in
25446    the form of  (type){ init-list }.  Except that since we can't place emms
25447    instructions from inside the compiler, we can't allow the use of MMX
25448    registers unless the user explicitly asks for it.  So we do *not* define
25449    vec_set/vec_extract/vec_init patterns for MMX modes in mmx.md.  Instead
25450    we have builtins invoked by mmintrin.h that gives us license to emit
25451    these sorts of instructions.  */
25452
25453 static rtx
25454 ix86_expand_vec_init_builtin (tree type, tree exp, rtx target)
25455 {
25456   enum machine_mode tmode = TYPE_MODE (type);
25457   enum machine_mode inner_mode = GET_MODE_INNER (tmode);
25458   int i, n_elt = GET_MODE_NUNITS (tmode);
25459   rtvec v = rtvec_alloc (n_elt);
25460
25461   gcc_assert (VECTOR_MODE_P (tmode));
25462   gcc_assert (call_expr_nargs (exp) == n_elt);
25463
25464   for (i = 0; i < n_elt; ++i)
25465     {
25466       rtx x = expand_normal (CALL_EXPR_ARG (exp, i));
25467       RTVEC_ELT (v, i) = gen_lowpart (inner_mode, x);
25468     }
25469
25470   if (!target || !register_operand (target, tmode))
25471     target = gen_reg_rtx (tmode);
25472
25473   ix86_expand_vector_init (true, target, gen_rtx_PARALLEL (tmode, v));
25474   return target;
25475 }
25476
25477 /* A subroutine of ix86_expand_builtin.  These builtins are a wrapper around
25478    ix86_expand_vector_extract.  They would be redundant (for non-MMX) if we
25479    had a language-level syntax for referencing vector elements.  */
25480
25481 static rtx
25482 ix86_expand_vec_ext_builtin (tree exp, rtx target)
25483 {
25484   enum machine_mode tmode, mode0;
25485   tree arg0, arg1;
25486   int elt;
25487   rtx op0;
25488
25489   arg0 = CALL_EXPR_ARG (exp, 0);
25490   arg1 = CALL_EXPR_ARG (exp, 1);
25491
25492   op0 = expand_normal (arg0);
25493   elt = get_element_number (TREE_TYPE (arg0), arg1);
25494
25495   tmode = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0)));
25496   mode0 = TYPE_MODE (TREE_TYPE (arg0));
25497   gcc_assert (VECTOR_MODE_P (mode0));
25498
25499   op0 = force_reg (mode0, op0);
25500
25501   if (optimize || !target || !register_operand (target, tmode))
25502     target = gen_reg_rtx (tmode);
25503
25504   ix86_expand_vector_extract (true, target, op0, elt);
25505
25506   return target;
25507 }
25508
25509 /* A subroutine of ix86_expand_builtin.  These builtins are a wrapper around
25510    ix86_expand_vector_set.  They would be redundant (for non-MMX) if we had
25511    a language-level syntax for referencing vector elements.  */
25512
25513 static rtx
25514 ix86_expand_vec_set_builtin (tree exp)
25515 {
25516   enum machine_mode tmode, mode1;
25517   tree arg0, arg1, arg2;
25518   int elt;
25519   rtx op0, op1, target;
25520
25521   arg0 = CALL_EXPR_ARG (exp, 0);
25522   arg1 = CALL_EXPR_ARG (exp, 1);
25523   arg2 = CALL_EXPR_ARG (exp, 2);
25524
25525   tmode = TYPE_MODE (TREE_TYPE (arg0));
25526   mode1 = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0)));
25527   gcc_assert (VECTOR_MODE_P (tmode));
25528
25529   op0 = expand_expr (arg0, NULL_RTX, tmode, EXPAND_NORMAL);
25530   op1 = expand_expr (arg1, NULL_RTX, mode1, EXPAND_NORMAL);
25531   elt = get_element_number (TREE_TYPE (arg0), arg2);
25532
25533   if (GET_MODE (op1) != mode1 && GET_MODE (op1) != VOIDmode)
25534     op1 = convert_modes (mode1, GET_MODE (op1), op1, true);
25535
25536   op0 = force_reg (tmode, op0);
25537   op1 = force_reg (mode1, op1);
25538
25539   /* OP0 is the source of these builtin functions and shouldn't be
25540      modified.  Create a copy, use it and return it as target.  */
25541   target = gen_reg_rtx (tmode);
25542   emit_move_insn (target, op0);
25543   ix86_expand_vector_set (true, target, op1, elt);
25544
25545   return target;
25546 }
25547
25548 /* Expand an expression EXP that calls a built-in function,
25549    with result going to TARGET if that's convenient
25550    (and in mode MODE if that's convenient).
25551    SUBTARGET may be used as the target for computing one of EXP's operands.
25552    IGNORE is nonzero if the value is to be ignored.  */
25553
25554 static rtx
25555 ix86_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
25556                      enum machine_mode mode ATTRIBUTE_UNUSED,
25557                      int ignore ATTRIBUTE_UNUSED)
25558 {
25559   const struct builtin_description *d;
25560   size_t i;
25561   enum insn_code icode;
25562   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
25563   tree arg0, arg1, arg2;
25564   rtx op0, op1, op2, pat;
25565   enum machine_mode mode0, mode1, mode2;
25566   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
25567
25568   /* Determine whether the builtin function is available under the current ISA.
25569      Originally the builtin was not created if it wasn't applicable to the
25570      current ISA based on the command line switches.  With function specific
25571      options, we need to check in the context of the function making the call
25572      whether it is supported.  */
25573   if (ix86_builtins_isa[fcode].isa
25574       && !(ix86_builtins_isa[fcode].isa & ix86_isa_flags))
25575     {
25576       char *opts = ix86_target_string (ix86_builtins_isa[fcode].isa, 0, NULL,
25577                                        NULL, NULL, false);
25578
25579       if (!opts)
25580         error ("%qE needs unknown isa option", fndecl);
25581       else
25582         {
25583           gcc_assert (opts != NULL);
25584           error ("%qE needs isa option %s", fndecl, opts);
25585           free (opts);
25586         }
25587       return const0_rtx;
25588     }
25589
25590   switch (fcode)
25591     {
25592     case IX86_BUILTIN_MASKMOVQ:
25593     case IX86_BUILTIN_MASKMOVDQU:
25594       icode = (fcode == IX86_BUILTIN_MASKMOVQ
25595                ? CODE_FOR_mmx_maskmovq
25596                : CODE_FOR_sse2_maskmovdqu);
25597       /* Note the arg order is different from the operand order.  */
25598       arg1 = CALL_EXPR_ARG (exp, 0);
25599       arg2 = CALL_EXPR_ARG (exp, 1);
25600       arg0 = CALL_EXPR_ARG (exp, 2);
25601       op0 = expand_normal (arg0);
25602       op1 = expand_normal (arg1);
25603       op2 = expand_normal (arg2);
25604       mode0 = insn_data[icode].operand[0].mode;
25605       mode1 = insn_data[icode].operand[1].mode;
25606       mode2 = insn_data[icode].operand[2].mode;
25607
25608       op0 = force_reg (Pmode, op0);
25609       op0 = gen_rtx_MEM (mode1, op0);
25610
25611       if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
25612         op0 = copy_to_mode_reg (mode0, op0);
25613       if (! (*insn_data[icode].operand[1].predicate) (op1, mode1))
25614         op1 = copy_to_mode_reg (mode1, op1);
25615       if (! (*insn_data[icode].operand[2].predicate) (op2, mode2))
25616         op2 = copy_to_mode_reg (mode2, op2);
25617       pat = GEN_FCN (icode) (op0, op1, op2);
25618       if (! pat)
25619         return 0;
25620       emit_insn (pat);
25621       return 0;
25622
25623     case IX86_BUILTIN_LDMXCSR:
25624       op0 = expand_normal (CALL_EXPR_ARG (exp, 0));
25625       target = assign_386_stack_local (SImode, SLOT_VIRTUAL);
25626       emit_move_insn (target, op0);
25627       emit_insn (gen_sse_ldmxcsr (target));
25628       return 0;
25629
25630     case IX86_BUILTIN_STMXCSR:
25631       target = assign_386_stack_local (SImode, SLOT_VIRTUAL);
25632       emit_insn (gen_sse_stmxcsr (target));
25633       return copy_to_mode_reg (SImode, target);
25634
25635     case IX86_BUILTIN_CLFLUSH:
25636         arg0 = CALL_EXPR_ARG (exp, 0);
25637         op0 = expand_normal (arg0);
25638         icode = CODE_FOR_sse2_clflush;
25639         if (! (*insn_data[icode].operand[0].predicate) (op0, Pmode))
25640             op0 = copy_to_mode_reg (Pmode, op0);
25641
25642         emit_insn (gen_sse2_clflush (op0));
25643         return 0;
25644
25645     case IX86_BUILTIN_MONITOR:
25646       arg0 = CALL_EXPR_ARG (exp, 0);
25647       arg1 = CALL_EXPR_ARG (exp, 1);
25648       arg2 = CALL_EXPR_ARG (exp, 2);
25649       op0 = expand_normal (arg0);
25650       op1 = expand_normal (arg1);
25651       op2 = expand_normal (arg2);
25652       if (!REG_P (op0))
25653         op0 = copy_to_mode_reg (Pmode, op0);
25654       if (!REG_P (op1))
25655         op1 = copy_to_mode_reg (SImode, op1);
25656       if (!REG_P (op2))
25657         op2 = copy_to_mode_reg (SImode, op2);
25658       emit_insn ((*ix86_gen_monitor) (op0, op1, op2));
25659       return 0;
25660
25661     case IX86_BUILTIN_MWAIT:
25662       arg0 = CALL_EXPR_ARG (exp, 0);
25663       arg1 = CALL_EXPR_ARG (exp, 1);
25664       op0 = expand_normal (arg0);
25665       op1 = expand_normal (arg1);
25666       if (!REG_P (op0))
25667         op0 = copy_to_mode_reg (SImode, op0);
25668       if (!REG_P (op1))
25669         op1 = copy_to_mode_reg (SImode, op1);
25670       emit_insn (gen_sse3_mwait (op0, op1));
25671       return 0;
25672
25673     case IX86_BUILTIN_VEC_INIT_V2SI:
25674     case IX86_BUILTIN_VEC_INIT_V4HI:
25675     case IX86_BUILTIN_VEC_INIT_V8QI:
25676       return ix86_expand_vec_init_builtin (TREE_TYPE (exp), exp, target);
25677
25678     case IX86_BUILTIN_VEC_EXT_V2DF:
25679     case IX86_BUILTIN_VEC_EXT_V2DI:
25680     case IX86_BUILTIN_VEC_EXT_V4SF:
25681     case IX86_BUILTIN_VEC_EXT_V4SI:
25682     case IX86_BUILTIN_VEC_EXT_V8HI:
25683     case IX86_BUILTIN_VEC_EXT_V2SI:
25684     case IX86_BUILTIN_VEC_EXT_V4HI:
25685     case IX86_BUILTIN_VEC_EXT_V16QI:
25686       return ix86_expand_vec_ext_builtin (exp, target);
25687
25688     case IX86_BUILTIN_VEC_SET_V2DI:
25689     case IX86_BUILTIN_VEC_SET_V4SF:
25690     case IX86_BUILTIN_VEC_SET_V4SI:
25691     case IX86_BUILTIN_VEC_SET_V8HI:
25692     case IX86_BUILTIN_VEC_SET_V4HI:
25693     case IX86_BUILTIN_VEC_SET_V16QI:
25694       return ix86_expand_vec_set_builtin (exp);
25695
25696     case IX86_BUILTIN_INFQ:
25697     case IX86_BUILTIN_HUGE_VALQ:
25698       {
25699         REAL_VALUE_TYPE inf;
25700         rtx tmp;
25701
25702         real_inf (&inf);
25703         tmp = CONST_DOUBLE_FROM_REAL_VALUE (inf, mode);
25704
25705         tmp = validize_mem (force_const_mem (mode, tmp));
25706
25707         if (target == 0)
25708           target = gen_reg_rtx (mode);
25709
25710         emit_move_insn (target, tmp);
25711         return target;
25712       }
25713
25714     default:
25715       break;
25716     }
25717
25718   for (i = 0, d = bdesc_special_args;
25719        i < ARRAY_SIZE (bdesc_special_args);
25720        i++, d++)
25721     if (d->code == fcode)
25722       return ix86_expand_special_args_builtin (d, exp, target);
25723
25724   for (i = 0, d = bdesc_args;
25725        i < ARRAY_SIZE (bdesc_args);
25726        i++, d++)
25727     if (d->code == fcode)
25728       switch (fcode)
25729         {
25730         case IX86_BUILTIN_FABSQ:
25731         case IX86_BUILTIN_COPYSIGNQ:
25732           if (!TARGET_SSE2)
25733             /* Emit a normal call if SSE2 isn't available.  */
25734             return expand_call (exp, target, ignore);
25735         default:
25736           return ix86_expand_args_builtin (d, exp, target);
25737         }
25738
25739   for (i = 0, d = bdesc_comi; i < ARRAY_SIZE (bdesc_comi); i++, d++)
25740     if (d->code == fcode)
25741       return ix86_expand_sse_comi (d, exp, target);
25742
25743   for (i = 0, d = bdesc_pcmpestr;
25744        i < ARRAY_SIZE (bdesc_pcmpestr);
25745        i++, d++)
25746     if (d->code == fcode)
25747       return ix86_expand_sse_pcmpestr (d, exp, target);
25748
25749   for (i = 0, d = bdesc_pcmpistr;
25750        i < ARRAY_SIZE (bdesc_pcmpistr);
25751        i++, d++)
25752     if (d->code == fcode)
25753       return ix86_expand_sse_pcmpistr (d, exp, target);
25754
25755   for (i = 0, d = bdesc_multi_arg; i < ARRAY_SIZE (bdesc_multi_arg); i++, d++)
25756     if (d->code == fcode)
25757       return ix86_expand_multi_arg_builtin (d->icode, exp, target,
25758                                             (enum multi_arg_type)d->flag,
25759                                             d->comparison);
25760
25761   gcc_unreachable ();
25762 }
25763
25764 /* Returns a function decl for a vectorized version of the builtin function
25765    with builtin function code FN and the result vector type TYPE, or NULL_TREE
25766    if it is not available.  */
25767
25768 static tree
25769 ix86_builtin_vectorized_function (unsigned int fn, tree type_out,
25770                                   tree type_in)
25771 {
25772   enum machine_mode in_mode, out_mode;
25773   int in_n, out_n;
25774
25775   if (TREE_CODE (type_out) != VECTOR_TYPE
25776       || TREE_CODE (type_in) != VECTOR_TYPE)
25777     return NULL_TREE;
25778
25779   out_mode = TYPE_MODE (TREE_TYPE (type_out));
25780   out_n = TYPE_VECTOR_SUBPARTS (type_out);
25781   in_mode = TYPE_MODE (TREE_TYPE (type_in));
25782   in_n = TYPE_VECTOR_SUBPARTS (type_in);
25783
25784   switch (fn)
25785     {
25786     case BUILT_IN_SQRT:
25787       if (out_mode == DFmode && out_n == 2
25788           && in_mode == DFmode && in_n == 2)
25789         return ix86_builtins[IX86_BUILTIN_SQRTPD];
25790       break;
25791
25792     case BUILT_IN_SQRTF:
25793       if (out_mode == SFmode && out_n == 4
25794           && in_mode == SFmode && in_n == 4)
25795         return ix86_builtins[IX86_BUILTIN_SQRTPS_NR];
25796       break;
25797
25798     case BUILT_IN_LRINT:
25799       if (out_mode == SImode && out_n == 4
25800           && in_mode == DFmode && in_n == 2)
25801         return ix86_builtins[IX86_BUILTIN_VEC_PACK_SFIX];
25802       break;
25803
25804     case BUILT_IN_LRINTF:
25805       if (out_mode == SImode && out_n == 4
25806           && in_mode == SFmode && in_n == 4)
25807         return ix86_builtins[IX86_BUILTIN_CVTPS2DQ];
25808       break;
25809
25810     case BUILT_IN_COPYSIGN:
25811       if (out_mode == DFmode && out_n == 2
25812           && in_mode == DFmode && in_n == 2)
25813         return ix86_builtins[IX86_BUILTIN_CPYSGNPD];
25814       break;
25815
25816     case BUILT_IN_COPYSIGNF:
25817       if (out_mode == SFmode && out_n == 4
25818           && in_mode == SFmode && in_n == 4)
25819         return ix86_builtins[IX86_BUILTIN_CPYSGNPS];
25820       break;
25821
25822     default:
25823       ;
25824     }
25825
25826   /* Dispatch to a handler for a vectorization library.  */
25827   if (ix86_veclib_handler)
25828     return (*ix86_veclib_handler) ((enum built_in_function) fn, type_out,
25829                                    type_in);
25830
25831   return NULL_TREE;
25832 }
25833
25834 /* Handler for an SVML-style interface to
25835    a library with vectorized intrinsics.  */
25836
25837 static tree
25838 ix86_veclibabi_svml (enum built_in_function fn, tree type_out, tree type_in)
25839 {
25840   char name[20];
25841   tree fntype, new_fndecl, args;
25842   unsigned arity;
25843   const char *bname;
25844   enum machine_mode el_mode, in_mode;
25845   int n, in_n;
25846
25847   /* The SVML is suitable for unsafe math only.  */
25848   if (!flag_unsafe_math_optimizations)
25849     return NULL_TREE;
25850
25851   el_mode = TYPE_MODE (TREE_TYPE (type_out));
25852   n = TYPE_VECTOR_SUBPARTS (type_out);
25853   in_mode = TYPE_MODE (TREE_TYPE (type_in));
25854   in_n = TYPE_VECTOR_SUBPARTS (type_in);
25855   if (el_mode != in_mode
25856       || n != in_n)
25857     return NULL_TREE;
25858
25859   switch (fn)
25860     {
25861     case BUILT_IN_EXP:
25862     case BUILT_IN_LOG:
25863     case BUILT_IN_LOG10:
25864     case BUILT_IN_POW:
25865     case BUILT_IN_TANH:
25866     case BUILT_IN_TAN:
25867     case BUILT_IN_ATAN:
25868     case BUILT_IN_ATAN2:
25869     case BUILT_IN_ATANH:
25870     case BUILT_IN_CBRT:
25871     case BUILT_IN_SINH:
25872     case BUILT_IN_SIN:
25873     case BUILT_IN_ASINH:
25874     case BUILT_IN_ASIN:
25875     case BUILT_IN_COSH:
25876     case BUILT_IN_COS:
25877     case BUILT_IN_ACOSH:
25878     case BUILT_IN_ACOS:
25879       if (el_mode != DFmode || n != 2)
25880         return NULL_TREE;
25881       break;
25882
25883     case BUILT_IN_EXPF:
25884     case BUILT_IN_LOGF:
25885     case BUILT_IN_LOG10F:
25886     case BUILT_IN_POWF:
25887     case BUILT_IN_TANHF:
25888     case BUILT_IN_TANF:
25889     case BUILT_IN_ATANF:
25890     case BUILT_IN_ATAN2F:
25891     case BUILT_IN_ATANHF:
25892     case BUILT_IN_CBRTF:
25893     case BUILT_IN_SINHF:
25894     case BUILT_IN_SINF:
25895     case BUILT_IN_ASINHF:
25896     case BUILT_IN_ASINF:
25897     case BUILT_IN_COSHF:
25898     case BUILT_IN_COSF:
25899     case BUILT_IN_ACOSHF:
25900     case BUILT_IN_ACOSF:
25901       if (el_mode != SFmode || n != 4)
25902         return NULL_TREE;
25903       break;
25904
25905     default:
25906       return NULL_TREE;
25907     }
25908
25909   bname = IDENTIFIER_POINTER (DECL_NAME (implicit_built_in_decls[fn]));
25910
25911   if (fn == BUILT_IN_LOGF)
25912     strcpy (name, "vmlsLn4");
25913   else if (fn == BUILT_IN_LOG)
25914     strcpy (name, "vmldLn2");
25915   else if (n == 4)
25916     {
25917       sprintf (name, "vmls%s", bname+10);
25918       name[strlen (name)-1] = '4';
25919     }
25920   else
25921     sprintf (name, "vmld%s2", bname+10);
25922
25923   /* Convert to uppercase. */
25924   name[4] &= ~0x20;
25925
25926   arity = 0;
25927   for (args = DECL_ARGUMENTS (implicit_built_in_decls[fn]); args;
25928        args = TREE_CHAIN (args))
25929     arity++;
25930
25931   if (arity == 1)
25932     fntype = build_function_type_list (type_out, type_in, NULL);
25933   else
25934     fntype = build_function_type_list (type_out, type_in, type_in, NULL);
25935
25936   /* Build a function declaration for the vectorized function.  */
25937   new_fndecl = build_decl (BUILTINS_LOCATION,
25938                            FUNCTION_DECL, get_identifier (name), fntype);
25939   TREE_PUBLIC (new_fndecl) = 1;
25940   DECL_EXTERNAL (new_fndecl) = 1;
25941   DECL_IS_NOVOPS (new_fndecl) = 1;
25942   TREE_READONLY (new_fndecl) = 1;
25943
25944   return new_fndecl;
25945 }
25946
25947 /* Handler for an ACML-style interface to
25948    a library with vectorized intrinsics.  */
25949
25950 static tree
25951 ix86_veclibabi_acml (enum built_in_function fn, tree type_out, tree type_in)
25952 {
25953   char name[20] = "__vr.._";
25954   tree fntype, new_fndecl, args;
25955   unsigned arity;
25956   const char *bname;
25957   enum machine_mode el_mode, in_mode;
25958   int n, in_n;
25959
25960   /* The ACML is 64bits only and suitable for unsafe math only as
25961      it does not correctly support parts of IEEE with the required
25962      precision such as denormals.  */
25963   if (!TARGET_64BIT
25964       || !flag_unsafe_math_optimizations)
25965     return NULL_TREE;
25966
25967   el_mode = TYPE_MODE (TREE_TYPE (type_out));
25968   n = TYPE_VECTOR_SUBPARTS (type_out);
25969   in_mode = TYPE_MODE (TREE_TYPE (type_in));
25970   in_n = TYPE_VECTOR_SUBPARTS (type_in);
25971   if (el_mode != in_mode
25972       || n != in_n)
25973     return NULL_TREE;
25974
25975   switch (fn)
25976     {
25977     case BUILT_IN_SIN:
25978     case BUILT_IN_COS:
25979     case BUILT_IN_EXP:
25980     case BUILT_IN_LOG:
25981     case BUILT_IN_LOG2:
25982     case BUILT_IN_LOG10:
25983       name[4] = 'd';
25984       name[5] = '2';
25985       if (el_mode != DFmode
25986           || n != 2)
25987         return NULL_TREE;
25988       break;
25989
25990     case BUILT_IN_SINF:
25991     case BUILT_IN_COSF:
25992     case BUILT_IN_EXPF:
25993     case BUILT_IN_POWF:
25994     case BUILT_IN_LOGF:
25995     case BUILT_IN_LOG2F:
25996     case BUILT_IN_LOG10F:
25997       name[4] = 's';
25998       name[5] = '4';
25999       if (el_mode != SFmode
26000           || n != 4)
26001         return NULL_TREE;
26002       break;
26003
26004     default:
26005       return NULL_TREE;
26006     }
26007
26008   bname = IDENTIFIER_POINTER (DECL_NAME (implicit_built_in_decls[fn]));
26009   sprintf (name + 7, "%s", bname+10);
26010
26011   arity = 0;
26012   for (args = DECL_ARGUMENTS (implicit_built_in_decls[fn]); args;
26013        args = TREE_CHAIN (args))
26014     arity++;
26015
26016   if (arity == 1)
26017     fntype = build_function_type_list (type_out, type_in, NULL);
26018   else
26019     fntype = build_function_type_list (type_out, type_in, type_in, NULL);
26020
26021   /* Build a function declaration for the vectorized function.  */
26022   new_fndecl = build_decl (BUILTINS_LOCATION,
26023                            FUNCTION_DECL, get_identifier (name), fntype);
26024   TREE_PUBLIC (new_fndecl) = 1;
26025   DECL_EXTERNAL (new_fndecl) = 1;
26026   DECL_IS_NOVOPS (new_fndecl) = 1;
26027   TREE_READONLY (new_fndecl) = 1;
26028
26029   return new_fndecl;
26030 }
26031
26032
26033 /* Returns a decl of a function that implements conversion of an integer vector
26034    into a floating-point vector, or vice-versa. TYPE is the type of the integer
26035    side of the conversion.
26036    Return NULL_TREE if it is not available.  */
26037
26038 static tree
26039 ix86_vectorize_builtin_conversion (unsigned int code, tree type)
26040 {
26041   if (! (TARGET_SSE2 && TREE_CODE (type) == VECTOR_TYPE))
26042     return NULL_TREE;
26043
26044   switch (code)
26045     {
26046     case FLOAT_EXPR:
26047       switch (TYPE_MODE (type))
26048         {
26049         case V4SImode:
26050           return TYPE_UNSIGNED (type)
26051             ? ix86_builtins[IX86_BUILTIN_CVTUDQ2PS]
26052             : ix86_builtins[IX86_BUILTIN_CVTDQ2PS];
26053         default:
26054           return NULL_TREE;
26055         }
26056
26057     case FIX_TRUNC_EXPR:
26058       switch (TYPE_MODE (type))
26059         {
26060         case V4SImode:
26061           return TYPE_UNSIGNED (type)
26062             ? NULL_TREE
26063             : ix86_builtins[IX86_BUILTIN_CVTTPS2DQ];
26064         default:
26065           return NULL_TREE;
26066         }
26067     default:
26068       return NULL_TREE;
26069
26070     }
26071 }
26072
26073 /* Returns a code for a target-specific builtin that implements
26074    reciprocal of the function, or NULL_TREE if not available.  */
26075
26076 static tree
26077 ix86_builtin_reciprocal (unsigned int fn, bool md_fn,
26078                          bool sqrt ATTRIBUTE_UNUSED)
26079 {
26080   if (! (TARGET_SSE_MATH && !optimize_insn_for_size_p ()
26081          && flag_finite_math_only && !flag_trapping_math
26082          && flag_unsafe_math_optimizations))
26083     return NULL_TREE;
26084
26085   if (md_fn)
26086     /* Machine dependent builtins.  */
26087     switch (fn)
26088       {
26089         /* Vectorized version of sqrt to rsqrt conversion.  */
26090       case IX86_BUILTIN_SQRTPS_NR:
26091         return ix86_builtins[IX86_BUILTIN_RSQRTPS_NR];
26092
26093       default:
26094         return NULL_TREE;
26095       }
26096   else
26097     /* Normal builtins.  */
26098     switch (fn)
26099       {
26100         /* Sqrt to rsqrt conversion.  */
26101       case BUILT_IN_SQRTF:
26102         return ix86_builtins[IX86_BUILTIN_RSQRTF];
26103
26104       default:
26105         return NULL_TREE;
26106       }
26107 }
26108
26109 /* Store OPERAND to the memory after reload is completed.  This means
26110    that we can't easily use assign_stack_local.  */
26111 rtx
26112 ix86_force_to_memory (enum machine_mode mode, rtx operand)
26113 {
26114   rtx result;
26115
26116   gcc_assert (reload_completed);
26117   if (!TARGET_64BIT_MS_ABI && TARGET_RED_ZONE)
26118     {
26119       result = gen_rtx_MEM (mode,
26120                             gen_rtx_PLUS (Pmode,
26121                                           stack_pointer_rtx,
26122                                           GEN_INT (-RED_ZONE_SIZE)));
26123       emit_move_insn (result, operand);
26124     }
26125   else if ((TARGET_64BIT_MS_ABI || !TARGET_RED_ZONE) && TARGET_64BIT)
26126     {
26127       switch (mode)
26128         {
26129         case HImode:
26130         case SImode:
26131           operand = gen_lowpart (DImode, operand);
26132           /* FALLTHRU */
26133         case DImode:
26134           emit_insn (
26135                       gen_rtx_SET (VOIDmode,
26136                                    gen_rtx_MEM (DImode,
26137                                                 gen_rtx_PRE_DEC (DImode,
26138                                                         stack_pointer_rtx)),
26139                                    operand));
26140           break;
26141         default:
26142           gcc_unreachable ();
26143         }
26144       result = gen_rtx_MEM (mode, stack_pointer_rtx);
26145     }
26146   else
26147     {
26148       switch (mode)
26149         {
26150         case DImode:
26151           {
26152             rtx operands[2];
26153             split_di (&operand, 1, operands, operands + 1);
26154             emit_insn (
26155                         gen_rtx_SET (VOIDmode,
26156                                      gen_rtx_MEM (SImode,
26157                                                   gen_rtx_PRE_DEC (Pmode,
26158                                                         stack_pointer_rtx)),
26159                                      operands[1]));
26160             emit_insn (
26161                         gen_rtx_SET (VOIDmode,
26162                                      gen_rtx_MEM (SImode,
26163                                                   gen_rtx_PRE_DEC (Pmode,
26164                                                         stack_pointer_rtx)),
26165                                      operands[0]));
26166           }
26167           break;
26168         case HImode:
26169           /* Store HImodes as SImodes.  */
26170           operand = gen_lowpart (SImode, operand);
26171           /* FALLTHRU */
26172         case SImode:
26173           emit_insn (
26174                       gen_rtx_SET (VOIDmode,
26175                                    gen_rtx_MEM (GET_MODE (operand),
26176                                                 gen_rtx_PRE_DEC (SImode,
26177                                                         stack_pointer_rtx)),
26178                                    operand));
26179           break;
26180         default:
26181           gcc_unreachable ();
26182         }
26183       result = gen_rtx_MEM (mode, stack_pointer_rtx);
26184     }
26185   return result;
26186 }
26187
26188 /* Free operand from the memory.  */
26189 void
26190 ix86_free_from_memory (enum machine_mode mode)
26191 {
26192   if (!TARGET_RED_ZONE || TARGET_64BIT_MS_ABI)
26193     {
26194       int size;
26195
26196       if (mode == DImode || TARGET_64BIT)
26197         size = 8;
26198       else
26199         size = 4;
26200       /* Use LEA to deallocate stack space.  In peephole2 it will be converted
26201          to pop or add instruction if registers are available.  */
26202       emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
26203                               gen_rtx_PLUS (Pmode, stack_pointer_rtx,
26204                                             GEN_INT (size))));
26205     }
26206 }
26207
26208 /* Implement TARGET_IRA_COVER_CLASSES.  If -mfpmath=sse, we prefer
26209    SSE_REGS to FLOAT_REGS if their costs for a pseudo are the
26210    same.  */
26211 static const enum reg_class *
26212 i386_ira_cover_classes (void)
26213 {
26214   static const enum reg_class sse_fpmath_classes[] = {
26215     GENERAL_REGS, SSE_REGS, MMX_REGS, FLOAT_REGS, LIM_REG_CLASSES
26216   };
26217   static const enum reg_class no_sse_fpmath_classes[] = {
26218     GENERAL_REGS, FLOAT_REGS, MMX_REGS, SSE_REGS, LIM_REG_CLASSES
26219   };
26220
26221  return TARGET_SSE_MATH ? sse_fpmath_classes : no_sse_fpmath_classes;
26222 }
26223
26224 /* Put float CONST_DOUBLE in the constant pool instead of fp regs.
26225    QImode must go into class Q_REGS.
26226    Narrow ALL_REGS to GENERAL_REGS.  This supports allowing movsf and
26227    movdf to do mem-to-mem moves through integer regs.  */
26228 enum reg_class
26229 ix86_preferred_reload_class (rtx x, enum reg_class regclass)
26230 {
26231   enum machine_mode mode = GET_MODE (x);
26232
26233   /* We're only allowed to return a subclass of CLASS.  Many of the
26234      following checks fail for NO_REGS, so eliminate that early.  */
26235   if (regclass == NO_REGS)
26236     return NO_REGS;
26237
26238   /* All classes can load zeros.  */
26239   if (x == CONST0_RTX (mode))
26240     return regclass;
26241
26242   /* Force constants into memory if we are loading a (nonzero) constant into
26243      an MMX or SSE register.  This is because there are no MMX/SSE instructions
26244      to load from a constant.  */
26245   if (CONSTANT_P (x)
26246       && (MAYBE_MMX_CLASS_P (regclass) || MAYBE_SSE_CLASS_P (regclass)))
26247     return NO_REGS;
26248
26249   /* Prefer SSE regs only, if we can use them for math.  */
26250   if (TARGET_SSE_MATH && !TARGET_MIX_SSE_I387 && SSE_FLOAT_MODE_P (mode))
26251     return SSE_CLASS_P (regclass) ? regclass : NO_REGS;
26252
26253   /* Floating-point constants need more complex checks.  */
26254   if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) != VOIDmode)
26255     {
26256       /* General regs can load everything.  */
26257       if (reg_class_subset_p (regclass, GENERAL_REGS))
26258         return regclass;
26259
26260       /* Floats can load 0 and 1 plus some others.  Note that we eliminated
26261          zero above.  We only want to wind up preferring 80387 registers if
26262          we plan on doing computation with them.  */
26263       if (TARGET_80387
26264           && standard_80387_constant_p (x))
26265         {
26266           /* Limit class to non-sse.  */
26267           if (regclass == FLOAT_SSE_REGS)
26268             return FLOAT_REGS;
26269           if (regclass == FP_TOP_SSE_REGS)
26270             return FP_TOP_REG;
26271           if (regclass == FP_SECOND_SSE_REGS)
26272             return FP_SECOND_REG;
26273           if (regclass == FLOAT_INT_REGS || regclass == FLOAT_REGS)
26274             return regclass;
26275         }
26276
26277       return NO_REGS;
26278     }
26279
26280   /* Generally when we see PLUS here, it's the function invariant
26281      (plus soft-fp const_int).  Which can only be computed into general
26282      regs.  */
26283   if (GET_CODE (x) == PLUS)
26284     return reg_class_subset_p (regclass, GENERAL_REGS) ? regclass : NO_REGS;
26285
26286   /* QImode constants are easy to load, but non-constant QImode data
26287      must go into Q_REGS.  */
26288   if (GET_MODE (x) == QImode && !CONSTANT_P (x))
26289     {
26290       if (reg_class_subset_p (regclass, Q_REGS))
26291         return regclass;
26292       if (reg_class_subset_p (Q_REGS, regclass))
26293         return Q_REGS;
26294       return NO_REGS;
26295     }
26296
26297   return regclass;
26298 }
26299
26300 /* Discourage putting floating-point values in SSE registers unless
26301    SSE math is being used, and likewise for the 387 registers.  */
26302 enum reg_class
26303 ix86_preferred_output_reload_class (rtx x, enum reg_class regclass)
26304 {
26305   enum machine_mode mode = GET_MODE (x);
26306
26307   /* Restrict the output reload class to the register bank that we are doing
26308      math on.  If we would like not to return a subset of CLASS, reject this
26309      alternative: if reload cannot do this, it will still use its choice.  */
26310   mode = GET_MODE (x);
26311   if (TARGET_SSE_MATH && SSE_FLOAT_MODE_P (mode))
26312     return MAYBE_SSE_CLASS_P (regclass) ? SSE_REGS : NO_REGS;
26313
26314   if (X87_FLOAT_MODE_P (mode))
26315     {
26316       if (regclass == FP_TOP_SSE_REGS)
26317         return FP_TOP_REG;
26318       else if (regclass == FP_SECOND_SSE_REGS)
26319         return FP_SECOND_REG;
26320       else
26321         return FLOAT_CLASS_P (regclass) ? regclass : NO_REGS;
26322     }
26323
26324   return regclass;
26325 }
26326
26327 static enum reg_class
26328 ix86_secondary_reload (bool in_p, rtx x, enum reg_class rclass,
26329                        enum machine_mode mode,
26330                        secondary_reload_info *sri ATTRIBUTE_UNUSED)
26331 {
26332   /* QImode spills from non-QI registers require
26333      intermediate register on 32bit targets.  */
26334   if (!in_p && mode == QImode && !TARGET_64BIT
26335       && (rclass == GENERAL_REGS
26336           || rclass == LEGACY_REGS
26337           || rclass == INDEX_REGS))
26338     {
26339       int regno;
26340
26341       if (REG_P (x))
26342         regno = REGNO (x);
26343       else
26344         regno = -1;
26345
26346       if (regno >= FIRST_PSEUDO_REGISTER || GET_CODE (x) == SUBREG)
26347         regno = true_regnum (x);
26348
26349       /* Return Q_REGS if the operand is in memory.  */
26350       if (regno == -1)
26351         return Q_REGS;
26352     }
26353
26354   return NO_REGS;
26355 }
26356
26357 /* If we are copying between general and FP registers, we need a memory
26358    location. The same is true for SSE and MMX registers.
26359
26360    To optimize register_move_cost performance, allow inline variant.
26361
26362    The macro can't work reliably when one of the CLASSES is class containing
26363    registers from multiple units (SSE, MMX, integer).  We avoid this by never
26364    combining those units in single alternative in the machine description.
26365    Ensure that this constraint holds to avoid unexpected surprises.
26366
26367    When STRICT is false, we are being called from REGISTER_MOVE_COST, so do not
26368    enforce these sanity checks.  */
26369
26370 static inline int
26371 inline_secondary_memory_needed (enum reg_class class1, enum reg_class class2,
26372                               enum machine_mode mode, int strict)
26373 {
26374   if (MAYBE_FLOAT_CLASS_P (class1) != FLOAT_CLASS_P (class1)
26375       || MAYBE_FLOAT_CLASS_P (class2) != FLOAT_CLASS_P (class2)
26376       || MAYBE_SSE_CLASS_P (class1) != SSE_CLASS_P (class1)
26377       || MAYBE_SSE_CLASS_P (class2) != SSE_CLASS_P (class2)
26378       || MAYBE_MMX_CLASS_P (class1) != MMX_CLASS_P (class1)
26379       || MAYBE_MMX_CLASS_P (class2) != MMX_CLASS_P (class2))
26380     {
26381       gcc_assert (!strict);
26382       return true;
26383     }
26384
26385   if (FLOAT_CLASS_P (class1) != FLOAT_CLASS_P (class2))
26386     return true;
26387
26388   /* ??? This is a lie.  We do have moves between mmx/general, and for
26389      mmx/sse2.  But by saying we need secondary memory we discourage the
26390      register allocator from using the mmx registers unless needed.  */
26391   if (MMX_CLASS_P (class1) != MMX_CLASS_P (class2))
26392     return true;
26393
26394   if (SSE_CLASS_P (class1) != SSE_CLASS_P (class2))
26395     {
26396       /* SSE1 doesn't have any direct moves from other classes.  */
26397       if (!TARGET_SSE2)
26398         return true;
26399
26400       /* If the target says that inter-unit moves are more expensive
26401          than moving through memory, then don't generate them.  */
26402       if (!TARGET_INTER_UNIT_MOVES)
26403         return true;
26404
26405       /* Between SSE and general, we have moves no larger than word size.  */
26406       if (GET_MODE_SIZE (mode) > UNITS_PER_WORD)
26407         return true;
26408     }
26409
26410   return false;
26411 }
26412
26413 int
26414 ix86_secondary_memory_needed (enum reg_class class1, enum reg_class class2,
26415                               enum machine_mode mode, int strict)
26416 {
26417   return inline_secondary_memory_needed (class1, class2, mode, strict);
26418 }
26419
26420 /* Return true if the registers in CLASS cannot represent the change from
26421    modes FROM to TO.  */
26422
26423 bool
26424 ix86_cannot_change_mode_class (enum machine_mode from, enum machine_mode to,
26425                                enum reg_class regclass)
26426 {
26427   if (from == to)
26428     return false;
26429
26430   /* x87 registers can't do subreg at all, as all values are reformatted
26431      to extended precision.  */
26432   if (MAYBE_FLOAT_CLASS_P (regclass))
26433     return true;
26434
26435   if (MAYBE_SSE_CLASS_P (regclass) || MAYBE_MMX_CLASS_P (regclass))
26436     {
26437       /* Vector registers do not support QI or HImode loads.  If we don't
26438          disallow a change to these modes, reload will assume it's ok to
26439          drop the subreg from (subreg:SI (reg:HI 100) 0).  This affects
26440          the vec_dupv4hi pattern.  */
26441       if (GET_MODE_SIZE (from) < 4)
26442         return true;
26443
26444       /* Vector registers do not support subreg with nonzero offsets, which
26445          are otherwise valid for integer registers.  Since we can't see
26446          whether we have a nonzero offset from here, prohibit all
26447          nonparadoxical subregs changing size.  */
26448       if (GET_MODE_SIZE (to) < GET_MODE_SIZE (from))
26449         return true;
26450     }
26451
26452   return false;
26453 }
26454
26455 /* Return the cost of moving data of mode M between a
26456    register and memory.  A value of 2 is the default; this cost is
26457    relative to those in `REGISTER_MOVE_COST'.
26458
26459    This function is used extensively by register_move_cost that is used to
26460    build tables at startup.  Make it inline in this case.
26461    When IN is 2, return maximum of in and out move cost.
26462
26463    If moving between registers and memory is more expensive than
26464    between two registers, you should define this macro to express the
26465    relative cost.
26466
26467    Model also increased moving costs of QImode registers in non
26468    Q_REGS classes.
26469  */
26470 static inline int
26471 inline_memory_move_cost (enum machine_mode mode, enum reg_class regclass,
26472                          int in)
26473 {
26474   int cost;
26475   if (FLOAT_CLASS_P (regclass))
26476     {
26477       int index;
26478       switch (mode)
26479         {
26480           case SFmode:
26481             index = 0;
26482             break;
26483           case DFmode:
26484             index = 1;
26485             break;
26486           case XFmode:
26487             index = 2;
26488             break;
26489           default:
26490             return 100;
26491         }
26492       if (in == 2)
26493         return MAX (ix86_cost->fp_load [index], ix86_cost->fp_store [index]);
26494       return in ? ix86_cost->fp_load [index] : ix86_cost->fp_store [index];
26495     }
26496   if (SSE_CLASS_P (regclass))
26497     {
26498       int index;
26499       switch (GET_MODE_SIZE (mode))
26500         {
26501           case 4:
26502             index = 0;
26503             break;
26504           case 8:
26505             index = 1;
26506             break;
26507           case 16:
26508             index = 2;
26509             break;
26510           default:
26511             return 100;
26512         }
26513       if (in == 2)
26514         return MAX (ix86_cost->sse_load [index], ix86_cost->sse_store [index]);
26515       return in ? ix86_cost->sse_load [index] : ix86_cost->sse_store [index];
26516     }
26517   if (MMX_CLASS_P (regclass))
26518     {
26519       int index;
26520       switch (GET_MODE_SIZE (mode))
26521         {
26522           case 4:
26523             index = 0;
26524             break;
26525           case 8:
26526             index = 1;
26527             break;
26528           default:
26529             return 100;
26530         }
26531       if (in)
26532         return MAX (ix86_cost->mmx_load [index], ix86_cost->mmx_store [index]);
26533       return in ? ix86_cost->mmx_load [index] : ix86_cost->mmx_store [index];
26534     }
26535   switch (GET_MODE_SIZE (mode))
26536     {
26537       case 1:
26538         if (Q_CLASS_P (regclass) || TARGET_64BIT)
26539           {
26540             if (!in)
26541               return ix86_cost->int_store[0];
26542             if (TARGET_PARTIAL_REG_DEPENDENCY
26543                 && optimize_function_for_speed_p (cfun))
26544               cost = ix86_cost->movzbl_load;
26545             else
26546               cost = ix86_cost->int_load[0];
26547             if (in == 2)
26548               return MAX (cost, ix86_cost->int_store[0]);
26549             return cost;
26550           }
26551         else
26552           {
26553            if (in == 2)
26554              return MAX (ix86_cost->movzbl_load, ix86_cost->int_store[0] + 4);
26555            if (in)
26556              return ix86_cost->movzbl_load;
26557            else
26558              return ix86_cost->int_store[0] + 4;
26559           }
26560         break;
26561       case 2:
26562         if (in == 2)
26563           return MAX (ix86_cost->int_load[1], ix86_cost->int_store[1]);
26564         return in ? ix86_cost->int_load[1] : ix86_cost->int_store[1];
26565       default:
26566         /* Compute number of 32bit moves needed.  TFmode is moved as XFmode.  */
26567         if (mode == TFmode)
26568           mode = XFmode;
26569         if (in == 2)
26570           cost = MAX (ix86_cost->int_load[2] , ix86_cost->int_store[2]);
26571         else if (in)
26572           cost = ix86_cost->int_load[2];
26573         else
26574           cost = ix86_cost->int_store[2];
26575         return (cost * (((int) GET_MODE_SIZE (mode)
26576                         + UNITS_PER_WORD - 1) / UNITS_PER_WORD));
26577     }
26578 }
26579
26580 int
26581 ix86_memory_move_cost (enum machine_mode mode, enum reg_class regclass, int in)
26582 {
26583   return inline_memory_move_cost (mode, regclass, in);
26584 }
26585
26586
26587 /* Return the cost of moving data from a register in class CLASS1 to
26588    one in class CLASS2.
26589
26590    It is not required that the cost always equal 2 when FROM is the same as TO;
26591    on some machines it is expensive to move between registers if they are not
26592    general registers.  */
26593
26594 int
26595 ix86_register_move_cost (enum machine_mode mode, enum reg_class class1,
26596                          enum reg_class class2)
26597 {
26598   /* In case we require secondary memory, compute cost of the store followed
26599      by load.  In order to avoid bad register allocation choices, we need
26600      for this to be *at least* as high as the symmetric MEMORY_MOVE_COST.  */
26601
26602   if (inline_secondary_memory_needed (class1, class2, mode, 0))
26603     {
26604       int cost = 1;
26605
26606       cost += inline_memory_move_cost (mode, class1, 2);
26607       cost += inline_memory_move_cost (mode, class2, 2);
26608
26609       /* In case of copying from general_purpose_register we may emit multiple
26610          stores followed by single load causing memory size mismatch stall.
26611          Count this as arbitrarily high cost of 20.  */
26612       if (CLASS_MAX_NREGS (class1, mode) > CLASS_MAX_NREGS (class2, mode))
26613         cost += 20;
26614
26615       /* In the case of FP/MMX moves, the registers actually overlap, and we
26616          have to switch modes in order to treat them differently.  */
26617       if ((MMX_CLASS_P (class1) && MAYBE_FLOAT_CLASS_P (class2))
26618           || (MMX_CLASS_P (class2) && MAYBE_FLOAT_CLASS_P (class1)))
26619         cost += 20;
26620
26621       return cost;
26622     }
26623
26624   /* Moves between SSE/MMX and integer unit are expensive.  */
26625   if (MMX_CLASS_P (class1) != MMX_CLASS_P (class2)
26626       || SSE_CLASS_P (class1) != SSE_CLASS_P (class2))
26627
26628     /* ??? By keeping returned value relatively high, we limit the number
26629        of moves between integer and MMX/SSE registers for all targets.
26630        Additionally, high value prevents problem with x86_modes_tieable_p(),
26631        where integer modes in MMX/SSE registers are not tieable
26632        because of missing QImode and HImode moves to, from or between
26633        MMX/SSE registers.  */
26634     return MAX (8, ix86_cost->mmxsse_to_integer);
26635
26636   if (MAYBE_FLOAT_CLASS_P (class1))
26637     return ix86_cost->fp_move;
26638   if (MAYBE_SSE_CLASS_P (class1))
26639     return ix86_cost->sse_move;
26640   if (MAYBE_MMX_CLASS_P (class1))
26641     return ix86_cost->mmx_move;
26642   return 2;
26643 }
26644
26645 /* Return 1 if hard register REGNO can hold a value of machine-mode MODE.  */
26646
26647 bool
26648 ix86_hard_regno_mode_ok (int regno, enum machine_mode mode)
26649 {
26650   /* Flags and only flags can only hold CCmode values.  */
26651   if (CC_REGNO_P (regno))
26652     return GET_MODE_CLASS (mode) == MODE_CC;
26653   if (GET_MODE_CLASS (mode) == MODE_CC
26654       || GET_MODE_CLASS (mode) == MODE_RANDOM
26655       || GET_MODE_CLASS (mode) == MODE_PARTIAL_INT)
26656     return 0;
26657   if (FP_REGNO_P (regno))
26658     return VALID_FP_MODE_P (mode);
26659   if (SSE_REGNO_P (regno))
26660     {
26661       /* We implement the move patterns for all vector modes into and
26662          out of SSE registers, even when no operation instructions
26663          are available.  OImode move is available only when AVX is
26664          enabled.  */
26665       return ((TARGET_AVX && mode == OImode)
26666               || VALID_AVX256_REG_MODE (mode)
26667               || VALID_SSE_REG_MODE (mode)
26668               || VALID_SSE2_REG_MODE (mode)
26669               || VALID_MMX_REG_MODE (mode)
26670               || VALID_MMX_REG_MODE_3DNOW (mode));
26671     }
26672   if (MMX_REGNO_P (regno))
26673     {
26674       /* We implement the move patterns for 3DNOW modes even in MMX mode,
26675          so if the register is available at all, then we can move data of
26676          the given mode into or out of it.  */
26677       return (VALID_MMX_REG_MODE (mode)
26678               || VALID_MMX_REG_MODE_3DNOW (mode));
26679     }
26680
26681   if (mode == QImode)
26682     {
26683       /* Take care for QImode values - they can be in non-QI regs,
26684          but then they do cause partial register stalls.  */
26685       if (regno <= BX_REG || TARGET_64BIT)
26686         return 1;
26687       if (!TARGET_PARTIAL_REG_STALL)
26688         return 1;
26689       return reload_in_progress || reload_completed;
26690     }
26691   /* We handle both integer and floats in the general purpose registers.  */
26692   else if (VALID_INT_MODE_P (mode))
26693     return 1;
26694   else if (VALID_FP_MODE_P (mode))
26695     return 1;
26696   else if (VALID_DFP_MODE_P (mode))
26697     return 1;
26698   /* Lots of MMX code casts 8 byte vector modes to DImode.  If we then go
26699      on to use that value in smaller contexts, this can easily force a
26700      pseudo to be allocated to GENERAL_REGS.  Since this is no worse than
26701      supporting DImode, allow it.  */
26702   else if (VALID_MMX_REG_MODE_3DNOW (mode) || VALID_MMX_REG_MODE (mode))
26703     return 1;
26704
26705   return 0;
26706 }
26707
26708 /* A subroutine of ix86_modes_tieable_p.  Return true if MODE is a
26709    tieable integer mode.  */
26710
26711 static bool
26712 ix86_tieable_integer_mode_p (enum machine_mode mode)
26713 {
26714   switch (mode)
26715     {
26716     case HImode:
26717     case SImode:
26718       return true;
26719
26720     case QImode:
26721       return TARGET_64BIT || !TARGET_PARTIAL_REG_STALL;
26722
26723     case DImode:
26724       return TARGET_64BIT;
26725
26726     default:
26727       return false;
26728     }
26729 }
26730
26731 /* Return true if MODE1 is accessible in a register that can hold MODE2
26732    without copying.  That is, all register classes that can hold MODE2
26733    can also hold MODE1.  */
26734
26735 bool
26736 ix86_modes_tieable_p (enum machine_mode mode1, enum machine_mode mode2)
26737 {
26738   if (mode1 == mode2)
26739     return true;
26740
26741   if (ix86_tieable_integer_mode_p (mode1)
26742       && ix86_tieable_integer_mode_p (mode2))
26743     return true;
26744
26745   /* MODE2 being XFmode implies fp stack or general regs, which means we
26746      can tie any smaller floating point modes to it.  Note that we do not
26747      tie this with TFmode.  */
26748   if (mode2 == XFmode)
26749     return mode1 == SFmode || mode1 == DFmode;
26750
26751   /* MODE2 being DFmode implies fp stack, general or sse regs, which means
26752      that we can tie it with SFmode.  */
26753   if (mode2 == DFmode)
26754     return mode1 == SFmode;
26755
26756   /* If MODE2 is only appropriate for an SSE register, then tie with
26757      any other mode acceptable to SSE registers.  */
26758   if (GET_MODE_SIZE (mode2) == 16
26759       && ix86_hard_regno_mode_ok (FIRST_SSE_REG, mode2))
26760     return (GET_MODE_SIZE (mode1) == 16
26761             && ix86_hard_regno_mode_ok (FIRST_SSE_REG, mode1));
26762
26763   /* If MODE2 is appropriate for an MMX register, then tie
26764      with any other mode acceptable to MMX registers.  */
26765   if (GET_MODE_SIZE (mode2) == 8
26766       && ix86_hard_regno_mode_ok (FIRST_MMX_REG, mode2))
26767     return (GET_MODE_SIZE (mode1) == 8
26768             && ix86_hard_regno_mode_ok (FIRST_MMX_REG, mode1));
26769
26770   return false;
26771 }
26772
26773 /* Compute a (partial) cost for rtx X.  Return true if the complete
26774    cost has been computed, and false if subexpressions should be
26775    scanned.  In either case, *TOTAL contains the cost result.  */
26776
26777 static bool
26778 ix86_rtx_costs (rtx x, int code, int outer_code_i, int *total, bool speed)
26779 {
26780   enum rtx_code outer_code = (enum rtx_code) outer_code_i;
26781   enum machine_mode mode = GET_MODE (x);
26782   const struct processor_costs *cost = speed ? ix86_cost : &ix86_size_cost;
26783
26784   switch (code)
26785     {
26786     case CONST_INT:
26787     case CONST:
26788     case LABEL_REF:
26789     case SYMBOL_REF:
26790       if (TARGET_64BIT && !x86_64_immediate_operand (x, VOIDmode))
26791         *total = 3;
26792       else if (TARGET_64BIT && !x86_64_zext_immediate_operand (x, VOIDmode))
26793         *total = 2;
26794       else if (flag_pic && SYMBOLIC_CONST (x)
26795                && (!TARGET_64BIT
26796                    || (!GET_CODE (x) != LABEL_REF
26797                        && (GET_CODE (x) != SYMBOL_REF
26798                            || !SYMBOL_REF_LOCAL_P (x)))))
26799         *total = 1;
26800       else
26801         *total = 0;
26802       return true;
26803
26804     case CONST_DOUBLE:
26805       if (mode == VOIDmode)
26806         *total = 0;
26807       else
26808         switch (standard_80387_constant_p (x))
26809           {
26810           case 1: /* 0.0 */
26811             *total = 1;
26812             break;
26813           default: /* Other constants */
26814             *total = 2;
26815             break;
26816           case 0:
26817           case -1:
26818             /* Start with (MEM (SYMBOL_REF)), since that's where
26819                it'll probably end up.  Add a penalty for size.  */
26820             *total = (COSTS_N_INSNS (1)
26821                       + (flag_pic != 0 && !TARGET_64BIT)
26822                       + (mode == SFmode ? 0 : mode == DFmode ? 1 : 2));
26823             break;
26824           }
26825       return true;
26826
26827     case ZERO_EXTEND:
26828       /* The zero extensions is often completely free on x86_64, so make
26829          it as cheap as possible.  */
26830       if (TARGET_64BIT && mode == DImode
26831           && GET_MODE (XEXP (x, 0)) == SImode)
26832         *total = 1;
26833       else if (TARGET_ZERO_EXTEND_WITH_AND)
26834         *total = cost->add;
26835       else
26836         *total = cost->movzx;
26837       return false;
26838
26839     case SIGN_EXTEND:
26840       *total = cost->movsx;
26841       return false;
26842
26843     case ASHIFT:
26844       if (CONST_INT_P (XEXP (x, 1))
26845           && (GET_MODE (XEXP (x, 0)) != DImode || TARGET_64BIT))
26846         {
26847           HOST_WIDE_INT value = INTVAL (XEXP (x, 1));
26848           if (value == 1)
26849             {
26850               *total = cost->add;
26851               return false;
26852             }
26853           if ((value == 2 || value == 3)
26854               && cost->lea <= cost->shift_const)
26855             {
26856               *total = cost->lea;
26857               return false;
26858             }
26859         }
26860       /* FALLTHRU */
26861
26862     case ROTATE:
26863     case ASHIFTRT:
26864     case LSHIFTRT:
26865     case ROTATERT:
26866       if (!TARGET_64BIT && GET_MODE (XEXP (x, 0)) == DImode)
26867         {
26868           if (CONST_INT_P (XEXP (x, 1)))
26869             {
26870               if (INTVAL (XEXP (x, 1)) > 32)
26871                 *total = cost->shift_const + COSTS_N_INSNS (2);
26872               else
26873                 *total = cost->shift_const * 2;
26874             }
26875           else
26876             {
26877               if (GET_CODE (XEXP (x, 1)) == AND)
26878                 *total = cost->shift_var * 2;
26879               else
26880                 *total = cost->shift_var * 6 + COSTS_N_INSNS (2);
26881             }
26882         }
26883       else
26884         {
26885           if (CONST_INT_P (XEXP (x, 1)))
26886             *total = cost->shift_const;
26887           else
26888             *total = cost->shift_var;
26889         }
26890       return false;
26891
26892     case MULT:
26893       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
26894         {
26895           /* ??? SSE scalar cost should be used here.  */
26896           *total = cost->fmul;
26897           return false;
26898         }
26899       else if (X87_FLOAT_MODE_P (mode))
26900         {
26901           *total = cost->fmul;
26902           return false;
26903         }
26904       else if (FLOAT_MODE_P (mode))
26905         {
26906           /* ??? SSE vector cost should be used here.  */
26907           *total = cost->fmul;
26908           return false;
26909         }
26910       else
26911         {
26912           rtx op0 = XEXP (x, 0);
26913           rtx op1 = XEXP (x, 1);
26914           int nbits;
26915           if (CONST_INT_P (XEXP (x, 1)))
26916             {
26917               unsigned HOST_WIDE_INT value = INTVAL (XEXP (x, 1));
26918               for (nbits = 0; value != 0; value &= value - 1)
26919                 nbits++;
26920             }
26921           else
26922             /* This is arbitrary.  */
26923             nbits = 7;
26924
26925           /* Compute costs correctly for widening multiplication.  */
26926           if ((GET_CODE (op0) == SIGN_EXTEND || GET_CODE (op0) == ZERO_EXTEND)
26927               && GET_MODE_SIZE (GET_MODE (XEXP (op0, 0))) * 2
26928                  == GET_MODE_SIZE (mode))
26929             {
26930               int is_mulwiden = 0;
26931               enum machine_mode inner_mode = GET_MODE (op0);
26932
26933               if (GET_CODE (op0) == GET_CODE (op1))
26934                 is_mulwiden = 1, op1 = XEXP (op1, 0);
26935               else if (CONST_INT_P (op1))
26936                 {
26937                   if (GET_CODE (op0) == SIGN_EXTEND)
26938                     is_mulwiden = trunc_int_for_mode (INTVAL (op1), inner_mode)
26939                                   == INTVAL (op1);
26940                   else
26941                     is_mulwiden = !(INTVAL (op1) & ~GET_MODE_MASK (inner_mode));
26942                 }
26943
26944               if (is_mulwiden)
26945                 op0 = XEXP (op0, 0), mode = GET_MODE (op0);
26946             }
26947
26948           *total = (cost->mult_init[MODE_INDEX (mode)]
26949                     + nbits * cost->mult_bit
26950                     + rtx_cost (op0, outer_code, speed) + rtx_cost (op1, outer_code, speed));
26951
26952           return true;
26953         }
26954
26955     case DIV:
26956     case UDIV:
26957     case MOD:
26958     case UMOD:
26959       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
26960         /* ??? SSE cost should be used here.  */
26961         *total = cost->fdiv;
26962       else if (X87_FLOAT_MODE_P (mode))
26963         *total = cost->fdiv;
26964       else if (FLOAT_MODE_P (mode))
26965         /* ??? SSE vector cost should be used here.  */
26966         *total = cost->fdiv;
26967       else
26968         *total = cost->divide[MODE_INDEX (mode)];
26969       return false;
26970
26971     case PLUS:
26972       if (GET_MODE_CLASS (mode) == MODE_INT
26973                && GET_MODE_BITSIZE (mode) <= GET_MODE_BITSIZE (Pmode))
26974         {
26975           if (GET_CODE (XEXP (x, 0)) == PLUS
26976               && GET_CODE (XEXP (XEXP (x, 0), 0)) == MULT
26977               && CONST_INT_P (XEXP (XEXP (XEXP (x, 0), 0), 1))
26978               && CONSTANT_P (XEXP (x, 1)))
26979             {
26980               HOST_WIDE_INT val = INTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1));
26981               if (val == 2 || val == 4 || val == 8)
26982                 {
26983                   *total = cost->lea;
26984                   *total += rtx_cost (XEXP (XEXP (x, 0), 1), outer_code, speed);
26985                   *total += rtx_cost (XEXP (XEXP (XEXP (x, 0), 0), 0),
26986                                       outer_code, speed);
26987                   *total += rtx_cost (XEXP (x, 1), outer_code, speed);
26988                   return true;
26989                 }
26990             }
26991           else if (GET_CODE (XEXP (x, 0)) == MULT
26992                    && CONST_INT_P (XEXP (XEXP (x, 0), 1)))
26993             {
26994               HOST_WIDE_INT val = INTVAL (XEXP (XEXP (x, 0), 1));
26995               if (val == 2 || val == 4 || val == 8)
26996                 {
26997                   *total = cost->lea;
26998                   *total += rtx_cost (XEXP (XEXP (x, 0), 0), outer_code, speed);
26999                   *total += rtx_cost (XEXP (x, 1), outer_code, speed);
27000                   return true;
27001                 }
27002             }
27003           else if (GET_CODE (XEXP (x, 0)) == PLUS)
27004             {
27005               *total = cost->lea;
27006               *total += rtx_cost (XEXP (XEXP (x, 0), 0), outer_code, speed);
27007               *total += rtx_cost (XEXP (XEXP (x, 0), 1), outer_code, speed);
27008               *total += rtx_cost (XEXP (x, 1), outer_code, speed);
27009               return true;
27010             }
27011         }
27012       /* FALLTHRU */
27013
27014     case MINUS:
27015       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
27016         {
27017           /* ??? SSE cost should be used here.  */
27018           *total = cost->fadd;
27019           return false;
27020         }
27021       else if (X87_FLOAT_MODE_P (mode))
27022         {
27023           *total = cost->fadd;
27024           return false;
27025         }
27026       else if (FLOAT_MODE_P (mode))
27027         {
27028           /* ??? SSE vector cost should be used here.  */
27029           *total = cost->fadd;
27030           return false;
27031         }
27032       /* FALLTHRU */
27033
27034     case AND:
27035     case IOR:
27036     case XOR:
27037       if (!TARGET_64BIT && mode == DImode)
27038         {
27039           *total = (cost->add * 2
27040                     + (rtx_cost (XEXP (x, 0), outer_code, speed)
27041                        << (GET_MODE (XEXP (x, 0)) != DImode))
27042                     + (rtx_cost (XEXP (x, 1), outer_code, speed)
27043                        << (GET_MODE (XEXP (x, 1)) != DImode)));
27044           return true;
27045         }
27046       /* FALLTHRU */
27047
27048     case NEG:
27049       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
27050         {
27051           /* ??? SSE cost should be used here.  */
27052           *total = cost->fchs;
27053           return false;
27054         }
27055       else if (X87_FLOAT_MODE_P (mode))
27056         {
27057           *total = cost->fchs;
27058           return false;
27059         }
27060       else if (FLOAT_MODE_P (mode))
27061         {
27062           /* ??? SSE vector cost should be used here.  */
27063           *total = cost->fchs;
27064           return false;
27065         }
27066       /* FALLTHRU */
27067
27068     case NOT:
27069       if (!TARGET_64BIT && mode == DImode)
27070         *total = cost->add * 2;
27071       else
27072         *total = cost->add;
27073       return false;
27074
27075     case COMPARE:
27076       if (GET_CODE (XEXP (x, 0)) == ZERO_EXTRACT
27077           && XEXP (XEXP (x, 0), 1) == const1_rtx
27078           && CONST_INT_P (XEXP (XEXP (x, 0), 2))
27079           && XEXP (x, 1) == const0_rtx)
27080         {
27081           /* This kind of construct is implemented using test[bwl].
27082              Treat it as if we had an AND.  */
27083           *total = (cost->add
27084                     + rtx_cost (XEXP (XEXP (x, 0), 0), outer_code, speed)
27085                     + rtx_cost (const1_rtx, outer_code, speed));
27086           return true;
27087         }
27088       return false;
27089
27090     case FLOAT_EXTEND:
27091       if (!(SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH))
27092         *total = 0;
27093       return false;
27094
27095     case ABS:
27096       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
27097         /* ??? SSE cost should be used here.  */
27098         *total = cost->fabs;
27099       else if (X87_FLOAT_MODE_P (mode))
27100         *total = cost->fabs;
27101       else if (FLOAT_MODE_P (mode))
27102         /* ??? SSE vector cost should be used here.  */
27103         *total = cost->fabs;
27104       return false;
27105
27106     case SQRT:
27107       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
27108         /* ??? SSE cost should be used here.  */
27109         *total = cost->fsqrt;
27110       else if (X87_FLOAT_MODE_P (mode))
27111         *total = cost->fsqrt;
27112       else if (FLOAT_MODE_P (mode))
27113         /* ??? SSE vector cost should be used here.  */
27114         *total = cost->fsqrt;
27115       return false;
27116
27117     case UNSPEC:
27118       if (XINT (x, 1) == UNSPEC_TP)
27119         *total = 0;
27120       return false;
27121
27122     default:
27123       return false;
27124     }
27125 }
27126
27127 #if TARGET_MACHO
27128
27129 static int current_machopic_label_num;
27130
27131 /* Given a symbol name and its associated stub, write out the
27132    definition of the stub.  */
27133
27134 void
27135 machopic_output_stub (FILE *file, const char *symb, const char *stub)
27136 {
27137   unsigned int length;
27138   char *binder_name, *symbol_name, lazy_ptr_name[32];
27139   int label = ++current_machopic_label_num;
27140
27141   /* For 64-bit we shouldn't get here.  */
27142   gcc_assert (!TARGET_64BIT);
27143
27144   /* Lose our funky encoding stuff so it doesn't contaminate the stub.  */
27145   symb = (*targetm.strip_name_encoding) (symb);
27146
27147   length = strlen (stub);
27148   binder_name = XALLOCAVEC (char, length + 32);
27149   GEN_BINDER_NAME_FOR_STUB (binder_name, stub, length);
27150
27151   length = strlen (symb);
27152   symbol_name = XALLOCAVEC (char, length + 32);
27153   GEN_SYMBOL_NAME_FOR_SYMBOL (symbol_name, symb, length);
27154
27155   sprintf (lazy_ptr_name, "L%d$lz", label);
27156
27157   if (MACHOPIC_PURE)
27158     switch_to_section (darwin_sections[machopic_picsymbol_stub_section]);
27159   else
27160     switch_to_section (darwin_sections[machopic_symbol_stub_section]);
27161
27162   fprintf (file, "%s:\n", stub);
27163   fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
27164
27165   if (MACHOPIC_PURE)
27166     {
27167       fprintf (file, "\tcall\tLPC$%d\nLPC$%d:\tpopl\t%%eax\n", label, label);
27168       fprintf (file, "\tmovl\t%s-LPC$%d(%%eax),%%edx\n", lazy_ptr_name, label);
27169       fprintf (file, "\tjmp\t*%%edx\n");
27170     }
27171   else
27172     fprintf (file, "\tjmp\t*%s\n", lazy_ptr_name);
27173
27174   fprintf (file, "%s:\n", binder_name);
27175
27176   if (MACHOPIC_PURE)
27177     {
27178       fprintf (file, "\tlea\t%s-LPC$%d(%%eax),%%eax\n", lazy_ptr_name, label);
27179       fputs ("\tpushl\t%eax\n", file);
27180     }
27181   else
27182     fprintf (file, "\tpushl\t$%s\n", lazy_ptr_name);
27183
27184   fputs ("\tjmp\tdyld_stub_binding_helper\n", file);
27185
27186   switch_to_section (darwin_sections[machopic_lazy_symbol_ptr_section]);
27187   fprintf (file, "%s:\n", lazy_ptr_name);
27188   fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
27189   fprintf (file, ASM_LONG "%s\n", binder_name);
27190 }
27191
27192 void
27193 darwin_x86_file_end (void)
27194 {
27195   darwin_file_end ();
27196   ix86_file_end ();
27197 }
27198 #endif /* TARGET_MACHO */
27199
27200 /* Order the registers for register allocator.  */
27201
27202 void
27203 x86_order_regs_for_local_alloc (void)
27204 {
27205    int pos = 0;
27206    int i;
27207
27208    /* First allocate the local general purpose registers.  */
27209    for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
27210      if (GENERAL_REGNO_P (i) && call_used_regs[i])
27211         reg_alloc_order [pos++] = i;
27212
27213    /* Global general purpose registers.  */
27214    for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
27215      if (GENERAL_REGNO_P (i) && !call_used_regs[i])
27216         reg_alloc_order [pos++] = i;
27217
27218    /* x87 registers come first in case we are doing FP math
27219       using them.  */
27220    if (!TARGET_SSE_MATH)
27221      for (i = FIRST_STACK_REG; i <= LAST_STACK_REG; i++)
27222        reg_alloc_order [pos++] = i;
27223
27224    /* SSE registers.  */
27225    for (i = FIRST_SSE_REG; i <= LAST_SSE_REG; i++)
27226      reg_alloc_order [pos++] = i;
27227    for (i = FIRST_REX_SSE_REG; i <= LAST_REX_SSE_REG; i++)
27228      reg_alloc_order [pos++] = i;
27229
27230    /* x87 registers.  */
27231    if (TARGET_SSE_MATH)
27232      for (i = FIRST_STACK_REG; i <= LAST_STACK_REG; i++)
27233        reg_alloc_order [pos++] = i;
27234
27235    for (i = FIRST_MMX_REG; i <= LAST_MMX_REG; i++)
27236      reg_alloc_order [pos++] = i;
27237
27238    /* Initialize the rest of array as we do not allocate some registers
27239       at all.  */
27240    while (pos < FIRST_PSEUDO_REGISTER)
27241      reg_alloc_order [pos++] = 0;
27242 }
27243
27244 /* Handle a "ms_abi" or "sysv" attribute; arguments as in
27245    struct attribute_spec.handler.  */
27246 static tree
27247 ix86_handle_abi_attribute (tree *node, tree name,
27248                               tree args ATTRIBUTE_UNUSED,
27249                               int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
27250 {
27251   if (TREE_CODE (*node) != FUNCTION_TYPE
27252       && TREE_CODE (*node) != METHOD_TYPE
27253       && TREE_CODE (*node) != FIELD_DECL
27254       && TREE_CODE (*node) != TYPE_DECL)
27255     {
27256       warning (OPT_Wattributes, "%qE attribute only applies to functions",
27257                name);
27258       *no_add_attrs = true;
27259       return NULL_TREE;
27260     }
27261   if (!TARGET_64BIT)
27262     {
27263       warning (OPT_Wattributes, "%qE attribute only available for 64-bit",
27264                name);
27265       *no_add_attrs = true;
27266       return NULL_TREE;
27267     }
27268
27269   /* Can combine regparm with all attributes but fastcall.  */
27270   if (is_attribute_p ("ms_abi", name))
27271     {
27272       if (lookup_attribute ("sysv_abi", TYPE_ATTRIBUTES (*node)))
27273         {
27274           error ("ms_abi and sysv_abi attributes are not compatible");
27275         }
27276
27277       return NULL_TREE;
27278     }
27279   else if (is_attribute_p ("sysv_abi", name))
27280     {
27281       if (lookup_attribute ("ms_abi", TYPE_ATTRIBUTES (*node)))
27282         {
27283           error ("ms_abi and sysv_abi attributes are not compatible");
27284         }
27285
27286       return NULL_TREE;
27287     }
27288
27289   return NULL_TREE;
27290 }
27291
27292 /* Handle a "ms_struct" or "gcc_struct" attribute; arguments as in
27293    struct attribute_spec.handler.  */
27294 static tree
27295 ix86_handle_struct_attribute (tree *node, tree name,
27296                               tree args ATTRIBUTE_UNUSED,
27297                               int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
27298 {
27299   tree *type = NULL;
27300   if (DECL_P (*node))
27301     {
27302       if (TREE_CODE (*node) == TYPE_DECL)
27303         type = &TREE_TYPE (*node);
27304     }
27305   else
27306     type = node;
27307
27308   if (!(type && (TREE_CODE (*type) == RECORD_TYPE
27309                  || TREE_CODE (*type) == UNION_TYPE)))
27310     {
27311       warning (OPT_Wattributes, "%qE attribute ignored",
27312                name);
27313       *no_add_attrs = true;
27314     }
27315
27316   else if ((is_attribute_p ("ms_struct", name)
27317             && lookup_attribute ("gcc_struct", TYPE_ATTRIBUTES (*type)))
27318            || ((is_attribute_p ("gcc_struct", name)
27319                 && lookup_attribute ("ms_struct", TYPE_ATTRIBUTES (*type)))))
27320     {
27321       warning (OPT_Wattributes, "%qE incompatible attribute ignored",
27322                name);
27323       *no_add_attrs = true;
27324     }
27325
27326   return NULL_TREE;
27327 }
27328
27329 static tree
27330 ix86_handle_fndecl_attribute (tree *node, tree name,
27331                               tree args ATTRIBUTE_UNUSED,
27332                               int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
27333 {
27334   if (TREE_CODE (*node) != FUNCTION_DECL)
27335     {
27336       warning (OPT_Wattributes, "%qE attribute only applies to functions",
27337                name);
27338       *no_add_attrs = true;
27339       return NULL_TREE;
27340     }
27341
27342   if (TARGET_64BIT)
27343     {
27344       warning (OPT_Wattributes, "%qE attribute only available for 32-bit",
27345                name);
27346       return NULL_TREE;
27347     }
27348
27349 #ifndef HAVE_AS_IX86_SWAP
27350   sorry ("ms_hook_prologue attribute needs assembler swap suffix support");
27351 #endif
27352
27353     return NULL_TREE;
27354 }
27355
27356 static bool
27357 ix86_ms_bitfield_layout_p (const_tree record_type)
27358 {
27359   return (TARGET_MS_BITFIELD_LAYOUT &&
27360           !lookup_attribute ("gcc_struct", TYPE_ATTRIBUTES (record_type)))
27361     || lookup_attribute ("ms_struct", TYPE_ATTRIBUTES (record_type));
27362 }
27363
27364 /* Returns an expression indicating where the this parameter is
27365    located on entry to the FUNCTION.  */
27366
27367 static rtx
27368 x86_this_parameter (tree function)
27369 {
27370   tree type = TREE_TYPE (function);
27371   bool aggr = aggregate_value_p (TREE_TYPE (type), type) != 0;
27372   int nregs;
27373
27374   if (TARGET_64BIT)
27375     {
27376       const int *parm_regs;
27377
27378       if (ix86_function_type_abi (type) == MS_ABI)
27379         parm_regs = x86_64_ms_abi_int_parameter_registers;
27380       else
27381         parm_regs = x86_64_int_parameter_registers;
27382       return gen_rtx_REG (DImode, parm_regs[aggr]);
27383     }
27384
27385   nregs = ix86_function_regparm (type, function);
27386
27387   if (nregs > 0 && !stdarg_p (type))
27388     {
27389       int regno;
27390
27391       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (type)))
27392         regno = aggr ? DX_REG : CX_REG;
27393       else
27394         {
27395           regno = AX_REG;
27396           if (aggr)
27397             {
27398               regno = DX_REG;
27399               if (nregs == 1)
27400                 return gen_rtx_MEM (SImode,
27401                                     plus_constant (stack_pointer_rtx, 4));
27402             }
27403         }
27404       return gen_rtx_REG (SImode, regno);
27405     }
27406
27407   return gen_rtx_MEM (SImode, plus_constant (stack_pointer_rtx, aggr ? 8 : 4));
27408 }
27409
27410 /* Determine whether x86_output_mi_thunk can succeed.  */
27411
27412 static bool
27413 x86_can_output_mi_thunk (const_tree thunk ATTRIBUTE_UNUSED,
27414                          HOST_WIDE_INT delta ATTRIBUTE_UNUSED,
27415                          HOST_WIDE_INT vcall_offset, const_tree function)
27416 {
27417   /* 64-bit can handle anything.  */
27418   if (TARGET_64BIT)
27419     return true;
27420
27421   /* For 32-bit, everything's fine if we have one free register.  */
27422   if (ix86_function_regparm (TREE_TYPE (function), function) < 3)
27423     return true;
27424
27425   /* Need a free register for vcall_offset.  */
27426   if (vcall_offset)
27427     return false;
27428
27429   /* Need a free register for GOT references.  */
27430   if (flag_pic && !(*targetm.binds_local_p) (function))
27431     return false;
27432
27433   /* Otherwise ok.  */
27434   return true;
27435 }
27436
27437 /* Output the assembler code for a thunk function.  THUNK_DECL is the
27438    declaration for the thunk function itself, FUNCTION is the decl for
27439    the target function.  DELTA is an immediate constant offset to be
27440    added to THIS.  If VCALL_OFFSET is nonzero, the word at
27441    *(*this + vcall_offset) should be added to THIS.  */
27442
27443 static void
27444 x86_output_mi_thunk (FILE *file ATTRIBUTE_UNUSED,
27445                      tree thunk ATTRIBUTE_UNUSED, HOST_WIDE_INT delta,
27446                      HOST_WIDE_INT vcall_offset, tree function)
27447 {
27448   rtx xops[3];
27449   rtx this_param = x86_this_parameter (function);
27450   rtx this_reg, tmp;
27451
27452   /* If VCALL_OFFSET, we'll need THIS in a register.  Might as well
27453      pull it in now and let DELTA benefit.  */
27454   if (REG_P (this_param))
27455     this_reg = this_param;
27456   else if (vcall_offset)
27457     {
27458       /* Put the this parameter into %eax.  */
27459       xops[0] = this_param;
27460       xops[1] = this_reg = gen_rtx_REG (Pmode, AX_REG);
27461       output_asm_insn ("mov%z1\t{%0, %1|%1, %0}", xops);
27462     }
27463   else
27464     this_reg = NULL_RTX;
27465
27466   /* Adjust the this parameter by a fixed constant.  */
27467   if (delta)
27468     {
27469       xops[0] = GEN_INT (delta);
27470       xops[1] = this_reg ? this_reg : this_param;
27471       if (TARGET_64BIT)
27472         {
27473           if (!x86_64_general_operand (xops[0], DImode))
27474             {
27475               tmp = gen_rtx_REG (DImode, R10_REG);
27476               xops[1] = tmp;
27477               output_asm_insn ("mov{q}\t{%1, %0|%0, %1}", xops);
27478               xops[0] = tmp;
27479               xops[1] = this_param;
27480             }
27481           output_asm_insn ("add{q}\t{%0, %1|%1, %0}", xops);
27482         }
27483       else
27484         output_asm_insn ("add{l}\t{%0, %1|%1, %0}", xops);
27485     }
27486
27487   /* Adjust the this parameter by a value stored in the vtable.  */
27488   if (vcall_offset)
27489     {
27490       if (TARGET_64BIT)
27491         tmp = gen_rtx_REG (DImode, R10_REG);
27492       else
27493         {
27494           int tmp_regno = CX_REG;
27495           if (lookup_attribute ("fastcall",
27496                                 TYPE_ATTRIBUTES (TREE_TYPE (function))))
27497             tmp_regno = AX_REG;
27498           tmp = gen_rtx_REG (SImode, tmp_regno);
27499         }
27500
27501       xops[0] = gen_rtx_MEM (Pmode, this_reg);
27502       xops[1] = tmp;
27503       output_asm_insn ("mov%z1\t{%0, %1|%1, %0}", xops);
27504
27505       /* Adjust the this parameter.  */
27506       xops[0] = gen_rtx_MEM (Pmode, plus_constant (tmp, vcall_offset));
27507       if (TARGET_64BIT && !memory_operand (xops[0], Pmode))
27508         {
27509           rtx tmp2 = gen_rtx_REG (DImode, R11_REG);
27510           xops[0] = GEN_INT (vcall_offset);
27511           xops[1] = tmp2;
27512           output_asm_insn ("mov{q}\t{%0, %1|%1, %0}", xops);
27513           xops[0] = gen_rtx_MEM (Pmode, gen_rtx_PLUS (Pmode, tmp, tmp2));
27514         }
27515       xops[1] = this_reg;
27516       output_asm_insn ("add%z1\t{%0, %1|%1, %0}", xops);
27517     }
27518
27519   /* If necessary, drop THIS back to its stack slot.  */
27520   if (this_reg && this_reg != this_param)
27521     {
27522       xops[0] = this_reg;
27523       xops[1] = this_param;
27524       output_asm_insn ("mov%z1\t{%0, %1|%1, %0}", xops);
27525     }
27526
27527   xops[0] = XEXP (DECL_RTL (function), 0);
27528   if (TARGET_64BIT)
27529     {
27530       if (!flag_pic || (*targetm.binds_local_p) (function))
27531         output_asm_insn ("jmp\t%P0", xops);
27532       /* All thunks should be in the same object as their target,
27533          and thus binds_local_p should be true.  */
27534       else if (TARGET_64BIT && cfun->machine->call_abi == MS_ABI)
27535         gcc_unreachable ();
27536       else
27537         {
27538           tmp = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, xops[0]), UNSPEC_GOTPCREL);
27539           tmp = gen_rtx_CONST (Pmode, tmp);
27540           tmp = gen_rtx_MEM (QImode, tmp);
27541           xops[0] = tmp;
27542           output_asm_insn ("jmp\t%A0", xops);
27543         }
27544     }
27545   else
27546     {
27547       if (!flag_pic || (*targetm.binds_local_p) (function))
27548         output_asm_insn ("jmp\t%P0", xops);
27549       else
27550 #if TARGET_MACHO
27551         if (TARGET_MACHO)
27552           {
27553             rtx sym_ref = XEXP (DECL_RTL (function), 0);
27554             tmp = (gen_rtx_SYMBOL_REF
27555                    (Pmode,
27556                     machopic_indirection_name (sym_ref, /*stub_p=*/true)));
27557             tmp = gen_rtx_MEM (QImode, tmp);
27558             xops[0] = tmp;
27559             output_asm_insn ("jmp\t%0", xops);
27560           }
27561         else
27562 #endif /* TARGET_MACHO */
27563         {
27564           tmp = gen_rtx_REG (SImode, CX_REG);
27565           output_set_got (tmp, NULL_RTX);
27566
27567           xops[1] = tmp;
27568           output_asm_insn ("mov{l}\t{%0@GOT(%1), %1|%1, %0@GOT[%1]}", xops);
27569           output_asm_insn ("jmp\t{*}%1", xops);
27570         }
27571     }
27572 }
27573
27574 static void
27575 x86_file_start (void)
27576 {
27577   default_file_start ();
27578 #if TARGET_MACHO
27579   darwin_file_start ();
27580 #endif
27581   if (X86_FILE_START_VERSION_DIRECTIVE)
27582     fputs ("\t.version\t\"01.01\"\n", asm_out_file);
27583   if (X86_FILE_START_FLTUSED)
27584     fputs ("\t.global\t__fltused\n", asm_out_file);
27585   if (ix86_asm_dialect == ASM_INTEL)
27586     fputs ("\t.intel_syntax noprefix\n", asm_out_file);
27587 }
27588
27589 int
27590 x86_field_alignment (tree field, int computed)
27591 {
27592   enum machine_mode mode;
27593   tree type = TREE_TYPE (field);
27594
27595   if (TARGET_64BIT || TARGET_ALIGN_DOUBLE)
27596     return computed;
27597   mode = TYPE_MODE (strip_array_types (type));
27598   if (mode == DFmode || mode == DCmode
27599       || GET_MODE_CLASS (mode) == MODE_INT
27600       || GET_MODE_CLASS (mode) == MODE_COMPLEX_INT)
27601     return MIN (32, computed);
27602   return computed;
27603 }
27604
27605 /* Output assembler code to FILE to increment profiler label # LABELNO
27606    for profiling a function entry.  */
27607 void
27608 x86_function_profiler (FILE *file, int labelno ATTRIBUTE_UNUSED)
27609 {
27610   if (TARGET_64BIT)
27611     {
27612 #ifndef NO_PROFILE_COUNTERS
27613       fprintf (file, "\tleaq\t" LPREFIX "P%d@(%%rip),%%r11\n", labelno);
27614 #endif
27615
27616       if (DEFAULT_ABI == SYSV_ABI && flag_pic)
27617         fputs ("\tcall\t*" MCOUNT_NAME "@GOTPCREL(%rip)\n", file);
27618       else
27619         fputs ("\tcall\t" MCOUNT_NAME "\n", file);
27620     }
27621   else if (flag_pic)
27622     {
27623 #ifndef NO_PROFILE_COUNTERS
27624       fprintf (file, "\tleal\t" LPREFIX "P%d@GOTOFF(%%ebx),%%" PROFILE_COUNT_REGISTER "\n",
27625                labelno);
27626 #endif
27627       fputs ("\tcall\t*" MCOUNT_NAME "@GOT(%ebx)\n", file);
27628     }
27629   else
27630     {
27631 #ifndef NO_PROFILE_COUNTERS
27632       fprintf (file, "\tmovl\t$" LPREFIX "P%d,%%" PROFILE_COUNT_REGISTER "\n",
27633                labelno);
27634 #endif
27635       fputs ("\tcall\t" MCOUNT_NAME "\n", file);
27636     }
27637 }
27638
27639 #ifdef ASM_OUTPUT_MAX_SKIP_PAD
27640 /* We don't have exact information about the insn sizes, but we may assume
27641    quite safely that we are informed about all 1 byte insns and memory
27642    address sizes.  This is enough to eliminate unnecessary padding in
27643    99% of cases.  */
27644
27645 static int
27646 min_insn_size (rtx insn)
27647 {
27648   int l = 0, len;
27649
27650   if (!INSN_P (insn) || !active_insn_p (insn))
27651     return 0;
27652
27653   /* Discard alignments we've emit and jump instructions.  */
27654   if (GET_CODE (PATTERN (insn)) == UNSPEC_VOLATILE
27655       && XINT (PATTERN (insn), 1) == UNSPECV_ALIGN)
27656     return 0;
27657   if (JUMP_TABLE_DATA_P (insn))
27658     return 0;
27659
27660   /* Important case - calls are always 5 bytes.
27661      It is common to have many calls in the row.  */
27662   if (CALL_P (insn)
27663       && symbolic_reference_mentioned_p (PATTERN (insn))
27664       && !SIBLING_CALL_P (insn))
27665     return 5;
27666   len = get_attr_length (insn);
27667   if (len <= 1)
27668     return 1;
27669
27670   /* For normal instructions we rely on get_attr_length being exact,
27671      with a few exceptions.  */
27672   if (!JUMP_P (insn))
27673     {
27674       enum attr_type type = get_attr_type (insn);
27675
27676       switch (type)
27677         {
27678         case TYPE_MULTI:
27679           if (GET_CODE (PATTERN (insn)) == ASM_INPUT
27680               || asm_noperands (PATTERN (insn)) >= 0)
27681             return 0;
27682           break;
27683         case TYPE_OTHER:
27684         case TYPE_FCMP:
27685           break;
27686         default:
27687           /* Otherwise trust get_attr_length.  */
27688           return len;
27689         }
27690
27691       l = get_attr_length_address (insn);
27692       if (l < 4 && symbolic_reference_mentioned_p (PATTERN (insn)))
27693         l = 4;
27694     }
27695   if (l)
27696     return 1+l;
27697   else
27698     return 2;
27699 }
27700
27701 /* AMD K8 core mispredicts jumps when there are more than 3 jumps in 16 byte
27702    window.  */
27703
27704 static void
27705 ix86_avoid_jump_mispredicts (void)
27706 {
27707   rtx insn, start = get_insns ();
27708   int nbytes = 0, njumps = 0;
27709   int isjump = 0;
27710
27711   /* Look for all minimal intervals of instructions containing 4 jumps.
27712      The intervals are bounded by START and INSN.  NBYTES is the total
27713      size of instructions in the interval including INSN and not including
27714      START.  When the NBYTES is smaller than 16 bytes, it is possible
27715      that the end of START and INSN ends up in the same 16byte page.
27716
27717      The smallest offset in the page INSN can start is the case where START
27718      ends on the offset 0.  Offset of INSN is then NBYTES - sizeof (INSN).
27719      We add p2align to 16byte window with maxskip 15 - NBYTES + sizeof (INSN).
27720      */
27721   for (insn = start; insn; insn = NEXT_INSN (insn))
27722     {
27723       int min_size;
27724
27725       if (LABEL_P (insn))
27726         {
27727           int align = label_to_alignment (insn);
27728           int max_skip = label_to_max_skip (insn);
27729
27730           if (max_skip > 15)
27731             max_skip = 15;
27732           /* If align > 3, only up to 16 - max_skip - 1 bytes can be
27733              already in the current 16 byte page, because otherwise
27734              ASM_OUTPUT_MAX_SKIP_ALIGN could skip max_skip or fewer
27735              bytes to reach 16 byte boundary.  */
27736           if (align <= 0
27737               || (align <= 3 && max_skip != (1 << align) - 1))
27738             max_skip = 0;
27739           if (dump_file)
27740             fprintf (dump_file, "Label %i with max_skip %i\n",
27741                      INSN_UID (insn), max_skip);
27742           if (max_skip)
27743             {
27744               while (nbytes + max_skip >= 16)
27745                 {
27746                   start = NEXT_INSN (start);
27747                   if ((JUMP_P (start)
27748                        && GET_CODE (PATTERN (start)) != ADDR_VEC
27749                        && GET_CODE (PATTERN (start)) != ADDR_DIFF_VEC)
27750                       || CALL_P (start))
27751                     njumps--, isjump = 1;
27752                   else
27753                     isjump = 0;
27754                   nbytes -= min_insn_size (start);
27755                 }
27756             }
27757           continue;
27758         }
27759
27760       min_size = min_insn_size (insn);
27761       nbytes += min_size;
27762       if (dump_file)
27763         fprintf (dump_file, "Insn %i estimated to %i bytes\n",
27764                  INSN_UID (insn), min_size);
27765       if ((JUMP_P (insn)
27766            && GET_CODE (PATTERN (insn)) != ADDR_VEC
27767            && GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC)
27768           || CALL_P (insn))
27769         njumps++;
27770       else
27771         continue;
27772
27773       while (njumps > 3)
27774         {
27775           start = NEXT_INSN (start);
27776           if ((JUMP_P (start)
27777                && GET_CODE (PATTERN (start)) != ADDR_VEC
27778                && GET_CODE (PATTERN (start)) != ADDR_DIFF_VEC)
27779               || CALL_P (start))
27780             njumps--, isjump = 1;
27781           else
27782             isjump = 0;
27783           nbytes -= min_insn_size (start);
27784         }
27785       gcc_assert (njumps >= 0);
27786       if (dump_file)
27787         fprintf (dump_file, "Interval %i to %i has %i bytes\n",
27788                  INSN_UID (start), INSN_UID (insn), nbytes);
27789
27790       if (njumps == 3 && isjump && nbytes < 16)
27791         {
27792           int padsize = 15 - nbytes + min_insn_size (insn);
27793
27794           if (dump_file)
27795             fprintf (dump_file, "Padding insn %i by %i bytes!\n",
27796                      INSN_UID (insn), padsize);
27797           emit_insn_before (gen_pad (GEN_INT (padsize)), insn);
27798         }
27799     }
27800 }
27801 #endif
27802
27803 /* AMD Athlon works faster
27804    when RET is not destination of conditional jump or directly preceded
27805    by other jump instruction.  We avoid the penalty by inserting NOP just
27806    before the RET instructions in such cases.  */
27807 static void
27808 ix86_pad_returns (void)
27809 {
27810   edge e;
27811   edge_iterator ei;
27812
27813   FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
27814     {
27815       basic_block bb = e->src;
27816       rtx ret = BB_END (bb);
27817       rtx prev;
27818       bool replace = false;
27819
27820       if (!JUMP_P (ret) || GET_CODE (PATTERN (ret)) != RETURN
27821           || optimize_bb_for_size_p (bb))
27822         continue;
27823       for (prev = PREV_INSN (ret); prev; prev = PREV_INSN (prev))
27824         if (active_insn_p (prev) || LABEL_P (prev))
27825           break;
27826       if (prev && LABEL_P (prev))
27827         {
27828           edge e;
27829           edge_iterator ei;
27830
27831           FOR_EACH_EDGE (e, ei, bb->preds)
27832             if (EDGE_FREQUENCY (e) && e->src->index >= 0
27833                 && !(e->flags & EDGE_FALLTHRU))
27834               replace = true;
27835         }
27836       if (!replace)
27837         {
27838           prev = prev_active_insn (ret);
27839           if (prev
27840               && ((JUMP_P (prev) && any_condjump_p (prev))
27841                   || CALL_P (prev)))
27842             replace = true;
27843           /* Empty functions get branch mispredict even when the jump destination
27844              is not visible to us.  */
27845           if (!prev && cfun->function_frequency > FUNCTION_FREQUENCY_UNLIKELY_EXECUTED)
27846             replace = true;
27847         }
27848       if (replace)
27849         {
27850           emit_jump_insn_before (gen_return_internal_long (), ret);
27851           delete_insn (ret);
27852         }
27853     }
27854 }
27855
27856 /* Implement machine specific optimizations.  We implement padding of returns
27857    for K8 CPUs and pass to avoid 4 jumps in the single 16 byte window.  */
27858 static void
27859 ix86_reorg (void)
27860 {
27861   if (optimize && optimize_function_for_speed_p (cfun))
27862     {
27863       if (TARGET_PAD_RETURNS)
27864         ix86_pad_returns ();
27865 #ifdef ASM_OUTPUT_MAX_SKIP_PAD
27866       if (TARGET_FOUR_JUMP_LIMIT)
27867         ix86_avoid_jump_mispredicts ();
27868 #endif
27869     }
27870 }
27871
27872 /* Return nonzero when QImode register that must be represented via REX prefix
27873    is used.  */
27874 bool
27875 x86_extended_QIreg_mentioned_p (rtx insn)
27876 {
27877   int i;
27878   extract_insn_cached (insn);
27879   for (i = 0; i < recog_data.n_operands; i++)
27880     if (REG_P (recog_data.operand[i])
27881         && REGNO (recog_data.operand[i]) > BX_REG)
27882        return true;
27883   return false;
27884 }
27885
27886 /* Return nonzero when P points to register encoded via REX prefix.
27887    Called via for_each_rtx.  */
27888 static int
27889 extended_reg_mentioned_1 (rtx *p, void *data ATTRIBUTE_UNUSED)
27890 {
27891    unsigned int regno;
27892    if (!REG_P (*p))
27893      return 0;
27894    regno = REGNO (*p);
27895    return REX_INT_REGNO_P (regno) || REX_SSE_REGNO_P (regno);
27896 }
27897
27898 /* Return true when INSN mentions register that must be encoded using REX
27899    prefix.  */
27900 bool
27901 x86_extended_reg_mentioned_p (rtx insn)
27902 {
27903   return for_each_rtx (INSN_P (insn) ? &PATTERN (insn) : &insn,
27904                        extended_reg_mentioned_1, NULL);
27905 }
27906
27907 /* Generate an unsigned DImode/SImode to FP conversion.  This is the same code
27908    optabs would emit if we didn't have TFmode patterns.  */
27909
27910 void
27911 x86_emit_floatuns (rtx operands[2])
27912 {
27913   rtx neglab, donelab, i0, i1, f0, in, out;
27914   enum machine_mode mode, inmode;
27915
27916   inmode = GET_MODE (operands[1]);
27917   gcc_assert (inmode == SImode || inmode == DImode);
27918
27919   out = operands[0];
27920   in = force_reg (inmode, operands[1]);
27921   mode = GET_MODE (out);
27922   neglab = gen_label_rtx ();
27923   donelab = gen_label_rtx ();
27924   f0 = gen_reg_rtx (mode);
27925
27926   emit_cmp_and_jump_insns (in, const0_rtx, LT, const0_rtx, inmode, 0, neglab);
27927
27928   expand_float (out, in, 0);
27929
27930   emit_jump_insn (gen_jump (donelab));
27931   emit_barrier ();
27932
27933   emit_label (neglab);
27934
27935   i0 = expand_simple_binop (inmode, LSHIFTRT, in, const1_rtx, NULL,
27936                             1, OPTAB_DIRECT);
27937   i1 = expand_simple_binop (inmode, AND, in, const1_rtx, NULL,
27938                             1, OPTAB_DIRECT);
27939   i0 = expand_simple_binop (inmode, IOR, i0, i1, i0, 1, OPTAB_DIRECT);
27940
27941   expand_float (f0, i0, 0);
27942
27943   emit_insn (gen_rtx_SET (VOIDmode, out, gen_rtx_PLUS (mode, f0, f0)));
27944
27945   emit_label (donelab);
27946 }
27947 \f
27948 /* A subroutine of ix86_expand_vector_init.  Store into TARGET a vector
27949    with all elements equal to VAR.  Return true if successful.  */
27950
27951 static bool
27952 ix86_expand_vector_init_duplicate (bool mmx_ok, enum machine_mode mode,
27953                                    rtx target, rtx val)
27954 {
27955   enum machine_mode hmode, smode, wsmode, wvmode;
27956   rtx x;
27957
27958   switch (mode)
27959     {
27960     case V2SImode:
27961     case V2SFmode:
27962       if (!mmx_ok)
27963         return false;
27964       /* FALLTHRU */
27965
27966     case V2DFmode:
27967     case V2DImode:
27968     case V4SFmode:
27969     case V4SImode:
27970       val = force_reg (GET_MODE_INNER (mode), val);
27971       x = gen_rtx_VEC_DUPLICATE (mode, val);
27972       emit_insn (gen_rtx_SET (VOIDmode, target, x));
27973       return true;
27974
27975     case V4HImode:
27976       if (!mmx_ok)
27977         return false;
27978       if (TARGET_SSE || TARGET_3DNOW_A)
27979         {
27980           val = gen_lowpart (SImode, val);
27981           x = gen_rtx_TRUNCATE (HImode, val);
27982           x = gen_rtx_VEC_DUPLICATE (mode, x);
27983           emit_insn (gen_rtx_SET (VOIDmode, target, x));
27984           return true;
27985         }
27986       else
27987         {
27988           smode = HImode;
27989           wsmode = SImode;
27990           wvmode = V2SImode;
27991           goto widen;
27992         }
27993
27994     case V8QImode:
27995       if (!mmx_ok)
27996         return false;
27997       smode = QImode;
27998       wsmode = HImode;
27999       wvmode = V4HImode;
28000       goto widen;
28001     case V8HImode:
28002       if (TARGET_SSE2)
28003         {
28004           rtx tmp1, tmp2;
28005           /* Extend HImode to SImode using a paradoxical SUBREG.  */
28006           tmp1 = gen_reg_rtx (SImode);
28007           emit_move_insn (tmp1, gen_lowpart (SImode, val));
28008           /* Insert the SImode value as low element of V4SImode vector. */
28009           tmp2 = gen_reg_rtx (V4SImode);
28010           tmp1 = gen_rtx_VEC_MERGE (V4SImode,
28011                                     gen_rtx_VEC_DUPLICATE (V4SImode, tmp1),
28012                                     CONST0_RTX (V4SImode),
28013                                     const1_rtx);
28014           emit_insn (gen_rtx_SET (VOIDmode, tmp2, tmp1));
28015           /* Cast the V4SImode vector back to a V8HImode vector.  */
28016           tmp1 = gen_reg_rtx (V8HImode);
28017           emit_move_insn (tmp1, gen_lowpart (V8HImode, tmp2));
28018           /* Duplicate the low short through the whole low SImode word.  */
28019           emit_insn (gen_sse2_punpcklwd (tmp1, tmp1, tmp1));
28020           /* Cast the V8HImode vector back to a V4SImode vector.  */
28021           tmp2 = gen_reg_rtx (V4SImode);
28022           emit_move_insn (tmp2, gen_lowpart (V4SImode, tmp1));
28023           /* Replicate the low element of the V4SImode vector.  */
28024           emit_insn (gen_sse2_pshufd (tmp2, tmp2, const0_rtx));
28025           /* Cast the V2SImode back to V8HImode, and store in target.  */
28026           emit_move_insn (target, gen_lowpart (V8HImode, tmp2));
28027           return true;
28028         }
28029       smode = HImode;
28030       wsmode = SImode;
28031       wvmode = V4SImode;
28032       goto widen;
28033     case V16QImode:
28034       if (TARGET_SSE2)
28035         {
28036           rtx tmp1, tmp2;
28037           /* Extend QImode to SImode using a paradoxical SUBREG.  */
28038           tmp1 = gen_reg_rtx (SImode);
28039           emit_move_insn (tmp1, gen_lowpart (SImode, val));
28040           /* Insert the SImode value as low element of V4SImode vector. */
28041           tmp2 = gen_reg_rtx (V4SImode);
28042           tmp1 = gen_rtx_VEC_MERGE (V4SImode,
28043                                     gen_rtx_VEC_DUPLICATE (V4SImode, tmp1),
28044                                     CONST0_RTX (V4SImode),
28045                                     const1_rtx);
28046           emit_insn (gen_rtx_SET (VOIDmode, tmp2, tmp1));
28047           /* Cast the V4SImode vector back to a V16QImode vector.  */
28048           tmp1 = gen_reg_rtx (V16QImode);
28049           emit_move_insn (tmp1, gen_lowpart (V16QImode, tmp2));
28050           /* Duplicate the low byte through the whole low SImode word.  */
28051           emit_insn (gen_sse2_punpcklbw (tmp1, tmp1, tmp1));
28052           emit_insn (gen_sse2_punpcklbw (tmp1, tmp1, tmp1));
28053           /* Cast the V16QImode vector back to a V4SImode vector.  */
28054           tmp2 = gen_reg_rtx (V4SImode);
28055           emit_move_insn (tmp2, gen_lowpart (V4SImode, tmp1));
28056           /* Replicate the low element of the V4SImode vector.  */
28057           emit_insn (gen_sse2_pshufd (tmp2, tmp2, const0_rtx));
28058           /* Cast the V2SImode back to V16QImode, and store in target.  */
28059           emit_move_insn (target, gen_lowpart (V16QImode, tmp2));
28060           return true;
28061         }
28062       smode = QImode;
28063       wsmode = HImode;
28064       wvmode = V8HImode;
28065       goto widen;
28066     widen:
28067       /* Replicate the value once into the next wider mode and recurse.  */
28068       val = convert_modes (wsmode, smode, val, true);
28069       x = expand_simple_binop (wsmode, ASHIFT, val,
28070                                GEN_INT (GET_MODE_BITSIZE (smode)),
28071                                NULL_RTX, 1, OPTAB_LIB_WIDEN);
28072       val = expand_simple_binop (wsmode, IOR, val, x, x, 1, OPTAB_LIB_WIDEN);
28073
28074       x = gen_reg_rtx (wvmode);
28075       if (!ix86_expand_vector_init_duplicate (mmx_ok, wvmode, x, val))
28076         gcc_unreachable ();
28077       emit_move_insn (target, gen_lowpart (mode, x));
28078       return true;
28079
28080     case V4DFmode:
28081       hmode = V2DFmode;
28082       goto half;
28083     case V4DImode:
28084       hmode = V2DImode;
28085       goto half;
28086     case V8SFmode:
28087       hmode = V4SFmode;
28088       goto half;
28089     case V8SImode:
28090       hmode = V4SImode;
28091       goto half;
28092     case V16HImode:
28093       hmode = V8HImode;
28094       goto half;
28095     case V32QImode:
28096       hmode = V16QImode;
28097       goto half;
28098 half:
28099       {
28100         rtx tmp = gen_reg_rtx (hmode);
28101         ix86_expand_vector_init_duplicate (mmx_ok, hmode, tmp, val);
28102         emit_insn (gen_rtx_SET (VOIDmode, target,
28103                                 gen_rtx_VEC_CONCAT (mode, tmp, tmp)));
28104       }
28105       return true;
28106
28107     default:
28108       return false;
28109     }
28110 }
28111
28112 /* A subroutine of ix86_expand_vector_init.  Store into TARGET a vector
28113    whose ONE_VAR element is VAR, and other elements are zero.  Return true
28114    if successful.  */
28115
28116 static bool
28117 ix86_expand_vector_init_one_nonzero (bool mmx_ok, enum machine_mode mode,
28118                                      rtx target, rtx var, int one_var)
28119 {
28120   enum machine_mode vsimode;
28121   rtx new_target;
28122   rtx x, tmp;
28123   bool use_vector_set = false;
28124
28125   switch (mode)
28126     {
28127     case V2DImode:
28128       /* For SSE4.1, we normally use vector set.  But if the second
28129          element is zero and inter-unit moves are OK, we use movq
28130          instead.  */
28131       use_vector_set = (TARGET_64BIT
28132                         && TARGET_SSE4_1
28133                         && !(TARGET_INTER_UNIT_MOVES
28134                              && one_var == 0));
28135       break;
28136     case V16QImode:
28137     case V4SImode:
28138     case V4SFmode:
28139       use_vector_set = TARGET_SSE4_1;
28140       break;
28141     case V8HImode:
28142       use_vector_set = TARGET_SSE2;
28143       break;
28144     case V4HImode:
28145       use_vector_set = TARGET_SSE || TARGET_3DNOW_A;
28146       break;
28147     case V32QImode:
28148     case V16HImode:
28149     case V8SImode:
28150     case V8SFmode:
28151     case V4DFmode:
28152       use_vector_set = TARGET_AVX;
28153       break;
28154     case V4DImode:
28155       /* Use ix86_expand_vector_set in 64bit mode only.  */
28156       use_vector_set = TARGET_AVX && TARGET_64BIT;
28157       break;
28158     default:
28159       break;
28160     }
28161
28162   if (use_vector_set)
28163     {
28164       emit_insn (gen_rtx_SET (VOIDmode, target, CONST0_RTX (mode)));
28165       var = force_reg (GET_MODE_INNER (mode), var);
28166       ix86_expand_vector_set (mmx_ok, target, var, one_var);
28167       return true; 
28168     }
28169
28170   switch (mode)
28171     {
28172     case V2SFmode:
28173     case V2SImode:
28174       if (!mmx_ok)
28175         return false;
28176       /* FALLTHRU */
28177
28178     case V2DFmode:
28179     case V2DImode:
28180       if (one_var != 0)
28181         return false;
28182       var = force_reg (GET_MODE_INNER (mode), var);
28183       x = gen_rtx_VEC_CONCAT (mode, var, CONST0_RTX (GET_MODE_INNER (mode)));
28184       emit_insn (gen_rtx_SET (VOIDmode, target, x));
28185       return true;
28186
28187     case V4SFmode:
28188     case V4SImode:
28189       if (!REG_P (target) || REGNO (target) < FIRST_PSEUDO_REGISTER)
28190         new_target = gen_reg_rtx (mode);
28191       else
28192         new_target = target;
28193       var = force_reg (GET_MODE_INNER (mode), var);
28194       x = gen_rtx_VEC_DUPLICATE (mode, var);
28195       x = gen_rtx_VEC_MERGE (mode, x, CONST0_RTX (mode), const1_rtx);
28196       emit_insn (gen_rtx_SET (VOIDmode, new_target, x));
28197       if (one_var != 0)
28198         {
28199           /* We need to shuffle the value to the correct position, so
28200              create a new pseudo to store the intermediate result.  */
28201
28202           /* With SSE2, we can use the integer shuffle insns.  */
28203           if (mode != V4SFmode && TARGET_SSE2)
28204             {
28205               emit_insn (gen_sse2_pshufd_1 (new_target, new_target,
28206                                             const1_rtx,
28207                                             GEN_INT (one_var == 1 ? 0 : 1),
28208                                             GEN_INT (one_var == 2 ? 0 : 1),
28209                                             GEN_INT (one_var == 3 ? 0 : 1)));
28210               if (target != new_target)
28211                 emit_move_insn (target, new_target);
28212               return true;
28213             }
28214
28215           /* Otherwise convert the intermediate result to V4SFmode and
28216              use the SSE1 shuffle instructions.  */
28217           if (mode != V4SFmode)
28218             {
28219               tmp = gen_reg_rtx (V4SFmode);
28220               emit_move_insn (tmp, gen_lowpart (V4SFmode, new_target));
28221             }
28222           else
28223             tmp = new_target;
28224
28225           emit_insn (gen_sse_shufps_v4sf (tmp, tmp, tmp,
28226                                        const1_rtx,
28227                                        GEN_INT (one_var == 1 ? 0 : 1),
28228                                        GEN_INT (one_var == 2 ? 0+4 : 1+4),
28229                                        GEN_INT (one_var == 3 ? 0+4 : 1+4)));
28230
28231           if (mode != V4SFmode)
28232             emit_move_insn (target, gen_lowpart (V4SImode, tmp));
28233           else if (tmp != target)
28234             emit_move_insn (target, tmp);
28235         }
28236       else if (target != new_target)
28237         emit_move_insn (target, new_target);
28238       return true;
28239
28240     case V8HImode:
28241     case V16QImode:
28242       vsimode = V4SImode;
28243       goto widen;
28244     case V4HImode:
28245     case V8QImode:
28246       if (!mmx_ok)
28247         return false;
28248       vsimode = V2SImode;
28249       goto widen;
28250     widen:
28251       if (one_var != 0)
28252         return false;
28253
28254       /* Zero extend the variable element to SImode and recurse.  */
28255       var = convert_modes (SImode, GET_MODE_INNER (mode), var, true);
28256
28257       x = gen_reg_rtx (vsimode);
28258       if (!ix86_expand_vector_init_one_nonzero (mmx_ok, vsimode, x,
28259                                                 var, one_var))
28260         gcc_unreachable ();
28261
28262       emit_move_insn (target, gen_lowpart (mode, x));
28263       return true;
28264
28265     default:
28266       return false;
28267     }
28268 }
28269
28270 /* A subroutine of ix86_expand_vector_init.  Store into TARGET a vector
28271    consisting of the values in VALS.  It is known that all elements
28272    except ONE_VAR are constants.  Return true if successful.  */
28273
28274 static bool
28275 ix86_expand_vector_init_one_var (bool mmx_ok, enum machine_mode mode,
28276                                  rtx target, rtx vals, int one_var)
28277 {
28278   rtx var = XVECEXP (vals, 0, one_var);
28279   enum machine_mode wmode;
28280   rtx const_vec, x;
28281
28282   const_vec = copy_rtx (vals);
28283   XVECEXP (const_vec, 0, one_var) = CONST0_RTX (GET_MODE_INNER (mode));
28284   const_vec = gen_rtx_CONST_VECTOR (mode, XVEC (const_vec, 0));
28285
28286   switch (mode)
28287     {
28288     case V2DFmode:
28289     case V2DImode:
28290     case V2SFmode:
28291     case V2SImode:
28292       /* For the two element vectors, it's just as easy to use
28293          the general case.  */
28294       return false;
28295
28296     case V4DImode:
28297       /* Use ix86_expand_vector_set in 64bit mode only.  */
28298       if (!TARGET_64BIT)
28299         return false;
28300     case V4DFmode:
28301     case V8SFmode:
28302     case V8SImode:
28303     case V16HImode:
28304     case V32QImode:
28305     case V4SFmode:
28306     case V4SImode:
28307     case V8HImode:
28308     case V4HImode:
28309       break;
28310
28311     case V16QImode:
28312       if (TARGET_SSE4_1)
28313         break;
28314       wmode = V8HImode;
28315       goto widen;
28316     case V8QImode:
28317       wmode = V4HImode;
28318       goto widen;
28319     widen:
28320       /* There's no way to set one QImode entry easily.  Combine
28321          the variable value with its adjacent constant value, and
28322          promote to an HImode set.  */
28323       x = XVECEXP (vals, 0, one_var ^ 1);
28324       if (one_var & 1)
28325         {
28326           var = convert_modes (HImode, QImode, var, true);
28327           var = expand_simple_binop (HImode, ASHIFT, var, GEN_INT (8),
28328                                      NULL_RTX, 1, OPTAB_LIB_WIDEN);
28329           x = GEN_INT (INTVAL (x) & 0xff);
28330         }
28331       else
28332         {
28333           var = convert_modes (HImode, QImode, var, true);
28334           x = gen_int_mode (INTVAL (x) << 8, HImode);
28335         }
28336       if (x != const0_rtx)
28337         var = expand_simple_binop (HImode, IOR, var, x, var,
28338                                    1, OPTAB_LIB_WIDEN);
28339
28340       x = gen_reg_rtx (wmode);
28341       emit_move_insn (x, gen_lowpart (wmode, const_vec));
28342       ix86_expand_vector_set (mmx_ok, x, var, one_var >> 1);
28343
28344       emit_move_insn (target, gen_lowpart (mode, x));
28345       return true;
28346
28347     default:
28348       return false;
28349     }
28350
28351   emit_move_insn (target, const_vec);
28352   ix86_expand_vector_set (mmx_ok, target, var, one_var);
28353   return true;
28354 }
28355
28356 /* A subroutine of ix86_expand_vector_init_general.  Use vector
28357    concatenate to handle the most general case: all values variable,
28358    and none identical.  */
28359
28360 static void
28361 ix86_expand_vector_init_concat (enum machine_mode mode,
28362                                 rtx target, rtx *ops, int n)
28363 {
28364   enum machine_mode cmode, hmode = VOIDmode;
28365   rtx first[8], second[4];
28366   rtvec v;
28367   int i, j;
28368
28369   switch (n)
28370     {
28371     case 2:
28372       switch (mode)
28373         {
28374         case V8SImode:
28375           cmode = V4SImode;
28376           break;
28377         case V8SFmode:
28378           cmode = V4SFmode;
28379           break;
28380         case V4DImode:
28381           cmode = V2DImode;
28382           break;
28383         case V4DFmode:
28384           cmode = V2DFmode;
28385           break;
28386         case V4SImode:
28387           cmode = V2SImode;
28388           break;
28389         case V4SFmode:
28390           cmode = V2SFmode;
28391           break;
28392         case V2DImode:
28393           cmode = DImode;
28394           break;
28395         case V2SImode:
28396           cmode = SImode;
28397           break;
28398         case V2DFmode:
28399           cmode = DFmode;
28400           break;
28401         case V2SFmode:
28402           cmode = SFmode;
28403           break;
28404         default:
28405           gcc_unreachable ();
28406         }
28407
28408       if (!register_operand (ops[1], cmode))
28409         ops[1] = force_reg (cmode, ops[1]);
28410       if (!register_operand (ops[0], cmode))
28411         ops[0] = force_reg (cmode, ops[0]);
28412       emit_insn (gen_rtx_SET (VOIDmode, target,
28413                               gen_rtx_VEC_CONCAT (mode, ops[0],
28414                                                   ops[1])));
28415       break;
28416
28417     case 4:
28418       switch (mode)
28419         {
28420         case V4DImode:
28421           cmode = V2DImode;
28422           break;
28423         case V4DFmode:
28424           cmode = V2DFmode;
28425           break;
28426         case V4SImode:
28427           cmode = V2SImode;
28428           break;
28429         case V4SFmode:
28430           cmode = V2SFmode;
28431           break;
28432         default:
28433           gcc_unreachable ();
28434         }
28435       goto half;
28436
28437     case 8:
28438       switch (mode)
28439         {
28440         case V8SImode:
28441           cmode = V2SImode;
28442           hmode = V4SImode;
28443           break;
28444         case V8SFmode:
28445           cmode = V2SFmode;
28446           hmode = V4SFmode;
28447           break;
28448         default:
28449           gcc_unreachable ();
28450         }
28451       goto half;
28452
28453 half:
28454       /* FIXME: We process inputs backward to help RA.  PR 36222.  */
28455       i = n - 1;
28456       j = (n >> 1) - 1;
28457       for (; i > 0; i -= 2, j--)
28458         {
28459           first[j] = gen_reg_rtx (cmode);
28460           v = gen_rtvec (2, ops[i - 1], ops[i]);
28461           ix86_expand_vector_init (false, first[j],
28462                                    gen_rtx_PARALLEL (cmode, v));
28463         }
28464
28465       n >>= 1;
28466       if (n > 2)
28467         {
28468           gcc_assert (hmode != VOIDmode);
28469           for (i = j = 0; i < n; i += 2, j++)
28470             {
28471               second[j] = gen_reg_rtx (hmode);
28472               ix86_expand_vector_init_concat (hmode, second [j],
28473                                               &first [i], 2);
28474             }
28475           n >>= 1;
28476           ix86_expand_vector_init_concat (mode, target, second, n);
28477         }
28478       else
28479         ix86_expand_vector_init_concat (mode, target, first, n);
28480       break;
28481
28482     default:
28483       gcc_unreachable ();
28484     }
28485 }
28486
28487 /* A subroutine of ix86_expand_vector_init_general.  Use vector
28488    interleave to handle the most general case: all values variable,
28489    and none identical.  */
28490
28491 static void
28492 ix86_expand_vector_init_interleave (enum machine_mode mode,
28493                                     rtx target, rtx *ops, int n)
28494 {
28495   enum machine_mode first_imode, second_imode, third_imode, inner_mode;
28496   int i, j;
28497   rtx op0, op1;
28498   rtx (*gen_load_even) (rtx, rtx, rtx);
28499   rtx (*gen_interleave_first_low) (rtx, rtx, rtx);
28500   rtx (*gen_interleave_second_low) (rtx, rtx, rtx);
28501   
28502   switch (mode)
28503     {
28504     case V8HImode:
28505       gen_load_even = gen_vec_setv8hi;
28506       gen_interleave_first_low = gen_vec_interleave_lowv4si;
28507       gen_interleave_second_low = gen_vec_interleave_lowv2di;
28508       inner_mode = HImode;
28509       first_imode = V4SImode;
28510       second_imode = V2DImode;
28511       third_imode = VOIDmode;
28512       break;
28513     case V16QImode:
28514       gen_load_even = gen_vec_setv16qi;
28515       gen_interleave_first_low = gen_vec_interleave_lowv8hi;
28516       gen_interleave_second_low = gen_vec_interleave_lowv4si;
28517       inner_mode = QImode;
28518       first_imode = V8HImode;
28519       second_imode = V4SImode;
28520       third_imode = V2DImode;
28521       break;
28522     default:
28523       gcc_unreachable ();
28524     }
28525      
28526   for (i = 0; i < n; i++)
28527     {
28528       /* Extend the odd elment to SImode using a paradoxical SUBREG.  */
28529       op0 = gen_reg_rtx (SImode);
28530       emit_move_insn (op0, gen_lowpart (SImode, ops [i + i]));
28531
28532       /* Insert the SImode value as low element of V4SImode vector. */
28533       op1 = gen_reg_rtx (V4SImode);
28534       op0 = gen_rtx_VEC_MERGE (V4SImode,
28535                                gen_rtx_VEC_DUPLICATE (V4SImode,
28536                                                       op0),
28537                                CONST0_RTX (V4SImode),
28538                                const1_rtx);
28539       emit_insn (gen_rtx_SET (VOIDmode, op1, op0));
28540
28541       /* Cast the V4SImode vector back to a vector in orignal mode.  */
28542       op0 = gen_reg_rtx (mode);
28543       emit_move_insn (op0, gen_lowpart (mode, op1));
28544       
28545       /* Load even elements into the second positon.  */
28546       emit_insn ((*gen_load_even) (op0,
28547                                    force_reg (inner_mode,
28548                                               ops [i + i + 1]),
28549                                    const1_rtx));
28550
28551       /* Cast vector to FIRST_IMODE vector.  */
28552       ops[i] = gen_reg_rtx (first_imode);
28553       emit_move_insn (ops[i], gen_lowpart (first_imode, op0));
28554     }
28555
28556   /* Interleave low FIRST_IMODE vectors.  */
28557   for (i = j = 0; i < n; i += 2, j++)
28558     {
28559       op0 = gen_reg_rtx (first_imode);
28560       emit_insn ((*gen_interleave_first_low) (op0, ops[i], ops[i + 1]));
28561
28562       /* Cast FIRST_IMODE vector to SECOND_IMODE vector.  */
28563       ops[j] = gen_reg_rtx (second_imode);
28564       emit_move_insn (ops[j], gen_lowpart (second_imode, op0));
28565     }
28566
28567   /* Interleave low SECOND_IMODE vectors.  */
28568   switch (second_imode)
28569     {
28570     case V4SImode:
28571       for (i = j = 0; i < n / 2; i += 2, j++)
28572         {
28573           op0 = gen_reg_rtx (second_imode);
28574           emit_insn ((*gen_interleave_second_low) (op0, ops[i],
28575                                                    ops[i + 1]));
28576
28577           /* Cast the SECOND_IMODE vector to the THIRD_IMODE
28578              vector.  */
28579           ops[j] = gen_reg_rtx (third_imode);
28580           emit_move_insn (ops[j], gen_lowpart (third_imode, op0));
28581         }
28582       second_imode = V2DImode;
28583       gen_interleave_second_low = gen_vec_interleave_lowv2di;
28584       /* FALLTHRU */
28585
28586     case V2DImode:
28587       op0 = gen_reg_rtx (second_imode);
28588       emit_insn ((*gen_interleave_second_low) (op0, ops[0],
28589                                                ops[1]));
28590
28591       /* Cast the SECOND_IMODE vector back to a vector on original
28592          mode.  */
28593       emit_insn (gen_rtx_SET (VOIDmode, target,
28594                               gen_lowpart (mode, op0)));
28595       break;
28596
28597     default:
28598       gcc_unreachable ();
28599     }
28600 }
28601
28602 /* A subroutine of ix86_expand_vector_init.  Handle the most general case:
28603    all values variable, and none identical.  */
28604
28605 static void
28606 ix86_expand_vector_init_general (bool mmx_ok, enum machine_mode mode,
28607                                  rtx target, rtx vals)
28608 {
28609   rtx ops[32], op0, op1;
28610   enum machine_mode half_mode = VOIDmode;
28611   int n, i;
28612
28613   switch (mode)
28614     {
28615     case V2SFmode:
28616     case V2SImode:
28617       if (!mmx_ok && !TARGET_SSE)
28618         break;
28619       /* FALLTHRU */
28620
28621     case V8SFmode:
28622     case V8SImode:
28623     case V4DFmode:
28624     case V4DImode:
28625     case V4SFmode:
28626     case V4SImode:
28627     case V2DFmode:
28628     case V2DImode:
28629       n = GET_MODE_NUNITS (mode);
28630       for (i = 0; i < n; i++)
28631         ops[i] = XVECEXP (vals, 0, i);
28632       ix86_expand_vector_init_concat (mode, target, ops, n);
28633       return;
28634
28635     case V32QImode:
28636       half_mode = V16QImode;
28637       goto half;
28638
28639     case V16HImode:
28640       half_mode = V8HImode;
28641       goto half;
28642
28643 half:
28644       n = GET_MODE_NUNITS (mode);
28645       for (i = 0; i < n; i++)
28646         ops[i] = XVECEXP (vals, 0, i);
28647       op0 = gen_reg_rtx (half_mode);
28648       op1 = gen_reg_rtx (half_mode);
28649       ix86_expand_vector_init_interleave (half_mode, op0, ops,
28650                                           n >> 2);
28651       ix86_expand_vector_init_interleave (half_mode, op1,
28652                                           &ops [n >> 1], n >> 2);
28653       emit_insn (gen_rtx_SET (VOIDmode, target,
28654                               gen_rtx_VEC_CONCAT (mode, op0, op1)));
28655       return;
28656
28657     case V16QImode:
28658       if (!TARGET_SSE4_1)
28659         break;
28660       /* FALLTHRU */
28661
28662     case V8HImode:
28663       if (!TARGET_SSE2)
28664         break;
28665
28666       /* Don't use ix86_expand_vector_init_interleave if we can't
28667          move from GPR to SSE register directly.  */ 
28668       if (!TARGET_INTER_UNIT_MOVES)
28669         break;
28670
28671       n = GET_MODE_NUNITS (mode);
28672       for (i = 0; i < n; i++)
28673         ops[i] = XVECEXP (vals, 0, i);
28674       ix86_expand_vector_init_interleave (mode, target, ops, n >> 1);
28675       return;
28676
28677     case V4HImode:
28678     case V8QImode:
28679       break;
28680
28681     default:
28682       gcc_unreachable ();
28683     }
28684
28685     {
28686       int i, j, n_elts, n_words, n_elt_per_word;
28687       enum machine_mode inner_mode;
28688       rtx words[4], shift;
28689
28690       inner_mode = GET_MODE_INNER (mode);
28691       n_elts = GET_MODE_NUNITS (mode);
28692       n_words = GET_MODE_SIZE (mode) / UNITS_PER_WORD;
28693       n_elt_per_word = n_elts / n_words;
28694       shift = GEN_INT (GET_MODE_BITSIZE (inner_mode));
28695
28696       for (i = 0; i < n_words; ++i)
28697         {
28698           rtx word = NULL_RTX;
28699
28700           for (j = 0; j < n_elt_per_word; ++j)
28701             {
28702               rtx elt = XVECEXP (vals, 0, (i+1)*n_elt_per_word - j - 1);
28703               elt = convert_modes (word_mode, inner_mode, elt, true);
28704
28705               if (j == 0)
28706                 word = elt;
28707               else
28708                 {
28709                   word = expand_simple_binop (word_mode, ASHIFT, word, shift,
28710                                               word, 1, OPTAB_LIB_WIDEN);
28711                   word = expand_simple_binop (word_mode, IOR, word, elt,
28712                                               word, 1, OPTAB_LIB_WIDEN);
28713                 }
28714             }
28715
28716           words[i] = word;
28717         }
28718
28719       if (n_words == 1)
28720         emit_move_insn (target, gen_lowpart (mode, words[0]));
28721       else if (n_words == 2)
28722         {
28723           rtx tmp = gen_reg_rtx (mode);
28724           emit_clobber (tmp);
28725           emit_move_insn (gen_lowpart (word_mode, tmp), words[0]);
28726           emit_move_insn (gen_highpart (word_mode, tmp), words[1]);
28727           emit_move_insn (target, tmp);
28728         }
28729       else if (n_words == 4)
28730         {
28731           rtx tmp = gen_reg_rtx (V4SImode);
28732           gcc_assert (word_mode == SImode);
28733           vals = gen_rtx_PARALLEL (V4SImode, gen_rtvec_v (4, words));
28734           ix86_expand_vector_init_general (false, V4SImode, tmp, vals);
28735           emit_move_insn (target, gen_lowpart (mode, tmp));
28736         }
28737       else
28738         gcc_unreachable ();
28739     }
28740 }
28741
28742 /* Initialize vector TARGET via VALS.  Suppress the use of MMX
28743    instructions unless MMX_OK is true.  */
28744
28745 void
28746 ix86_expand_vector_init (bool mmx_ok, rtx target, rtx vals)
28747 {
28748   enum machine_mode mode = GET_MODE (target);
28749   enum machine_mode inner_mode = GET_MODE_INNER (mode);
28750   int n_elts = GET_MODE_NUNITS (mode);
28751   int n_var = 0, one_var = -1;
28752   bool all_same = true, all_const_zero = true;
28753   int i;
28754   rtx x;
28755
28756   for (i = 0; i < n_elts; ++i)
28757     {
28758       x = XVECEXP (vals, 0, i);
28759       if (!(CONST_INT_P (x)
28760             || GET_CODE (x) == CONST_DOUBLE
28761             || GET_CODE (x) == CONST_FIXED))
28762         n_var++, one_var = i;
28763       else if (x != CONST0_RTX (inner_mode))
28764         all_const_zero = false;
28765       if (i > 0 && !rtx_equal_p (x, XVECEXP (vals, 0, 0)))
28766         all_same = false;
28767     }
28768
28769   /* Constants are best loaded from the constant pool.  */
28770   if (n_var == 0)
28771     {
28772       emit_move_insn (target, gen_rtx_CONST_VECTOR (mode, XVEC (vals, 0)));
28773       return;
28774     }
28775
28776   /* If all values are identical, broadcast the value.  */
28777   if (all_same
28778       && ix86_expand_vector_init_duplicate (mmx_ok, mode, target,
28779                                             XVECEXP (vals, 0, 0)))
28780     return;
28781
28782   /* Values where only one field is non-constant are best loaded from
28783      the pool and overwritten via move later.  */
28784   if (n_var == 1)
28785     {
28786       if (all_const_zero
28787           && ix86_expand_vector_init_one_nonzero (mmx_ok, mode, target,
28788                                                   XVECEXP (vals, 0, one_var),
28789                                                   one_var))
28790         return;
28791
28792       if (ix86_expand_vector_init_one_var (mmx_ok, mode, target, vals, one_var))
28793         return;
28794     }
28795
28796   ix86_expand_vector_init_general (mmx_ok, mode, target, vals);
28797 }
28798
28799 void
28800 ix86_expand_vector_set (bool mmx_ok, rtx target, rtx val, int elt)
28801 {
28802   enum machine_mode mode = GET_MODE (target);
28803   enum machine_mode inner_mode = GET_MODE_INNER (mode);
28804   enum machine_mode half_mode;
28805   bool use_vec_merge = false;
28806   rtx tmp;
28807   static rtx (*gen_extract[6][2]) (rtx, rtx)
28808     = {
28809         { gen_vec_extract_lo_v32qi, gen_vec_extract_hi_v32qi },
28810         { gen_vec_extract_lo_v16hi, gen_vec_extract_hi_v16hi },
28811         { gen_vec_extract_lo_v8si, gen_vec_extract_hi_v8si },
28812         { gen_vec_extract_lo_v4di, gen_vec_extract_hi_v4di },
28813         { gen_vec_extract_lo_v8sf, gen_vec_extract_hi_v8sf },
28814         { gen_vec_extract_lo_v4df, gen_vec_extract_hi_v4df }
28815       };
28816   static rtx (*gen_insert[6][2]) (rtx, rtx, rtx)
28817     = {
28818         { gen_vec_set_lo_v32qi, gen_vec_set_hi_v32qi },
28819         { gen_vec_set_lo_v16hi, gen_vec_set_hi_v16hi },
28820         { gen_vec_set_lo_v8si, gen_vec_set_hi_v8si },
28821         { gen_vec_set_lo_v4di, gen_vec_set_hi_v4di },
28822         { gen_vec_set_lo_v8sf, gen_vec_set_hi_v8sf },
28823         { gen_vec_set_lo_v4df, gen_vec_set_hi_v4df }
28824       };
28825   int i, j, n;
28826
28827   switch (mode)
28828     {
28829     case V2SFmode:
28830     case V2SImode:
28831       if (mmx_ok)
28832         {
28833           tmp = gen_reg_rtx (GET_MODE_INNER (mode));
28834           ix86_expand_vector_extract (true, tmp, target, 1 - elt);
28835           if (elt == 0)
28836             tmp = gen_rtx_VEC_CONCAT (mode, tmp, val);
28837           else
28838             tmp = gen_rtx_VEC_CONCAT (mode, val, tmp);
28839           emit_insn (gen_rtx_SET (VOIDmode, target, tmp));
28840           return;
28841         }
28842       break;
28843
28844     case V2DImode:
28845       use_vec_merge = TARGET_SSE4_1;
28846       if (use_vec_merge)
28847         break;
28848
28849     case V2DFmode:
28850       {
28851         rtx op0, op1;
28852
28853         /* For the two element vectors, we implement a VEC_CONCAT with
28854            the extraction of the other element.  */
28855
28856         tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (1, GEN_INT (1 - elt)));
28857         tmp = gen_rtx_VEC_SELECT (inner_mode, target, tmp);
28858
28859         if (elt == 0)
28860           op0 = val, op1 = tmp;
28861         else
28862           op0 = tmp, op1 = val;
28863
28864         tmp = gen_rtx_VEC_CONCAT (mode, op0, op1);
28865         emit_insn (gen_rtx_SET (VOIDmode, target, tmp));
28866       }
28867       return;
28868
28869     case V4SFmode:
28870       use_vec_merge = TARGET_SSE4_1;
28871       if (use_vec_merge)
28872         break;
28873
28874       switch (elt)
28875         {
28876         case 0:
28877           use_vec_merge = true;
28878           break;
28879
28880         case 1:
28881           /* tmp = target = A B C D */
28882           tmp = copy_to_reg (target);
28883           /* target = A A B B */
28884           emit_insn (gen_sse_unpcklps (target, target, target));
28885           /* target = X A B B */
28886           ix86_expand_vector_set (false, target, val, 0);
28887           /* target = A X C D  */
28888           emit_insn (gen_sse_shufps_v4sf (target, target, tmp,
28889                                           const1_rtx, const0_rtx,
28890                                           GEN_INT (2+4), GEN_INT (3+4)));
28891           return;
28892
28893         case 2:
28894           /* tmp = target = A B C D */
28895           tmp = copy_to_reg (target);
28896           /* tmp = X B C D */
28897           ix86_expand_vector_set (false, tmp, val, 0);
28898           /* target = A B X D */
28899           emit_insn (gen_sse_shufps_v4sf (target, target, tmp,
28900                                           const0_rtx, const1_rtx,
28901                                           GEN_INT (0+4), GEN_INT (3+4)));
28902           return;
28903
28904         case 3:
28905           /* tmp = target = A B C D */
28906           tmp = copy_to_reg (target);
28907           /* tmp = X B C D */
28908           ix86_expand_vector_set (false, tmp, val, 0);
28909           /* target = A B X D */
28910           emit_insn (gen_sse_shufps_v4sf (target, target, tmp,
28911                                           const0_rtx, const1_rtx,
28912                                           GEN_INT (2+4), GEN_INT (0+4)));
28913           return;
28914
28915         default:
28916           gcc_unreachable ();
28917         }
28918       break;
28919
28920     case V4SImode:
28921       use_vec_merge = TARGET_SSE4_1;
28922       if (use_vec_merge)
28923         break;
28924
28925       /* Element 0 handled by vec_merge below.  */
28926       if (elt == 0)
28927         {
28928           use_vec_merge = true;
28929           break;
28930         }
28931
28932       if (TARGET_SSE2)
28933         {
28934           /* With SSE2, use integer shuffles to swap element 0 and ELT,
28935              store into element 0, then shuffle them back.  */
28936
28937           rtx order[4];
28938
28939           order[0] = GEN_INT (elt);
28940           order[1] = const1_rtx;
28941           order[2] = const2_rtx;
28942           order[3] = GEN_INT (3);
28943           order[elt] = const0_rtx;
28944
28945           emit_insn (gen_sse2_pshufd_1 (target, target, order[0],
28946                                         order[1], order[2], order[3]));
28947
28948           ix86_expand_vector_set (false, target, val, 0);
28949
28950           emit_insn (gen_sse2_pshufd_1 (target, target, order[0],
28951                                         order[1], order[2], order[3]));
28952         }
28953       else
28954         {
28955           /* For SSE1, we have to reuse the V4SF code.  */
28956           ix86_expand_vector_set (false, gen_lowpart (V4SFmode, target),
28957                                   gen_lowpart (SFmode, val), elt);
28958         }
28959       return;
28960
28961     case V8HImode:
28962       use_vec_merge = TARGET_SSE2;
28963       break;
28964     case V4HImode:
28965       use_vec_merge = mmx_ok && (TARGET_SSE || TARGET_3DNOW_A);
28966       break;
28967
28968     case V16QImode:
28969       use_vec_merge = TARGET_SSE4_1;
28970       break;
28971
28972     case V8QImode:
28973       break;
28974
28975     case V32QImode:
28976       half_mode = V16QImode;
28977       j = 0;
28978       n = 16;
28979       goto half;
28980
28981     case V16HImode:
28982       half_mode = V8HImode;
28983       j = 1;
28984       n = 8;
28985       goto half;
28986
28987     case V8SImode:
28988       half_mode = V4SImode;
28989       j = 2;
28990       n = 4;
28991       goto half;
28992
28993     case V4DImode:
28994       half_mode = V2DImode;
28995       j = 3;
28996       n = 2;
28997       goto half;
28998
28999     case V8SFmode:
29000       half_mode = V4SFmode;
29001       j = 4;
29002       n = 4;
29003       goto half;
29004
29005     case V4DFmode:
29006       half_mode = V2DFmode;
29007       j = 5;
29008       n = 2;
29009       goto half;
29010
29011 half:
29012       /* Compute offset.  */
29013       i = elt / n;
29014       elt %= n;
29015
29016       gcc_assert (i <= 1);
29017
29018       /* Extract the half.  */
29019       tmp = gen_reg_rtx (half_mode);
29020       emit_insn ((*gen_extract[j][i]) (tmp, target));
29021
29022       /* Put val in tmp at elt.  */
29023       ix86_expand_vector_set (false, tmp, val, elt);
29024
29025       /* Put it back.  */
29026       emit_insn ((*gen_insert[j][i]) (target, target, tmp));
29027       return;
29028
29029     default:
29030       break;
29031     }
29032
29033   if (use_vec_merge)
29034     {
29035       tmp = gen_rtx_VEC_DUPLICATE (mode, val);
29036       tmp = gen_rtx_VEC_MERGE (mode, tmp, target, GEN_INT (1 << elt));
29037       emit_insn (gen_rtx_SET (VOIDmode, target, tmp));
29038     }
29039   else
29040     {
29041       rtx mem = assign_stack_temp (mode, GET_MODE_SIZE (mode), false);
29042
29043       emit_move_insn (mem, target);
29044
29045       tmp = adjust_address (mem, inner_mode, elt*GET_MODE_SIZE (inner_mode));
29046       emit_move_insn (tmp, val);
29047
29048       emit_move_insn (target, mem);
29049     }
29050 }
29051
29052 void
29053 ix86_expand_vector_extract (bool mmx_ok, rtx target, rtx vec, int elt)
29054 {
29055   enum machine_mode mode = GET_MODE (vec);
29056   enum machine_mode inner_mode = GET_MODE_INNER (mode);
29057   bool use_vec_extr = false;
29058   rtx tmp;
29059
29060   switch (mode)
29061     {
29062     case V2SImode:
29063     case V2SFmode:
29064       if (!mmx_ok)
29065         break;
29066       /* FALLTHRU */
29067
29068     case V2DFmode:
29069     case V2DImode:
29070       use_vec_extr = true;
29071       break;
29072
29073     case V4SFmode:
29074       use_vec_extr = TARGET_SSE4_1;
29075       if (use_vec_extr)
29076         break;
29077
29078       switch (elt)
29079         {
29080         case 0:
29081           tmp = vec;
29082           break;
29083
29084         case 1:
29085         case 3:
29086           tmp = gen_reg_rtx (mode);
29087           emit_insn (gen_sse_shufps_v4sf (tmp, vec, vec,
29088                                        GEN_INT (elt), GEN_INT (elt),
29089                                        GEN_INT (elt+4), GEN_INT (elt+4)));
29090           break;
29091
29092         case 2:
29093           tmp = gen_reg_rtx (mode);
29094           emit_insn (gen_sse_unpckhps (tmp, vec, vec));
29095           break;
29096
29097         default:
29098           gcc_unreachable ();
29099         }
29100       vec = tmp;
29101       use_vec_extr = true;
29102       elt = 0;
29103       break;
29104
29105     case V4SImode:
29106       use_vec_extr = TARGET_SSE4_1;
29107       if (use_vec_extr)
29108         break;
29109
29110       if (TARGET_SSE2)
29111         {
29112           switch (elt)
29113             {
29114             case 0:
29115               tmp = vec;
29116               break;
29117
29118             case 1:
29119             case 3:
29120               tmp = gen_reg_rtx (mode);
29121               emit_insn (gen_sse2_pshufd_1 (tmp, vec,
29122                                             GEN_INT (elt), GEN_INT (elt),
29123                                             GEN_INT (elt), GEN_INT (elt)));
29124               break;
29125
29126             case 2:
29127               tmp = gen_reg_rtx (mode);
29128               emit_insn (gen_sse2_punpckhdq (tmp, vec, vec));
29129               break;
29130
29131             default:
29132               gcc_unreachable ();
29133             }
29134           vec = tmp;
29135           use_vec_extr = true;
29136           elt = 0;
29137         }
29138       else
29139         {
29140           /* For SSE1, we have to reuse the V4SF code.  */
29141           ix86_expand_vector_extract (false, gen_lowpart (SFmode, target),
29142                                       gen_lowpart (V4SFmode, vec), elt);
29143           return;
29144         }
29145       break;
29146
29147     case V8HImode:
29148       use_vec_extr = TARGET_SSE2;
29149       break;
29150     case V4HImode:
29151       use_vec_extr = mmx_ok && (TARGET_SSE || TARGET_3DNOW_A);
29152       break;
29153
29154     case V16QImode:
29155       use_vec_extr = TARGET_SSE4_1;
29156       break;
29157
29158     case V8QImode:
29159       /* ??? Could extract the appropriate HImode element and shift.  */
29160     default:
29161       break;
29162     }
29163
29164   if (use_vec_extr)
29165     {
29166       tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (1, GEN_INT (elt)));
29167       tmp = gen_rtx_VEC_SELECT (inner_mode, vec, tmp);
29168
29169       /* Let the rtl optimizers know about the zero extension performed.  */
29170       if (inner_mode == QImode || inner_mode == HImode)
29171         {
29172           tmp = gen_rtx_ZERO_EXTEND (SImode, tmp);
29173           target = gen_lowpart (SImode, target);
29174         }
29175
29176       emit_insn (gen_rtx_SET (VOIDmode, target, tmp));
29177     }
29178   else
29179     {
29180       rtx mem = assign_stack_temp (mode, GET_MODE_SIZE (mode), false);
29181
29182       emit_move_insn (mem, vec);
29183
29184       tmp = adjust_address (mem, inner_mode, elt*GET_MODE_SIZE (inner_mode));
29185       emit_move_insn (target, tmp);
29186     }
29187 }
29188
29189 /* Expand a vector reduction on V4SFmode for SSE1.  FN is the binary
29190    pattern to reduce; DEST is the destination; IN is the input vector.  */
29191
29192 void
29193 ix86_expand_reduc_v4sf (rtx (*fn) (rtx, rtx, rtx), rtx dest, rtx in)
29194 {
29195   rtx tmp1, tmp2, tmp3;
29196
29197   tmp1 = gen_reg_rtx (V4SFmode);
29198   tmp2 = gen_reg_rtx (V4SFmode);
29199   tmp3 = gen_reg_rtx (V4SFmode);
29200
29201   emit_insn (gen_sse_movhlps (tmp1, in, in));
29202   emit_insn (fn (tmp2, tmp1, in));
29203
29204   emit_insn (gen_sse_shufps_v4sf (tmp3, tmp2, tmp2,
29205                                   const1_rtx, const1_rtx,
29206                                   GEN_INT (1+4), GEN_INT (1+4)));
29207   emit_insn (fn (dest, tmp2, tmp3));
29208 }
29209 \f
29210 /* Target hook for scalar_mode_supported_p.  */
29211 static bool
29212 ix86_scalar_mode_supported_p (enum machine_mode mode)
29213 {
29214   if (DECIMAL_FLOAT_MODE_P (mode))
29215     return default_decimal_float_supported_p ();
29216   else if (mode == TFmode)
29217     return true;
29218   else
29219     return default_scalar_mode_supported_p (mode);
29220 }
29221
29222 /* Implements target hook vector_mode_supported_p.  */
29223 static bool
29224 ix86_vector_mode_supported_p (enum machine_mode mode)
29225 {
29226   if (TARGET_SSE && VALID_SSE_REG_MODE (mode))
29227     return true;
29228   if (TARGET_SSE2 && VALID_SSE2_REG_MODE (mode))
29229     return true;
29230   if (TARGET_AVX && VALID_AVX256_REG_MODE (mode))
29231     return true;
29232   if (TARGET_MMX && VALID_MMX_REG_MODE (mode))
29233     return true;
29234   if (TARGET_3DNOW && VALID_MMX_REG_MODE_3DNOW (mode))
29235     return true;
29236   return false;
29237 }
29238
29239 /* Target hook for c_mode_for_suffix.  */
29240 static enum machine_mode
29241 ix86_c_mode_for_suffix (char suffix)
29242 {
29243   if (suffix == 'q')
29244     return TFmode;
29245   if (suffix == 'w')
29246     return XFmode;
29247
29248   return VOIDmode;
29249 }
29250
29251 /* Worker function for TARGET_MD_ASM_CLOBBERS.
29252
29253    We do this in the new i386 backend to maintain source compatibility
29254    with the old cc0-based compiler.  */
29255
29256 static tree
29257 ix86_md_asm_clobbers (tree outputs ATTRIBUTE_UNUSED,
29258                       tree inputs ATTRIBUTE_UNUSED,
29259                       tree clobbers)
29260 {
29261   clobbers = tree_cons (NULL_TREE, build_string (5, "flags"),
29262                         clobbers);
29263   clobbers = tree_cons (NULL_TREE, build_string (4, "fpsr"),
29264                         clobbers);
29265   return clobbers;
29266 }
29267
29268 /* Implements target vector targetm.asm.encode_section_info.  This
29269    is not used by netware.  */
29270
29271 static void ATTRIBUTE_UNUSED
29272 ix86_encode_section_info (tree decl, rtx rtl, int first)
29273 {
29274   default_encode_section_info (decl, rtl, first);
29275
29276   if (TREE_CODE (decl) == VAR_DECL
29277       && (TREE_STATIC (decl) || DECL_EXTERNAL (decl))
29278       && ix86_in_large_data_p (decl))
29279     SYMBOL_REF_FLAGS (XEXP (rtl, 0)) |= SYMBOL_FLAG_FAR_ADDR;
29280 }
29281
29282 /* Worker function for REVERSE_CONDITION.  */
29283
29284 enum rtx_code
29285 ix86_reverse_condition (enum rtx_code code, enum machine_mode mode)
29286 {
29287   return (mode != CCFPmode && mode != CCFPUmode
29288           ? reverse_condition (code)
29289           : reverse_condition_maybe_unordered (code));
29290 }
29291
29292 /* Output code to perform an x87 FP register move, from OPERANDS[1]
29293    to OPERANDS[0].  */
29294
29295 const char *
29296 output_387_reg_move (rtx insn, rtx *operands)
29297 {
29298   if (REG_P (operands[0]))
29299     {
29300       if (REG_P (operands[1])
29301           && find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
29302         {
29303           if (REGNO (operands[0]) == FIRST_STACK_REG)
29304             return output_387_ffreep (operands, 0);
29305           return "fstp\t%y0";
29306         }
29307       if (STACK_TOP_P (operands[0]))
29308         return "fld%Z1\t%y1";
29309       return "fst\t%y0";
29310     }
29311   else if (MEM_P (operands[0]))
29312     {
29313       gcc_assert (REG_P (operands[1]));
29314       if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
29315         return "fstp%Z0\t%y0";
29316       else
29317         {
29318           /* There is no non-popping store to memory for XFmode.
29319              So if we need one, follow the store with a load.  */
29320           if (GET_MODE (operands[0]) == XFmode)
29321             return "fstp%Z0\t%y0\n\tfld%Z0\t%y0";
29322           else
29323             return "fst%Z0\t%y0";
29324         }
29325     }
29326   else
29327     gcc_unreachable();
29328 }
29329
29330 /* Output code to perform a conditional jump to LABEL, if C2 flag in
29331    FP status register is set.  */
29332
29333 void
29334 ix86_emit_fp_unordered_jump (rtx label)
29335 {
29336   rtx reg = gen_reg_rtx (HImode);
29337   rtx temp;
29338
29339   emit_insn (gen_x86_fnstsw_1 (reg));
29340
29341   if (TARGET_SAHF && (TARGET_USE_SAHF || optimize_insn_for_size_p ()))
29342     {
29343       emit_insn (gen_x86_sahf_1 (reg));
29344
29345       temp = gen_rtx_REG (CCmode, FLAGS_REG);
29346       temp = gen_rtx_UNORDERED (VOIDmode, temp, const0_rtx);
29347     }
29348   else
29349     {
29350       emit_insn (gen_testqi_ext_ccno_0 (reg, GEN_INT (0x04)));
29351
29352       temp = gen_rtx_REG (CCNOmode, FLAGS_REG);
29353       temp = gen_rtx_NE (VOIDmode, temp, const0_rtx);
29354     }
29355
29356   temp = gen_rtx_IF_THEN_ELSE (VOIDmode, temp,
29357                               gen_rtx_LABEL_REF (VOIDmode, label),
29358                               pc_rtx);
29359   temp = gen_rtx_SET (VOIDmode, pc_rtx, temp);
29360
29361   emit_jump_insn (temp);
29362   predict_jump (REG_BR_PROB_BASE * 10 / 100);
29363 }
29364
29365 /* Output code to perform a log1p XFmode calculation.  */
29366
29367 void ix86_emit_i387_log1p (rtx op0, rtx op1)
29368 {
29369   rtx label1 = gen_label_rtx ();
29370   rtx label2 = gen_label_rtx ();
29371
29372   rtx tmp = gen_reg_rtx (XFmode);
29373   rtx tmp2 = gen_reg_rtx (XFmode);
29374   rtx test;
29375
29376   emit_insn (gen_absxf2 (tmp, op1));
29377   test = gen_rtx_GE (VOIDmode, tmp,
29378     CONST_DOUBLE_FROM_REAL_VALUE (
29379        REAL_VALUE_ATOF ("0.29289321881345247561810596348408353", XFmode),
29380        XFmode));
29381   emit_jump_insn (gen_cbranchxf4 (test, XEXP (test, 0), XEXP (test, 1), label1));
29382
29383   emit_move_insn (tmp2, standard_80387_constant_rtx (4)); /* fldln2 */
29384   emit_insn (gen_fyl2xp1xf3_i387 (op0, op1, tmp2));
29385   emit_jump (label2);
29386
29387   emit_label (label1);
29388   emit_move_insn (tmp, CONST1_RTX (XFmode));
29389   emit_insn (gen_addxf3 (tmp, op1, tmp));
29390   emit_move_insn (tmp2, standard_80387_constant_rtx (4)); /* fldln2 */
29391   emit_insn (gen_fyl2xxf3_i387 (op0, tmp, tmp2));
29392
29393   emit_label (label2);
29394 }
29395
29396 /* Output code to perform a Newton-Rhapson approximation of a single precision
29397    floating point divide [http://en.wikipedia.org/wiki/N-th_root_algorithm].  */
29398
29399 void ix86_emit_swdivsf (rtx res, rtx a, rtx b, enum machine_mode mode)
29400 {
29401   rtx x0, x1, e0, e1, two;
29402
29403   x0 = gen_reg_rtx (mode);
29404   e0 = gen_reg_rtx (mode);
29405   e1 = gen_reg_rtx (mode);
29406   x1 = gen_reg_rtx (mode);
29407
29408   two = CONST_DOUBLE_FROM_REAL_VALUE (dconst2, SFmode);
29409
29410   if (VECTOR_MODE_P (mode))
29411     two = ix86_build_const_vector (SFmode, true, two);
29412
29413   two = force_reg (mode, two);
29414
29415   /* a / b = a * rcp(b) * (2.0 - b * rcp(b)) */
29416
29417   /* x0 = rcp(b) estimate */
29418   emit_insn (gen_rtx_SET (VOIDmode, x0,
29419                           gen_rtx_UNSPEC (mode, gen_rtvec (1, b),
29420                                           UNSPEC_RCP)));
29421   /* e0 = x0 * a */
29422   emit_insn (gen_rtx_SET (VOIDmode, e0,
29423                           gen_rtx_MULT (mode, x0, a)));
29424   /* e1 = x0 * b */
29425   emit_insn (gen_rtx_SET (VOIDmode, e1,
29426                           gen_rtx_MULT (mode, x0, b)));
29427   /* x1 = 2. - e1 */
29428   emit_insn (gen_rtx_SET (VOIDmode, x1,
29429                           gen_rtx_MINUS (mode, two, e1)));
29430   /* res = e0 * x1 */
29431   emit_insn (gen_rtx_SET (VOIDmode, res,
29432                           gen_rtx_MULT (mode, e0, x1)));
29433 }
29434
29435 /* Output code to perform a Newton-Rhapson approximation of a
29436    single precision floating point [reciprocal] square root.  */
29437
29438 void ix86_emit_swsqrtsf (rtx res, rtx a, enum machine_mode mode,
29439                          bool recip)
29440 {
29441   rtx x0, e0, e1, e2, e3, mthree, mhalf;
29442   REAL_VALUE_TYPE r;
29443
29444   x0 = gen_reg_rtx (mode);
29445   e0 = gen_reg_rtx (mode);
29446   e1 = gen_reg_rtx (mode);
29447   e2 = gen_reg_rtx (mode);
29448   e3 = gen_reg_rtx (mode);
29449
29450   real_from_integer (&r, VOIDmode, -3, -1, 0);
29451   mthree = CONST_DOUBLE_FROM_REAL_VALUE (r, SFmode);
29452
29453   real_arithmetic (&r, NEGATE_EXPR, &dconsthalf, NULL);
29454   mhalf = CONST_DOUBLE_FROM_REAL_VALUE (r, SFmode);
29455
29456   if (VECTOR_MODE_P (mode))
29457     {
29458       mthree = ix86_build_const_vector (SFmode, true, mthree);
29459       mhalf = ix86_build_const_vector (SFmode, true, mhalf);
29460     }
29461
29462   /* sqrt(a)  = -0.5 * a * rsqrtss(a) * (a * rsqrtss(a) * rsqrtss(a) - 3.0)
29463      rsqrt(a) = -0.5     * rsqrtss(a) * (a * rsqrtss(a) * rsqrtss(a) - 3.0) */
29464
29465   /* x0 = rsqrt(a) estimate */
29466   emit_insn (gen_rtx_SET (VOIDmode, x0,
29467                           gen_rtx_UNSPEC (mode, gen_rtvec (1, a),
29468                                           UNSPEC_RSQRT)));
29469
29470   /* If (a == 0.0) Filter out infinity to prevent NaN for sqrt(0.0).  */
29471   if (!recip)
29472     {
29473       rtx zero, mask;
29474
29475       zero = gen_reg_rtx (mode);
29476       mask = gen_reg_rtx (mode);
29477
29478       zero = force_reg (mode, CONST0_RTX(mode));
29479       emit_insn (gen_rtx_SET (VOIDmode, mask,
29480                               gen_rtx_NE (mode, zero, a)));
29481
29482       emit_insn (gen_rtx_SET (VOIDmode, x0,
29483                               gen_rtx_AND (mode, x0, mask)));
29484     }
29485
29486   /* e0 = x0 * a */
29487   emit_insn (gen_rtx_SET (VOIDmode, e0,
29488                           gen_rtx_MULT (mode, x0, a)));
29489   /* e1 = e0 * x0 */
29490   emit_insn (gen_rtx_SET (VOIDmode, e1,
29491                           gen_rtx_MULT (mode, e0, x0)));
29492
29493   /* e2 = e1 - 3. */
29494   mthree = force_reg (mode, mthree);
29495   emit_insn (gen_rtx_SET (VOIDmode, e2,
29496                           gen_rtx_PLUS (mode, e1, mthree)));
29497
29498   mhalf = force_reg (mode, mhalf);
29499   if (recip)
29500     /* e3 = -.5 * x0 */
29501     emit_insn (gen_rtx_SET (VOIDmode, e3,
29502                             gen_rtx_MULT (mode, x0, mhalf)));
29503   else
29504     /* e3 = -.5 * e0 */
29505     emit_insn (gen_rtx_SET (VOIDmode, e3,
29506                             gen_rtx_MULT (mode, e0, mhalf)));
29507   /* ret = e2 * e3 */
29508   emit_insn (gen_rtx_SET (VOIDmode, res,
29509                           gen_rtx_MULT (mode, e2, e3)));
29510 }
29511
29512 /* Solaris implementation of TARGET_ASM_NAMED_SECTION.  */
29513
29514 static void ATTRIBUTE_UNUSED
29515 i386_solaris_elf_named_section (const char *name, unsigned int flags,
29516                                 tree decl)
29517 {
29518   /* With Binutils 2.15, the "@unwind" marker must be specified on
29519      every occurrence of the ".eh_frame" section, not just the first
29520      one.  */
29521   if (TARGET_64BIT
29522       && strcmp (name, ".eh_frame") == 0)
29523     {
29524       fprintf (asm_out_file, "\t.section\t%s,\"%s\",@unwind\n", name,
29525                flags & SECTION_WRITE ? "aw" : "a");
29526       return;
29527     }
29528   default_elf_asm_named_section (name, flags, decl);
29529 }
29530
29531 /* Return the mangling of TYPE if it is an extended fundamental type.  */
29532
29533 static const char *
29534 ix86_mangle_type (const_tree type)
29535 {
29536   type = TYPE_MAIN_VARIANT (type);
29537
29538   if (TREE_CODE (type) != VOID_TYPE && TREE_CODE (type) != BOOLEAN_TYPE
29539       && TREE_CODE (type) != INTEGER_TYPE && TREE_CODE (type) != REAL_TYPE)
29540     return NULL;
29541
29542   switch (TYPE_MODE (type))
29543     {
29544     case TFmode:
29545       /* __float128 is "g".  */
29546       return "g";
29547     case XFmode:
29548       /* "long double" or __float80 is "e".  */
29549       return "e";
29550     default:
29551       return NULL;
29552     }
29553 }
29554
29555 /* For 32-bit code we can save PIC register setup by using
29556    __stack_chk_fail_local hidden function instead of calling
29557    __stack_chk_fail directly.  64-bit code doesn't need to setup any PIC
29558    register, so it is better to call __stack_chk_fail directly.  */
29559
29560 static tree
29561 ix86_stack_protect_fail (void)
29562 {
29563   return TARGET_64BIT
29564          ? default_external_stack_protect_fail ()
29565          : default_hidden_stack_protect_fail ();
29566 }
29567
29568 /* Select a format to encode pointers in exception handling data.  CODE
29569    is 0 for data, 1 for code labels, 2 for function pointers.  GLOBAL is
29570    true if the symbol may be affected by dynamic relocations.
29571
29572    ??? All x86 object file formats are capable of representing this.
29573    After all, the relocation needed is the same as for the call insn.
29574    Whether or not a particular assembler allows us to enter such, I
29575    guess we'll have to see.  */
29576 int
29577 asm_preferred_eh_data_format (int code, int global)
29578 {
29579   if (flag_pic)
29580     {
29581       int type = DW_EH_PE_sdata8;
29582       if (!TARGET_64BIT
29583           || ix86_cmodel == CM_SMALL_PIC
29584           || (ix86_cmodel == CM_MEDIUM_PIC && (global || code)))
29585         type = DW_EH_PE_sdata4;
29586       return (global ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel | type;
29587     }
29588   if (ix86_cmodel == CM_SMALL
29589       || (ix86_cmodel == CM_MEDIUM && code))
29590     return DW_EH_PE_udata4;
29591   return DW_EH_PE_absptr;
29592 }
29593 \f
29594 /* Expand copysign from SIGN to the positive value ABS_VALUE
29595    storing in RESULT.  If MASK is non-null, it shall be a mask to mask out
29596    the sign-bit.  */
29597 static void
29598 ix86_sse_copysign_to_positive (rtx result, rtx abs_value, rtx sign, rtx mask)
29599 {
29600   enum machine_mode mode = GET_MODE (sign);
29601   rtx sgn = gen_reg_rtx (mode);
29602   if (mask == NULL_RTX)
29603     {
29604       mask = ix86_build_signbit_mask (mode, VECTOR_MODE_P (mode), false);
29605       if (!VECTOR_MODE_P (mode))
29606         {
29607           /* We need to generate a scalar mode mask in this case.  */
29608           rtx tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (1, const0_rtx));
29609           tmp = gen_rtx_VEC_SELECT (mode, mask, tmp);
29610           mask = gen_reg_rtx (mode);
29611           emit_insn (gen_rtx_SET (VOIDmode, mask, tmp));
29612         }
29613     }
29614   else
29615     mask = gen_rtx_NOT (mode, mask);
29616   emit_insn (gen_rtx_SET (VOIDmode, sgn,
29617                           gen_rtx_AND (mode, mask, sign)));
29618   emit_insn (gen_rtx_SET (VOIDmode, result,
29619                           gen_rtx_IOR (mode, abs_value, sgn)));
29620 }
29621
29622 /* Expand fabs (OP0) and return a new rtx that holds the result.  The
29623    mask for masking out the sign-bit is stored in *SMASK, if that is
29624    non-null.  */
29625 static rtx
29626 ix86_expand_sse_fabs (rtx op0, rtx *smask)
29627 {
29628   enum machine_mode mode = GET_MODE (op0);
29629   rtx xa, mask;
29630
29631   xa = gen_reg_rtx (mode);
29632   mask = ix86_build_signbit_mask (mode, VECTOR_MODE_P (mode), true);
29633   if (!VECTOR_MODE_P (mode))
29634     {
29635       /* We need to generate a scalar mode mask in this case.  */
29636       rtx tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (1, const0_rtx));
29637       tmp = gen_rtx_VEC_SELECT (mode, mask, tmp);
29638       mask = gen_reg_rtx (mode);
29639       emit_insn (gen_rtx_SET (VOIDmode, mask, tmp));
29640     }
29641   emit_insn (gen_rtx_SET (VOIDmode, xa,
29642                           gen_rtx_AND (mode, op0, mask)));
29643
29644   if (smask)
29645     *smask = mask;
29646
29647   return xa;
29648 }
29649
29650 /* Expands a comparison of OP0 with OP1 using comparison code CODE,
29651    swapping the operands if SWAP_OPERANDS is true.  The expanded
29652    code is a forward jump to a newly created label in case the
29653    comparison is true.  The generated label rtx is returned.  */
29654 static rtx
29655 ix86_expand_sse_compare_and_jump (enum rtx_code code, rtx op0, rtx op1,
29656                                   bool swap_operands)
29657 {
29658   rtx label, tmp;
29659
29660   if (swap_operands)
29661     {
29662       tmp = op0;
29663       op0 = op1;
29664       op1 = tmp;
29665     }
29666
29667   label = gen_label_rtx ();
29668   tmp = gen_rtx_REG (CCFPUmode, FLAGS_REG);
29669   emit_insn (gen_rtx_SET (VOIDmode, tmp,
29670                           gen_rtx_COMPARE (CCFPUmode, op0, op1)));
29671   tmp = gen_rtx_fmt_ee (code, VOIDmode, tmp, const0_rtx);
29672   tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp,
29673                               gen_rtx_LABEL_REF (VOIDmode, label), pc_rtx);
29674   tmp = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, tmp));
29675   JUMP_LABEL (tmp) = label;
29676
29677   return label;
29678 }
29679
29680 /* Expand a mask generating SSE comparison instruction comparing OP0 with OP1
29681    using comparison code CODE.  Operands are swapped for the comparison if
29682    SWAP_OPERANDS is true.  Returns a rtx for the generated mask.  */
29683 static rtx
29684 ix86_expand_sse_compare_mask (enum rtx_code code, rtx op0, rtx op1,
29685                               bool swap_operands)
29686 {
29687   enum machine_mode mode = GET_MODE (op0);
29688   rtx mask = gen_reg_rtx (mode);
29689
29690   if (swap_operands)
29691     {
29692       rtx tmp = op0;
29693       op0 = op1;
29694       op1 = tmp;
29695     }
29696
29697   if (mode == DFmode)
29698     emit_insn (gen_sse2_maskcmpdf3 (mask, op0, op1,
29699                                     gen_rtx_fmt_ee (code, mode, op0, op1)));
29700   else
29701     emit_insn (gen_sse_maskcmpsf3 (mask, op0, op1,
29702                                    gen_rtx_fmt_ee (code, mode, op0, op1)));
29703
29704   return mask;
29705 }
29706
29707 /* Generate and return a rtx of mode MODE for 2**n where n is the number
29708    of bits of the mantissa of MODE, which must be one of DFmode or SFmode.  */
29709 static rtx
29710 ix86_gen_TWO52 (enum machine_mode mode)
29711 {
29712   REAL_VALUE_TYPE TWO52r;
29713   rtx TWO52;
29714
29715   real_ldexp (&TWO52r, &dconst1, mode == DFmode ? 52 : 23);
29716   TWO52 = const_double_from_real_value (TWO52r, mode);
29717   TWO52 = force_reg (mode, TWO52);
29718
29719   return TWO52;
29720 }
29721
29722 /* Expand SSE sequence for computing lround from OP1 storing
29723    into OP0.  */
29724 void
29725 ix86_expand_lround (rtx op0, rtx op1)
29726 {
29727   /* C code for the stuff we're doing below:
29728        tmp = op1 + copysign (nextafter (0.5, 0.0), op1)
29729        return (long)tmp;
29730    */
29731   enum machine_mode mode = GET_MODE (op1);
29732   const struct real_format *fmt;
29733   REAL_VALUE_TYPE pred_half, half_minus_pred_half;
29734   rtx adj;
29735
29736   /* load nextafter (0.5, 0.0) */
29737   fmt = REAL_MODE_FORMAT (mode);
29738   real_2expN (&half_minus_pred_half, -(fmt->p) - 1, mode);
29739   REAL_ARITHMETIC (pred_half, MINUS_EXPR, dconsthalf, half_minus_pred_half);
29740
29741   /* adj = copysign (0.5, op1) */
29742   adj = force_reg (mode, const_double_from_real_value (pred_half, mode));
29743   ix86_sse_copysign_to_positive (adj, adj, force_reg (mode, op1), NULL_RTX);
29744
29745   /* adj = op1 + adj */
29746   adj = expand_simple_binop (mode, PLUS, adj, op1, NULL_RTX, 0, OPTAB_DIRECT);
29747
29748   /* op0 = (imode)adj */
29749   expand_fix (op0, adj, 0);
29750 }
29751
29752 /* Expand SSE2 sequence for computing lround from OPERAND1 storing
29753    into OPERAND0.  */
29754 void
29755 ix86_expand_lfloorceil (rtx op0, rtx op1, bool do_floor)
29756 {
29757   /* C code for the stuff we're doing below (for do_floor):
29758         xi = (long)op1;
29759         xi -= (double)xi > op1 ? 1 : 0;
29760         return xi;
29761    */
29762   enum machine_mode fmode = GET_MODE (op1);
29763   enum machine_mode imode = GET_MODE (op0);
29764   rtx ireg, freg, label, tmp;
29765
29766   /* reg = (long)op1 */
29767   ireg = gen_reg_rtx (imode);
29768   expand_fix (ireg, op1, 0);
29769
29770   /* freg = (double)reg */
29771   freg = gen_reg_rtx (fmode);
29772   expand_float (freg, ireg, 0);
29773
29774   /* ireg = (freg > op1) ? ireg - 1 : ireg */
29775   label = ix86_expand_sse_compare_and_jump (UNLE,
29776                                             freg, op1, !do_floor);
29777   tmp = expand_simple_binop (imode, do_floor ? MINUS : PLUS,
29778                              ireg, const1_rtx, NULL_RTX, 0, OPTAB_DIRECT);
29779   emit_move_insn (ireg, tmp);
29780
29781   emit_label (label);
29782   LABEL_NUSES (label) = 1;
29783
29784   emit_move_insn (op0, ireg);
29785 }
29786
29787 /* Expand rint (IEEE round to nearest) rounding OPERAND1 and storing the
29788    result in OPERAND0.  */
29789 void
29790 ix86_expand_rint (rtx operand0, rtx operand1)
29791 {
29792   /* C code for the stuff we're doing below:
29793         xa = fabs (operand1);
29794         if (!isless (xa, 2**52))
29795           return operand1;
29796         xa = xa + 2**52 - 2**52;
29797         return copysign (xa, operand1);
29798    */
29799   enum machine_mode mode = GET_MODE (operand0);
29800   rtx res, xa, label, TWO52, mask;
29801
29802   res = gen_reg_rtx (mode);
29803   emit_move_insn (res, operand1);
29804
29805   /* xa = abs (operand1) */
29806   xa = ix86_expand_sse_fabs (res, &mask);
29807
29808   /* if (!isless (xa, TWO52)) goto label; */
29809   TWO52 = ix86_gen_TWO52 (mode);
29810   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
29811
29812   xa = expand_simple_binop (mode, PLUS, xa, TWO52, NULL_RTX, 0, OPTAB_DIRECT);
29813   xa = expand_simple_binop (mode, MINUS, xa, TWO52, xa, 0, OPTAB_DIRECT);
29814
29815   ix86_sse_copysign_to_positive (res, xa, res, mask);
29816
29817   emit_label (label);
29818   LABEL_NUSES (label) = 1;
29819
29820   emit_move_insn (operand0, res);
29821 }
29822
29823 /* Expand SSE2 sequence for computing floor or ceil from OPERAND1 storing
29824    into OPERAND0.  */
29825 void
29826 ix86_expand_floorceildf_32 (rtx operand0, rtx operand1, bool do_floor)
29827 {
29828   /* C code for the stuff we expand below.
29829         double xa = fabs (x), x2;
29830         if (!isless (xa, TWO52))
29831           return x;
29832         xa = xa + TWO52 - TWO52;
29833         x2 = copysign (xa, x);
29834      Compensate.  Floor:
29835         if (x2 > x)
29836           x2 -= 1;
29837      Compensate.  Ceil:
29838         if (x2 < x)
29839           x2 -= -1;
29840         return x2;
29841    */
29842   enum machine_mode mode = GET_MODE (operand0);
29843   rtx xa, TWO52, tmp, label, one, res, mask;
29844
29845   TWO52 = ix86_gen_TWO52 (mode);
29846
29847   /* Temporary for holding the result, initialized to the input
29848      operand to ease control flow.  */
29849   res = gen_reg_rtx (mode);
29850   emit_move_insn (res, operand1);
29851
29852   /* xa = abs (operand1) */
29853   xa = ix86_expand_sse_fabs (res, &mask);
29854
29855   /* if (!isless (xa, TWO52)) goto label; */
29856   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
29857
29858   /* xa = xa + TWO52 - TWO52; */
29859   xa = expand_simple_binop (mode, PLUS, xa, TWO52, NULL_RTX, 0, OPTAB_DIRECT);
29860   xa = expand_simple_binop (mode, MINUS, xa, TWO52, xa, 0, OPTAB_DIRECT);
29861
29862   /* xa = copysign (xa, operand1) */
29863   ix86_sse_copysign_to_positive (xa, xa, res, mask);
29864
29865   /* generate 1.0 or -1.0 */
29866   one = force_reg (mode,
29867                    const_double_from_real_value (do_floor
29868                                                  ? dconst1 : dconstm1, mode));
29869
29870   /* Compensate: xa = xa - (xa > operand1 ? 1 : 0) */
29871   tmp = ix86_expand_sse_compare_mask (UNGT, xa, res, !do_floor);
29872   emit_insn (gen_rtx_SET (VOIDmode, tmp,
29873                           gen_rtx_AND (mode, one, tmp)));
29874   /* We always need to subtract here to preserve signed zero.  */
29875   tmp = expand_simple_binop (mode, MINUS,
29876                              xa, tmp, NULL_RTX, 0, OPTAB_DIRECT);
29877   emit_move_insn (res, tmp);
29878
29879   emit_label (label);
29880   LABEL_NUSES (label) = 1;
29881
29882   emit_move_insn (operand0, res);
29883 }
29884
29885 /* Expand SSE2 sequence for computing floor or ceil from OPERAND1 storing
29886    into OPERAND0.  */
29887 void
29888 ix86_expand_floorceil (rtx operand0, rtx operand1, bool do_floor)
29889 {
29890   /* C code for the stuff we expand below.
29891         double xa = fabs (x), x2;
29892         if (!isless (xa, TWO52))
29893           return x;
29894         x2 = (double)(long)x;
29895      Compensate.  Floor:
29896         if (x2 > x)
29897           x2 -= 1;
29898      Compensate.  Ceil:
29899         if (x2 < x)
29900           x2 += 1;
29901         if (HONOR_SIGNED_ZEROS (mode))
29902           return copysign (x2, x);
29903         return x2;
29904    */
29905   enum machine_mode mode = GET_MODE (operand0);
29906   rtx xa, xi, TWO52, tmp, label, one, res, mask;
29907
29908   TWO52 = ix86_gen_TWO52 (mode);
29909
29910   /* Temporary for holding the result, initialized to the input
29911      operand to ease control flow.  */
29912   res = gen_reg_rtx (mode);
29913   emit_move_insn (res, operand1);
29914
29915   /* xa = abs (operand1) */
29916   xa = ix86_expand_sse_fabs (res, &mask);
29917
29918   /* if (!isless (xa, TWO52)) goto label; */
29919   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
29920
29921   /* xa = (double)(long)x */
29922   xi = gen_reg_rtx (mode == DFmode ? DImode : SImode);
29923   expand_fix (xi, res, 0);
29924   expand_float (xa, xi, 0);
29925
29926   /* generate 1.0 */
29927   one = force_reg (mode, const_double_from_real_value (dconst1, mode));
29928
29929   /* Compensate: xa = xa - (xa > operand1 ? 1 : 0) */
29930   tmp = ix86_expand_sse_compare_mask (UNGT, xa, res, !do_floor);
29931   emit_insn (gen_rtx_SET (VOIDmode, tmp,
29932                           gen_rtx_AND (mode, one, tmp)));
29933   tmp = expand_simple_binop (mode, do_floor ? MINUS : PLUS,
29934                              xa, tmp, NULL_RTX, 0, OPTAB_DIRECT);
29935   emit_move_insn (res, tmp);
29936
29937   if (HONOR_SIGNED_ZEROS (mode))
29938     ix86_sse_copysign_to_positive (res, res, force_reg (mode, operand1), mask);
29939
29940   emit_label (label);
29941   LABEL_NUSES (label) = 1;
29942
29943   emit_move_insn (operand0, res);
29944 }
29945
29946 /* Expand SSE sequence for computing round from OPERAND1 storing
29947    into OPERAND0.  Sequence that works without relying on DImode truncation
29948    via cvttsd2siq that is only available on 64bit targets.  */
29949 void
29950 ix86_expand_rounddf_32 (rtx operand0, rtx operand1)
29951 {
29952   /* C code for the stuff we expand below.
29953         double xa = fabs (x), xa2, x2;
29954         if (!isless (xa, TWO52))
29955           return x;
29956      Using the absolute value and copying back sign makes
29957      -0.0 -> -0.0 correct.
29958         xa2 = xa + TWO52 - TWO52;
29959      Compensate.
29960         dxa = xa2 - xa;
29961         if (dxa <= -0.5)
29962           xa2 += 1;
29963         else if (dxa > 0.5)
29964           xa2 -= 1;
29965         x2 = copysign (xa2, x);
29966         return x2;
29967    */
29968   enum machine_mode mode = GET_MODE (operand0);
29969   rtx xa, xa2, dxa, TWO52, tmp, label, half, mhalf, one, res, mask;
29970
29971   TWO52 = ix86_gen_TWO52 (mode);
29972
29973   /* Temporary for holding the result, initialized to the input
29974      operand to ease control flow.  */
29975   res = gen_reg_rtx (mode);
29976   emit_move_insn (res, operand1);
29977
29978   /* xa = abs (operand1) */
29979   xa = ix86_expand_sse_fabs (res, &mask);
29980
29981   /* if (!isless (xa, TWO52)) goto label; */
29982   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
29983
29984   /* xa2 = xa + TWO52 - TWO52; */
29985   xa2 = expand_simple_binop (mode, PLUS, xa, TWO52, NULL_RTX, 0, OPTAB_DIRECT);
29986   xa2 = expand_simple_binop (mode, MINUS, xa2, TWO52, xa2, 0, OPTAB_DIRECT);
29987
29988   /* dxa = xa2 - xa; */
29989   dxa = expand_simple_binop (mode, MINUS, xa2, xa, NULL_RTX, 0, OPTAB_DIRECT);
29990
29991   /* generate 0.5, 1.0 and -0.5 */
29992   half = force_reg (mode, const_double_from_real_value (dconsthalf, mode));
29993   one = expand_simple_binop (mode, PLUS, half, half, NULL_RTX, 0, OPTAB_DIRECT);
29994   mhalf = expand_simple_binop (mode, MINUS, half, one, NULL_RTX,
29995                                0, OPTAB_DIRECT);
29996
29997   /* Compensate.  */
29998   tmp = gen_reg_rtx (mode);
29999   /* xa2 = xa2 - (dxa > 0.5 ? 1 : 0) */
30000   tmp = ix86_expand_sse_compare_mask (UNGT, dxa, half, false);
30001   emit_insn (gen_rtx_SET (VOIDmode, tmp,
30002                           gen_rtx_AND (mode, one, tmp)));
30003   xa2 = expand_simple_binop (mode, MINUS, xa2, tmp, NULL_RTX, 0, OPTAB_DIRECT);
30004   /* xa2 = xa2 + (dxa <= -0.5 ? 1 : 0) */
30005   tmp = ix86_expand_sse_compare_mask (UNGE, mhalf, dxa, false);
30006   emit_insn (gen_rtx_SET (VOIDmode, tmp,
30007                           gen_rtx_AND (mode, one, tmp)));
30008   xa2 = expand_simple_binop (mode, PLUS, xa2, tmp, NULL_RTX, 0, OPTAB_DIRECT);
30009
30010   /* res = copysign (xa2, operand1) */
30011   ix86_sse_copysign_to_positive (res, xa2, force_reg (mode, operand1), mask);
30012
30013   emit_label (label);
30014   LABEL_NUSES (label) = 1;
30015
30016   emit_move_insn (operand0, res);
30017 }
30018
30019 /* Expand SSE sequence for computing trunc from OPERAND1 storing
30020    into OPERAND0.  */
30021 void
30022 ix86_expand_trunc (rtx operand0, rtx operand1)
30023 {
30024   /* C code for SSE variant we expand below.
30025         double xa = fabs (x), x2;
30026         if (!isless (xa, TWO52))
30027           return x;
30028         x2 = (double)(long)x;
30029         if (HONOR_SIGNED_ZEROS (mode))
30030           return copysign (x2, x);
30031         return x2;
30032    */
30033   enum machine_mode mode = GET_MODE (operand0);
30034   rtx xa, xi, TWO52, label, res, mask;
30035
30036   TWO52 = ix86_gen_TWO52 (mode);
30037
30038   /* Temporary for holding the result, initialized to the input
30039      operand to ease control flow.  */
30040   res = gen_reg_rtx (mode);
30041   emit_move_insn (res, operand1);
30042
30043   /* xa = abs (operand1) */
30044   xa = ix86_expand_sse_fabs (res, &mask);
30045
30046   /* if (!isless (xa, TWO52)) goto label; */
30047   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
30048
30049   /* x = (double)(long)x */
30050   xi = gen_reg_rtx (mode == DFmode ? DImode : SImode);
30051   expand_fix (xi, res, 0);
30052   expand_float (res, xi, 0);
30053
30054   if (HONOR_SIGNED_ZEROS (mode))
30055     ix86_sse_copysign_to_positive (res, res, force_reg (mode, operand1), mask);
30056
30057   emit_label (label);
30058   LABEL_NUSES (label) = 1;
30059
30060   emit_move_insn (operand0, res);
30061 }
30062
30063 /* Expand SSE sequence for computing trunc from OPERAND1 storing
30064    into OPERAND0.  */
30065 void
30066 ix86_expand_truncdf_32 (rtx operand0, rtx operand1)
30067 {
30068   enum machine_mode mode = GET_MODE (operand0);
30069   rtx xa, mask, TWO52, label, one, res, smask, tmp;
30070
30071   /* C code for SSE variant we expand below.
30072         double xa = fabs (x), x2;
30073         if (!isless (xa, TWO52))
30074           return x;
30075         xa2 = xa + TWO52 - TWO52;
30076      Compensate:
30077         if (xa2 > xa)
30078           xa2 -= 1.0;
30079         x2 = copysign (xa2, x);
30080         return x2;
30081    */
30082
30083   TWO52 = ix86_gen_TWO52 (mode);
30084
30085   /* Temporary for holding the result, initialized to the input
30086      operand to ease control flow.  */
30087   res = gen_reg_rtx (mode);
30088   emit_move_insn (res, operand1);
30089
30090   /* xa = abs (operand1) */
30091   xa = ix86_expand_sse_fabs (res, &smask);
30092
30093   /* if (!isless (xa, TWO52)) goto label; */
30094   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
30095
30096   /* res = xa + TWO52 - TWO52; */
30097   tmp = expand_simple_binop (mode, PLUS, xa, TWO52, NULL_RTX, 0, OPTAB_DIRECT);
30098   tmp = expand_simple_binop (mode, MINUS, tmp, TWO52, tmp, 0, OPTAB_DIRECT);
30099   emit_move_insn (res, tmp);
30100
30101   /* generate 1.0 */
30102   one = force_reg (mode, const_double_from_real_value (dconst1, mode));
30103
30104   /* Compensate: res = xa2 - (res > xa ? 1 : 0)  */
30105   mask = ix86_expand_sse_compare_mask (UNGT, res, xa, false);
30106   emit_insn (gen_rtx_SET (VOIDmode, mask,
30107                           gen_rtx_AND (mode, mask, one)));
30108   tmp = expand_simple_binop (mode, MINUS,
30109                              res, mask, NULL_RTX, 0, OPTAB_DIRECT);
30110   emit_move_insn (res, tmp);
30111
30112   /* res = copysign (res, operand1) */
30113   ix86_sse_copysign_to_positive (res, res, force_reg (mode, operand1), smask);
30114
30115   emit_label (label);
30116   LABEL_NUSES (label) = 1;
30117
30118   emit_move_insn (operand0, res);
30119 }
30120
30121 /* Expand SSE sequence for computing round from OPERAND1 storing
30122    into OPERAND0.  */
30123 void
30124 ix86_expand_round (rtx operand0, rtx operand1)
30125 {
30126   /* C code for the stuff we're doing below:
30127         double xa = fabs (x);
30128         if (!isless (xa, TWO52))
30129           return x;
30130         xa = (double)(long)(xa + nextafter (0.5, 0.0));
30131         return copysign (xa, x);
30132    */
30133   enum machine_mode mode = GET_MODE (operand0);
30134   rtx res, TWO52, xa, label, xi, half, mask;
30135   const struct real_format *fmt;
30136   REAL_VALUE_TYPE pred_half, half_minus_pred_half;
30137
30138   /* Temporary for holding the result, initialized to the input
30139      operand to ease control flow.  */
30140   res = gen_reg_rtx (mode);
30141   emit_move_insn (res, operand1);
30142
30143   TWO52 = ix86_gen_TWO52 (mode);
30144   xa = ix86_expand_sse_fabs (res, &mask);
30145   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
30146
30147   /* load nextafter (0.5, 0.0) */
30148   fmt = REAL_MODE_FORMAT (mode);
30149   real_2expN (&half_minus_pred_half, -(fmt->p) - 1, mode);
30150   REAL_ARITHMETIC (pred_half, MINUS_EXPR, dconsthalf, half_minus_pred_half);
30151
30152   /* xa = xa + 0.5 */
30153   half = force_reg (mode, const_double_from_real_value (pred_half, mode));
30154   xa = expand_simple_binop (mode, PLUS, xa, half, NULL_RTX, 0, OPTAB_DIRECT);
30155
30156   /* xa = (double)(int64_t)xa */
30157   xi = gen_reg_rtx (mode == DFmode ? DImode : SImode);
30158   expand_fix (xi, xa, 0);
30159   expand_float (xa, xi, 0);
30160
30161   /* res = copysign (xa, operand1) */
30162   ix86_sse_copysign_to_positive (res, xa, force_reg (mode, operand1), mask);
30163
30164   emit_label (label);
30165   LABEL_NUSES (label) = 1;
30166
30167   emit_move_insn (operand0, res);
30168 }
30169 \f
30170 /* Validate whether a FMA4 instruction is valid or not.
30171    OPERANDS is the array of operands.
30172    NUM is the number of operands.
30173    USES_OC0 is true if the instruction uses OC0 and provides 4 variants.
30174    NUM_MEMORY is the maximum number of memory operands to accept.
30175    NUM_MEMORY less than zero is a special case to allow an operand
30176    of an instruction to be memory operation.
30177    when COMMUTATIVE is set, operand 1 and 2 can be swapped.  */
30178
30179 bool
30180 ix86_fma4_valid_op_p (rtx operands[], rtx insn ATTRIBUTE_UNUSED, int num,
30181                       bool uses_oc0, int num_memory, bool commutative)
30182 {
30183   int mem_mask;
30184   int mem_count;
30185   int i;
30186
30187   /* Count the number of memory arguments */
30188   mem_mask = 0;
30189   mem_count = 0;
30190   for (i = 0; i < num; i++)
30191     {
30192       enum machine_mode mode = GET_MODE (operands[i]);
30193       if (register_operand (operands[i], mode))
30194         ;
30195
30196       else if (memory_operand (operands[i], mode))
30197         {
30198           mem_mask |= (1 << i);
30199           mem_count++;
30200         }
30201
30202       else
30203         {
30204           rtx pattern = PATTERN (insn);
30205
30206           /* allow 0 for pcmov */
30207           if (GET_CODE (pattern) != SET
30208               || GET_CODE (SET_SRC (pattern)) != IF_THEN_ELSE
30209               || i < 2
30210               || operands[i] != CONST0_RTX (mode))
30211             return false;
30212         }
30213     }
30214
30215   /* Special case pmacsdq{l,h} where we allow the 3rd argument to be
30216      a memory operation.  */
30217   if (num_memory < 0)
30218     {
30219       num_memory = -num_memory;
30220       if ((mem_mask & (1 << (num-1))) != 0)
30221         {
30222           mem_mask &= ~(1 << (num-1));
30223           mem_count--;
30224         }
30225     }
30226
30227   /* If there were no memory operations, allow the insn */
30228   if (mem_mask == 0)
30229     return true;
30230
30231   /* Do not allow the destination register to be a memory operand.  */
30232   else if (mem_mask & (1 << 0))
30233     return false;
30234
30235   /* If there are too many memory operations, disallow the instruction.  While
30236      the hardware only allows 1 memory reference, before register allocation
30237      for some insns, we allow two memory operations sometimes in order to allow
30238      code like the following to be optimized:
30239
30240         float fmadd (float *a, float *b, float *c) { return (*a * *b) + *c; }
30241
30242     or similar cases that are vectorized into using the vfmaddss
30243     instruction.  */
30244   else if (mem_count > num_memory)
30245     return false;
30246
30247   /* Don't allow more than one memory operation if not optimizing.  */
30248   else if (mem_count > 1 && !optimize)
30249     return false;
30250
30251   else if (num == 4 && mem_count == 1)
30252     {
30253       /* formats (destination is the first argument), example vfmaddss:
30254          xmm1, xmm1, xmm2, xmm3/mem
30255          xmm1, xmm1, xmm2/mem, xmm3
30256          xmm1, xmm2, xmm3/mem, xmm1
30257          xmm1, xmm2/mem, xmm3, xmm1 */
30258       if (uses_oc0)
30259         return ((mem_mask == (1 << 1))
30260                 || (mem_mask == (1 << 2))
30261                 || (mem_mask == (1 << 3)));
30262
30263       /* format, example vpmacsdd:
30264          xmm1, xmm2, xmm3/mem, xmm1 */
30265       if (commutative)
30266         return (mem_mask == (1 << 2) || mem_mask == (1 << 1));
30267       else
30268         return (mem_mask == (1 << 2));
30269     }
30270
30271   else if (num == 4 && num_memory == 2)
30272     {
30273       /* If there are two memory operations, we can load one of the memory ops
30274          into the destination register.  This is for optimizing the
30275          multiply/add ops, which the combiner has optimized both the multiply
30276          and the add insns to have a memory operation.  We have to be careful
30277          that the destination doesn't overlap with the inputs.  */
30278       rtx op0 = operands[0];
30279
30280       if (reg_mentioned_p (op0, operands[1])
30281           || reg_mentioned_p (op0, operands[2])
30282           || reg_mentioned_p (op0, operands[3]))
30283         return false;
30284
30285       /* formats (destination is the first argument), example vfmaddss:
30286          xmm1, xmm1, xmm2, xmm3/mem
30287          xmm1, xmm1, xmm2/mem, xmm3
30288          xmm1, xmm2, xmm3/mem, xmm1
30289          xmm1, xmm2/mem, xmm3, xmm1
30290
30291          For the oc0 case, we will load either operands[1] or operands[3] into
30292          operands[0], so any combination of 2 memory operands is ok.  */
30293       if (uses_oc0)
30294         return true;
30295
30296       /* format, example vpmacsdd:
30297          xmm1, xmm2, xmm3/mem, xmm1
30298
30299          For the integer multiply/add instructions be more restrictive and
30300          require operands[2] and operands[3] to be the memory operands.  */
30301       if (commutative)
30302         return (mem_mask == ((1 << 1) | (1 << 3)) || ((1 << 2) | (1 << 3)));
30303       else
30304         return (mem_mask == ((1 << 2) | (1 << 3)));
30305     }
30306
30307   else if (num == 3 && num_memory == 1)
30308     {
30309       /* formats, example vprotb:
30310          xmm1, xmm2, xmm3/mem
30311          xmm1, xmm2/mem, xmm3 */
30312       if (uses_oc0)
30313         return ((mem_mask == (1 << 1)) || (mem_mask == (1 << 2)));
30314
30315       /* format, example vpcomeq:
30316          xmm1, xmm2, xmm3/mem */
30317       else
30318         return (mem_mask == (1 << 2));
30319     }
30320
30321   else
30322     gcc_unreachable ();
30323
30324   return false;
30325 }
30326
30327
30328 /* Fixup an FMA4 instruction that has 2 memory input references into a form the
30329    hardware will allow by using the destination register to load one of the
30330    memory operations.  Presently this is used by the multiply/add routines to
30331    allow 2 memory references.  */
30332
30333 void
30334 ix86_expand_fma4_multiple_memory (rtx operands[],
30335                                   int num,
30336                                   enum machine_mode mode)
30337 {
30338   rtx op0 = operands[0];
30339   if (num != 4
30340       || memory_operand (op0, mode)
30341       || reg_mentioned_p (op0, operands[1])
30342       || reg_mentioned_p (op0, operands[2])
30343       || reg_mentioned_p (op0, operands[3]))
30344     gcc_unreachable ();
30345
30346   /* For 2 memory operands, pick either operands[1] or operands[3] to move into
30347      the destination register.  */
30348   if (memory_operand (operands[1], mode))
30349     {
30350       emit_move_insn (op0, operands[1]);
30351       operands[1] = op0;
30352     }
30353   else if (memory_operand (operands[3], mode))
30354     {
30355       emit_move_insn (op0, operands[3]);
30356       operands[3] = op0;
30357     }
30358   else
30359     gcc_unreachable ();
30360
30361   return;
30362 }
30363
30364 /* Table of valid machine attributes.  */
30365 static const struct attribute_spec ix86_attribute_table[] =
30366 {
30367   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
30368   /* Stdcall attribute says callee is responsible for popping arguments
30369      if they are not variable.  */
30370   { "stdcall",   0, 0, false, true,  true,  ix86_handle_cconv_attribute },
30371   /* Fastcall attribute says callee is responsible for popping arguments
30372      if they are not variable.  */
30373   { "fastcall",  0, 0, false, true,  true,  ix86_handle_cconv_attribute },
30374   /* Cdecl attribute says the callee is a normal C declaration */
30375   { "cdecl",     0, 0, false, true,  true,  ix86_handle_cconv_attribute },
30376   /* Regparm attribute specifies how many integer arguments are to be
30377      passed in registers.  */
30378   { "regparm",   1, 1, false, true,  true,  ix86_handle_cconv_attribute },
30379   /* Sseregparm attribute says we are using x86_64 calling conventions
30380      for FP arguments.  */
30381   { "sseregparm", 0, 0, false, true, true, ix86_handle_cconv_attribute },
30382   /* force_align_arg_pointer says this function realigns the stack at entry.  */
30383   { (const char *)&ix86_force_align_arg_pointer_string, 0, 0,
30384     false, true,  true, ix86_handle_cconv_attribute },
30385 #if TARGET_DLLIMPORT_DECL_ATTRIBUTES
30386   { "dllimport", 0, 0, false, false, false, handle_dll_attribute },
30387   { "dllexport", 0, 0, false, false, false, handle_dll_attribute },
30388   { "shared",    0, 0, true,  false, false, ix86_handle_shared_attribute },
30389 #endif
30390   { "ms_struct", 0, 0, false, false,  false, ix86_handle_struct_attribute },
30391   { "gcc_struct", 0, 0, false, false,  false, ix86_handle_struct_attribute },
30392 #ifdef SUBTARGET_ATTRIBUTE_TABLE
30393   SUBTARGET_ATTRIBUTE_TABLE,
30394 #endif
30395   /* ms_abi and sysv_abi calling convention function attributes.  */
30396   { "ms_abi", 0, 0, false, true, true, ix86_handle_abi_attribute },
30397   { "sysv_abi", 0, 0, false, true, true, ix86_handle_abi_attribute },
30398   { "ms_hook_prologue", 0, 0, true, false, false, ix86_handle_fndecl_attribute },
30399   /* End element.  */
30400   { NULL,        0, 0, false, false, false, NULL }
30401 };
30402
30403 /* Implement targetm.vectorize.builtin_vectorization_cost.  */
30404 static int
30405 x86_builtin_vectorization_cost (bool runtime_test)
30406 {
30407   /* If the branch of the runtime test is taken - i.e. - the vectorized
30408      version is skipped - this incurs a misprediction cost (because the
30409      vectorized version is expected to be the fall-through).  So we subtract
30410      the latency of a mispredicted branch from the costs that are incured
30411      when the vectorized version is executed.
30412
30413      TODO: The values in individual target tables have to be tuned or new
30414      fields may be needed. For eg. on K8, the default branch path is the
30415      not-taken path. If the taken path is predicted correctly, the minimum
30416      penalty of going down the taken-path is 1 cycle. If the taken-path is
30417      not predicted correctly, then the minimum penalty is 10 cycles.  */
30418
30419   if (runtime_test)
30420     {
30421       return (-(ix86_cost->cond_taken_branch_cost));
30422     }
30423   else
30424     return 0;
30425 }
30426
30427 /* This function returns the calling abi specific va_list type node.
30428    It returns  the FNDECL specific va_list type.  */
30429
30430 tree
30431 ix86_fn_abi_va_list (tree fndecl)
30432 {
30433   if (!TARGET_64BIT)
30434     return va_list_type_node;
30435   gcc_assert (fndecl != NULL_TREE);
30436
30437   if (ix86_function_abi ((const_tree) fndecl) == MS_ABI)
30438     return ms_va_list_type_node;
30439   else
30440     return sysv_va_list_type_node;
30441 }
30442
30443 /* Returns the canonical va_list type specified by TYPE. If there
30444    is no valid TYPE provided, it return NULL_TREE.  */
30445
30446 tree
30447 ix86_canonical_va_list_type (tree type)
30448 {
30449   tree wtype, htype;
30450
30451   /* Resolve references and pointers to va_list type.  */
30452   if (INDIRECT_REF_P (type))
30453     type = TREE_TYPE (type);
30454   else if (POINTER_TYPE_P (type) && POINTER_TYPE_P (TREE_TYPE(type)))
30455     type = TREE_TYPE (type);
30456
30457   if (TARGET_64BIT)
30458     {
30459       wtype = va_list_type_node;
30460           gcc_assert (wtype != NULL_TREE);
30461       htype = type;
30462       if (TREE_CODE (wtype) == ARRAY_TYPE)
30463         {
30464           /* If va_list is an array type, the argument may have decayed
30465              to a pointer type, e.g. by being passed to another function.
30466              In that case, unwrap both types so that we can compare the
30467              underlying records.  */
30468           if (TREE_CODE (htype) == ARRAY_TYPE
30469               || POINTER_TYPE_P (htype))
30470             {
30471               wtype = TREE_TYPE (wtype);
30472               htype = TREE_TYPE (htype);
30473             }
30474         }
30475       if (TYPE_MAIN_VARIANT (wtype) == TYPE_MAIN_VARIANT (htype))
30476         return va_list_type_node;
30477       wtype = sysv_va_list_type_node;
30478           gcc_assert (wtype != NULL_TREE);
30479       htype = type;
30480       if (TREE_CODE (wtype) == ARRAY_TYPE)
30481         {
30482           /* If va_list is an array type, the argument may have decayed
30483              to a pointer type, e.g. by being passed to another function.
30484              In that case, unwrap both types so that we can compare the
30485              underlying records.  */
30486           if (TREE_CODE (htype) == ARRAY_TYPE
30487               || POINTER_TYPE_P (htype))
30488             {
30489               wtype = TREE_TYPE (wtype);
30490               htype = TREE_TYPE (htype);
30491             }
30492         }
30493       if (TYPE_MAIN_VARIANT (wtype) == TYPE_MAIN_VARIANT (htype))
30494         return sysv_va_list_type_node;
30495       wtype = ms_va_list_type_node;
30496           gcc_assert (wtype != NULL_TREE);
30497       htype = type;
30498       if (TREE_CODE (wtype) == ARRAY_TYPE)
30499         {
30500           /* If va_list is an array type, the argument may have decayed
30501              to a pointer type, e.g. by being passed to another function.
30502              In that case, unwrap both types so that we can compare the
30503              underlying records.  */
30504           if (TREE_CODE (htype) == ARRAY_TYPE
30505               || POINTER_TYPE_P (htype))
30506             {
30507               wtype = TREE_TYPE (wtype);
30508               htype = TREE_TYPE (htype);
30509             }
30510         }
30511       if (TYPE_MAIN_VARIANT (wtype) == TYPE_MAIN_VARIANT (htype))
30512         return ms_va_list_type_node;
30513       return NULL_TREE;
30514     }
30515   return std_canonical_va_list_type (type);
30516 }
30517
30518 /* Iterate through the target-specific builtin types for va_list.
30519     IDX denotes the iterator, *PTREE is set to the result type of
30520     the va_list builtin, and *PNAME to its internal type.
30521     Returns zero if there is no element for this index, otherwise
30522     IDX should be increased upon the next call.
30523     Note, do not iterate a base builtin's name like __builtin_va_list.
30524     Used from c_common_nodes_and_builtins.  */
30525
30526 int
30527 ix86_enum_va_list (int idx, const char **pname, tree *ptree)
30528 {
30529   if (!TARGET_64BIT)
30530     return 0;
30531   switch (idx) {
30532   case 0:
30533     *ptree = ms_va_list_type_node;
30534     *pname = "__builtin_ms_va_list";
30535     break;
30536   case 1:
30537     *ptree = sysv_va_list_type_node;
30538     *pname = "__builtin_sysv_va_list";
30539     break;
30540   default:
30541     return 0;
30542   }
30543   return 1;
30544 }
30545
30546 /* Initialize the GCC target structure.  */
30547 #undef TARGET_RETURN_IN_MEMORY
30548 #define TARGET_RETURN_IN_MEMORY ix86_return_in_memory
30549
30550 #undef TARGET_LEGITIMIZE_ADDRESS
30551 #define TARGET_LEGITIMIZE_ADDRESS ix86_legitimize_address
30552
30553 #undef TARGET_ATTRIBUTE_TABLE
30554 #define TARGET_ATTRIBUTE_TABLE ix86_attribute_table
30555 #if TARGET_DLLIMPORT_DECL_ATTRIBUTES
30556 #  undef TARGET_MERGE_DECL_ATTRIBUTES
30557 #  define TARGET_MERGE_DECL_ATTRIBUTES merge_dllimport_decl_attributes
30558 #endif
30559
30560 #undef TARGET_COMP_TYPE_ATTRIBUTES
30561 #define TARGET_COMP_TYPE_ATTRIBUTES ix86_comp_type_attributes
30562
30563 #undef TARGET_INIT_BUILTINS
30564 #define TARGET_INIT_BUILTINS ix86_init_builtins
30565 #undef TARGET_BUILTIN_DECL
30566 #define TARGET_BUILTIN_DECL ix86_builtin_decl
30567 #undef TARGET_EXPAND_BUILTIN
30568 #define TARGET_EXPAND_BUILTIN ix86_expand_builtin
30569
30570 #undef TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION
30571 #define TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION \
30572   ix86_builtin_vectorized_function
30573
30574 #undef TARGET_VECTORIZE_BUILTIN_CONVERSION
30575 #define TARGET_VECTORIZE_BUILTIN_CONVERSION ix86_vectorize_builtin_conversion
30576
30577 #undef TARGET_BUILTIN_RECIPROCAL
30578 #define TARGET_BUILTIN_RECIPROCAL ix86_builtin_reciprocal
30579
30580 #undef TARGET_ASM_FUNCTION_EPILOGUE
30581 #define TARGET_ASM_FUNCTION_EPILOGUE ix86_output_function_epilogue
30582
30583 #undef TARGET_ENCODE_SECTION_INFO
30584 #ifndef SUBTARGET_ENCODE_SECTION_INFO
30585 #define TARGET_ENCODE_SECTION_INFO ix86_encode_section_info
30586 #else
30587 #define TARGET_ENCODE_SECTION_INFO SUBTARGET_ENCODE_SECTION_INFO
30588 #endif
30589
30590 #undef TARGET_ASM_OPEN_PAREN
30591 #define TARGET_ASM_OPEN_PAREN ""
30592 #undef TARGET_ASM_CLOSE_PAREN
30593 #define TARGET_ASM_CLOSE_PAREN ""
30594
30595 #undef TARGET_ASM_BYTE_OP
30596 #define TARGET_ASM_BYTE_OP ASM_BYTE
30597
30598 #undef TARGET_ASM_ALIGNED_HI_OP
30599 #define TARGET_ASM_ALIGNED_HI_OP ASM_SHORT
30600 #undef TARGET_ASM_ALIGNED_SI_OP
30601 #define TARGET_ASM_ALIGNED_SI_OP ASM_LONG
30602 #ifdef ASM_QUAD
30603 #undef TARGET_ASM_ALIGNED_DI_OP
30604 #define TARGET_ASM_ALIGNED_DI_OP ASM_QUAD
30605 #endif
30606
30607 #undef TARGET_ASM_UNALIGNED_HI_OP
30608 #define TARGET_ASM_UNALIGNED_HI_OP TARGET_ASM_ALIGNED_HI_OP
30609 #undef TARGET_ASM_UNALIGNED_SI_OP
30610 #define TARGET_ASM_UNALIGNED_SI_OP TARGET_ASM_ALIGNED_SI_OP
30611 #undef TARGET_ASM_UNALIGNED_DI_OP
30612 #define TARGET_ASM_UNALIGNED_DI_OP TARGET_ASM_ALIGNED_DI_OP
30613
30614 #undef TARGET_SCHED_ADJUST_COST
30615 #define TARGET_SCHED_ADJUST_COST ix86_adjust_cost
30616 #undef TARGET_SCHED_ISSUE_RATE
30617 #define TARGET_SCHED_ISSUE_RATE ix86_issue_rate
30618 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
30619 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD \
30620   ia32_multipass_dfa_lookahead
30621
30622 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
30623 #define TARGET_FUNCTION_OK_FOR_SIBCALL ix86_function_ok_for_sibcall
30624
30625 #ifdef HAVE_AS_TLS
30626 #undef TARGET_HAVE_TLS
30627 #define TARGET_HAVE_TLS true
30628 #endif
30629 #undef TARGET_CANNOT_FORCE_CONST_MEM
30630 #define TARGET_CANNOT_FORCE_CONST_MEM ix86_cannot_force_const_mem
30631 #undef TARGET_USE_BLOCKS_FOR_CONSTANT_P
30632 #define TARGET_USE_BLOCKS_FOR_CONSTANT_P hook_bool_mode_const_rtx_true
30633
30634 #undef TARGET_DELEGITIMIZE_ADDRESS
30635 #define TARGET_DELEGITIMIZE_ADDRESS ix86_delegitimize_address
30636
30637 #undef TARGET_MS_BITFIELD_LAYOUT_P
30638 #define TARGET_MS_BITFIELD_LAYOUT_P ix86_ms_bitfield_layout_p
30639
30640 #if TARGET_MACHO
30641 #undef TARGET_BINDS_LOCAL_P
30642 #define TARGET_BINDS_LOCAL_P darwin_binds_local_p
30643 #endif
30644 #if TARGET_DLLIMPORT_DECL_ATTRIBUTES
30645 #undef TARGET_BINDS_LOCAL_P
30646 #define TARGET_BINDS_LOCAL_P i386_pe_binds_local_p
30647 #endif
30648
30649 #undef TARGET_ASM_OUTPUT_MI_THUNK
30650 #define TARGET_ASM_OUTPUT_MI_THUNK x86_output_mi_thunk
30651 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
30652 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK x86_can_output_mi_thunk
30653
30654 #undef TARGET_ASM_FILE_START
30655 #define TARGET_ASM_FILE_START x86_file_start
30656
30657 #undef TARGET_DEFAULT_TARGET_FLAGS
30658 #define TARGET_DEFAULT_TARGET_FLAGS     \
30659   (TARGET_DEFAULT                       \
30660    | TARGET_SUBTARGET_DEFAULT           \
30661    | TARGET_TLS_DIRECT_SEG_REFS_DEFAULT)
30662
30663 #undef TARGET_HANDLE_OPTION
30664 #define TARGET_HANDLE_OPTION ix86_handle_option
30665
30666 #undef TARGET_RTX_COSTS
30667 #define TARGET_RTX_COSTS ix86_rtx_costs
30668 #undef TARGET_ADDRESS_COST
30669 #define TARGET_ADDRESS_COST ix86_address_cost
30670
30671 #undef TARGET_FIXED_CONDITION_CODE_REGS
30672 #define TARGET_FIXED_CONDITION_CODE_REGS ix86_fixed_condition_code_regs
30673 #undef TARGET_CC_MODES_COMPATIBLE
30674 #define TARGET_CC_MODES_COMPATIBLE ix86_cc_modes_compatible
30675
30676 #undef TARGET_MACHINE_DEPENDENT_REORG
30677 #define TARGET_MACHINE_DEPENDENT_REORG ix86_reorg
30678
30679 #undef TARGET_BUILTIN_SETJMP_FRAME_VALUE
30680 #define TARGET_BUILTIN_SETJMP_FRAME_VALUE ix86_builtin_setjmp_frame_value
30681
30682 #undef TARGET_BUILD_BUILTIN_VA_LIST
30683 #define TARGET_BUILD_BUILTIN_VA_LIST ix86_build_builtin_va_list
30684
30685 #undef TARGET_FN_ABI_VA_LIST
30686 #define TARGET_FN_ABI_VA_LIST ix86_fn_abi_va_list
30687
30688 #undef TARGET_CANONICAL_VA_LIST_TYPE
30689 #define TARGET_CANONICAL_VA_LIST_TYPE ix86_canonical_va_list_type
30690
30691 #undef TARGET_EXPAND_BUILTIN_VA_START
30692 #define TARGET_EXPAND_BUILTIN_VA_START ix86_va_start
30693
30694 #undef TARGET_MD_ASM_CLOBBERS
30695 #define TARGET_MD_ASM_CLOBBERS ix86_md_asm_clobbers
30696
30697 #undef TARGET_PROMOTE_PROTOTYPES
30698 #define TARGET_PROMOTE_PROTOTYPES hook_bool_const_tree_true
30699 #undef TARGET_STRUCT_VALUE_RTX
30700 #define TARGET_STRUCT_VALUE_RTX ix86_struct_value_rtx
30701 #undef TARGET_SETUP_INCOMING_VARARGS
30702 #define TARGET_SETUP_INCOMING_VARARGS ix86_setup_incoming_varargs
30703 #undef TARGET_MUST_PASS_IN_STACK
30704 #define TARGET_MUST_PASS_IN_STACK ix86_must_pass_in_stack
30705 #undef TARGET_PASS_BY_REFERENCE
30706 #define TARGET_PASS_BY_REFERENCE ix86_pass_by_reference
30707 #undef TARGET_INTERNAL_ARG_POINTER
30708 #define TARGET_INTERNAL_ARG_POINTER ix86_internal_arg_pointer
30709 #undef TARGET_UPDATE_STACK_BOUNDARY
30710 #define TARGET_UPDATE_STACK_BOUNDARY ix86_update_stack_boundary
30711 #undef TARGET_GET_DRAP_RTX
30712 #define TARGET_GET_DRAP_RTX ix86_get_drap_rtx
30713 #undef TARGET_STRICT_ARGUMENT_NAMING
30714 #define TARGET_STRICT_ARGUMENT_NAMING hook_bool_CUMULATIVE_ARGS_true
30715 #undef TARGET_STATIC_CHAIN
30716 #define TARGET_STATIC_CHAIN ix86_static_chain
30717 #undef TARGET_TRAMPOLINE_INIT
30718 #define TARGET_TRAMPOLINE_INIT ix86_trampoline_init
30719
30720 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
30721 #define TARGET_GIMPLIFY_VA_ARG_EXPR ix86_gimplify_va_arg
30722
30723 #undef TARGET_SCALAR_MODE_SUPPORTED_P
30724 #define TARGET_SCALAR_MODE_SUPPORTED_P ix86_scalar_mode_supported_p
30725
30726 #undef TARGET_VECTOR_MODE_SUPPORTED_P
30727 #define TARGET_VECTOR_MODE_SUPPORTED_P ix86_vector_mode_supported_p
30728
30729 #undef TARGET_C_MODE_FOR_SUFFIX
30730 #define TARGET_C_MODE_FOR_SUFFIX ix86_c_mode_for_suffix
30731
30732 #ifdef HAVE_AS_TLS
30733 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
30734 #define TARGET_ASM_OUTPUT_DWARF_DTPREL i386_output_dwarf_dtprel
30735 #endif
30736
30737 #ifdef SUBTARGET_INSERT_ATTRIBUTES
30738 #undef TARGET_INSERT_ATTRIBUTES
30739 #define TARGET_INSERT_ATTRIBUTES SUBTARGET_INSERT_ATTRIBUTES
30740 #endif
30741
30742 #undef TARGET_MANGLE_TYPE
30743 #define TARGET_MANGLE_TYPE ix86_mangle_type
30744
30745 #undef TARGET_STACK_PROTECT_FAIL
30746 #define TARGET_STACK_PROTECT_FAIL ix86_stack_protect_fail
30747
30748 #undef TARGET_FUNCTION_VALUE
30749 #define TARGET_FUNCTION_VALUE ix86_function_value
30750
30751 #undef TARGET_SECONDARY_RELOAD
30752 #define TARGET_SECONDARY_RELOAD ix86_secondary_reload
30753
30754 #undef TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST
30755 #define TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST x86_builtin_vectorization_cost
30756
30757 #undef TARGET_SET_CURRENT_FUNCTION
30758 #define TARGET_SET_CURRENT_FUNCTION ix86_set_current_function
30759
30760 #undef TARGET_OPTION_VALID_ATTRIBUTE_P
30761 #define TARGET_OPTION_VALID_ATTRIBUTE_P ix86_valid_target_attribute_p
30762
30763 #undef TARGET_OPTION_SAVE
30764 #define TARGET_OPTION_SAVE ix86_function_specific_save
30765
30766 #undef TARGET_OPTION_RESTORE
30767 #define TARGET_OPTION_RESTORE ix86_function_specific_restore
30768
30769 #undef TARGET_OPTION_PRINT
30770 #define TARGET_OPTION_PRINT ix86_function_specific_print
30771
30772 #undef TARGET_CAN_INLINE_P
30773 #define TARGET_CAN_INLINE_P ix86_can_inline_p
30774
30775 #undef TARGET_EXPAND_TO_RTL_HOOK
30776 #define TARGET_EXPAND_TO_RTL_HOOK ix86_maybe_switch_abi
30777
30778 #undef TARGET_LEGITIMATE_ADDRESS_P
30779 #define TARGET_LEGITIMATE_ADDRESS_P ix86_legitimate_address_p
30780
30781 #undef TARGET_IRA_COVER_CLASSES
30782 #define TARGET_IRA_COVER_CLASSES i386_ira_cover_classes
30783
30784 #undef TARGET_FRAME_POINTER_REQUIRED
30785 #define TARGET_FRAME_POINTER_REQUIRED ix86_frame_pointer_required
30786
30787 #undef TARGET_CAN_ELIMINATE
30788 #define TARGET_CAN_ELIMINATE ix86_can_eliminate
30789
30790 struct gcc_target targetm = TARGET_INITIALIZER;
30791 \f
30792 #include "gt-i386.h"