OSDN Git Service

* config/i386/i386.c (memory_address_length): Handle %r12
[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
1558 static const unsigned int x86_accumulate_outgoing_args
1559   = m_AMD_MULTIPLE | m_ATOM | m_PENT4 | m_NOCONA | m_PPRO | m_CORE2
1560     | m_GENERIC;
1561
1562 static const unsigned int x86_arch_always_fancy_math_387
1563   = m_PENT | m_ATOM | m_PPRO | m_AMD_MULTIPLE | m_PENT4
1564     | m_NOCONA | m_CORE2 | m_GENERIC;
1565
1566 static enum stringop_alg stringop_alg = no_stringop;
1567
1568 /* In case the average insn count for single function invocation is
1569    lower than this constant, emit fast (but longer) prologue and
1570    epilogue code.  */
1571 #define FAST_PROLOGUE_INSN_COUNT 20
1572
1573 /* Names for 8 (low), 8 (high), and 16-bit registers, respectively.  */
1574 static const char *const qi_reg_name[] = QI_REGISTER_NAMES;
1575 static const char *const qi_high_reg_name[] = QI_HIGH_REGISTER_NAMES;
1576 static const char *const hi_reg_name[] = HI_REGISTER_NAMES;
1577
1578 /* Array of the smallest class containing reg number REGNO, indexed by
1579    REGNO.  Used by REGNO_REG_CLASS in i386.h.  */
1580
1581 enum reg_class const regclass_map[FIRST_PSEUDO_REGISTER] =
1582 {
1583   /* ax, dx, cx, bx */
1584   AREG, DREG, CREG, BREG,
1585   /* si, di, bp, sp */
1586   SIREG, DIREG, NON_Q_REGS, NON_Q_REGS,
1587   /* FP registers */
1588   FP_TOP_REG, FP_SECOND_REG, FLOAT_REGS, FLOAT_REGS,
1589   FLOAT_REGS, FLOAT_REGS, FLOAT_REGS, FLOAT_REGS,
1590   /* arg pointer */
1591   NON_Q_REGS,
1592   /* flags, fpsr, fpcr, frame */
1593   NO_REGS, NO_REGS, NO_REGS, NON_Q_REGS,
1594   /* SSE registers */
1595   SSE_FIRST_REG, SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS,
1596   SSE_REGS, SSE_REGS,
1597   /* MMX registers */
1598   MMX_REGS, MMX_REGS, MMX_REGS, MMX_REGS, MMX_REGS, MMX_REGS,
1599   MMX_REGS, MMX_REGS,
1600   /* REX registers */
1601   NON_Q_REGS, NON_Q_REGS, NON_Q_REGS, NON_Q_REGS,
1602   NON_Q_REGS, NON_Q_REGS, NON_Q_REGS, NON_Q_REGS,
1603   /* SSE REX registers */
1604   SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS,
1605   SSE_REGS, SSE_REGS,
1606 };
1607
1608 /* The "default" register map used in 32bit mode.  */
1609
1610 int const dbx_register_map[FIRST_PSEUDO_REGISTER] =
1611 {
1612   0, 2, 1, 3, 6, 7, 4, 5,               /* general regs */
1613   12, 13, 14, 15, 16, 17, 18, 19,       /* fp regs */
1614   -1, -1, -1, -1, -1,                   /* arg, flags, fpsr, fpcr, frame */
1615   21, 22, 23, 24, 25, 26, 27, 28,       /* SSE */
1616   29, 30, 31, 32, 33, 34, 35, 36,       /* MMX */
1617   -1, -1, -1, -1, -1, -1, -1, -1,       /* extended integer registers */
1618   -1, -1, -1, -1, -1, -1, -1, -1,       /* extended SSE registers */
1619 };
1620
1621 /* The "default" register map used in 64bit mode.  */
1622
1623 int const dbx64_register_map[FIRST_PSEUDO_REGISTER] =
1624 {
1625   0, 1, 2, 3, 4, 5, 6, 7,               /* general regs */
1626   33, 34, 35, 36, 37, 38, 39, 40,       /* fp regs */
1627   -1, -1, -1, -1, -1,                   /* arg, flags, fpsr, fpcr, frame */
1628   17, 18, 19, 20, 21, 22, 23, 24,       /* SSE */
1629   41, 42, 43, 44, 45, 46, 47, 48,       /* MMX */
1630   8,9,10,11,12,13,14,15,                /* extended integer registers */
1631   25, 26, 27, 28, 29, 30, 31, 32,       /* extended SSE registers */
1632 };
1633
1634 /* Define the register numbers to be used in Dwarf debugging information.
1635    The SVR4 reference port C compiler uses the following register numbers
1636    in its Dwarf output code:
1637         0 for %eax (gcc regno = 0)
1638         1 for %ecx (gcc regno = 2)
1639         2 for %edx (gcc regno = 1)
1640         3 for %ebx (gcc regno = 3)
1641         4 for %esp (gcc regno = 7)
1642         5 for %ebp (gcc regno = 6)
1643         6 for %esi (gcc regno = 4)
1644         7 for %edi (gcc regno = 5)
1645    The following three DWARF register numbers are never generated by
1646    the SVR4 C compiler or by the GNU compilers, but SDB on x86/svr4
1647    believes these numbers have these meanings.
1648         8  for %eip    (no gcc equivalent)
1649         9  for %eflags (gcc regno = 17)
1650         10 for %trapno (no gcc equivalent)
1651    It is not at all clear how we should number the FP stack registers
1652    for the x86 architecture.  If the version of SDB on x86/svr4 were
1653    a bit less brain dead with respect to floating-point then we would
1654    have a precedent to follow with respect to DWARF register numbers
1655    for x86 FP registers, but the SDB on x86/svr4 is so completely
1656    broken with respect to FP registers that it is hardly worth thinking
1657    of it as something to strive for compatibility with.
1658    The version of x86/svr4 SDB I have at the moment does (partially)
1659    seem to believe that DWARF register number 11 is associated with
1660    the x86 register %st(0), but that's about all.  Higher DWARF
1661    register numbers don't seem to be associated with anything in
1662    particular, and even for DWARF regno 11, SDB only seems to under-
1663    stand that it should say that a variable lives in %st(0) (when
1664    asked via an `=' command) if we said it was in DWARF regno 11,
1665    but SDB still prints garbage when asked for the value of the
1666    variable in question (via a `/' command).
1667    (Also note that the labels SDB prints for various FP stack regs
1668    when doing an `x' command are all wrong.)
1669    Note that these problems generally don't affect the native SVR4
1670    C compiler because it doesn't allow the use of -O with -g and
1671    because when it is *not* optimizing, it allocates a memory
1672    location for each floating-point variable, and the memory
1673    location is what gets described in the DWARF AT_location
1674    attribute for the variable in question.
1675    Regardless of the severe mental illness of the x86/svr4 SDB, we
1676    do something sensible here and we use the following DWARF
1677    register numbers.  Note that these are all stack-top-relative
1678    numbers.
1679         11 for %st(0) (gcc regno = 8)
1680         12 for %st(1) (gcc regno = 9)
1681         13 for %st(2) (gcc regno = 10)
1682         14 for %st(3) (gcc regno = 11)
1683         15 for %st(4) (gcc regno = 12)
1684         16 for %st(5) (gcc regno = 13)
1685         17 for %st(6) (gcc regno = 14)
1686         18 for %st(7) (gcc regno = 15)
1687 */
1688 int const svr4_dbx_register_map[FIRST_PSEUDO_REGISTER] =
1689 {
1690   0, 2, 1, 3, 6, 7, 5, 4,               /* general regs */
1691   11, 12, 13, 14, 15, 16, 17, 18,       /* fp regs */
1692   -1, 9, -1, -1, -1,                    /* arg, flags, fpsr, fpcr, frame */
1693   21, 22, 23, 24, 25, 26, 27, 28,       /* SSE registers */
1694   29, 30, 31, 32, 33, 34, 35, 36,       /* MMX registers */
1695   -1, -1, -1, -1, -1, -1, -1, -1,       /* extended integer registers */
1696   -1, -1, -1, -1, -1, -1, -1, -1,       /* extended SSE registers */
1697 };
1698
1699 /* Test and compare insns in i386.md store the information needed to
1700    generate branch and scc insns here.  */
1701
1702 rtx ix86_compare_op0 = NULL_RTX;
1703 rtx ix86_compare_op1 = NULL_RTX;
1704
1705 /* Define parameter passing and return registers.  */
1706
1707 static int const x86_64_int_parameter_registers[6] =
1708 {
1709   DI_REG, SI_REG, DX_REG, CX_REG, R8_REG, R9_REG
1710 };
1711
1712 static int const x86_64_ms_abi_int_parameter_registers[4] =
1713 {
1714   CX_REG, DX_REG, R8_REG, R9_REG
1715 };
1716
1717 static int const x86_64_int_return_registers[4] =
1718 {
1719   AX_REG, DX_REG, DI_REG, SI_REG
1720 };
1721
1722 /* Define the structure for the machine field in struct function.  */
1723
1724 struct GTY(()) stack_local_entry {
1725   unsigned short mode;
1726   unsigned short n;
1727   rtx rtl;
1728   struct stack_local_entry *next;
1729 };
1730
1731 /* Structure describing stack frame layout.
1732    Stack grows downward:
1733
1734    [arguments]
1735                                               <- ARG_POINTER
1736    saved pc
1737
1738    saved frame pointer if frame_pointer_needed
1739                                               <- HARD_FRAME_POINTER
1740    [saved regs]
1741
1742    [padding0]
1743
1744    [saved SSE regs]
1745
1746    [padding1]          \
1747                         )
1748    [va_arg registers]  (
1749                         > to_allocate         <- FRAME_POINTER
1750    [frame]             (
1751                         )
1752    [padding2]          /
1753   */
1754 struct ix86_frame
1755 {
1756   int padding0;
1757   int nsseregs;
1758   int nregs;
1759   int padding1;
1760   int va_arg_size;
1761   HOST_WIDE_INT frame;
1762   int padding2;
1763   int outgoing_arguments_size;
1764   int red_zone_size;
1765
1766   HOST_WIDE_INT to_allocate;
1767   /* The offsets relative to ARG_POINTER.  */
1768   HOST_WIDE_INT frame_pointer_offset;
1769   HOST_WIDE_INT hard_frame_pointer_offset;
1770   HOST_WIDE_INT stack_pointer_offset;
1771
1772   /* When save_regs_using_mov is set, emit prologue using
1773      move instead of push instructions.  */
1774   bool save_regs_using_mov;
1775 };
1776
1777 /* Code model option.  */
1778 enum cmodel ix86_cmodel;
1779 /* Asm dialect.  */
1780 enum asm_dialect ix86_asm_dialect = ASM_ATT;
1781 /* TLS dialects.  */
1782 enum tls_dialect ix86_tls_dialect = TLS_DIALECT_GNU;
1783
1784 /* Which unit we are generating floating point math for.  */
1785 enum fpmath_unit ix86_fpmath;
1786
1787 /* Which cpu are we scheduling for.  */
1788 enum attr_cpu ix86_schedule;
1789
1790 /* Which cpu are we optimizing for.  */
1791 enum processor_type ix86_tune;
1792
1793 /* Which instruction set architecture to use.  */
1794 enum processor_type ix86_arch;
1795
1796 /* true if sse prefetch instruction is not NOOP.  */
1797 int x86_prefetch_sse;
1798
1799 /* ix86_regparm_string as a number */
1800 static int ix86_regparm;
1801
1802 /* -mstackrealign option */
1803 extern int ix86_force_align_arg_pointer;
1804 static const char ix86_force_align_arg_pointer_string[]
1805   = "force_align_arg_pointer";
1806
1807 static rtx (*ix86_gen_leave) (void);
1808 static rtx (*ix86_gen_pop1) (rtx);
1809 static rtx (*ix86_gen_add3) (rtx, rtx, rtx);
1810 static rtx (*ix86_gen_sub3) (rtx, rtx, rtx);
1811 static rtx (*ix86_gen_sub3_carry) (rtx, rtx, rtx, rtx);
1812 static rtx (*ix86_gen_one_cmpl2) (rtx, rtx);
1813 static rtx (*ix86_gen_monitor) (rtx, rtx, rtx);
1814 static rtx (*ix86_gen_andsp) (rtx, rtx, rtx);
1815
1816 /* Preferred alignment for stack boundary in bits.  */
1817 unsigned int ix86_preferred_stack_boundary;
1818
1819 /* Alignment for incoming stack boundary in bits specified at
1820    command line.  */
1821 static unsigned int ix86_user_incoming_stack_boundary;
1822
1823 /* Default alignment for incoming stack boundary in bits.  */
1824 static unsigned int ix86_default_incoming_stack_boundary;
1825
1826 /* Alignment for incoming stack boundary in bits.  */
1827 unsigned int ix86_incoming_stack_boundary;
1828
1829 /* The abi used by target.  */
1830 enum calling_abi ix86_abi;
1831
1832 /* Values 1-5: see jump.c */
1833 int ix86_branch_cost;
1834
1835 /* Calling abi specific va_list type nodes.  */
1836 static GTY(()) tree sysv_va_list_type_node;
1837 static GTY(()) tree ms_va_list_type_node;
1838
1839 /* Variables which are this size or smaller are put in the data/bss
1840    or ldata/lbss sections.  */
1841
1842 int ix86_section_threshold = 65536;
1843
1844 /* Prefix built by ASM_GENERATE_INTERNAL_LABEL.  */
1845 char internal_label_prefix[16];
1846 int internal_label_prefix_len;
1847
1848 /* Fence to use after loop using movnt.  */
1849 tree x86_mfence;
1850
1851 /* Register class used for passing given 64bit part of the argument.
1852    These represent classes as documented by the PS ABI, with the exception
1853    of SSESF, SSEDF classes, that are basically SSE class, just gcc will
1854    use SF or DFmode move instead of DImode to avoid reformatting penalties.
1855
1856    Similarly we play games with INTEGERSI_CLASS to use cheaper SImode moves
1857    whenever possible (upper half does contain padding).  */
1858 enum x86_64_reg_class
1859   {
1860     X86_64_NO_CLASS,
1861     X86_64_INTEGER_CLASS,
1862     X86_64_INTEGERSI_CLASS,
1863     X86_64_SSE_CLASS,
1864     X86_64_SSESF_CLASS,
1865     X86_64_SSEDF_CLASS,
1866     X86_64_SSEUP_CLASS,
1867     X86_64_X87_CLASS,
1868     X86_64_X87UP_CLASS,
1869     X86_64_COMPLEX_X87_CLASS,
1870     X86_64_MEMORY_CLASS
1871   };
1872
1873 #define MAX_CLASSES 4
1874
1875 /* Table of constants used by fldpi, fldln2, etc....  */
1876 static REAL_VALUE_TYPE ext_80387_constants_table [5];
1877 static bool ext_80387_constants_init = 0;
1878
1879 \f
1880 static struct machine_function * ix86_init_machine_status (void);
1881 static rtx ix86_function_value (const_tree, const_tree, bool);
1882 static int ix86_function_regparm (const_tree, const_tree);
1883 static void ix86_compute_frame_layout (struct ix86_frame *);
1884 static bool ix86_expand_vector_init_one_nonzero (bool, enum machine_mode,
1885                                                  rtx, rtx, int);
1886 static void ix86_add_new_builtins (int);
1887
1888 enum ix86_function_specific_strings
1889 {
1890   IX86_FUNCTION_SPECIFIC_ARCH,
1891   IX86_FUNCTION_SPECIFIC_TUNE,
1892   IX86_FUNCTION_SPECIFIC_FPMATH,
1893   IX86_FUNCTION_SPECIFIC_MAX
1894 };
1895
1896 static char *ix86_target_string (int, int, const char *, const char *,
1897                                  const char *, bool);
1898 static void ix86_debug_options (void) ATTRIBUTE_UNUSED;
1899 static void ix86_function_specific_save (struct cl_target_option *);
1900 static void ix86_function_specific_restore (struct cl_target_option *);
1901 static void ix86_function_specific_print (FILE *, int,
1902                                           struct cl_target_option *);
1903 static bool ix86_valid_target_attribute_p (tree, tree, tree, int);
1904 static bool ix86_valid_target_attribute_inner_p (tree, char *[]);
1905 static bool ix86_can_inline_p (tree, tree);
1906 static void ix86_set_current_function (tree);
1907
1908 static enum calling_abi ix86_function_abi (const_tree);
1909
1910 \f
1911 /* The svr4 ABI for the i386 says that records and unions are returned
1912    in memory.  */
1913 #ifndef DEFAULT_PCC_STRUCT_RETURN
1914 #define DEFAULT_PCC_STRUCT_RETURN 1
1915 #endif
1916
1917 /* Whether -mtune= or -march= were specified */
1918 static int ix86_tune_defaulted;
1919 static int ix86_arch_specified;
1920
1921 /* Bit flags that specify the ISA we are compiling for.  */
1922 int ix86_isa_flags = TARGET_64BIT_DEFAULT | TARGET_SUBTARGET_ISA_DEFAULT;
1923
1924 /* A mask of ix86_isa_flags that includes bit X if X
1925    was set or cleared on the command line.  */
1926 static int ix86_isa_flags_explicit;
1927
1928 /* Define a set of ISAs which are available when a given ISA is
1929    enabled.  MMX and SSE ISAs are handled separately.  */
1930
1931 #define OPTION_MASK_ISA_MMX_SET OPTION_MASK_ISA_MMX
1932 #define OPTION_MASK_ISA_3DNOW_SET \
1933   (OPTION_MASK_ISA_3DNOW | OPTION_MASK_ISA_MMX_SET)
1934
1935 #define OPTION_MASK_ISA_SSE_SET OPTION_MASK_ISA_SSE
1936 #define OPTION_MASK_ISA_SSE2_SET \
1937   (OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_SSE_SET)
1938 #define OPTION_MASK_ISA_SSE3_SET \
1939   (OPTION_MASK_ISA_SSE3 | OPTION_MASK_ISA_SSE2_SET)
1940 #define OPTION_MASK_ISA_SSSE3_SET \
1941   (OPTION_MASK_ISA_SSSE3 | OPTION_MASK_ISA_SSE3_SET)
1942 #define OPTION_MASK_ISA_SSE4_1_SET \
1943   (OPTION_MASK_ISA_SSE4_1 | OPTION_MASK_ISA_SSSE3_SET)
1944 #define OPTION_MASK_ISA_SSE4_2_SET \
1945   (OPTION_MASK_ISA_SSE4_2 | OPTION_MASK_ISA_SSE4_1_SET)
1946 #define OPTION_MASK_ISA_AVX_SET \
1947   (OPTION_MASK_ISA_AVX | OPTION_MASK_ISA_SSE4_2_SET)
1948 #define OPTION_MASK_ISA_FMA_SET \
1949   (OPTION_MASK_ISA_FMA | OPTION_MASK_ISA_AVX_SET)
1950
1951 /* SSE4 includes both SSE4.1 and SSE4.2. -msse4 should be the same
1952    as -msse4.2.  */
1953 #define OPTION_MASK_ISA_SSE4_SET OPTION_MASK_ISA_SSE4_2_SET
1954
1955 #define OPTION_MASK_ISA_SSE4A_SET \
1956   (OPTION_MASK_ISA_SSE4A | OPTION_MASK_ISA_SSE3_SET)
1957 #define OPTION_MASK_ISA_SSE5_SET \
1958   (OPTION_MASK_ISA_SSE5 | OPTION_MASK_ISA_SSE4A_SET)
1959
1960 /* AES and PCLMUL need SSE2 because they use xmm registers */
1961 #define OPTION_MASK_ISA_AES_SET \
1962   (OPTION_MASK_ISA_AES | OPTION_MASK_ISA_SSE2_SET)
1963 #define OPTION_MASK_ISA_PCLMUL_SET \
1964   (OPTION_MASK_ISA_PCLMUL | OPTION_MASK_ISA_SSE2_SET)
1965
1966 #define OPTION_MASK_ISA_ABM_SET \
1967   (OPTION_MASK_ISA_ABM | OPTION_MASK_ISA_POPCNT)
1968 #define OPTION_MASK_ISA_POPCNT_SET OPTION_MASK_ISA_POPCNT
1969 #define OPTION_MASK_ISA_CX16_SET OPTION_MASK_ISA_CX16
1970 #define OPTION_MASK_ISA_SAHF_SET OPTION_MASK_ISA_SAHF
1971
1972 /* Define a set of ISAs which aren't available when a given ISA is
1973    disabled.  MMX and SSE ISAs are handled separately.  */
1974
1975 #define OPTION_MASK_ISA_MMX_UNSET \
1976   (OPTION_MASK_ISA_MMX | OPTION_MASK_ISA_3DNOW_UNSET)
1977 #define OPTION_MASK_ISA_3DNOW_UNSET \
1978   (OPTION_MASK_ISA_3DNOW | OPTION_MASK_ISA_3DNOW_A_UNSET)
1979 #define OPTION_MASK_ISA_3DNOW_A_UNSET OPTION_MASK_ISA_3DNOW_A
1980
1981 #define OPTION_MASK_ISA_SSE_UNSET \
1982   (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_SSE2_UNSET)
1983 #define OPTION_MASK_ISA_SSE2_UNSET \
1984   (OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_SSE3_UNSET)
1985 #define OPTION_MASK_ISA_SSE3_UNSET \
1986   (OPTION_MASK_ISA_SSE3 \
1987    | OPTION_MASK_ISA_SSSE3_UNSET \
1988    | OPTION_MASK_ISA_SSE4A_UNSET )
1989 #define OPTION_MASK_ISA_SSSE3_UNSET \
1990   (OPTION_MASK_ISA_SSSE3 | OPTION_MASK_ISA_SSE4_1_UNSET)
1991 #define OPTION_MASK_ISA_SSE4_1_UNSET \
1992   (OPTION_MASK_ISA_SSE4_1 | OPTION_MASK_ISA_SSE4_2_UNSET)
1993 #define OPTION_MASK_ISA_SSE4_2_UNSET \
1994   (OPTION_MASK_ISA_SSE4_2 | OPTION_MASK_ISA_AVX_UNSET )
1995 #define OPTION_MASK_ISA_AVX_UNSET \
1996   (OPTION_MASK_ISA_AVX | OPTION_MASK_ISA_FMA_UNSET)
1997 #define OPTION_MASK_ISA_FMA_UNSET OPTION_MASK_ISA_FMA
1998
1999 /* SSE4 includes both SSE4.1 and SSE4.2.  -mno-sse4 should the same
2000    as -mno-sse4.1. */
2001 #define OPTION_MASK_ISA_SSE4_UNSET OPTION_MASK_ISA_SSE4_1_UNSET
2002
2003 #define OPTION_MASK_ISA_SSE4A_UNSET \
2004   (OPTION_MASK_ISA_SSE4A | OPTION_MASK_ISA_SSE5_UNSET)
2005 #define OPTION_MASK_ISA_SSE5_UNSET OPTION_MASK_ISA_SSE5
2006 #define OPTION_MASK_ISA_AES_UNSET OPTION_MASK_ISA_AES
2007 #define OPTION_MASK_ISA_PCLMUL_UNSET OPTION_MASK_ISA_PCLMUL
2008 #define OPTION_MASK_ISA_ABM_UNSET OPTION_MASK_ISA_ABM
2009 #define OPTION_MASK_ISA_POPCNT_UNSET OPTION_MASK_ISA_POPCNT
2010 #define OPTION_MASK_ISA_CX16_UNSET OPTION_MASK_ISA_CX16
2011 #define OPTION_MASK_ISA_SAHF_UNSET OPTION_MASK_ISA_SAHF
2012
2013 /* Vectorization library interface and handlers.  */
2014 tree (*ix86_veclib_handler)(enum built_in_function, tree, tree) = NULL;
2015 static tree ix86_veclibabi_svml (enum built_in_function, tree, tree);
2016 static tree ix86_veclibabi_acml (enum built_in_function, tree, tree);
2017
2018 /* Processor target table, indexed by processor number */
2019 struct ptt
2020 {
2021   const struct processor_costs *cost;           /* Processor costs */
2022   const int align_loop;                         /* Default alignments.  */
2023   const int align_loop_max_skip;
2024   const int align_jump;
2025   const int align_jump_max_skip;
2026   const int align_func;
2027 };
2028
2029 static const struct ptt processor_target_table[PROCESSOR_max] =
2030 {
2031   {&i386_cost, 4, 3, 4, 3, 4},
2032   {&i486_cost, 16, 15, 16, 15, 16},
2033   {&pentium_cost, 16, 7, 16, 7, 16},
2034   {&pentiumpro_cost, 16, 15, 16, 10, 16},
2035   {&geode_cost, 0, 0, 0, 0, 0},
2036   {&k6_cost, 32, 7, 32, 7, 32},
2037   {&athlon_cost, 16, 7, 16, 7, 16},
2038   {&pentium4_cost, 0, 0, 0, 0, 0},
2039   {&k8_cost, 16, 7, 16, 7, 16},
2040   {&nocona_cost, 0, 0, 0, 0, 0},
2041   {&core2_cost, 16, 10, 16, 10, 16},
2042   {&generic32_cost, 16, 7, 16, 7, 16},
2043   {&generic64_cost, 16, 10, 16, 10, 16},
2044   {&amdfam10_cost, 32, 24, 32, 7, 32},
2045   {&atom_cost, 16, 7, 16, 7, 16}
2046 };
2047
2048 static const char *const cpu_names[TARGET_CPU_DEFAULT_max] =
2049 {
2050   "generic",
2051   "i386",
2052   "i486",
2053   "pentium",
2054   "pentium-mmx",
2055   "pentiumpro",
2056   "pentium2",
2057   "pentium3",
2058   "pentium4",
2059   "pentium-m",
2060   "prescott",
2061   "nocona",
2062   "core2",
2063   "atom",
2064   "geode",
2065   "k6",
2066   "k6-2",
2067   "k6-3",
2068   "athlon",
2069   "athlon-4",
2070   "k8",
2071   "amdfam10"
2072 };
2073 \f
2074 /* Implement TARGET_HANDLE_OPTION.  */
2075
2076 static bool
2077 ix86_handle_option (size_t code, const char *arg ATTRIBUTE_UNUSED, int value)
2078 {
2079   switch (code)
2080     {
2081     case OPT_mmmx:
2082       if (value)
2083         {
2084           ix86_isa_flags |= OPTION_MASK_ISA_MMX_SET;
2085           ix86_isa_flags_explicit |= OPTION_MASK_ISA_MMX_SET;
2086         }
2087       else
2088         {
2089           ix86_isa_flags &= ~OPTION_MASK_ISA_MMX_UNSET;
2090           ix86_isa_flags_explicit |= OPTION_MASK_ISA_MMX_UNSET;
2091         }
2092       return true;
2093
2094     case OPT_m3dnow:
2095       if (value)
2096         {
2097           ix86_isa_flags |= OPTION_MASK_ISA_3DNOW_SET;
2098           ix86_isa_flags_explicit |= OPTION_MASK_ISA_3DNOW_SET;
2099         }
2100       else
2101         {
2102           ix86_isa_flags &= ~OPTION_MASK_ISA_3DNOW_UNSET;
2103           ix86_isa_flags_explicit |= OPTION_MASK_ISA_3DNOW_UNSET;
2104         }
2105       return true;
2106
2107     case OPT_m3dnowa:
2108       return false;
2109
2110     case OPT_msse:
2111       if (value)
2112         {
2113           ix86_isa_flags |= OPTION_MASK_ISA_SSE_SET;
2114           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE_SET;
2115         }
2116       else
2117         {
2118           ix86_isa_flags &= ~OPTION_MASK_ISA_SSE_UNSET;
2119           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE_UNSET;
2120         }
2121       return true;
2122
2123     case OPT_msse2:
2124       if (value)
2125         {
2126           ix86_isa_flags |= OPTION_MASK_ISA_SSE2_SET;
2127           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE2_SET;
2128         }
2129       else
2130         {
2131           ix86_isa_flags &= ~OPTION_MASK_ISA_SSE2_UNSET;
2132           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE2_UNSET;
2133         }
2134       return true;
2135
2136     case OPT_msse3:
2137       if (value)
2138         {
2139           ix86_isa_flags |= OPTION_MASK_ISA_SSE3_SET;
2140           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE3_SET;
2141         }
2142       else
2143         {
2144           ix86_isa_flags &= ~OPTION_MASK_ISA_SSE3_UNSET;
2145           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE3_UNSET;
2146         }
2147       return true;
2148
2149     case OPT_mssse3:
2150       if (value)
2151         {
2152           ix86_isa_flags |= OPTION_MASK_ISA_SSSE3_SET;
2153           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSSE3_SET;
2154         }
2155       else
2156         {
2157           ix86_isa_flags &= ~OPTION_MASK_ISA_SSSE3_UNSET;
2158           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSSE3_UNSET;
2159         }
2160       return true;
2161
2162     case OPT_msse4_1:
2163       if (value)
2164         {
2165           ix86_isa_flags |= OPTION_MASK_ISA_SSE4_1_SET;
2166           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_1_SET;
2167         }
2168       else
2169         {
2170           ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4_1_UNSET;
2171           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_1_UNSET;
2172         }
2173       return true;
2174
2175     case OPT_msse4_2:
2176       if (value)
2177         {
2178           ix86_isa_flags |= OPTION_MASK_ISA_SSE4_2_SET;
2179           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_2_SET;
2180         }
2181       else
2182         {
2183           ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4_2_UNSET;
2184           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_2_UNSET;
2185         }
2186       return true;
2187
2188     case OPT_mavx:
2189       if (value)
2190         {
2191           ix86_isa_flags |= OPTION_MASK_ISA_AVX_SET;
2192           ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX_SET;
2193         }
2194       else
2195         {
2196           ix86_isa_flags &= ~OPTION_MASK_ISA_AVX_UNSET;
2197           ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX_UNSET;
2198         }
2199       return true;
2200
2201     case OPT_mfma:
2202       if (value)
2203         {
2204           ix86_isa_flags |= OPTION_MASK_ISA_FMA_SET;
2205           ix86_isa_flags_explicit |= OPTION_MASK_ISA_FMA_SET;
2206         }
2207       else
2208         {
2209           ix86_isa_flags &= ~OPTION_MASK_ISA_FMA_UNSET;
2210           ix86_isa_flags_explicit |= OPTION_MASK_ISA_FMA_UNSET;
2211         }
2212       return true;
2213
2214     case OPT_msse4:
2215       ix86_isa_flags |= OPTION_MASK_ISA_SSE4_SET;
2216       ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_SET;
2217       return true;
2218
2219     case OPT_mno_sse4:
2220       ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4_UNSET;
2221       ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_UNSET;
2222       return true;
2223
2224     case OPT_msse4a:
2225       if (value)
2226         {
2227           ix86_isa_flags |= OPTION_MASK_ISA_SSE4A_SET;
2228           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4A_SET;
2229         }
2230       else
2231         {
2232           ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4A_UNSET;
2233           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4A_UNSET;
2234         }
2235       return true;
2236
2237     case OPT_msse5:
2238       if (value)
2239         {
2240           ix86_isa_flags |= OPTION_MASK_ISA_SSE5_SET;
2241           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE5_SET;
2242         }
2243       else
2244         {
2245           ix86_isa_flags &= ~OPTION_MASK_ISA_SSE5_UNSET;
2246           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE5_UNSET;
2247         }
2248       return true;
2249
2250     case OPT_mabm:
2251       if (value)
2252         {
2253           ix86_isa_flags |= OPTION_MASK_ISA_ABM_SET;
2254           ix86_isa_flags_explicit |= OPTION_MASK_ISA_ABM_SET;
2255         }
2256       else
2257         {
2258           ix86_isa_flags &= ~OPTION_MASK_ISA_ABM_UNSET;
2259           ix86_isa_flags_explicit |= OPTION_MASK_ISA_ABM_UNSET;
2260         }
2261       return true;
2262
2263     case OPT_mpopcnt:
2264       if (value)
2265         {
2266           ix86_isa_flags |= OPTION_MASK_ISA_POPCNT_SET;
2267           ix86_isa_flags_explicit |= OPTION_MASK_ISA_POPCNT_SET;
2268         }
2269       else
2270         {
2271           ix86_isa_flags &= ~OPTION_MASK_ISA_POPCNT_UNSET;
2272           ix86_isa_flags_explicit |= OPTION_MASK_ISA_POPCNT_UNSET;
2273         }
2274       return true;
2275
2276     case OPT_msahf:
2277       if (value)
2278         {
2279           ix86_isa_flags |= OPTION_MASK_ISA_SAHF_SET;
2280           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SAHF_SET;
2281         }
2282       else
2283         {
2284           ix86_isa_flags &= ~OPTION_MASK_ISA_SAHF_UNSET;
2285           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SAHF_UNSET;
2286         }
2287       return true;
2288
2289     case OPT_mcx16:
2290       if (value)
2291         {
2292           ix86_isa_flags |= OPTION_MASK_ISA_CX16_SET;
2293           ix86_isa_flags_explicit |= OPTION_MASK_ISA_CX16_SET;
2294         }
2295       else
2296         {
2297           ix86_isa_flags &= ~OPTION_MASK_ISA_CX16_UNSET;
2298           ix86_isa_flags_explicit |= OPTION_MASK_ISA_CX16_UNSET;
2299         }
2300       return true;
2301
2302     case OPT_maes:
2303       if (value)
2304         {
2305           ix86_isa_flags |= OPTION_MASK_ISA_AES_SET;
2306           ix86_isa_flags_explicit |= OPTION_MASK_ISA_AES_SET;
2307         }
2308       else
2309         {
2310           ix86_isa_flags &= ~OPTION_MASK_ISA_AES_UNSET;
2311           ix86_isa_flags_explicit |= OPTION_MASK_ISA_AES_UNSET;
2312         }
2313       return true;
2314
2315     case OPT_mpclmul:
2316       if (value)
2317         {
2318           ix86_isa_flags |= OPTION_MASK_ISA_PCLMUL_SET;
2319           ix86_isa_flags_explicit |= OPTION_MASK_ISA_PCLMUL_SET;
2320         }
2321       else
2322         {
2323           ix86_isa_flags &= ~OPTION_MASK_ISA_PCLMUL_UNSET;
2324           ix86_isa_flags_explicit |= OPTION_MASK_ISA_PCLMUL_UNSET;
2325         }
2326       return true;
2327
2328     default:
2329       return true;
2330     }
2331 }
2332 \f
2333 /* Return a string the documents the current -m options.  The caller is
2334    responsible for freeing the string.  */
2335
2336 static char *
2337 ix86_target_string (int isa, int flags, const char *arch, const char *tune,
2338                     const char *fpmath, bool add_nl_p)
2339 {
2340   struct ix86_target_opts
2341   {
2342     const char *option;         /* option string */
2343     int mask;                   /* isa mask options */
2344   };
2345
2346   /* This table is ordered so that options like -msse5 or -msse4.2 that imply
2347      preceding options while match those first.  */
2348   static struct ix86_target_opts isa_opts[] =
2349   {
2350     { "-m64",           OPTION_MASK_ISA_64BIT },
2351     { "-msse5",         OPTION_MASK_ISA_SSE5 },
2352     { "-msse4a",        OPTION_MASK_ISA_SSE4A },
2353     { "-msse4.2",       OPTION_MASK_ISA_SSE4_2 },
2354     { "-msse4.1",       OPTION_MASK_ISA_SSE4_1 },
2355     { "-mssse3",        OPTION_MASK_ISA_SSSE3 },
2356     { "-msse3",         OPTION_MASK_ISA_SSE3 },
2357     { "-msse2",         OPTION_MASK_ISA_SSE2 },
2358     { "-msse",          OPTION_MASK_ISA_SSE },
2359     { "-m3dnow",        OPTION_MASK_ISA_3DNOW },
2360     { "-m3dnowa",       OPTION_MASK_ISA_3DNOW_A },
2361     { "-mmmx",          OPTION_MASK_ISA_MMX },
2362     { "-mabm",          OPTION_MASK_ISA_ABM },
2363     { "-mpopcnt",       OPTION_MASK_ISA_POPCNT },
2364     { "-maes",          OPTION_MASK_ISA_AES },
2365     { "-mpclmul",       OPTION_MASK_ISA_PCLMUL },
2366   };
2367
2368   /* Flag options.  */
2369   static struct ix86_target_opts flag_opts[] =
2370   {
2371     { "-m128bit-long-double",           MASK_128BIT_LONG_DOUBLE },
2372     { "-m80387",                        MASK_80387 },
2373     { "-maccumulate-outgoing-args",     MASK_ACCUMULATE_OUTGOING_ARGS },
2374     { "-malign-double",                 MASK_ALIGN_DOUBLE },
2375     { "-mcld",                          MASK_CLD },
2376     { "-mfp-ret-in-387",                MASK_FLOAT_RETURNS },
2377     { "-mieee-fp",                      MASK_IEEE_FP },
2378     { "-minline-all-stringops",         MASK_INLINE_ALL_STRINGOPS },
2379     { "-minline-stringops-dynamically", MASK_INLINE_STRINGOPS_DYNAMICALLY },
2380     { "-mms-bitfields",                 MASK_MS_BITFIELD_LAYOUT },
2381     { "-mno-align-stringops",           MASK_NO_ALIGN_STRINGOPS },
2382     { "-mno-fancy-math-387",            MASK_NO_FANCY_MATH_387 },
2383     { "-mno-fused-madd",                MASK_NO_FUSED_MADD },
2384     { "-mno-push-args",                 MASK_NO_PUSH_ARGS },
2385     { "-mno-red-zone",                  MASK_NO_RED_ZONE },
2386     { "-momit-leaf-frame-pointer",      MASK_OMIT_LEAF_FRAME_POINTER },
2387     { "-mrecip",                        MASK_RECIP },
2388     { "-mrtd",                          MASK_RTD },
2389     { "-msseregparm",                   MASK_SSEREGPARM },
2390     { "-mstack-arg-probe",              MASK_STACK_PROBE },
2391     { "-mtls-direct-seg-refs",          MASK_TLS_DIRECT_SEG_REFS },
2392   };
2393
2394   const char *opts[ARRAY_SIZE (isa_opts) + ARRAY_SIZE (flag_opts) + 6][2];
2395
2396   char isa_other[40];
2397   char target_other[40];
2398   unsigned num = 0;
2399   unsigned i, j;
2400   char *ret;
2401   char *ptr;
2402   size_t len;
2403   size_t line_len;
2404   size_t sep_len;
2405
2406   memset (opts, '\0', sizeof (opts));
2407
2408   /* Add -march= option.  */
2409   if (arch)
2410     {
2411       opts[num][0] = "-march=";
2412       opts[num++][1] = arch;
2413     }
2414
2415   /* Add -mtune= option.  */
2416   if (tune)
2417     {
2418       opts[num][0] = "-mtune=";
2419       opts[num++][1] = tune;
2420     }
2421
2422   /* Pick out the options in isa options.  */
2423   for (i = 0; i < ARRAY_SIZE (isa_opts); i++)
2424     {
2425       if ((isa & isa_opts[i].mask) != 0)
2426         {
2427           opts[num++][0] = isa_opts[i].option;
2428           isa &= ~ isa_opts[i].mask;
2429         }
2430     }
2431
2432   if (isa && add_nl_p)
2433     {
2434       opts[num++][0] = isa_other;
2435       sprintf (isa_other, "(other isa: 0x%x)", isa);
2436     }
2437
2438   /* Add flag options.  */
2439   for (i = 0; i < ARRAY_SIZE (flag_opts); i++)
2440     {
2441       if ((flags & flag_opts[i].mask) != 0)
2442         {
2443           opts[num++][0] = flag_opts[i].option;
2444           flags &= ~ flag_opts[i].mask;
2445         }
2446     }
2447
2448   if (flags && add_nl_p)
2449     {
2450       opts[num++][0] = target_other;
2451       sprintf (target_other, "(other flags: 0x%x)", isa);
2452     }
2453
2454   /* Add -fpmath= option.  */
2455   if (fpmath)
2456     {
2457       opts[num][0] = "-mfpmath=";
2458       opts[num++][1] = fpmath;
2459     }
2460
2461   /* Any options?  */
2462   if (num == 0)
2463     return NULL;
2464
2465   gcc_assert (num < ARRAY_SIZE (opts));
2466
2467   /* Size the string.  */
2468   len = 0;
2469   sep_len = (add_nl_p) ? 3 : 1;
2470   for (i = 0; i < num; i++)
2471     {
2472       len += sep_len;
2473       for (j = 0; j < 2; j++)
2474         if (opts[i][j])
2475           len += strlen (opts[i][j]);
2476     }
2477
2478   /* Build the string.  */
2479   ret = ptr = (char *) xmalloc (len);
2480   line_len = 0;
2481
2482   for (i = 0; i < num; i++)
2483     {
2484       size_t len2[2];
2485
2486       for (j = 0; j < 2; j++)
2487         len2[j] = (opts[i][j]) ? strlen (opts[i][j]) : 0;
2488
2489       if (i != 0)
2490         {
2491           *ptr++ = ' ';
2492           line_len++;
2493
2494           if (add_nl_p && line_len + len2[0] + len2[1] > 70)
2495             {
2496               *ptr++ = '\\';
2497               *ptr++ = '\n';
2498               line_len = 0;
2499             }
2500         }
2501
2502       for (j = 0; j < 2; j++)
2503         if (opts[i][j])
2504           {
2505             memcpy (ptr, opts[i][j], len2[j]);
2506             ptr += len2[j];
2507             line_len += len2[j];
2508           }
2509     }
2510
2511   *ptr = '\0';
2512   gcc_assert (ret + len >= ptr);
2513
2514   return ret;
2515 }
2516
2517 /* Function that is callable from the debugger to print the current
2518    options.  */
2519 void
2520 ix86_debug_options (void)
2521 {
2522   char *opts = ix86_target_string (ix86_isa_flags, target_flags,
2523                                    ix86_arch_string, ix86_tune_string,
2524                                    ix86_fpmath_string, true);
2525
2526   if (opts)
2527     {
2528       fprintf (stderr, "%s\n\n", opts);
2529       free (opts);
2530     }
2531   else
2532     fprintf (stderr, "<no options>\n\n");
2533
2534   return;
2535 }
2536 \f
2537 /* Sometimes certain combinations of command options do not make
2538    sense on a particular target machine.  You can define a macro
2539    `OVERRIDE_OPTIONS' to take account of this.  This macro, if
2540    defined, is executed once just after all the command options have
2541    been parsed.
2542
2543    Don't use this macro to turn on various extra optimizations for
2544    `-O'.  That is what `OPTIMIZATION_OPTIONS' is for.  */
2545
2546 void
2547 override_options (bool main_args_p)
2548 {
2549   int i;
2550   unsigned int ix86_arch_mask, ix86_tune_mask;
2551   const char *prefix;
2552   const char *suffix;
2553   const char *sw;
2554
2555   /* Comes from final.c -- no real reason to change it.  */
2556 #define MAX_CODE_ALIGN 16
2557
2558   enum pta_flags
2559     {
2560       PTA_SSE = 1 << 0,
2561       PTA_SSE2 = 1 << 1,
2562       PTA_SSE3 = 1 << 2,
2563       PTA_MMX = 1 << 3,
2564       PTA_PREFETCH_SSE = 1 << 4,
2565       PTA_3DNOW = 1 << 5,
2566       PTA_3DNOW_A = 1 << 6,
2567       PTA_64BIT = 1 << 7,
2568       PTA_SSSE3 = 1 << 8,
2569       PTA_CX16 = 1 << 9,
2570       PTA_POPCNT = 1 << 10,
2571       PTA_ABM = 1 << 11,
2572       PTA_SSE4A = 1 << 12,
2573       PTA_NO_SAHF = 1 << 13,
2574       PTA_SSE4_1 = 1 << 14,
2575       PTA_SSE4_2 = 1 << 15,
2576       PTA_SSE5 = 1 << 16,
2577       PTA_AES = 1 << 17,
2578       PTA_PCLMUL = 1 << 18,
2579       PTA_AVX = 1 << 19,
2580       PTA_FMA = 1 << 20 
2581     };
2582
2583   static struct pta
2584     {
2585       const char *const name;           /* processor name or nickname.  */
2586       const enum processor_type processor;
2587       const enum attr_cpu schedule;
2588       const unsigned /*enum pta_flags*/ flags;
2589     }
2590   const processor_alias_table[] =
2591     {
2592       {"i386", PROCESSOR_I386, CPU_NONE, 0},
2593       {"i486", PROCESSOR_I486, CPU_NONE, 0},
2594       {"i586", PROCESSOR_PENTIUM, CPU_PENTIUM, 0},
2595       {"pentium", PROCESSOR_PENTIUM, CPU_PENTIUM, 0},
2596       {"pentium-mmx", PROCESSOR_PENTIUM, CPU_PENTIUM, PTA_MMX},
2597       {"winchip-c6", PROCESSOR_I486, CPU_NONE, PTA_MMX},
2598       {"winchip2", PROCESSOR_I486, CPU_NONE, PTA_MMX | PTA_3DNOW},
2599       {"c3", PROCESSOR_I486, CPU_NONE, PTA_MMX | PTA_3DNOW},
2600       {"c3-2", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO, PTA_MMX | PTA_SSE},
2601       {"i686", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO, 0},
2602       {"pentiumpro", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO, 0},
2603       {"pentium2", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO, PTA_MMX},
2604       {"pentium3", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO,
2605         PTA_MMX | PTA_SSE},
2606       {"pentium3m", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO,
2607         PTA_MMX | PTA_SSE},
2608       {"pentium-m", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO,
2609         PTA_MMX | PTA_SSE | PTA_SSE2},
2610       {"pentium4", PROCESSOR_PENTIUM4, CPU_NONE,
2611         PTA_MMX |PTA_SSE | PTA_SSE2},
2612       {"pentium4m", PROCESSOR_PENTIUM4, CPU_NONE,
2613         PTA_MMX | PTA_SSE | PTA_SSE2},
2614       {"prescott", PROCESSOR_NOCONA, CPU_NONE,
2615         PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3},
2616       {"nocona", PROCESSOR_NOCONA, CPU_NONE,
2617         PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
2618         | PTA_CX16 | PTA_NO_SAHF},
2619       {"core2", PROCESSOR_CORE2, CPU_CORE2,
2620         PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
2621         | PTA_SSSE3 | PTA_CX16},
2622       {"atom", PROCESSOR_ATOM, CPU_ATOM,
2623         PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
2624         | PTA_SSSE3 | PTA_CX16},
2625       {"geode", PROCESSOR_GEODE, CPU_GEODE,
2626         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A |PTA_PREFETCH_SSE},
2627       {"k6", PROCESSOR_K6, CPU_K6, PTA_MMX},
2628       {"k6-2", PROCESSOR_K6, CPU_K6, PTA_MMX | PTA_3DNOW},
2629       {"k6-3", PROCESSOR_K6, CPU_K6, PTA_MMX | PTA_3DNOW},
2630       {"athlon", PROCESSOR_ATHLON, CPU_ATHLON,
2631         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_PREFETCH_SSE},
2632       {"athlon-tbird", PROCESSOR_ATHLON, CPU_ATHLON,
2633         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_PREFETCH_SSE},
2634       {"athlon-4", PROCESSOR_ATHLON, CPU_ATHLON,
2635         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE},
2636       {"athlon-xp", PROCESSOR_ATHLON, CPU_ATHLON,
2637         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE},
2638       {"athlon-mp", PROCESSOR_ATHLON, CPU_ATHLON,
2639         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE},
2640       {"x86-64", PROCESSOR_K8, CPU_K8,
2641         PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_NO_SAHF},
2642       {"k8", PROCESSOR_K8, CPU_K8,
2643         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2644         | PTA_SSE2 | PTA_NO_SAHF},
2645       {"k8-sse3", PROCESSOR_K8, CPU_K8,
2646         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2647         | PTA_SSE2 | PTA_SSE3 | PTA_NO_SAHF},
2648       {"opteron", PROCESSOR_K8, CPU_K8,
2649         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2650         | PTA_SSE2 | PTA_NO_SAHF},
2651       {"opteron-sse3", PROCESSOR_K8, CPU_K8,
2652         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2653         | PTA_SSE2 | PTA_SSE3 | PTA_NO_SAHF},
2654       {"athlon64", PROCESSOR_K8, CPU_K8,
2655         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2656         | PTA_SSE2 | PTA_NO_SAHF},
2657       {"athlon64-sse3", PROCESSOR_K8, CPU_K8,
2658         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2659         | PTA_SSE2 | PTA_SSE3 | PTA_NO_SAHF},
2660       {"athlon-fx", PROCESSOR_K8, CPU_K8,
2661         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2662         | PTA_SSE2 | PTA_NO_SAHF},
2663       {"amdfam10", PROCESSOR_AMDFAM10, CPU_AMDFAM10,
2664         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2665         | PTA_SSE2 | PTA_SSE3 | PTA_SSE4A | PTA_CX16 | PTA_ABM},
2666       {"barcelona", PROCESSOR_AMDFAM10, CPU_AMDFAM10,
2667         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2668         | PTA_SSE2 | PTA_SSE3 | PTA_SSE4A | PTA_CX16 | PTA_ABM},
2669       {"generic32", PROCESSOR_GENERIC32, CPU_PENTIUMPRO,
2670         0 /* flags are only used for -march switch.  */ },
2671       {"generic64", PROCESSOR_GENERIC64, CPU_GENERIC64,
2672         PTA_64BIT /* flags are only used for -march switch.  */ },
2673     };
2674
2675   int const pta_size = ARRAY_SIZE (processor_alias_table);
2676
2677   /* Set up prefix/suffix so the error messages refer to either the command
2678      line argument, or the attribute(target).  */
2679   if (main_args_p)
2680     {
2681       prefix = "-m";
2682       suffix = "";
2683       sw = "switch";
2684     }
2685   else
2686     {
2687       prefix = "option(\"";
2688       suffix = "\")";
2689       sw = "attribute";
2690     }
2691
2692 #ifdef SUBTARGET_OVERRIDE_OPTIONS
2693   SUBTARGET_OVERRIDE_OPTIONS;
2694 #endif
2695
2696 #ifdef SUBSUBTARGET_OVERRIDE_OPTIONS
2697   SUBSUBTARGET_OVERRIDE_OPTIONS;
2698 #endif
2699
2700   /* -fPIC is the default for x86_64.  */
2701   if (TARGET_MACHO && TARGET_64BIT)
2702     flag_pic = 2;
2703
2704   /* Set the default values for switches whose default depends on TARGET_64BIT
2705      in case they weren't overwritten by command line options.  */
2706   if (TARGET_64BIT)
2707     {
2708       /* Mach-O doesn't support omitting the frame pointer for now.  */
2709       if (flag_omit_frame_pointer == 2)
2710         flag_omit_frame_pointer = (TARGET_MACHO ? 0 : 1);
2711       if (flag_asynchronous_unwind_tables == 2)
2712         flag_asynchronous_unwind_tables = 1;
2713       if (flag_pcc_struct_return == 2)
2714         flag_pcc_struct_return = 0;
2715     }
2716   else
2717     {
2718       if (flag_omit_frame_pointer == 2)
2719         flag_omit_frame_pointer = 0;
2720       if (flag_asynchronous_unwind_tables == 2)
2721         flag_asynchronous_unwind_tables = 0;
2722       if (flag_pcc_struct_return == 2)
2723         flag_pcc_struct_return = DEFAULT_PCC_STRUCT_RETURN;
2724     }
2725
2726   /* Need to check -mtune=generic first.  */
2727   if (ix86_tune_string)
2728     {
2729       if (!strcmp (ix86_tune_string, "generic")
2730           || !strcmp (ix86_tune_string, "i686")
2731           /* As special support for cross compilers we read -mtune=native
2732              as -mtune=generic.  With native compilers we won't see the
2733              -mtune=native, as it was changed by the driver.  */
2734           || !strcmp (ix86_tune_string, "native"))
2735         {
2736           if (TARGET_64BIT)
2737             ix86_tune_string = "generic64";
2738           else
2739             ix86_tune_string = "generic32";
2740         }
2741       /* If this call is for setting the option attribute, allow the
2742          generic32/generic64 that was previously set.  */
2743       else if (!main_args_p
2744                && (!strcmp (ix86_tune_string, "generic32")
2745                    || !strcmp (ix86_tune_string, "generic64")))
2746         ;
2747       else if (!strncmp (ix86_tune_string, "generic", 7))
2748         error ("bad value (%s) for %stune=%s %s",
2749                ix86_tune_string, prefix, suffix, sw);
2750     }
2751   else
2752     {
2753       if (ix86_arch_string)
2754         ix86_tune_string = ix86_arch_string;
2755       if (!ix86_tune_string)
2756         {
2757           ix86_tune_string = cpu_names[TARGET_CPU_DEFAULT];
2758           ix86_tune_defaulted = 1;
2759         }
2760
2761       /* ix86_tune_string is set to ix86_arch_string or defaulted.  We
2762          need to use a sensible tune option.  */
2763       if (!strcmp (ix86_tune_string, "generic")
2764           || !strcmp (ix86_tune_string, "x86-64")
2765           || !strcmp (ix86_tune_string, "i686"))
2766         {
2767           if (TARGET_64BIT)
2768             ix86_tune_string = "generic64";
2769           else
2770             ix86_tune_string = "generic32";
2771         }
2772     }
2773   if (ix86_stringop_string)
2774     {
2775       if (!strcmp (ix86_stringop_string, "rep_byte"))
2776         stringop_alg = rep_prefix_1_byte;
2777       else if (!strcmp (ix86_stringop_string, "libcall"))
2778         stringop_alg = libcall;
2779       else if (!strcmp (ix86_stringop_string, "rep_4byte"))
2780         stringop_alg = rep_prefix_4_byte;
2781       else if (!strcmp (ix86_stringop_string, "rep_8byte")
2782                && TARGET_64BIT)
2783         /* rep; movq isn't available in 32-bit code.  */
2784         stringop_alg = rep_prefix_8_byte;
2785       else if (!strcmp (ix86_stringop_string, "byte_loop"))
2786         stringop_alg = loop_1_byte;
2787       else if (!strcmp (ix86_stringop_string, "loop"))
2788         stringop_alg = loop;
2789       else if (!strcmp (ix86_stringop_string, "unrolled_loop"))
2790         stringop_alg = unrolled_loop;
2791       else
2792         error ("bad value (%s) for %sstringop-strategy=%s %s",
2793                ix86_stringop_string, prefix, suffix, sw);
2794     }
2795   if (!strcmp (ix86_tune_string, "x86-64"))
2796     warning (OPT_Wdeprecated, "%stune=x86-64%s is deprecated.  Use "
2797              "%stune=k8%s or %stune=generic%s instead as appropriate.",
2798              prefix, suffix, prefix, suffix, prefix, suffix);
2799
2800   if (!ix86_arch_string)
2801     ix86_arch_string = TARGET_64BIT ? "x86-64" : "i386";
2802   else
2803     ix86_arch_specified = 1;
2804
2805   if (!strcmp (ix86_arch_string, "generic"))
2806     error ("generic CPU can be used only for %stune=%s %s",
2807            prefix, suffix, sw);
2808   if (!strncmp (ix86_arch_string, "generic", 7))
2809     error ("bad value (%s) for %sarch=%s %s",
2810            ix86_arch_string, prefix, suffix, sw);
2811
2812   /* Validate -mabi= value.  */
2813   if (ix86_abi_string)
2814     {
2815       if (strcmp (ix86_abi_string, "sysv") == 0)
2816         ix86_abi = SYSV_ABI;
2817       else if (strcmp (ix86_abi_string, "ms") == 0)
2818         ix86_abi = MS_ABI;
2819       else
2820         error ("unknown ABI (%s) for %sabi=%s %s",
2821                ix86_abi_string, prefix, suffix, sw);
2822     }
2823   else
2824     ix86_abi = DEFAULT_ABI;
2825
2826   if (ix86_cmodel_string != 0)
2827     {
2828       if (!strcmp (ix86_cmodel_string, "small"))
2829         ix86_cmodel = flag_pic ? CM_SMALL_PIC : CM_SMALL;
2830       else if (!strcmp (ix86_cmodel_string, "medium"))
2831         ix86_cmodel = flag_pic ? CM_MEDIUM_PIC : CM_MEDIUM;
2832       else if (!strcmp (ix86_cmodel_string, "large"))
2833         ix86_cmodel = flag_pic ? CM_LARGE_PIC : CM_LARGE;
2834       else if (flag_pic)
2835         error ("code model %s does not support PIC mode", ix86_cmodel_string);
2836       else if (!strcmp (ix86_cmodel_string, "32"))
2837         ix86_cmodel = CM_32;
2838       else if (!strcmp (ix86_cmodel_string, "kernel") && !flag_pic)
2839         ix86_cmodel = CM_KERNEL;
2840       else
2841         error ("bad value (%s) for %scmodel=%s %s",
2842                ix86_cmodel_string, prefix, suffix, sw);
2843     }
2844   else
2845     {
2846       /* For TARGET_64BIT and MS_ABI, force pic on, in order to enable the
2847          use of rip-relative addressing.  This eliminates fixups that
2848          would otherwise be needed if this object is to be placed in a
2849          DLL, and is essentially just as efficient as direct addressing.  */
2850       if (TARGET_64BIT && DEFAULT_ABI == MS_ABI)
2851         ix86_cmodel = CM_SMALL_PIC, flag_pic = 1;
2852       else if (TARGET_64BIT)
2853         ix86_cmodel = flag_pic ? CM_SMALL_PIC : CM_SMALL;
2854       else
2855         ix86_cmodel = CM_32;
2856     }
2857   if (ix86_asm_string != 0)
2858     {
2859       if (! TARGET_MACHO
2860           && !strcmp (ix86_asm_string, "intel"))
2861         ix86_asm_dialect = ASM_INTEL;
2862       else if (!strcmp (ix86_asm_string, "att"))
2863         ix86_asm_dialect = ASM_ATT;
2864       else
2865         error ("bad value (%s) for %sasm=%s %s",
2866                ix86_asm_string, prefix, suffix, sw);
2867     }
2868   if ((TARGET_64BIT == 0) != (ix86_cmodel == CM_32))
2869     error ("code model %qs not supported in the %s bit mode",
2870            ix86_cmodel_string, TARGET_64BIT ? "64" : "32");
2871   if ((TARGET_64BIT != 0) != ((ix86_isa_flags & OPTION_MASK_ISA_64BIT) != 0))
2872     sorry ("%i-bit mode not compiled in",
2873            (ix86_isa_flags & OPTION_MASK_ISA_64BIT) ? 64 : 32);
2874
2875   for (i = 0; i < pta_size; i++)
2876     if (! strcmp (ix86_arch_string, processor_alias_table[i].name))
2877       {
2878         ix86_schedule = processor_alias_table[i].schedule;
2879         ix86_arch = processor_alias_table[i].processor;
2880         /* Default cpu tuning to the architecture.  */
2881         ix86_tune = ix86_arch;
2882
2883         if (TARGET_64BIT && !(processor_alias_table[i].flags & PTA_64BIT))
2884           error ("CPU you selected does not support x86-64 "
2885                  "instruction set");
2886
2887         if (processor_alias_table[i].flags & PTA_MMX
2888             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_MMX))
2889           ix86_isa_flags |= OPTION_MASK_ISA_MMX;
2890         if (processor_alias_table[i].flags & PTA_3DNOW
2891             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_3DNOW))
2892           ix86_isa_flags |= OPTION_MASK_ISA_3DNOW;
2893         if (processor_alias_table[i].flags & PTA_3DNOW_A
2894             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_3DNOW_A))
2895           ix86_isa_flags |= OPTION_MASK_ISA_3DNOW_A;
2896         if (processor_alias_table[i].flags & PTA_SSE
2897             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE))
2898           ix86_isa_flags |= OPTION_MASK_ISA_SSE;
2899         if (processor_alias_table[i].flags & PTA_SSE2
2900             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE2))
2901           ix86_isa_flags |= OPTION_MASK_ISA_SSE2;
2902         if (processor_alias_table[i].flags & PTA_SSE3
2903             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE3))
2904           ix86_isa_flags |= OPTION_MASK_ISA_SSE3;
2905         if (processor_alias_table[i].flags & PTA_SSSE3
2906             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSSE3))
2907           ix86_isa_flags |= OPTION_MASK_ISA_SSSE3;
2908         if (processor_alias_table[i].flags & PTA_SSE4_1
2909             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE4_1))
2910           ix86_isa_flags |= OPTION_MASK_ISA_SSE4_1;
2911         if (processor_alias_table[i].flags & PTA_SSE4_2
2912             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE4_2))
2913           ix86_isa_flags |= OPTION_MASK_ISA_SSE4_2;
2914         if (processor_alias_table[i].flags & PTA_AVX
2915             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_AVX))
2916           ix86_isa_flags |= OPTION_MASK_ISA_AVX;
2917         if (processor_alias_table[i].flags & PTA_FMA
2918             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_FMA))
2919           ix86_isa_flags |= OPTION_MASK_ISA_FMA;
2920         if (processor_alias_table[i].flags & PTA_SSE4A
2921             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE4A))
2922           ix86_isa_flags |= OPTION_MASK_ISA_SSE4A;
2923         if (processor_alias_table[i].flags & PTA_SSE5
2924             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE5))
2925           ix86_isa_flags |= OPTION_MASK_ISA_SSE5;
2926         if (processor_alias_table[i].flags & PTA_ABM
2927             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_ABM))
2928           ix86_isa_flags |= OPTION_MASK_ISA_ABM;
2929         if (processor_alias_table[i].flags & PTA_CX16
2930             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_CX16))
2931           ix86_isa_flags |= OPTION_MASK_ISA_CX16;
2932         if (processor_alias_table[i].flags & (PTA_POPCNT | PTA_ABM)
2933             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_POPCNT))
2934           ix86_isa_flags |= OPTION_MASK_ISA_POPCNT;
2935         if (!(TARGET_64BIT && (processor_alias_table[i].flags & PTA_NO_SAHF))
2936             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SAHF))
2937           ix86_isa_flags |= OPTION_MASK_ISA_SAHF;
2938         if (processor_alias_table[i].flags & PTA_AES
2939             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_AES))
2940           ix86_isa_flags |= OPTION_MASK_ISA_AES;
2941         if (processor_alias_table[i].flags & PTA_PCLMUL
2942             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_PCLMUL))
2943           ix86_isa_flags |= OPTION_MASK_ISA_PCLMUL;
2944         if (processor_alias_table[i].flags & (PTA_PREFETCH_SSE | PTA_SSE))
2945           x86_prefetch_sse = true;
2946
2947         break;
2948       }
2949
2950   if (i == pta_size)
2951     error ("bad value (%s) for %sarch=%s %s",
2952            ix86_arch_string, prefix, suffix, sw);
2953
2954   ix86_arch_mask = 1u << ix86_arch;
2955   for (i = 0; i < X86_ARCH_LAST; ++i)
2956     ix86_arch_features[i] = !!(initial_ix86_arch_features[i] & ix86_arch_mask);
2957
2958   for (i = 0; i < pta_size; i++)
2959     if (! strcmp (ix86_tune_string, processor_alias_table[i].name))
2960       {
2961         ix86_schedule = processor_alias_table[i].schedule;
2962         ix86_tune = processor_alias_table[i].processor;
2963         if (TARGET_64BIT && !(processor_alias_table[i].flags & PTA_64BIT))
2964           {
2965             if (ix86_tune_defaulted)
2966               {
2967                 ix86_tune_string = "x86-64";
2968                 for (i = 0; i < pta_size; i++)
2969                   if (! strcmp (ix86_tune_string,
2970                                 processor_alias_table[i].name))
2971                     break;
2972                 ix86_schedule = processor_alias_table[i].schedule;
2973                 ix86_tune = processor_alias_table[i].processor;
2974               }
2975             else
2976               error ("CPU you selected does not support x86-64 "
2977                      "instruction set");
2978           }
2979         /* Intel CPUs have always interpreted SSE prefetch instructions as
2980            NOPs; so, we can enable SSE prefetch instructions even when
2981            -mtune (rather than -march) points us to a processor that has them.
2982            However, the VIA C3 gives a SIGILL, so we only do that for i686 and
2983            higher processors.  */
2984         if (TARGET_CMOVE
2985             && (processor_alias_table[i].flags & (PTA_PREFETCH_SSE | PTA_SSE)))
2986           x86_prefetch_sse = true;
2987         break;
2988       }
2989   if (i == pta_size)
2990     error ("bad value (%s) for %stune=%s %s",
2991            ix86_tune_string, prefix, suffix, sw);
2992
2993   ix86_tune_mask = 1u << ix86_tune;
2994   for (i = 0; i < X86_TUNE_LAST; ++i)
2995     ix86_tune_features[i] = !!(initial_ix86_tune_features[i] & ix86_tune_mask);
2996
2997   if (optimize_size)
2998     ix86_cost = &ix86_size_cost;
2999   else
3000     ix86_cost = processor_target_table[ix86_tune].cost;
3001
3002   /* Arrange to set up i386_stack_locals for all functions.  */
3003   init_machine_status = ix86_init_machine_status;
3004
3005   /* Validate -mregparm= value.  */
3006   if (ix86_regparm_string)
3007     {
3008       if (TARGET_64BIT)
3009         warning (0, "%sregparm%s is ignored in 64-bit mode", prefix, suffix);
3010       i = atoi (ix86_regparm_string);
3011       if (i < 0 || i > REGPARM_MAX)
3012         error ("%sregparm=%d%s is not between 0 and %d",
3013                prefix, i, suffix, REGPARM_MAX);
3014       else
3015         ix86_regparm = i;
3016     }
3017   if (TARGET_64BIT)
3018     ix86_regparm = REGPARM_MAX;
3019
3020   /* If the user has provided any of the -malign-* options,
3021      warn and use that value only if -falign-* is not set.
3022      Remove this code in GCC 3.2 or later.  */
3023   if (ix86_align_loops_string)
3024     {
3025       warning (0, "%salign-loops%s is obsolete, use -falign-loops%s",
3026                prefix, suffix, suffix);
3027       if (align_loops == 0)
3028         {
3029           i = atoi (ix86_align_loops_string);
3030           if (i < 0 || i > MAX_CODE_ALIGN)
3031             error ("%salign-loops=%d%s is not between 0 and %d",
3032                    prefix, i, suffix, MAX_CODE_ALIGN);
3033           else
3034             align_loops = 1 << i;
3035         }
3036     }
3037
3038   if (ix86_align_jumps_string)
3039     {
3040       warning (0, "%salign-jumps%s is obsolete, use -falign-jumps%s",
3041                prefix, suffix, suffix);
3042       if (align_jumps == 0)
3043         {
3044           i = atoi (ix86_align_jumps_string);
3045           if (i < 0 || i > MAX_CODE_ALIGN)
3046             error ("%salign-loops=%d%s is not between 0 and %d",
3047                    prefix, i, suffix, MAX_CODE_ALIGN);
3048           else
3049             align_jumps = 1 << i;
3050         }
3051     }
3052
3053   if (ix86_align_funcs_string)
3054     {
3055       warning (0, "%salign-functions%s is obsolete, use -falign-functions%s",
3056                prefix, suffix, suffix);
3057       if (align_functions == 0)
3058         {
3059           i = atoi (ix86_align_funcs_string);
3060           if (i < 0 || i > MAX_CODE_ALIGN)
3061             error ("%salign-loops=%d%s is not between 0 and %d",
3062                    prefix, i, suffix, MAX_CODE_ALIGN);
3063           else
3064             align_functions = 1 << i;
3065         }
3066     }
3067
3068   /* Default align_* from the processor table.  */
3069   if (align_loops == 0)
3070     {
3071       align_loops = processor_target_table[ix86_tune].align_loop;
3072       align_loops_max_skip = processor_target_table[ix86_tune].align_loop_max_skip;
3073     }
3074   if (align_jumps == 0)
3075     {
3076       align_jumps = processor_target_table[ix86_tune].align_jump;
3077       align_jumps_max_skip = processor_target_table[ix86_tune].align_jump_max_skip;
3078     }
3079   if (align_functions == 0)
3080     {
3081       align_functions = processor_target_table[ix86_tune].align_func;
3082     }
3083
3084   /* Validate -mbranch-cost= value, or provide default.  */
3085   ix86_branch_cost = ix86_cost->branch_cost;
3086   if (ix86_branch_cost_string)
3087     {
3088       i = atoi (ix86_branch_cost_string);
3089       if (i < 0 || i > 5)
3090         error ("%sbranch-cost=%d%s is not between 0 and 5", prefix, i, suffix);
3091       else
3092         ix86_branch_cost = i;
3093     }
3094   if (ix86_section_threshold_string)
3095     {
3096       i = atoi (ix86_section_threshold_string);
3097       if (i < 0)
3098         error ("%slarge-data-threshold=%d%s is negative", prefix, i, suffix);
3099       else
3100         ix86_section_threshold = i;
3101     }
3102
3103   if (ix86_tls_dialect_string)
3104     {
3105       if (strcmp (ix86_tls_dialect_string, "gnu") == 0)
3106         ix86_tls_dialect = TLS_DIALECT_GNU;
3107       else if (strcmp (ix86_tls_dialect_string, "gnu2") == 0)
3108         ix86_tls_dialect = TLS_DIALECT_GNU2;
3109       else if (strcmp (ix86_tls_dialect_string, "sun") == 0)
3110         ix86_tls_dialect = TLS_DIALECT_SUN;
3111       else
3112         error ("bad value (%s) for %stls-dialect=%s %s",
3113                ix86_tls_dialect_string, prefix, suffix, sw);
3114     }
3115
3116   if (ix87_precision_string)
3117     {
3118       i = atoi (ix87_precision_string);
3119       if (i != 32 && i != 64 && i != 80)
3120         error ("pc%d is not valid precision setting (32, 64 or 80)", i);
3121     }
3122
3123   if (TARGET_64BIT)
3124     {
3125       target_flags |= TARGET_SUBTARGET64_DEFAULT & ~target_flags_explicit;
3126
3127       /* Enable by default the SSE and MMX builtins.  Do allow the user to
3128          explicitly disable any of these.  In particular, disabling SSE and
3129          MMX for kernel code is extremely useful.  */
3130       if (!ix86_arch_specified)
3131       ix86_isa_flags
3132         |= ((OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_MMX
3133              | TARGET_SUBTARGET64_ISA_DEFAULT) & ~ix86_isa_flags_explicit);
3134
3135       if (TARGET_RTD)
3136         warning (0, "%srtd%s is ignored in 64bit mode", prefix, suffix);
3137     }
3138   else
3139     {
3140       target_flags |= TARGET_SUBTARGET32_DEFAULT & ~target_flags_explicit;
3141
3142       if (!ix86_arch_specified)
3143       ix86_isa_flags
3144         |= TARGET_SUBTARGET32_ISA_DEFAULT & ~ix86_isa_flags_explicit;
3145
3146       /* i386 ABI does not specify red zone.  It still makes sense to use it
3147          when programmer takes care to stack from being destroyed.  */
3148       if (!(target_flags_explicit & MASK_NO_RED_ZONE))
3149         target_flags |= MASK_NO_RED_ZONE;
3150     }
3151
3152   /* Keep nonleaf frame pointers.  */
3153   if (flag_omit_frame_pointer)
3154     target_flags &= ~MASK_OMIT_LEAF_FRAME_POINTER;
3155   else if (TARGET_OMIT_LEAF_FRAME_POINTER)
3156     flag_omit_frame_pointer = 1;
3157
3158   /* If we're doing fast math, we don't care about comparison order
3159      wrt NaNs.  This lets us use a shorter comparison sequence.  */
3160   if (flag_finite_math_only)
3161     target_flags &= ~MASK_IEEE_FP;
3162
3163   /* If the architecture always has an FPU, turn off NO_FANCY_MATH_387,
3164      since the insns won't need emulation.  */
3165   if (x86_arch_always_fancy_math_387 & ix86_arch_mask)
3166     target_flags &= ~MASK_NO_FANCY_MATH_387;
3167
3168   /* Likewise, if the target doesn't have a 387, or we've specified
3169      software floating point, don't use 387 inline intrinsics.  */
3170   if (!TARGET_80387)
3171     target_flags |= MASK_NO_FANCY_MATH_387;
3172
3173   /* Turn on MMX builtins for -msse.  */
3174   if (TARGET_SSE)
3175     {
3176       ix86_isa_flags |= OPTION_MASK_ISA_MMX & ~ix86_isa_flags_explicit;
3177       x86_prefetch_sse = true;
3178     }
3179
3180   /* Turn on popcnt instruction for -msse4.2 or -mabm.  */
3181   if (TARGET_SSE4_2 || TARGET_ABM)
3182     ix86_isa_flags |= OPTION_MASK_ISA_POPCNT & ~ix86_isa_flags_explicit;
3183
3184   /* Validate -mpreferred-stack-boundary= value or default it to
3185      PREFERRED_STACK_BOUNDARY_DEFAULT.  */
3186   ix86_preferred_stack_boundary = PREFERRED_STACK_BOUNDARY_DEFAULT;
3187   if (ix86_preferred_stack_boundary_string)
3188     {
3189       i = atoi (ix86_preferred_stack_boundary_string);
3190       if (i < (TARGET_64BIT ? 4 : 2) || i > 12)
3191         error ("%spreferred-stack-boundary=%d%s is not between %d and 12",
3192                prefix, i, suffix, TARGET_64BIT ? 4 : 2);
3193       else
3194         ix86_preferred_stack_boundary = (1 << i) * BITS_PER_UNIT;
3195     }
3196
3197   /* Set the default value for -mstackrealign.  */
3198   if (ix86_force_align_arg_pointer == -1)
3199     ix86_force_align_arg_pointer = STACK_REALIGN_DEFAULT;
3200
3201   /* Validate -mincoming-stack-boundary= value or default it to
3202      MIN_STACK_BOUNDARY/PREFERRED_STACK_BOUNDARY.  */
3203   if (ix86_force_align_arg_pointer)
3204     ix86_default_incoming_stack_boundary = MIN_STACK_BOUNDARY;
3205   else
3206     ix86_default_incoming_stack_boundary = PREFERRED_STACK_BOUNDARY;
3207   ix86_incoming_stack_boundary = ix86_default_incoming_stack_boundary;
3208   if (ix86_incoming_stack_boundary_string)
3209     {
3210       i = atoi (ix86_incoming_stack_boundary_string);
3211       if (i < (TARGET_64BIT ? 4 : 2) || i > 12)
3212         error ("-mincoming-stack-boundary=%d is not between %d and 12",
3213                i, TARGET_64BIT ? 4 : 2);
3214       else
3215         {
3216           ix86_user_incoming_stack_boundary = (1 << i) * BITS_PER_UNIT;
3217           ix86_incoming_stack_boundary
3218             = ix86_user_incoming_stack_boundary;
3219         }
3220     }
3221
3222   /* Accept -msseregparm only if at least SSE support is enabled.  */
3223   if (TARGET_SSEREGPARM
3224       && ! TARGET_SSE)
3225     error ("%ssseregparm%s used without SSE enabled", prefix, suffix);
3226
3227   ix86_fpmath = TARGET_FPMATH_DEFAULT;
3228   if (ix86_fpmath_string != 0)
3229     {
3230       if (! strcmp (ix86_fpmath_string, "387"))
3231         ix86_fpmath = FPMATH_387;
3232       else if (! strcmp (ix86_fpmath_string, "sse"))
3233         {
3234           if (!TARGET_SSE)
3235             {
3236               warning (0, "SSE instruction set disabled, using 387 arithmetics");
3237               ix86_fpmath = FPMATH_387;
3238             }
3239           else
3240             ix86_fpmath = FPMATH_SSE;
3241         }
3242       else if (! strcmp (ix86_fpmath_string, "387,sse")
3243                || ! strcmp (ix86_fpmath_string, "387+sse")
3244                || ! strcmp (ix86_fpmath_string, "sse,387")
3245                || ! strcmp (ix86_fpmath_string, "sse+387")
3246                || ! strcmp (ix86_fpmath_string, "both"))
3247         {
3248           if (!TARGET_SSE)
3249             {
3250               warning (0, "SSE instruction set disabled, using 387 arithmetics");
3251               ix86_fpmath = FPMATH_387;
3252             }
3253           else if (!TARGET_80387)
3254             {
3255               warning (0, "387 instruction set disabled, using SSE arithmetics");
3256               ix86_fpmath = FPMATH_SSE;
3257             }
3258           else
3259             ix86_fpmath = (enum fpmath_unit) (FPMATH_SSE | FPMATH_387);
3260         }
3261       else
3262         error ("bad value (%s) for %sfpmath=%s %s",
3263                ix86_fpmath_string, prefix, suffix, sw);
3264     }
3265
3266   /* If the i387 is disabled, then do not return values in it. */
3267   if (!TARGET_80387)
3268     target_flags &= ~MASK_FLOAT_RETURNS;
3269
3270   /* Use external vectorized library in vectorizing intrinsics.  */
3271   if (ix86_veclibabi_string)
3272     {
3273       if (strcmp (ix86_veclibabi_string, "svml") == 0)
3274         ix86_veclib_handler = ix86_veclibabi_svml;
3275       else if (strcmp (ix86_veclibabi_string, "acml") == 0)
3276         ix86_veclib_handler = ix86_veclibabi_acml;
3277       else
3278         error ("unknown vectorization library ABI type (%s) for "
3279                "%sveclibabi=%s %s", ix86_veclibabi_string,
3280                prefix, suffix, sw);
3281     }
3282
3283   if ((x86_accumulate_outgoing_args & ix86_tune_mask)
3284       && !(target_flags_explicit & MASK_ACCUMULATE_OUTGOING_ARGS)
3285       && !optimize_size)
3286     target_flags |= MASK_ACCUMULATE_OUTGOING_ARGS;
3287
3288   /* ??? Unwind info is not correct around the CFG unless either a frame
3289      pointer is present or M_A_O_A is set.  Fixing this requires rewriting
3290      unwind info generation to be aware of the CFG and propagating states
3291      around edges.  */
3292   if ((flag_unwind_tables || flag_asynchronous_unwind_tables
3293        || flag_exceptions || flag_non_call_exceptions)
3294       && flag_omit_frame_pointer
3295       && !(target_flags & MASK_ACCUMULATE_OUTGOING_ARGS))
3296     {
3297       if (target_flags_explicit & MASK_ACCUMULATE_OUTGOING_ARGS)
3298         warning (0, "unwind tables currently require either a frame pointer "
3299                  "or %saccumulate-outgoing-args%s for correctness",
3300                  prefix, suffix);
3301       target_flags |= MASK_ACCUMULATE_OUTGOING_ARGS;
3302     }
3303
3304   /* If stack probes are required, the space used for large function
3305      arguments on the stack must also be probed, so enable
3306      -maccumulate-outgoing-args so this happens in the prologue.  */
3307   if (TARGET_STACK_PROBE
3308       && !(target_flags & MASK_ACCUMULATE_OUTGOING_ARGS))
3309     {
3310       if (target_flags_explicit & MASK_ACCUMULATE_OUTGOING_ARGS)
3311         warning (0, "stack probing requires %saccumulate-outgoing-args%s "
3312                  "for correctness", prefix, suffix);
3313       target_flags |= MASK_ACCUMULATE_OUTGOING_ARGS;
3314     }
3315
3316   /* For sane SSE instruction set generation we need fcomi instruction.
3317      It is safe to enable all CMOVE instructions.  */
3318   if (TARGET_SSE)
3319     TARGET_CMOVE = 1;
3320
3321   /* Figure out what ASM_GENERATE_INTERNAL_LABEL builds as a prefix.  */
3322   {
3323     char *p;
3324     ASM_GENERATE_INTERNAL_LABEL (internal_label_prefix, "LX", 0);
3325     p = strchr (internal_label_prefix, 'X');
3326     internal_label_prefix_len = p - internal_label_prefix;
3327     *p = '\0';
3328   }
3329
3330   /* When scheduling description is not available, disable scheduler pass
3331      so it won't slow down the compilation and make x87 code slower.  */
3332   if (!TARGET_SCHEDULE)
3333     flag_schedule_insns_after_reload = flag_schedule_insns = 0;
3334
3335   if (!PARAM_SET_P (PARAM_SIMULTANEOUS_PREFETCHES))
3336     set_param_value ("simultaneous-prefetches",
3337                      ix86_cost->simultaneous_prefetches);
3338   if (!PARAM_SET_P (PARAM_L1_CACHE_LINE_SIZE))
3339     set_param_value ("l1-cache-line-size", ix86_cost->prefetch_block);
3340   if (!PARAM_SET_P (PARAM_L1_CACHE_SIZE))
3341     set_param_value ("l1-cache-size", ix86_cost->l1_cache_size);
3342   if (!PARAM_SET_P (PARAM_L2_CACHE_SIZE))
3343     set_param_value ("l2-cache-size", ix86_cost->l2_cache_size);
3344
3345   /* If using typedef char *va_list, signal that __builtin_va_start (&ap, 0)
3346      can be optimized to ap = __builtin_next_arg (0).  */
3347   if (!TARGET_64BIT)
3348     targetm.expand_builtin_va_start = NULL;
3349
3350   if (TARGET_64BIT)
3351     {
3352       ix86_gen_leave = gen_leave_rex64;
3353       ix86_gen_pop1 = gen_popdi1;
3354       ix86_gen_add3 = gen_adddi3;
3355       ix86_gen_sub3 = gen_subdi3;
3356       ix86_gen_sub3_carry = gen_subdi3_carry_rex64;
3357       ix86_gen_one_cmpl2 = gen_one_cmpldi2;
3358       ix86_gen_monitor = gen_sse3_monitor64;
3359       ix86_gen_andsp = gen_anddi3;
3360     }
3361   else
3362     {
3363       ix86_gen_leave = gen_leave;
3364       ix86_gen_pop1 = gen_popsi1;
3365       ix86_gen_add3 = gen_addsi3;
3366       ix86_gen_sub3 = gen_subsi3;
3367       ix86_gen_sub3_carry = gen_subsi3_carry;
3368       ix86_gen_one_cmpl2 = gen_one_cmplsi2;
3369       ix86_gen_monitor = gen_sse3_monitor;
3370       ix86_gen_andsp = gen_andsi3;
3371     }
3372
3373 #ifdef USE_IX86_CLD
3374   /* Use -mcld by default for 32-bit code if configured with --enable-cld.  */
3375   if (!TARGET_64BIT)
3376     target_flags |= MASK_CLD & ~target_flags_explicit;
3377 #endif
3378
3379   /* Save the initial options in case the user does function specific options */
3380   if (main_args_p)
3381     target_option_default_node = target_option_current_node
3382       = build_target_option_node ();
3383 }
3384 \f
3385 /* Save the current options */
3386
3387 static void
3388 ix86_function_specific_save (struct cl_target_option *ptr)
3389 {
3390   gcc_assert (IN_RANGE (ix86_arch, 0, 255));
3391   gcc_assert (IN_RANGE (ix86_schedule, 0, 255));
3392   gcc_assert (IN_RANGE (ix86_tune, 0, 255));
3393   gcc_assert (IN_RANGE (ix86_fpmath, 0, 255));
3394   gcc_assert (IN_RANGE (ix86_branch_cost, 0, 255));
3395
3396   ptr->arch = ix86_arch;
3397   ptr->schedule = ix86_schedule;
3398   ptr->tune = ix86_tune;
3399   ptr->fpmath = ix86_fpmath;
3400   ptr->branch_cost = ix86_branch_cost;
3401   ptr->tune_defaulted = ix86_tune_defaulted;
3402   ptr->arch_specified = ix86_arch_specified;
3403   ptr->ix86_isa_flags_explicit = ix86_isa_flags_explicit;
3404   ptr->target_flags_explicit = target_flags_explicit;
3405 }
3406
3407 /* Restore the current options */
3408
3409 static void
3410 ix86_function_specific_restore (struct cl_target_option *ptr)
3411 {
3412   enum processor_type old_tune = ix86_tune;
3413   enum processor_type old_arch = ix86_arch;
3414   unsigned int ix86_arch_mask, ix86_tune_mask;
3415   int i;
3416
3417   ix86_arch = (enum processor_type) ptr->arch;
3418   ix86_schedule = (enum attr_cpu) ptr->schedule;
3419   ix86_tune = (enum processor_type) ptr->tune;
3420   ix86_fpmath = (enum fpmath_unit) ptr->fpmath;
3421   ix86_branch_cost = ptr->branch_cost;
3422   ix86_tune_defaulted = ptr->tune_defaulted;
3423   ix86_arch_specified = ptr->arch_specified;
3424   ix86_isa_flags_explicit = ptr->ix86_isa_flags_explicit;
3425   target_flags_explicit = ptr->target_flags_explicit;
3426
3427   /* Recreate the arch feature tests if the arch changed */
3428   if (old_arch != ix86_arch)
3429     {
3430       ix86_arch_mask = 1u << ix86_arch;
3431       for (i = 0; i < X86_ARCH_LAST; ++i)
3432         ix86_arch_features[i]
3433           = !!(initial_ix86_arch_features[i] & ix86_arch_mask);
3434     }
3435
3436   /* Recreate the tune optimization tests */
3437   if (old_tune != ix86_tune)
3438     {
3439       ix86_tune_mask = 1u << ix86_tune;
3440       for (i = 0; i < X86_TUNE_LAST; ++i)
3441         ix86_tune_features[i]
3442           = !!(initial_ix86_tune_features[i] & ix86_tune_mask);
3443     }
3444 }
3445
3446 /* Print the current options */
3447
3448 static void
3449 ix86_function_specific_print (FILE *file, int indent,
3450                               struct cl_target_option *ptr)
3451 {
3452   char *target_string
3453     = ix86_target_string (ptr->ix86_isa_flags, ptr->target_flags,
3454                           NULL, NULL, NULL, false);
3455
3456   fprintf (file, "%*sarch = %d (%s)\n",
3457            indent, "",
3458            ptr->arch,
3459            ((ptr->arch < TARGET_CPU_DEFAULT_max)
3460             ? cpu_names[ptr->arch]
3461             : "<unknown>"));
3462
3463   fprintf (file, "%*stune = %d (%s)\n",
3464            indent, "",
3465            ptr->tune,
3466            ((ptr->tune < TARGET_CPU_DEFAULT_max)
3467             ? cpu_names[ptr->tune]
3468             : "<unknown>"));
3469
3470   fprintf (file, "%*sfpmath = %d%s%s\n", indent, "", ptr->fpmath,
3471            (ptr->fpmath & FPMATH_387) ? ", 387" : "",
3472            (ptr->fpmath & FPMATH_SSE) ? ", sse" : "");
3473   fprintf (file, "%*sbranch_cost = %d\n", indent, "", ptr->branch_cost);
3474
3475   if (target_string)
3476     {
3477       fprintf (file, "%*s%s\n", indent, "", target_string);
3478       free (target_string);
3479     }
3480 }
3481
3482 \f
3483 /* Inner function to process the attribute((target(...))), take an argument and
3484    set the current options from the argument. If we have a list, recursively go
3485    over the list.  */
3486
3487 static bool
3488 ix86_valid_target_attribute_inner_p (tree args, char *p_strings[])
3489 {
3490   char *next_optstr;
3491   bool ret = true;
3492
3493 #define IX86_ATTR_ISA(S,O)   { S, sizeof (S)-1, ix86_opt_isa, O, 0 }
3494 #define IX86_ATTR_STR(S,O)   { S, sizeof (S)-1, ix86_opt_str, O, 0 }
3495 #define IX86_ATTR_YES(S,O,M) { S, sizeof (S)-1, ix86_opt_yes, O, M }
3496 #define IX86_ATTR_NO(S,O,M)  { S, sizeof (S)-1, ix86_opt_no,  O, M }
3497
3498   enum ix86_opt_type
3499   {
3500     ix86_opt_unknown,
3501     ix86_opt_yes,
3502     ix86_opt_no,
3503     ix86_opt_str,
3504     ix86_opt_isa
3505   };
3506
3507   static const struct
3508   {
3509     const char *string;
3510     size_t len;
3511     enum ix86_opt_type type;
3512     int opt;
3513     int mask;
3514   } attrs[] = {
3515     /* isa options */
3516     IX86_ATTR_ISA ("3dnow",     OPT_m3dnow),
3517     IX86_ATTR_ISA ("abm",       OPT_mabm),
3518     IX86_ATTR_ISA ("aes",       OPT_maes),
3519     IX86_ATTR_ISA ("avx",       OPT_mavx),
3520     IX86_ATTR_ISA ("mmx",       OPT_mmmx),
3521     IX86_ATTR_ISA ("pclmul",    OPT_mpclmul),
3522     IX86_ATTR_ISA ("popcnt",    OPT_mpopcnt),
3523     IX86_ATTR_ISA ("sse",       OPT_msse),
3524     IX86_ATTR_ISA ("sse2",      OPT_msse2),
3525     IX86_ATTR_ISA ("sse3",      OPT_msse3),
3526     IX86_ATTR_ISA ("sse4",      OPT_msse4),
3527     IX86_ATTR_ISA ("sse4.1",    OPT_msse4_1),
3528     IX86_ATTR_ISA ("sse4.2",    OPT_msse4_2),
3529     IX86_ATTR_ISA ("sse4a",     OPT_msse4a),
3530     IX86_ATTR_ISA ("sse5",      OPT_msse5),
3531     IX86_ATTR_ISA ("ssse3",     OPT_mssse3),
3532
3533     /* string options */
3534     IX86_ATTR_STR ("arch=",     IX86_FUNCTION_SPECIFIC_ARCH),
3535     IX86_ATTR_STR ("fpmath=",   IX86_FUNCTION_SPECIFIC_FPMATH),
3536     IX86_ATTR_STR ("tune=",     IX86_FUNCTION_SPECIFIC_TUNE),
3537
3538     /* flag options */
3539     IX86_ATTR_YES ("cld",
3540                    OPT_mcld,
3541                    MASK_CLD),
3542
3543     IX86_ATTR_NO ("fancy-math-387",
3544                   OPT_mfancy_math_387,
3545                   MASK_NO_FANCY_MATH_387),
3546
3547     IX86_ATTR_NO ("fused-madd",
3548                   OPT_mfused_madd,
3549                   MASK_NO_FUSED_MADD),
3550
3551     IX86_ATTR_YES ("ieee-fp",
3552                    OPT_mieee_fp,
3553                    MASK_IEEE_FP),
3554
3555     IX86_ATTR_YES ("inline-all-stringops",
3556                    OPT_minline_all_stringops,
3557                    MASK_INLINE_ALL_STRINGOPS),
3558
3559     IX86_ATTR_YES ("inline-stringops-dynamically",
3560                    OPT_minline_stringops_dynamically,
3561                    MASK_INLINE_STRINGOPS_DYNAMICALLY),
3562
3563     IX86_ATTR_NO ("align-stringops",
3564                   OPT_mno_align_stringops,
3565                   MASK_NO_ALIGN_STRINGOPS),
3566
3567     IX86_ATTR_YES ("recip",
3568                    OPT_mrecip,
3569                    MASK_RECIP),
3570
3571   };
3572
3573   /* If this is a list, recurse to get the options.  */
3574   if (TREE_CODE (args) == TREE_LIST)
3575     {
3576       bool ret = true;
3577
3578       for (; args; args = TREE_CHAIN (args))
3579         if (TREE_VALUE (args)
3580             && !ix86_valid_target_attribute_inner_p (TREE_VALUE (args), p_strings))
3581           ret = false;
3582
3583       return ret;
3584     }
3585
3586   else if (TREE_CODE (args) != STRING_CST)
3587     gcc_unreachable ();
3588
3589   /* Handle multiple arguments separated by commas.  */
3590   next_optstr = ASTRDUP (TREE_STRING_POINTER (args));
3591
3592   while (next_optstr && *next_optstr != '\0')
3593     {
3594       char *p = next_optstr;
3595       char *orig_p = p;
3596       char *comma = strchr (next_optstr, ',');
3597       const char *opt_string;
3598       size_t len, opt_len;
3599       int opt;
3600       bool opt_set_p;
3601       char ch;
3602       unsigned i;
3603       enum ix86_opt_type type = ix86_opt_unknown;
3604       int mask = 0;
3605
3606       if (comma)
3607         {
3608           *comma = '\0';
3609           len = comma - next_optstr;
3610           next_optstr = comma + 1;
3611         }
3612       else
3613         {
3614           len = strlen (p);
3615           next_optstr = NULL;
3616         }
3617
3618       /* Recognize no-xxx.  */
3619       if (len > 3 && p[0] == 'n' && p[1] == 'o' && p[2] == '-')
3620         {
3621           opt_set_p = false;
3622           p += 3;
3623           len -= 3;
3624         }
3625       else
3626         opt_set_p = true;
3627
3628       /* Find the option.  */
3629       ch = *p;
3630       opt = N_OPTS;
3631       for (i = 0; i < ARRAY_SIZE (attrs); i++)
3632         {
3633           type = attrs[i].type;
3634           opt_len = attrs[i].len;
3635           if (ch == attrs[i].string[0]
3636               && ((type != ix86_opt_str) ? len == opt_len : len > opt_len)
3637               && memcmp (p, attrs[i].string, opt_len) == 0)
3638             {
3639               opt = attrs[i].opt;
3640               mask = attrs[i].mask;
3641               opt_string = attrs[i].string;
3642               break;
3643             }
3644         }
3645
3646       /* Process the option.  */
3647       if (opt == N_OPTS)
3648         {
3649           error ("attribute(target(\"%s\")) is unknown", orig_p);
3650           ret = false;
3651         }
3652
3653       else if (type == ix86_opt_isa)
3654         ix86_handle_option (opt, p, opt_set_p);
3655
3656       else if (type == ix86_opt_yes || type == ix86_opt_no)
3657         {
3658           if (type == ix86_opt_no)
3659             opt_set_p = !opt_set_p;
3660
3661           if (opt_set_p)
3662             target_flags |= mask;
3663           else
3664             target_flags &= ~mask;
3665         }
3666
3667       else if (type == ix86_opt_str)
3668         {
3669           if (p_strings[opt])
3670             {
3671               error ("option(\"%s\") was already specified", opt_string);
3672               ret = false;
3673             }
3674           else
3675             p_strings[opt] = xstrdup (p + opt_len);
3676         }
3677
3678       else
3679         gcc_unreachable ();
3680     }
3681
3682   return ret;
3683 }
3684
3685 /* Return a TARGET_OPTION_NODE tree of the target options listed or NULL.  */
3686
3687 tree
3688 ix86_valid_target_attribute_tree (tree args)
3689 {
3690   const char *orig_arch_string = ix86_arch_string;
3691   const char *orig_tune_string = ix86_tune_string;
3692   const char *orig_fpmath_string = ix86_fpmath_string;
3693   int orig_tune_defaulted = ix86_tune_defaulted;
3694   int orig_arch_specified = ix86_arch_specified;
3695   char *option_strings[IX86_FUNCTION_SPECIFIC_MAX] = { NULL, NULL, NULL };
3696   tree t = NULL_TREE;
3697   int i;
3698   struct cl_target_option *def
3699     = TREE_TARGET_OPTION (target_option_default_node);
3700
3701   /* Process each of the options on the chain.  */
3702   if (! ix86_valid_target_attribute_inner_p (args, option_strings))
3703     return NULL_TREE;
3704
3705   /* If the changed options are different from the default, rerun override_options,
3706      and then save the options away.  The string options are are attribute options,
3707      and will be undone when we copy the save structure.  */
3708   if (ix86_isa_flags != def->ix86_isa_flags
3709       || target_flags != def->target_flags
3710       || option_strings[IX86_FUNCTION_SPECIFIC_ARCH]
3711       || option_strings[IX86_FUNCTION_SPECIFIC_TUNE]
3712       || option_strings[IX86_FUNCTION_SPECIFIC_FPMATH])
3713     {
3714       /* If we are using the default tune= or arch=, undo the string assigned,
3715          and use the default.  */
3716       if (option_strings[IX86_FUNCTION_SPECIFIC_ARCH])
3717         ix86_arch_string = option_strings[IX86_FUNCTION_SPECIFIC_ARCH];
3718       else if (!orig_arch_specified)
3719         ix86_arch_string = NULL;
3720
3721       if (option_strings[IX86_FUNCTION_SPECIFIC_TUNE])
3722         ix86_tune_string = option_strings[IX86_FUNCTION_SPECIFIC_TUNE];
3723       else if (orig_tune_defaulted)
3724         ix86_tune_string = NULL;
3725
3726       /* If fpmath= is not set, and we now have sse2 on 32-bit, use it.  */
3727       if (option_strings[IX86_FUNCTION_SPECIFIC_FPMATH])
3728         ix86_fpmath_string = option_strings[IX86_FUNCTION_SPECIFIC_FPMATH];
3729       else if (!TARGET_64BIT && TARGET_SSE)
3730         ix86_fpmath_string = "sse,387";
3731
3732       /* Do any overrides, such as arch=xxx, or tune=xxx support.  */
3733       override_options (false);
3734
3735       /* Add any builtin functions with the new isa if any.  */
3736       ix86_add_new_builtins (ix86_isa_flags);
3737
3738       /* Save the current options unless we are validating options for
3739          #pragma.  */
3740       t = build_target_option_node ();
3741
3742       ix86_arch_string = orig_arch_string;
3743       ix86_tune_string = orig_tune_string;
3744       ix86_fpmath_string = orig_fpmath_string;
3745
3746       /* Free up memory allocated to hold the strings */
3747       for (i = 0; i < IX86_FUNCTION_SPECIFIC_MAX; i++)
3748         if (option_strings[i])
3749           free (option_strings[i]);
3750     }
3751
3752   return t;
3753 }
3754
3755 /* Hook to validate attribute((target("string"))).  */
3756
3757 static bool
3758 ix86_valid_target_attribute_p (tree fndecl,
3759                                tree ARG_UNUSED (name),
3760                                tree args,
3761                                int ARG_UNUSED (flags))
3762 {
3763   struct cl_target_option cur_target;
3764   bool ret = true;
3765   tree old_optimize = build_optimization_node ();
3766   tree new_target, new_optimize;
3767   tree func_optimize = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl);
3768
3769   /* If the function changed the optimization levels as well as setting target
3770      options, start with the optimizations specified.  */
3771   if (func_optimize && func_optimize != old_optimize)
3772     cl_optimization_restore (TREE_OPTIMIZATION (func_optimize));
3773
3774   /* The target attributes may also change some optimization flags, so update
3775      the optimization options if necessary.  */
3776   cl_target_option_save (&cur_target);
3777   new_target = ix86_valid_target_attribute_tree (args);
3778   new_optimize = build_optimization_node ();
3779
3780   if (!new_target)
3781     ret = false;
3782
3783   else if (fndecl)
3784     {
3785       DECL_FUNCTION_SPECIFIC_TARGET (fndecl) = new_target;
3786
3787       if (old_optimize != new_optimize)
3788         DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl) = new_optimize;
3789     }
3790
3791   cl_target_option_restore (&cur_target);
3792
3793   if (old_optimize != new_optimize)
3794     cl_optimization_restore (TREE_OPTIMIZATION (old_optimize));
3795
3796   return ret;
3797 }
3798
3799 \f
3800 /* Hook to determine if one function can safely inline another.  */
3801
3802 static bool
3803 ix86_can_inline_p (tree caller, tree callee)
3804 {
3805   bool ret = false;
3806   tree caller_tree = DECL_FUNCTION_SPECIFIC_TARGET (caller);
3807   tree callee_tree = DECL_FUNCTION_SPECIFIC_TARGET (callee);
3808
3809   /* If callee has no option attributes, then it is ok to inline.  */
3810   if (!callee_tree)
3811     ret = true;
3812
3813   /* If caller has no option attributes, but callee does then it is not ok to
3814      inline.  */
3815   else if (!caller_tree)
3816     ret = false;
3817
3818   else
3819     {
3820       struct cl_target_option *caller_opts = TREE_TARGET_OPTION (caller_tree);
3821       struct cl_target_option *callee_opts = TREE_TARGET_OPTION (callee_tree);
3822
3823       /* Callee's isa options should a subset of the caller's, i.e. a SSE5 function
3824          can inline a SSE2 function but a SSE2 function can't inline a SSE5
3825          function.  */
3826       if ((caller_opts->ix86_isa_flags & callee_opts->ix86_isa_flags)
3827           != callee_opts->ix86_isa_flags)
3828         ret = false;
3829
3830       /* See if we have the same non-isa options.  */
3831       else if (caller_opts->target_flags != callee_opts->target_flags)
3832         ret = false;
3833
3834       /* See if arch, tune, etc. are the same.  */
3835       else if (caller_opts->arch != callee_opts->arch)
3836         ret = false;
3837
3838       else if (caller_opts->tune != callee_opts->tune)
3839         ret = false;
3840
3841       else if (caller_opts->fpmath != callee_opts->fpmath)
3842         ret = false;
3843
3844       else if (caller_opts->branch_cost != callee_opts->branch_cost)
3845         ret = false;
3846
3847       else
3848         ret = true;
3849     }
3850
3851   return ret;
3852 }
3853
3854 \f
3855 /* Remember the last target of ix86_set_current_function.  */
3856 static GTY(()) tree ix86_previous_fndecl;
3857
3858 /* Establish appropriate back-end context for processing the function
3859    FNDECL.  The argument might be NULL to indicate processing at top
3860    level, outside of any function scope.  */
3861 static void
3862 ix86_set_current_function (tree fndecl)
3863 {
3864   /* Only change the context if the function changes.  This hook is called
3865      several times in the course of compiling a function, and we don't want to
3866      slow things down too much or call target_reinit when it isn't safe.  */
3867   if (fndecl && fndecl != ix86_previous_fndecl)
3868     {
3869       tree old_tree = (ix86_previous_fndecl
3870                        ? DECL_FUNCTION_SPECIFIC_TARGET (ix86_previous_fndecl)
3871                        : NULL_TREE);
3872
3873       tree new_tree = (fndecl
3874                        ? DECL_FUNCTION_SPECIFIC_TARGET (fndecl)
3875                        : NULL_TREE);
3876
3877       ix86_previous_fndecl = fndecl;
3878       if (old_tree == new_tree)
3879         ;
3880
3881       else if (new_tree)
3882         {
3883           cl_target_option_restore (TREE_TARGET_OPTION (new_tree));
3884           target_reinit ();
3885         }
3886
3887       else if (old_tree)
3888         {
3889           struct cl_target_option *def
3890             = TREE_TARGET_OPTION (target_option_current_node);
3891
3892           cl_target_option_restore (def);
3893           target_reinit ();
3894         }
3895     }
3896 }
3897
3898 \f
3899 /* Return true if this goes in large data/bss.  */
3900
3901 static bool
3902 ix86_in_large_data_p (tree exp)
3903 {
3904   if (ix86_cmodel != CM_MEDIUM && ix86_cmodel != CM_MEDIUM_PIC)
3905     return false;
3906
3907   /* Functions are never large data.  */
3908   if (TREE_CODE (exp) == FUNCTION_DECL)
3909     return false;
3910
3911   if (TREE_CODE (exp) == VAR_DECL && DECL_SECTION_NAME (exp))
3912     {
3913       const char *section = TREE_STRING_POINTER (DECL_SECTION_NAME (exp));
3914       if (strcmp (section, ".ldata") == 0
3915           || strcmp (section, ".lbss") == 0)
3916         return true;
3917       return false;
3918     }
3919   else
3920     {
3921       HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (exp));
3922
3923       /* If this is an incomplete type with size 0, then we can't put it
3924          in data because it might be too big when completed.  */
3925       if (!size || size > ix86_section_threshold)
3926         return true;
3927     }
3928
3929   return false;
3930 }
3931
3932 /* Switch to the appropriate section for output of DECL.
3933    DECL is either a `VAR_DECL' node or a constant of some sort.
3934    RELOC indicates whether forming the initial value of DECL requires
3935    link-time relocations.  */
3936
3937 static section * x86_64_elf_select_section (tree, int, unsigned HOST_WIDE_INT)
3938         ATTRIBUTE_UNUSED;
3939
3940 static section *
3941 x86_64_elf_select_section (tree decl, int reloc,
3942                            unsigned HOST_WIDE_INT align)
3943 {
3944   if ((ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_MEDIUM_PIC)
3945       && ix86_in_large_data_p (decl))
3946     {
3947       const char *sname = NULL;
3948       unsigned int flags = SECTION_WRITE;
3949       switch (categorize_decl_for_section (decl, reloc))
3950         {
3951         case SECCAT_DATA:
3952           sname = ".ldata";
3953           break;
3954         case SECCAT_DATA_REL:
3955           sname = ".ldata.rel";
3956           break;
3957         case SECCAT_DATA_REL_LOCAL:
3958           sname = ".ldata.rel.local";
3959           break;
3960         case SECCAT_DATA_REL_RO:
3961           sname = ".ldata.rel.ro";
3962           break;
3963         case SECCAT_DATA_REL_RO_LOCAL:
3964           sname = ".ldata.rel.ro.local";
3965           break;
3966         case SECCAT_BSS:
3967           sname = ".lbss";
3968           flags |= SECTION_BSS;
3969           break;
3970         case SECCAT_RODATA:
3971         case SECCAT_RODATA_MERGE_STR:
3972         case SECCAT_RODATA_MERGE_STR_INIT:
3973         case SECCAT_RODATA_MERGE_CONST:
3974           sname = ".lrodata";
3975           flags = 0;
3976           break;
3977         case SECCAT_SRODATA:
3978         case SECCAT_SDATA:
3979         case SECCAT_SBSS:
3980           gcc_unreachable ();
3981         case SECCAT_TEXT:
3982         case SECCAT_TDATA:
3983         case SECCAT_TBSS:
3984           /* We don't split these for medium model.  Place them into
3985              default sections and hope for best.  */
3986           break;
3987         case SECCAT_EMUTLS_VAR:
3988         case SECCAT_EMUTLS_TMPL:
3989           gcc_unreachable ();
3990         }
3991       if (sname)
3992         {
3993           /* We might get called with string constants, but get_named_section
3994              doesn't like them as they are not DECLs.  Also, we need to set
3995              flags in that case.  */
3996           if (!DECL_P (decl))
3997             return get_section (sname, flags, NULL);
3998           return get_named_section (decl, sname, reloc);
3999         }
4000     }
4001   return default_elf_select_section (decl, reloc, align);
4002 }
4003
4004 /* Build up a unique section name, expressed as a
4005    STRING_CST node, and assign it to DECL_SECTION_NAME (decl).
4006    RELOC indicates whether the initial value of EXP requires
4007    link-time relocations.  */
4008
4009 static void ATTRIBUTE_UNUSED
4010 x86_64_elf_unique_section (tree decl, int reloc)
4011 {
4012   if ((ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_MEDIUM_PIC)
4013       && ix86_in_large_data_p (decl))
4014     {
4015       const char *prefix = NULL;
4016       /* We only need to use .gnu.linkonce if we don't have COMDAT groups.  */
4017       bool one_only = DECL_ONE_ONLY (decl) && !HAVE_COMDAT_GROUP;
4018
4019       switch (categorize_decl_for_section (decl, reloc))
4020         {
4021         case SECCAT_DATA:
4022         case SECCAT_DATA_REL:
4023         case SECCAT_DATA_REL_LOCAL:
4024         case SECCAT_DATA_REL_RO:
4025         case SECCAT_DATA_REL_RO_LOCAL:
4026           prefix = one_only ? ".ld" : ".ldata";
4027           break;
4028         case SECCAT_BSS:
4029           prefix = one_only ? ".lb" : ".lbss";
4030           break;
4031         case SECCAT_RODATA:
4032         case SECCAT_RODATA_MERGE_STR:
4033         case SECCAT_RODATA_MERGE_STR_INIT:
4034         case SECCAT_RODATA_MERGE_CONST:
4035           prefix = one_only ? ".lr" : ".lrodata";
4036           break;
4037         case SECCAT_SRODATA:
4038         case SECCAT_SDATA:
4039         case SECCAT_SBSS:
4040           gcc_unreachable ();
4041         case SECCAT_TEXT:
4042         case SECCAT_TDATA:
4043         case SECCAT_TBSS:
4044           /* We don't split these for medium model.  Place them into
4045              default sections and hope for best.  */
4046           break;
4047         case SECCAT_EMUTLS_VAR:
4048           prefix = targetm.emutls.var_section;
4049           break;
4050         case SECCAT_EMUTLS_TMPL:
4051           prefix = targetm.emutls.tmpl_section;
4052           break;
4053         }
4054       if (prefix)
4055         {
4056           const char *name, *linkonce;
4057           char *string;
4058
4059           name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
4060           name = targetm.strip_name_encoding (name);
4061           
4062           /* If we're using one_only, then there needs to be a .gnu.linkonce
4063              prefix to the section name.  */
4064           linkonce = one_only ? ".gnu.linkonce" : "";
4065   
4066           string = ACONCAT ((linkonce, prefix, ".", name, NULL));
4067           
4068           DECL_SECTION_NAME (decl) = build_string (strlen (string), string);
4069           return;
4070         }
4071     }
4072   default_unique_section (decl, reloc);
4073 }
4074
4075 #ifdef COMMON_ASM_OP
4076 /* This says how to output assembler code to declare an
4077    uninitialized external linkage data object.
4078
4079    For medium model x86-64 we need to use .largecomm opcode for
4080    large objects.  */
4081 void
4082 x86_elf_aligned_common (FILE *file,
4083                         const char *name, unsigned HOST_WIDE_INT size,
4084                         int align)
4085 {
4086   if ((ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_MEDIUM_PIC)
4087       && size > (unsigned int)ix86_section_threshold)
4088     fprintf (file, ".largecomm\t");
4089   else
4090     fprintf (file, "%s", COMMON_ASM_OP);
4091   assemble_name (file, name);
4092   fprintf (file, ","HOST_WIDE_INT_PRINT_UNSIGNED",%u\n",
4093            size, align / BITS_PER_UNIT);
4094 }
4095 #endif
4096
4097 /* Utility function for targets to use in implementing
4098    ASM_OUTPUT_ALIGNED_BSS.  */
4099
4100 void
4101 x86_output_aligned_bss (FILE *file, tree decl ATTRIBUTE_UNUSED,
4102                         const char *name, unsigned HOST_WIDE_INT size,
4103                         int align)
4104 {
4105   if ((ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_MEDIUM_PIC)
4106       && size > (unsigned int)ix86_section_threshold)
4107     switch_to_section (get_named_section (decl, ".lbss", 0));
4108   else
4109     switch_to_section (bss_section);
4110   ASM_OUTPUT_ALIGN (file, floor_log2 (align / BITS_PER_UNIT));
4111 #ifdef ASM_DECLARE_OBJECT_NAME
4112   last_assemble_variable_decl = decl;
4113   ASM_DECLARE_OBJECT_NAME (file, name, decl);
4114 #else
4115   /* Standard thing is just output label for the object.  */
4116   ASM_OUTPUT_LABEL (file, name);
4117 #endif /* ASM_DECLARE_OBJECT_NAME */
4118   ASM_OUTPUT_SKIP (file, size ? size : 1);
4119 }
4120 \f
4121 void
4122 optimization_options (int level, int size ATTRIBUTE_UNUSED)
4123 {
4124   /* For -O2 and beyond, turn off -fschedule-insns by default.  It tends to
4125      make the problem with not enough registers even worse.  */
4126 #ifdef INSN_SCHEDULING
4127   if (level > 1)
4128     flag_schedule_insns = 0;
4129 #endif
4130
4131   if (TARGET_MACHO)
4132     /* The Darwin libraries never set errno, so we might as well
4133        avoid calling them when that's the only reason we would.  */
4134     flag_errno_math = 0;
4135
4136   /* The default values of these switches depend on the TARGET_64BIT
4137      that is not known at this moment.  Mark these values with 2 and
4138      let user the to override these.  In case there is no command line option
4139      specifying them, we will set the defaults in override_options.  */
4140   if (optimize >= 1)
4141     flag_omit_frame_pointer = 2;
4142   flag_pcc_struct_return = 2;
4143   flag_asynchronous_unwind_tables = 2;
4144   flag_vect_cost_model = 1;
4145 #ifdef SUBTARGET_OPTIMIZATION_OPTIONS
4146   SUBTARGET_OPTIMIZATION_OPTIONS;
4147 #endif
4148 }
4149 \f
4150 /* Decide whether we can make a sibling call to a function.  DECL is the
4151    declaration of the function being targeted by the call and EXP is the
4152    CALL_EXPR representing the call.  */
4153
4154 static bool
4155 ix86_function_ok_for_sibcall (tree decl, tree exp)
4156 {
4157   tree func;
4158   rtx a, b;
4159
4160   /* If we are generating position-independent code, we cannot sibcall
4161      optimize any indirect call, or a direct call to a global function,
4162      as the PLT requires %ebx be live.  */
4163   if (!TARGET_64BIT && flag_pic && (!decl || !targetm.binds_local_p (decl)))
4164     return false;
4165
4166   if (decl)
4167     func = decl;
4168   else
4169     {
4170       func = TREE_TYPE (CALL_EXPR_FN (exp));
4171       if (POINTER_TYPE_P (func))
4172         func = TREE_TYPE (func);
4173     }
4174
4175   /* Check that the return value locations are the same.  Like
4176      if we are returning floats on the 80387 register stack, we cannot
4177      make a sibcall from a function that doesn't return a float to a
4178      function that does or, conversely, from a function that does return
4179      a float to a function that doesn't; the necessary stack adjustment
4180      would not be executed.  This is also the place we notice
4181      differences in the return value ABI.  Note that it is ok for one
4182      of the functions to have void return type as long as the return
4183      value of the other is passed in a register.  */
4184   a = ix86_function_value (TREE_TYPE (exp), func, false);
4185   b = ix86_function_value (TREE_TYPE (DECL_RESULT (cfun->decl)),
4186                            cfun->decl, false);
4187   if (STACK_REG_P (a) || STACK_REG_P (b))
4188     {
4189       if (!rtx_equal_p (a, b))
4190         return false;
4191     }
4192   else if (VOID_TYPE_P (TREE_TYPE (DECL_RESULT (cfun->decl))))
4193     ;
4194   else if (!rtx_equal_p (a, b))
4195     return false;
4196
4197   /* If this call is indirect, we'll need to be able to use a call-clobbered
4198      register for the address of the target function.  Make sure that all
4199      such registers are not used for passing parameters.  */
4200   if (!decl && !TARGET_64BIT)
4201     {
4202       tree type;
4203
4204       /* We're looking at the CALL_EXPR, we need the type of the function.  */
4205       type = CALL_EXPR_FN (exp);                /* pointer expression */
4206       type = TREE_TYPE (type);                  /* pointer type */
4207       type = TREE_TYPE (type);                  /* function type */
4208
4209       if (ix86_function_regparm (type, NULL) >= 3)
4210         {
4211           /* ??? Need to count the actual number of registers to be used,
4212              not the possible number of registers.  Fix later.  */
4213           return false;
4214         }
4215     }
4216
4217   /* Dllimport'd functions are also called indirectly.  */
4218   if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
4219       && !TARGET_64BIT
4220       && decl && DECL_DLLIMPORT_P (decl)
4221       && ix86_function_regparm (TREE_TYPE (decl), NULL) >= 3)
4222     return false;
4223
4224   /* If we need to align the outgoing stack, then sibcalling would
4225      unalign the stack, which may break the called function.  */
4226   if (ix86_incoming_stack_boundary < PREFERRED_STACK_BOUNDARY)
4227     return false;
4228
4229   /* Otherwise okay.  That also includes certain types of indirect calls.  */
4230   return true;
4231 }
4232
4233 /* Handle "cdecl", "stdcall", "fastcall", "regparm" and "sseregparm"
4234    calling convention attributes;
4235    arguments as in struct attribute_spec.handler.  */
4236
4237 static tree
4238 ix86_handle_cconv_attribute (tree *node, tree name,
4239                                    tree args,
4240                                    int flags ATTRIBUTE_UNUSED,
4241                                    bool *no_add_attrs)
4242 {
4243   if (TREE_CODE (*node) != FUNCTION_TYPE
4244       && TREE_CODE (*node) != METHOD_TYPE
4245       && TREE_CODE (*node) != FIELD_DECL
4246       && TREE_CODE (*node) != TYPE_DECL)
4247     {
4248       warning (OPT_Wattributes, "%qE attribute only applies to functions",
4249                name);
4250       *no_add_attrs = true;
4251       return NULL_TREE;
4252     }
4253
4254   /* Can combine regparm with all attributes but fastcall.  */
4255   if (is_attribute_p ("regparm", name))
4256     {
4257       tree cst;
4258
4259       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (*node)))
4260         {
4261           error ("fastcall and regparm attributes are not compatible");
4262         }
4263
4264       cst = TREE_VALUE (args);
4265       if (TREE_CODE (cst) != INTEGER_CST)
4266         {
4267           warning (OPT_Wattributes,
4268                    "%qE attribute requires an integer constant argument",
4269                    name);
4270           *no_add_attrs = true;
4271         }
4272       else if (compare_tree_int (cst, REGPARM_MAX) > 0)
4273         {
4274           warning (OPT_Wattributes, "argument to %qE attribute larger than %d",
4275                    name, REGPARM_MAX);
4276           *no_add_attrs = true;
4277         }
4278
4279       return NULL_TREE;
4280     }
4281
4282   if (TARGET_64BIT)
4283     {
4284       /* Do not warn when emulating the MS ABI.  */
4285       if (TREE_CODE (*node) != FUNCTION_TYPE || ix86_function_type_abi (*node)!=MS_ABI)
4286         warning (OPT_Wattributes, "%qE attribute ignored",
4287                  name);
4288       *no_add_attrs = true;
4289       return NULL_TREE;
4290     }
4291
4292   /* Can combine fastcall with stdcall (redundant) and sseregparm.  */
4293   if (is_attribute_p ("fastcall", name))
4294     {
4295       if (lookup_attribute ("cdecl", TYPE_ATTRIBUTES (*node)))
4296         {
4297           error ("fastcall and cdecl attributes are not compatible");
4298         }
4299       if (lookup_attribute ("stdcall", TYPE_ATTRIBUTES (*node)))
4300         {
4301           error ("fastcall and stdcall attributes are not compatible");
4302         }
4303       if (lookup_attribute ("regparm", TYPE_ATTRIBUTES (*node)))
4304         {
4305           error ("fastcall and regparm attributes are not compatible");
4306         }
4307     }
4308
4309   /* Can combine stdcall with fastcall (redundant), regparm and
4310      sseregparm.  */
4311   else if (is_attribute_p ("stdcall", name))
4312     {
4313       if (lookup_attribute ("cdecl", TYPE_ATTRIBUTES (*node)))
4314         {
4315           error ("stdcall and cdecl attributes are not compatible");
4316         }
4317       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (*node)))
4318         {
4319           error ("stdcall and fastcall attributes are not compatible");
4320         }
4321     }
4322
4323   /* Can combine cdecl with regparm and sseregparm.  */
4324   else if (is_attribute_p ("cdecl", name))
4325     {
4326       if (lookup_attribute ("stdcall", TYPE_ATTRIBUTES (*node)))
4327         {
4328           error ("stdcall and cdecl attributes are not compatible");
4329         }
4330       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (*node)))
4331         {
4332           error ("fastcall and cdecl attributes are not compatible");
4333         }
4334     }
4335
4336   /* Can combine sseregparm with all attributes.  */
4337
4338   return NULL_TREE;
4339 }
4340
4341 /* Return 0 if the attributes for two types are incompatible, 1 if they
4342    are compatible, and 2 if they are nearly compatible (which causes a
4343    warning to be generated).  */
4344
4345 static int
4346 ix86_comp_type_attributes (const_tree type1, const_tree type2)
4347 {
4348   /* Check for mismatch of non-default calling convention.  */
4349   const char *const rtdstr = TARGET_RTD ? "cdecl" : "stdcall";
4350
4351   if (TREE_CODE (type1) != FUNCTION_TYPE
4352       && TREE_CODE (type1) != METHOD_TYPE)
4353     return 1;
4354
4355   /* Check for mismatched fastcall/regparm types.  */
4356   if ((!lookup_attribute ("fastcall", TYPE_ATTRIBUTES (type1))
4357        != !lookup_attribute ("fastcall", TYPE_ATTRIBUTES (type2)))
4358       || (ix86_function_regparm (type1, NULL)
4359           != ix86_function_regparm (type2, NULL)))
4360     return 0;
4361
4362   /* Check for mismatched sseregparm types.  */
4363   if (!lookup_attribute ("sseregparm", TYPE_ATTRIBUTES (type1))
4364       != !lookup_attribute ("sseregparm", TYPE_ATTRIBUTES (type2)))
4365     return 0;
4366
4367   /* Check for mismatched return types (cdecl vs stdcall).  */
4368   if (!lookup_attribute (rtdstr, TYPE_ATTRIBUTES (type1))
4369       != !lookup_attribute (rtdstr, TYPE_ATTRIBUTES (type2)))
4370     return 0;
4371
4372   return 1;
4373 }
4374 \f
4375 /* Return the regparm value for a function with the indicated TYPE and DECL.
4376    DECL may be NULL when calling function indirectly
4377    or considering a libcall.  */
4378
4379 static int
4380 ix86_function_regparm (const_tree type, const_tree decl)
4381 {
4382   tree attr;
4383   int regparm;
4384
4385   static bool error_issued;
4386
4387   if (TARGET_64BIT)
4388     return (ix86_function_type_abi (type) == SYSV_ABI
4389             ? X86_64_REGPARM_MAX : X64_REGPARM_MAX);
4390
4391   regparm = ix86_regparm;
4392   attr = lookup_attribute ("regparm", TYPE_ATTRIBUTES (type));
4393   if (attr)
4394     {
4395       regparm
4396         = TREE_INT_CST_LOW (TREE_VALUE (TREE_VALUE (attr)));
4397
4398       if (decl && TREE_CODE (decl) == FUNCTION_DECL)
4399         {
4400           /* We can't use regparm(3) for nested functions because
4401              these pass static chain pointer in %ecx register.  */
4402           if (!error_issued && regparm == 3
4403               && decl_function_context (decl)
4404               && !DECL_NO_STATIC_CHAIN (decl))
4405             {
4406               error ("nested functions are limited to 2 register parameters");
4407               error_issued = true;
4408               return 0;
4409             }
4410         }
4411
4412       return regparm;
4413     }
4414
4415   if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (type)))
4416     return 2;
4417
4418   /* Use register calling convention for local functions when possible.  */
4419   if (decl
4420       && TREE_CODE (decl) == FUNCTION_DECL
4421       && optimize
4422       && !profile_flag)
4423     {
4424       /* FIXME: remove this CONST_CAST when cgraph.[ch] is constified.  */
4425       struct cgraph_local_info *i = cgraph_local_info (CONST_CAST_TREE(decl));
4426       if (i && i->local)
4427         {
4428           int local_regparm, globals = 0, regno;
4429           struct function *f;
4430
4431           /* Make sure no regparm register is taken by a
4432              fixed register variable.  */
4433           for (local_regparm = 0; local_regparm < REGPARM_MAX; local_regparm++)
4434             if (fixed_regs[local_regparm])
4435               break;
4436
4437           /* We can't use regparm(3) for nested functions as these use
4438              static chain pointer in third argument.  */
4439           if (local_regparm == 3
4440               && decl_function_context (decl)
4441               && !DECL_NO_STATIC_CHAIN (decl))
4442             local_regparm = 2;
4443
4444           /* If the function realigns its stackpointer, the prologue will
4445              clobber %ecx.  If we've already generated code for the callee,
4446              the callee DECL_STRUCT_FUNCTION is gone, so we fall back to
4447              scanning the attributes for the self-realigning property.  */
4448           f = DECL_STRUCT_FUNCTION (decl);
4449           /* Since current internal arg pointer won't conflict with
4450              parameter passing regs, so no need to change stack
4451              realignment and adjust regparm number.
4452
4453              Each fixed register usage increases register pressure,
4454              so less registers should be used for argument passing.
4455              This functionality can be overriden by an explicit
4456              regparm value.  */
4457           for (regno = 0; regno <= DI_REG; regno++)
4458             if (fixed_regs[regno])
4459               globals++;
4460
4461           local_regparm
4462             = globals < local_regparm ? local_regparm - globals : 0;
4463
4464           if (local_regparm > regparm)
4465             regparm = local_regparm;
4466         }
4467     }
4468
4469   return regparm;
4470 }
4471
4472 /* Return 1 or 2, if we can pass up to SSE_REGPARM_MAX SFmode (1) and
4473    DFmode (2) arguments in SSE registers for a function with the
4474    indicated TYPE and DECL.  DECL may be NULL when calling function
4475    indirectly or considering a libcall.  Otherwise return 0.  */
4476
4477 static int
4478 ix86_function_sseregparm (const_tree type, const_tree decl, bool warn)
4479 {
4480   gcc_assert (!TARGET_64BIT);
4481
4482   /* Use SSE registers to pass SFmode and DFmode arguments if requested
4483      by the sseregparm attribute.  */
4484   if (TARGET_SSEREGPARM
4485       || (type && lookup_attribute ("sseregparm", TYPE_ATTRIBUTES (type))))
4486     {
4487       if (!TARGET_SSE)
4488         {
4489           if (warn)
4490             {
4491               if (decl)
4492                 error ("Calling %qD with attribute sseregparm without "
4493                        "SSE/SSE2 enabled", decl);
4494               else
4495                 error ("Calling %qT with attribute sseregparm without "
4496                        "SSE/SSE2 enabled", type);
4497             }
4498           return 0;
4499         }
4500
4501       return 2;
4502     }
4503
4504   /* For local functions, pass up to SSE_REGPARM_MAX SFmode
4505      (and DFmode for SSE2) arguments in SSE registers.  */
4506   if (decl && TARGET_SSE_MATH && optimize && !profile_flag)
4507     {
4508       /* FIXME: remove this CONST_CAST when cgraph.[ch] is constified.  */
4509       struct cgraph_local_info *i = cgraph_local_info (CONST_CAST_TREE(decl));
4510       if (i && i->local)
4511         return TARGET_SSE2 ? 2 : 1;
4512     }
4513
4514   return 0;
4515 }
4516
4517 /* Return true if EAX is live at the start of the function.  Used by
4518    ix86_expand_prologue to determine if we need special help before
4519    calling allocate_stack_worker.  */
4520
4521 static bool
4522 ix86_eax_live_at_start_p (void)
4523 {
4524   /* Cheat.  Don't bother working forward from ix86_function_regparm
4525      to the function type to whether an actual argument is located in
4526      eax.  Instead just look at cfg info, which is still close enough
4527      to correct at this point.  This gives false positives for broken
4528      functions that might use uninitialized data that happens to be
4529      allocated in eax, but who cares?  */
4530   return REGNO_REG_SET_P (df_get_live_out (ENTRY_BLOCK_PTR), 0);
4531 }
4532
4533 /* Value is the number of bytes of arguments automatically
4534    popped when returning from a subroutine call.
4535    FUNDECL is the declaration node of the function (as a tree),
4536    FUNTYPE is the data type of the function (as a tree),
4537    or for a library call it is an identifier node for the subroutine name.
4538    SIZE is the number of bytes of arguments passed on the stack.
4539
4540    On the 80386, the RTD insn may be used to pop them if the number
4541      of args is fixed, but if the number is variable then the caller
4542      must pop them all.  RTD can't be used for library calls now
4543      because the library is compiled with the Unix compiler.
4544    Use of RTD is a selectable option, since it is incompatible with
4545    standard Unix calling sequences.  If the option is not selected,
4546    the caller must always pop the args.
4547
4548    The attribute stdcall is equivalent to RTD on a per module basis.  */
4549
4550 int
4551 ix86_return_pops_args (tree fundecl, tree funtype, int size)
4552 {
4553   int rtd;
4554
4555   /* None of the 64-bit ABIs pop arguments.  */
4556   if (TARGET_64BIT)
4557     return 0;
4558
4559   rtd = TARGET_RTD && (!fundecl || TREE_CODE (fundecl) != IDENTIFIER_NODE);
4560
4561   /* Cdecl functions override -mrtd, and never pop the stack.  */
4562   if (! lookup_attribute ("cdecl", TYPE_ATTRIBUTES (funtype)))
4563     {
4564       /* Stdcall and fastcall functions will pop the stack if not
4565          variable args.  */
4566       if (lookup_attribute ("stdcall", TYPE_ATTRIBUTES (funtype))
4567           || lookup_attribute ("fastcall", TYPE_ATTRIBUTES (funtype)))
4568         rtd = 1;
4569
4570       if (rtd && ! stdarg_p (funtype))
4571         return size;
4572     }
4573
4574   /* Lose any fake structure return argument if it is passed on the stack.  */
4575   if (aggregate_value_p (TREE_TYPE (funtype), fundecl)
4576       && !KEEP_AGGREGATE_RETURN_POINTER)
4577     {
4578       int nregs = ix86_function_regparm (funtype, fundecl);
4579       if (nregs == 0)
4580         return GET_MODE_SIZE (Pmode);
4581     }
4582
4583   return 0;
4584 }
4585 \f
4586 /* Argument support functions.  */
4587
4588 /* Return true when register may be used to pass function parameters.  */
4589 bool
4590 ix86_function_arg_regno_p (int regno)
4591 {
4592   int i;
4593   const int *parm_regs;
4594
4595   if (!TARGET_64BIT)
4596     {
4597       if (TARGET_MACHO)
4598         return (regno < REGPARM_MAX
4599                 || (TARGET_SSE && SSE_REGNO_P (regno) && !fixed_regs[regno]));
4600       else
4601         return (regno < REGPARM_MAX
4602                 || (TARGET_MMX && MMX_REGNO_P (regno)
4603                     && (regno < FIRST_MMX_REG + MMX_REGPARM_MAX))
4604                 || (TARGET_SSE && SSE_REGNO_P (regno)
4605                     && (regno < FIRST_SSE_REG + SSE_REGPARM_MAX)));
4606     }
4607
4608   if (TARGET_MACHO)
4609     {
4610       if (SSE_REGNO_P (regno) && TARGET_SSE)
4611         return true;
4612     }
4613   else
4614     {
4615       if (TARGET_SSE && SSE_REGNO_P (regno)
4616           && (regno < FIRST_SSE_REG + SSE_REGPARM_MAX))
4617         return true;
4618     }
4619
4620   /* TODO: The function should depend on current function ABI but
4621      builtins.c would need updating then. Therefore we use the
4622      default ABI.  */
4623
4624   /* RAX is used as hidden argument to va_arg functions.  */
4625   if (ix86_abi == SYSV_ABI && regno == AX_REG)
4626     return true;
4627
4628   if (ix86_abi == MS_ABI)
4629     parm_regs = x86_64_ms_abi_int_parameter_registers;
4630   else
4631     parm_regs = x86_64_int_parameter_registers;
4632   for (i = 0; i < (ix86_abi == MS_ABI ? X64_REGPARM_MAX
4633                                          : X86_64_REGPARM_MAX); i++)
4634     if (regno == parm_regs[i])
4635       return true;
4636   return false;
4637 }
4638
4639 /* Return if we do not know how to pass TYPE solely in registers.  */
4640
4641 static bool
4642 ix86_must_pass_in_stack (enum machine_mode mode, const_tree type)
4643 {
4644   if (must_pass_in_stack_var_size_or_pad (mode, type))
4645     return true;
4646
4647   /* For 32-bit, we want TImode aggregates to go on the stack.  But watch out!
4648      The layout_type routine is crafty and tries to trick us into passing
4649      currently unsupported vector types on the stack by using TImode.  */
4650   return (!TARGET_64BIT && mode == TImode
4651           && type && TREE_CODE (type) != VECTOR_TYPE);
4652 }
4653
4654 /* It returns the size, in bytes, of the area reserved for arguments passed
4655    in registers for the function represented by fndecl dependent to the used
4656    abi format.  */
4657 int
4658 ix86_reg_parm_stack_space (const_tree fndecl)
4659 {
4660   enum calling_abi call_abi = SYSV_ABI;
4661   if (fndecl != NULL_TREE && TREE_CODE (fndecl) == FUNCTION_DECL)
4662     call_abi = ix86_function_abi (fndecl);
4663   else
4664     call_abi = ix86_function_type_abi (fndecl);
4665   if (call_abi == MS_ABI)
4666     return 32;
4667   return 0;
4668 }
4669
4670 /* Returns value SYSV_ABI, MS_ABI dependent on fntype, specifying the
4671    call abi used.  */
4672 enum calling_abi
4673 ix86_function_type_abi (const_tree fntype)
4674 {
4675   if (TARGET_64BIT && fntype != NULL)
4676     {
4677       enum calling_abi abi = ix86_abi;
4678       if (abi == SYSV_ABI)
4679         {
4680           if (lookup_attribute ("ms_abi", TYPE_ATTRIBUTES (fntype)))
4681             abi = MS_ABI;
4682         }
4683       else if (lookup_attribute ("sysv_abi", TYPE_ATTRIBUTES (fntype)))
4684         abi = SYSV_ABI;
4685       return abi;
4686     }
4687   return ix86_abi;
4688 }
4689
4690 static enum calling_abi
4691 ix86_function_abi (const_tree fndecl)
4692 {
4693   if (! fndecl)
4694     return ix86_abi;
4695   return ix86_function_type_abi (TREE_TYPE (fndecl));
4696 }
4697
4698 /* Returns value SYSV_ABI, MS_ABI dependent on cfun, specifying the
4699    call abi used.  */
4700 enum calling_abi
4701 ix86_cfun_abi (void)
4702 {
4703   if (! cfun || ! TARGET_64BIT)
4704     return ix86_abi;
4705   return cfun->machine->call_abi;
4706 }
4707
4708 /* regclass.c  */
4709 extern void init_regs (void);
4710
4711 /* Implementation of call abi switching target hook. Specific to FNDECL
4712    the specific call register sets are set. See also CONDITIONAL_REGISTER_USAGE
4713    for more details.  */
4714 void
4715 ix86_call_abi_override (const_tree fndecl)
4716 {
4717   if (fndecl == NULL_TREE)
4718     cfun->machine->call_abi = ix86_abi;
4719   else
4720     cfun->machine->call_abi = ix86_function_type_abi (TREE_TYPE (fndecl));
4721 }
4722
4723 /* MS and SYSV ABI have different set of call used registers.  Avoid expensive
4724    re-initialization of init_regs each time we switch function context since
4725    this is needed only during RTL expansion.  */
4726 static void
4727 ix86_maybe_switch_abi (void)
4728 {
4729   if (TARGET_64BIT &&
4730       call_used_regs[SI_REG] == (cfun->machine->call_abi == MS_ABI))
4731     reinit_regs ();
4732 }
4733
4734 /* Initialize a variable CUM of type CUMULATIVE_ARGS
4735    for a call to a function whose data type is FNTYPE.
4736    For a library call, FNTYPE is 0.  */
4737
4738 void
4739 init_cumulative_args (CUMULATIVE_ARGS *cum,  /* Argument info to initialize */
4740                       tree fntype,      /* tree ptr for function decl */
4741                       rtx libname,      /* SYMBOL_REF of library name or 0 */
4742                       tree fndecl)
4743 {
4744   struct cgraph_local_info *i = fndecl ? cgraph_local_info (fndecl) : NULL;
4745   memset (cum, 0, sizeof (*cum));
4746
4747   if (fndecl)
4748    cum->call_abi = ix86_function_abi (fndecl);
4749   else
4750    cum->call_abi = ix86_function_type_abi (fntype);
4751   /* Set up the number of registers to use for passing arguments.  */
4752
4753   if (cum->call_abi == MS_ABI && !ACCUMULATE_OUTGOING_ARGS)
4754     sorry ("ms_abi attribute require -maccumulate-outgoing-args or subtarget optimization implying it");
4755   cum->nregs = ix86_regparm;
4756   if (TARGET_64BIT)
4757     {
4758       if (cum->call_abi != ix86_abi)
4759         cum->nregs = ix86_abi != SYSV_ABI ? X86_64_REGPARM_MAX
4760                                              : X64_REGPARM_MAX;
4761     }
4762   if (TARGET_SSE)
4763     {
4764       cum->sse_nregs = SSE_REGPARM_MAX;
4765       if (TARGET_64BIT)
4766         {
4767           if (cum->call_abi != ix86_abi)
4768             cum->sse_nregs = ix86_abi != SYSV_ABI ? X86_64_SSE_REGPARM_MAX
4769                                                      : X64_SSE_REGPARM_MAX;
4770         }
4771     }
4772   if (TARGET_MMX)
4773     cum->mmx_nregs = MMX_REGPARM_MAX;
4774   cum->warn_avx = true;
4775   cum->warn_sse = true;
4776   cum->warn_mmx = true;
4777
4778   /* Because type might mismatch in between caller and callee, we need to
4779      use actual type of function for local calls.
4780      FIXME: cgraph_analyze can be told to actually record if function uses
4781      va_start so for local functions maybe_vaarg can be made aggressive
4782      helping K&R code.
4783      FIXME: once typesytem is fixed, we won't need this code anymore.  */
4784   if (i && i->local)
4785     fntype = TREE_TYPE (fndecl);
4786   cum->maybe_vaarg = (fntype
4787                       ? (!prototype_p (fntype) || stdarg_p (fntype))
4788                       : !libname);
4789
4790   if (!TARGET_64BIT)
4791     {
4792       /* If there are variable arguments, then we won't pass anything
4793          in registers in 32-bit mode. */
4794       if (stdarg_p (fntype))
4795         {
4796           cum->nregs = 0;
4797           cum->sse_nregs = 0;
4798           cum->mmx_nregs = 0;
4799           cum->warn_avx = 0;
4800           cum->warn_sse = 0;
4801           cum->warn_mmx = 0;
4802           return;
4803         }
4804
4805       /* Use ecx and edx registers if function has fastcall attribute,
4806          else look for regparm information.  */
4807       if (fntype)
4808         {
4809           if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (fntype)))
4810             {
4811               cum->nregs = 2;
4812               cum->fastcall = 1;
4813             }
4814           else
4815             cum->nregs = ix86_function_regparm (fntype, fndecl);
4816         }
4817
4818       /* Set up the number of SSE registers used for passing SFmode
4819          and DFmode arguments.  Warn for mismatching ABI.  */
4820       cum->float_in_sse = ix86_function_sseregparm (fntype, fndecl, true);
4821     }
4822 }
4823
4824 /* Return the "natural" mode for TYPE.  In most cases, this is just TYPE_MODE.
4825    But in the case of vector types, it is some vector mode.
4826
4827    When we have only some of our vector isa extensions enabled, then there
4828    are some modes for which vector_mode_supported_p is false.  For these
4829    modes, the generic vector support in gcc will choose some non-vector mode
4830    in order to implement the type.  By computing the natural mode, we'll
4831    select the proper ABI location for the operand and not depend on whatever
4832    the middle-end decides to do with these vector types.
4833
4834    The midde-end can't deal with the vector types > 16 bytes.  In this
4835    case, we return the original mode and warn ABI change if CUM isn't
4836    NULL.  */
4837
4838 static enum machine_mode
4839 type_natural_mode (const_tree type, CUMULATIVE_ARGS *cum)
4840 {
4841   enum machine_mode mode = TYPE_MODE (type);
4842
4843   if (TREE_CODE (type) == VECTOR_TYPE && !VECTOR_MODE_P (mode))
4844     {
4845       HOST_WIDE_INT size = int_size_in_bytes (type);
4846       if ((size == 8 || size == 16 || size == 32)
4847           /* ??? Generic code allows us to create width 1 vectors.  Ignore.  */
4848           && TYPE_VECTOR_SUBPARTS (type) > 1)
4849         {
4850           enum machine_mode innermode = TYPE_MODE (TREE_TYPE (type));
4851
4852           if (TREE_CODE (TREE_TYPE (type)) == REAL_TYPE)
4853             mode = MIN_MODE_VECTOR_FLOAT;
4854           else
4855             mode = MIN_MODE_VECTOR_INT;
4856
4857           /* Get the mode which has this inner mode and number of units.  */
4858           for (; mode != VOIDmode; mode = GET_MODE_WIDER_MODE (mode))
4859             if (GET_MODE_NUNITS (mode) == TYPE_VECTOR_SUBPARTS (type)
4860                 && GET_MODE_INNER (mode) == innermode)
4861               {
4862                 if (size == 32 && !TARGET_AVX)
4863                   {
4864                     static bool warnedavx;
4865
4866                     if (cum
4867                         && !warnedavx 
4868                         && cum->warn_avx)
4869                       {
4870                         warnedavx = true;
4871                         warning (0, "AVX vector argument without AVX "
4872                                  "enabled changes the ABI");
4873                       }
4874                     return TYPE_MODE (type);
4875                   }
4876                 else
4877                   return mode;
4878               }
4879
4880           gcc_unreachable ();
4881         }
4882     }
4883
4884   return mode;
4885 }
4886
4887 /* We want to pass a value in REGNO whose "natural" mode is MODE.  However,
4888    this may not agree with the mode that the type system has chosen for the
4889    register, which is ORIG_MODE.  If ORIG_MODE is not BLKmode, then we can
4890    go ahead and use it.  Otherwise we have to build a PARALLEL instead.  */
4891
4892 static rtx
4893 gen_reg_or_parallel (enum machine_mode mode, enum machine_mode orig_mode,
4894                      unsigned int regno)
4895 {
4896   rtx tmp;
4897
4898   if (orig_mode != BLKmode)
4899     tmp = gen_rtx_REG (orig_mode, regno);
4900   else
4901     {
4902       tmp = gen_rtx_REG (mode, regno);
4903       tmp = gen_rtx_EXPR_LIST (VOIDmode, tmp, const0_rtx);
4904       tmp = gen_rtx_PARALLEL (orig_mode, gen_rtvec (1, tmp));
4905     }
4906
4907   return tmp;
4908 }
4909
4910 /* x86-64 register passing implementation.  See x86-64 ABI for details.  Goal
4911    of this code is to classify each 8bytes of incoming argument by the register
4912    class and assign registers accordingly.  */
4913
4914 /* Return the union class of CLASS1 and CLASS2.
4915    See the x86-64 PS ABI for details.  */
4916
4917 static enum x86_64_reg_class
4918 merge_classes (enum x86_64_reg_class class1, enum x86_64_reg_class class2)
4919 {
4920   /* Rule #1: If both classes are equal, this is the resulting class.  */
4921   if (class1 == class2)
4922     return class1;
4923
4924   /* Rule #2: If one of the classes is NO_CLASS, the resulting class is
4925      the other class.  */
4926   if (class1 == X86_64_NO_CLASS)
4927     return class2;
4928   if (class2 == X86_64_NO_CLASS)
4929     return class1;
4930
4931   /* Rule #3: If one of the classes is MEMORY, the result is MEMORY.  */
4932   if (class1 == X86_64_MEMORY_CLASS || class2 == X86_64_MEMORY_CLASS)
4933     return X86_64_MEMORY_CLASS;
4934
4935   /* Rule #4: If one of the classes is INTEGER, the result is INTEGER.  */
4936   if ((class1 == X86_64_INTEGERSI_CLASS && class2 == X86_64_SSESF_CLASS)
4937       || (class2 == X86_64_INTEGERSI_CLASS && class1 == X86_64_SSESF_CLASS))
4938     return X86_64_INTEGERSI_CLASS;
4939   if (class1 == X86_64_INTEGER_CLASS || class1 == X86_64_INTEGERSI_CLASS
4940       || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS)
4941     return X86_64_INTEGER_CLASS;
4942
4943   /* Rule #5: If one of the classes is X87, X87UP, or COMPLEX_X87 class,
4944      MEMORY is used.  */
4945   if (class1 == X86_64_X87_CLASS
4946       || class1 == X86_64_X87UP_CLASS
4947       || class1 == X86_64_COMPLEX_X87_CLASS
4948       || class2 == X86_64_X87_CLASS
4949       || class2 == X86_64_X87UP_CLASS
4950       || class2 == X86_64_COMPLEX_X87_CLASS)
4951     return X86_64_MEMORY_CLASS;
4952
4953   /* Rule #6: Otherwise class SSE is used.  */
4954   return X86_64_SSE_CLASS;
4955 }
4956
4957 /* Classify the argument of type TYPE and mode MODE.
4958    CLASSES will be filled by the register class used to pass each word
4959    of the operand.  The number of words is returned.  In case the parameter
4960    should be passed in memory, 0 is returned. As a special case for zero
4961    sized containers, classes[0] will be NO_CLASS and 1 is returned.
4962
4963    BIT_OFFSET is used internally for handling records and specifies offset
4964    of the offset in bits modulo 256 to avoid overflow cases.
4965
4966    See the x86-64 PS ABI for details.
4967 */
4968
4969 static int
4970 classify_argument (enum machine_mode mode, const_tree type,
4971                    enum x86_64_reg_class classes[MAX_CLASSES], int bit_offset)
4972 {
4973   HOST_WIDE_INT bytes =
4974     (mode == BLKmode) ? int_size_in_bytes (type) : (int) GET_MODE_SIZE (mode);
4975   int words = (bytes + (bit_offset % 64) / 8 + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
4976
4977   /* Variable sized entities are always passed/returned in memory.  */
4978   if (bytes < 0)
4979     return 0;
4980
4981   if (mode != VOIDmode
4982       && targetm.calls.must_pass_in_stack (mode, type))
4983     return 0;
4984
4985   if (type && AGGREGATE_TYPE_P (type))
4986     {
4987       int i;
4988       tree field;
4989       enum x86_64_reg_class subclasses[MAX_CLASSES];
4990
4991       /* On x86-64 we pass structures larger than 32 bytes on the stack.  */
4992       if (bytes > 32)
4993         return 0;
4994
4995       for (i = 0; i < words; i++)
4996         classes[i] = X86_64_NO_CLASS;
4997
4998       /* Zero sized arrays or structures are NO_CLASS.  We return 0 to
4999          signalize memory class, so handle it as special case.  */
5000       if (!words)
5001         {
5002           classes[0] = X86_64_NO_CLASS;
5003           return 1;
5004         }
5005
5006       /* Classify each field of record and merge classes.  */
5007       switch (TREE_CODE (type))
5008         {
5009         case RECORD_TYPE:
5010           /* And now merge the fields of structure.  */
5011           for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
5012             {
5013               if (TREE_CODE (field) == FIELD_DECL)
5014                 {
5015                   int num;
5016
5017                   if (TREE_TYPE (field) == error_mark_node)
5018                     continue;
5019
5020                   /* Bitfields are always classified as integer.  Handle them
5021                      early, since later code would consider them to be
5022                      misaligned integers.  */
5023                   if (DECL_BIT_FIELD (field))
5024                     {
5025                       for (i = (int_bit_position (field) + (bit_offset % 64)) / 8 / 8;
5026                            i < ((int_bit_position (field) + (bit_offset % 64))
5027                                 + tree_low_cst (DECL_SIZE (field), 0)
5028                                 + 63) / 8 / 8; i++)
5029                         classes[i] =
5030                           merge_classes (X86_64_INTEGER_CLASS,
5031                                          classes[i]);
5032                     }
5033                   else
5034                     {
5035                       int pos;
5036
5037                       type = TREE_TYPE (field);
5038
5039                       /* Flexible array member is ignored.  */
5040                       if (TYPE_MODE (type) == BLKmode
5041                           && TREE_CODE (type) == ARRAY_TYPE
5042                           && TYPE_SIZE (type) == NULL_TREE
5043                           && TYPE_DOMAIN (type) != NULL_TREE
5044                           && (TYPE_MAX_VALUE (TYPE_DOMAIN (type))
5045                               == NULL_TREE))
5046                         {
5047                           static bool warned;
5048                           
5049                           if (!warned && warn_psabi)
5050                             {
5051                               warned = true;
5052                               inform (input_location,
5053                                       "The ABI of passing struct with"
5054                                       " a flexible array member has"
5055                                       " changed in GCC 4.4");
5056                             }
5057                           continue;
5058                         }
5059                       num = classify_argument (TYPE_MODE (type), type,
5060                                                subclasses,
5061                                                (int_bit_position (field)
5062                                                 + bit_offset) % 256);
5063                       if (!num)
5064                         return 0;
5065                       pos = (int_bit_position (field) + (bit_offset % 64)) / 8 / 8;
5066                       for (i = 0; i < num && (i + pos) < words; i++)
5067                         classes[i + pos] =
5068                           merge_classes (subclasses[i], classes[i + pos]);
5069                     }
5070                 }
5071             }
5072           break;
5073
5074         case ARRAY_TYPE:
5075           /* Arrays are handled as small records.  */
5076           {
5077             int num;
5078             num = classify_argument (TYPE_MODE (TREE_TYPE (type)),
5079                                      TREE_TYPE (type), subclasses, bit_offset);
5080             if (!num)
5081               return 0;
5082
5083             /* The partial classes are now full classes.  */
5084             if (subclasses[0] == X86_64_SSESF_CLASS && bytes != 4)
5085               subclasses[0] = X86_64_SSE_CLASS;
5086             if (subclasses[0] == X86_64_INTEGERSI_CLASS
5087                 && !((bit_offset % 64) == 0 && bytes == 4))
5088               subclasses[0] = X86_64_INTEGER_CLASS;
5089
5090             for (i = 0; i < words; i++)
5091               classes[i] = subclasses[i % num];
5092
5093             break;
5094           }
5095         case UNION_TYPE:
5096         case QUAL_UNION_TYPE:
5097           /* Unions are similar to RECORD_TYPE but offset is always 0.
5098              */
5099           for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
5100             {
5101               if (TREE_CODE (field) == FIELD_DECL)
5102                 {
5103                   int num;
5104
5105                   if (TREE_TYPE (field) == error_mark_node)
5106                     continue;
5107
5108                   num = classify_argument (TYPE_MODE (TREE_TYPE (field)),
5109                                            TREE_TYPE (field), subclasses,
5110                                            bit_offset);
5111                   if (!num)
5112                     return 0;
5113                   for (i = 0; i < num; i++)
5114                     classes[i] = merge_classes (subclasses[i], classes[i]);
5115                 }
5116             }
5117           break;
5118
5119         default:
5120           gcc_unreachable ();
5121         }
5122
5123       if (words > 2)
5124         {
5125           /* When size > 16 bytes, if the first one isn't
5126              X86_64_SSE_CLASS or any other ones aren't
5127              X86_64_SSEUP_CLASS, everything should be passed in
5128              memory.  */
5129           if (classes[0] != X86_64_SSE_CLASS)
5130               return 0;
5131
5132           for (i = 1; i < words; i++)
5133             if (classes[i] != X86_64_SSEUP_CLASS)
5134               return 0;
5135         }
5136
5137       /* Final merger cleanup.  */
5138       for (i = 0; i < words; i++)
5139         {
5140           /* If one class is MEMORY, everything should be passed in
5141              memory.  */
5142           if (classes[i] == X86_64_MEMORY_CLASS)
5143             return 0;
5144
5145           /* The X86_64_SSEUP_CLASS should be always preceded by
5146              X86_64_SSE_CLASS or X86_64_SSEUP_CLASS.  */
5147           if (classes[i] == X86_64_SSEUP_CLASS
5148               && classes[i - 1] != X86_64_SSE_CLASS
5149               && classes[i - 1] != X86_64_SSEUP_CLASS)
5150             {
5151               /* The first one should never be X86_64_SSEUP_CLASS.  */
5152               gcc_assert (i != 0);
5153               classes[i] = X86_64_SSE_CLASS;
5154             }
5155
5156           /*  If X86_64_X87UP_CLASS isn't preceded by X86_64_X87_CLASS,
5157                everything should be passed in memory.  */
5158           if (classes[i] == X86_64_X87UP_CLASS
5159               && (classes[i - 1] != X86_64_X87_CLASS))
5160             {
5161               static bool warned;
5162
5163               /* The first one should never be X86_64_X87UP_CLASS.  */
5164               gcc_assert (i != 0);
5165               if (!warned && warn_psabi)
5166                 {
5167                   warned = true;
5168                   inform (input_location,
5169                           "The ABI of passing union with long double"
5170                           " has changed in GCC 4.4");
5171                 }
5172               return 0;
5173             }
5174         }
5175       return words;
5176     }
5177
5178   /* Compute alignment needed.  We align all types to natural boundaries with
5179      exception of XFmode that is aligned to 64bits.  */
5180   if (mode != VOIDmode && mode != BLKmode)
5181     {
5182       int mode_alignment = GET_MODE_BITSIZE (mode);
5183
5184       if (mode == XFmode)
5185         mode_alignment = 128;
5186       else if (mode == XCmode)
5187         mode_alignment = 256;
5188       if (COMPLEX_MODE_P (mode))
5189         mode_alignment /= 2;
5190       /* Misaligned fields are always returned in memory.  */
5191       if (bit_offset % mode_alignment)
5192         return 0;
5193     }
5194
5195   /* for V1xx modes, just use the base mode */
5196   if (VECTOR_MODE_P (mode) && mode != V1DImode
5197       && GET_MODE_SIZE (GET_MODE_INNER (mode)) == bytes)
5198     mode = GET_MODE_INNER (mode);
5199
5200   /* Classification of atomic types.  */
5201   switch (mode)
5202     {
5203     case SDmode:
5204     case DDmode:
5205       classes[0] = X86_64_SSE_CLASS;
5206       return 1;
5207     case TDmode:
5208       classes[0] = X86_64_SSE_CLASS;
5209       classes[1] = X86_64_SSEUP_CLASS;
5210       return 2;
5211     case DImode:
5212     case SImode:
5213     case HImode:
5214     case QImode:
5215     case CSImode:
5216     case CHImode:
5217     case CQImode:
5218       {
5219         int size = (bit_offset % 64)+ (int) GET_MODE_BITSIZE (mode);
5220
5221         if (size <= 32)
5222           {
5223             classes[0] = X86_64_INTEGERSI_CLASS;
5224             return 1;
5225           }
5226         else if (size <= 64)
5227           {
5228             classes[0] = X86_64_INTEGER_CLASS;
5229             return 1;
5230           }
5231         else if (size <= 64+32)
5232           {
5233             classes[0] = X86_64_INTEGER_CLASS;
5234             classes[1] = X86_64_INTEGERSI_CLASS;
5235             return 2;
5236           }
5237         else if (size <= 64+64)
5238           {
5239             classes[0] = classes[1] = X86_64_INTEGER_CLASS;
5240             return 2;
5241           }
5242         else
5243           gcc_unreachable ();
5244       }
5245     case CDImode:
5246     case TImode:
5247       classes[0] = classes[1] = X86_64_INTEGER_CLASS;
5248       return 2;
5249     case COImode:
5250     case OImode:
5251       /* OImode shouldn't be used directly.  */
5252       gcc_unreachable ();
5253     case CTImode:
5254       return 0;
5255     case SFmode:
5256       if (!(bit_offset % 64))
5257         classes[0] = X86_64_SSESF_CLASS;
5258       else
5259         classes[0] = X86_64_SSE_CLASS;
5260       return 1;
5261     case DFmode:
5262       classes[0] = X86_64_SSEDF_CLASS;
5263       return 1;
5264     case XFmode:
5265       classes[0] = X86_64_X87_CLASS;
5266       classes[1] = X86_64_X87UP_CLASS;
5267       return 2;
5268     case TFmode:
5269       classes[0] = X86_64_SSE_CLASS;
5270       classes[1] = X86_64_SSEUP_CLASS;
5271       return 2;
5272     case SCmode:
5273       classes[0] = X86_64_SSE_CLASS;
5274       if (!(bit_offset % 64))
5275         return 1;
5276       else
5277         {
5278           static bool warned;
5279
5280           if (!warned && warn_psabi)
5281             {
5282               warned = true;
5283               inform (input_location,
5284                       "The ABI of passing structure with complex float"
5285                       " member has changed in GCC 4.4");
5286             }
5287           classes[1] = X86_64_SSESF_CLASS;
5288           return 2;
5289         }
5290     case DCmode:
5291       classes[0] = X86_64_SSEDF_CLASS;
5292       classes[1] = X86_64_SSEDF_CLASS;
5293       return 2;
5294     case XCmode:
5295       classes[0] = X86_64_COMPLEX_X87_CLASS;
5296       return 1;
5297     case TCmode:
5298       /* This modes is larger than 16 bytes.  */
5299       return 0;
5300     case V8SFmode:
5301     case V8SImode:
5302     case V32QImode:
5303     case V16HImode:
5304     case V4DFmode:
5305     case V4DImode:
5306       classes[0] = X86_64_SSE_CLASS;
5307       classes[1] = X86_64_SSEUP_CLASS;
5308       classes[2] = X86_64_SSEUP_CLASS;
5309       classes[3] = X86_64_SSEUP_CLASS;
5310       return 4;
5311     case V4SFmode:
5312     case V4SImode:
5313     case V16QImode:
5314     case V8HImode:
5315     case V2DFmode:
5316     case V2DImode:
5317       classes[0] = X86_64_SSE_CLASS;
5318       classes[1] = X86_64_SSEUP_CLASS;
5319       return 2;
5320     case V1DImode:
5321     case V2SFmode:
5322     case V2SImode:
5323     case V4HImode:
5324     case V8QImode:
5325       classes[0] = X86_64_SSE_CLASS;
5326       return 1;
5327     case BLKmode:
5328     case VOIDmode:
5329       return 0;
5330     default:
5331       gcc_assert (VECTOR_MODE_P (mode));
5332
5333       if (bytes > 16)
5334         return 0;
5335
5336       gcc_assert (GET_MODE_CLASS (GET_MODE_INNER (mode)) == MODE_INT);
5337
5338       if (bit_offset + GET_MODE_BITSIZE (mode) <= 32)
5339         classes[0] = X86_64_INTEGERSI_CLASS;
5340       else
5341         classes[0] = X86_64_INTEGER_CLASS;
5342       classes[1] = X86_64_INTEGER_CLASS;
5343       return 1 + (bytes > 8);
5344     }
5345 }
5346
5347 /* Examine the argument and return set number of register required in each
5348    class.  Return 0 iff parameter should be passed in memory.  */
5349 static int
5350 examine_argument (enum machine_mode mode, const_tree type, int in_return,
5351                   int *int_nregs, int *sse_nregs)
5352 {
5353   enum x86_64_reg_class regclass[MAX_CLASSES];
5354   int n = classify_argument (mode, type, regclass, 0);
5355
5356   *int_nregs = 0;
5357   *sse_nregs = 0;
5358   if (!n)
5359     return 0;
5360   for (n--; n >= 0; n--)
5361     switch (regclass[n])
5362       {
5363       case X86_64_INTEGER_CLASS:
5364       case X86_64_INTEGERSI_CLASS:
5365         (*int_nregs)++;
5366         break;
5367       case X86_64_SSE_CLASS:
5368       case X86_64_SSESF_CLASS:
5369       case X86_64_SSEDF_CLASS:
5370         (*sse_nregs)++;
5371         break;
5372       case X86_64_NO_CLASS:
5373       case X86_64_SSEUP_CLASS:
5374         break;
5375       case X86_64_X87_CLASS:
5376       case X86_64_X87UP_CLASS:
5377         if (!in_return)
5378           return 0;
5379         break;
5380       case X86_64_COMPLEX_X87_CLASS:
5381         return in_return ? 2 : 0;
5382       case X86_64_MEMORY_CLASS:
5383         gcc_unreachable ();
5384       }
5385   return 1;
5386 }
5387
5388 /* Construct container for the argument used by GCC interface.  See
5389    FUNCTION_ARG for the detailed description.  */
5390
5391 static rtx
5392 construct_container (enum machine_mode mode, enum machine_mode orig_mode,
5393                      const_tree type, int in_return, int nintregs, int nsseregs,
5394                      const int *intreg, int sse_regno)
5395 {
5396   /* The following variables hold the static issued_error state.  */
5397   static bool issued_sse_arg_error;
5398   static bool issued_sse_ret_error;
5399   static bool issued_x87_ret_error;
5400
5401   enum machine_mode tmpmode;
5402   int bytes =
5403     (mode == BLKmode) ? int_size_in_bytes (type) : (int) GET_MODE_SIZE (mode);
5404   enum x86_64_reg_class regclass[MAX_CLASSES];
5405   int n;
5406   int i;
5407   int nexps = 0;
5408   int needed_sseregs, needed_intregs;
5409   rtx exp[MAX_CLASSES];
5410   rtx ret;
5411
5412   n = classify_argument (mode, type, regclass, 0);
5413   if (!n)
5414     return NULL;
5415   if (!examine_argument (mode, type, in_return, &needed_intregs,
5416                          &needed_sseregs))
5417     return NULL;
5418   if (needed_intregs > nintregs || needed_sseregs > nsseregs)
5419     return NULL;
5420
5421   /* We allowed the user to turn off SSE for kernel mode.  Don't crash if
5422      some less clueful developer tries to use floating-point anyway.  */
5423   if (needed_sseregs && !TARGET_SSE)
5424     {
5425       if (in_return)
5426         {
5427           if (!issued_sse_ret_error)
5428             {
5429               error ("SSE register return with SSE disabled");
5430               issued_sse_ret_error = true;
5431             }
5432         }
5433       else if (!issued_sse_arg_error)
5434         {
5435           error ("SSE register argument with SSE disabled");
5436           issued_sse_arg_error = true;
5437         }
5438       return NULL;
5439     }
5440
5441   /* Likewise, error if the ABI requires us to return values in the
5442      x87 registers and the user specified -mno-80387.  */
5443   if (!TARGET_80387 && in_return)
5444     for (i = 0; i < n; i++)
5445       if (regclass[i] == X86_64_X87_CLASS
5446           || regclass[i] == X86_64_X87UP_CLASS
5447           || regclass[i] == X86_64_COMPLEX_X87_CLASS)
5448         {
5449           if (!issued_x87_ret_error)
5450             {
5451               error ("x87 register return with x87 disabled");
5452               issued_x87_ret_error = true;
5453             }
5454           return NULL;
5455         }
5456
5457   /* First construct simple cases.  Avoid SCmode, since we want to use
5458      single register to pass this type.  */
5459   if (n == 1 && mode != SCmode)
5460     switch (regclass[0])
5461       {
5462       case X86_64_INTEGER_CLASS:
5463       case X86_64_INTEGERSI_CLASS:
5464         return gen_rtx_REG (mode, intreg[0]);
5465       case X86_64_SSE_CLASS:
5466       case X86_64_SSESF_CLASS:
5467       case X86_64_SSEDF_CLASS:
5468         if (mode != BLKmode)
5469           return gen_reg_or_parallel (mode, orig_mode, 
5470                                       SSE_REGNO (sse_regno));
5471         break;
5472       case X86_64_X87_CLASS:
5473       case X86_64_COMPLEX_X87_CLASS:
5474         return gen_rtx_REG (mode, FIRST_STACK_REG);
5475       case X86_64_NO_CLASS:
5476         /* Zero sized array, struct or class.  */
5477         return NULL;
5478       default:
5479         gcc_unreachable ();
5480       }
5481   if (n == 2 && regclass[0] == X86_64_SSE_CLASS
5482       && regclass[1] == X86_64_SSEUP_CLASS && mode != BLKmode)
5483     return gen_rtx_REG (mode, SSE_REGNO (sse_regno));
5484   if (n == 4
5485       && regclass[0] == X86_64_SSE_CLASS
5486       && regclass[1] == X86_64_SSEUP_CLASS
5487       && regclass[2] == X86_64_SSEUP_CLASS
5488       && regclass[3] == X86_64_SSEUP_CLASS
5489       && mode != BLKmode)
5490     return gen_rtx_REG (mode, SSE_REGNO (sse_regno));
5491
5492   if (n == 2
5493       && regclass[0] == X86_64_X87_CLASS && regclass[1] == X86_64_X87UP_CLASS)
5494     return gen_rtx_REG (XFmode, FIRST_STACK_REG);
5495   if (n == 2 && regclass[0] == X86_64_INTEGER_CLASS
5496       && regclass[1] == X86_64_INTEGER_CLASS
5497       && (mode == CDImode || mode == TImode || mode == TFmode)
5498       && intreg[0] + 1 == intreg[1])
5499     return gen_rtx_REG (mode, intreg[0]);
5500
5501   /* Otherwise figure out the entries of the PARALLEL.  */
5502   for (i = 0; i < n; i++)
5503     {
5504       int pos;
5505
5506       switch (regclass[i])
5507         {
5508           case X86_64_NO_CLASS:
5509             break;
5510           case X86_64_INTEGER_CLASS:
5511           case X86_64_INTEGERSI_CLASS:
5512             /* Merge TImodes on aligned occasions here too.  */
5513             if (i * 8 + 8 > bytes)
5514               tmpmode = mode_for_size ((bytes - i * 8) * BITS_PER_UNIT, MODE_INT, 0);
5515             else if (regclass[i] == X86_64_INTEGERSI_CLASS)
5516               tmpmode = SImode;
5517             else
5518               tmpmode = DImode;
5519             /* We've requested 24 bytes we don't have mode for.  Use DImode.  */
5520             if (tmpmode == BLKmode)
5521               tmpmode = DImode;
5522             exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
5523                                                gen_rtx_REG (tmpmode, *intreg),
5524                                                GEN_INT (i*8));
5525             intreg++;
5526             break;
5527           case X86_64_SSESF_CLASS:
5528             exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
5529                                                gen_rtx_REG (SFmode,
5530                                                             SSE_REGNO (sse_regno)),
5531                                                GEN_INT (i*8));
5532             sse_regno++;
5533             break;
5534           case X86_64_SSEDF_CLASS:
5535             exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
5536                                                gen_rtx_REG (DFmode,
5537                                                             SSE_REGNO (sse_regno)),
5538                                                GEN_INT (i*8));
5539             sse_regno++;
5540             break;
5541           case X86_64_SSE_CLASS:
5542             pos = i;
5543             switch (n)
5544               {
5545               case 1:
5546                 tmpmode = DImode;
5547                 break;
5548               case 2:
5549                 if (i == 0 && regclass[1] == X86_64_SSEUP_CLASS)
5550                   {
5551                     tmpmode = TImode;
5552                     i++;
5553                   }
5554                 else
5555                   tmpmode = DImode;
5556                 break;
5557               case 4:
5558                 gcc_assert (i == 0
5559                             && regclass[1] == X86_64_SSEUP_CLASS
5560                             && regclass[2] == X86_64_SSEUP_CLASS
5561                             && regclass[3] == X86_64_SSEUP_CLASS);
5562                 tmpmode = OImode;
5563                 i += 3;
5564                 break;
5565               default:
5566                 gcc_unreachable ();
5567               }
5568             exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
5569                                                gen_rtx_REG (tmpmode,
5570                                                             SSE_REGNO (sse_regno)),
5571                                                GEN_INT (pos*8));
5572             sse_regno++;
5573             break;
5574           default:
5575             gcc_unreachable ();
5576         }
5577     }
5578
5579   /* Empty aligned struct, union or class.  */
5580   if (nexps == 0)
5581     return NULL;
5582
5583   ret =  gen_rtx_PARALLEL (mode, rtvec_alloc (nexps));
5584   for (i = 0; i < nexps; i++)
5585     XVECEXP (ret, 0, i) = exp [i];
5586   return ret;
5587 }
5588
5589 /* Update the data in CUM to advance over an argument of mode MODE
5590    and data type TYPE.  (TYPE is null for libcalls where that information
5591    may not be available.)  */
5592
5593 static void
5594 function_arg_advance_32 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5595                          tree type, HOST_WIDE_INT bytes, HOST_WIDE_INT words)
5596 {
5597   switch (mode)
5598     {
5599     default:
5600       break;
5601
5602     case BLKmode:
5603       if (bytes < 0)
5604         break;
5605       /* FALLTHRU */
5606
5607     case DImode:
5608     case SImode:
5609     case HImode:
5610     case QImode:
5611       cum->words += words;
5612       cum->nregs -= words;
5613       cum->regno += words;
5614
5615       if (cum->nregs <= 0)
5616         {
5617           cum->nregs = 0;
5618           cum->regno = 0;
5619         }
5620       break;
5621
5622     case OImode:
5623       /* OImode shouldn't be used directly.  */
5624       gcc_unreachable ();
5625
5626     case DFmode:
5627       if (cum->float_in_sse < 2)
5628         break;
5629     case SFmode:
5630       if (cum->float_in_sse < 1)
5631         break;
5632       /* FALLTHRU */
5633
5634     case V8SFmode:
5635     case V8SImode:
5636     case V32QImode:
5637     case V16HImode:
5638     case V4DFmode:
5639     case V4DImode:
5640     case TImode:
5641     case V16QImode:
5642     case V8HImode:
5643     case V4SImode:
5644     case V2DImode:
5645     case V4SFmode:
5646     case V2DFmode:
5647       if (!type || !AGGREGATE_TYPE_P (type))
5648         {
5649           cum->sse_words += words;
5650           cum->sse_nregs -= 1;
5651           cum->sse_regno += 1;
5652           if (cum->sse_nregs <= 0)
5653             {
5654               cum->sse_nregs = 0;
5655               cum->sse_regno = 0;
5656             }
5657         }
5658       break;
5659
5660     case V8QImode:
5661     case V4HImode:
5662     case V2SImode:
5663     case V2SFmode:
5664     case V1DImode:
5665       if (!type || !AGGREGATE_TYPE_P (type))
5666         {
5667           cum->mmx_words += words;
5668           cum->mmx_nregs -= 1;
5669           cum->mmx_regno += 1;
5670           if (cum->mmx_nregs <= 0)
5671             {
5672               cum->mmx_nregs = 0;
5673               cum->mmx_regno = 0;
5674             }
5675         }
5676       break;
5677     }
5678 }
5679
5680 static void
5681 function_arg_advance_64 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5682                          tree type, HOST_WIDE_INT words, int named)
5683 {
5684   int int_nregs, sse_nregs;
5685
5686   /* Unnamed 256bit vector mode parameters are passed on stack.  */
5687   if (!named && VALID_AVX256_REG_MODE (mode))
5688     return;
5689
5690   if (!examine_argument (mode, type, 0, &int_nregs, &sse_nregs))
5691     cum->words += words;
5692   else if (sse_nregs <= cum->sse_nregs && int_nregs <= cum->nregs)
5693     {
5694       cum->nregs -= int_nregs;
5695       cum->sse_nregs -= sse_nregs;
5696       cum->regno += int_nregs;
5697       cum->sse_regno += sse_nregs;
5698     }
5699   else
5700     cum->words += words;
5701 }
5702
5703 static void
5704 function_arg_advance_ms_64 (CUMULATIVE_ARGS *cum, HOST_WIDE_INT bytes,
5705                             HOST_WIDE_INT words)
5706 {
5707   /* Otherwise, this should be passed indirect.  */
5708   gcc_assert (bytes == 1 || bytes == 2 || bytes == 4 || bytes == 8);
5709
5710   cum->words += words;
5711   if (cum->nregs > 0)
5712     {
5713       cum->nregs -= 1;
5714       cum->regno += 1;
5715     }
5716 }
5717
5718 void
5719 function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5720                       tree type, int named)
5721 {
5722   HOST_WIDE_INT bytes, words;
5723
5724   if (mode == BLKmode)
5725     bytes = int_size_in_bytes (type);
5726   else
5727     bytes = GET_MODE_SIZE (mode);
5728   words = (bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
5729
5730   if (type)
5731     mode = type_natural_mode (type, NULL);
5732
5733   if (TARGET_64BIT && (cum ? cum->call_abi : ix86_abi) == MS_ABI)
5734     function_arg_advance_ms_64 (cum, bytes, words);
5735   else if (TARGET_64BIT)
5736     function_arg_advance_64 (cum, mode, type, words, named);
5737   else
5738     function_arg_advance_32 (cum, mode, type, bytes, words);
5739 }
5740
5741 /* Define where to put the arguments to a function.
5742    Value is zero to push the argument on the stack,
5743    or a hard register in which to store the argument.
5744
5745    MODE is the argument's machine mode.
5746    TYPE is the data type of the argument (as a tree).
5747     This is null for libcalls where that information may
5748     not be available.
5749    CUM is a variable of type CUMULATIVE_ARGS which gives info about
5750     the preceding args and about the function being called.
5751    NAMED is nonzero if this argument is a named parameter
5752     (otherwise it is an extra parameter matching an ellipsis).  */
5753
5754 static rtx
5755 function_arg_32 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5756                  enum machine_mode orig_mode, tree type,
5757                  HOST_WIDE_INT bytes, HOST_WIDE_INT words)
5758 {
5759   static bool warnedsse, warnedmmx;
5760
5761   /* Avoid the AL settings for the Unix64 ABI.  */
5762   if (mode == VOIDmode)
5763     return constm1_rtx;
5764
5765   switch (mode)
5766     {
5767     default:
5768       break;
5769
5770     case BLKmode:
5771       if (bytes < 0)
5772         break;
5773       /* FALLTHRU */
5774     case DImode:
5775     case SImode:
5776     case HImode:
5777     case QImode:
5778       if (words <= cum->nregs)
5779         {
5780           int regno = cum->regno;
5781
5782           /* Fastcall allocates the first two DWORD (SImode) or
5783             smaller arguments to ECX and EDX if it isn't an
5784             aggregate type .  */
5785           if (cum->fastcall)
5786             {
5787               if (mode == BLKmode
5788                   || mode == DImode
5789                   || (type && AGGREGATE_TYPE_P (type)))
5790                 break;
5791
5792               /* ECX not EAX is the first allocated register.  */
5793               if (regno == AX_REG)
5794                 regno = CX_REG;
5795             }
5796           return gen_rtx_REG (mode, regno);
5797         }
5798       break;
5799
5800     case DFmode:
5801       if (cum->float_in_sse < 2)
5802         break;
5803     case SFmode:
5804       if (cum->float_in_sse < 1)
5805         break;
5806       /* FALLTHRU */
5807     case TImode:
5808       /* In 32bit, we pass TImode in xmm registers.  */
5809     case V16QImode:
5810     case V8HImode:
5811     case V4SImode:
5812     case V2DImode:
5813     case V4SFmode:
5814     case V2DFmode:
5815       if (!type || !AGGREGATE_TYPE_P (type))
5816         {
5817           if (!TARGET_SSE && !warnedsse && cum->warn_sse)
5818             {
5819               warnedsse = true;
5820               warning (0, "SSE vector argument without SSE enabled "
5821                        "changes the ABI");
5822             }
5823           if (cum->sse_nregs)
5824             return gen_reg_or_parallel (mode, orig_mode,
5825                                         cum->sse_regno + FIRST_SSE_REG);
5826         }
5827       break;
5828
5829     case OImode:
5830       /* OImode shouldn't be used directly.  */
5831       gcc_unreachable ();
5832
5833     case V8SFmode:
5834     case V8SImode:
5835     case V32QImode:
5836     case V16HImode:
5837     case V4DFmode:
5838     case V4DImode:
5839       if (!type || !AGGREGATE_TYPE_P (type))
5840         {
5841           if (cum->sse_nregs)
5842             return gen_reg_or_parallel (mode, orig_mode,
5843                                         cum->sse_regno + FIRST_SSE_REG);
5844         }
5845       break;
5846
5847     case V8QImode:
5848     case V4HImode:
5849     case V2SImode:
5850     case V2SFmode:
5851     case V1DImode:
5852       if (!type || !AGGREGATE_TYPE_P (type))
5853         {
5854           if (!TARGET_MMX && !warnedmmx && cum->warn_mmx)
5855             {
5856               warnedmmx = true;
5857               warning (0, "MMX vector argument without MMX enabled "
5858                        "changes the ABI");
5859             }
5860           if (cum->mmx_nregs)
5861             return gen_reg_or_parallel (mode, orig_mode,
5862                                         cum->mmx_regno + FIRST_MMX_REG);
5863         }
5864       break;
5865     }
5866
5867   return NULL_RTX;
5868 }
5869
5870 static rtx
5871 function_arg_64 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5872                  enum machine_mode orig_mode, tree type, int named)
5873 {
5874   /* Handle a hidden AL argument containing number of registers
5875      for varargs x86-64 functions.  */
5876   if (mode == VOIDmode)
5877     return GEN_INT (cum->maybe_vaarg
5878                     ? (cum->sse_nregs < 0
5879                        ? (cum->call_abi == ix86_abi
5880                           ? SSE_REGPARM_MAX
5881                           : (ix86_abi != SYSV_ABI ? X86_64_SSE_REGPARM_MAX
5882                                                      : X64_SSE_REGPARM_MAX))
5883                : cum->sse_regno)
5884                     : -1);
5885
5886   switch (mode)
5887     {
5888     default:
5889       break;
5890
5891     case V8SFmode:
5892     case V8SImode:
5893     case V32QImode:
5894     case V16HImode:
5895     case V4DFmode:
5896     case V4DImode:
5897       /* Unnamed 256bit vector mode parameters are passed on stack.  */
5898       if (!named)
5899         return NULL;
5900       break;
5901     }
5902
5903   return construct_container (mode, orig_mode, type, 0, cum->nregs,
5904                               cum->sse_nregs,
5905                               &x86_64_int_parameter_registers [cum->regno],
5906                               cum->sse_regno);
5907 }
5908
5909 static rtx
5910 function_arg_ms_64 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5911                     enum machine_mode orig_mode, int named,
5912                     HOST_WIDE_INT bytes)
5913 {
5914   unsigned int regno;
5915
5916   /* We need to add clobber for MS_ABI->SYSV ABI calls in expand_call.
5917      We use value of -2 to specify that current function call is MSABI.  */
5918   if (mode == VOIDmode)
5919     return GEN_INT (-2);
5920
5921   /* If we've run out of registers, it goes on the stack.  */
5922   if (cum->nregs == 0)
5923     return NULL_RTX;
5924
5925   regno = x86_64_ms_abi_int_parameter_registers[cum->regno];
5926
5927   /* Only floating point modes are passed in anything but integer regs.  */
5928   if (TARGET_SSE && (mode == SFmode || mode == DFmode))
5929     {
5930       if (named)
5931         regno = cum->regno + FIRST_SSE_REG;
5932       else
5933         {
5934           rtx t1, t2;
5935
5936           /* Unnamed floating parameters are passed in both the
5937              SSE and integer registers.  */
5938           t1 = gen_rtx_REG (mode, cum->regno + FIRST_SSE_REG);
5939           t2 = gen_rtx_REG (mode, regno);
5940           t1 = gen_rtx_EXPR_LIST (VOIDmode, t1, const0_rtx);
5941           t2 = gen_rtx_EXPR_LIST (VOIDmode, t2, const0_rtx);
5942           return gen_rtx_PARALLEL (mode, gen_rtvec (2, t1, t2));
5943         }
5944     }
5945   /* Handle aggregated types passed in register.  */
5946   if (orig_mode == BLKmode)
5947     {
5948       if (bytes > 0 && bytes <= 8)
5949         mode = (bytes > 4 ? DImode : SImode);
5950       if (mode == BLKmode)
5951         mode = DImode;
5952     }
5953
5954   return gen_reg_or_parallel (mode, orig_mode, regno);
5955 }
5956
5957 rtx
5958 function_arg (CUMULATIVE_ARGS *cum, enum machine_mode omode,
5959               tree type, int named)
5960 {
5961   enum machine_mode mode = omode;
5962   HOST_WIDE_INT bytes, words;
5963
5964   if (mode == BLKmode)
5965     bytes = int_size_in_bytes (type);
5966   else
5967     bytes = GET_MODE_SIZE (mode);
5968   words = (bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
5969
5970   /* To simplify the code below, represent vector types with a vector mode
5971      even if MMX/SSE are not active.  */
5972   if (type && TREE_CODE (type) == VECTOR_TYPE)
5973     mode = type_natural_mode (type, cum);
5974
5975   if (TARGET_64BIT && (cum ? cum->call_abi : ix86_abi) == MS_ABI)
5976     return function_arg_ms_64 (cum, mode, omode, named, bytes);
5977   else if (TARGET_64BIT)
5978     return function_arg_64 (cum, mode, omode, type, named);
5979   else
5980     return function_arg_32 (cum, mode, omode, type, bytes, words);
5981 }
5982
5983 /* A C expression that indicates when an argument must be passed by
5984    reference.  If nonzero for an argument, a copy of that argument is
5985    made in memory and a pointer to the argument is passed instead of
5986    the argument itself.  The pointer is passed in whatever way is
5987    appropriate for passing a pointer to that type.  */
5988
5989 static bool
5990 ix86_pass_by_reference (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
5991                         enum machine_mode mode ATTRIBUTE_UNUSED,
5992                         const_tree type, bool named ATTRIBUTE_UNUSED)
5993 {
5994   /* See Windows x64 Software Convention.  */
5995   if (TARGET_64BIT && (cum ? cum->call_abi : ix86_abi) == MS_ABI)
5996     {
5997       int msize = (int) GET_MODE_SIZE (mode);
5998       if (type)
5999         {
6000           /* Arrays are passed by reference.  */
6001           if (TREE_CODE (type) == ARRAY_TYPE)
6002             return true;
6003
6004           if (AGGREGATE_TYPE_P (type))
6005             {
6006               /* Structs/unions of sizes other than 8, 16, 32, or 64 bits
6007                  are passed by reference.  */
6008               msize = int_size_in_bytes (type);
6009             }
6010         }
6011
6012       /* __m128 is passed by reference.  */
6013       switch (msize) {
6014       case 1: case 2: case 4: case 8:
6015         break;
6016       default:
6017         return true;
6018       }
6019     }
6020   else if (TARGET_64BIT && type && int_size_in_bytes (type) == -1)
6021     return 1;
6022
6023   return 0;
6024 }
6025
6026 /* Return true when TYPE should be 128bit aligned for 32bit argument passing
6027    ABI.  */
6028 static bool
6029 contains_aligned_value_p (tree type)
6030 {
6031   enum machine_mode mode = TYPE_MODE (type);
6032   if (((TARGET_SSE && SSE_REG_MODE_P (mode))
6033        || mode == TDmode
6034        || mode == TFmode
6035        || mode == TCmode)
6036       && (!TYPE_USER_ALIGN (type) || TYPE_ALIGN (type) > 128))
6037     return true;
6038   if (TYPE_ALIGN (type) < 128)
6039     return false;
6040
6041   if (AGGREGATE_TYPE_P (type))
6042     {
6043       /* Walk the aggregates recursively.  */
6044       switch (TREE_CODE (type))
6045         {
6046         case RECORD_TYPE:
6047         case UNION_TYPE:
6048         case QUAL_UNION_TYPE:
6049           {
6050             tree field;
6051
6052             /* Walk all the structure fields.  */
6053             for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
6054               {
6055                 if (TREE_CODE (field) == FIELD_DECL
6056                     && contains_aligned_value_p (TREE_TYPE (field)))
6057                   return true;
6058               }
6059             break;
6060           }
6061
6062         case ARRAY_TYPE:
6063           /* Just for use if some languages passes arrays by value.  */
6064           if (contains_aligned_value_p (TREE_TYPE (type)))
6065             return true;
6066           break;
6067
6068         default:
6069           gcc_unreachable ();
6070         }
6071     }
6072   return false;
6073 }
6074
6075 /* Gives the alignment boundary, in bits, of an argument with the
6076    specified mode and type.  */
6077
6078 int
6079 ix86_function_arg_boundary (enum machine_mode mode, tree type)
6080 {
6081   int align;
6082   if (type)
6083     {
6084       /* Since canonical type is used for call, we convert it to
6085          canonical type if needed.  */
6086       if (!TYPE_STRUCTURAL_EQUALITY_P (type))
6087         type = TYPE_CANONICAL (type);
6088       align = TYPE_ALIGN (type);
6089     }
6090   else
6091     align = GET_MODE_ALIGNMENT (mode);
6092   if (align < PARM_BOUNDARY)
6093     align = PARM_BOUNDARY;
6094   /* In 32bit, only _Decimal128 and __float128 are aligned to their
6095      natural boundaries.  */
6096   if (!TARGET_64BIT && mode != TDmode && mode != TFmode)
6097     {
6098       /* i386 ABI defines all arguments to be 4 byte aligned.  We have to
6099          make an exception for SSE modes since these require 128bit
6100          alignment.
6101
6102          The handling here differs from field_alignment.  ICC aligns MMX
6103          arguments to 4 byte boundaries, while structure fields are aligned
6104          to 8 byte boundaries.  */
6105       if (!type)
6106         {
6107           if (!(TARGET_SSE && SSE_REG_MODE_P (mode)))
6108             align = PARM_BOUNDARY;
6109         }
6110       else
6111         {
6112           if (!contains_aligned_value_p (type))
6113             align = PARM_BOUNDARY;
6114         }
6115     }
6116   if (align > BIGGEST_ALIGNMENT)
6117     align = BIGGEST_ALIGNMENT;
6118   return align;
6119 }
6120
6121 /* Return true if N is a possible register number of function value.  */
6122
6123 bool
6124 ix86_function_value_regno_p (int regno)
6125 {
6126   switch (regno)
6127     {
6128     case 0:
6129       return true;
6130
6131     case FIRST_FLOAT_REG:
6132       /* TODO: The function should depend on current function ABI but
6133        builtins.c would need updating then. Therefore we use the
6134        default ABI.  */
6135       if (TARGET_64BIT && ix86_abi == MS_ABI)
6136         return false;
6137       return TARGET_FLOAT_RETURNS_IN_80387;
6138
6139     case FIRST_SSE_REG:
6140       return TARGET_SSE;
6141
6142     case FIRST_MMX_REG:
6143       if (TARGET_MACHO || TARGET_64BIT)
6144         return false;
6145       return TARGET_MMX;
6146     }
6147
6148   return false;
6149 }
6150
6151 /* Define how to find the value returned by a function.
6152    VALTYPE is the data type of the value (as a tree).
6153    If the precise function being called is known, FUNC is its FUNCTION_DECL;
6154    otherwise, FUNC is 0.  */
6155
6156 static rtx
6157 function_value_32 (enum machine_mode orig_mode, enum machine_mode mode,
6158                    const_tree fntype, const_tree fn)
6159 {
6160   unsigned int regno;
6161
6162   /* 8-byte vector modes in %mm0. See ix86_return_in_memory for where
6163      we normally prevent this case when mmx is not available.  However
6164      some ABIs may require the result to be returned like DImode.  */
6165   if (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 8)
6166     regno = TARGET_MMX ? FIRST_MMX_REG : 0;
6167
6168   /* 16-byte vector modes in %xmm0.  See ix86_return_in_memory for where
6169      we prevent this case when sse is not available.  However some ABIs
6170      may require the result to be returned like integer TImode.  */
6171   else if (mode == TImode
6172            || (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 16))
6173     regno = TARGET_SSE ? FIRST_SSE_REG : 0;
6174
6175   /* 32-byte vector modes in %ymm0.   */
6176   else if (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 32)
6177     regno = TARGET_AVX ? FIRST_SSE_REG : 0;
6178
6179   /* Floating point return values in %st(0) (unless -mno-fp-ret-in-387).  */
6180   else if (X87_FLOAT_MODE_P (mode) && TARGET_FLOAT_RETURNS_IN_80387)
6181     regno = FIRST_FLOAT_REG;
6182   else
6183     /* Most things go in %eax.  */
6184     regno = AX_REG;
6185
6186   /* Override FP return register with %xmm0 for local functions when
6187      SSE math is enabled or for functions with sseregparm attribute.  */
6188   if ((fn || fntype) && (mode == SFmode || mode == DFmode))
6189     {
6190       int sse_level = ix86_function_sseregparm (fntype, fn, false);
6191       if ((sse_level >= 1 && mode == SFmode)
6192           || (sse_level == 2 && mode == DFmode))
6193         regno = FIRST_SSE_REG;
6194     }
6195
6196   /* OImode shouldn't be used directly.  */
6197   gcc_assert (mode != OImode);
6198
6199   return gen_rtx_REG (orig_mode, regno);
6200 }
6201
6202 static rtx
6203 function_value_64 (enum machine_mode orig_mode, enum machine_mode mode,
6204                    const_tree valtype)
6205 {
6206   rtx ret;
6207
6208   /* Handle libcalls, which don't provide a type node.  */
6209   if (valtype == NULL)
6210     {
6211       switch (mode)
6212         {
6213         case SFmode:
6214         case SCmode:
6215         case DFmode:
6216         case DCmode:
6217         case TFmode:
6218         case SDmode:
6219         case DDmode:
6220         case TDmode:
6221           return gen_rtx_REG (mode, FIRST_SSE_REG);
6222         case XFmode:
6223         case XCmode:
6224           return gen_rtx_REG (mode, FIRST_FLOAT_REG);
6225         case TCmode:
6226           return NULL;
6227         default:
6228           return gen_rtx_REG (mode, AX_REG);
6229         }
6230     }
6231
6232   ret = construct_container (mode, orig_mode, valtype, 1,
6233                              X86_64_REGPARM_MAX, X86_64_SSE_REGPARM_MAX,
6234                              x86_64_int_return_registers, 0);
6235
6236   /* For zero sized structures, construct_container returns NULL, but we
6237      need to keep rest of compiler happy by returning meaningful value.  */
6238   if (!ret)
6239     ret = gen_rtx_REG (orig_mode, AX_REG);
6240
6241   return ret;
6242 }
6243
6244 static rtx
6245 function_value_ms_64 (enum machine_mode orig_mode, enum machine_mode mode)
6246 {
6247   unsigned int regno = AX_REG;
6248
6249   if (TARGET_SSE)
6250     {
6251       switch (GET_MODE_SIZE (mode))
6252         {
6253         case 16:
6254           if((SCALAR_INT_MODE_P (mode) || VECTOR_MODE_P (mode))
6255              && !COMPLEX_MODE_P (mode))
6256             regno = FIRST_SSE_REG;
6257           break;
6258         case 8:
6259         case 4:
6260           if (mode == SFmode || mode == DFmode)
6261             regno = FIRST_SSE_REG;
6262           break;
6263         default:
6264           break;
6265         }
6266     }
6267   return gen_rtx_REG (orig_mode, regno);
6268 }
6269
6270 static rtx
6271 ix86_function_value_1 (const_tree valtype, const_tree fntype_or_decl,
6272                        enum machine_mode orig_mode, enum machine_mode mode)
6273 {
6274   const_tree fn, fntype;
6275
6276   fn = NULL_TREE;
6277   if (fntype_or_decl && DECL_P (fntype_or_decl))
6278     fn = fntype_or_decl;
6279   fntype = fn ? TREE_TYPE (fn) : fntype_or_decl;
6280
6281   if (TARGET_64BIT && ix86_function_type_abi (fntype) == MS_ABI)
6282     return function_value_ms_64 (orig_mode, mode);
6283   else if (TARGET_64BIT)
6284     return function_value_64 (orig_mode, mode, valtype);
6285   else
6286     return function_value_32 (orig_mode, mode, fntype, fn);
6287 }
6288
6289 static rtx
6290 ix86_function_value (const_tree valtype, const_tree fntype_or_decl,
6291                      bool outgoing ATTRIBUTE_UNUSED)
6292 {
6293   enum machine_mode mode, orig_mode;
6294
6295   orig_mode = TYPE_MODE (valtype);
6296   mode = type_natural_mode (valtype, NULL);
6297   return ix86_function_value_1 (valtype, fntype_or_decl, orig_mode, mode);
6298 }
6299
6300 rtx
6301 ix86_libcall_value (enum machine_mode mode)
6302 {
6303   return ix86_function_value_1 (NULL, NULL, mode, mode);
6304 }
6305
6306 /* Return true iff type is returned in memory.  */
6307
6308 static int ATTRIBUTE_UNUSED
6309 return_in_memory_32 (const_tree type, enum machine_mode mode)
6310 {
6311   HOST_WIDE_INT size;
6312
6313   if (mode == BLKmode)
6314     return 1;
6315
6316   size = int_size_in_bytes (type);
6317
6318   if (MS_AGGREGATE_RETURN && AGGREGATE_TYPE_P (type) && size <= 8)
6319     return 0;
6320
6321   if (VECTOR_MODE_P (mode) || mode == TImode)
6322     {
6323       /* User-created vectors small enough to fit in EAX.  */
6324       if (size < 8)
6325         return 0;
6326
6327       /* MMX/3dNow values are returned in MM0,
6328          except when it doesn't exits.  */
6329       if (size == 8)
6330         return (TARGET_MMX ? 0 : 1);
6331
6332       /* SSE values are returned in XMM0, except when it doesn't exist.  */
6333       if (size == 16)
6334         return (TARGET_SSE ? 0 : 1);
6335
6336       /* AVX values are returned in YMM0, except when it doesn't exist.  */
6337       if (size == 32)
6338         return TARGET_AVX ? 0 : 1;
6339     }
6340
6341   if (mode == XFmode)
6342     return 0;
6343
6344   if (size > 12)
6345     return 1;
6346
6347   /* OImode shouldn't be used directly.  */
6348   gcc_assert (mode != OImode);
6349
6350   return 0;
6351 }
6352
6353 static int ATTRIBUTE_UNUSED
6354 return_in_memory_64 (const_tree type, enum machine_mode mode)
6355 {
6356   int needed_intregs, needed_sseregs;
6357   return !examine_argument (mode, type, 1, &needed_intregs, &needed_sseregs);
6358 }
6359
6360 static int ATTRIBUTE_UNUSED
6361 return_in_memory_ms_64 (const_tree type, enum machine_mode mode)
6362 {
6363   HOST_WIDE_INT size = int_size_in_bytes (type);
6364
6365   /* __m128 is returned in xmm0.  */
6366   if ((SCALAR_INT_MODE_P (mode) || VECTOR_MODE_P (mode))
6367       && !COMPLEX_MODE_P (mode) && (GET_MODE_SIZE (mode) == 16 || size == 16))
6368     return 0;
6369
6370   /* Otherwise, the size must be exactly in [1248]. */
6371   return (size != 1 && size != 2 && size != 4 && size != 8);
6372 }
6373
6374 static bool
6375 ix86_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
6376 {
6377 #ifdef SUBTARGET_RETURN_IN_MEMORY
6378   return SUBTARGET_RETURN_IN_MEMORY (type, fntype);
6379 #else
6380   const enum machine_mode mode = type_natural_mode (type, NULL);
6381  
6382   if (TARGET_64BIT)
6383     {
6384       if (ix86_function_type_abi (fntype) == MS_ABI)
6385         return return_in_memory_ms_64 (type, mode);
6386       else
6387         return return_in_memory_64 (type, mode);
6388     }
6389   else
6390     return return_in_memory_32 (type, mode);
6391 #endif
6392 }
6393
6394 /* Return false iff TYPE is returned in memory.  This version is used
6395    on Solaris 10.  It is similar to the generic ix86_return_in_memory,
6396    but differs notably in that when MMX is available, 8-byte vectors
6397    are returned in memory, rather than in MMX registers.  */
6398
6399 bool
6400 ix86_sol10_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
6401 {
6402   int size;
6403   enum machine_mode mode = type_natural_mode (type, NULL);
6404
6405   if (TARGET_64BIT)
6406     return return_in_memory_64 (type, mode);
6407
6408   if (mode == BLKmode)
6409     return 1;
6410
6411   size = int_size_in_bytes (type);
6412
6413   if (VECTOR_MODE_P (mode))
6414     {
6415       /* Return in memory only if MMX registers *are* available.  This
6416          seems backwards, but it is consistent with the existing
6417          Solaris x86 ABI.  */
6418       if (size == 8)
6419         return TARGET_MMX;
6420       if (size == 16)
6421         return !TARGET_SSE;
6422     }
6423   else if (mode == TImode)
6424     return !TARGET_SSE;
6425   else if (mode == XFmode)
6426     return 0;
6427
6428   return size > 12;
6429 }
6430
6431 /* When returning SSE vector types, we have a choice of either
6432      (1) being abi incompatible with a -march switch, or
6433      (2) generating an error.
6434    Given no good solution, I think the safest thing is one warning.
6435    The user won't be able to use -Werror, but....
6436
6437    Choose the STRUCT_VALUE_RTX hook because that's (at present) only
6438    called in response to actually generating a caller or callee that
6439    uses such a type.  As opposed to TARGET_RETURN_IN_MEMORY, which is called
6440    via aggregate_value_p for general type probing from tree-ssa.  */
6441
6442 static rtx
6443 ix86_struct_value_rtx (tree type, int incoming ATTRIBUTE_UNUSED)
6444 {
6445   static bool warnedsse, warnedmmx;
6446
6447   if (!TARGET_64BIT && type)
6448     {
6449       /* Look at the return type of the function, not the function type.  */
6450       enum machine_mode mode = TYPE_MODE (TREE_TYPE (type));
6451
6452       if (!TARGET_SSE && !warnedsse)
6453         {
6454           if (mode == TImode
6455               || (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 16))
6456             {
6457               warnedsse = true;
6458               warning (0, "SSE vector return without SSE enabled "
6459                        "changes the ABI");
6460             }
6461         }
6462
6463       if (!TARGET_MMX && !warnedmmx)
6464         {
6465           if (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 8)
6466             {
6467               warnedmmx = true;
6468               warning (0, "MMX vector return without MMX enabled "
6469                        "changes the ABI");
6470             }
6471         }
6472     }
6473
6474   return NULL;
6475 }
6476
6477 \f
6478 /* Create the va_list data type.  */
6479
6480 /* Returns the calling convention specific va_list date type.
6481    The argument ABI can be DEFAULT_ABI, MS_ABI, or SYSV_ABI.  */
6482
6483 static tree
6484 ix86_build_builtin_va_list_abi (enum calling_abi abi)
6485 {
6486   tree f_gpr, f_fpr, f_ovf, f_sav, record, type_decl;
6487
6488   /* For i386 we use plain pointer to argument area.  */
6489   if (!TARGET_64BIT || abi == MS_ABI)
6490     return build_pointer_type (char_type_node);
6491
6492   record = (*lang_hooks.types.make_type) (RECORD_TYPE);
6493   type_decl = build_decl (TYPE_DECL, get_identifier ("__va_list_tag"), record);
6494
6495   f_gpr = build_decl (FIELD_DECL, get_identifier ("gp_offset"),
6496                       unsigned_type_node);
6497   f_fpr = build_decl (FIELD_DECL, get_identifier ("fp_offset"),
6498                       unsigned_type_node);
6499   f_ovf = build_decl (FIELD_DECL, get_identifier ("overflow_arg_area"),
6500                       ptr_type_node);
6501   f_sav = build_decl (FIELD_DECL, get_identifier ("reg_save_area"),
6502                       ptr_type_node);
6503
6504   va_list_gpr_counter_field = f_gpr;
6505   va_list_fpr_counter_field = f_fpr;
6506
6507   DECL_FIELD_CONTEXT (f_gpr) = record;
6508   DECL_FIELD_CONTEXT (f_fpr) = record;
6509   DECL_FIELD_CONTEXT (f_ovf) = record;
6510   DECL_FIELD_CONTEXT (f_sav) = record;
6511
6512   TREE_CHAIN (record) = type_decl;
6513   TYPE_NAME (record) = type_decl;
6514   TYPE_FIELDS (record) = f_gpr;
6515   TREE_CHAIN (f_gpr) = f_fpr;
6516   TREE_CHAIN (f_fpr) = f_ovf;
6517   TREE_CHAIN (f_ovf) = f_sav;
6518
6519   layout_type (record);
6520
6521   /* The correct type is an array type of one element.  */
6522   return build_array_type (record, build_index_type (size_zero_node));
6523 }
6524
6525 /* Setup the builtin va_list data type and for 64-bit the additional
6526    calling convention specific va_list data types.  */
6527
6528 static tree
6529 ix86_build_builtin_va_list (void)
6530 {
6531   tree ret = ix86_build_builtin_va_list_abi (ix86_abi);
6532
6533   /* Initialize abi specific va_list builtin types.  */
6534   if (TARGET_64BIT)
6535     {
6536       tree t;
6537       if (ix86_abi == MS_ABI)
6538         {
6539           t = ix86_build_builtin_va_list_abi (SYSV_ABI);
6540           if (TREE_CODE (t) != RECORD_TYPE)
6541             t = build_variant_type_copy (t);
6542           sysv_va_list_type_node = t;
6543         }
6544       else
6545         {
6546           t = ret;
6547           if (TREE_CODE (t) != RECORD_TYPE)
6548             t = build_variant_type_copy (t);
6549           sysv_va_list_type_node = t;
6550         }
6551       if (ix86_abi != MS_ABI)
6552         {
6553           t = ix86_build_builtin_va_list_abi (MS_ABI);
6554           if (TREE_CODE (t) != RECORD_TYPE)
6555             t = build_variant_type_copy (t);
6556           ms_va_list_type_node = t;
6557         }
6558       else
6559         {
6560           t = ret;
6561           if (TREE_CODE (t) != RECORD_TYPE)
6562             t = build_variant_type_copy (t);
6563           ms_va_list_type_node = t;
6564         }
6565     }
6566
6567   return ret;
6568 }
6569
6570 /* Worker function for TARGET_SETUP_INCOMING_VARARGS.  */
6571
6572 static void
6573 setup_incoming_varargs_64 (CUMULATIVE_ARGS *cum)
6574 {
6575   rtx save_area, mem;
6576   rtx label;
6577   rtx label_ref;
6578   rtx tmp_reg;
6579   rtx nsse_reg;
6580   alias_set_type set;
6581   int i;
6582   int regparm = ix86_regparm;
6583
6584   if (cum->call_abi != ix86_abi)
6585     regparm = ix86_abi != SYSV_ABI ? X86_64_REGPARM_MAX : X64_REGPARM_MAX;
6586
6587   /* GPR size of varargs save area.  */
6588   if (cfun->va_list_gpr_size)
6589     ix86_varargs_gpr_size = X86_64_REGPARM_MAX * UNITS_PER_WORD;
6590   else
6591     ix86_varargs_gpr_size = 0;
6592
6593   /* FPR size of varargs save area.  We don't need it if we don't pass
6594      anything in SSE registers.  */
6595   if (cum->sse_nregs && cfun->va_list_fpr_size)
6596     ix86_varargs_fpr_size = X86_64_SSE_REGPARM_MAX * 16;
6597   else
6598     ix86_varargs_fpr_size = 0;
6599
6600   if (! ix86_varargs_gpr_size && ! ix86_varargs_fpr_size)
6601     return;
6602
6603   save_area = frame_pointer_rtx;
6604   set = get_varargs_alias_set ();
6605
6606   for (i = cum->regno;
6607        i < regparm
6608        && i < cum->regno + cfun->va_list_gpr_size / UNITS_PER_WORD;
6609        i++)
6610     {
6611       mem = gen_rtx_MEM (Pmode,
6612                          plus_constant (save_area, i * UNITS_PER_WORD));
6613       MEM_NOTRAP_P (mem) = 1;
6614       set_mem_alias_set (mem, set);
6615       emit_move_insn (mem, gen_rtx_REG (Pmode,
6616                                         x86_64_int_parameter_registers[i]));
6617     }
6618
6619   if (ix86_varargs_fpr_size)
6620     {
6621       /* Now emit code to save SSE registers.  The AX parameter contains number
6622          of SSE parameter registers used to call this function.  We use
6623          sse_prologue_save insn template that produces computed jump across
6624          SSE saves.  We need some preparation work to get this working.  */
6625
6626       label = gen_label_rtx ();
6627       label_ref = gen_rtx_LABEL_REF (Pmode, label);
6628
6629       /* Compute address to jump to :
6630          label - eax*4 + nnamed_sse_arguments*4 Or
6631          label - eax*5 + nnamed_sse_arguments*5 for AVX.  */
6632       tmp_reg = gen_reg_rtx (Pmode);
6633       nsse_reg = gen_reg_rtx (Pmode);
6634       emit_insn (gen_zero_extendqidi2 (nsse_reg, gen_rtx_REG (QImode, AX_REG)));
6635       emit_insn (gen_rtx_SET (VOIDmode, tmp_reg,
6636                               gen_rtx_MULT (Pmode, nsse_reg,
6637                                             GEN_INT (4))));
6638
6639       /* vmovaps is one byte longer than movaps.  */
6640       if (TARGET_AVX)
6641         emit_insn (gen_rtx_SET (VOIDmode, tmp_reg,
6642                                 gen_rtx_PLUS (Pmode, tmp_reg,
6643                                               nsse_reg)));
6644
6645       if (cum->sse_regno)
6646         emit_move_insn
6647           (nsse_reg,
6648            gen_rtx_CONST (DImode,
6649                           gen_rtx_PLUS (DImode,
6650                                         label_ref,
6651                                         GEN_INT (cum->sse_regno
6652                                                  * (TARGET_AVX ? 5 : 4)))));
6653       else
6654         emit_move_insn (nsse_reg, label_ref);
6655       emit_insn (gen_subdi3 (nsse_reg, nsse_reg, tmp_reg));
6656
6657       /* Compute address of memory block we save into.  We always use pointer
6658          pointing 127 bytes after first byte to store - this is needed to keep
6659          instruction size limited by 4 bytes (5 bytes for AVX) with one
6660          byte displacement.  */
6661       tmp_reg = gen_reg_rtx (Pmode);
6662       emit_insn (gen_rtx_SET (VOIDmode, tmp_reg,
6663                               plus_constant (save_area,
6664                                              ix86_varargs_gpr_size + 127)));
6665       mem = gen_rtx_MEM (BLKmode, plus_constant (tmp_reg, -127));
6666       MEM_NOTRAP_P (mem) = 1;
6667       set_mem_alias_set (mem, set);
6668       set_mem_align (mem, BITS_PER_WORD);
6669
6670       /* And finally do the dirty job!  */
6671       emit_insn (gen_sse_prologue_save (mem, nsse_reg,
6672                                         GEN_INT (cum->sse_regno), label));
6673     }
6674 }
6675
6676 static void
6677 setup_incoming_varargs_ms_64 (CUMULATIVE_ARGS *cum)
6678 {
6679   alias_set_type set = get_varargs_alias_set ();
6680   int i;
6681
6682   for (i = cum->regno; i < X64_REGPARM_MAX; i++)
6683     {
6684       rtx reg, mem;
6685
6686       mem = gen_rtx_MEM (Pmode,
6687                          plus_constant (virtual_incoming_args_rtx,
6688                                         i * UNITS_PER_WORD));
6689       MEM_NOTRAP_P (mem) = 1;
6690       set_mem_alias_set (mem, set);
6691
6692       reg = gen_rtx_REG (Pmode, x86_64_ms_abi_int_parameter_registers[i]);
6693       emit_move_insn (mem, reg);
6694     }
6695 }
6696
6697 static void
6698 ix86_setup_incoming_varargs (CUMULATIVE_ARGS *cum, enum machine_mode mode,
6699                              tree type, int *pretend_size ATTRIBUTE_UNUSED,
6700                              int no_rtl)
6701 {
6702   CUMULATIVE_ARGS next_cum;
6703   tree fntype;
6704
6705   /* This argument doesn't appear to be used anymore.  Which is good,
6706      because the old code here didn't suppress rtl generation.  */
6707   gcc_assert (!no_rtl);
6708
6709   if (!TARGET_64BIT)
6710     return;
6711
6712   fntype = TREE_TYPE (current_function_decl);
6713
6714   /* For varargs, we do not want to skip the dummy va_dcl argument.
6715      For stdargs, we do want to skip the last named argument.  */
6716   next_cum = *cum;
6717   if (stdarg_p (fntype))
6718     function_arg_advance (&next_cum, mode, type, 1);
6719
6720   if (cum->call_abi == MS_ABI)
6721     setup_incoming_varargs_ms_64 (&next_cum);
6722   else
6723     setup_incoming_varargs_64 (&next_cum);
6724 }
6725
6726 /* Checks if TYPE is of kind va_list char *.  */
6727
6728 static bool
6729 is_va_list_char_pointer (tree type)
6730 {
6731   tree canonic;
6732
6733   /* For 32-bit it is always true.  */
6734   if (!TARGET_64BIT)
6735     return true;
6736   canonic = ix86_canonical_va_list_type (type);
6737   return (canonic == ms_va_list_type_node
6738           || (ix86_abi == MS_ABI && canonic == va_list_type_node));
6739 }
6740
6741 /* Implement va_start.  */
6742
6743 static void
6744 ix86_va_start (tree valist, rtx nextarg)
6745 {
6746   HOST_WIDE_INT words, n_gpr, n_fpr;
6747   tree f_gpr, f_fpr, f_ovf, f_sav;
6748   tree gpr, fpr, ovf, sav, t;
6749   tree type;
6750
6751   /* Only 64bit target needs something special.  */
6752   if (!TARGET_64BIT || is_va_list_char_pointer (TREE_TYPE (valist)))
6753     {
6754       std_expand_builtin_va_start (valist, nextarg);
6755       return;
6756     }
6757
6758   f_gpr = TYPE_FIELDS (TREE_TYPE (sysv_va_list_type_node));
6759   f_fpr = TREE_CHAIN (f_gpr);
6760   f_ovf = TREE_CHAIN (f_fpr);
6761   f_sav = TREE_CHAIN (f_ovf);
6762
6763   valist = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (valist)), valist);
6764   gpr = build3 (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr, NULL_TREE);
6765   fpr = build3 (COMPONENT_REF, TREE_TYPE (f_fpr), valist, f_fpr, NULL_TREE);
6766   ovf = build3 (COMPONENT_REF, TREE_TYPE (f_ovf), valist, f_ovf, NULL_TREE);
6767   sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), valist, f_sav, NULL_TREE);
6768
6769   /* Count number of gp and fp argument registers used.  */
6770   words = crtl->args.info.words;
6771   n_gpr = crtl->args.info.regno;
6772   n_fpr = crtl->args.info.sse_regno;
6773
6774   if (cfun->va_list_gpr_size)
6775     {
6776       type = TREE_TYPE (gpr);
6777       t = build2 (MODIFY_EXPR, type,
6778                   gpr, build_int_cst (type, n_gpr * 8));
6779       TREE_SIDE_EFFECTS (t) = 1;
6780       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
6781     }
6782
6783   if (TARGET_SSE && cfun->va_list_fpr_size)
6784     {
6785       type = TREE_TYPE (fpr);
6786       t = build2 (MODIFY_EXPR, type, fpr,
6787                   build_int_cst (type, n_fpr * 16 + 8*X86_64_REGPARM_MAX));
6788       TREE_SIDE_EFFECTS (t) = 1;
6789       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
6790     }
6791
6792   /* Find the overflow area.  */
6793   type = TREE_TYPE (ovf);
6794   t = make_tree (type, crtl->args.internal_arg_pointer);
6795   if (words != 0)
6796     t = build2 (POINTER_PLUS_EXPR, type, t,
6797                 size_int (words * UNITS_PER_WORD));
6798   t = build2 (MODIFY_EXPR, type, ovf, t);
6799   TREE_SIDE_EFFECTS (t) = 1;
6800   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
6801
6802   if (ix86_varargs_gpr_size || ix86_varargs_fpr_size)
6803     {
6804       /* Find the register save area.
6805          Prologue of the function save it right above stack frame.  */
6806       type = TREE_TYPE (sav);
6807       t = make_tree (type, frame_pointer_rtx);
6808       if (!ix86_varargs_gpr_size)
6809         t = build2 (POINTER_PLUS_EXPR, type, t,
6810                     size_int (-8 * X86_64_REGPARM_MAX));
6811       t = build2 (MODIFY_EXPR, type, sav, t);
6812       TREE_SIDE_EFFECTS (t) = 1;
6813       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
6814     }
6815 }
6816
6817 /* Implement va_arg.  */
6818
6819 static tree
6820 ix86_gimplify_va_arg (tree valist, tree type, gimple_seq *pre_p,
6821                       gimple_seq *post_p)
6822 {
6823   static const int intreg[6] = { 0, 1, 2, 3, 4, 5 };
6824   tree f_gpr, f_fpr, f_ovf, f_sav;
6825   tree gpr, fpr, ovf, sav, t;
6826   int size, rsize;
6827   tree lab_false, lab_over = NULL_TREE;
6828   tree addr, t2;
6829   rtx container;
6830   int indirect_p = 0;
6831   tree ptrtype;
6832   enum machine_mode nat_mode;
6833   int arg_boundary;
6834
6835   /* Only 64bit target needs something special.  */
6836   if (!TARGET_64BIT || is_va_list_char_pointer (TREE_TYPE (valist)))
6837     return std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
6838
6839   f_gpr = TYPE_FIELDS (TREE_TYPE (sysv_va_list_type_node));
6840   f_fpr = TREE_CHAIN (f_gpr);
6841   f_ovf = TREE_CHAIN (f_fpr);
6842   f_sav = TREE_CHAIN (f_ovf);
6843
6844   gpr = build3 (COMPONENT_REF, TREE_TYPE (f_gpr),
6845                 build_va_arg_indirect_ref (valist), f_gpr, NULL_TREE);
6846   valist = build_va_arg_indirect_ref (valist);
6847   fpr = build3 (COMPONENT_REF, TREE_TYPE (f_fpr), valist, f_fpr, NULL_TREE);
6848   ovf = build3 (COMPONENT_REF, TREE_TYPE (f_ovf), valist, f_ovf, NULL_TREE);
6849   sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), valist, f_sav, NULL_TREE);
6850
6851   indirect_p = pass_by_reference (NULL, TYPE_MODE (type), type, false);
6852   if (indirect_p)
6853     type = build_pointer_type (type);
6854   size = int_size_in_bytes (type);
6855   rsize = (size + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
6856
6857   nat_mode = type_natural_mode (type, NULL);
6858   switch (nat_mode)
6859     {
6860     case V8SFmode:
6861     case V8SImode:
6862     case V32QImode:
6863     case V16HImode:
6864     case V4DFmode:
6865     case V4DImode:
6866       /* Unnamed 256bit vector mode parameters are passed on stack.  */
6867       if (ix86_cfun_abi () == SYSV_ABI)
6868         {
6869           container = NULL;
6870           break;
6871         }
6872
6873     default:
6874       container = construct_container (nat_mode, TYPE_MODE (type),
6875                                        type, 0, X86_64_REGPARM_MAX,
6876                                        X86_64_SSE_REGPARM_MAX, intreg,
6877                                        0);
6878       break;
6879     }
6880
6881   /* Pull the value out of the saved registers.  */
6882
6883   addr = create_tmp_var (ptr_type_node, "addr");
6884   DECL_POINTER_ALIAS_SET (addr) = get_varargs_alias_set ();
6885
6886   if (container)
6887     {
6888       int needed_intregs, needed_sseregs;
6889       bool need_temp;
6890       tree int_addr, sse_addr;
6891
6892       lab_false = create_artificial_label ();
6893       lab_over = create_artificial_label ();
6894
6895       examine_argument (nat_mode, type, 0, &needed_intregs, &needed_sseregs);
6896
6897       need_temp = (!REG_P (container)
6898                    && ((needed_intregs && TYPE_ALIGN (type) > 64)
6899                        || TYPE_ALIGN (type) > 128));
6900
6901       /* In case we are passing structure, verify that it is consecutive block
6902          on the register save area.  If not we need to do moves.  */
6903       if (!need_temp && !REG_P (container))
6904         {
6905           /* Verify that all registers are strictly consecutive  */
6906           if (SSE_REGNO_P (REGNO (XEXP (XVECEXP (container, 0, 0), 0))))
6907             {
6908               int i;
6909
6910               for (i = 0; i < XVECLEN (container, 0) && !need_temp; i++)
6911                 {
6912                   rtx slot = XVECEXP (container, 0, i);
6913                   if (REGNO (XEXP (slot, 0)) != FIRST_SSE_REG + (unsigned int) i
6914                       || INTVAL (XEXP (slot, 1)) != i * 16)
6915                     need_temp = 1;
6916                 }
6917             }
6918           else
6919             {
6920               int i;
6921
6922               for (i = 0; i < XVECLEN (container, 0) && !need_temp; i++)
6923                 {
6924                   rtx slot = XVECEXP (container, 0, i);
6925                   if (REGNO (XEXP (slot, 0)) != (unsigned int) i
6926                       || INTVAL (XEXP (slot, 1)) != i * 8)
6927                     need_temp = 1;
6928                 }
6929             }
6930         }
6931       if (!need_temp)
6932         {
6933           int_addr = addr;
6934           sse_addr = addr;
6935         }
6936       else
6937         {
6938           int_addr = create_tmp_var (ptr_type_node, "int_addr");
6939           DECL_POINTER_ALIAS_SET (int_addr) = get_varargs_alias_set ();
6940           sse_addr = create_tmp_var (ptr_type_node, "sse_addr");
6941           DECL_POINTER_ALIAS_SET (sse_addr) = get_varargs_alias_set ();
6942         }
6943
6944       /* First ensure that we fit completely in registers.  */
6945       if (needed_intregs)
6946         {
6947           t = build_int_cst (TREE_TYPE (gpr),
6948                              (X86_64_REGPARM_MAX - needed_intregs + 1) * 8);
6949           t = build2 (GE_EXPR, boolean_type_node, gpr, t);
6950           t2 = build1 (GOTO_EXPR, void_type_node, lab_false);
6951           t = build3 (COND_EXPR, void_type_node, t, t2, NULL_TREE);
6952           gimplify_and_add (t, pre_p);
6953         }
6954       if (needed_sseregs)
6955         {
6956           t = build_int_cst (TREE_TYPE (fpr),
6957                              (X86_64_SSE_REGPARM_MAX - needed_sseregs + 1) * 16
6958                              + X86_64_REGPARM_MAX * 8);
6959           t = build2 (GE_EXPR, boolean_type_node, fpr, t);
6960           t2 = build1 (GOTO_EXPR, void_type_node, lab_false);
6961           t = build3 (COND_EXPR, void_type_node, t, t2, NULL_TREE);
6962           gimplify_and_add (t, pre_p);
6963         }
6964
6965       /* Compute index to start of area used for integer regs.  */
6966       if (needed_intregs)
6967         {
6968           /* int_addr = gpr + sav; */
6969           t = fold_convert (sizetype, gpr);
6970           t = build2 (POINTER_PLUS_EXPR, ptr_type_node, sav, t);
6971           gimplify_assign (int_addr, t, pre_p);
6972         }
6973       if (needed_sseregs)
6974         {
6975           /* sse_addr = fpr + sav; */
6976           t = fold_convert (sizetype, fpr);
6977           t = build2 (POINTER_PLUS_EXPR, ptr_type_node, sav, t);
6978           gimplify_assign (sse_addr, t, pre_p);
6979         }
6980       if (need_temp)
6981         {
6982           int i;
6983           tree temp = create_tmp_var (type, "va_arg_tmp");
6984
6985           /* addr = &temp; */
6986           t = build1 (ADDR_EXPR, build_pointer_type (type), temp);
6987           gimplify_assign (addr, t, pre_p);
6988
6989           for (i = 0; i < XVECLEN (container, 0); i++)
6990             {
6991               rtx slot = XVECEXP (container, 0, i);
6992               rtx reg = XEXP (slot, 0);
6993               enum machine_mode mode = GET_MODE (reg);
6994               tree piece_type = lang_hooks.types.type_for_mode (mode, 1);
6995               tree addr_type = build_pointer_type (piece_type);
6996               tree daddr_type = build_pointer_type_for_mode (piece_type,
6997                                                              ptr_mode, true);
6998               tree src_addr, src;
6999               int src_offset;
7000               tree dest_addr, dest;
7001
7002               if (SSE_REGNO_P (REGNO (reg)))
7003                 {
7004                   src_addr = sse_addr;
7005                   src_offset = (REGNO (reg) - FIRST_SSE_REG) * 16;
7006                 }
7007               else
7008                 {
7009                   src_addr = int_addr;
7010                   src_offset = REGNO (reg) * 8;
7011                 }
7012               src_addr = fold_convert (addr_type, src_addr);
7013               src_addr = fold_build2 (POINTER_PLUS_EXPR, addr_type, src_addr,
7014                                       size_int (src_offset));
7015               src = build_va_arg_indirect_ref (src_addr);
7016
7017               dest_addr = fold_convert (daddr_type, addr);
7018               dest_addr = fold_build2 (POINTER_PLUS_EXPR, daddr_type, dest_addr,
7019                                        size_int (INTVAL (XEXP (slot, 1))));
7020               dest = build_va_arg_indirect_ref (dest_addr);
7021
7022               gimplify_assign (dest, src, pre_p);
7023             }
7024         }
7025
7026       if (needed_intregs)
7027         {
7028           t = build2 (PLUS_EXPR, TREE_TYPE (gpr), gpr,
7029                       build_int_cst (TREE_TYPE (gpr), needed_intregs * 8));
7030           gimplify_assign (gpr, t, pre_p);
7031         }
7032
7033       if (needed_sseregs)
7034         {
7035           t = build2 (PLUS_EXPR, TREE_TYPE (fpr), fpr,
7036                       build_int_cst (TREE_TYPE (fpr), needed_sseregs * 16));
7037           gimplify_assign (fpr, t, pre_p);
7038         }
7039
7040       gimple_seq_add_stmt (pre_p, gimple_build_goto (lab_over));
7041
7042       gimple_seq_add_stmt (pre_p, gimple_build_label (lab_false));
7043     }
7044
7045   /* ... otherwise out of the overflow area.  */
7046
7047   /* When we align parameter on stack for caller, if the parameter
7048      alignment is beyond MAX_SUPPORTED_STACK_ALIGNMENT, it will be
7049      aligned at MAX_SUPPORTED_STACK_ALIGNMENT.  We will match callee
7050      here with caller.  */
7051   arg_boundary = FUNCTION_ARG_BOUNDARY (VOIDmode, type);
7052   if ((unsigned int) arg_boundary > MAX_SUPPORTED_STACK_ALIGNMENT)
7053     arg_boundary = MAX_SUPPORTED_STACK_ALIGNMENT;
7054
7055   /* Care for on-stack alignment if needed.  */
7056   if (arg_boundary <= 64
7057       || integer_zerop (TYPE_SIZE (type)))
7058     t = ovf;
7059  else
7060     {
7061       HOST_WIDE_INT align = arg_boundary / 8;
7062       t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ovf), ovf,
7063                   size_int (align - 1));
7064       t = fold_convert (sizetype, t);
7065       t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t,
7066                   size_int (-align));
7067       t = fold_convert (TREE_TYPE (ovf), t);
7068     }
7069   gimplify_expr (&t, pre_p, NULL, is_gimple_val, fb_rvalue);
7070   gimplify_assign (addr, t, pre_p);
7071
7072   t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t,
7073               size_int (rsize * UNITS_PER_WORD));
7074   gimplify_assign (unshare_expr (ovf), t, pre_p);
7075
7076   if (container)
7077     gimple_seq_add_stmt (pre_p, gimple_build_label (lab_over));
7078
7079   ptrtype = build_pointer_type (type);
7080   addr = fold_convert (ptrtype, addr);
7081
7082   if (indirect_p)
7083     addr = build_va_arg_indirect_ref (addr);
7084   return build_va_arg_indirect_ref (addr);
7085 }
7086 \f
7087 /* Return nonzero if OPNUM's MEM should be matched
7088    in movabs* patterns.  */
7089
7090 int
7091 ix86_check_movabs (rtx insn, int opnum)
7092 {
7093   rtx set, mem;
7094
7095   set = PATTERN (insn);
7096   if (GET_CODE (set) == PARALLEL)
7097     set = XVECEXP (set, 0, 0);
7098   gcc_assert (GET_CODE (set) == SET);
7099   mem = XEXP (set, opnum);
7100   while (GET_CODE (mem) == SUBREG)
7101     mem = SUBREG_REG (mem);
7102   gcc_assert (MEM_P (mem));
7103   return (volatile_ok || !MEM_VOLATILE_P (mem));
7104 }
7105 \f
7106 /* Initialize the table of extra 80387 mathematical constants.  */
7107
7108 static void
7109 init_ext_80387_constants (void)
7110 {
7111   static const char * cst[5] =
7112   {
7113     "0.3010299956639811952256464283594894482",  /* 0: fldlg2  */
7114     "0.6931471805599453094286904741849753009",  /* 1: fldln2  */
7115     "1.4426950408889634073876517827983434472",  /* 2: fldl2e  */
7116     "3.3219280948873623478083405569094566090",  /* 3: fldl2t  */
7117     "3.1415926535897932385128089594061862044",  /* 4: fldpi   */
7118   };
7119   int i;
7120
7121   for (i = 0; i < 5; i++)
7122     {
7123       real_from_string (&ext_80387_constants_table[i], cst[i]);
7124       /* Ensure each constant is rounded to XFmode precision.  */
7125       real_convert (&ext_80387_constants_table[i],
7126                     XFmode, &ext_80387_constants_table[i]);
7127     }
7128
7129   ext_80387_constants_init = 1;
7130 }
7131
7132 /* Return true if the constant is something that can be loaded with
7133    a special instruction.  */
7134
7135 int
7136 standard_80387_constant_p (rtx x)
7137 {
7138   enum machine_mode mode = GET_MODE (x);
7139
7140   REAL_VALUE_TYPE r;
7141
7142   if (!(X87_FLOAT_MODE_P (mode) && (GET_CODE (x) == CONST_DOUBLE)))
7143     return -1;
7144
7145   if (x == CONST0_RTX (mode))
7146     return 1;
7147   if (x == CONST1_RTX (mode))
7148     return 2;
7149
7150   REAL_VALUE_FROM_CONST_DOUBLE (r, x);
7151
7152   /* For XFmode constants, try to find a special 80387 instruction when
7153      optimizing for size or on those CPUs that benefit from them.  */
7154   if (mode == XFmode
7155       && (optimize_function_for_size_p (cfun) || TARGET_EXT_80387_CONSTANTS))
7156     {
7157       int i;
7158
7159       if (! ext_80387_constants_init)
7160         init_ext_80387_constants ();
7161
7162       for (i = 0; i < 5; i++)
7163         if (real_identical (&r, &ext_80387_constants_table[i]))
7164           return i + 3;
7165     }
7166
7167   /* Load of the constant -0.0 or -1.0 will be split as
7168      fldz;fchs or fld1;fchs sequence.  */
7169   if (real_isnegzero (&r))
7170     return 8;
7171   if (real_identical (&r, &dconstm1))
7172     return 9;
7173
7174   return 0;
7175 }
7176
7177 /* Return the opcode of the special instruction to be used to load
7178    the constant X.  */
7179
7180 const char *
7181 standard_80387_constant_opcode (rtx x)
7182 {
7183   switch (standard_80387_constant_p (x))
7184     {
7185     case 1:
7186       return "fldz";
7187     case 2:
7188       return "fld1";
7189     case 3:
7190       return "fldlg2";
7191     case 4:
7192       return "fldln2";
7193     case 5:
7194       return "fldl2e";
7195     case 6:
7196       return "fldl2t";
7197     case 7:
7198       return "fldpi";
7199     case 8:
7200     case 9:
7201       return "#";
7202     default:
7203       gcc_unreachable ();
7204     }
7205 }
7206
7207 /* Return the CONST_DOUBLE representing the 80387 constant that is
7208    loaded by the specified special instruction.  The argument IDX
7209    matches the return value from standard_80387_constant_p.  */
7210
7211 rtx
7212 standard_80387_constant_rtx (int idx)
7213 {
7214   int i;
7215
7216   if (! ext_80387_constants_init)
7217     init_ext_80387_constants ();
7218
7219   switch (idx)
7220     {
7221     case 3:
7222     case 4:
7223     case 5:
7224     case 6:
7225     case 7:
7226       i = idx - 3;
7227       break;
7228
7229     default:
7230       gcc_unreachable ();
7231     }
7232
7233   return CONST_DOUBLE_FROM_REAL_VALUE (ext_80387_constants_table[i],
7234                                        XFmode);
7235 }
7236
7237 /* Return 1 if mode is a valid mode for sse.  */
7238 static int
7239 standard_sse_mode_p (enum machine_mode mode)
7240 {
7241   switch (mode)
7242     {
7243     case V16QImode:
7244     case V8HImode:
7245     case V4SImode:
7246     case V2DImode:
7247     case V4SFmode:
7248     case V2DFmode:
7249       return 1;
7250
7251     default:
7252       return 0;
7253     }
7254 }
7255
7256 /* Return 1 if X is all 0s.  For all 1s, return 2 if X is in 128bit
7257    SSE modes and SSE2 is enabled,  return 3 if X is in 256bit AVX
7258    modes and AVX is enabled.  */
7259
7260 int
7261 standard_sse_constant_p (rtx x)
7262 {
7263   enum machine_mode mode = GET_MODE (x);
7264
7265   if (x == const0_rtx || x == CONST0_RTX (GET_MODE (x)))
7266     return 1;
7267   if (vector_all_ones_operand (x, mode))
7268     {
7269       if (standard_sse_mode_p (mode))
7270         return TARGET_SSE2 ? 2 : -2;
7271       else if (VALID_AVX256_REG_MODE (mode))
7272         return TARGET_AVX ? 3 : -3;
7273     }
7274
7275   return 0;
7276 }
7277
7278 /* Return the opcode of the special instruction to be used to load
7279    the constant X.  */
7280
7281 const char *
7282 standard_sse_constant_opcode (rtx insn, rtx x)
7283 {
7284   switch (standard_sse_constant_p (x))
7285     {
7286     case 1:
7287       switch (get_attr_mode (insn))
7288         {
7289         case MODE_V4SF:
7290           return TARGET_AVX ? "vxorps\t%0, %0, %0" : "xorps\t%0, %0";
7291         case MODE_V2DF:
7292           return TARGET_AVX ? "vxorpd\t%0, %0, %0" : "xorpd\t%0, %0";
7293         case MODE_TI:
7294           return TARGET_AVX ? "vpxor\t%0, %0, %0" : "pxor\t%0, %0";
7295         case MODE_V8SF:
7296           return "vxorps\t%x0, %x0, %x0";
7297         case MODE_V4DF:
7298           return "vxorpd\t%x0, %x0, %x0";
7299         case MODE_OI:
7300           return "vpxor\t%x0, %x0, %x0";
7301         default:
7302           gcc_unreachable ();
7303         }
7304     case 2:
7305       if (TARGET_AVX)
7306         switch (get_attr_mode (insn))
7307           {
7308           case MODE_V4SF:
7309           case MODE_V2DF:
7310           case MODE_TI:
7311             return "vpcmpeqd\t%0, %0, %0";
7312             break;
7313           default:
7314             gcc_unreachable ();
7315         }
7316       else
7317         return "pcmpeqd\t%0, %0";
7318     }
7319   gcc_unreachable ();
7320 }
7321
7322 /* Returns 1 if OP contains a symbol reference */
7323
7324 int
7325 symbolic_reference_mentioned_p (rtx op)
7326 {
7327   const char *fmt;
7328   int i;
7329
7330   if (GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == LABEL_REF)
7331     return 1;
7332
7333   fmt = GET_RTX_FORMAT (GET_CODE (op));
7334   for (i = GET_RTX_LENGTH (GET_CODE (op)) - 1; i >= 0; i--)
7335     {
7336       if (fmt[i] == 'E')
7337         {
7338           int j;
7339
7340           for (j = XVECLEN (op, i) - 1; j >= 0; j--)
7341             if (symbolic_reference_mentioned_p (XVECEXP (op, i, j)))
7342               return 1;
7343         }
7344
7345       else if (fmt[i] == 'e' && symbolic_reference_mentioned_p (XEXP (op, i)))
7346         return 1;
7347     }
7348
7349   return 0;
7350 }
7351
7352 /* Return 1 if it is appropriate to emit `ret' instructions in the
7353    body of a function.  Do this only if the epilogue is simple, needing a
7354    couple of insns.  Prior to reloading, we can't tell how many registers
7355    must be saved, so return 0 then.  Return 0 if there is no frame
7356    marker to de-allocate.  */
7357
7358 int
7359 ix86_can_use_return_insn_p (void)
7360 {
7361   struct ix86_frame frame;
7362
7363   if (! reload_completed || frame_pointer_needed)
7364     return 0;
7365
7366   /* Don't allow more than 32 pop, since that's all we can do
7367      with one instruction.  */
7368   if (crtl->args.pops_args
7369       && crtl->args.size >= 32768)
7370     return 0;
7371
7372   ix86_compute_frame_layout (&frame);
7373   return frame.to_allocate == 0 && (frame.nregs + frame.nsseregs) == 0;
7374 }
7375 \f
7376 /* Value should be nonzero if functions must have frame pointers.
7377    Zero means the frame pointer need not be set up (and parms may
7378    be accessed via the stack pointer) in functions that seem suitable.  */
7379
7380 int
7381 ix86_frame_pointer_required (void)
7382 {
7383   /* If we accessed previous frames, then the generated code expects
7384      to be able to access the saved ebp value in our frame.  */
7385   if (cfun->machine->accesses_prev_frame)
7386     return 1;
7387
7388   /* Several x86 os'es need a frame pointer for other reasons,
7389      usually pertaining to setjmp.  */
7390   if (SUBTARGET_FRAME_POINTER_REQUIRED)
7391     return 1;
7392
7393   /* In override_options, TARGET_OMIT_LEAF_FRAME_POINTER turns off
7394      the frame pointer by default.  Turn it back on now if we've not
7395      got a leaf function.  */
7396   if (TARGET_OMIT_LEAF_FRAME_POINTER
7397       && (!current_function_is_leaf
7398           || ix86_current_function_calls_tls_descriptor))
7399     return 1;
7400
7401   if (crtl->profile)
7402     return 1;
7403
7404   return 0;
7405 }
7406
7407 /* Record that the current function accesses previous call frames.  */
7408
7409 void
7410 ix86_setup_frame_addresses (void)
7411 {
7412   cfun->machine->accesses_prev_frame = 1;
7413 }
7414 \f
7415 #if (defined(HAVE_GAS_HIDDEN) && (SUPPORTS_ONE_ONLY - 0)) || TARGET_MACHO
7416 # define USE_HIDDEN_LINKONCE 1
7417 #else
7418 # define USE_HIDDEN_LINKONCE 0
7419 #endif
7420
7421 static int pic_labels_used;
7422
7423 /* Fills in the label name that should be used for a pc thunk for
7424    the given register.  */
7425
7426 static void
7427 get_pc_thunk_name (char name[32], unsigned int regno)
7428 {
7429   gcc_assert (!TARGET_64BIT);
7430
7431   if (USE_HIDDEN_LINKONCE)
7432     sprintf (name, "__i686.get_pc_thunk.%s", reg_names[regno]);
7433   else
7434     ASM_GENERATE_INTERNAL_LABEL (name, "LPR", regno);
7435 }
7436
7437
7438 /* This function generates code for -fpic that loads %ebx with
7439    the return address of the caller and then returns.  */
7440
7441 void
7442 ix86_file_end (void)
7443 {
7444   rtx xops[2];
7445   int regno;
7446
7447   for (regno = 0; regno < 8; ++regno)
7448     {
7449       char name[32];
7450
7451       if (! ((pic_labels_used >> regno) & 1))
7452         continue;
7453
7454       get_pc_thunk_name (name, regno);
7455
7456 #if TARGET_MACHO
7457       if (TARGET_MACHO)
7458         {
7459           switch_to_section (darwin_sections[text_coal_section]);
7460           fputs ("\t.weak_definition\t", asm_out_file);
7461           assemble_name (asm_out_file, name);
7462           fputs ("\n\t.private_extern\t", asm_out_file);
7463           assemble_name (asm_out_file, name);
7464           fputs ("\n", asm_out_file);
7465           ASM_OUTPUT_LABEL (asm_out_file, name);
7466         }
7467       else
7468 #endif
7469       if (USE_HIDDEN_LINKONCE)
7470         {
7471           tree decl;
7472
7473           decl = build_decl (FUNCTION_DECL, get_identifier (name),
7474                              error_mark_node);
7475           TREE_PUBLIC (decl) = 1;
7476           TREE_STATIC (decl) = 1;
7477           DECL_ONE_ONLY (decl) = 1;
7478
7479           (*targetm.asm_out.unique_section) (decl, 0);
7480           switch_to_section (get_named_section (decl, NULL, 0));
7481
7482           (*targetm.asm_out.globalize_label) (asm_out_file, name);
7483           fputs ("\t.hidden\t", asm_out_file);
7484           assemble_name (asm_out_file, name);
7485           fputc ('\n', asm_out_file);
7486           ASM_DECLARE_FUNCTION_NAME (asm_out_file, name, decl);
7487         }
7488       else
7489         {
7490           switch_to_section (text_section);
7491           ASM_OUTPUT_LABEL (asm_out_file, name);
7492         }
7493
7494       xops[0] = gen_rtx_REG (Pmode, regno);
7495       xops[1] = gen_rtx_MEM (Pmode, stack_pointer_rtx);
7496       output_asm_insn ("mov%z0\t{%1, %0|%0, %1}", xops);
7497       output_asm_insn ("ret", xops);
7498     }
7499
7500   if (NEED_INDICATE_EXEC_STACK)
7501     file_end_indicate_exec_stack ();
7502 }
7503
7504 /* Emit code for the SET_GOT patterns.  */
7505
7506 const char *
7507 output_set_got (rtx dest, rtx label ATTRIBUTE_UNUSED)
7508 {
7509   rtx xops[3];
7510
7511   xops[0] = dest;
7512
7513   if (TARGET_VXWORKS_RTP && flag_pic)
7514     {
7515       /* Load (*VXWORKS_GOTT_BASE) into the PIC register.  */
7516       xops[2] = gen_rtx_MEM (Pmode,
7517                              gen_rtx_SYMBOL_REF (Pmode, VXWORKS_GOTT_BASE));
7518       output_asm_insn ("mov{l}\t{%2, %0|%0, %2}", xops);
7519
7520       /* Load (*VXWORKS_GOTT_BASE)[VXWORKS_GOTT_INDEX] into the PIC register.
7521          Use %P and a local symbol in order to print VXWORKS_GOTT_INDEX as
7522          an unadorned address.  */
7523       xops[2] = gen_rtx_SYMBOL_REF (Pmode, VXWORKS_GOTT_INDEX);
7524       SYMBOL_REF_FLAGS (xops[2]) |= SYMBOL_FLAG_LOCAL;
7525       output_asm_insn ("mov{l}\t{%P2(%0), %0|%0, DWORD PTR %P2[%0]}", xops);
7526       return "";
7527     }
7528
7529   xops[1] = gen_rtx_SYMBOL_REF (Pmode, GOT_SYMBOL_NAME);
7530
7531   if (! TARGET_DEEP_BRANCH_PREDICTION || !flag_pic)
7532     {
7533       xops[2] = gen_rtx_LABEL_REF (Pmode, label ? label : gen_label_rtx ());
7534
7535       if (!flag_pic)
7536         output_asm_insn ("mov%z0\t{%2, %0|%0, %2}", xops);
7537       else
7538         output_asm_insn ("call\t%a2", xops);
7539
7540 #if TARGET_MACHO
7541       /* Output the Mach-O "canonical" label name ("Lxx$pb") here too.  This
7542          is what will be referenced by the Mach-O PIC subsystem.  */
7543       if (!label)
7544         ASM_OUTPUT_LABEL (asm_out_file, MACHOPIC_FUNCTION_BASE_NAME);
7545 #endif
7546
7547       (*targetm.asm_out.internal_label) (asm_out_file, "L",
7548                                  CODE_LABEL_NUMBER (XEXP (xops[2], 0)));
7549
7550       if (flag_pic)
7551         output_asm_insn ("pop%z0\t%0", xops);
7552     }
7553   else
7554     {
7555       char name[32];
7556       get_pc_thunk_name (name, REGNO (dest));
7557       pic_labels_used |= 1 << REGNO (dest);
7558
7559       xops[2] = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (name));
7560       xops[2] = gen_rtx_MEM (QImode, xops[2]);
7561       output_asm_insn ("call\t%X2", xops);
7562       /* Output the Mach-O "canonical" label name ("Lxx$pb") here too.  This
7563          is what will be referenced by the Mach-O PIC subsystem.  */
7564 #if TARGET_MACHO
7565       if (!label)
7566         ASM_OUTPUT_LABEL (asm_out_file, MACHOPIC_FUNCTION_BASE_NAME);
7567       else
7568         targetm.asm_out.internal_label (asm_out_file, "L",
7569                                            CODE_LABEL_NUMBER (label));
7570 #endif
7571     }
7572
7573   if (TARGET_MACHO)
7574     return "";
7575
7576   if (!flag_pic || TARGET_DEEP_BRANCH_PREDICTION)
7577     output_asm_insn ("add%z0\t{%1, %0|%0, %1}", xops);
7578   else
7579     output_asm_insn ("add%z0\t{%1+[.-%a2], %0|%0, %1+(.-%a2)}", xops);
7580
7581   return "";
7582 }
7583
7584 /* Generate an "push" pattern for input ARG.  */
7585
7586 static rtx
7587 gen_push (rtx arg)
7588 {
7589   return gen_rtx_SET (VOIDmode,
7590                       gen_rtx_MEM (Pmode,
7591                                    gen_rtx_PRE_DEC (Pmode,
7592                                                     stack_pointer_rtx)),
7593                       arg);
7594 }
7595
7596 /* Return >= 0 if there is an unused call-clobbered register available
7597    for the entire function.  */
7598
7599 static unsigned int
7600 ix86_select_alt_pic_regnum (void)
7601 {
7602   if (current_function_is_leaf && !crtl->profile
7603       && !ix86_current_function_calls_tls_descriptor)
7604     {
7605       int i, drap;
7606       /* Can't use the same register for both PIC and DRAP.  */
7607       if (crtl->drap_reg)
7608         drap = REGNO (crtl->drap_reg);
7609       else
7610         drap = -1;
7611       for (i = 2; i >= 0; --i)
7612         if (i != drap && !df_regs_ever_live_p (i))
7613           return i;
7614     }
7615
7616   return INVALID_REGNUM;
7617 }
7618
7619 /* Return 1 if we need to save REGNO.  */
7620 static int
7621 ix86_save_reg (unsigned int regno, int maybe_eh_return)
7622 {
7623   if (pic_offset_table_rtx
7624       && regno == REAL_PIC_OFFSET_TABLE_REGNUM
7625       && (df_regs_ever_live_p (REAL_PIC_OFFSET_TABLE_REGNUM)
7626           || crtl->profile
7627           || crtl->calls_eh_return
7628           || crtl->uses_const_pool))
7629     {
7630       if (ix86_select_alt_pic_regnum () != INVALID_REGNUM)
7631         return 0;
7632       return 1;
7633     }
7634
7635   if (crtl->calls_eh_return && maybe_eh_return)
7636     {
7637       unsigned i;
7638       for (i = 0; ; i++)
7639         {
7640           unsigned test = EH_RETURN_DATA_REGNO (i);
7641           if (test == INVALID_REGNUM)
7642             break;
7643           if (test == regno)
7644             return 1;
7645         }
7646     }
7647
7648   if (crtl->drap_reg
7649       && regno == REGNO (crtl->drap_reg))
7650     return 1;
7651
7652   return (df_regs_ever_live_p (regno)
7653           && !call_used_regs[regno]
7654           && !fixed_regs[regno]
7655           && (regno != HARD_FRAME_POINTER_REGNUM || !frame_pointer_needed));
7656 }
7657
7658 /* Return number of saved general prupose registers.  */
7659
7660 static int
7661 ix86_nsaved_regs (void)
7662 {
7663   int nregs = 0;
7664   int regno;
7665
7666   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
7667     if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
7668       nregs ++;
7669   return nregs;
7670 }
7671
7672 /* Return number of saved SSE registrers.  */
7673
7674 static int
7675 ix86_nsaved_sseregs (void)
7676 {
7677   int nregs = 0;
7678   int regno;
7679
7680   if (ix86_cfun_abi () != MS_ABI)
7681     return 0;
7682   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
7683     if (SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
7684       nregs ++;
7685   return nregs;
7686 }
7687
7688 /* Given FROM and TO register numbers, say whether this elimination is
7689    allowed.  If stack alignment is needed, we can only replace argument
7690    pointer with hard frame pointer, or replace frame pointer with stack
7691    pointer.  Otherwise, frame pointer elimination is automatically
7692    handled and all other eliminations are valid.  */
7693
7694 int
7695 ix86_can_eliminate (int from, int to)
7696 {
7697   if (stack_realign_fp)
7698     return ((from == ARG_POINTER_REGNUM
7699              && to == HARD_FRAME_POINTER_REGNUM)
7700             || (from == FRAME_POINTER_REGNUM
7701                 && to == STACK_POINTER_REGNUM));
7702   else
7703     return to == STACK_POINTER_REGNUM ? !frame_pointer_needed : 1;
7704 }
7705
7706 /* Return the offset between two registers, one to be eliminated, and the other
7707    its replacement, at the start of a routine.  */
7708
7709 HOST_WIDE_INT
7710 ix86_initial_elimination_offset (int from, int to)
7711 {
7712   struct ix86_frame frame;
7713   ix86_compute_frame_layout (&frame);
7714
7715   if (from == ARG_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
7716     return frame.hard_frame_pointer_offset;
7717   else if (from == FRAME_POINTER_REGNUM
7718            && to == HARD_FRAME_POINTER_REGNUM)
7719     return frame.hard_frame_pointer_offset - frame.frame_pointer_offset;
7720   else
7721     {
7722       gcc_assert (to == STACK_POINTER_REGNUM);
7723
7724       if (from == ARG_POINTER_REGNUM)
7725         return frame.stack_pointer_offset;
7726
7727       gcc_assert (from == FRAME_POINTER_REGNUM);
7728       return frame.stack_pointer_offset - frame.frame_pointer_offset;
7729     }
7730 }
7731
7732 /* In a dynamically-aligned function, we can't know the offset from
7733    stack pointer to frame pointer, so we must ensure that setjmp
7734    eliminates fp against the hard fp (%ebp) rather than trying to
7735    index from %esp up to the top of the frame across a gap that is
7736    of unknown (at compile-time) size.  */
7737 static rtx
7738 ix86_builtin_setjmp_frame_value (void)
7739 {
7740   return stack_realign_fp ? hard_frame_pointer_rtx : virtual_stack_vars_rtx;
7741 }
7742
7743 /* Fill structure ix86_frame about frame of currently computed function.  */
7744
7745 static void
7746 ix86_compute_frame_layout (struct ix86_frame *frame)
7747 {
7748   HOST_WIDE_INT total_size;
7749   unsigned int stack_alignment_needed;
7750   HOST_WIDE_INT offset;
7751   unsigned int preferred_alignment;
7752   HOST_WIDE_INT size = get_frame_size ();
7753
7754   frame->nregs = ix86_nsaved_regs ();
7755   frame->nsseregs = ix86_nsaved_sseregs ();
7756   total_size = size;
7757
7758   stack_alignment_needed = crtl->stack_alignment_needed / BITS_PER_UNIT;
7759   preferred_alignment = crtl->preferred_stack_boundary / BITS_PER_UNIT;
7760
7761   /* MS ABI seem to require stack alignment to be always 16 except for function
7762      prologues.  */
7763   if (ix86_cfun_abi () == MS_ABI && preferred_alignment < 16)
7764     {
7765       preferred_alignment = 16;
7766       stack_alignment_needed = 16;
7767       crtl->preferred_stack_boundary = 128;
7768       crtl->stack_alignment_needed = 128;
7769     }
7770
7771   gcc_assert (!size || stack_alignment_needed);
7772   gcc_assert (preferred_alignment >= STACK_BOUNDARY / BITS_PER_UNIT);
7773   gcc_assert (preferred_alignment <= stack_alignment_needed);
7774
7775   /* During reload iteration the amount of registers saved can change.
7776      Recompute the value as needed.  Do not recompute when amount of registers
7777      didn't change as reload does multiple calls to the function and does not
7778      expect the decision to change within single iteration.  */
7779   if (!optimize_function_for_size_p (cfun)
7780       && cfun->machine->use_fast_prologue_epilogue_nregs != frame->nregs)
7781     {
7782       int count = frame->nregs;
7783
7784       cfun->machine->use_fast_prologue_epilogue_nregs = count;
7785       /* The fast prologue uses move instead of push to save registers.  This
7786          is significantly longer, but also executes faster as modern hardware
7787          can execute the moves in parallel, but can't do that for push/pop.
7788
7789          Be careful about choosing what prologue to emit:  When function takes
7790          many instructions to execute we may use slow version as well as in
7791          case function is known to be outside hot spot (this is known with
7792          feedback only).  Weight the size of function by number of registers
7793          to save as it is cheap to use one or two push instructions but very
7794          slow to use many of them.  */
7795       if (count)
7796         count = (count - 1) * FAST_PROLOGUE_INSN_COUNT;
7797       if (cfun->function_frequency < FUNCTION_FREQUENCY_NORMAL
7798           || (flag_branch_probabilities
7799               && cfun->function_frequency < FUNCTION_FREQUENCY_HOT))
7800         cfun->machine->use_fast_prologue_epilogue = false;
7801       else
7802         cfun->machine->use_fast_prologue_epilogue
7803            = !expensive_function_p (count);
7804     }
7805   if (TARGET_PROLOGUE_USING_MOVE
7806       && cfun->machine->use_fast_prologue_epilogue)
7807     frame->save_regs_using_mov = true;
7808   else
7809     frame->save_regs_using_mov = false;
7810
7811
7812   /* Skip return address and saved base pointer.  */
7813   offset = frame_pointer_needed ? UNITS_PER_WORD * 2 : UNITS_PER_WORD;
7814
7815   frame->hard_frame_pointer_offset = offset;
7816
7817   /* Set offset to aligned because the realigned frame starts from
7818      here.  */
7819   if (stack_realign_fp)
7820     offset = (offset + stack_alignment_needed -1) & -stack_alignment_needed;
7821
7822   /* Register save area */
7823   offset += frame->nregs * UNITS_PER_WORD;
7824
7825   /* Align SSE reg save area.  */
7826   if (frame->nsseregs)
7827     frame->padding0 = ((offset + 16 - 1) & -16) - offset;
7828   else
7829     frame->padding0 = 0;
7830   
7831   /* SSE register save area.  */
7832   offset += frame->padding0 + frame->nsseregs * 16;
7833
7834   /* Va-arg area */
7835   frame->va_arg_size = ix86_varargs_gpr_size + ix86_varargs_fpr_size;
7836   offset += frame->va_arg_size;
7837
7838   /* Align start of frame for local function.  */
7839   frame->padding1 = ((offset + stack_alignment_needed - 1)
7840                      & -stack_alignment_needed) - offset;
7841
7842   offset += frame->padding1;
7843
7844   /* Frame pointer points here.  */
7845   frame->frame_pointer_offset = offset;
7846
7847   offset += size;
7848
7849   /* Add outgoing arguments area.  Can be skipped if we eliminated
7850      all the function calls as dead code.
7851      Skipping is however impossible when function calls alloca.  Alloca
7852      expander assumes that last crtl->outgoing_args_size
7853      of stack frame are unused.  */
7854   if (ACCUMULATE_OUTGOING_ARGS
7855       && (!current_function_is_leaf || cfun->calls_alloca
7856           || ix86_current_function_calls_tls_descriptor))
7857     {
7858       offset += crtl->outgoing_args_size;
7859       frame->outgoing_arguments_size = crtl->outgoing_args_size;
7860     }
7861   else
7862     frame->outgoing_arguments_size = 0;
7863
7864   /* Align stack boundary.  Only needed if we're calling another function
7865      or using alloca.  */
7866   if (!current_function_is_leaf || cfun->calls_alloca
7867       || ix86_current_function_calls_tls_descriptor)
7868     frame->padding2 = ((offset + preferred_alignment - 1)
7869                        & -preferred_alignment) - offset;
7870   else
7871     frame->padding2 = 0;
7872
7873   offset += frame->padding2;
7874
7875   /* We've reached end of stack frame.  */
7876   frame->stack_pointer_offset = offset;
7877
7878   /* Size prologue needs to allocate.  */
7879   frame->to_allocate =
7880     (size + frame->padding1 + frame->padding2
7881      + frame->outgoing_arguments_size + frame->va_arg_size);
7882
7883   if ((!frame->to_allocate && frame->nregs <= 1)
7884       || (TARGET_64BIT && frame->to_allocate >= (HOST_WIDE_INT) 0x80000000))
7885     frame->save_regs_using_mov = false;
7886
7887   if (!TARGET_64BIT_MS_ABI && TARGET_RED_ZONE && current_function_sp_is_unchanging
7888       && current_function_is_leaf
7889       && !ix86_current_function_calls_tls_descriptor)
7890     {
7891       frame->red_zone_size = frame->to_allocate;
7892       if (frame->save_regs_using_mov)
7893         frame->red_zone_size += frame->nregs * UNITS_PER_WORD;
7894       if (frame->red_zone_size > RED_ZONE_SIZE - RED_ZONE_RESERVE)
7895         frame->red_zone_size = RED_ZONE_SIZE - RED_ZONE_RESERVE;
7896     }
7897   else
7898     frame->red_zone_size = 0;
7899   frame->to_allocate -= frame->red_zone_size;
7900   frame->stack_pointer_offset -= frame->red_zone_size;
7901 #if 0
7902   fprintf (stderr, "\n");
7903   fprintf (stderr, "size: %ld\n", (long)size);
7904   fprintf (stderr, "nregs: %ld\n", (long)frame->nregs);
7905   fprintf (stderr, "nsseregs: %ld\n", (long)frame->nsseregs);
7906   fprintf (stderr, "padding0: %ld\n", (long)frame->padding0);
7907   fprintf (stderr, "alignment1: %ld\n", (long)stack_alignment_needed);
7908   fprintf (stderr, "padding1: %ld\n", (long)frame->padding1);
7909   fprintf (stderr, "va_arg: %ld\n", (long)frame->va_arg_size);
7910   fprintf (stderr, "padding2: %ld\n", (long)frame->padding2);
7911   fprintf (stderr, "to_allocate: %ld\n", (long)frame->to_allocate);
7912   fprintf (stderr, "red_zone_size: %ld\n", (long)frame->red_zone_size);
7913   fprintf (stderr, "frame_pointer_offset: %ld\n", (long)frame->frame_pointer_offset);
7914   fprintf (stderr, "hard_frame_pointer_offset: %ld\n",
7915            (long)frame->hard_frame_pointer_offset);
7916   fprintf (stderr, "stack_pointer_offset: %ld\n", (long)frame->stack_pointer_offset);
7917   fprintf (stderr, "current_function_is_leaf: %ld\n", (long)current_function_is_leaf);
7918   fprintf (stderr, "cfun->calls_alloca: %ld\n", (long)cfun->calls_alloca);
7919   fprintf (stderr, "x86_current_function_calls_tls_descriptor: %ld\n", (long)ix86_current_function_calls_tls_descriptor);
7920 #endif
7921 }
7922
7923 /* Emit code to save registers in the prologue.  */
7924
7925 static void
7926 ix86_emit_save_regs (void)
7927 {
7928   unsigned int regno;
7929   rtx insn;
7930
7931   for (regno = FIRST_PSEUDO_REGISTER - 1; regno-- > 0; )
7932     if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
7933       {
7934         insn = emit_insn (gen_push (gen_rtx_REG (Pmode, regno)));
7935         RTX_FRAME_RELATED_P (insn) = 1;
7936       }
7937 }
7938
7939 /* Emit code to save registers using MOV insns.  First register
7940    is restored from POINTER + OFFSET.  */
7941 static void
7942 ix86_emit_save_regs_using_mov (rtx pointer, HOST_WIDE_INT offset)
7943 {
7944   unsigned int regno;
7945   rtx insn;
7946
7947   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
7948     if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
7949       {
7950         insn = emit_move_insn (adjust_address (gen_rtx_MEM (Pmode, pointer),
7951                                                Pmode, offset),
7952                                gen_rtx_REG (Pmode, regno));
7953         RTX_FRAME_RELATED_P (insn) = 1;
7954         offset += UNITS_PER_WORD;
7955       }
7956 }
7957
7958 /* Emit code to save registers using MOV insns.  First register
7959    is restored from POINTER + OFFSET.  */
7960 static void
7961 ix86_emit_save_sse_regs_using_mov (rtx pointer, HOST_WIDE_INT offset)
7962 {
7963   unsigned int regno;
7964   rtx insn;
7965   rtx mem;
7966
7967   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
7968     if (SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
7969       {
7970         mem = adjust_address (gen_rtx_MEM (TImode, pointer), TImode, offset);
7971         set_mem_align (mem, 128);
7972         insn = emit_move_insn (mem, gen_rtx_REG (TImode, regno));
7973         RTX_FRAME_RELATED_P (insn) = 1;
7974         offset += 16;
7975       }
7976 }
7977
7978 /* Expand prologue or epilogue stack adjustment.
7979    The pattern exist to put a dependency on all ebp-based memory accesses.
7980    STYLE should be negative if instructions should be marked as frame related,
7981    zero if %r11 register is live and cannot be freely used and positive
7982    otherwise.  */
7983
7984 static void
7985 pro_epilogue_adjust_stack (rtx dest, rtx src, rtx offset, int style)
7986 {
7987   rtx insn;
7988
7989   if (! TARGET_64BIT)
7990     insn = emit_insn (gen_pro_epilogue_adjust_stack_1 (dest, src, offset));
7991   else if (x86_64_immediate_operand (offset, DImode))
7992     insn = emit_insn (gen_pro_epilogue_adjust_stack_rex64 (dest, src, offset));
7993   else
7994     {
7995       rtx r11;
7996       /* r11 is used by indirect sibcall return as well, set before the
7997          epilogue and used after the epilogue.  ATM indirect sibcall
7998          shouldn't be used together with huge frame sizes in one
7999          function because of the frame_size check in sibcall.c.  */
8000       gcc_assert (style);
8001       r11 = gen_rtx_REG (DImode, R11_REG);
8002       insn = emit_insn (gen_rtx_SET (DImode, r11, offset));
8003       if (style < 0)
8004         RTX_FRAME_RELATED_P (insn) = 1;
8005       insn = emit_insn (gen_pro_epilogue_adjust_stack_rex64_2 (dest, src, r11,
8006                                                                offset));
8007     }
8008   if (style < 0)
8009     RTX_FRAME_RELATED_P (insn) = 1;
8010 }
8011
8012 /* Find an available register to be used as dynamic realign argument
8013    pointer regsiter.  Such a register will be written in prologue and
8014    used in begin of body, so it must not be
8015         1. parameter passing register.
8016         2. GOT pointer.
8017    We reuse static-chain register if it is available.  Otherwise, we
8018    use DI for i386 and R13 for x86-64.  We chose R13 since it has
8019    shorter encoding.
8020
8021    Return: the regno of chosen register.  */
8022
8023 static unsigned int 
8024 find_drap_reg (void)
8025 {
8026   tree decl = cfun->decl;
8027
8028   if (TARGET_64BIT)
8029     {
8030       /* Use R13 for nested function or function need static chain.
8031          Since function with tail call may use any caller-saved
8032          registers in epilogue, DRAP must not use caller-saved
8033          register in such case.  */
8034       if ((decl_function_context (decl)
8035            && !DECL_NO_STATIC_CHAIN (decl))
8036           || crtl->tail_call_emit)
8037         return R13_REG;
8038
8039       return R10_REG;
8040     }
8041   else
8042     {
8043       /* Use DI for nested function or function need static chain.
8044          Since function with tail call may use any caller-saved
8045          registers in epilogue, DRAP must not use caller-saved
8046          register in such case.  */
8047       if ((decl_function_context (decl)
8048            && !DECL_NO_STATIC_CHAIN (decl))
8049           || crtl->tail_call_emit)
8050         return DI_REG;
8051     
8052       /* Reuse static chain register if it isn't used for parameter
8053          passing.  */
8054       if (ix86_function_regparm (TREE_TYPE (decl), decl) <= 2
8055           && !lookup_attribute ("fastcall",
8056                                 TYPE_ATTRIBUTES (TREE_TYPE (decl))))
8057         return CX_REG;
8058       else
8059         return DI_REG;
8060     }
8061 }
8062
8063 /* Update incoming stack boundary and estimated stack alignment.  */
8064
8065 static void
8066 ix86_update_stack_boundary (void)
8067 {
8068   /* Prefer the one specified at command line. */
8069   ix86_incoming_stack_boundary 
8070     = (ix86_user_incoming_stack_boundary
8071        ? ix86_user_incoming_stack_boundary
8072        : ix86_default_incoming_stack_boundary);
8073
8074   /* Incoming stack alignment can be changed on individual functions
8075      via force_align_arg_pointer attribute.  We use the smallest
8076      incoming stack boundary.  */
8077   if (ix86_incoming_stack_boundary > MIN_STACK_BOUNDARY
8078       && lookup_attribute (ix86_force_align_arg_pointer_string,
8079                            TYPE_ATTRIBUTES (TREE_TYPE (current_function_decl))))
8080     ix86_incoming_stack_boundary = MIN_STACK_BOUNDARY;
8081
8082   /* The incoming stack frame has to be aligned at least at
8083      parm_stack_boundary.  */
8084   if (ix86_incoming_stack_boundary < crtl->parm_stack_boundary)
8085     ix86_incoming_stack_boundary = crtl->parm_stack_boundary;
8086
8087   /* Stack at entrance of main is aligned by runtime.  We use the
8088      smallest incoming stack boundary. */
8089   if (ix86_incoming_stack_boundary > MAIN_STACK_BOUNDARY
8090       && DECL_NAME (current_function_decl)
8091       && MAIN_NAME_P (DECL_NAME (current_function_decl))
8092       && DECL_FILE_SCOPE_P (current_function_decl))
8093     ix86_incoming_stack_boundary = MAIN_STACK_BOUNDARY;
8094
8095   /* x86_64 vararg needs 16byte stack alignment for register save
8096      area.  */
8097   if (TARGET_64BIT
8098       && cfun->stdarg
8099       && crtl->stack_alignment_estimated < 128)
8100     crtl->stack_alignment_estimated = 128;
8101 }
8102
8103 /* Handle the TARGET_GET_DRAP_RTX hook.  Return NULL if no DRAP is
8104    needed or an rtx for DRAP otherwise.  */
8105
8106 static rtx
8107 ix86_get_drap_rtx (void)
8108 {
8109   if (ix86_force_drap || !ACCUMULATE_OUTGOING_ARGS)
8110     crtl->need_drap = true;
8111
8112   if (stack_realign_drap)
8113     {
8114       /* Assign DRAP to vDRAP and returns vDRAP */
8115       unsigned int regno = find_drap_reg ();
8116       rtx drap_vreg;
8117       rtx arg_ptr;
8118       rtx seq, insn;
8119
8120       arg_ptr = gen_rtx_REG (Pmode, regno);
8121       crtl->drap_reg = arg_ptr;
8122
8123       start_sequence ();
8124       drap_vreg = copy_to_reg (arg_ptr);
8125       seq = get_insns ();
8126       end_sequence ();
8127       
8128       insn = emit_insn_before (seq, NEXT_INSN (entry_of_function ()));
8129       RTX_FRAME_RELATED_P (insn) = 1;
8130       return drap_vreg;
8131     }
8132   else
8133     return NULL;
8134 }
8135
8136 /* Handle the TARGET_INTERNAL_ARG_POINTER hook.  */
8137
8138 static rtx
8139 ix86_internal_arg_pointer (void)
8140 {
8141   return virtual_incoming_args_rtx;
8142 }
8143
8144 /* Handle the TARGET_DWARF_HANDLE_FRAME_UNSPEC hook.
8145    This is called from dwarf2out.c to emit call frame instructions
8146    for frame-related insns containing UNSPECs and UNSPEC_VOLATILEs. */
8147 static void
8148 ix86_dwarf_handle_frame_unspec (const char *label, rtx pattern, int index)
8149 {
8150   rtx unspec = SET_SRC (pattern);
8151   gcc_assert (GET_CODE (unspec) == UNSPEC);
8152
8153   switch (index)
8154     {
8155     case UNSPEC_REG_SAVE:
8156       dwarf2out_reg_save_reg (label, XVECEXP (unspec, 0, 0),
8157                               SET_DEST (pattern));
8158       break;
8159     case UNSPEC_DEF_CFA:
8160       dwarf2out_def_cfa (label, REGNO (SET_DEST (pattern)),
8161                          INTVAL (XVECEXP (unspec, 0, 0)));
8162       break;
8163     default:
8164       gcc_unreachable ();
8165     }
8166 }
8167
8168 /* Finalize stack_realign_needed flag, which will guide prologue/epilogue
8169    to be generated in correct form.  */
8170 static void 
8171 ix86_finalize_stack_realign_flags (void)
8172 {
8173   /* Check if stack realign is really needed after reload, and 
8174      stores result in cfun */
8175   unsigned int incoming_stack_boundary
8176     = (crtl->parm_stack_boundary > ix86_incoming_stack_boundary
8177        ? crtl->parm_stack_boundary : ix86_incoming_stack_boundary);
8178   unsigned int stack_realign = (incoming_stack_boundary
8179                                 < (current_function_is_leaf
8180                                    ? crtl->max_used_stack_slot_alignment
8181                                    : crtl->stack_alignment_needed));
8182
8183   if (crtl->stack_realign_finalized)
8184     {
8185       /* After stack_realign_needed is finalized, we can't no longer
8186          change it.  */
8187       gcc_assert (crtl->stack_realign_needed == stack_realign);
8188     }
8189   else
8190     {
8191       crtl->stack_realign_needed = stack_realign;
8192       crtl->stack_realign_finalized = true;
8193     }
8194 }
8195
8196 /* Expand the prologue into a bunch of separate insns.  */
8197
8198 void
8199 ix86_expand_prologue (void)
8200 {
8201   rtx insn;
8202   bool pic_reg_used;
8203   struct ix86_frame frame;
8204   HOST_WIDE_INT allocate;
8205
8206   ix86_finalize_stack_realign_flags ();
8207
8208   /* DRAP should not coexist with stack_realign_fp */
8209   gcc_assert (!(crtl->drap_reg && stack_realign_fp));
8210
8211   ix86_compute_frame_layout (&frame);
8212
8213   /* Emit prologue code to adjust stack alignment and setup DRAP, in case
8214      of DRAP is needed and stack realignment is really needed after reload */
8215   if (crtl->drap_reg && crtl->stack_realign_needed)
8216     {
8217       rtx x, y;
8218       int align_bytes = crtl->stack_alignment_needed / BITS_PER_UNIT;
8219       int param_ptr_offset = (call_used_regs[REGNO (crtl->drap_reg)]
8220                               ? 0 : UNITS_PER_WORD);
8221
8222       gcc_assert (stack_realign_drap);
8223
8224       /* Grab the argument pointer.  */
8225       x = plus_constant (stack_pointer_rtx, 
8226                          (UNITS_PER_WORD + param_ptr_offset));
8227       y = crtl->drap_reg;
8228
8229       /* Only need to push parameter pointer reg if it is caller
8230          saved reg */
8231       if (!call_used_regs[REGNO (crtl->drap_reg)])
8232         {
8233           /* Push arg pointer reg */
8234           insn = emit_insn (gen_push (y));
8235           RTX_FRAME_RELATED_P (insn) = 1;
8236         }
8237
8238       insn = emit_insn (gen_rtx_SET (VOIDmode, y, x));
8239       RTX_FRAME_RELATED_P (insn) = 1; 
8240
8241       /* Align the stack.  */
8242       insn = emit_insn ((*ix86_gen_andsp) (stack_pointer_rtx,
8243                                            stack_pointer_rtx,
8244                                            GEN_INT (-align_bytes)));
8245       RTX_FRAME_RELATED_P (insn) = 1;
8246
8247       /* Replicate the return address on the stack so that return
8248          address can be reached via (argp - 1) slot.  This is needed
8249          to implement macro RETURN_ADDR_RTX and intrinsic function
8250          expand_builtin_return_addr etc.  */
8251       x = crtl->drap_reg;
8252       x = gen_frame_mem (Pmode,
8253                          plus_constant (x, -UNITS_PER_WORD));
8254       insn = emit_insn (gen_push (x));
8255       RTX_FRAME_RELATED_P (insn) = 1;
8256     }
8257
8258   /* Note: AT&T enter does NOT have reversed args.  Enter is probably
8259      slower on all targets.  Also sdb doesn't like it.  */
8260
8261   if (frame_pointer_needed)
8262     {
8263       insn = emit_insn (gen_push (hard_frame_pointer_rtx));
8264       RTX_FRAME_RELATED_P (insn) = 1;
8265
8266       insn = emit_move_insn (hard_frame_pointer_rtx, stack_pointer_rtx);
8267       RTX_FRAME_RELATED_P (insn) = 1;
8268     }
8269
8270   if (stack_realign_fp)
8271     {
8272       int align_bytes = crtl->stack_alignment_needed / BITS_PER_UNIT;
8273       gcc_assert (align_bytes > MIN_STACK_BOUNDARY / BITS_PER_UNIT);
8274
8275       /* Align the stack.  */
8276       insn = emit_insn ((*ix86_gen_andsp) (stack_pointer_rtx,
8277                                            stack_pointer_rtx,
8278                                            GEN_INT (-align_bytes)));
8279       RTX_FRAME_RELATED_P (insn) = 1;
8280     }
8281
8282   allocate = frame.to_allocate + frame.nsseregs * 16 + frame.padding0;
8283
8284   if (!frame.save_regs_using_mov)
8285     ix86_emit_save_regs ();
8286   else
8287     allocate += frame.nregs * UNITS_PER_WORD;
8288
8289   /* When using red zone we may start register saving before allocating
8290      the stack frame saving one cycle of the prologue. However I will
8291      avoid doing this if I am going to have to probe the stack since
8292      at least on x86_64 the stack probe can turn into a call that clobbers
8293      a red zone location */
8294   if (!TARGET_64BIT_MS_ABI && TARGET_RED_ZONE && frame.save_regs_using_mov
8295       && (! TARGET_STACK_PROBE || allocate < CHECK_STACK_LIMIT))
8296     ix86_emit_save_regs_using_mov ((frame_pointer_needed
8297                                      && !crtl->stack_realign_needed) 
8298                                    ? hard_frame_pointer_rtx
8299                                    : stack_pointer_rtx,
8300                                    -frame.nregs * UNITS_PER_WORD);
8301
8302   if (allocate == 0)
8303     ;
8304   else if (! TARGET_STACK_PROBE || allocate < CHECK_STACK_LIMIT)
8305     pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
8306                                GEN_INT (-allocate), -1);
8307   else
8308     {
8309       /* Only valid for Win32.  */
8310       rtx eax = gen_rtx_REG (Pmode, AX_REG);
8311       bool eax_live;
8312       rtx t;
8313
8314       gcc_assert (!TARGET_64BIT || cfun->machine->call_abi == MS_ABI);
8315
8316       if (cfun->machine->call_abi == MS_ABI)
8317         eax_live = false;
8318       else
8319         eax_live = ix86_eax_live_at_start_p ();
8320
8321       if (eax_live)
8322         {
8323           emit_insn (gen_push (eax));
8324           allocate -= UNITS_PER_WORD;
8325         }
8326
8327       emit_move_insn (eax, GEN_INT (allocate));
8328
8329       if (TARGET_64BIT)
8330         insn = gen_allocate_stack_worker_64 (eax, eax);
8331       else
8332         insn = gen_allocate_stack_worker_32 (eax, eax);
8333       insn = emit_insn (insn);
8334       RTX_FRAME_RELATED_P (insn) = 1;
8335       t = gen_rtx_PLUS (Pmode, stack_pointer_rtx, GEN_INT (-allocate));
8336       t = gen_rtx_SET (VOIDmode, stack_pointer_rtx, t);
8337       add_reg_note (insn, REG_FRAME_RELATED_EXPR, t);
8338
8339       if (eax_live)
8340         {
8341           if (frame_pointer_needed)
8342             t = plus_constant (hard_frame_pointer_rtx,
8343                                allocate
8344                                - frame.to_allocate
8345                                - frame.nregs * UNITS_PER_WORD);
8346           else
8347             t = plus_constant (stack_pointer_rtx, allocate);
8348           emit_move_insn (eax, gen_rtx_MEM (Pmode, t));
8349         }
8350     }
8351
8352   if (frame.save_regs_using_mov
8353       && !(!TARGET_64BIT_MS_ABI && TARGET_RED_ZONE
8354          && (! TARGET_STACK_PROBE || allocate < CHECK_STACK_LIMIT)))
8355     {
8356       if (!frame_pointer_needed
8357           || !frame.to_allocate
8358           || crtl->stack_realign_needed)
8359         ix86_emit_save_regs_using_mov (stack_pointer_rtx,
8360                                        frame.to_allocate
8361                                        + frame.nsseregs * 16 + frame.padding0);
8362       else
8363         ix86_emit_save_regs_using_mov (hard_frame_pointer_rtx,
8364                                        -frame.nregs * UNITS_PER_WORD);
8365     }
8366   if (!frame_pointer_needed
8367       || !frame.to_allocate
8368       || crtl->stack_realign_needed)
8369     ix86_emit_save_sse_regs_using_mov (stack_pointer_rtx,
8370                                        frame.to_allocate);
8371   else
8372     ix86_emit_save_sse_regs_using_mov (hard_frame_pointer_rtx,
8373                                        - frame.nregs * UNITS_PER_WORD
8374                                        - frame.nsseregs * 16
8375                                        - frame.padding0);
8376
8377   pic_reg_used = false;
8378   if (pic_offset_table_rtx
8379       && (df_regs_ever_live_p (REAL_PIC_OFFSET_TABLE_REGNUM)
8380           || crtl->profile))
8381     {
8382       unsigned int alt_pic_reg_used = ix86_select_alt_pic_regnum ();
8383
8384       if (alt_pic_reg_used != INVALID_REGNUM)
8385         SET_REGNO (pic_offset_table_rtx, alt_pic_reg_used);
8386
8387       pic_reg_used = true;
8388     }
8389
8390   if (pic_reg_used)
8391     {
8392       if (TARGET_64BIT)
8393         {
8394           if (ix86_cmodel == CM_LARGE_PIC)
8395             {
8396               rtx tmp_reg = gen_rtx_REG (DImode, R11_REG);
8397               rtx label = gen_label_rtx ();
8398               emit_label (label);
8399               LABEL_PRESERVE_P (label) = 1;
8400               gcc_assert (REGNO (pic_offset_table_rtx) != REGNO (tmp_reg));
8401               insn = emit_insn (gen_set_rip_rex64 (pic_offset_table_rtx, label));
8402               insn = emit_insn (gen_set_got_offset_rex64 (tmp_reg, label));
8403               insn = emit_insn (gen_adddi3 (pic_offset_table_rtx,
8404                                             pic_offset_table_rtx, tmp_reg));
8405             }
8406           else
8407             insn = emit_insn (gen_set_got_rex64 (pic_offset_table_rtx));
8408         }
8409       else
8410         insn = emit_insn (gen_set_got (pic_offset_table_rtx));
8411     }
8412
8413   /* In the pic_reg_used case, make sure that the got load isn't deleted
8414      when mcount needs it.  Blockage to avoid call movement across mcount
8415      call is emitted in generic code after the NOTE_INSN_PROLOGUE_END
8416      note.  */
8417   if (crtl->profile && pic_reg_used)
8418     emit_insn (gen_prologue_use (pic_offset_table_rtx));
8419
8420   if (crtl->drap_reg && !crtl->stack_realign_needed)
8421     {
8422       /* vDRAP is setup but after reload it turns out stack realign
8423          isn't necessary, here we will emit prologue to setup DRAP
8424          without stack realign adjustment */
8425       int drap_bp_offset = UNITS_PER_WORD * 2;
8426       rtx x = plus_constant (hard_frame_pointer_rtx, drap_bp_offset);
8427       insn = emit_insn (gen_rtx_SET (VOIDmode, crtl->drap_reg, x));
8428     }
8429
8430   /* Prevent instructions from being scheduled into register save push
8431      sequence when access to the redzone area is done through frame pointer.
8432      The offset betweeh the frame pointer and the stack pointer is calculated
8433      relative to the value of the stack pointer at the end of the function
8434      prologue, and moving instructions that access redzone area via frame
8435      pointer inside push sequence violates this assumption.  */
8436   if (frame_pointer_needed && frame.red_zone_size)
8437     emit_insn (gen_memory_blockage ());
8438
8439   /* Emit cld instruction if stringops are used in the function.  */
8440   if (TARGET_CLD && ix86_current_function_needs_cld)
8441     emit_insn (gen_cld ());
8442 }
8443
8444 /* Emit code to restore saved registers using MOV insns.  First register
8445    is restored from POINTER + OFFSET.  */
8446 static void
8447 ix86_emit_restore_regs_using_mov (rtx pointer, HOST_WIDE_INT offset,
8448                                   int maybe_eh_return)
8449 {
8450   int regno;
8451   rtx base_address = gen_rtx_MEM (Pmode, pointer);
8452
8453   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
8454     if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, maybe_eh_return))
8455       {
8456         /* Ensure that adjust_address won't be forced to produce pointer
8457            out of range allowed by x86-64 instruction set.  */
8458         if (TARGET_64BIT && offset != trunc_int_for_mode (offset, SImode))
8459           {
8460             rtx r11;
8461
8462             r11 = gen_rtx_REG (DImode, R11_REG);
8463             emit_move_insn (r11, GEN_INT (offset));
8464             emit_insn (gen_adddi3 (r11, r11, pointer));
8465             base_address = gen_rtx_MEM (Pmode, r11);
8466             offset = 0;
8467           }
8468         emit_move_insn (gen_rtx_REG (Pmode, regno),
8469                         adjust_address (base_address, Pmode, offset));
8470         offset += UNITS_PER_WORD;
8471       }
8472 }
8473
8474 /* Emit code to restore saved registers using MOV insns.  First register
8475    is restored from POINTER + OFFSET.  */
8476 static void
8477 ix86_emit_restore_sse_regs_using_mov (rtx pointer, HOST_WIDE_INT offset,
8478                                       int maybe_eh_return)
8479 {
8480   int regno;
8481   rtx base_address = gen_rtx_MEM (TImode, pointer);
8482   rtx mem;
8483
8484   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
8485     if (SSE_REGNO_P (regno) && ix86_save_reg (regno, maybe_eh_return))
8486       {
8487         /* Ensure that adjust_address won't be forced to produce pointer
8488            out of range allowed by x86-64 instruction set.  */
8489         if (TARGET_64BIT && offset != trunc_int_for_mode (offset, SImode))
8490           {
8491             rtx r11;
8492
8493             r11 = gen_rtx_REG (DImode, R11_REG);
8494             emit_move_insn (r11, GEN_INT (offset));
8495             emit_insn (gen_adddi3 (r11, r11, pointer));
8496             base_address = gen_rtx_MEM (TImode, r11);
8497             offset = 0;
8498           }
8499         mem = adjust_address (base_address, TImode, offset);
8500         set_mem_align (mem, 128);
8501         emit_move_insn (gen_rtx_REG (TImode, regno), mem);
8502         offset += 16;
8503       }
8504 }
8505
8506 /* Restore function stack, frame, and registers.  */
8507
8508 void
8509 ix86_expand_epilogue (int style)
8510 {
8511   int regno;
8512   int sp_valid;
8513   struct ix86_frame frame;
8514   HOST_WIDE_INT offset;
8515
8516   ix86_finalize_stack_realign_flags ();
8517
8518  /* When stack is realigned, SP must be valid.  */
8519   sp_valid = (!frame_pointer_needed
8520               || current_function_sp_is_unchanging
8521               || stack_realign_fp);
8522
8523   ix86_compute_frame_layout (&frame);
8524
8525   /* See the comment about red zone and frame
8526      pointer usage in ix86_expand_prologue.  */
8527   if (frame_pointer_needed && frame.red_zone_size)
8528     emit_insn (gen_memory_blockage ()); 
8529
8530   /* Calculate start of saved registers relative to ebp.  Special care
8531      must be taken for the normal return case of a function using
8532      eh_return: the eax and edx registers are marked as saved, but not
8533      restored along this path.  */
8534   offset = frame.nregs;
8535   if (crtl->calls_eh_return && style != 2)
8536     offset -= 2;
8537   offset *= -UNITS_PER_WORD;
8538   offset -= frame.nsseregs * 16 + frame.padding0;
8539
8540   /* If we're only restoring one register and sp is not valid then
8541      using a move instruction to restore the register since it's
8542      less work than reloading sp and popping the register.
8543
8544      The default code result in stack adjustment using add/lea instruction,
8545      while this code results in LEAVE instruction (or discrete equivalent),
8546      so it is profitable in some other cases as well.  Especially when there
8547      are no registers to restore.  We also use this code when TARGET_USE_LEAVE
8548      and there is exactly one register to pop. This heuristic may need some
8549      tuning in future.  */
8550   if ((!sp_valid && (frame.nregs + frame.nsseregs) <= 1)
8551       || (TARGET_EPILOGUE_USING_MOVE
8552           && cfun->machine->use_fast_prologue_epilogue
8553           && ((frame.nregs + frame.nsseregs) > 1 || frame.to_allocate))
8554       || (frame_pointer_needed && !(frame.nregs + frame.nsseregs) && frame.to_allocate)
8555       || (frame_pointer_needed && TARGET_USE_LEAVE
8556           && cfun->machine->use_fast_prologue_epilogue
8557           && (frame.nregs + frame.nsseregs) == 1)
8558       || crtl->calls_eh_return)
8559     {
8560       /* Restore registers.  We can use ebp or esp to address the memory
8561          locations.  If both are available, default to ebp, since offsets
8562          are known to be small.  Only exception is esp pointing directly
8563          to the end of block of saved registers, where we may simplify
8564          addressing mode.  
8565
8566          If we are realigning stack with bp and sp, regs restore can't
8567          be addressed by bp. sp must be used instead.  */
8568
8569       if (!frame_pointer_needed
8570           || (sp_valid && !frame.to_allocate) 
8571           || stack_realign_fp)
8572         {
8573           ix86_emit_restore_sse_regs_using_mov (stack_pointer_rtx,
8574                                                 frame.to_allocate, style == 2);
8575           ix86_emit_restore_regs_using_mov (stack_pointer_rtx,
8576                                             frame.to_allocate
8577                                             + frame.nsseregs * 16
8578                                             + frame.padding0, style == 2);
8579         }
8580       else
8581         {
8582           ix86_emit_restore_sse_regs_using_mov (hard_frame_pointer_rtx,
8583                                                 offset, style == 2);
8584           ix86_emit_restore_regs_using_mov (hard_frame_pointer_rtx,
8585                                             offset
8586                                             + frame.nsseregs * 16
8587                                             + frame.padding0, style == 2);
8588         }
8589
8590       /* eh_return epilogues need %ecx added to the stack pointer.  */
8591       if (style == 2)
8592         {
8593           rtx tmp, sa = EH_RETURN_STACKADJ_RTX;
8594
8595           /* Stack align doesn't work with eh_return.  */
8596           gcc_assert (!crtl->stack_realign_needed);
8597
8598           if (frame_pointer_needed)
8599             {
8600               tmp = gen_rtx_PLUS (Pmode, hard_frame_pointer_rtx, sa);
8601               tmp = plus_constant (tmp, UNITS_PER_WORD);
8602               emit_insn (gen_rtx_SET (VOIDmode, sa, tmp));
8603
8604               tmp = gen_rtx_MEM (Pmode, hard_frame_pointer_rtx);
8605               emit_move_insn (hard_frame_pointer_rtx, tmp);
8606
8607               pro_epilogue_adjust_stack (stack_pointer_rtx, sa,
8608                                          const0_rtx, style);
8609             }
8610           else
8611             {
8612               tmp = gen_rtx_PLUS (Pmode, stack_pointer_rtx, sa);
8613               tmp = plus_constant (tmp, (frame.to_allocate
8614                                          + frame.nregs * UNITS_PER_WORD
8615                                          + frame.nsseregs * 16
8616                                          + frame.padding0));
8617               emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx, tmp));
8618             }
8619         }
8620       else if (!frame_pointer_needed)
8621         pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
8622                                    GEN_INT (frame.to_allocate
8623                                             + frame.nregs * UNITS_PER_WORD
8624                                             + frame.nsseregs * 16
8625                                             + frame.padding0),
8626                                    style);
8627       /* If not an i386, mov & pop is faster than "leave".  */
8628       else if (TARGET_USE_LEAVE || optimize_function_for_size_p (cfun)
8629                || !cfun->machine->use_fast_prologue_epilogue)
8630         emit_insn ((*ix86_gen_leave) ());
8631       else
8632         {
8633           pro_epilogue_adjust_stack (stack_pointer_rtx,
8634                                      hard_frame_pointer_rtx,
8635                                      const0_rtx, style);
8636
8637           emit_insn ((*ix86_gen_pop1) (hard_frame_pointer_rtx));
8638         }
8639     }
8640   else
8641     {
8642       /* First step is to deallocate the stack frame so that we can
8643          pop the registers.
8644
8645          If we realign stack with frame pointer, then stack pointer
8646          won't be able to recover via lea $offset(%bp), %sp, because
8647          there is a padding area between bp and sp for realign. 
8648          "add $to_allocate, %sp" must be used instead.  */
8649       if (!sp_valid)
8650         {
8651           gcc_assert (frame_pointer_needed);
8652           gcc_assert (!stack_realign_fp);
8653           pro_epilogue_adjust_stack (stack_pointer_rtx,
8654                                      hard_frame_pointer_rtx,
8655                                      GEN_INT (offset), style);
8656           ix86_emit_restore_sse_regs_using_mov (stack_pointer_rtx,
8657                                                 frame.to_allocate, style == 2);
8658           pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
8659                                      GEN_INT (frame.nsseregs * 16), style);
8660         }
8661       else if (frame.to_allocate || frame.nsseregs)
8662         {
8663           ix86_emit_restore_sse_regs_using_mov (stack_pointer_rtx,
8664                                                 frame.to_allocate,
8665                                                 style == 2);
8666           pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
8667                                      GEN_INT (frame.to_allocate
8668                                               + frame.nsseregs * 16
8669                                               + frame.padding0), style);
8670         }
8671
8672       for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
8673         if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, false))
8674           emit_insn ((*ix86_gen_pop1) (gen_rtx_REG (Pmode, regno)));
8675       if (frame_pointer_needed)
8676         {
8677           /* Leave results in shorter dependency chains on CPUs that are
8678              able to grok it fast.  */
8679           if (TARGET_USE_LEAVE)
8680             emit_insn ((*ix86_gen_leave) ());
8681           else
8682             {
8683               /* For stack realigned really happens, recover stack 
8684                  pointer to hard frame pointer is a must, if not using 
8685                  leave.  */
8686               if (stack_realign_fp)
8687                 pro_epilogue_adjust_stack (stack_pointer_rtx,
8688                                            hard_frame_pointer_rtx,
8689                                            const0_rtx, style);
8690               emit_insn ((*ix86_gen_pop1) (hard_frame_pointer_rtx));
8691             }
8692         }
8693     }
8694
8695   if (crtl->drap_reg && crtl->stack_realign_needed)
8696     {
8697       int param_ptr_offset = (call_used_regs[REGNO (crtl->drap_reg)]
8698                               ? 0 : UNITS_PER_WORD);
8699       gcc_assert (stack_realign_drap);
8700       emit_insn ((*ix86_gen_add3) (stack_pointer_rtx,
8701                                    crtl->drap_reg,
8702                                    GEN_INT (-(UNITS_PER_WORD
8703                                               + param_ptr_offset))));
8704       if (!call_used_regs[REGNO (crtl->drap_reg)])
8705         emit_insn ((*ix86_gen_pop1) (crtl->drap_reg));
8706       
8707     }
8708
8709   /* Sibcall epilogues don't want a return instruction.  */
8710   if (style == 0)
8711     return;
8712
8713   if (crtl->args.pops_args && crtl->args.size)
8714     {
8715       rtx popc = GEN_INT (crtl->args.pops_args);
8716
8717       /* i386 can only pop 64K bytes.  If asked to pop more, pop
8718          return address, do explicit add, and jump indirectly to the
8719          caller.  */
8720
8721       if (crtl->args.pops_args >= 65536)
8722         {
8723           rtx ecx = gen_rtx_REG (SImode, CX_REG);
8724
8725           /* There is no "pascal" calling convention in any 64bit ABI.  */
8726           gcc_assert (!TARGET_64BIT);
8727
8728           emit_insn (gen_popsi1 (ecx));
8729           emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx, popc));
8730           emit_jump_insn (gen_return_indirect_internal (ecx));
8731         }
8732       else
8733         emit_jump_insn (gen_return_pop_internal (popc));
8734     }
8735   else
8736     emit_jump_insn (gen_return_internal ());
8737 }
8738
8739 /* Reset from the function's potential modifications.  */
8740
8741 static void
8742 ix86_output_function_epilogue (FILE *file ATTRIBUTE_UNUSED,
8743                                HOST_WIDE_INT size ATTRIBUTE_UNUSED)
8744 {
8745   if (pic_offset_table_rtx)
8746     SET_REGNO (pic_offset_table_rtx, REAL_PIC_OFFSET_TABLE_REGNUM);
8747 #if TARGET_MACHO
8748   /* Mach-O doesn't support labels at the end of objects, so if
8749      it looks like we might want one, insert a NOP.  */
8750   {
8751     rtx insn = get_last_insn ();
8752     while (insn
8753            && NOTE_P (insn)
8754            && NOTE_KIND (insn) != NOTE_INSN_DELETED_LABEL)
8755       insn = PREV_INSN (insn);
8756     if (insn
8757         && (LABEL_P (insn)
8758             || (NOTE_P (insn)
8759                 && NOTE_KIND (insn) == NOTE_INSN_DELETED_LABEL)))
8760       fputs ("\tnop\n", file);
8761   }
8762 #endif
8763
8764 }
8765 \f
8766 /* Extract the parts of an RTL expression that is a valid memory address
8767    for an instruction.  Return 0 if the structure of the address is
8768    grossly off.  Return -1 if the address contains ASHIFT, so it is not
8769    strictly valid, but still used for computing length of lea instruction.  */
8770
8771 int
8772 ix86_decompose_address (rtx addr, struct ix86_address *out)
8773 {
8774   rtx base = NULL_RTX, index = NULL_RTX, disp = NULL_RTX;
8775   rtx base_reg, index_reg;
8776   HOST_WIDE_INT scale = 1;
8777   rtx scale_rtx = NULL_RTX;
8778   int retval = 1;
8779   enum ix86_address_seg seg = SEG_DEFAULT;
8780
8781   if (REG_P (addr) || GET_CODE (addr) == SUBREG)
8782     base = addr;
8783   else if (GET_CODE (addr) == PLUS)
8784     {
8785       rtx addends[4], op;
8786       int n = 0, i;
8787
8788       op = addr;
8789       do
8790         {
8791           if (n >= 4)
8792             return 0;
8793           addends[n++] = XEXP (op, 1);
8794           op = XEXP (op, 0);
8795         }
8796       while (GET_CODE (op) == PLUS);
8797       if (n >= 4)
8798         return 0;
8799       addends[n] = op;
8800
8801       for (i = n; i >= 0; --i)
8802         {
8803           op = addends[i];
8804           switch (GET_CODE (op))
8805             {
8806             case MULT:
8807               if (index)
8808                 return 0;
8809               index = XEXP (op, 0);
8810               scale_rtx = XEXP (op, 1);
8811               break;
8812
8813             case UNSPEC:
8814               if (XINT (op, 1) == UNSPEC_TP
8815                   && TARGET_TLS_DIRECT_SEG_REFS
8816                   && seg == SEG_DEFAULT)
8817                 seg = TARGET_64BIT ? SEG_FS : SEG_GS;
8818               else
8819                 return 0;
8820               break;
8821
8822             case REG:
8823             case SUBREG:
8824               if (!base)
8825                 base = op;
8826               else if (!index)
8827                 index = op;
8828               else
8829                 return 0;
8830               break;
8831
8832             case CONST:
8833             case CONST_INT:
8834             case SYMBOL_REF:
8835             case LABEL_REF:
8836               if (disp)
8837                 return 0;
8838               disp = op;
8839               break;
8840
8841             default:
8842               return 0;
8843             }
8844         }
8845     }
8846   else if (GET_CODE (addr) == MULT)
8847     {
8848       index = XEXP (addr, 0);           /* index*scale */
8849       scale_rtx = XEXP (addr, 1);
8850     }
8851   else if (GET_CODE (addr) == ASHIFT)
8852     {
8853       rtx tmp;
8854
8855       /* We're called for lea too, which implements ashift on occasion.  */
8856       index = XEXP (addr, 0);
8857       tmp = XEXP (addr, 1);
8858       if (!CONST_INT_P (tmp))
8859         return 0;
8860       scale = INTVAL (tmp);
8861       if ((unsigned HOST_WIDE_INT) scale > 3)
8862         return 0;
8863       scale = 1 << scale;
8864       retval = -1;
8865     }
8866   else
8867     disp = addr;                        /* displacement */
8868
8869   /* Extract the integral value of scale.  */
8870   if (scale_rtx)
8871     {
8872       if (!CONST_INT_P (scale_rtx))
8873         return 0;
8874       scale = INTVAL (scale_rtx);
8875     }
8876
8877   base_reg = base && GET_CODE (base) == SUBREG ? SUBREG_REG (base) : base;
8878   index_reg = index && GET_CODE (index) == SUBREG ? SUBREG_REG (index) : index;
8879
8880   /* Allow arg pointer and stack pointer as index if there is not scaling.  */
8881   if (base_reg && index_reg && scale == 1
8882       && (index_reg == arg_pointer_rtx
8883           || index_reg == frame_pointer_rtx
8884           || (REG_P (index_reg) && REGNO (index_reg) == STACK_POINTER_REGNUM)))
8885     {
8886       rtx tmp;
8887       tmp = base, base = index, index = tmp;
8888       tmp = base_reg, base_reg = index_reg, index_reg = tmp;
8889     }
8890
8891   /* Special case: %ebp cannot be encoded as a base without a displacement.  */
8892   if ((base_reg == hard_frame_pointer_rtx
8893        || base_reg == frame_pointer_rtx
8894        || base_reg == arg_pointer_rtx) && !disp)
8895     disp = const0_rtx;
8896
8897   /* Special case: on K6, [%esi] makes the instruction vector decoded.
8898      Avoid this by transforming to [%esi+0].
8899      Reload calls address legitimization without cfun defined, so we need
8900      to test cfun for being non-NULL. */
8901   if (TARGET_K6 && cfun && optimize_function_for_speed_p (cfun)
8902       && base_reg && !index_reg && !disp
8903       && REG_P (base_reg)
8904       && REGNO_REG_CLASS (REGNO (base_reg)) == SIREG)
8905     disp = const0_rtx;
8906
8907   /* Special case: encode reg+reg instead of reg*2.  */
8908   if (!base && index && scale && scale == 2)
8909     base = index, base_reg = index_reg, scale = 1;
8910
8911   /* Special case: scaling cannot be encoded without base or displacement.  */
8912   if (!base && !disp && index && scale != 1)
8913     disp = const0_rtx;
8914
8915   out->base = base;
8916   out->index = index;
8917   out->disp = disp;
8918   out->scale = scale;
8919   out->seg = seg;
8920
8921   return retval;
8922 }
8923 \f
8924 /* Return cost of the memory address x.
8925    For i386, it is better to use a complex address than let gcc copy
8926    the address into a reg and make a new pseudo.  But not if the address
8927    requires to two regs - that would mean more pseudos with longer
8928    lifetimes.  */
8929 static int
8930 ix86_address_cost (rtx x, bool speed ATTRIBUTE_UNUSED)
8931 {
8932   struct ix86_address parts;
8933   int cost = 1;
8934   int ok = ix86_decompose_address (x, &parts);
8935
8936   gcc_assert (ok);
8937
8938   if (parts.base && GET_CODE (parts.base) == SUBREG)
8939     parts.base = SUBREG_REG (parts.base);
8940   if (parts.index && GET_CODE (parts.index) == SUBREG)
8941     parts.index = SUBREG_REG (parts.index);
8942
8943   /* Attempt to minimize number of registers in the address.  */
8944   if ((parts.base
8945        && (!REG_P (parts.base) || REGNO (parts.base) >= FIRST_PSEUDO_REGISTER))
8946       || (parts.index
8947           && (!REG_P (parts.index)
8948               || REGNO (parts.index) >= FIRST_PSEUDO_REGISTER)))
8949     cost++;
8950
8951   if (parts.base
8952       && (!REG_P (parts.base) || REGNO (parts.base) >= FIRST_PSEUDO_REGISTER)
8953       && parts.index
8954       && (!REG_P (parts.index) || REGNO (parts.index) >= FIRST_PSEUDO_REGISTER)
8955       && parts.base != parts.index)
8956     cost++;
8957
8958   /* AMD-K6 don't like addresses with ModR/M set to 00_xxx_100b,
8959      since it's predecode logic can't detect the length of instructions
8960      and it degenerates to vector decoded.  Increase cost of such
8961      addresses here.  The penalty is minimally 2 cycles.  It may be worthwhile
8962      to split such addresses or even refuse such addresses at all.
8963
8964      Following addressing modes are affected:
8965       [base+scale*index]
8966       [scale*index+disp]
8967       [base+index]
8968
8969      The first and last case  may be avoidable by explicitly coding the zero in
8970      memory address, but I don't have AMD-K6 machine handy to check this
8971      theory.  */
8972
8973   if (TARGET_K6
8974       && ((!parts.disp && parts.base && parts.index && parts.scale != 1)
8975           || (parts.disp && !parts.base && parts.index && parts.scale != 1)
8976           || (!parts.disp && parts.base && parts.index && parts.scale == 1)))
8977     cost += 10;
8978
8979   return cost;
8980 }
8981 \f
8982 /* Allow {LABEL | SYMBOL}_REF - SYMBOL_REF-FOR-PICBASE for Mach-O as
8983    this is used for to form addresses to local data when -fPIC is in
8984    use.  */
8985
8986 static bool
8987 darwin_local_data_pic (rtx disp)
8988 {
8989   return (GET_CODE (disp) == UNSPEC
8990           && XINT (disp, 1) == UNSPEC_MACHOPIC_OFFSET);
8991 }
8992
8993 /* Determine if a given RTX is a valid constant.  We already know this
8994    satisfies CONSTANT_P.  */
8995
8996 bool
8997 legitimate_constant_p (rtx x)
8998 {
8999   switch (GET_CODE (x))
9000     {
9001     case CONST:
9002       x = XEXP (x, 0);
9003
9004       if (GET_CODE (x) == PLUS)
9005         {
9006           if (!CONST_INT_P (XEXP (x, 1)))
9007             return false;
9008           x = XEXP (x, 0);
9009         }
9010
9011       if (TARGET_MACHO && darwin_local_data_pic (x))
9012         return true;
9013
9014       /* Only some unspecs are valid as "constants".  */
9015       if (GET_CODE (x) == UNSPEC)
9016         switch (XINT (x, 1))
9017           {
9018           case UNSPEC_GOT:
9019           case UNSPEC_GOTOFF:
9020           case UNSPEC_PLTOFF:
9021             return TARGET_64BIT;
9022           case UNSPEC_TPOFF:
9023           case UNSPEC_NTPOFF:
9024             x = XVECEXP (x, 0, 0);
9025             return (GET_CODE (x) == SYMBOL_REF
9026                     && SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_EXEC);
9027           case UNSPEC_DTPOFF:
9028             x = XVECEXP (x, 0, 0);
9029             return (GET_CODE (x) == SYMBOL_REF
9030                     && SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_DYNAMIC);
9031           default:
9032             return false;
9033           }
9034
9035       /* We must have drilled down to a symbol.  */
9036       if (GET_CODE (x) == LABEL_REF)
9037         return true;
9038       if (GET_CODE (x) != SYMBOL_REF)
9039         return false;
9040       /* FALLTHRU */
9041
9042     case SYMBOL_REF:
9043       /* TLS symbols are never valid.  */
9044       if (SYMBOL_REF_TLS_MODEL (x))
9045         return false;
9046
9047       /* DLLIMPORT symbols are never valid.  */
9048       if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
9049           && SYMBOL_REF_DLLIMPORT_P (x))
9050         return false;
9051       break;
9052
9053     case CONST_DOUBLE:
9054       if (GET_MODE (x) == TImode
9055           && x != CONST0_RTX (TImode)
9056           && !TARGET_64BIT)
9057         return false;
9058       break;
9059
9060     case CONST_VECTOR:
9061       if (!standard_sse_constant_p (x))
9062         return false;
9063
9064     default:
9065       break;
9066     }
9067
9068   /* Otherwise we handle everything else in the move patterns.  */
9069   return true;
9070 }
9071
9072 /* Determine if it's legal to put X into the constant pool.  This
9073    is not possible for the address of thread-local symbols, which
9074    is checked above.  */
9075
9076 static bool
9077 ix86_cannot_force_const_mem (rtx x)
9078 {
9079   /* We can always put integral constants and vectors in memory.  */
9080   switch (GET_CODE (x))
9081     {
9082     case CONST_INT:
9083     case CONST_DOUBLE:
9084     case CONST_VECTOR:
9085       return false;
9086
9087     default:
9088       break;
9089     }
9090   return !legitimate_constant_p (x);
9091 }
9092
9093
9094 /* Nonzero if the constant value X is a legitimate general operand
9095    when generating PIC code.  It is given that flag_pic is on and
9096    that X satisfies CONSTANT_P or is a CONST_DOUBLE.  */
9097
9098 bool
9099 legitimate_pic_operand_p (rtx x)
9100 {
9101   rtx inner;
9102
9103   switch (GET_CODE (x))
9104     {
9105     case CONST:
9106       inner = XEXP (x, 0);
9107       if (GET_CODE (inner) == PLUS
9108           && CONST_INT_P (XEXP (inner, 1)))
9109         inner = XEXP (inner, 0);
9110
9111       /* Only some unspecs are valid as "constants".  */
9112       if (GET_CODE (inner) == UNSPEC)
9113         switch (XINT (inner, 1))
9114           {
9115           case UNSPEC_GOT:
9116           case UNSPEC_GOTOFF:
9117           case UNSPEC_PLTOFF:
9118             return TARGET_64BIT;
9119           case UNSPEC_TPOFF:
9120             x = XVECEXP (inner, 0, 0);
9121             return (GET_CODE (x) == SYMBOL_REF
9122                     && SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_EXEC);
9123           case UNSPEC_MACHOPIC_OFFSET:
9124             return legitimate_pic_address_disp_p (x);
9125           default:
9126             return false;
9127           }
9128       /* FALLTHRU */
9129
9130     case SYMBOL_REF:
9131     case LABEL_REF:
9132       return legitimate_pic_address_disp_p (x);
9133
9134     default:
9135       return true;
9136     }
9137 }
9138
9139 /* Determine if a given CONST RTX is a valid memory displacement
9140    in PIC mode.  */
9141
9142 int
9143 legitimate_pic_address_disp_p (rtx disp)
9144 {
9145   bool saw_plus;
9146
9147   /* In 64bit mode we can allow direct addresses of symbols and labels
9148      when they are not dynamic symbols.  */
9149   if (TARGET_64BIT)
9150     {
9151       rtx op0 = disp, op1;
9152
9153       switch (GET_CODE (disp))
9154         {
9155         case LABEL_REF:
9156           return true;
9157
9158         case CONST:
9159           if (GET_CODE (XEXP (disp, 0)) != PLUS)
9160             break;
9161           op0 = XEXP (XEXP (disp, 0), 0);
9162           op1 = XEXP (XEXP (disp, 0), 1);
9163           if (!CONST_INT_P (op1)
9164               || INTVAL (op1) >= 16*1024*1024
9165               || INTVAL (op1) < -16*1024*1024)
9166             break;
9167           if (GET_CODE (op0) == LABEL_REF)
9168             return true;
9169           if (GET_CODE (op0) != SYMBOL_REF)
9170             break;
9171           /* FALLTHRU */
9172
9173         case SYMBOL_REF:
9174           /* TLS references should always be enclosed in UNSPEC.  */
9175           if (SYMBOL_REF_TLS_MODEL (op0))
9176             return false;
9177           if (!SYMBOL_REF_FAR_ADDR_P (op0) && SYMBOL_REF_LOCAL_P (op0)
9178               && ix86_cmodel != CM_LARGE_PIC)
9179             return true;
9180           break;
9181
9182         default:
9183           break;
9184         }
9185     }
9186   if (GET_CODE (disp) != CONST)
9187     return 0;
9188   disp = XEXP (disp, 0);
9189
9190   if (TARGET_64BIT)
9191     {
9192       /* We are unsafe to allow PLUS expressions.  This limit allowed distance
9193          of GOT tables.  We should not need these anyway.  */
9194       if (GET_CODE (disp) != UNSPEC
9195           || (XINT (disp, 1) != UNSPEC_GOTPCREL
9196               && XINT (disp, 1) != UNSPEC_GOTOFF
9197               && XINT (disp, 1) != UNSPEC_PLTOFF))
9198         return 0;
9199
9200       if (GET_CODE (XVECEXP (disp, 0, 0)) != SYMBOL_REF
9201           && GET_CODE (XVECEXP (disp, 0, 0)) != LABEL_REF)
9202         return 0;
9203       return 1;
9204     }
9205
9206   saw_plus = false;
9207   if (GET_CODE (disp) == PLUS)
9208     {
9209       if (!CONST_INT_P (XEXP (disp, 1)))
9210         return 0;
9211       disp = XEXP (disp, 0);
9212       saw_plus = true;
9213     }
9214
9215   if (TARGET_MACHO && darwin_local_data_pic (disp))
9216     return 1;
9217
9218   if (GET_CODE (disp) != UNSPEC)
9219     return 0;
9220
9221   switch (XINT (disp, 1))
9222     {
9223     case UNSPEC_GOT:
9224       if (saw_plus)
9225         return false;
9226       /* We need to check for both symbols and labels because VxWorks loads
9227          text labels with @GOT rather than @GOTOFF.  See gotoff_operand for
9228          details.  */
9229       return (GET_CODE (XVECEXP (disp, 0, 0)) == SYMBOL_REF
9230               || GET_CODE (XVECEXP (disp, 0, 0)) == LABEL_REF);
9231     case UNSPEC_GOTOFF:
9232       /* Refuse GOTOFF in 64bit mode since it is always 64bit when used.
9233          While ABI specify also 32bit relocation but we don't produce it in
9234          small PIC model at all.  */
9235       if ((GET_CODE (XVECEXP (disp, 0, 0)) == SYMBOL_REF
9236            || GET_CODE (XVECEXP (disp, 0, 0)) == LABEL_REF)
9237           && !TARGET_64BIT)
9238         return gotoff_operand (XVECEXP (disp, 0, 0), Pmode);
9239       return false;
9240     case UNSPEC_GOTTPOFF:
9241     case UNSPEC_GOTNTPOFF:
9242     case UNSPEC_INDNTPOFF:
9243       if (saw_plus)
9244         return false;
9245       disp = XVECEXP (disp, 0, 0);
9246       return (GET_CODE (disp) == SYMBOL_REF
9247               && SYMBOL_REF_TLS_MODEL (disp) == TLS_MODEL_INITIAL_EXEC);
9248     case UNSPEC_NTPOFF:
9249       disp = XVECEXP (disp, 0, 0);
9250       return (GET_CODE (disp) == SYMBOL_REF
9251               && SYMBOL_REF_TLS_MODEL (disp) == TLS_MODEL_LOCAL_EXEC);
9252     case UNSPEC_DTPOFF:
9253       disp = XVECEXP (disp, 0, 0);
9254       return (GET_CODE (disp) == SYMBOL_REF
9255               && SYMBOL_REF_TLS_MODEL (disp) == TLS_MODEL_LOCAL_DYNAMIC);
9256     }
9257
9258   return 0;
9259 }
9260
9261 /* Recognizes RTL expressions that are valid memory addresses for an
9262    instruction.  The MODE argument is the machine mode for the MEM
9263    expression that wants to use this address.
9264
9265    It only recognizes address in canonical form.  LEGITIMIZE_ADDRESS should
9266    convert common non-canonical forms to canonical form so that they will
9267    be recognized.  */
9268
9269 static bool
9270 ix86_legitimate_address_p (enum machine_mode mode ATTRIBUTE_UNUSED,
9271                            rtx addr, bool strict)
9272 {
9273   struct ix86_address parts;
9274   rtx base, index, disp;
9275   HOST_WIDE_INT scale;
9276   const char *reason = NULL;
9277   rtx reason_rtx = NULL_RTX;
9278
9279   if (ix86_decompose_address (addr, &parts) <= 0)
9280     {
9281       reason = "decomposition failed";
9282       goto report_error;
9283     }
9284
9285   base = parts.base;
9286   index = parts.index;
9287   disp = parts.disp;
9288   scale = parts.scale;
9289
9290   /* Validate base register.
9291
9292      Don't allow SUBREG's that span more than a word here.  It can lead to spill
9293      failures when the base is one word out of a two word structure, which is
9294      represented internally as a DImode int.  */
9295
9296   if (base)
9297     {
9298       rtx reg;
9299       reason_rtx = base;
9300
9301       if (REG_P (base))
9302         reg = base;
9303       else if (GET_CODE (base) == SUBREG
9304                && REG_P (SUBREG_REG (base))
9305                && GET_MODE_SIZE (GET_MODE (SUBREG_REG (base)))
9306                   <= UNITS_PER_WORD)
9307         reg = SUBREG_REG (base);
9308       else
9309         {
9310           reason = "base is not a register";
9311           goto report_error;
9312         }
9313
9314       if (GET_MODE (base) != Pmode)
9315         {
9316           reason = "base is not in Pmode";
9317           goto report_error;
9318         }
9319
9320       if ((strict && ! REG_OK_FOR_BASE_STRICT_P (reg))
9321           || (! strict && ! REG_OK_FOR_BASE_NONSTRICT_P (reg)))
9322         {
9323           reason = "base is not valid";
9324           goto report_error;
9325         }
9326     }
9327
9328   /* Validate index register.
9329
9330      Don't allow SUBREG's that span more than a word here -- same as above.  */
9331
9332   if (index)
9333     {
9334       rtx reg;
9335       reason_rtx = index;
9336
9337       if (REG_P (index))
9338         reg = index;
9339       else if (GET_CODE (index) == SUBREG
9340                && REG_P (SUBREG_REG (index))
9341                && GET_MODE_SIZE (GET_MODE (SUBREG_REG (index)))
9342                   <= UNITS_PER_WORD)
9343         reg = SUBREG_REG (index);
9344       else
9345         {
9346           reason = "index is not a register";
9347           goto report_error;
9348         }
9349
9350       if (GET_MODE (index) != Pmode)
9351         {
9352           reason = "index is not in Pmode";
9353           goto report_error;
9354         }
9355
9356       if ((strict && ! REG_OK_FOR_INDEX_STRICT_P (reg))
9357           || (! strict && ! REG_OK_FOR_INDEX_NONSTRICT_P (reg)))
9358         {
9359           reason = "index is not valid";
9360           goto report_error;
9361         }
9362     }
9363
9364   /* Validate scale factor.  */
9365   if (scale != 1)
9366     {
9367       reason_rtx = GEN_INT (scale);
9368       if (!index)
9369         {
9370           reason = "scale without index";
9371           goto report_error;
9372         }
9373
9374       if (scale != 2 && scale != 4 && scale != 8)
9375         {
9376           reason = "scale is not a valid multiplier";
9377           goto report_error;
9378         }
9379     }
9380
9381   /* Validate displacement.  */
9382   if (disp)
9383     {
9384       reason_rtx = disp;
9385
9386       if (GET_CODE (disp) == CONST
9387           && GET_CODE (XEXP (disp, 0)) == UNSPEC
9388           && XINT (XEXP (disp, 0), 1) != UNSPEC_MACHOPIC_OFFSET)
9389         switch (XINT (XEXP (disp, 0), 1))
9390           {
9391           /* Refuse GOTOFF and GOT in 64bit mode since it is always 64bit when
9392              used.  While ABI specify also 32bit relocations, we don't produce
9393              them at all and use IP relative instead.  */
9394           case UNSPEC_GOT:
9395           case UNSPEC_GOTOFF:
9396             gcc_assert (flag_pic);
9397             if (!TARGET_64BIT)
9398               goto is_legitimate_pic;
9399             reason = "64bit address unspec";
9400             goto report_error;
9401
9402           case UNSPEC_GOTPCREL:
9403             gcc_assert (flag_pic);
9404             goto is_legitimate_pic;
9405
9406           case UNSPEC_GOTTPOFF:
9407           case UNSPEC_GOTNTPOFF:
9408           case UNSPEC_INDNTPOFF:
9409           case UNSPEC_NTPOFF:
9410           case UNSPEC_DTPOFF:
9411             break;
9412
9413           default:
9414             reason = "invalid address unspec";
9415             goto report_error;
9416           }
9417
9418       else if (SYMBOLIC_CONST (disp)
9419                && (flag_pic
9420                    || (TARGET_MACHO
9421 #if TARGET_MACHO
9422                        && MACHOPIC_INDIRECT
9423                        && !machopic_operand_p (disp)
9424 #endif
9425                )))
9426         {
9427
9428         is_legitimate_pic:
9429           if (TARGET_64BIT && (index || base))
9430             {
9431               /* foo@dtpoff(%rX) is ok.  */
9432               if (GET_CODE (disp) != CONST
9433                   || GET_CODE (XEXP (disp, 0)) != PLUS
9434                   || GET_CODE (XEXP (XEXP (disp, 0), 0)) != UNSPEC
9435                   || !CONST_INT_P (XEXP (XEXP (disp, 0), 1))
9436                   || (XINT (XEXP (XEXP (disp, 0), 0), 1) != UNSPEC_DTPOFF
9437                       && XINT (XEXP (XEXP (disp, 0), 0), 1) != UNSPEC_NTPOFF))
9438                 {
9439                   reason = "non-constant pic memory reference";
9440                   goto report_error;
9441                 }
9442             }
9443           else if (! legitimate_pic_address_disp_p (disp))
9444             {
9445               reason = "displacement is an invalid pic construct";
9446               goto report_error;
9447             }
9448
9449           /* This code used to verify that a symbolic pic displacement
9450              includes the pic_offset_table_rtx register.
9451
9452              While this is good idea, unfortunately these constructs may
9453              be created by "adds using lea" optimization for incorrect
9454              code like:
9455
9456              int a;
9457              int foo(int i)
9458                {
9459                  return *(&a+i);
9460                }
9461
9462              This code is nonsensical, but results in addressing
9463              GOT table with pic_offset_table_rtx base.  We can't
9464              just refuse it easily, since it gets matched by
9465              "addsi3" pattern, that later gets split to lea in the
9466              case output register differs from input.  While this
9467              can be handled by separate addsi pattern for this case
9468              that never results in lea, this seems to be easier and
9469              correct fix for crash to disable this test.  */
9470         }
9471       else if (GET_CODE (disp) != LABEL_REF
9472                && !CONST_INT_P (disp)
9473                && (GET_CODE (disp) != CONST
9474                    || !legitimate_constant_p (disp))
9475                && (GET_CODE (disp) != SYMBOL_REF
9476                    || !legitimate_constant_p (disp)))
9477         {
9478           reason = "displacement is not constant";
9479           goto report_error;
9480         }
9481       else if (TARGET_64BIT
9482                && !x86_64_immediate_operand (disp, VOIDmode))
9483         {
9484           reason = "displacement is out of range";
9485           goto report_error;
9486         }
9487     }
9488
9489   /* Everything looks valid.  */
9490   return TRUE;
9491
9492  report_error:
9493   return FALSE;
9494 }
9495
9496 /* Determine if a given RTX is a valid constant address.  */
9497
9498 bool
9499 constant_address_p (rtx x)
9500 {
9501   return CONSTANT_P (x) && ix86_legitimate_address_p (Pmode, x, 1);
9502 }
9503 \f
9504 /* Return a unique alias set for the GOT.  */
9505
9506 static alias_set_type
9507 ix86_GOT_alias_set (void)
9508 {
9509   static alias_set_type set = -1;
9510   if (set == -1)
9511     set = new_alias_set ();
9512   return set;
9513 }
9514
9515 /* Return a legitimate reference for ORIG (an address) using the
9516    register REG.  If REG is 0, a new pseudo is generated.
9517
9518    There are two types of references that must be handled:
9519
9520    1. Global data references must load the address from the GOT, via
9521       the PIC reg.  An insn is emitted to do this load, and the reg is
9522       returned.
9523
9524    2. Static data references, constant pool addresses, and code labels
9525       compute the address as an offset from the GOT, whose base is in
9526       the PIC reg.  Static data objects have SYMBOL_FLAG_LOCAL set to
9527       differentiate them from global data objects.  The returned
9528       address is the PIC reg + an unspec constant.
9529
9530    TARGET_LEGITIMATE_ADDRESS_P rejects symbolic references unless the PIC
9531    reg also appears in the address.  */
9532
9533 static rtx
9534 legitimize_pic_address (rtx orig, rtx reg)
9535 {
9536   rtx addr = orig;
9537   rtx new_rtx = orig;
9538   rtx base;
9539
9540 #if TARGET_MACHO
9541   if (TARGET_MACHO && !TARGET_64BIT)
9542     {
9543       if (reg == 0)
9544         reg = gen_reg_rtx (Pmode);
9545       /* Use the generic Mach-O PIC machinery.  */
9546       return machopic_legitimize_pic_address (orig, GET_MODE (orig), reg);
9547     }
9548 #endif
9549
9550   if (TARGET_64BIT && legitimate_pic_address_disp_p (addr))
9551     new_rtx = addr;
9552   else if (TARGET_64BIT
9553            && ix86_cmodel != CM_SMALL_PIC
9554            && gotoff_operand (addr, Pmode))
9555     {
9556       rtx tmpreg;
9557       /* This symbol may be referenced via a displacement from the PIC
9558          base address (@GOTOFF).  */
9559
9560       if (reload_in_progress)
9561         df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
9562       if (GET_CODE (addr) == CONST)
9563         addr = XEXP (addr, 0);
9564       if (GET_CODE (addr) == PLUS)
9565           {
9566             new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, XEXP (addr, 0)),
9567                                       UNSPEC_GOTOFF);
9568             new_rtx = gen_rtx_PLUS (Pmode, new_rtx, XEXP (addr, 1));
9569           }
9570         else
9571           new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOTOFF);
9572       new_rtx = gen_rtx_CONST (Pmode, new_rtx);
9573       if (!reg)
9574         tmpreg = gen_reg_rtx (Pmode);
9575       else
9576         tmpreg = reg;
9577       emit_move_insn (tmpreg, new_rtx);
9578
9579       if (reg != 0)
9580         {
9581           new_rtx = expand_simple_binop (Pmode, PLUS, reg, pic_offset_table_rtx,
9582                                          tmpreg, 1, OPTAB_DIRECT);
9583           new_rtx = reg;
9584         }
9585       else new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, tmpreg);
9586     }
9587   else if (!TARGET_64BIT && gotoff_operand (addr, Pmode))
9588     {
9589       /* This symbol may be referenced via a displacement from the PIC
9590          base address (@GOTOFF).  */
9591
9592       if (reload_in_progress)
9593         df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
9594       if (GET_CODE (addr) == CONST)
9595         addr = XEXP (addr, 0);
9596       if (GET_CODE (addr) == PLUS)
9597           {
9598             new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, XEXP (addr, 0)),
9599                                       UNSPEC_GOTOFF);
9600             new_rtx = gen_rtx_PLUS (Pmode, new_rtx, XEXP (addr, 1));
9601           }
9602         else
9603           new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOTOFF);
9604       new_rtx = gen_rtx_CONST (Pmode, new_rtx);
9605       new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, new_rtx);
9606
9607       if (reg != 0)
9608         {
9609           emit_move_insn (reg, new_rtx);
9610           new_rtx = reg;
9611         }
9612     }
9613   else if ((GET_CODE (addr) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (addr) == 0)
9614            /* We can't use @GOTOFF for text labels on VxWorks;
9615               see gotoff_operand.  */
9616            || (TARGET_VXWORKS_RTP && GET_CODE (addr) == LABEL_REF))
9617     {
9618       if (TARGET_DLLIMPORT_DECL_ATTRIBUTES)
9619         {
9620           if (GET_CODE (addr) == SYMBOL_REF && SYMBOL_REF_DLLIMPORT_P (addr))
9621             return legitimize_dllimport_symbol (addr, true);
9622           if (GET_CODE (addr) == CONST && GET_CODE (XEXP (addr, 0)) == PLUS
9623               && GET_CODE (XEXP (XEXP (addr, 0), 0)) == SYMBOL_REF
9624               && SYMBOL_REF_DLLIMPORT_P (XEXP (XEXP (addr, 0), 0)))
9625             {
9626               rtx t = legitimize_dllimport_symbol (XEXP (XEXP (addr, 0), 0), true);
9627               return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (addr, 0), 1));
9628             }
9629         }
9630
9631       if (TARGET_64BIT && ix86_cmodel != CM_LARGE_PIC)
9632         {
9633           new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOTPCREL);
9634           new_rtx = gen_rtx_CONST (Pmode, new_rtx);
9635           new_rtx = gen_const_mem (Pmode, new_rtx);
9636           set_mem_alias_set (new_rtx, ix86_GOT_alias_set ());
9637
9638           if (reg == 0)
9639             reg = gen_reg_rtx (Pmode);
9640           /* Use directly gen_movsi, otherwise the address is loaded
9641              into register for CSE.  We don't want to CSE this addresses,
9642              instead we CSE addresses from the GOT table, so skip this.  */
9643           emit_insn (gen_movsi (reg, new_rtx));
9644           new_rtx = reg;
9645         }
9646       else
9647         {
9648           /* This symbol must be referenced via a load from the
9649              Global Offset Table (@GOT).  */
9650
9651           if (reload_in_progress)
9652             df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
9653           new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOT);
9654           new_rtx = gen_rtx_CONST (Pmode, new_rtx);
9655           if (TARGET_64BIT)
9656             new_rtx = force_reg (Pmode, new_rtx);
9657           new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, new_rtx);
9658           new_rtx = gen_const_mem (Pmode, new_rtx);
9659           set_mem_alias_set (new_rtx, ix86_GOT_alias_set ());
9660
9661           if (reg == 0)
9662             reg = gen_reg_rtx (Pmode);
9663           emit_move_insn (reg, new_rtx);
9664           new_rtx = reg;
9665         }
9666     }
9667   else
9668     {
9669       if (CONST_INT_P (addr)
9670           && !x86_64_immediate_operand (addr, VOIDmode))
9671         {
9672           if (reg)
9673             {
9674               emit_move_insn (reg, addr);
9675               new_rtx = reg;
9676             }
9677           else
9678             new_rtx = force_reg (Pmode, addr);
9679         }
9680       else if (GET_CODE (addr) == CONST)
9681         {
9682           addr = XEXP (addr, 0);
9683
9684           /* We must match stuff we generate before.  Assume the only
9685              unspecs that can get here are ours.  Not that we could do
9686              anything with them anyway....  */
9687           if (GET_CODE (addr) == UNSPEC
9688               || (GET_CODE (addr) == PLUS
9689                   && GET_CODE (XEXP (addr, 0)) == UNSPEC))
9690             return orig;
9691           gcc_assert (GET_CODE (addr) == PLUS);
9692         }
9693       if (GET_CODE (addr) == PLUS)
9694         {
9695           rtx op0 = XEXP (addr, 0), op1 = XEXP (addr, 1);
9696
9697           /* Check first to see if this is a constant offset from a @GOTOFF
9698              symbol reference.  */
9699           if (gotoff_operand (op0, Pmode)
9700               && CONST_INT_P (op1))
9701             {
9702               if (!TARGET_64BIT)
9703                 {
9704                   if (reload_in_progress)
9705                     df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
9706                   new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, op0),
9707                                             UNSPEC_GOTOFF);
9708                   new_rtx = gen_rtx_PLUS (Pmode, new_rtx, op1);
9709                   new_rtx = gen_rtx_CONST (Pmode, new_rtx);
9710                   new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, new_rtx);
9711
9712                   if (reg != 0)
9713                     {
9714                       emit_move_insn (reg, new_rtx);
9715                       new_rtx = reg;
9716                     }
9717                 }
9718               else
9719                 {
9720                   if (INTVAL (op1) < -16*1024*1024
9721                       || INTVAL (op1) >= 16*1024*1024)
9722                     {
9723                       if (!x86_64_immediate_operand (op1, Pmode))
9724                         op1 = force_reg (Pmode, op1);
9725                       new_rtx = gen_rtx_PLUS (Pmode, force_reg (Pmode, op0), op1);
9726                     }
9727                 }
9728             }
9729           else
9730             {
9731               base = legitimize_pic_address (XEXP (addr, 0), reg);
9732               new_rtx  = legitimize_pic_address (XEXP (addr, 1),
9733                                                  base == reg ? NULL_RTX : reg);
9734
9735               if (CONST_INT_P (new_rtx))
9736                 new_rtx = plus_constant (base, INTVAL (new_rtx));
9737               else
9738                 {
9739                   if (GET_CODE (new_rtx) == PLUS && CONSTANT_P (XEXP (new_rtx, 1)))
9740                     {
9741                       base = gen_rtx_PLUS (Pmode, base, XEXP (new_rtx, 0));
9742                       new_rtx = XEXP (new_rtx, 1);
9743                     }
9744                   new_rtx = gen_rtx_PLUS (Pmode, base, new_rtx);
9745                 }
9746             }
9747         }
9748     }
9749   return new_rtx;
9750 }
9751 \f
9752 /* Load the thread pointer.  If TO_REG is true, force it into a register.  */
9753
9754 static rtx
9755 get_thread_pointer (int to_reg)
9756 {
9757   rtx tp, reg, insn;
9758
9759   tp = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx), UNSPEC_TP);
9760   if (!to_reg)
9761     return tp;
9762
9763   reg = gen_reg_rtx (Pmode);
9764   insn = gen_rtx_SET (VOIDmode, reg, tp);
9765   insn = emit_insn (insn);
9766
9767   return reg;
9768 }
9769
9770 /* A subroutine of ix86_legitimize_address and ix86_expand_move.  FOR_MOV is
9771    false if we expect this to be used for a memory address and true if
9772    we expect to load the address into a register.  */
9773
9774 static rtx
9775 legitimize_tls_address (rtx x, enum tls_model model, int for_mov)
9776 {
9777   rtx dest, base, off, pic, tp;
9778   int type;
9779
9780   switch (model)
9781     {
9782     case TLS_MODEL_GLOBAL_DYNAMIC:
9783       dest = gen_reg_rtx (Pmode);
9784       tp = TARGET_GNU2_TLS ? get_thread_pointer (1) : 0;
9785
9786       if (TARGET_64BIT && ! TARGET_GNU2_TLS)
9787         {
9788           rtx rax = gen_rtx_REG (Pmode, AX_REG), insns;
9789
9790           start_sequence ();
9791           emit_call_insn (gen_tls_global_dynamic_64 (rax, x));
9792           insns = get_insns ();
9793           end_sequence ();
9794
9795           RTL_CONST_CALL_P (insns) = 1;
9796           emit_libcall_block (insns, dest, rax, x);
9797         }
9798       else if (TARGET_64BIT && TARGET_GNU2_TLS)
9799         emit_insn (gen_tls_global_dynamic_64 (dest, x));
9800       else
9801         emit_insn (gen_tls_global_dynamic_32 (dest, x));
9802
9803       if (TARGET_GNU2_TLS)
9804         {
9805           dest = force_reg (Pmode, gen_rtx_PLUS (Pmode, tp, dest));
9806
9807           set_unique_reg_note (get_last_insn (), REG_EQUIV, x);
9808         }
9809       break;
9810
9811     case TLS_MODEL_LOCAL_DYNAMIC:
9812       base = gen_reg_rtx (Pmode);
9813       tp = TARGET_GNU2_TLS ? get_thread_pointer (1) : 0;
9814
9815       if (TARGET_64BIT && ! TARGET_GNU2_TLS)
9816         {
9817           rtx rax = gen_rtx_REG (Pmode, AX_REG), insns, note;
9818
9819           start_sequence ();
9820           emit_call_insn (gen_tls_local_dynamic_base_64 (rax));
9821           insns = get_insns ();
9822           end_sequence ();
9823
9824           note = gen_rtx_EXPR_LIST (VOIDmode, const0_rtx, NULL);
9825           note = gen_rtx_EXPR_LIST (VOIDmode, ix86_tls_get_addr (), note);
9826           RTL_CONST_CALL_P (insns) = 1;
9827           emit_libcall_block (insns, base, rax, note);
9828         }
9829       else if (TARGET_64BIT && TARGET_GNU2_TLS)
9830         emit_insn (gen_tls_local_dynamic_base_64 (base));
9831       else
9832         emit_insn (gen_tls_local_dynamic_base_32 (base));
9833
9834       if (TARGET_GNU2_TLS)
9835         {
9836           rtx x = ix86_tls_module_base ();
9837
9838           set_unique_reg_note (get_last_insn (), REG_EQUIV,
9839                                gen_rtx_MINUS (Pmode, x, tp));
9840         }
9841
9842       off = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, x), UNSPEC_DTPOFF);
9843       off = gen_rtx_CONST (Pmode, off);
9844
9845       dest = force_reg (Pmode, gen_rtx_PLUS (Pmode, base, off));
9846
9847       if (TARGET_GNU2_TLS)
9848         {
9849           dest = force_reg (Pmode, gen_rtx_PLUS (Pmode, dest, tp));
9850
9851           set_unique_reg_note (get_last_insn (), REG_EQUIV, x);
9852         }
9853
9854       break;
9855
9856     case TLS_MODEL_INITIAL_EXEC:
9857       if (TARGET_64BIT)
9858         {
9859           pic = NULL;
9860           type = UNSPEC_GOTNTPOFF;
9861         }
9862       else if (flag_pic)
9863         {
9864           if (reload_in_progress)
9865             df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
9866           pic = pic_offset_table_rtx;
9867           type = TARGET_ANY_GNU_TLS ? UNSPEC_GOTNTPOFF : UNSPEC_GOTTPOFF;
9868         }
9869       else if (!TARGET_ANY_GNU_TLS)
9870         {
9871           pic = gen_reg_rtx (Pmode);
9872           emit_insn (gen_set_got (pic));
9873           type = UNSPEC_GOTTPOFF;
9874         }
9875       else
9876         {
9877           pic = NULL;
9878           type = UNSPEC_INDNTPOFF;
9879         }
9880
9881       off = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, x), type);
9882       off = gen_rtx_CONST (Pmode, off);
9883       if (pic)
9884         off = gen_rtx_PLUS (Pmode, pic, off);
9885       off = gen_const_mem (Pmode, off);
9886       set_mem_alias_set (off, ix86_GOT_alias_set ());
9887
9888       if (TARGET_64BIT || TARGET_ANY_GNU_TLS)
9889         {
9890           base = get_thread_pointer (for_mov || !TARGET_TLS_DIRECT_SEG_REFS);
9891           off = force_reg (Pmode, off);
9892           return gen_rtx_PLUS (Pmode, base, off);
9893         }
9894       else
9895         {
9896           base = get_thread_pointer (true);
9897           dest = gen_reg_rtx (Pmode);
9898           emit_insn (gen_subsi3 (dest, base, off));
9899         }
9900       break;
9901
9902     case TLS_MODEL_LOCAL_EXEC:
9903       off = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, x),
9904                             (TARGET_64BIT || TARGET_ANY_GNU_TLS)
9905                             ? UNSPEC_NTPOFF : UNSPEC_TPOFF);
9906       off = gen_rtx_CONST (Pmode, off);
9907
9908       if (TARGET_64BIT || TARGET_ANY_GNU_TLS)
9909         {
9910           base = get_thread_pointer (for_mov || !TARGET_TLS_DIRECT_SEG_REFS);
9911           return gen_rtx_PLUS (Pmode, base, off);
9912         }
9913       else
9914         {
9915           base = get_thread_pointer (true);
9916           dest = gen_reg_rtx (Pmode);
9917           emit_insn (gen_subsi3 (dest, base, off));
9918         }
9919       break;
9920
9921     default:
9922       gcc_unreachable ();
9923     }
9924
9925   return dest;
9926 }
9927
9928 /* Create or return the unique __imp_DECL dllimport symbol corresponding
9929    to symbol DECL.  */
9930
9931 static GTY((if_marked ("tree_map_marked_p"), param_is (struct tree_map)))
9932   htab_t dllimport_map;
9933
9934 static tree
9935 get_dllimport_decl (tree decl)
9936 {
9937   struct tree_map *h, in;
9938   void **loc;
9939   const char *name;
9940   const char *prefix;
9941   size_t namelen, prefixlen;
9942   char *imp_name;
9943   tree to;
9944   rtx rtl;
9945
9946   if (!dllimport_map)
9947     dllimport_map = htab_create_ggc (512, tree_map_hash, tree_map_eq, 0);
9948
9949   in.hash = htab_hash_pointer (decl);
9950   in.base.from = decl;
9951   loc = htab_find_slot_with_hash (dllimport_map, &in, in.hash, INSERT);
9952   h = (struct tree_map *) *loc;
9953   if (h)
9954     return h->to;
9955
9956   *loc = h = GGC_NEW (struct tree_map);
9957   h->hash = in.hash;
9958   h->base.from = decl;
9959   h->to = to = build_decl (VAR_DECL, NULL, ptr_type_node);
9960   DECL_ARTIFICIAL (to) = 1;
9961   DECL_IGNORED_P (to) = 1;
9962   DECL_EXTERNAL (to) = 1;
9963   TREE_READONLY (to) = 1;
9964
9965   name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
9966   name = targetm.strip_name_encoding (name);
9967   prefix = name[0] == FASTCALL_PREFIX || user_label_prefix[0] == 0
9968     ? "*__imp_" : "*__imp__";
9969   namelen = strlen (name);
9970   prefixlen = strlen (prefix);
9971   imp_name = (char *) alloca (namelen + prefixlen + 1);
9972   memcpy (imp_name, prefix, prefixlen);
9973   memcpy (imp_name + prefixlen, name, namelen + 1);
9974
9975   name = ggc_alloc_string (imp_name, namelen + prefixlen);
9976   rtl = gen_rtx_SYMBOL_REF (Pmode, name);
9977   SET_SYMBOL_REF_DECL (rtl, to);
9978   SYMBOL_REF_FLAGS (rtl) = SYMBOL_FLAG_LOCAL;
9979
9980   rtl = gen_const_mem (Pmode, rtl);
9981   set_mem_alias_set (rtl, ix86_GOT_alias_set ());
9982
9983   SET_DECL_RTL (to, rtl);
9984   SET_DECL_ASSEMBLER_NAME (to, get_identifier (name));
9985
9986   return to;
9987 }
9988
9989 /* Expand SYMBOL into its corresponding dllimport symbol.  WANT_REG is
9990    true if we require the result be a register.  */
9991
9992 static rtx
9993 legitimize_dllimport_symbol (rtx symbol, bool want_reg)
9994 {
9995   tree imp_decl;
9996   rtx x;
9997
9998   gcc_assert (SYMBOL_REF_DECL (symbol));
9999   imp_decl = get_dllimport_decl (SYMBOL_REF_DECL (symbol));
10000
10001   x = DECL_RTL (imp_decl);
10002   if (want_reg)
10003     x = force_reg (Pmode, x);
10004   return x;
10005 }
10006
10007 /* Try machine-dependent ways of modifying an illegitimate address
10008    to be legitimate.  If we find one, return the new, valid address.
10009    This macro is used in only one place: `memory_address' in explow.c.
10010
10011    OLDX is the address as it was before break_out_memory_refs was called.
10012    In some cases it is useful to look at this to decide what needs to be done.
10013
10014    It is always safe for this macro to do nothing.  It exists to recognize
10015    opportunities to optimize the output.
10016
10017    For the 80386, we handle X+REG by loading X into a register R and
10018    using R+REG.  R will go in a general reg and indexing will be used.
10019    However, if REG is a broken-out memory address or multiplication,
10020    nothing needs to be done because REG can certainly go in a general reg.
10021
10022    When -fpic is used, special handling is needed for symbolic references.
10023    See comments by legitimize_pic_address in i386.c for details.  */
10024
10025 static rtx
10026 ix86_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED,
10027                          enum machine_mode mode)
10028 {
10029   int changed = 0;
10030   unsigned log;
10031
10032   log = GET_CODE (x) == SYMBOL_REF ? SYMBOL_REF_TLS_MODEL (x) : 0;
10033   if (log)
10034     return legitimize_tls_address (x, (enum tls_model) log, false);
10035   if (GET_CODE (x) == CONST
10036       && GET_CODE (XEXP (x, 0)) == PLUS
10037       && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
10038       && (log = SYMBOL_REF_TLS_MODEL (XEXP (XEXP (x, 0), 0))))
10039     {
10040       rtx t = legitimize_tls_address (XEXP (XEXP (x, 0), 0),
10041                                       (enum tls_model) log, false);
10042       return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (x, 0), 1));
10043     }
10044
10045   if (TARGET_DLLIMPORT_DECL_ATTRIBUTES)
10046     {
10047       if (GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_DLLIMPORT_P (x))
10048         return legitimize_dllimport_symbol (x, true);
10049       if (GET_CODE (x) == CONST
10050           && GET_CODE (XEXP (x, 0)) == PLUS
10051           && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
10052           && SYMBOL_REF_DLLIMPORT_P (XEXP (XEXP (x, 0), 0)))
10053         {
10054           rtx t = legitimize_dllimport_symbol (XEXP (XEXP (x, 0), 0), true);
10055           return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (x, 0), 1));
10056         }
10057     }
10058
10059   if (flag_pic && SYMBOLIC_CONST (x))
10060     return legitimize_pic_address (x, 0);
10061
10062   /* Canonicalize shifts by 0, 1, 2, 3 into multiply */
10063   if (GET_CODE (x) == ASHIFT
10064       && CONST_INT_P (XEXP (x, 1))
10065       && (unsigned HOST_WIDE_INT) INTVAL (XEXP (x, 1)) < 4)
10066     {
10067       changed = 1;
10068       log = INTVAL (XEXP (x, 1));
10069       x = gen_rtx_MULT (Pmode, force_reg (Pmode, XEXP (x, 0)),
10070                         GEN_INT (1 << log));
10071     }
10072
10073   if (GET_CODE (x) == PLUS)
10074     {
10075       /* Canonicalize shifts by 0, 1, 2, 3 into multiply.  */
10076
10077       if (GET_CODE (XEXP (x, 0)) == ASHIFT
10078           && CONST_INT_P (XEXP (XEXP (x, 0), 1))
10079           && (unsigned HOST_WIDE_INT) INTVAL (XEXP (XEXP (x, 0), 1)) < 4)
10080         {
10081           changed = 1;
10082           log = INTVAL (XEXP (XEXP (x, 0), 1));
10083           XEXP (x, 0) = gen_rtx_MULT (Pmode,
10084                                       force_reg (Pmode, XEXP (XEXP (x, 0), 0)),
10085                                       GEN_INT (1 << log));
10086         }
10087
10088       if (GET_CODE (XEXP (x, 1)) == ASHIFT
10089           && CONST_INT_P (XEXP (XEXP (x, 1), 1))
10090           && (unsigned HOST_WIDE_INT) INTVAL (XEXP (XEXP (x, 1), 1)) < 4)
10091         {
10092           changed = 1;
10093           log = INTVAL (XEXP (XEXP (x, 1), 1));
10094           XEXP (x, 1) = gen_rtx_MULT (Pmode,
10095                                       force_reg (Pmode, XEXP (XEXP (x, 1), 0)),
10096                                       GEN_INT (1 << log));
10097         }
10098
10099       /* Put multiply first if it isn't already.  */
10100       if (GET_CODE (XEXP (x, 1)) == MULT)
10101         {
10102           rtx tmp = XEXP (x, 0);
10103           XEXP (x, 0) = XEXP (x, 1);
10104           XEXP (x, 1) = tmp;
10105           changed = 1;
10106         }
10107
10108       /* Canonicalize (plus (mult (reg) (const)) (plus (reg) (const)))
10109          into (plus (plus (mult (reg) (const)) (reg)) (const)).  This can be
10110          created by virtual register instantiation, register elimination, and
10111          similar optimizations.  */
10112       if (GET_CODE (XEXP (x, 0)) == MULT && GET_CODE (XEXP (x, 1)) == PLUS)
10113         {
10114           changed = 1;
10115           x = gen_rtx_PLUS (Pmode,
10116                             gen_rtx_PLUS (Pmode, XEXP (x, 0),
10117                                           XEXP (XEXP (x, 1), 0)),
10118                             XEXP (XEXP (x, 1), 1));
10119         }
10120
10121       /* Canonicalize
10122          (plus (plus (mult (reg) (const)) (plus (reg) (const))) const)
10123          into (plus (plus (mult (reg) (const)) (reg)) (const)).  */
10124       else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 0)) == PLUS
10125                && GET_CODE (XEXP (XEXP (x, 0), 0)) == MULT
10126                && GET_CODE (XEXP (XEXP (x, 0), 1)) == PLUS
10127                && CONSTANT_P (XEXP (x, 1)))
10128         {
10129           rtx constant;
10130           rtx other = NULL_RTX;
10131
10132           if (CONST_INT_P (XEXP (x, 1)))
10133             {
10134               constant = XEXP (x, 1);
10135               other = XEXP (XEXP (XEXP (x, 0), 1), 1);
10136             }
10137           else if (CONST_INT_P (XEXP (XEXP (XEXP (x, 0), 1), 1)))
10138             {
10139               constant = XEXP (XEXP (XEXP (x, 0), 1), 1);
10140               other = XEXP (x, 1);
10141             }
10142           else
10143             constant = 0;
10144
10145           if (constant)
10146             {
10147               changed = 1;
10148               x = gen_rtx_PLUS (Pmode,
10149                                 gen_rtx_PLUS (Pmode, XEXP (XEXP (x, 0), 0),
10150                                               XEXP (XEXP (XEXP (x, 0), 1), 0)),
10151                                 plus_constant (other, INTVAL (constant)));
10152             }
10153         }
10154
10155       if (changed && ix86_legitimate_address_p (mode, x, FALSE))
10156         return x;
10157
10158       if (GET_CODE (XEXP (x, 0)) == MULT)
10159         {
10160           changed = 1;
10161           XEXP (x, 0) = force_operand (XEXP (x, 0), 0);
10162         }
10163
10164       if (GET_CODE (XEXP (x, 1)) == MULT)
10165         {
10166           changed = 1;
10167           XEXP (x, 1) = force_operand (XEXP (x, 1), 0);
10168         }
10169
10170       if (changed
10171           && REG_P (XEXP (x, 1))
10172           && REG_P (XEXP (x, 0)))
10173         return x;
10174
10175       if (flag_pic && SYMBOLIC_CONST (XEXP (x, 1)))
10176         {
10177           changed = 1;
10178           x = legitimize_pic_address (x, 0);
10179         }
10180
10181       if (changed && ix86_legitimate_address_p (mode, x, FALSE))
10182         return x;
10183
10184       if (REG_P (XEXP (x, 0)))
10185         {
10186           rtx temp = gen_reg_rtx (Pmode);
10187           rtx val  = force_operand (XEXP (x, 1), temp);
10188           if (val != temp)
10189             emit_move_insn (temp, val);
10190
10191           XEXP (x, 1) = temp;
10192           return x;
10193         }
10194
10195       else if (REG_P (XEXP (x, 1)))
10196         {
10197           rtx temp = gen_reg_rtx (Pmode);
10198           rtx val  = force_operand (XEXP (x, 0), temp);
10199           if (val != temp)
10200             emit_move_insn (temp, val);
10201
10202           XEXP (x, 0) = temp;
10203           return x;
10204         }
10205     }
10206
10207   return x;
10208 }
10209 \f
10210 /* Print an integer constant expression in assembler syntax.  Addition
10211    and subtraction are the only arithmetic that may appear in these
10212    expressions.  FILE is the stdio stream to write to, X is the rtx, and
10213    CODE is the operand print code from the output string.  */
10214
10215 static void
10216 output_pic_addr_const (FILE *file, rtx x, int code)
10217 {
10218   char buf[256];
10219
10220   switch (GET_CODE (x))
10221     {
10222     case PC:
10223       gcc_assert (flag_pic);
10224       putc ('.', file);
10225       break;
10226
10227     case SYMBOL_REF:
10228       if (! TARGET_MACHO || TARGET_64BIT)
10229         output_addr_const (file, x);
10230       else
10231         {
10232           const char *name = XSTR (x, 0);
10233
10234           /* Mark the decl as referenced so that cgraph will
10235              output the function.  */
10236           if (SYMBOL_REF_DECL (x))
10237             mark_decl_referenced (SYMBOL_REF_DECL (x));
10238
10239 #if TARGET_MACHO
10240           if (MACHOPIC_INDIRECT
10241               && machopic_classify_symbol (x) == MACHOPIC_UNDEFINED_FUNCTION)
10242             name = machopic_indirection_name (x, /*stub_p=*/true);
10243 #endif
10244           assemble_name (file, name);
10245         }
10246       if (!TARGET_MACHO && !(TARGET_64BIT && DEFAULT_ABI == MS_ABI)
10247           && code == 'P' && ! SYMBOL_REF_LOCAL_P (x))
10248         fputs ("@PLT", file);
10249       break;
10250
10251     case LABEL_REF:
10252       x = XEXP (x, 0);
10253       /* FALLTHRU */
10254     case CODE_LABEL:
10255       ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (x));
10256       assemble_name (asm_out_file, buf);
10257       break;
10258
10259     case CONST_INT:
10260       fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (x));
10261       break;
10262
10263     case CONST:
10264       /* This used to output parentheses around the expression,
10265          but that does not work on the 386 (either ATT or BSD assembler).  */
10266       output_pic_addr_const (file, XEXP (x, 0), code);
10267       break;
10268
10269     case CONST_DOUBLE:
10270       if (GET_MODE (x) == VOIDmode)
10271         {
10272           /* We can use %d if the number is <32 bits and positive.  */
10273           if (CONST_DOUBLE_HIGH (x) || CONST_DOUBLE_LOW (x) < 0)
10274             fprintf (file, "0x%lx%08lx",
10275                      (unsigned long) CONST_DOUBLE_HIGH (x),
10276                      (unsigned long) CONST_DOUBLE_LOW (x));
10277           else
10278             fprintf (file, HOST_WIDE_INT_PRINT_DEC, CONST_DOUBLE_LOW (x));
10279         }
10280       else
10281         /* We can't handle floating point constants;
10282            PRINT_OPERAND must handle them.  */
10283         output_operand_lossage ("floating constant misused");
10284       break;
10285
10286     case PLUS:
10287       /* Some assemblers need integer constants to appear first.  */
10288       if (CONST_INT_P (XEXP (x, 0)))
10289         {
10290           output_pic_addr_const (file, XEXP (x, 0), code);
10291           putc ('+', file);
10292           output_pic_addr_const (file, XEXP (x, 1), code);
10293         }
10294       else
10295         {
10296           gcc_assert (CONST_INT_P (XEXP (x, 1)));
10297           output_pic_addr_const (file, XEXP (x, 1), code);
10298           putc ('+', file);
10299           output_pic_addr_const (file, XEXP (x, 0), code);
10300         }
10301       break;
10302
10303     case MINUS:
10304       if (!TARGET_MACHO)
10305         putc (ASSEMBLER_DIALECT == ASM_INTEL ? '(' : '[', file);
10306       output_pic_addr_const (file, XEXP (x, 0), code);
10307       putc ('-', file);
10308       output_pic_addr_const (file, XEXP (x, 1), code);
10309       if (!TARGET_MACHO)
10310         putc (ASSEMBLER_DIALECT == ASM_INTEL ? ')' : ']', file);
10311       break;
10312
10313      case UNSPEC:
10314        gcc_assert (XVECLEN (x, 0) == 1);
10315        output_pic_addr_const (file, XVECEXP (x, 0, 0), code);
10316        switch (XINT (x, 1))
10317         {
10318         case UNSPEC_GOT:
10319           fputs ("@GOT", file);
10320           break;
10321         case UNSPEC_GOTOFF:
10322           fputs ("@GOTOFF", file);
10323           break;
10324         case UNSPEC_PLTOFF:
10325           fputs ("@PLTOFF", file);
10326           break;
10327         case UNSPEC_GOTPCREL:
10328           fputs (ASSEMBLER_DIALECT == ASM_ATT ?
10329                  "@GOTPCREL(%rip)" : "@GOTPCREL[rip]", file);
10330           break;
10331         case UNSPEC_GOTTPOFF:
10332           /* FIXME: This might be @TPOFF in Sun ld too.  */
10333           fputs ("@GOTTPOFF", file);
10334           break;
10335         case UNSPEC_TPOFF:
10336           fputs ("@TPOFF", file);
10337           break;
10338         case UNSPEC_NTPOFF:
10339           if (TARGET_64BIT)
10340             fputs ("@TPOFF", file);
10341           else
10342             fputs ("@NTPOFF", file);
10343           break;
10344         case UNSPEC_DTPOFF:
10345           fputs ("@DTPOFF", file);
10346           break;
10347         case UNSPEC_GOTNTPOFF:
10348           if (TARGET_64BIT)
10349             fputs (ASSEMBLER_DIALECT == ASM_ATT ?
10350                    "@GOTTPOFF(%rip)": "@GOTTPOFF[rip]", file);
10351           else
10352             fputs ("@GOTNTPOFF", file);
10353           break;
10354         case UNSPEC_INDNTPOFF:
10355           fputs ("@INDNTPOFF", file);
10356           break;
10357 #if TARGET_MACHO
10358         case UNSPEC_MACHOPIC_OFFSET:
10359           putc ('-', file);
10360           machopic_output_function_base_name (file);
10361           break;
10362 #endif
10363         default:
10364           output_operand_lossage ("invalid UNSPEC as operand");
10365           break;
10366         }
10367        break;
10368
10369     default:
10370       output_operand_lossage ("invalid expression as operand");
10371     }
10372 }
10373
10374 /* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL.
10375    We need to emit DTP-relative relocations.  */
10376
10377 static void ATTRIBUTE_UNUSED
10378 i386_output_dwarf_dtprel (FILE *file, int size, rtx x)
10379 {
10380   fputs (ASM_LONG, file);
10381   output_addr_const (file, x);
10382   fputs ("@DTPOFF", file);
10383   switch (size)
10384     {
10385     case 4:
10386       break;
10387     case 8:
10388       fputs (", 0", file);
10389       break;
10390     default:
10391       gcc_unreachable ();
10392    }
10393 }
10394
10395 /* Return true if X is a representation of the PIC register.  This copes
10396    with calls from ix86_find_base_term, where the register might have
10397    been replaced by a cselib value.  */
10398
10399 static bool
10400 ix86_pic_register_p (rtx x)
10401 {
10402   if (GET_CODE (x) == VALUE)
10403     return (pic_offset_table_rtx
10404             && rtx_equal_for_cselib_p (x, pic_offset_table_rtx));
10405   else
10406     return REG_P (x) && REGNO (x) == PIC_OFFSET_TABLE_REGNUM;
10407 }
10408
10409 /* In the name of slightly smaller debug output, and to cater to
10410    general assembler lossage, recognize PIC+GOTOFF and turn it back
10411    into a direct symbol reference.
10412
10413    On Darwin, this is necessary to avoid a crash, because Darwin
10414    has a different PIC label for each routine but the DWARF debugging
10415    information is not associated with any particular routine, so it's
10416    necessary to remove references to the PIC label from RTL stored by
10417    the DWARF output code.  */
10418
10419 static rtx
10420 ix86_delegitimize_address (rtx orig_x)
10421 {
10422   rtx x = orig_x;
10423   /* reg_addend is NULL or a multiple of some register.  */
10424   rtx reg_addend = NULL_RTX;
10425   /* const_addend is NULL or a const_int.  */
10426   rtx const_addend = NULL_RTX;
10427   /* This is the result, or NULL.  */
10428   rtx result = NULL_RTX;
10429
10430   if (MEM_P (x))
10431     x = XEXP (x, 0);
10432
10433   if (TARGET_64BIT)
10434     {
10435       if (GET_CODE (x) != CONST
10436           || GET_CODE (XEXP (x, 0)) != UNSPEC
10437           || XINT (XEXP (x, 0), 1) != UNSPEC_GOTPCREL
10438           || !MEM_P (orig_x))
10439         return orig_x;
10440       return XVECEXP (XEXP (x, 0), 0, 0);
10441     }
10442
10443   if (GET_CODE (x) != PLUS
10444       || GET_CODE (XEXP (x, 1)) != CONST)
10445     return orig_x;
10446
10447   if (ix86_pic_register_p (XEXP (x, 0)))
10448     /* %ebx + GOT/GOTOFF */
10449     ;
10450   else if (GET_CODE (XEXP (x, 0)) == PLUS)
10451     {
10452       /* %ebx + %reg * scale + GOT/GOTOFF */
10453       reg_addend = XEXP (x, 0);
10454       if (ix86_pic_register_p (XEXP (reg_addend, 0)))
10455         reg_addend = XEXP (reg_addend, 1);
10456       else if (ix86_pic_register_p (XEXP (reg_addend, 1)))
10457         reg_addend = XEXP (reg_addend, 0);
10458       else
10459         return orig_x;
10460       if (!REG_P (reg_addend)
10461           && GET_CODE (reg_addend) != MULT
10462           && GET_CODE (reg_addend) != ASHIFT)
10463         return orig_x;
10464     }
10465   else
10466     return orig_x;
10467
10468   x = XEXP (XEXP (x, 1), 0);
10469   if (GET_CODE (x) == PLUS
10470       && CONST_INT_P (XEXP (x, 1)))
10471     {
10472       const_addend = XEXP (x, 1);
10473       x = XEXP (x, 0);
10474     }
10475
10476   if (GET_CODE (x) == UNSPEC
10477       && ((XINT (x, 1) == UNSPEC_GOT && MEM_P (orig_x))
10478           || (XINT (x, 1) == UNSPEC_GOTOFF && !MEM_P (orig_x))))
10479     result = XVECEXP (x, 0, 0);
10480
10481   if (TARGET_MACHO && darwin_local_data_pic (x)
10482       && !MEM_P (orig_x))
10483     result = XVECEXP (x, 0, 0);
10484
10485   if (! result)
10486     return orig_x;
10487
10488   if (const_addend)
10489     result = gen_rtx_CONST (Pmode, gen_rtx_PLUS (Pmode, result, const_addend));
10490   if (reg_addend)
10491     result = gen_rtx_PLUS (Pmode, reg_addend, result);
10492   return result;
10493 }
10494
10495 /* If X is a machine specific address (i.e. a symbol or label being
10496    referenced as a displacement from the GOT implemented using an
10497    UNSPEC), then return the base term.  Otherwise return X.  */
10498
10499 rtx
10500 ix86_find_base_term (rtx x)
10501 {
10502   rtx term;
10503
10504   if (TARGET_64BIT)
10505     {
10506       if (GET_CODE (x) != CONST)
10507         return x;
10508       term = XEXP (x, 0);
10509       if (GET_CODE (term) == PLUS
10510           && (CONST_INT_P (XEXP (term, 1))
10511               || GET_CODE (XEXP (term, 1)) == CONST_DOUBLE))
10512         term = XEXP (term, 0);
10513       if (GET_CODE (term) != UNSPEC
10514           || XINT (term, 1) != UNSPEC_GOTPCREL)
10515         return x;
10516
10517       return XVECEXP (term, 0, 0);
10518     }
10519
10520   return ix86_delegitimize_address (x);
10521 }
10522 \f
10523 static void
10524 put_condition_code (enum rtx_code code, enum machine_mode mode, int reverse,
10525                     int fp, FILE *file)
10526 {
10527   const char *suffix;
10528
10529   if (mode == CCFPmode || mode == CCFPUmode)
10530     {
10531       enum rtx_code second_code, bypass_code;
10532       ix86_fp_comparison_codes (code, &bypass_code, &code, &second_code);
10533       gcc_assert (bypass_code == UNKNOWN && second_code == UNKNOWN);
10534       code = ix86_fp_compare_code_to_integer (code);
10535       mode = CCmode;
10536     }
10537   if (reverse)
10538     code = reverse_condition (code);
10539
10540   switch (code)
10541     {
10542     case EQ:
10543       switch (mode)
10544         {
10545         case CCAmode:
10546           suffix = "a";
10547           break;
10548
10549         case CCCmode:
10550           suffix = "c";
10551           break;
10552
10553         case CCOmode:
10554           suffix = "o";
10555           break;
10556
10557         case CCSmode:
10558           suffix = "s";
10559           break;
10560
10561         default:
10562           suffix = "e";
10563         }
10564       break;
10565     case NE:
10566       switch (mode)
10567         {
10568         case CCAmode:
10569           suffix = "na";
10570           break;
10571
10572         case CCCmode:
10573           suffix = "nc";
10574           break;
10575
10576         case CCOmode:
10577           suffix = "no";
10578           break;
10579
10580         case CCSmode:
10581           suffix = "ns";
10582           break;
10583
10584         default:
10585           suffix = "ne";
10586         }
10587       break;
10588     case GT:
10589       gcc_assert (mode == CCmode || mode == CCNOmode || mode == CCGCmode);
10590       suffix = "g";
10591       break;
10592     case GTU:
10593       /* ??? Use "nbe" instead of "a" for fcmov lossage on some assemblers.
10594          Those same assemblers have the same but opposite lossage on cmov.  */
10595       if (mode == CCmode)
10596         suffix = fp ? "nbe" : "a";
10597       else if (mode == CCCmode)
10598         suffix = "b";
10599       else
10600         gcc_unreachable ();
10601       break;
10602     case LT:
10603       switch (mode)
10604         {
10605         case CCNOmode:
10606         case CCGOCmode:
10607           suffix = "s";
10608           break;
10609
10610         case CCmode:
10611         case CCGCmode:
10612           suffix = "l";
10613           break;
10614
10615         default:
10616           gcc_unreachable ();
10617         }
10618       break;
10619     case LTU:
10620       gcc_assert (mode == CCmode || mode == CCCmode);
10621       suffix = "b";
10622       break;
10623     case GE:
10624       switch (mode)
10625         {
10626         case CCNOmode:
10627         case CCGOCmode:
10628           suffix = "ns";
10629           break;
10630
10631         case CCmode:
10632         case CCGCmode:
10633           suffix = "ge";
10634           break;
10635
10636         default:
10637           gcc_unreachable ();
10638         }
10639       break;
10640     case GEU:
10641       /* ??? As above.  */
10642       gcc_assert (mode == CCmode || mode == CCCmode);
10643       suffix = fp ? "nb" : "ae";
10644       break;
10645     case LE:
10646       gcc_assert (mode == CCmode || mode == CCGCmode || mode == CCNOmode);
10647       suffix = "le";
10648       break;
10649     case LEU:
10650       /* ??? As above.  */
10651       if (mode == CCmode)
10652         suffix = "be";
10653       else if (mode == CCCmode)
10654         suffix = fp ? "nb" : "ae";
10655       else
10656         gcc_unreachable ();
10657       break;
10658     case UNORDERED:
10659       suffix = fp ? "u" : "p";
10660       break;
10661     case ORDERED:
10662       suffix = fp ? "nu" : "np";
10663       break;
10664     default:
10665       gcc_unreachable ();
10666     }
10667   fputs (suffix, file);
10668 }
10669
10670 /* Print the name of register X to FILE based on its machine mode and number.
10671    If CODE is 'w', pretend the mode is HImode.
10672    If CODE is 'b', pretend the mode is QImode.
10673    If CODE is 'k', pretend the mode is SImode.
10674    If CODE is 'q', pretend the mode is DImode.
10675    If CODE is 'x', pretend the mode is V4SFmode.
10676    If CODE is 't', pretend the mode is V8SFmode.
10677    If CODE is 'h', pretend the reg is the 'high' byte register.
10678    If CODE is 'y', print "st(0)" instead of "st", if the reg is stack op.
10679    If CODE is 'd', duplicate the operand for AVX instruction.
10680  */
10681
10682 void
10683 print_reg (rtx x, int code, FILE *file)
10684 {
10685   const char *reg;
10686   bool duplicated = code == 'd' && TARGET_AVX;
10687
10688   gcc_assert (x == pc_rtx
10689               || (REGNO (x) != ARG_POINTER_REGNUM
10690                   && REGNO (x) != FRAME_POINTER_REGNUM
10691                   && REGNO (x) != FLAGS_REG
10692                   && REGNO (x) != FPSR_REG
10693                   && REGNO (x) != FPCR_REG));
10694
10695   if (ASSEMBLER_DIALECT == ASM_ATT)
10696     putc ('%', file);
10697
10698   if (x == pc_rtx)
10699     {
10700       gcc_assert (TARGET_64BIT);
10701       fputs ("rip", file);
10702       return;
10703     }
10704
10705   if (code == 'w' || MMX_REG_P (x))
10706     code = 2;
10707   else if (code == 'b')
10708     code = 1;
10709   else if (code == 'k')
10710     code = 4;
10711   else if (code == 'q')
10712     code = 8;
10713   else if (code == 'y')
10714     code = 3;
10715   else if (code == 'h')
10716     code = 0;
10717   else if (code == 'x')
10718     code = 16;
10719   else if (code == 't')
10720     code = 32;
10721   else
10722     code = GET_MODE_SIZE (GET_MODE (x));
10723
10724   /* Irritatingly, AMD extended registers use different naming convention
10725      from the normal registers.  */
10726   if (REX_INT_REG_P (x))
10727     {
10728       gcc_assert (TARGET_64BIT);
10729       switch (code)
10730         {
10731           case 0:
10732             error ("extended registers have no high halves");
10733             break;
10734           case 1:
10735             fprintf (file, "r%ib", REGNO (x) - FIRST_REX_INT_REG + 8);
10736             break;
10737           case 2:
10738             fprintf (file, "r%iw", REGNO (x) - FIRST_REX_INT_REG + 8);
10739             break;
10740           case 4:
10741             fprintf (file, "r%id", REGNO (x) - FIRST_REX_INT_REG + 8);
10742             break;
10743           case 8:
10744             fprintf (file, "r%i", REGNO (x) - FIRST_REX_INT_REG + 8);
10745             break;
10746           default:
10747             error ("unsupported operand size for extended register");
10748             break;
10749         }
10750       return;
10751     }
10752
10753   reg = NULL;
10754   switch (code)
10755     {
10756     case 3:
10757       if (STACK_TOP_P (x))
10758         {
10759           reg = "st(0)";
10760           break;
10761         }
10762       /* FALLTHRU */
10763     case 8:
10764     case 4:
10765     case 12:
10766       if (! ANY_FP_REG_P (x))
10767         putc (code == 8 && TARGET_64BIT ? 'r' : 'e', file);
10768       /* FALLTHRU */
10769     case 16:
10770     case 2:
10771     normal:
10772       reg = hi_reg_name[REGNO (x)];
10773       break;
10774     case 1:
10775       if (REGNO (x) >= ARRAY_SIZE (qi_reg_name))
10776         goto normal;
10777       reg = qi_reg_name[REGNO (x)];
10778       break;
10779     case 0:
10780       if (REGNO (x) >= ARRAY_SIZE (qi_high_reg_name))
10781         goto normal;
10782       reg = qi_high_reg_name[REGNO (x)];
10783       break;
10784     case 32:
10785       if (SSE_REG_P (x))
10786         {
10787           gcc_assert (!duplicated);
10788           putc ('y', file);
10789           fputs (hi_reg_name[REGNO (x)] + 1, file);
10790           return;
10791         }
10792       break;
10793     default:
10794       gcc_unreachable ();
10795     }
10796
10797   fputs (reg, file);
10798   if (duplicated)
10799     {
10800       if (ASSEMBLER_DIALECT == ASM_ATT)
10801         fprintf (file, ", %%%s", reg);
10802       else
10803         fprintf (file, ", %s", reg);
10804     }
10805 }
10806
10807 /* Locate some local-dynamic symbol still in use by this function
10808    so that we can print its name in some tls_local_dynamic_base
10809    pattern.  */
10810
10811 static int
10812 get_some_local_dynamic_name_1 (rtx *px, void *data ATTRIBUTE_UNUSED)
10813 {
10814   rtx x = *px;
10815
10816   if (GET_CODE (x) == SYMBOL_REF
10817       && SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_DYNAMIC)
10818     {
10819       cfun->machine->some_ld_name = XSTR (x, 0);
10820       return 1;
10821     }
10822
10823   return 0;
10824 }
10825
10826 static const char *
10827 get_some_local_dynamic_name (void)
10828 {
10829   rtx insn;
10830
10831   if (cfun->machine->some_ld_name)
10832     return cfun->machine->some_ld_name;
10833
10834   for (insn = get_insns (); insn ; insn = NEXT_INSN (insn))
10835     if (INSN_P (insn)
10836         && for_each_rtx (&PATTERN (insn), get_some_local_dynamic_name_1, 0))
10837       return cfun->machine->some_ld_name;
10838
10839   gcc_unreachable ();
10840 }
10841
10842 /* Meaning of CODE:
10843    L,W,B,Q,S,T -- print the opcode suffix for specified size of operand.
10844    C -- print opcode suffix for set/cmov insn.
10845    c -- like C, but print reversed condition
10846    E,e -- likewise, but for compare-and-branch fused insn.
10847    F,f -- likewise, but for floating-point.
10848    O -- if HAVE_AS_IX86_CMOV_SUN_SYNTAX, expand to "w.", "l." or "q.",
10849         otherwise nothing
10850    R -- print the prefix for register names.
10851    z -- print the opcode suffix for the size of the current operand.
10852    Z -- likewise, with special suffixes for x87 instructions.
10853    * -- print a star (in certain assembler syntax)
10854    A -- print an absolute memory reference.
10855    w -- print the operand as if it's a "word" (HImode) even if it isn't.
10856    s -- print a shift double count, followed by the assemblers argument
10857         delimiter.
10858    b -- print the QImode name of the register for the indicated operand.
10859         %b0 would print %al if operands[0] is reg 0.
10860    w --  likewise, print the HImode name of the register.
10861    k --  likewise, print the SImode name of the register.
10862    q --  likewise, print the DImode name of the register.
10863    x --  likewise, print the V4SFmode name of the register.
10864    t --  likewise, print the V8SFmode name of the register.
10865    h -- print the QImode name for a "high" register, either ah, bh, ch or dh.
10866    y -- print "st(0)" instead of "st" as a register.
10867    d -- print duplicated register operand for AVX instruction.
10868    D -- print condition for SSE cmp instruction.
10869    P -- if PIC, print an @PLT suffix.
10870    X -- don't print any sort of PIC '@' suffix for a symbol.
10871    & -- print some in-use local-dynamic symbol name.
10872    H -- print a memory address offset by 8; used for sse high-parts
10873    Y -- print condition for SSE5 com* instruction.
10874    + -- print a branch hint as 'cs' or 'ds' prefix
10875    ; -- print a semicolon (after prefixes due to bug in older gas).
10876  */
10877
10878 void
10879 print_operand (FILE *file, rtx x, int code)
10880 {
10881   if (code)
10882     {
10883       switch (code)
10884         {
10885         case '*':
10886           if (ASSEMBLER_DIALECT == ASM_ATT)
10887             putc ('*', file);
10888           return;
10889
10890         case '&':
10891           assemble_name (file, get_some_local_dynamic_name ());
10892           return;
10893
10894         case 'A':
10895           switch (ASSEMBLER_DIALECT)
10896             {
10897             case ASM_ATT:
10898               putc ('*', file);
10899               break;
10900
10901             case ASM_INTEL:
10902               /* Intel syntax. For absolute addresses, registers should not
10903                  be surrounded by braces.  */
10904               if (!REG_P (x))
10905                 {
10906                   putc ('[', file);
10907                   PRINT_OPERAND (file, x, 0);
10908                   putc (']', file);
10909                   return;
10910                 }
10911               break;
10912
10913             default:
10914               gcc_unreachable ();
10915             }
10916
10917           PRINT_OPERAND (file, x, 0);
10918           return;
10919
10920
10921         case 'L':
10922           if (ASSEMBLER_DIALECT == ASM_ATT)
10923             putc ('l', file);
10924           return;
10925
10926         case 'W':
10927           if (ASSEMBLER_DIALECT == ASM_ATT)
10928             putc ('w', file);
10929           return;
10930
10931         case 'B':
10932           if (ASSEMBLER_DIALECT == ASM_ATT)
10933             putc ('b', file);
10934           return;
10935
10936         case 'Q':
10937           if (ASSEMBLER_DIALECT == ASM_ATT)
10938             putc ('l', file);
10939           return;
10940
10941         case 'S':
10942           if (ASSEMBLER_DIALECT == ASM_ATT)
10943             putc ('s', file);
10944           return;
10945
10946         case 'T':
10947           if (ASSEMBLER_DIALECT == ASM_ATT)
10948             putc ('t', file);
10949           return;
10950
10951         case 'z':
10952           if (GET_MODE_CLASS (GET_MODE (x)) == MODE_INT)
10953             {
10954               /* Opcodes don't get size suffixes if using Intel opcodes.  */
10955               if (ASSEMBLER_DIALECT == ASM_INTEL)
10956                 return;
10957
10958               switch (GET_MODE_SIZE (GET_MODE (x)))
10959                 {
10960                 case 1:
10961                   putc ('b', file);
10962                   return;
10963
10964                 case 2:
10965                   putc ('w', file);
10966                   return;
10967
10968                 case 4:
10969                   putc ('l', file);
10970                   return;
10971
10972                 case 8:
10973                   putc ('q', file);
10974                   return;
10975
10976                 default:
10977                   output_operand_lossage
10978                     ("invalid operand size for operand code '%c'", code);
10979                   return;
10980                 }
10981             }
10982
10983           if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
10984             warning
10985               (0, "non-integer operand used with operand code '%c'", code);
10986           /* FALLTHRU */
10987
10988         case 'Z':
10989           /* 387 opcodes don't get size suffixes if using Intel opcodes.  */
10990           if (ASSEMBLER_DIALECT == ASM_INTEL)
10991             return;
10992
10993           if (GET_MODE_CLASS (GET_MODE (x)) == MODE_INT)
10994             {
10995               switch (GET_MODE_SIZE (GET_MODE (x)))
10996                 {
10997                 case 2:
10998 #ifdef HAVE_AS_IX86_FILDS
10999                   putc ('s', file);
11000 #endif
11001                   return;
11002
11003                 case 4:
11004                   putc ('l', file);
11005                   return;
11006
11007                 case 8:
11008 #ifdef HAVE_AS_IX86_FILDQ
11009                   putc ('q', file);
11010 #else
11011                   fputs ("ll", file);
11012 #endif
11013                   return;
11014
11015                 default:
11016                   break;
11017                 }
11018             }
11019           else if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
11020             {
11021               /* 387 opcodes don't get size suffixes
11022                  if the operands are registers.  */
11023               if (STACK_REG_P (x))
11024                 return;
11025
11026               switch (GET_MODE_SIZE (GET_MODE (x)))
11027                 {
11028                 case 4:
11029                   putc ('s', file);
11030                   return;
11031
11032                 case 8:
11033                   putc ('l', file);
11034                   return;
11035
11036                 case 12:
11037                 case 16:
11038                   putc ('t', file);
11039                   return;
11040
11041                 default:
11042                   break;
11043                 }
11044             }
11045           else
11046             {
11047               output_operand_lossage
11048                 ("invalid operand type used with operand code '%c'", code);
11049               return;
11050             }
11051
11052           output_operand_lossage
11053             ("invalid operand size for operand code '%c'", code);
11054           return;
11055             
11056         case 'd':
11057         case 'b':
11058         case 'w':
11059         case 'k':
11060         case 'q':
11061         case 'h':
11062         case 't':
11063         case 'y':
11064         case 'x':
11065         case 'X':
11066         case 'P':
11067           break;
11068
11069         case 's':
11070           if (CONST_INT_P (x) || ! SHIFT_DOUBLE_OMITS_COUNT)
11071             {
11072               PRINT_OPERAND (file, x, 0);
11073               fputs (", ", file);
11074             }
11075           return;
11076
11077         case 'D':
11078           /* Little bit of braindamage here.  The SSE compare instructions
11079              does use completely different names for the comparisons that the
11080              fp conditional moves.  */
11081           if (TARGET_AVX)
11082             {
11083               switch (GET_CODE (x))
11084                 {
11085                 case EQ:
11086                   fputs ("eq", file);
11087                   break;
11088                 case UNEQ:
11089                   fputs ("eq_us", file);
11090                   break;
11091                 case LT:
11092                   fputs ("lt", file);
11093                   break;
11094                 case UNLT:
11095                   fputs ("nge", file);
11096                   break;
11097                 case LE:
11098                   fputs ("le", file);
11099                   break;
11100                 case UNLE:
11101                   fputs ("ngt", file);
11102                   break;
11103                 case UNORDERED:
11104                   fputs ("unord", file);
11105                   break;
11106                 case NE:
11107                   fputs ("neq", file);
11108                   break;
11109                 case LTGT:
11110                   fputs ("neq_oq", file);
11111                   break;
11112                 case GE:
11113                   fputs ("ge", file);
11114                   break;
11115                 case UNGE:
11116                   fputs ("nlt", file);
11117                   break;
11118                 case GT:
11119                   fputs ("gt", file);
11120                   break;
11121                 case UNGT:
11122                   fputs ("nle", file);
11123                   break;
11124                 case ORDERED:
11125                   fputs ("ord", file);
11126                   break;
11127                 default:
11128                   output_operand_lossage ("operand is not a condition code, invalid operand code 'D'");
11129                   return;
11130                 }
11131             }
11132           else
11133             {
11134               switch (GET_CODE (x))
11135                 {
11136                 case EQ:
11137                 case UNEQ:
11138                   fputs ("eq", file);
11139                   break;
11140                 case LT:
11141                 case UNLT:
11142                   fputs ("lt", file);
11143                   break;
11144                 case LE:
11145                 case UNLE:
11146                   fputs ("le", file);
11147                   break;
11148                 case UNORDERED:
11149                   fputs ("unord", file);
11150                   break;
11151                 case NE:
11152                 case LTGT:
11153                   fputs ("neq", file);
11154                   break;
11155                 case UNGE:
11156                 case GE:
11157                   fputs ("nlt", file);
11158                   break;
11159                 case UNGT:
11160                 case GT:
11161                   fputs ("nle", file);
11162                   break;
11163                 case ORDERED:
11164                   fputs ("ord", file);
11165                   break;
11166                 default:
11167                   output_operand_lossage ("operand is not a condition code, invalid operand code 'D'");
11168                   return;
11169                 }
11170             }
11171           return;
11172         case 'O':
11173 #ifdef HAVE_AS_IX86_CMOV_SUN_SYNTAX
11174           if (ASSEMBLER_DIALECT == ASM_ATT)
11175             {
11176               switch (GET_MODE (x))
11177                 {
11178                 case HImode: putc ('w', file); break;
11179                 case SImode:
11180                 case SFmode: putc ('l', file); break;
11181                 case DImode:
11182                 case DFmode: putc ('q', file); break;
11183                 default: gcc_unreachable ();
11184                 }
11185               putc ('.', file);
11186             }
11187 #endif
11188           return;
11189         case 'C':
11190           if (!COMPARISON_P (x))
11191             {
11192               output_operand_lossage ("operand is neither a constant nor a "
11193                                       "condition code, invalid operand code "
11194                                       "'C'");
11195               return;
11196             }
11197           put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 0, 0, file);
11198           return;
11199         case 'F':
11200           if (!COMPARISON_P (x))
11201             {
11202               output_operand_lossage ("operand is neither a constant nor a "
11203                                       "condition code, invalid operand code "
11204                                       "'F'");
11205               return;
11206             }
11207 #ifdef HAVE_AS_IX86_CMOV_SUN_SYNTAX
11208           if (ASSEMBLER_DIALECT == ASM_ATT)
11209             putc ('.', file);
11210 #endif
11211           put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 0, 1, file);
11212           return;
11213
11214           /* Like above, but reverse condition */
11215         case 'c':
11216           /* Check to see if argument to %c is really a constant
11217              and not a condition code which needs to be reversed.  */
11218           if (!COMPARISON_P (x))
11219             {
11220               output_operand_lossage ("operand is neither a constant nor a "
11221                                       "condition code, invalid operand "
11222                                       "code 'c'");
11223               return;
11224             }
11225           put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 1, 0, file);
11226           return;
11227         case 'f':
11228           if (!COMPARISON_P (x))
11229             {
11230               output_operand_lossage ("operand is neither a constant nor a "
11231                                       "condition code, invalid operand "
11232                                       "code 'f'");
11233               return;
11234             }
11235 #ifdef HAVE_AS_IX86_CMOV_SUN_SYNTAX
11236           if (ASSEMBLER_DIALECT == ASM_ATT)
11237             putc ('.', file);
11238 #endif
11239           put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 1, 1, file);
11240           return;
11241
11242         case 'E':
11243           put_condition_code (GET_CODE (x), CCmode, 0, 0, file);
11244           return;
11245
11246         case 'e':
11247           put_condition_code (GET_CODE (x), CCmode, 1, 0, file);
11248           return;
11249
11250         case 'H':
11251           /* It doesn't actually matter what mode we use here, as we're
11252              only going to use this for printing.  */
11253           x = adjust_address_nv (x, DImode, 8);
11254           break;
11255
11256         case '+':
11257           {
11258             rtx x;
11259
11260             if (!optimize
11261                 || optimize_function_for_size_p (cfun) || !TARGET_BRANCH_PREDICTION_HINTS)
11262               return;
11263
11264             x = find_reg_note (current_output_insn, REG_BR_PROB, 0);
11265             if (x)
11266               {
11267                 int pred_val = INTVAL (XEXP (x, 0));
11268
11269                 if (pred_val < REG_BR_PROB_BASE * 45 / 100
11270                     || pred_val > REG_BR_PROB_BASE * 55 / 100)
11271                   {
11272                     int taken = pred_val > REG_BR_PROB_BASE / 2;
11273                     int cputaken = final_forward_branch_p (current_output_insn) == 0;
11274
11275                     /* Emit hints only in the case default branch prediction
11276                        heuristics would fail.  */
11277                     if (taken != cputaken)
11278                       {
11279                         /* We use 3e (DS) prefix for taken branches and
11280                            2e (CS) prefix for not taken branches.  */
11281                         if (taken)
11282                           fputs ("ds ; ", file);
11283                         else
11284                           fputs ("cs ; ", file);
11285                       }
11286                   }
11287               }
11288             return;
11289           }
11290
11291         case 'Y':
11292           switch (GET_CODE (x))
11293             {
11294             case NE:
11295               fputs ("neq", file);
11296               break;
11297             case EQ:
11298               fputs ("eq", file);
11299               break;
11300             case GE:
11301             case GEU:
11302               fputs (INTEGRAL_MODE_P (GET_MODE (x)) ? "ge" : "unlt", file);
11303               break;
11304             case GT:
11305             case GTU:
11306               fputs (INTEGRAL_MODE_P (GET_MODE (x)) ? "gt" : "unle", file);
11307               break;
11308             case LE:
11309             case LEU:
11310               fputs ("le", file);
11311               break;
11312             case LT:
11313             case LTU:
11314               fputs ("lt", file);
11315               break;
11316             case UNORDERED:
11317               fputs ("unord", file);
11318               break;
11319             case ORDERED:
11320               fputs ("ord", file);
11321               break;
11322             case UNEQ:
11323               fputs ("ueq", file);
11324               break;
11325             case UNGE:
11326               fputs ("nlt", file);
11327               break;
11328             case UNGT:
11329               fputs ("nle", file);
11330               break;
11331             case UNLE:
11332               fputs ("ule", file);
11333               break;
11334             case UNLT:
11335               fputs ("ult", file);
11336               break;
11337             case LTGT:
11338               fputs ("une", file);
11339               break;
11340             default:
11341               output_operand_lossage ("operand is not a condition code, invalid operand code 'D'");
11342               return;
11343             }
11344           return;
11345
11346         case ';':
11347 #if TARGET_MACHO
11348           fputs (" ; ", file);
11349 #else
11350           fputc (' ', file);
11351 #endif
11352           return;
11353
11354         default:
11355             output_operand_lossage ("invalid operand code '%c'", code);
11356         }
11357     }
11358
11359   if (REG_P (x))
11360     print_reg (x, code, file);
11361
11362   else if (MEM_P (x))
11363     {
11364       /* No `byte ptr' prefix for call instructions or BLKmode operands.  */
11365       if (ASSEMBLER_DIALECT == ASM_INTEL && code != 'X' && code != 'P'
11366           && GET_MODE (x) != BLKmode)
11367         {
11368           const char * size;
11369           switch (GET_MODE_SIZE (GET_MODE (x)))
11370             {
11371             case 1: size = "BYTE"; break;
11372             case 2: size = "WORD"; break;
11373             case 4: size = "DWORD"; break;
11374             case 8: size = "QWORD"; break;
11375             case 12: size = "XWORD"; break;
11376             case 16:
11377               if (GET_MODE (x) == XFmode)
11378                 size = "XWORD";
11379               else
11380                 size = "XMMWORD";
11381               break;
11382             default:
11383               gcc_unreachable ();
11384             }
11385
11386           /* Check for explicit size override (codes 'b', 'w' and 'k')  */
11387           if (code == 'b')
11388             size = "BYTE";
11389           else if (code == 'w')
11390             size = "WORD";
11391           else if (code == 'k')
11392             size = "DWORD";
11393
11394           fputs (size, file);
11395           fputs (" PTR ", file);
11396         }
11397
11398       x = XEXP (x, 0);
11399       /* Avoid (%rip) for call operands.  */
11400       if (CONSTANT_ADDRESS_P (x) && code == 'P'
11401           && !CONST_INT_P (x))
11402         output_addr_const (file, x);
11403       else if (this_is_asm_operands && ! address_operand (x, VOIDmode))
11404         output_operand_lossage ("invalid constraints for operand");
11405       else
11406         output_address (x);
11407     }
11408
11409   else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == SFmode)
11410     {
11411       REAL_VALUE_TYPE r;
11412       long l;
11413
11414       REAL_VALUE_FROM_CONST_DOUBLE (r, x);
11415       REAL_VALUE_TO_TARGET_SINGLE (r, l);
11416
11417       if (ASSEMBLER_DIALECT == ASM_ATT)
11418         putc ('$', file);
11419       fprintf (file, "0x%08lx", (long unsigned int) l);
11420     }
11421
11422   /* These float cases don't actually occur as immediate operands.  */
11423   else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == DFmode)
11424     {
11425       char dstr[30];
11426
11427       real_to_decimal (dstr, CONST_DOUBLE_REAL_VALUE (x), sizeof (dstr), 0, 1);
11428       fprintf (file, "%s", dstr);
11429     }
11430
11431   else if (GET_CODE (x) == CONST_DOUBLE
11432            && GET_MODE (x) == XFmode)
11433     {
11434       char dstr[30];
11435
11436       real_to_decimal (dstr, CONST_DOUBLE_REAL_VALUE (x), sizeof (dstr), 0, 1);
11437       fprintf (file, "%s", dstr);
11438     }
11439
11440   else
11441     {
11442       /* We have patterns that allow zero sets of memory, for instance.
11443          In 64-bit mode, we should probably support all 8-byte vectors,
11444          since we can in fact encode that into an immediate.  */
11445       if (GET_CODE (x) == CONST_VECTOR)
11446         {
11447           gcc_assert (x == CONST0_RTX (GET_MODE (x)));
11448           x = const0_rtx;
11449         }
11450
11451       if (code != 'P')
11452         {
11453           if (CONST_INT_P (x) || GET_CODE (x) == CONST_DOUBLE)
11454             {
11455               if (ASSEMBLER_DIALECT == ASM_ATT)
11456                 putc ('$', file);
11457             }
11458           else if (GET_CODE (x) == CONST || GET_CODE (x) == SYMBOL_REF
11459                    || GET_CODE (x) == LABEL_REF)
11460             {
11461               if (ASSEMBLER_DIALECT == ASM_ATT)
11462                 putc ('$', file);
11463               else
11464                 fputs ("OFFSET FLAT:", file);
11465             }
11466         }
11467       if (CONST_INT_P (x))
11468         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (x));
11469       else if (flag_pic)
11470         output_pic_addr_const (file, x, code);
11471       else
11472         output_addr_const (file, x);
11473     }
11474 }
11475 \f
11476 /* Print a memory operand whose address is ADDR.  */
11477
11478 void
11479 print_operand_address (FILE *file, rtx addr)
11480 {
11481   struct ix86_address parts;
11482   rtx base, index, disp;
11483   int scale;
11484   int ok = ix86_decompose_address (addr, &parts);
11485
11486   gcc_assert (ok);
11487
11488   base = parts.base;
11489   index = parts.index;
11490   disp = parts.disp;
11491   scale = parts.scale;
11492
11493   switch (parts.seg)
11494     {
11495     case SEG_DEFAULT:
11496       break;
11497     case SEG_FS:
11498     case SEG_GS:
11499       if (ASSEMBLER_DIALECT == ASM_ATT)
11500         putc ('%', file);
11501       fputs ((parts.seg == SEG_FS ? "fs:" : "gs:"), file);
11502       break;
11503     default:
11504       gcc_unreachable ();
11505     }
11506
11507   /* Use one byte shorter RIP relative addressing for 64bit mode.  */
11508   if (TARGET_64BIT && !base && !index)
11509     {
11510       rtx symbol = disp;
11511
11512       if (GET_CODE (disp) == CONST
11513           && GET_CODE (XEXP (disp, 0)) == PLUS
11514           && CONST_INT_P (XEXP (XEXP (disp, 0), 1)))
11515         symbol = XEXP (XEXP (disp, 0), 0);
11516
11517       if (GET_CODE (symbol) == LABEL_REF
11518           || (GET_CODE (symbol) == SYMBOL_REF
11519               && SYMBOL_REF_TLS_MODEL (symbol) == 0))
11520         base = pc_rtx;
11521     }
11522   if (!base && !index)
11523     {
11524       /* Displacement only requires special attention.  */
11525
11526       if (CONST_INT_P (disp))
11527         {
11528           if (ASSEMBLER_DIALECT == ASM_INTEL && parts.seg == SEG_DEFAULT)
11529             fputs ("ds:", file);
11530           fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (disp));
11531         }
11532       else if (flag_pic)
11533         output_pic_addr_const (file, disp, 0);
11534       else
11535         output_addr_const (file, disp);
11536     }
11537   else
11538     {
11539       if (ASSEMBLER_DIALECT == ASM_ATT)
11540         {
11541           if (disp)
11542             {
11543               if (flag_pic)
11544                 output_pic_addr_const (file, disp, 0);
11545               else if (GET_CODE (disp) == LABEL_REF)
11546                 output_asm_label (disp);
11547               else
11548                 output_addr_const (file, disp);
11549             }
11550
11551           putc ('(', file);
11552           if (base)
11553             print_reg (base, 0, file);
11554           if (index)
11555             {
11556               putc (',', file);
11557               print_reg (index, 0, file);
11558               if (scale != 1)
11559                 fprintf (file, ",%d", scale);
11560             }
11561           putc (')', file);
11562         }
11563       else
11564         {
11565           rtx offset = NULL_RTX;
11566
11567           if (disp)
11568             {
11569               /* Pull out the offset of a symbol; print any symbol itself.  */
11570               if (GET_CODE (disp) == CONST
11571                   && GET_CODE (XEXP (disp, 0)) == PLUS
11572                   && CONST_INT_P (XEXP (XEXP (disp, 0), 1)))
11573                 {
11574                   offset = XEXP (XEXP (disp, 0), 1);
11575                   disp = gen_rtx_CONST (VOIDmode,
11576                                         XEXP (XEXP (disp, 0), 0));
11577                 }
11578
11579               if (flag_pic)
11580                 output_pic_addr_const (file, disp, 0);
11581               else if (GET_CODE (disp) == LABEL_REF)
11582                 output_asm_label (disp);
11583               else if (CONST_INT_P (disp))
11584                 offset = disp;
11585               else
11586                 output_addr_const (file, disp);
11587             }
11588
11589           putc ('[', file);
11590           if (base)
11591             {
11592               print_reg (base, 0, file);
11593               if (offset)
11594                 {
11595                   if (INTVAL (offset) >= 0)
11596                     putc ('+', file);
11597                   fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (offset));
11598                 }
11599             }
11600           else if (offset)
11601             fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (offset));
11602           else
11603             putc ('0', file);
11604
11605           if (index)
11606             {
11607               putc ('+', file);
11608               print_reg (index, 0, file);
11609               if (scale != 1)
11610                 fprintf (file, "*%d", scale);
11611             }
11612           putc (']', file);
11613         }
11614     }
11615 }
11616
11617 bool
11618 output_addr_const_extra (FILE *file, rtx x)
11619 {
11620   rtx op;
11621
11622   if (GET_CODE (x) != UNSPEC)
11623     return false;
11624
11625   op = XVECEXP (x, 0, 0);
11626   switch (XINT (x, 1))
11627     {
11628     case UNSPEC_GOTTPOFF:
11629       output_addr_const (file, op);
11630       /* FIXME: This might be @TPOFF in Sun ld.  */
11631       fputs ("@GOTTPOFF", file);
11632       break;
11633     case UNSPEC_TPOFF:
11634       output_addr_const (file, op);
11635       fputs ("@TPOFF", file);
11636       break;
11637     case UNSPEC_NTPOFF:
11638       output_addr_const (file, op);
11639       if (TARGET_64BIT)
11640         fputs ("@TPOFF", file);
11641       else
11642         fputs ("@NTPOFF", file);
11643       break;
11644     case UNSPEC_DTPOFF:
11645       output_addr_const (file, op);
11646       fputs ("@DTPOFF", file);
11647       break;
11648     case UNSPEC_GOTNTPOFF:
11649       output_addr_const (file, op);
11650       if (TARGET_64BIT)
11651         fputs (ASSEMBLER_DIALECT == ASM_ATT ?
11652                "@GOTTPOFF(%rip)" : "@GOTTPOFF[rip]", file);
11653       else
11654         fputs ("@GOTNTPOFF", file);
11655       break;
11656     case UNSPEC_INDNTPOFF:
11657       output_addr_const (file, op);
11658       fputs ("@INDNTPOFF", file);
11659       break;
11660 #if TARGET_MACHO
11661     case UNSPEC_MACHOPIC_OFFSET:
11662       output_addr_const (file, op);
11663       putc ('-', file);
11664       machopic_output_function_base_name (file);
11665       break;
11666 #endif
11667
11668     default:
11669       return false;
11670     }
11671
11672   return true;
11673 }
11674 \f
11675 /* Split one or more DImode RTL references into pairs of SImode
11676    references.  The RTL can be REG, offsettable MEM, integer constant, or
11677    CONST_DOUBLE.  "operands" is a pointer to an array of DImode RTL to
11678    split and "num" is its length.  lo_half and hi_half are output arrays
11679    that parallel "operands".  */
11680
11681 void
11682 split_di (rtx operands[], int num, rtx lo_half[], rtx hi_half[])
11683 {
11684   while (num--)
11685     {
11686       rtx op = operands[num];
11687
11688       /* simplify_subreg refuse to split volatile memory addresses,
11689          but we still have to handle it.  */
11690       if (MEM_P (op))
11691         {
11692           lo_half[num] = adjust_address (op, SImode, 0);
11693           hi_half[num] = adjust_address (op, SImode, 4);
11694         }
11695       else
11696         {
11697           lo_half[num] = simplify_gen_subreg (SImode, op,
11698                                               GET_MODE (op) == VOIDmode
11699                                               ? DImode : GET_MODE (op), 0);
11700           hi_half[num] = simplify_gen_subreg (SImode, op,
11701                                               GET_MODE (op) == VOIDmode
11702                                               ? DImode : GET_MODE (op), 4);
11703         }
11704     }
11705 }
11706 /* Split one or more TImode RTL references into pairs of DImode
11707    references.  The RTL can be REG, offsettable MEM, integer constant, or
11708    CONST_DOUBLE.  "operands" is a pointer to an array of DImode RTL to
11709    split and "num" is its length.  lo_half and hi_half are output arrays
11710    that parallel "operands".  */
11711
11712 void
11713 split_ti (rtx operands[], int num, rtx lo_half[], rtx hi_half[])
11714 {
11715   while (num--)
11716     {
11717       rtx op = operands[num];
11718
11719       /* simplify_subreg refuse to split volatile memory addresses, but we
11720          still have to handle it.  */
11721       if (MEM_P (op))
11722         {
11723           lo_half[num] = adjust_address (op, DImode, 0);
11724           hi_half[num] = adjust_address (op, DImode, 8);
11725         }
11726       else
11727         {
11728           lo_half[num] = simplify_gen_subreg (DImode, op, TImode, 0);
11729           hi_half[num] = simplify_gen_subreg (DImode, op, TImode, 8);
11730         }
11731     }
11732 }
11733 \f
11734 /* Output code to perform a 387 binary operation in INSN, one of PLUS,
11735    MINUS, MULT or DIV.  OPERANDS are the insn operands, where operands[3]
11736    is the expression of the binary operation.  The output may either be
11737    emitted here, or returned to the caller, like all output_* functions.
11738
11739    There is no guarantee that the operands are the same mode, as they
11740    might be within FLOAT or FLOAT_EXTEND expressions.  */
11741
11742 #ifndef SYSV386_COMPAT
11743 /* Set to 1 for compatibility with brain-damaged assemblers.  No-one
11744    wants to fix the assemblers because that causes incompatibility
11745    with gcc.  No-one wants to fix gcc because that causes
11746    incompatibility with assemblers...  You can use the option of
11747    -DSYSV386_COMPAT=0 if you recompile both gcc and gas this way.  */
11748 #define SYSV386_COMPAT 1
11749 #endif
11750
11751 const char *
11752 output_387_binary_op (rtx insn, rtx *operands)
11753 {
11754   static char buf[40];
11755   const char *p;
11756   const char *ssep;
11757   int is_sse = SSE_REG_P (operands[0]) || SSE_REG_P (operands[1]) || SSE_REG_P (operands[2]);
11758
11759 #ifdef ENABLE_CHECKING
11760   /* Even if we do not want to check the inputs, this documents input
11761      constraints.  Which helps in understanding the following code.  */
11762   if (STACK_REG_P (operands[0])
11763       && ((REG_P (operands[1])
11764            && REGNO (operands[0]) == REGNO (operands[1])
11765            && (STACK_REG_P (operands[2]) || MEM_P (operands[2])))
11766           || (REG_P (operands[2])
11767               && REGNO (operands[0]) == REGNO (operands[2])
11768               && (STACK_REG_P (operands[1]) || MEM_P (operands[1]))))
11769       && (STACK_TOP_P (operands[1]) || STACK_TOP_P (operands[2])))
11770     ; /* ok */
11771   else
11772     gcc_assert (is_sse);
11773 #endif
11774
11775   switch (GET_CODE (operands[3]))
11776     {
11777     case PLUS:
11778       if (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
11779           || GET_MODE_CLASS (GET_MODE (operands[2])) == MODE_INT)
11780         p = "fiadd";
11781       else
11782         p = "fadd";
11783       ssep = "vadd";
11784       break;
11785
11786     case MINUS:
11787       if (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
11788           || GET_MODE_CLASS (GET_MODE (operands[2])) == MODE_INT)
11789         p = "fisub";
11790       else
11791         p = "fsub";
11792       ssep = "vsub";
11793       break;
11794
11795     case MULT:
11796       if (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
11797           || GET_MODE_CLASS (GET_MODE (operands[2])) == MODE_INT)
11798         p = "fimul";
11799       else
11800         p = "fmul";
11801       ssep = "vmul";
11802       break;
11803
11804     case DIV:
11805       if (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
11806           || GET_MODE_CLASS (GET_MODE (operands[2])) == MODE_INT)
11807         p = "fidiv";
11808       else
11809         p = "fdiv";
11810       ssep = "vdiv";
11811       break;
11812
11813     default:
11814       gcc_unreachable ();
11815     }
11816
11817   if (is_sse)
11818    {
11819      if (TARGET_AVX)
11820        {
11821          strcpy (buf, ssep);
11822          if (GET_MODE (operands[0]) == SFmode)
11823            strcat (buf, "ss\t{%2, %1, %0|%0, %1, %2}");
11824          else
11825            strcat (buf, "sd\t{%2, %1, %0|%0, %1, %2}");
11826        }
11827      else
11828        {
11829          strcpy (buf, ssep + 1);
11830          if (GET_MODE (operands[0]) == SFmode)
11831            strcat (buf, "ss\t{%2, %0|%0, %2}");
11832          else
11833            strcat (buf, "sd\t{%2, %0|%0, %2}");
11834        }
11835       return buf;
11836    }
11837   strcpy (buf, p);
11838
11839   switch (GET_CODE (operands[3]))
11840     {
11841     case MULT:
11842     case PLUS:
11843       if (REG_P (operands[2]) && REGNO (operands[0]) == REGNO (operands[2]))
11844         {
11845           rtx temp = operands[2];
11846           operands[2] = operands[1];
11847           operands[1] = temp;
11848         }
11849
11850       /* know operands[0] == operands[1].  */
11851
11852       if (MEM_P (operands[2]))
11853         {
11854           p = "%Z2\t%2";
11855           break;
11856         }
11857
11858       if (find_regno_note (insn, REG_DEAD, REGNO (operands[2])))
11859         {
11860           if (STACK_TOP_P (operands[0]))
11861             /* How is it that we are storing to a dead operand[2]?
11862                Well, presumably operands[1] is dead too.  We can't
11863                store the result to st(0) as st(0) gets popped on this
11864                instruction.  Instead store to operands[2] (which I
11865                think has to be st(1)).  st(1) will be popped later.
11866                gcc <= 2.8.1 didn't have this check and generated
11867                assembly code that the Unixware assembler rejected.  */
11868             p = "p\t{%0, %2|%2, %0}";   /* st(1) = st(0) op st(1); pop */
11869           else
11870             p = "p\t{%2, %0|%0, %2}";   /* st(r1) = st(r1) op st(0); pop */
11871           break;
11872         }
11873
11874       if (STACK_TOP_P (operands[0]))
11875         p = "\t{%y2, %0|%0, %y2}";      /* st(0) = st(0) op st(r2) */
11876       else
11877         p = "\t{%2, %0|%0, %2}";        /* st(r1) = st(r1) op st(0) */
11878       break;
11879
11880     case MINUS:
11881     case DIV:
11882       if (MEM_P (operands[1]))
11883         {
11884           p = "r%Z1\t%1";
11885           break;
11886         }
11887
11888       if (MEM_P (operands[2]))
11889         {
11890           p = "%Z2\t%2";
11891           break;
11892         }
11893
11894       if (find_regno_note (insn, REG_DEAD, REGNO (operands[2])))
11895         {
11896 #if SYSV386_COMPAT
11897           /* The SystemV/386 SVR3.2 assembler, and probably all AT&T
11898              derived assemblers, confusingly reverse the direction of
11899              the operation for fsub{r} and fdiv{r} when the
11900              destination register is not st(0).  The Intel assembler
11901              doesn't have this brain damage.  Read !SYSV386_COMPAT to
11902              figure out what the hardware really does.  */
11903           if (STACK_TOP_P (operands[0]))
11904             p = "{p\t%0, %2|rp\t%2, %0}";
11905           else
11906             p = "{rp\t%2, %0|p\t%0, %2}";
11907 #else
11908           if (STACK_TOP_P (operands[0]))
11909             /* As above for fmul/fadd, we can't store to st(0).  */
11910             p = "rp\t{%0, %2|%2, %0}";  /* st(1) = st(0) op st(1); pop */
11911           else
11912             p = "p\t{%2, %0|%0, %2}";   /* st(r1) = st(r1) op st(0); pop */
11913 #endif
11914           break;
11915         }
11916
11917       if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
11918         {
11919 #if SYSV386_COMPAT
11920           if (STACK_TOP_P (operands[0]))
11921             p = "{rp\t%0, %1|p\t%1, %0}";
11922           else
11923             p = "{p\t%1, %0|rp\t%0, %1}";
11924 #else
11925           if (STACK_TOP_P (operands[0]))
11926             p = "p\t{%0, %1|%1, %0}";   /* st(1) = st(1) op st(0); pop */
11927           else
11928             p = "rp\t{%1, %0|%0, %1}";  /* st(r2) = st(0) op st(r2); pop */
11929 #endif
11930           break;
11931         }
11932
11933       if (STACK_TOP_P (operands[0]))
11934         {
11935           if (STACK_TOP_P (operands[1]))
11936             p = "\t{%y2, %0|%0, %y2}";  /* st(0) = st(0) op st(r2) */
11937           else
11938             p = "r\t{%y1, %0|%0, %y1}"; /* st(0) = st(r1) op st(0) */
11939           break;
11940         }
11941       else if (STACK_TOP_P (operands[1]))
11942         {
11943 #if SYSV386_COMPAT
11944           p = "{\t%1, %0|r\t%0, %1}";
11945 #else
11946           p = "r\t{%1, %0|%0, %1}";     /* st(r2) = st(0) op st(r2) */
11947 #endif
11948         }
11949       else
11950         {
11951 #if SYSV386_COMPAT
11952           p = "{r\t%2, %0|\t%0, %2}";
11953 #else
11954           p = "\t{%2, %0|%0, %2}";      /* st(r1) = st(r1) op st(0) */
11955 #endif
11956         }
11957       break;
11958
11959     default:
11960       gcc_unreachable ();
11961     }
11962
11963   strcat (buf, p);
11964   return buf;
11965 }
11966
11967 /* Return needed mode for entity in optimize_mode_switching pass.  */
11968
11969 int
11970 ix86_mode_needed (int entity, rtx insn)
11971 {
11972   enum attr_i387_cw mode;
11973
11974   /* The mode UNINITIALIZED is used to store control word after a
11975      function call or ASM pattern.  The mode ANY specify that function
11976      has no requirements on the control word and make no changes in the
11977      bits we are interested in.  */
11978
11979   if (CALL_P (insn)
11980       || (NONJUMP_INSN_P (insn)
11981           && (asm_noperands (PATTERN (insn)) >= 0
11982               || GET_CODE (PATTERN (insn)) == ASM_INPUT)))
11983     return I387_CW_UNINITIALIZED;
11984
11985   if (recog_memoized (insn) < 0)
11986     return I387_CW_ANY;
11987
11988   mode = get_attr_i387_cw (insn);
11989
11990   switch (entity)
11991     {
11992     case I387_TRUNC:
11993       if (mode == I387_CW_TRUNC)
11994         return mode;
11995       break;
11996
11997     case I387_FLOOR:
11998       if (mode == I387_CW_FLOOR)
11999         return mode;
12000       break;
12001
12002     case I387_CEIL:
12003       if (mode == I387_CW_CEIL)
12004         return mode;
12005       break;
12006
12007     case I387_MASK_PM:
12008       if (mode == I387_CW_MASK_PM)
12009         return mode;
12010       break;
12011
12012     default:
12013       gcc_unreachable ();
12014     }
12015
12016   return I387_CW_ANY;
12017 }
12018
12019 /* Output code to initialize control word copies used by trunc?f?i and
12020    rounding patterns.  CURRENT_MODE is set to current control word,
12021    while NEW_MODE is set to new control word.  */
12022
12023 void
12024 emit_i387_cw_initialization (int mode)
12025 {
12026   rtx stored_mode = assign_386_stack_local (HImode, SLOT_CW_STORED);
12027   rtx new_mode;
12028
12029   enum ix86_stack_slot slot;
12030
12031   rtx reg = gen_reg_rtx (HImode);
12032
12033   emit_insn (gen_x86_fnstcw_1 (stored_mode));
12034   emit_move_insn (reg, copy_rtx (stored_mode));
12035
12036   if (TARGET_64BIT || TARGET_PARTIAL_REG_STALL
12037       || optimize_function_for_size_p (cfun))
12038     {
12039       switch (mode)
12040         {
12041         case I387_CW_TRUNC:
12042           /* round toward zero (truncate) */
12043           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0c00)));
12044           slot = SLOT_CW_TRUNC;
12045           break;
12046
12047         case I387_CW_FLOOR:
12048           /* round down toward -oo */
12049           emit_insn (gen_andhi3 (reg, reg, GEN_INT (~0x0c00)));
12050           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0400)));
12051           slot = SLOT_CW_FLOOR;
12052           break;
12053
12054         case I387_CW_CEIL:
12055           /* round up toward +oo */
12056           emit_insn (gen_andhi3 (reg, reg, GEN_INT (~0x0c00)));
12057           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0800)));
12058           slot = SLOT_CW_CEIL;
12059           break;
12060
12061         case I387_CW_MASK_PM:
12062           /* mask precision exception for nearbyint() */
12063           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0020)));
12064           slot = SLOT_CW_MASK_PM;
12065           break;
12066
12067         default:
12068           gcc_unreachable ();
12069         }
12070     }
12071   else
12072     {
12073       switch (mode)
12074         {
12075         case I387_CW_TRUNC:
12076           /* round toward zero (truncate) */
12077           emit_insn (gen_movsi_insv_1 (reg, GEN_INT (0xc)));
12078           slot = SLOT_CW_TRUNC;
12079           break;
12080
12081         case I387_CW_FLOOR:
12082           /* round down toward -oo */
12083           emit_insn (gen_movsi_insv_1 (reg, GEN_INT (0x4)));
12084           slot = SLOT_CW_FLOOR;
12085           break;
12086
12087         case I387_CW_CEIL:
12088           /* round up toward +oo */
12089           emit_insn (gen_movsi_insv_1 (reg, GEN_INT (0x8)));
12090           slot = SLOT_CW_CEIL;
12091           break;
12092
12093         case I387_CW_MASK_PM:
12094           /* mask precision exception for nearbyint() */
12095           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0020)));
12096           slot = SLOT_CW_MASK_PM;
12097           break;
12098
12099         default:
12100           gcc_unreachable ();
12101         }
12102     }
12103
12104   gcc_assert (slot < MAX_386_STACK_LOCALS);
12105
12106   new_mode = assign_386_stack_local (HImode, slot);
12107   emit_move_insn (new_mode, reg);
12108 }
12109
12110 /* Output code for INSN to convert a float to a signed int.  OPERANDS
12111    are the insn operands.  The output may be [HSD]Imode and the input
12112    operand may be [SDX]Fmode.  */
12113
12114 const char *
12115 output_fix_trunc (rtx insn, rtx *operands, int fisttp)
12116 {
12117   int stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
12118   int dimode_p = GET_MODE (operands[0]) == DImode;
12119   int round_mode = get_attr_i387_cw (insn);
12120
12121   /* Jump through a hoop or two for DImode, since the hardware has no
12122      non-popping instruction.  We used to do this a different way, but
12123      that was somewhat fragile and broke with post-reload splitters.  */
12124   if ((dimode_p || fisttp) && !stack_top_dies)
12125     output_asm_insn ("fld\t%y1", operands);
12126
12127   gcc_assert (STACK_TOP_P (operands[1]));
12128   gcc_assert (MEM_P (operands[0]));
12129   gcc_assert (GET_MODE (operands[1]) != TFmode);
12130
12131   if (fisttp)
12132       output_asm_insn ("fisttp%Z0\t%0", operands);
12133   else
12134     {
12135       if (round_mode != I387_CW_ANY)
12136         output_asm_insn ("fldcw\t%3", operands);
12137       if (stack_top_dies || dimode_p)
12138         output_asm_insn ("fistp%Z0\t%0", operands);
12139       else
12140         output_asm_insn ("fist%Z0\t%0", operands);
12141       if (round_mode != I387_CW_ANY)
12142         output_asm_insn ("fldcw\t%2", operands);
12143     }
12144
12145   return "";
12146 }
12147
12148 /* Output code for x87 ffreep insn.  The OPNO argument, which may only
12149    have the values zero or one, indicates the ffreep insn's operand
12150    from the OPERANDS array.  */
12151
12152 static const char *
12153 output_387_ffreep (rtx *operands ATTRIBUTE_UNUSED, int opno)
12154 {
12155   if (TARGET_USE_FFREEP)
12156 #if HAVE_AS_IX86_FFREEP
12157     return opno ? "ffreep\t%y1" : "ffreep\t%y0";
12158 #else
12159     {
12160       static char retval[] = ".word\t0xc_df";
12161       int regno = REGNO (operands[opno]);
12162
12163       gcc_assert (FP_REGNO_P (regno));
12164
12165       retval[9] = '0' + (regno - FIRST_STACK_REG);
12166       return retval;
12167     }
12168 #endif
12169
12170   return opno ? "fstp\t%y1" : "fstp\t%y0";
12171 }
12172
12173
12174 /* Output code for INSN to compare OPERANDS.  EFLAGS_P is 1 when fcomi
12175    should be used.  UNORDERED_P is true when fucom should be used.  */
12176
12177 const char *
12178 output_fp_compare (rtx insn, rtx *operands, int eflags_p, int unordered_p)
12179 {
12180   int stack_top_dies;
12181   rtx cmp_op0, cmp_op1;
12182   int is_sse = SSE_REG_P (operands[0]) || SSE_REG_P (operands[1]);
12183
12184   if (eflags_p)
12185     {
12186       cmp_op0 = operands[0];
12187       cmp_op1 = operands[1];
12188     }
12189   else
12190     {
12191       cmp_op0 = operands[1];
12192       cmp_op1 = operands[2];
12193     }
12194
12195   if (is_sse)
12196     {
12197       static const char ucomiss[] = "vucomiss\t{%1, %0|%0, %1}";
12198       static const char ucomisd[] = "vucomisd\t{%1, %0|%0, %1}";
12199       static const char comiss[] = "vcomiss\t{%1, %0|%0, %1}";
12200       static const char comisd[] = "vcomisd\t{%1, %0|%0, %1}";
12201
12202       if (GET_MODE (operands[0]) == SFmode)
12203         if (unordered_p)
12204           return &ucomiss[TARGET_AVX ? 0 : 1];
12205         else
12206           return &comiss[TARGET_AVX ? 0 : 1];
12207       else
12208         if (unordered_p)
12209           return &ucomisd[TARGET_AVX ? 0 : 1];
12210         else
12211           return &comisd[TARGET_AVX ? 0 : 1];
12212     }
12213
12214   gcc_assert (STACK_TOP_P (cmp_op0));
12215
12216   stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
12217
12218   if (cmp_op1 == CONST0_RTX (GET_MODE (cmp_op1)))
12219     {
12220       if (stack_top_dies)
12221         {
12222           output_asm_insn ("ftst\n\tfnstsw\t%0", operands);
12223           return output_387_ffreep (operands, 1);
12224         }
12225       else
12226         return "ftst\n\tfnstsw\t%0";
12227     }
12228
12229   if (STACK_REG_P (cmp_op1)
12230       && stack_top_dies
12231       && find_regno_note (insn, REG_DEAD, REGNO (cmp_op1))
12232       && REGNO (cmp_op1) != FIRST_STACK_REG)
12233     {
12234       /* If both the top of the 387 stack dies, and the other operand
12235          is also a stack register that dies, then this must be a
12236          `fcompp' float compare */
12237
12238       if (eflags_p)
12239         {
12240           /* There is no double popping fcomi variant.  Fortunately,
12241              eflags is immune from the fstp's cc clobbering.  */
12242           if (unordered_p)
12243             output_asm_insn ("fucomip\t{%y1, %0|%0, %y1}", operands);
12244           else
12245             output_asm_insn ("fcomip\t{%y1, %0|%0, %y1}", operands);
12246           return output_387_ffreep (operands, 0);
12247         }
12248       else
12249         {
12250           if (unordered_p)
12251             return "fucompp\n\tfnstsw\t%0";
12252           else
12253             return "fcompp\n\tfnstsw\t%0";
12254         }
12255     }
12256   else
12257     {
12258       /* Encoded here as eflags_p | intmode | unordered_p | stack_top_dies.  */
12259
12260       static const char * const alt[16] =
12261       {
12262         "fcom%Z2\t%y2\n\tfnstsw\t%0",
12263         "fcomp%Z2\t%y2\n\tfnstsw\t%0",
12264         "fucom%Z2\t%y2\n\tfnstsw\t%0",
12265         "fucomp%Z2\t%y2\n\tfnstsw\t%0",
12266
12267         "ficom%Z2\t%y2\n\tfnstsw\t%0",
12268         "ficomp%Z2\t%y2\n\tfnstsw\t%0",
12269         NULL,
12270         NULL,
12271
12272         "fcomi\t{%y1, %0|%0, %y1}",
12273         "fcomip\t{%y1, %0|%0, %y1}",
12274         "fucomi\t{%y1, %0|%0, %y1}",
12275         "fucomip\t{%y1, %0|%0, %y1}",
12276
12277         NULL,
12278         NULL,
12279         NULL,
12280         NULL
12281       };
12282
12283       int mask;
12284       const char *ret;
12285
12286       mask  = eflags_p << 3;
12287       mask |= (GET_MODE_CLASS (GET_MODE (cmp_op1)) == MODE_INT) << 2;
12288       mask |= unordered_p << 1;
12289       mask |= stack_top_dies;
12290
12291       gcc_assert (mask < 16);
12292       ret = alt[mask];
12293       gcc_assert (ret);
12294
12295       return ret;
12296     }
12297 }
12298
12299 void
12300 ix86_output_addr_vec_elt (FILE *file, int value)
12301 {
12302   const char *directive = ASM_LONG;
12303
12304 #ifdef ASM_QUAD
12305   if (TARGET_64BIT)
12306     directive = ASM_QUAD;
12307 #else
12308   gcc_assert (!TARGET_64BIT);
12309 #endif
12310
12311   fprintf (file, "%s%s%d\n", directive, LPREFIX, value);
12312 }
12313
12314 void
12315 ix86_output_addr_diff_elt (FILE *file, int value, int rel)
12316 {
12317   const char *directive = ASM_LONG;
12318
12319 #ifdef ASM_QUAD
12320   if (TARGET_64BIT && CASE_VECTOR_MODE == DImode)
12321     directive = ASM_QUAD;
12322 #else
12323   gcc_assert (!TARGET_64BIT);
12324 #endif
12325   /* We can't use @GOTOFF for text labels on VxWorks; see gotoff_operand.  */
12326   if (TARGET_64BIT || TARGET_VXWORKS_RTP)
12327     fprintf (file, "%s%s%d-%s%d\n",
12328              directive, LPREFIX, value, LPREFIX, rel);
12329   else if (HAVE_AS_GOTOFF_IN_DATA)
12330     fprintf (file, "%s%s%d@GOTOFF\n", ASM_LONG, LPREFIX, value);
12331 #if TARGET_MACHO
12332   else if (TARGET_MACHO)
12333     {
12334       fprintf (file, "%s%s%d-", ASM_LONG, LPREFIX, value);
12335       machopic_output_function_base_name (file);
12336       fprintf(file, "\n");
12337     }
12338 #endif
12339   else
12340     asm_fprintf (file, "%s%U%s+[.-%s%d]\n",
12341                  ASM_LONG, GOT_SYMBOL_NAME, LPREFIX, value);
12342 }
12343 \f
12344 /* Generate either "mov $0, reg" or "xor reg, reg", as appropriate
12345    for the target.  */
12346
12347 void
12348 ix86_expand_clear (rtx dest)
12349 {
12350   rtx tmp;
12351
12352   /* We play register width games, which are only valid after reload.  */
12353   gcc_assert (reload_completed);
12354
12355   /* Avoid HImode and its attendant prefix byte.  */
12356   if (GET_MODE_SIZE (GET_MODE (dest)) < 4)
12357     dest = gen_rtx_REG (SImode, REGNO (dest));
12358   tmp = gen_rtx_SET (VOIDmode, dest, const0_rtx);
12359
12360   /* This predicate should match that for movsi_xor and movdi_xor_rex64.  */
12361   if (reload_completed && (!TARGET_USE_MOV0 || optimize_insn_for_speed_p ()))
12362     {
12363       rtx clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
12364       tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, tmp, clob));
12365     }
12366
12367   emit_insn (tmp);
12368 }
12369
12370 /* X is an unchanging MEM.  If it is a constant pool reference, return
12371    the constant pool rtx, else NULL.  */
12372
12373 rtx
12374 maybe_get_pool_constant (rtx x)
12375 {
12376   x = ix86_delegitimize_address (XEXP (x, 0));
12377
12378   if (GET_CODE (x) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (x))
12379     return get_pool_constant (x);
12380
12381   return NULL_RTX;
12382 }
12383
12384 void
12385 ix86_expand_move (enum machine_mode mode, rtx operands[])
12386 {
12387   rtx op0, op1;
12388   enum tls_model model;
12389
12390   op0 = operands[0];
12391   op1 = operands[1];
12392
12393   if (GET_CODE (op1) == SYMBOL_REF)
12394     {
12395       model = SYMBOL_REF_TLS_MODEL (op1);
12396       if (model)
12397         {
12398           op1 = legitimize_tls_address (op1, model, true);
12399           op1 = force_operand (op1, op0);
12400           if (op1 == op0)
12401             return;
12402         }
12403       else if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
12404                && SYMBOL_REF_DLLIMPORT_P (op1))
12405         op1 = legitimize_dllimport_symbol (op1, false);
12406     }
12407   else if (GET_CODE (op1) == CONST
12408            && GET_CODE (XEXP (op1, 0)) == PLUS
12409            && GET_CODE (XEXP (XEXP (op1, 0), 0)) == SYMBOL_REF)
12410     {
12411       rtx addend = XEXP (XEXP (op1, 0), 1);
12412       rtx symbol = XEXP (XEXP (op1, 0), 0);
12413       rtx tmp = NULL;
12414
12415       model = SYMBOL_REF_TLS_MODEL (symbol);
12416       if (model)
12417         tmp = legitimize_tls_address (symbol, model, true);
12418       else if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
12419                && SYMBOL_REF_DLLIMPORT_P (symbol))
12420         tmp = legitimize_dllimport_symbol (symbol, true);
12421
12422       if (tmp)
12423         {
12424           tmp = force_operand (tmp, NULL);
12425           tmp = expand_simple_binop (Pmode, PLUS, tmp, addend,
12426                                      op0, 1, OPTAB_DIRECT);
12427           if (tmp == op0)
12428             return;
12429         }
12430     }
12431
12432   if (flag_pic && mode == Pmode && symbolic_operand (op1, Pmode))
12433     {
12434       if (TARGET_MACHO && !TARGET_64BIT)
12435         {
12436 #if TARGET_MACHO
12437           if (MACHOPIC_PURE)
12438             {
12439               rtx temp = ((reload_in_progress
12440                            || ((op0 && REG_P (op0))
12441                                && mode == Pmode))
12442                           ? op0 : gen_reg_rtx (Pmode));
12443               op1 = machopic_indirect_data_reference (op1, temp);
12444               op1 = machopic_legitimize_pic_address (op1, mode,
12445                                                      temp == op1 ? 0 : temp);
12446             }
12447           else if (MACHOPIC_INDIRECT)
12448             op1 = machopic_indirect_data_reference (op1, 0);
12449           if (op0 == op1)
12450             return;
12451 #endif
12452         }
12453       else
12454         {
12455           if (MEM_P (op0))
12456             op1 = force_reg (Pmode, op1);
12457           else if (!TARGET_64BIT || !x86_64_movabs_operand (op1, Pmode))
12458             {
12459               rtx reg = !can_create_pseudo_p () ? op0 : NULL_RTX;
12460               op1 = legitimize_pic_address (op1, reg);
12461               if (op0 == op1)
12462                 return;
12463             }
12464         }
12465     }
12466   else
12467     {
12468       if (MEM_P (op0)
12469           && (PUSH_ROUNDING (GET_MODE_SIZE (mode)) != GET_MODE_SIZE (mode)
12470               || !push_operand (op0, mode))
12471           && MEM_P (op1))
12472         op1 = force_reg (mode, op1);
12473
12474       if (push_operand (op0, mode)
12475           && ! general_no_elim_operand (op1, mode))
12476         op1 = copy_to_mode_reg (mode, op1);
12477
12478       /* Force large constants in 64bit compilation into register
12479          to get them CSEed.  */
12480       if (can_create_pseudo_p ()
12481           && (mode == DImode) && TARGET_64BIT
12482           && immediate_operand (op1, mode)
12483           && !x86_64_zext_immediate_operand (op1, VOIDmode)
12484           && !register_operand (op0, mode)
12485           && optimize)
12486         op1 = copy_to_mode_reg (mode, op1);
12487
12488       if (can_create_pseudo_p ()
12489           && FLOAT_MODE_P (mode)
12490           && GET_CODE (op1) == CONST_DOUBLE)
12491         {
12492           /* If we are loading a floating point constant to a register,
12493              force the value to memory now, since we'll get better code
12494              out the back end.  */
12495
12496           op1 = validize_mem (force_const_mem (mode, op1));
12497           if (!register_operand (op0, mode))
12498             {
12499               rtx temp = gen_reg_rtx (mode);
12500               emit_insn (gen_rtx_SET (VOIDmode, temp, op1));
12501               emit_move_insn (op0, temp);
12502               return;
12503             }
12504         }
12505     }
12506
12507   emit_insn (gen_rtx_SET (VOIDmode, op0, op1));
12508 }
12509
12510 void
12511 ix86_expand_vector_move (enum machine_mode mode, rtx operands[])
12512 {
12513   rtx op0 = operands[0], op1 = operands[1];
12514   unsigned int align = GET_MODE_ALIGNMENT (mode);
12515
12516   /* Force constants other than zero into memory.  We do not know how
12517      the instructions used to build constants modify the upper 64 bits
12518      of the register, once we have that information we may be able
12519      to handle some of them more efficiently.  */
12520   if (can_create_pseudo_p ()
12521       && register_operand (op0, mode)
12522       && (CONSTANT_P (op1)
12523           || (GET_CODE (op1) == SUBREG
12524               && CONSTANT_P (SUBREG_REG (op1))))
12525       && standard_sse_constant_p (op1) <= 0)
12526     op1 = validize_mem (force_const_mem (mode, op1));
12527
12528   /* We need to check memory alignment for SSE mode since attribute
12529      can make operands unaligned.  */
12530   if (can_create_pseudo_p ()
12531       && SSE_REG_MODE_P (mode)
12532       && ((MEM_P (op0) && (MEM_ALIGN (op0) < align))
12533           || (MEM_P (op1) && (MEM_ALIGN (op1) < align))))
12534     {
12535       rtx tmp[2];
12536
12537       /* ix86_expand_vector_move_misalign() does not like constants ... */
12538       if (CONSTANT_P (op1)
12539           || (GET_CODE (op1) == SUBREG
12540               && CONSTANT_P (SUBREG_REG (op1))))
12541         op1 = validize_mem (force_const_mem (mode, op1));
12542
12543       /* ... nor both arguments in memory.  */
12544       if (!register_operand (op0, mode)
12545           && !register_operand (op1, mode))
12546         op1 = force_reg (mode, op1);
12547
12548       tmp[0] = op0; tmp[1] = op1;
12549       ix86_expand_vector_move_misalign (mode, tmp);
12550       return;
12551     }
12552
12553   /* Make operand1 a register if it isn't already.  */
12554   if (can_create_pseudo_p ()
12555       && !register_operand (op0, mode)
12556       && !register_operand (op1, mode))
12557     {
12558       emit_move_insn (op0, force_reg (GET_MODE (op0), op1));
12559       return;
12560     }
12561
12562   emit_insn (gen_rtx_SET (VOIDmode, op0, op1));
12563 }
12564
12565 /* Implement the movmisalign patterns for SSE.  Non-SSE modes go
12566    straight to ix86_expand_vector_move.  */
12567 /* Code generation for scalar reg-reg moves of single and double precision data:
12568      if (x86_sse_partial_reg_dependency == true | x86_sse_split_regs == true)
12569        movaps reg, reg
12570      else
12571        movss reg, reg
12572      if (x86_sse_partial_reg_dependency == true)
12573        movapd reg, reg
12574      else
12575        movsd reg, reg
12576
12577    Code generation for scalar loads of double precision data:
12578      if (x86_sse_split_regs == true)
12579        movlpd mem, reg      (gas syntax)
12580      else
12581        movsd mem, reg
12582
12583    Code generation for unaligned packed loads of single precision data
12584    (x86_sse_unaligned_move_optimal overrides x86_sse_partial_reg_dependency):
12585      if (x86_sse_unaligned_move_optimal)
12586        movups mem, reg
12587
12588      if (x86_sse_partial_reg_dependency == true)
12589        {
12590          xorps  reg, reg
12591          movlps mem, reg
12592          movhps mem+8, reg
12593        }
12594      else
12595        {
12596          movlps mem, reg
12597          movhps mem+8, reg
12598        }
12599
12600    Code generation for unaligned packed loads of double precision data
12601    (x86_sse_unaligned_move_optimal overrides x86_sse_split_regs):
12602      if (x86_sse_unaligned_move_optimal)
12603        movupd mem, reg
12604
12605      if (x86_sse_split_regs == true)
12606        {
12607          movlpd mem, reg
12608          movhpd mem+8, reg
12609        }
12610      else
12611        {
12612          movsd  mem, reg
12613          movhpd mem+8, reg
12614        }
12615  */
12616
12617 void
12618 ix86_expand_vector_move_misalign (enum machine_mode mode, rtx operands[])
12619 {
12620   rtx op0, op1, m;
12621
12622   op0 = operands[0];
12623   op1 = operands[1];
12624
12625   if (TARGET_AVX)
12626     {
12627       switch (GET_MODE_CLASS (mode))
12628         {
12629         case MODE_VECTOR_INT:
12630         case MODE_INT:
12631           switch (GET_MODE_SIZE (mode))
12632             {
12633             case 16:
12634               op0 = gen_lowpart (V16QImode, op0);
12635               op1 = gen_lowpart (V16QImode, op1);
12636               emit_insn (gen_avx_movdqu (op0, op1));
12637               break;
12638             case 32:
12639               op0 = gen_lowpart (V32QImode, op0);
12640               op1 = gen_lowpart (V32QImode, op1);
12641               emit_insn (gen_avx_movdqu256 (op0, op1));
12642               break;
12643             default:
12644               gcc_unreachable ();
12645             }
12646           break;
12647         case MODE_VECTOR_FLOAT:
12648           op0 = gen_lowpart (mode, op0);
12649           op1 = gen_lowpart (mode, op1);
12650
12651           switch (mode)
12652             { 
12653             case V4SFmode:
12654               emit_insn (gen_avx_movups (op0, op1));
12655               break;
12656             case V8SFmode:
12657               emit_insn (gen_avx_movups256 (op0, op1));
12658               break;
12659             case V2DFmode:
12660               emit_insn (gen_avx_movupd (op0, op1));
12661               break;
12662             case V4DFmode:
12663               emit_insn (gen_avx_movupd256 (op0, op1));
12664               break;
12665             default:
12666               gcc_unreachable ();
12667             }
12668           break;
12669
12670         default:
12671           gcc_unreachable ();
12672         }
12673
12674       return;
12675     }
12676
12677   if (MEM_P (op1))
12678     {
12679       /* If we're optimizing for size, movups is the smallest.  */
12680       if (optimize_insn_for_size_p ())
12681         {
12682           op0 = gen_lowpart (V4SFmode, op0);
12683           op1 = gen_lowpart (V4SFmode, op1);
12684           emit_insn (gen_sse_movups (op0, op1));
12685           return;
12686         }
12687
12688       /* ??? If we have typed data, then it would appear that using
12689          movdqu is the only way to get unaligned data loaded with
12690          integer type.  */
12691       if (TARGET_SSE2 && GET_MODE_CLASS (mode) == MODE_VECTOR_INT)
12692         {
12693           op0 = gen_lowpart (V16QImode, op0);
12694           op1 = gen_lowpart (V16QImode, op1);
12695           emit_insn (gen_sse2_movdqu (op0, op1));
12696           return;
12697         }
12698
12699       if (TARGET_SSE2 && mode == V2DFmode)
12700         {
12701           rtx zero;
12702
12703           if (TARGET_SSE_UNALIGNED_MOVE_OPTIMAL)
12704             {
12705               op0 = gen_lowpart (V2DFmode, op0);
12706               op1 = gen_lowpart (V2DFmode, op1);
12707               emit_insn (gen_sse2_movupd (op0, op1));
12708               return;
12709             }
12710
12711           /* When SSE registers are split into halves, we can avoid
12712              writing to the top half twice.  */
12713           if (TARGET_SSE_SPLIT_REGS)
12714             {
12715               emit_clobber (op0);
12716               zero = op0;
12717             }
12718           else
12719             {
12720               /* ??? Not sure about the best option for the Intel chips.
12721                  The following would seem to satisfy; the register is
12722                  entirely cleared, breaking the dependency chain.  We
12723                  then store to the upper half, with a dependency depth
12724                  of one.  A rumor has it that Intel recommends two movsd
12725                  followed by an unpacklpd, but this is unconfirmed.  And
12726                  given that the dependency depth of the unpacklpd would
12727                  still be one, I'm not sure why this would be better.  */
12728               zero = CONST0_RTX (V2DFmode);
12729             }
12730
12731           m = adjust_address (op1, DFmode, 0);
12732           emit_insn (gen_sse2_loadlpd (op0, zero, m));
12733           m = adjust_address (op1, DFmode, 8);
12734           emit_insn (gen_sse2_loadhpd (op0, op0, m));
12735         }
12736       else
12737         {
12738           if (TARGET_SSE_UNALIGNED_MOVE_OPTIMAL)
12739             {
12740               op0 = gen_lowpart (V4SFmode, op0);
12741               op1 = gen_lowpart (V4SFmode, op1);
12742               emit_insn (gen_sse_movups (op0, op1));
12743               return;
12744             }
12745
12746           if (TARGET_SSE_PARTIAL_REG_DEPENDENCY)
12747             emit_move_insn (op0, CONST0_RTX (mode));
12748           else
12749             emit_clobber (op0);
12750
12751           if (mode != V4SFmode)
12752             op0 = gen_lowpart (V4SFmode, op0);
12753           m = adjust_address (op1, V2SFmode, 0);
12754           emit_insn (gen_sse_loadlps (op0, op0, m));
12755           m = adjust_address (op1, V2SFmode, 8);
12756           emit_insn (gen_sse_loadhps (op0, op0, m));
12757         }
12758     }
12759   else if (MEM_P (op0))
12760     {
12761       /* If we're optimizing for size, movups is the smallest.  */
12762       if (optimize_insn_for_size_p ())
12763         {
12764           op0 = gen_lowpart (V4SFmode, op0);
12765           op1 = gen_lowpart (V4SFmode, op1);
12766           emit_insn (gen_sse_movups (op0, op1));
12767           return;
12768         }
12769
12770       /* ??? Similar to above, only less clear because of quote
12771          typeless stores unquote.  */
12772       if (TARGET_SSE2 && !TARGET_SSE_TYPELESS_STORES
12773           && GET_MODE_CLASS (mode) == MODE_VECTOR_INT)
12774         {
12775           op0 = gen_lowpart (V16QImode, op0);
12776           op1 = gen_lowpart (V16QImode, op1);
12777           emit_insn (gen_sse2_movdqu (op0, op1));
12778           return;
12779         }
12780
12781       if (TARGET_SSE2 && mode == V2DFmode)
12782         {
12783           m = adjust_address (op0, DFmode, 0);
12784           emit_insn (gen_sse2_storelpd (m, op1));
12785           m = adjust_address (op0, DFmode, 8);
12786           emit_insn (gen_sse2_storehpd (m, op1));
12787         }
12788       else
12789         {
12790           if (mode != V4SFmode)
12791             op1 = gen_lowpart (V4SFmode, op1);
12792           m = adjust_address (op0, V2SFmode, 0);
12793           emit_insn (gen_sse_storelps (m, op1));
12794           m = adjust_address (op0, V2SFmode, 8);
12795           emit_insn (gen_sse_storehps (m, op1));
12796         }
12797     }
12798   else
12799     gcc_unreachable ();
12800 }
12801
12802 /* Expand a push in MODE.  This is some mode for which we do not support
12803    proper push instructions, at least from the registers that we expect
12804    the value to live in.  */
12805
12806 void
12807 ix86_expand_push (enum machine_mode mode, rtx x)
12808 {
12809   rtx tmp;
12810
12811   tmp = expand_simple_binop (Pmode, PLUS, stack_pointer_rtx,
12812                              GEN_INT (-GET_MODE_SIZE (mode)),
12813                              stack_pointer_rtx, 1, OPTAB_DIRECT);
12814   if (tmp != stack_pointer_rtx)
12815     emit_move_insn (stack_pointer_rtx, tmp);
12816
12817   tmp = gen_rtx_MEM (mode, stack_pointer_rtx);
12818
12819   /* When we push an operand onto stack, it has to be aligned at least
12820      at the function argument boundary.  However since we don't have
12821      the argument type, we can't determine the actual argument
12822      boundary.  */
12823   emit_move_insn (tmp, x);
12824 }
12825
12826 /* Helper function of ix86_fixup_binary_operands to canonicalize
12827    operand order.  Returns true if the operands should be swapped.  */
12828
12829 static bool
12830 ix86_swap_binary_operands_p (enum rtx_code code, enum machine_mode mode,
12831                              rtx operands[])
12832 {
12833   rtx dst = operands[0];
12834   rtx src1 = operands[1];
12835   rtx src2 = operands[2];
12836
12837   /* If the operation is not commutative, we can't do anything.  */
12838   if (GET_RTX_CLASS (code) != RTX_COMM_ARITH)
12839     return false;
12840
12841   /* Highest priority is that src1 should match dst.  */
12842   if (rtx_equal_p (dst, src1))
12843     return false;
12844   if (rtx_equal_p (dst, src2))
12845     return true;
12846
12847   /* Next highest priority is that immediate constants come second.  */
12848   if (immediate_operand (src2, mode))
12849     return false;
12850   if (immediate_operand (src1, mode))
12851     return true;
12852
12853   /* Lowest priority is that memory references should come second.  */
12854   if (MEM_P (src2))
12855     return false;
12856   if (MEM_P (src1))
12857     return true;
12858
12859   return false;
12860 }
12861
12862
12863 /* Fix up OPERANDS to satisfy ix86_binary_operator_ok.  Return the
12864    destination to use for the operation.  If different from the true
12865    destination in operands[0], a copy operation will be required.  */
12866
12867 rtx
12868 ix86_fixup_binary_operands (enum rtx_code code, enum machine_mode mode,
12869                             rtx operands[])
12870 {
12871   rtx dst = operands[0];
12872   rtx src1 = operands[1];
12873   rtx src2 = operands[2];
12874
12875   /* Canonicalize operand order.  */
12876   if (ix86_swap_binary_operands_p (code, mode, operands))
12877     {
12878       rtx temp;
12879
12880       /* It is invalid to swap operands of different modes.  */
12881       gcc_assert (GET_MODE (src1) == GET_MODE (src2));
12882
12883       temp = src1;
12884       src1 = src2;
12885       src2 = temp;
12886     }
12887
12888   /* Both source operands cannot be in memory.  */
12889   if (MEM_P (src1) && MEM_P (src2))
12890     {
12891       /* Optimization: Only read from memory once.  */
12892       if (rtx_equal_p (src1, src2))
12893         {
12894           src2 = force_reg (mode, src2);
12895           src1 = src2;
12896         }
12897       else
12898         src2 = force_reg (mode, src2);
12899     }
12900
12901   /* If the destination is memory, and we do not have matching source
12902      operands, do things in registers.  */
12903   if (MEM_P (dst) && !rtx_equal_p (dst, src1))
12904     dst = gen_reg_rtx (mode);
12905
12906   /* Source 1 cannot be a constant.  */
12907   if (CONSTANT_P (src1))
12908     src1 = force_reg (mode, src1);
12909
12910   /* Source 1 cannot be a non-matching memory.  */
12911   if (MEM_P (src1) && !rtx_equal_p (dst, src1))
12912     src1 = force_reg (mode, src1);
12913
12914   operands[1] = src1;
12915   operands[2] = src2;
12916   return dst;
12917 }
12918
12919 /* Similarly, but assume that the destination has already been
12920    set up properly.  */
12921
12922 void
12923 ix86_fixup_binary_operands_no_copy (enum rtx_code code,
12924                                     enum machine_mode mode, rtx operands[])
12925 {
12926   rtx dst = ix86_fixup_binary_operands (code, mode, operands);
12927   gcc_assert (dst == operands[0]);
12928 }
12929
12930 /* Attempt to expand a binary operator.  Make the expansion closer to the
12931    actual machine, then just general_operand, which will allow 3 separate
12932    memory references (one output, two input) in a single insn.  */
12933
12934 void
12935 ix86_expand_binary_operator (enum rtx_code code, enum machine_mode mode,
12936                              rtx operands[])
12937 {
12938   rtx src1, src2, dst, op, clob;
12939
12940   dst = ix86_fixup_binary_operands (code, mode, operands);
12941   src1 = operands[1];
12942   src2 = operands[2];
12943
12944  /* Emit the instruction.  */
12945
12946   op = gen_rtx_SET (VOIDmode, dst, gen_rtx_fmt_ee (code, mode, src1, src2));
12947   if (reload_in_progress)
12948     {
12949       /* Reload doesn't know about the flags register, and doesn't know that
12950          it doesn't want to clobber it.  We can only do this with PLUS.  */
12951       gcc_assert (code == PLUS);
12952       emit_insn (op);
12953     }
12954   else
12955     {
12956       clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
12957       emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, op, clob)));
12958     }
12959
12960   /* Fix up the destination if needed.  */
12961   if (dst != operands[0])
12962     emit_move_insn (operands[0], dst);
12963 }
12964
12965 /* Return TRUE or FALSE depending on whether the binary operator meets the
12966    appropriate constraints.  */
12967
12968 int
12969 ix86_binary_operator_ok (enum rtx_code code, enum machine_mode mode,
12970                          rtx operands[3])
12971 {
12972   rtx dst = operands[0];
12973   rtx src1 = operands[1];
12974   rtx src2 = operands[2];
12975
12976   /* Both source operands cannot be in memory.  */
12977   if (MEM_P (src1) && MEM_P (src2))
12978     return 0;
12979
12980   /* Canonicalize operand order for commutative operators.  */
12981   if (ix86_swap_binary_operands_p (code, mode, operands))
12982     {
12983       rtx temp = src1;
12984       src1 = src2;
12985       src2 = temp;
12986     }
12987
12988   /* If the destination is memory, we must have a matching source operand.  */
12989   if (MEM_P (dst) && !rtx_equal_p (dst, src1))
12990       return 0;
12991
12992   /* Source 1 cannot be a constant.  */
12993   if (CONSTANT_P (src1))
12994     return 0;
12995
12996   /* Source 1 cannot be a non-matching memory.  */
12997   if (MEM_P (src1) && !rtx_equal_p (dst, src1))
12998     return 0;
12999
13000   return 1;
13001 }
13002
13003 /* Attempt to expand a unary operator.  Make the expansion closer to the
13004    actual machine, then just general_operand, which will allow 2 separate
13005    memory references (one output, one input) in a single insn.  */
13006
13007 void
13008 ix86_expand_unary_operator (enum rtx_code code, enum machine_mode mode,
13009                             rtx operands[])
13010 {
13011   int matching_memory;
13012   rtx src, dst, op, clob;
13013
13014   dst = operands[0];
13015   src = operands[1];
13016
13017   /* If the destination is memory, and we do not have matching source
13018      operands, do things in registers.  */
13019   matching_memory = 0;
13020   if (MEM_P (dst))
13021     {
13022       if (rtx_equal_p (dst, src))
13023         matching_memory = 1;
13024       else
13025         dst = gen_reg_rtx (mode);
13026     }
13027
13028   /* When source operand is memory, destination must match.  */
13029   if (MEM_P (src) && !matching_memory)
13030     src = force_reg (mode, src);
13031
13032   /* Emit the instruction.  */
13033
13034   op = gen_rtx_SET (VOIDmode, dst, gen_rtx_fmt_e (code, mode, src));
13035   if (reload_in_progress || code == NOT)
13036     {
13037       /* Reload doesn't know about the flags register, and doesn't know that
13038          it doesn't want to clobber it.  */
13039       gcc_assert (code == NOT);
13040       emit_insn (op);
13041     }
13042   else
13043     {
13044       clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
13045       emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, op, clob)));
13046     }
13047
13048   /* Fix up the destination if needed.  */
13049   if (dst != operands[0])
13050     emit_move_insn (operands[0], dst);
13051 }
13052
13053 #define LEA_SEARCH_THRESHOLD 12
13054
13055 /* Search backward for non-agu definition of register number REGNO1
13056    or register number REGNO2 in INSN's basic block until 
13057    1. Pass LEA_SEARCH_THRESHOLD instructions, or
13058    2. Reach BB boundary, or
13059    3. Reach agu definition.
13060    Returns the distance between the non-agu definition point and INSN.
13061    If no definition point, returns -1.  */
13062
13063 static int
13064 distance_non_agu_define (unsigned int regno1, unsigned int regno2,
13065                          rtx insn)
13066 {
13067   basic_block bb = BLOCK_FOR_INSN (insn);
13068   int distance = 0;
13069   df_ref *def_rec;
13070   enum attr_type insn_type;
13071
13072   if (insn != BB_HEAD (bb))
13073     {
13074       rtx prev = PREV_INSN (insn);
13075       while (prev && distance < LEA_SEARCH_THRESHOLD)
13076         {
13077           if (INSN_P (prev))
13078             {
13079               distance++;
13080               for (def_rec = DF_INSN_DEFS (prev); *def_rec; def_rec++)
13081                 if (DF_REF_TYPE (*def_rec) == DF_REF_REG_DEF
13082                     && !DF_REF_IS_ARTIFICIAL (*def_rec)
13083                     && (regno1 == DF_REF_REGNO (*def_rec)
13084                         || regno2 == DF_REF_REGNO (*def_rec)))
13085                   {
13086                     insn_type = get_attr_type (prev);
13087                     if (insn_type != TYPE_LEA)
13088                       goto done;
13089                   }
13090             }
13091           if (prev == BB_HEAD (bb))
13092             break;
13093           prev = PREV_INSN (prev);
13094         }
13095     }
13096   
13097   if (distance < LEA_SEARCH_THRESHOLD)
13098     {
13099       edge e;
13100       edge_iterator ei;
13101       bool simple_loop = false;
13102   
13103       FOR_EACH_EDGE (e, ei, bb->preds)
13104         if (e->src == bb)
13105           {
13106             simple_loop = true;
13107             break;
13108           }
13109   
13110       if (simple_loop)
13111         {
13112           rtx prev = BB_END (bb);
13113           while (prev
13114                  && prev != insn
13115                  && distance < LEA_SEARCH_THRESHOLD)
13116             {
13117               if (INSN_P (prev))
13118                 {
13119                   distance++;
13120                   for (def_rec = DF_INSN_DEFS (prev); *def_rec; def_rec++)
13121                     if (DF_REF_TYPE (*def_rec) == DF_REF_REG_DEF
13122                         && !DF_REF_IS_ARTIFICIAL (*def_rec)
13123                         && (regno1 == DF_REF_REGNO (*def_rec)
13124                             || regno2 == DF_REF_REGNO (*def_rec)))
13125                       {
13126                         insn_type = get_attr_type (prev);
13127                         if (insn_type != TYPE_LEA)
13128                           goto done;
13129                       }
13130                 }
13131               prev = PREV_INSN (prev);
13132             }
13133         }
13134     }
13135
13136   distance = -1;
13137
13138 done:
13139   /* get_attr_type may modify recog data.  We want to make sure
13140      that recog data is valid for instruction INSN, on which
13141      distance_non_agu_define is called.  INSN is unchanged here.  */
13142   extract_insn_cached (insn);
13143   return distance;
13144 }
13145
13146 /* Return the distance between INSN and the next insn that uses 
13147    register number REGNO0 in memory address.  Return -1 if no such
13148    a use is found within LEA_SEARCH_THRESHOLD or REGNO0 is set.  */
13149
13150 static int
13151 distance_agu_use (unsigned int regno0, rtx insn)
13152 {
13153   basic_block bb = BLOCK_FOR_INSN (insn);
13154   int distance = 0;
13155   df_ref *def_rec;
13156   df_ref *use_rec;
13157
13158   if (insn != BB_END (bb))
13159     {
13160       rtx next = NEXT_INSN (insn);
13161       while (next && distance < LEA_SEARCH_THRESHOLD)
13162         {
13163           if (INSN_P (next))
13164             {
13165               distance++;
13166
13167               for (use_rec = DF_INSN_USES (next); *use_rec; use_rec++)
13168                 if ((DF_REF_TYPE (*use_rec) == DF_REF_REG_MEM_LOAD
13169                      || DF_REF_TYPE (*use_rec) == DF_REF_REG_MEM_STORE)
13170                     && regno0 == DF_REF_REGNO (*use_rec))
13171                   {
13172                     /* Return DISTANCE if OP0 is used in memory
13173                        address in NEXT.  */
13174                     return distance;
13175                   }
13176
13177               for (def_rec = DF_INSN_DEFS (next); *def_rec; def_rec++)
13178                 if (DF_REF_TYPE (*def_rec) == DF_REF_REG_DEF
13179                     && !DF_REF_IS_ARTIFICIAL (*def_rec)
13180                     && regno0 == DF_REF_REGNO (*def_rec))
13181                   {
13182                     /* Return -1 if OP0 is set in NEXT.  */
13183                     return -1;
13184                   }
13185             }
13186           if (next == BB_END (bb))
13187             break;
13188           next = NEXT_INSN (next);
13189         }
13190     }
13191
13192   if (distance < LEA_SEARCH_THRESHOLD)
13193     {
13194       edge e;
13195       edge_iterator ei;
13196       bool simple_loop = false;
13197   
13198       FOR_EACH_EDGE (e, ei, bb->succs)
13199         if (e->dest == bb)
13200           {
13201             simple_loop = true;
13202             break;
13203           }
13204   
13205       if (simple_loop)
13206         {
13207           rtx next = BB_HEAD (bb);
13208           while (next
13209                  && next != insn
13210                  && distance < LEA_SEARCH_THRESHOLD)
13211             {
13212               if (INSN_P (next))
13213                 {
13214                   distance++;
13215
13216                   for (use_rec = DF_INSN_USES (next); *use_rec; use_rec++)
13217                     if ((DF_REF_TYPE (*use_rec) == DF_REF_REG_MEM_LOAD
13218                          || DF_REF_TYPE (*use_rec) == DF_REF_REG_MEM_STORE)
13219                         && regno0 == DF_REF_REGNO (*use_rec))
13220                       {
13221                         /* Return DISTANCE if OP0 is used in memory
13222                            address in NEXT.  */
13223                         return distance;
13224                       }
13225
13226                   for (def_rec = DF_INSN_DEFS (next); *def_rec; def_rec++)
13227                     if (DF_REF_TYPE (*def_rec) == DF_REF_REG_DEF
13228                         && !DF_REF_IS_ARTIFICIAL (*def_rec)
13229                         && regno0 == DF_REF_REGNO (*def_rec))
13230                       {
13231                         /* Return -1 if OP0 is set in NEXT.  */
13232                         return -1;
13233                       }
13234
13235                 }
13236               next = NEXT_INSN (next);
13237             }
13238         }
13239     }  
13240
13241   return -1;
13242 }
13243
13244 /* Define this macro to tune LEA priority vs ADD, it take effect when
13245    there is a dilemma of choicing LEA or ADD
13246    Negative value: ADD is more preferred than LEA
13247    Zero: Netrual
13248    Positive value: LEA is more preferred than ADD*/
13249 #define IX86_LEA_PRIORITY 2
13250
13251 /* Return true if it is ok to optimize an ADD operation to LEA
13252    operation to avoid flag register consumation.  For the processors
13253    like ATOM, if the destination register of LEA holds an actual
13254    address which will be used soon, LEA is better and otherwise ADD
13255    is better.  */
13256
13257 bool
13258 ix86_lea_for_add_ok (enum rtx_code code ATTRIBUTE_UNUSED,
13259                      rtx insn, rtx operands[])
13260 {
13261   unsigned int regno0 = true_regnum (operands[0]);
13262   unsigned int regno1 = true_regnum (operands[1]);
13263   unsigned int regno2;
13264
13265   if (!TARGET_OPT_AGU || optimize_function_for_size_p (cfun))
13266     return regno0 != regno1;
13267
13268   regno2 = true_regnum (operands[2]);
13269
13270   /* If a = b + c, (a!=b && a!=c), must use lea form. */
13271   if (regno0 != regno1 && regno0 != regno2)
13272     return true;
13273   else    
13274     {
13275       int dist_define, dist_use;
13276       dist_define = distance_non_agu_define (regno1, regno2, insn);
13277       if (dist_define <= 0)
13278         return true;
13279
13280       /* If this insn has both backward non-agu dependence and forward
13281          agu dependence, the one with short distance take effect. */
13282       dist_use = distance_agu_use (regno0, insn);
13283       if (dist_use <= 0
13284           || (dist_define + IX86_LEA_PRIORITY) < dist_use)
13285         return false;
13286
13287       return true;
13288     }
13289 }
13290
13291 /* Return true if destination reg of SET_BODY is shift count of
13292    USE_BODY.  */
13293
13294 static bool
13295 ix86_dep_by_shift_count_body (const_rtx set_body, const_rtx use_body)
13296 {
13297   rtx set_dest;
13298   rtx shift_rtx;
13299   int i;
13300
13301   /* Retrieve destination of SET_BODY.  */
13302   switch (GET_CODE (set_body))
13303     {
13304     case SET:
13305       set_dest = SET_DEST (set_body);
13306       if (!set_dest || !REG_P (set_dest))
13307         return false;
13308       break;
13309     case PARALLEL:
13310       for (i = XVECLEN (set_body, 0) - 1; i >= 0; i--)
13311         if (ix86_dep_by_shift_count_body (XVECEXP (set_body, 0, i),
13312                                           use_body))
13313           return true;
13314     default:
13315       return false;
13316       break;
13317     }
13318
13319   /* Retrieve shift count of USE_BODY.  */
13320   switch (GET_CODE (use_body))
13321     {
13322     case SET:
13323       shift_rtx = XEXP (use_body, 1);
13324       break;
13325     case PARALLEL:
13326       for (i = XVECLEN (use_body, 0) - 1; i >= 0; i--)
13327         if (ix86_dep_by_shift_count_body (set_body,
13328                                           XVECEXP (use_body, 0, i)))
13329           return true;
13330     default:
13331       return false;
13332       break;
13333     }
13334
13335   if (shift_rtx 
13336       && (GET_CODE (shift_rtx) == ASHIFT
13337           || GET_CODE (shift_rtx) == LSHIFTRT
13338           || GET_CODE (shift_rtx) == ASHIFTRT
13339           || GET_CODE (shift_rtx) == ROTATE
13340           || GET_CODE (shift_rtx) == ROTATERT))
13341     {
13342       rtx shift_count = XEXP (shift_rtx, 1);
13343
13344       /* Return true if shift count is dest of SET_BODY.  */
13345       if (REG_P (shift_count)
13346           && true_regnum (set_dest) == true_regnum (shift_count))
13347         return true;
13348     }
13349
13350   return false;
13351 }
13352
13353 /* Return true if destination reg of SET_INSN is shift count of
13354    USE_INSN.  */
13355
13356 bool
13357 ix86_dep_by_shift_count (const_rtx set_insn, const_rtx use_insn)
13358 {
13359   return ix86_dep_by_shift_count_body (PATTERN (set_insn),
13360                                        PATTERN (use_insn));
13361 }
13362
13363 /* Return TRUE or FALSE depending on whether the unary operator meets the
13364    appropriate constraints.  */
13365
13366 int
13367 ix86_unary_operator_ok (enum rtx_code code ATTRIBUTE_UNUSED,
13368                         enum machine_mode mode ATTRIBUTE_UNUSED,
13369                         rtx operands[2] ATTRIBUTE_UNUSED)
13370 {
13371   /* If one of operands is memory, source and destination must match.  */
13372   if ((MEM_P (operands[0])
13373        || MEM_P (operands[1]))
13374       && ! rtx_equal_p (operands[0], operands[1]))
13375     return FALSE;
13376   return TRUE;
13377 }
13378
13379 /* Post-reload splitter for converting an SF or DFmode value in an
13380    SSE register into an unsigned SImode.  */
13381
13382 void
13383 ix86_split_convert_uns_si_sse (rtx operands[])
13384 {
13385   enum machine_mode vecmode;
13386   rtx value, large, zero_or_two31, input, two31, x;
13387
13388   large = operands[1];
13389   zero_or_two31 = operands[2];
13390   input = operands[3];
13391   two31 = operands[4];
13392   vecmode = GET_MODE (large);
13393   value = gen_rtx_REG (vecmode, REGNO (operands[0]));
13394
13395   /* Load up the value into the low element.  We must ensure that the other
13396      elements are valid floats -- zero is the easiest such value.  */
13397   if (MEM_P (input))
13398     {
13399       if (vecmode == V4SFmode)
13400         emit_insn (gen_vec_setv4sf_0 (value, CONST0_RTX (V4SFmode), input));
13401       else
13402         emit_insn (gen_sse2_loadlpd (value, CONST0_RTX (V2DFmode), input));
13403     }
13404   else
13405     {
13406       input = gen_rtx_REG (vecmode, REGNO (input));
13407       emit_move_insn (value, CONST0_RTX (vecmode));
13408       if (vecmode == V4SFmode)
13409         emit_insn (gen_sse_movss (value, value, input));
13410       else
13411         emit_insn (gen_sse2_movsd (value, value, input));
13412     }
13413
13414   emit_move_insn (large, two31);
13415   emit_move_insn (zero_or_two31, MEM_P (two31) ? large : two31);
13416
13417   x = gen_rtx_fmt_ee (LE, vecmode, large, value);
13418   emit_insn (gen_rtx_SET (VOIDmode, large, x));
13419
13420   x = gen_rtx_AND (vecmode, zero_or_two31, large);
13421   emit_insn (gen_rtx_SET (VOIDmode, zero_or_two31, x));
13422
13423   x = gen_rtx_MINUS (vecmode, value, zero_or_two31);
13424   emit_insn (gen_rtx_SET (VOIDmode, value, x));
13425
13426   large = gen_rtx_REG (V4SImode, REGNO (large));
13427   emit_insn (gen_ashlv4si3 (large, large, GEN_INT (31)));
13428
13429   x = gen_rtx_REG (V4SImode, REGNO (value));
13430   if (vecmode == V4SFmode)
13431     emit_insn (gen_sse2_cvttps2dq (x, value));
13432   else
13433     emit_insn (gen_sse2_cvttpd2dq (x, value));
13434   value = x;
13435
13436   emit_insn (gen_xorv4si3 (value, value, large));
13437 }
13438
13439 /* Convert an unsigned DImode value into a DFmode, using only SSE.
13440    Expects the 64-bit DImode to be supplied in a pair of integral
13441    registers.  Requires SSE2; will use SSE3 if available.  For x86_32,
13442    -mfpmath=sse, !optimize_size only.  */
13443
13444 void
13445 ix86_expand_convert_uns_didf_sse (rtx target, rtx input)
13446 {
13447   REAL_VALUE_TYPE bias_lo_rvt, bias_hi_rvt;
13448   rtx int_xmm, fp_xmm;
13449   rtx biases, exponents;
13450   rtx x;
13451
13452   int_xmm = gen_reg_rtx (V4SImode);
13453   if (TARGET_INTER_UNIT_MOVES)
13454     emit_insn (gen_movdi_to_sse (int_xmm, input));
13455   else if (TARGET_SSE_SPLIT_REGS)
13456     {
13457       emit_clobber (int_xmm);
13458       emit_move_insn (gen_lowpart (DImode, int_xmm), input);
13459     }
13460   else
13461     {
13462       x = gen_reg_rtx (V2DImode);
13463       ix86_expand_vector_init_one_nonzero (false, V2DImode, x, input, 0);
13464       emit_move_insn (int_xmm, gen_lowpart (V4SImode, x));
13465     }
13466
13467   x = gen_rtx_CONST_VECTOR (V4SImode,
13468                             gen_rtvec (4, GEN_INT (0x43300000UL),
13469                                        GEN_INT (0x45300000UL),
13470                                        const0_rtx, const0_rtx));
13471   exponents = validize_mem (force_const_mem (V4SImode, x));
13472
13473   /* int_xmm = {0x45300000UL, fp_xmm/hi, 0x43300000, fp_xmm/lo } */
13474   emit_insn (gen_sse2_punpckldq (int_xmm, int_xmm, exponents));
13475
13476   /* Concatenating (juxtaposing) (0x43300000UL ## fp_value_low_xmm)
13477      yields a valid DF value equal to (0x1.0p52 + double(fp_value_lo_xmm)).
13478      Similarly (0x45300000UL ## fp_value_hi_xmm) yields
13479      (0x1.0p84 + double(fp_value_hi_xmm)).
13480      Note these exponents differ by 32.  */
13481
13482   fp_xmm = copy_to_mode_reg (V2DFmode, gen_lowpart (V2DFmode, int_xmm));
13483
13484   /* Subtract off those 0x1.0p52 and 0x1.0p84 biases, to produce values
13485      in [0,2**32-1] and [0]+[2**32,2**64-1] respectively.  */
13486   real_ldexp (&bias_lo_rvt, &dconst1, 52);
13487   real_ldexp (&bias_hi_rvt, &dconst1, 84);
13488   biases = const_double_from_real_value (bias_lo_rvt, DFmode);
13489   x = const_double_from_real_value (bias_hi_rvt, DFmode);
13490   biases = gen_rtx_CONST_VECTOR (V2DFmode, gen_rtvec (2, biases, x));
13491   biases = validize_mem (force_const_mem (V2DFmode, biases));
13492   emit_insn (gen_subv2df3 (fp_xmm, fp_xmm, biases));
13493
13494   /* Add the upper and lower DFmode values together.  */
13495   if (TARGET_SSE3)
13496     emit_insn (gen_sse3_haddv2df3 (fp_xmm, fp_xmm, fp_xmm));
13497   else
13498     {
13499       x = copy_to_mode_reg (V2DFmode, fp_xmm);
13500       emit_insn (gen_sse2_unpckhpd (fp_xmm, fp_xmm, fp_xmm));
13501       emit_insn (gen_addv2df3 (fp_xmm, fp_xmm, x));
13502     }
13503
13504   ix86_expand_vector_extract (false, target, fp_xmm, 0);
13505 }
13506
13507 /* Not used, but eases macroization of patterns.  */
13508 void
13509 ix86_expand_convert_uns_sixf_sse (rtx target ATTRIBUTE_UNUSED,
13510                                   rtx input ATTRIBUTE_UNUSED)
13511 {
13512   gcc_unreachable ();
13513 }
13514
13515 /* Convert an unsigned SImode value into a DFmode.  Only currently used
13516    for SSE, but applicable anywhere.  */
13517
13518 void
13519 ix86_expand_convert_uns_sidf_sse (rtx target, rtx input)
13520 {
13521   REAL_VALUE_TYPE TWO31r;
13522   rtx x, fp;
13523
13524   x = expand_simple_binop (SImode, PLUS, input, GEN_INT (-2147483647 - 1),
13525                            NULL, 1, OPTAB_DIRECT);
13526
13527   fp = gen_reg_rtx (DFmode);
13528   emit_insn (gen_floatsidf2 (fp, x));
13529
13530   real_ldexp (&TWO31r, &dconst1, 31);
13531   x = const_double_from_real_value (TWO31r, DFmode);
13532
13533   x = expand_simple_binop (DFmode, PLUS, fp, x, target, 0, OPTAB_DIRECT);
13534   if (x != target)
13535     emit_move_insn (target, x);
13536 }
13537
13538 /* Convert a signed DImode value into a DFmode.  Only used for SSE in
13539    32-bit mode; otherwise we have a direct convert instruction.  */
13540
13541 void
13542 ix86_expand_convert_sign_didf_sse (rtx target, rtx input)
13543 {
13544   REAL_VALUE_TYPE TWO32r;
13545   rtx fp_lo, fp_hi, x;
13546
13547   fp_lo = gen_reg_rtx (DFmode);
13548   fp_hi = gen_reg_rtx (DFmode);
13549
13550   emit_insn (gen_floatsidf2 (fp_hi, gen_highpart (SImode, input)));
13551
13552   real_ldexp (&TWO32r, &dconst1, 32);
13553   x = const_double_from_real_value (TWO32r, DFmode);
13554   fp_hi = expand_simple_binop (DFmode, MULT, fp_hi, x, fp_hi, 0, OPTAB_DIRECT);
13555
13556   ix86_expand_convert_uns_sidf_sse (fp_lo, gen_lowpart (SImode, input));
13557
13558   x = expand_simple_binop (DFmode, PLUS, fp_hi, fp_lo, target,
13559                            0, OPTAB_DIRECT);
13560   if (x != target)
13561     emit_move_insn (target, x);
13562 }
13563
13564 /* Convert an unsigned SImode value into a SFmode, using only SSE.
13565    For x86_32, -mfpmath=sse, !optimize_size only.  */
13566 void
13567 ix86_expand_convert_uns_sisf_sse (rtx target, rtx input)
13568 {
13569   REAL_VALUE_TYPE ONE16r;
13570   rtx fp_hi, fp_lo, int_hi, int_lo, x;
13571
13572   real_ldexp (&ONE16r, &dconst1, 16);
13573   x = const_double_from_real_value (ONE16r, SFmode);
13574   int_lo = expand_simple_binop (SImode, AND, input, GEN_INT(0xffff),
13575                                       NULL, 0, OPTAB_DIRECT);
13576   int_hi = expand_simple_binop (SImode, LSHIFTRT, input, GEN_INT(16),
13577                                       NULL, 0, OPTAB_DIRECT);
13578   fp_hi = gen_reg_rtx (SFmode);
13579   fp_lo = gen_reg_rtx (SFmode);
13580   emit_insn (gen_floatsisf2 (fp_hi, int_hi));
13581   emit_insn (gen_floatsisf2 (fp_lo, int_lo));
13582   fp_hi = expand_simple_binop (SFmode, MULT, fp_hi, x, fp_hi,
13583                                0, OPTAB_DIRECT);
13584   fp_hi = expand_simple_binop (SFmode, PLUS, fp_hi, fp_lo, target,
13585                                0, OPTAB_DIRECT);
13586   if (!rtx_equal_p (target, fp_hi))
13587     emit_move_insn (target, fp_hi);
13588 }
13589
13590 /* A subroutine of ix86_build_signbit_mask.  If VECT is true,
13591    then replicate the value for all elements of the vector
13592    register.  */
13593
13594 rtx
13595 ix86_build_const_vector (enum machine_mode mode, bool vect, rtx value)
13596 {
13597   rtvec v;
13598   switch (mode)
13599     {
13600     case SImode:
13601       gcc_assert (vect);
13602       v = gen_rtvec (4, value, value, value, value);
13603       return gen_rtx_CONST_VECTOR (V4SImode, v);
13604
13605     case DImode:
13606       gcc_assert (vect);
13607       v = gen_rtvec (2, value, value);
13608       return gen_rtx_CONST_VECTOR (V2DImode, v);
13609
13610     case SFmode:
13611       if (vect)
13612         v = gen_rtvec (4, value, value, value, value);
13613       else
13614         v = gen_rtvec (4, value, CONST0_RTX (SFmode),
13615                        CONST0_RTX (SFmode), CONST0_RTX (SFmode));
13616       return gen_rtx_CONST_VECTOR (V4SFmode, v);
13617
13618     case DFmode:
13619       if (vect)
13620         v = gen_rtvec (2, value, value);
13621       else
13622         v = gen_rtvec (2, value, CONST0_RTX (DFmode));
13623       return gen_rtx_CONST_VECTOR (V2DFmode, v);
13624
13625     default:
13626       gcc_unreachable ();
13627     }
13628 }
13629
13630 /* A subroutine of ix86_expand_fp_absneg_operator, copysign expanders
13631    and ix86_expand_int_vcond.  Create a mask for the sign bit in MODE
13632    for an SSE register.  If VECT is true, then replicate the mask for
13633    all elements of the vector register.  If INVERT is true, then create
13634    a mask excluding the sign bit.  */
13635
13636 static rtx
13637 ix86_build_signbit_mask (enum machine_mode mode, bool vect, bool invert)
13638 {
13639   enum machine_mode vec_mode, imode;
13640   HOST_WIDE_INT hi, lo;
13641   int shift = 63;
13642   rtx v;
13643   rtx mask;
13644
13645   /* Find the sign bit, sign extended to 2*HWI.  */
13646   switch (mode)
13647     {
13648     case SImode:
13649     case SFmode:
13650       imode = SImode;
13651       vec_mode = (mode == SImode) ? V4SImode : V4SFmode;
13652       lo = 0x80000000, hi = lo < 0;
13653       break;
13654
13655     case DImode:
13656     case DFmode:
13657       imode = DImode;
13658       vec_mode = (mode == DImode) ? V2DImode : V2DFmode;
13659       if (HOST_BITS_PER_WIDE_INT >= 64)
13660         lo = (HOST_WIDE_INT)1 << shift, hi = -1;
13661       else
13662         lo = 0, hi = (HOST_WIDE_INT)1 << (shift - HOST_BITS_PER_WIDE_INT);
13663       break;
13664
13665     case TImode:
13666     case TFmode:
13667       vec_mode = VOIDmode;
13668       if (HOST_BITS_PER_WIDE_INT >= 64)
13669         {
13670           imode = TImode;
13671           lo = 0, hi = (HOST_WIDE_INT)1 << shift;
13672         }
13673       else
13674         {
13675           rtvec vec;
13676
13677           imode = DImode;
13678           lo = 0, hi = (HOST_WIDE_INT)1 << (shift - HOST_BITS_PER_WIDE_INT);
13679
13680           if (invert)
13681             {
13682               lo = ~lo, hi = ~hi;
13683               v = constm1_rtx;
13684             }
13685           else
13686             v = const0_rtx;
13687
13688           mask = immed_double_const (lo, hi, imode);
13689
13690           vec = gen_rtvec (2, v, mask);
13691           v = gen_rtx_CONST_VECTOR (V2DImode, vec);
13692           v = copy_to_mode_reg (mode, gen_lowpart (mode, v));
13693
13694           return v;
13695         }
13696      break;
13697
13698     default:
13699       gcc_unreachable ();
13700     }
13701
13702   if (invert)
13703     lo = ~lo, hi = ~hi;
13704
13705   /* Force this value into the low part of a fp vector constant.  */
13706   mask = immed_double_const (lo, hi, imode);
13707   mask = gen_lowpart (mode, mask);
13708
13709   if (vec_mode == VOIDmode)
13710     return force_reg (mode, mask);
13711
13712   v = ix86_build_const_vector (mode, vect, mask);
13713   return force_reg (vec_mode, v);
13714 }
13715
13716 /* Generate code for floating point ABS or NEG.  */
13717
13718 void
13719 ix86_expand_fp_absneg_operator (enum rtx_code code, enum machine_mode mode,
13720                                 rtx operands[])
13721 {
13722   rtx mask, set, use, clob, dst, src;
13723   bool use_sse = false;
13724   bool vector_mode = VECTOR_MODE_P (mode);
13725   enum machine_mode elt_mode = mode;
13726
13727   if (vector_mode)
13728     {
13729       elt_mode = GET_MODE_INNER (mode);
13730       use_sse = true;
13731     }
13732   else if (mode == TFmode)
13733     use_sse = true;
13734   else if (TARGET_SSE_MATH)
13735     use_sse = SSE_FLOAT_MODE_P (mode);
13736
13737   /* NEG and ABS performed with SSE use bitwise mask operations.
13738      Create the appropriate mask now.  */
13739   if (use_sse)
13740     mask = ix86_build_signbit_mask (elt_mode, vector_mode, code == ABS);
13741   else
13742     mask = NULL_RTX;
13743
13744   dst = operands[0];
13745   src = operands[1];
13746
13747   if (vector_mode)
13748     {
13749       set = gen_rtx_fmt_ee (code == NEG ? XOR : AND, mode, src, mask);
13750       set = gen_rtx_SET (VOIDmode, dst, set);
13751       emit_insn (set);
13752     }
13753   else
13754     {
13755       set = gen_rtx_fmt_e (code, mode, src);
13756       set = gen_rtx_SET (VOIDmode, dst, set);
13757       if (mask)
13758         {
13759           use = gen_rtx_USE (VOIDmode, mask);
13760           clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
13761           emit_insn (gen_rtx_PARALLEL (VOIDmode,
13762                                        gen_rtvec (3, set, use, clob)));
13763         }
13764       else
13765         emit_insn (set);
13766     }
13767 }
13768
13769 /* Expand a copysign operation.  Special case operand 0 being a constant.  */
13770
13771 void
13772 ix86_expand_copysign (rtx operands[])
13773 {
13774   enum machine_mode mode;
13775   rtx dest, op0, op1, mask, nmask;
13776
13777   dest = operands[0];
13778   op0 = operands[1];
13779   op1 = operands[2];
13780
13781   mode = GET_MODE (dest);
13782
13783   if (GET_CODE (op0) == CONST_DOUBLE)
13784     {
13785       rtx (*copysign_insn)(rtx, rtx, rtx, rtx);
13786
13787       if (real_isneg (CONST_DOUBLE_REAL_VALUE (op0)))
13788         op0 = simplify_unary_operation (ABS, mode, op0, mode);
13789
13790       if (mode == SFmode || mode == DFmode)
13791         {
13792           enum machine_mode vmode;
13793
13794           vmode = mode == SFmode ? V4SFmode : V2DFmode;
13795
13796           if (op0 == CONST0_RTX (mode))
13797             op0 = CONST0_RTX (vmode);
13798           else
13799             {
13800               rtvec v;
13801
13802               if (mode == SFmode)
13803                 v = gen_rtvec (4, op0, CONST0_RTX (SFmode),
13804                                CONST0_RTX (SFmode), CONST0_RTX (SFmode));
13805               else
13806                 v = gen_rtvec (2, op0, CONST0_RTX (DFmode));
13807
13808               op0 = force_reg (vmode, gen_rtx_CONST_VECTOR (vmode, v));
13809             }
13810         }
13811       else if (op0 != CONST0_RTX (mode))
13812         op0 = force_reg (mode, op0);
13813
13814       mask = ix86_build_signbit_mask (mode, 0, 0);
13815
13816       if (mode == SFmode)
13817         copysign_insn = gen_copysignsf3_const;
13818       else if (mode == DFmode)
13819         copysign_insn = gen_copysigndf3_const;
13820       else
13821         copysign_insn = gen_copysigntf3_const;
13822
13823         emit_insn (copysign_insn (dest, op0, op1, mask));
13824     }
13825   else
13826     {
13827       rtx (*copysign_insn)(rtx, rtx, rtx, rtx, rtx, rtx);
13828
13829       nmask = ix86_build_signbit_mask (mode, 0, 1);
13830       mask = ix86_build_signbit_mask (mode, 0, 0);
13831
13832       if (mode == SFmode)
13833         copysign_insn = gen_copysignsf3_var;
13834       else if (mode == DFmode)
13835         copysign_insn = gen_copysigndf3_var;
13836       else
13837         copysign_insn = gen_copysigntf3_var;
13838
13839       emit_insn (copysign_insn (dest, NULL_RTX, op0, op1, nmask, mask));
13840     }
13841 }
13842
13843 /* Deconstruct a copysign operation into bit masks.  Operand 0 is known to
13844    be a constant, and so has already been expanded into a vector constant.  */
13845
13846 void
13847 ix86_split_copysign_const (rtx operands[])
13848 {
13849   enum machine_mode mode, vmode;
13850   rtx dest, op0, op1, mask, x;
13851
13852   dest = operands[0];
13853   op0 = operands[1];
13854   op1 = operands[2];
13855   mask = operands[3];
13856
13857   mode = GET_MODE (dest);
13858   vmode = GET_MODE (mask);
13859
13860   dest = simplify_gen_subreg (vmode, dest, mode, 0);
13861   x = gen_rtx_AND (vmode, dest, mask);
13862   emit_insn (gen_rtx_SET (VOIDmode, dest, x));
13863
13864   if (op0 != CONST0_RTX (vmode))
13865     {
13866       x = gen_rtx_IOR (vmode, dest, op0);
13867       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
13868     }
13869 }
13870
13871 /* Deconstruct a copysign operation into bit masks.  Operand 0 is variable,
13872    so we have to do two masks.  */
13873
13874 void
13875 ix86_split_copysign_var (rtx operands[])
13876 {
13877   enum machine_mode mode, vmode;
13878   rtx dest, scratch, op0, op1, mask, nmask, x;
13879
13880   dest = operands[0];
13881   scratch = operands[1];
13882   op0 = operands[2];
13883   op1 = operands[3];
13884   nmask = operands[4];
13885   mask = operands[5];
13886
13887   mode = GET_MODE (dest);
13888   vmode = GET_MODE (mask);
13889
13890   if (rtx_equal_p (op0, op1))
13891     {
13892       /* Shouldn't happen often (it's useless, obviously), but when it does
13893          we'd generate incorrect code if we continue below.  */
13894       emit_move_insn (dest, op0);
13895       return;
13896     }
13897
13898   if (REG_P (mask) && REGNO (dest) == REGNO (mask))     /* alternative 0 */
13899     {
13900       gcc_assert (REGNO (op1) == REGNO (scratch));
13901
13902       x = gen_rtx_AND (vmode, scratch, mask);
13903       emit_insn (gen_rtx_SET (VOIDmode, scratch, x));
13904
13905       dest = mask;
13906       op0 = simplify_gen_subreg (vmode, op0, mode, 0);
13907       x = gen_rtx_NOT (vmode, dest);
13908       x = gen_rtx_AND (vmode, x, op0);
13909       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
13910     }
13911   else
13912     {
13913       if (REGNO (op1) == REGNO (scratch))               /* alternative 1,3 */
13914         {
13915           x = gen_rtx_AND (vmode, scratch, mask);
13916         }
13917       else                                              /* alternative 2,4 */
13918         {
13919           gcc_assert (REGNO (mask) == REGNO (scratch));
13920           op1 = simplify_gen_subreg (vmode, op1, mode, 0);
13921           x = gen_rtx_AND (vmode, scratch, op1);
13922         }
13923       emit_insn (gen_rtx_SET (VOIDmode, scratch, x));
13924
13925       if (REGNO (op0) == REGNO (dest))                  /* alternative 1,2 */
13926         {
13927           dest = simplify_gen_subreg (vmode, op0, mode, 0);
13928           x = gen_rtx_AND (vmode, dest, nmask);
13929         }
13930       else                                              /* alternative 3,4 */
13931         {
13932           gcc_assert (REGNO (nmask) == REGNO (dest));
13933           dest = nmask;
13934           op0 = simplify_gen_subreg (vmode, op0, mode, 0);
13935           x = gen_rtx_AND (vmode, dest, op0);
13936         }
13937       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
13938     }
13939
13940   x = gen_rtx_IOR (vmode, dest, scratch);
13941   emit_insn (gen_rtx_SET (VOIDmode, dest, x));
13942 }
13943
13944 /* Return TRUE or FALSE depending on whether the first SET in INSN
13945    has source and destination with matching CC modes, and that the
13946    CC mode is at least as constrained as REQ_MODE.  */
13947
13948 int
13949 ix86_match_ccmode (rtx insn, enum machine_mode req_mode)
13950 {
13951   rtx set;
13952   enum machine_mode set_mode;
13953
13954   set = PATTERN (insn);
13955   if (GET_CODE (set) == PARALLEL)
13956     set = XVECEXP (set, 0, 0);
13957   gcc_assert (GET_CODE (set) == SET);
13958   gcc_assert (GET_CODE (SET_SRC (set)) == COMPARE);
13959
13960   set_mode = GET_MODE (SET_DEST (set));
13961   switch (set_mode)
13962     {
13963     case CCNOmode:
13964       if (req_mode != CCNOmode
13965           && (req_mode != CCmode
13966               || XEXP (SET_SRC (set), 1) != const0_rtx))
13967         return 0;
13968       break;
13969     case CCmode:
13970       if (req_mode == CCGCmode)
13971         return 0;
13972       /* FALLTHRU */
13973     case CCGCmode:
13974       if (req_mode == CCGOCmode || req_mode == CCNOmode)
13975         return 0;
13976       /* FALLTHRU */
13977     case CCGOCmode:
13978       if (req_mode == CCZmode)
13979         return 0;
13980       /* FALLTHRU */
13981     case CCAmode:
13982     case CCCmode:
13983     case CCOmode:
13984     case CCSmode:
13985     case CCZmode:
13986       break;
13987
13988     default:
13989       gcc_unreachable ();
13990     }
13991
13992   return (GET_MODE (SET_SRC (set)) == set_mode);
13993 }
13994
13995 /* Generate insn patterns to do an integer compare of OPERANDS.  */
13996
13997 static rtx
13998 ix86_expand_int_compare (enum rtx_code code, rtx op0, rtx op1)
13999 {
14000   enum machine_mode cmpmode;
14001   rtx tmp, flags;
14002
14003   cmpmode = SELECT_CC_MODE (code, op0, op1);
14004   flags = gen_rtx_REG (cmpmode, FLAGS_REG);
14005
14006   /* This is very simple, but making the interface the same as in the
14007      FP case makes the rest of the code easier.  */
14008   tmp = gen_rtx_COMPARE (cmpmode, op0, op1);
14009   emit_insn (gen_rtx_SET (VOIDmode, flags, tmp));
14010
14011   /* Return the test that should be put into the flags user, i.e.
14012      the bcc, scc, or cmov instruction.  */
14013   return gen_rtx_fmt_ee (code, VOIDmode, flags, const0_rtx);
14014 }
14015
14016 /* Figure out whether to use ordered or unordered fp comparisons.
14017    Return the appropriate mode to use.  */
14018
14019 enum machine_mode
14020 ix86_fp_compare_mode (enum rtx_code code ATTRIBUTE_UNUSED)
14021 {
14022   /* ??? In order to make all comparisons reversible, we do all comparisons
14023      non-trapping when compiling for IEEE.  Once gcc is able to distinguish
14024      all forms trapping and nontrapping comparisons, we can make inequality
14025      comparisons trapping again, since it results in better code when using
14026      FCOM based compares.  */
14027   return TARGET_IEEE_FP ? CCFPUmode : CCFPmode;
14028 }
14029
14030 enum machine_mode
14031 ix86_cc_mode (enum rtx_code code, rtx op0, rtx op1)
14032 {
14033   enum machine_mode mode = GET_MODE (op0);
14034
14035   if (SCALAR_FLOAT_MODE_P (mode))
14036     {
14037       gcc_assert (!DECIMAL_FLOAT_MODE_P (mode));
14038       return ix86_fp_compare_mode (code);
14039     }
14040
14041   switch (code)
14042     {
14043       /* Only zero flag is needed.  */
14044     case EQ:                    /* ZF=0 */
14045     case NE:                    /* ZF!=0 */
14046       return CCZmode;
14047       /* Codes needing carry flag.  */
14048     case GEU:                   /* CF=0 */
14049     case LTU:                   /* CF=1 */
14050       /* Detect overflow checks.  They need just the carry flag.  */
14051       if (GET_CODE (op0) == PLUS
14052           && rtx_equal_p (op1, XEXP (op0, 0)))
14053         return CCCmode;
14054       else
14055         return CCmode;
14056     case GTU:                   /* CF=0 & ZF=0 */
14057     case LEU:                   /* CF=1 | ZF=1 */
14058       /* Detect overflow checks.  They need just the carry flag.  */
14059       if (GET_CODE (op0) == MINUS
14060           && rtx_equal_p (op1, XEXP (op0, 0)))
14061         return CCCmode;
14062       else
14063         return CCmode;
14064       /* Codes possibly doable only with sign flag when
14065          comparing against zero.  */
14066     case GE:                    /* SF=OF   or   SF=0 */
14067     case LT:                    /* SF<>OF  or   SF=1 */
14068       if (op1 == const0_rtx)
14069         return CCGOCmode;
14070       else
14071         /* For other cases Carry flag is not required.  */
14072         return CCGCmode;
14073       /* Codes doable only with sign flag when comparing
14074          against zero, but we miss jump instruction for it
14075          so we need to use relational tests against overflow
14076          that thus needs to be zero.  */
14077     case GT:                    /* ZF=0 & SF=OF */
14078     case LE:                    /* ZF=1 | SF<>OF */
14079       if (op1 == const0_rtx)
14080         return CCNOmode;
14081       else
14082         return CCGCmode;
14083       /* strcmp pattern do (use flags) and combine may ask us for proper
14084          mode.  */
14085     case USE:
14086       return CCmode;
14087     default:
14088       gcc_unreachable ();
14089     }
14090 }
14091
14092 /* Return the fixed registers used for condition codes.  */
14093
14094 static bool
14095 ix86_fixed_condition_code_regs (unsigned int *p1, unsigned int *p2)
14096 {
14097   *p1 = FLAGS_REG;
14098   *p2 = FPSR_REG;
14099   return true;
14100 }
14101
14102 /* If two condition code modes are compatible, return a condition code
14103    mode which is compatible with both.  Otherwise, return
14104    VOIDmode.  */
14105
14106 static enum machine_mode
14107 ix86_cc_modes_compatible (enum machine_mode m1, enum machine_mode m2)
14108 {
14109   if (m1 == m2)
14110     return m1;
14111
14112   if (GET_MODE_CLASS (m1) != MODE_CC || GET_MODE_CLASS (m2) != MODE_CC)
14113     return VOIDmode;
14114
14115   if ((m1 == CCGCmode && m2 == CCGOCmode)
14116       || (m1 == CCGOCmode && m2 == CCGCmode))
14117     return CCGCmode;
14118
14119   switch (m1)
14120     {
14121     default:
14122       gcc_unreachable ();
14123
14124     case CCmode:
14125     case CCGCmode:
14126     case CCGOCmode:
14127     case CCNOmode:
14128     case CCAmode:
14129     case CCCmode:
14130     case CCOmode:
14131     case CCSmode:
14132     case CCZmode:
14133       switch (m2)
14134         {
14135         default:
14136           return VOIDmode;
14137
14138         case CCmode:
14139         case CCGCmode:
14140         case CCGOCmode:
14141         case CCNOmode:
14142         case CCAmode:
14143         case CCCmode:
14144         case CCOmode:
14145         case CCSmode:
14146         case CCZmode:
14147           return CCmode;
14148         }
14149
14150     case CCFPmode:
14151     case CCFPUmode:
14152       /* These are only compatible with themselves, which we already
14153          checked above.  */
14154       return VOIDmode;
14155     }
14156 }
14157
14158 /* Split comparison code CODE into comparisons we can do using branch
14159    instructions.  BYPASS_CODE is comparison code for branch that will
14160    branch around FIRST_CODE and SECOND_CODE.  If some of branches
14161    is not required, set value to UNKNOWN.
14162    We never require more than two branches.  */
14163
14164 void
14165 ix86_fp_comparison_codes (enum rtx_code code, enum rtx_code *bypass_code,
14166                           enum rtx_code *first_code,
14167                           enum rtx_code *second_code)
14168 {
14169   *first_code = code;
14170   *bypass_code = UNKNOWN;
14171   *second_code = UNKNOWN;
14172
14173   /* The fcomi comparison sets flags as follows:
14174
14175      cmp    ZF PF CF
14176      >      0  0  0
14177      <      0  0  1
14178      =      1  0  0
14179      un     1  1  1 */
14180
14181   switch (code)
14182     {
14183     case GT:                    /* GTU - CF=0 & ZF=0 */
14184     case GE:                    /* GEU - CF=0 */
14185     case ORDERED:               /* PF=0 */
14186     case UNORDERED:             /* PF=1 */
14187     case UNEQ:                  /* EQ - ZF=1 */
14188     case UNLT:                  /* LTU - CF=1 */
14189     case UNLE:                  /* LEU - CF=1 | ZF=1 */
14190     case LTGT:                  /* EQ - ZF=0 */
14191       break;
14192     case LT:                    /* LTU - CF=1 - fails on unordered */
14193       *first_code = UNLT;
14194       *bypass_code = UNORDERED;
14195       break;
14196     case LE:                    /* LEU - CF=1 | ZF=1 - fails on unordered */
14197       *first_code = UNLE;
14198       *bypass_code = UNORDERED;
14199       break;
14200     case EQ:                    /* EQ - ZF=1 - fails on unordered */
14201       *first_code = UNEQ;
14202       *bypass_code = UNORDERED;
14203       break;
14204     case NE:                    /* NE - ZF=0 - fails on unordered */
14205       *first_code = LTGT;
14206       *second_code = UNORDERED;
14207       break;
14208     case UNGE:                  /* GEU - CF=0 - fails on unordered */
14209       *first_code = GE;
14210       *second_code = UNORDERED;
14211       break;
14212     case UNGT:                  /* GTU - CF=0 & ZF=0 - fails on unordered */
14213       *first_code = GT;
14214       *second_code = UNORDERED;
14215       break;
14216     default:
14217       gcc_unreachable ();
14218     }
14219   if (!TARGET_IEEE_FP)
14220     {
14221       *second_code = UNKNOWN;
14222       *bypass_code = UNKNOWN;
14223     }
14224 }
14225
14226 /* Return cost of comparison done fcom + arithmetics operations on AX.
14227    All following functions do use number of instructions as a cost metrics.
14228    In future this should be tweaked to compute bytes for optimize_size and
14229    take into account performance of various instructions on various CPUs.  */
14230 static int
14231 ix86_fp_comparison_arithmetics_cost (enum rtx_code code)
14232 {
14233   if (!TARGET_IEEE_FP)
14234     return 4;
14235   /* The cost of code output by ix86_expand_fp_compare.  */
14236   switch (code)
14237     {
14238     case UNLE:
14239     case UNLT:
14240     case LTGT:
14241     case GT:
14242     case GE:
14243     case UNORDERED:
14244     case ORDERED:
14245     case UNEQ:
14246       return 4;
14247       break;
14248     case LT:
14249     case NE:
14250     case EQ:
14251     case UNGE:
14252       return 5;
14253       break;
14254     case LE:
14255     case UNGT:
14256       return 6;
14257       break;
14258     default:
14259       gcc_unreachable ();
14260     }
14261 }
14262
14263 /* Return cost of comparison done using fcomi operation.
14264    See ix86_fp_comparison_arithmetics_cost for the metrics.  */
14265 static int
14266 ix86_fp_comparison_fcomi_cost (enum rtx_code code)
14267 {
14268   enum rtx_code bypass_code, first_code, second_code;
14269   /* Return arbitrarily high cost when instruction is not supported - this
14270      prevents gcc from using it.  */
14271   if (!TARGET_CMOVE)
14272     return 1024;
14273   ix86_fp_comparison_codes (code, &bypass_code, &first_code, &second_code);
14274   return (bypass_code != UNKNOWN || second_code != UNKNOWN) + 2;
14275 }
14276
14277 /* Return cost of comparison done using sahf operation.
14278    See ix86_fp_comparison_arithmetics_cost for the metrics.  */
14279 static int
14280 ix86_fp_comparison_sahf_cost (enum rtx_code code)
14281 {
14282   enum rtx_code bypass_code, first_code, second_code;
14283   /* Return arbitrarily high cost when instruction is not preferred - this
14284      avoids gcc from using it.  */
14285   if (!(TARGET_SAHF && (TARGET_USE_SAHF || optimize_insn_for_size_p ())))
14286     return 1024;
14287   ix86_fp_comparison_codes (code, &bypass_code, &first_code, &second_code);
14288   return (bypass_code != UNKNOWN || second_code != UNKNOWN) + 3;
14289 }
14290
14291 /* Compute cost of the comparison done using any method.
14292    See ix86_fp_comparison_arithmetics_cost for the metrics.  */
14293 static int
14294 ix86_fp_comparison_cost (enum rtx_code code)
14295 {
14296   int fcomi_cost, sahf_cost, arithmetics_cost = 1024;
14297   int min;
14298
14299   fcomi_cost = ix86_fp_comparison_fcomi_cost (code);
14300   sahf_cost = ix86_fp_comparison_sahf_cost (code);
14301
14302   min = arithmetics_cost = ix86_fp_comparison_arithmetics_cost (code);
14303   if (min > sahf_cost)
14304     min = sahf_cost;
14305   if (min > fcomi_cost)
14306     min = fcomi_cost;
14307   return min;
14308 }
14309
14310 /* Return true if we should use an FCOMI instruction for this
14311    fp comparison.  */
14312
14313 int
14314 ix86_use_fcomi_compare (enum rtx_code code ATTRIBUTE_UNUSED)
14315 {
14316   enum rtx_code swapped_code = swap_condition (code);
14317
14318   return ((ix86_fp_comparison_cost (code)
14319            == ix86_fp_comparison_fcomi_cost (code))
14320           || (ix86_fp_comparison_cost (swapped_code)
14321               == ix86_fp_comparison_fcomi_cost (swapped_code)));
14322 }
14323
14324 /* Swap, force into registers, or otherwise massage the two operands
14325    to a fp comparison.  The operands are updated in place; the new
14326    comparison code is returned.  */
14327
14328 static enum rtx_code
14329 ix86_prepare_fp_compare_args (enum rtx_code code, rtx *pop0, rtx *pop1)
14330 {
14331   enum machine_mode fpcmp_mode = ix86_fp_compare_mode (code);
14332   rtx op0 = *pop0, op1 = *pop1;
14333   enum machine_mode op_mode = GET_MODE (op0);
14334   int is_sse = TARGET_SSE_MATH && SSE_FLOAT_MODE_P (op_mode);
14335
14336   /* All of the unordered compare instructions only work on registers.
14337      The same is true of the fcomi compare instructions.  The XFmode
14338      compare instructions require registers except when comparing
14339      against zero or when converting operand 1 from fixed point to
14340      floating point.  */
14341
14342   if (!is_sse
14343       && (fpcmp_mode == CCFPUmode
14344           || (op_mode == XFmode
14345               && ! (standard_80387_constant_p (op0) == 1
14346                     || standard_80387_constant_p (op1) == 1)
14347               && GET_CODE (op1) != FLOAT)
14348           || ix86_use_fcomi_compare (code)))
14349     {
14350       op0 = force_reg (op_mode, op0);
14351       op1 = force_reg (op_mode, op1);
14352     }
14353   else
14354     {
14355       /* %%% We only allow op1 in memory; op0 must be st(0).  So swap
14356          things around if they appear profitable, otherwise force op0
14357          into a register.  */
14358
14359       if (standard_80387_constant_p (op0) == 0
14360           || (MEM_P (op0)
14361               && ! (standard_80387_constant_p (op1) == 0
14362                     || MEM_P (op1))))
14363         {
14364           rtx tmp;
14365           tmp = op0, op0 = op1, op1 = tmp;
14366           code = swap_condition (code);
14367         }
14368
14369       if (!REG_P (op0))
14370         op0 = force_reg (op_mode, op0);
14371
14372       if (CONSTANT_P (op1))
14373         {
14374           int tmp = standard_80387_constant_p (op1);
14375           if (tmp == 0)
14376             op1 = validize_mem (force_const_mem (op_mode, op1));
14377           else if (tmp == 1)
14378             {
14379               if (TARGET_CMOVE)
14380                 op1 = force_reg (op_mode, op1);
14381             }
14382           else
14383             op1 = force_reg (op_mode, op1);
14384         }
14385     }
14386
14387   /* Try to rearrange the comparison to make it cheaper.  */
14388   if (ix86_fp_comparison_cost (code)
14389       > ix86_fp_comparison_cost (swap_condition (code))
14390       && (REG_P (op1) || can_create_pseudo_p ()))
14391     {
14392       rtx tmp;
14393       tmp = op0, op0 = op1, op1 = tmp;
14394       code = swap_condition (code);
14395       if (!REG_P (op0))
14396         op0 = force_reg (op_mode, op0);
14397     }
14398
14399   *pop0 = op0;
14400   *pop1 = op1;
14401   return code;
14402 }
14403
14404 /* Convert comparison codes we use to represent FP comparison to integer
14405    code that will result in proper branch.  Return UNKNOWN if no such code
14406    is available.  */
14407
14408 enum rtx_code
14409 ix86_fp_compare_code_to_integer (enum rtx_code code)
14410 {
14411   switch (code)
14412     {
14413     case GT:
14414       return GTU;
14415     case GE:
14416       return GEU;
14417     case ORDERED:
14418     case UNORDERED:
14419       return code;
14420       break;
14421     case UNEQ:
14422       return EQ;
14423       break;
14424     case UNLT:
14425       return LTU;
14426       break;
14427     case UNLE:
14428       return LEU;
14429       break;
14430     case LTGT:
14431       return NE;
14432       break;
14433     default:
14434       return UNKNOWN;
14435     }
14436 }
14437
14438 /* Generate insn patterns to do a floating point compare of OPERANDS.  */
14439
14440 static rtx
14441 ix86_expand_fp_compare (enum rtx_code code, rtx op0, rtx op1, rtx scratch,
14442                         rtx *second_test, rtx *bypass_test)
14443 {
14444   enum machine_mode fpcmp_mode, intcmp_mode;
14445   rtx tmp, tmp2;
14446   int cost = ix86_fp_comparison_cost (code);
14447   enum rtx_code bypass_code, first_code, second_code;
14448
14449   fpcmp_mode = ix86_fp_compare_mode (code);
14450   code = ix86_prepare_fp_compare_args (code, &op0, &op1);
14451
14452   if (second_test)
14453     *second_test = NULL_RTX;
14454   if (bypass_test)
14455     *bypass_test = NULL_RTX;
14456
14457   ix86_fp_comparison_codes (code, &bypass_code, &first_code, &second_code);
14458
14459   /* Do fcomi/sahf based test when profitable.  */
14460   if (ix86_fp_comparison_arithmetics_cost (code) > cost
14461       && (bypass_code == UNKNOWN || bypass_test)
14462       && (second_code == UNKNOWN || second_test))
14463     {
14464       tmp = gen_rtx_COMPARE (fpcmp_mode, op0, op1);
14465       tmp = gen_rtx_SET (VOIDmode, gen_rtx_REG (fpcmp_mode, FLAGS_REG),
14466                          tmp);
14467       if (TARGET_CMOVE)
14468         emit_insn (tmp);
14469       else
14470         {
14471           gcc_assert (TARGET_SAHF);
14472
14473           if (!scratch)
14474             scratch = gen_reg_rtx (HImode);
14475           tmp2 = gen_rtx_CLOBBER (VOIDmode, scratch);
14476
14477           emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, tmp, tmp2)));
14478         }
14479
14480       /* The FP codes work out to act like unsigned.  */
14481       intcmp_mode = fpcmp_mode;
14482       code = first_code;
14483       if (bypass_code != UNKNOWN)
14484         *bypass_test = gen_rtx_fmt_ee (bypass_code, VOIDmode,
14485                                        gen_rtx_REG (intcmp_mode, FLAGS_REG),
14486                                        const0_rtx);
14487       if (second_code != UNKNOWN)
14488         *second_test = gen_rtx_fmt_ee (second_code, VOIDmode,
14489                                        gen_rtx_REG (intcmp_mode, FLAGS_REG),
14490                                        const0_rtx);
14491     }
14492   else
14493     {
14494       /* Sadness wrt reg-stack pops killing fpsr -- gotta get fnstsw first.  */
14495       tmp = gen_rtx_COMPARE (fpcmp_mode, op0, op1);
14496       tmp2 = gen_rtx_UNSPEC (HImode, gen_rtvec (1, tmp), UNSPEC_FNSTSW);
14497       if (!scratch)
14498         scratch = gen_reg_rtx (HImode);
14499       emit_insn (gen_rtx_SET (VOIDmode, scratch, tmp2));
14500
14501       /* In the unordered case, we have to check C2 for NaN's, which
14502          doesn't happen to work out to anything nice combination-wise.
14503          So do some bit twiddling on the value we've got in AH to come
14504          up with an appropriate set of condition codes.  */
14505
14506       intcmp_mode = CCNOmode;
14507       switch (code)
14508         {
14509         case GT:
14510         case UNGT:
14511           if (code == GT || !TARGET_IEEE_FP)
14512             {
14513               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x45)));
14514               code = EQ;
14515             }
14516           else
14517             {
14518               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
14519               emit_insn (gen_addqi_ext_1 (scratch, scratch, constm1_rtx));
14520               emit_insn (gen_cmpqi_ext_3 (scratch, GEN_INT (0x44)));
14521               intcmp_mode = CCmode;
14522               code = GEU;
14523             }
14524           break;
14525         case LT:
14526         case UNLT:
14527           if (code == LT && TARGET_IEEE_FP)
14528             {
14529               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
14530               emit_insn (gen_cmpqi_ext_3 (scratch, GEN_INT (0x01)));
14531               intcmp_mode = CCmode;
14532               code = EQ;
14533             }
14534           else
14535             {
14536               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x01)));
14537               code = NE;
14538             }
14539           break;
14540         case GE:
14541         case UNGE:
14542           if (code == GE || !TARGET_IEEE_FP)
14543             {
14544               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x05)));
14545               code = EQ;
14546             }
14547           else
14548             {
14549               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
14550               emit_insn (gen_xorqi_cc_ext_1 (scratch, scratch,
14551                                              GEN_INT (0x01)));
14552               code = NE;
14553             }
14554           break;
14555         case LE:
14556         case UNLE:
14557           if (code == LE && TARGET_IEEE_FP)
14558             {
14559               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
14560               emit_insn (gen_addqi_ext_1 (scratch, scratch, constm1_rtx));
14561               emit_insn (gen_cmpqi_ext_3 (scratch, GEN_INT (0x40)));
14562               intcmp_mode = CCmode;
14563               code = LTU;
14564             }
14565           else
14566             {
14567               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x45)));
14568               code = NE;
14569             }
14570           break;
14571         case EQ:
14572         case UNEQ:
14573           if (code == EQ && TARGET_IEEE_FP)
14574             {
14575               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
14576               emit_insn (gen_cmpqi_ext_3 (scratch, GEN_INT (0x40)));
14577               intcmp_mode = CCmode;
14578               code = EQ;
14579             }
14580           else
14581             {
14582               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x40)));
14583               code = NE;
14584               break;
14585             }
14586           break;
14587         case NE:
14588         case LTGT:
14589           if (code == NE && TARGET_IEEE_FP)
14590             {
14591               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
14592               emit_insn (gen_xorqi_cc_ext_1 (scratch, scratch,
14593                                              GEN_INT (0x40)));
14594               code = NE;
14595             }
14596           else
14597             {
14598               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x40)));
14599               code = EQ;
14600             }
14601           break;
14602
14603         case UNORDERED:
14604           emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x04)));
14605           code = NE;
14606           break;
14607         case ORDERED:
14608           emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x04)));
14609           code = EQ;
14610           break;
14611
14612         default:
14613           gcc_unreachable ();
14614         }
14615     }
14616
14617   /* Return the test that should be put into the flags user, i.e.
14618      the bcc, scc, or cmov instruction.  */
14619   return gen_rtx_fmt_ee (code, VOIDmode,
14620                          gen_rtx_REG (intcmp_mode, FLAGS_REG),
14621                          const0_rtx);
14622 }
14623
14624 rtx
14625 ix86_expand_compare (enum rtx_code code, rtx *second_test, rtx *bypass_test)
14626 {
14627   rtx op0, op1, ret;
14628   op0 = ix86_compare_op0;
14629   op1 = ix86_compare_op1;
14630
14631   if (second_test)
14632     *second_test = NULL_RTX;
14633   if (bypass_test)
14634     *bypass_test = NULL_RTX;
14635
14636   if (GET_MODE_CLASS (GET_MODE (ix86_compare_op0)) == MODE_CC)
14637     ret = gen_rtx_fmt_ee (code, VOIDmode, ix86_compare_op0, ix86_compare_op1);
14638
14639   else if (SCALAR_FLOAT_MODE_P (GET_MODE (op0)))
14640     {
14641       gcc_assert (!DECIMAL_FLOAT_MODE_P (GET_MODE (op0)));
14642       ret = ix86_expand_fp_compare (code, op0, op1, NULL_RTX,
14643                                     second_test, bypass_test);
14644     }
14645   else
14646     ret = ix86_expand_int_compare (code, op0, op1);
14647
14648   return ret;
14649 }
14650
14651 /* Return true if the CODE will result in nontrivial jump sequence.  */
14652 bool
14653 ix86_fp_jump_nontrivial_p (enum rtx_code code)
14654 {
14655   enum rtx_code bypass_code, first_code, second_code;
14656   if (!TARGET_CMOVE)
14657     return true;
14658   ix86_fp_comparison_codes (code, &bypass_code, &first_code, &second_code);
14659   return bypass_code != UNKNOWN || second_code != UNKNOWN;
14660 }
14661
14662 void
14663 ix86_expand_branch (enum rtx_code code, rtx label)
14664 {
14665   rtx tmp;
14666
14667   switch (GET_MODE (ix86_compare_op0))
14668     {
14669     case QImode:
14670     case HImode:
14671     case SImode:
14672       simple:
14673       tmp = ix86_expand_compare (code, NULL, NULL);
14674       tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp,
14675                                   gen_rtx_LABEL_REF (VOIDmode, label),
14676                                   pc_rtx);
14677       emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, tmp));
14678       return;
14679
14680     case SFmode:
14681     case DFmode:
14682     case XFmode:
14683       {
14684         rtvec vec;
14685         int use_fcomi;
14686         enum rtx_code bypass_code, first_code, second_code;
14687
14688         code = ix86_prepare_fp_compare_args (code, &ix86_compare_op0,
14689                                              &ix86_compare_op1);
14690
14691         ix86_fp_comparison_codes (code, &bypass_code, &first_code, &second_code);
14692
14693         /* Check whether we will use the natural sequence with one jump.  If
14694            so, we can expand jump early.  Otherwise delay expansion by
14695            creating compound insn to not confuse optimizers.  */
14696         if (bypass_code == UNKNOWN && second_code == UNKNOWN)
14697           {
14698             ix86_split_fp_branch (code, ix86_compare_op0, ix86_compare_op1,
14699                                   gen_rtx_LABEL_REF (VOIDmode, label),
14700                                   pc_rtx, NULL_RTX, NULL_RTX);
14701           }
14702         else
14703           {
14704             tmp = gen_rtx_fmt_ee (code, VOIDmode,
14705                                   ix86_compare_op0, ix86_compare_op1);
14706             tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp,
14707                                         gen_rtx_LABEL_REF (VOIDmode, label),
14708                                         pc_rtx);
14709             tmp = gen_rtx_SET (VOIDmode, pc_rtx, tmp);
14710
14711             use_fcomi = ix86_use_fcomi_compare (code);
14712             vec = rtvec_alloc (3 + !use_fcomi);
14713             RTVEC_ELT (vec, 0) = tmp;
14714             RTVEC_ELT (vec, 1)
14715               = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCFPmode, FPSR_REG));
14716             RTVEC_ELT (vec, 2)
14717               = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCFPmode, FLAGS_REG));
14718             if (! use_fcomi)
14719               RTVEC_ELT (vec, 3)
14720                 = gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (HImode));
14721
14722             emit_jump_insn (gen_rtx_PARALLEL (VOIDmode, vec));
14723           }
14724         return;
14725       }
14726
14727     case DImode:
14728       if (TARGET_64BIT)
14729         goto simple;
14730     case TImode:
14731       /* Expand DImode branch into multiple compare+branch.  */
14732       {
14733         rtx lo[2], hi[2], label2;
14734         enum rtx_code code1, code2, code3;
14735         enum machine_mode submode;
14736
14737         if (CONSTANT_P (ix86_compare_op0) && ! CONSTANT_P (ix86_compare_op1))
14738           {
14739             tmp = ix86_compare_op0;
14740             ix86_compare_op0 = ix86_compare_op1;
14741             ix86_compare_op1 = tmp;
14742             code = swap_condition (code);
14743           }
14744         if (GET_MODE (ix86_compare_op0) == DImode)
14745           {
14746             split_di (&ix86_compare_op0, 1, lo+0, hi+0);
14747             split_di (&ix86_compare_op1, 1, lo+1, hi+1);
14748             submode = SImode;
14749           }
14750         else
14751           {
14752             split_ti (&ix86_compare_op0, 1, lo+0, hi+0);
14753             split_ti (&ix86_compare_op1, 1, lo+1, hi+1);
14754             submode = DImode;
14755           }
14756
14757         /* When comparing for equality, we can use (hi0^hi1)|(lo0^lo1) to
14758            avoid two branches.  This costs one extra insn, so disable when
14759            optimizing for size.  */
14760
14761         if ((code == EQ || code == NE)
14762             && (!optimize_insn_for_size_p ()
14763                 || hi[1] == const0_rtx || lo[1] == const0_rtx))
14764           {
14765             rtx xor0, xor1;
14766
14767             xor1 = hi[0];
14768             if (hi[1] != const0_rtx)
14769               xor1 = expand_binop (submode, xor_optab, xor1, hi[1],
14770                                    NULL_RTX, 0, OPTAB_WIDEN);
14771
14772             xor0 = lo[0];
14773             if (lo[1] != const0_rtx)
14774               xor0 = expand_binop (submode, xor_optab, xor0, lo[1],
14775                                    NULL_RTX, 0, OPTAB_WIDEN);
14776
14777             tmp = expand_binop (submode, ior_optab, xor1, xor0,
14778                                 NULL_RTX, 0, OPTAB_WIDEN);
14779
14780             ix86_compare_op0 = tmp;
14781             ix86_compare_op1 = const0_rtx;
14782             ix86_expand_branch (code, label);
14783             return;
14784           }
14785
14786         /* Otherwise, if we are doing less-than or greater-or-equal-than,
14787            op1 is a constant and the low word is zero, then we can just
14788            examine the high word.  Similarly for low word -1 and
14789            less-or-equal-than or greater-than.  */
14790
14791         if (CONST_INT_P (hi[1]))
14792           switch (code)
14793             {
14794             case LT: case LTU: case GE: case GEU:
14795               if (lo[1] == const0_rtx)
14796                 {
14797                   ix86_compare_op0 = hi[0];
14798                   ix86_compare_op1 = hi[1];
14799                   ix86_expand_branch (code, label);
14800                   return;
14801                 }
14802               break;
14803             case LE: case LEU: case GT: case GTU:
14804               if (lo[1] == constm1_rtx)
14805                 {
14806                   ix86_compare_op0 = hi[0];
14807                   ix86_compare_op1 = hi[1];
14808                   ix86_expand_branch (code, label);
14809                   return;
14810                 }
14811               break;
14812             default:
14813               break;
14814             }
14815
14816         /* Otherwise, we need two or three jumps.  */
14817
14818         label2 = gen_label_rtx ();
14819
14820         code1 = code;
14821         code2 = swap_condition (code);
14822         code3 = unsigned_condition (code);
14823
14824         switch (code)
14825           {
14826           case LT: case GT: case LTU: case GTU:
14827             break;
14828
14829           case LE:   code1 = LT;  code2 = GT;  break;
14830           case GE:   code1 = GT;  code2 = LT;  break;
14831           case LEU:  code1 = LTU; code2 = GTU; break;
14832           case GEU:  code1 = GTU; code2 = LTU; break;
14833
14834           case EQ:   code1 = UNKNOWN; code2 = NE;  break;
14835           case NE:   code2 = UNKNOWN; break;
14836
14837           default:
14838             gcc_unreachable ();
14839           }
14840
14841         /*
14842          * a < b =>
14843          *    if (hi(a) < hi(b)) goto true;
14844          *    if (hi(a) > hi(b)) goto false;
14845          *    if (lo(a) < lo(b)) goto true;
14846          *  false:
14847          */
14848
14849         ix86_compare_op0 = hi[0];
14850         ix86_compare_op1 = hi[1];
14851
14852         if (code1 != UNKNOWN)
14853           ix86_expand_branch (code1, label);
14854         if (code2 != UNKNOWN)
14855           ix86_expand_branch (code2, label2);
14856
14857         ix86_compare_op0 = lo[0];
14858         ix86_compare_op1 = lo[1];
14859         ix86_expand_branch (code3, label);
14860
14861         if (code2 != UNKNOWN)
14862           emit_label (label2);
14863         return;
14864       }
14865
14866     default:
14867       /* If we have already emitted a compare insn, go straight to simple.
14868          ix86_expand_compare won't emit anything if ix86_compare_emitted
14869          is non NULL.  */
14870       gcc_assert (GET_MODE_CLASS (GET_MODE (ix86_compare_op0)) == MODE_CC);
14871       goto simple;
14872     }
14873 }
14874
14875 /* Split branch based on floating point condition.  */
14876 void
14877 ix86_split_fp_branch (enum rtx_code code, rtx op1, rtx op2,
14878                       rtx target1, rtx target2, rtx tmp, rtx pushed)
14879 {
14880   rtx second, bypass;
14881   rtx label = NULL_RTX;
14882   rtx condition;
14883   int bypass_probability = -1, second_probability = -1, probability = -1;
14884   rtx i;
14885
14886   if (target2 != pc_rtx)
14887     {
14888       rtx tmp = target2;
14889       code = reverse_condition_maybe_unordered (code);
14890       target2 = target1;
14891       target1 = tmp;
14892     }
14893
14894   condition = ix86_expand_fp_compare (code, op1, op2,
14895                                       tmp, &second, &bypass);
14896
14897   /* Remove pushed operand from stack.  */
14898   if (pushed)
14899     ix86_free_from_memory (GET_MODE (pushed));
14900
14901   if (split_branch_probability >= 0)
14902     {
14903       /* Distribute the probabilities across the jumps.
14904          Assume the BYPASS and SECOND to be always test
14905          for UNORDERED.  */
14906       probability = split_branch_probability;
14907
14908       /* Value of 1 is low enough to make no need for probability
14909          to be updated.  Later we may run some experiments and see
14910          if unordered values are more frequent in practice.  */
14911       if (bypass)
14912         bypass_probability = 1;
14913       if (second)
14914         second_probability = 1;
14915     }
14916   if (bypass != NULL_RTX)
14917     {
14918       label = gen_label_rtx ();
14919       i = emit_jump_insn (gen_rtx_SET
14920                           (VOIDmode, pc_rtx,
14921                            gen_rtx_IF_THEN_ELSE (VOIDmode,
14922                                                  bypass,
14923                                                  gen_rtx_LABEL_REF (VOIDmode,
14924                                                                     label),
14925                                                  pc_rtx)));
14926       if (bypass_probability >= 0)
14927         add_reg_note (i, REG_BR_PROB, GEN_INT (bypass_probability));
14928     }
14929   i = emit_jump_insn (gen_rtx_SET
14930                       (VOIDmode, pc_rtx,
14931                        gen_rtx_IF_THEN_ELSE (VOIDmode,
14932                                              condition, target1, target2)));
14933   if (probability >= 0)
14934     add_reg_note (i, REG_BR_PROB, GEN_INT (probability));
14935   if (second != NULL_RTX)
14936     {
14937       i = emit_jump_insn (gen_rtx_SET
14938                           (VOIDmode, pc_rtx,
14939                            gen_rtx_IF_THEN_ELSE (VOIDmode, second, target1,
14940                                                  target2)));
14941       if (second_probability >= 0)
14942         add_reg_note (i, REG_BR_PROB, GEN_INT (second_probability));
14943     }
14944   if (label != NULL_RTX)
14945     emit_label (label);
14946 }
14947
14948 void
14949 ix86_expand_setcc (enum rtx_code code, rtx dest)
14950 {
14951   rtx ret, tmp, tmpreg, equiv;
14952   rtx second_test, bypass_test;
14953
14954   gcc_assert (GET_MODE (dest) == QImode);
14955
14956   ret = ix86_expand_compare (code, &second_test, &bypass_test);
14957   PUT_MODE (ret, QImode);
14958
14959   tmp = dest;
14960   tmpreg = dest;
14961
14962   emit_insn (gen_rtx_SET (VOIDmode, tmp, ret));
14963   if (bypass_test || second_test)
14964     {
14965       rtx test = second_test;
14966       int bypass = 0;
14967       rtx tmp2 = gen_reg_rtx (QImode);
14968       if (bypass_test)
14969         {
14970           gcc_assert (!second_test);
14971           test = bypass_test;
14972           bypass = 1;
14973           PUT_CODE (test, reverse_condition_maybe_unordered (GET_CODE (test)));
14974         }
14975       PUT_MODE (test, QImode);
14976       emit_insn (gen_rtx_SET (VOIDmode, tmp2, test));
14977
14978       if (bypass)
14979         emit_insn (gen_andqi3 (tmp, tmpreg, tmp2));
14980       else
14981         emit_insn (gen_iorqi3 (tmp, tmpreg, tmp2));
14982     }
14983
14984   /* Attach a REG_EQUAL note describing the comparison result.  */
14985   if (ix86_compare_op0 && ix86_compare_op1)
14986     {
14987       equiv = simplify_gen_relational (code, QImode,
14988                                        GET_MODE (ix86_compare_op0),
14989                                        ix86_compare_op0, ix86_compare_op1);
14990       set_unique_reg_note (get_last_insn (), REG_EQUAL, equiv);
14991     }
14992 }
14993
14994 /* Expand comparison setting or clearing carry flag.  Return true when
14995    successful and set pop for the operation.  */
14996 static bool
14997 ix86_expand_carry_flag_compare (enum rtx_code code, rtx op0, rtx op1, rtx *pop)
14998 {
14999   enum machine_mode mode =
15000     GET_MODE (op0) != VOIDmode ? GET_MODE (op0) : GET_MODE (op1);
15001
15002   /* Do not handle DImode compares that go through special path.  */
15003   if (mode == (TARGET_64BIT ? TImode : DImode))
15004     return false;
15005
15006   if (SCALAR_FLOAT_MODE_P (mode))
15007     {
15008       rtx second_test = NULL, bypass_test = NULL;
15009       rtx compare_op, compare_seq;
15010
15011       gcc_assert (!DECIMAL_FLOAT_MODE_P (mode));
15012
15013       /* Shortcut:  following common codes never translate
15014          into carry flag compares.  */
15015       if (code == EQ || code == NE || code == UNEQ || code == LTGT
15016           || code == ORDERED || code == UNORDERED)
15017         return false;
15018
15019       /* These comparisons require zero flag; swap operands so they won't.  */
15020       if ((code == GT || code == UNLE || code == LE || code == UNGT)
15021           && !TARGET_IEEE_FP)
15022         {
15023           rtx tmp = op0;
15024           op0 = op1;
15025           op1 = tmp;
15026           code = swap_condition (code);
15027         }
15028
15029       /* Try to expand the comparison and verify that we end up with
15030          carry flag based comparison.  This fails to be true only when
15031          we decide to expand comparison using arithmetic that is not
15032          too common scenario.  */
15033       start_sequence ();
15034       compare_op = ix86_expand_fp_compare (code, op0, op1, NULL_RTX,
15035                                            &second_test, &bypass_test);
15036       compare_seq = get_insns ();
15037       end_sequence ();
15038
15039       if (second_test || bypass_test)
15040         return false;
15041
15042       if (GET_MODE (XEXP (compare_op, 0)) == CCFPmode
15043           || GET_MODE (XEXP (compare_op, 0)) == CCFPUmode)
15044         code = ix86_fp_compare_code_to_integer (GET_CODE (compare_op));
15045       else
15046         code = GET_CODE (compare_op);
15047
15048       if (code != LTU && code != GEU)
15049         return false;
15050
15051       emit_insn (compare_seq);
15052       *pop = compare_op;
15053       return true;
15054     }
15055
15056   if (!INTEGRAL_MODE_P (mode))
15057     return false;
15058
15059   switch (code)
15060     {
15061     case LTU:
15062     case GEU:
15063       break;
15064
15065     /* Convert a==0 into (unsigned)a<1.  */
15066     case EQ:
15067     case NE:
15068       if (op1 != const0_rtx)
15069         return false;
15070       op1 = const1_rtx;
15071       code = (code == EQ ? LTU : GEU);
15072       break;
15073
15074     /* Convert a>b into b<a or a>=b-1.  */
15075     case GTU:
15076     case LEU:
15077       if (CONST_INT_P (op1))
15078         {
15079           op1 = gen_int_mode (INTVAL (op1) + 1, GET_MODE (op0));
15080           /* Bail out on overflow.  We still can swap operands but that
15081              would force loading of the constant into register.  */
15082           if (op1 == const0_rtx
15083               || !x86_64_immediate_operand (op1, GET_MODE (op1)))
15084             return false;
15085           code = (code == GTU ? GEU : LTU);
15086         }
15087       else
15088         {
15089           rtx tmp = op1;
15090           op1 = op0;
15091           op0 = tmp;
15092           code = (code == GTU ? LTU : GEU);
15093         }
15094       break;
15095
15096     /* Convert a>=0 into (unsigned)a<0x80000000.  */
15097     case LT:
15098     case GE:
15099       if (mode == DImode || op1 != const0_rtx)
15100         return false;
15101       op1 = gen_int_mode (1 << (GET_MODE_BITSIZE (mode) - 1), mode);
15102       code = (code == LT ? GEU : LTU);
15103       break;
15104     case LE:
15105     case GT:
15106       if (mode == DImode || op1 != constm1_rtx)
15107         return false;
15108       op1 = gen_int_mode (1 << (GET_MODE_BITSIZE (mode) - 1), mode);
15109       code = (code == LE ? GEU : LTU);
15110       break;
15111
15112     default:
15113       return false;
15114     }
15115   /* Swapping operands may cause constant to appear as first operand.  */
15116   if (!nonimmediate_operand (op0, VOIDmode))
15117     {
15118       if (!can_create_pseudo_p ())
15119         return false;
15120       op0 = force_reg (mode, op0);
15121     }
15122   ix86_compare_op0 = op0;
15123   ix86_compare_op1 = op1;
15124   *pop = ix86_expand_compare (code, NULL, NULL);
15125   gcc_assert (GET_CODE (*pop) == LTU || GET_CODE (*pop) == GEU);
15126   return true;
15127 }
15128
15129 int
15130 ix86_expand_int_movcc (rtx operands[])
15131 {
15132   enum rtx_code code = GET_CODE (operands[1]), compare_code;
15133   rtx compare_seq, compare_op;
15134   rtx second_test, bypass_test;
15135   enum machine_mode mode = GET_MODE (operands[0]);
15136   bool sign_bit_compare_p = false;;
15137
15138   start_sequence ();
15139   ix86_compare_op0 = XEXP (operands[1], 0);
15140   ix86_compare_op1 = XEXP (operands[1], 1);
15141   compare_op = ix86_expand_compare (code, &second_test, &bypass_test);
15142   compare_seq = get_insns ();
15143   end_sequence ();
15144
15145   compare_code = GET_CODE (compare_op);
15146
15147   if ((ix86_compare_op1 == const0_rtx && (code == GE || code == LT))
15148       || (ix86_compare_op1 == constm1_rtx && (code == GT || code == LE)))
15149     sign_bit_compare_p = true;
15150
15151   /* Don't attempt mode expansion here -- if we had to expand 5 or 6
15152      HImode insns, we'd be swallowed in word prefix ops.  */
15153
15154   if ((mode != HImode || TARGET_FAST_PREFIX)
15155       && (mode != (TARGET_64BIT ? TImode : DImode))
15156       && CONST_INT_P (operands[2])
15157       && CONST_INT_P (operands[3]))
15158     {
15159       rtx out = operands[0];
15160       HOST_WIDE_INT ct = INTVAL (operands[2]);
15161       HOST_WIDE_INT cf = INTVAL (operands[3]);
15162       HOST_WIDE_INT diff;
15163
15164       diff = ct - cf;
15165       /*  Sign bit compares are better done using shifts than we do by using
15166           sbb.  */
15167       if (sign_bit_compare_p
15168           || ix86_expand_carry_flag_compare (code, ix86_compare_op0,
15169                                              ix86_compare_op1, &compare_op))
15170         {
15171           /* Detect overlap between destination and compare sources.  */
15172           rtx tmp = out;
15173
15174           if (!sign_bit_compare_p)
15175             {
15176               bool fpcmp = false;
15177
15178               compare_code = GET_CODE (compare_op);
15179
15180               if (GET_MODE (XEXP (compare_op, 0)) == CCFPmode
15181                   || GET_MODE (XEXP (compare_op, 0)) == CCFPUmode)
15182                 {
15183                   fpcmp = true;
15184                   compare_code = ix86_fp_compare_code_to_integer (compare_code);
15185                 }
15186
15187               /* To simplify rest of code, restrict to the GEU case.  */
15188               if (compare_code == LTU)
15189                 {
15190                   HOST_WIDE_INT tmp = ct;
15191                   ct = cf;
15192                   cf = tmp;
15193                   compare_code = reverse_condition (compare_code);
15194                   code = reverse_condition (code);
15195                 }
15196               else
15197                 {
15198                   if (fpcmp)
15199                     PUT_CODE (compare_op,
15200                               reverse_condition_maybe_unordered
15201                                 (GET_CODE (compare_op)));
15202                   else
15203                     PUT_CODE (compare_op, reverse_condition (GET_CODE (compare_op)));
15204                 }
15205               diff = ct - cf;
15206
15207               if (reg_overlap_mentioned_p (out, ix86_compare_op0)
15208                   || reg_overlap_mentioned_p (out, ix86_compare_op1))
15209                 tmp = gen_reg_rtx (mode);
15210
15211               if (mode == DImode)
15212                 emit_insn (gen_x86_movdicc_0_m1_rex64 (tmp, compare_op));
15213               else
15214                 emit_insn (gen_x86_movsicc_0_m1 (gen_lowpart (SImode, tmp), compare_op));
15215             }
15216           else
15217             {
15218               if (code == GT || code == GE)
15219                 code = reverse_condition (code);
15220               else
15221                 {
15222                   HOST_WIDE_INT tmp = ct;
15223                   ct = cf;
15224                   cf = tmp;
15225                   diff = ct - cf;
15226                 }
15227               tmp = emit_store_flag (tmp, code, ix86_compare_op0,
15228                                      ix86_compare_op1, VOIDmode, 0, -1);
15229             }
15230
15231           if (diff == 1)
15232             {
15233               /*
15234                * cmpl op0,op1
15235                * sbbl dest,dest
15236                * [addl dest, ct]
15237                *
15238                * Size 5 - 8.
15239                */
15240               if (ct)
15241                 tmp = expand_simple_binop (mode, PLUS,
15242                                            tmp, GEN_INT (ct),
15243                                            copy_rtx (tmp), 1, OPTAB_DIRECT);
15244             }
15245           else if (cf == -1)
15246             {
15247               /*
15248                * cmpl op0,op1
15249                * sbbl dest,dest
15250                * orl $ct, dest
15251                *
15252                * Size 8.
15253                */
15254               tmp = expand_simple_binop (mode, IOR,
15255                                          tmp, GEN_INT (ct),
15256                                          copy_rtx (tmp), 1, OPTAB_DIRECT);
15257             }
15258           else if (diff == -1 && ct)
15259             {
15260               /*
15261                * cmpl op0,op1
15262                * sbbl dest,dest
15263                * notl dest
15264                * [addl dest, cf]
15265                *
15266                * Size 8 - 11.
15267                */
15268               tmp = expand_simple_unop (mode, NOT, tmp, copy_rtx (tmp), 1);
15269               if (cf)
15270                 tmp = expand_simple_binop (mode, PLUS,
15271                                            copy_rtx (tmp), GEN_INT (cf),
15272                                            copy_rtx (tmp), 1, OPTAB_DIRECT);
15273             }
15274           else
15275             {
15276               /*
15277                * cmpl op0,op1
15278                * sbbl dest,dest
15279                * [notl dest]
15280                * andl cf - ct, dest
15281                * [addl dest, ct]
15282                *
15283                * Size 8 - 11.
15284                */
15285
15286               if (cf == 0)
15287                 {
15288                   cf = ct;
15289                   ct = 0;
15290                   tmp = expand_simple_unop (mode, NOT, tmp, copy_rtx (tmp), 1);
15291                 }
15292
15293               tmp = expand_simple_binop (mode, AND,
15294                                          copy_rtx (tmp),
15295                                          gen_int_mode (cf - ct, mode),
15296                                          copy_rtx (tmp), 1, OPTAB_DIRECT);
15297               if (ct)
15298                 tmp = expand_simple_binop (mode, PLUS,
15299                                            copy_rtx (tmp), GEN_INT (ct),
15300                                            copy_rtx (tmp), 1, OPTAB_DIRECT);
15301             }
15302
15303           if (!rtx_equal_p (tmp, out))
15304             emit_move_insn (copy_rtx (out), copy_rtx (tmp));
15305
15306           return 1; /* DONE */
15307         }
15308
15309       if (diff < 0)
15310         {
15311           enum machine_mode cmp_mode = GET_MODE (ix86_compare_op0);
15312
15313           HOST_WIDE_INT tmp;
15314           tmp = ct, ct = cf, cf = tmp;
15315           diff = -diff;
15316
15317           if (SCALAR_FLOAT_MODE_P (cmp_mode))
15318             {
15319               gcc_assert (!DECIMAL_FLOAT_MODE_P (cmp_mode));
15320
15321               /* We may be reversing unordered compare to normal compare, that
15322                  is not valid in general (we may convert non-trapping condition
15323                  to trapping one), however on i386 we currently emit all
15324                  comparisons unordered.  */
15325               compare_code = reverse_condition_maybe_unordered (compare_code);
15326               code = reverse_condition_maybe_unordered (code);
15327             }
15328           else
15329             {
15330               compare_code = reverse_condition (compare_code);
15331               code = reverse_condition (code);
15332             }
15333         }
15334
15335       compare_code = UNKNOWN;
15336       if (GET_MODE_CLASS (GET_MODE (ix86_compare_op0)) == MODE_INT
15337           && CONST_INT_P (ix86_compare_op1))
15338         {
15339           if (ix86_compare_op1 == const0_rtx
15340               && (code == LT || code == GE))
15341             compare_code = code;
15342           else if (ix86_compare_op1 == constm1_rtx)
15343             {
15344               if (code == LE)
15345                 compare_code = LT;
15346               else if (code == GT)
15347                 compare_code = GE;
15348             }
15349         }
15350
15351       /* Optimize dest = (op0 < 0) ? -1 : cf.  */
15352       if (compare_code != UNKNOWN
15353           && GET_MODE (ix86_compare_op0) == GET_MODE (out)
15354           && (cf == -1 || ct == -1))
15355         {
15356           /* If lea code below could be used, only optimize
15357              if it results in a 2 insn sequence.  */
15358
15359           if (! (diff == 1 || diff == 2 || diff == 4 || diff == 8
15360                  || diff == 3 || diff == 5 || diff == 9)
15361               || (compare_code == LT && ct == -1)
15362               || (compare_code == GE && cf == -1))
15363             {
15364               /*
15365                * notl op1       (if necessary)
15366                * sarl $31, op1
15367                * orl cf, op1
15368                */
15369               if (ct != -1)
15370                 {
15371                   cf = ct;
15372                   ct = -1;
15373                   code = reverse_condition (code);
15374                 }
15375
15376               out = emit_store_flag (out, code, ix86_compare_op0,
15377                                      ix86_compare_op1, VOIDmode, 0, -1);
15378
15379               out = expand_simple_binop (mode, IOR,
15380                                          out, GEN_INT (cf),
15381                                          out, 1, OPTAB_DIRECT);
15382               if (out != operands[0])
15383                 emit_move_insn (operands[0], out);
15384
15385               return 1; /* DONE */
15386             }
15387         }
15388
15389
15390       if ((diff == 1 || diff == 2 || diff == 4 || diff == 8
15391            || diff == 3 || diff == 5 || diff == 9)
15392           && ((mode != QImode && mode != HImode) || !TARGET_PARTIAL_REG_STALL)
15393           && (mode != DImode
15394               || x86_64_immediate_operand (GEN_INT (cf), VOIDmode)))
15395         {
15396           /*
15397            * xorl dest,dest
15398            * cmpl op1,op2
15399            * setcc dest
15400            * lea cf(dest*(ct-cf)),dest
15401            *
15402            * Size 14.
15403            *
15404            * This also catches the degenerate setcc-only case.
15405            */
15406
15407           rtx tmp;
15408           int nops;
15409
15410           out = emit_store_flag (out, code, ix86_compare_op0,
15411                                  ix86_compare_op1, VOIDmode, 0, 1);
15412
15413           nops = 0;
15414           /* On x86_64 the lea instruction operates on Pmode, so we need
15415              to get arithmetics done in proper mode to match.  */
15416           if (diff == 1)
15417             tmp = copy_rtx (out);
15418           else
15419             {
15420               rtx out1;
15421               out1 = copy_rtx (out);
15422               tmp = gen_rtx_MULT (mode, out1, GEN_INT (diff & ~1));
15423               nops++;
15424               if (diff & 1)
15425                 {
15426                   tmp = gen_rtx_PLUS (mode, tmp, out1);
15427                   nops++;
15428                 }
15429             }
15430           if (cf != 0)
15431             {
15432               tmp = gen_rtx_PLUS (mode, tmp, GEN_INT (cf));
15433               nops++;
15434             }
15435           if (!rtx_equal_p (tmp, out))
15436             {
15437               if (nops == 1)
15438                 out = force_operand (tmp, copy_rtx (out));
15439               else
15440                 emit_insn (gen_rtx_SET (VOIDmode, copy_rtx (out), copy_rtx (tmp)));
15441             }
15442           if (!rtx_equal_p (out, operands[0]))
15443             emit_move_insn (operands[0], copy_rtx (out));
15444
15445           return 1; /* DONE */
15446         }
15447
15448       /*
15449        * General case:                  Jumpful:
15450        *   xorl dest,dest               cmpl op1, op2
15451        *   cmpl op1, op2                movl ct, dest
15452        *   setcc dest                   jcc 1f
15453        *   decl dest                    movl cf, dest
15454        *   andl (cf-ct),dest            1:
15455        *   addl ct,dest
15456        *
15457        * Size 20.                       Size 14.
15458        *
15459        * This is reasonably steep, but branch mispredict costs are
15460        * high on modern cpus, so consider failing only if optimizing
15461        * for space.
15462        */
15463
15464       if ((!TARGET_CMOVE || (mode == QImode && TARGET_PARTIAL_REG_STALL))
15465           && BRANCH_COST (optimize_insn_for_speed_p (),
15466                           false) >= 2)
15467         {
15468           if (cf == 0)
15469             {
15470               enum machine_mode cmp_mode = GET_MODE (ix86_compare_op0);
15471
15472               cf = ct;
15473               ct = 0;
15474
15475               if (SCALAR_FLOAT_MODE_P (cmp_mode))
15476                 {
15477                   gcc_assert (!DECIMAL_FLOAT_MODE_P (cmp_mode));
15478
15479                   /* We may be reversing unordered compare to normal compare,
15480                      that is not valid in general (we may convert non-trapping
15481                      condition to trapping one), however on i386 we currently
15482                      emit all comparisons unordered.  */
15483                   code = reverse_condition_maybe_unordered (code);
15484                 }
15485               else
15486                 {
15487                   code = reverse_condition (code);
15488                   if (compare_code != UNKNOWN)
15489                     compare_code = reverse_condition (compare_code);
15490                 }
15491             }
15492
15493           if (compare_code != UNKNOWN)
15494             {
15495               /* notl op1       (if needed)
15496                  sarl $31, op1
15497                  andl (cf-ct), op1
15498                  addl ct, op1
15499
15500                  For x < 0 (resp. x <= -1) there will be no notl,
15501                  so if possible swap the constants to get rid of the
15502                  complement.
15503                  True/false will be -1/0 while code below (store flag
15504                  followed by decrement) is 0/-1, so the constants need
15505                  to be exchanged once more.  */
15506
15507               if (compare_code == GE || !cf)
15508                 {
15509                   code = reverse_condition (code);
15510                   compare_code = LT;
15511                 }
15512               else
15513                 {
15514                   HOST_WIDE_INT tmp = cf;
15515                   cf = ct;
15516                   ct = tmp;
15517                 }
15518
15519               out = emit_store_flag (out, code, ix86_compare_op0,
15520                                      ix86_compare_op1, VOIDmode, 0, -1);
15521             }
15522           else
15523             {
15524               out = emit_store_flag (out, code, ix86_compare_op0,
15525                                      ix86_compare_op1, VOIDmode, 0, 1);
15526
15527               out = expand_simple_binop (mode, PLUS, copy_rtx (out), constm1_rtx,
15528                                          copy_rtx (out), 1, OPTAB_DIRECT);
15529             }
15530
15531           out = expand_simple_binop (mode, AND, copy_rtx (out),
15532                                      gen_int_mode (cf - ct, mode),
15533                                      copy_rtx (out), 1, OPTAB_DIRECT);
15534           if (ct)
15535             out = expand_simple_binop (mode, PLUS, copy_rtx (out), GEN_INT (ct),
15536                                        copy_rtx (out), 1, OPTAB_DIRECT);
15537           if (!rtx_equal_p (out, operands[0]))
15538             emit_move_insn (operands[0], copy_rtx (out));
15539
15540           return 1; /* DONE */
15541         }
15542     }
15543
15544   if (!TARGET_CMOVE || (mode == QImode && TARGET_PARTIAL_REG_STALL))
15545     {
15546       /* Try a few things more with specific constants and a variable.  */
15547
15548       optab op;
15549       rtx var, orig_out, out, tmp;
15550
15551       if (BRANCH_COST (optimize_insn_for_speed_p (), false) <= 2)
15552         return 0; /* FAIL */
15553
15554       /* If one of the two operands is an interesting constant, load a
15555          constant with the above and mask it in with a logical operation.  */
15556
15557       if (CONST_INT_P (operands[2]))
15558         {
15559           var = operands[3];
15560           if (INTVAL (operands[2]) == 0 && operands[3] != constm1_rtx)
15561             operands[3] = constm1_rtx, op = and_optab;
15562           else if (INTVAL (operands[2]) == -1 && operands[3] != const0_rtx)
15563             operands[3] = const0_rtx, op = ior_optab;
15564           else
15565             return 0; /* FAIL */
15566         }
15567       else if (CONST_INT_P (operands[3]))
15568         {
15569           var = operands[2];
15570           if (INTVAL (operands[3]) == 0 && operands[2] != constm1_rtx)
15571             operands[2] = constm1_rtx, op = and_optab;
15572           else if (INTVAL (operands[3]) == -1 && operands[3] != const0_rtx)
15573             operands[2] = const0_rtx, op = ior_optab;
15574           else
15575             return 0; /* FAIL */
15576         }
15577       else
15578         return 0; /* FAIL */
15579
15580       orig_out = operands[0];
15581       tmp = gen_reg_rtx (mode);
15582       operands[0] = tmp;
15583
15584       /* Recurse to get the constant loaded.  */
15585       if (ix86_expand_int_movcc (operands) == 0)
15586         return 0; /* FAIL */
15587
15588       /* Mask in the interesting variable.  */
15589       out = expand_binop (mode, op, var, tmp, orig_out, 0,
15590                           OPTAB_WIDEN);
15591       if (!rtx_equal_p (out, orig_out))
15592         emit_move_insn (copy_rtx (orig_out), copy_rtx (out));
15593
15594       return 1; /* DONE */
15595     }
15596
15597   /*
15598    * For comparison with above,
15599    *
15600    * movl cf,dest
15601    * movl ct,tmp
15602    * cmpl op1,op2
15603    * cmovcc tmp,dest
15604    *
15605    * Size 15.
15606    */
15607
15608   if (! nonimmediate_operand (operands[2], mode))
15609     operands[2] = force_reg (mode, operands[2]);
15610   if (! nonimmediate_operand (operands[3], mode))
15611     operands[3] = force_reg (mode, operands[3]);
15612
15613   if (bypass_test && reg_overlap_mentioned_p (operands[0], operands[3]))
15614     {
15615       rtx tmp = gen_reg_rtx (mode);
15616       emit_move_insn (tmp, operands[3]);
15617       operands[3] = tmp;
15618     }
15619   if (second_test && reg_overlap_mentioned_p (operands[0], operands[2]))
15620     {
15621       rtx tmp = gen_reg_rtx (mode);
15622       emit_move_insn (tmp, operands[2]);
15623       operands[2] = tmp;
15624     }
15625
15626   if (! register_operand (operands[2], VOIDmode)
15627       && (mode == QImode
15628           || ! register_operand (operands[3], VOIDmode)))
15629     operands[2] = force_reg (mode, operands[2]);
15630
15631   if (mode == QImode
15632       && ! register_operand (operands[3], VOIDmode))
15633     operands[3] = force_reg (mode, operands[3]);
15634
15635   emit_insn (compare_seq);
15636   emit_insn (gen_rtx_SET (VOIDmode, operands[0],
15637                           gen_rtx_IF_THEN_ELSE (mode,
15638                                                 compare_op, operands[2],
15639                                                 operands[3])));
15640   if (bypass_test)
15641     emit_insn (gen_rtx_SET (VOIDmode, copy_rtx (operands[0]),
15642                             gen_rtx_IF_THEN_ELSE (mode,
15643                                   bypass_test,
15644                                   copy_rtx (operands[3]),
15645                                   copy_rtx (operands[0]))));
15646   if (second_test)
15647     emit_insn (gen_rtx_SET (VOIDmode, copy_rtx (operands[0]),
15648                             gen_rtx_IF_THEN_ELSE (mode,
15649                                   second_test,
15650                                   copy_rtx (operands[2]),
15651                                   copy_rtx (operands[0]))));
15652
15653   return 1; /* DONE */
15654 }
15655
15656 /* Swap, force into registers, or otherwise massage the two operands
15657    to an sse comparison with a mask result.  Thus we differ a bit from
15658    ix86_prepare_fp_compare_args which expects to produce a flags result.
15659
15660    The DEST operand exists to help determine whether to commute commutative
15661    operators.  The POP0/POP1 operands are updated in place.  The new
15662    comparison code is returned, or UNKNOWN if not implementable.  */
15663
15664 static enum rtx_code
15665 ix86_prepare_sse_fp_compare_args (rtx dest, enum rtx_code code,
15666                                   rtx *pop0, rtx *pop1)
15667 {
15668   rtx tmp;
15669
15670   switch (code)
15671     {
15672     case LTGT:
15673     case UNEQ:
15674       /* We have no LTGT as an operator.  We could implement it with
15675          NE & ORDERED, but this requires an extra temporary.  It's
15676          not clear that it's worth it.  */
15677       return UNKNOWN;
15678
15679     case LT:
15680     case LE:
15681     case UNGT:
15682     case UNGE:
15683       /* These are supported directly.  */
15684       break;
15685
15686     case EQ:
15687     case NE:
15688     case UNORDERED:
15689     case ORDERED:
15690       /* For commutative operators, try to canonicalize the destination
15691          operand to be first in the comparison - this helps reload to
15692          avoid extra moves.  */
15693       if (!dest || !rtx_equal_p (dest, *pop1))
15694         break;
15695       /* FALLTHRU */
15696
15697     case GE:
15698     case GT:
15699     case UNLE:
15700     case UNLT:
15701       /* These are not supported directly.  Swap the comparison operands
15702          to transform into something that is supported.  */
15703       tmp = *pop0;
15704       *pop0 = *pop1;
15705       *pop1 = tmp;
15706       code = swap_condition (code);
15707       break;
15708
15709     default:
15710       gcc_unreachable ();
15711     }
15712
15713   return code;
15714 }
15715
15716 /* Detect conditional moves that exactly match min/max operational
15717    semantics.  Note that this is IEEE safe, as long as we don't
15718    interchange the operands.
15719
15720    Returns FALSE if this conditional move doesn't match a MIN/MAX,
15721    and TRUE if the operation is successful and instructions are emitted.  */
15722
15723 static bool
15724 ix86_expand_sse_fp_minmax (rtx dest, enum rtx_code code, rtx cmp_op0,
15725                            rtx cmp_op1, rtx if_true, rtx if_false)
15726 {
15727   enum machine_mode mode;
15728   bool is_min;
15729   rtx tmp;
15730
15731   if (code == LT)
15732     ;
15733   else if (code == UNGE)
15734     {
15735       tmp = if_true;
15736       if_true = if_false;
15737       if_false = tmp;
15738     }
15739   else
15740     return false;
15741
15742   if (rtx_equal_p (cmp_op0, if_true) && rtx_equal_p (cmp_op1, if_false))
15743     is_min = true;
15744   else if (rtx_equal_p (cmp_op1, if_true) && rtx_equal_p (cmp_op0, if_false))
15745     is_min = false;
15746   else
15747     return false;
15748
15749   mode = GET_MODE (dest);
15750
15751   /* We want to check HONOR_NANS and HONOR_SIGNED_ZEROS here,
15752      but MODE may be a vector mode and thus not appropriate.  */
15753   if (!flag_finite_math_only || !flag_unsafe_math_optimizations)
15754     {
15755       int u = is_min ? UNSPEC_IEEE_MIN : UNSPEC_IEEE_MAX;
15756       rtvec v;
15757
15758       if_true = force_reg (mode, if_true);
15759       v = gen_rtvec (2, if_true, if_false);
15760       tmp = gen_rtx_UNSPEC (mode, v, u);
15761     }
15762   else
15763     {
15764       code = is_min ? SMIN : SMAX;
15765       tmp = gen_rtx_fmt_ee (code, mode, if_true, if_false);
15766     }
15767
15768   emit_insn (gen_rtx_SET (VOIDmode, dest, tmp));
15769   return true;
15770 }
15771
15772 /* Expand an sse vector comparison.  Return the register with the result.  */
15773
15774 static rtx
15775 ix86_expand_sse_cmp (rtx dest, enum rtx_code code, rtx cmp_op0, rtx cmp_op1,
15776                      rtx op_true, rtx op_false)
15777 {
15778   enum machine_mode mode = GET_MODE (dest);
15779   rtx x;
15780
15781   cmp_op0 = force_reg (mode, cmp_op0);
15782   if (!nonimmediate_operand (cmp_op1, mode))
15783     cmp_op1 = force_reg (mode, cmp_op1);
15784
15785   if (optimize
15786       || reg_overlap_mentioned_p (dest, op_true)
15787       || reg_overlap_mentioned_p (dest, op_false))
15788     dest = gen_reg_rtx (mode);
15789
15790   x = gen_rtx_fmt_ee (code, mode, cmp_op0, cmp_op1);
15791   emit_insn (gen_rtx_SET (VOIDmode, dest, x));
15792
15793   return dest;
15794 }
15795
15796 /* Expand DEST = CMP ? OP_TRUE : OP_FALSE into a sequence of logical
15797    operations.  This is used for both scalar and vector conditional moves.  */
15798
15799 static void
15800 ix86_expand_sse_movcc (rtx dest, rtx cmp, rtx op_true, rtx op_false)
15801 {
15802   enum machine_mode mode = GET_MODE (dest);
15803   rtx t2, t3, x;
15804
15805   if (op_false == CONST0_RTX (mode))
15806     {
15807       op_true = force_reg (mode, op_true);
15808       x = gen_rtx_AND (mode, cmp, op_true);
15809       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
15810     }
15811   else if (op_true == CONST0_RTX (mode))
15812     {
15813       op_false = force_reg (mode, op_false);
15814       x = gen_rtx_NOT (mode, cmp);
15815       x = gen_rtx_AND (mode, x, op_false);
15816       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
15817     }
15818   else if (TARGET_SSE5)
15819     {
15820       rtx pcmov = gen_rtx_SET (mode, dest,
15821                                gen_rtx_IF_THEN_ELSE (mode, cmp,
15822                                                      op_true,
15823                                                      op_false));
15824       emit_insn (pcmov);
15825     }
15826   else
15827     {
15828       op_true = force_reg (mode, op_true);
15829       op_false = force_reg (mode, op_false);
15830
15831       t2 = gen_reg_rtx (mode);
15832       if (optimize)
15833         t3 = gen_reg_rtx (mode);
15834       else
15835         t3 = dest;
15836
15837       x = gen_rtx_AND (mode, op_true, cmp);
15838       emit_insn (gen_rtx_SET (VOIDmode, t2, x));
15839
15840       x = gen_rtx_NOT (mode, cmp);
15841       x = gen_rtx_AND (mode, x, op_false);
15842       emit_insn (gen_rtx_SET (VOIDmode, t3, x));
15843
15844       x = gen_rtx_IOR (mode, t3, t2);
15845       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
15846     }
15847 }
15848
15849 /* Expand a floating-point conditional move.  Return true if successful.  */
15850
15851 int
15852 ix86_expand_fp_movcc (rtx operands[])
15853 {
15854   enum machine_mode mode = GET_MODE (operands[0]);
15855   enum rtx_code code = GET_CODE (operands[1]);
15856   rtx tmp, compare_op, second_test, bypass_test;
15857
15858   ix86_compare_op0 = XEXP (operands[1], 0);
15859   ix86_compare_op1 = XEXP (operands[1], 1);
15860   if (TARGET_SSE_MATH && SSE_FLOAT_MODE_P (mode))
15861     {
15862       enum machine_mode cmode;
15863
15864       /* Since we've no cmove for sse registers, don't force bad register
15865          allocation just to gain access to it.  Deny movcc when the
15866          comparison mode doesn't match the move mode.  */
15867       cmode = GET_MODE (ix86_compare_op0);
15868       if (cmode == VOIDmode)
15869         cmode = GET_MODE (ix86_compare_op1);
15870       if (cmode != mode)
15871         return 0;
15872
15873       code = ix86_prepare_sse_fp_compare_args (operands[0], code,
15874                                                &ix86_compare_op0,
15875                                                &ix86_compare_op1);
15876       if (code == UNKNOWN)
15877         return 0;
15878
15879       if (ix86_expand_sse_fp_minmax (operands[0], code, ix86_compare_op0,
15880                                      ix86_compare_op1, operands[2],
15881                                      operands[3]))
15882         return 1;
15883
15884       tmp = ix86_expand_sse_cmp (operands[0], code, ix86_compare_op0,
15885                                  ix86_compare_op1, operands[2], operands[3]);
15886       ix86_expand_sse_movcc (operands[0], tmp, operands[2], operands[3]);
15887       return 1;
15888     }
15889
15890   /* The floating point conditional move instructions don't directly
15891      support conditions resulting from a signed integer comparison.  */
15892
15893   compare_op = ix86_expand_compare (code, &second_test, &bypass_test);
15894
15895   /* The floating point conditional move instructions don't directly
15896      support signed integer comparisons.  */
15897
15898   if (!fcmov_comparison_operator (compare_op, VOIDmode))
15899     {
15900       gcc_assert (!second_test && !bypass_test);
15901       tmp = gen_reg_rtx (QImode);
15902       ix86_expand_setcc (code, tmp);
15903       code = NE;
15904       ix86_compare_op0 = tmp;
15905       ix86_compare_op1 = const0_rtx;
15906       compare_op = ix86_expand_compare (code,  &second_test, &bypass_test);
15907     }
15908   if (bypass_test && reg_overlap_mentioned_p (operands[0], operands[3]))
15909     {
15910       tmp = gen_reg_rtx (mode);
15911       emit_move_insn (tmp, operands[3]);
15912       operands[3] = tmp;
15913     }
15914   if (second_test && reg_overlap_mentioned_p (operands[0], operands[2]))
15915     {
15916       tmp = gen_reg_rtx (mode);
15917       emit_move_insn (tmp, operands[2]);
15918       operands[2] = tmp;
15919     }
15920
15921   emit_insn (gen_rtx_SET (VOIDmode, operands[0],
15922                           gen_rtx_IF_THEN_ELSE (mode, compare_op,
15923                                                 operands[2], operands[3])));
15924   if (bypass_test)
15925     emit_insn (gen_rtx_SET (VOIDmode, operands[0],
15926                             gen_rtx_IF_THEN_ELSE (mode, bypass_test,
15927                                                   operands[3], operands[0])));
15928   if (second_test)
15929     emit_insn (gen_rtx_SET (VOIDmode, operands[0],
15930                             gen_rtx_IF_THEN_ELSE (mode, second_test,
15931                                                   operands[2], operands[0])));
15932
15933   return 1;
15934 }
15935
15936 /* Expand a floating-point vector conditional move; a vcond operation
15937    rather than a movcc operation.  */
15938
15939 bool
15940 ix86_expand_fp_vcond (rtx operands[])
15941 {
15942   enum rtx_code code = GET_CODE (operands[3]);
15943   rtx cmp;
15944
15945   code = ix86_prepare_sse_fp_compare_args (operands[0], code,
15946                                            &operands[4], &operands[5]);
15947   if (code == UNKNOWN)
15948     return false;
15949
15950   if (ix86_expand_sse_fp_minmax (operands[0], code, operands[4],
15951                                  operands[5], operands[1], operands[2]))
15952     return true;
15953
15954   cmp = ix86_expand_sse_cmp (operands[0], code, operands[4], operands[5],
15955                              operands[1], operands[2]);
15956   ix86_expand_sse_movcc (operands[0], cmp, operands[1], operands[2]);
15957   return true;
15958 }
15959
15960 /* Expand a signed/unsigned integral vector conditional move.  */
15961
15962 bool
15963 ix86_expand_int_vcond (rtx operands[])
15964 {
15965   enum machine_mode mode = GET_MODE (operands[0]);
15966   enum rtx_code code = GET_CODE (operands[3]);
15967   bool negate = false;
15968   rtx x, cop0, cop1;
15969
15970   cop0 = operands[4];
15971   cop1 = operands[5];
15972
15973   /* SSE5 supports all of the comparisons on all vector int types.  */
15974   if (!TARGET_SSE5)
15975     {
15976       /* Canonicalize the comparison to EQ, GT, GTU.  */
15977       switch (code)
15978         {
15979         case EQ:
15980         case GT:
15981         case GTU:
15982           break;
15983
15984         case NE:
15985         case LE:
15986         case LEU:
15987           code = reverse_condition (code);
15988           negate = true;
15989           break;
15990
15991         case GE:
15992         case GEU:
15993           code = reverse_condition (code);
15994           negate = true;
15995           /* FALLTHRU */
15996
15997         case LT:
15998         case LTU:
15999           code = swap_condition (code);
16000           x = cop0, cop0 = cop1, cop1 = x;
16001           break;
16002
16003         default:
16004           gcc_unreachable ();
16005         }
16006
16007       /* Only SSE4.1/SSE4.2 supports V2DImode.  */
16008       if (mode == V2DImode)
16009         {
16010           switch (code)
16011             {
16012             case EQ:
16013               /* SSE4.1 supports EQ.  */
16014               if (!TARGET_SSE4_1)
16015                 return false;
16016               break;
16017
16018             case GT:
16019             case GTU:
16020               /* SSE4.2 supports GT/GTU.  */
16021               if (!TARGET_SSE4_2)
16022                 return false;
16023               break;
16024
16025             default:
16026               gcc_unreachable ();
16027             }
16028         }
16029
16030       /* Unsigned parallel compare is not supported by the hardware.  Play some
16031          tricks to turn this into a signed comparison against 0.  */
16032       if (code == GTU)
16033         {
16034           cop0 = force_reg (mode, cop0);
16035
16036           switch (mode)
16037             {
16038             case V4SImode:
16039             case V2DImode:
16040               {
16041                 rtx t1, t2, mask;
16042
16043                 /* Perform a parallel modulo subtraction.  */
16044                 t1 = gen_reg_rtx (mode);
16045                 emit_insn ((mode == V4SImode
16046                             ? gen_subv4si3
16047                             : gen_subv2di3) (t1, cop0, cop1));
16048
16049                 /* Extract the original sign bit of op0.  */
16050                 mask = ix86_build_signbit_mask (GET_MODE_INNER (mode),
16051                                                 true, false);
16052                 t2 = gen_reg_rtx (mode);
16053                 emit_insn ((mode == V4SImode
16054                             ? gen_andv4si3
16055                             : gen_andv2di3) (t2, cop0, mask));
16056
16057                 /* XOR it back into the result of the subtraction.  This results
16058                    in the sign bit set iff we saw unsigned underflow.  */
16059                 x = gen_reg_rtx (mode);
16060                 emit_insn ((mode == V4SImode
16061                             ? gen_xorv4si3
16062                             : gen_xorv2di3) (x, t1, t2));
16063
16064                 code = GT;
16065               }
16066               break;
16067
16068             case V16QImode:
16069             case V8HImode:
16070               /* Perform a parallel unsigned saturating subtraction.  */
16071               x = gen_reg_rtx (mode);
16072               emit_insn (gen_rtx_SET (VOIDmode, x,
16073                                       gen_rtx_US_MINUS (mode, cop0, cop1)));
16074
16075               code = EQ;
16076               negate = !negate;
16077               break;
16078
16079             default:
16080               gcc_unreachable ();
16081             }
16082
16083           cop0 = x;
16084           cop1 = CONST0_RTX (mode);
16085         }
16086     }
16087
16088   x = ix86_expand_sse_cmp (operands[0], code, cop0, cop1,
16089                            operands[1+negate], operands[2-negate]);
16090
16091   ix86_expand_sse_movcc (operands[0], x, operands[1+negate],
16092                          operands[2-negate]);
16093   return true;
16094 }
16095
16096 /* Unpack OP[1] into the next wider integer vector type.  UNSIGNED_P is
16097    true if we should do zero extension, else sign extension.  HIGH_P is
16098    true if we want the N/2 high elements, else the low elements.  */
16099
16100 void
16101 ix86_expand_sse_unpack (rtx operands[2], bool unsigned_p, bool high_p)
16102 {
16103   enum machine_mode imode = GET_MODE (operands[1]);
16104   rtx (*unpack)(rtx, rtx, rtx);
16105   rtx se, dest;
16106
16107   switch (imode)
16108     {
16109     case V16QImode:
16110       if (high_p)
16111         unpack = gen_vec_interleave_highv16qi;
16112       else
16113         unpack = gen_vec_interleave_lowv16qi;
16114       break;
16115     case V8HImode:
16116       if (high_p)
16117         unpack = gen_vec_interleave_highv8hi;
16118       else
16119         unpack = gen_vec_interleave_lowv8hi;
16120       break;
16121     case V4SImode:
16122       if (high_p)
16123         unpack = gen_vec_interleave_highv4si;
16124       else
16125         unpack = gen_vec_interleave_lowv4si;
16126       break;
16127     default:
16128       gcc_unreachable ();
16129     }
16130
16131   dest = gen_lowpart (imode, operands[0]);
16132
16133   if (unsigned_p)
16134     se = force_reg (imode, CONST0_RTX (imode));
16135   else
16136     se = ix86_expand_sse_cmp (gen_reg_rtx (imode), GT, CONST0_RTX (imode),
16137                               operands[1], pc_rtx, pc_rtx);
16138
16139   emit_insn (unpack (dest, operands[1], se));
16140 }
16141
16142 /* This function performs the same task as ix86_expand_sse_unpack,
16143    but with SSE4.1 instructions.  */
16144
16145 void
16146 ix86_expand_sse4_unpack (rtx operands[2], bool unsigned_p, bool high_p)
16147 {
16148   enum machine_mode imode = GET_MODE (operands[1]);
16149   rtx (*unpack)(rtx, rtx);
16150   rtx src, dest;
16151
16152   switch (imode)
16153     {
16154     case V16QImode:
16155       if (unsigned_p)
16156         unpack = gen_sse4_1_zero_extendv8qiv8hi2;
16157       else
16158         unpack = gen_sse4_1_extendv8qiv8hi2;
16159       break;
16160     case V8HImode:
16161       if (unsigned_p)
16162         unpack = gen_sse4_1_zero_extendv4hiv4si2;
16163       else
16164         unpack = gen_sse4_1_extendv4hiv4si2;
16165       break;
16166     case V4SImode:
16167       if (unsigned_p)
16168         unpack = gen_sse4_1_zero_extendv2siv2di2;
16169       else
16170         unpack = gen_sse4_1_extendv2siv2di2;
16171       break;
16172     default:
16173       gcc_unreachable ();
16174     }
16175
16176   dest = operands[0];
16177   if (high_p)
16178     {
16179       /* Shift higher 8 bytes to lower 8 bytes.  */
16180       src = gen_reg_rtx (imode);
16181       emit_insn (gen_sse2_lshrti3 (gen_lowpart (TImode, src),
16182                                    gen_lowpart (TImode, operands[1]),
16183                                    GEN_INT (64)));
16184     }
16185   else
16186     src = operands[1];
16187
16188   emit_insn (unpack (dest, src));
16189 }
16190
16191 /* This function performs the same task as ix86_expand_sse_unpack,
16192    but with sse5 instructions.  */
16193
16194 void
16195 ix86_expand_sse5_unpack (rtx operands[2], bool unsigned_p, bool high_p)
16196 {
16197   enum machine_mode imode = GET_MODE (operands[1]);
16198   int pperm_bytes[16];
16199   int i;
16200   int h = (high_p) ? 8 : 0;
16201   int h2;
16202   int sign_extend;
16203   rtvec v = rtvec_alloc (16);
16204   rtvec vs;
16205   rtx x, p;
16206   rtx op0 = operands[0], op1 = operands[1];
16207
16208   switch (imode)
16209     {
16210     case V16QImode:
16211       vs = rtvec_alloc (8);
16212       h2 = (high_p) ? 8 : 0;
16213       for (i = 0; i < 8; i++)
16214         {
16215           pperm_bytes[2*i+0] = PPERM_SRC | PPERM_SRC2 | i | h;
16216           pperm_bytes[2*i+1] = ((unsigned_p)
16217                                 ? PPERM_ZERO
16218                                 : PPERM_SIGN | PPERM_SRC2 | i | h);
16219         }
16220
16221       for (i = 0; i < 16; i++)
16222         RTVEC_ELT (v, i) = GEN_INT (pperm_bytes[i]);
16223
16224       for (i = 0; i < 8; i++)
16225         RTVEC_ELT (vs, i) = GEN_INT (i + h2);
16226
16227       p = gen_rtx_PARALLEL (VOIDmode, vs);
16228       x = force_reg (V16QImode, gen_rtx_CONST_VECTOR (V16QImode, v));
16229       if (unsigned_p)
16230         emit_insn (gen_sse5_pperm_zero_v16qi_v8hi (op0, op1, p, x));
16231       else
16232         emit_insn (gen_sse5_pperm_sign_v16qi_v8hi (op0, op1, p, x));
16233       break;
16234
16235     case V8HImode:
16236       vs = rtvec_alloc (4);
16237       h2 = (high_p) ? 4 : 0;
16238       for (i = 0; i < 4; i++)
16239         {
16240           sign_extend = ((unsigned_p)
16241                          ? PPERM_ZERO
16242                          : PPERM_SIGN | PPERM_SRC2 | ((2*i) + 1 + h));
16243           pperm_bytes[4*i+0] = PPERM_SRC | PPERM_SRC2 | ((2*i) + 0 + h);
16244           pperm_bytes[4*i+1] = PPERM_SRC | PPERM_SRC2 | ((2*i) + 1 + h);
16245           pperm_bytes[4*i+2] = sign_extend;
16246           pperm_bytes[4*i+3] = sign_extend;
16247         }
16248
16249       for (i = 0; i < 16; i++)
16250         RTVEC_ELT (v, i) = GEN_INT (pperm_bytes[i]);
16251
16252       for (i = 0; i < 4; i++)
16253         RTVEC_ELT (vs, i) = GEN_INT (i + h2);
16254
16255       p = gen_rtx_PARALLEL (VOIDmode, vs);
16256       x = force_reg (V16QImode, gen_rtx_CONST_VECTOR (V16QImode, v));
16257       if (unsigned_p)
16258         emit_insn (gen_sse5_pperm_zero_v8hi_v4si (op0, op1, p, x));
16259       else
16260         emit_insn (gen_sse5_pperm_sign_v8hi_v4si (op0, op1, p, x));
16261       break;
16262
16263     case V4SImode:
16264       vs = rtvec_alloc (2);
16265       h2 = (high_p) ? 2 : 0;
16266       for (i = 0; i < 2; i++)
16267         {
16268           sign_extend = ((unsigned_p)
16269                          ? PPERM_ZERO
16270                          : PPERM_SIGN | PPERM_SRC2 | ((4*i) + 3 + h));
16271           pperm_bytes[8*i+0] = PPERM_SRC | PPERM_SRC2 | ((4*i) + 0 + h);
16272           pperm_bytes[8*i+1] = PPERM_SRC | PPERM_SRC2 | ((4*i) + 1 + h);
16273           pperm_bytes[8*i+2] = PPERM_SRC | PPERM_SRC2 | ((4*i) + 2 + h);
16274           pperm_bytes[8*i+3] = PPERM_SRC | PPERM_SRC2 | ((4*i) + 3 + h);
16275           pperm_bytes[8*i+4] = sign_extend;
16276           pperm_bytes[8*i+5] = sign_extend;
16277           pperm_bytes[8*i+6] = sign_extend;
16278           pperm_bytes[8*i+7] = sign_extend;
16279         }
16280
16281       for (i = 0; i < 16; i++)
16282         RTVEC_ELT (v, i) = GEN_INT (pperm_bytes[i]);
16283
16284       for (i = 0; i < 2; i++)
16285         RTVEC_ELT (vs, i) = GEN_INT (i + h2);
16286
16287       p = gen_rtx_PARALLEL (VOIDmode, vs);
16288       x = force_reg (V16QImode, gen_rtx_CONST_VECTOR (V16QImode, v));
16289       if (unsigned_p)
16290         emit_insn (gen_sse5_pperm_zero_v4si_v2di (op0, op1, p, x));
16291       else
16292         emit_insn (gen_sse5_pperm_sign_v4si_v2di (op0, op1, p, x));
16293       break;
16294
16295     default:
16296       gcc_unreachable ();
16297     }
16298
16299   return;
16300 }
16301
16302 /* Pack the high bits from OPERANDS[1] and low bits from OPERANDS[2] into the
16303    next narrower integer vector type */
16304 void
16305 ix86_expand_sse5_pack (rtx operands[3])
16306 {
16307   enum machine_mode imode = GET_MODE (operands[0]);
16308   int pperm_bytes[16];
16309   int i;
16310   rtvec v = rtvec_alloc (16);
16311   rtx x;
16312   rtx op0 = operands[0];
16313   rtx op1 = operands[1];
16314   rtx op2 = operands[2];
16315
16316   switch (imode)
16317     {
16318     case V16QImode:
16319       for (i = 0; i < 8; i++)
16320         {
16321           pperm_bytes[i+0] = PPERM_SRC | PPERM_SRC1 | (i*2);
16322           pperm_bytes[i+8] = PPERM_SRC | PPERM_SRC2 | (i*2);
16323         }
16324
16325       for (i = 0; i < 16; i++)
16326         RTVEC_ELT (v, i) = GEN_INT (pperm_bytes[i]);
16327
16328       x = force_reg (V16QImode, gen_rtx_CONST_VECTOR (V16QImode, v));
16329       emit_insn (gen_sse5_pperm_pack_v8hi_v16qi (op0, op1, op2, x));
16330       break;
16331
16332     case V8HImode:
16333       for (i = 0; i < 4; i++)
16334         {
16335           pperm_bytes[(2*i)+0] = PPERM_SRC | PPERM_SRC1 | ((i*4) + 0);
16336           pperm_bytes[(2*i)+1] = PPERM_SRC | PPERM_SRC1 | ((i*4) + 1);
16337           pperm_bytes[(2*i)+8] = PPERM_SRC | PPERM_SRC2 | ((i*4) + 0);
16338           pperm_bytes[(2*i)+9] = PPERM_SRC | PPERM_SRC2 | ((i*4) + 1);
16339         }
16340
16341       for (i = 0; i < 16; i++)
16342         RTVEC_ELT (v, i) = GEN_INT (pperm_bytes[i]);
16343
16344       x = force_reg (V16QImode, gen_rtx_CONST_VECTOR (V16QImode, v));
16345       emit_insn (gen_sse5_pperm_pack_v4si_v8hi (op0, op1, op2, x));
16346       break;
16347
16348     case V4SImode:
16349       for (i = 0; i < 2; i++)
16350         {
16351           pperm_bytes[(4*i)+0]  = PPERM_SRC | PPERM_SRC1 | ((i*8) + 0);
16352           pperm_bytes[(4*i)+1]  = PPERM_SRC | PPERM_SRC1 | ((i*8) + 1);
16353           pperm_bytes[(4*i)+2]  = PPERM_SRC | PPERM_SRC1 | ((i*8) + 2);
16354           pperm_bytes[(4*i)+3]  = PPERM_SRC | PPERM_SRC1 | ((i*8) + 3);
16355           pperm_bytes[(4*i)+8]  = PPERM_SRC | PPERM_SRC2 | ((i*8) + 0);
16356           pperm_bytes[(4*i)+9]  = PPERM_SRC | PPERM_SRC2 | ((i*8) + 1);
16357           pperm_bytes[(4*i)+10] = PPERM_SRC | PPERM_SRC2 | ((i*8) + 2);
16358           pperm_bytes[(4*i)+11] = PPERM_SRC | PPERM_SRC2 | ((i*8) + 3);
16359         }
16360
16361       for (i = 0; i < 16; i++)
16362         RTVEC_ELT (v, i) = GEN_INT (pperm_bytes[i]);
16363
16364       x = force_reg (V16QImode, gen_rtx_CONST_VECTOR (V16QImode, v));
16365       emit_insn (gen_sse5_pperm_pack_v2di_v4si (op0, op1, op2, x));
16366       break;
16367
16368     default:
16369       gcc_unreachable ();
16370     }
16371
16372   return;
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 compare_op;
16383   rtx val = const0_rtx;
16384   bool fpcmp = false;
16385   enum machine_mode mode = GET_MODE (operands[0]);
16386
16387   ix86_compare_op0 = XEXP (operands[1], 0);
16388   ix86_compare_op1 = XEXP (operands[1], 1);
16389   if (operands[3] != const1_rtx
16390       && operands[3] != constm1_rtx)
16391     return 0;
16392   if (!ix86_expand_carry_flag_compare (code, ix86_compare_op0,
16393                                        ix86_compare_op1, &compare_op))
16394      return 0;
16395   code = GET_CODE (compare_op);
16396
16397   if (GET_MODE (XEXP (compare_op, 0)) == CCFPmode
16398       || GET_MODE (XEXP (compare_op, 0)) == CCFPUmode)
16399     {
16400       fpcmp = true;
16401       code = ix86_fp_compare_code_to_integer (code);
16402     }
16403
16404   if (code != LTU)
16405     {
16406       val = constm1_rtx;
16407       if (fpcmp)
16408         PUT_CODE (compare_op,
16409                   reverse_condition_maybe_unordered
16410                     (GET_CODE (compare_op)));
16411       else
16412         PUT_CODE (compare_op, reverse_condition (GET_CODE (compare_op)));
16413     }
16414   PUT_MODE (compare_op, mode);
16415
16416   /* Construct either adc or sbb insn.  */
16417   if ((code == LTU) == (operands[3] == constm1_rtx))
16418     {
16419       switch (GET_MODE (operands[0]))
16420         {
16421           case QImode:
16422             emit_insn (gen_subqi3_carry (operands[0], operands[2], val, compare_op));
16423             break;
16424           case HImode:
16425             emit_insn (gen_subhi3_carry (operands[0], operands[2], val, compare_op));
16426             break;
16427           case SImode:
16428             emit_insn (gen_subsi3_carry (operands[0], operands[2], val, compare_op));
16429             break;
16430           case DImode:
16431             emit_insn (gen_subdi3_carry_rex64 (operands[0], operands[2], val, compare_op));
16432             break;
16433           default:
16434             gcc_unreachable ();
16435         }
16436     }
16437   else
16438     {
16439       switch (GET_MODE (operands[0]))
16440         {
16441           case QImode:
16442             emit_insn (gen_addqi3_carry (operands[0], operands[2], val, compare_op));
16443             break;
16444           case HImode:
16445             emit_insn (gen_addhi3_carry (operands[0], operands[2], val, compare_op));
16446             break;
16447           case SImode:
16448             emit_insn (gen_addsi3_carry (operands[0], operands[2], val, compare_op));
16449             break;
16450           case DImode:
16451             emit_insn (gen_adddi3_carry_rex64 (operands[0], operands[2], val, compare_op));
16452             break;
16453           default:
16454             gcc_unreachable ();
16455         }
16456     }
16457   return 1; /* DONE */
16458 }
16459
16460
16461 /* Split operands 0 and 1 into SImode parts.  Similar to split_di, but
16462    works for floating pointer parameters and nonoffsetable memories.
16463    For pushes, it returns just stack offsets; the values will be saved
16464    in the right order.  Maximally three parts are generated.  */
16465
16466 static int
16467 ix86_split_to_parts (rtx operand, rtx *parts, enum machine_mode mode)
16468 {
16469   int size;
16470
16471   if (!TARGET_64BIT)
16472     size = mode==XFmode ? 3 : GET_MODE_SIZE (mode) / 4;
16473   else
16474     size = (GET_MODE_SIZE (mode) + 4) / 8;
16475
16476   gcc_assert (!REG_P (operand) || !MMX_REGNO_P (REGNO (operand)));
16477   gcc_assert (size >= 2 && size <= 4);
16478
16479   /* Optimize constant pool reference to immediates.  This is used by fp
16480      moves, that force all constants to memory to allow combining.  */
16481   if (MEM_P (operand) && MEM_READONLY_P (operand))
16482     {
16483       rtx tmp = maybe_get_pool_constant (operand);
16484       if (tmp)
16485         operand = tmp;
16486     }
16487
16488   if (MEM_P (operand) && !offsettable_memref_p (operand))
16489     {
16490       /* The only non-offsetable memories we handle are pushes.  */
16491       int ok = push_operand (operand, VOIDmode);
16492
16493       gcc_assert (ok);
16494
16495       operand = copy_rtx (operand);
16496       PUT_MODE (operand, Pmode);
16497       parts[0] = parts[1] = parts[2] = parts[3] = operand;
16498       return size;
16499     }
16500
16501   if (GET_CODE (operand) == CONST_VECTOR)
16502     {
16503       enum machine_mode imode = int_mode_for_mode (mode);
16504       /* Caution: if we looked through a constant pool memory above,
16505          the operand may actually have a different mode now.  That's
16506          ok, since we want to pun this all the way back to an integer.  */
16507       operand = simplify_subreg (imode, operand, GET_MODE (operand), 0);
16508       gcc_assert (operand != NULL);
16509       mode = imode;
16510     }
16511
16512   if (!TARGET_64BIT)
16513     {
16514       if (mode == DImode)
16515         split_di (&operand, 1, &parts[0], &parts[1]);
16516       else
16517         {
16518           int i;
16519
16520           if (REG_P (operand))
16521             {
16522               gcc_assert (reload_completed);
16523               for (i = 0; i < size; i++)
16524                 parts[i] = gen_rtx_REG (SImode, REGNO (operand) + i);
16525             }
16526           else if (offsettable_memref_p (operand))
16527             {
16528               operand = adjust_address (operand, SImode, 0);
16529               parts[0] = operand;
16530               for (i = 1; i < size; i++)
16531                 parts[i] = adjust_address (operand, SImode, 4 * i);
16532             }
16533           else if (GET_CODE (operand) == CONST_DOUBLE)
16534             {
16535               REAL_VALUE_TYPE r;
16536               long l[4];
16537
16538               REAL_VALUE_FROM_CONST_DOUBLE (r, operand);
16539               switch (mode)
16540                 {
16541                 case TFmode:
16542                   real_to_target (l, &r, mode);
16543                   parts[3] = gen_int_mode (l[3], SImode);
16544                   parts[2] = gen_int_mode (l[2], SImode);
16545                   break;
16546                 case XFmode:
16547                   REAL_VALUE_TO_TARGET_LONG_DOUBLE (r, l);
16548                   parts[2] = gen_int_mode (l[2], SImode);
16549                   break;
16550                 case DFmode:
16551                   REAL_VALUE_TO_TARGET_DOUBLE (r, l);
16552                   break;
16553                 default:
16554                   gcc_unreachable ();
16555                 }
16556               parts[1] = gen_int_mode (l[1], SImode);
16557               parts[0] = gen_int_mode (l[0], SImode);
16558             }
16559           else
16560             gcc_unreachable ();
16561         }
16562     }
16563   else
16564     {
16565       if (mode == TImode)
16566         split_ti (&operand, 1, &parts[0], &parts[1]);
16567       if (mode == XFmode || mode == TFmode)
16568         {
16569           enum machine_mode upper_mode = mode==XFmode ? SImode : DImode;
16570           if (REG_P (operand))
16571             {
16572               gcc_assert (reload_completed);
16573               parts[0] = gen_rtx_REG (DImode, REGNO (operand) + 0);
16574               parts[1] = gen_rtx_REG (upper_mode, REGNO (operand) + 1);
16575             }
16576           else if (offsettable_memref_p (operand))
16577             {
16578               operand = adjust_address (operand, DImode, 0);
16579               parts[0] = operand;
16580               parts[1] = adjust_address (operand, upper_mode, 8);
16581             }
16582           else if (GET_CODE (operand) == CONST_DOUBLE)
16583             {
16584               REAL_VALUE_TYPE r;
16585               long l[4];
16586
16587               REAL_VALUE_FROM_CONST_DOUBLE (r, operand);
16588               real_to_target (l, &r, mode);
16589
16590               /* Do not use shift by 32 to avoid warning on 32bit systems.  */
16591               if (HOST_BITS_PER_WIDE_INT >= 64)
16592                 parts[0]
16593                   = gen_int_mode
16594                       ((l[0] & (((HOST_WIDE_INT) 2 << 31) - 1))
16595                        + ((((HOST_WIDE_INT) l[1]) << 31) << 1),
16596                        DImode);
16597               else
16598                 parts[0] = immed_double_const (l[0], l[1], DImode);
16599
16600               if (upper_mode == SImode)
16601                 parts[1] = gen_int_mode (l[2], SImode);
16602               else if (HOST_BITS_PER_WIDE_INT >= 64)
16603                 parts[1]
16604                   = gen_int_mode
16605                       ((l[2] & (((HOST_WIDE_INT) 2 << 31) - 1))
16606                        + ((((HOST_WIDE_INT) l[3]) << 31) << 1),
16607                        DImode);
16608               else
16609                 parts[1] = immed_double_const (l[2], l[3], DImode);
16610             }
16611           else
16612             gcc_unreachable ();
16613         }
16614     }
16615
16616   return size;
16617 }
16618
16619 /* Emit insns to perform a move or push of DI, DF, XF, and TF values.
16620    Return false when normal moves are needed; true when all required
16621    insns have been emitted.  Operands 2-4 contain the input values
16622    int the correct order; operands 5-7 contain the output values.  */
16623
16624 void
16625 ix86_split_long_move (rtx operands[])
16626 {
16627   rtx part[2][4];
16628   int nparts, i, j;
16629   int push = 0;
16630   int collisions = 0;
16631   enum machine_mode mode = GET_MODE (operands[0]);
16632   bool collisionparts[4];
16633
16634   /* The DFmode expanders may ask us to move double.
16635      For 64bit target this is single move.  By hiding the fact
16636      here we simplify i386.md splitters.  */
16637   if (GET_MODE_SIZE (GET_MODE (operands[0])) == 8 && TARGET_64BIT)
16638     {
16639       /* Optimize constant pool reference to immediates.  This is used by
16640          fp moves, that force all constants to memory to allow combining.  */
16641
16642       if (MEM_P (operands[1])
16643           && GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF
16644           && CONSTANT_POOL_ADDRESS_P (XEXP (operands[1], 0)))
16645         operands[1] = get_pool_constant (XEXP (operands[1], 0));
16646       if (push_operand (operands[0], VOIDmode))
16647         {
16648           operands[0] = copy_rtx (operands[0]);
16649           PUT_MODE (operands[0], Pmode);
16650         }
16651       else
16652         operands[0] = gen_lowpart (DImode, operands[0]);
16653       operands[1] = gen_lowpart (DImode, operands[1]);
16654       emit_move_insn (operands[0], operands[1]);
16655       return;
16656     }
16657
16658   /* The only non-offsettable memory we handle is push.  */
16659   if (push_operand (operands[0], VOIDmode))
16660     push = 1;
16661   else
16662     gcc_assert (!MEM_P (operands[0])
16663                 || offsettable_memref_p (operands[0]));
16664
16665   nparts = ix86_split_to_parts (operands[1], part[1], GET_MODE (operands[0]));
16666   ix86_split_to_parts (operands[0], part[0], GET_MODE (operands[0]));
16667
16668   /* When emitting push, take care for source operands on the stack.  */
16669   if (push && MEM_P (operands[1])
16670       && reg_overlap_mentioned_p (stack_pointer_rtx, operands[1]))
16671     for (i = 0; i < nparts - 1; i++)
16672       part[1][i] = change_address (part[1][i],
16673                                    GET_MODE (part[1][i]),
16674                                    XEXP (part[1][i + 1], 0));
16675
16676   /* We need to do copy in the right order in case an address register
16677      of the source overlaps the destination.  */
16678   if (REG_P (part[0][0]) && MEM_P (part[1][0]))
16679     {
16680       rtx tmp;
16681
16682       for (i = 0; i < nparts; i++)
16683         {
16684           collisionparts[i]
16685             = reg_overlap_mentioned_p (part[0][i], XEXP (part[1][0], 0));
16686           if (collisionparts[i])
16687             collisions++;
16688         }
16689
16690       /* Collision in the middle part can be handled by reordering.  */
16691       if (collisions == 1 && nparts == 3 && collisionparts [1])
16692         {
16693           tmp = part[0][1]; part[0][1] = part[0][2]; part[0][2] = tmp;
16694           tmp = part[1][1]; part[1][1] = part[1][2]; part[1][2] = tmp;
16695         }
16696       else if (collisions == 1
16697                && nparts == 4
16698                && (collisionparts [1] || collisionparts [2]))
16699         {
16700           if (collisionparts [1])
16701             {
16702               tmp = part[0][1]; part[0][1] = part[0][2]; part[0][2] = tmp;
16703               tmp = part[1][1]; part[1][1] = part[1][2]; part[1][2] = tmp;
16704             }
16705           else
16706             {
16707               tmp = part[0][2]; part[0][2] = part[0][3]; part[0][3] = tmp;
16708               tmp = part[1][2]; part[1][2] = part[1][3]; part[1][3] = tmp;
16709             }
16710         }
16711
16712       /* If there are more collisions, we can't handle it by reordering.
16713          Do an lea to the last part and use only one colliding move.  */
16714       else if (collisions > 1)
16715         {
16716           rtx base;
16717
16718           collisions = 1;
16719
16720           base = part[0][nparts - 1];
16721
16722           /* Handle the case when the last part isn't valid for lea.
16723              Happens in 64-bit mode storing the 12-byte XFmode.  */
16724           if (GET_MODE (base) != Pmode)
16725             base = gen_rtx_REG (Pmode, REGNO (base));
16726
16727           emit_insn (gen_rtx_SET (VOIDmode, base, XEXP (part[1][0], 0)));
16728           part[1][0] = replace_equiv_address (part[1][0], base);
16729           for (i = 1; i < nparts; i++)
16730             {
16731               tmp = plus_constant (base, UNITS_PER_WORD * i);
16732               part[1][i] = replace_equiv_address (part[1][i], tmp);
16733             }
16734         }
16735     }
16736
16737   if (push)
16738     {
16739       if (!TARGET_64BIT)
16740         {
16741           if (nparts == 3)
16742             {
16743               if (TARGET_128BIT_LONG_DOUBLE && mode == XFmode)
16744                 emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx, GEN_INT (-4)));
16745               emit_move_insn (part[0][2], part[1][2]);
16746             }
16747           else if (nparts == 4)
16748             {
16749               emit_move_insn (part[0][3], part[1][3]);
16750               emit_move_insn (part[0][2], part[1][2]);
16751             }
16752         }
16753       else
16754         {
16755           /* In 64bit mode we don't have 32bit push available.  In case this is
16756              register, it is OK - we will just use larger counterpart.  We also
16757              retype memory - these comes from attempt to avoid REX prefix on
16758              moving of second half of TFmode value.  */
16759           if (GET_MODE (part[1][1]) == SImode)
16760             {
16761               switch (GET_CODE (part[1][1]))
16762                 {
16763                 case MEM:
16764                   part[1][1] = adjust_address (part[1][1], DImode, 0);
16765                   break;
16766
16767                 case REG:
16768                   part[1][1] = gen_rtx_REG (DImode, REGNO (part[1][1]));
16769                   break;
16770
16771                 default:
16772                   gcc_unreachable ();
16773                 }
16774
16775               if (GET_MODE (part[1][0]) == SImode)
16776                 part[1][0] = part[1][1];
16777             }
16778         }
16779       emit_move_insn (part[0][1], part[1][1]);
16780       emit_move_insn (part[0][0], part[1][0]);
16781       return;
16782     }
16783
16784   /* Choose correct order to not overwrite the source before it is copied.  */
16785   if ((REG_P (part[0][0])
16786        && REG_P (part[1][1])
16787        && (REGNO (part[0][0]) == REGNO (part[1][1])
16788            || (nparts == 3
16789                && REGNO (part[0][0]) == REGNO (part[1][2]))
16790            || (nparts == 4
16791                && REGNO (part[0][0]) == REGNO (part[1][3]))))
16792       || (collisions > 0
16793           && reg_overlap_mentioned_p (part[0][0], XEXP (part[1][0], 0))))
16794     {
16795       for (i = 0, j = nparts - 1; i < nparts; i++, j--)
16796         {
16797           operands[2 + i] = part[0][j];
16798           operands[6 + i] = part[1][j];
16799         }
16800     }
16801   else
16802     {
16803       for (i = 0; i < nparts; i++)
16804         {
16805           operands[2 + i] = part[0][i];
16806           operands[6 + i] = part[1][i];
16807         }
16808     }
16809
16810   /* If optimizing for size, attempt to locally unCSE nonzero constants.  */
16811   if (optimize_insn_for_size_p ())
16812     {
16813       for (j = 0; j < nparts - 1; j++)
16814         if (CONST_INT_P (operands[6 + j])
16815             && operands[6 + j] != const0_rtx
16816             && REG_P (operands[2 + j]))
16817           for (i = j; i < nparts - 1; i++)
16818             if (CONST_INT_P (operands[7 + i])
16819                 && INTVAL (operands[7 + i]) == INTVAL (operands[6 + j]))
16820               operands[7 + i] = operands[2 + j];
16821     }
16822
16823   for (i = 0; i < nparts; i++)
16824     emit_move_insn (operands[2 + i], operands[6 + i]);
16825
16826   return;
16827 }
16828
16829 /* Helper function of ix86_split_ashl used to generate an SImode/DImode
16830    left shift by a constant, either using a single shift or
16831    a sequence of add instructions.  */
16832
16833 static void
16834 ix86_expand_ashl_const (rtx operand, int count, enum machine_mode mode)
16835 {
16836   if (count == 1)
16837     {
16838       emit_insn ((mode == DImode
16839                   ? gen_addsi3
16840                   : gen_adddi3) (operand, operand, operand));
16841     }
16842   else if (!optimize_insn_for_size_p ()
16843            && count * ix86_cost->add <= ix86_cost->shift_const)
16844     {
16845       int i;
16846       for (i=0; i<count; i++)
16847         {
16848           emit_insn ((mode == DImode
16849                       ? gen_addsi3
16850                       : gen_adddi3) (operand, operand, operand));
16851         }
16852     }
16853   else
16854     emit_insn ((mode == DImode
16855                 ? gen_ashlsi3
16856                 : gen_ashldi3) (operand, operand, GEN_INT (count)));
16857 }
16858
16859 void
16860 ix86_split_ashl (rtx *operands, rtx scratch, enum machine_mode mode)
16861 {
16862   rtx low[2], high[2];
16863   int count;
16864   const int single_width = mode == DImode ? 32 : 64;
16865
16866   if (CONST_INT_P (operands[2]))
16867     {
16868       (mode == DImode ? split_di : split_ti) (operands, 2, low, high);
16869       count = INTVAL (operands[2]) & (single_width * 2 - 1);
16870
16871       if (count >= single_width)
16872         {
16873           emit_move_insn (high[0], low[1]);
16874           emit_move_insn (low[0], const0_rtx);
16875
16876           if (count > single_width)
16877             ix86_expand_ashl_const (high[0], count - single_width, mode);
16878         }
16879       else
16880         {
16881           if (!rtx_equal_p (operands[0], operands[1]))
16882             emit_move_insn (operands[0], operands[1]);
16883           emit_insn ((mode == DImode
16884                      ? gen_x86_shld
16885                      : gen_x86_64_shld) (high[0], low[0], GEN_INT (count)));
16886           ix86_expand_ashl_const (low[0], count, mode);
16887         }
16888       return;
16889     }
16890
16891   (mode == DImode ? split_di : split_ti) (operands, 1, low, high);
16892
16893   if (operands[1] == const1_rtx)
16894     {
16895       /* Assuming we've chosen a QImode capable registers, then 1 << N
16896          can be done with two 32/64-bit shifts, no branches, no cmoves.  */
16897       if (ANY_QI_REG_P (low[0]) && ANY_QI_REG_P (high[0]))
16898         {
16899           rtx s, d, flags = gen_rtx_REG (CCZmode, FLAGS_REG);
16900
16901           ix86_expand_clear (low[0]);
16902           ix86_expand_clear (high[0]);
16903           emit_insn (gen_testqi_ccz_1 (operands[2], GEN_INT (single_width)));
16904
16905           d = gen_lowpart (QImode, low[0]);
16906           d = gen_rtx_STRICT_LOW_PART (VOIDmode, d);
16907           s = gen_rtx_EQ (QImode, flags, const0_rtx);
16908           emit_insn (gen_rtx_SET (VOIDmode, d, s));
16909
16910           d = gen_lowpart (QImode, high[0]);
16911           d = gen_rtx_STRICT_LOW_PART (VOIDmode, d);
16912           s = gen_rtx_NE (QImode, flags, const0_rtx);
16913           emit_insn (gen_rtx_SET (VOIDmode, d, s));
16914         }
16915
16916       /* Otherwise, we can get the same results by manually performing
16917          a bit extract operation on bit 5/6, and then performing the two
16918          shifts.  The two methods of getting 0/1 into low/high are exactly
16919          the same size.  Avoiding the shift in the bit extract case helps
16920          pentium4 a bit; no one else seems to care much either way.  */
16921       else
16922         {
16923           rtx x;
16924
16925           if (TARGET_PARTIAL_REG_STALL && !optimize_insn_for_size_p ())
16926             x = gen_rtx_ZERO_EXTEND (mode == DImode ? SImode : DImode, operands[2]);
16927           else
16928             x = gen_lowpart (mode == DImode ? SImode : DImode, operands[2]);
16929           emit_insn (gen_rtx_SET (VOIDmode, high[0], x));
16930
16931           emit_insn ((mode == DImode
16932                       ? gen_lshrsi3
16933                       : gen_lshrdi3) (high[0], high[0], GEN_INT (mode == DImode ? 5 : 6)));
16934           emit_insn ((mode == DImode
16935                       ? gen_andsi3
16936                       : gen_anddi3) (high[0], high[0], GEN_INT (1)));
16937           emit_move_insn (low[0], high[0]);
16938           emit_insn ((mode == DImode
16939                       ? gen_xorsi3
16940                       : gen_xordi3) (low[0], low[0], GEN_INT (1)));
16941         }
16942
16943       emit_insn ((mode == DImode
16944                     ? gen_ashlsi3
16945                     : gen_ashldi3) (low[0], low[0], operands[2]));
16946       emit_insn ((mode == DImode
16947                     ? gen_ashlsi3
16948                     : gen_ashldi3) (high[0], high[0], operands[2]));
16949       return;
16950     }
16951
16952   if (operands[1] == constm1_rtx)
16953     {
16954       /* For -1 << N, we can avoid the shld instruction, because we
16955          know that we're shifting 0...31/63 ones into a -1.  */
16956       emit_move_insn (low[0], constm1_rtx);
16957       if (optimize_insn_for_size_p ())
16958         emit_move_insn (high[0], low[0]);
16959       else
16960         emit_move_insn (high[0], constm1_rtx);
16961     }
16962   else
16963     {
16964       if (!rtx_equal_p (operands[0], operands[1]))
16965         emit_move_insn (operands[0], operands[1]);
16966
16967       (mode == DImode ? split_di : split_ti) (operands, 1, low, high);
16968       emit_insn ((mode == DImode
16969                   ? gen_x86_shld
16970                   : gen_x86_64_shld) (high[0], low[0], operands[2]));
16971     }
16972
16973   emit_insn ((mode == DImode ? gen_ashlsi3 : gen_ashldi3) (low[0], low[0], operands[2]));
16974
16975   if (TARGET_CMOVE && scratch)
16976     {
16977       ix86_expand_clear (scratch);
16978       emit_insn ((mode == DImode
16979                   ? gen_x86_shift_adj_1
16980                   : gen_x86_64_shift_adj_1) (high[0], low[0], operands[2],
16981                                              scratch));
16982     }
16983   else
16984     emit_insn ((mode == DImode
16985                 ? gen_x86_shift_adj_2
16986                 : gen_x86_64_shift_adj_2) (high[0], low[0], operands[2]));
16987 }
16988
16989 void
16990 ix86_split_ashr (rtx *operands, rtx scratch, enum machine_mode mode)
16991 {
16992   rtx low[2], high[2];
16993   int count;
16994   const int single_width = mode == DImode ? 32 : 64;
16995
16996   if (CONST_INT_P (operands[2]))
16997     {
16998       (mode == DImode ? split_di : split_ti) (operands, 2, low, high);
16999       count = INTVAL (operands[2]) & (single_width * 2 - 1);
17000
17001       if (count == single_width * 2 - 1)
17002         {
17003           emit_move_insn (high[0], high[1]);
17004           emit_insn ((mode == DImode
17005                       ? gen_ashrsi3
17006                       : gen_ashrdi3) (high[0], high[0],
17007                                       GEN_INT (single_width - 1)));
17008           emit_move_insn (low[0], high[0]);
17009
17010         }
17011       else if (count >= single_width)
17012         {
17013           emit_move_insn (low[0], high[1]);
17014           emit_move_insn (high[0], low[0]);
17015           emit_insn ((mode == DImode
17016                       ? gen_ashrsi3
17017                       : gen_ashrdi3) (high[0], high[0],
17018                                       GEN_INT (single_width - 1)));
17019           if (count > single_width)
17020             emit_insn ((mode == DImode
17021                         ? gen_ashrsi3
17022                         : gen_ashrdi3) (low[0], low[0],
17023                                         GEN_INT (count - single_width)));
17024         }
17025       else
17026         {
17027           if (!rtx_equal_p (operands[0], operands[1]))
17028             emit_move_insn (operands[0], operands[1]);
17029           emit_insn ((mode == DImode
17030                       ? gen_x86_shrd
17031                       : gen_x86_64_shrd) (low[0], high[0], GEN_INT (count)));
17032           emit_insn ((mode == DImode
17033                       ? gen_ashrsi3
17034                       : gen_ashrdi3) (high[0], high[0], GEN_INT (count)));
17035         }
17036     }
17037   else
17038     {
17039       if (!rtx_equal_p (operands[0], operands[1]))
17040         emit_move_insn (operands[0], operands[1]);
17041
17042       (mode == DImode ? split_di : split_ti) (operands, 1, low, high);
17043
17044       emit_insn ((mode == DImode
17045                   ? gen_x86_shrd
17046                   : gen_x86_64_shrd) (low[0], high[0], operands[2]));
17047       emit_insn ((mode == DImode
17048                   ? gen_ashrsi3
17049                   : gen_ashrdi3)  (high[0], high[0], operands[2]));
17050
17051       if (TARGET_CMOVE && scratch)
17052         {
17053           emit_move_insn (scratch, high[0]);
17054           emit_insn ((mode == DImode
17055                       ? gen_ashrsi3
17056                       : gen_ashrdi3) (scratch, scratch,
17057                                       GEN_INT (single_width - 1)));
17058           emit_insn ((mode == DImode
17059                       ? gen_x86_shift_adj_1
17060                       : gen_x86_64_shift_adj_1) (low[0], high[0], operands[2],
17061                                                  scratch));
17062         }
17063       else
17064         emit_insn ((mode == DImode
17065                     ? gen_x86_shift_adj_3
17066                     : gen_x86_64_shift_adj_3) (low[0], high[0], operands[2]));
17067     }
17068 }
17069
17070 void
17071 ix86_split_lshr (rtx *operands, rtx scratch, enum machine_mode mode)
17072 {
17073   rtx low[2], high[2];
17074   int count;
17075   const int single_width = mode == DImode ? 32 : 64;
17076
17077   if (CONST_INT_P (operands[2]))
17078     {
17079       (mode == DImode ? split_di : split_ti) (operands, 2, low, high);
17080       count = INTVAL (operands[2]) & (single_width * 2 - 1);
17081
17082       if (count >= single_width)
17083         {
17084           emit_move_insn (low[0], high[1]);
17085           ix86_expand_clear (high[0]);
17086
17087           if (count > single_width)
17088             emit_insn ((mode == DImode
17089                         ? gen_lshrsi3
17090                         : gen_lshrdi3) (low[0], low[0],
17091                                         GEN_INT (count - single_width)));
17092         }
17093       else
17094         {
17095           if (!rtx_equal_p (operands[0], operands[1]))
17096             emit_move_insn (operands[0], operands[1]);
17097           emit_insn ((mode == DImode
17098                       ? gen_x86_shrd
17099                       : gen_x86_64_shrd) (low[0], high[0], GEN_INT (count)));
17100           emit_insn ((mode == DImode
17101                       ? gen_lshrsi3
17102                       : gen_lshrdi3) (high[0], high[0], GEN_INT (count)));
17103         }
17104     }
17105   else
17106     {
17107       if (!rtx_equal_p (operands[0], operands[1]))
17108         emit_move_insn (operands[0], operands[1]);
17109
17110       (mode == DImode ? split_di : split_ti) (operands, 1, low, high);
17111
17112       emit_insn ((mode == DImode
17113                   ? gen_x86_shrd
17114                   : gen_x86_64_shrd) (low[0], high[0], operands[2]));
17115       emit_insn ((mode == DImode
17116                   ? gen_lshrsi3
17117                   : gen_lshrdi3) (high[0], high[0], operands[2]));
17118
17119       /* Heh.  By reversing the arguments, we can reuse this pattern.  */
17120       if (TARGET_CMOVE && scratch)
17121         {
17122           ix86_expand_clear (scratch);
17123           emit_insn ((mode == DImode
17124                       ? gen_x86_shift_adj_1
17125                       : gen_x86_64_shift_adj_1) (low[0], high[0], operands[2],
17126                                                  scratch));
17127         }
17128       else
17129         emit_insn ((mode == DImode
17130                     ? gen_x86_shift_adj_2
17131                     : gen_x86_64_shift_adj_2) (low[0], high[0], operands[2]));
17132     }
17133 }
17134
17135 /* Predict just emitted jump instruction to be taken with probability PROB.  */
17136 static void
17137 predict_jump (int prob)
17138 {
17139   rtx insn = get_last_insn ();
17140   gcc_assert (JUMP_P (insn));
17141   add_reg_note (insn, REG_BR_PROB, GEN_INT (prob));
17142 }
17143
17144 /* Helper function for the string operations below.  Dest VARIABLE whether
17145    it is aligned to VALUE bytes.  If true, jump to the label.  */
17146 static rtx
17147 ix86_expand_aligntest (rtx variable, int value, bool epilogue)
17148 {
17149   rtx label = gen_label_rtx ();
17150   rtx tmpcount = gen_reg_rtx (GET_MODE (variable));
17151   if (GET_MODE (variable) == DImode)
17152     emit_insn (gen_anddi3 (tmpcount, variable, GEN_INT (value)));
17153   else
17154     emit_insn (gen_andsi3 (tmpcount, variable, GEN_INT (value)));
17155   emit_cmp_and_jump_insns (tmpcount, const0_rtx, EQ, 0, GET_MODE (variable),
17156                            1, label);
17157   if (epilogue)
17158     predict_jump (REG_BR_PROB_BASE * 50 / 100);
17159   else
17160     predict_jump (REG_BR_PROB_BASE * 90 / 100);
17161   return label;
17162 }
17163
17164 /* Adjust COUNTER by the VALUE.  */
17165 static void
17166 ix86_adjust_counter (rtx countreg, HOST_WIDE_INT value)
17167 {
17168   if (GET_MODE (countreg) == DImode)
17169     emit_insn (gen_adddi3 (countreg, countreg, GEN_INT (-value)));
17170   else
17171     emit_insn (gen_addsi3 (countreg, countreg, GEN_INT (-value)));
17172 }
17173
17174 /* Zero extend possibly SImode EXP to Pmode register.  */
17175 rtx
17176 ix86_zero_extend_to_Pmode (rtx exp)
17177 {
17178   rtx r;
17179   if (GET_MODE (exp) == VOIDmode)
17180     return force_reg (Pmode, exp);
17181   if (GET_MODE (exp) == Pmode)
17182     return copy_to_mode_reg (Pmode, exp);
17183   r = gen_reg_rtx (Pmode);
17184   emit_insn (gen_zero_extendsidi2 (r, exp));
17185   return r;
17186 }
17187
17188 /* Divide COUNTREG by SCALE.  */
17189 static rtx
17190 scale_counter (rtx countreg, int scale)
17191 {
17192   rtx sc;
17193   rtx piece_size_mask;
17194
17195   if (scale == 1)
17196     return countreg;
17197   if (CONST_INT_P (countreg))
17198     return GEN_INT (INTVAL (countreg) / scale);
17199   gcc_assert (REG_P (countreg));
17200
17201   piece_size_mask = GEN_INT (scale - 1);
17202   sc = expand_simple_binop (GET_MODE (countreg), LSHIFTRT, countreg,
17203                             GEN_INT (exact_log2 (scale)),
17204                             NULL, 1, OPTAB_DIRECT);
17205   return sc;
17206 }
17207
17208 /* Return mode for the memcpy/memset loop counter.  Prefer SImode over
17209    DImode for constant loop counts.  */
17210
17211 static enum machine_mode
17212 counter_mode (rtx count_exp)
17213 {
17214   if (GET_MODE (count_exp) != VOIDmode)
17215     return GET_MODE (count_exp);
17216   if (GET_CODE (count_exp) != CONST_INT)
17217     return Pmode;
17218   if (TARGET_64BIT && (INTVAL (count_exp) & ~0xffffffff))
17219     return DImode;
17220   return SImode;
17221 }
17222
17223 /* When SRCPTR is non-NULL, output simple loop to move memory
17224    pointer to SRCPTR to DESTPTR via chunks of MODE unrolled UNROLL times,
17225    overall size is COUNT specified in bytes.  When SRCPTR is NULL, output the
17226    equivalent loop to set memory by VALUE (supposed to be in MODE).
17227
17228    The size is rounded down to whole number of chunk size moved at once.
17229    SRCMEM and DESTMEM provide MEMrtx to feed proper aliasing info.  */
17230
17231
17232 static void
17233 expand_set_or_movmem_via_loop (rtx destmem, rtx srcmem,
17234                                rtx destptr, rtx srcptr, rtx value,
17235                                rtx count, enum machine_mode mode, int unroll,
17236                                int expected_size)
17237 {
17238   rtx out_label, top_label, iter, tmp;
17239   enum machine_mode iter_mode = counter_mode (count);
17240   rtx piece_size = GEN_INT (GET_MODE_SIZE (mode) * unroll);
17241   rtx piece_size_mask = GEN_INT (~((GET_MODE_SIZE (mode) * unroll) - 1));
17242   rtx size;
17243   rtx x_addr;
17244   rtx y_addr;
17245   int i;
17246
17247   top_label = gen_label_rtx ();
17248   out_label = gen_label_rtx ();
17249   iter = gen_reg_rtx (iter_mode);
17250
17251   size = expand_simple_binop (iter_mode, AND, count, piece_size_mask,
17252                               NULL, 1, OPTAB_DIRECT);
17253   /* Those two should combine.  */
17254   if (piece_size == const1_rtx)
17255     {
17256       emit_cmp_and_jump_insns (size, const0_rtx, EQ, NULL_RTX, iter_mode,
17257                                true, out_label);
17258       predict_jump (REG_BR_PROB_BASE * 10 / 100);
17259     }
17260   emit_move_insn (iter, const0_rtx);
17261
17262   emit_label (top_label);
17263
17264   tmp = convert_modes (Pmode, iter_mode, iter, true);
17265   x_addr = gen_rtx_PLUS (Pmode, destptr, tmp);
17266   destmem = change_address (destmem, mode, x_addr);
17267
17268   if (srcmem)
17269     {
17270       y_addr = gen_rtx_PLUS (Pmode, srcptr, copy_rtx (tmp));
17271       srcmem = change_address (srcmem, mode, y_addr);
17272
17273       /* When unrolling for chips that reorder memory reads and writes,
17274          we can save registers by using single temporary.
17275          Also using 4 temporaries is overkill in 32bit mode.  */
17276       if (!TARGET_64BIT && 0)
17277         {
17278           for (i = 0; i < unroll; i++)
17279             {
17280               if (i)
17281                 {
17282                   destmem =
17283                     adjust_address (copy_rtx (destmem), mode, GET_MODE_SIZE (mode));
17284                   srcmem =
17285                     adjust_address (copy_rtx (srcmem), mode, GET_MODE_SIZE (mode));
17286                 }
17287               emit_move_insn (destmem, srcmem);
17288             }
17289         }
17290       else
17291         {
17292           rtx tmpreg[4];
17293           gcc_assert (unroll <= 4);
17294           for (i = 0; i < unroll; i++)
17295             {
17296               tmpreg[i] = gen_reg_rtx (mode);
17297               if (i)
17298                 {
17299                   srcmem =
17300                     adjust_address (copy_rtx (srcmem), mode, GET_MODE_SIZE (mode));
17301                 }
17302               emit_move_insn (tmpreg[i], srcmem);
17303             }
17304           for (i = 0; i < unroll; i++)
17305             {
17306               if (i)
17307                 {
17308                   destmem =
17309                     adjust_address (copy_rtx (destmem), mode, GET_MODE_SIZE (mode));
17310                 }
17311               emit_move_insn (destmem, tmpreg[i]);
17312             }
17313         }
17314     }
17315   else
17316     for (i = 0; i < unroll; i++)
17317       {
17318         if (i)
17319           destmem =
17320             adjust_address (copy_rtx (destmem), mode, GET_MODE_SIZE (mode));
17321         emit_move_insn (destmem, value);
17322       }
17323
17324   tmp = expand_simple_binop (iter_mode, PLUS, iter, piece_size, iter,
17325                              true, OPTAB_LIB_WIDEN);
17326   if (tmp != iter)
17327     emit_move_insn (iter, tmp);
17328
17329   emit_cmp_and_jump_insns (iter, size, LT, NULL_RTX, iter_mode,
17330                            true, top_label);
17331   if (expected_size != -1)
17332     {
17333       expected_size /= GET_MODE_SIZE (mode) * unroll;
17334       if (expected_size == 0)
17335         predict_jump (0);
17336       else if (expected_size > REG_BR_PROB_BASE)
17337         predict_jump (REG_BR_PROB_BASE - 1);
17338       else
17339         predict_jump (REG_BR_PROB_BASE - (REG_BR_PROB_BASE + expected_size / 2) / expected_size);
17340     }
17341   else
17342     predict_jump (REG_BR_PROB_BASE * 80 / 100);
17343   iter = ix86_zero_extend_to_Pmode (iter);
17344   tmp = expand_simple_binop (Pmode, PLUS, destptr, iter, destptr,
17345                              true, OPTAB_LIB_WIDEN);
17346   if (tmp != destptr)
17347     emit_move_insn (destptr, tmp);
17348   if (srcptr)
17349     {
17350       tmp = expand_simple_binop (Pmode, PLUS, srcptr, iter, srcptr,
17351                                  true, OPTAB_LIB_WIDEN);
17352       if (tmp != srcptr)
17353         emit_move_insn (srcptr, tmp);
17354     }
17355   emit_label (out_label);
17356 }
17357
17358 /* Output "rep; mov" instruction.
17359    Arguments have same meaning as for previous function */
17360 static void
17361 expand_movmem_via_rep_mov (rtx destmem, rtx srcmem,
17362                            rtx destptr, rtx srcptr,
17363                            rtx count,
17364                            enum machine_mode mode)
17365 {
17366   rtx destexp;
17367   rtx srcexp;
17368   rtx countreg;
17369
17370   /* If the size is known, it is shorter to use rep movs.  */
17371   if (mode == QImode && CONST_INT_P (count)
17372       && !(INTVAL (count) & 3))
17373     mode = SImode;
17374
17375   if (destptr != XEXP (destmem, 0) || GET_MODE (destmem) != BLKmode)
17376     destmem = adjust_automodify_address_nv (destmem, BLKmode, destptr, 0);
17377   if (srcptr != XEXP (srcmem, 0) || GET_MODE (srcmem) != BLKmode)
17378     srcmem = adjust_automodify_address_nv (srcmem, BLKmode, srcptr, 0);
17379   countreg = ix86_zero_extend_to_Pmode (scale_counter (count, GET_MODE_SIZE (mode)));
17380   if (mode != QImode)
17381     {
17382       destexp = gen_rtx_ASHIFT (Pmode, countreg,
17383                                 GEN_INT (exact_log2 (GET_MODE_SIZE (mode))));
17384       destexp = gen_rtx_PLUS (Pmode, destexp, destptr);
17385       srcexp = gen_rtx_ASHIFT (Pmode, countreg,
17386                                GEN_INT (exact_log2 (GET_MODE_SIZE (mode))));
17387       srcexp = gen_rtx_PLUS (Pmode, srcexp, srcptr);
17388     }
17389   else
17390     {
17391       destexp = gen_rtx_PLUS (Pmode, destptr, countreg);
17392       srcexp = gen_rtx_PLUS (Pmode, srcptr, countreg);
17393     }
17394   if (CONST_INT_P (count))
17395     {
17396       count = GEN_INT (INTVAL (count)
17397                        & ~((HOST_WIDE_INT) GET_MODE_SIZE (mode) - 1));
17398       destmem = shallow_copy_rtx (destmem);
17399       srcmem = shallow_copy_rtx (srcmem);
17400       set_mem_size (destmem, count);
17401       set_mem_size (srcmem, count);
17402     }
17403   else
17404     {
17405       if (MEM_SIZE (destmem))
17406         set_mem_size (destmem, NULL_RTX);
17407       if (MEM_SIZE (srcmem))
17408         set_mem_size (srcmem, NULL_RTX);
17409     }
17410   emit_insn (gen_rep_mov (destptr, destmem, srcptr, srcmem, countreg,
17411                           destexp, srcexp));
17412 }
17413
17414 /* Output "rep; stos" instruction.
17415    Arguments have same meaning as for previous function */
17416 static void
17417 expand_setmem_via_rep_stos (rtx destmem, rtx destptr, rtx value,
17418                             rtx count, enum machine_mode mode,
17419                             rtx orig_value)
17420 {
17421   rtx destexp;
17422   rtx countreg;
17423
17424   if (destptr != XEXP (destmem, 0) || GET_MODE (destmem) != BLKmode)
17425     destmem = adjust_automodify_address_nv (destmem, BLKmode, destptr, 0);
17426   value = force_reg (mode, gen_lowpart (mode, value));
17427   countreg = ix86_zero_extend_to_Pmode (scale_counter (count, GET_MODE_SIZE (mode)));
17428   if (mode != QImode)
17429     {
17430       destexp = gen_rtx_ASHIFT (Pmode, countreg,
17431                                 GEN_INT (exact_log2 (GET_MODE_SIZE (mode))));
17432       destexp = gen_rtx_PLUS (Pmode, destexp, destptr);
17433     }
17434   else
17435     destexp = gen_rtx_PLUS (Pmode, destptr, countreg);
17436   if (orig_value == const0_rtx && CONST_INT_P (count))
17437     {
17438       count = GEN_INT (INTVAL (count)
17439                        & ~((HOST_WIDE_INT) GET_MODE_SIZE (mode) - 1));
17440       destmem = shallow_copy_rtx (destmem);
17441       set_mem_size (destmem, count);
17442     }
17443   else if (MEM_SIZE (destmem))
17444     set_mem_size (destmem, NULL_RTX);
17445   emit_insn (gen_rep_stos (destptr, countreg, destmem, value, destexp));
17446 }
17447
17448 static void
17449 emit_strmov (rtx destmem, rtx srcmem,
17450              rtx destptr, rtx srcptr, enum machine_mode mode, int offset)
17451 {
17452   rtx src = adjust_automodify_address_nv (srcmem, mode, srcptr, offset);
17453   rtx dest = adjust_automodify_address_nv (destmem, mode, destptr, offset);
17454   emit_insn (gen_strmov (destptr, dest, srcptr, src));
17455 }
17456
17457 /* Output code to copy at most count & (max_size - 1) bytes from SRC to DEST.  */
17458 static void
17459 expand_movmem_epilogue (rtx destmem, rtx srcmem,
17460                         rtx destptr, rtx srcptr, rtx count, int max_size)
17461 {
17462   rtx src, dest;
17463   if (CONST_INT_P (count))
17464     {
17465       HOST_WIDE_INT countval = INTVAL (count);
17466       int offset = 0;
17467
17468       if ((countval & 0x10) && max_size > 16)
17469         {
17470           if (TARGET_64BIT)
17471             {
17472               emit_strmov (destmem, srcmem, destptr, srcptr, DImode, offset);
17473               emit_strmov (destmem, srcmem, destptr, srcptr, DImode, offset + 8);
17474             }
17475           else
17476             gcc_unreachable ();
17477           offset += 16;
17478         }
17479       if ((countval & 0x08) && max_size > 8)
17480         {
17481           if (TARGET_64BIT)
17482             emit_strmov (destmem, srcmem, destptr, srcptr, DImode, offset);
17483           else
17484             {
17485               emit_strmov (destmem, srcmem, destptr, srcptr, SImode, offset);
17486               emit_strmov (destmem, srcmem, destptr, srcptr, SImode, offset + 4);
17487             }
17488           offset += 8;
17489         }
17490       if ((countval & 0x04) && max_size > 4)
17491         {
17492           emit_strmov (destmem, srcmem, destptr, srcptr, SImode, offset);
17493           offset += 4;
17494         }
17495       if ((countval & 0x02) && max_size > 2)
17496         {
17497           emit_strmov (destmem, srcmem, destptr, srcptr, HImode, offset);
17498           offset += 2;
17499         }
17500       if ((countval & 0x01) && max_size > 1)
17501         {
17502           emit_strmov (destmem, srcmem, destptr, srcptr, QImode, offset);
17503           offset += 1;
17504         }
17505       return;
17506     }
17507   if (max_size > 8)
17508     {
17509       count = expand_simple_binop (GET_MODE (count), AND, count, GEN_INT (max_size - 1),
17510                                     count, 1, OPTAB_DIRECT);
17511       expand_set_or_movmem_via_loop (destmem, srcmem, destptr, srcptr, NULL,
17512                                      count, QImode, 1, 4);
17513       return;
17514     }
17515
17516   /* When there are stringops, we can cheaply increase dest and src pointers.
17517      Otherwise we save code size by maintaining offset (zero is readily
17518      available from preceding rep operation) and using x86 addressing modes.
17519    */
17520   if (TARGET_SINGLE_STRINGOP)
17521     {
17522       if (max_size > 4)
17523         {
17524           rtx label = ix86_expand_aligntest (count, 4, true);
17525           src = change_address (srcmem, SImode, srcptr);
17526           dest = change_address (destmem, SImode, destptr);
17527           emit_insn (gen_strmov (destptr, dest, srcptr, src));
17528           emit_label (label);
17529           LABEL_NUSES (label) = 1;
17530         }
17531       if (max_size > 2)
17532         {
17533           rtx label = ix86_expand_aligntest (count, 2, true);
17534           src = change_address (srcmem, HImode, srcptr);
17535           dest = change_address (destmem, HImode, destptr);
17536           emit_insn (gen_strmov (destptr, dest, srcptr, src));
17537           emit_label (label);
17538           LABEL_NUSES (label) = 1;
17539         }
17540       if (max_size > 1)
17541         {
17542           rtx label = ix86_expand_aligntest (count, 1, true);
17543           src = change_address (srcmem, QImode, srcptr);
17544           dest = change_address (destmem, QImode, destptr);
17545           emit_insn (gen_strmov (destptr, dest, srcptr, src));
17546           emit_label (label);
17547           LABEL_NUSES (label) = 1;
17548         }
17549     }
17550   else
17551     {
17552       rtx offset = force_reg (Pmode, const0_rtx);
17553       rtx tmp;
17554
17555       if (max_size > 4)
17556         {
17557           rtx label = ix86_expand_aligntest (count, 4, true);
17558           src = change_address (srcmem, SImode, srcptr);
17559           dest = change_address (destmem, SImode, destptr);
17560           emit_move_insn (dest, src);
17561           tmp = expand_simple_binop (Pmode, PLUS, offset, GEN_INT (4), NULL,
17562                                      true, OPTAB_LIB_WIDEN);
17563           if (tmp != offset)
17564             emit_move_insn (offset, tmp);
17565           emit_label (label);
17566           LABEL_NUSES (label) = 1;
17567         }
17568       if (max_size > 2)
17569         {
17570           rtx label = ix86_expand_aligntest (count, 2, true);
17571           tmp = gen_rtx_PLUS (Pmode, srcptr, offset);
17572           src = change_address (srcmem, HImode, tmp);
17573           tmp = gen_rtx_PLUS (Pmode, destptr, offset);
17574           dest = change_address (destmem, HImode, tmp);
17575           emit_move_insn (dest, src);
17576           tmp = expand_simple_binop (Pmode, PLUS, offset, GEN_INT (2), tmp,
17577                                      true, OPTAB_LIB_WIDEN);
17578           if (tmp != offset)
17579             emit_move_insn (offset, tmp);
17580           emit_label (label);
17581           LABEL_NUSES (label) = 1;
17582         }
17583       if (max_size > 1)
17584         {
17585           rtx label = ix86_expand_aligntest (count, 1, true);
17586           tmp = gen_rtx_PLUS (Pmode, srcptr, offset);
17587           src = change_address (srcmem, QImode, tmp);
17588           tmp = gen_rtx_PLUS (Pmode, destptr, offset);
17589           dest = change_address (destmem, QImode, tmp);
17590           emit_move_insn (dest, src);
17591           emit_label (label);
17592           LABEL_NUSES (label) = 1;
17593         }
17594     }
17595 }
17596
17597 /* Output code to set at most count & (max_size - 1) bytes starting by DEST.  */
17598 static void
17599 expand_setmem_epilogue_via_loop (rtx destmem, rtx destptr, rtx value,
17600                                  rtx count, int max_size)
17601 {
17602   count =
17603     expand_simple_binop (counter_mode (count), AND, count,
17604                          GEN_INT (max_size - 1), count, 1, OPTAB_DIRECT);
17605   expand_set_or_movmem_via_loop (destmem, NULL, destptr, NULL,
17606                                  gen_lowpart (QImode, value), count, QImode,
17607                                  1, max_size / 2);
17608 }
17609
17610 /* Output code to set at most count & (max_size - 1) bytes starting by DEST.  */
17611 static void
17612 expand_setmem_epilogue (rtx destmem, rtx destptr, rtx value, rtx count, int max_size)
17613 {
17614   rtx dest;
17615
17616   if (CONST_INT_P (count))
17617     {
17618       HOST_WIDE_INT countval = INTVAL (count);
17619       int offset = 0;
17620
17621       if ((countval & 0x10) && max_size > 16)
17622         {
17623           if (TARGET_64BIT)
17624             {
17625               dest = adjust_automodify_address_nv (destmem, DImode, destptr, offset);
17626               emit_insn (gen_strset (destptr, dest, value));
17627               dest = adjust_automodify_address_nv (destmem, DImode, destptr, offset + 8);
17628               emit_insn (gen_strset (destptr, dest, value));
17629             }
17630           else
17631             gcc_unreachable ();
17632           offset += 16;
17633         }
17634       if ((countval & 0x08) && max_size > 8)
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             }
17641           else
17642             {
17643               dest = adjust_automodify_address_nv (destmem, SImode, destptr, offset);
17644               emit_insn (gen_strset (destptr, dest, value));
17645               dest = adjust_automodify_address_nv (destmem, SImode, destptr, offset + 4);
17646               emit_insn (gen_strset (destptr, dest, value));
17647             }
17648           offset += 8;
17649         }
17650       if ((countval & 0x04) && max_size > 4)
17651         {
17652           dest = adjust_automodify_address_nv (destmem, SImode, destptr, offset);
17653           emit_insn (gen_strset (destptr, dest, gen_lowpart (SImode, value)));
17654           offset += 4;
17655         }
17656       if ((countval & 0x02) && max_size > 2)
17657         {
17658           dest = adjust_automodify_address_nv (destmem, HImode, destptr, offset);
17659           emit_insn (gen_strset (destptr, dest, gen_lowpart (HImode, value)));
17660           offset += 2;
17661         }
17662       if ((countval & 0x01) && max_size > 1)
17663         {
17664           dest = adjust_automodify_address_nv (destmem, QImode, destptr, offset);
17665           emit_insn (gen_strset (destptr, dest, gen_lowpart (QImode, value)));
17666           offset += 1;
17667         }
17668       return;
17669     }
17670   if (max_size > 32)
17671     {
17672       expand_setmem_epilogue_via_loop (destmem, destptr, value, count, max_size);
17673       return;
17674     }
17675   if (max_size > 16)
17676     {
17677       rtx label = ix86_expand_aligntest (count, 16, true);
17678       if (TARGET_64BIT)
17679         {
17680           dest = change_address (destmem, DImode, destptr);
17681           emit_insn (gen_strset (destptr, dest, value));
17682           emit_insn (gen_strset (destptr, dest, value));
17683         }
17684       else
17685         {
17686           dest = change_address (destmem, SImode, destptr);
17687           emit_insn (gen_strset (destptr, dest, value));
17688           emit_insn (gen_strset (destptr, dest, value));
17689           emit_insn (gen_strset (destptr, dest, value));
17690           emit_insn (gen_strset (destptr, dest, value));
17691         }
17692       emit_label (label);
17693       LABEL_NUSES (label) = 1;
17694     }
17695   if (max_size > 8)
17696     {
17697       rtx label = ix86_expand_aligntest (count, 8, true);
17698       if (TARGET_64BIT)
17699         {
17700           dest = change_address (destmem, DImode, destptr);
17701           emit_insn (gen_strset (destptr, dest, value));
17702         }
17703       else
17704         {
17705           dest = change_address (destmem, SImode, destptr);
17706           emit_insn (gen_strset (destptr, dest, value));
17707           emit_insn (gen_strset (destptr, dest, value));
17708         }
17709       emit_label (label);
17710       LABEL_NUSES (label) = 1;
17711     }
17712   if (max_size > 4)
17713     {
17714       rtx label = ix86_expand_aligntest (count, 4, true);
17715       dest = change_address (destmem, SImode, destptr);
17716       emit_insn (gen_strset (destptr, dest, gen_lowpart (SImode, value)));
17717       emit_label (label);
17718       LABEL_NUSES (label) = 1;
17719     }
17720   if (max_size > 2)
17721     {
17722       rtx label = ix86_expand_aligntest (count, 2, true);
17723       dest = change_address (destmem, HImode, destptr);
17724       emit_insn (gen_strset (destptr, dest, gen_lowpart (HImode, value)));
17725       emit_label (label);
17726       LABEL_NUSES (label) = 1;
17727     }
17728   if (max_size > 1)
17729     {
17730       rtx label = ix86_expand_aligntest (count, 1, true);
17731       dest = change_address (destmem, QImode, destptr);
17732       emit_insn (gen_strset (destptr, dest, gen_lowpart (QImode, value)));
17733       emit_label (label);
17734       LABEL_NUSES (label) = 1;
17735     }
17736 }
17737
17738 /* Copy enough from DEST to SRC to align DEST known to by aligned by ALIGN to
17739    DESIRED_ALIGNMENT.  */
17740 static void
17741 expand_movmem_prologue (rtx destmem, rtx srcmem,
17742                         rtx destptr, rtx srcptr, rtx count,
17743                         int align, int desired_alignment)
17744 {
17745   if (align <= 1 && desired_alignment > 1)
17746     {
17747       rtx label = ix86_expand_aligntest (destptr, 1, false);
17748       srcmem = change_address (srcmem, QImode, srcptr);
17749       destmem = change_address (destmem, QImode, destptr);
17750       emit_insn (gen_strmov (destptr, destmem, srcptr, srcmem));
17751       ix86_adjust_counter (count, 1);
17752       emit_label (label);
17753       LABEL_NUSES (label) = 1;
17754     }
17755   if (align <= 2 && desired_alignment > 2)
17756     {
17757       rtx label = ix86_expand_aligntest (destptr, 2, false);
17758       srcmem = change_address (srcmem, HImode, srcptr);
17759       destmem = change_address (destmem, HImode, destptr);
17760       emit_insn (gen_strmov (destptr, destmem, srcptr, srcmem));
17761       ix86_adjust_counter (count, 2);
17762       emit_label (label);
17763       LABEL_NUSES (label) = 1;
17764     }
17765   if (align <= 4 && desired_alignment > 4)
17766     {
17767       rtx label = ix86_expand_aligntest (destptr, 4, false);
17768       srcmem = change_address (srcmem, SImode, srcptr);
17769       destmem = change_address (destmem, SImode, destptr);
17770       emit_insn (gen_strmov (destptr, destmem, srcptr, srcmem));
17771       ix86_adjust_counter (count, 4);
17772       emit_label (label);
17773       LABEL_NUSES (label) = 1;
17774     }
17775   gcc_assert (desired_alignment <= 8);
17776 }
17777
17778 /* Copy enough from DST to SRC to align DST known to DESIRED_ALIGN.
17779    ALIGN_BYTES is how many bytes need to be copied.  */
17780 static rtx
17781 expand_constant_movmem_prologue (rtx dst, rtx *srcp, rtx destreg, rtx srcreg,
17782                                  int desired_align, int align_bytes)
17783 {
17784   rtx src = *srcp;
17785   rtx src_size, dst_size;
17786   int off = 0;
17787   int src_align_bytes = get_mem_align_offset (src, desired_align * BITS_PER_UNIT);
17788   if (src_align_bytes >= 0)
17789     src_align_bytes = desired_align - src_align_bytes;
17790   src_size = MEM_SIZE (src);
17791   dst_size = MEM_SIZE (dst);
17792   if (align_bytes & 1)
17793     {
17794       dst = adjust_automodify_address_nv (dst, QImode, destreg, 0);
17795       src = adjust_automodify_address_nv (src, QImode, srcreg, 0);
17796       off = 1;
17797       emit_insn (gen_strmov (destreg, dst, srcreg, src));
17798     }
17799   if (align_bytes & 2)
17800     {
17801       dst = adjust_automodify_address_nv (dst, HImode, destreg, off);
17802       src = adjust_automodify_address_nv (src, HImode, srcreg, off);
17803       if (MEM_ALIGN (dst) < 2 * BITS_PER_UNIT)
17804         set_mem_align (dst, 2 * BITS_PER_UNIT);
17805       if (src_align_bytes >= 0
17806           && (src_align_bytes & 1) == (align_bytes & 1)
17807           && MEM_ALIGN (src) < 2 * BITS_PER_UNIT)
17808         set_mem_align (src, 2 * BITS_PER_UNIT);
17809       off = 2;
17810       emit_insn (gen_strmov (destreg, dst, srcreg, src));
17811     }
17812   if (align_bytes & 4)
17813     {
17814       dst = adjust_automodify_address_nv (dst, SImode, destreg, off);
17815       src = adjust_automodify_address_nv (src, SImode, srcreg, off);
17816       if (MEM_ALIGN (dst) < 4 * BITS_PER_UNIT)
17817         set_mem_align (dst, 4 * BITS_PER_UNIT);
17818       if (src_align_bytes >= 0)
17819         {
17820           unsigned int src_align = 0;
17821           if ((src_align_bytes & 3) == (align_bytes & 3))
17822             src_align = 4;
17823           else if ((src_align_bytes & 1) == (align_bytes & 1))
17824             src_align = 2;
17825           if (MEM_ALIGN (src) < src_align * BITS_PER_UNIT)
17826             set_mem_align (src, src_align * BITS_PER_UNIT);
17827         }
17828       off = 4;
17829       emit_insn (gen_strmov (destreg, dst, srcreg, src));
17830     }
17831   dst = adjust_automodify_address_nv (dst, BLKmode, destreg, off);
17832   src = adjust_automodify_address_nv (src, BLKmode, srcreg, off);
17833   if (MEM_ALIGN (dst) < (unsigned int) desired_align * BITS_PER_UNIT)
17834     set_mem_align (dst, desired_align * BITS_PER_UNIT);
17835   if (src_align_bytes >= 0)
17836     {
17837       unsigned int src_align = 0;
17838       if ((src_align_bytes & 7) == (align_bytes & 7))
17839         src_align = 8;
17840       else if ((src_align_bytes & 3) == (align_bytes & 3))
17841         src_align = 4;
17842       else if ((src_align_bytes & 1) == (align_bytes & 1))
17843         src_align = 2;
17844       if (src_align > (unsigned int) desired_align)
17845         src_align = desired_align;
17846       if (MEM_ALIGN (src) < src_align * BITS_PER_UNIT)
17847         set_mem_align (src, src_align * BITS_PER_UNIT);
17848     }
17849   if (dst_size)
17850     set_mem_size (dst, GEN_INT (INTVAL (dst_size) - align_bytes));
17851   if (src_size)
17852     set_mem_size (dst, GEN_INT (INTVAL (src_size) - align_bytes));
17853   *srcp = src;
17854   return dst;
17855 }
17856
17857 /* Set enough from DEST to align DEST known to by aligned by ALIGN to
17858    DESIRED_ALIGNMENT.  */
17859 static void
17860 expand_setmem_prologue (rtx destmem, rtx destptr, rtx value, rtx count,
17861                         int align, int desired_alignment)
17862 {
17863   if (align <= 1 && desired_alignment > 1)
17864     {
17865       rtx label = ix86_expand_aligntest (destptr, 1, false);
17866       destmem = change_address (destmem, QImode, destptr);
17867       emit_insn (gen_strset (destptr, destmem, gen_lowpart (QImode, value)));
17868       ix86_adjust_counter (count, 1);
17869       emit_label (label);
17870       LABEL_NUSES (label) = 1;
17871     }
17872   if (align <= 2 && desired_alignment > 2)
17873     {
17874       rtx label = ix86_expand_aligntest (destptr, 2, false);
17875       destmem = change_address (destmem, HImode, destptr);
17876       emit_insn (gen_strset (destptr, destmem, gen_lowpart (HImode, value)));
17877       ix86_adjust_counter (count, 2);
17878       emit_label (label);
17879       LABEL_NUSES (label) = 1;
17880     }
17881   if (align <= 4 && desired_alignment > 4)
17882     {
17883       rtx label = ix86_expand_aligntest (destptr, 4, false);
17884       destmem = change_address (destmem, SImode, destptr);
17885       emit_insn (gen_strset (destptr, destmem, gen_lowpart (SImode, value)));
17886       ix86_adjust_counter (count, 4);
17887       emit_label (label);
17888       LABEL_NUSES (label) = 1;
17889     }
17890   gcc_assert (desired_alignment <= 8);
17891 }
17892
17893 /* Set enough from DST to align DST known to by aligned by ALIGN to
17894    DESIRED_ALIGN.  ALIGN_BYTES is how many bytes need to be stored.  */
17895 static rtx
17896 expand_constant_setmem_prologue (rtx dst, rtx destreg, rtx value,
17897                                  int desired_align, int align_bytes)
17898 {
17899   int off = 0;
17900   rtx dst_size = MEM_SIZE (dst);
17901   if (align_bytes & 1)
17902     {
17903       dst = adjust_automodify_address_nv (dst, QImode, destreg, 0);
17904       off = 1;
17905       emit_insn (gen_strset (destreg, dst,
17906                              gen_lowpart (QImode, value)));
17907     }
17908   if (align_bytes & 2)
17909     {
17910       dst = adjust_automodify_address_nv (dst, HImode, destreg, off);
17911       if (MEM_ALIGN (dst) < 2 * BITS_PER_UNIT)
17912         set_mem_align (dst, 2 * BITS_PER_UNIT);
17913       off = 2;
17914       emit_insn (gen_strset (destreg, dst,
17915                              gen_lowpart (HImode, value)));
17916     }
17917   if (align_bytes & 4)
17918     {
17919       dst = adjust_automodify_address_nv (dst, SImode, destreg, off);
17920       if (MEM_ALIGN (dst) < 4 * BITS_PER_UNIT)
17921         set_mem_align (dst, 4 * BITS_PER_UNIT);
17922       off = 4;
17923       emit_insn (gen_strset (destreg, dst,
17924                              gen_lowpart (SImode, value)));
17925     }
17926   dst = adjust_automodify_address_nv (dst, BLKmode, destreg, off);
17927   if (MEM_ALIGN (dst) < (unsigned int) desired_align * BITS_PER_UNIT)
17928     set_mem_align (dst, desired_align * BITS_PER_UNIT);
17929   if (dst_size)
17930     set_mem_size (dst, GEN_INT (INTVAL (dst_size) - align_bytes));
17931   return dst;
17932 }
17933
17934 /* Given COUNT and EXPECTED_SIZE, decide on codegen of string operation.  */
17935 static enum stringop_alg
17936 decide_alg (HOST_WIDE_INT count, HOST_WIDE_INT expected_size, bool memset,
17937             int *dynamic_check)
17938 {
17939   const struct stringop_algs * algs;
17940   bool optimize_for_speed;
17941   /* Algorithms using the rep prefix want at least edi and ecx;
17942      additionally, memset wants eax and memcpy wants esi.  Don't
17943      consider such algorithms if the user has appropriated those
17944      registers for their own purposes.  */
17945   bool rep_prefix_usable = !(fixed_regs[CX_REG] || fixed_regs[DI_REG]
17946                              || (memset
17947                                  ? fixed_regs[AX_REG] : fixed_regs[SI_REG]));
17948
17949 #define ALG_USABLE_P(alg) (rep_prefix_usable                    \
17950                            || (alg != rep_prefix_1_byte         \
17951                                && alg != rep_prefix_4_byte      \
17952                                && alg != rep_prefix_8_byte))
17953   const struct processor_costs *cost;
17954   
17955   /* Even if the string operation call is cold, we still might spend a lot
17956      of time processing large blocks.  */
17957   if (optimize_function_for_size_p (cfun)
17958       || (optimize_insn_for_size_p ()
17959           && expected_size != -1 && expected_size < 256))
17960     optimize_for_speed = false;
17961   else
17962     optimize_for_speed = true;
17963
17964   cost = optimize_for_speed ? ix86_cost : &ix86_size_cost;
17965
17966   *dynamic_check = -1;
17967   if (memset)
17968     algs = &cost->memset[TARGET_64BIT != 0];
17969   else
17970     algs = &cost->memcpy[TARGET_64BIT != 0];
17971   if (stringop_alg != no_stringop && ALG_USABLE_P (stringop_alg))
17972     return stringop_alg;
17973   /* rep; movq or rep; movl is the smallest variant.  */
17974   else if (!optimize_for_speed)
17975     {
17976       if (!count || (count & 3))
17977         return rep_prefix_usable ? rep_prefix_1_byte : loop_1_byte;
17978       else
17979         return rep_prefix_usable ? rep_prefix_4_byte : loop;
17980     }
17981   /* Very tiny blocks are best handled via the loop, REP is expensive to setup.
17982    */
17983   else if (expected_size != -1 && expected_size < 4)
17984     return loop_1_byte;
17985   else if (expected_size != -1)
17986     {
17987       unsigned int i;
17988       enum stringop_alg alg = libcall;
17989       for (i = 0; i < NAX_STRINGOP_ALGS; i++)
17990         {
17991           /* We get here if the algorithms that were not libcall-based
17992              were rep-prefix based and we are unable to use rep prefixes
17993              based on global register usage.  Break out of the loop and
17994              use the heuristic below.  */
17995           if (algs->size[i].max == 0)
17996             break;
17997           if (algs->size[i].max >= expected_size || algs->size[i].max == -1)
17998             {
17999               enum stringop_alg candidate = algs->size[i].alg;
18000
18001               if (candidate != libcall && ALG_USABLE_P (candidate))
18002                 alg = candidate;
18003               /* Honor TARGET_INLINE_ALL_STRINGOPS by picking
18004                  last non-libcall inline algorithm.  */
18005               if (TARGET_INLINE_ALL_STRINGOPS)
18006                 {
18007                   /* When the current size is best to be copied by a libcall,
18008                      but we are still forced to inline, run the heuristic below
18009                      that will pick code for medium sized blocks.  */
18010                   if (alg != libcall)
18011                     return alg;
18012                   break;
18013                 }
18014               else if (ALG_USABLE_P (candidate))
18015                 return candidate;
18016             }
18017         }
18018       gcc_assert (TARGET_INLINE_ALL_STRINGOPS || !rep_prefix_usable);
18019     }
18020   /* When asked to inline the call anyway, try to pick meaningful choice.
18021      We look for maximal size of block that is faster to copy by hand and
18022      take blocks of at most of that size guessing that average size will
18023      be roughly half of the block.
18024
18025      If this turns out to be bad, we might simply specify the preferred
18026      choice in ix86_costs.  */
18027   if ((TARGET_INLINE_ALL_STRINGOPS || TARGET_INLINE_STRINGOPS_DYNAMICALLY)
18028       && (algs->unknown_size == libcall || !ALG_USABLE_P (algs->unknown_size)))
18029     {
18030       int max = -1;
18031       enum stringop_alg alg;
18032       int i;
18033       bool any_alg_usable_p = true;
18034
18035       for (i = 0; i < NAX_STRINGOP_ALGS; i++)
18036         {
18037           enum stringop_alg candidate = algs->size[i].alg;
18038           any_alg_usable_p = any_alg_usable_p && ALG_USABLE_P (candidate);
18039
18040           if (candidate != libcall && candidate
18041               && ALG_USABLE_P (candidate))
18042               max = algs->size[i].max;
18043         }
18044       /* If there aren't any usable algorithms, then recursing on
18045          smaller sizes isn't going to find anything.  Just return the
18046          simple byte-at-a-time copy loop.  */
18047       if (!any_alg_usable_p)
18048         {
18049           /* Pick something reasonable.  */
18050           if (TARGET_INLINE_STRINGOPS_DYNAMICALLY)
18051             *dynamic_check = 128;
18052           return loop_1_byte;
18053         }
18054       if (max == -1)
18055         max = 4096;
18056       alg = decide_alg (count, max / 2, memset, dynamic_check);
18057       gcc_assert (*dynamic_check == -1);
18058       gcc_assert (alg != libcall);
18059       if (TARGET_INLINE_STRINGOPS_DYNAMICALLY)
18060         *dynamic_check = max;
18061       return alg;
18062     }
18063   return ALG_USABLE_P (algs->unknown_size) ? algs->unknown_size : libcall;
18064 #undef ALG_USABLE_P
18065 }
18066
18067 /* Decide on alignment.  We know that the operand is already aligned to ALIGN
18068    (ALIGN can be based on profile feedback and thus it is not 100% guaranteed).  */
18069 static int
18070 decide_alignment (int align,
18071                   enum stringop_alg alg,
18072                   int expected_size)
18073 {
18074   int desired_align = 0;
18075   switch (alg)
18076     {
18077       case no_stringop:
18078         gcc_unreachable ();
18079       case loop:
18080       case unrolled_loop:
18081         desired_align = GET_MODE_SIZE (Pmode);
18082         break;
18083       case rep_prefix_8_byte:
18084         desired_align = 8;
18085         break;
18086       case rep_prefix_4_byte:
18087         /* PentiumPro has special logic triggering for 8 byte aligned blocks.
18088            copying whole cacheline at once.  */
18089         if (TARGET_PENTIUMPRO)
18090           desired_align = 8;
18091         else
18092           desired_align = 4;
18093         break;
18094       case rep_prefix_1_byte:
18095         /* PentiumPro has special logic triggering for 8 byte aligned blocks.
18096            copying whole cacheline at once.  */
18097         if (TARGET_PENTIUMPRO)
18098           desired_align = 8;
18099         else
18100           desired_align = 1;
18101         break;
18102       case loop_1_byte:
18103         desired_align = 1;
18104         break;
18105       case libcall:
18106         return 0;
18107     }
18108
18109   if (optimize_size)
18110     desired_align = 1;
18111   if (desired_align < align)
18112     desired_align = align;
18113   if (expected_size != -1 && expected_size < 4)
18114     desired_align = align;
18115   return desired_align;
18116 }
18117
18118 /* Return the smallest power of 2 greater than VAL.  */
18119 static int
18120 smallest_pow2_greater_than (int val)
18121 {
18122   int ret = 1;
18123   while (ret <= val)
18124     ret <<= 1;
18125   return ret;
18126 }
18127
18128 /* Expand string move (memcpy) operation.  Use i386 string operations when
18129    profitable.  expand_setmem contains similar code.  The code depends upon
18130    architecture, block size and alignment, but always has the same
18131    overall structure:
18132
18133    1) Prologue guard: Conditional that jumps up to epilogues for small
18134       blocks that can be handled by epilogue alone.  This is faster but
18135       also needed for correctness, since prologue assume the block is larger
18136       than the desired alignment.
18137
18138       Optional dynamic check for size and libcall for large
18139       blocks is emitted here too, with -minline-stringops-dynamically.
18140
18141    2) Prologue: copy first few bytes in order to get destination aligned
18142       to DESIRED_ALIGN.  It is emitted only when ALIGN is less than
18143       DESIRED_ALIGN and and up to DESIRED_ALIGN - ALIGN bytes can be copied.
18144       We emit either a jump tree on power of two sized blocks, or a byte loop.
18145
18146    3) Main body: the copying loop itself, copying in SIZE_NEEDED chunks
18147       with specified algorithm.
18148
18149    4) Epilogue: code copying tail of the block that is too small to be
18150       handled by main body (or up to size guarded by prologue guard).  */
18151
18152 int
18153 ix86_expand_movmem (rtx dst, rtx src, rtx count_exp, rtx align_exp,
18154                     rtx expected_align_exp, rtx expected_size_exp)
18155 {
18156   rtx destreg;
18157   rtx srcreg;
18158   rtx label = NULL;
18159   rtx tmp;
18160   rtx jump_around_label = NULL;
18161   HOST_WIDE_INT align = 1;
18162   unsigned HOST_WIDE_INT count = 0;
18163   HOST_WIDE_INT expected_size = -1;
18164   int size_needed = 0, epilogue_size_needed;
18165   int desired_align = 0, align_bytes = 0;
18166   enum stringop_alg alg;
18167   int dynamic_check;
18168   bool need_zero_guard = false;
18169
18170   if (CONST_INT_P (align_exp))
18171     align = INTVAL (align_exp);
18172   /* i386 can do misaligned access on reasonably increased cost.  */
18173   if (CONST_INT_P (expected_align_exp)
18174       && INTVAL (expected_align_exp) > align)
18175     align = INTVAL (expected_align_exp);
18176   /* ALIGN is the minimum of destination and source alignment, but we care here
18177      just about destination alignment.  */
18178   else if (MEM_ALIGN (dst) > (unsigned HOST_WIDE_INT) align * BITS_PER_UNIT)
18179     align = MEM_ALIGN (dst) / BITS_PER_UNIT;
18180
18181   if (CONST_INT_P (count_exp))
18182     count = expected_size = INTVAL (count_exp);
18183   if (CONST_INT_P (expected_size_exp) && count == 0)
18184     expected_size = INTVAL (expected_size_exp);
18185
18186   /* Make sure we don't need to care about overflow later on.  */
18187   if (count > ((unsigned HOST_WIDE_INT) 1 << 30))
18188     return 0;
18189
18190   /* Step 0: Decide on preferred algorithm, desired alignment and
18191      size of chunks to be copied by main loop.  */
18192
18193   alg = decide_alg (count, expected_size, false, &dynamic_check);
18194   desired_align = decide_alignment (align, alg, expected_size);
18195
18196   if (!TARGET_ALIGN_STRINGOPS)
18197     align = desired_align;
18198
18199   if (alg == libcall)
18200     return 0;
18201   gcc_assert (alg != no_stringop);
18202   if (!count)
18203     count_exp = copy_to_mode_reg (GET_MODE (count_exp), count_exp);
18204   destreg = copy_to_mode_reg (Pmode, XEXP (dst, 0));
18205   srcreg = copy_to_mode_reg (Pmode, XEXP (src, 0));
18206   switch (alg)
18207     {
18208     case libcall:
18209     case no_stringop:
18210       gcc_unreachable ();
18211     case loop:
18212       need_zero_guard = true;
18213       size_needed = GET_MODE_SIZE (Pmode);
18214       break;
18215     case unrolled_loop:
18216       need_zero_guard = true;
18217       size_needed = GET_MODE_SIZE (Pmode) * (TARGET_64BIT ? 4 : 2);
18218       break;
18219     case rep_prefix_8_byte:
18220       size_needed = 8;
18221       break;
18222     case rep_prefix_4_byte:
18223       size_needed = 4;
18224       break;
18225     case rep_prefix_1_byte:
18226       size_needed = 1;
18227       break;
18228     case loop_1_byte:
18229       need_zero_guard = true;
18230       size_needed = 1;
18231       break;
18232     }
18233
18234   epilogue_size_needed = size_needed;
18235
18236   /* Step 1: Prologue guard.  */
18237
18238   /* Alignment code needs count to be in register.  */
18239   if (CONST_INT_P (count_exp) && desired_align > align)
18240     {
18241       if (INTVAL (count_exp) > desired_align
18242           && INTVAL (count_exp) > size_needed)
18243         {
18244           align_bytes
18245             = get_mem_align_offset (dst, desired_align * BITS_PER_UNIT);
18246           if (align_bytes <= 0)
18247             align_bytes = 0;
18248           else
18249             align_bytes = desired_align - align_bytes;
18250         }
18251       if (align_bytes == 0)
18252         count_exp = force_reg (counter_mode (count_exp), count_exp);
18253     }
18254   gcc_assert (desired_align >= 1 && align >= 1);
18255
18256   /* Ensure that alignment prologue won't copy past end of block.  */
18257   if (size_needed > 1 || (desired_align > 1 && desired_align > align))
18258     {
18259       epilogue_size_needed = MAX (size_needed - 1, desired_align - align);
18260       /* Epilogue always copies COUNT_EXP & EPILOGUE_SIZE_NEEDED bytes.
18261          Make sure it is power of 2.  */
18262       epilogue_size_needed = smallest_pow2_greater_than (epilogue_size_needed);
18263
18264       if (count)
18265         {
18266           if (count < (unsigned HOST_WIDE_INT)epilogue_size_needed)
18267             {
18268               /* If main algorithm works on QImode, no epilogue is needed.
18269                  For small sizes just don't align anything.  */
18270               if (size_needed == 1)
18271                 desired_align = align;
18272               else
18273                 goto epilogue;
18274             }
18275         }
18276       else
18277         {
18278           label = gen_label_rtx ();
18279           emit_cmp_and_jump_insns (count_exp,
18280                                    GEN_INT (epilogue_size_needed),
18281                                    LTU, 0, counter_mode (count_exp), 1, label);
18282           if (expected_size == -1 || expected_size < epilogue_size_needed)
18283             predict_jump (REG_BR_PROB_BASE * 60 / 100);
18284           else
18285             predict_jump (REG_BR_PROB_BASE * 20 / 100);
18286         }
18287     }
18288
18289   /* Emit code to decide on runtime whether library call or inline should be
18290      used.  */
18291   if (dynamic_check != -1)
18292     {
18293       if (CONST_INT_P (count_exp))
18294         {
18295           if (UINTVAL (count_exp) >= (unsigned HOST_WIDE_INT)dynamic_check)
18296             {
18297               emit_block_move_via_libcall (dst, src, count_exp, false);
18298               count_exp = const0_rtx;
18299               goto epilogue;
18300             }
18301         }
18302       else
18303         {
18304           rtx hot_label = gen_label_rtx ();
18305           jump_around_label = gen_label_rtx ();
18306           emit_cmp_and_jump_insns (count_exp, GEN_INT (dynamic_check - 1),
18307                                    LEU, 0, GET_MODE (count_exp), 1, hot_label);
18308           predict_jump (REG_BR_PROB_BASE * 90 / 100);
18309           emit_block_move_via_libcall (dst, src, count_exp, false);
18310           emit_jump (jump_around_label);
18311           emit_label (hot_label);
18312         }
18313     }
18314
18315   /* Step 2: Alignment prologue.  */
18316
18317   if (desired_align > align)
18318     {
18319       if (align_bytes == 0)
18320         {
18321           /* Except for the first move in epilogue, we no longer know
18322              constant offset in aliasing info.  It don't seems to worth
18323              the pain to maintain it for the first move, so throw away
18324              the info early.  */
18325           src = change_address (src, BLKmode, srcreg);
18326           dst = change_address (dst, BLKmode, destreg);
18327           expand_movmem_prologue (dst, src, destreg, srcreg, count_exp, align,
18328                                   desired_align);
18329         }
18330       else
18331         {
18332           /* If we know how many bytes need to be stored before dst is
18333              sufficiently aligned, maintain aliasing info accurately.  */
18334           dst = expand_constant_movmem_prologue (dst, &src, destreg, srcreg,
18335                                                  desired_align, align_bytes);
18336           count_exp = plus_constant (count_exp, -align_bytes);
18337           count -= align_bytes;
18338         }
18339       if (need_zero_guard
18340           && (count < (unsigned HOST_WIDE_INT) size_needed
18341               || (align_bytes == 0
18342                   && count < ((unsigned HOST_WIDE_INT) size_needed
18343                               + desired_align - align))))
18344         {
18345           /* It is possible that we copied enough so the main loop will not
18346              execute.  */
18347           gcc_assert (size_needed > 1);
18348           if (label == NULL_RTX)
18349             label = gen_label_rtx ();
18350           emit_cmp_and_jump_insns (count_exp,
18351                                    GEN_INT (size_needed),
18352                                    LTU, 0, counter_mode (count_exp), 1, label);
18353           if (expected_size == -1
18354               || expected_size < (desired_align - align) / 2 + size_needed)
18355             predict_jump (REG_BR_PROB_BASE * 20 / 100);
18356           else
18357             predict_jump (REG_BR_PROB_BASE * 60 / 100);
18358         }
18359     }
18360   if (label && size_needed == 1)
18361     {
18362       emit_label (label);
18363       LABEL_NUSES (label) = 1;
18364       label = NULL;
18365       epilogue_size_needed = 1;
18366     }
18367   else if (label == NULL_RTX)
18368     epilogue_size_needed = size_needed;
18369
18370   /* Step 3: Main loop.  */
18371
18372   switch (alg)
18373     {
18374     case libcall:
18375     case no_stringop:
18376       gcc_unreachable ();
18377     case loop_1_byte:
18378       expand_set_or_movmem_via_loop (dst, src, destreg, srcreg, NULL,
18379                                      count_exp, QImode, 1, expected_size);
18380       break;
18381     case loop:
18382       expand_set_or_movmem_via_loop (dst, src, destreg, srcreg, NULL,
18383                                      count_exp, Pmode, 1, expected_size);
18384       break;
18385     case unrolled_loop:
18386       /* Unroll only by factor of 2 in 32bit mode, since we don't have enough
18387          registers for 4 temporaries anyway.  */
18388       expand_set_or_movmem_via_loop (dst, src, destreg, srcreg, NULL,
18389                                      count_exp, Pmode, TARGET_64BIT ? 4 : 2,
18390                                      expected_size);
18391       break;
18392     case rep_prefix_8_byte:
18393       expand_movmem_via_rep_mov (dst, src, destreg, srcreg, count_exp,
18394                                  DImode);
18395       break;
18396     case rep_prefix_4_byte:
18397       expand_movmem_via_rep_mov (dst, src, destreg, srcreg, count_exp,
18398                                  SImode);
18399       break;
18400     case rep_prefix_1_byte:
18401       expand_movmem_via_rep_mov (dst, src, destreg, srcreg, count_exp,
18402                                  QImode);
18403       break;
18404     }
18405   /* Adjust properly the offset of src and dest memory for aliasing.  */
18406   if (CONST_INT_P (count_exp))
18407     {
18408       src = adjust_automodify_address_nv (src, BLKmode, srcreg,
18409                                           (count / size_needed) * size_needed);
18410       dst = adjust_automodify_address_nv (dst, BLKmode, destreg,
18411                                           (count / size_needed) * size_needed);
18412     }
18413   else
18414     {
18415       src = change_address (src, BLKmode, srcreg);
18416       dst = change_address (dst, BLKmode, destreg);
18417     }
18418
18419   /* Step 4: Epilogue to copy the remaining bytes.  */
18420  epilogue:
18421   if (label)
18422     {
18423       /* When the main loop is done, COUNT_EXP might hold original count,
18424          while we want to copy only COUNT_EXP & SIZE_NEEDED bytes.
18425          Epilogue code will actually copy COUNT_EXP & EPILOGUE_SIZE_NEEDED
18426          bytes. Compensate if needed.  */
18427
18428       if (size_needed < epilogue_size_needed)
18429         {
18430           tmp =
18431             expand_simple_binop (counter_mode (count_exp), AND, count_exp,
18432                                  GEN_INT (size_needed - 1), count_exp, 1,
18433                                  OPTAB_DIRECT);
18434           if (tmp != count_exp)
18435             emit_move_insn (count_exp, tmp);
18436         }
18437       emit_label (label);
18438       LABEL_NUSES (label) = 1;
18439     }
18440
18441   if (count_exp != const0_rtx && epilogue_size_needed > 1)
18442     expand_movmem_epilogue (dst, src, destreg, srcreg, count_exp,
18443                             epilogue_size_needed);
18444   if (jump_around_label)
18445     emit_label (jump_around_label);
18446   return 1;
18447 }
18448
18449 /* Helper function for memcpy.  For QImode value 0xXY produce
18450    0xXYXYXYXY of wide specified by MODE.  This is essentially
18451    a * 0x10101010, but we can do slightly better than
18452    synth_mult by unwinding the sequence by hand on CPUs with
18453    slow multiply.  */
18454 static rtx
18455 promote_duplicated_reg (enum machine_mode mode, rtx val)
18456 {
18457   enum machine_mode valmode = GET_MODE (val);
18458   rtx tmp;
18459   int nops = mode == DImode ? 3 : 2;
18460
18461   gcc_assert (mode == SImode || mode == DImode);
18462   if (val == const0_rtx)
18463     return copy_to_mode_reg (mode, const0_rtx);
18464   if (CONST_INT_P (val))
18465     {
18466       HOST_WIDE_INT v = INTVAL (val) & 255;
18467
18468       v |= v << 8;
18469       v |= v << 16;
18470       if (mode == DImode)
18471         v |= (v << 16) << 16;
18472       return copy_to_mode_reg (mode, gen_int_mode (v, mode));
18473     }
18474
18475   if (valmode == VOIDmode)
18476     valmode = QImode;
18477   if (valmode != QImode)
18478     val = gen_lowpart (QImode, val);
18479   if (mode == QImode)
18480     return val;
18481   if (!TARGET_PARTIAL_REG_STALL)
18482     nops--;
18483   if (ix86_cost->mult_init[mode == DImode ? 3 : 2]
18484       + ix86_cost->mult_bit * (mode == DImode ? 8 : 4)
18485       <= (ix86_cost->shift_const + ix86_cost->add) * nops
18486           + (COSTS_N_INSNS (TARGET_PARTIAL_REG_STALL == 0)))
18487     {
18488       rtx reg = convert_modes (mode, QImode, val, true);
18489       tmp = promote_duplicated_reg (mode, const1_rtx);
18490       return expand_simple_binop (mode, MULT, reg, tmp, NULL, 1,
18491                                   OPTAB_DIRECT);
18492     }
18493   else
18494     {
18495       rtx reg = convert_modes (mode, QImode, val, true);
18496
18497       if (!TARGET_PARTIAL_REG_STALL)
18498         if (mode == SImode)
18499           emit_insn (gen_movsi_insv_1 (reg, reg));
18500         else
18501           emit_insn (gen_movdi_insv_1_rex64 (reg, reg));
18502       else
18503         {
18504           tmp = expand_simple_binop (mode, ASHIFT, reg, GEN_INT (8),
18505                                      NULL, 1, OPTAB_DIRECT);
18506           reg =
18507             expand_simple_binop (mode, IOR, reg, tmp, reg, 1, OPTAB_DIRECT);
18508         }
18509       tmp = expand_simple_binop (mode, ASHIFT, reg, GEN_INT (16),
18510                                  NULL, 1, OPTAB_DIRECT);
18511       reg = expand_simple_binop (mode, IOR, reg, tmp, reg, 1, OPTAB_DIRECT);
18512       if (mode == SImode)
18513         return reg;
18514       tmp = expand_simple_binop (mode, ASHIFT, reg, GEN_INT (32),
18515                                  NULL, 1, OPTAB_DIRECT);
18516       reg = expand_simple_binop (mode, IOR, reg, tmp, reg, 1, OPTAB_DIRECT);
18517       return reg;
18518     }
18519 }
18520
18521 /* Duplicate value VAL using promote_duplicated_reg into maximal size that will
18522    be needed by main loop copying SIZE_NEEDED chunks and prologue getting
18523    alignment from ALIGN to DESIRED_ALIGN.  */
18524 static rtx
18525 promote_duplicated_reg_to_size (rtx val, int size_needed, int desired_align, int align)
18526 {
18527   rtx promoted_val;
18528
18529   if (TARGET_64BIT
18530       && (size_needed > 4 || (desired_align > align && desired_align > 4)))
18531     promoted_val = promote_duplicated_reg (DImode, val);
18532   else if (size_needed > 2 || (desired_align > align && desired_align > 2))
18533     promoted_val = promote_duplicated_reg (SImode, val);
18534   else if (size_needed > 1 || (desired_align > align && desired_align > 1))
18535     promoted_val = promote_duplicated_reg (HImode, val);
18536   else
18537     promoted_val = val;
18538
18539   return promoted_val;
18540 }
18541
18542 /* Expand string clear operation (bzero).  Use i386 string operations when
18543    profitable.  See expand_movmem comment for explanation of individual
18544    steps performed.  */
18545 int
18546 ix86_expand_setmem (rtx dst, rtx count_exp, rtx val_exp, rtx align_exp,
18547                     rtx expected_align_exp, rtx expected_size_exp)
18548 {
18549   rtx destreg;
18550   rtx label = NULL;
18551   rtx tmp;
18552   rtx jump_around_label = NULL;
18553   HOST_WIDE_INT align = 1;
18554   unsigned HOST_WIDE_INT count = 0;
18555   HOST_WIDE_INT expected_size = -1;
18556   int size_needed = 0, epilogue_size_needed;
18557   int desired_align = 0, align_bytes = 0;
18558   enum stringop_alg alg;
18559   rtx promoted_val = NULL;
18560   bool force_loopy_epilogue = false;
18561   int dynamic_check;
18562   bool need_zero_guard = false;
18563
18564   if (CONST_INT_P (align_exp))
18565     align = INTVAL (align_exp);
18566   /* i386 can do misaligned access on reasonably increased cost.  */
18567   if (CONST_INT_P (expected_align_exp)
18568       && INTVAL (expected_align_exp) > align)
18569     align = INTVAL (expected_align_exp);
18570   if (CONST_INT_P (count_exp))
18571     count = expected_size = INTVAL (count_exp);
18572   if (CONST_INT_P (expected_size_exp) && count == 0)
18573     expected_size = INTVAL (expected_size_exp);
18574
18575   /* Make sure we don't need to care about overflow later on.  */
18576   if (count > ((unsigned HOST_WIDE_INT) 1 << 30))
18577     return 0;
18578
18579   /* Step 0: Decide on preferred algorithm, desired alignment and
18580      size of chunks to be copied by main loop.  */
18581
18582   alg = decide_alg (count, expected_size, true, &dynamic_check);
18583   desired_align = decide_alignment (align, alg, expected_size);
18584
18585   if (!TARGET_ALIGN_STRINGOPS)
18586     align = desired_align;
18587
18588   if (alg == libcall)
18589     return 0;
18590   gcc_assert (alg != no_stringop);
18591   if (!count)
18592     count_exp = copy_to_mode_reg (counter_mode (count_exp), count_exp);
18593   destreg = copy_to_mode_reg (Pmode, XEXP (dst, 0));
18594   switch (alg)
18595     {
18596     case libcall:
18597     case no_stringop:
18598       gcc_unreachable ();
18599     case loop:
18600       need_zero_guard = true;
18601       size_needed = GET_MODE_SIZE (Pmode);
18602       break;
18603     case unrolled_loop:
18604       need_zero_guard = true;
18605       size_needed = GET_MODE_SIZE (Pmode) * 4;
18606       break;
18607     case rep_prefix_8_byte:
18608       size_needed = 8;
18609       break;
18610     case rep_prefix_4_byte:
18611       size_needed = 4;
18612       break;
18613     case rep_prefix_1_byte:
18614       size_needed = 1;
18615       break;
18616     case loop_1_byte:
18617       need_zero_guard = true;
18618       size_needed = 1;
18619       break;
18620     }
18621   epilogue_size_needed = size_needed;
18622
18623   /* Step 1: Prologue guard.  */
18624
18625   /* Alignment code needs count to be in register.  */
18626   if (CONST_INT_P (count_exp) && desired_align > align)
18627     {
18628       if (INTVAL (count_exp) > desired_align
18629           && INTVAL (count_exp) > size_needed)
18630         {
18631           align_bytes
18632             = get_mem_align_offset (dst, desired_align * BITS_PER_UNIT);
18633           if (align_bytes <= 0)
18634             align_bytes = 0;
18635           else
18636             align_bytes = desired_align - align_bytes;
18637         }
18638       if (align_bytes == 0)
18639         {
18640           enum machine_mode mode = SImode;
18641           if (TARGET_64BIT && (count & ~0xffffffff))
18642             mode = DImode;
18643           count_exp = force_reg (mode, count_exp);
18644         }
18645     }
18646   /* Do the cheap promotion to allow better CSE across the
18647      main loop and epilogue (ie one load of the big constant in the
18648      front of all code.  */
18649   if (CONST_INT_P (val_exp))
18650     promoted_val = promote_duplicated_reg_to_size (val_exp, size_needed,
18651                                                    desired_align, align);
18652   /* Ensure that alignment prologue won't copy past end of block.  */
18653   if (size_needed > 1 || (desired_align > 1 && desired_align > align))
18654     {
18655       epilogue_size_needed = MAX (size_needed - 1, desired_align - align);
18656       /* Epilogue always copies COUNT_EXP & (EPILOGUE_SIZE_NEEDED - 1) bytes.
18657          Make sure it is power of 2.  */
18658       epilogue_size_needed = smallest_pow2_greater_than (epilogue_size_needed);
18659
18660       /* To improve performance of small blocks, we jump around the VAL
18661          promoting mode.  This mean that if the promoted VAL is not constant,
18662          we might not use it in the epilogue and have to use byte
18663          loop variant.  */
18664       if (epilogue_size_needed > 2 && !promoted_val)
18665         force_loopy_epilogue = true;
18666       if (count)
18667         {
18668           if (count < (unsigned HOST_WIDE_INT)epilogue_size_needed)
18669             {
18670               /* If main algorithm works on QImode, no epilogue is needed.
18671                  For small sizes just don't align anything.  */
18672               if (size_needed == 1)
18673                 desired_align = align;
18674               else
18675                 goto epilogue;
18676             }
18677         }
18678       else
18679         {
18680           label = gen_label_rtx ();
18681           emit_cmp_and_jump_insns (count_exp,
18682                                    GEN_INT (epilogue_size_needed),
18683                                    LTU, 0, counter_mode (count_exp), 1, label);
18684           if (expected_size == -1 || expected_size <= epilogue_size_needed)
18685             predict_jump (REG_BR_PROB_BASE * 60 / 100);
18686           else
18687             predict_jump (REG_BR_PROB_BASE * 20 / 100);
18688         }
18689     }
18690   if (dynamic_check != -1)
18691     {
18692       rtx hot_label = gen_label_rtx ();
18693       jump_around_label = gen_label_rtx ();
18694       emit_cmp_and_jump_insns (count_exp, GEN_INT (dynamic_check - 1),
18695                                LEU, 0, counter_mode (count_exp), 1, hot_label);
18696       predict_jump (REG_BR_PROB_BASE * 90 / 100);
18697       set_storage_via_libcall (dst, count_exp, val_exp, false);
18698       emit_jump (jump_around_label);
18699       emit_label (hot_label);
18700     }
18701
18702   /* Step 2: Alignment prologue.  */
18703
18704   /* Do the expensive promotion once we branched off the small blocks.  */
18705   if (!promoted_val)
18706     promoted_val = promote_duplicated_reg_to_size (val_exp, size_needed,
18707                                                    desired_align, align);
18708   gcc_assert (desired_align >= 1 && align >= 1);
18709
18710   if (desired_align > align)
18711     {
18712       if (align_bytes == 0)
18713         {
18714           /* Except for the first move in epilogue, we no longer know
18715              constant offset in aliasing info.  It don't seems to worth
18716              the pain to maintain it for the first move, so throw away
18717              the info early.  */
18718           dst = change_address (dst, BLKmode, destreg);
18719           expand_setmem_prologue (dst, destreg, promoted_val, count_exp, align,
18720                                   desired_align);
18721         }
18722       else
18723         {
18724           /* If we know how many bytes need to be stored before dst is
18725              sufficiently aligned, maintain aliasing info accurately.  */
18726           dst = expand_constant_setmem_prologue (dst, destreg, promoted_val,
18727                                                  desired_align, align_bytes);
18728           count_exp = plus_constant (count_exp, -align_bytes);
18729           count -= align_bytes;
18730         }
18731       if (need_zero_guard
18732           && (count < (unsigned HOST_WIDE_INT) size_needed
18733               || (align_bytes == 0
18734                   && count < ((unsigned HOST_WIDE_INT) size_needed
18735                               + desired_align - align))))
18736         {
18737           /* It is possible that we copied enough so the main loop will not
18738              execute.  */
18739           gcc_assert (size_needed > 1);
18740           if (label == NULL_RTX)
18741             label = gen_label_rtx ();
18742           emit_cmp_and_jump_insns (count_exp,
18743                                    GEN_INT (size_needed),
18744                                    LTU, 0, counter_mode (count_exp), 1, label);
18745           if (expected_size == -1
18746               || expected_size < (desired_align - align) / 2 + size_needed)
18747             predict_jump (REG_BR_PROB_BASE * 20 / 100);
18748           else
18749             predict_jump (REG_BR_PROB_BASE * 60 / 100);
18750         }
18751     }
18752   if (label && size_needed == 1)
18753     {
18754       emit_label (label);
18755       LABEL_NUSES (label) = 1;
18756       label = NULL;
18757       promoted_val = val_exp;
18758       epilogue_size_needed = 1;
18759     }
18760   else if (label == NULL_RTX)
18761     epilogue_size_needed = size_needed;
18762
18763   /* Step 3: Main loop.  */
18764
18765   switch (alg)
18766     {
18767     case libcall:
18768     case no_stringop:
18769       gcc_unreachable ();
18770     case loop_1_byte:
18771       expand_set_or_movmem_via_loop (dst, NULL, destreg, NULL, promoted_val,
18772                                      count_exp, QImode, 1, expected_size);
18773       break;
18774     case loop:
18775       expand_set_or_movmem_via_loop (dst, NULL, destreg, NULL, promoted_val,
18776                                      count_exp, Pmode, 1, expected_size);
18777       break;
18778     case unrolled_loop:
18779       expand_set_or_movmem_via_loop (dst, NULL, destreg, NULL, promoted_val,
18780                                      count_exp, Pmode, 4, expected_size);
18781       break;
18782     case rep_prefix_8_byte:
18783       expand_setmem_via_rep_stos (dst, destreg, promoted_val, count_exp,
18784                                   DImode, val_exp);
18785       break;
18786     case rep_prefix_4_byte:
18787       expand_setmem_via_rep_stos (dst, destreg, promoted_val, count_exp,
18788                                   SImode, val_exp);
18789       break;
18790     case rep_prefix_1_byte:
18791       expand_setmem_via_rep_stos (dst, destreg, promoted_val, count_exp,
18792                                   QImode, val_exp);
18793       break;
18794     }
18795   /* Adjust properly the offset of src and dest memory for aliasing.  */
18796   if (CONST_INT_P (count_exp))
18797     dst = adjust_automodify_address_nv (dst, BLKmode, destreg,
18798                                         (count / size_needed) * size_needed);
18799   else
18800     dst = change_address (dst, BLKmode, destreg);
18801
18802   /* Step 4: Epilogue to copy the remaining bytes.  */
18803
18804   if (label)
18805     {
18806       /* When the main loop is done, COUNT_EXP might hold original count,
18807          while we want to copy only COUNT_EXP & SIZE_NEEDED bytes.
18808          Epilogue code will actually copy COUNT_EXP & EPILOGUE_SIZE_NEEDED
18809          bytes. Compensate if needed.  */
18810
18811       if (size_needed < epilogue_size_needed)
18812         {
18813           tmp =
18814             expand_simple_binop (counter_mode (count_exp), AND, count_exp,
18815                                  GEN_INT (size_needed - 1), count_exp, 1,
18816                                  OPTAB_DIRECT);
18817           if (tmp != count_exp)
18818             emit_move_insn (count_exp, tmp);
18819         }
18820       emit_label (label);
18821       LABEL_NUSES (label) = 1;
18822     }
18823  epilogue:
18824   if (count_exp != const0_rtx && epilogue_size_needed > 1)
18825     {
18826       if (force_loopy_epilogue)
18827         expand_setmem_epilogue_via_loop (dst, destreg, val_exp, count_exp,
18828                                          epilogue_size_needed);
18829       else
18830         expand_setmem_epilogue (dst, destreg, promoted_val, count_exp,
18831                                 epilogue_size_needed);
18832     }
18833   if (jump_around_label)
18834     emit_label (jump_around_label);
18835   return 1;
18836 }
18837
18838 /* Expand the appropriate insns for doing strlen if not just doing
18839    repnz; scasb
18840
18841    out = result, initialized with the start address
18842    align_rtx = alignment of the address.
18843    scratch = scratch register, initialized with the startaddress when
18844         not aligned, otherwise undefined
18845
18846    This is just the body. It needs the initializations mentioned above and
18847    some address computing at the end.  These things are done in i386.md.  */
18848
18849 static void
18850 ix86_expand_strlensi_unroll_1 (rtx out, rtx src, rtx align_rtx)
18851 {
18852   int align;
18853   rtx tmp;
18854   rtx align_2_label = NULL_RTX;
18855   rtx align_3_label = NULL_RTX;
18856   rtx align_4_label = gen_label_rtx ();
18857   rtx end_0_label = gen_label_rtx ();
18858   rtx mem;
18859   rtx tmpreg = gen_reg_rtx (SImode);
18860   rtx scratch = gen_reg_rtx (SImode);
18861   rtx cmp;
18862
18863   align = 0;
18864   if (CONST_INT_P (align_rtx))
18865     align = INTVAL (align_rtx);
18866
18867   /* Loop to check 1..3 bytes for null to get an aligned pointer.  */
18868
18869   /* Is there a known alignment and is it less than 4?  */
18870   if (align < 4)
18871     {
18872       rtx scratch1 = gen_reg_rtx (Pmode);
18873       emit_move_insn (scratch1, out);
18874       /* Is there a known alignment and is it not 2? */
18875       if (align != 2)
18876         {
18877           align_3_label = gen_label_rtx (); /* Label when aligned to 3-byte */
18878           align_2_label = gen_label_rtx (); /* Label when aligned to 2-byte */
18879
18880           /* Leave just the 3 lower bits.  */
18881           align_rtx = expand_binop (Pmode, and_optab, scratch1, GEN_INT (3),
18882                                     NULL_RTX, 0, OPTAB_WIDEN);
18883
18884           emit_cmp_and_jump_insns (align_rtx, const0_rtx, EQ, NULL,
18885                                    Pmode, 1, align_4_label);
18886           emit_cmp_and_jump_insns (align_rtx, const2_rtx, EQ, NULL,
18887                                    Pmode, 1, align_2_label);
18888           emit_cmp_and_jump_insns (align_rtx, const2_rtx, GTU, NULL,
18889                                    Pmode, 1, align_3_label);
18890         }
18891       else
18892         {
18893           /* Since the alignment is 2, we have to check 2 or 0 bytes;
18894              check if is aligned to 4 - byte.  */
18895
18896           align_rtx = expand_binop (Pmode, and_optab, scratch1, const2_rtx,
18897                                     NULL_RTX, 0, OPTAB_WIDEN);
18898
18899           emit_cmp_and_jump_insns (align_rtx, const0_rtx, EQ, NULL,
18900                                    Pmode, 1, align_4_label);
18901         }
18902
18903       mem = change_address (src, QImode, out);
18904
18905       /* Now compare the bytes.  */
18906
18907       /* Compare the first n unaligned byte on a byte per byte basis.  */
18908       emit_cmp_and_jump_insns (mem, const0_rtx, EQ, NULL,
18909                                QImode, 1, end_0_label);
18910
18911       /* Increment the address.  */
18912       emit_insn ((*ix86_gen_add3) (out, out, const1_rtx));
18913
18914       /* Not needed with an alignment of 2 */
18915       if (align != 2)
18916         {
18917           emit_label (align_2_label);
18918
18919           emit_cmp_and_jump_insns (mem, const0_rtx, EQ, NULL, QImode, 1,
18920                                    end_0_label);
18921
18922           emit_insn ((*ix86_gen_add3) (out, out, const1_rtx));
18923
18924           emit_label (align_3_label);
18925         }
18926
18927       emit_cmp_and_jump_insns (mem, const0_rtx, EQ, NULL, QImode, 1,
18928                                end_0_label);
18929
18930       emit_insn ((*ix86_gen_add3) (out, out, const1_rtx));
18931     }
18932
18933   /* Generate loop to check 4 bytes at a time.  It is not a good idea to
18934      align this loop.  It gives only huge programs, but does not help to
18935      speed up.  */
18936   emit_label (align_4_label);
18937
18938   mem = change_address (src, SImode, out);
18939   emit_move_insn (scratch, mem);
18940   emit_insn ((*ix86_gen_add3) (out, out, GEN_INT (4)));
18941
18942   /* This formula yields a nonzero result iff one of the bytes is zero.
18943      This saves three branches inside loop and many cycles.  */
18944
18945   emit_insn (gen_addsi3 (tmpreg, scratch, GEN_INT (-0x01010101)));
18946   emit_insn (gen_one_cmplsi2 (scratch, scratch));
18947   emit_insn (gen_andsi3 (tmpreg, tmpreg, scratch));
18948   emit_insn (gen_andsi3 (tmpreg, tmpreg,
18949                          gen_int_mode (0x80808080, SImode)));
18950   emit_cmp_and_jump_insns (tmpreg, const0_rtx, EQ, 0, SImode, 1,
18951                            align_4_label);
18952
18953   if (TARGET_CMOVE)
18954     {
18955        rtx reg = gen_reg_rtx (SImode);
18956        rtx reg2 = gen_reg_rtx (Pmode);
18957        emit_move_insn (reg, tmpreg);
18958        emit_insn (gen_lshrsi3 (reg, reg, GEN_INT (16)));
18959
18960        /* If zero is not in the first two bytes, move two bytes forward.  */
18961        emit_insn (gen_testsi_ccno_1 (tmpreg, GEN_INT (0x8080)));
18962        tmp = gen_rtx_REG (CCNOmode, FLAGS_REG);
18963        tmp = gen_rtx_EQ (VOIDmode, tmp, const0_rtx);
18964        emit_insn (gen_rtx_SET (VOIDmode, tmpreg,
18965                                gen_rtx_IF_THEN_ELSE (SImode, tmp,
18966                                                      reg,
18967                                                      tmpreg)));
18968        /* Emit lea manually to avoid clobbering of flags.  */
18969        emit_insn (gen_rtx_SET (SImode, reg2,
18970                                gen_rtx_PLUS (Pmode, out, const2_rtx)));
18971
18972        tmp = gen_rtx_REG (CCNOmode, FLAGS_REG);
18973        tmp = gen_rtx_EQ (VOIDmode, tmp, const0_rtx);
18974        emit_insn (gen_rtx_SET (VOIDmode, out,
18975                                gen_rtx_IF_THEN_ELSE (Pmode, tmp,
18976                                                      reg2,
18977                                                      out)));
18978
18979     }
18980   else
18981     {
18982        rtx end_2_label = gen_label_rtx ();
18983        /* Is zero in the first two bytes? */
18984
18985        emit_insn (gen_testsi_ccno_1 (tmpreg, GEN_INT (0x8080)));
18986        tmp = gen_rtx_REG (CCNOmode, FLAGS_REG);
18987        tmp = gen_rtx_NE (VOIDmode, tmp, const0_rtx);
18988        tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp,
18989                             gen_rtx_LABEL_REF (VOIDmode, end_2_label),
18990                             pc_rtx);
18991        tmp = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, tmp));
18992        JUMP_LABEL (tmp) = end_2_label;
18993
18994        /* Not in the first two.  Move two bytes forward.  */
18995        emit_insn (gen_lshrsi3 (tmpreg, tmpreg, GEN_INT (16)));
18996        emit_insn ((*ix86_gen_add3) (out, out, const2_rtx));
18997
18998        emit_label (end_2_label);
18999
19000     }
19001
19002   /* Avoid branch in fixing the byte.  */
19003   tmpreg = gen_lowpart (QImode, tmpreg);
19004   emit_insn (gen_addqi3_cc (tmpreg, tmpreg, tmpreg));
19005   cmp = gen_rtx_LTU (Pmode, gen_rtx_REG (CCmode, FLAGS_REG), const0_rtx);
19006   emit_insn ((*ix86_gen_sub3_carry) (out, out, GEN_INT (3), cmp));
19007
19008   emit_label (end_0_label);
19009 }
19010
19011 /* Expand strlen.  */
19012
19013 int
19014 ix86_expand_strlen (rtx out, rtx src, rtx eoschar, rtx align)
19015 {
19016   rtx addr, scratch1, scratch2, scratch3, scratch4;
19017
19018   /* The generic case of strlen expander is long.  Avoid it's
19019      expanding unless TARGET_INLINE_ALL_STRINGOPS.  */
19020
19021   if (TARGET_UNROLL_STRLEN && eoschar == const0_rtx && optimize > 1
19022       && !TARGET_INLINE_ALL_STRINGOPS
19023       && !optimize_insn_for_size_p ()
19024       && (!CONST_INT_P (align) || INTVAL (align) < 4))
19025     return 0;
19026
19027   addr = force_reg (Pmode, XEXP (src, 0));
19028   scratch1 = gen_reg_rtx (Pmode);
19029
19030   if (TARGET_UNROLL_STRLEN && eoschar == const0_rtx && optimize > 1
19031       && !optimize_insn_for_size_p ())
19032     {
19033       /* Well it seems that some optimizer does not combine a call like
19034          foo(strlen(bar), strlen(bar));
19035          when the move and the subtraction is done here.  It does calculate
19036          the length just once when these instructions are done inside of
19037          output_strlen_unroll().  But I think since &bar[strlen(bar)] is
19038          often used and I use one fewer register for the lifetime of
19039          output_strlen_unroll() this is better.  */
19040
19041       emit_move_insn (out, addr);
19042
19043       ix86_expand_strlensi_unroll_1 (out, src, align);
19044
19045       /* strlensi_unroll_1 returns the address of the zero at the end of
19046          the string, like memchr(), so compute the length by subtracting
19047          the start address.  */
19048       emit_insn ((*ix86_gen_sub3) (out, out, addr));
19049     }
19050   else
19051     {
19052       rtx unspec;
19053
19054       /* Can't use this if the user has appropriated eax, ecx, or edi.  */
19055       if (fixed_regs[AX_REG] || fixed_regs[CX_REG] || fixed_regs[DI_REG])
19056         return false;
19057
19058       scratch2 = gen_reg_rtx (Pmode);
19059       scratch3 = gen_reg_rtx (Pmode);
19060       scratch4 = force_reg (Pmode, constm1_rtx);
19061
19062       emit_move_insn (scratch3, addr);
19063       eoschar = force_reg (QImode, eoschar);
19064
19065       src = replace_equiv_address_nv (src, scratch3);
19066
19067       /* If .md starts supporting :P, this can be done in .md.  */
19068       unspec = gen_rtx_UNSPEC (Pmode, gen_rtvec (4, src, eoschar, align,
19069                                                  scratch4), UNSPEC_SCAS);
19070       emit_insn (gen_strlenqi_1 (scratch1, scratch3, unspec));
19071       emit_insn ((*ix86_gen_one_cmpl2) (scratch2, scratch1));
19072       emit_insn ((*ix86_gen_add3) (out, scratch2, constm1_rtx));
19073     }
19074   return 1;
19075 }
19076
19077 /* For given symbol (function) construct code to compute address of it's PLT
19078    entry in large x86-64 PIC model.  */
19079 rtx
19080 construct_plt_address (rtx symbol)
19081 {
19082   rtx tmp = gen_reg_rtx (Pmode);
19083   rtx unspec = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, symbol), UNSPEC_PLTOFF);
19084
19085   gcc_assert (GET_CODE (symbol) == SYMBOL_REF);
19086   gcc_assert (ix86_cmodel == CM_LARGE_PIC);
19087
19088   emit_move_insn (tmp, gen_rtx_CONST (Pmode, unspec));
19089   emit_insn (gen_adddi3 (tmp, tmp, pic_offset_table_rtx));
19090   return tmp;
19091 }
19092
19093 void
19094 ix86_expand_call (rtx retval, rtx fnaddr, rtx callarg1,
19095                   rtx callarg2,
19096                   rtx pop, int sibcall)
19097 {
19098   rtx use = NULL, call;
19099
19100   if (pop == const0_rtx)
19101     pop = NULL;
19102   gcc_assert (!TARGET_64BIT || !pop);
19103
19104   if (TARGET_MACHO && !TARGET_64BIT)
19105     {
19106 #if TARGET_MACHO
19107       if (flag_pic && GET_CODE (XEXP (fnaddr, 0)) == SYMBOL_REF)
19108         fnaddr = machopic_indirect_call_target (fnaddr);
19109 #endif
19110     }
19111   else
19112     {
19113       /* Static functions and indirect calls don't need the pic register.  */
19114       if (flag_pic && (!TARGET_64BIT || ix86_cmodel == CM_LARGE_PIC)
19115           && GET_CODE (XEXP (fnaddr, 0)) == SYMBOL_REF
19116           && ! SYMBOL_REF_LOCAL_P (XEXP (fnaddr, 0)))
19117         use_reg (&use, pic_offset_table_rtx);
19118     }
19119
19120   if (TARGET_64BIT && INTVAL (callarg2) >= 0)
19121     {
19122       rtx al = gen_rtx_REG (QImode, AX_REG);
19123       emit_move_insn (al, callarg2);
19124       use_reg (&use, al);
19125     }
19126
19127   if (ix86_cmodel == CM_LARGE_PIC
19128       && GET_CODE (fnaddr) == MEM
19129       && GET_CODE (XEXP (fnaddr, 0)) == SYMBOL_REF
19130       && !local_symbolic_operand (XEXP (fnaddr, 0), VOIDmode))
19131     fnaddr = gen_rtx_MEM (QImode, construct_plt_address (XEXP (fnaddr, 0)));
19132   else if (! call_insn_operand (XEXP (fnaddr, 0), Pmode))
19133     {
19134       fnaddr = copy_to_mode_reg (Pmode, XEXP (fnaddr, 0));
19135       fnaddr = gen_rtx_MEM (QImode, fnaddr);
19136     }
19137   if (sibcall && TARGET_64BIT
19138       && !constant_call_address_operand (XEXP (fnaddr, 0), Pmode))
19139     {
19140       rtx addr;
19141       addr = copy_to_mode_reg (Pmode, XEXP (fnaddr, 0));
19142       fnaddr = gen_rtx_REG (Pmode, R11_REG);
19143       emit_move_insn (fnaddr, addr);
19144       fnaddr = gen_rtx_MEM (QImode, fnaddr);
19145     }
19146
19147   call = gen_rtx_CALL (VOIDmode, fnaddr, callarg1);
19148   if (retval)
19149     call = gen_rtx_SET (VOIDmode, retval, call);
19150   if (pop)
19151     {
19152       pop = gen_rtx_PLUS (Pmode, stack_pointer_rtx, pop);
19153       pop = gen_rtx_SET (VOIDmode, stack_pointer_rtx, pop);
19154       call = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, call, pop));
19155     }
19156   if (TARGET_64BIT
19157       && ix86_cfun_abi () == MS_ABI
19158       && (!callarg2 || INTVAL (callarg2) != -2))
19159     {
19160       /* We need to represent that SI and DI registers are clobbered
19161          by SYSV calls.  */
19162       static int clobbered_registers[] = {
19163         XMM6_REG, XMM7_REG, XMM8_REG,
19164         XMM9_REG, XMM10_REG, XMM11_REG,
19165         XMM12_REG, XMM13_REG, XMM14_REG,
19166         XMM15_REG, SI_REG, DI_REG
19167       };
19168       unsigned int i;
19169       rtx vec[ARRAY_SIZE (clobbered_registers) + 2];
19170       rtx unspec = gen_rtx_UNSPEC (VOIDmode, gen_rtvec (1, const0_rtx),
19171                                    UNSPEC_MS_TO_SYSV_CALL);
19172
19173       vec[0] = call;
19174       vec[1] = unspec;
19175       for (i = 0; i < ARRAY_SIZE (clobbered_registers); i++)
19176         vec[i + 2] = gen_rtx_CLOBBER (SSE_REGNO_P (clobbered_registers[i])
19177                                       ? TImode : DImode,
19178                                       gen_rtx_REG
19179                                         (SSE_REGNO_P (clobbered_registers[i])
19180                                                       ? TImode : DImode,
19181                                          clobbered_registers[i]));
19182
19183       call = gen_rtx_PARALLEL (VOIDmode,
19184                                gen_rtvec_v (ARRAY_SIZE (clobbered_registers)
19185                                + 2, vec));
19186     }
19187
19188   call = emit_call_insn (call);
19189   if (use)
19190     CALL_INSN_FUNCTION_USAGE (call) = use;
19191 }
19192
19193 \f
19194 /* Clear stack slot assignments remembered from previous functions.
19195    This is called from INIT_EXPANDERS once before RTL is emitted for each
19196    function.  */
19197
19198 static struct machine_function *
19199 ix86_init_machine_status (void)
19200 {
19201   struct machine_function *f;
19202
19203   f = GGC_CNEW (struct machine_function);
19204   f->use_fast_prologue_epilogue_nregs = -1;
19205   f->tls_descriptor_call_expanded_p = 0;
19206   f->call_abi = ix86_abi;
19207
19208   return f;
19209 }
19210
19211 /* Return a MEM corresponding to a stack slot with mode MODE.
19212    Allocate a new slot if necessary.
19213
19214    The RTL for a function can have several slots available: N is
19215    which slot to use.  */
19216
19217 rtx
19218 assign_386_stack_local (enum machine_mode mode, enum ix86_stack_slot n)
19219 {
19220   struct stack_local_entry *s;
19221
19222   gcc_assert (n < MAX_386_STACK_LOCALS);
19223
19224   /* Virtual slot is valid only before vregs are instantiated.  */
19225   gcc_assert ((n == SLOT_VIRTUAL) == !virtuals_instantiated);
19226
19227   for (s = ix86_stack_locals; s; s = s->next)
19228     if (s->mode == mode && s->n == n)
19229       return copy_rtx (s->rtl);
19230
19231   s = (struct stack_local_entry *)
19232     ggc_alloc (sizeof (struct stack_local_entry));
19233   s->n = n;
19234   s->mode = mode;
19235   s->rtl = assign_stack_local (mode, GET_MODE_SIZE (mode), 0);
19236
19237   s->next = ix86_stack_locals;
19238   ix86_stack_locals = s;
19239   return s->rtl;
19240 }
19241
19242 /* Construct the SYMBOL_REF for the tls_get_addr function.  */
19243
19244 static GTY(()) rtx ix86_tls_symbol;
19245 rtx
19246 ix86_tls_get_addr (void)
19247 {
19248
19249   if (!ix86_tls_symbol)
19250     {
19251       ix86_tls_symbol = gen_rtx_SYMBOL_REF (Pmode,
19252                                             (TARGET_ANY_GNU_TLS
19253                                              && !TARGET_64BIT)
19254                                             ? "___tls_get_addr"
19255                                             : "__tls_get_addr");
19256     }
19257
19258   return ix86_tls_symbol;
19259 }
19260
19261 /* Construct the SYMBOL_REF for the _TLS_MODULE_BASE_ symbol.  */
19262
19263 static GTY(()) rtx ix86_tls_module_base_symbol;
19264 rtx
19265 ix86_tls_module_base (void)
19266 {
19267
19268   if (!ix86_tls_module_base_symbol)
19269     {
19270       ix86_tls_module_base_symbol = gen_rtx_SYMBOL_REF (Pmode,
19271                                                         "_TLS_MODULE_BASE_");
19272       SYMBOL_REF_FLAGS (ix86_tls_module_base_symbol)
19273         |= TLS_MODEL_GLOBAL_DYNAMIC << SYMBOL_FLAG_TLS_SHIFT;
19274     }
19275
19276   return ix86_tls_module_base_symbol;
19277 }
19278 \f
19279 /* Calculate the length of the memory address in the instruction
19280    encoding.  Does not include the one-byte modrm, opcode, or prefix.  */
19281
19282 int
19283 memory_address_length (rtx addr)
19284 {
19285   struct ix86_address parts;
19286   rtx base, index, disp;
19287   int len;
19288   int ok;
19289
19290   if (GET_CODE (addr) == PRE_DEC
19291       || GET_CODE (addr) == POST_INC
19292       || GET_CODE (addr) == PRE_MODIFY
19293       || GET_CODE (addr) == POST_MODIFY)
19294     return 0;
19295
19296   ok = ix86_decompose_address (addr, &parts);
19297   gcc_assert (ok);
19298
19299   if (parts.base && GET_CODE (parts.base) == SUBREG)
19300     parts.base = SUBREG_REG (parts.base);
19301   if (parts.index && GET_CODE (parts.index) == SUBREG)
19302     parts.index = SUBREG_REG (parts.index);
19303
19304   base = parts.base;
19305   index = parts.index;
19306   disp = parts.disp;
19307   len = 0;
19308
19309   /* Rule of thumb:
19310        - esp as the base always wants an index,
19311        - ebp as the base always wants a displacement,
19312        - r12 as the base always wants an index,
19313        - r13 as the base always wants a displacement.  */
19314
19315   /* Register Indirect.  */
19316   if (base && !index && !disp)
19317     {
19318       /* esp (for its index) and ebp (for its displacement) need
19319          the two-byte modrm form.  Similarly for r12 and r13 in 64-bit
19320          code.  */
19321       if (REG_P (addr)
19322           && (addr == arg_pointer_rtx
19323               || addr == frame_pointer_rtx
19324               || REGNO (addr) == SP_REG
19325               || REGNO (addr) == BP_REG
19326               || REGNO (addr) == R12_REG
19327               || REGNO (addr) == R13_REG))
19328         len = 1;
19329     }
19330
19331   /* Direct Addressing.  */
19332   else if (disp && !base && !index)
19333     len = 4;
19334
19335   else
19336     {
19337       /* Find the length of the displacement constant.  */
19338       if (disp)
19339         {
19340           if (base && satisfies_constraint_K (disp))
19341             len = 1;
19342           else
19343             len = 4;
19344         }
19345       /* ebp always wants a displacement.  Similarly r13.  */
19346       else if (REG_P (base)
19347                && (REGNO (base) == BP_REG || REGNO (base) == R13_REG))
19348         len = 1;
19349
19350       /* An index requires the two-byte modrm form....  */
19351       if (index
19352           /* ...like esp (or r12), which always wants an index.  */
19353           || base == arg_pointer_rtx
19354           || base == frame_pointer_rtx
19355           || (REG_P (base)
19356               && (REGNO (base) == SP_REG || REGNO (base) == R12_REG)))
19357         len += 1;
19358     }
19359
19360   return len;
19361 }
19362
19363 /* Compute default value for "length_immediate" attribute.  When SHORTFORM
19364    is set, expect that insn have 8bit immediate alternative.  */
19365 int
19366 ix86_attr_length_immediate_default (rtx insn, int shortform)
19367 {
19368   int len = 0;
19369   int i;
19370   extract_insn_cached (insn);
19371   for (i = recog_data.n_operands - 1; i >= 0; --i)
19372     if (CONSTANT_P (recog_data.operand[i]))
19373       {
19374         gcc_assert (!len);
19375         if (shortform && satisfies_constraint_K (recog_data.operand[i]))
19376           len = 1;
19377         else
19378           {
19379             switch (get_attr_mode (insn))
19380               {
19381                 case MODE_QI:
19382                   len+=1;
19383                   break;
19384                 case MODE_HI:
19385                   len+=2;
19386                   break;
19387                 case MODE_SI:
19388                   len+=4;
19389                   break;
19390                 /* Immediates for DImode instructions are encoded as 32bit sign extended values.  */
19391                 case MODE_DI:
19392                   len+=4;
19393                   break;
19394                 default:
19395                   fatal_insn ("unknown insn mode", insn);
19396               }
19397           }
19398       }
19399   return len;
19400 }
19401 /* Compute default value for "length_address" attribute.  */
19402 int
19403 ix86_attr_length_address_default (rtx insn)
19404 {
19405   int i;
19406
19407   if (get_attr_type (insn) == TYPE_LEA)
19408     {
19409       rtx set = PATTERN (insn), addr;
19410
19411       if (GET_CODE (set) == PARALLEL)
19412         set = XVECEXP (set, 0, 0);
19413
19414       gcc_assert (GET_CODE (set) == SET);
19415
19416       addr = SET_SRC (set);
19417       if (TARGET_64BIT && get_attr_mode (insn) == MODE_SI)
19418         {
19419           if (GET_CODE (addr) == ZERO_EXTEND)
19420             addr = XEXP (addr, 0);
19421           if (GET_CODE (addr) == SUBREG)
19422             addr = SUBREG_REG (addr);
19423         }
19424
19425       return memory_address_length (addr);
19426     }
19427
19428   extract_insn_cached (insn);
19429   for (i = recog_data.n_operands - 1; i >= 0; --i)
19430     if (MEM_P (recog_data.operand[i]))
19431       {
19432         return memory_address_length (XEXP (recog_data.operand[i], 0));
19433         break;
19434       }
19435   return 0;
19436 }
19437
19438 /* Compute default value for "length_vex" attribute. It includes
19439    2 or 3 byte VEX prefix and 1 opcode byte.  */
19440
19441 int
19442 ix86_attr_length_vex_default (rtx insn, int has_0f_opcode,
19443                               int has_vex_w)
19444 {
19445   int i;
19446
19447   /* Only 0f opcode can use 2 byte VEX prefix and  VEX W bit uses 3
19448      byte VEX prefix.  */
19449   if (!has_0f_opcode || has_vex_w)
19450     return 3 + 1;
19451
19452  /* We can always use 2 byte VEX prefix in 32bit.  */
19453   if (!TARGET_64BIT)
19454     return 2 + 1;
19455
19456   extract_insn_cached (insn);
19457
19458   for (i = recog_data.n_operands - 1; i >= 0; --i)
19459     if (REG_P (recog_data.operand[i]))
19460       {
19461         /* REX.W bit uses 3 byte VEX prefix.  */
19462         if (GET_MODE (recog_data.operand[i]) == DImode)
19463           return 3 + 1;
19464       }
19465     else
19466       {
19467         /* REX.X or REX.B bits use 3 byte VEX prefix.  */
19468         if (MEM_P (recog_data.operand[i])
19469             && x86_extended_reg_mentioned_p (recog_data.operand[i]))
19470           return 3 + 1;
19471       }
19472
19473   return 2 + 1;
19474 }
19475 \f
19476 /* Return the maximum number of instructions a cpu can issue.  */
19477
19478 static int
19479 ix86_issue_rate (void)
19480 {
19481   switch (ix86_tune)
19482     {
19483     case PROCESSOR_PENTIUM:
19484     case PROCESSOR_ATOM:
19485     case PROCESSOR_K6:
19486       return 2;
19487
19488     case PROCESSOR_PENTIUMPRO:
19489     case PROCESSOR_PENTIUM4:
19490     case PROCESSOR_ATHLON:
19491     case PROCESSOR_K8:
19492     case PROCESSOR_AMDFAM10:
19493     case PROCESSOR_NOCONA:
19494     case PROCESSOR_GENERIC32:
19495     case PROCESSOR_GENERIC64:
19496       return 3;
19497
19498     case PROCESSOR_CORE2:
19499       return 4;
19500
19501     default:
19502       return 1;
19503     }
19504 }
19505
19506 /* A subroutine of ix86_adjust_cost -- return true iff INSN reads flags set
19507    by DEP_INSN and nothing set by DEP_INSN.  */
19508
19509 static int
19510 ix86_flags_dependent (rtx insn, rtx dep_insn, enum attr_type insn_type)
19511 {
19512   rtx set, set2;
19513
19514   /* Simplify the test for uninteresting insns.  */
19515   if (insn_type != TYPE_SETCC
19516       && insn_type != TYPE_ICMOV
19517       && insn_type != TYPE_FCMOV
19518       && insn_type != TYPE_IBR)
19519     return 0;
19520
19521   if ((set = single_set (dep_insn)) != 0)
19522     {
19523       set = SET_DEST (set);
19524       set2 = NULL_RTX;
19525     }
19526   else if (GET_CODE (PATTERN (dep_insn)) == PARALLEL
19527            && XVECLEN (PATTERN (dep_insn), 0) == 2
19528            && GET_CODE (XVECEXP (PATTERN (dep_insn), 0, 0)) == SET
19529            && GET_CODE (XVECEXP (PATTERN (dep_insn), 0, 1)) == SET)
19530     {
19531       set = SET_DEST (XVECEXP (PATTERN (dep_insn), 0, 0));
19532       set2 = SET_DEST (XVECEXP (PATTERN (dep_insn), 0, 0));
19533     }
19534   else
19535     return 0;
19536
19537   if (!REG_P (set) || REGNO (set) != FLAGS_REG)
19538     return 0;
19539
19540   /* This test is true if the dependent insn reads the flags but
19541      not any other potentially set register.  */
19542   if (!reg_overlap_mentioned_p (set, PATTERN (insn)))
19543     return 0;
19544
19545   if (set2 && reg_overlap_mentioned_p (set2, PATTERN (insn)))
19546     return 0;
19547
19548   return 1;
19549 }
19550
19551 /* Return true iff USE_INSN has a memory address with operands set by
19552    SET_INSN.  */
19553
19554 bool
19555 ix86_agi_dependent (rtx set_insn, rtx use_insn)
19556 {
19557   int i;
19558   extract_insn_cached (use_insn);
19559   for (i = recog_data.n_operands - 1; i >= 0; --i)
19560     if (MEM_P (recog_data.operand[i]))
19561       {
19562         rtx addr = XEXP (recog_data.operand[i], 0);
19563         return modified_in_p (addr, set_insn) != 0;
19564       }
19565   return false;
19566 }
19567
19568 static int
19569 ix86_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
19570 {
19571   enum attr_type insn_type, dep_insn_type;
19572   enum attr_memory memory;
19573   rtx set, set2;
19574   int dep_insn_code_number;
19575
19576   /* Anti and output dependencies have zero cost on all CPUs.  */
19577   if (REG_NOTE_KIND (link) != 0)
19578     return 0;
19579
19580   dep_insn_code_number = recog_memoized (dep_insn);
19581
19582   /* If we can't recognize the insns, we can't really do anything.  */
19583   if (dep_insn_code_number < 0 || recog_memoized (insn) < 0)
19584     return cost;
19585
19586   insn_type = get_attr_type (insn);
19587   dep_insn_type = get_attr_type (dep_insn);
19588
19589   switch (ix86_tune)
19590     {
19591     case PROCESSOR_PENTIUM:
19592       /* Address Generation Interlock adds a cycle of latency.  */
19593       if (insn_type == TYPE_LEA)
19594         {
19595           rtx addr = PATTERN (insn);
19596
19597           if (GET_CODE (addr) == PARALLEL)
19598             addr = XVECEXP (addr, 0, 0);
19599
19600           gcc_assert (GET_CODE (addr) == SET);
19601
19602           addr = SET_SRC (addr);
19603           if (modified_in_p (addr, dep_insn))
19604             cost += 1;
19605         }
19606       else if (ix86_agi_dependent (dep_insn, insn))
19607         cost += 1;
19608
19609       /* ??? Compares pair with jump/setcc.  */
19610       if (ix86_flags_dependent (insn, dep_insn, insn_type))
19611         cost = 0;
19612
19613       /* Floating point stores require value to be ready one cycle earlier.  */
19614       if (insn_type == TYPE_FMOV
19615           && get_attr_memory (insn) == MEMORY_STORE
19616           && !ix86_agi_dependent (dep_insn, insn))
19617         cost += 1;
19618       break;
19619
19620     case PROCESSOR_PENTIUMPRO:
19621       memory = get_attr_memory (insn);
19622
19623       /* INT->FP conversion is expensive.  */
19624       if (get_attr_fp_int_src (dep_insn))
19625         cost += 5;
19626
19627       /* There is one cycle extra latency between an FP op and a store.  */
19628       if (insn_type == TYPE_FMOV
19629           && (set = single_set (dep_insn)) != NULL_RTX
19630           && (set2 = single_set (insn)) != NULL_RTX
19631           && rtx_equal_p (SET_DEST (set), SET_SRC (set2))
19632           && MEM_P (SET_DEST (set2)))
19633         cost += 1;
19634
19635       /* Show ability of reorder buffer to hide latency of load by executing
19636          in parallel with previous instruction in case
19637          previous instruction is not needed to compute the address.  */
19638       if ((memory == MEMORY_LOAD || memory == MEMORY_BOTH)
19639           && !ix86_agi_dependent (dep_insn, insn))
19640         {
19641           /* Claim moves to take one cycle, as core can issue one load
19642              at time and the next load can start cycle later.  */
19643           if (dep_insn_type == TYPE_IMOV
19644               || dep_insn_type == TYPE_FMOV)
19645             cost = 1;
19646           else if (cost > 1)
19647             cost--;
19648         }
19649       break;
19650
19651     case PROCESSOR_K6:
19652       memory = get_attr_memory (insn);
19653
19654       /* The esp dependency is resolved before the instruction is really
19655          finished.  */
19656       if ((insn_type == TYPE_PUSH || insn_type == TYPE_POP)
19657           && (dep_insn_type == TYPE_PUSH || dep_insn_type == TYPE_POP))
19658         return 1;
19659
19660       /* INT->FP conversion is expensive.  */
19661       if (get_attr_fp_int_src (dep_insn))
19662         cost += 5;
19663
19664       /* Show ability of reorder buffer to hide latency of load by executing
19665          in parallel with previous instruction in case
19666          previous instruction is not needed to compute the address.  */
19667       if ((memory == MEMORY_LOAD || memory == MEMORY_BOTH)
19668           && !ix86_agi_dependent (dep_insn, insn))
19669         {
19670           /* Claim moves to take one cycle, as core can issue one load
19671              at time and the next load can start cycle later.  */
19672           if (dep_insn_type == TYPE_IMOV
19673               || dep_insn_type == TYPE_FMOV)
19674             cost = 1;
19675           else if (cost > 2)
19676             cost -= 2;
19677           else
19678             cost = 1;
19679         }
19680       break;
19681
19682     case PROCESSOR_ATHLON:
19683     case PROCESSOR_K8:
19684     case PROCESSOR_AMDFAM10:
19685     case PROCESSOR_ATOM:
19686     case PROCESSOR_GENERIC32:
19687     case PROCESSOR_GENERIC64:
19688       memory = get_attr_memory (insn);
19689
19690       /* Show ability of reorder buffer to hide latency of load by executing
19691          in parallel with previous instruction in case
19692          previous instruction is not needed to compute the address.  */
19693       if ((memory == MEMORY_LOAD || memory == MEMORY_BOTH)
19694           && !ix86_agi_dependent (dep_insn, insn))
19695         {
19696           enum attr_unit unit = get_attr_unit (insn);
19697           int loadcost = 3;
19698
19699           /* Because of the difference between the length of integer and
19700              floating unit pipeline preparation stages, the memory operands
19701              for floating point are cheaper.
19702
19703              ??? For Athlon it the difference is most probably 2.  */
19704           if (unit == UNIT_INTEGER || unit == UNIT_UNKNOWN)
19705             loadcost = 3;
19706           else
19707             loadcost = TARGET_ATHLON ? 2 : 0;
19708
19709           if (cost >= loadcost)
19710             cost -= loadcost;
19711           else
19712             cost = 0;
19713         }
19714
19715     default:
19716       break;
19717     }
19718
19719   return cost;
19720 }
19721
19722 /* How many alternative schedules to try.  This should be as wide as the
19723    scheduling freedom in the DFA, but no wider.  Making this value too
19724    large results extra work for the scheduler.  */
19725
19726 static int
19727 ia32_multipass_dfa_lookahead (void)
19728 {
19729   switch (ix86_tune)
19730     {
19731     case PROCESSOR_PENTIUM:
19732       return 2;
19733
19734     case PROCESSOR_PENTIUMPRO:
19735     case PROCESSOR_K6:
19736       return 1;
19737
19738     default:
19739       return 0;
19740     }
19741 }
19742
19743 \f
19744 /* Compute the alignment given to a constant that is being placed in memory.
19745    EXP is the constant and ALIGN is the alignment that the object would
19746    ordinarily have.
19747    The value of this function is used instead of that alignment to align
19748    the object.  */
19749
19750 int
19751 ix86_constant_alignment (tree exp, int align)
19752 {
19753   if (TREE_CODE (exp) == REAL_CST || TREE_CODE (exp) == VECTOR_CST
19754       || TREE_CODE (exp) == INTEGER_CST)
19755     {
19756       if (TYPE_MODE (TREE_TYPE (exp)) == DFmode && align < 64)
19757         return 64;
19758       else if (ALIGN_MODE_128 (TYPE_MODE (TREE_TYPE (exp))) && align < 128)
19759         return 128;
19760     }
19761   else if (!optimize_size && TREE_CODE (exp) == STRING_CST
19762            && TREE_STRING_LENGTH (exp) >= 31 && align < BITS_PER_WORD)
19763     return BITS_PER_WORD;
19764
19765   return align;
19766 }
19767
19768 /* Compute the alignment for a static variable.
19769    TYPE is the data type, and ALIGN is the alignment that
19770    the object would ordinarily have.  The value of this function is used
19771    instead of that alignment to align the object.  */
19772
19773 int
19774 ix86_data_alignment (tree type, int align)
19775 {
19776   int max_align = optimize_size ? BITS_PER_WORD : MIN (256, MAX_OFILE_ALIGNMENT);
19777
19778   if (AGGREGATE_TYPE_P (type)
19779       && TYPE_SIZE (type)
19780       && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
19781       && (TREE_INT_CST_LOW (TYPE_SIZE (type)) >= (unsigned) max_align
19782           || TREE_INT_CST_HIGH (TYPE_SIZE (type)))
19783       && align < max_align)
19784     align = max_align;
19785
19786   /* x86-64 ABI requires arrays greater than 16 bytes to be aligned
19787      to 16byte boundary.  */
19788   if (TARGET_64BIT)
19789     {
19790       if (AGGREGATE_TYPE_P (type)
19791            && TYPE_SIZE (type)
19792            && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
19793            && (TREE_INT_CST_LOW (TYPE_SIZE (type)) >= 128
19794                || TREE_INT_CST_HIGH (TYPE_SIZE (type))) && align < 128)
19795         return 128;
19796     }
19797
19798   if (TREE_CODE (type) == ARRAY_TYPE)
19799     {
19800       if (TYPE_MODE (TREE_TYPE (type)) == DFmode && align < 64)
19801         return 64;
19802       if (ALIGN_MODE_128 (TYPE_MODE (TREE_TYPE (type))) && align < 128)
19803         return 128;
19804     }
19805   else if (TREE_CODE (type) == COMPLEX_TYPE)
19806     {
19807
19808       if (TYPE_MODE (type) == DCmode && align < 64)
19809         return 64;
19810       if ((TYPE_MODE (type) == XCmode
19811            || TYPE_MODE (type) == TCmode) && align < 128)
19812         return 128;
19813     }
19814   else if ((TREE_CODE (type) == RECORD_TYPE
19815             || TREE_CODE (type) == UNION_TYPE
19816             || TREE_CODE (type) == QUAL_UNION_TYPE)
19817            && TYPE_FIELDS (type))
19818     {
19819       if (DECL_MODE (TYPE_FIELDS (type)) == DFmode && align < 64)
19820         return 64;
19821       if (ALIGN_MODE_128 (DECL_MODE (TYPE_FIELDS (type))) && align < 128)
19822         return 128;
19823     }
19824   else if (TREE_CODE (type) == REAL_TYPE || TREE_CODE (type) == VECTOR_TYPE
19825            || TREE_CODE (type) == INTEGER_TYPE)
19826     {
19827       if (TYPE_MODE (type) == DFmode && align < 64)
19828         return 64;
19829       if (ALIGN_MODE_128 (TYPE_MODE (type)) && align < 128)
19830         return 128;
19831     }
19832
19833   return align;
19834 }
19835
19836 /* Compute the alignment for a local variable or a stack slot.  EXP is
19837    the data type or decl itself, MODE is the widest mode available and
19838    ALIGN is the alignment that the object would ordinarily have.  The
19839    value of this macro is used instead of that alignment to align the
19840    object.  */
19841
19842 unsigned int
19843 ix86_local_alignment (tree exp, enum machine_mode mode,
19844                       unsigned int align)
19845 {
19846   tree type, decl;
19847
19848   if (exp && DECL_P (exp))
19849     {
19850       type = TREE_TYPE (exp);
19851       decl = exp;
19852     }
19853   else
19854     {
19855       type = exp;
19856       decl = NULL;
19857     }
19858
19859   /* Don't do dynamic stack realignment for long long objects with
19860      -mpreferred-stack-boundary=2.  */
19861   if (!TARGET_64BIT
19862       && align == 64
19863       && ix86_preferred_stack_boundary < 64
19864       && (mode == DImode || (type && TYPE_MODE (type) == DImode))
19865       && (!type || !TYPE_USER_ALIGN (type))
19866       && (!decl || !DECL_USER_ALIGN (decl)))
19867     align = 32;
19868
19869   /* If TYPE is NULL, we are allocating a stack slot for caller-save
19870      register in MODE.  We will return the largest alignment of XF
19871      and DF.  */
19872   if (!type)
19873     {
19874       if (mode == XFmode && align < GET_MODE_ALIGNMENT (DFmode))
19875         align = GET_MODE_ALIGNMENT (DFmode);
19876       return align;
19877     }
19878
19879   /* x86-64 ABI requires arrays greater than 16 bytes to be aligned
19880      to 16byte boundary.  */
19881   if (TARGET_64BIT)
19882     {
19883       if (AGGREGATE_TYPE_P (type)
19884            && TYPE_SIZE (type)
19885            && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
19886            && (TREE_INT_CST_LOW (TYPE_SIZE (type)) >= 16
19887                || TREE_INT_CST_HIGH (TYPE_SIZE (type))) && align < 128)
19888         return 128;
19889     }
19890   if (TREE_CODE (type) == ARRAY_TYPE)
19891     {
19892       if (TYPE_MODE (TREE_TYPE (type)) == DFmode && align < 64)
19893         return 64;
19894       if (ALIGN_MODE_128 (TYPE_MODE (TREE_TYPE (type))) && align < 128)
19895         return 128;
19896     }
19897   else if (TREE_CODE (type) == COMPLEX_TYPE)
19898     {
19899       if (TYPE_MODE (type) == DCmode && align < 64)
19900         return 64;
19901       if ((TYPE_MODE (type) == XCmode
19902            || TYPE_MODE (type) == TCmode) && align < 128)
19903         return 128;
19904     }
19905   else if ((TREE_CODE (type) == RECORD_TYPE
19906             || TREE_CODE (type) == UNION_TYPE
19907             || TREE_CODE (type) == QUAL_UNION_TYPE)
19908            && TYPE_FIELDS (type))
19909     {
19910       if (DECL_MODE (TYPE_FIELDS (type)) == DFmode && align < 64)
19911         return 64;
19912       if (ALIGN_MODE_128 (DECL_MODE (TYPE_FIELDS (type))) && align < 128)
19913         return 128;
19914     }
19915   else if (TREE_CODE (type) == REAL_TYPE || TREE_CODE (type) == VECTOR_TYPE
19916            || TREE_CODE (type) == INTEGER_TYPE)
19917     {
19918
19919       if (TYPE_MODE (type) == DFmode && align < 64)
19920         return 64;
19921       if (ALIGN_MODE_128 (TYPE_MODE (type)) && align < 128)
19922         return 128;
19923     }
19924   return align;
19925 }
19926 \f
19927 /* Emit RTL insns to initialize the variable parts of a trampoline.
19928    FNADDR is an RTX for the address of the function's pure code.
19929    CXT is an RTX for the static chain value for the function.  */
19930 void
19931 x86_initialize_trampoline (rtx tramp, rtx fnaddr, rtx cxt)
19932 {
19933   if (!TARGET_64BIT)
19934     {
19935       /* Compute offset from the end of the jmp to the target function.  */
19936       rtx disp = expand_binop (SImode, sub_optab, fnaddr,
19937                                plus_constant (tramp, 10),
19938                                NULL_RTX, 1, OPTAB_DIRECT);
19939       emit_move_insn (gen_rtx_MEM (QImode, tramp),
19940                       gen_int_mode (0xb9, QImode));
19941       emit_move_insn (gen_rtx_MEM (SImode, plus_constant (tramp, 1)), cxt);
19942       emit_move_insn (gen_rtx_MEM (QImode, plus_constant (tramp, 5)),
19943                       gen_int_mode (0xe9, QImode));
19944       emit_move_insn (gen_rtx_MEM (SImode, plus_constant (tramp, 6)), disp);
19945     }
19946   else
19947     {
19948       int offset = 0;
19949       /* Try to load address using shorter movl instead of movabs.
19950          We may want to support movq for kernel mode, but kernel does not use
19951          trampolines at the moment.  */
19952       if (x86_64_zext_immediate_operand (fnaddr, VOIDmode))
19953         {
19954           fnaddr = copy_to_mode_reg (DImode, fnaddr);
19955           emit_move_insn (gen_rtx_MEM (HImode, plus_constant (tramp, offset)),
19956                           gen_int_mode (0xbb41, HImode));
19957           emit_move_insn (gen_rtx_MEM (SImode, plus_constant (tramp, offset + 2)),
19958                           gen_lowpart (SImode, fnaddr));
19959           offset += 6;
19960         }
19961       else
19962         {
19963           emit_move_insn (gen_rtx_MEM (HImode, plus_constant (tramp, offset)),
19964                           gen_int_mode (0xbb49, HImode));
19965           emit_move_insn (gen_rtx_MEM (DImode, plus_constant (tramp, offset + 2)),
19966                           fnaddr);
19967           offset += 10;
19968         }
19969       /* Load static chain using movabs to r10.  */
19970       emit_move_insn (gen_rtx_MEM (HImode, plus_constant (tramp, offset)),
19971                       gen_int_mode (0xba49, HImode));
19972       emit_move_insn (gen_rtx_MEM (DImode, plus_constant (tramp, offset + 2)),
19973                       cxt);
19974       offset += 10;
19975       /* Jump to the r11 */
19976       emit_move_insn (gen_rtx_MEM (HImode, plus_constant (tramp, offset)),
19977                       gen_int_mode (0xff49, HImode));
19978       emit_move_insn (gen_rtx_MEM (QImode, plus_constant (tramp, offset+2)),
19979                       gen_int_mode (0xe3, QImode));
19980       offset += 3;
19981       gcc_assert (offset <= TRAMPOLINE_SIZE);
19982     }
19983
19984 #ifdef ENABLE_EXECUTE_STACK
19985   emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__enable_execute_stack"),
19986                      LCT_NORMAL, VOIDmode, 1, tramp, Pmode);
19987 #endif
19988 }
19989 \f
19990 /* Codes for all the SSE/MMX builtins.  */
19991 enum ix86_builtins
19992 {
19993   IX86_BUILTIN_ADDPS,
19994   IX86_BUILTIN_ADDSS,
19995   IX86_BUILTIN_DIVPS,
19996   IX86_BUILTIN_DIVSS,
19997   IX86_BUILTIN_MULPS,
19998   IX86_BUILTIN_MULSS,
19999   IX86_BUILTIN_SUBPS,
20000   IX86_BUILTIN_SUBSS,
20001
20002   IX86_BUILTIN_CMPEQPS,
20003   IX86_BUILTIN_CMPLTPS,
20004   IX86_BUILTIN_CMPLEPS,
20005   IX86_BUILTIN_CMPGTPS,
20006   IX86_BUILTIN_CMPGEPS,
20007   IX86_BUILTIN_CMPNEQPS,
20008   IX86_BUILTIN_CMPNLTPS,
20009   IX86_BUILTIN_CMPNLEPS,
20010   IX86_BUILTIN_CMPNGTPS,
20011   IX86_BUILTIN_CMPNGEPS,
20012   IX86_BUILTIN_CMPORDPS,
20013   IX86_BUILTIN_CMPUNORDPS,
20014   IX86_BUILTIN_CMPEQSS,
20015   IX86_BUILTIN_CMPLTSS,
20016   IX86_BUILTIN_CMPLESS,
20017   IX86_BUILTIN_CMPNEQSS,
20018   IX86_BUILTIN_CMPNLTSS,
20019   IX86_BUILTIN_CMPNLESS,
20020   IX86_BUILTIN_CMPNGTSS,
20021   IX86_BUILTIN_CMPNGESS,
20022   IX86_BUILTIN_CMPORDSS,
20023   IX86_BUILTIN_CMPUNORDSS,
20024
20025   IX86_BUILTIN_COMIEQSS,
20026   IX86_BUILTIN_COMILTSS,
20027   IX86_BUILTIN_COMILESS,
20028   IX86_BUILTIN_COMIGTSS,
20029   IX86_BUILTIN_COMIGESS,
20030   IX86_BUILTIN_COMINEQSS,
20031   IX86_BUILTIN_UCOMIEQSS,
20032   IX86_BUILTIN_UCOMILTSS,
20033   IX86_BUILTIN_UCOMILESS,
20034   IX86_BUILTIN_UCOMIGTSS,
20035   IX86_BUILTIN_UCOMIGESS,
20036   IX86_BUILTIN_UCOMINEQSS,
20037
20038   IX86_BUILTIN_CVTPI2PS,
20039   IX86_BUILTIN_CVTPS2PI,
20040   IX86_BUILTIN_CVTSI2SS,
20041   IX86_BUILTIN_CVTSI642SS,
20042   IX86_BUILTIN_CVTSS2SI,
20043   IX86_BUILTIN_CVTSS2SI64,
20044   IX86_BUILTIN_CVTTPS2PI,
20045   IX86_BUILTIN_CVTTSS2SI,
20046   IX86_BUILTIN_CVTTSS2SI64,
20047
20048   IX86_BUILTIN_MAXPS,
20049   IX86_BUILTIN_MAXSS,
20050   IX86_BUILTIN_MINPS,
20051   IX86_BUILTIN_MINSS,
20052
20053   IX86_BUILTIN_LOADUPS,
20054   IX86_BUILTIN_STOREUPS,
20055   IX86_BUILTIN_MOVSS,
20056
20057   IX86_BUILTIN_MOVHLPS,
20058   IX86_BUILTIN_MOVLHPS,
20059   IX86_BUILTIN_LOADHPS,
20060   IX86_BUILTIN_LOADLPS,
20061   IX86_BUILTIN_STOREHPS,
20062   IX86_BUILTIN_STORELPS,
20063
20064   IX86_BUILTIN_MASKMOVQ,
20065   IX86_BUILTIN_MOVMSKPS,
20066   IX86_BUILTIN_PMOVMSKB,
20067
20068   IX86_BUILTIN_MOVNTPS,
20069   IX86_BUILTIN_MOVNTQ,
20070
20071   IX86_BUILTIN_LOADDQU,
20072   IX86_BUILTIN_STOREDQU,
20073
20074   IX86_BUILTIN_PACKSSWB,
20075   IX86_BUILTIN_PACKSSDW,
20076   IX86_BUILTIN_PACKUSWB,
20077
20078   IX86_BUILTIN_PADDB,
20079   IX86_BUILTIN_PADDW,
20080   IX86_BUILTIN_PADDD,
20081   IX86_BUILTIN_PADDQ,
20082   IX86_BUILTIN_PADDSB,
20083   IX86_BUILTIN_PADDSW,
20084   IX86_BUILTIN_PADDUSB,
20085   IX86_BUILTIN_PADDUSW,
20086   IX86_BUILTIN_PSUBB,
20087   IX86_BUILTIN_PSUBW,
20088   IX86_BUILTIN_PSUBD,
20089   IX86_BUILTIN_PSUBQ,
20090   IX86_BUILTIN_PSUBSB,
20091   IX86_BUILTIN_PSUBSW,
20092   IX86_BUILTIN_PSUBUSB,
20093   IX86_BUILTIN_PSUBUSW,
20094
20095   IX86_BUILTIN_PAND,
20096   IX86_BUILTIN_PANDN,
20097   IX86_BUILTIN_POR,
20098   IX86_BUILTIN_PXOR,
20099
20100   IX86_BUILTIN_PAVGB,
20101   IX86_BUILTIN_PAVGW,
20102
20103   IX86_BUILTIN_PCMPEQB,
20104   IX86_BUILTIN_PCMPEQW,
20105   IX86_BUILTIN_PCMPEQD,
20106   IX86_BUILTIN_PCMPGTB,
20107   IX86_BUILTIN_PCMPGTW,
20108   IX86_BUILTIN_PCMPGTD,
20109
20110   IX86_BUILTIN_PMADDWD,
20111
20112   IX86_BUILTIN_PMAXSW,
20113   IX86_BUILTIN_PMAXUB,
20114   IX86_BUILTIN_PMINSW,
20115   IX86_BUILTIN_PMINUB,
20116
20117   IX86_BUILTIN_PMULHUW,
20118   IX86_BUILTIN_PMULHW,
20119   IX86_BUILTIN_PMULLW,
20120
20121   IX86_BUILTIN_PSADBW,
20122   IX86_BUILTIN_PSHUFW,
20123
20124   IX86_BUILTIN_PSLLW,
20125   IX86_BUILTIN_PSLLD,
20126   IX86_BUILTIN_PSLLQ,
20127   IX86_BUILTIN_PSRAW,
20128   IX86_BUILTIN_PSRAD,
20129   IX86_BUILTIN_PSRLW,
20130   IX86_BUILTIN_PSRLD,
20131   IX86_BUILTIN_PSRLQ,
20132   IX86_BUILTIN_PSLLWI,
20133   IX86_BUILTIN_PSLLDI,
20134   IX86_BUILTIN_PSLLQI,
20135   IX86_BUILTIN_PSRAWI,
20136   IX86_BUILTIN_PSRADI,
20137   IX86_BUILTIN_PSRLWI,
20138   IX86_BUILTIN_PSRLDI,
20139   IX86_BUILTIN_PSRLQI,
20140
20141   IX86_BUILTIN_PUNPCKHBW,
20142   IX86_BUILTIN_PUNPCKHWD,
20143   IX86_BUILTIN_PUNPCKHDQ,
20144   IX86_BUILTIN_PUNPCKLBW,
20145   IX86_BUILTIN_PUNPCKLWD,
20146   IX86_BUILTIN_PUNPCKLDQ,
20147
20148   IX86_BUILTIN_SHUFPS,
20149
20150   IX86_BUILTIN_RCPPS,
20151   IX86_BUILTIN_RCPSS,
20152   IX86_BUILTIN_RSQRTPS,
20153   IX86_BUILTIN_RSQRTPS_NR,
20154   IX86_BUILTIN_RSQRTSS,
20155   IX86_BUILTIN_RSQRTF,
20156   IX86_BUILTIN_SQRTPS,
20157   IX86_BUILTIN_SQRTPS_NR,
20158   IX86_BUILTIN_SQRTSS,
20159
20160   IX86_BUILTIN_UNPCKHPS,
20161   IX86_BUILTIN_UNPCKLPS,
20162
20163   IX86_BUILTIN_ANDPS,
20164   IX86_BUILTIN_ANDNPS,
20165   IX86_BUILTIN_ORPS,
20166   IX86_BUILTIN_XORPS,
20167
20168   IX86_BUILTIN_EMMS,
20169   IX86_BUILTIN_LDMXCSR,
20170   IX86_BUILTIN_STMXCSR,
20171   IX86_BUILTIN_SFENCE,
20172
20173   /* 3DNow! Original */
20174   IX86_BUILTIN_FEMMS,
20175   IX86_BUILTIN_PAVGUSB,
20176   IX86_BUILTIN_PF2ID,
20177   IX86_BUILTIN_PFACC,
20178   IX86_BUILTIN_PFADD,
20179   IX86_BUILTIN_PFCMPEQ,
20180   IX86_BUILTIN_PFCMPGE,
20181   IX86_BUILTIN_PFCMPGT,
20182   IX86_BUILTIN_PFMAX,
20183   IX86_BUILTIN_PFMIN,
20184   IX86_BUILTIN_PFMUL,
20185   IX86_BUILTIN_PFRCP,
20186   IX86_BUILTIN_PFRCPIT1,
20187   IX86_BUILTIN_PFRCPIT2,
20188   IX86_BUILTIN_PFRSQIT1,
20189   IX86_BUILTIN_PFRSQRT,
20190   IX86_BUILTIN_PFSUB,
20191   IX86_BUILTIN_PFSUBR,
20192   IX86_BUILTIN_PI2FD,
20193   IX86_BUILTIN_PMULHRW,
20194
20195   /* 3DNow! Athlon Extensions */
20196   IX86_BUILTIN_PF2IW,
20197   IX86_BUILTIN_PFNACC,
20198   IX86_BUILTIN_PFPNACC,
20199   IX86_BUILTIN_PI2FW,
20200   IX86_BUILTIN_PSWAPDSI,
20201   IX86_BUILTIN_PSWAPDSF,
20202
20203   /* SSE2 */
20204   IX86_BUILTIN_ADDPD,
20205   IX86_BUILTIN_ADDSD,
20206   IX86_BUILTIN_DIVPD,
20207   IX86_BUILTIN_DIVSD,
20208   IX86_BUILTIN_MULPD,
20209   IX86_BUILTIN_MULSD,
20210   IX86_BUILTIN_SUBPD,
20211   IX86_BUILTIN_SUBSD,
20212
20213   IX86_BUILTIN_CMPEQPD,
20214   IX86_BUILTIN_CMPLTPD,
20215   IX86_BUILTIN_CMPLEPD,
20216   IX86_BUILTIN_CMPGTPD,
20217   IX86_BUILTIN_CMPGEPD,
20218   IX86_BUILTIN_CMPNEQPD,
20219   IX86_BUILTIN_CMPNLTPD,
20220   IX86_BUILTIN_CMPNLEPD,
20221   IX86_BUILTIN_CMPNGTPD,
20222   IX86_BUILTIN_CMPNGEPD,
20223   IX86_BUILTIN_CMPORDPD,
20224   IX86_BUILTIN_CMPUNORDPD,
20225   IX86_BUILTIN_CMPEQSD,
20226   IX86_BUILTIN_CMPLTSD,
20227   IX86_BUILTIN_CMPLESD,
20228   IX86_BUILTIN_CMPNEQSD,
20229   IX86_BUILTIN_CMPNLTSD,
20230   IX86_BUILTIN_CMPNLESD,
20231   IX86_BUILTIN_CMPORDSD,
20232   IX86_BUILTIN_CMPUNORDSD,
20233
20234   IX86_BUILTIN_COMIEQSD,
20235   IX86_BUILTIN_COMILTSD,
20236   IX86_BUILTIN_COMILESD,
20237   IX86_BUILTIN_COMIGTSD,
20238   IX86_BUILTIN_COMIGESD,
20239   IX86_BUILTIN_COMINEQSD,
20240   IX86_BUILTIN_UCOMIEQSD,
20241   IX86_BUILTIN_UCOMILTSD,
20242   IX86_BUILTIN_UCOMILESD,
20243   IX86_BUILTIN_UCOMIGTSD,
20244   IX86_BUILTIN_UCOMIGESD,
20245   IX86_BUILTIN_UCOMINEQSD,
20246
20247   IX86_BUILTIN_MAXPD,
20248   IX86_BUILTIN_MAXSD,
20249   IX86_BUILTIN_MINPD,
20250   IX86_BUILTIN_MINSD,
20251
20252   IX86_BUILTIN_ANDPD,
20253   IX86_BUILTIN_ANDNPD,
20254   IX86_BUILTIN_ORPD,
20255   IX86_BUILTIN_XORPD,
20256
20257   IX86_BUILTIN_SQRTPD,
20258   IX86_BUILTIN_SQRTSD,
20259
20260   IX86_BUILTIN_UNPCKHPD,
20261   IX86_BUILTIN_UNPCKLPD,
20262
20263   IX86_BUILTIN_SHUFPD,
20264
20265   IX86_BUILTIN_LOADUPD,
20266   IX86_BUILTIN_STOREUPD,
20267   IX86_BUILTIN_MOVSD,
20268
20269   IX86_BUILTIN_LOADHPD,
20270   IX86_BUILTIN_LOADLPD,
20271
20272   IX86_BUILTIN_CVTDQ2PD,
20273   IX86_BUILTIN_CVTDQ2PS,
20274
20275   IX86_BUILTIN_CVTPD2DQ,
20276   IX86_BUILTIN_CVTPD2PI,
20277   IX86_BUILTIN_CVTPD2PS,
20278   IX86_BUILTIN_CVTTPD2DQ,
20279   IX86_BUILTIN_CVTTPD2PI,
20280
20281   IX86_BUILTIN_CVTPI2PD,
20282   IX86_BUILTIN_CVTSI2SD,
20283   IX86_BUILTIN_CVTSI642SD,
20284
20285   IX86_BUILTIN_CVTSD2SI,
20286   IX86_BUILTIN_CVTSD2SI64,
20287   IX86_BUILTIN_CVTSD2SS,
20288   IX86_BUILTIN_CVTSS2SD,
20289   IX86_BUILTIN_CVTTSD2SI,
20290   IX86_BUILTIN_CVTTSD2SI64,
20291
20292   IX86_BUILTIN_CVTPS2DQ,
20293   IX86_BUILTIN_CVTPS2PD,
20294   IX86_BUILTIN_CVTTPS2DQ,
20295
20296   IX86_BUILTIN_MOVNTI,
20297   IX86_BUILTIN_MOVNTPD,
20298   IX86_BUILTIN_MOVNTDQ,
20299
20300   IX86_BUILTIN_MOVQ128,
20301
20302   /* SSE2 MMX */
20303   IX86_BUILTIN_MASKMOVDQU,
20304   IX86_BUILTIN_MOVMSKPD,
20305   IX86_BUILTIN_PMOVMSKB128,
20306
20307   IX86_BUILTIN_PACKSSWB128,
20308   IX86_BUILTIN_PACKSSDW128,
20309   IX86_BUILTIN_PACKUSWB128,
20310
20311   IX86_BUILTIN_PADDB128,
20312   IX86_BUILTIN_PADDW128,
20313   IX86_BUILTIN_PADDD128,
20314   IX86_BUILTIN_PADDQ128,
20315   IX86_BUILTIN_PADDSB128,
20316   IX86_BUILTIN_PADDSW128,
20317   IX86_BUILTIN_PADDUSB128,
20318   IX86_BUILTIN_PADDUSW128,
20319   IX86_BUILTIN_PSUBB128,
20320   IX86_BUILTIN_PSUBW128,
20321   IX86_BUILTIN_PSUBD128,
20322   IX86_BUILTIN_PSUBQ128,
20323   IX86_BUILTIN_PSUBSB128,
20324   IX86_BUILTIN_PSUBSW128,
20325   IX86_BUILTIN_PSUBUSB128,
20326   IX86_BUILTIN_PSUBUSW128,
20327
20328   IX86_BUILTIN_PAND128,
20329   IX86_BUILTIN_PANDN128,
20330   IX86_BUILTIN_POR128,
20331   IX86_BUILTIN_PXOR128,
20332
20333   IX86_BUILTIN_PAVGB128,
20334   IX86_BUILTIN_PAVGW128,
20335
20336   IX86_BUILTIN_PCMPEQB128,
20337   IX86_BUILTIN_PCMPEQW128,
20338   IX86_BUILTIN_PCMPEQD128,
20339   IX86_BUILTIN_PCMPGTB128,
20340   IX86_BUILTIN_PCMPGTW128,
20341   IX86_BUILTIN_PCMPGTD128,
20342
20343   IX86_BUILTIN_PMADDWD128,
20344
20345   IX86_BUILTIN_PMAXSW128,
20346   IX86_BUILTIN_PMAXUB128,
20347   IX86_BUILTIN_PMINSW128,
20348   IX86_BUILTIN_PMINUB128,
20349
20350   IX86_BUILTIN_PMULUDQ,
20351   IX86_BUILTIN_PMULUDQ128,
20352   IX86_BUILTIN_PMULHUW128,
20353   IX86_BUILTIN_PMULHW128,
20354   IX86_BUILTIN_PMULLW128,
20355
20356   IX86_BUILTIN_PSADBW128,
20357   IX86_BUILTIN_PSHUFHW,
20358   IX86_BUILTIN_PSHUFLW,
20359   IX86_BUILTIN_PSHUFD,
20360
20361   IX86_BUILTIN_PSLLDQI128,
20362   IX86_BUILTIN_PSLLWI128,
20363   IX86_BUILTIN_PSLLDI128,
20364   IX86_BUILTIN_PSLLQI128,
20365   IX86_BUILTIN_PSRAWI128,
20366   IX86_BUILTIN_PSRADI128,
20367   IX86_BUILTIN_PSRLDQI128,
20368   IX86_BUILTIN_PSRLWI128,
20369   IX86_BUILTIN_PSRLDI128,
20370   IX86_BUILTIN_PSRLQI128,
20371
20372   IX86_BUILTIN_PSLLDQ128,
20373   IX86_BUILTIN_PSLLW128,
20374   IX86_BUILTIN_PSLLD128,
20375   IX86_BUILTIN_PSLLQ128,
20376   IX86_BUILTIN_PSRAW128,
20377   IX86_BUILTIN_PSRAD128,
20378   IX86_BUILTIN_PSRLW128,
20379   IX86_BUILTIN_PSRLD128,
20380   IX86_BUILTIN_PSRLQ128,
20381
20382   IX86_BUILTIN_PUNPCKHBW128,
20383   IX86_BUILTIN_PUNPCKHWD128,
20384   IX86_BUILTIN_PUNPCKHDQ128,
20385   IX86_BUILTIN_PUNPCKHQDQ128,
20386   IX86_BUILTIN_PUNPCKLBW128,
20387   IX86_BUILTIN_PUNPCKLWD128,
20388   IX86_BUILTIN_PUNPCKLDQ128,
20389   IX86_BUILTIN_PUNPCKLQDQ128,
20390
20391   IX86_BUILTIN_CLFLUSH,
20392   IX86_BUILTIN_MFENCE,
20393   IX86_BUILTIN_LFENCE,
20394
20395   /* SSE3.  */
20396   IX86_BUILTIN_ADDSUBPS,
20397   IX86_BUILTIN_HADDPS,
20398   IX86_BUILTIN_HSUBPS,
20399   IX86_BUILTIN_MOVSHDUP,
20400   IX86_BUILTIN_MOVSLDUP,
20401   IX86_BUILTIN_ADDSUBPD,
20402   IX86_BUILTIN_HADDPD,
20403   IX86_BUILTIN_HSUBPD,
20404   IX86_BUILTIN_LDDQU,
20405
20406   IX86_BUILTIN_MONITOR,
20407   IX86_BUILTIN_MWAIT,
20408
20409   /* SSSE3.  */
20410   IX86_BUILTIN_PHADDW,
20411   IX86_BUILTIN_PHADDD,
20412   IX86_BUILTIN_PHADDSW,
20413   IX86_BUILTIN_PHSUBW,
20414   IX86_BUILTIN_PHSUBD,
20415   IX86_BUILTIN_PHSUBSW,
20416   IX86_BUILTIN_PMADDUBSW,
20417   IX86_BUILTIN_PMULHRSW,
20418   IX86_BUILTIN_PSHUFB,
20419   IX86_BUILTIN_PSIGNB,
20420   IX86_BUILTIN_PSIGNW,
20421   IX86_BUILTIN_PSIGND,
20422   IX86_BUILTIN_PALIGNR,
20423   IX86_BUILTIN_PABSB,
20424   IX86_BUILTIN_PABSW,
20425   IX86_BUILTIN_PABSD,
20426
20427   IX86_BUILTIN_PHADDW128,
20428   IX86_BUILTIN_PHADDD128,
20429   IX86_BUILTIN_PHADDSW128,
20430   IX86_BUILTIN_PHSUBW128,
20431   IX86_BUILTIN_PHSUBD128,
20432   IX86_BUILTIN_PHSUBSW128,
20433   IX86_BUILTIN_PMADDUBSW128,
20434   IX86_BUILTIN_PMULHRSW128,
20435   IX86_BUILTIN_PSHUFB128,
20436   IX86_BUILTIN_PSIGNB128,
20437   IX86_BUILTIN_PSIGNW128,
20438   IX86_BUILTIN_PSIGND128,
20439   IX86_BUILTIN_PALIGNR128,
20440   IX86_BUILTIN_PABSB128,
20441   IX86_BUILTIN_PABSW128,
20442   IX86_BUILTIN_PABSD128,
20443
20444   /* AMDFAM10 - SSE4A New Instructions.  */
20445   IX86_BUILTIN_MOVNTSD,
20446   IX86_BUILTIN_MOVNTSS,
20447   IX86_BUILTIN_EXTRQI,
20448   IX86_BUILTIN_EXTRQ,
20449   IX86_BUILTIN_INSERTQI,
20450   IX86_BUILTIN_INSERTQ,
20451
20452   /* SSE4.1.  */
20453   IX86_BUILTIN_BLENDPD,
20454   IX86_BUILTIN_BLENDPS,
20455   IX86_BUILTIN_BLENDVPD,
20456   IX86_BUILTIN_BLENDVPS,
20457   IX86_BUILTIN_PBLENDVB128,
20458   IX86_BUILTIN_PBLENDW128,
20459
20460   IX86_BUILTIN_DPPD,
20461   IX86_BUILTIN_DPPS,
20462
20463   IX86_BUILTIN_INSERTPS128,
20464
20465   IX86_BUILTIN_MOVNTDQA,
20466   IX86_BUILTIN_MPSADBW128,
20467   IX86_BUILTIN_PACKUSDW128,
20468   IX86_BUILTIN_PCMPEQQ,
20469   IX86_BUILTIN_PHMINPOSUW128,
20470
20471   IX86_BUILTIN_PMAXSB128,
20472   IX86_BUILTIN_PMAXSD128,
20473   IX86_BUILTIN_PMAXUD128,
20474   IX86_BUILTIN_PMAXUW128,
20475
20476   IX86_BUILTIN_PMINSB128,
20477   IX86_BUILTIN_PMINSD128,
20478   IX86_BUILTIN_PMINUD128,
20479   IX86_BUILTIN_PMINUW128,
20480
20481   IX86_BUILTIN_PMOVSXBW128,
20482   IX86_BUILTIN_PMOVSXBD128,
20483   IX86_BUILTIN_PMOVSXBQ128,
20484   IX86_BUILTIN_PMOVSXWD128,
20485   IX86_BUILTIN_PMOVSXWQ128,
20486   IX86_BUILTIN_PMOVSXDQ128,
20487
20488   IX86_BUILTIN_PMOVZXBW128,
20489   IX86_BUILTIN_PMOVZXBD128,
20490   IX86_BUILTIN_PMOVZXBQ128,
20491   IX86_BUILTIN_PMOVZXWD128,
20492   IX86_BUILTIN_PMOVZXWQ128,
20493   IX86_BUILTIN_PMOVZXDQ128,
20494
20495   IX86_BUILTIN_PMULDQ128,
20496   IX86_BUILTIN_PMULLD128,
20497
20498   IX86_BUILTIN_ROUNDPD,
20499   IX86_BUILTIN_ROUNDPS,
20500   IX86_BUILTIN_ROUNDSD,
20501   IX86_BUILTIN_ROUNDSS,
20502
20503   IX86_BUILTIN_PTESTZ,
20504   IX86_BUILTIN_PTESTC,
20505   IX86_BUILTIN_PTESTNZC,
20506
20507   IX86_BUILTIN_VEC_INIT_V2SI,
20508   IX86_BUILTIN_VEC_INIT_V4HI,
20509   IX86_BUILTIN_VEC_INIT_V8QI,
20510   IX86_BUILTIN_VEC_EXT_V2DF,
20511   IX86_BUILTIN_VEC_EXT_V2DI,
20512   IX86_BUILTIN_VEC_EXT_V4SF,
20513   IX86_BUILTIN_VEC_EXT_V4SI,
20514   IX86_BUILTIN_VEC_EXT_V8HI,
20515   IX86_BUILTIN_VEC_EXT_V2SI,
20516   IX86_BUILTIN_VEC_EXT_V4HI,
20517   IX86_BUILTIN_VEC_EXT_V16QI,
20518   IX86_BUILTIN_VEC_SET_V2DI,
20519   IX86_BUILTIN_VEC_SET_V4SF,
20520   IX86_BUILTIN_VEC_SET_V4SI,
20521   IX86_BUILTIN_VEC_SET_V8HI,
20522   IX86_BUILTIN_VEC_SET_V4HI,
20523   IX86_BUILTIN_VEC_SET_V16QI,
20524
20525   IX86_BUILTIN_VEC_PACK_SFIX,
20526
20527   /* SSE4.2.  */
20528   IX86_BUILTIN_CRC32QI,
20529   IX86_BUILTIN_CRC32HI,
20530   IX86_BUILTIN_CRC32SI,
20531   IX86_BUILTIN_CRC32DI,
20532
20533   IX86_BUILTIN_PCMPESTRI128,
20534   IX86_BUILTIN_PCMPESTRM128,
20535   IX86_BUILTIN_PCMPESTRA128,
20536   IX86_BUILTIN_PCMPESTRC128,
20537   IX86_BUILTIN_PCMPESTRO128,
20538   IX86_BUILTIN_PCMPESTRS128,
20539   IX86_BUILTIN_PCMPESTRZ128,
20540   IX86_BUILTIN_PCMPISTRI128,
20541   IX86_BUILTIN_PCMPISTRM128,
20542   IX86_BUILTIN_PCMPISTRA128,
20543   IX86_BUILTIN_PCMPISTRC128,
20544   IX86_BUILTIN_PCMPISTRO128,
20545   IX86_BUILTIN_PCMPISTRS128,
20546   IX86_BUILTIN_PCMPISTRZ128,
20547
20548   IX86_BUILTIN_PCMPGTQ,
20549
20550   /* AES instructions */
20551   IX86_BUILTIN_AESENC128,
20552   IX86_BUILTIN_AESENCLAST128,
20553   IX86_BUILTIN_AESDEC128,
20554   IX86_BUILTIN_AESDECLAST128,
20555   IX86_BUILTIN_AESIMC128,
20556   IX86_BUILTIN_AESKEYGENASSIST128,
20557
20558   /* PCLMUL instruction */
20559   IX86_BUILTIN_PCLMULQDQ128,
20560
20561   /* AVX */
20562   IX86_BUILTIN_ADDPD256,
20563   IX86_BUILTIN_ADDPS256,
20564   IX86_BUILTIN_ADDSUBPD256,
20565   IX86_BUILTIN_ADDSUBPS256,
20566   IX86_BUILTIN_ANDPD256,
20567   IX86_BUILTIN_ANDPS256,
20568   IX86_BUILTIN_ANDNPD256,
20569   IX86_BUILTIN_ANDNPS256,
20570   IX86_BUILTIN_BLENDPD256,
20571   IX86_BUILTIN_BLENDPS256,
20572   IX86_BUILTIN_BLENDVPD256,
20573   IX86_BUILTIN_BLENDVPS256,
20574   IX86_BUILTIN_DIVPD256,
20575   IX86_BUILTIN_DIVPS256,
20576   IX86_BUILTIN_DPPS256,
20577   IX86_BUILTIN_HADDPD256,
20578   IX86_BUILTIN_HADDPS256,
20579   IX86_BUILTIN_HSUBPD256,
20580   IX86_BUILTIN_HSUBPS256,
20581   IX86_BUILTIN_MAXPD256,
20582   IX86_BUILTIN_MAXPS256,
20583   IX86_BUILTIN_MINPD256,
20584   IX86_BUILTIN_MINPS256,
20585   IX86_BUILTIN_MULPD256,
20586   IX86_BUILTIN_MULPS256,
20587   IX86_BUILTIN_ORPD256,
20588   IX86_BUILTIN_ORPS256,
20589   IX86_BUILTIN_SHUFPD256,
20590   IX86_BUILTIN_SHUFPS256,
20591   IX86_BUILTIN_SUBPD256,
20592   IX86_BUILTIN_SUBPS256,
20593   IX86_BUILTIN_XORPD256,
20594   IX86_BUILTIN_XORPS256,
20595   IX86_BUILTIN_CMPSD,
20596   IX86_BUILTIN_CMPSS,
20597   IX86_BUILTIN_CMPPD,
20598   IX86_BUILTIN_CMPPS,
20599   IX86_BUILTIN_CMPPD256,
20600   IX86_BUILTIN_CMPPS256,
20601   IX86_BUILTIN_CVTDQ2PD256,
20602   IX86_BUILTIN_CVTDQ2PS256,
20603   IX86_BUILTIN_CVTPD2PS256,
20604   IX86_BUILTIN_CVTPS2DQ256,
20605   IX86_BUILTIN_CVTPS2PD256,
20606   IX86_BUILTIN_CVTTPD2DQ256,
20607   IX86_BUILTIN_CVTPD2DQ256,
20608   IX86_BUILTIN_CVTTPS2DQ256,
20609   IX86_BUILTIN_EXTRACTF128PD256,
20610   IX86_BUILTIN_EXTRACTF128PS256,
20611   IX86_BUILTIN_EXTRACTF128SI256,
20612   IX86_BUILTIN_VZEROALL,
20613   IX86_BUILTIN_VZEROUPPER,
20614   IX86_BUILTIN_VZEROUPPER_REX64,
20615   IX86_BUILTIN_VPERMILVARPD,
20616   IX86_BUILTIN_VPERMILVARPS,
20617   IX86_BUILTIN_VPERMILVARPD256,
20618   IX86_BUILTIN_VPERMILVARPS256,
20619   IX86_BUILTIN_VPERMILPD,
20620   IX86_BUILTIN_VPERMILPS,
20621   IX86_BUILTIN_VPERMILPD256,
20622   IX86_BUILTIN_VPERMILPS256,
20623   IX86_BUILTIN_VPERM2F128PD256,
20624   IX86_BUILTIN_VPERM2F128PS256,
20625   IX86_BUILTIN_VPERM2F128SI256,
20626   IX86_BUILTIN_VBROADCASTSS,
20627   IX86_BUILTIN_VBROADCASTSD256,
20628   IX86_BUILTIN_VBROADCASTSS256,
20629   IX86_BUILTIN_VBROADCASTPD256,
20630   IX86_BUILTIN_VBROADCASTPS256,
20631   IX86_BUILTIN_VINSERTF128PD256,
20632   IX86_BUILTIN_VINSERTF128PS256,
20633   IX86_BUILTIN_VINSERTF128SI256,
20634   IX86_BUILTIN_LOADUPD256,
20635   IX86_BUILTIN_LOADUPS256,
20636   IX86_BUILTIN_STOREUPD256,
20637   IX86_BUILTIN_STOREUPS256,
20638   IX86_BUILTIN_LDDQU256,
20639   IX86_BUILTIN_MOVNTDQ256,
20640   IX86_BUILTIN_MOVNTPD256,
20641   IX86_BUILTIN_MOVNTPS256,
20642   IX86_BUILTIN_LOADDQU256,
20643   IX86_BUILTIN_STOREDQU256,
20644   IX86_BUILTIN_MASKLOADPD,
20645   IX86_BUILTIN_MASKLOADPS,
20646   IX86_BUILTIN_MASKSTOREPD,
20647   IX86_BUILTIN_MASKSTOREPS,
20648   IX86_BUILTIN_MASKLOADPD256,
20649   IX86_BUILTIN_MASKLOADPS256,
20650   IX86_BUILTIN_MASKSTOREPD256,
20651   IX86_BUILTIN_MASKSTOREPS256,
20652   IX86_BUILTIN_MOVSHDUP256,
20653   IX86_BUILTIN_MOVSLDUP256,
20654   IX86_BUILTIN_MOVDDUP256,
20655
20656   IX86_BUILTIN_SQRTPD256,
20657   IX86_BUILTIN_SQRTPS256,
20658   IX86_BUILTIN_SQRTPS_NR256,
20659   IX86_BUILTIN_RSQRTPS256,
20660   IX86_BUILTIN_RSQRTPS_NR256,
20661
20662   IX86_BUILTIN_RCPPS256,
20663
20664   IX86_BUILTIN_ROUNDPD256,
20665   IX86_BUILTIN_ROUNDPS256,
20666
20667   IX86_BUILTIN_UNPCKHPD256,
20668   IX86_BUILTIN_UNPCKLPD256,
20669   IX86_BUILTIN_UNPCKHPS256,
20670   IX86_BUILTIN_UNPCKLPS256,
20671
20672   IX86_BUILTIN_SI256_SI,
20673   IX86_BUILTIN_PS256_PS,
20674   IX86_BUILTIN_PD256_PD,
20675   IX86_BUILTIN_SI_SI256,
20676   IX86_BUILTIN_PS_PS256,
20677   IX86_BUILTIN_PD_PD256,
20678
20679   IX86_BUILTIN_VTESTZPD,
20680   IX86_BUILTIN_VTESTCPD,
20681   IX86_BUILTIN_VTESTNZCPD,
20682   IX86_BUILTIN_VTESTZPS,
20683   IX86_BUILTIN_VTESTCPS,
20684   IX86_BUILTIN_VTESTNZCPS,
20685   IX86_BUILTIN_VTESTZPD256,
20686   IX86_BUILTIN_VTESTCPD256,
20687   IX86_BUILTIN_VTESTNZCPD256,
20688   IX86_BUILTIN_VTESTZPS256,
20689   IX86_BUILTIN_VTESTCPS256,
20690   IX86_BUILTIN_VTESTNZCPS256,
20691   IX86_BUILTIN_PTESTZ256,
20692   IX86_BUILTIN_PTESTC256,
20693   IX86_BUILTIN_PTESTNZC256,
20694
20695   IX86_BUILTIN_MOVMSKPD256,
20696   IX86_BUILTIN_MOVMSKPS256,
20697
20698   /* TFmode support builtins.  */
20699   IX86_BUILTIN_INFQ,
20700   IX86_BUILTIN_HUGE_VALQ,
20701   IX86_BUILTIN_FABSQ,
20702   IX86_BUILTIN_COPYSIGNQ,
20703
20704   /* SSE5 instructions */
20705   IX86_BUILTIN_FMADDSS,
20706   IX86_BUILTIN_FMADDSD,
20707   IX86_BUILTIN_FMADDPS,
20708   IX86_BUILTIN_FMADDPD,
20709   IX86_BUILTIN_FMSUBSS,
20710   IX86_BUILTIN_FMSUBSD,
20711   IX86_BUILTIN_FMSUBPS,
20712   IX86_BUILTIN_FMSUBPD,
20713   IX86_BUILTIN_FNMADDSS,
20714   IX86_BUILTIN_FNMADDSD,
20715   IX86_BUILTIN_FNMADDPS,
20716   IX86_BUILTIN_FNMADDPD,
20717   IX86_BUILTIN_FNMSUBSS,
20718   IX86_BUILTIN_FNMSUBSD,
20719   IX86_BUILTIN_FNMSUBPS,
20720   IX86_BUILTIN_FNMSUBPD,
20721   IX86_BUILTIN_PCMOV,
20722   IX86_BUILTIN_PCMOV_V2DI,
20723   IX86_BUILTIN_PCMOV_V4SI,
20724   IX86_BUILTIN_PCMOV_V8HI,
20725   IX86_BUILTIN_PCMOV_V16QI,
20726   IX86_BUILTIN_PCMOV_V4SF,
20727   IX86_BUILTIN_PCMOV_V2DF,
20728   IX86_BUILTIN_PPERM,
20729   IX86_BUILTIN_PERMPS,
20730   IX86_BUILTIN_PERMPD,
20731   IX86_BUILTIN_PMACSSWW,
20732   IX86_BUILTIN_PMACSWW,
20733   IX86_BUILTIN_PMACSSWD,
20734   IX86_BUILTIN_PMACSWD,
20735   IX86_BUILTIN_PMACSSDD,
20736   IX86_BUILTIN_PMACSDD,
20737   IX86_BUILTIN_PMACSSDQL,
20738   IX86_BUILTIN_PMACSSDQH,
20739   IX86_BUILTIN_PMACSDQL,
20740   IX86_BUILTIN_PMACSDQH,
20741   IX86_BUILTIN_PMADCSSWD,
20742   IX86_BUILTIN_PMADCSWD,
20743   IX86_BUILTIN_PHADDBW,
20744   IX86_BUILTIN_PHADDBD,
20745   IX86_BUILTIN_PHADDBQ,
20746   IX86_BUILTIN_PHADDWD,
20747   IX86_BUILTIN_PHADDWQ,
20748   IX86_BUILTIN_PHADDDQ,
20749   IX86_BUILTIN_PHADDUBW,
20750   IX86_BUILTIN_PHADDUBD,
20751   IX86_BUILTIN_PHADDUBQ,
20752   IX86_BUILTIN_PHADDUWD,
20753   IX86_BUILTIN_PHADDUWQ,
20754   IX86_BUILTIN_PHADDUDQ,
20755   IX86_BUILTIN_PHSUBBW,
20756   IX86_BUILTIN_PHSUBWD,
20757   IX86_BUILTIN_PHSUBDQ,
20758   IX86_BUILTIN_PROTB,
20759   IX86_BUILTIN_PROTW,
20760   IX86_BUILTIN_PROTD,
20761   IX86_BUILTIN_PROTQ,
20762   IX86_BUILTIN_PROTB_IMM,
20763   IX86_BUILTIN_PROTW_IMM,
20764   IX86_BUILTIN_PROTD_IMM,
20765   IX86_BUILTIN_PROTQ_IMM,
20766   IX86_BUILTIN_PSHLB,
20767   IX86_BUILTIN_PSHLW,
20768   IX86_BUILTIN_PSHLD,
20769   IX86_BUILTIN_PSHLQ,
20770   IX86_BUILTIN_PSHAB,
20771   IX86_BUILTIN_PSHAW,
20772   IX86_BUILTIN_PSHAD,
20773   IX86_BUILTIN_PSHAQ,
20774   IX86_BUILTIN_FRCZSS,
20775   IX86_BUILTIN_FRCZSD,
20776   IX86_BUILTIN_FRCZPS,
20777   IX86_BUILTIN_FRCZPD,
20778   IX86_BUILTIN_CVTPH2PS,
20779   IX86_BUILTIN_CVTPS2PH,
20780
20781   IX86_BUILTIN_COMEQSS,
20782   IX86_BUILTIN_COMNESS,
20783   IX86_BUILTIN_COMLTSS,
20784   IX86_BUILTIN_COMLESS,
20785   IX86_BUILTIN_COMGTSS,
20786   IX86_BUILTIN_COMGESS,
20787   IX86_BUILTIN_COMUEQSS,
20788   IX86_BUILTIN_COMUNESS,
20789   IX86_BUILTIN_COMULTSS,
20790   IX86_BUILTIN_COMULESS,
20791   IX86_BUILTIN_COMUGTSS,
20792   IX86_BUILTIN_COMUGESS,
20793   IX86_BUILTIN_COMORDSS,
20794   IX86_BUILTIN_COMUNORDSS,
20795   IX86_BUILTIN_COMFALSESS,
20796   IX86_BUILTIN_COMTRUESS,
20797
20798   IX86_BUILTIN_COMEQSD,
20799   IX86_BUILTIN_COMNESD,
20800   IX86_BUILTIN_COMLTSD,
20801   IX86_BUILTIN_COMLESD,
20802   IX86_BUILTIN_COMGTSD,
20803   IX86_BUILTIN_COMGESD,
20804   IX86_BUILTIN_COMUEQSD,
20805   IX86_BUILTIN_COMUNESD,
20806   IX86_BUILTIN_COMULTSD,
20807   IX86_BUILTIN_COMULESD,
20808   IX86_BUILTIN_COMUGTSD,
20809   IX86_BUILTIN_COMUGESD,
20810   IX86_BUILTIN_COMORDSD,
20811   IX86_BUILTIN_COMUNORDSD,
20812   IX86_BUILTIN_COMFALSESD,
20813   IX86_BUILTIN_COMTRUESD,
20814
20815   IX86_BUILTIN_COMEQPS,
20816   IX86_BUILTIN_COMNEPS,
20817   IX86_BUILTIN_COMLTPS,
20818   IX86_BUILTIN_COMLEPS,
20819   IX86_BUILTIN_COMGTPS,
20820   IX86_BUILTIN_COMGEPS,
20821   IX86_BUILTIN_COMUEQPS,
20822   IX86_BUILTIN_COMUNEPS,
20823   IX86_BUILTIN_COMULTPS,
20824   IX86_BUILTIN_COMULEPS,
20825   IX86_BUILTIN_COMUGTPS,
20826   IX86_BUILTIN_COMUGEPS,
20827   IX86_BUILTIN_COMORDPS,
20828   IX86_BUILTIN_COMUNORDPS,
20829   IX86_BUILTIN_COMFALSEPS,
20830   IX86_BUILTIN_COMTRUEPS,
20831
20832   IX86_BUILTIN_COMEQPD,
20833   IX86_BUILTIN_COMNEPD,
20834   IX86_BUILTIN_COMLTPD,
20835   IX86_BUILTIN_COMLEPD,
20836   IX86_BUILTIN_COMGTPD,
20837   IX86_BUILTIN_COMGEPD,
20838   IX86_BUILTIN_COMUEQPD,
20839   IX86_BUILTIN_COMUNEPD,
20840   IX86_BUILTIN_COMULTPD,
20841   IX86_BUILTIN_COMULEPD,
20842   IX86_BUILTIN_COMUGTPD,
20843   IX86_BUILTIN_COMUGEPD,
20844   IX86_BUILTIN_COMORDPD,
20845   IX86_BUILTIN_COMUNORDPD,
20846   IX86_BUILTIN_COMFALSEPD,
20847   IX86_BUILTIN_COMTRUEPD,
20848
20849   IX86_BUILTIN_PCOMEQUB,
20850   IX86_BUILTIN_PCOMNEUB,
20851   IX86_BUILTIN_PCOMLTUB,
20852   IX86_BUILTIN_PCOMLEUB,
20853   IX86_BUILTIN_PCOMGTUB,
20854   IX86_BUILTIN_PCOMGEUB,
20855   IX86_BUILTIN_PCOMFALSEUB,
20856   IX86_BUILTIN_PCOMTRUEUB,
20857   IX86_BUILTIN_PCOMEQUW,
20858   IX86_BUILTIN_PCOMNEUW,
20859   IX86_BUILTIN_PCOMLTUW,
20860   IX86_BUILTIN_PCOMLEUW,
20861   IX86_BUILTIN_PCOMGTUW,
20862   IX86_BUILTIN_PCOMGEUW,
20863   IX86_BUILTIN_PCOMFALSEUW,
20864   IX86_BUILTIN_PCOMTRUEUW,
20865   IX86_BUILTIN_PCOMEQUD,
20866   IX86_BUILTIN_PCOMNEUD,
20867   IX86_BUILTIN_PCOMLTUD,
20868   IX86_BUILTIN_PCOMLEUD,
20869   IX86_BUILTIN_PCOMGTUD,
20870   IX86_BUILTIN_PCOMGEUD,
20871   IX86_BUILTIN_PCOMFALSEUD,
20872   IX86_BUILTIN_PCOMTRUEUD,
20873   IX86_BUILTIN_PCOMEQUQ,
20874   IX86_BUILTIN_PCOMNEUQ,
20875   IX86_BUILTIN_PCOMLTUQ,
20876   IX86_BUILTIN_PCOMLEUQ,
20877   IX86_BUILTIN_PCOMGTUQ,
20878   IX86_BUILTIN_PCOMGEUQ,
20879   IX86_BUILTIN_PCOMFALSEUQ,
20880   IX86_BUILTIN_PCOMTRUEUQ,
20881
20882   IX86_BUILTIN_PCOMEQB,
20883   IX86_BUILTIN_PCOMNEB,
20884   IX86_BUILTIN_PCOMLTB,
20885   IX86_BUILTIN_PCOMLEB,
20886   IX86_BUILTIN_PCOMGTB,
20887   IX86_BUILTIN_PCOMGEB,
20888   IX86_BUILTIN_PCOMFALSEB,
20889   IX86_BUILTIN_PCOMTRUEB,
20890   IX86_BUILTIN_PCOMEQW,
20891   IX86_BUILTIN_PCOMNEW,
20892   IX86_BUILTIN_PCOMLTW,
20893   IX86_BUILTIN_PCOMLEW,
20894   IX86_BUILTIN_PCOMGTW,
20895   IX86_BUILTIN_PCOMGEW,
20896   IX86_BUILTIN_PCOMFALSEW,
20897   IX86_BUILTIN_PCOMTRUEW,
20898   IX86_BUILTIN_PCOMEQD,
20899   IX86_BUILTIN_PCOMNED,
20900   IX86_BUILTIN_PCOMLTD,
20901   IX86_BUILTIN_PCOMLED,
20902   IX86_BUILTIN_PCOMGTD,
20903   IX86_BUILTIN_PCOMGED,
20904   IX86_BUILTIN_PCOMFALSED,
20905   IX86_BUILTIN_PCOMTRUED,
20906   IX86_BUILTIN_PCOMEQQ,
20907   IX86_BUILTIN_PCOMNEQ,
20908   IX86_BUILTIN_PCOMLTQ,
20909   IX86_BUILTIN_PCOMLEQ,
20910   IX86_BUILTIN_PCOMGTQ,
20911   IX86_BUILTIN_PCOMGEQ,
20912   IX86_BUILTIN_PCOMFALSEQ,
20913   IX86_BUILTIN_PCOMTRUEQ,
20914
20915   IX86_BUILTIN_MAX
20916 };
20917
20918 /* Table for the ix86 builtin decls.  */
20919 static GTY(()) tree ix86_builtins[(int) IX86_BUILTIN_MAX];
20920
20921 /* Table of all of the builtin functions that are possible with different ISA's
20922    but are waiting to be built until a function is declared to use that
20923    ISA.  */
20924 struct GTY(()) builtin_isa {
20925   tree type;                    /* builtin type to use in the declaration */
20926   const char *name;             /* function name */
20927   int isa;                      /* isa_flags this builtin is defined for */
20928   bool const_p;                 /* true if the declaration is constant */
20929 };
20930
20931 static GTY(()) struct builtin_isa ix86_builtins_isa[(int) IX86_BUILTIN_MAX];
20932
20933
20934 /* Add an ix86 target builtin function with CODE, NAME and TYPE.  Save the MASK
20935  * of which isa_flags to use in the ix86_builtins_isa array.  Stores the
20936  * function decl in the ix86_builtins array.  Returns the function decl or
20937  * NULL_TREE, if the builtin was not added.
20938  *
20939  * If the front end has a special hook for builtin functions, delay adding
20940  * builtin functions that aren't in the current ISA until the ISA is changed
20941  * with function specific optimization.  Doing so, can save about 300K for the
20942  * default compiler.  When the builtin is expanded, check at that time whether
20943  * it is valid.
20944  *
20945  * If the front end doesn't have a special hook, record all builtins, even if
20946  * it isn't an instruction set in the current ISA in case the user uses
20947  * function specific options for a different ISA, so that we don't get scope
20948  * errors if a builtin is added in the middle of a function scope.  */
20949
20950 static inline tree
20951 def_builtin (int mask, const char *name, tree type, enum ix86_builtins code)
20952 {
20953   tree decl = NULL_TREE;
20954
20955   if (!(mask & OPTION_MASK_ISA_64BIT) || TARGET_64BIT)
20956     {
20957       ix86_builtins_isa[(int) code].isa = mask;
20958
20959       if ((mask & ix86_isa_flags) != 0
20960           || (lang_hooks.builtin_function
20961               == lang_hooks.builtin_function_ext_scope))
20962
20963         {
20964           decl = add_builtin_function (name, type, code, BUILT_IN_MD, NULL,
20965                                        NULL_TREE);
20966           ix86_builtins[(int) code] = decl;
20967           ix86_builtins_isa[(int) code].type = NULL_TREE;
20968         }
20969       else
20970         {
20971           ix86_builtins[(int) code] = NULL_TREE;
20972           ix86_builtins_isa[(int) code].const_p = false;
20973           ix86_builtins_isa[(int) code].type = type;
20974           ix86_builtins_isa[(int) code].name = name;
20975         }
20976     }
20977
20978   return decl;
20979 }
20980
20981 /* Like def_builtin, but also marks the function decl "const".  */
20982
20983 static inline tree
20984 def_builtin_const (int mask, const char *name, tree type,
20985                    enum ix86_builtins code)
20986 {
20987   tree decl = def_builtin (mask, name, type, code);
20988   if (decl)
20989     TREE_READONLY (decl) = 1;
20990   else
20991     ix86_builtins_isa[(int) code].const_p = true;
20992
20993   return decl;
20994 }
20995
20996 /* Add any new builtin functions for a given ISA that may not have been
20997    declared.  This saves a bit of space compared to adding all of the
20998    declarations to the tree, even if we didn't use them.  */
20999
21000 static void
21001 ix86_add_new_builtins (int isa)
21002 {
21003   int i;
21004   tree decl;
21005
21006   for (i = 0; i < (int)IX86_BUILTIN_MAX; i++)
21007     {
21008       if ((ix86_builtins_isa[i].isa & isa) != 0
21009           && ix86_builtins_isa[i].type != NULL_TREE)
21010         {
21011           decl = add_builtin_function_ext_scope (ix86_builtins_isa[i].name,
21012                                                  ix86_builtins_isa[i].type,
21013                                                  i, BUILT_IN_MD, NULL,
21014                                                  NULL_TREE);
21015
21016           ix86_builtins[i] = decl;
21017           ix86_builtins_isa[i].type = NULL_TREE;
21018           if (ix86_builtins_isa[i].const_p)
21019             TREE_READONLY (decl) = 1;
21020         }
21021     }
21022 }
21023
21024 /* Bits for builtin_description.flag.  */
21025
21026 /* Set when we don't support the comparison natively, and should
21027    swap_comparison in order to support it.  */
21028 #define BUILTIN_DESC_SWAP_OPERANDS      1
21029
21030 struct builtin_description
21031 {
21032   const unsigned int mask;
21033   const enum insn_code icode;
21034   const char *const name;
21035   const enum ix86_builtins code;
21036   const enum rtx_code comparison;
21037   const int flag;
21038 };
21039
21040 static const struct builtin_description bdesc_comi[] =
21041 {
21042   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comieq", IX86_BUILTIN_COMIEQSS, UNEQ, 0 },
21043   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comilt", IX86_BUILTIN_COMILTSS, UNLT, 0 },
21044   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comile", IX86_BUILTIN_COMILESS, UNLE, 0 },
21045   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comigt", IX86_BUILTIN_COMIGTSS, GT, 0 },
21046   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comige", IX86_BUILTIN_COMIGESS, GE, 0 },
21047   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comineq", IX86_BUILTIN_COMINEQSS, LTGT, 0 },
21048   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomieq", IX86_BUILTIN_UCOMIEQSS, UNEQ, 0 },
21049   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomilt", IX86_BUILTIN_UCOMILTSS, UNLT, 0 },
21050   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomile", IX86_BUILTIN_UCOMILESS, UNLE, 0 },
21051   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomigt", IX86_BUILTIN_UCOMIGTSS, GT, 0 },
21052   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomige", IX86_BUILTIN_UCOMIGESS, GE, 0 },
21053   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomineq", IX86_BUILTIN_UCOMINEQSS, LTGT, 0 },
21054   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdeq", IX86_BUILTIN_COMIEQSD, UNEQ, 0 },
21055   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdlt", IX86_BUILTIN_COMILTSD, UNLT, 0 },
21056   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdle", IX86_BUILTIN_COMILESD, UNLE, 0 },
21057   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdgt", IX86_BUILTIN_COMIGTSD, GT, 0 },
21058   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdge", IX86_BUILTIN_COMIGESD, GE, 0 },
21059   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdneq", IX86_BUILTIN_COMINEQSD, LTGT, 0 },
21060   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdeq", IX86_BUILTIN_UCOMIEQSD, UNEQ, 0 },
21061   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdlt", IX86_BUILTIN_UCOMILTSD, UNLT, 0 },
21062   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdle", IX86_BUILTIN_UCOMILESD, UNLE, 0 },
21063   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdgt", IX86_BUILTIN_UCOMIGTSD, GT, 0 },
21064   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdge", IX86_BUILTIN_UCOMIGESD, GE, 0 },
21065   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdneq", IX86_BUILTIN_UCOMINEQSD, LTGT, 0 },
21066 };
21067
21068 static const struct builtin_description bdesc_pcmpestr[] =
21069 {
21070   /* SSE4.2 */
21071   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestri128", IX86_BUILTIN_PCMPESTRI128, UNKNOWN, 0 },
21072   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestrm128", IX86_BUILTIN_PCMPESTRM128, UNKNOWN, 0 },
21073   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestria128", IX86_BUILTIN_PCMPESTRA128, UNKNOWN, (int) CCAmode },
21074   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestric128", IX86_BUILTIN_PCMPESTRC128, UNKNOWN, (int) CCCmode },
21075   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestrio128", IX86_BUILTIN_PCMPESTRO128, UNKNOWN, (int) CCOmode },
21076   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestris128", IX86_BUILTIN_PCMPESTRS128, UNKNOWN, (int) CCSmode },
21077   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestriz128", IX86_BUILTIN_PCMPESTRZ128, UNKNOWN, (int) CCZmode },
21078 };
21079
21080 static const struct builtin_description bdesc_pcmpistr[] =
21081 {
21082   /* SSE4.2 */
21083   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistri128", IX86_BUILTIN_PCMPISTRI128, UNKNOWN, 0 },
21084   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistrm128", IX86_BUILTIN_PCMPISTRM128, UNKNOWN, 0 },
21085   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistria128", IX86_BUILTIN_PCMPISTRA128, UNKNOWN, (int) CCAmode },
21086   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistric128", IX86_BUILTIN_PCMPISTRC128, UNKNOWN, (int) CCCmode },
21087   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistrio128", IX86_BUILTIN_PCMPISTRO128, UNKNOWN, (int) CCOmode },
21088   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistris128", IX86_BUILTIN_PCMPISTRS128, UNKNOWN, (int) CCSmode },
21089   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistriz128", IX86_BUILTIN_PCMPISTRZ128, UNKNOWN, (int) CCZmode },
21090 };
21091
21092 /* Special builtin types */
21093 enum ix86_special_builtin_type
21094 {
21095   SPECIAL_FTYPE_UNKNOWN,
21096   VOID_FTYPE_VOID,
21097   V32QI_FTYPE_PCCHAR,
21098   V16QI_FTYPE_PCCHAR,
21099   V8SF_FTYPE_PCV4SF,
21100   V8SF_FTYPE_PCFLOAT,
21101   V4DF_FTYPE_PCV2DF,
21102   V4DF_FTYPE_PCDOUBLE,
21103   V4SF_FTYPE_PCFLOAT,
21104   V2DF_FTYPE_PCDOUBLE,
21105   V8SF_FTYPE_PCV8SF_V8SF,
21106   V4DF_FTYPE_PCV4DF_V4DF,
21107   V4SF_FTYPE_V4SF_PCV2SF,
21108   V4SF_FTYPE_PCV4SF_V4SF,
21109   V2DF_FTYPE_V2DF_PCDOUBLE,
21110   V2DF_FTYPE_PCV2DF_V2DF,
21111   V2DI_FTYPE_PV2DI,
21112   VOID_FTYPE_PV2SF_V4SF,
21113   VOID_FTYPE_PV4DI_V4DI,
21114   VOID_FTYPE_PV2DI_V2DI,
21115   VOID_FTYPE_PCHAR_V32QI,
21116   VOID_FTYPE_PCHAR_V16QI,
21117   VOID_FTYPE_PFLOAT_V8SF,
21118   VOID_FTYPE_PFLOAT_V4SF,
21119   VOID_FTYPE_PDOUBLE_V4DF,
21120   VOID_FTYPE_PDOUBLE_V2DF,
21121   VOID_FTYPE_PDI_DI,
21122   VOID_FTYPE_PINT_INT,
21123   VOID_FTYPE_PV8SF_V8SF_V8SF,
21124   VOID_FTYPE_PV4DF_V4DF_V4DF,
21125   VOID_FTYPE_PV4SF_V4SF_V4SF,
21126   VOID_FTYPE_PV2DF_V2DF_V2DF
21127 };
21128
21129 /* Builtin types */
21130 enum ix86_builtin_type
21131 {
21132   FTYPE_UNKNOWN,
21133   FLOAT128_FTYPE_FLOAT128,
21134   FLOAT_FTYPE_FLOAT,
21135   FLOAT128_FTYPE_FLOAT128_FLOAT128,
21136   INT_FTYPE_V8SF_V8SF_PTEST,
21137   INT_FTYPE_V4DI_V4DI_PTEST,
21138   INT_FTYPE_V4DF_V4DF_PTEST,
21139   INT_FTYPE_V4SF_V4SF_PTEST,
21140   INT_FTYPE_V2DI_V2DI_PTEST,
21141   INT_FTYPE_V2DF_V2DF_PTEST,
21142   INT64_FTYPE_V4SF,
21143   INT64_FTYPE_V2DF,
21144   INT_FTYPE_V16QI,
21145   INT_FTYPE_V8QI,
21146   INT_FTYPE_V8SF,
21147   INT_FTYPE_V4DF,
21148   INT_FTYPE_V4SF,
21149   INT_FTYPE_V2DF,
21150   V16QI_FTYPE_V16QI,
21151   V8SI_FTYPE_V8SF,
21152   V8SI_FTYPE_V4SI,
21153   V8HI_FTYPE_V8HI,
21154   V8HI_FTYPE_V16QI,
21155   V8QI_FTYPE_V8QI,
21156   V8SF_FTYPE_V8SF,
21157   V8SF_FTYPE_V8SI,
21158   V8SF_FTYPE_V4SF,
21159   V4SI_FTYPE_V4SI,
21160   V4SI_FTYPE_V16QI,
21161   V4SI_FTYPE_V8SI,
21162   V4SI_FTYPE_V8HI,
21163   V4SI_FTYPE_V4DF,
21164   V4SI_FTYPE_V4SF,
21165   V4SI_FTYPE_V2DF,
21166   V4HI_FTYPE_V4HI,
21167   V4DF_FTYPE_V4DF,
21168   V4DF_FTYPE_V4SI,
21169   V4DF_FTYPE_V4SF,
21170   V4DF_FTYPE_V2DF,
21171   V4SF_FTYPE_V4DF,
21172   V4SF_FTYPE_V4SF,
21173   V4SF_FTYPE_V4SF_VEC_MERGE,
21174   V4SF_FTYPE_V8SF,
21175   V4SF_FTYPE_V4SI,
21176   V4SF_FTYPE_V2DF,
21177   V2DI_FTYPE_V2DI,
21178   V2DI_FTYPE_V16QI,
21179   V2DI_FTYPE_V8HI,
21180   V2DI_FTYPE_V4SI,
21181   V2DF_FTYPE_V2DF,
21182   V2DF_FTYPE_V2DF_VEC_MERGE,
21183   V2DF_FTYPE_V4SI,
21184   V2DF_FTYPE_V4DF,
21185   V2DF_FTYPE_V4SF,
21186   V2DF_FTYPE_V2SI,
21187   V2SI_FTYPE_V2SI,
21188   V2SI_FTYPE_V4SF,
21189   V2SI_FTYPE_V2SF,
21190   V2SI_FTYPE_V2DF,
21191   V2SF_FTYPE_V2SF,
21192   V2SF_FTYPE_V2SI,
21193   V16QI_FTYPE_V16QI_V16QI,
21194   V16QI_FTYPE_V8HI_V8HI,
21195   V8QI_FTYPE_V8QI_V8QI,
21196   V8QI_FTYPE_V4HI_V4HI,
21197   V8HI_FTYPE_V8HI_V8HI,
21198   V8HI_FTYPE_V8HI_V8HI_COUNT,
21199   V8HI_FTYPE_V16QI_V16QI,
21200   V8HI_FTYPE_V4SI_V4SI,
21201   V8HI_FTYPE_V8HI_SI_COUNT,
21202   V8SF_FTYPE_V8SF_V8SF,
21203   V8SF_FTYPE_V8SF_V8SI,
21204   V4SI_FTYPE_V4SI_V4SI,
21205   V4SI_FTYPE_V4SI_V4SI_COUNT,
21206   V4SI_FTYPE_V8HI_V8HI,
21207   V4SI_FTYPE_V4SF_V4SF,
21208   V4SI_FTYPE_V2DF_V2DF,
21209   V4SI_FTYPE_V4SI_SI_COUNT,
21210   V4HI_FTYPE_V4HI_V4HI,
21211   V4HI_FTYPE_V4HI_V4HI_COUNT,
21212   V4HI_FTYPE_V8QI_V8QI,
21213   V4HI_FTYPE_V2SI_V2SI,
21214   V4HI_FTYPE_V4HI_SI_COUNT,
21215   V4DF_FTYPE_V4DF_V4DF,
21216   V4DF_FTYPE_V4DF_V4DI,
21217   V4SF_FTYPE_V4SF_V4SF,
21218   V4SF_FTYPE_V4SF_V4SF_SWAP,
21219   V4SF_FTYPE_V4SF_V4SI,
21220   V4SF_FTYPE_V4SF_V2SI,
21221   V4SF_FTYPE_V4SF_V2DF,
21222   V4SF_FTYPE_V4SF_DI,
21223   V4SF_FTYPE_V4SF_SI,
21224   V2DI_FTYPE_V2DI_V2DI,
21225   V2DI_FTYPE_V2DI_V2DI_COUNT,
21226   V2DI_FTYPE_V16QI_V16QI,
21227   V2DI_FTYPE_V4SI_V4SI,
21228   V2DI_FTYPE_V2DI_V16QI,
21229   V2DI_FTYPE_V2DF_V2DF,
21230   V2DI_FTYPE_V2DI_SI_COUNT,
21231   V2SI_FTYPE_V2SI_V2SI,
21232   V2SI_FTYPE_V2SI_V2SI_COUNT,
21233   V2SI_FTYPE_V4HI_V4HI,
21234   V2SI_FTYPE_V2SF_V2SF,
21235   V2SI_FTYPE_V2SI_SI_COUNT,
21236   V2DF_FTYPE_V2DF_V2DF,
21237   V2DF_FTYPE_V2DF_V2DF_SWAP,
21238   V2DF_FTYPE_V2DF_V4SF,
21239   V2DF_FTYPE_V2DF_V2DI,
21240   V2DF_FTYPE_V2DF_DI,
21241   V2DF_FTYPE_V2DF_SI,
21242   V2SF_FTYPE_V2SF_V2SF,
21243   V1DI_FTYPE_V1DI_V1DI,
21244   V1DI_FTYPE_V1DI_V1DI_COUNT,
21245   V1DI_FTYPE_V8QI_V8QI,
21246   V1DI_FTYPE_V2SI_V2SI,
21247   V1DI_FTYPE_V1DI_SI_COUNT,
21248   UINT64_FTYPE_UINT64_UINT64,
21249   UINT_FTYPE_UINT_UINT,
21250   UINT_FTYPE_UINT_USHORT,
21251   UINT_FTYPE_UINT_UCHAR,
21252   V8HI_FTYPE_V8HI_INT,
21253   V4SI_FTYPE_V4SI_INT,
21254   V4HI_FTYPE_V4HI_INT,
21255   V8SF_FTYPE_V8SF_INT,
21256   V4SI_FTYPE_V8SI_INT,
21257   V4SF_FTYPE_V8SF_INT,
21258   V2DF_FTYPE_V4DF_INT,
21259   V4DF_FTYPE_V4DF_INT,
21260   V4SF_FTYPE_V4SF_INT,
21261   V2DI_FTYPE_V2DI_INT,
21262   V2DI2TI_FTYPE_V2DI_INT,
21263   V2DF_FTYPE_V2DF_INT,
21264   V16QI_FTYPE_V16QI_V16QI_V16QI,
21265   V8SF_FTYPE_V8SF_V8SF_V8SF,
21266   V4DF_FTYPE_V4DF_V4DF_V4DF,
21267   V4SF_FTYPE_V4SF_V4SF_V4SF,
21268   V2DF_FTYPE_V2DF_V2DF_V2DF,
21269   V16QI_FTYPE_V16QI_V16QI_INT,
21270   V8SI_FTYPE_V8SI_V8SI_INT,
21271   V8SI_FTYPE_V8SI_V4SI_INT,
21272   V8HI_FTYPE_V8HI_V8HI_INT,
21273   V8SF_FTYPE_V8SF_V8SF_INT,
21274   V8SF_FTYPE_V8SF_V4SF_INT,
21275   V4SI_FTYPE_V4SI_V4SI_INT,
21276   V4DF_FTYPE_V4DF_V4DF_INT,
21277   V4DF_FTYPE_V4DF_V2DF_INT,
21278   V4SF_FTYPE_V4SF_V4SF_INT,
21279   V2DI_FTYPE_V2DI_V2DI_INT,
21280   V2DI2TI_FTYPE_V2DI_V2DI_INT,
21281   V1DI2DI_FTYPE_V1DI_V1DI_INT,
21282   V2DF_FTYPE_V2DF_V2DF_INT,
21283   V2DI_FTYPE_V2DI_UINT_UINT,
21284   V2DI_FTYPE_V2DI_V2DI_UINT_UINT
21285 };
21286
21287 /* Special builtins with variable number of arguments.  */
21288 static const struct builtin_description bdesc_special_args[] =
21289 {
21290   /* MMX */
21291   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_emms, "__builtin_ia32_emms", IX86_BUILTIN_EMMS, UNKNOWN, (int) VOID_FTYPE_VOID },
21292
21293   /* 3DNow! */
21294   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_femms, "__builtin_ia32_femms", IX86_BUILTIN_FEMMS, UNKNOWN, (int) VOID_FTYPE_VOID },
21295
21296   /* SSE */
21297   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movups, "__builtin_ia32_storeups", IX86_BUILTIN_STOREUPS, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V4SF },
21298   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movntv4sf, "__builtin_ia32_movntps", IX86_BUILTIN_MOVNTPS, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V4SF },
21299   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movups, "__builtin_ia32_loadups", IX86_BUILTIN_LOADUPS, UNKNOWN, (int) V4SF_FTYPE_PCFLOAT },
21300
21301   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_loadhps_exp, "__builtin_ia32_loadhps", IX86_BUILTIN_LOADHPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_PCV2SF },
21302   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_loadlps_exp, "__builtin_ia32_loadlps", IX86_BUILTIN_LOADLPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_PCV2SF },
21303   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_storehps, "__builtin_ia32_storehps", IX86_BUILTIN_STOREHPS, UNKNOWN, (int) VOID_FTYPE_PV2SF_V4SF },
21304   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_storelps, "__builtin_ia32_storelps", IX86_BUILTIN_STORELPS, UNKNOWN, (int) VOID_FTYPE_PV2SF_V4SF },
21305
21306   /* SSE or 3DNow!A  */
21307   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, CODE_FOR_sse_sfence, "__builtin_ia32_sfence", IX86_BUILTIN_SFENCE, UNKNOWN, (int) VOID_FTYPE_VOID },
21308   { 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 },
21309
21310   /* SSE2 */
21311   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_lfence, "__builtin_ia32_lfence", IX86_BUILTIN_LFENCE, UNKNOWN, (int) VOID_FTYPE_VOID },
21312   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_mfence, 0, IX86_BUILTIN_MFENCE, UNKNOWN, (int) VOID_FTYPE_VOID },
21313   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movupd, "__builtin_ia32_storeupd", IX86_BUILTIN_STOREUPD, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V2DF },
21314   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movdqu, "__builtin_ia32_storedqu", IX86_BUILTIN_STOREDQU, UNKNOWN, (int) VOID_FTYPE_PCHAR_V16QI },
21315   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movntv2df, "__builtin_ia32_movntpd", IX86_BUILTIN_MOVNTPD, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V2DF },
21316   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movntv2di, "__builtin_ia32_movntdq", IX86_BUILTIN_MOVNTDQ, UNKNOWN, (int) VOID_FTYPE_PV2DI_V2DI },
21317   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movntsi, "__builtin_ia32_movnti", IX86_BUILTIN_MOVNTI, UNKNOWN, (int) VOID_FTYPE_PINT_INT },
21318   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movupd, "__builtin_ia32_loadupd", IX86_BUILTIN_LOADUPD, UNKNOWN, (int) V2DF_FTYPE_PCDOUBLE },
21319   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movdqu, "__builtin_ia32_loaddqu", IX86_BUILTIN_LOADDQU, UNKNOWN, (int) V16QI_FTYPE_PCCHAR },
21320
21321   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_loadhpd_exp, "__builtin_ia32_loadhpd", IX86_BUILTIN_LOADHPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_PCDOUBLE },
21322   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_loadlpd_exp, "__builtin_ia32_loadlpd", IX86_BUILTIN_LOADLPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_PCDOUBLE },
21323
21324   /* SSE3 */
21325   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_lddqu, "__builtin_ia32_lddqu", IX86_BUILTIN_LDDQU, UNKNOWN, (int) V16QI_FTYPE_PCCHAR },
21326
21327   /* SSE4.1 */
21328   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_movntdqa, "__builtin_ia32_movntdqa", IX86_BUILTIN_MOVNTDQA, UNKNOWN, (int) V2DI_FTYPE_PV2DI },
21329
21330   /* SSE4A */
21331   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_vmmovntv2df, "__builtin_ia32_movntsd", IX86_BUILTIN_MOVNTSD, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V2DF },
21332   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_vmmovntv4sf, "__builtin_ia32_movntss", IX86_BUILTIN_MOVNTSS, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V4SF },
21333
21334   /* AVX */
21335   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vzeroall, "__builtin_ia32_vzeroall", IX86_BUILTIN_VZEROALL, UNKNOWN, (int) VOID_FTYPE_VOID },
21336   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vzeroupper, 0, IX86_BUILTIN_VZEROUPPER, UNKNOWN, (int) VOID_FTYPE_VOID },
21337   { OPTION_MASK_ISA_AVX | OPTION_MASK_ISA_64BIT, CODE_FOR_avx_vzeroupper_rex64, 0, IX86_BUILTIN_VZEROUPPER_REX64, UNKNOWN, (int) VOID_FTYPE_VOID },
21338
21339   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vbroadcastss, "__builtin_ia32_vbroadcastss", IX86_BUILTIN_VBROADCASTSS, UNKNOWN, (int) V4SF_FTYPE_PCFLOAT },
21340   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vbroadcastsd256, "__builtin_ia32_vbroadcastsd256", IX86_BUILTIN_VBROADCASTSD256, UNKNOWN, (int) V4DF_FTYPE_PCDOUBLE },
21341   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vbroadcastss256, "__builtin_ia32_vbroadcastss256", IX86_BUILTIN_VBROADCASTSS256, UNKNOWN, (int) V8SF_FTYPE_PCFLOAT },
21342   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vbroadcastf128_pd256, "__builtin_ia32_vbroadcastf128_pd256", IX86_BUILTIN_VBROADCASTPD256, UNKNOWN, (int) V4DF_FTYPE_PCV2DF },
21343   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vbroadcastf128_ps256, "__builtin_ia32_vbroadcastf128_ps256", IX86_BUILTIN_VBROADCASTPS256, UNKNOWN, (int) V8SF_FTYPE_PCV4SF },
21344
21345   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movupd256, "__builtin_ia32_loadupd256", IX86_BUILTIN_LOADUPD256, UNKNOWN, (int) V4DF_FTYPE_PCDOUBLE },
21346   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movups256, "__builtin_ia32_loadups256", IX86_BUILTIN_LOADUPS256, UNKNOWN, (int) V8SF_FTYPE_PCFLOAT },
21347   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movupd256, "__builtin_ia32_storeupd256", IX86_BUILTIN_STOREUPD256, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V4DF },
21348   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movups256, "__builtin_ia32_storeups256", IX86_BUILTIN_STOREUPS256, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V8SF },
21349   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movdqu256, "__builtin_ia32_loaddqu256", IX86_BUILTIN_LOADDQU256, UNKNOWN, (int) V32QI_FTYPE_PCCHAR },
21350   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movdqu256, "__builtin_ia32_storedqu256", IX86_BUILTIN_STOREDQU256, UNKNOWN, (int) VOID_FTYPE_PCHAR_V32QI },
21351   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_lddqu256, "__builtin_ia32_lddqu256", IX86_BUILTIN_LDDQU256, UNKNOWN, (int) V32QI_FTYPE_PCCHAR },
21352
21353   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movntv4di, "__builtin_ia32_movntdq256", IX86_BUILTIN_MOVNTDQ256, UNKNOWN, (int) VOID_FTYPE_PV4DI_V4DI },
21354   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movntv4df, "__builtin_ia32_movntpd256", IX86_BUILTIN_MOVNTPD256, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V4DF },
21355   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movntv8sf, "__builtin_ia32_movntps256", IX86_BUILTIN_MOVNTPS256, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V8SF },
21356
21357   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskloadpd, "__builtin_ia32_maskloadpd", IX86_BUILTIN_MASKLOADPD, UNKNOWN, (int) V2DF_FTYPE_PCV2DF_V2DF },
21358   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskloadps, "__builtin_ia32_maskloadps", IX86_BUILTIN_MASKLOADPS, UNKNOWN, (int) V4SF_FTYPE_PCV4SF_V4SF },
21359   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskloadpd256, "__builtin_ia32_maskloadpd256", IX86_BUILTIN_MASKLOADPD256, UNKNOWN, (int) V4DF_FTYPE_PCV4DF_V4DF },
21360   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskloadps256, "__builtin_ia32_maskloadps256", IX86_BUILTIN_MASKLOADPS256, UNKNOWN, (int) V8SF_FTYPE_PCV8SF_V8SF },
21361   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskstorepd, "__builtin_ia32_maskstorepd", IX86_BUILTIN_MASKSTOREPD, UNKNOWN, (int) VOID_FTYPE_PV2DF_V2DF_V2DF },
21362   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskstoreps, "__builtin_ia32_maskstoreps", IX86_BUILTIN_MASKSTOREPS, UNKNOWN, (int) VOID_FTYPE_PV4SF_V4SF_V4SF },
21363   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskstorepd256, "__builtin_ia32_maskstorepd256", IX86_BUILTIN_MASKSTOREPD256, UNKNOWN, (int) VOID_FTYPE_PV4DF_V4DF_V4DF },
21364   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskstoreps256, "__builtin_ia32_maskstoreps256", IX86_BUILTIN_MASKSTOREPS256, UNKNOWN, (int) VOID_FTYPE_PV8SF_V8SF_V8SF },
21365 };
21366
21367 /* Builtins with variable number of arguments.  */
21368 static const struct builtin_description bdesc_args[] =
21369 {
21370   /* MMX */
21371   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_addv8qi3, "__builtin_ia32_paddb", IX86_BUILTIN_PADDB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21372   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_addv4hi3, "__builtin_ia32_paddw", IX86_BUILTIN_PADDW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21373   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_addv2si3, "__builtin_ia32_paddd", IX86_BUILTIN_PADDD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21374   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_subv8qi3, "__builtin_ia32_psubb", IX86_BUILTIN_PSUBB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21375   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_subv4hi3, "__builtin_ia32_psubw", IX86_BUILTIN_PSUBW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21376   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_subv2si3, "__builtin_ia32_psubd", IX86_BUILTIN_PSUBD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21377
21378   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ssaddv8qi3, "__builtin_ia32_paddsb", IX86_BUILTIN_PADDSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21379   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ssaddv4hi3, "__builtin_ia32_paddsw", IX86_BUILTIN_PADDSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21380   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_sssubv8qi3, "__builtin_ia32_psubsb", IX86_BUILTIN_PSUBSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21381   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_sssubv4hi3, "__builtin_ia32_psubsw", IX86_BUILTIN_PSUBSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21382   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_usaddv8qi3, "__builtin_ia32_paddusb", IX86_BUILTIN_PADDUSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21383   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_usaddv4hi3, "__builtin_ia32_paddusw", IX86_BUILTIN_PADDUSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21384   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ussubv8qi3, "__builtin_ia32_psubusb", IX86_BUILTIN_PSUBUSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21385   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ussubv4hi3, "__builtin_ia32_psubusw", IX86_BUILTIN_PSUBUSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21386
21387   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_mulv4hi3, "__builtin_ia32_pmullw", IX86_BUILTIN_PMULLW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21388   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_smulv4hi3_highpart, "__builtin_ia32_pmulhw", IX86_BUILTIN_PMULHW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21389
21390   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_andv2si3, "__builtin_ia32_pand", IX86_BUILTIN_PAND, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21391   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_andnotv2si3, "__builtin_ia32_pandn", IX86_BUILTIN_PANDN, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21392   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_iorv2si3, "__builtin_ia32_por", IX86_BUILTIN_POR, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21393   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_xorv2si3, "__builtin_ia32_pxor", IX86_BUILTIN_PXOR, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21394
21395   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_eqv8qi3, "__builtin_ia32_pcmpeqb", IX86_BUILTIN_PCMPEQB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21396   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_eqv4hi3, "__builtin_ia32_pcmpeqw", IX86_BUILTIN_PCMPEQW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21397   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_eqv2si3, "__builtin_ia32_pcmpeqd", IX86_BUILTIN_PCMPEQD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21398   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_gtv8qi3, "__builtin_ia32_pcmpgtb", IX86_BUILTIN_PCMPGTB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21399   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_gtv4hi3, "__builtin_ia32_pcmpgtw", IX86_BUILTIN_PCMPGTW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21400   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_gtv2si3, "__builtin_ia32_pcmpgtd", IX86_BUILTIN_PCMPGTD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21401
21402   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpckhbw, "__builtin_ia32_punpckhbw", IX86_BUILTIN_PUNPCKHBW, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21403   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpckhwd, "__builtin_ia32_punpckhwd", IX86_BUILTIN_PUNPCKHWD, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21404   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpckhdq, "__builtin_ia32_punpckhdq", IX86_BUILTIN_PUNPCKHDQ, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21405   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpcklbw, "__builtin_ia32_punpcklbw", IX86_BUILTIN_PUNPCKLBW, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21406   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpcklwd, "__builtin_ia32_punpcklwd", IX86_BUILTIN_PUNPCKLWD, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI},
21407   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpckldq, "__builtin_ia32_punpckldq", IX86_BUILTIN_PUNPCKLDQ, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI},
21408
21409   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_packsswb, "__builtin_ia32_packsswb", IX86_BUILTIN_PACKSSWB, UNKNOWN, (int) V8QI_FTYPE_V4HI_V4HI },
21410   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_packssdw, "__builtin_ia32_packssdw", IX86_BUILTIN_PACKSSDW, UNKNOWN, (int) V4HI_FTYPE_V2SI_V2SI },
21411   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_packuswb, "__builtin_ia32_packuswb", IX86_BUILTIN_PACKUSWB, UNKNOWN, (int) V8QI_FTYPE_V4HI_V4HI },
21412
21413   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_pmaddwd, "__builtin_ia32_pmaddwd", IX86_BUILTIN_PMADDWD, UNKNOWN, (int) V2SI_FTYPE_V4HI_V4HI },
21414
21415   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv4hi3, "__builtin_ia32_psllwi", IX86_BUILTIN_PSLLWI, UNKNOWN, (int) V4HI_FTYPE_V4HI_SI_COUNT },
21416   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv2si3, "__builtin_ia32_pslldi", IX86_BUILTIN_PSLLDI, UNKNOWN, (int) V2SI_FTYPE_V2SI_SI_COUNT },
21417   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv1di3, "__builtin_ia32_psllqi", IX86_BUILTIN_PSLLQI, UNKNOWN, (int) V1DI_FTYPE_V1DI_SI_COUNT },
21418   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv4hi3, "__builtin_ia32_psllw", IX86_BUILTIN_PSLLW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI_COUNT },
21419   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv2si3, "__builtin_ia32_pslld", IX86_BUILTIN_PSLLD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI_COUNT },
21420   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv1di3, "__builtin_ia32_psllq", IX86_BUILTIN_PSLLQ, UNKNOWN, (int) V1DI_FTYPE_V1DI_V1DI_COUNT },
21421
21422   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv4hi3, "__builtin_ia32_psrlwi", IX86_BUILTIN_PSRLWI, UNKNOWN, (int) V4HI_FTYPE_V4HI_SI_COUNT },
21423   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv2si3, "__builtin_ia32_psrldi", IX86_BUILTIN_PSRLDI, UNKNOWN, (int) V2SI_FTYPE_V2SI_SI_COUNT },
21424   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv1di3, "__builtin_ia32_psrlqi", IX86_BUILTIN_PSRLQI, UNKNOWN, (int) V1DI_FTYPE_V1DI_SI_COUNT },
21425   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv4hi3, "__builtin_ia32_psrlw", IX86_BUILTIN_PSRLW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI_COUNT },
21426   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv2si3, "__builtin_ia32_psrld", IX86_BUILTIN_PSRLD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI_COUNT },
21427   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv1di3, "__builtin_ia32_psrlq", IX86_BUILTIN_PSRLQ, UNKNOWN, (int) V1DI_FTYPE_V1DI_V1DI_COUNT },
21428
21429   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashrv4hi3, "__builtin_ia32_psrawi", IX86_BUILTIN_PSRAWI, UNKNOWN, (int) V4HI_FTYPE_V4HI_SI_COUNT },
21430   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashrv2si3, "__builtin_ia32_psradi", IX86_BUILTIN_PSRADI, UNKNOWN, (int) V2SI_FTYPE_V2SI_SI_COUNT },
21431   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashrv4hi3, "__builtin_ia32_psraw", IX86_BUILTIN_PSRAW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI_COUNT },
21432   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashrv2si3, "__builtin_ia32_psrad", IX86_BUILTIN_PSRAD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI_COUNT },
21433
21434   /* 3DNow! */
21435   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_pf2id, "__builtin_ia32_pf2id", IX86_BUILTIN_PF2ID, UNKNOWN, (int) V2SI_FTYPE_V2SF },
21436   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_floatv2si2, "__builtin_ia32_pi2fd", IX86_BUILTIN_PI2FD, UNKNOWN, (int) V2SF_FTYPE_V2SI },
21437   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rcpv2sf2, "__builtin_ia32_pfrcp", IX86_BUILTIN_PFRCP, UNKNOWN, (int) V2SF_FTYPE_V2SF },
21438   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rsqrtv2sf2, "__builtin_ia32_pfrsqrt", IX86_BUILTIN_PFRSQRT, UNKNOWN, (int) V2SF_FTYPE_V2SF },
21439
21440   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_uavgv8qi3, "__builtin_ia32_pavgusb", IX86_BUILTIN_PAVGUSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21441   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_haddv2sf3, "__builtin_ia32_pfacc", IX86_BUILTIN_PFACC, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21442   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_addv2sf3, "__builtin_ia32_pfadd", IX86_BUILTIN_PFADD, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21443   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_eqv2sf3, "__builtin_ia32_pfcmpeq", IX86_BUILTIN_PFCMPEQ, UNKNOWN, (int) V2SI_FTYPE_V2SF_V2SF },
21444   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_gev2sf3, "__builtin_ia32_pfcmpge", IX86_BUILTIN_PFCMPGE, UNKNOWN, (int) V2SI_FTYPE_V2SF_V2SF },
21445   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_gtv2sf3, "__builtin_ia32_pfcmpgt", IX86_BUILTIN_PFCMPGT, UNKNOWN, (int) V2SI_FTYPE_V2SF_V2SF },
21446   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_smaxv2sf3, "__builtin_ia32_pfmax", IX86_BUILTIN_PFMAX, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21447   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_sminv2sf3, "__builtin_ia32_pfmin", IX86_BUILTIN_PFMIN, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21448   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_mulv2sf3, "__builtin_ia32_pfmul", IX86_BUILTIN_PFMUL, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21449   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rcpit1v2sf3, "__builtin_ia32_pfrcpit1", IX86_BUILTIN_PFRCPIT1, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21450   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rcpit2v2sf3, "__builtin_ia32_pfrcpit2", IX86_BUILTIN_PFRCPIT2, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21451   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rsqit1v2sf3, "__builtin_ia32_pfrsqit1", IX86_BUILTIN_PFRSQIT1, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21452   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_subv2sf3, "__builtin_ia32_pfsub", IX86_BUILTIN_PFSUB, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21453   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_subrv2sf3, "__builtin_ia32_pfsubr", IX86_BUILTIN_PFSUBR, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21454   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_pmulhrwv4hi3, "__builtin_ia32_pmulhrw", IX86_BUILTIN_PMULHRW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21455
21456   /* 3DNow!A */
21457   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pf2iw, "__builtin_ia32_pf2iw", IX86_BUILTIN_PF2IW, UNKNOWN, (int) V2SI_FTYPE_V2SF },
21458   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pi2fw, "__builtin_ia32_pi2fw", IX86_BUILTIN_PI2FW, UNKNOWN, (int) V2SF_FTYPE_V2SI },
21459   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pswapdv2si2, "__builtin_ia32_pswapdsi", IX86_BUILTIN_PSWAPDSI, UNKNOWN, (int) V2SI_FTYPE_V2SI },
21460   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pswapdv2sf2, "__builtin_ia32_pswapdsf", IX86_BUILTIN_PSWAPDSF, UNKNOWN, (int) V2SF_FTYPE_V2SF },
21461   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_hsubv2sf3, "__builtin_ia32_pfnacc", IX86_BUILTIN_PFNACC, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21462   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_addsubv2sf3, "__builtin_ia32_pfpnacc", IX86_BUILTIN_PFPNACC, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
21463
21464   /* SSE */
21465   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movmskps, "__builtin_ia32_movmskps", IX86_BUILTIN_MOVMSKPS, UNKNOWN, (int) INT_FTYPE_V4SF },
21466   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_sqrtv4sf2, "__builtin_ia32_sqrtps", IX86_BUILTIN_SQRTPS, UNKNOWN, (int) V4SF_FTYPE_V4SF },
21467   { OPTION_MASK_ISA_SSE, CODE_FOR_sqrtv4sf2, "__builtin_ia32_sqrtps_nr", IX86_BUILTIN_SQRTPS_NR, UNKNOWN, (int) V4SF_FTYPE_V4SF },
21468   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_rsqrtv4sf2, "__builtin_ia32_rsqrtps", IX86_BUILTIN_RSQRTPS, UNKNOWN, (int) V4SF_FTYPE_V4SF },
21469   { OPTION_MASK_ISA_SSE, CODE_FOR_rsqrtv4sf2, "__builtin_ia32_rsqrtps_nr", IX86_BUILTIN_RSQRTPS_NR, UNKNOWN, (int) V4SF_FTYPE_V4SF },
21470   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_rcpv4sf2, "__builtin_ia32_rcpps", IX86_BUILTIN_RCPPS, UNKNOWN, (int) V4SF_FTYPE_V4SF },
21471   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvtps2pi, "__builtin_ia32_cvtps2pi", IX86_BUILTIN_CVTPS2PI, UNKNOWN, (int) V2SI_FTYPE_V4SF },
21472   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvtss2si, "__builtin_ia32_cvtss2si", IX86_BUILTIN_CVTSS2SI, UNKNOWN, (int) INT_FTYPE_V4SF },
21473   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_64BIT, CODE_FOR_sse_cvtss2siq, "__builtin_ia32_cvtss2si64", IX86_BUILTIN_CVTSS2SI64, UNKNOWN, (int) INT64_FTYPE_V4SF },
21474   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvttps2pi, "__builtin_ia32_cvttps2pi", IX86_BUILTIN_CVTTPS2PI, UNKNOWN, (int) V2SI_FTYPE_V4SF },
21475   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvttss2si, "__builtin_ia32_cvttss2si", IX86_BUILTIN_CVTTSS2SI, UNKNOWN, (int) INT_FTYPE_V4SF },
21476   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_64BIT, CODE_FOR_sse_cvttss2siq, "__builtin_ia32_cvttss2si64", IX86_BUILTIN_CVTTSS2SI64, UNKNOWN, (int) INT64_FTYPE_V4SF },
21477
21478   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_shufps, "__builtin_ia32_shufps", IX86_BUILTIN_SHUFPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
21479
21480   { OPTION_MASK_ISA_SSE, CODE_FOR_addv4sf3, "__builtin_ia32_addps", IX86_BUILTIN_ADDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21481   { OPTION_MASK_ISA_SSE, CODE_FOR_subv4sf3, "__builtin_ia32_subps", IX86_BUILTIN_SUBPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21482   { OPTION_MASK_ISA_SSE, CODE_FOR_mulv4sf3, "__builtin_ia32_mulps", IX86_BUILTIN_MULPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21483   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_divv4sf3, "__builtin_ia32_divps", IX86_BUILTIN_DIVPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21484   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmaddv4sf3,  "__builtin_ia32_addss", IX86_BUILTIN_ADDSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21485   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmsubv4sf3,  "__builtin_ia32_subss", IX86_BUILTIN_SUBSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21486   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmulv4sf3,  "__builtin_ia32_mulss", IX86_BUILTIN_MULSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21487   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmdivv4sf3,  "__builtin_ia32_divss", IX86_BUILTIN_DIVSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21488
21489   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpeqps", IX86_BUILTIN_CMPEQPS, EQ, (int) V4SF_FTYPE_V4SF_V4SF },
21490   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpltps", IX86_BUILTIN_CMPLTPS, LT, (int) V4SF_FTYPE_V4SF_V4SF },
21491   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpleps", IX86_BUILTIN_CMPLEPS, LE, (int) V4SF_FTYPE_V4SF_V4SF },
21492   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpgtps", IX86_BUILTIN_CMPGTPS, LT, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
21493   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpgeps", IX86_BUILTIN_CMPGEPS, LE, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
21494   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpunordps", IX86_BUILTIN_CMPUNORDPS, UNORDERED, (int) V4SF_FTYPE_V4SF_V4SF },
21495   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpneqps", IX86_BUILTIN_CMPNEQPS, NE, (int) V4SF_FTYPE_V4SF_V4SF },
21496   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpnltps", IX86_BUILTIN_CMPNLTPS, UNGE, (int) V4SF_FTYPE_V4SF_V4SF },
21497   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpnleps", IX86_BUILTIN_CMPNLEPS, UNGT, (int) V4SF_FTYPE_V4SF_V4SF },
21498   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpngtps", IX86_BUILTIN_CMPNGTPS, UNGE, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
21499   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpngeps", IX86_BUILTIN_CMPNGEPS, UNGT, (int) V4SF_FTYPE_V4SF_V4SF_SWAP},
21500   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpordps", IX86_BUILTIN_CMPORDPS, ORDERED, (int) V4SF_FTYPE_V4SF_V4SF },
21501   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpeqss", IX86_BUILTIN_CMPEQSS, EQ, (int) V4SF_FTYPE_V4SF_V4SF },
21502   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpltss", IX86_BUILTIN_CMPLTSS, LT, (int) V4SF_FTYPE_V4SF_V4SF },
21503   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpless", IX86_BUILTIN_CMPLESS, LE, (int) V4SF_FTYPE_V4SF_V4SF },
21504   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpunordss", IX86_BUILTIN_CMPUNORDSS, UNORDERED, (int) V4SF_FTYPE_V4SF_V4SF },
21505   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpneqss", IX86_BUILTIN_CMPNEQSS, NE, (int) V4SF_FTYPE_V4SF_V4SF },
21506   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpnltss", IX86_BUILTIN_CMPNLTSS, UNGE, (int) V4SF_FTYPE_V4SF_V4SF },
21507   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpnless", IX86_BUILTIN_CMPNLESS, UNGT, (int) V4SF_FTYPE_V4SF_V4SF },
21508   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpngtss", IX86_BUILTIN_CMPNGTSS, UNGE, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
21509   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpngess", IX86_BUILTIN_CMPNGESS, UNGT, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
21510   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpordss", IX86_BUILTIN_CMPORDSS, ORDERED, (int) V4SF_FTYPE_V4SF_V4SF },
21511
21512   { OPTION_MASK_ISA_SSE, CODE_FOR_sminv4sf3, "__builtin_ia32_minps", IX86_BUILTIN_MINPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21513   { OPTION_MASK_ISA_SSE, CODE_FOR_smaxv4sf3, "__builtin_ia32_maxps", IX86_BUILTIN_MAXPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21514   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmsminv4sf3, "__builtin_ia32_minss", IX86_BUILTIN_MINSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21515   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmsmaxv4sf3, "__builtin_ia32_maxss", IX86_BUILTIN_MAXSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21516
21517   { OPTION_MASK_ISA_SSE, CODE_FOR_andv4sf3, "__builtin_ia32_andps", IX86_BUILTIN_ANDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21518   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_andnotv4sf3,  "__builtin_ia32_andnps", IX86_BUILTIN_ANDNPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21519   { OPTION_MASK_ISA_SSE, CODE_FOR_iorv4sf3, "__builtin_ia32_orps", IX86_BUILTIN_ORPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21520   { OPTION_MASK_ISA_SSE, CODE_FOR_xorv4sf3,  "__builtin_ia32_xorps", IX86_BUILTIN_XORPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21521
21522   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movss,  "__builtin_ia32_movss", IX86_BUILTIN_MOVSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21523   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movhlps_exp,  "__builtin_ia32_movhlps", IX86_BUILTIN_MOVHLPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21524   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movlhps_exp,  "__builtin_ia32_movlhps", IX86_BUILTIN_MOVLHPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21525   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_unpckhps, "__builtin_ia32_unpckhps", IX86_BUILTIN_UNPCKHPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21526   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_unpcklps, "__builtin_ia32_unpcklps", IX86_BUILTIN_UNPCKLPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21527
21528   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvtpi2ps, "__builtin_ia32_cvtpi2ps", IX86_BUILTIN_CVTPI2PS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V2SI },
21529   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvtsi2ss, "__builtin_ia32_cvtsi2ss", IX86_BUILTIN_CVTSI2SS, UNKNOWN, (int) V4SF_FTYPE_V4SF_SI },
21530   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_64BIT, CODE_FOR_sse_cvtsi2ssq, "__builtin_ia32_cvtsi642ss", IX86_BUILTIN_CVTSI642SS, UNKNOWN, V4SF_FTYPE_V4SF_DI },
21531
21532   { OPTION_MASK_ISA_SSE, CODE_FOR_rsqrtsf2, "__builtin_ia32_rsqrtf", IX86_BUILTIN_RSQRTF, UNKNOWN, (int) FLOAT_FTYPE_FLOAT },
21533
21534   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmsqrtv4sf2, "__builtin_ia32_sqrtss", IX86_BUILTIN_SQRTSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_VEC_MERGE },
21535   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmrsqrtv4sf2, "__builtin_ia32_rsqrtss", IX86_BUILTIN_RSQRTSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_VEC_MERGE },
21536   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmrcpv4sf2, "__builtin_ia32_rcpss", IX86_BUILTIN_RCPSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_VEC_MERGE },
21537
21538   /* SSE MMX or 3Dnow!A */
21539   { 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 },
21540   { 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 },
21541   { 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 },
21542
21543   { 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 },
21544   { 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 },
21545   { 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 },
21546   { 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 },
21547
21548   { 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 },
21549   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pmovmskb, "__builtin_ia32_pmovmskb", IX86_BUILTIN_PMOVMSKB, UNKNOWN, (int) INT_FTYPE_V8QI },
21550
21551   { 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 },
21552
21553   /* SSE2 */
21554   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_shufpd, "__builtin_ia32_shufpd", IX86_BUILTIN_SHUFPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
21555
21556   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movmskpd, "__builtin_ia32_movmskpd", IX86_BUILTIN_MOVMSKPD, UNKNOWN, (int) INT_FTYPE_V2DF  },
21557   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pmovmskb, "__builtin_ia32_pmovmskb128", IX86_BUILTIN_PMOVMSKB128, UNKNOWN, (int) INT_FTYPE_V16QI },
21558   { OPTION_MASK_ISA_SSE2, CODE_FOR_sqrtv2df2, "__builtin_ia32_sqrtpd", IX86_BUILTIN_SQRTPD, UNKNOWN, (int) V2DF_FTYPE_V2DF },
21559   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtdq2pd, "__builtin_ia32_cvtdq2pd", IX86_BUILTIN_CVTDQ2PD, UNKNOWN, (int) V2DF_FTYPE_V4SI },
21560   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtdq2ps, "__builtin_ia32_cvtdq2ps", IX86_BUILTIN_CVTDQ2PS, UNKNOWN, (int) V4SF_FTYPE_V4SI },
21561
21562   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtpd2dq, "__builtin_ia32_cvtpd2dq", IX86_BUILTIN_CVTPD2DQ, UNKNOWN, (int) V4SI_FTYPE_V2DF },
21563   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtpd2pi, "__builtin_ia32_cvtpd2pi", IX86_BUILTIN_CVTPD2PI, UNKNOWN, (int) V2SI_FTYPE_V2DF },
21564   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtpd2ps, "__builtin_ia32_cvtpd2ps", IX86_BUILTIN_CVTPD2PS, UNKNOWN, (int) V4SF_FTYPE_V2DF },
21565   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvttpd2dq, "__builtin_ia32_cvttpd2dq", IX86_BUILTIN_CVTTPD2DQ, UNKNOWN, (int) V4SI_FTYPE_V2DF },
21566   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvttpd2pi, "__builtin_ia32_cvttpd2pi", IX86_BUILTIN_CVTTPD2PI, UNKNOWN, (int) V2SI_FTYPE_V2DF },
21567
21568   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtpi2pd, "__builtin_ia32_cvtpi2pd", IX86_BUILTIN_CVTPI2PD, UNKNOWN, (int) V2DF_FTYPE_V2SI },
21569
21570   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtsd2si, "__builtin_ia32_cvtsd2si", IX86_BUILTIN_CVTSD2SI, UNKNOWN, (int) INT_FTYPE_V2DF },
21571   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvttsd2si, "__builtin_ia32_cvttsd2si", IX86_BUILTIN_CVTTSD2SI, UNKNOWN, (int) INT_FTYPE_V2DF },
21572   { OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_64BIT, CODE_FOR_sse2_cvtsd2siq, "__builtin_ia32_cvtsd2si64", IX86_BUILTIN_CVTSD2SI64, UNKNOWN, (int) INT64_FTYPE_V2DF },
21573   { OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_64BIT, CODE_FOR_sse2_cvttsd2siq, "__builtin_ia32_cvttsd2si64", IX86_BUILTIN_CVTTSD2SI64, UNKNOWN, (int) INT64_FTYPE_V2DF },
21574
21575   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtps2dq, "__builtin_ia32_cvtps2dq", IX86_BUILTIN_CVTPS2DQ, UNKNOWN, (int) V4SI_FTYPE_V4SF },
21576   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtps2pd, "__builtin_ia32_cvtps2pd", IX86_BUILTIN_CVTPS2PD, UNKNOWN, (int) V2DF_FTYPE_V4SF },
21577   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvttps2dq, "__builtin_ia32_cvttps2dq", IX86_BUILTIN_CVTTPS2DQ, UNKNOWN, (int) V4SI_FTYPE_V4SF },
21578
21579   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv2df3, "__builtin_ia32_addpd", IX86_BUILTIN_ADDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21580   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv2df3, "__builtin_ia32_subpd", IX86_BUILTIN_SUBPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21581   { OPTION_MASK_ISA_SSE2, CODE_FOR_mulv2df3, "__builtin_ia32_mulpd", IX86_BUILTIN_MULPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21582   { OPTION_MASK_ISA_SSE2, CODE_FOR_divv2df3, "__builtin_ia32_divpd", IX86_BUILTIN_DIVPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21583   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmaddv2df3,  "__builtin_ia32_addsd", IX86_BUILTIN_ADDSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21584   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmsubv2df3,  "__builtin_ia32_subsd", IX86_BUILTIN_SUBSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21585   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmulv2df3,  "__builtin_ia32_mulsd", IX86_BUILTIN_MULSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21586   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmdivv2df3,  "__builtin_ia32_divsd", IX86_BUILTIN_DIVSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21587
21588   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpeqpd", IX86_BUILTIN_CMPEQPD, EQ, (int) V2DF_FTYPE_V2DF_V2DF },
21589   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpltpd", IX86_BUILTIN_CMPLTPD, LT, (int) V2DF_FTYPE_V2DF_V2DF },
21590   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmplepd", IX86_BUILTIN_CMPLEPD, LE, (int) V2DF_FTYPE_V2DF_V2DF },
21591   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpgtpd", IX86_BUILTIN_CMPGTPD, LT, (int) V2DF_FTYPE_V2DF_V2DF_SWAP },
21592   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpgepd", IX86_BUILTIN_CMPGEPD, LE, (int) V2DF_FTYPE_V2DF_V2DF_SWAP},
21593   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpunordpd", IX86_BUILTIN_CMPUNORDPD, UNORDERED, (int) V2DF_FTYPE_V2DF_V2DF },
21594   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpneqpd", IX86_BUILTIN_CMPNEQPD, NE, (int) V2DF_FTYPE_V2DF_V2DF },
21595   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpnltpd", IX86_BUILTIN_CMPNLTPD, UNGE, (int) V2DF_FTYPE_V2DF_V2DF },
21596   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpnlepd", IX86_BUILTIN_CMPNLEPD, UNGT, (int) V2DF_FTYPE_V2DF_V2DF },
21597   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpngtpd", IX86_BUILTIN_CMPNGTPD, UNGE, (int) V2DF_FTYPE_V2DF_V2DF_SWAP },
21598   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpngepd", IX86_BUILTIN_CMPNGEPD, UNGT, (int) V2DF_FTYPE_V2DF_V2DF_SWAP },
21599   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpordpd", IX86_BUILTIN_CMPORDPD, ORDERED, (int) V2DF_FTYPE_V2DF_V2DF },
21600   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpeqsd", IX86_BUILTIN_CMPEQSD, EQ, (int) V2DF_FTYPE_V2DF_V2DF },
21601   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpltsd", IX86_BUILTIN_CMPLTSD, LT, (int) V2DF_FTYPE_V2DF_V2DF },
21602   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmplesd", IX86_BUILTIN_CMPLESD, LE, (int) V2DF_FTYPE_V2DF_V2DF },
21603   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpunordsd", IX86_BUILTIN_CMPUNORDSD, UNORDERED, (int) V2DF_FTYPE_V2DF_V2DF },
21604   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpneqsd", IX86_BUILTIN_CMPNEQSD, NE, (int) V2DF_FTYPE_V2DF_V2DF },
21605   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpnltsd", IX86_BUILTIN_CMPNLTSD, UNGE, (int) V2DF_FTYPE_V2DF_V2DF },
21606   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpnlesd", IX86_BUILTIN_CMPNLESD, UNGT, (int) V2DF_FTYPE_V2DF_V2DF },
21607   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpordsd", IX86_BUILTIN_CMPORDSD, ORDERED, (int) V2DF_FTYPE_V2DF_V2DF },
21608
21609   { OPTION_MASK_ISA_SSE2, CODE_FOR_sminv2df3, "__builtin_ia32_minpd", IX86_BUILTIN_MINPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21610   { OPTION_MASK_ISA_SSE2, CODE_FOR_smaxv2df3, "__builtin_ia32_maxpd", IX86_BUILTIN_MAXPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21611   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmsminv2df3, "__builtin_ia32_minsd", IX86_BUILTIN_MINSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21612   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmsmaxv2df3, "__builtin_ia32_maxsd", IX86_BUILTIN_MAXSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21613
21614   { OPTION_MASK_ISA_SSE2, CODE_FOR_andv2df3, "__builtin_ia32_andpd", IX86_BUILTIN_ANDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21615   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_andnotv2df3,  "__builtin_ia32_andnpd", IX86_BUILTIN_ANDNPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21616   { OPTION_MASK_ISA_SSE2, CODE_FOR_iorv2df3, "__builtin_ia32_orpd", IX86_BUILTIN_ORPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21617   { OPTION_MASK_ISA_SSE2, CODE_FOR_xorv2df3,  "__builtin_ia32_xorpd", IX86_BUILTIN_XORPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21618
21619   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movsd,  "__builtin_ia32_movsd", IX86_BUILTIN_MOVSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21620   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_unpckhpd_exp, "__builtin_ia32_unpckhpd", IX86_BUILTIN_UNPCKHPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21621   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_unpcklpd_exp, "__builtin_ia32_unpcklpd", IX86_BUILTIN_UNPCKLPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21622
21623   { 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 },
21624
21625   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv16qi3, "__builtin_ia32_paddb128", IX86_BUILTIN_PADDB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21626   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv8hi3, "__builtin_ia32_paddw128", IX86_BUILTIN_PADDW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21627   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv4si3, "__builtin_ia32_paddd128", IX86_BUILTIN_PADDD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21628   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv2di3, "__builtin_ia32_paddq128", IX86_BUILTIN_PADDQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21629   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv16qi3, "__builtin_ia32_psubb128", IX86_BUILTIN_PSUBB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21630   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv8hi3, "__builtin_ia32_psubw128", IX86_BUILTIN_PSUBW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21631   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv4si3, "__builtin_ia32_psubd128", IX86_BUILTIN_PSUBD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21632   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv2di3, "__builtin_ia32_psubq128", IX86_BUILTIN_PSUBQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21633
21634   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ssaddv16qi3, "__builtin_ia32_paddsb128", IX86_BUILTIN_PADDSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21635   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ssaddv8hi3, "__builtin_ia32_paddsw128", IX86_BUILTIN_PADDSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21636   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_sssubv16qi3, "__builtin_ia32_psubsb128", IX86_BUILTIN_PSUBSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21637   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_sssubv8hi3, "__builtin_ia32_psubsw128", IX86_BUILTIN_PSUBSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21638   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_usaddv16qi3, "__builtin_ia32_paddusb128", IX86_BUILTIN_PADDUSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21639   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_usaddv8hi3, "__builtin_ia32_paddusw128", IX86_BUILTIN_PADDUSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21640   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ussubv16qi3, "__builtin_ia32_psubusb128", IX86_BUILTIN_PSUBUSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21641   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ussubv8hi3, "__builtin_ia32_psubusw128", IX86_BUILTIN_PSUBUSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21642
21643   { OPTION_MASK_ISA_SSE2, CODE_FOR_mulv8hi3, "__builtin_ia32_pmullw128", IX86_BUILTIN_PMULLW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21644   { OPTION_MASK_ISA_SSE2, CODE_FOR_smulv8hi3_highpart, "__builtin_ia32_pmulhw128", IX86_BUILTIN_PMULHW128, UNKNOWN,(int) V8HI_FTYPE_V8HI_V8HI },
21645
21646   { OPTION_MASK_ISA_SSE2, CODE_FOR_andv2di3, "__builtin_ia32_pand128", IX86_BUILTIN_PAND128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21647   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_andnotv2di3, "__builtin_ia32_pandn128", IX86_BUILTIN_PANDN128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21648   { OPTION_MASK_ISA_SSE2, CODE_FOR_iorv2di3, "__builtin_ia32_por128", IX86_BUILTIN_POR128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21649   { OPTION_MASK_ISA_SSE2, CODE_FOR_xorv2di3, "__builtin_ia32_pxor128", IX86_BUILTIN_PXOR128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21650
21651   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_uavgv16qi3, "__builtin_ia32_pavgb128", IX86_BUILTIN_PAVGB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21652   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_uavgv8hi3, "__builtin_ia32_pavgw128", IX86_BUILTIN_PAVGW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21653
21654   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_eqv16qi3, "__builtin_ia32_pcmpeqb128", IX86_BUILTIN_PCMPEQB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21655   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_eqv8hi3, "__builtin_ia32_pcmpeqw128", IX86_BUILTIN_PCMPEQW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21656   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_eqv4si3, "__builtin_ia32_pcmpeqd128", IX86_BUILTIN_PCMPEQD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI  },
21657   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_gtv16qi3, "__builtin_ia32_pcmpgtb128", IX86_BUILTIN_PCMPGTB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21658   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_gtv8hi3, "__builtin_ia32_pcmpgtw128", IX86_BUILTIN_PCMPGTW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21659   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_gtv4si3, "__builtin_ia32_pcmpgtd128", IX86_BUILTIN_PCMPGTD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI  },
21660
21661   { OPTION_MASK_ISA_SSE2, CODE_FOR_umaxv16qi3, "__builtin_ia32_pmaxub128", IX86_BUILTIN_PMAXUB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21662   { OPTION_MASK_ISA_SSE2, CODE_FOR_smaxv8hi3, "__builtin_ia32_pmaxsw128", IX86_BUILTIN_PMAXSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21663   { OPTION_MASK_ISA_SSE2, CODE_FOR_uminv16qi3, "__builtin_ia32_pminub128", IX86_BUILTIN_PMINUB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21664   { OPTION_MASK_ISA_SSE2, CODE_FOR_sminv8hi3, "__builtin_ia32_pminsw128", IX86_BUILTIN_PMINSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21665
21666   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_punpckhbw, "__builtin_ia32_punpckhbw128", IX86_BUILTIN_PUNPCKHBW128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21667   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_punpckhwd, "__builtin_ia32_punpckhwd128", IX86_BUILTIN_PUNPCKHWD128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI  },
21668   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_punpckhdq, "__builtin_ia32_punpckhdq128", IX86_BUILTIN_PUNPCKHDQ128, UNKNOWN,  (int) V4SI_FTYPE_V4SI_V4SI },
21669   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_punpckhqdq, "__builtin_ia32_punpckhqdq128", IX86_BUILTIN_PUNPCKHQDQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21670   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_punpcklbw, "__builtin_ia32_punpcklbw128", IX86_BUILTIN_PUNPCKLBW128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21671   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_punpcklwd, "__builtin_ia32_punpcklwd128", IX86_BUILTIN_PUNPCKLWD128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21672   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_punpckldq, "__builtin_ia32_punpckldq128", IX86_BUILTIN_PUNPCKLDQ128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21673   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_punpcklqdq, "__builtin_ia32_punpcklqdq128", IX86_BUILTIN_PUNPCKLQDQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21674
21675   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_packsswb, "__builtin_ia32_packsswb128", IX86_BUILTIN_PACKSSWB128, UNKNOWN, (int) V16QI_FTYPE_V8HI_V8HI },
21676   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_packssdw, "__builtin_ia32_packssdw128", IX86_BUILTIN_PACKSSDW128, UNKNOWN, (int) V8HI_FTYPE_V4SI_V4SI },
21677   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_packuswb, "__builtin_ia32_packuswb128", IX86_BUILTIN_PACKUSWB128, UNKNOWN, (int) V16QI_FTYPE_V8HI_V8HI },
21678
21679   { OPTION_MASK_ISA_SSE2, CODE_FOR_umulv8hi3_highpart, "__builtin_ia32_pmulhuw128", IX86_BUILTIN_PMULHUW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21680   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_psadbw, "__builtin_ia32_psadbw128", IX86_BUILTIN_PSADBW128, UNKNOWN, (int) V2DI_FTYPE_V16QI_V16QI },
21681
21682   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_umulv1siv1di3, "__builtin_ia32_pmuludq", IX86_BUILTIN_PMULUDQ, UNKNOWN, (int) V1DI_FTYPE_V2SI_V2SI },
21683   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_umulv2siv2di3, "__builtin_ia32_pmuludq128", IX86_BUILTIN_PMULUDQ128, UNKNOWN, (int) V2DI_FTYPE_V4SI_V4SI },
21684
21685   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pmaddwd, "__builtin_ia32_pmaddwd128", IX86_BUILTIN_PMADDWD128, UNKNOWN, (int) V4SI_FTYPE_V8HI_V8HI },
21686
21687   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtsi2sd, "__builtin_ia32_cvtsi2sd", IX86_BUILTIN_CVTSI2SD, UNKNOWN, (int) V2DF_FTYPE_V2DF_SI },
21688   { OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_64BIT, CODE_FOR_sse2_cvtsi2sdq, "__builtin_ia32_cvtsi642sd", IX86_BUILTIN_CVTSI642SD, UNKNOWN, (int) V2DF_FTYPE_V2DF_DI },
21689   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtsd2ss, "__builtin_ia32_cvtsd2ss", IX86_BUILTIN_CVTSD2SS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V2DF },
21690   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtss2sd, "__builtin_ia32_cvtss2sd", IX86_BUILTIN_CVTSS2SD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V4SF },
21691
21692   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ashlti3, "__builtin_ia32_pslldqi128", IX86_BUILTIN_PSLLDQI128, UNKNOWN, (int) V2DI2TI_FTYPE_V2DI_INT },
21693   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv8hi3, "__builtin_ia32_psllwi128", IX86_BUILTIN_PSLLWI128, UNKNOWN, (int) V8HI_FTYPE_V8HI_SI_COUNT },
21694   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv4si3, "__builtin_ia32_pslldi128", IX86_BUILTIN_PSLLDI128, UNKNOWN, (int) V4SI_FTYPE_V4SI_SI_COUNT },
21695   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv2di3, "__builtin_ia32_psllqi128", IX86_BUILTIN_PSLLQI128, UNKNOWN, (int) V2DI_FTYPE_V2DI_SI_COUNT },
21696   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv8hi3, "__builtin_ia32_psllw128", IX86_BUILTIN_PSLLW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI_COUNT },
21697   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv4si3, "__builtin_ia32_pslld128", IX86_BUILTIN_PSLLD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI_COUNT },
21698   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv2di3, "__builtin_ia32_psllq128", IX86_BUILTIN_PSLLQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_COUNT },
21699
21700   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_lshrti3, "__builtin_ia32_psrldqi128", IX86_BUILTIN_PSRLDQI128, UNKNOWN, (int) V2DI2TI_FTYPE_V2DI_INT },
21701   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv8hi3, "__builtin_ia32_psrlwi128", IX86_BUILTIN_PSRLWI128, UNKNOWN, (int) V8HI_FTYPE_V8HI_SI_COUNT },
21702   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv4si3, "__builtin_ia32_psrldi128", IX86_BUILTIN_PSRLDI128, UNKNOWN, (int) V4SI_FTYPE_V4SI_SI_COUNT },
21703   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv2di3, "__builtin_ia32_psrlqi128", IX86_BUILTIN_PSRLQI128, UNKNOWN, (int) V2DI_FTYPE_V2DI_SI_COUNT },
21704   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv8hi3, "__builtin_ia32_psrlw128", IX86_BUILTIN_PSRLW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI_COUNT },
21705   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv4si3, "__builtin_ia32_psrld128", IX86_BUILTIN_PSRLD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI_COUNT },
21706   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv2di3, "__builtin_ia32_psrlq128", IX86_BUILTIN_PSRLQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_COUNT },
21707
21708   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashrv8hi3, "__builtin_ia32_psrawi128", IX86_BUILTIN_PSRAWI128, UNKNOWN, (int) V8HI_FTYPE_V8HI_SI_COUNT },
21709   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashrv4si3, "__builtin_ia32_psradi128", IX86_BUILTIN_PSRADI128, UNKNOWN, (int) V4SI_FTYPE_V4SI_SI_COUNT },
21710   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashrv8hi3, "__builtin_ia32_psraw128", IX86_BUILTIN_PSRAW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI_COUNT },
21711   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashrv4si3, "__builtin_ia32_psrad128", IX86_BUILTIN_PSRAD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI_COUNT },
21712
21713   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pshufd, "__builtin_ia32_pshufd", IX86_BUILTIN_PSHUFD, UNKNOWN, (int) V4SI_FTYPE_V4SI_INT },
21714   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pshuflw, "__builtin_ia32_pshuflw", IX86_BUILTIN_PSHUFLW, UNKNOWN, (int) V8HI_FTYPE_V8HI_INT },
21715   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pshufhw, "__builtin_ia32_pshufhw", IX86_BUILTIN_PSHUFHW, UNKNOWN, (int) V8HI_FTYPE_V8HI_INT },
21716
21717   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmsqrtv2df2, "__builtin_ia32_sqrtsd", IX86_BUILTIN_SQRTSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_VEC_MERGE },
21718
21719   { OPTION_MASK_ISA_SSE2, CODE_FOR_abstf2, 0, IX86_BUILTIN_FABSQ, UNKNOWN, (int) FLOAT128_FTYPE_FLOAT128 },
21720   { OPTION_MASK_ISA_SSE2, CODE_FOR_copysigntf3, 0, IX86_BUILTIN_COPYSIGNQ, UNKNOWN, (int) FLOAT128_FTYPE_FLOAT128_FLOAT128 },
21721
21722   { OPTION_MASK_ISA_SSE, CODE_FOR_sse2_movq128, "__builtin_ia32_movq128", IX86_BUILTIN_MOVQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI },
21723
21724   /* SSE2 MMX */
21725   { OPTION_MASK_ISA_SSE2, CODE_FOR_mmx_addv1di3, "__builtin_ia32_paddq", IX86_BUILTIN_PADDQ, UNKNOWN, (int) V1DI_FTYPE_V1DI_V1DI },
21726   { OPTION_MASK_ISA_SSE2, CODE_FOR_mmx_subv1di3, "__builtin_ia32_psubq", IX86_BUILTIN_PSUBQ, UNKNOWN, (int) V1DI_FTYPE_V1DI_V1DI },
21727
21728   /* SSE3 */
21729   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_movshdup, "__builtin_ia32_movshdup", IX86_BUILTIN_MOVSHDUP, UNKNOWN, (int) V4SF_FTYPE_V4SF},
21730   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_movsldup, "__builtin_ia32_movsldup", IX86_BUILTIN_MOVSLDUP, UNKNOWN, (int) V4SF_FTYPE_V4SF },
21731
21732   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_addsubv4sf3, "__builtin_ia32_addsubps", IX86_BUILTIN_ADDSUBPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21733   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_addsubv2df3, "__builtin_ia32_addsubpd", IX86_BUILTIN_ADDSUBPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21734   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_haddv4sf3, "__builtin_ia32_haddps", IX86_BUILTIN_HADDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21735   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_haddv2df3, "__builtin_ia32_haddpd", IX86_BUILTIN_HADDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21736   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_hsubv4sf3, "__builtin_ia32_hsubps", IX86_BUILTIN_HSUBPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21737   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_hsubv2df3, "__builtin_ia32_hsubpd", IX86_BUILTIN_HSUBPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21738
21739   /* SSSE3 */
21740   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv16qi2, "__builtin_ia32_pabsb128", IX86_BUILTIN_PABSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI },
21741   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv8qi2, "__builtin_ia32_pabsb", IX86_BUILTIN_PABSB, UNKNOWN, (int) V8QI_FTYPE_V8QI },
21742   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv8hi2, "__builtin_ia32_pabsw128", IX86_BUILTIN_PABSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI },
21743   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv4hi2, "__builtin_ia32_pabsw", IX86_BUILTIN_PABSW, UNKNOWN, (int) V4HI_FTYPE_V4HI },
21744   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv4si2, "__builtin_ia32_pabsd128", IX86_BUILTIN_PABSD128, UNKNOWN, (int) V4SI_FTYPE_V4SI },
21745   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv2si2, "__builtin_ia32_pabsd", IX86_BUILTIN_PABSD, UNKNOWN, (int) V2SI_FTYPE_V2SI },
21746
21747   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phaddwv8hi3, "__builtin_ia32_phaddw128", IX86_BUILTIN_PHADDW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21748   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phaddwv4hi3, "__builtin_ia32_phaddw", IX86_BUILTIN_PHADDW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21749   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phadddv4si3, "__builtin_ia32_phaddd128", IX86_BUILTIN_PHADDD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21750   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phadddv2si3, "__builtin_ia32_phaddd", IX86_BUILTIN_PHADDD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21751   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phaddswv8hi3, "__builtin_ia32_phaddsw128", IX86_BUILTIN_PHADDSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21752   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phaddswv4hi3, "__builtin_ia32_phaddsw", IX86_BUILTIN_PHADDSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21753   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubwv8hi3, "__builtin_ia32_phsubw128", IX86_BUILTIN_PHSUBW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21754   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubwv4hi3, "__builtin_ia32_phsubw", IX86_BUILTIN_PHSUBW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21755   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubdv4si3, "__builtin_ia32_phsubd128", IX86_BUILTIN_PHSUBD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21756   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubdv2si3, "__builtin_ia32_phsubd", IX86_BUILTIN_PHSUBD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21757   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubswv8hi3, "__builtin_ia32_phsubsw128", IX86_BUILTIN_PHSUBSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21758   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubswv4hi3, "__builtin_ia32_phsubsw", IX86_BUILTIN_PHSUBSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21759   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pmaddubsw128, "__builtin_ia32_pmaddubsw128", IX86_BUILTIN_PMADDUBSW128, UNKNOWN, (int) V8HI_FTYPE_V16QI_V16QI },
21760   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pmaddubsw, "__builtin_ia32_pmaddubsw", IX86_BUILTIN_PMADDUBSW, UNKNOWN, (int) V4HI_FTYPE_V8QI_V8QI },
21761   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pmulhrswv8hi3, "__builtin_ia32_pmulhrsw128", IX86_BUILTIN_PMULHRSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21762   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pmulhrswv4hi3, "__builtin_ia32_pmulhrsw", IX86_BUILTIN_PMULHRSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21763   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pshufbv16qi3, "__builtin_ia32_pshufb128", IX86_BUILTIN_PSHUFB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21764   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pshufbv8qi3, "__builtin_ia32_pshufb", IX86_BUILTIN_PSHUFB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21765   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv16qi3, "__builtin_ia32_psignb128", IX86_BUILTIN_PSIGNB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21766   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv8qi3, "__builtin_ia32_psignb", IX86_BUILTIN_PSIGNB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21767   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv8hi3, "__builtin_ia32_psignw128", IX86_BUILTIN_PSIGNW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21768   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv4hi3, "__builtin_ia32_psignw", IX86_BUILTIN_PSIGNW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21769   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv4si3, "__builtin_ia32_psignd128", IX86_BUILTIN_PSIGND128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21770   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv2si3, "__builtin_ia32_psignd", IX86_BUILTIN_PSIGND, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21771
21772   /* SSSE3.  */
21773   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_palignrti, "__builtin_ia32_palignr128", IX86_BUILTIN_PALIGNR128, UNKNOWN, (int) V2DI2TI_FTYPE_V2DI_V2DI_INT },
21774   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_palignrdi, "__builtin_ia32_palignr", IX86_BUILTIN_PALIGNR, UNKNOWN, (int) V1DI2DI_FTYPE_V1DI_V1DI_INT },
21775
21776   /* SSE4.1 */
21777   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_blendpd, "__builtin_ia32_blendpd", IX86_BUILTIN_BLENDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
21778   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_blendps, "__builtin_ia32_blendps", IX86_BUILTIN_BLENDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
21779   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_blendvpd, "__builtin_ia32_blendvpd", IX86_BUILTIN_BLENDVPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_V2DF },
21780   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_blendvps, "__builtin_ia32_blendvps", IX86_BUILTIN_BLENDVPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_V4SF },
21781   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_dppd, "__builtin_ia32_dppd", IX86_BUILTIN_DPPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
21782   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_dpps, "__builtin_ia32_dpps", IX86_BUILTIN_DPPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
21783   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_insertps, "__builtin_ia32_insertps128", IX86_BUILTIN_INSERTPS128, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
21784   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_mpsadbw, "__builtin_ia32_mpsadbw128", IX86_BUILTIN_MPSADBW128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI_INT },
21785   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_pblendvb, "__builtin_ia32_pblendvb128", IX86_BUILTIN_PBLENDVB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI_V16QI },
21786   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_pblendw, "__builtin_ia32_pblendw128", IX86_BUILTIN_PBLENDW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI_INT },
21787
21788   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_extendv8qiv8hi2, "__builtin_ia32_pmovsxbw128", IX86_BUILTIN_PMOVSXBW128, UNKNOWN, (int) V8HI_FTYPE_V16QI },
21789   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_extendv4qiv4si2, "__builtin_ia32_pmovsxbd128", IX86_BUILTIN_PMOVSXBD128, UNKNOWN, (int) V4SI_FTYPE_V16QI },
21790   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_extendv2qiv2di2, "__builtin_ia32_pmovsxbq128", IX86_BUILTIN_PMOVSXBQ128, UNKNOWN, (int) V2DI_FTYPE_V16QI },
21791   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_extendv4hiv4si2, "__builtin_ia32_pmovsxwd128", IX86_BUILTIN_PMOVSXWD128, UNKNOWN, (int) V4SI_FTYPE_V8HI },
21792   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_extendv2hiv2di2, "__builtin_ia32_pmovsxwq128", IX86_BUILTIN_PMOVSXWQ128, UNKNOWN, (int) V2DI_FTYPE_V8HI },
21793   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_extendv2siv2di2, "__builtin_ia32_pmovsxdq128", IX86_BUILTIN_PMOVSXDQ128, UNKNOWN, (int) V2DI_FTYPE_V4SI },
21794   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv8qiv8hi2, "__builtin_ia32_pmovzxbw128", IX86_BUILTIN_PMOVZXBW128, UNKNOWN, (int) V8HI_FTYPE_V16QI },
21795   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv4qiv4si2, "__builtin_ia32_pmovzxbd128", IX86_BUILTIN_PMOVZXBD128, UNKNOWN, (int) V4SI_FTYPE_V16QI },
21796   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv2qiv2di2, "__builtin_ia32_pmovzxbq128", IX86_BUILTIN_PMOVZXBQ128, UNKNOWN, (int) V2DI_FTYPE_V16QI },
21797   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv4hiv4si2, "__builtin_ia32_pmovzxwd128", IX86_BUILTIN_PMOVZXWD128, UNKNOWN, (int) V4SI_FTYPE_V8HI },
21798   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv2hiv2di2, "__builtin_ia32_pmovzxwq128", IX86_BUILTIN_PMOVZXWQ128, UNKNOWN, (int) V2DI_FTYPE_V8HI },
21799   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv2siv2di2, "__builtin_ia32_pmovzxdq128", IX86_BUILTIN_PMOVZXDQ128, UNKNOWN, (int) V2DI_FTYPE_V4SI },
21800   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_phminposuw, "__builtin_ia32_phminposuw128", IX86_BUILTIN_PHMINPOSUW128, UNKNOWN, (int) V8HI_FTYPE_V8HI },
21801
21802   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_packusdw, "__builtin_ia32_packusdw128", IX86_BUILTIN_PACKUSDW128, UNKNOWN, (int) V8HI_FTYPE_V4SI_V4SI },
21803   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_eqv2di3, "__builtin_ia32_pcmpeqq", IX86_BUILTIN_PCMPEQQ, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21804   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_smaxv16qi3, "__builtin_ia32_pmaxsb128", IX86_BUILTIN_PMAXSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21805   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_smaxv4si3, "__builtin_ia32_pmaxsd128", IX86_BUILTIN_PMAXSD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21806   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_umaxv4si3, "__builtin_ia32_pmaxud128", IX86_BUILTIN_PMAXUD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21807   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_umaxv8hi3, "__builtin_ia32_pmaxuw128", IX86_BUILTIN_PMAXUW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21808   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sminv16qi3, "__builtin_ia32_pminsb128", IX86_BUILTIN_PMINSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21809   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sminv4si3, "__builtin_ia32_pminsd128", IX86_BUILTIN_PMINSD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21810   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_uminv4si3, "__builtin_ia32_pminud128", IX86_BUILTIN_PMINUD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21811   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_uminv8hi3, "__builtin_ia32_pminuw128", IX86_BUILTIN_PMINUW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21812   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_mulv2siv2di3, "__builtin_ia32_pmuldq128", IX86_BUILTIN_PMULDQ128, UNKNOWN, (int) V2DI_FTYPE_V4SI_V4SI },
21813   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_mulv4si3, "__builtin_ia32_pmulld128", IX86_BUILTIN_PMULLD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21814
21815   /* SSE4.1 and SSE5 */
21816   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_roundpd, "__builtin_ia32_roundpd", IX86_BUILTIN_ROUNDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_INT },
21817   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_roundps, "__builtin_ia32_roundps", IX86_BUILTIN_ROUNDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_INT },
21818   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_roundsd, "__builtin_ia32_roundsd", IX86_BUILTIN_ROUNDSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
21819   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_roundss, "__builtin_ia32_roundss", IX86_BUILTIN_ROUNDSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
21820
21821   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_ptest, "__builtin_ia32_ptestz128", IX86_BUILTIN_PTESTZ, EQ, (int) INT_FTYPE_V2DI_V2DI_PTEST },
21822   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_ptest, "__builtin_ia32_ptestc128", IX86_BUILTIN_PTESTC, LTU, (int) INT_FTYPE_V2DI_V2DI_PTEST },
21823   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_ptest, "__builtin_ia32_ptestnzc128", IX86_BUILTIN_PTESTNZC, GTU, (int) INT_FTYPE_V2DI_V2DI_PTEST },
21824
21825   /* SSE4.2 */
21826   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_gtv2di3, "__builtin_ia32_pcmpgtq", IX86_BUILTIN_PCMPGTQ, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21827   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_crc32qi, "__builtin_ia32_crc32qi", IX86_BUILTIN_CRC32QI, UNKNOWN, (int) UINT_FTYPE_UINT_UCHAR },
21828   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_crc32hi, "__builtin_ia32_crc32hi", IX86_BUILTIN_CRC32HI, UNKNOWN, (int) UINT_FTYPE_UINT_USHORT },
21829   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_crc32si, "__builtin_ia32_crc32si", IX86_BUILTIN_CRC32SI, UNKNOWN, (int) UINT_FTYPE_UINT_UINT },
21830   { OPTION_MASK_ISA_SSE4_2 | OPTION_MASK_ISA_64BIT, CODE_FOR_sse4_2_crc32di, "__builtin_ia32_crc32di", IX86_BUILTIN_CRC32DI, UNKNOWN, (int) UINT64_FTYPE_UINT64_UINT64 },
21831
21832   /* SSE4A */
21833   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_extrqi, "__builtin_ia32_extrqi", IX86_BUILTIN_EXTRQI, UNKNOWN, (int) V2DI_FTYPE_V2DI_UINT_UINT },
21834   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_extrq, "__builtin_ia32_extrq", IX86_BUILTIN_EXTRQ, UNKNOWN, (int) V2DI_FTYPE_V2DI_V16QI },
21835   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_insertqi, "__builtin_ia32_insertqi", IX86_BUILTIN_INSERTQI, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_UINT_UINT },
21836   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_insertq, "__builtin_ia32_insertq", IX86_BUILTIN_INSERTQ, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21837
21838   /* AES */
21839   { OPTION_MASK_ISA_SSE2, CODE_FOR_aeskeygenassist, 0, IX86_BUILTIN_AESKEYGENASSIST128, UNKNOWN, (int) V2DI_FTYPE_V2DI_INT },
21840   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesimc, 0, IX86_BUILTIN_AESIMC128, UNKNOWN, (int) V2DI_FTYPE_V2DI },
21841
21842   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesenc, 0, IX86_BUILTIN_AESENC128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21843   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesenclast, 0, IX86_BUILTIN_AESENCLAST128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21844   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesdec, 0, IX86_BUILTIN_AESDEC128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21845   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesdeclast, 0, IX86_BUILTIN_AESDECLAST128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21846
21847   /* PCLMUL */
21848   { OPTION_MASK_ISA_SSE2, CODE_FOR_pclmulqdq, 0, IX86_BUILTIN_PCLMULQDQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_INT },
21849
21850   /* AVX */
21851   { OPTION_MASK_ISA_AVX, CODE_FOR_addv4df3, "__builtin_ia32_addpd256", IX86_BUILTIN_ADDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21852   { OPTION_MASK_ISA_AVX, CODE_FOR_addv8sf3, "__builtin_ia32_addps256", IX86_BUILTIN_ADDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21853   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_addsubv4df3, "__builtin_ia32_addsubpd256", IX86_BUILTIN_ADDSUBPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21854   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_addsubv8sf3, "__builtin_ia32_addsubps256", IX86_BUILTIN_ADDSUBPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21855   { OPTION_MASK_ISA_AVX, CODE_FOR_andv4df3, "__builtin_ia32_andpd256", IX86_BUILTIN_ANDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21856   { OPTION_MASK_ISA_AVX, CODE_FOR_andv8sf3, "__builtin_ia32_andps256", IX86_BUILTIN_ANDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21857   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_andnotv4df3, "__builtin_ia32_andnpd256", IX86_BUILTIN_ANDNPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21858   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_andnotv8sf3, "__builtin_ia32_andnps256", IX86_BUILTIN_ANDNPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21859   { OPTION_MASK_ISA_AVX, CODE_FOR_divv4df3, "__builtin_ia32_divpd256", IX86_BUILTIN_DIVPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21860   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_divv8sf3, "__builtin_ia32_divps256", IX86_BUILTIN_DIVPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21861   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_haddv4df3, "__builtin_ia32_haddpd256", IX86_BUILTIN_HADDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21862   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_hsubv8sf3, "__builtin_ia32_hsubps256", IX86_BUILTIN_HSUBPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21863   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_hsubv4df3, "__builtin_ia32_hsubpd256", IX86_BUILTIN_HSUBPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21864   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_haddv8sf3, "__builtin_ia32_haddps256", IX86_BUILTIN_HADDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21865   { OPTION_MASK_ISA_AVX, CODE_FOR_smaxv4df3, "__builtin_ia32_maxpd256", IX86_BUILTIN_MAXPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21866   { OPTION_MASK_ISA_AVX, CODE_FOR_smaxv8sf3, "__builtin_ia32_maxps256", IX86_BUILTIN_MAXPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21867   { OPTION_MASK_ISA_AVX, CODE_FOR_sminv4df3, "__builtin_ia32_minpd256", IX86_BUILTIN_MINPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21868   { OPTION_MASK_ISA_AVX, CODE_FOR_sminv8sf3, "__builtin_ia32_minps256", IX86_BUILTIN_MINPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21869   { OPTION_MASK_ISA_AVX, CODE_FOR_mulv4df3, "__builtin_ia32_mulpd256", IX86_BUILTIN_MULPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21870   { OPTION_MASK_ISA_AVX, CODE_FOR_mulv8sf3, "__builtin_ia32_mulps256", IX86_BUILTIN_MULPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21871   { OPTION_MASK_ISA_AVX, CODE_FOR_iorv4df3, "__builtin_ia32_orpd256", IX86_BUILTIN_ORPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21872   { OPTION_MASK_ISA_AVX, CODE_FOR_iorv8sf3, "__builtin_ia32_orps256", IX86_BUILTIN_ORPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21873   { OPTION_MASK_ISA_AVX, CODE_FOR_subv4df3, "__builtin_ia32_subpd256", IX86_BUILTIN_SUBPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21874   { OPTION_MASK_ISA_AVX, CODE_FOR_subv8sf3, "__builtin_ia32_subps256", IX86_BUILTIN_SUBPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21875   { OPTION_MASK_ISA_AVX, CODE_FOR_xorv4df3, "__builtin_ia32_xorpd256", IX86_BUILTIN_XORPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21876   { OPTION_MASK_ISA_AVX, CODE_FOR_xorv8sf3, "__builtin_ia32_xorps256", IX86_BUILTIN_XORPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21877
21878   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilvarv2df3, "__builtin_ia32_vpermilvarpd", IX86_BUILTIN_VPERMILVARPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DI },
21879   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilvarv4sf3, "__builtin_ia32_vpermilvarps", IX86_BUILTIN_VPERMILVARPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SI },
21880   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilvarv4df3, "__builtin_ia32_vpermilvarpd256", IX86_BUILTIN_VPERMILVARPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DI },
21881   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilvarv8sf3, "__builtin_ia32_vpermilvarps256", IX86_BUILTIN_VPERMILVARPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SI },
21882
21883   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_blendpd256, "__builtin_ia32_blendpd256", IX86_BUILTIN_BLENDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_INT },
21884   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_blendps256, "__builtin_ia32_blendps256", IX86_BUILTIN_BLENDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
21885   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_blendvpd256, "__builtin_ia32_blendvpd256", IX86_BUILTIN_BLENDVPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_V4DF },
21886   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_blendvps256, "__builtin_ia32_blendvps256", IX86_BUILTIN_BLENDVPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_V8SF },
21887   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_dpps256, "__builtin_ia32_dpps256", IX86_BUILTIN_DPPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
21888   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_shufpd256, "__builtin_ia32_shufpd256", IX86_BUILTIN_SHUFPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_INT },
21889   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_shufps256, "__builtin_ia32_shufps256", IX86_BUILTIN_SHUFPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
21890   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmpsdv2df3, "__builtin_ia32_cmpsd", IX86_BUILTIN_CMPSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
21891   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmpssv4sf3, "__builtin_ia32_cmpss", IX86_BUILTIN_CMPSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
21892   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmppdv2df3, "__builtin_ia32_cmppd", IX86_BUILTIN_CMPPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
21893   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmppsv4sf3, "__builtin_ia32_cmpps", IX86_BUILTIN_CMPPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
21894   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmppdv4df3, "__builtin_ia32_cmppd256", IX86_BUILTIN_CMPPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_INT },
21895   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmppsv8sf3, "__builtin_ia32_cmpps256", IX86_BUILTIN_CMPPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
21896   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vextractf128v4df, "__builtin_ia32_vextractf128_pd256", IX86_BUILTIN_EXTRACTF128PD256, UNKNOWN, (int) V2DF_FTYPE_V4DF_INT },
21897   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vextractf128v8sf, "__builtin_ia32_vextractf128_ps256", IX86_BUILTIN_EXTRACTF128PS256, UNKNOWN, (int) V4SF_FTYPE_V8SF_INT },
21898   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vextractf128v8si, "__builtin_ia32_vextractf128_si256", IX86_BUILTIN_EXTRACTF128SI256, UNKNOWN, (int) V4SI_FTYPE_V8SI_INT },
21899   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtdq2pd256, "__builtin_ia32_cvtdq2pd256", IX86_BUILTIN_CVTDQ2PD256, UNKNOWN, (int) V4DF_FTYPE_V4SI },
21900   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtdq2ps256, "__builtin_ia32_cvtdq2ps256", IX86_BUILTIN_CVTDQ2PS256, UNKNOWN, (int) V8SF_FTYPE_V8SI },
21901   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtpd2ps256, "__builtin_ia32_cvtpd2ps256", IX86_BUILTIN_CVTPD2PS256, UNKNOWN, (int) V4SF_FTYPE_V4DF },
21902   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtps2dq256, "__builtin_ia32_cvtps2dq256", IX86_BUILTIN_CVTPS2DQ256, UNKNOWN, (int) V8SI_FTYPE_V8SF },
21903   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtps2pd256, "__builtin_ia32_cvtps2pd256", IX86_BUILTIN_CVTPS2PD256, UNKNOWN, (int) V4DF_FTYPE_V4SF },
21904   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvttpd2dq256, "__builtin_ia32_cvttpd2dq256", IX86_BUILTIN_CVTTPD2DQ256, UNKNOWN, (int) V4SI_FTYPE_V4DF },
21905   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtpd2dq256, "__builtin_ia32_cvtpd2dq256", IX86_BUILTIN_CVTPD2DQ256, UNKNOWN, (int) V4SI_FTYPE_V4DF },
21906   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvttps2dq256, "__builtin_ia32_cvttps2dq256", IX86_BUILTIN_CVTTPS2DQ256, UNKNOWN, (int) V8SI_FTYPE_V8SF },
21907   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vperm2f128v4df3, "__builtin_ia32_vperm2f128_pd256", IX86_BUILTIN_VPERM2F128PD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_INT },
21908   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vperm2f128v8sf3, "__builtin_ia32_vperm2f128_ps256", IX86_BUILTIN_VPERM2F128PS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
21909   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vperm2f128v8si3, "__builtin_ia32_vperm2f128_si256", IX86_BUILTIN_VPERM2F128SI256, UNKNOWN, (int) V8SI_FTYPE_V8SI_V8SI_INT },
21910   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilv2df, "__builtin_ia32_vpermilpd", IX86_BUILTIN_VPERMILPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_INT },
21911   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilv4sf, "__builtin_ia32_vpermilps", IX86_BUILTIN_VPERMILPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_INT },
21912   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilv4df, "__builtin_ia32_vpermilpd256", IX86_BUILTIN_VPERMILPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_INT },
21913   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilv8sf, "__builtin_ia32_vpermilps256", IX86_BUILTIN_VPERMILPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_INT },
21914   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vinsertf128v4df, "__builtin_ia32_vinsertf128_pd256", IX86_BUILTIN_VINSERTF128PD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V2DF_INT },
21915   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vinsertf128v8sf, "__builtin_ia32_vinsertf128_ps256", IX86_BUILTIN_VINSERTF128PS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V4SF_INT },
21916   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vinsertf128v8si, "__builtin_ia32_vinsertf128_si256", IX86_BUILTIN_VINSERTF128SI256, UNKNOWN, (int) V8SI_FTYPE_V8SI_V4SI_INT },
21917
21918   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movshdup256, "__builtin_ia32_movshdup256", IX86_BUILTIN_MOVSHDUP256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
21919   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movsldup256, "__builtin_ia32_movsldup256", IX86_BUILTIN_MOVSLDUP256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
21920   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movddup256, "__builtin_ia32_movddup256", IX86_BUILTIN_MOVDDUP256, UNKNOWN, (int) V4DF_FTYPE_V4DF },
21921
21922   { OPTION_MASK_ISA_AVX, CODE_FOR_sqrtv4df2, "__builtin_ia32_sqrtpd256", IX86_BUILTIN_SQRTPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF },
21923   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_sqrtv8sf2, "__builtin_ia32_sqrtps256", IX86_BUILTIN_SQRTPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
21924   { OPTION_MASK_ISA_AVX, CODE_FOR_sqrtv8sf2, "__builtin_ia32_sqrtps_nr256", IX86_BUILTIN_SQRTPS_NR256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
21925   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_rsqrtv8sf2, "__builtin_ia32_rsqrtps256", IX86_BUILTIN_RSQRTPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
21926   { OPTION_MASK_ISA_AVX, CODE_FOR_rsqrtv8sf2, "__builtin_ia32_rsqrtps_nr256", IX86_BUILTIN_RSQRTPS_NR256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
21927
21928   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_rcpv8sf2, "__builtin_ia32_rcpps256", IX86_BUILTIN_RCPPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
21929
21930   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_roundpd256, "__builtin_ia32_roundpd256", IX86_BUILTIN_ROUNDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_INT },
21931   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_roundps256, "__builtin_ia32_roundps256", IX86_BUILTIN_ROUNDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_INT },
21932
21933   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_unpckhpd256,  "__builtin_ia32_unpckhpd256", IX86_BUILTIN_UNPCKHPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21934   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_unpcklpd256,  "__builtin_ia32_unpcklpd256", IX86_BUILTIN_UNPCKLPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21935   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_unpckhps256,  "__builtin_ia32_unpckhps256", IX86_BUILTIN_UNPCKHPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21936   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_unpcklps256,  "__builtin_ia32_unpcklps256", IX86_BUILTIN_UNPCKLPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21937
21938   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_si256_si, "__builtin_ia32_si256_si", IX86_BUILTIN_SI256_SI, UNKNOWN, (int) V8SI_FTYPE_V4SI },
21939   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_ps256_ps, "__builtin_ia32_ps256_ps", IX86_BUILTIN_PS256_PS, UNKNOWN, (int) V8SF_FTYPE_V4SF },
21940   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_pd256_pd, "__builtin_ia32_pd256_pd", IX86_BUILTIN_PD256_PD, UNKNOWN, (int) V4DF_FTYPE_V2DF },
21941   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_si_si256, "__builtin_ia32_si_si256", IX86_BUILTIN_SI_SI256, UNKNOWN, (int) V4SI_FTYPE_V8SI },
21942   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_ps_ps256, "__builtin_ia32_ps_ps256", IX86_BUILTIN_PS_PS256, UNKNOWN, (int) V4SF_FTYPE_V8SF },
21943   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_pd_pd256, "__builtin_ia32_pd_pd256", IX86_BUILTIN_PD_PD256, UNKNOWN, (int) V2DF_FTYPE_V4DF },
21944
21945   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd, "__builtin_ia32_vtestzpd", IX86_BUILTIN_VTESTZPD, EQ, (int) INT_FTYPE_V2DF_V2DF_PTEST },
21946   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd, "__builtin_ia32_vtestcpd", IX86_BUILTIN_VTESTCPD, LTU, (int) INT_FTYPE_V2DF_V2DF_PTEST },
21947   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd, "__builtin_ia32_vtestnzcpd", IX86_BUILTIN_VTESTNZCPD, GTU, (int) INT_FTYPE_V2DF_V2DF_PTEST },
21948   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps, "__builtin_ia32_vtestzps", IX86_BUILTIN_VTESTZPS, EQ, (int) INT_FTYPE_V4SF_V4SF_PTEST },
21949   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps, "__builtin_ia32_vtestcps", IX86_BUILTIN_VTESTCPS, LTU, (int) INT_FTYPE_V4SF_V4SF_PTEST },
21950   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps, "__builtin_ia32_vtestnzcps", IX86_BUILTIN_VTESTNZCPS, GTU, (int) INT_FTYPE_V4SF_V4SF_PTEST },
21951   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd256, "__builtin_ia32_vtestzpd256", IX86_BUILTIN_VTESTZPD256, EQ, (int) INT_FTYPE_V4DF_V4DF_PTEST },
21952   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd256, "__builtin_ia32_vtestcpd256", IX86_BUILTIN_VTESTCPD256, LTU, (int) INT_FTYPE_V4DF_V4DF_PTEST },
21953   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd256, "__builtin_ia32_vtestnzcpd256", IX86_BUILTIN_VTESTNZCPD256, GTU, (int) INT_FTYPE_V4DF_V4DF_PTEST },
21954   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps256, "__builtin_ia32_vtestzps256", IX86_BUILTIN_VTESTZPS256, EQ, (int) INT_FTYPE_V8SF_V8SF_PTEST },
21955   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps256, "__builtin_ia32_vtestcps256", IX86_BUILTIN_VTESTCPS256, LTU, (int) INT_FTYPE_V8SF_V8SF_PTEST },
21956   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps256, "__builtin_ia32_vtestnzcps256", IX86_BUILTIN_VTESTNZCPS256, GTU, (int) INT_FTYPE_V8SF_V8SF_PTEST },
21957   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_ptest256, "__builtin_ia32_ptestz256", IX86_BUILTIN_PTESTZ256, EQ, (int) INT_FTYPE_V4DI_V4DI_PTEST },
21958   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_ptest256, "__builtin_ia32_ptestc256", IX86_BUILTIN_PTESTC256, LTU, (int) INT_FTYPE_V4DI_V4DI_PTEST },
21959   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_ptest256, "__builtin_ia32_ptestnzc256", IX86_BUILTIN_PTESTNZC256, GTU, (int) INT_FTYPE_V4DI_V4DI_PTEST },
21960
21961   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movmskpd256, "__builtin_ia32_movmskpd256", IX86_BUILTIN_MOVMSKPD256, UNKNOWN, (int) INT_FTYPE_V4DF  },
21962   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movmskps256, "__builtin_ia32_movmskps256", IX86_BUILTIN_MOVMSKPS256, UNKNOWN, (int) INT_FTYPE_V8SF },
21963 };
21964
21965 /* SSE5 */
21966 enum multi_arg_type {
21967   MULTI_ARG_UNKNOWN,
21968   MULTI_ARG_3_SF,
21969   MULTI_ARG_3_DF,
21970   MULTI_ARG_3_DI,
21971   MULTI_ARG_3_SI,
21972   MULTI_ARG_3_SI_DI,
21973   MULTI_ARG_3_HI,
21974   MULTI_ARG_3_HI_SI,
21975   MULTI_ARG_3_QI,
21976   MULTI_ARG_3_PERMPS,
21977   MULTI_ARG_3_PERMPD,
21978   MULTI_ARG_2_SF,
21979   MULTI_ARG_2_DF,
21980   MULTI_ARG_2_DI,
21981   MULTI_ARG_2_SI,
21982   MULTI_ARG_2_HI,
21983   MULTI_ARG_2_QI,
21984   MULTI_ARG_2_DI_IMM,
21985   MULTI_ARG_2_SI_IMM,
21986   MULTI_ARG_2_HI_IMM,
21987   MULTI_ARG_2_QI_IMM,
21988   MULTI_ARG_2_SF_CMP,
21989   MULTI_ARG_2_DF_CMP,
21990   MULTI_ARG_2_DI_CMP,
21991   MULTI_ARG_2_SI_CMP,
21992   MULTI_ARG_2_HI_CMP,
21993   MULTI_ARG_2_QI_CMP,
21994   MULTI_ARG_2_DI_TF,
21995   MULTI_ARG_2_SI_TF,
21996   MULTI_ARG_2_HI_TF,
21997   MULTI_ARG_2_QI_TF,
21998   MULTI_ARG_2_SF_TF,
21999   MULTI_ARG_2_DF_TF,
22000   MULTI_ARG_1_SF,
22001   MULTI_ARG_1_DF,
22002   MULTI_ARG_1_DI,
22003   MULTI_ARG_1_SI,
22004   MULTI_ARG_1_HI,
22005   MULTI_ARG_1_QI,
22006   MULTI_ARG_1_SI_DI,
22007   MULTI_ARG_1_HI_DI,
22008   MULTI_ARG_1_HI_SI,
22009   MULTI_ARG_1_QI_DI,
22010   MULTI_ARG_1_QI_SI,
22011   MULTI_ARG_1_QI_HI,
22012   MULTI_ARG_1_PH2PS,
22013   MULTI_ARG_1_PS2PH
22014 };
22015
22016 static const struct builtin_description bdesc_multi_arg[] =
22017 {
22018   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_vmfmaddv4sf4,     "__builtin_ia32_fmaddss",    IX86_BUILTIN_FMADDSS,    UNKNOWN,      (int)MULTI_ARG_3_SF },
22019   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_vmfmaddv2df4,     "__builtin_ia32_fmaddsd",    IX86_BUILTIN_FMADDSD,    UNKNOWN,      (int)MULTI_ARG_3_DF },
22020   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_fmaddv4sf4,       "__builtin_ia32_fmaddps",    IX86_BUILTIN_FMADDPS,    UNKNOWN,      (int)MULTI_ARG_3_SF },
22021   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_fmaddv2df4,       "__builtin_ia32_fmaddpd",    IX86_BUILTIN_FMADDPD,    UNKNOWN,      (int)MULTI_ARG_3_DF },
22022   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_vmfmsubv4sf4,     "__builtin_ia32_fmsubss",    IX86_BUILTIN_FMSUBSS,    UNKNOWN,      (int)MULTI_ARG_3_SF },
22023   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_vmfmsubv2df4,     "__builtin_ia32_fmsubsd",    IX86_BUILTIN_FMSUBSD,    UNKNOWN,      (int)MULTI_ARG_3_DF },
22024   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_fmsubv4sf4,       "__builtin_ia32_fmsubps",    IX86_BUILTIN_FMSUBPS,    UNKNOWN,      (int)MULTI_ARG_3_SF },
22025   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_fmsubv2df4,       "__builtin_ia32_fmsubpd",    IX86_BUILTIN_FMSUBPD,    UNKNOWN,      (int)MULTI_ARG_3_DF },
22026   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_vmfnmaddv4sf4,    "__builtin_ia32_fnmaddss",   IX86_BUILTIN_FNMADDSS,   UNKNOWN,      (int)MULTI_ARG_3_SF },
22027   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_vmfnmaddv2df4,    "__builtin_ia32_fnmaddsd",   IX86_BUILTIN_FNMADDSD,   UNKNOWN,      (int)MULTI_ARG_3_DF },
22028   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_fnmaddv4sf4,      "__builtin_ia32_fnmaddps",   IX86_BUILTIN_FNMADDPS,   UNKNOWN,      (int)MULTI_ARG_3_SF },
22029   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_fnmaddv2df4,      "__builtin_ia32_fnmaddpd",   IX86_BUILTIN_FNMADDPD,   UNKNOWN,      (int)MULTI_ARG_3_DF },
22030   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_vmfnmsubv4sf4,    "__builtin_ia32_fnmsubss",   IX86_BUILTIN_FNMSUBSS,   UNKNOWN,      (int)MULTI_ARG_3_SF },
22031   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_vmfnmsubv2df4,    "__builtin_ia32_fnmsubsd",   IX86_BUILTIN_FNMSUBSD,   UNKNOWN,      (int)MULTI_ARG_3_DF },
22032   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_fnmsubv4sf4,      "__builtin_ia32_fnmsubps",   IX86_BUILTIN_FNMSUBPS,   UNKNOWN,      (int)MULTI_ARG_3_SF },
22033   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_fnmsubv2df4,      "__builtin_ia32_fnmsubpd",   IX86_BUILTIN_FNMSUBPD,   UNKNOWN,      (int)MULTI_ARG_3_DF },
22034   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcmov_v2di,        "__builtin_ia32_pcmov",      IX86_BUILTIN_PCMOV,      UNKNOWN,      (int)MULTI_ARG_3_DI },
22035   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcmov_v2di,        "__builtin_ia32_pcmov_v2di", IX86_BUILTIN_PCMOV_V2DI, UNKNOWN,      (int)MULTI_ARG_3_DI },
22036   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcmov_v4si,        "__builtin_ia32_pcmov_v4si", IX86_BUILTIN_PCMOV_V4SI, UNKNOWN,      (int)MULTI_ARG_3_SI },
22037   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcmov_v8hi,        "__builtin_ia32_pcmov_v8hi", IX86_BUILTIN_PCMOV_V8HI, UNKNOWN,      (int)MULTI_ARG_3_HI },
22038   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcmov_v16qi,       "__builtin_ia32_pcmov_v16qi",IX86_BUILTIN_PCMOV_V16QI,UNKNOWN,      (int)MULTI_ARG_3_QI },
22039   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcmov_v2df,        "__builtin_ia32_pcmov_v2df", IX86_BUILTIN_PCMOV_V2DF, UNKNOWN,      (int)MULTI_ARG_3_DF },
22040   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcmov_v4sf,        "__builtin_ia32_pcmov_v4sf", IX86_BUILTIN_PCMOV_V4SF, UNKNOWN,      (int)MULTI_ARG_3_SF },
22041   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pperm,             "__builtin_ia32_pperm",      IX86_BUILTIN_PPERM,      UNKNOWN,      (int)MULTI_ARG_3_QI },
22042   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_permv4sf,          "__builtin_ia32_permps",     IX86_BUILTIN_PERMPS,     UNKNOWN,      (int)MULTI_ARG_3_PERMPS },
22043   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_permv2df,          "__builtin_ia32_permpd",     IX86_BUILTIN_PERMPD,     UNKNOWN,      (int)MULTI_ARG_3_PERMPD },
22044   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmacssww,          "__builtin_ia32_pmacssww",   IX86_BUILTIN_PMACSSWW,   UNKNOWN,      (int)MULTI_ARG_3_HI },
22045   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmacsww,           "__builtin_ia32_pmacsww",    IX86_BUILTIN_PMACSWW,    UNKNOWN,      (int)MULTI_ARG_3_HI },
22046   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmacsswd,          "__builtin_ia32_pmacsswd",   IX86_BUILTIN_PMACSSWD,   UNKNOWN,      (int)MULTI_ARG_3_HI_SI },
22047   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmacswd,           "__builtin_ia32_pmacswd",    IX86_BUILTIN_PMACSWD,    UNKNOWN,      (int)MULTI_ARG_3_HI_SI },
22048   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmacssdd,          "__builtin_ia32_pmacssdd",   IX86_BUILTIN_PMACSSDD,   UNKNOWN,      (int)MULTI_ARG_3_SI },
22049   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmacsdd,           "__builtin_ia32_pmacsdd",    IX86_BUILTIN_PMACSDD,    UNKNOWN,      (int)MULTI_ARG_3_SI },
22050   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmacssdql,         "__builtin_ia32_pmacssdql",  IX86_BUILTIN_PMACSSDQL,  UNKNOWN,      (int)MULTI_ARG_3_SI_DI },
22051   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmacssdqh,         "__builtin_ia32_pmacssdqh",  IX86_BUILTIN_PMACSSDQH,  UNKNOWN,      (int)MULTI_ARG_3_SI_DI },
22052   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmacsdql,          "__builtin_ia32_pmacsdql",   IX86_BUILTIN_PMACSDQL,   UNKNOWN,      (int)MULTI_ARG_3_SI_DI },
22053   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmacsdqh,          "__builtin_ia32_pmacsdqh",   IX86_BUILTIN_PMACSDQH,   UNKNOWN,      (int)MULTI_ARG_3_SI_DI },
22054   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmadcsswd,         "__builtin_ia32_pmadcsswd",  IX86_BUILTIN_PMADCSSWD,  UNKNOWN,      (int)MULTI_ARG_3_HI_SI },
22055   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmadcswd,          "__builtin_ia32_pmadcswd",   IX86_BUILTIN_PMADCSWD,   UNKNOWN,      (int)MULTI_ARG_3_HI_SI },
22056   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vrotlv2di3,        "__builtin_ia32_protq",      IX86_BUILTIN_PROTQ,      UNKNOWN,      (int)MULTI_ARG_2_DI },
22057   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vrotlv4si3,        "__builtin_ia32_protd",      IX86_BUILTIN_PROTD,      UNKNOWN,      (int)MULTI_ARG_2_SI },
22058   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vrotlv8hi3,        "__builtin_ia32_protw",      IX86_BUILTIN_PROTW,      UNKNOWN,      (int)MULTI_ARG_2_HI },
22059   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vrotlv16qi3,       "__builtin_ia32_protb",      IX86_BUILTIN_PROTB,      UNKNOWN,      (int)MULTI_ARG_2_QI },
22060   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_rotlv2di3,         "__builtin_ia32_protqi",     IX86_BUILTIN_PROTQ_IMM,  UNKNOWN,      (int)MULTI_ARG_2_DI_IMM },
22061   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_rotlv4si3,         "__builtin_ia32_protdi",     IX86_BUILTIN_PROTD_IMM,  UNKNOWN,      (int)MULTI_ARG_2_SI_IMM },
22062   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_rotlv8hi3,         "__builtin_ia32_protwi",     IX86_BUILTIN_PROTW_IMM,  UNKNOWN,      (int)MULTI_ARG_2_HI_IMM },
22063   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_rotlv16qi3,        "__builtin_ia32_protbi",     IX86_BUILTIN_PROTB_IMM,  UNKNOWN,      (int)MULTI_ARG_2_QI_IMM },
22064   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_ashlv2di3,         "__builtin_ia32_pshaq",      IX86_BUILTIN_PSHAQ,      UNKNOWN,      (int)MULTI_ARG_2_DI },
22065   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_ashlv4si3,         "__builtin_ia32_pshad",      IX86_BUILTIN_PSHAD,      UNKNOWN,      (int)MULTI_ARG_2_SI },
22066   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_ashlv8hi3,         "__builtin_ia32_pshaw",      IX86_BUILTIN_PSHAW,      UNKNOWN,      (int)MULTI_ARG_2_HI },
22067   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_ashlv16qi3,        "__builtin_ia32_pshab",      IX86_BUILTIN_PSHAB,      UNKNOWN,      (int)MULTI_ARG_2_QI },
22068   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_lshlv2di3,         "__builtin_ia32_pshlq",      IX86_BUILTIN_PSHLQ,      UNKNOWN,      (int)MULTI_ARG_2_DI },
22069   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_lshlv4si3,         "__builtin_ia32_pshld",      IX86_BUILTIN_PSHLD,      UNKNOWN,      (int)MULTI_ARG_2_SI },
22070   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_lshlv8hi3,         "__builtin_ia32_pshlw",      IX86_BUILTIN_PSHLW,      UNKNOWN,      (int)MULTI_ARG_2_HI },
22071   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_lshlv16qi3,        "__builtin_ia32_pshlb",      IX86_BUILTIN_PSHLB,      UNKNOWN,      (int)MULTI_ARG_2_QI },
22072   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmfrczv4sf2,       "__builtin_ia32_frczss",     IX86_BUILTIN_FRCZSS,     UNKNOWN,      (int)MULTI_ARG_2_SF },
22073   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmfrczv2df2,       "__builtin_ia32_frczsd",     IX86_BUILTIN_FRCZSD,     UNKNOWN,      (int)MULTI_ARG_2_DF },
22074   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_frczv4sf2,         "__builtin_ia32_frczps",     IX86_BUILTIN_FRCZPS,     UNKNOWN,      (int)MULTI_ARG_1_SF },
22075   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_frczv2df2,         "__builtin_ia32_frczpd",     IX86_BUILTIN_FRCZPD,     UNKNOWN,      (int)MULTI_ARG_1_DF },
22076   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_cvtph2ps,          "__builtin_ia32_cvtph2ps",   IX86_BUILTIN_CVTPH2PS,   UNKNOWN,      (int)MULTI_ARG_1_PH2PS },
22077   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_cvtps2ph,          "__builtin_ia32_cvtps2ph",   IX86_BUILTIN_CVTPS2PH,   UNKNOWN,      (int)MULTI_ARG_1_PS2PH },
22078   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phaddbw,           "__builtin_ia32_phaddbw",    IX86_BUILTIN_PHADDBW,    UNKNOWN,      (int)MULTI_ARG_1_QI_HI },
22079   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phaddbd,           "__builtin_ia32_phaddbd",    IX86_BUILTIN_PHADDBD,    UNKNOWN,      (int)MULTI_ARG_1_QI_SI },
22080   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phaddbq,           "__builtin_ia32_phaddbq",    IX86_BUILTIN_PHADDBQ,    UNKNOWN,      (int)MULTI_ARG_1_QI_DI },
22081   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phaddwd,           "__builtin_ia32_phaddwd",    IX86_BUILTIN_PHADDWD,    UNKNOWN,      (int)MULTI_ARG_1_HI_SI },
22082   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phaddwq,           "__builtin_ia32_phaddwq",    IX86_BUILTIN_PHADDWQ,    UNKNOWN,      (int)MULTI_ARG_1_HI_DI },
22083   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phadddq,           "__builtin_ia32_phadddq",    IX86_BUILTIN_PHADDDQ,    UNKNOWN,      (int)MULTI_ARG_1_SI_DI },
22084   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phaddubw,          "__builtin_ia32_phaddubw",   IX86_BUILTIN_PHADDUBW,   UNKNOWN,      (int)MULTI_ARG_1_QI_HI },
22085   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phaddubd,          "__builtin_ia32_phaddubd",   IX86_BUILTIN_PHADDUBD,   UNKNOWN,      (int)MULTI_ARG_1_QI_SI },
22086   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phaddubq,          "__builtin_ia32_phaddubq",   IX86_BUILTIN_PHADDUBQ,   UNKNOWN,      (int)MULTI_ARG_1_QI_DI },
22087   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phadduwd,          "__builtin_ia32_phadduwd",   IX86_BUILTIN_PHADDUWD,   UNKNOWN,      (int)MULTI_ARG_1_HI_SI },
22088   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phadduwq,          "__builtin_ia32_phadduwq",   IX86_BUILTIN_PHADDUWQ,   UNKNOWN,      (int)MULTI_ARG_1_HI_DI },
22089   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phaddudq,          "__builtin_ia32_phaddudq",   IX86_BUILTIN_PHADDUDQ,   UNKNOWN,      (int)MULTI_ARG_1_SI_DI },
22090   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phsubbw,           "__builtin_ia32_phsubbw",    IX86_BUILTIN_PHSUBBW,    UNKNOWN,      (int)MULTI_ARG_1_QI_HI },
22091   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phsubwd,           "__builtin_ia32_phsubwd",    IX86_BUILTIN_PHSUBWD,    UNKNOWN,      (int)MULTI_ARG_1_HI_SI },
22092   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phsubdq,           "__builtin_ia32_phsubdq",    IX86_BUILTIN_PHSUBDQ,    UNKNOWN,      (int)MULTI_ARG_1_SI_DI },
22093
22094   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comeqss",    IX86_BUILTIN_COMEQSS,    EQ,           (int)MULTI_ARG_2_SF_CMP },
22095   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comness",    IX86_BUILTIN_COMNESS,    NE,           (int)MULTI_ARG_2_SF_CMP },
22096   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comneqss",   IX86_BUILTIN_COMNESS,    NE,           (int)MULTI_ARG_2_SF_CMP },
22097   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comltss",    IX86_BUILTIN_COMLTSS,    LT,           (int)MULTI_ARG_2_SF_CMP },
22098   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comless",    IX86_BUILTIN_COMLESS,    LE,           (int)MULTI_ARG_2_SF_CMP },
22099   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comgtss",    IX86_BUILTIN_COMGTSS,    GT,           (int)MULTI_ARG_2_SF_CMP },
22100   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comgess",    IX86_BUILTIN_COMGESS,    GE,           (int)MULTI_ARG_2_SF_CMP },
22101   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comueqss",   IX86_BUILTIN_COMUEQSS,   UNEQ,         (int)MULTI_ARG_2_SF_CMP },
22102   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comuness",   IX86_BUILTIN_COMUNESS,   LTGT,         (int)MULTI_ARG_2_SF_CMP },
22103   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comuneqss",  IX86_BUILTIN_COMUNESS,   LTGT,         (int)MULTI_ARG_2_SF_CMP },
22104   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comunltss",  IX86_BUILTIN_COMULTSS,   UNLT,         (int)MULTI_ARG_2_SF_CMP },
22105   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comunless",  IX86_BUILTIN_COMULESS,   UNLE,         (int)MULTI_ARG_2_SF_CMP },
22106   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comungtss",  IX86_BUILTIN_COMUGTSS,   UNGT,         (int)MULTI_ARG_2_SF_CMP },
22107   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comungess",  IX86_BUILTIN_COMUGESS,   UNGE,         (int)MULTI_ARG_2_SF_CMP },
22108   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comordss",   IX86_BUILTIN_COMORDSS,   ORDERED,      (int)MULTI_ARG_2_SF_CMP },
22109   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comunordss", IX86_BUILTIN_COMUNORDSS, UNORDERED,    (int)MULTI_ARG_2_SF_CMP },
22110
22111   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comeqsd",    IX86_BUILTIN_COMEQSD,    EQ,           (int)MULTI_ARG_2_DF_CMP },
22112   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comnesd",    IX86_BUILTIN_COMNESD,    NE,           (int)MULTI_ARG_2_DF_CMP },
22113   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comneqsd",   IX86_BUILTIN_COMNESD,    NE,           (int)MULTI_ARG_2_DF_CMP },
22114   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comltsd",    IX86_BUILTIN_COMLTSD,    LT,           (int)MULTI_ARG_2_DF_CMP },
22115   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comlesd",    IX86_BUILTIN_COMLESD,    LE,           (int)MULTI_ARG_2_DF_CMP },
22116   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comgtsd",    IX86_BUILTIN_COMGTSD,    GT,           (int)MULTI_ARG_2_DF_CMP },
22117   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comgesd",    IX86_BUILTIN_COMGESD,    GE,           (int)MULTI_ARG_2_DF_CMP },
22118   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comueqsd",   IX86_BUILTIN_COMUEQSD,   UNEQ,         (int)MULTI_ARG_2_DF_CMP },
22119   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comunesd",   IX86_BUILTIN_COMUNESD,   LTGT,         (int)MULTI_ARG_2_DF_CMP },
22120   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comuneqsd",  IX86_BUILTIN_COMUNESD,   LTGT,         (int)MULTI_ARG_2_DF_CMP },
22121   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comunltsd",  IX86_BUILTIN_COMULTSD,   UNLT,         (int)MULTI_ARG_2_DF_CMP },
22122   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comunlesd",  IX86_BUILTIN_COMULESD,   UNLE,         (int)MULTI_ARG_2_DF_CMP },
22123   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comungtsd",  IX86_BUILTIN_COMUGTSD,   UNGT,         (int)MULTI_ARG_2_DF_CMP },
22124   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comungesd",  IX86_BUILTIN_COMUGESD,   UNGE,         (int)MULTI_ARG_2_DF_CMP },
22125   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comordsd",   IX86_BUILTIN_COMORDSD,   ORDERED,      (int)MULTI_ARG_2_DF_CMP },
22126   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comunordsd", IX86_BUILTIN_COMUNORDSD, UNORDERED,    (int)MULTI_ARG_2_DF_CMP },
22127
22128   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comeqps",    IX86_BUILTIN_COMEQPS,    EQ,           (int)MULTI_ARG_2_SF_CMP },
22129   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comneps",    IX86_BUILTIN_COMNEPS,    NE,           (int)MULTI_ARG_2_SF_CMP },
22130   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comneqps",   IX86_BUILTIN_COMNEPS,    NE,           (int)MULTI_ARG_2_SF_CMP },
22131   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comltps",    IX86_BUILTIN_COMLTPS,    LT,           (int)MULTI_ARG_2_SF_CMP },
22132   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comleps",    IX86_BUILTIN_COMLEPS,    LE,           (int)MULTI_ARG_2_SF_CMP },
22133   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comgtps",    IX86_BUILTIN_COMGTPS,    GT,           (int)MULTI_ARG_2_SF_CMP },
22134   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comgeps",    IX86_BUILTIN_COMGEPS,    GE,           (int)MULTI_ARG_2_SF_CMP },
22135   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comueqps",   IX86_BUILTIN_COMUEQPS,   UNEQ,         (int)MULTI_ARG_2_SF_CMP },
22136   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comuneps",   IX86_BUILTIN_COMUNEPS,   LTGT,         (int)MULTI_ARG_2_SF_CMP },
22137   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comuneqps",  IX86_BUILTIN_COMUNEPS,   LTGT,         (int)MULTI_ARG_2_SF_CMP },
22138   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comunltps",  IX86_BUILTIN_COMULTPS,   UNLT,         (int)MULTI_ARG_2_SF_CMP },
22139   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comunleps",  IX86_BUILTIN_COMULEPS,   UNLE,         (int)MULTI_ARG_2_SF_CMP },
22140   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comungtps",  IX86_BUILTIN_COMUGTPS,   UNGT,         (int)MULTI_ARG_2_SF_CMP },
22141   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comungeps",  IX86_BUILTIN_COMUGEPS,   UNGE,         (int)MULTI_ARG_2_SF_CMP },
22142   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comordps",   IX86_BUILTIN_COMORDPS,   ORDERED,      (int)MULTI_ARG_2_SF_CMP },
22143   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comunordps", IX86_BUILTIN_COMUNORDPS, UNORDERED,    (int)MULTI_ARG_2_SF_CMP },
22144
22145   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comeqpd",    IX86_BUILTIN_COMEQPD,    EQ,           (int)MULTI_ARG_2_DF_CMP },
22146   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comnepd",    IX86_BUILTIN_COMNEPD,    NE,           (int)MULTI_ARG_2_DF_CMP },
22147   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comneqpd",   IX86_BUILTIN_COMNEPD,    NE,           (int)MULTI_ARG_2_DF_CMP },
22148   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comltpd",    IX86_BUILTIN_COMLTPD,    LT,           (int)MULTI_ARG_2_DF_CMP },
22149   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comlepd",    IX86_BUILTIN_COMLEPD,    LE,           (int)MULTI_ARG_2_DF_CMP },
22150   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comgtpd",    IX86_BUILTIN_COMGTPD,    GT,           (int)MULTI_ARG_2_DF_CMP },
22151   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comgepd",    IX86_BUILTIN_COMGEPD,    GE,           (int)MULTI_ARG_2_DF_CMP },
22152   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comueqpd",   IX86_BUILTIN_COMUEQPD,   UNEQ,         (int)MULTI_ARG_2_DF_CMP },
22153   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comunepd",   IX86_BUILTIN_COMUNEPD,   LTGT,         (int)MULTI_ARG_2_DF_CMP },
22154   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comuneqpd",  IX86_BUILTIN_COMUNEPD,   LTGT,         (int)MULTI_ARG_2_DF_CMP },
22155   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comunltpd",  IX86_BUILTIN_COMULTPD,   UNLT,         (int)MULTI_ARG_2_DF_CMP },
22156   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comunlepd",  IX86_BUILTIN_COMULEPD,   UNLE,         (int)MULTI_ARG_2_DF_CMP },
22157   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comungtpd",  IX86_BUILTIN_COMUGTPD,   UNGT,         (int)MULTI_ARG_2_DF_CMP },
22158   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comungepd",  IX86_BUILTIN_COMUGEPD,   UNGE,         (int)MULTI_ARG_2_DF_CMP },
22159   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comordpd",   IX86_BUILTIN_COMORDPD,   ORDERED,      (int)MULTI_ARG_2_DF_CMP },
22160   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comunordpd", IX86_BUILTIN_COMUNORDPD, UNORDERED,    (int)MULTI_ARG_2_DF_CMP },
22161
22162   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv16qi3,     "__builtin_ia32_pcomeqb",    IX86_BUILTIN_PCOMEQB,    EQ,           (int)MULTI_ARG_2_QI_CMP },
22163   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv16qi3,     "__builtin_ia32_pcomneb",    IX86_BUILTIN_PCOMNEB,    NE,           (int)MULTI_ARG_2_QI_CMP },
22164   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv16qi3,     "__builtin_ia32_pcomneqb",   IX86_BUILTIN_PCOMNEB,    NE,           (int)MULTI_ARG_2_QI_CMP },
22165   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv16qi3,     "__builtin_ia32_pcomltb",    IX86_BUILTIN_PCOMLTB,    LT,           (int)MULTI_ARG_2_QI_CMP },
22166   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv16qi3,     "__builtin_ia32_pcomleb",    IX86_BUILTIN_PCOMLEB,    LE,           (int)MULTI_ARG_2_QI_CMP },
22167   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv16qi3,     "__builtin_ia32_pcomgtb",    IX86_BUILTIN_PCOMGTB,    GT,           (int)MULTI_ARG_2_QI_CMP },
22168   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv16qi3,     "__builtin_ia32_pcomgeb",    IX86_BUILTIN_PCOMGEB,    GE,           (int)MULTI_ARG_2_QI_CMP },
22169
22170   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv8hi3,      "__builtin_ia32_pcomeqw",    IX86_BUILTIN_PCOMEQW,    EQ,           (int)MULTI_ARG_2_HI_CMP },
22171   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv8hi3,      "__builtin_ia32_pcomnew",    IX86_BUILTIN_PCOMNEW,    NE,           (int)MULTI_ARG_2_HI_CMP },
22172   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv8hi3,      "__builtin_ia32_pcomneqw",   IX86_BUILTIN_PCOMNEW,    NE,           (int)MULTI_ARG_2_HI_CMP },
22173   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv8hi3,      "__builtin_ia32_pcomltw",    IX86_BUILTIN_PCOMLTW,    LT,           (int)MULTI_ARG_2_HI_CMP },
22174   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv8hi3,      "__builtin_ia32_pcomlew",    IX86_BUILTIN_PCOMLEW,    LE,           (int)MULTI_ARG_2_HI_CMP },
22175   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv8hi3,      "__builtin_ia32_pcomgtw",    IX86_BUILTIN_PCOMGTW,    GT,           (int)MULTI_ARG_2_HI_CMP },
22176   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv8hi3,      "__builtin_ia32_pcomgew",    IX86_BUILTIN_PCOMGEW,    GE,           (int)MULTI_ARG_2_HI_CMP },
22177
22178   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4si3,      "__builtin_ia32_pcomeqd",    IX86_BUILTIN_PCOMEQD,    EQ,           (int)MULTI_ARG_2_SI_CMP },
22179   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4si3,      "__builtin_ia32_pcomned",    IX86_BUILTIN_PCOMNED,    NE,           (int)MULTI_ARG_2_SI_CMP },
22180   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4si3,      "__builtin_ia32_pcomneqd",   IX86_BUILTIN_PCOMNED,    NE,           (int)MULTI_ARG_2_SI_CMP },
22181   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4si3,      "__builtin_ia32_pcomltd",    IX86_BUILTIN_PCOMLTD,    LT,           (int)MULTI_ARG_2_SI_CMP },
22182   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4si3,      "__builtin_ia32_pcomled",    IX86_BUILTIN_PCOMLED,    LE,           (int)MULTI_ARG_2_SI_CMP },
22183   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4si3,      "__builtin_ia32_pcomgtd",    IX86_BUILTIN_PCOMGTD,    GT,           (int)MULTI_ARG_2_SI_CMP },
22184   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4si3,      "__builtin_ia32_pcomged",    IX86_BUILTIN_PCOMGED,    GE,           (int)MULTI_ARG_2_SI_CMP },
22185
22186   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2di3,      "__builtin_ia32_pcomeqq",    IX86_BUILTIN_PCOMEQQ,    EQ,           (int)MULTI_ARG_2_DI_CMP },
22187   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2di3,      "__builtin_ia32_pcomneq",    IX86_BUILTIN_PCOMNEQ,    NE,           (int)MULTI_ARG_2_DI_CMP },
22188   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2di3,      "__builtin_ia32_pcomneqq",   IX86_BUILTIN_PCOMNEQ,    NE,           (int)MULTI_ARG_2_DI_CMP },
22189   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2di3,      "__builtin_ia32_pcomltq",    IX86_BUILTIN_PCOMLTQ,    LT,           (int)MULTI_ARG_2_DI_CMP },
22190   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2di3,      "__builtin_ia32_pcomleq",    IX86_BUILTIN_PCOMLEQ,    LE,           (int)MULTI_ARG_2_DI_CMP },
22191   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2di3,      "__builtin_ia32_pcomgtq",    IX86_BUILTIN_PCOMGTQ,    GT,           (int)MULTI_ARG_2_DI_CMP },
22192   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2di3,      "__builtin_ia32_pcomgeq",    IX86_BUILTIN_PCOMGEQ,    GE,           (int)MULTI_ARG_2_DI_CMP },
22193
22194   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v16qi3,"__builtin_ia32_pcomequb",   IX86_BUILTIN_PCOMEQUB,   EQ,           (int)MULTI_ARG_2_QI_CMP },
22195   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v16qi3,"__builtin_ia32_pcomneub",   IX86_BUILTIN_PCOMNEUB,   NE,           (int)MULTI_ARG_2_QI_CMP },
22196   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v16qi3,"__builtin_ia32_pcomnequb",  IX86_BUILTIN_PCOMNEUB,   NE,           (int)MULTI_ARG_2_QI_CMP },
22197   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv16qi3, "__builtin_ia32_pcomltub",   IX86_BUILTIN_PCOMLTUB,   LTU,          (int)MULTI_ARG_2_QI_CMP },
22198   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv16qi3, "__builtin_ia32_pcomleub",   IX86_BUILTIN_PCOMLEUB,   LEU,          (int)MULTI_ARG_2_QI_CMP },
22199   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv16qi3, "__builtin_ia32_pcomgtub",   IX86_BUILTIN_PCOMGTUB,   GTU,          (int)MULTI_ARG_2_QI_CMP },
22200   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv16qi3, "__builtin_ia32_pcomgeub",   IX86_BUILTIN_PCOMGEUB,   GEU,          (int)MULTI_ARG_2_QI_CMP },
22201
22202   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v8hi3, "__builtin_ia32_pcomequw",   IX86_BUILTIN_PCOMEQUW,   EQ,           (int)MULTI_ARG_2_HI_CMP },
22203   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v8hi3, "__builtin_ia32_pcomneuw",   IX86_BUILTIN_PCOMNEUW,   NE,           (int)MULTI_ARG_2_HI_CMP },
22204   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v8hi3, "__builtin_ia32_pcomnequw",  IX86_BUILTIN_PCOMNEUW,   NE,           (int)MULTI_ARG_2_HI_CMP },
22205   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv8hi3,  "__builtin_ia32_pcomltuw",   IX86_BUILTIN_PCOMLTUW,   LTU,          (int)MULTI_ARG_2_HI_CMP },
22206   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv8hi3,  "__builtin_ia32_pcomleuw",   IX86_BUILTIN_PCOMLEUW,   LEU,          (int)MULTI_ARG_2_HI_CMP },
22207   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv8hi3,  "__builtin_ia32_pcomgtuw",   IX86_BUILTIN_PCOMGTUW,   GTU,          (int)MULTI_ARG_2_HI_CMP },
22208   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv8hi3,  "__builtin_ia32_pcomgeuw",   IX86_BUILTIN_PCOMGEUW,   GEU,          (int)MULTI_ARG_2_HI_CMP },
22209
22210   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v4si3, "__builtin_ia32_pcomequd",   IX86_BUILTIN_PCOMEQUD,   EQ,           (int)MULTI_ARG_2_SI_CMP },
22211   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v4si3, "__builtin_ia32_pcomneud",   IX86_BUILTIN_PCOMNEUD,   NE,           (int)MULTI_ARG_2_SI_CMP },
22212   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v4si3, "__builtin_ia32_pcomnequd",  IX86_BUILTIN_PCOMNEUD,   NE,           (int)MULTI_ARG_2_SI_CMP },
22213   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv4si3,  "__builtin_ia32_pcomltud",   IX86_BUILTIN_PCOMLTUD,   LTU,          (int)MULTI_ARG_2_SI_CMP },
22214   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv4si3,  "__builtin_ia32_pcomleud",   IX86_BUILTIN_PCOMLEUD,   LEU,          (int)MULTI_ARG_2_SI_CMP },
22215   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv4si3,  "__builtin_ia32_pcomgtud",   IX86_BUILTIN_PCOMGTUD,   GTU,          (int)MULTI_ARG_2_SI_CMP },
22216   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv4si3,  "__builtin_ia32_pcomgeud",   IX86_BUILTIN_PCOMGEUD,   GEU,          (int)MULTI_ARG_2_SI_CMP },
22217
22218   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v2di3, "__builtin_ia32_pcomequq",   IX86_BUILTIN_PCOMEQUQ,   EQ,           (int)MULTI_ARG_2_DI_CMP },
22219   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v2di3, "__builtin_ia32_pcomneuq",   IX86_BUILTIN_PCOMNEUQ,   NE,           (int)MULTI_ARG_2_DI_CMP },
22220   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v2di3, "__builtin_ia32_pcomnequq",  IX86_BUILTIN_PCOMNEUQ,   NE,           (int)MULTI_ARG_2_DI_CMP },
22221   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv2di3,  "__builtin_ia32_pcomltuq",   IX86_BUILTIN_PCOMLTUQ,   LTU,          (int)MULTI_ARG_2_DI_CMP },
22222   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv2di3,  "__builtin_ia32_pcomleuq",   IX86_BUILTIN_PCOMLEUQ,   LEU,          (int)MULTI_ARG_2_DI_CMP },
22223   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv2di3,  "__builtin_ia32_pcomgtuq",   IX86_BUILTIN_PCOMGTUQ,   GTU,          (int)MULTI_ARG_2_DI_CMP },
22224   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv2di3,  "__builtin_ia32_pcomgeuq",   IX86_BUILTIN_PCOMGEUQ,   GEU,          (int)MULTI_ARG_2_DI_CMP },
22225
22226   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_com_tfv4sf3,       "__builtin_ia32_comfalsess", IX86_BUILTIN_COMFALSESS, (enum rtx_code) COM_FALSE_S,  (int)MULTI_ARG_2_SF_TF },
22227   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_com_tfv4sf3,       "__builtin_ia32_comtruess",  IX86_BUILTIN_COMTRUESS,  (enum rtx_code) COM_TRUE_S,   (int)MULTI_ARG_2_SF_TF },
22228   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_com_tfv4sf3,       "__builtin_ia32_comfalseps", IX86_BUILTIN_COMFALSEPS, (enum rtx_code) COM_FALSE_P,  (int)MULTI_ARG_2_SF_TF },
22229   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_com_tfv4sf3,       "__builtin_ia32_comtrueps",  IX86_BUILTIN_COMTRUEPS,  (enum rtx_code) COM_TRUE_P,   (int)MULTI_ARG_2_SF_TF },
22230   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_com_tfv2df3,       "__builtin_ia32_comfalsesd", IX86_BUILTIN_COMFALSESD, (enum rtx_code) COM_FALSE_S,  (int)MULTI_ARG_2_DF_TF },
22231   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_com_tfv2df3,       "__builtin_ia32_comtruesd",  IX86_BUILTIN_COMTRUESD,  (enum rtx_code) COM_TRUE_S,   (int)MULTI_ARG_2_DF_TF },
22232   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_com_tfv2df3,       "__builtin_ia32_comfalsepd", IX86_BUILTIN_COMFALSEPD, (enum rtx_code) COM_FALSE_P,  (int)MULTI_ARG_2_DF_TF },
22233   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_com_tfv2df3,       "__builtin_ia32_comtruepd",  IX86_BUILTIN_COMTRUEPD,  (enum rtx_code) COM_TRUE_P,   (int)MULTI_ARG_2_DF_TF },
22234
22235   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv16qi3,     "__builtin_ia32_pcomfalseb", IX86_BUILTIN_PCOMFALSEB, (enum rtx_code) PCOM_FALSE,   (int)MULTI_ARG_2_QI_TF },
22236   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv8hi3,      "__builtin_ia32_pcomfalsew", IX86_BUILTIN_PCOMFALSEW, (enum rtx_code) PCOM_FALSE,   (int)MULTI_ARG_2_HI_TF },
22237   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv4si3,      "__builtin_ia32_pcomfalsed", IX86_BUILTIN_PCOMFALSED, (enum rtx_code) PCOM_FALSE,   (int)MULTI_ARG_2_SI_TF },
22238   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv2di3,      "__builtin_ia32_pcomfalseq", IX86_BUILTIN_PCOMFALSEQ, (enum rtx_code) PCOM_FALSE,   (int)MULTI_ARG_2_DI_TF },
22239   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv16qi3,     "__builtin_ia32_pcomfalseub",IX86_BUILTIN_PCOMFALSEUB,(enum rtx_code) PCOM_FALSE,   (int)MULTI_ARG_2_QI_TF },
22240   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv8hi3,      "__builtin_ia32_pcomfalseuw",IX86_BUILTIN_PCOMFALSEUW,(enum rtx_code) PCOM_FALSE,   (int)MULTI_ARG_2_HI_TF },
22241   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv4si3,      "__builtin_ia32_pcomfalseud",IX86_BUILTIN_PCOMFALSEUD,(enum rtx_code) PCOM_FALSE,   (int)MULTI_ARG_2_SI_TF },
22242   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv2di3,      "__builtin_ia32_pcomfalseuq",IX86_BUILTIN_PCOMFALSEUQ,(enum rtx_code) PCOM_FALSE,   (int)MULTI_ARG_2_DI_TF },
22243
22244   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv16qi3,     "__builtin_ia32_pcomtrueb",  IX86_BUILTIN_PCOMTRUEB,  (enum rtx_code) PCOM_TRUE,    (int)MULTI_ARG_2_QI_TF },
22245   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv8hi3,      "__builtin_ia32_pcomtruew",  IX86_BUILTIN_PCOMTRUEW,  (enum rtx_code) PCOM_TRUE,    (int)MULTI_ARG_2_HI_TF },
22246   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv4si3,      "__builtin_ia32_pcomtrued",  IX86_BUILTIN_PCOMTRUED,  (enum rtx_code) PCOM_TRUE,    (int)MULTI_ARG_2_SI_TF },
22247   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv2di3,      "__builtin_ia32_pcomtrueq",  IX86_BUILTIN_PCOMTRUEQ,  (enum rtx_code) PCOM_TRUE,    (int)MULTI_ARG_2_DI_TF },
22248   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv16qi3,     "__builtin_ia32_pcomtrueub", IX86_BUILTIN_PCOMTRUEUB, (enum rtx_code) PCOM_TRUE,    (int)MULTI_ARG_2_QI_TF },
22249   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv8hi3,      "__builtin_ia32_pcomtrueuw", IX86_BUILTIN_PCOMTRUEUW, (enum rtx_code) PCOM_TRUE,    (int)MULTI_ARG_2_HI_TF },
22250   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv4si3,      "__builtin_ia32_pcomtrueud", IX86_BUILTIN_PCOMTRUEUD, (enum rtx_code) PCOM_TRUE,    (int)MULTI_ARG_2_SI_TF },
22251   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv2di3,      "__builtin_ia32_pcomtrueuq", IX86_BUILTIN_PCOMTRUEUQ, (enum rtx_code) PCOM_TRUE,    (int)MULTI_ARG_2_DI_TF },
22252 };
22253
22254 /* Set up all the MMX/SSE builtins, even builtins for instructions that are not
22255    in the current target ISA to allow the user to compile particular modules
22256    with different target specific options that differ from the command line
22257    options.  */
22258 static void
22259 ix86_init_mmx_sse_builtins (void)
22260 {
22261   const struct builtin_description * d;
22262   size_t i;
22263
22264   tree V16QI_type_node = build_vector_type_for_mode (char_type_node, V16QImode);
22265   tree V2SI_type_node = build_vector_type_for_mode (intSI_type_node, V2SImode);
22266   tree V1DI_type_node
22267     = build_vector_type_for_mode (long_long_integer_type_node, V1DImode);
22268   tree V2SF_type_node = build_vector_type_for_mode (float_type_node, V2SFmode);
22269   tree V2DI_type_node
22270     = build_vector_type_for_mode (long_long_integer_type_node, V2DImode);
22271   tree V2DF_type_node = build_vector_type_for_mode (double_type_node, V2DFmode);
22272   tree V4SF_type_node = build_vector_type_for_mode (float_type_node, V4SFmode);
22273   tree V4SI_type_node = build_vector_type_for_mode (intSI_type_node, V4SImode);
22274   tree V4HI_type_node = build_vector_type_for_mode (intHI_type_node, V4HImode);
22275   tree V8QI_type_node = build_vector_type_for_mode (char_type_node, V8QImode);
22276   tree V8HI_type_node = build_vector_type_for_mode (intHI_type_node, V8HImode);
22277
22278   tree pchar_type_node = build_pointer_type (char_type_node);
22279   tree pcchar_type_node
22280     = build_pointer_type (build_type_variant (char_type_node, 1, 0));
22281   tree pfloat_type_node = build_pointer_type (float_type_node);
22282   tree pcfloat_type_node
22283     = build_pointer_type (build_type_variant (float_type_node, 1, 0));
22284   tree pv2sf_type_node = build_pointer_type (V2SF_type_node);
22285   tree pcv2sf_type_node
22286     = build_pointer_type (build_type_variant (V2SF_type_node, 1, 0));
22287   tree pv2di_type_node = build_pointer_type (V2DI_type_node);
22288   tree pdi_type_node = build_pointer_type (long_long_unsigned_type_node);
22289
22290   /* Comparisons.  */
22291   tree int_ftype_v4sf_v4sf
22292     = build_function_type_list (integer_type_node,
22293                                 V4SF_type_node, V4SF_type_node, NULL_TREE);
22294   tree v4si_ftype_v4sf_v4sf
22295     = build_function_type_list (V4SI_type_node,
22296                                 V4SF_type_node, V4SF_type_node, NULL_TREE);
22297   /* MMX/SSE/integer conversions.  */
22298   tree int_ftype_v4sf
22299     = build_function_type_list (integer_type_node,
22300                                 V4SF_type_node, NULL_TREE);
22301   tree int64_ftype_v4sf
22302     = build_function_type_list (long_long_integer_type_node,
22303                                 V4SF_type_node, NULL_TREE);
22304   tree int_ftype_v8qi
22305     = build_function_type_list (integer_type_node, V8QI_type_node, NULL_TREE);
22306   tree v4sf_ftype_v4sf_int
22307     = build_function_type_list (V4SF_type_node,
22308                                 V4SF_type_node, integer_type_node, NULL_TREE);
22309   tree v4sf_ftype_v4sf_int64
22310     = build_function_type_list (V4SF_type_node,
22311                                 V4SF_type_node, long_long_integer_type_node,
22312                                 NULL_TREE);
22313   tree v4sf_ftype_v4sf_v2si
22314     = build_function_type_list (V4SF_type_node,
22315                                 V4SF_type_node, V2SI_type_node, NULL_TREE);
22316
22317   /* Miscellaneous.  */
22318   tree v8qi_ftype_v4hi_v4hi
22319     = build_function_type_list (V8QI_type_node,
22320                                 V4HI_type_node, V4HI_type_node, NULL_TREE);
22321   tree v4hi_ftype_v2si_v2si
22322     = build_function_type_list (V4HI_type_node,
22323                                 V2SI_type_node, V2SI_type_node, NULL_TREE);
22324   tree v4sf_ftype_v4sf_v4sf_int
22325     = build_function_type_list (V4SF_type_node,
22326                                 V4SF_type_node, V4SF_type_node,
22327                                 integer_type_node, NULL_TREE);
22328   tree v2si_ftype_v4hi_v4hi
22329     = build_function_type_list (V2SI_type_node,
22330                                 V4HI_type_node, V4HI_type_node, NULL_TREE);
22331   tree v4hi_ftype_v4hi_int
22332     = build_function_type_list (V4HI_type_node,
22333                                 V4HI_type_node, integer_type_node, NULL_TREE);
22334   tree v2si_ftype_v2si_int
22335     = build_function_type_list (V2SI_type_node,
22336                                 V2SI_type_node, integer_type_node, NULL_TREE);
22337   tree v1di_ftype_v1di_int
22338     = build_function_type_list (V1DI_type_node,
22339                                 V1DI_type_node, integer_type_node, NULL_TREE);
22340
22341   tree void_ftype_void
22342     = build_function_type (void_type_node, void_list_node);
22343   tree void_ftype_unsigned
22344     = build_function_type_list (void_type_node, unsigned_type_node, NULL_TREE);
22345   tree void_ftype_unsigned_unsigned
22346     = build_function_type_list (void_type_node, unsigned_type_node,
22347                                 unsigned_type_node, NULL_TREE);
22348   tree void_ftype_pcvoid_unsigned_unsigned
22349     = build_function_type_list (void_type_node, const_ptr_type_node,
22350                                 unsigned_type_node, unsigned_type_node,
22351                                 NULL_TREE);
22352   tree unsigned_ftype_void
22353     = build_function_type (unsigned_type_node, void_list_node);
22354   tree v2si_ftype_v4sf
22355     = build_function_type_list (V2SI_type_node, V4SF_type_node, NULL_TREE);
22356   /* Loads/stores.  */
22357   tree void_ftype_v8qi_v8qi_pchar
22358     = build_function_type_list (void_type_node,
22359                                 V8QI_type_node, V8QI_type_node,
22360                                 pchar_type_node, NULL_TREE);
22361   tree v4sf_ftype_pcfloat
22362     = build_function_type_list (V4SF_type_node, pcfloat_type_node, NULL_TREE);
22363   tree v4sf_ftype_v4sf_pcv2sf
22364     = build_function_type_list (V4SF_type_node,
22365                                 V4SF_type_node, pcv2sf_type_node, NULL_TREE);
22366   tree void_ftype_pv2sf_v4sf
22367     = build_function_type_list (void_type_node,
22368                                 pv2sf_type_node, V4SF_type_node, NULL_TREE);
22369   tree void_ftype_pfloat_v4sf
22370     = build_function_type_list (void_type_node,
22371                                 pfloat_type_node, V4SF_type_node, NULL_TREE);
22372   tree void_ftype_pdi_di
22373     = build_function_type_list (void_type_node,
22374                                 pdi_type_node, long_long_unsigned_type_node,
22375                                 NULL_TREE);
22376   tree void_ftype_pv2di_v2di
22377     = build_function_type_list (void_type_node,
22378                                 pv2di_type_node, V2DI_type_node, NULL_TREE);
22379   /* Normal vector unops.  */
22380   tree v4sf_ftype_v4sf
22381     = build_function_type_list (V4SF_type_node, V4SF_type_node, NULL_TREE);
22382   tree v16qi_ftype_v16qi
22383     = build_function_type_list (V16QI_type_node, V16QI_type_node, NULL_TREE);
22384   tree v8hi_ftype_v8hi
22385     = build_function_type_list (V8HI_type_node, V8HI_type_node, NULL_TREE);
22386   tree v4si_ftype_v4si
22387     = build_function_type_list (V4SI_type_node, V4SI_type_node, NULL_TREE);
22388   tree v8qi_ftype_v8qi
22389     = build_function_type_list (V8QI_type_node, V8QI_type_node, NULL_TREE);
22390   tree v4hi_ftype_v4hi
22391     = build_function_type_list (V4HI_type_node, V4HI_type_node, NULL_TREE);
22392
22393   /* Normal vector binops.  */
22394   tree v4sf_ftype_v4sf_v4sf
22395     = build_function_type_list (V4SF_type_node,
22396                                 V4SF_type_node, V4SF_type_node, NULL_TREE);
22397   tree v8qi_ftype_v8qi_v8qi
22398     = build_function_type_list (V8QI_type_node,
22399                                 V8QI_type_node, V8QI_type_node, NULL_TREE);
22400   tree v4hi_ftype_v4hi_v4hi
22401     = build_function_type_list (V4HI_type_node,
22402                                 V4HI_type_node, V4HI_type_node, NULL_TREE);
22403   tree v2si_ftype_v2si_v2si
22404     = build_function_type_list (V2SI_type_node,
22405                                 V2SI_type_node, V2SI_type_node, NULL_TREE);
22406   tree v1di_ftype_v1di_v1di
22407     = build_function_type_list (V1DI_type_node,
22408                                 V1DI_type_node, V1DI_type_node, NULL_TREE);
22409   tree v1di_ftype_v1di_v1di_int
22410     = build_function_type_list (V1DI_type_node,
22411                                 V1DI_type_node, V1DI_type_node,
22412                                 integer_type_node, NULL_TREE);
22413   tree v2si_ftype_v2sf
22414     = build_function_type_list (V2SI_type_node, V2SF_type_node, NULL_TREE);
22415   tree v2sf_ftype_v2si
22416     = build_function_type_list (V2SF_type_node, V2SI_type_node, NULL_TREE);
22417   tree v2si_ftype_v2si
22418     = build_function_type_list (V2SI_type_node, V2SI_type_node, NULL_TREE);
22419   tree v2sf_ftype_v2sf
22420     = build_function_type_list (V2SF_type_node, V2SF_type_node, NULL_TREE);
22421   tree v2sf_ftype_v2sf_v2sf
22422     = build_function_type_list (V2SF_type_node,
22423                                 V2SF_type_node, V2SF_type_node, NULL_TREE);
22424   tree v2si_ftype_v2sf_v2sf
22425     = build_function_type_list (V2SI_type_node,
22426                                 V2SF_type_node, V2SF_type_node, NULL_TREE);
22427   tree pint_type_node    = build_pointer_type (integer_type_node);
22428   tree pdouble_type_node = build_pointer_type (double_type_node);
22429   tree pcdouble_type_node = build_pointer_type (
22430                                 build_type_variant (double_type_node, 1, 0));
22431   tree int_ftype_v2df_v2df
22432     = build_function_type_list (integer_type_node,
22433                                 V2DF_type_node, V2DF_type_node, NULL_TREE);
22434
22435   tree void_ftype_pcvoid
22436     = build_function_type_list (void_type_node, const_ptr_type_node, NULL_TREE);
22437   tree v4sf_ftype_v4si
22438     = build_function_type_list (V4SF_type_node, V4SI_type_node, NULL_TREE);
22439   tree v4si_ftype_v4sf
22440     = build_function_type_list (V4SI_type_node, V4SF_type_node, NULL_TREE);
22441   tree v2df_ftype_v4si
22442     = build_function_type_list (V2DF_type_node, V4SI_type_node, NULL_TREE);
22443   tree v4si_ftype_v2df
22444     = build_function_type_list (V4SI_type_node, V2DF_type_node, NULL_TREE);
22445   tree v4si_ftype_v2df_v2df
22446     = build_function_type_list (V4SI_type_node,
22447                                 V2DF_type_node, V2DF_type_node, NULL_TREE);
22448   tree v2si_ftype_v2df
22449     = build_function_type_list (V2SI_type_node, V2DF_type_node, NULL_TREE);
22450   tree v4sf_ftype_v2df
22451     = build_function_type_list (V4SF_type_node, V2DF_type_node, NULL_TREE);
22452   tree v2df_ftype_v2si
22453     = build_function_type_list (V2DF_type_node, V2SI_type_node, NULL_TREE);
22454   tree v2df_ftype_v4sf
22455     = build_function_type_list (V2DF_type_node, V4SF_type_node, NULL_TREE);
22456   tree int_ftype_v2df
22457     = build_function_type_list (integer_type_node, V2DF_type_node, NULL_TREE);
22458   tree int64_ftype_v2df
22459     = build_function_type_list (long_long_integer_type_node,
22460                                 V2DF_type_node, NULL_TREE);
22461   tree v2df_ftype_v2df_int
22462     = build_function_type_list (V2DF_type_node,
22463                                 V2DF_type_node, integer_type_node, NULL_TREE);
22464   tree v2df_ftype_v2df_int64
22465     = build_function_type_list (V2DF_type_node,
22466                                 V2DF_type_node, long_long_integer_type_node,
22467                                 NULL_TREE);
22468   tree v4sf_ftype_v4sf_v2df
22469     = build_function_type_list (V4SF_type_node,
22470                                 V4SF_type_node, V2DF_type_node, NULL_TREE);
22471   tree v2df_ftype_v2df_v4sf
22472     = build_function_type_list (V2DF_type_node,
22473                                 V2DF_type_node, V4SF_type_node, NULL_TREE);
22474   tree v2df_ftype_v2df_v2df_int
22475     = build_function_type_list (V2DF_type_node,
22476                                 V2DF_type_node, V2DF_type_node,
22477                                 integer_type_node,
22478                                 NULL_TREE);
22479   tree v2df_ftype_v2df_pcdouble
22480     = build_function_type_list (V2DF_type_node,
22481                                 V2DF_type_node, pcdouble_type_node, NULL_TREE);
22482   tree void_ftype_pdouble_v2df
22483     = build_function_type_list (void_type_node,
22484                                 pdouble_type_node, V2DF_type_node, NULL_TREE);
22485   tree void_ftype_pint_int
22486     = build_function_type_list (void_type_node,
22487                                 pint_type_node, integer_type_node, NULL_TREE);
22488   tree void_ftype_v16qi_v16qi_pchar
22489     = build_function_type_list (void_type_node,
22490                                 V16QI_type_node, V16QI_type_node,
22491                                 pchar_type_node, NULL_TREE);
22492   tree v2df_ftype_pcdouble
22493     = build_function_type_list (V2DF_type_node, pcdouble_type_node, NULL_TREE);
22494   tree v2df_ftype_v2df_v2df
22495     = build_function_type_list (V2DF_type_node,
22496                                 V2DF_type_node, V2DF_type_node, NULL_TREE);
22497   tree v16qi_ftype_v16qi_v16qi
22498     = build_function_type_list (V16QI_type_node,
22499                                 V16QI_type_node, V16QI_type_node, NULL_TREE);
22500   tree v8hi_ftype_v8hi_v8hi
22501     = build_function_type_list (V8HI_type_node,
22502                                 V8HI_type_node, V8HI_type_node, NULL_TREE);
22503   tree v4si_ftype_v4si_v4si
22504     = build_function_type_list (V4SI_type_node,
22505                                 V4SI_type_node, V4SI_type_node, NULL_TREE);
22506   tree v2di_ftype_v2di_v2di
22507     = build_function_type_list (V2DI_type_node,
22508                                 V2DI_type_node, V2DI_type_node, NULL_TREE);
22509   tree v2di_ftype_v2df_v2df
22510     = build_function_type_list (V2DI_type_node,
22511                                 V2DF_type_node, V2DF_type_node, NULL_TREE);
22512   tree v2df_ftype_v2df
22513     = build_function_type_list (V2DF_type_node, V2DF_type_node, NULL_TREE);
22514   tree v2di_ftype_v2di_int
22515     = build_function_type_list (V2DI_type_node,
22516                                 V2DI_type_node, integer_type_node, NULL_TREE);
22517   tree v2di_ftype_v2di_v2di_int
22518     = build_function_type_list (V2DI_type_node, V2DI_type_node,
22519                                 V2DI_type_node, integer_type_node, NULL_TREE);
22520   tree v4si_ftype_v4si_int
22521     = build_function_type_list (V4SI_type_node,
22522                                 V4SI_type_node, integer_type_node, NULL_TREE);
22523   tree v8hi_ftype_v8hi_int
22524     = build_function_type_list (V8HI_type_node,
22525                                 V8HI_type_node, integer_type_node, NULL_TREE);
22526   tree v4si_ftype_v8hi_v8hi
22527     = build_function_type_list (V4SI_type_node,
22528                                 V8HI_type_node, V8HI_type_node, NULL_TREE);
22529   tree v1di_ftype_v8qi_v8qi
22530     = build_function_type_list (V1DI_type_node,
22531                                 V8QI_type_node, V8QI_type_node, NULL_TREE);
22532   tree v1di_ftype_v2si_v2si
22533     = build_function_type_list (V1DI_type_node,
22534                                 V2SI_type_node, V2SI_type_node, NULL_TREE);
22535   tree v2di_ftype_v16qi_v16qi
22536     = build_function_type_list (V2DI_type_node,
22537                                 V16QI_type_node, V16QI_type_node, NULL_TREE);
22538   tree v2di_ftype_v4si_v4si
22539     = build_function_type_list (V2DI_type_node,
22540                                 V4SI_type_node, V4SI_type_node, NULL_TREE);
22541   tree int_ftype_v16qi
22542     = build_function_type_list (integer_type_node, V16QI_type_node, NULL_TREE);
22543   tree v16qi_ftype_pcchar
22544     = build_function_type_list (V16QI_type_node, pcchar_type_node, NULL_TREE);
22545   tree void_ftype_pchar_v16qi
22546     = build_function_type_list (void_type_node,
22547                                 pchar_type_node, V16QI_type_node, NULL_TREE);
22548
22549   tree v2di_ftype_v2di_unsigned_unsigned
22550     = build_function_type_list (V2DI_type_node, V2DI_type_node,
22551                                 unsigned_type_node, unsigned_type_node,
22552                                 NULL_TREE);
22553   tree v2di_ftype_v2di_v2di_unsigned_unsigned
22554     = build_function_type_list (V2DI_type_node, V2DI_type_node, V2DI_type_node,
22555                                 unsigned_type_node, unsigned_type_node,
22556                                 NULL_TREE);
22557   tree v2di_ftype_v2di_v16qi
22558     = build_function_type_list (V2DI_type_node, V2DI_type_node, V16QI_type_node,
22559                                 NULL_TREE);
22560   tree v2df_ftype_v2df_v2df_v2df
22561     = build_function_type_list (V2DF_type_node,
22562                                 V2DF_type_node, V2DF_type_node,
22563                                 V2DF_type_node, NULL_TREE);
22564   tree v4sf_ftype_v4sf_v4sf_v4sf
22565     = build_function_type_list (V4SF_type_node,
22566                                 V4SF_type_node, V4SF_type_node,
22567                                 V4SF_type_node, NULL_TREE);
22568   tree v8hi_ftype_v16qi
22569     = build_function_type_list (V8HI_type_node, V16QI_type_node,
22570                                 NULL_TREE);
22571   tree v4si_ftype_v16qi
22572     = build_function_type_list (V4SI_type_node, V16QI_type_node,
22573                                 NULL_TREE);
22574   tree v2di_ftype_v16qi
22575     = build_function_type_list (V2DI_type_node, V16QI_type_node,
22576                                 NULL_TREE);
22577   tree v4si_ftype_v8hi
22578     = build_function_type_list (V4SI_type_node, V8HI_type_node,
22579                                 NULL_TREE);
22580   tree v2di_ftype_v8hi
22581     = build_function_type_list (V2DI_type_node, V8HI_type_node,
22582                                 NULL_TREE);
22583   tree v2di_ftype_v4si
22584     = build_function_type_list (V2DI_type_node, V4SI_type_node,
22585                                 NULL_TREE);
22586   tree v2di_ftype_pv2di
22587     = build_function_type_list (V2DI_type_node, pv2di_type_node,
22588                                 NULL_TREE);
22589   tree v16qi_ftype_v16qi_v16qi_int
22590     = build_function_type_list (V16QI_type_node, V16QI_type_node,
22591                                 V16QI_type_node, integer_type_node,
22592                                 NULL_TREE);
22593   tree v16qi_ftype_v16qi_v16qi_v16qi
22594     = build_function_type_list (V16QI_type_node, V16QI_type_node,
22595                                 V16QI_type_node, V16QI_type_node,
22596                                 NULL_TREE);
22597   tree v8hi_ftype_v8hi_v8hi_int
22598     = build_function_type_list (V8HI_type_node, V8HI_type_node,
22599                                 V8HI_type_node, integer_type_node,
22600                                 NULL_TREE);
22601   tree v4si_ftype_v4si_v4si_int
22602     = build_function_type_list (V4SI_type_node, V4SI_type_node,
22603                                 V4SI_type_node, integer_type_node,
22604                                 NULL_TREE);
22605   tree int_ftype_v2di_v2di
22606     = build_function_type_list (integer_type_node,
22607                                 V2DI_type_node, V2DI_type_node,
22608                                 NULL_TREE);
22609   tree int_ftype_v16qi_int_v16qi_int_int
22610     = build_function_type_list (integer_type_node,
22611                                 V16QI_type_node,
22612                                 integer_type_node,
22613                                 V16QI_type_node,
22614                                 integer_type_node,
22615                                 integer_type_node,
22616                                 NULL_TREE);
22617   tree v16qi_ftype_v16qi_int_v16qi_int_int
22618     = build_function_type_list (V16QI_type_node,
22619                                 V16QI_type_node,
22620                                 integer_type_node,
22621                                 V16QI_type_node,
22622                                 integer_type_node,
22623                                 integer_type_node,
22624                                 NULL_TREE);
22625   tree int_ftype_v16qi_v16qi_int
22626     = build_function_type_list (integer_type_node,
22627                                 V16QI_type_node,
22628                                 V16QI_type_node,
22629                                 integer_type_node,
22630                                 NULL_TREE);
22631
22632   /* SSE5 instructions */
22633   tree v2di_ftype_v2di_v2di_v2di
22634     = build_function_type_list (V2DI_type_node,
22635                                 V2DI_type_node,
22636                                 V2DI_type_node,
22637                                 V2DI_type_node,
22638                                 NULL_TREE);
22639
22640   tree v4si_ftype_v4si_v4si_v4si
22641     = build_function_type_list (V4SI_type_node,
22642                                 V4SI_type_node,
22643                                 V4SI_type_node,
22644                                 V4SI_type_node,
22645                                 NULL_TREE);
22646
22647   tree v4si_ftype_v4si_v4si_v2di
22648     = build_function_type_list (V4SI_type_node,
22649                                 V4SI_type_node,
22650                                 V4SI_type_node,
22651                                 V2DI_type_node,
22652                                 NULL_TREE);
22653
22654   tree v8hi_ftype_v8hi_v8hi_v8hi
22655     = build_function_type_list (V8HI_type_node,
22656                                 V8HI_type_node,
22657                                 V8HI_type_node,
22658                                 V8HI_type_node,
22659                                 NULL_TREE);
22660
22661   tree v8hi_ftype_v8hi_v8hi_v4si
22662     = build_function_type_list (V8HI_type_node,
22663                                 V8HI_type_node,
22664                                 V8HI_type_node,
22665                                 V4SI_type_node,
22666                                 NULL_TREE);
22667
22668   tree v2df_ftype_v2df_v2df_v16qi
22669     = build_function_type_list (V2DF_type_node,
22670                                 V2DF_type_node,
22671                                 V2DF_type_node,
22672                                 V16QI_type_node,
22673                                 NULL_TREE);
22674
22675   tree v4sf_ftype_v4sf_v4sf_v16qi
22676     = build_function_type_list (V4SF_type_node,
22677                                 V4SF_type_node,
22678                                 V4SF_type_node,
22679                                 V16QI_type_node,
22680                                 NULL_TREE);
22681
22682   tree v2di_ftype_v2di_si
22683     = build_function_type_list (V2DI_type_node,
22684                                 V2DI_type_node,
22685                                 integer_type_node,
22686                                 NULL_TREE);
22687
22688   tree v4si_ftype_v4si_si
22689     = build_function_type_list (V4SI_type_node,
22690                                 V4SI_type_node,
22691                                 integer_type_node,
22692                                 NULL_TREE);
22693
22694   tree v8hi_ftype_v8hi_si
22695     = build_function_type_list (V8HI_type_node,
22696                                 V8HI_type_node,
22697                                 integer_type_node,
22698                                 NULL_TREE);
22699
22700   tree v16qi_ftype_v16qi_si
22701     = build_function_type_list (V16QI_type_node,
22702                                 V16QI_type_node,
22703                                 integer_type_node,
22704                                 NULL_TREE);
22705   tree v4sf_ftype_v4hi
22706     = build_function_type_list (V4SF_type_node,
22707                                 V4HI_type_node,
22708                                 NULL_TREE);
22709
22710   tree v4hi_ftype_v4sf
22711     = build_function_type_list (V4HI_type_node,
22712                                 V4SF_type_node,
22713                                 NULL_TREE);
22714
22715   tree v2di_ftype_v2di
22716     = build_function_type_list (V2DI_type_node, V2DI_type_node, NULL_TREE);
22717
22718   tree v16qi_ftype_v8hi_v8hi
22719     = build_function_type_list (V16QI_type_node,
22720                                 V8HI_type_node, V8HI_type_node,
22721                                 NULL_TREE);
22722   tree v8hi_ftype_v4si_v4si
22723     = build_function_type_list (V8HI_type_node,
22724                                 V4SI_type_node, V4SI_type_node,
22725                                 NULL_TREE);
22726   tree v8hi_ftype_v16qi_v16qi 
22727     = build_function_type_list (V8HI_type_node,
22728                                 V16QI_type_node, V16QI_type_node,
22729                                 NULL_TREE);
22730   tree v4hi_ftype_v8qi_v8qi 
22731     = build_function_type_list (V4HI_type_node,
22732                                 V8QI_type_node, V8QI_type_node,
22733                                 NULL_TREE);
22734   tree unsigned_ftype_unsigned_uchar
22735     = build_function_type_list (unsigned_type_node,
22736                                 unsigned_type_node,
22737                                 unsigned_char_type_node,
22738                                 NULL_TREE);
22739   tree unsigned_ftype_unsigned_ushort
22740     = build_function_type_list (unsigned_type_node,
22741                                 unsigned_type_node,
22742                                 short_unsigned_type_node,
22743                                 NULL_TREE);
22744   tree unsigned_ftype_unsigned_unsigned
22745     = build_function_type_list (unsigned_type_node,
22746                                 unsigned_type_node,
22747                                 unsigned_type_node,
22748                                 NULL_TREE);
22749   tree uint64_ftype_uint64_uint64
22750     = build_function_type_list (long_long_unsigned_type_node,
22751                                 long_long_unsigned_type_node,
22752                                 long_long_unsigned_type_node,
22753                                 NULL_TREE);
22754   tree float_ftype_float
22755     = build_function_type_list (float_type_node,
22756                                 float_type_node,
22757                                 NULL_TREE);
22758
22759   /* AVX builtins  */
22760   tree V32QI_type_node = build_vector_type_for_mode (char_type_node,
22761                                                      V32QImode);
22762   tree V8SI_type_node = build_vector_type_for_mode (intSI_type_node,
22763                                                     V8SImode);
22764   tree V8SF_type_node = build_vector_type_for_mode (float_type_node,
22765                                                     V8SFmode);
22766   tree V4DI_type_node = build_vector_type_for_mode (long_long_integer_type_node,
22767                                                     V4DImode);
22768   tree V4DF_type_node = build_vector_type_for_mode (double_type_node,
22769                                                     V4DFmode);
22770   tree v8sf_ftype_v8sf
22771     = build_function_type_list (V8SF_type_node,
22772                                 V8SF_type_node,
22773                                 NULL_TREE);
22774   tree v8si_ftype_v8sf
22775     = build_function_type_list (V8SI_type_node,
22776                                 V8SF_type_node,
22777                                 NULL_TREE);
22778   tree v8sf_ftype_v8si
22779     = build_function_type_list (V8SF_type_node,
22780                                 V8SI_type_node,
22781                                 NULL_TREE);
22782   tree v4si_ftype_v4df
22783     = build_function_type_list (V4SI_type_node,
22784                                 V4DF_type_node,
22785                                 NULL_TREE);
22786   tree v4df_ftype_v4df
22787     = build_function_type_list (V4DF_type_node,
22788                                 V4DF_type_node,
22789                                 NULL_TREE);
22790   tree v4df_ftype_v4si
22791     = build_function_type_list (V4DF_type_node,
22792                                 V4SI_type_node,
22793                                 NULL_TREE);
22794   tree v4df_ftype_v4sf
22795     = build_function_type_list (V4DF_type_node,
22796                                 V4SF_type_node,
22797                                 NULL_TREE);
22798   tree v4sf_ftype_v4df
22799     = build_function_type_list (V4SF_type_node,
22800                                 V4DF_type_node,
22801                                 NULL_TREE);
22802   tree v8sf_ftype_v8sf_v8sf
22803     = build_function_type_list (V8SF_type_node,
22804                                 V8SF_type_node, V8SF_type_node,
22805                                 NULL_TREE);
22806   tree v4df_ftype_v4df_v4df
22807     = build_function_type_list (V4DF_type_node,
22808                                 V4DF_type_node, V4DF_type_node,
22809                                 NULL_TREE);
22810   tree v8sf_ftype_v8sf_int
22811     = build_function_type_list (V8SF_type_node,
22812                                 V8SF_type_node, integer_type_node,
22813                                 NULL_TREE);
22814   tree v4si_ftype_v8si_int
22815     = build_function_type_list (V4SI_type_node,
22816                                 V8SI_type_node, integer_type_node,
22817                                 NULL_TREE);
22818   tree v4df_ftype_v4df_int
22819     = build_function_type_list (V4DF_type_node,
22820                                 V4DF_type_node, integer_type_node,
22821                                 NULL_TREE);
22822   tree v4sf_ftype_v8sf_int
22823     = build_function_type_list (V4SF_type_node,
22824                                 V8SF_type_node, integer_type_node,
22825                                 NULL_TREE);
22826   tree v2df_ftype_v4df_int
22827     = build_function_type_list (V2DF_type_node,
22828                                 V4DF_type_node, integer_type_node,
22829                                 NULL_TREE);
22830   tree v8sf_ftype_v8sf_v8sf_int
22831     = build_function_type_list (V8SF_type_node,
22832                                 V8SF_type_node, V8SF_type_node,
22833                                 integer_type_node,
22834                                 NULL_TREE);
22835   tree v8sf_ftype_v8sf_v8sf_v8sf
22836     = build_function_type_list (V8SF_type_node,
22837                                 V8SF_type_node, V8SF_type_node,
22838                                 V8SF_type_node,
22839                                 NULL_TREE);
22840   tree v4df_ftype_v4df_v4df_v4df
22841     = build_function_type_list (V4DF_type_node,
22842                                 V4DF_type_node, V4DF_type_node,
22843                                 V4DF_type_node,
22844                                 NULL_TREE);
22845   tree v8si_ftype_v8si_v8si_int
22846     = build_function_type_list (V8SI_type_node,
22847                                 V8SI_type_node, V8SI_type_node,
22848                                 integer_type_node,
22849                                 NULL_TREE);
22850   tree v4df_ftype_v4df_v4df_int
22851     = build_function_type_list (V4DF_type_node,
22852                                 V4DF_type_node, V4DF_type_node,
22853                                 integer_type_node,
22854                                 NULL_TREE);
22855   tree v8sf_ftype_pcfloat
22856     = build_function_type_list (V8SF_type_node,
22857                                 pcfloat_type_node,
22858                                 NULL_TREE);
22859   tree v4df_ftype_pcdouble
22860     = build_function_type_list (V4DF_type_node,
22861                                 pcdouble_type_node,
22862                                 NULL_TREE);
22863   tree pcv4sf_type_node
22864     = build_pointer_type (build_type_variant (V4SF_type_node, 1, 0));
22865   tree pcv2df_type_node
22866     = build_pointer_type (build_type_variant (V2DF_type_node, 1, 0));
22867   tree v8sf_ftype_pcv4sf
22868     = build_function_type_list (V8SF_type_node,
22869                                 pcv4sf_type_node,
22870                                 NULL_TREE);
22871   tree v4df_ftype_pcv2df
22872     = build_function_type_list (V4DF_type_node,
22873                                 pcv2df_type_node,
22874                                 NULL_TREE);
22875   tree v32qi_ftype_pcchar
22876     = build_function_type_list (V32QI_type_node,
22877                                 pcchar_type_node,
22878                                 NULL_TREE);
22879   tree void_ftype_pchar_v32qi
22880     = build_function_type_list (void_type_node,
22881                                 pchar_type_node, V32QI_type_node,
22882                                 NULL_TREE);
22883   tree v8si_ftype_v8si_v4si_int
22884     = build_function_type_list (V8SI_type_node,
22885                                 V8SI_type_node, V4SI_type_node,
22886                                 integer_type_node,
22887                                 NULL_TREE);
22888   tree pv4di_type_node = build_pointer_type (V4DI_type_node);
22889   tree void_ftype_pv4di_v4di
22890     = build_function_type_list (void_type_node,
22891                                 pv4di_type_node, V4DI_type_node,
22892                                 NULL_TREE);
22893   tree v8sf_ftype_v8sf_v4sf_int
22894     = build_function_type_list (V8SF_type_node,
22895                                 V8SF_type_node, V4SF_type_node,
22896                                 integer_type_node,
22897                                 NULL_TREE);
22898   tree v4df_ftype_v4df_v2df_int
22899     = build_function_type_list (V4DF_type_node,
22900                                 V4DF_type_node, V2DF_type_node,
22901                                 integer_type_node,
22902                                 NULL_TREE);
22903   tree void_ftype_pfloat_v8sf
22904     = build_function_type_list (void_type_node,
22905                                 pfloat_type_node, V8SF_type_node,
22906                                 NULL_TREE);
22907   tree void_ftype_pdouble_v4df
22908     = build_function_type_list (void_type_node,
22909                                 pdouble_type_node, V4DF_type_node,
22910                                 NULL_TREE);
22911   tree pv8sf_type_node = build_pointer_type (V8SF_type_node);
22912   tree pv4sf_type_node = build_pointer_type (V4SF_type_node);
22913   tree pv4df_type_node = build_pointer_type (V4DF_type_node);
22914   tree pv2df_type_node = build_pointer_type (V2DF_type_node);
22915   tree pcv8sf_type_node
22916     = build_pointer_type (build_type_variant (V8SF_type_node, 1, 0));
22917   tree pcv4df_type_node
22918     = build_pointer_type (build_type_variant (V4DF_type_node, 1, 0));
22919   tree v8sf_ftype_pcv8sf_v8sf
22920     = build_function_type_list (V8SF_type_node,
22921                                 pcv8sf_type_node, V8SF_type_node,
22922                                 NULL_TREE);
22923   tree v4df_ftype_pcv4df_v4df
22924     = build_function_type_list (V4DF_type_node,
22925                                 pcv4df_type_node, V4DF_type_node,
22926                                 NULL_TREE);
22927   tree v4sf_ftype_pcv4sf_v4sf
22928     = build_function_type_list (V4SF_type_node,
22929                                 pcv4sf_type_node, V4SF_type_node,
22930                                 NULL_TREE);
22931   tree v2df_ftype_pcv2df_v2df
22932     = build_function_type_list (V2DF_type_node,
22933                                 pcv2df_type_node, V2DF_type_node,
22934                                 NULL_TREE);
22935   tree void_ftype_pv8sf_v8sf_v8sf
22936     = build_function_type_list (void_type_node,
22937                                 pv8sf_type_node, V8SF_type_node,
22938                                 V8SF_type_node,
22939                                 NULL_TREE);
22940   tree void_ftype_pv4df_v4df_v4df
22941     = build_function_type_list (void_type_node,
22942                                 pv4df_type_node, V4DF_type_node,
22943                                 V4DF_type_node,
22944                                 NULL_TREE);
22945   tree void_ftype_pv4sf_v4sf_v4sf
22946     = build_function_type_list (void_type_node,
22947                                 pv4sf_type_node, V4SF_type_node,
22948                                 V4SF_type_node,
22949                                 NULL_TREE);
22950   tree void_ftype_pv2df_v2df_v2df
22951     = build_function_type_list (void_type_node,
22952                                 pv2df_type_node, V2DF_type_node,
22953                                 V2DF_type_node,
22954                                 NULL_TREE);
22955   tree v4df_ftype_v2df
22956     = build_function_type_list (V4DF_type_node,
22957                                 V2DF_type_node,
22958                                 NULL_TREE);
22959   tree v8sf_ftype_v4sf
22960     = build_function_type_list (V8SF_type_node,
22961                                 V4SF_type_node,
22962                                 NULL_TREE);
22963   tree v8si_ftype_v4si
22964     = build_function_type_list (V8SI_type_node,
22965                                 V4SI_type_node,
22966                                 NULL_TREE);
22967   tree v2df_ftype_v4df
22968     = build_function_type_list (V2DF_type_node,
22969                                 V4DF_type_node,
22970                                 NULL_TREE);
22971   tree v4sf_ftype_v8sf
22972     = build_function_type_list (V4SF_type_node,
22973                                 V8SF_type_node,
22974                                 NULL_TREE);
22975   tree v4si_ftype_v8si
22976     = build_function_type_list (V4SI_type_node,
22977                                 V8SI_type_node,
22978                                 NULL_TREE);
22979   tree int_ftype_v4df
22980     = build_function_type_list (integer_type_node,
22981                                 V4DF_type_node,
22982                                 NULL_TREE);
22983   tree int_ftype_v8sf
22984     = build_function_type_list (integer_type_node,
22985                                 V8SF_type_node,
22986                                 NULL_TREE);
22987   tree int_ftype_v8sf_v8sf
22988     = build_function_type_list (integer_type_node,
22989                                 V8SF_type_node, V8SF_type_node,
22990                                 NULL_TREE);
22991   tree int_ftype_v4di_v4di
22992     = build_function_type_list (integer_type_node,
22993                                 V4DI_type_node, V4DI_type_node,
22994                                 NULL_TREE);
22995   tree int_ftype_v4df_v4df
22996     = build_function_type_list (integer_type_node,
22997                                 V4DF_type_node, V4DF_type_node,
22998                                 NULL_TREE);
22999   tree v8sf_ftype_v8sf_v8si
23000     = build_function_type_list (V8SF_type_node,
23001                                 V8SF_type_node, V8SI_type_node,
23002                                 NULL_TREE);
23003   tree v4df_ftype_v4df_v4di
23004     = build_function_type_list (V4DF_type_node,
23005                                 V4DF_type_node, V4DI_type_node,
23006                                 NULL_TREE);
23007   tree v4sf_ftype_v4sf_v4si
23008     = build_function_type_list (V4SF_type_node,
23009                                 V4SF_type_node, V4SI_type_node, NULL_TREE);
23010   tree v2df_ftype_v2df_v2di
23011     = build_function_type_list (V2DF_type_node,
23012                                 V2DF_type_node, V2DI_type_node, NULL_TREE);
23013
23014   tree ftype;
23015
23016   /* Add all special builtins with variable number of operands.  */
23017   for (i = 0, d = bdesc_special_args;
23018        i < ARRAY_SIZE (bdesc_special_args);
23019        i++, d++)
23020     {
23021       tree type;
23022
23023       if (d->name == 0)
23024         continue;
23025
23026       switch ((enum ix86_special_builtin_type) d->flag)
23027         {
23028         case VOID_FTYPE_VOID:
23029           type = void_ftype_void;
23030           break;
23031         case V32QI_FTYPE_PCCHAR:
23032           type = v32qi_ftype_pcchar;
23033           break;
23034         case V16QI_FTYPE_PCCHAR:
23035           type = v16qi_ftype_pcchar;
23036           break;
23037         case V8SF_FTYPE_PCV4SF:
23038           type = v8sf_ftype_pcv4sf;
23039           break;
23040         case V8SF_FTYPE_PCFLOAT:
23041           type = v8sf_ftype_pcfloat;
23042           break;
23043         case V4DF_FTYPE_PCV2DF:
23044           type = v4df_ftype_pcv2df;
23045           break;
23046         case V4DF_FTYPE_PCDOUBLE:
23047           type = v4df_ftype_pcdouble;
23048           break;
23049         case V4SF_FTYPE_PCFLOAT:
23050           type = v4sf_ftype_pcfloat;
23051           break;
23052         case V2DI_FTYPE_PV2DI:
23053           type = v2di_ftype_pv2di;
23054           break;
23055         case V2DF_FTYPE_PCDOUBLE:
23056           type = v2df_ftype_pcdouble;
23057           break;
23058         case V8SF_FTYPE_PCV8SF_V8SF:
23059           type = v8sf_ftype_pcv8sf_v8sf;
23060           break;
23061         case V4DF_FTYPE_PCV4DF_V4DF:
23062           type = v4df_ftype_pcv4df_v4df;
23063           break;
23064         case V4SF_FTYPE_V4SF_PCV2SF:
23065           type = v4sf_ftype_v4sf_pcv2sf;
23066           break;
23067         case V4SF_FTYPE_PCV4SF_V4SF:
23068           type = v4sf_ftype_pcv4sf_v4sf;
23069           break;
23070         case V2DF_FTYPE_V2DF_PCDOUBLE:
23071           type = v2df_ftype_v2df_pcdouble;
23072           break;
23073         case V2DF_FTYPE_PCV2DF_V2DF:
23074           type = v2df_ftype_pcv2df_v2df;
23075           break;
23076         case VOID_FTYPE_PV2SF_V4SF:
23077           type = void_ftype_pv2sf_v4sf;
23078           break;
23079         case VOID_FTYPE_PV4DI_V4DI:
23080           type = void_ftype_pv4di_v4di;
23081           break;
23082         case VOID_FTYPE_PV2DI_V2DI:
23083           type = void_ftype_pv2di_v2di;
23084           break;
23085         case VOID_FTYPE_PCHAR_V32QI:
23086           type = void_ftype_pchar_v32qi;
23087           break;
23088         case VOID_FTYPE_PCHAR_V16QI:
23089           type = void_ftype_pchar_v16qi;
23090           break;
23091         case VOID_FTYPE_PFLOAT_V8SF:
23092           type = void_ftype_pfloat_v8sf;
23093           break;
23094         case VOID_FTYPE_PFLOAT_V4SF:
23095           type = void_ftype_pfloat_v4sf;
23096           break;
23097         case VOID_FTYPE_PDOUBLE_V4DF:
23098           type = void_ftype_pdouble_v4df;
23099           break;
23100         case VOID_FTYPE_PDOUBLE_V2DF:
23101           type = void_ftype_pdouble_v2df;
23102           break;
23103         case VOID_FTYPE_PDI_DI:
23104           type = void_ftype_pdi_di;
23105           break;
23106         case VOID_FTYPE_PINT_INT:
23107           type = void_ftype_pint_int;
23108           break;
23109         case VOID_FTYPE_PV8SF_V8SF_V8SF:
23110           type = void_ftype_pv8sf_v8sf_v8sf;
23111           break;
23112         case VOID_FTYPE_PV4DF_V4DF_V4DF:
23113           type = void_ftype_pv4df_v4df_v4df;
23114           break;
23115         case VOID_FTYPE_PV4SF_V4SF_V4SF:
23116           type = void_ftype_pv4sf_v4sf_v4sf;
23117           break;
23118         case VOID_FTYPE_PV2DF_V2DF_V2DF:
23119           type = void_ftype_pv2df_v2df_v2df;
23120           break;
23121         default:
23122           gcc_unreachable ();
23123         }
23124
23125       def_builtin (d->mask, d->name, type, d->code);
23126     }
23127
23128   /* Add all builtins with variable number of operands.  */
23129   for (i = 0, d = bdesc_args;
23130        i < ARRAY_SIZE (bdesc_args);
23131        i++, d++)
23132     {
23133       tree type;
23134
23135       if (d->name == 0)
23136         continue;
23137
23138       switch ((enum ix86_builtin_type) d->flag)
23139         {
23140         case FLOAT_FTYPE_FLOAT:
23141           type = float_ftype_float;
23142           break;
23143         case INT_FTYPE_V8SF_V8SF_PTEST:
23144           type = int_ftype_v8sf_v8sf;
23145           break;
23146         case INT_FTYPE_V4DI_V4DI_PTEST:
23147           type = int_ftype_v4di_v4di;
23148           break;
23149         case INT_FTYPE_V4DF_V4DF_PTEST:
23150           type = int_ftype_v4df_v4df;
23151           break;
23152         case INT_FTYPE_V4SF_V4SF_PTEST:
23153           type = int_ftype_v4sf_v4sf;
23154           break;
23155         case INT_FTYPE_V2DI_V2DI_PTEST:
23156           type = int_ftype_v2di_v2di;
23157           break;
23158         case INT_FTYPE_V2DF_V2DF_PTEST:
23159           type = int_ftype_v2df_v2df;
23160           break;
23161         case INT64_FTYPE_V4SF:
23162           type = int64_ftype_v4sf;
23163           break;
23164         case INT64_FTYPE_V2DF:
23165           type = int64_ftype_v2df;
23166           break;
23167         case INT_FTYPE_V16QI:
23168           type = int_ftype_v16qi;
23169           break;
23170         case INT_FTYPE_V8QI:
23171           type = int_ftype_v8qi;
23172           break;
23173         case INT_FTYPE_V8SF:
23174           type = int_ftype_v8sf;
23175           break;
23176         case INT_FTYPE_V4DF:
23177           type = int_ftype_v4df;
23178           break;
23179         case INT_FTYPE_V4SF:
23180           type = int_ftype_v4sf;
23181           break;
23182         case INT_FTYPE_V2DF:
23183           type = int_ftype_v2df;
23184           break;
23185         case V16QI_FTYPE_V16QI:
23186           type = v16qi_ftype_v16qi;
23187           break;
23188         case V8SI_FTYPE_V8SF:
23189           type = v8si_ftype_v8sf;
23190           break;
23191         case V8SI_FTYPE_V4SI:
23192           type = v8si_ftype_v4si;
23193           break;
23194         case V8HI_FTYPE_V8HI:
23195           type = v8hi_ftype_v8hi;
23196           break;
23197         case V8HI_FTYPE_V16QI:
23198           type = v8hi_ftype_v16qi;
23199           break;
23200         case V8QI_FTYPE_V8QI:
23201           type = v8qi_ftype_v8qi;
23202           break;
23203         case V8SF_FTYPE_V8SF:
23204           type = v8sf_ftype_v8sf;
23205           break;
23206         case V8SF_FTYPE_V8SI:
23207           type = v8sf_ftype_v8si;
23208           break;
23209         case V8SF_FTYPE_V4SF:
23210           type = v8sf_ftype_v4sf;
23211           break;
23212         case V4SI_FTYPE_V4DF:
23213           type = v4si_ftype_v4df;
23214           break;
23215         case V4SI_FTYPE_V4SI:
23216           type = v4si_ftype_v4si;
23217           break;
23218         case V4SI_FTYPE_V16QI:
23219           type = v4si_ftype_v16qi;
23220           break;
23221         case V4SI_FTYPE_V8SI:
23222           type = v4si_ftype_v8si;
23223           break;
23224         case V4SI_FTYPE_V8HI:
23225           type = v4si_ftype_v8hi;
23226           break;
23227         case V4SI_FTYPE_V4SF:
23228           type = v4si_ftype_v4sf;
23229           break;
23230         case V4SI_FTYPE_V2DF:
23231           type = v4si_ftype_v2df;
23232           break;
23233         case V4HI_FTYPE_V4HI:
23234           type = v4hi_ftype_v4hi;
23235           break;
23236         case V4DF_FTYPE_V4DF:
23237           type = v4df_ftype_v4df;
23238           break;
23239         case V4DF_FTYPE_V4SI:
23240           type = v4df_ftype_v4si;
23241           break;
23242         case V4DF_FTYPE_V4SF:
23243           type = v4df_ftype_v4sf;
23244           break;
23245         case V4DF_FTYPE_V2DF:
23246           type = v4df_ftype_v2df;
23247           break;
23248         case V4SF_FTYPE_V4SF:
23249         case V4SF_FTYPE_V4SF_VEC_MERGE:
23250           type = v4sf_ftype_v4sf;
23251           break;
23252         case V4SF_FTYPE_V8SF:
23253           type = v4sf_ftype_v8sf;
23254           break;
23255         case V4SF_FTYPE_V4SI:
23256           type = v4sf_ftype_v4si;
23257           break;
23258         case V4SF_FTYPE_V4DF:
23259           type = v4sf_ftype_v4df;
23260           break;
23261         case V4SF_FTYPE_V2DF:
23262           type = v4sf_ftype_v2df;
23263           break;
23264         case V2DI_FTYPE_V2DI:
23265           type = v2di_ftype_v2di;
23266           break;
23267         case V2DI_FTYPE_V16QI:
23268           type = v2di_ftype_v16qi;
23269           break;
23270         case V2DI_FTYPE_V8HI:
23271           type = v2di_ftype_v8hi;
23272           break;
23273         case V2DI_FTYPE_V4SI:
23274           type = v2di_ftype_v4si;
23275           break;
23276         case V2SI_FTYPE_V2SI:
23277           type = v2si_ftype_v2si;
23278           break;
23279         case V2SI_FTYPE_V4SF:
23280           type = v2si_ftype_v4sf;
23281           break;
23282         case V2SI_FTYPE_V2DF:
23283           type = v2si_ftype_v2df;
23284           break;
23285         case V2SI_FTYPE_V2SF:
23286           type = v2si_ftype_v2sf;
23287           break;
23288         case V2DF_FTYPE_V4DF:
23289           type = v2df_ftype_v4df;
23290           break;
23291         case V2DF_FTYPE_V4SF:
23292           type = v2df_ftype_v4sf;
23293           break;
23294         case V2DF_FTYPE_V2DF:
23295         case V2DF_FTYPE_V2DF_VEC_MERGE:
23296           type = v2df_ftype_v2df;
23297           break;
23298         case V2DF_FTYPE_V2SI:
23299           type = v2df_ftype_v2si;
23300           break;
23301         case V2DF_FTYPE_V4SI:
23302           type = v2df_ftype_v4si;
23303           break;
23304         case V2SF_FTYPE_V2SF:
23305           type = v2sf_ftype_v2sf;
23306           break;
23307         case V2SF_FTYPE_V2SI:
23308           type = v2sf_ftype_v2si;
23309           break;
23310         case V16QI_FTYPE_V16QI_V16QI:
23311           type = v16qi_ftype_v16qi_v16qi;
23312           break;
23313         case V16QI_FTYPE_V8HI_V8HI:
23314           type = v16qi_ftype_v8hi_v8hi;
23315           break;
23316         case V8QI_FTYPE_V8QI_V8QI:
23317           type = v8qi_ftype_v8qi_v8qi;
23318           break;
23319         case V8QI_FTYPE_V4HI_V4HI:
23320           type = v8qi_ftype_v4hi_v4hi;
23321           break;
23322         case V8HI_FTYPE_V8HI_V8HI:
23323         case V8HI_FTYPE_V8HI_V8HI_COUNT:
23324           type = v8hi_ftype_v8hi_v8hi;
23325           break;
23326         case V8HI_FTYPE_V16QI_V16QI:
23327           type = v8hi_ftype_v16qi_v16qi;
23328           break;
23329         case V8HI_FTYPE_V4SI_V4SI:
23330           type = v8hi_ftype_v4si_v4si;
23331           break;
23332         case V8HI_FTYPE_V8HI_SI_COUNT:
23333           type = v8hi_ftype_v8hi_int;
23334           break;
23335         case V8SF_FTYPE_V8SF_V8SF:
23336           type = v8sf_ftype_v8sf_v8sf;
23337           break;
23338         case V8SF_FTYPE_V8SF_V8SI:
23339           type = v8sf_ftype_v8sf_v8si;
23340           break;
23341         case V4SI_FTYPE_V4SI_V4SI:
23342         case V4SI_FTYPE_V4SI_V4SI_COUNT:
23343           type = v4si_ftype_v4si_v4si;
23344           break;
23345         case V4SI_FTYPE_V8HI_V8HI:
23346           type = v4si_ftype_v8hi_v8hi;
23347           break;
23348         case V4SI_FTYPE_V4SF_V4SF:
23349           type = v4si_ftype_v4sf_v4sf;
23350           break;
23351         case V4SI_FTYPE_V2DF_V2DF:
23352           type = v4si_ftype_v2df_v2df;
23353           break;
23354         case V4SI_FTYPE_V4SI_SI_COUNT:
23355           type = v4si_ftype_v4si_int;
23356           break;
23357         case V4HI_FTYPE_V4HI_V4HI:
23358         case V4HI_FTYPE_V4HI_V4HI_COUNT:
23359           type = v4hi_ftype_v4hi_v4hi;
23360           break;
23361         case V4HI_FTYPE_V8QI_V8QI:
23362           type = v4hi_ftype_v8qi_v8qi;
23363           break;
23364         case V4HI_FTYPE_V2SI_V2SI:
23365           type = v4hi_ftype_v2si_v2si;
23366           break;
23367         case V4HI_FTYPE_V4HI_SI_COUNT:
23368           type = v4hi_ftype_v4hi_int;
23369           break;
23370         case V4DF_FTYPE_V4DF_V4DF:
23371           type = v4df_ftype_v4df_v4df;
23372           break;
23373         case V4DF_FTYPE_V4DF_V4DI:
23374           type = v4df_ftype_v4df_v4di;
23375           break;
23376         case V4SF_FTYPE_V4SF_V4SF:
23377         case V4SF_FTYPE_V4SF_V4SF_SWAP:
23378           type = v4sf_ftype_v4sf_v4sf;
23379           break;
23380         case V4SF_FTYPE_V4SF_V4SI:
23381           type = v4sf_ftype_v4sf_v4si;
23382           break;
23383         case V4SF_FTYPE_V4SF_V2SI:
23384           type = v4sf_ftype_v4sf_v2si;
23385           break;
23386         case V4SF_FTYPE_V4SF_V2DF:
23387           type = v4sf_ftype_v4sf_v2df;
23388           break;
23389         case V4SF_FTYPE_V4SF_DI:
23390           type = v4sf_ftype_v4sf_int64;
23391           break;
23392         case V4SF_FTYPE_V4SF_SI:
23393           type = v4sf_ftype_v4sf_int;
23394           break;
23395         case V2DI_FTYPE_V2DI_V2DI:
23396         case V2DI_FTYPE_V2DI_V2DI_COUNT:
23397           type = v2di_ftype_v2di_v2di;
23398           break;
23399         case V2DI_FTYPE_V16QI_V16QI:
23400           type = v2di_ftype_v16qi_v16qi;
23401           break;
23402         case V2DI_FTYPE_V4SI_V4SI:
23403           type = v2di_ftype_v4si_v4si;
23404           break;
23405         case V2DI_FTYPE_V2DI_V16QI:
23406           type = v2di_ftype_v2di_v16qi;
23407           break;
23408         case V2DI_FTYPE_V2DF_V2DF:
23409           type = v2di_ftype_v2df_v2df;
23410           break;
23411         case V2DI_FTYPE_V2DI_SI_COUNT:
23412           type = v2di_ftype_v2di_int;
23413           break;
23414         case V2SI_FTYPE_V2SI_V2SI:
23415         case V2SI_FTYPE_V2SI_V2SI_COUNT:
23416           type = v2si_ftype_v2si_v2si;
23417           break;
23418         case V2SI_FTYPE_V4HI_V4HI:
23419           type = v2si_ftype_v4hi_v4hi;
23420           break;
23421         case V2SI_FTYPE_V2SF_V2SF:
23422           type = v2si_ftype_v2sf_v2sf;
23423           break;
23424         case V2SI_FTYPE_V2SI_SI_COUNT:
23425           type = v2si_ftype_v2si_int;
23426           break;
23427         case V2DF_FTYPE_V2DF_V2DF:
23428         case V2DF_FTYPE_V2DF_V2DF_SWAP:
23429           type = v2df_ftype_v2df_v2df;
23430           break;
23431         case V2DF_FTYPE_V2DF_V4SF:
23432           type = v2df_ftype_v2df_v4sf;
23433           break;
23434         case V2DF_FTYPE_V2DF_V2DI:
23435           type = v2df_ftype_v2df_v2di;
23436           break;
23437         case V2DF_FTYPE_V2DF_DI:
23438           type = v2df_ftype_v2df_int64;
23439           break;
23440         case V2DF_FTYPE_V2DF_SI:
23441           type = v2df_ftype_v2df_int;
23442           break;
23443         case V2SF_FTYPE_V2SF_V2SF:
23444           type = v2sf_ftype_v2sf_v2sf;
23445           break;
23446         case V1DI_FTYPE_V1DI_V1DI:
23447         case V1DI_FTYPE_V1DI_V1DI_COUNT:
23448           type = v1di_ftype_v1di_v1di;
23449           break;
23450         case V1DI_FTYPE_V8QI_V8QI:
23451           type = v1di_ftype_v8qi_v8qi;
23452           break;
23453         case V1DI_FTYPE_V2SI_V2SI:
23454           type = v1di_ftype_v2si_v2si;
23455           break;
23456         case V1DI_FTYPE_V1DI_SI_COUNT:
23457           type = v1di_ftype_v1di_int;
23458           break;
23459         case UINT64_FTYPE_UINT64_UINT64:
23460           type = uint64_ftype_uint64_uint64;
23461           break;
23462         case UINT_FTYPE_UINT_UINT:
23463           type = unsigned_ftype_unsigned_unsigned;
23464           break;
23465         case UINT_FTYPE_UINT_USHORT:
23466           type = unsigned_ftype_unsigned_ushort;
23467           break;
23468         case UINT_FTYPE_UINT_UCHAR:
23469           type = unsigned_ftype_unsigned_uchar;
23470           break;
23471         case V8HI_FTYPE_V8HI_INT:
23472           type = v8hi_ftype_v8hi_int;
23473           break;
23474         case V8SF_FTYPE_V8SF_INT:
23475           type = v8sf_ftype_v8sf_int;
23476           break;
23477         case V4SI_FTYPE_V4SI_INT:
23478           type = v4si_ftype_v4si_int;
23479           break;
23480         case V4SI_FTYPE_V8SI_INT:
23481           type = v4si_ftype_v8si_int;
23482           break;
23483         case V4HI_FTYPE_V4HI_INT:
23484           type = v4hi_ftype_v4hi_int;
23485           break;
23486         case V4DF_FTYPE_V4DF_INT:
23487           type = v4df_ftype_v4df_int;
23488           break;
23489         case V4SF_FTYPE_V4SF_INT:
23490           type = v4sf_ftype_v4sf_int;
23491           break;
23492         case V4SF_FTYPE_V8SF_INT:
23493           type = v4sf_ftype_v8sf_int;
23494           break;
23495         case V2DI_FTYPE_V2DI_INT:
23496         case V2DI2TI_FTYPE_V2DI_INT:
23497           type = v2di_ftype_v2di_int;
23498           break;
23499         case V2DF_FTYPE_V2DF_INT:
23500           type = v2df_ftype_v2df_int;
23501           break;
23502         case V2DF_FTYPE_V4DF_INT:
23503           type = v2df_ftype_v4df_int;
23504           break;
23505         case V16QI_FTYPE_V16QI_V16QI_V16QI:
23506           type = v16qi_ftype_v16qi_v16qi_v16qi;
23507           break;
23508         case V8SF_FTYPE_V8SF_V8SF_V8SF:
23509           type = v8sf_ftype_v8sf_v8sf_v8sf;
23510           break;
23511         case V4DF_FTYPE_V4DF_V4DF_V4DF:
23512           type = v4df_ftype_v4df_v4df_v4df;
23513           break;
23514         case V4SF_FTYPE_V4SF_V4SF_V4SF:
23515           type = v4sf_ftype_v4sf_v4sf_v4sf;
23516           break;
23517         case V2DF_FTYPE_V2DF_V2DF_V2DF:
23518           type = v2df_ftype_v2df_v2df_v2df;
23519           break;
23520         case V16QI_FTYPE_V16QI_V16QI_INT:
23521           type = v16qi_ftype_v16qi_v16qi_int;
23522           break;
23523         case V8SI_FTYPE_V8SI_V8SI_INT:
23524           type = v8si_ftype_v8si_v8si_int;
23525           break;
23526         case V8SI_FTYPE_V8SI_V4SI_INT:
23527           type = v8si_ftype_v8si_v4si_int;
23528           break;
23529         case V8HI_FTYPE_V8HI_V8HI_INT:
23530           type = v8hi_ftype_v8hi_v8hi_int;
23531           break;
23532         case V8SF_FTYPE_V8SF_V8SF_INT:
23533           type = v8sf_ftype_v8sf_v8sf_int;
23534           break;
23535         case V8SF_FTYPE_V8SF_V4SF_INT:
23536           type = v8sf_ftype_v8sf_v4sf_int;
23537           break;
23538         case V4SI_FTYPE_V4SI_V4SI_INT:
23539           type = v4si_ftype_v4si_v4si_int;
23540           break;
23541         case V4DF_FTYPE_V4DF_V4DF_INT:
23542           type = v4df_ftype_v4df_v4df_int;
23543           break;
23544         case V4DF_FTYPE_V4DF_V2DF_INT:
23545           type = v4df_ftype_v4df_v2df_int;
23546           break;
23547         case V4SF_FTYPE_V4SF_V4SF_INT:
23548           type = v4sf_ftype_v4sf_v4sf_int;
23549           break;
23550         case V2DI_FTYPE_V2DI_V2DI_INT:
23551         case V2DI2TI_FTYPE_V2DI_V2DI_INT:
23552           type = v2di_ftype_v2di_v2di_int;
23553           break;
23554         case V2DF_FTYPE_V2DF_V2DF_INT:
23555           type = v2df_ftype_v2df_v2df_int;
23556           break;
23557         case V2DI_FTYPE_V2DI_UINT_UINT:
23558           type = v2di_ftype_v2di_unsigned_unsigned;
23559           break;
23560         case V2DI_FTYPE_V2DI_V2DI_UINT_UINT:
23561           type = v2di_ftype_v2di_v2di_unsigned_unsigned;
23562           break;
23563         case V1DI2DI_FTYPE_V1DI_V1DI_INT:
23564           type = v1di_ftype_v1di_v1di_int;
23565           break;
23566         default:
23567           gcc_unreachable ();
23568         }
23569
23570       def_builtin_const (d->mask, d->name, type, d->code);
23571     }
23572
23573   /* pcmpestr[im] insns.  */
23574   for (i = 0, d = bdesc_pcmpestr;
23575        i < ARRAY_SIZE (bdesc_pcmpestr);
23576        i++, d++)
23577     {
23578       if (d->code == IX86_BUILTIN_PCMPESTRM128)
23579         ftype = v16qi_ftype_v16qi_int_v16qi_int_int;
23580       else
23581         ftype = int_ftype_v16qi_int_v16qi_int_int;
23582       def_builtin_const (d->mask, d->name, ftype, d->code);
23583     }
23584
23585   /* pcmpistr[im] insns.  */
23586   for (i = 0, d = bdesc_pcmpistr;
23587        i < ARRAY_SIZE (bdesc_pcmpistr);
23588        i++, d++)
23589     {
23590       if (d->code == IX86_BUILTIN_PCMPISTRM128)
23591         ftype = v16qi_ftype_v16qi_v16qi_int;
23592       else
23593         ftype = int_ftype_v16qi_v16qi_int;
23594       def_builtin_const (d->mask, d->name, ftype, d->code);
23595     }
23596
23597   /* comi/ucomi insns.  */
23598   for (i = 0, d = bdesc_comi; i < ARRAY_SIZE (bdesc_comi); i++, d++)
23599     if (d->mask == OPTION_MASK_ISA_SSE2)
23600       def_builtin_const (d->mask, d->name, int_ftype_v2df_v2df, d->code);
23601     else
23602       def_builtin_const (d->mask, d->name, int_ftype_v4sf_v4sf, d->code);
23603
23604   /* SSE */
23605   def_builtin (OPTION_MASK_ISA_SSE, "__builtin_ia32_ldmxcsr", void_ftype_unsigned, IX86_BUILTIN_LDMXCSR);
23606   def_builtin (OPTION_MASK_ISA_SSE, "__builtin_ia32_stmxcsr", unsigned_ftype_void, IX86_BUILTIN_STMXCSR);
23607
23608   /* SSE or 3DNow!A */
23609   def_builtin (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, "__builtin_ia32_maskmovq", void_ftype_v8qi_v8qi_pchar, IX86_BUILTIN_MASKMOVQ);
23610
23611   /* SSE2 */
23612   def_builtin (OPTION_MASK_ISA_SSE2, "__builtin_ia32_maskmovdqu", void_ftype_v16qi_v16qi_pchar, IX86_BUILTIN_MASKMOVDQU);
23613
23614   def_builtin (OPTION_MASK_ISA_SSE2, "__builtin_ia32_clflush", void_ftype_pcvoid, IX86_BUILTIN_CLFLUSH);
23615   x86_mfence = def_builtin (OPTION_MASK_ISA_SSE2, "__builtin_ia32_mfence", void_ftype_void, IX86_BUILTIN_MFENCE);
23616
23617   /* SSE3.  */
23618   def_builtin (OPTION_MASK_ISA_SSE3, "__builtin_ia32_monitor", void_ftype_pcvoid_unsigned_unsigned, IX86_BUILTIN_MONITOR);
23619   def_builtin (OPTION_MASK_ISA_SSE3, "__builtin_ia32_mwait", void_ftype_unsigned_unsigned, IX86_BUILTIN_MWAIT);
23620
23621   /* AES */
23622   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesenc128", v2di_ftype_v2di_v2di, IX86_BUILTIN_AESENC128);
23623   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesenclast128", v2di_ftype_v2di_v2di, IX86_BUILTIN_AESENCLAST128);
23624   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesdec128", v2di_ftype_v2di_v2di, IX86_BUILTIN_AESDEC128);
23625   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesdeclast128", v2di_ftype_v2di_v2di, IX86_BUILTIN_AESDECLAST128);
23626   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesimc128", v2di_ftype_v2di, IX86_BUILTIN_AESIMC128);
23627   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aeskeygenassist128", v2di_ftype_v2di_int, IX86_BUILTIN_AESKEYGENASSIST128);
23628
23629   /* PCLMUL */
23630   def_builtin_const (OPTION_MASK_ISA_PCLMUL, "__builtin_ia32_pclmulqdq128", v2di_ftype_v2di_v2di_int, IX86_BUILTIN_PCLMULQDQ128);
23631
23632   /* AVX */
23633   def_builtin (OPTION_MASK_ISA_AVX, "__builtin_ia32_vzeroupper", void_ftype_void,
23634                TARGET_64BIT ? IX86_BUILTIN_VZEROUPPER_REX64 : IX86_BUILTIN_VZEROUPPER);
23635
23636   /* Access to the vec_init patterns.  */
23637   ftype = build_function_type_list (V2SI_type_node, integer_type_node,
23638                                     integer_type_node, NULL_TREE);
23639   def_builtin_const (OPTION_MASK_ISA_MMX, "__builtin_ia32_vec_init_v2si", ftype, IX86_BUILTIN_VEC_INIT_V2SI);
23640
23641   ftype = build_function_type_list (V4HI_type_node, short_integer_type_node,
23642                                     short_integer_type_node,
23643                                     short_integer_type_node,
23644                                     short_integer_type_node, NULL_TREE);
23645   def_builtin_const (OPTION_MASK_ISA_MMX, "__builtin_ia32_vec_init_v4hi", ftype, IX86_BUILTIN_VEC_INIT_V4HI);
23646
23647   ftype = build_function_type_list (V8QI_type_node, char_type_node,
23648                                     char_type_node, char_type_node,
23649                                     char_type_node, char_type_node,
23650                                     char_type_node, char_type_node,
23651                                     char_type_node, NULL_TREE);
23652   def_builtin_const (OPTION_MASK_ISA_MMX, "__builtin_ia32_vec_init_v8qi", ftype, IX86_BUILTIN_VEC_INIT_V8QI);
23653
23654   /* Access to the vec_extract patterns.  */
23655   ftype = build_function_type_list (double_type_node, V2DF_type_node,
23656                                     integer_type_node, NULL_TREE);
23657   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v2df", ftype, IX86_BUILTIN_VEC_EXT_V2DF);
23658
23659   ftype = build_function_type_list (long_long_integer_type_node,
23660                                     V2DI_type_node, integer_type_node,
23661                                     NULL_TREE);
23662   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v2di", ftype, IX86_BUILTIN_VEC_EXT_V2DI);
23663
23664   ftype = build_function_type_list (float_type_node, V4SF_type_node,
23665                                     integer_type_node, NULL_TREE);
23666   def_builtin_const (OPTION_MASK_ISA_SSE, "__builtin_ia32_vec_ext_v4sf", ftype, IX86_BUILTIN_VEC_EXT_V4SF);
23667
23668   ftype = build_function_type_list (intSI_type_node, V4SI_type_node,
23669                                     integer_type_node, NULL_TREE);
23670   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v4si", ftype, IX86_BUILTIN_VEC_EXT_V4SI);
23671
23672   ftype = build_function_type_list (intHI_type_node, V8HI_type_node,
23673                                     integer_type_node, NULL_TREE);
23674   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v8hi", ftype, IX86_BUILTIN_VEC_EXT_V8HI);
23675
23676   ftype = build_function_type_list (intHI_type_node, V4HI_type_node,
23677                                     integer_type_node, NULL_TREE);
23678   def_builtin_const (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, "__builtin_ia32_vec_ext_v4hi", ftype, IX86_BUILTIN_VEC_EXT_V4HI);
23679
23680   ftype = build_function_type_list (intSI_type_node, V2SI_type_node,
23681                                     integer_type_node, NULL_TREE);
23682   def_builtin_const (OPTION_MASK_ISA_MMX, "__builtin_ia32_vec_ext_v2si", ftype, IX86_BUILTIN_VEC_EXT_V2SI);
23683
23684   ftype = build_function_type_list (intQI_type_node, V16QI_type_node,
23685                                     integer_type_node, NULL_TREE);
23686   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v16qi", ftype, IX86_BUILTIN_VEC_EXT_V16QI);
23687
23688   /* Access to the vec_set patterns.  */
23689   ftype = build_function_type_list (V2DI_type_node, V2DI_type_node,
23690                                     intDI_type_node,
23691                                     integer_type_node, NULL_TREE);
23692   def_builtin_const (OPTION_MASK_ISA_SSE4_1 | OPTION_MASK_ISA_64BIT, "__builtin_ia32_vec_set_v2di", ftype, IX86_BUILTIN_VEC_SET_V2DI);
23693
23694   ftype = build_function_type_list (V4SF_type_node, V4SF_type_node,
23695                                     float_type_node,
23696                                     integer_type_node, NULL_TREE);
23697   def_builtin_const (OPTION_MASK_ISA_SSE4_1, "__builtin_ia32_vec_set_v4sf", ftype, IX86_BUILTIN_VEC_SET_V4SF);
23698
23699   ftype = build_function_type_list (V4SI_type_node, V4SI_type_node,
23700                                     intSI_type_node,
23701                                     integer_type_node, NULL_TREE);
23702   def_builtin_const (OPTION_MASK_ISA_SSE4_1, "__builtin_ia32_vec_set_v4si", ftype, IX86_BUILTIN_VEC_SET_V4SI);
23703
23704   ftype = build_function_type_list (V8HI_type_node, V8HI_type_node,
23705                                     intHI_type_node,
23706                                     integer_type_node, NULL_TREE);
23707   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_set_v8hi", ftype, IX86_BUILTIN_VEC_SET_V8HI);
23708
23709   ftype = build_function_type_list (V4HI_type_node, V4HI_type_node,
23710                                     intHI_type_node,
23711                                     integer_type_node, NULL_TREE);
23712   def_builtin_const (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, "__builtin_ia32_vec_set_v4hi", ftype, IX86_BUILTIN_VEC_SET_V4HI);
23713
23714   ftype = build_function_type_list (V16QI_type_node, V16QI_type_node,
23715                                     intQI_type_node,
23716                                     integer_type_node, NULL_TREE);
23717   def_builtin_const (OPTION_MASK_ISA_SSE4_1, "__builtin_ia32_vec_set_v16qi", ftype, IX86_BUILTIN_VEC_SET_V16QI);
23718
23719   /* Add SSE5 multi-arg argument instructions */
23720   for (i = 0, d = bdesc_multi_arg; i < ARRAY_SIZE (bdesc_multi_arg); i++, d++)
23721     {
23722       tree mtype = NULL_TREE;
23723
23724       if (d->name == 0)
23725         continue;
23726
23727       switch ((enum multi_arg_type)d->flag)
23728         {
23729         case MULTI_ARG_3_SF:     mtype = v4sf_ftype_v4sf_v4sf_v4sf;     break;
23730         case MULTI_ARG_3_DF:     mtype = v2df_ftype_v2df_v2df_v2df;     break;
23731         case MULTI_ARG_3_DI:     mtype = v2di_ftype_v2di_v2di_v2di;     break;
23732         case MULTI_ARG_3_SI:     mtype = v4si_ftype_v4si_v4si_v4si;     break;
23733         case MULTI_ARG_3_SI_DI:  mtype = v4si_ftype_v4si_v4si_v2di;     break;
23734         case MULTI_ARG_3_HI:     mtype = v8hi_ftype_v8hi_v8hi_v8hi;     break;
23735         case MULTI_ARG_3_HI_SI:  mtype = v8hi_ftype_v8hi_v8hi_v4si;     break;
23736         case MULTI_ARG_3_QI:     mtype = v16qi_ftype_v16qi_v16qi_v16qi; break;
23737         case MULTI_ARG_3_PERMPS: mtype = v4sf_ftype_v4sf_v4sf_v16qi;    break;
23738         case MULTI_ARG_3_PERMPD: mtype = v2df_ftype_v2df_v2df_v16qi;    break;
23739         case MULTI_ARG_2_SF:     mtype = v4sf_ftype_v4sf_v4sf;          break;
23740         case MULTI_ARG_2_DF:     mtype = v2df_ftype_v2df_v2df;          break;
23741         case MULTI_ARG_2_DI:     mtype = v2di_ftype_v2di_v2di;          break;
23742         case MULTI_ARG_2_SI:     mtype = v4si_ftype_v4si_v4si;          break;
23743         case MULTI_ARG_2_HI:     mtype = v8hi_ftype_v8hi_v8hi;          break;
23744         case MULTI_ARG_2_QI:     mtype = v16qi_ftype_v16qi_v16qi;       break;
23745         case MULTI_ARG_2_DI_IMM: mtype = v2di_ftype_v2di_si;            break;
23746         case MULTI_ARG_2_SI_IMM: mtype = v4si_ftype_v4si_si;            break;
23747         case MULTI_ARG_2_HI_IMM: mtype = v8hi_ftype_v8hi_si;            break;
23748         case MULTI_ARG_2_QI_IMM: mtype = v16qi_ftype_v16qi_si;          break;
23749         case MULTI_ARG_2_SF_CMP: mtype = v4sf_ftype_v4sf_v4sf;          break;
23750         case MULTI_ARG_2_DF_CMP: mtype = v2df_ftype_v2df_v2df;          break;
23751         case MULTI_ARG_2_DI_CMP: mtype = v2di_ftype_v2di_v2di;          break;
23752         case MULTI_ARG_2_SI_CMP: mtype = v4si_ftype_v4si_v4si;          break;
23753         case MULTI_ARG_2_HI_CMP: mtype = v8hi_ftype_v8hi_v8hi;          break;
23754         case MULTI_ARG_2_QI_CMP: mtype = v16qi_ftype_v16qi_v16qi;       break;
23755         case MULTI_ARG_2_SF_TF:  mtype = v4sf_ftype_v4sf_v4sf;          break;
23756         case MULTI_ARG_2_DF_TF:  mtype = v2df_ftype_v2df_v2df;          break;
23757         case MULTI_ARG_2_DI_TF:  mtype = v2di_ftype_v2di_v2di;          break;
23758         case MULTI_ARG_2_SI_TF:  mtype = v4si_ftype_v4si_v4si;          break;
23759         case MULTI_ARG_2_HI_TF:  mtype = v8hi_ftype_v8hi_v8hi;          break;
23760         case MULTI_ARG_2_QI_TF:  mtype = v16qi_ftype_v16qi_v16qi;       break;
23761         case MULTI_ARG_1_SF:     mtype = v4sf_ftype_v4sf;               break;
23762         case MULTI_ARG_1_DF:     mtype = v2df_ftype_v2df;               break;
23763         case MULTI_ARG_1_DI:     mtype = v2di_ftype_v2di;               break;
23764         case MULTI_ARG_1_SI:     mtype = v4si_ftype_v4si;               break;
23765         case MULTI_ARG_1_HI:     mtype = v8hi_ftype_v8hi;               break;
23766         case MULTI_ARG_1_QI:     mtype = v16qi_ftype_v16qi;             break;
23767         case MULTI_ARG_1_SI_DI:  mtype = v2di_ftype_v4si;               break;
23768         case MULTI_ARG_1_HI_DI:  mtype = v2di_ftype_v8hi;               break;
23769         case MULTI_ARG_1_HI_SI:  mtype = v4si_ftype_v8hi;               break;
23770         case MULTI_ARG_1_QI_DI:  mtype = v2di_ftype_v16qi;              break;
23771         case MULTI_ARG_1_QI_SI:  mtype = v4si_ftype_v16qi;              break;
23772         case MULTI_ARG_1_QI_HI:  mtype = v8hi_ftype_v16qi;              break;
23773         case MULTI_ARG_1_PH2PS:  mtype = v4sf_ftype_v4hi;               break;
23774         case MULTI_ARG_1_PS2PH:  mtype = v4hi_ftype_v4sf;               break;
23775         case MULTI_ARG_UNKNOWN:
23776         default:
23777           gcc_unreachable ();
23778         }
23779
23780       if (mtype)
23781         def_builtin_const (d->mask, d->name, mtype, d->code);
23782     }
23783 }
23784
23785 /* Internal method for ix86_init_builtins.  */
23786
23787 static void
23788 ix86_init_builtins_va_builtins_abi (void)
23789 {
23790   tree ms_va_ref, sysv_va_ref;
23791   tree fnvoid_va_end_ms, fnvoid_va_end_sysv;
23792   tree fnvoid_va_start_ms, fnvoid_va_start_sysv;
23793   tree fnvoid_va_copy_ms, fnvoid_va_copy_sysv;
23794   tree fnattr_ms = NULL_TREE, fnattr_sysv = NULL_TREE;
23795
23796   if (!TARGET_64BIT)
23797     return;
23798   fnattr_ms = build_tree_list (get_identifier ("ms_abi"), NULL_TREE);
23799   fnattr_sysv = build_tree_list (get_identifier ("sysv_abi"), NULL_TREE);
23800   ms_va_ref = build_reference_type (ms_va_list_type_node);
23801   sysv_va_ref =
23802     build_pointer_type (TREE_TYPE (sysv_va_list_type_node));
23803
23804   fnvoid_va_end_ms =
23805     build_function_type_list (void_type_node, ms_va_ref, NULL_TREE);
23806   fnvoid_va_start_ms =
23807     build_varargs_function_type_list (void_type_node, ms_va_ref, NULL_TREE);
23808   fnvoid_va_end_sysv =
23809     build_function_type_list (void_type_node, sysv_va_ref, NULL_TREE);
23810   fnvoid_va_start_sysv =
23811     build_varargs_function_type_list (void_type_node, sysv_va_ref,
23812                                        NULL_TREE);
23813   fnvoid_va_copy_ms =
23814     build_function_type_list (void_type_node, ms_va_ref, ms_va_list_type_node,
23815                               NULL_TREE);
23816   fnvoid_va_copy_sysv =
23817     build_function_type_list (void_type_node, sysv_va_ref,
23818                               sysv_va_ref, NULL_TREE);
23819
23820   add_builtin_function ("__builtin_ms_va_start", fnvoid_va_start_ms,
23821                         BUILT_IN_VA_START, BUILT_IN_NORMAL, NULL, fnattr_ms);
23822   add_builtin_function ("__builtin_ms_va_end", fnvoid_va_end_ms,
23823                         BUILT_IN_VA_END, BUILT_IN_NORMAL, NULL, fnattr_ms);
23824   add_builtin_function ("__builtin_ms_va_copy", fnvoid_va_copy_ms,
23825                         BUILT_IN_VA_COPY, BUILT_IN_NORMAL, NULL, fnattr_ms);
23826   add_builtin_function ("__builtin_sysv_va_start", fnvoid_va_start_sysv,
23827                         BUILT_IN_VA_START, BUILT_IN_NORMAL, NULL, fnattr_sysv);
23828   add_builtin_function ("__builtin_sysv_va_end", fnvoid_va_end_sysv,
23829                         BUILT_IN_VA_END, BUILT_IN_NORMAL, NULL, fnattr_sysv);
23830   add_builtin_function ("__builtin_sysv_va_copy", fnvoid_va_copy_sysv,
23831                         BUILT_IN_VA_COPY, BUILT_IN_NORMAL, NULL, fnattr_sysv);
23832 }
23833
23834 static void
23835 ix86_init_builtins (void)
23836 {
23837   tree float128_type_node = make_node (REAL_TYPE);
23838   tree ftype, decl;
23839
23840   /* The __float80 type.  */
23841   if (TYPE_MODE (long_double_type_node) == XFmode)
23842     (*lang_hooks.types.register_builtin_type) (long_double_type_node,
23843                                                "__float80");
23844   else
23845     {
23846       /* The __float80 type.  */
23847       tree float80_type_node = make_node (REAL_TYPE);
23848
23849       TYPE_PRECISION (float80_type_node) = 80;
23850       layout_type (float80_type_node);
23851       (*lang_hooks.types.register_builtin_type) (float80_type_node,
23852                                                  "__float80");
23853     }
23854
23855   /* The __float128 type.  */
23856   TYPE_PRECISION (float128_type_node) = 128;
23857   layout_type (float128_type_node);
23858   (*lang_hooks.types.register_builtin_type) (float128_type_node,
23859                                              "__float128");
23860
23861   /* TFmode support builtins.  */
23862   ftype = build_function_type (float128_type_node, void_list_node);
23863   decl = add_builtin_function ("__builtin_infq", ftype,
23864                                IX86_BUILTIN_INFQ, BUILT_IN_MD,
23865                                NULL, NULL_TREE);
23866   ix86_builtins[(int) IX86_BUILTIN_INFQ] = decl;
23867
23868   decl = add_builtin_function ("__builtin_huge_valq", ftype,
23869                                IX86_BUILTIN_HUGE_VALQ, BUILT_IN_MD,
23870                                NULL, NULL_TREE);
23871   ix86_builtins[(int) IX86_BUILTIN_HUGE_VALQ] = decl;
23872
23873   /* We will expand them to normal call if SSE2 isn't available since
23874      they are used by libgcc. */
23875   ftype = build_function_type_list (float128_type_node,
23876                                     float128_type_node,
23877                                     NULL_TREE);
23878   decl = add_builtin_function ("__builtin_fabsq", ftype,
23879                                IX86_BUILTIN_FABSQ, BUILT_IN_MD,
23880                                "__fabstf2", NULL_TREE);
23881   ix86_builtins[(int) IX86_BUILTIN_FABSQ] = decl;
23882   TREE_READONLY (decl) = 1;
23883
23884   ftype = build_function_type_list (float128_type_node,
23885                                     float128_type_node,
23886                                     float128_type_node,
23887                                     NULL_TREE);
23888   decl = add_builtin_function ("__builtin_copysignq", ftype,
23889                                IX86_BUILTIN_COPYSIGNQ, BUILT_IN_MD,
23890                                "__copysigntf3", NULL_TREE);
23891   ix86_builtins[(int) IX86_BUILTIN_COPYSIGNQ] = decl;
23892   TREE_READONLY (decl) = 1;
23893
23894   ix86_init_mmx_sse_builtins ();
23895   if (TARGET_64BIT)
23896     ix86_init_builtins_va_builtins_abi ();
23897 }
23898
23899 /* Errors in the source file can cause expand_expr to return const0_rtx
23900    where we expect a vector.  To avoid crashing, use one of the vector
23901    clear instructions.  */
23902 static rtx
23903 safe_vector_operand (rtx x, enum machine_mode mode)
23904 {
23905   if (x == const0_rtx)
23906     x = CONST0_RTX (mode);
23907   return x;
23908 }
23909
23910 /* Subroutine of ix86_expand_builtin to take care of binop insns.  */
23911
23912 static rtx
23913 ix86_expand_binop_builtin (enum insn_code icode, tree exp, rtx target)
23914 {
23915   rtx pat;
23916   tree arg0 = CALL_EXPR_ARG (exp, 0);
23917   tree arg1 = CALL_EXPR_ARG (exp, 1);
23918   rtx op0 = expand_normal (arg0);
23919   rtx op1 = expand_normal (arg1);
23920   enum machine_mode tmode = insn_data[icode].operand[0].mode;
23921   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
23922   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
23923
23924   if (VECTOR_MODE_P (mode0))
23925     op0 = safe_vector_operand (op0, mode0);
23926   if (VECTOR_MODE_P (mode1))
23927     op1 = safe_vector_operand (op1, mode1);
23928
23929   if (optimize || !target
23930       || GET_MODE (target) != tmode
23931       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
23932     target = gen_reg_rtx (tmode);
23933
23934   if (GET_MODE (op1) == SImode && mode1 == TImode)
23935     {
23936       rtx x = gen_reg_rtx (V4SImode);
23937       emit_insn (gen_sse2_loadd (x, op1));
23938       op1 = gen_lowpart (TImode, x);
23939     }
23940
23941   if (!(*insn_data[icode].operand[1].predicate) (op0, mode0))
23942     op0 = copy_to_mode_reg (mode0, op0);
23943   if (!(*insn_data[icode].operand[2].predicate) (op1, mode1))
23944     op1 = copy_to_mode_reg (mode1, op1);
23945
23946   pat = GEN_FCN (icode) (target, op0, op1);
23947   if (! pat)
23948     return 0;
23949
23950   emit_insn (pat);
23951
23952   return target;
23953 }
23954
23955 /* Subroutine of ix86_expand_builtin to take care of 2-4 argument insns.  */
23956
23957 static rtx
23958 ix86_expand_multi_arg_builtin (enum insn_code icode, tree exp, rtx target,
23959                                enum multi_arg_type m_type,
23960                                enum rtx_code sub_code)
23961 {
23962   rtx pat;
23963   int i;
23964   int nargs;
23965   bool comparison_p = false;
23966   bool tf_p = false;
23967   bool last_arg_constant = false;
23968   int num_memory = 0;
23969   struct {
23970     rtx op;
23971     enum machine_mode mode;
23972   } args[4];
23973
23974   enum machine_mode tmode = insn_data[icode].operand[0].mode;
23975
23976   switch (m_type)
23977     {
23978     case MULTI_ARG_3_SF:
23979     case MULTI_ARG_3_DF:
23980     case MULTI_ARG_3_DI:
23981     case MULTI_ARG_3_SI:
23982     case MULTI_ARG_3_SI_DI:
23983     case MULTI_ARG_3_HI:
23984     case MULTI_ARG_3_HI_SI:
23985     case MULTI_ARG_3_QI:
23986     case MULTI_ARG_3_PERMPS:
23987     case MULTI_ARG_3_PERMPD:
23988       nargs = 3;
23989       break;
23990
23991     case MULTI_ARG_2_SF:
23992     case MULTI_ARG_2_DF:
23993     case MULTI_ARG_2_DI:
23994     case MULTI_ARG_2_SI:
23995     case MULTI_ARG_2_HI:
23996     case MULTI_ARG_2_QI:
23997       nargs = 2;
23998       break;
23999
24000     case MULTI_ARG_2_DI_IMM:
24001     case MULTI_ARG_2_SI_IMM:
24002     case MULTI_ARG_2_HI_IMM:
24003     case MULTI_ARG_2_QI_IMM:
24004       nargs = 2;
24005       last_arg_constant = true;
24006       break;
24007
24008     case MULTI_ARG_1_SF:
24009     case MULTI_ARG_1_DF:
24010     case MULTI_ARG_1_DI:
24011     case MULTI_ARG_1_SI:
24012     case MULTI_ARG_1_HI:
24013     case MULTI_ARG_1_QI:
24014     case MULTI_ARG_1_SI_DI:
24015     case MULTI_ARG_1_HI_DI:
24016     case MULTI_ARG_1_HI_SI:
24017     case MULTI_ARG_1_QI_DI:
24018     case MULTI_ARG_1_QI_SI:
24019     case MULTI_ARG_1_QI_HI:
24020     case MULTI_ARG_1_PH2PS:
24021     case MULTI_ARG_1_PS2PH:
24022       nargs = 1;
24023       break;
24024
24025     case MULTI_ARG_2_SF_CMP:
24026     case MULTI_ARG_2_DF_CMP:
24027     case MULTI_ARG_2_DI_CMP:
24028     case MULTI_ARG_2_SI_CMP:
24029     case MULTI_ARG_2_HI_CMP:
24030     case MULTI_ARG_2_QI_CMP:
24031       nargs = 2;
24032       comparison_p = true;
24033       break;
24034
24035     case MULTI_ARG_2_SF_TF:
24036     case MULTI_ARG_2_DF_TF:
24037     case MULTI_ARG_2_DI_TF:
24038     case MULTI_ARG_2_SI_TF:
24039     case MULTI_ARG_2_HI_TF:
24040     case MULTI_ARG_2_QI_TF:
24041       nargs = 2;
24042       tf_p = true;
24043       break;
24044
24045     case MULTI_ARG_UNKNOWN:
24046     default:
24047       gcc_unreachable ();
24048     }
24049
24050   if (optimize || !target
24051       || GET_MODE (target) != tmode
24052       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
24053     target = gen_reg_rtx (tmode);
24054
24055   gcc_assert (nargs <= 4);
24056
24057   for (i = 0; i < nargs; i++)
24058     {
24059       tree arg = CALL_EXPR_ARG (exp, i);
24060       rtx op = expand_normal (arg);
24061       int adjust = (comparison_p) ? 1 : 0;
24062       enum machine_mode mode = insn_data[icode].operand[i+adjust+1].mode;
24063
24064       if (last_arg_constant && i == nargs-1)
24065         {
24066           if (GET_CODE (op) != CONST_INT)
24067             {
24068               error ("last argument must be an immediate");
24069               return gen_reg_rtx (tmode);
24070             }
24071         }
24072       else
24073         {
24074           if (VECTOR_MODE_P (mode))
24075             op = safe_vector_operand (op, mode);
24076
24077           /* If we aren't optimizing, only allow one memory operand to be
24078              generated.  */
24079           if (memory_operand (op, mode))
24080             num_memory++;
24081
24082           gcc_assert (GET_MODE (op) == mode || GET_MODE (op) == VOIDmode);
24083
24084           if (optimize
24085               || ! (*insn_data[icode].operand[i+adjust+1].predicate) (op, mode)
24086               || num_memory > 1)
24087             op = force_reg (mode, op);
24088         }
24089
24090       args[i].op = op;
24091       args[i].mode = mode;
24092     }
24093
24094   switch (nargs)
24095     {
24096     case 1:
24097       pat = GEN_FCN (icode) (target, args[0].op);
24098       break;
24099
24100     case 2:
24101       if (tf_p)
24102         pat = GEN_FCN (icode) (target, args[0].op, args[1].op,
24103                                GEN_INT ((int)sub_code));
24104       else if (! comparison_p)
24105         pat = GEN_FCN (icode) (target, args[0].op, args[1].op);
24106       else
24107         {
24108           rtx cmp_op = gen_rtx_fmt_ee (sub_code, GET_MODE (target),
24109                                        args[0].op,
24110                                        args[1].op);
24111
24112           pat = GEN_FCN (icode) (target, cmp_op, args[0].op, args[1].op);
24113         }
24114       break;
24115
24116     case 3:
24117       pat = GEN_FCN (icode) (target, args[0].op, args[1].op, args[2].op);
24118       break;
24119
24120     default:
24121       gcc_unreachable ();
24122     }
24123
24124   if (! pat)
24125     return 0;
24126
24127   emit_insn (pat);
24128   return target;
24129 }
24130
24131 /* Subroutine of ix86_expand_args_builtin to take care of scalar unop
24132    insns with vec_merge.  */
24133
24134 static rtx
24135 ix86_expand_unop_vec_merge_builtin (enum insn_code icode, tree exp,
24136                                     rtx target)
24137 {
24138   rtx pat;
24139   tree arg0 = CALL_EXPR_ARG (exp, 0);
24140   rtx op1, op0 = expand_normal (arg0);
24141   enum machine_mode tmode = insn_data[icode].operand[0].mode;
24142   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
24143
24144   if (optimize || !target
24145       || GET_MODE (target) != tmode
24146       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
24147     target = gen_reg_rtx (tmode);
24148
24149   if (VECTOR_MODE_P (mode0))
24150     op0 = safe_vector_operand (op0, mode0);
24151
24152   if ((optimize && !register_operand (op0, mode0))
24153       || ! (*insn_data[icode].operand[1].predicate) (op0, mode0))
24154     op0 = copy_to_mode_reg (mode0, op0);
24155
24156   op1 = op0;
24157   if (! (*insn_data[icode].operand[2].predicate) (op1, mode0))
24158     op1 = copy_to_mode_reg (mode0, op1);
24159
24160   pat = GEN_FCN (icode) (target, op0, op1);
24161   if (! pat)
24162     return 0;
24163   emit_insn (pat);
24164   return target;
24165 }
24166
24167 /* Subroutine of ix86_expand_builtin to take care of comparison insns.  */
24168
24169 static rtx
24170 ix86_expand_sse_compare (const struct builtin_description *d,
24171                          tree exp, rtx target, bool swap)
24172 {
24173   rtx pat;
24174   tree arg0 = CALL_EXPR_ARG (exp, 0);
24175   tree arg1 = CALL_EXPR_ARG (exp, 1);
24176   rtx op0 = expand_normal (arg0);
24177   rtx op1 = expand_normal (arg1);
24178   rtx op2;
24179   enum machine_mode tmode = insn_data[d->icode].operand[0].mode;
24180   enum machine_mode mode0 = insn_data[d->icode].operand[1].mode;
24181   enum machine_mode mode1 = insn_data[d->icode].operand[2].mode;
24182   enum rtx_code comparison = d->comparison;
24183
24184   if (VECTOR_MODE_P (mode0))
24185     op0 = safe_vector_operand (op0, mode0);
24186   if (VECTOR_MODE_P (mode1))
24187     op1 = safe_vector_operand (op1, mode1);
24188
24189   /* Swap operands if we have a comparison that isn't available in
24190      hardware.  */
24191   if (swap)
24192     {
24193       rtx tmp = gen_reg_rtx (mode1);
24194       emit_move_insn (tmp, op1);
24195       op1 = op0;
24196       op0 = tmp;
24197     }
24198
24199   if (optimize || !target
24200       || GET_MODE (target) != tmode
24201       || ! (*insn_data[d->icode].operand[0].predicate) (target, tmode))
24202     target = gen_reg_rtx (tmode);
24203
24204   if ((optimize && !register_operand (op0, mode0))
24205       || ! (*insn_data[d->icode].operand[1].predicate) (op0, mode0))
24206     op0 = copy_to_mode_reg (mode0, op0);
24207   if ((optimize && !register_operand (op1, mode1))
24208       || ! (*insn_data[d->icode].operand[2].predicate) (op1, mode1))
24209     op1 = copy_to_mode_reg (mode1, op1);
24210
24211   op2 = gen_rtx_fmt_ee (comparison, mode0, op0, op1);
24212   pat = GEN_FCN (d->icode) (target, op0, op1, op2);
24213   if (! pat)
24214     return 0;
24215   emit_insn (pat);
24216   return target;
24217 }
24218
24219 /* Subroutine of ix86_expand_builtin to take care of comi insns.  */
24220
24221 static rtx
24222 ix86_expand_sse_comi (const struct builtin_description *d, tree exp,
24223                       rtx target)
24224 {
24225   rtx pat;
24226   tree arg0 = CALL_EXPR_ARG (exp, 0);
24227   tree arg1 = CALL_EXPR_ARG (exp, 1);
24228   rtx op0 = expand_normal (arg0);
24229   rtx op1 = expand_normal (arg1);
24230   enum machine_mode mode0 = insn_data[d->icode].operand[0].mode;
24231   enum machine_mode mode1 = insn_data[d->icode].operand[1].mode;
24232   enum rtx_code comparison = d->comparison;
24233
24234   if (VECTOR_MODE_P (mode0))
24235     op0 = safe_vector_operand (op0, mode0);
24236   if (VECTOR_MODE_P (mode1))
24237     op1 = safe_vector_operand (op1, mode1);
24238
24239   /* Swap operands if we have a comparison that isn't available in
24240      hardware.  */
24241   if (d->flag & BUILTIN_DESC_SWAP_OPERANDS)
24242     {
24243       rtx tmp = op1;
24244       op1 = op0;
24245       op0 = tmp;
24246     }
24247
24248   target = gen_reg_rtx (SImode);
24249   emit_move_insn (target, const0_rtx);
24250   target = gen_rtx_SUBREG (QImode, target, 0);
24251
24252   if ((optimize && !register_operand (op0, mode0))
24253       || !(*insn_data[d->icode].operand[0].predicate) (op0, mode0))
24254     op0 = copy_to_mode_reg (mode0, op0);
24255   if ((optimize && !register_operand (op1, mode1))
24256       || !(*insn_data[d->icode].operand[1].predicate) (op1, mode1))
24257     op1 = copy_to_mode_reg (mode1, op1);
24258
24259   pat = GEN_FCN (d->icode) (op0, op1);
24260   if (! pat)
24261     return 0;
24262   emit_insn (pat);
24263   emit_insn (gen_rtx_SET (VOIDmode,
24264                           gen_rtx_STRICT_LOW_PART (VOIDmode, target),
24265                           gen_rtx_fmt_ee (comparison, QImode,
24266                                           SET_DEST (pat),
24267                                           const0_rtx)));
24268
24269   return SUBREG_REG (target);
24270 }
24271
24272 /* Subroutine of ix86_expand_builtin to take care of ptest insns.  */
24273
24274 static rtx
24275 ix86_expand_sse_ptest (const struct builtin_description *d, tree exp,
24276                        rtx target)
24277 {
24278   rtx pat;
24279   tree arg0 = CALL_EXPR_ARG (exp, 0);
24280   tree arg1 = CALL_EXPR_ARG (exp, 1);
24281   rtx op0 = expand_normal (arg0);
24282   rtx op1 = expand_normal (arg1);
24283   enum machine_mode mode0 = insn_data[d->icode].operand[0].mode;
24284   enum machine_mode mode1 = insn_data[d->icode].operand[1].mode;
24285   enum rtx_code comparison = d->comparison;
24286
24287   if (VECTOR_MODE_P (mode0))
24288     op0 = safe_vector_operand (op0, mode0);
24289   if (VECTOR_MODE_P (mode1))
24290     op1 = safe_vector_operand (op1, mode1);
24291
24292   target = gen_reg_rtx (SImode);
24293   emit_move_insn (target, const0_rtx);
24294   target = gen_rtx_SUBREG (QImode, target, 0);
24295
24296   if ((optimize && !register_operand (op0, mode0))
24297       || !(*insn_data[d->icode].operand[0].predicate) (op0, mode0))
24298     op0 = copy_to_mode_reg (mode0, op0);
24299   if ((optimize && !register_operand (op1, mode1))
24300       || !(*insn_data[d->icode].operand[1].predicate) (op1, mode1))
24301     op1 = copy_to_mode_reg (mode1, op1);
24302
24303   pat = GEN_FCN (d->icode) (op0, op1);
24304   if (! pat)
24305     return 0;
24306   emit_insn (pat);
24307   emit_insn (gen_rtx_SET (VOIDmode,
24308                           gen_rtx_STRICT_LOW_PART (VOIDmode, target),
24309                           gen_rtx_fmt_ee (comparison, QImode,
24310                                           SET_DEST (pat),
24311                                           const0_rtx)));
24312
24313   return SUBREG_REG (target);
24314 }
24315
24316 /* Subroutine of ix86_expand_builtin to take care of pcmpestr[im] insns.  */
24317
24318 static rtx
24319 ix86_expand_sse_pcmpestr (const struct builtin_description *d,
24320                           tree exp, rtx target)
24321 {
24322   rtx pat;
24323   tree arg0 = CALL_EXPR_ARG (exp, 0);
24324   tree arg1 = CALL_EXPR_ARG (exp, 1);
24325   tree arg2 = CALL_EXPR_ARG (exp, 2);
24326   tree arg3 = CALL_EXPR_ARG (exp, 3);
24327   tree arg4 = CALL_EXPR_ARG (exp, 4);
24328   rtx scratch0, scratch1;
24329   rtx op0 = expand_normal (arg0);
24330   rtx op1 = expand_normal (arg1);
24331   rtx op2 = expand_normal (arg2);
24332   rtx op3 = expand_normal (arg3);
24333   rtx op4 = expand_normal (arg4);
24334   enum machine_mode tmode0, tmode1, modev2, modei3, modev4, modei5, modeimm;
24335
24336   tmode0 = insn_data[d->icode].operand[0].mode;
24337   tmode1 = insn_data[d->icode].operand[1].mode;
24338   modev2 = insn_data[d->icode].operand[2].mode;
24339   modei3 = insn_data[d->icode].operand[3].mode;
24340   modev4 = insn_data[d->icode].operand[4].mode;
24341   modei5 = insn_data[d->icode].operand[5].mode;
24342   modeimm = insn_data[d->icode].operand[6].mode;
24343
24344   if (VECTOR_MODE_P (modev2))
24345     op0 = safe_vector_operand (op0, modev2);
24346   if (VECTOR_MODE_P (modev4))
24347     op2 = safe_vector_operand (op2, modev4);
24348
24349   if (! (*insn_data[d->icode].operand[2].predicate) (op0, modev2))
24350     op0 = copy_to_mode_reg (modev2, op0);
24351   if (! (*insn_data[d->icode].operand[3].predicate) (op1, modei3))
24352     op1 = copy_to_mode_reg (modei3, op1);
24353   if ((optimize && !register_operand (op2, modev4))
24354       || !(*insn_data[d->icode].operand[4].predicate) (op2, modev4))
24355     op2 = copy_to_mode_reg (modev4, op2);
24356   if (! (*insn_data[d->icode].operand[5].predicate) (op3, modei5))
24357     op3 = copy_to_mode_reg (modei5, op3);
24358
24359   if (! (*insn_data[d->icode].operand[6].predicate) (op4, modeimm))
24360     {
24361       error ("the fifth argument must be a 8-bit immediate");
24362       return const0_rtx;
24363     }
24364
24365   if (d->code == IX86_BUILTIN_PCMPESTRI128)
24366     {
24367       if (optimize || !target
24368           || GET_MODE (target) != tmode0
24369           || ! (*insn_data[d->icode].operand[0].predicate) (target, tmode0))
24370         target = gen_reg_rtx (tmode0);
24371
24372       scratch1 = gen_reg_rtx (tmode1);
24373
24374       pat = GEN_FCN (d->icode) (target, scratch1, op0, op1, op2, op3, op4);
24375     }
24376   else if (d->code == IX86_BUILTIN_PCMPESTRM128)
24377     {
24378       if (optimize || !target
24379           || GET_MODE (target) != tmode1
24380           || ! (*insn_data[d->icode].operand[1].predicate) (target, tmode1))
24381         target = gen_reg_rtx (tmode1);
24382
24383       scratch0 = gen_reg_rtx (tmode0);
24384
24385       pat = GEN_FCN (d->icode) (scratch0, target, op0, op1, op2, op3, op4);
24386     }
24387   else
24388     {
24389       gcc_assert (d->flag);
24390
24391       scratch0 = gen_reg_rtx (tmode0);
24392       scratch1 = gen_reg_rtx (tmode1);
24393
24394       pat = GEN_FCN (d->icode) (scratch0, scratch1, op0, op1, op2, op3, op4);
24395     }
24396
24397   if (! pat)
24398     return 0;
24399
24400   emit_insn (pat);
24401
24402   if (d->flag)
24403     {
24404       target = gen_reg_rtx (SImode);
24405       emit_move_insn (target, const0_rtx);
24406       target = gen_rtx_SUBREG (QImode, target, 0);
24407
24408       emit_insn
24409         (gen_rtx_SET (VOIDmode, gen_rtx_STRICT_LOW_PART (VOIDmode, target),
24410                       gen_rtx_fmt_ee (EQ, QImode,
24411                                       gen_rtx_REG ((enum machine_mode) d->flag,
24412                                                    FLAGS_REG),
24413                                       const0_rtx)));
24414       return SUBREG_REG (target);
24415     }
24416   else
24417     return target;
24418 }
24419
24420
24421 /* Subroutine of ix86_expand_builtin to take care of pcmpistr[im] insns.  */
24422
24423 static rtx
24424 ix86_expand_sse_pcmpistr (const struct builtin_description *d,
24425                           tree exp, rtx target)
24426 {
24427   rtx pat;
24428   tree arg0 = CALL_EXPR_ARG (exp, 0);
24429   tree arg1 = CALL_EXPR_ARG (exp, 1);
24430   tree arg2 = CALL_EXPR_ARG (exp, 2);
24431   rtx scratch0, scratch1;
24432   rtx op0 = expand_normal (arg0);
24433   rtx op1 = expand_normal (arg1);
24434   rtx op2 = expand_normal (arg2);
24435   enum machine_mode tmode0, tmode1, modev2, modev3, modeimm;
24436
24437   tmode0 = insn_data[d->icode].operand[0].mode;
24438   tmode1 = insn_data[d->icode].operand[1].mode;
24439   modev2 = insn_data[d->icode].operand[2].mode;
24440   modev3 = insn_data[d->icode].operand[3].mode;
24441   modeimm = insn_data[d->icode].operand[4].mode;
24442
24443   if (VECTOR_MODE_P (modev2))
24444     op0 = safe_vector_operand (op0, modev2);
24445   if (VECTOR_MODE_P (modev3))
24446     op1 = safe_vector_operand (op1, modev3);
24447
24448   if (! (*insn_data[d->icode].operand[2].predicate) (op0, modev2))
24449     op0 = copy_to_mode_reg (modev2, op0);
24450   if ((optimize && !register_operand (op1, modev3))
24451       || !(*insn_data[d->icode].operand[3].predicate) (op1, modev3))
24452     op1 = copy_to_mode_reg (modev3, op1);
24453
24454   if (! (*insn_data[d->icode].operand[4].predicate) (op2, modeimm))
24455     {
24456       error ("the third argument must be a 8-bit immediate");
24457       return const0_rtx;
24458     }
24459
24460   if (d->code == IX86_BUILTIN_PCMPISTRI128)
24461     {
24462       if (optimize || !target
24463           || GET_MODE (target) != tmode0
24464           || ! (*insn_data[d->icode].operand[0].predicate) (target, tmode0))
24465         target = gen_reg_rtx (tmode0);
24466
24467       scratch1 = gen_reg_rtx (tmode1);
24468
24469       pat = GEN_FCN (d->icode) (target, scratch1, op0, op1, op2);
24470     }
24471   else if (d->code == IX86_BUILTIN_PCMPISTRM128)
24472     {
24473       if (optimize || !target
24474           || GET_MODE (target) != tmode1
24475           || ! (*insn_data[d->icode].operand[1].predicate) (target, tmode1))
24476         target = gen_reg_rtx (tmode1);
24477
24478       scratch0 = gen_reg_rtx (tmode0);
24479
24480       pat = GEN_FCN (d->icode) (scratch0, target, op0, op1, op2);
24481     }
24482   else
24483     {
24484       gcc_assert (d->flag);
24485
24486       scratch0 = gen_reg_rtx (tmode0);
24487       scratch1 = gen_reg_rtx (tmode1);
24488
24489       pat = GEN_FCN (d->icode) (scratch0, scratch1, op0, op1, op2);
24490     }
24491
24492   if (! pat)
24493     return 0;
24494
24495   emit_insn (pat);
24496
24497   if (d->flag)
24498     {
24499       target = gen_reg_rtx (SImode);
24500       emit_move_insn (target, const0_rtx);
24501       target = gen_rtx_SUBREG (QImode, target, 0);
24502
24503       emit_insn
24504         (gen_rtx_SET (VOIDmode, gen_rtx_STRICT_LOW_PART (VOIDmode, target),
24505                       gen_rtx_fmt_ee (EQ, QImode,
24506                                       gen_rtx_REG ((enum machine_mode) d->flag,
24507                                                    FLAGS_REG),
24508                                       const0_rtx)));
24509       return SUBREG_REG (target);
24510     }
24511   else
24512     return target;
24513 }
24514
24515 /* Subroutine of ix86_expand_builtin to take care of insns with
24516    variable number of operands.  */
24517
24518 static rtx
24519 ix86_expand_args_builtin (const struct builtin_description *d,
24520                           tree exp, rtx target)
24521 {
24522   rtx pat, real_target;
24523   unsigned int i, nargs;
24524   unsigned int nargs_constant = 0;
24525   int num_memory = 0;
24526   struct
24527     {
24528       rtx op;
24529       enum machine_mode mode;
24530     } args[4];
24531   bool last_arg_count = false;
24532   enum insn_code icode = d->icode;
24533   const struct insn_data *insn_p = &insn_data[icode];
24534   enum machine_mode tmode = insn_p->operand[0].mode;
24535   enum machine_mode rmode = VOIDmode;
24536   bool swap = false;
24537   enum rtx_code comparison = d->comparison;
24538
24539   switch ((enum ix86_builtin_type) d->flag)
24540     {
24541     case INT_FTYPE_V8SF_V8SF_PTEST:
24542     case INT_FTYPE_V4DI_V4DI_PTEST:
24543     case INT_FTYPE_V4DF_V4DF_PTEST:
24544     case INT_FTYPE_V4SF_V4SF_PTEST:
24545     case INT_FTYPE_V2DI_V2DI_PTEST:
24546     case INT_FTYPE_V2DF_V2DF_PTEST:
24547       return ix86_expand_sse_ptest (d, exp, target);
24548     case FLOAT128_FTYPE_FLOAT128:
24549     case FLOAT_FTYPE_FLOAT:
24550     case INT64_FTYPE_V4SF:
24551     case INT64_FTYPE_V2DF:
24552     case INT_FTYPE_V16QI:
24553     case INT_FTYPE_V8QI:
24554     case INT_FTYPE_V8SF:
24555     case INT_FTYPE_V4DF:
24556     case INT_FTYPE_V4SF:
24557     case INT_FTYPE_V2DF:
24558     case V16QI_FTYPE_V16QI:
24559     case V8SI_FTYPE_V8SF:
24560     case V8SI_FTYPE_V4SI:
24561     case V8HI_FTYPE_V8HI:
24562     case V8HI_FTYPE_V16QI:
24563     case V8QI_FTYPE_V8QI:
24564     case V8SF_FTYPE_V8SF:
24565     case V8SF_FTYPE_V8SI:
24566     case V8SF_FTYPE_V4SF:
24567     case V4SI_FTYPE_V4SI:
24568     case V4SI_FTYPE_V16QI:
24569     case V4SI_FTYPE_V4SF:
24570     case V4SI_FTYPE_V8SI:
24571     case V4SI_FTYPE_V8HI:
24572     case V4SI_FTYPE_V4DF:
24573     case V4SI_FTYPE_V2DF:
24574     case V4HI_FTYPE_V4HI:
24575     case V4DF_FTYPE_V4DF:
24576     case V4DF_FTYPE_V4SI:
24577     case V4DF_FTYPE_V4SF:
24578     case V4DF_FTYPE_V2DF:
24579     case V4SF_FTYPE_V4SF:
24580     case V4SF_FTYPE_V4SI:
24581     case V4SF_FTYPE_V8SF:
24582     case V4SF_FTYPE_V4DF:
24583     case V4SF_FTYPE_V2DF:
24584     case V2DI_FTYPE_V2DI:
24585     case V2DI_FTYPE_V16QI:
24586     case V2DI_FTYPE_V8HI:
24587     case V2DI_FTYPE_V4SI:
24588     case V2DF_FTYPE_V2DF:
24589     case V2DF_FTYPE_V4SI:
24590     case V2DF_FTYPE_V4DF:
24591     case V2DF_FTYPE_V4SF:
24592     case V2DF_FTYPE_V2SI:
24593     case V2SI_FTYPE_V2SI:
24594     case V2SI_FTYPE_V4SF:
24595     case V2SI_FTYPE_V2SF:
24596     case V2SI_FTYPE_V2DF:
24597     case V2SF_FTYPE_V2SF:
24598     case V2SF_FTYPE_V2SI:
24599       nargs = 1;
24600       break;
24601     case V4SF_FTYPE_V4SF_VEC_MERGE:
24602     case V2DF_FTYPE_V2DF_VEC_MERGE:
24603       return ix86_expand_unop_vec_merge_builtin (icode, exp, target);
24604     case FLOAT128_FTYPE_FLOAT128_FLOAT128:
24605     case V16QI_FTYPE_V16QI_V16QI:
24606     case V16QI_FTYPE_V8HI_V8HI:
24607     case V8QI_FTYPE_V8QI_V8QI:
24608     case V8QI_FTYPE_V4HI_V4HI:
24609     case V8HI_FTYPE_V8HI_V8HI:
24610     case V8HI_FTYPE_V16QI_V16QI:
24611     case V8HI_FTYPE_V4SI_V4SI:
24612     case V8SF_FTYPE_V8SF_V8SF:
24613     case V8SF_FTYPE_V8SF_V8SI:
24614     case V4SI_FTYPE_V4SI_V4SI:
24615     case V4SI_FTYPE_V8HI_V8HI:
24616     case V4SI_FTYPE_V4SF_V4SF:
24617     case V4SI_FTYPE_V2DF_V2DF:
24618     case V4HI_FTYPE_V4HI_V4HI:
24619     case V4HI_FTYPE_V8QI_V8QI:
24620     case V4HI_FTYPE_V2SI_V2SI:
24621     case V4DF_FTYPE_V4DF_V4DF:
24622     case V4DF_FTYPE_V4DF_V4DI:
24623     case V4SF_FTYPE_V4SF_V4SF:
24624     case V4SF_FTYPE_V4SF_V4SI:
24625     case V4SF_FTYPE_V4SF_V2SI:
24626     case V4SF_FTYPE_V4SF_V2DF:
24627     case V4SF_FTYPE_V4SF_DI:
24628     case V4SF_FTYPE_V4SF_SI:
24629     case V2DI_FTYPE_V2DI_V2DI:
24630     case V2DI_FTYPE_V16QI_V16QI:
24631     case V2DI_FTYPE_V4SI_V4SI:
24632     case V2DI_FTYPE_V2DI_V16QI:
24633     case V2DI_FTYPE_V2DF_V2DF:
24634     case V2SI_FTYPE_V2SI_V2SI:
24635     case V2SI_FTYPE_V4HI_V4HI:
24636     case V2SI_FTYPE_V2SF_V2SF:
24637     case V2DF_FTYPE_V2DF_V2DF:
24638     case V2DF_FTYPE_V2DF_V4SF:
24639     case V2DF_FTYPE_V2DF_V2DI:
24640     case V2DF_FTYPE_V2DF_DI:
24641     case V2DF_FTYPE_V2DF_SI:
24642     case V2SF_FTYPE_V2SF_V2SF:
24643     case V1DI_FTYPE_V1DI_V1DI:
24644     case V1DI_FTYPE_V8QI_V8QI:
24645     case V1DI_FTYPE_V2SI_V2SI:
24646       if (comparison == UNKNOWN)
24647         return ix86_expand_binop_builtin (icode, exp, target);
24648       nargs = 2;
24649       break;
24650     case V4SF_FTYPE_V4SF_V4SF_SWAP:
24651     case V2DF_FTYPE_V2DF_V2DF_SWAP:
24652       gcc_assert (comparison != UNKNOWN);
24653       nargs = 2;
24654       swap = true;
24655       break;
24656     case V8HI_FTYPE_V8HI_V8HI_COUNT:
24657     case V8HI_FTYPE_V8HI_SI_COUNT:
24658     case V4SI_FTYPE_V4SI_V4SI_COUNT:
24659     case V4SI_FTYPE_V4SI_SI_COUNT:
24660     case V4HI_FTYPE_V4HI_V4HI_COUNT:
24661     case V4HI_FTYPE_V4HI_SI_COUNT:
24662     case V2DI_FTYPE_V2DI_V2DI_COUNT:
24663     case V2DI_FTYPE_V2DI_SI_COUNT:
24664     case V2SI_FTYPE_V2SI_V2SI_COUNT:
24665     case V2SI_FTYPE_V2SI_SI_COUNT:
24666     case V1DI_FTYPE_V1DI_V1DI_COUNT:
24667     case V1DI_FTYPE_V1DI_SI_COUNT:
24668       nargs = 2;
24669       last_arg_count = true;
24670       break;
24671     case UINT64_FTYPE_UINT64_UINT64:
24672     case UINT_FTYPE_UINT_UINT:
24673     case UINT_FTYPE_UINT_USHORT:
24674     case UINT_FTYPE_UINT_UCHAR:
24675       nargs = 2;
24676       break;
24677     case V2DI2TI_FTYPE_V2DI_INT:
24678       nargs = 2;
24679       rmode = V2DImode;
24680       nargs_constant = 1;
24681       break;
24682     case V8HI_FTYPE_V8HI_INT:
24683     case V8SF_FTYPE_V8SF_INT:
24684     case V4SI_FTYPE_V4SI_INT:
24685     case V4SI_FTYPE_V8SI_INT:
24686     case V4HI_FTYPE_V4HI_INT:
24687     case V4DF_FTYPE_V4DF_INT:
24688     case V4SF_FTYPE_V4SF_INT:
24689     case V4SF_FTYPE_V8SF_INT:
24690     case V2DI_FTYPE_V2DI_INT:
24691     case V2DF_FTYPE_V2DF_INT:
24692     case V2DF_FTYPE_V4DF_INT:
24693       nargs = 2;
24694       nargs_constant = 1;
24695       break;
24696     case V16QI_FTYPE_V16QI_V16QI_V16QI:
24697     case V8SF_FTYPE_V8SF_V8SF_V8SF:
24698     case V4DF_FTYPE_V4DF_V4DF_V4DF:
24699     case V4SF_FTYPE_V4SF_V4SF_V4SF:
24700     case V2DF_FTYPE_V2DF_V2DF_V2DF:
24701       nargs = 3;
24702       break;
24703     case V16QI_FTYPE_V16QI_V16QI_INT:
24704     case V8HI_FTYPE_V8HI_V8HI_INT:
24705     case V8SI_FTYPE_V8SI_V8SI_INT:
24706     case V8SI_FTYPE_V8SI_V4SI_INT:
24707     case V8SF_FTYPE_V8SF_V8SF_INT: 
24708     case V8SF_FTYPE_V8SF_V4SF_INT: 
24709     case V4SI_FTYPE_V4SI_V4SI_INT:
24710     case V4DF_FTYPE_V4DF_V4DF_INT:
24711     case V4DF_FTYPE_V4DF_V2DF_INT:
24712     case V4SF_FTYPE_V4SF_V4SF_INT:
24713     case V2DI_FTYPE_V2DI_V2DI_INT:
24714     case V2DF_FTYPE_V2DF_V2DF_INT:
24715       nargs = 3;
24716       nargs_constant = 1;
24717       break;
24718     case V2DI2TI_FTYPE_V2DI_V2DI_INT:
24719       nargs = 3;
24720       rmode = V2DImode;
24721       nargs_constant = 1;
24722       break;
24723     case V1DI2DI_FTYPE_V1DI_V1DI_INT:
24724       nargs = 3;
24725       rmode = DImode;
24726       nargs_constant = 1;
24727       break;
24728     case V2DI_FTYPE_V2DI_UINT_UINT:
24729       nargs = 3;
24730       nargs_constant = 2;
24731       break;
24732     case V2DI_FTYPE_V2DI_V2DI_UINT_UINT:
24733       nargs = 4;
24734       nargs_constant = 2;
24735       break;
24736     default:
24737       gcc_unreachable ();
24738     }
24739
24740   gcc_assert (nargs <= ARRAY_SIZE (args));
24741
24742   if (comparison != UNKNOWN)
24743     {
24744       gcc_assert (nargs == 2);
24745       return ix86_expand_sse_compare (d, exp, target, swap);
24746     }
24747
24748   if (rmode == VOIDmode || rmode == tmode)
24749     {
24750       if (optimize
24751           || target == 0
24752           || GET_MODE (target) != tmode
24753           || ! (*insn_p->operand[0].predicate) (target, tmode))
24754         target = gen_reg_rtx (tmode);
24755       real_target = target;
24756     }
24757   else
24758     {
24759       target = gen_reg_rtx (rmode);
24760       real_target = simplify_gen_subreg (tmode, target, rmode, 0);
24761     }
24762
24763   for (i = 0; i < nargs; i++)
24764     {
24765       tree arg = CALL_EXPR_ARG (exp, i);
24766       rtx op = expand_normal (arg);
24767       enum machine_mode mode = insn_p->operand[i + 1].mode;
24768       bool match = (*insn_p->operand[i + 1].predicate) (op, mode);
24769
24770       if (last_arg_count && (i + 1) == nargs)
24771         {
24772           /* SIMD shift insns take either an 8-bit immediate or
24773              register as count.  But builtin functions take int as
24774              count.  If count doesn't match, we put it in register.  */
24775           if (!match)
24776             {
24777               op = simplify_gen_subreg (SImode, op, GET_MODE (op), 0);
24778               if (!(*insn_p->operand[i + 1].predicate) (op, mode))
24779                 op = copy_to_reg (op);
24780             }
24781         }
24782       else if ((nargs - i) <= nargs_constant)
24783         {
24784           if (!match)
24785             switch (icode)
24786               {
24787               case CODE_FOR_sse4_1_roundpd:
24788               case CODE_FOR_sse4_1_roundps:
24789               case CODE_FOR_sse4_1_roundsd:
24790               case CODE_FOR_sse4_1_roundss:
24791               case CODE_FOR_sse4_1_blendps:
24792               case CODE_FOR_avx_blendpd256:
24793               case CODE_FOR_avx_vpermilv4df:
24794               case CODE_FOR_avx_roundpd256:
24795               case CODE_FOR_avx_roundps256:
24796                 error ("the last argument must be a 4-bit immediate");
24797                 return const0_rtx;
24798
24799               case CODE_FOR_sse4_1_blendpd:
24800               case CODE_FOR_avx_vpermilv2df:
24801                 error ("the last argument must be a 2-bit immediate");
24802                 return const0_rtx;
24803
24804               case CODE_FOR_avx_vextractf128v4df:
24805               case CODE_FOR_avx_vextractf128v8sf:
24806               case CODE_FOR_avx_vextractf128v8si:
24807               case CODE_FOR_avx_vinsertf128v4df:
24808               case CODE_FOR_avx_vinsertf128v8sf:
24809               case CODE_FOR_avx_vinsertf128v8si:
24810                 error ("the last argument must be a 1-bit immediate");
24811                 return const0_rtx;
24812
24813               case CODE_FOR_avx_cmpsdv2df3:
24814               case CODE_FOR_avx_cmpssv4sf3:
24815               case CODE_FOR_avx_cmppdv2df3:
24816               case CODE_FOR_avx_cmppsv4sf3:
24817               case CODE_FOR_avx_cmppdv4df3:
24818               case CODE_FOR_avx_cmppsv8sf3:
24819                 error ("the last argument must be a 5-bit immediate");
24820                 return const0_rtx;
24821
24822              default:
24823                 switch (nargs_constant)
24824                   {
24825                   case 2:
24826                     if ((nargs - i) == nargs_constant)
24827                       {
24828                         error ("the next to last argument must be an 8-bit immediate");
24829                         break;
24830                       }
24831                   case 1:
24832                     error ("the last argument must be an 8-bit immediate");
24833                     break;
24834                   default:
24835                     gcc_unreachable ();
24836                   }
24837                 return const0_rtx;
24838               }
24839         }
24840       else
24841         {
24842           if (VECTOR_MODE_P (mode))
24843             op = safe_vector_operand (op, mode);
24844
24845           /* If we aren't optimizing, only allow one memory operand to
24846              be generated.  */
24847           if (memory_operand (op, mode))
24848             num_memory++;
24849
24850           if (GET_MODE (op) == mode || GET_MODE (op) == VOIDmode)
24851             {
24852               if (optimize || !match || num_memory > 1)
24853                 op = copy_to_mode_reg (mode, op);
24854             }
24855           else
24856             {
24857               op = copy_to_reg (op);
24858               op = simplify_gen_subreg (mode, op, GET_MODE (op), 0);
24859             }
24860         }
24861
24862       args[i].op = op;
24863       args[i].mode = mode;
24864     }
24865
24866   switch (nargs)
24867     {
24868     case 1:
24869       pat = GEN_FCN (icode) (real_target, args[0].op);
24870       break;
24871     case 2:
24872       pat = GEN_FCN (icode) (real_target, args[0].op, args[1].op);
24873       break;
24874     case 3:
24875       pat = GEN_FCN (icode) (real_target, args[0].op, args[1].op,
24876                              args[2].op);
24877       break;
24878     case 4:
24879       pat = GEN_FCN (icode) (real_target, args[0].op, args[1].op,
24880                              args[2].op, args[3].op);
24881       break;
24882     default:
24883       gcc_unreachable ();
24884     }
24885
24886   if (! pat)
24887     return 0;
24888
24889   emit_insn (pat);
24890   return target;
24891 }
24892
24893 /* Subroutine of ix86_expand_builtin to take care of special insns
24894    with variable number of operands.  */
24895
24896 static rtx
24897 ix86_expand_special_args_builtin (const struct builtin_description *d,
24898                                     tree exp, rtx target)
24899 {
24900   tree arg;
24901   rtx pat, op;
24902   unsigned int i, nargs, arg_adjust, memory;
24903   struct
24904     {
24905       rtx op;
24906       enum machine_mode mode;
24907     } args[2];
24908   enum insn_code icode = d->icode;
24909   bool last_arg_constant = false;
24910   const struct insn_data *insn_p = &insn_data[icode];
24911   enum machine_mode tmode = insn_p->operand[0].mode;
24912   enum { load, store } klass;
24913
24914   switch ((enum ix86_special_builtin_type) d->flag)
24915     {
24916     case VOID_FTYPE_VOID:
24917       emit_insn (GEN_FCN (icode) (target));
24918       return 0;
24919     case V2DI_FTYPE_PV2DI:
24920     case V32QI_FTYPE_PCCHAR:
24921     case V16QI_FTYPE_PCCHAR:
24922     case V8SF_FTYPE_PCV4SF:
24923     case V8SF_FTYPE_PCFLOAT:
24924     case V4SF_FTYPE_PCFLOAT:
24925     case V4DF_FTYPE_PCV2DF:
24926     case V4DF_FTYPE_PCDOUBLE:
24927     case V2DF_FTYPE_PCDOUBLE:
24928       nargs = 1;
24929       klass = load;
24930       memory = 0;
24931       break;
24932     case VOID_FTYPE_PV2SF_V4SF:
24933     case VOID_FTYPE_PV4DI_V4DI:
24934     case VOID_FTYPE_PV2DI_V2DI:
24935     case VOID_FTYPE_PCHAR_V32QI:
24936     case VOID_FTYPE_PCHAR_V16QI:
24937     case VOID_FTYPE_PFLOAT_V8SF:
24938     case VOID_FTYPE_PFLOAT_V4SF:
24939     case VOID_FTYPE_PDOUBLE_V4DF:
24940     case VOID_FTYPE_PDOUBLE_V2DF:
24941     case VOID_FTYPE_PDI_DI:
24942     case VOID_FTYPE_PINT_INT:
24943       nargs = 1;
24944       klass = store;
24945       /* Reserve memory operand for target.  */
24946       memory = ARRAY_SIZE (args);
24947       break;
24948     case V4SF_FTYPE_V4SF_PCV2SF:
24949     case V2DF_FTYPE_V2DF_PCDOUBLE:
24950       nargs = 2;
24951       klass = load;
24952       memory = 1;
24953       break;
24954     case V8SF_FTYPE_PCV8SF_V8SF:
24955     case V4DF_FTYPE_PCV4DF_V4DF:
24956     case V4SF_FTYPE_PCV4SF_V4SF:
24957     case V2DF_FTYPE_PCV2DF_V2DF:
24958       nargs = 2;
24959       klass = load;
24960       memory = 0;
24961       break;
24962     case VOID_FTYPE_PV8SF_V8SF_V8SF:
24963     case VOID_FTYPE_PV4DF_V4DF_V4DF:
24964     case VOID_FTYPE_PV4SF_V4SF_V4SF:
24965     case VOID_FTYPE_PV2DF_V2DF_V2DF:
24966       nargs = 2;
24967       klass = store;
24968       /* Reserve memory operand for target.  */
24969       memory = ARRAY_SIZE (args);
24970       break;
24971     default:
24972       gcc_unreachable ();
24973     }
24974
24975   gcc_assert (nargs <= ARRAY_SIZE (args));
24976
24977   if (klass == store)
24978     {
24979       arg = CALL_EXPR_ARG (exp, 0);
24980       op = expand_normal (arg);
24981       gcc_assert (target == 0);
24982       target = gen_rtx_MEM (tmode, copy_to_mode_reg (Pmode, op));
24983       arg_adjust = 1;
24984     }
24985   else
24986     {
24987       arg_adjust = 0;
24988       if (optimize
24989           || target == 0
24990           || GET_MODE (target) != tmode
24991           || ! (*insn_p->operand[0].predicate) (target, tmode))
24992         target = gen_reg_rtx (tmode);
24993     }
24994
24995   for (i = 0; i < nargs; i++)
24996     {
24997       enum machine_mode mode = insn_p->operand[i + 1].mode;
24998       bool match;
24999
25000       arg = CALL_EXPR_ARG (exp, i + arg_adjust);
25001       op = expand_normal (arg);
25002       match = (*insn_p->operand[i + 1].predicate) (op, mode);
25003
25004       if (last_arg_constant && (i + 1) == nargs)
25005         {
25006           if (!match)
25007             switch (icode)
25008               {
25009              default:
25010                 error ("the last argument must be an 8-bit immediate");
25011                 return const0_rtx;
25012               }
25013         }
25014       else
25015         {
25016           if (i == memory)
25017             {
25018               /* This must be the memory operand.  */
25019               op = gen_rtx_MEM (mode, copy_to_mode_reg (Pmode, op));
25020               gcc_assert (GET_MODE (op) == mode
25021                           || GET_MODE (op) == VOIDmode);
25022             }
25023           else
25024             {
25025               /* This must be register.  */
25026               if (VECTOR_MODE_P (mode))
25027                 op = safe_vector_operand (op, mode);
25028
25029               gcc_assert (GET_MODE (op) == mode
25030                           || GET_MODE (op) == VOIDmode);
25031               op = copy_to_mode_reg (mode, op);
25032             }
25033         }
25034
25035       args[i].op = op;
25036       args[i].mode = mode;
25037     }
25038
25039   switch (nargs)
25040     {
25041     case 1:
25042       pat = GEN_FCN (icode) (target, args[0].op);
25043       break;
25044     case 2:
25045       pat = GEN_FCN (icode) (target, args[0].op, args[1].op);
25046       break;
25047     default:
25048       gcc_unreachable ();
25049     }
25050
25051   if (! pat)
25052     return 0;
25053   emit_insn (pat);
25054   return klass == store ? 0 : target;
25055 }
25056
25057 /* Return the integer constant in ARG.  Constrain it to be in the range
25058    of the subparts of VEC_TYPE; issue an error if not.  */
25059
25060 static int
25061 get_element_number (tree vec_type, tree arg)
25062 {
25063   unsigned HOST_WIDE_INT elt, max = TYPE_VECTOR_SUBPARTS (vec_type) - 1;
25064
25065   if (!host_integerp (arg, 1)
25066       || (elt = tree_low_cst (arg, 1), elt > max))
25067     {
25068       error ("selector must be an integer constant in the range 0..%wi", max);
25069       return 0;
25070     }
25071
25072   return elt;
25073 }
25074
25075 /* A subroutine of ix86_expand_builtin.  These builtins are a wrapper around
25076    ix86_expand_vector_init.  We DO have language-level syntax for this, in
25077    the form of  (type){ init-list }.  Except that since we can't place emms
25078    instructions from inside the compiler, we can't allow the use of MMX
25079    registers unless the user explicitly asks for it.  So we do *not* define
25080    vec_set/vec_extract/vec_init patterns for MMX modes in mmx.md.  Instead
25081    we have builtins invoked by mmintrin.h that gives us license to emit
25082    these sorts of instructions.  */
25083
25084 static rtx
25085 ix86_expand_vec_init_builtin (tree type, tree exp, rtx target)
25086 {
25087   enum machine_mode tmode = TYPE_MODE (type);
25088   enum machine_mode inner_mode = GET_MODE_INNER (tmode);
25089   int i, n_elt = GET_MODE_NUNITS (tmode);
25090   rtvec v = rtvec_alloc (n_elt);
25091
25092   gcc_assert (VECTOR_MODE_P (tmode));
25093   gcc_assert (call_expr_nargs (exp) == n_elt);
25094
25095   for (i = 0; i < n_elt; ++i)
25096     {
25097       rtx x = expand_normal (CALL_EXPR_ARG (exp, i));
25098       RTVEC_ELT (v, i) = gen_lowpart (inner_mode, x);
25099     }
25100
25101   if (!target || !register_operand (target, tmode))
25102     target = gen_reg_rtx (tmode);
25103
25104   ix86_expand_vector_init (true, target, gen_rtx_PARALLEL (tmode, v));
25105   return target;
25106 }
25107
25108 /* A subroutine of ix86_expand_builtin.  These builtins are a wrapper around
25109    ix86_expand_vector_extract.  They would be redundant (for non-MMX) if we
25110    had a language-level syntax for referencing vector elements.  */
25111
25112 static rtx
25113 ix86_expand_vec_ext_builtin (tree exp, rtx target)
25114 {
25115   enum machine_mode tmode, mode0;
25116   tree arg0, arg1;
25117   int elt;
25118   rtx op0;
25119
25120   arg0 = CALL_EXPR_ARG (exp, 0);
25121   arg1 = CALL_EXPR_ARG (exp, 1);
25122
25123   op0 = expand_normal (arg0);
25124   elt = get_element_number (TREE_TYPE (arg0), arg1);
25125
25126   tmode = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0)));
25127   mode0 = TYPE_MODE (TREE_TYPE (arg0));
25128   gcc_assert (VECTOR_MODE_P (mode0));
25129
25130   op0 = force_reg (mode0, op0);
25131
25132   if (optimize || !target || !register_operand (target, tmode))
25133     target = gen_reg_rtx (tmode);
25134
25135   ix86_expand_vector_extract (true, target, op0, elt);
25136
25137   return target;
25138 }
25139
25140 /* A subroutine of ix86_expand_builtin.  These builtins are a wrapper around
25141    ix86_expand_vector_set.  They would be redundant (for non-MMX) if we had
25142    a language-level syntax for referencing vector elements.  */
25143
25144 static rtx
25145 ix86_expand_vec_set_builtin (tree exp)
25146 {
25147   enum machine_mode tmode, mode1;
25148   tree arg0, arg1, arg2;
25149   int elt;
25150   rtx op0, op1, target;
25151
25152   arg0 = CALL_EXPR_ARG (exp, 0);
25153   arg1 = CALL_EXPR_ARG (exp, 1);
25154   arg2 = CALL_EXPR_ARG (exp, 2);
25155
25156   tmode = TYPE_MODE (TREE_TYPE (arg0));
25157   mode1 = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0)));
25158   gcc_assert (VECTOR_MODE_P (tmode));
25159
25160   op0 = expand_expr (arg0, NULL_RTX, tmode, EXPAND_NORMAL);
25161   op1 = expand_expr (arg1, NULL_RTX, mode1, EXPAND_NORMAL);
25162   elt = get_element_number (TREE_TYPE (arg0), arg2);
25163
25164   if (GET_MODE (op1) != mode1 && GET_MODE (op1) != VOIDmode)
25165     op1 = convert_modes (mode1, GET_MODE (op1), op1, true);
25166
25167   op0 = force_reg (tmode, op0);
25168   op1 = force_reg (mode1, op1);
25169
25170   /* OP0 is the source of these builtin functions and shouldn't be
25171      modified.  Create a copy, use it and return it as target.  */
25172   target = gen_reg_rtx (tmode);
25173   emit_move_insn (target, op0);
25174   ix86_expand_vector_set (true, target, op1, elt);
25175
25176   return target;
25177 }
25178
25179 /* Expand an expression EXP that calls a built-in function,
25180    with result going to TARGET if that's convenient
25181    (and in mode MODE if that's convenient).
25182    SUBTARGET may be used as the target for computing one of EXP's operands.
25183    IGNORE is nonzero if the value is to be ignored.  */
25184
25185 static rtx
25186 ix86_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
25187                      enum machine_mode mode ATTRIBUTE_UNUSED,
25188                      int ignore ATTRIBUTE_UNUSED)
25189 {
25190   const struct builtin_description *d;
25191   size_t i;
25192   enum insn_code icode;
25193   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
25194   tree arg0, arg1, arg2;
25195   rtx op0, op1, op2, pat;
25196   enum machine_mode mode0, mode1, mode2;
25197   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
25198
25199   /* Determine whether the builtin function is available under the current ISA.
25200      Originally the builtin was not created if it wasn't applicable to the
25201      current ISA based on the command line switches.  With function specific
25202      options, we need to check in the context of the function making the call
25203      whether it is supported.  */
25204   if (ix86_builtins_isa[fcode].isa
25205       && !(ix86_builtins_isa[fcode].isa & ix86_isa_flags))
25206     {
25207       char *opts = ix86_target_string (ix86_builtins_isa[fcode].isa, 0, NULL,
25208                                        NULL, NULL, false);
25209
25210       if (!opts)
25211         error ("%qE needs unknown isa option", fndecl);
25212       else
25213         {
25214           gcc_assert (opts != NULL);
25215           error ("%qE needs isa option %s", fndecl, opts);
25216           free (opts);
25217         }
25218       return const0_rtx;
25219     }
25220
25221   switch (fcode)
25222     {
25223     case IX86_BUILTIN_MASKMOVQ:
25224     case IX86_BUILTIN_MASKMOVDQU:
25225       icode = (fcode == IX86_BUILTIN_MASKMOVQ
25226                ? CODE_FOR_mmx_maskmovq
25227                : CODE_FOR_sse2_maskmovdqu);
25228       /* Note the arg order is different from the operand order.  */
25229       arg1 = CALL_EXPR_ARG (exp, 0);
25230       arg2 = CALL_EXPR_ARG (exp, 1);
25231       arg0 = CALL_EXPR_ARG (exp, 2);
25232       op0 = expand_normal (arg0);
25233       op1 = expand_normal (arg1);
25234       op2 = expand_normal (arg2);
25235       mode0 = insn_data[icode].operand[0].mode;
25236       mode1 = insn_data[icode].operand[1].mode;
25237       mode2 = insn_data[icode].operand[2].mode;
25238
25239       op0 = force_reg (Pmode, op0);
25240       op0 = gen_rtx_MEM (mode1, op0);
25241
25242       if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
25243         op0 = copy_to_mode_reg (mode0, op0);
25244       if (! (*insn_data[icode].operand[1].predicate) (op1, mode1))
25245         op1 = copy_to_mode_reg (mode1, op1);
25246       if (! (*insn_data[icode].operand[2].predicate) (op2, mode2))
25247         op2 = copy_to_mode_reg (mode2, op2);
25248       pat = GEN_FCN (icode) (op0, op1, op2);
25249       if (! pat)
25250         return 0;
25251       emit_insn (pat);
25252       return 0;
25253
25254     case IX86_BUILTIN_LDMXCSR:
25255       op0 = expand_normal (CALL_EXPR_ARG (exp, 0));
25256       target = assign_386_stack_local (SImode, SLOT_VIRTUAL);
25257       emit_move_insn (target, op0);
25258       emit_insn (gen_sse_ldmxcsr (target));
25259       return 0;
25260
25261     case IX86_BUILTIN_STMXCSR:
25262       target = assign_386_stack_local (SImode, SLOT_VIRTUAL);
25263       emit_insn (gen_sse_stmxcsr (target));
25264       return copy_to_mode_reg (SImode, target);
25265
25266     case IX86_BUILTIN_CLFLUSH:
25267         arg0 = CALL_EXPR_ARG (exp, 0);
25268         op0 = expand_normal (arg0);
25269         icode = CODE_FOR_sse2_clflush;
25270         if (! (*insn_data[icode].operand[0].predicate) (op0, Pmode))
25271             op0 = copy_to_mode_reg (Pmode, op0);
25272
25273         emit_insn (gen_sse2_clflush (op0));
25274         return 0;
25275
25276     case IX86_BUILTIN_MONITOR:
25277       arg0 = CALL_EXPR_ARG (exp, 0);
25278       arg1 = CALL_EXPR_ARG (exp, 1);
25279       arg2 = CALL_EXPR_ARG (exp, 2);
25280       op0 = expand_normal (arg0);
25281       op1 = expand_normal (arg1);
25282       op2 = expand_normal (arg2);
25283       if (!REG_P (op0))
25284         op0 = copy_to_mode_reg (Pmode, op0);
25285       if (!REG_P (op1))
25286         op1 = copy_to_mode_reg (SImode, op1);
25287       if (!REG_P (op2))
25288         op2 = copy_to_mode_reg (SImode, op2);
25289       emit_insn ((*ix86_gen_monitor) (op0, op1, op2));
25290       return 0;
25291
25292     case IX86_BUILTIN_MWAIT:
25293       arg0 = CALL_EXPR_ARG (exp, 0);
25294       arg1 = CALL_EXPR_ARG (exp, 1);
25295       op0 = expand_normal (arg0);
25296       op1 = expand_normal (arg1);
25297       if (!REG_P (op0))
25298         op0 = copy_to_mode_reg (SImode, op0);
25299       if (!REG_P (op1))
25300         op1 = copy_to_mode_reg (SImode, op1);
25301       emit_insn (gen_sse3_mwait (op0, op1));
25302       return 0;
25303
25304     case IX86_BUILTIN_VEC_INIT_V2SI:
25305     case IX86_BUILTIN_VEC_INIT_V4HI:
25306     case IX86_BUILTIN_VEC_INIT_V8QI:
25307       return ix86_expand_vec_init_builtin (TREE_TYPE (exp), exp, target);
25308
25309     case IX86_BUILTIN_VEC_EXT_V2DF:
25310     case IX86_BUILTIN_VEC_EXT_V2DI:
25311     case IX86_BUILTIN_VEC_EXT_V4SF:
25312     case IX86_BUILTIN_VEC_EXT_V4SI:
25313     case IX86_BUILTIN_VEC_EXT_V8HI:
25314     case IX86_BUILTIN_VEC_EXT_V2SI:
25315     case IX86_BUILTIN_VEC_EXT_V4HI:
25316     case IX86_BUILTIN_VEC_EXT_V16QI:
25317       return ix86_expand_vec_ext_builtin (exp, target);
25318
25319     case IX86_BUILTIN_VEC_SET_V2DI:
25320     case IX86_BUILTIN_VEC_SET_V4SF:
25321     case IX86_BUILTIN_VEC_SET_V4SI:
25322     case IX86_BUILTIN_VEC_SET_V8HI:
25323     case IX86_BUILTIN_VEC_SET_V4HI:
25324     case IX86_BUILTIN_VEC_SET_V16QI:
25325       return ix86_expand_vec_set_builtin (exp);
25326
25327     case IX86_BUILTIN_INFQ:
25328     case IX86_BUILTIN_HUGE_VALQ:
25329       {
25330         REAL_VALUE_TYPE inf;
25331         rtx tmp;
25332
25333         real_inf (&inf);
25334         tmp = CONST_DOUBLE_FROM_REAL_VALUE (inf, mode);
25335
25336         tmp = validize_mem (force_const_mem (mode, tmp));
25337
25338         if (target == 0)
25339           target = gen_reg_rtx (mode);
25340
25341         emit_move_insn (target, tmp);
25342         return target;
25343       }
25344
25345     default:
25346       break;
25347     }
25348
25349   for (i = 0, d = bdesc_special_args;
25350        i < ARRAY_SIZE (bdesc_special_args);
25351        i++, d++)
25352     if (d->code == fcode)
25353       return ix86_expand_special_args_builtin (d, exp, target);
25354
25355   for (i = 0, d = bdesc_args;
25356        i < ARRAY_SIZE (bdesc_args);
25357        i++, d++)
25358     if (d->code == fcode)
25359       switch (fcode)
25360         {
25361         case IX86_BUILTIN_FABSQ:
25362         case IX86_BUILTIN_COPYSIGNQ:
25363           if (!TARGET_SSE2)
25364             /* Emit a normal call if SSE2 isn't available.  */
25365             return expand_call (exp, target, ignore);
25366         default:
25367           return ix86_expand_args_builtin (d, exp, target);
25368         }
25369
25370   for (i = 0, d = bdesc_comi; i < ARRAY_SIZE (bdesc_comi); i++, d++)
25371     if (d->code == fcode)
25372       return ix86_expand_sse_comi (d, exp, target);
25373
25374   for (i = 0, d = bdesc_pcmpestr;
25375        i < ARRAY_SIZE (bdesc_pcmpestr);
25376        i++, d++)
25377     if (d->code == fcode)
25378       return ix86_expand_sse_pcmpestr (d, exp, target);
25379
25380   for (i = 0, d = bdesc_pcmpistr;
25381        i < ARRAY_SIZE (bdesc_pcmpistr);
25382        i++, d++)
25383     if (d->code == fcode)
25384       return ix86_expand_sse_pcmpistr (d, exp, target);
25385
25386   for (i = 0, d = bdesc_multi_arg; i < ARRAY_SIZE (bdesc_multi_arg); i++, d++)
25387     if (d->code == fcode)
25388       return ix86_expand_multi_arg_builtin (d->icode, exp, target,
25389                                             (enum multi_arg_type)d->flag,
25390                                             d->comparison);
25391
25392   gcc_unreachable ();
25393 }
25394
25395 /* Returns a function decl for a vectorized version of the builtin function
25396    with builtin function code FN and the result vector type TYPE, or NULL_TREE
25397    if it is not available.  */
25398
25399 static tree
25400 ix86_builtin_vectorized_function (unsigned int fn, tree type_out,
25401                                   tree type_in)
25402 {
25403   enum machine_mode in_mode, out_mode;
25404   int in_n, out_n;
25405
25406   if (TREE_CODE (type_out) != VECTOR_TYPE
25407       || TREE_CODE (type_in) != VECTOR_TYPE)
25408     return NULL_TREE;
25409
25410   out_mode = TYPE_MODE (TREE_TYPE (type_out));
25411   out_n = TYPE_VECTOR_SUBPARTS (type_out);
25412   in_mode = TYPE_MODE (TREE_TYPE (type_in));
25413   in_n = TYPE_VECTOR_SUBPARTS (type_in);
25414
25415   switch (fn)
25416     {
25417     case BUILT_IN_SQRT:
25418       if (out_mode == DFmode && out_n == 2
25419           && in_mode == DFmode && in_n == 2)
25420         return ix86_builtins[IX86_BUILTIN_SQRTPD];
25421       break;
25422
25423     case BUILT_IN_SQRTF:
25424       if (out_mode == SFmode && out_n == 4
25425           && in_mode == SFmode && in_n == 4)
25426         return ix86_builtins[IX86_BUILTIN_SQRTPS_NR];
25427       break;
25428
25429     case BUILT_IN_LRINT:
25430       if (out_mode == SImode && out_n == 4
25431           && in_mode == DFmode && in_n == 2)
25432         return ix86_builtins[IX86_BUILTIN_VEC_PACK_SFIX];
25433       break;
25434
25435     case BUILT_IN_LRINTF:
25436       if (out_mode == SImode && out_n == 4
25437           && in_mode == SFmode && in_n == 4)
25438         return ix86_builtins[IX86_BUILTIN_CVTPS2DQ];
25439       break;
25440
25441     default:
25442       ;
25443     }
25444
25445   /* Dispatch to a handler for a vectorization library.  */
25446   if (ix86_veclib_handler)
25447     return (*ix86_veclib_handler) ((enum built_in_function) fn, type_out,
25448                                    type_in);
25449
25450   return NULL_TREE;
25451 }
25452
25453 /* Handler for an SVML-style interface to
25454    a library with vectorized intrinsics.  */
25455
25456 static tree
25457 ix86_veclibabi_svml (enum built_in_function fn, tree type_out, tree type_in)
25458 {
25459   char name[20];
25460   tree fntype, new_fndecl, args;
25461   unsigned arity;
25462   const char *bname;
25463   enum machine_mode el_mode, in_mode;
25464   int n, in_n;
25465
25466   /* The SVML is suitable for unsafe math only.  */
25467   if (!flag_unsafe_math_optimizations)
25468     return NULL_TREE;
25469
25470   el_mode = TYPE_MODE (TREE_TYPE (type_out));
25471   n = TYPE_VECTOR_SUBPARTS (type_out);
25472   in_mode = TYPE_MODE (TREE_TYPE (type_in));
25473   in_n = TYPE_VECTOR_SUBPARTS (type_in);
25474   if (el_mode != in_mode
25475       || n != in_n)
25476     return NULL_TREE;
25477
25478   switch (fn)
25479     {
25480     case BUILT_IN_EXP:
25481     case BUILT_IN_LOG:
25482     case BUILT_IN_LOG10:
25483     case BUILT_IN_POW:
25484     case BUILT_IN_TANH:
25485     case BUILT_IN_TAN:
25486     case BUILT_IN_ATAN:
25487     case BUILT_IN_ATAN2:
25488     case BUILT_IN_ATANH:
25489     case BUILT_IN_CBRT:
25490     case BUILT_IN_SINH:
25491     case BUILT_IN_SIN:
25492     case BUILT_IN_ASINH:
25493     case BUILT_IN_ASIN:
25494     case BUILT_IN_COSH:
25495     case BUILT_IN_COS:
25496     case BUILT_IN_ACOSH:
25497     case BUILT_IN_ACOS:
25498       if (el_mode != DFmode || n != 2)
25499         return NULL_TREE;
25500       break;
25501
25502     case BUILT_IN_EXPF:
25503     case BUILT_IN_LOGF:
25504     case BUILT_IN_LOG10F:
25505     case BUILT_IN_POWF:
25506     case BUILT_IN_TANHF:
25507     case BUILT_IN_TANF:
25508     case BUILT_IN_ATANF:
25509     case BUILT_IN_ATAN2F:
25510     case BUILT_IN_ATANHF:
25511     case BUILT_IN_CBRTF:
25512     case BUILT_IN_SINHF:
25513     case BUILT_IN_SINF:
25514     case BUILT_IN_ASINHF:
25515     case BUILT_IN_ASINF:
25516     case BUILT_IN_COSHF:
25517     case BUILT_IN_COSF:
25518     case BUILT_IN_ACOSHF:
25519     case BUILT_IN_ACOSF:
25520       if (el_mode != SFmode || n != 4)
25521         return NULL_TREE;
25522       break;
25523
25524     default:
25525       return NULL_TREE;
25526     }
25527
25528   bname = IDENTIFIER_POINTER (DECL_NAME (implicit_built_in_decls[fn]));
25529
25530   if (fn == BUILT_IN_LOGF)
25531     strcpy (name, "vmlsLn4");
25532   else if (fn == BUILT_IN_LOG)
25533     strcpy (name, "vmldLn2");
25534   else if (n == 4)
25535     {
25536       sprintf (name, "vmls%s", bname+10);
25537       name[strlen (name)-1] = '4';
25538     }
25539   else
25540     sprintf (name, "vmld%s2", bname+10);
25541
25542   /* Convert to uppercase. */
25543   name[4] &= ~0x20;
25544
25545   arity = 0;
25546   for (args = DECL_ARGUMENTS (implicit_built_in_decls[fn]); args;
25547        args = TREE_CHAIN (args))
25548     arity++;
25549
25550   if (arity == 1)
25551     fntype = build_function_type_list (type_out, type_in, NULL);
25552   else
25553     fntype = build_function_type_list (type_out, type_in, type_in, NULL);
25554
25555   /* Build a function declaration for the vectorized function.  */
25556   new_fndecl = build_decl (FUNCTION_DECL, get_identifier (name), fntype);
25557   TREE_PUBLIC (new_fndecl) = 1;
25558   DECL_EXTERNAL (new_fndecl) = 1;
25559   DECL_IS_NOVOPS (new_fndecl) = 1;
25560   TREE_READONLY (new_fndecl) = 1;
25561
25562   return new_fndecl;
25563 }
25564
25565 /* Handler for an ACML-style interface to
25566    a library with vectorized intrinsics.  */
25567
25568 static tree
25569 ix86_veclibabi_acml (enum built_in_function fn, tree type_out, tree type_in)
25570 {
25571   char name[20] = "__vr.._";
25572   tree fntype, new_fndecl, args;
25573   unsigned arity;
25574   const char *bname;
25575   enum machine_mode el_mode, in_mode;
25576   int n, in_n;
25577
25578   /* The ACML is 64bits only and suitable for unsafe math only as
25579      it does not correctly support parts of IEEE with the required
25580      precision such as denormals.  */
25581   if (!TARGET_64BIT
25582       || !flag_unsafe_math_optimizations)
25583     return NULL_TREE;
25584
25585   el_mode = TYPE_MODE (TREE_TYPE (type_out));
25586   n = TYPE_VECTOR_SUBPARTS (type_out);
25587   in_mode = TYPE_MODE (TREE_TYPE (type_in));
25588   in_n = TYPE_VECTOR_SUBPARTS (type_in);
25589   if (el_mode != in_mode
25590       || n != in_n)
25591     return NULL_TREE;
25592
25593   switch (fn)
25594     {
25595     case BUILT_IN_SIN:
25596     case BUILT_IN_COS:
25597     case BUILT_IN_EXP:
25598     case BUILT_IN_LOG:
25599     case BUILT_IN_LOG2:
25600     case BUILT_IN_LOG10:
25601       name[4] = 'd';
25602       name[5] = '2';
25603       if (el_mode != DFmode
25604           || n != 2)
25605         return NULL_TREE;
25606       break;
25607
25608     case BUILT_IN_SINF:
25609     case BUILT_IN_COSF:
25610     case BUILT_IN_EXPF:
25611     case BUILT_IN_POWF:
25612     case BUILT_IN_LOGF:
25613     case BUILT_IN_LOG2F:
25614     case BUILT_IN_LOG10F:
25615       name[4] = 's';
25616       name[5] = '4';
25617       if (el_mode != SFmode
25618           || n != 4)
25619         return NULL_TREE;
25620       break;
25621
25622     default:
25623       return NULL_TREE;
25624     }
25625
25626   bname = IDENTIFIER_POINTER (DECL_NAME (implicit_built_in_decls[fn]));
25627   sprintf (name + 7, "%s", bname+10);
25628
25629   arity = 0;
25630   for (args = DECL_ARGUMENTS (implicit_built_in_decls[fn]); args;
25631        args = TREE_CHAIN (args))
25632     arity++;
25633
25634   if (arity == 1)
25635     fntype = build_function_type_list (type_out, type_in, NULL);
25636   else
25637     fntype = build_function_type_list (type_out, type_in, type_in, NULL);
25638
25639   /* Build a function declaration for the vectorized function.  */
25640   new_fndecl = build_decl (FUNCTION_DECL, get_identifier (name), fntype);
25641   TREE_PUBLIC (new_fndecl) = 1;
25642   DECL_EXTERNAL (new_fndecl) = 1;
25643   DECL_IS_NOVOPS (new_fndecl) = 1;
25644   TREE_READONLY (new_fndecl) = 1;
25645
25646   return new_fndecl;
25647 }
25648
25649
25650 /* Returns a decl of a function that implements conversion of an integer vector
25651    into a floating-point vector, or vice-versa. TYPE is the type of the integer
25652    side of the conversion.
25653    Return NULL_TREE if it is not available.  */
25654
25655 static tree
25656 ix86_vectorize_builtin_conversion (unsigned int code, tree type)
25657 {
25658   if (TREE_CODE (type) != VECTOR_TYPE
25659       /* There are only conversions from/to signed integers.  */
25660       || TYPE_UNSIGNED (TREE_TYPE (type)))
25661     return NULL_TREE;
25662
25663   switch (code)
25664     {
25665     case FLOAT_EXPR:
25666       switch (TYPE_MODE (type))
25667         {
25668         case V4SImode:
25669           return ix86_builtins[IX86_BUILTIN_CVTDQ2PS];
25670         default:
25671           return NULL_TREE;
25672         }
25673
25674     case FIX_TRUNC_EXPR:
25675       switch (TYPE_MODE (type))
25676         {
25677         case V4SImode:
25678           return ix86_builtins[IX86_BUILTIN_CVTTPS2DQ];
25679         default:
25680           return NULL_TREE;
25681         }
25682     default:
25683       return NULL_TREE;
25684
25685     }
25686 }
25687
25688 /* Returns a code for a target-specific builtin that implements
25689    reciprocal of the function, or NULL_TREE if not available.  */
25690
25691 static tree
25692 ix86_builtin_reciprocal (unsigned int fn, bool md_fn,
25693                          bool sqrt ATTRIBUTE_UNUSED)
25694 {
25695   if (! (TARGET_SSE_MATH && TARGET_RECIP && !optimize_insn_for_size_p ()
25696          && flag_finite_math_only && !flag_trapping_math
25697          && flag_unsafe_math_optimizations))
25698     return NULL_TREE;
25699
25700   if (md_fn)
25701     /* Machine dependent builtins.  */
25702     switch (fn)
25703       {
25704         /* Vectorized version of sqrt to rsqrt conversion.  */
25705       case IX86_BUILTIN_SQRTPS_NR:
25706         return ix86_builtins[IX86_BUILTIN_RSQRTPS_NR];
25707
25708       default:
25709         return NULL_TREE;
25710       }
25711   else
25712     /* Normal builtins.  */
25713     switch (fn)
25714       {
25715         /* Sqrt to rsqrt conversion.  */
25716       case BUILT_IN_SQRTF:
25717         return ix86_builtins[IX86_BUILTIN_RSQRTF];
25718
25719       default:
25720         return NULL_TREE;
25721       }
25722 }
25723
25724 /* Store OPERAND to the memory after reload is completed.  This means
25725    that we can't easily use assign_stack_local.  */
25726 rtx
25727 ix86_force_to_memory (enum machine_mode mode, rtx operand)
25728 {
25729   rtx result;
25730
25731   gcc_assert (reload_completed);
25732   if (!TARGET_64BIT_MS_ABI && TARGET_RED_ZONE)
25733     {
25734       result = gen_rtx_MEM (mode,
25735                             gen_rtx_PLUS (Pmode,
25736                                           stack_pointer_rtx,
25737                                           GEN_INT (-RED_ZONE_SIZE)));
25738       emit_move_insn (result, operand);
25739     }
25740   else if ((TARGET_64BIT_MS_ABI || !TARGET_RED_ZONE) && TARGET_64BIT)
25741     {
25742       switch (mode)
25743         {
25744         case HImode:
25745         case SImode:
25746           operand = gen_lowpart (DImode, operand);
25747           /* FALLTHRU */
25748         case DImode:
25749           emit_insn (
25750                       gen_rtx_SET (VOIDmode,
25751                                    gen_rtx_MEM (DImode,
25752                                                 gen_rtx_PRE_DEC (DImode,
25753                                                         stack_pointer_rtx)),
25754                                    operand));
25755           break;
25756         default:
25757           gcc_unreachable ();
25758         }
25759       result = gen_rtx_MEM (mode, stack_pointer_rtx);
25760     }
25761   else
25762     {
25763       switch (mode)
25764         {
25765         case DImode:
25766           {
25767             rtx operands[2];
25768             split_di (&operand, 1, operands, operands + 1);
25769             emit_insn (
25770                         gen_rtx_SET (VOIDmode,
25771                                      gen_rtx_MEM (SImode,
25772                                                   gen_rtx_PRE_DEC (Pmode,
25773                                                         stack_pointer_rtx)),
25774                                      operands[1]));
25775             emit_insn (
25776                         gen_rtx_SET (VOIDmode,
25777                                      gen_rtx_MEM (SImode,
25778                                                   gen_rtx_PRE_DEC (Pmode,
25779                                                         stack_pointer_rtx)),
25780                                      operands[0]));
25781           }
25782           break;
25783         case HImode:
25784           /* Store HImodes as SImodes.  */
25785           operand = gen_lowpart (SImode, operand);
25786           /* FALLTHRU */
25787         case SImode:
25788           emit_insn (
25789                       gen_rtx_SET (VOIDmode,
25790                                    gen_rtx_MEM (GET_MODE (operand),
25791                                                 gen_rtx_PRE_DEC (SImode,
25792                                                         stack_pointer_rtx)),
25793                                    operand));
25794           break;
25795         default:
25796           gcc_unreachable ();
25797         }
25798       result = gen_rtx_MEM (mode, stack_pointer_rtx);
25799     }
25800   return result;
25801 }
25802
25803 /* Free operand from the memory.  */
25804 void
25805 ix86_free_from_memory (enum machine_mode mode)
25806 {
25807   if (!TARGET_RED_ZONE || TARGET_64BIT_MS_ABI)
25808     {
25809       int size;
25810
25811       if (mode == DImode || TARGET_64BIT)
25812         size = 8;
25813       else
25814         size = 4;
25815       /* Use LEA to deallocate stack space.  In peephole2 it will be converted
25816          to pop or add instruction if registers are available.  */
25817       emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
25818                               gen_rtx_PLUS (Pmode, stack_pointer_rtx,
25819                                             GEN_INT (size))));
25820     }
25821 }
25822
25823 /* Put float CONST_DOUBLE in the constant pool instead of fp regs.
25824    QImode must go into class Q_REGS.
25825    Narrow ALL_REGS to GENERAL_REGS.  This supports allowing movsf and
25826    movdf to do mem-to-mem moves through integer regs.  */
25827 enum reg_class
25828 ix86_preferred_reload_class (rtx x, enum reg_class regclass)
25829 {
25830   enum machine_mode mode = GET_MODE (x);
25831
25832   /* We're only allowed to return a subclass of CLASS.  Many of the
25833      following checks fail for NO_REGS, so eliminate that early.  */
25834   if (regclass == NO_REGS)
25835     return NO_REGS;
25836
25837   /* All classes can load zeros.  */
25838   if (x == CONST0_RTX (mode))
25839     return regclass;
25840
25841   /* Force constants into memory if we are loading a (nonzero) constant into
25842      an MMX or SSE register.  This is because there are no MMX/SSE instructions
25843      to load from a constant.  */
25844   if (CONSTANT_P (x)
25845       && (MAYBE_MMX_CLASS_P (regclass) || MAYBE_SSE_CLASS_P (regclass)))
25846     return NO_REGS;
25847
25848   /* Prefer SSE regs only, if we can use them for math.  */
25849   if (TARGET_SSE_MATH && !TARGET_MIX_SSE_I387 && SSE_FLOAT_MODE_P (mode))
25850     return SSE_CLASS_P (regclass) ? regclass : NO_REGS;
25851
25852   /* Floating-point constants need more complex checks.  */
25853   if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) != VOIDmode)
25854     {
25855       /* General regs can load everything.  */
25856       if (reg_class_subset_p (regclass, GENERAL_REGS))
25857         return regclass;
25858
25859       /* Floats can load 0 and 1 plus some others.  Note that we eliminated
25860          zero above.  We only want to wind up preferring 80387 registers if
25861          we plan on doing computation with them.  */
25862       if (TARGET_80387
25863           && standard_80387_constant_p (x))
25864         {
25865           /* Limit class to non-sse.  */
25866           if (regclass == FLOAT_SSE_REGS)
25867             return FLOAT_REGS;
25868           if (regclass == FP_TOP_SSE_REGS)
25869             return FP_TOP_REG;
25870           if (regclass == FP_SECOND_SSE_REGS)
25871             return FP_SECOND_REG;
25872           if (regclass == FLOAT_INT_REGS || regclass == FLOAT_REGS)
25873             return regclass;
25874         }
25875
25876       return NO_REGS;
25877     }
25878
25879   /* Generally when we see PLUS here, it's the function invariant
25880      (plus soft-fp const_int).  Which can only be computed into general
25881      regs.  */
25882   if (GET_CODE (x) == PLUS)
25883     return reg_class_subset_p (regclass, GENERAL_REGS) ? regclass : NO_REGS;
25884
25885   /* QImode constants are easy to load, but non-constant QImode data
25886      must go into Q_REGS.  */
25887   if (GET_MODE (x) == QImode && !CONSTANT_P (x))
25888     {
25889       if (reg_class_subset_p (regclass, Q_REGS))
25890         return regclass;
25891       if (reg_class_subset_p (Q_REGS, regclass))
25892         return Q_REGS;
25893       return NO_REGS;
25894     }
25895
25896   return regclass;
25897 }
25898
25899 /* Discourage putting floating-point values in SSE registers unless
25900    SSE math is being used, and likewise for the 387 registers.  */
25901 enum reg_class
25902 ix86_preferred_output_reload_class (rtx x, enum reg_class regclass)
25903 {
25904   enum machine_mode mode = GET_MODE (x);
25905
25906   /* Restrict the output reload class to the register bank that we are doing
25907      math on.  If we would like not to return a subset of CLASS, reject this
25908      alternative: if reload cannot do this, it will still use its choice.  */
25909   mode = GET_MODE (x);
25910   if (TARGET_SSE_MATH && SSE_FLOAT_MODE_P (mode))
25911     return MAYBE_SSE_CLASS_P (regclass) ? SSE_REGS : NO_REGS;
25912
25913   if (X87_FLOAT_MODE_P (mode))
25914     {
25915       if (regclass == FP_TOP_SSE_REGS)
25916         return FP_TOP_REG;
25917       else if (regclass == FP_SECOND_SSE_REGS)
25918         return FP_SECOND_REG;
25919       else
25920         return FLOAT_CLASS_P (regclass) ? regclass : NO_REGS;
25921     }
25922
25923   return regclass;
25924 }
25925
25926 static enum reg_class
25927 ix86_secondary_reload (bool in_p, rtx x, enum reg_class rclass,
25928                        enum machine_mode mode,
25929                        secondary_reload_info *sri ATTRIBUTE_UNUSED)
25930 {
25931   /* QImode spills from non-QI registers require
25932      intermediate register on 32bit targets.  */
25933   if (!in_p && mode == QImode && !TARGET_64BIT
25934       && (rclass == GENERAL_REGS
25935           || rclass == LEGACY_REGS
25936           || rclass == INDEX_REGS))
25937     {
25938       int regno;
25939
25940       if (REG_P (x))
25941         regno = REGNO (x);
25942       else
25943         regno = -1;
25944
25945       if (regno >= FIRST_PSEUDO_REGISTER || GET_CODE (x) == SUBREG)
25946         regno = true_regnum (x);
25947
25948       /* Return Q_REGS if the operand is in memory.  */
25949       if (regno == -1)
25950         return Q_REGS;
25951     }
25952
25953   return NO_REGS;
25954 }
25955
25956 /* If we are copying between general and FP registers, we need a memory
25957    location. The same is true for SSE and MMX registers.
25958
25959    To optimize register_move_cost performance, allow inline variant.
25960
25961    The macro can't work reliably when one of the CLASSES is class containing
25962    registers from multiple units (SSE, MMX, integer).  We avoid this by never
25963    combining those units in single alternative in the machine description.
25964    Ensure that this constraint holds to avoid unexpected surprises.
25965
25966    When STRICT is false, we are being called from REGISTER_MOVE_COST, so do not
25967    enforce these sanity checks.  */
25968
25969 static inline int
25970 inline_secondary_memory_needed (enum reg_class class1, enum reg_class class2,
25971                               enum machine_mode mode, int strict)
25972 {
25973   if (MAYBE_FLOAT_CLASS_P (class1) != FLOAT_CLASS_P (class1)
25974       || MAYBE_FLOAT_CLASS_P (class2) != FLOAT_CLASS_P (class2)
25975       || MAYBE_SSE_CLASS_P (class1) != SSE_CLASS_P (class1)
25976       || MAYBE_SSE_CLASS_P (class2) != SSE_CLASS_P (class2)
25977       || MAYBE_MMX_CLASS_P (class1) != MMX_CLASS_P (class1)
25978       || MAYBE_MMX_CLASS_P (class2) != MMX_CLASS_P (class2))
25979     {
25980       gcc_assert (!strict);
25981       return true;
25982     }
25983
25984   if (FLOAT_CLASS_P (class1) != FLOAT_CLASS_P (class2))
25985     return true;
25986
25987   /* ??? This is a lie.  We do have moves between mmx/general, and for
25988      mmx/sse2.  But by saying we need secondary memory we discourage the
25989      register allocator from using the mmx registers unless needed.  */
25990   if (MMX_CLASS_P (class1) != MMX_CLASS_P (class2))
25991     return true;
25992
25993   if (SSE_CLASS_P (class1) != SSE_CLASS_P (class2))
25994     {
25995       /* SSE1 doesn't have any direct moves from other classes.  */
25996       if (!TARGET_SSE2)
25997         return true;
25998
25999       /* If the target says that inter-unit moves are more expensive
26000          than moving through memory, then don't generate them.  */
26001       if (!TARGET_INTER_UNIT_MOVES)
26002         return true;
26003
26004       /* Between SSE and general, we have moves no larger than word size.  */
26005       if (GET_MODE_SIZE (mode) > UNITS_PER_WORD)
26006         return true;
26007     }
26008
26009   return false;
26010 }
26011
26012 int
26013 ix86_secondary_memory_needed (enum reg_class class1, enum reg_class class2,
26014                               enum machine_mode mode, int strict)
26015 {
26016   return inline_secondary_memory_needed (class1, class2, mode, strict);
26017 }
26018
26019 /* Return true if the registers in CLASS cannot represent the change from
26020    modes FROM to TO.  */
26021
26022 bool
26023 ix86_cannot_change_mode_class (enum machine_mode from, enum machine_mode to,
26024                                enum reg_class regclass)
26025 {
26026   if (from == to)
26027     return false;
26028
26029   /* x87 registers can't do subreg at all, as all values are reformatted
26030      to extended precision.  */
26031   if (MAYBE_FLOAT_CLASS_P (regclass))
26032     return true;
26033
26034   if (MAYBE_SSE_CLASS_P (regclass) || MAYBE_MMX_CLASS_P (regclass))
26035     {
26036       /* Vector registers do not support QI or HImode loads.  If we don't
26037          disallow a change to these modes, reload will assume it's ok to
26038          drop the subreg from (subreg:SI (reg:HI 100) 0).  This affects
26039          the vec_dupv4hi pattern.  */
26040       if (GET_MODE_SIZE (from) < 4)
26041         return true;
26042
26043       /* Vector registers do not support subreg with nonzero offsets, which
26044          are otherwise valid for integer registers.  Since we can't see
26045          whether we have a nonzero offset from here, prohibit all
26046          nonparadoxical subregs changing size.  */
26047       if (GET_MODE_SIZE (to) < GET_MODE_SIZE (from))
26048         return true;
26049     }
26050
26051   return false;
26052 }
26053
26054 /* Return the cost of moving data of mode M between a
26055    register and memory.  A value of 2 is the default; this cost is
26056    relative to those in `REGISTER_MOVE_COST'.
26057
26058    This function is used extensively by register_move_cost that is used to
26059    build tables at startup.  Make it inline in this case.
26060    When IN is 2, return maximum of in and out move cost.
26061
26062    If moving between registers and memory is more expensive than
26063    between two registers, you should define this macro to express the
26064    relative cost.
26065
26066    Model also increased moving costs of QImode registers in non
26067    Q_REGS classes.
26068  */
26069 static inline int
26070 inline_memory_move_cost (enum machine_mode mode, enum reg_class regclass,
26071                          int in)
26072 {
26073   int cost;
26074   if (FLOAT_CLASS_P (regclass))
26075     {
26076       int index;
26077       switch (mode)
26078         {
26079           case SFmode:
26080             index = 0;
26081             break;
26082           case DFmode:
26083             index = 1;
26084             break;
26085           case XFmode:
26086             index = 2;
26087             break;
26088           default:
26089             return 100;
26090         }
26091       if (in == 2)
26092         return MAX (ix86_cost->fp_load [index], ix86_cost->fp_store [index]);
26093       return in ? ix86_cost->fp_load [index] : ix86_cost->fp_store [index];
26094     }
26095   if (SSE_CLASS_P (regclass))
26096     {
26097       int index;
26098       switch (GET_MODE_SIZE (mode))
26099         {
26100           case 4:
26101             index = 0;
26102             break;
26103           case 8:
26104             index = 1;
26105             break;
26106           case 16:
26107             index = 2;
26108             break;
26109           default:
26110             return 100;
26111         }
26112       if (in == 2)
26113         return MAX (ix86_cost->sse_load [index], ix86_cost->sse_store [index]);
26114       return in ? ix86_cost->sse_load [index] : ix86_cost->sse_store [index];
26115     }
26116   if (MMX_CLASS_P (regclass))
26117     {
26118       int index;
26119       switch (GET_MODE_SIZE (mode))
26120         {
26121           case 4:
26122             index = 0;
26123             break;
26124           case 8:
26125             index = 1;
26126             break;
26127           default:
26128             return 100;
26129         }
26130       if (in)
26131         return MAX (ix86_cost->mmx_load [index], ix86_cost->mmx_store [index]);
26132       return in ? ix86_cost->mmx_load [index] : ix86_cost->mmx_store [index];
26133     }
26134   switch (GET_MODE_SIZE (mode))
26135     {
26136       case 1:
26137         if (Q_CLASS_P (regclass) || TARGET_64BIT)
26138           {
26139             if (!in)
26140               return ix86_cost->int_store[0];
26141             if (TARGET_PARTIAL_REG_DEPENDENCY
26142                 && optimize_function_for_speed_p (cfun))
26143               cost = ix86_cost->movzbl_load;
26144             else
26145               cost = ix86_cost->int_load[0];
26146             if (in == 2)
26147               return MAX (cost, ix86_cost->int_store[0]);
26148             return cost;
26149           }
26150         else
26151           {
26152            if (in == 2)
26153              return MAX (ix86_cost->movzbl_load, ix86_cost->int_store[0] + 4);
26154            if (in)
26155              return ix86_cost->movzbl_load;
26156            else
26157              return ix86_cost->int_store[0] + 4;
26158           }
26159         break;
26160       case 2:
26161         if (in == 2)
26162           return MAX (ix86_cost->int_load[1], ix86_cost->int_store[1]);
26163         return in ? ix86_cost->int_load[1] : ix86_cost->int_store[1];
26164       default:
26165         /* Compute number of 32bit moves needed.  TFmode is moved as XFmode.  */
26166         if (mode == TFmode)
26167           mode = XFmode;
26168         if (in == 2)
26169           cost = MAX (ix86_cost->int_load[2] , ix86_cost->int_store[2]);
26170         else if (in)
26171           cost = ix86_cost->int_load[2];
26172         else
26173           cost = ix86_cost->int_store[2];
26174         return (cost * (((int) GET_MODE_SIZE (mode)
26175                         + UNITS_PER_WORD - 1) / UNITS_PER_WORD));
26176     }
26177 }
26178
26179 int
26180 ix86_memory_move_cost (enum machine_mode mode, enum reg_class regclass, int in)
26181 {
26182   return inline_memory_move_cost (mode, regclass, in);
26183 }
26184
26185
26186 /* Return the cost of moving data from a register in class CLASS1 to
26187    one in class CLASS2.
26188
26189    It is not required that the cost always equal 2 when FROM is the same as TO;
26190    on some machines it is expensive to move between registers if they are not
26191    general registers.  */
26192
26193 int
26194 ix86_register_move_cost (enum machine_mode mode, enum reg_class class1,
26195                          enum reg_class class2)
26196 {
26197   /* In case we require secondary memory, compute cost of the store followed
26198      by load.  In order to avoid bad register allocation choices, we need
26199      for this to be *at least* as high as the symmetric MEMORY_MOVE_COST.  */
26200
26201   if (inline_secondary_memory_needed (class1, class2, mode, 0))
26202     {
26203       int cost = 1;
26204
26205       cost += inline_memory_move_cost (mode, class1, 2);
26206       cost += inline_memory_move_cost (mode, class2, 2);
26207
26208       /* In case of copying from general_purpose_register we may emit multiple
26209          stores followed by single load causing memory size mismatch stall.
26210          Count this as arbitrarily high cost of 20.  */
26211       if (CLASS_MAX_NREGS (class1, mode) > CLASS_MAX_NREGS (class2, mode))
26212         cost += 20;
26213
26214       /* In the case of FP/MMX moves, the registers actually overlap, and we
26215          have to switch modes in order to treat them differently.  */
26216       if ((MMX_CLASS_P (class1) && MAYBE_FLOAT_CLASS_P (class2))
26217           || (MMX_CLASS_P (class2) && MAYBE_FLOAT_CLASS_P (class1)))
26218         cost += 20;
26219
26220       return cost;
26221     }
26222
26223   /* Moves between SSE/MMX and integer unit are expensive.  */
26224   if (MMX_CLASS_P (class1) != MMX_CLASS_P (class2)
26225       || SSE_CLASS_P (class1) != SSE_CLASS_P (class2))
26226
26227     /* ??? By keeping returned value relatively high, we limit the number
26228        of moves between integer and MMX/SSE registers for all targets.
26229        Additionally, high value prevents problem with x86_modes_tieable_p(),
26230        where integer modes in MMX/SSE registers are not tieable
26231        because of missing QImode and HImode moves to, from or between
26232        MMX/SSE registers.  */
26233     return MAX (8, ix86_cost->mmxsse_to_integer);
26234
26235   if (MAYBE_FLOAT_CLASS_P (class1))
26236     return ix86_cost->fp_move;
26237   if (MAYBE_SSE_CLASS_P (class1))
26238     return ix86_cost->sse_move;
26239   if (MAYBE_MMX_CLASS_P (class1))
26240     return ix86_cost->mmx_move;
26241   return 2;
26242 }
26243
26244 /* Return 1 if hard register REGNO can hold a value of machine-mode MODE.  */
26245
26246 bool
26247 ix86_hard_regno_mode_ok (int regno, enum machine_mode mode)
26248 {
26249   /* Flags and only flags can only hold CCmode values.  */
26250   if (CC_REGNO_P (regno))
26251     return GET_MODE_CLASS (mode) == MODE_CC;
26252   if (GET_MODE_CLASS (mode) == MODE_CC
26253       || GET_MODE_CLASS (mode) == MODE_RANDOM
26254       || GET_MODE_CLASS (mode) == MODE_PARTIAL_INT)
26255     return 0;
26256   if (FP_REGNO_P (regno))
26257     return VALID_FP_MODE_P (mode);
26258   if (SSE_REGNO_P (regno))
26259     {
26260       /* We implement the move patterns for all vector modes into and
26261          out of SSE registers, even when no operation instructions
26262          are available.  OImode move is available only when AVX is
26263          enabled.  */
26264       return ((TARGET_AVX && mode == OImode)
26265               || VALID_AVX256_REG_MODE (mode)
26266               || VALID_SSE_REG_MODE (mode)
26267               || VALID_SSE2_REG_MODE (mode)
26268               || VALID_MMX_REG_MODE (mode)
26269               || VALID_MMX_REG_MODE_3DNOW (mode));
26270     }
26271   if (MMX_REGNO_P (regno))
26272     {
26273       /* We implement the move patterns for 3DNOW modes even in MMX mode,
26274          so if the register is available at all, then we can move data of
26275          the given mode into or out of it.  */
26276       return (VALID_MMX_REG_MODE (mode)
26277               || VALID_MMX_REG_MODE_3DNOW (mode));
26278     }
26279
26280   if (mode == QImode)
26281     {
26282       /* Take care for QImode values - they can be in non-QI regs,
26283          but then they do cause partial register stalls.  */
26284       if (regno <= BX_REG || TARGET_64BIT)
26285         return 1;
26286       if (!TARGET_PARTIAL_REG_STALL)
26287         return 1;
26288       return reload_in_progress || reload_completed;
26289     }
26290   /* We handle both integer and floats in the general purpose registers.  */
26291   else if (VALID_INT_MODE_P (mode))
26292     return 1;
26293   else if (VALID_FP_MODE_P (mode))
26294     return 1;
26295   else if (VALID_DFP_MODE_P (mode))
26296     return 1;
26297   /* Lots of MMX code casts 8 byte vector modes to DImode.  If we then go
26298      on to use that value in smaller contexts, this can easily force a
26299      pseudo to be allocated to GENERAL_REGS.  Since this is no worse than
26300      supporting DImode, allow it.  */
26301   else if (VALID_MMX_REG_MODE_3DNOW (mode) || VALID_MMX_REG_MODE (mode))
26302     return 1;
26303
26304   return 0;
26305 }
26306
26307 /* A subroutine of ix86_modes_tieable_p.  Return true if MODE is a
26308    tieable integer mode.  */
26309
26310 static bool
26311 ix86_tieable_integer_mode_p (enum machine_mode mode)
26312 {
26313   switch (mode)
26314     {
26315     case HImode:
26316     case SImode:
26317       return true;
26318
26319     case QImode:
26320       return TARGET_64BIT || !TARGET_PARTIAL_REG_STALL;
26321
26322     case DImode:
26323       return TARGET_64BIT;
26324
26325     default:
26326       return false;
26327     }
26328 }
26329
26330 /* Return true if MODE1 is accessible in a register that can hold MODE2
26331    without copying.  That is, all register classes that can hold MODE2
26332    can also hold MODE1.  */
26333
26334 bool
26335 ix86_modes_tieable_p (enum machine_mode mode1, enum machine_mode mode2)
26336 {
26337   if (mode1 == mode2)
26338     return true;
26339
26340   if (ix86_tieable_integer_mode_p (mode1)
26341       && ix86_tieable_integer_mode_p (mode2))
26342     return true;
26343
26344   /* MODE2 being XFmode implies fp stack or general regs, which means we
26345      can tie any smaller floating point modes to it.  Note that we do not
26346      tie this with TFmode.  */
26347   if (mode2 == XFmode)
26348     return mode1 == SFmode || mode1 == DFmode;
26349
26350   /* MODE2 being DFmode implies fp stack, general or sse regs, which means
26351      that we can tie it with SFmode.  */
26352   if (mode2 == DFmode)
26353     return mode1 == SFmode;
26354
26355   /* If MODE2 is only appropriate for an SSE register, then tie with
26356      any other mode acceptable to SSE registers.  */
26357   if (GET_MODE_SIZE (mode2) == 16
26358       && ix86_hard_regno_mode_ok (FIRST_SSE_REG, mode2))
26359     return (GET_MODE_SIZE (mode1) == 16
26360             && ix86_hard_regno_mode_ok (FIRST_SSE_REG, mode1));
26361
26362   /* If MODE2 is appropriate for an MMX register, then tie
26363      with any other mode acceptable to MMX registers.  */
26364   if (GET_MODE_SIZE (mode2) == 8
26365       && ix86_hard_regno_mode_ok (FIRST_MMX_REG, mode2))
26366     return (GET_MODE_SIZE (mode1) == 8
26367             && ix86_hard_regno_mode_ok (FIRST_MMX_REG, mode1));
26368
26369   return false;
26370 }
26371
26372 /* Compute a (partial) cost for rtx X.  Return true if the complete
26373    cost has been computed, and false if subexpressions should be
26374    scanned.  In either case, *TOTAL contains the cost result.  */
26375
26376 static bool
26377 ix86_rtx_costs (rtx x, int code, int outer_code_i, int *total, bool speed)
26378 {
26379   enum rtx_code outer_code = (enum rtx_code) outer_code_i;
26380   enum machine_mode mode = GET_MODE (x);
26381   const struct processor_costs *cost = speed ? ix86_cost : &ix86_size_cost;
26382
26383   switch (code)
26384     {
26385     case CONST_INT:
26386     case CONST:
26387     case LABEL_REF:
26388     case SYMBOL_REF:
26389       if (TARGET_64BIT && !x86_64_immediate_operand (x, VOIDmode))
26390         *total = 3;
26391       else if (TARGET_64BIT && !x86_64_zext_immediate_operand (x, VOIDmode))
26392         *total = 2;
26393       else if (flag_pic && SYMBOLIC_CONST (x)
26394                && (!TARGET_64BIT
26395                    || (!GET_CODE (x) != LABEL_REF
26396                        && (GET_CODE (x) != SYMBOL_REF
26397                            || !SYMBOL_REF_LOCAL_P (x)))))
26398         *total = 1;
26399       else
26400         *total = 0;
26401       return true;
26402
26403     case CONST_DOUBLE:
26404       if (mode == VOIDmode)
26405         *total = 0;
26406       else
26407         switch (standard_80387_constant_p (x))
26408           {
26409           case 1: /* 0.0 */
26410             *total = 1;
26411             break;
26412           default: /* Other constants */
26413             *total = 2;
26414             break;
26415           case 0:
26416           case -1:
26417             /* Start with (MEM (SYMBOL_REF)), since that's where
26418                it'll probably end up.  Add a penalty for size.  */
26419             *total = (COSTS_N_INSNS (1)
26420                       + (flag_pic != 0 && !TARGET_64BIT)
26421                       + (mode == SFmode ? 0 : mode == DFmode ? 1 : 2));
26422             break;
26423           }
26424       return true;
26425
26426     case ZERO_EXTEND:
26427       /* The zero extensions is often completely free on x86_64, so make
26428          it as cheap as possible.  */
26429       if (TARGET_64BIT && mode == DImode
26430           && GET_MODE (XEXP (x, 0)) == SImode)
26431         *total = 1;
26432       else if (TARGET_ZERO_EXTEND_WITH_AND)
26433         *total = cost->add;
26434       else
26435         *total = cost->movzx;
26436       return false;
26437
26438     case SIGN_EXTEND:
26439       *total = cost->movsx;
26440       return false;
26441
26442     case ASHIFT:
26443       if (CONST_INT_P (XEXP (x, 1))
26444           && (GET_MODE (XEXP (x, 0)) != DImode || TARGET_64BIT))
26445         {
26446           HOST_WIDE_INT value = INTVAL (XEXP (x, 1));
26447           if (value == 1)
26448             {
26449               *total = cost->add;
26450               return false;
26451             }
26452           if ((value == 2 || value == 3)
26453               && cost->lea <= cost->shift_const)
26454             {
26455               *total = cost->lea;
26456               return false;
26457             }
26458         }
26459       /* FALLTHRU */
26460
26461     case ROTATE:
26462     case ASHIFTRT:
26463     case LSHIFTRT:
26464     case ROTATERT:
26465       if (!TARGET_64BIT && GET_MODE (XEXP (x, 0)) == DImode)
26466         {
26467           if (CONST_INT_P (XEXP (x, 1)))
26468             {
26469               if (INTVAL (XEXP (x, 1)) > 32)
26470                 *total = cost->shift_const + COSTS_N_INSNS (2);
26471               else
26472                 *total = cost->shift_const * 2;
26473             }
26474           else
26475             {
26476               if (GET_CODE (XEXP (x, 1)) == AND)
26477                 *total = cost->shift_var * 2;
26478               else
26479                 *total = cost->shift_var * 6 + COSTS_N_INSNS (2);
26480             }
26481         }
26482       else
26483         {
26484           if (CONST_INT_P (XEXP (x, 1)))
26485             *total = cost->shift_const;
26486           else
26487             *total = cost->shift_var;
26488         }
26489       return false;
26490
26491     case MULT:
26492       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
26493         {
26494           /* ??? SSE scalar cost should be used here.  */
26495           *total = cost->fmul;
26496           return false;
26497         }
26498       else if (X87_FLOAT_MODE_P (mode))
26499         {
26500           *total = cost->fmul;
26501           return false;
26502         }
26503       else if (FLOAT_MODE_P (mode))
26504         {
26505           /* ??? SSE vector cost should be used here.  */
26506           *total = cost->fmul;
26507           return false;
26508         }
26509       else
26510         {
26511           rtx op0 = XEXP (x, 0);
26512           rtx op1 = XEXP (x, 1);
26513           int nbits;
26514           if (CONST_INT_P (XEXP (x, 1)))
26515             {
26516               unsigned HOST_WIDE_INT value = INTVAL (XEXP (x, 1));
26517               for (nbits = 0; value != 0; value &= value - 1)
26518                 nbits++;
26519             }
26520           else
26521             /* This is arbitrary.  */
26522             nbits = 7;
26523
26524           /* Compute costs correctly for widening multiplication.  */
26525           if ((GET_CODE (op0) == SIGN_EXTEND || GET_CODE (op0) == ZERO_EXTEND)
26526               && GET_MODE_SIZE (GET_MODE (XEXP (op0, 0))) * 2
26527                  == GET_MODE_SIZE (mode))
26528             {
26529               int is_mulwiden = 0;
26530               enum machine_mode inner_mode = GET_MODE (op0);
26531
26532               if (GET_CODE (op0) == GET_CODE (op1))
26533                 is_mulwiden = 1, op1 = XEXP (op1, 0);
26534               else if (CONST_INT_P (op1))
26535                 {
26536                   if (GET_CODE (op0) == SIGN_EXTEND)
26537                     is_mulwiden = trunc_int_for_mode (INTVAL (op1), inner_mode)
26538                                   == INTVAL (op1);
26539                   else
26540                     is_mulwiden = !(INTVAL (op1) & ~GET_MODE_MASK (inner_mode));
26541                 }
26542
26543               if (is_mulwiden)
26544                 op0 = XEXP (op0, 0), mode = GET_MODE (op0);
26545             }
26546
26547           *total = (cost->mult_init[MODE_INDEX (mode)]
26548                     + nbits * cost->mult_bit
26549                     + rtx_cost (op0, outer_code, speed) + rtx_cost (op1, outer_code, speed));
26550
26551           return true;
26552         }
26553
26554     case DIV:
26555     case UDIV:
26556     case MOD:
26557     case UMOD:
26558       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
26559         /* ??? SSE cost should be used here.  */
26560         *total = cost->fdiv;
26561       else if (X87_FLOAT_MODE_P (mode))
26562         *total = cost->fdiv;
26563       else if (FLOAT_MODE_P (mode))
26564         /* ??? SSE vector cost should be used here.  */
26565         *total = cost->fdiv;
26566       else
26567         *total = cost->divide[MODE_INDEX (mode)];
26568       return false;
26569
26570     case PLUS:
26571       if (GET_MODE_CLASS (mode) == MODE_INT
26572                && GET_MODE_BITSIZE (mode) <= GET_MODE_BITSIZE (Pmode))
26573         {
26574           if (GET_CODE (XEXP (x, 0)) == PLUS
26575               && GET_CODE (XEXP (XEXP (x, 0), 0)) == MULT
26576               && CONST_INT_P (XEXP (XEXP (XEXP (x, 0), 0), 1))
26577               && CONSTANT_P (XEXP (x, 1)))
26578             {
26579               HOST_WIDE_INT val = INTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1));
26580               if (val == 2 || val == 4 || val == 8)
26581                 {
26582                   *total = cost->lea;
26583                   *total += rtx_cost (XEXP (XEXP (x, 0), 1), outer_code, speed);
26584                   *total += rtx_cost (XEXP (XEXP (XEXP (x, 0), 0), 0),
26585                                       outer_code, speed);
26586                   *total += rtx_cost (XEXP (x, 1), outer_code, speed);
26587                   return true;
26588                 }
26589             }
26590           else if (GET_CODE (XEXP (x, 0)) == MULT
26591                    && CONST_INT_P (XEXP (XEXP (x, 0), 1)))
26592             {
26593               HOST_WIDE_INT val = INTVAL (XEXP (XEXP (x, 0), 1));
26594               if (val == 2 || val == 4 || val == 8)
26595                 {
26596                   *total = cost->lea;
26597                   *total += rtx_cost (XEXP (XEXP (x, 0), 0), outer_code, speed);
26598                   *total += rtx_cost (XEXP (x, 1), outer_code, speed);
26599                   return true;
26600                 }
26601             }
26602           else if (GET_CODE (XEXP (x, 0)) == PLUS)
26603             {
26604               *total = cost->lea;
26605               *total += rtx_cost (XEXP (XEXP (x, 0), 0), outer_code, speed);
26606               *total += rtx_cost (XEXP (XEXP (x, 0), 1), outer_code, speed);
26607               *total += rtx_cost (XEXP (x, 1), outer_code, speed);
26608               return true;
26609             }
26610         }
26611       /* FALLTHRU */
26612
26613     case MINUS:
26614       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
26615         {
26616           /* ??? SSE cost should be used here.  */
26617           *total = cost->fadd;
26618           return false;
26619         }
26620       else if (X87_FLOAT_MODE_P (mode))
26621         {
26622           *total = cost->fadd;
26623           return false;
26624         }
26625       else if (FLOAT_MODE_P (mode))
26626         {
26627           /* ??? SSE vector cost should be used here.  */
26628           *total = cost->fadd;
26629           return false;
26630         }
26631       /* FALLTHRU */
26632
26633     case AND:
26634     case IOR:
26635     case XOR:
26636       if (!TARGET_64BIT && mode == DImode)
26637         {
26638           *total = (cost->add * 2
26639                     + (rtx_cost (XEXP (x, 0), outer_code, speed)
26640                        << (GET_MODE (XEXP (x, 0)) != DImode))
26641                     + (rtx_cost (XEXP (x, 1), outer_code, speed)
26642                        << (GET_MODE (XEXP (x, 1)) != DImode)));
26643           return true;
26644         }
26645       /* FALLTHRU */
26646
26647     case NEG:
26648       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
26649         {
26650           /* ??? SSE cost should be used here.  */
26651           *total = cost->fchs;
26652           return false;
26653         }
26654       else if (X87_FLOAT_MODE_P (mode))
26655         {
26656           *total = cost->fchs;
26657           return false;
26658         }
26659       else if (FLOAT_MODE_P (mode))
26660         {
26661           /* ??? SSE vector cost should be used here.  */
26662           *total = cost->fchs;
26663           return false;
26664         }
26665       /* FALLTHRU */
26666
26667     case NOT:
26668       if (!TARGET_64BIT && mode == DImode)
26669         *total = cost->add * 2;
26670       else
26671         *total = cost->add;
26672       return false;
26673
26674     case COMPARE:
26675       if (GET_CODE (XEXP (x, 0)) == ZERO_EXTRACT
26676           && XEXP (XEXP (x, 0), 1) == const1_rtx
26677           && CONST_INT_P (XEXP (XEXP (x, 0), 2))
26678           && XEXP (x, 1) == const0_rtx)
26679         {
26680           /* This kind of construct is implemented using test[bwl].
26681              Treat it as if we had an AND.  */
26682           *total = (cost->add
26683                     + rtx_cost (XEXP (XEXP (x, 0), 0), outer_code, speed)
26684                     + rtx_cost (const1_rtx, outer_code, speed));
26685           return true;
26686         }
26687       return false;
26688
26689     case FLOAT_EXTEND:
26690       if (!(SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH))
26691         *total = 0;
26692       return false;
26693
26694     case ABS:
26695       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
26696         /* ??? SSE cost should be used here.  */
26697         *total = cost->fabs;
26698       else if (X87_FLOAT_MODE_P (mode))
26699         *total = cost->fabs;
26700       else if (FLOAT_MODE_P (mode))
26701         /* ??? SSE vector cost should be used here.  */
26702         *total = cost->fabs;
26703       return false;
26704
26705     case SQRT:
26706       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
26707         /* ??? SSE cost should be used here.  */
26708         *total = cost->fsqrt;
26709       else if (X87_FLOAT_MODE_P (mode))
26710         *total = cost->fsqrt;
26711       else if (FLOAT_MODE_P (mode))
26712         /* ??? SSE vector cost should be used here.  */
26713         *total = cost->fsqrt;
26714       return false;
26715
26716     case UNSPEC:
26717       if (XINT (x, 1) == UNSPEC_TP)
26718         *total = 0;
26719       return false;
26720
26721     default:
26722       return false;
26723     }
26724 }
26725
26726 #if TARGET_MACHO
26727
26728 static int current_machopic_label_num;
26729
26730 /* Given a symbol name and its associated stub, write out the
26731    definition of the stub.  */
26732
26733 void
26734 machopic_output_stub (FILE *file, const char *symb, const char *stub)
26735 {
26736   unsigned int length;
26737   char *binder_name, *symbol_name, lazy_ptr_name[32];
26738   int label = ++current_machopic_label_num;
26739
26740   /* For 64-bit we shouldn't get here.  */
26741   gcc_assert (!TARGET_64BIT);
26742
26743   /* Lose our funky encoding stuff so it doesn't contaminate the stub.  */
26744   symb = (*targetm.strip_name_encoding) (symb);
26745
26746   length = strlen (stub);
26747   binder_name = XALLOCAVEC (char, length + 32);
26748   GEN_BINDER_NAME_FOR_STUB (binder_name, stub, length);
26749
26750   length = strlen (symb);
26751   symbol_name = XALLOCAVEC (char, length + 32);
26752   GEN_SYMBOL_NAME_FOR_SYMBOL (symbol_name, symb, length);
26753
26754   sprintf (lazy_ptr_name, "L%d$lz", label);
26755
26756   if (MACHOPIC_PURE)
26757     switch_to_section (darwin_sections[machopic_picsymbol_stub_section]);
26758   else
26759     switch_to_section (darwin_sections[machopic_symbol_stub_section]);
26760
26761   fprintf (file, "%s:\n", stub);
26762   fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
26763
26764   if (MACHOPIC_PURE)
26765     {
26766       fprintf (file, "\tcall\tLPC$%d\nLPC$%d:\tpopl\t%%eax\n", label, label);
26767       fprintf (file, "\tmovl\t%s-LPC$%d(%%eax),%%edx\n", lazy_ptr_name, label);
26768       fprintf (file, "\tjmp\t*%%edx\n");
26769     }
26770   else
26771     fprintf (file, "\tjmp\t*%s\n", lazy_ptr_name);
26772
26773   fprintf (file, "%s:\n", binder_name);
26774
26775   if (MACHOPIC_PURE)
26776     {
26777       fprintf (file, "\tlea\t%s-LPC$%d(%%eax),%%eax\n", lazy_ptr_name, label);
26778       fprintf (file, "\tpushl\t%%eax\n");
26779     }
26780   else
26781     fprintf (file, "\tpushl\t$%s\n", lazy_ptr_name);
26782
26783   fprintf (file, "\tjmp\tdyld_stub_binding_helper\n");
26784
26785   switch_to_section (darwin_sections[machopic_lazy_symbol_ptr_section]);
26786   fprintf (file, "%s:\n", lazy_ptr_name);
26787   fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
26788   fprintf (file, "\t.long %s\n", binder_name);
26789 }
26790
26791 void
26792 darwin_x86_file_end (void)
26793 {
26794   darwin_file_end ();
26795   ix86_file_end ();
26796 }
26797 #endif /* TARGET_MACHO */
26798
26799 /* Order the registers for register allocator.  */
26800
26801 void
26802 x86_order_regs_for_local_alloc (void)
26803 {
26804    int pos = 0;
26805    int i;
26806
26807    /* First allocate the local general purpose registers.  */
26808    for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
26809      if (GENERAL_REGNO_P (i) && call_used_regs[i])
26810         reg_alloc_order [pos++] = i;
26811
26812    /* Global general purpose registers.  */
26813    for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
26814      if (GENERAL_REGNO_P (i) && !call_used_regs[i])
26815         reg_alloc_order [pos++] = i;
26816
26817    /* x87 registers come first in case we are doing FP math
26818       using them.  */
26819    if (!TARGET_SSE_MATH)
26820      for (i = FIRST_STACK_REG; i <= LAST_STACK_REG; i++)
26821        reg_alloc_order [pos++] = i;
26822
26823    /* SSE registers.  */
26824    for (i = FIRST_SSE_REG; i <= LAST_SSE_REG; i++)
26825      reg_alloc_order [pos++] = i;
26826    for (i = FIRST_REX_SSE_REG; i <= LAST_REX_SSE_REG; i++)
26827      reg_alloc_order [pos++] = i;
26828
26829    /* x87 registers.  */
26830    if (TARGET_SSE_MATH)
26831      for (i = FIRST_STACK_REG; i <= LAST_STACK_REG; i++)
26832        reg_alloc_order [pos++] = i;
26833
26834    for (i = FIRST_MMX_REG; i <= LAST_MMX_REG; i++)
26835      reg_alloc_order [pos++] = i;
26836
26837    /* Initialize the rest of array as we do not allocate some registers
26838       at all.  */
26839    while (pos < FIRST_PSEUDO_REGISTER)
26840      reg_alloc_order [pos++] = 0;
26841 }
26842
26843 /* Handle a "ms_abi" or "sysv" attribute; arguments as in
26844    struct attribute_spec.handler.  */
26845 static tree
26846 ix86_handle_abi_attribute (tree *node, tree name,
26847                               tree args ATTRIBUTE_UNUSED,
26848                               int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
26849 {
26850   if (TREE_CODE (*node) != FUNCTION_TYPE
26851       && TREE_CODE (*node) != METHOD_TYPE
26852       && TREE_CODE (*node) != FIELD_DECL
26853       && TREE_CODE (*node) != TYPE_DECL)
26854     {
26855       warning (OPT_Wattributes, "%qE attribute only applies to functions",
26856                name);
26857       *no_add_attrs = true;
26858       return NULL_TREE;
26859     }
26860   if (!TARGET_64BIT)
26861     {
26862       warning (OPT_Wattributes, "%qE attribute only available for 64-bit",
26863                name);
26864       *no_add_attrs = true;
26865       return NULL_TREE;
26866     }
26867
26868   /* Can combine regparm with all attributes but fastcall.  */
26869   if (is_attribute_p ("ms_abi", name))
26870     {
26871       if (lookup_attribute ("sysv_abi", TYPE_ATTRIBUTES (*node)))
26872         {
26873           error ("ms_abi and sysv_abi attributes are not compatible");
26874         }
26875
26876       return NULL_TREE;
26877     }
26878   else if (is_attribute_p ("sysv_abi", name))
26879     {
26880       if (lookup_attribute ("ms_abi", TYPE_ATTRIBUTES (*node)))
26881         {
26882           error ("ms_abi and sysv_abi attributes are not compatible");
26883         }
26884
26885       return NULL_TREE;
26886     }
26887
26888   return NULL_TREE;
26889 }
26890
26891 /* Handle a "ms_struct" or "gcc_struct" attribute; arguments as in
26892    struct attribute_spec.handler.  */
26893 static tree
26894 ix86_handle_struct_attribute (tree *node, tree name,
26895                               tree args ATTRIBUTE_UNUSED,
26896                               int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
26897 {
26898   tree *type = NULL;
26899   if (DECL_P (*node))
26900     {
26901       if (TREE_CODE (*node) == TYPE_DECL)
26902         type = &TREE_TYPE (*node);
26903     }
26904   else
26905     type = node;
26906
26907   if (!(type && (TREE_CODE (*type) == RECORD_TYPE
26908                  || TREE_CODE (*type) == UNION_TYPE)))
26909     {
26910       warning (OPT_Wattributes, "%qE attribute ignored",
26911                name);
26912       *no_add_attrs = true;
26913     }
26914
26915   else if ((is_attribute_p ("ms_struct", name)
26916             && lookup_attribute ("gcc_struct", TYPE_ATTRIBUTES (*type)))
26917            || ((is_attribute_p ("gcc_struct", name)
26918                 && lookup_attribute ("ms_struct", TYPE_ATTRIBUTES (*type)))))
26919     {
26920       warning (OPT_Wattributes, "%qE incompatible attribute ignored",
26921                name);
26922       *no_add_attrs = true;
26923     }
26924
26925   return NULL_TREE;
26926 }
26927
26928 static bool
26929 ix86_ms_bitfield_layout_p (const_tree record_type)
26930 {
26931   return (TARGET_MS_BITFIELD_LAYOUT &&
26932           !lookup_attribute ("gcc_struct", TYPE_ATTRIBUTES (record_type)))
26933     || lookup_attribute ("ms_struct", TYPE_ATTRIBUTES (record_type));
26934 }
26935
26936 /* Returns an expression indicating where the this parameter is
26937    located on entry to the FUNCTION.  */
26938
26939 static rtx
26940 x86_this_parameter (tree function)
26941 {
26942   tree type = TREE_TYPE (function);
26943   bool aggr = aggregate_value_p (TREE_TYPE (type), type) != 0;
26944   int nregs;
26945
26946   if (TARGET_64BIT)
26947     {
26948       const int *parm_regs;
26949
26950       if (ix86_function_type_abi (type) == MS_ABI)
26951         parm_regs = x86_64_ms_abi_int_parameter_registers;
26952       else
26953         parm_regs = x86_64_int_parameter_registers;
26954       return gen_rtx_REG (DImode, parm_regs[aggr]);
26955     }
26956
26957   nregs = ix86_function_regparm (type, function);
26958
26959   if (nregs > 0 && !stdarg_p (type))
26960     {
26961       int regno;
26962
26963       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (type)))
26964         regno = aggr ? DX_REG : CX_REG;
26965       else
26966         {
26967           regno = AX_REG;
26968           if (aggr)
26969             {
26970               regno = DX_REG;
26971               if (nregs == 1)
26972                 return gen_rtx_MEM (SImode,
26973                                     plus_constant (stack_pointer_rtx, 4));
26974             }
26975         }
26976       return gen_rtx_REG (SImode, regno);
26977     }
26978
26979   return gen_rtx_MEM (SImode, plus_constant (stack_pointer_rtx, aggr ? 8 : 4));
26980 }
26981
26982 /* Determine whether x86_output_mi_thunk can succeed.  */
26983
26984 static bool
26985 x86_can_output_mi_thunk (const_tree thunk ATTRIBUTE_UNUSED,
26986                          HOST_WIDE_INT delta ATTRIBUTE_UNUSED,
26987                          HOST_WIDE_INT vcall_offset, const_tree function)
26988 {
26989   /* 64-bit can handle anything.  */
26990   if (TARGET_64BIT)
26991     return true;
26992
26993   /* For 32-bit, everything's fine if we have one free register.  */
26994   if (ix86_function_regparm (TREE_TYPE (function), function) < 3)
26995     return true;
26996
26997   /* Need a free register for vcall_offset.  */
26998   if (vcall_offset)
26999     return false;
27000
27001   /* Need a free register for GOT references.  */
27002   if (flag_pic && !(*targetm.binds_local_p) (function))
27003     return false;
27004
27005   /* Otherwise ok.  */
27006   return true;
27007 }
27008
27009 /* Output the assembler code for a thunk function.  THUNK_DECL is the
27010    declaration for the thunk function itself, FUNCTION is the decl for
27011    the target function.  DELTA is an immediate constant offset to be
27012    added to THIS.  If VCALL_OFFSET is nonzero, the word at
27013    *(*this + vcall_offset) should be added to THIS.  */
27014
27015 static void
27016 x86_output_mi_thunk (FILE *file ATTRIBUTE_UNUSED,
27017                      tree thunk ATTRIBUTE_UNUSED, HOST_WIDE_INT delta,
27018                      HOST_WIDE_INT vcall_offset, tree function)
27019 {
27020   rtx xops[3];
27021   rtx this_param = x86_this_parameter (function);
27022   rtx this_reg, tmp;
27023
27024   /* If VCALL_OFFSET, we'll need THIS in a register.  Might as well
27025      pull it in now and let DELTA benefit.  */
27026   if (REG_P (this_param))
27027     this_reg = this_param;
27028   else if (vcall_offset)
27029     {
27030       /* Put the this parameter into %eax.  */
27031       xops[0] = this_param;
27032       xops[1] = this_reg = gen_rtx_REG (Pmode, AX_REG);
27033       output_asm_insn ("mov%z1\t{%0, %1|%1, %0}", xops);
27034     }
27035   else
27036     this_reg = NULL_RTX;
27037
27038   /* Adjust the this parameter by a fixed constant.  */
27039   if (delta)
27040     {
27041       xops[0] = GEN_INT (delta);
27042       xops[1] = this_reg ? this_reg : this_param;
27043       if (TARGET_64BIT)
27044         {
27045           if (!x86_64_general_operand (xops[0], DImode))
27046             {
27047               tmp = gen_rtx_REG (DImode, R10_REG);
27048               xops[1] = tmp;
27049               output_asm_insn ("mov{q}\t{%1, %0|%0, %1}", xops);
27050               xops[0] = tmp;
27051               xops[1] = this_param;
27052             }
27053           output_asm_insn ("add{q}\t{%0, %1|%1, %0}", xops);
27054         }
27055       else
27056         output_asm_insn ("add{l}\t{%0, %1|%1, %0}", xops);
27057     }
27058
27059   /* Adjust the this parameter by a value stored in the vtable.  */
27060   if (vcall_offset)
27061     {
27062       if (TARGET_64BIT)
27063         tmp = gen_rtx_REG (DImode, R10_REG);
27064       else
27065         {
27066           int tmp_regno = CX_REG;
27067           if (lookup_attribute ("fastcall",
27068                                 TYPE_ATTRIBUTES (TREE_TYPE (function))))
27069             tmp_regno = AX_REG;
27070           tmp = gen_rtx_REG (SImode, tmp_regno);
27071         }
27072
27073       xops[0] = gen_rtx_MEM (Pmode, this_reg);
27074       xops[1] = tmp;
27075       output_asm_insn ("mov%z1\t{%0, %1|%1, %0}", xops);
27076
27077       /* Adjust the this parameter.  */
27078       xops[0] = gen_rtx_MEM (Pmode, plus_constant (tmp, vcall_offset));
27079       if (TARGET_64BIT && !memory_operand (xops[0], Pmode))
27080         {
27081           rtx tmp2 = gen_rtx_REG (DImode, R11_REG);
27082           xops[0] = GEN_INT (vcall_offset);
27083           xops[1] = tmp2;
27084           output_asm_insn ("mov{q}\t{%0, %1|%1, %0}", xops);
27085           xops[0] = gen_rtx_MEM (Pmode, gen_rtx_PLUS (Pmode, tmp, tmp2));
27086         }
27087       xops[1] = this_reg;
27088       output_asm_insn ("add%z1\t{%0, %1|%1, %0}", xops);
27089     }
27090
27091   /* If necessary, drop THIS back to its stack slot.  */
27092   if (this_reg && this_reg != this_param)
27093     {
27094       xops[0] = this_reg;
27095       xops[1] = this_param;
27096       output_asm_insn ("mov%z1\t{%0, %1|%1, %0}", xops);
27097     }
27098
27099   xops[0] = XEXP (DECL_RTL (function), 0);
27100   if (TARGET_64BIT)
27101     {
27102       if (!flag_pic || (*targetm.binds_local_p) (function))
27103         output_asm_insn ("jmp\t%P0", xops);
27104       /* All thunks should be in the same object as their target,
27105          and thus binds_local_p should be true.  */
27106       else if (TARGET_64BIT && cfun->machine->call_abi == MS_ABI)
27107         gcc_unreachable ();
27108       else
27109         {
27110           tmp = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, xops[0]), UNSPEC_GOTPCREL);
27111           tmp = gen_rtx_CONST (Pmode, tmp);
27112           tmp = gen_rtx_MEM (QImode, tmp);
27113           xops[0] = tmp;
27114           output_asm_insn ("jmp\t%A0", xops);
27115         }
27116     }
27117   else
27118     {
27119       if (!flag_pic || (*targetm.binds_local_p) (function))
27120         output_asm_insn ("jmp\t%P0", xops);
27121       else
27122 #if TARGET_MACHO
27123         if (TARGET_MACHO)
27124           {
27125             rtx sym_ref = XEXP (DECL_RTL (function), 0);
27126             tmp = (gen_rtx_SYMBOL_REF
27127                    (Pmode,
27128                     machopic_indirection_name (sym_ref, /*stub_p=*/true)));
27129             tmp = gen_rtx_MEM (QImode, tmp);
27130             xops[0] = tmp;
27131             output_asm_insn ("jmp\t%0", xops);
27132           }
27133         else
27134 #endif /* TARGET_MACHO */
27135         {
27136           tmp = gen_rtx_REG (SImode, CX_REG);
27137           output_set_got (tmp, NULL_RTX);
27138
27139           xops[1] = tmp;
27140           output_asm_insn ("mov{l}\t{%0@GOT(%1), %1|%1, %0@GOT[%1]}", xops);
27141           output_asm_insn ("jmp\t{*}%1", xops);
27142         }
27143     }
27144 }
27145
27146 static void
27147 x86_file_start (void)
27148 {
27149   default_file_start ();
27150 #if TARGET_MACHO
27151   darwin_file_start ();
27152 #endif
27153   if (X86_FILE_START_VERSION_DIRECTIVE)
27154     fputs ("\t.version\t\"01.01\"\n", asm_out_file);
27155   if (X86_FILE_START_FLTUSED)
27156     fputs ("\t.global\t__fltused\n", asm_out_file);
27157   if (ix86_asm_dialect == ASM_INTEL)
27158     fputs ("\t.intel_syntax noprefix\n", asm_out_file);
27159 }
27160
27161 int
27162 x86_field_alignment (tree field, int computed)
27163 {
27164   enum machine_mode mode;
27165   tree type = TREE_TYPE (field);
27166
27167   if (TARGET_64BIT || TARGET_ALIGN_DOUBLE)
27168     return computed;
27169   mode = TYPE_MODE (strip_array_types (type));
27170   if (mode == DFmode || mode == DCmode
27171       || GET_MODE_CLASS (mode) == MODE_INT
27172       || GET_MODE_CLASS (mode) == MODE_COMPLEX_INT)
27173     return MIN (32, computed);
27174   return computed;
27175 }
27176
27177 /* Output assembler code to FILE to increment profiler label # LABELNO
27178    for profiling a function entry.  */
27179 void
27180 x86_function_profiler (FILE *file, int labelno ATTRIBUTE_UNUSED)
27181 {
27182   if (TARGET_64BIT)
27183     {
27184 #ifndef NO_PROFILE_COUNTERS
27185       fprintf (file, "\tleaq\t%sP%d@(%%rip),%%r11\n", LPREFIX, labelno);
27186 #endif
27187
27188       if (DEFAULT_ABI == SYSV_ABI && flag_pic)
27189         fprintf (file, "\tcall\t*%s@GOTPCREL(%%rip)\n", MCOUNT_NAME);
27190       else
27191         fprintf (file, "\tcall\t%s\n", MCOUNT_NAME);
27192     }
27193   else if (flag_pic)
27194     {
27195 #ifndef NO_PROFILE_COUNTERS
27196       fprintf (file, "\tleal\t%sP%d@GOTOFF(%%ebx),%%%s\n",
27197                LPREFIX, labelno, PROFILE_COUNT_REGISTER);
27198 #endif
27199       fprintf (file, "\tcall\t*%s@GOT(%%ebx)\n", MCOUNT_NAME);
27200     }
27201   else
27202     {
27203 #ifndef NO_PROFILE_COUNTERS
27204       fprintf (file, "\tmovl\t$%sP%d,%%%s\n", LPREFIX, labelno,
27205                PROFILE_COUNT_REGISTER);
27206 #endif
27207       fprintf (file, "\tcall\t%s\n", MCOUNT_NAME);
27208     }
27209 }
27210
27211 #ifdef ASM_OUTPUT_MAX_SKIP_PAD
27212 /* We don't have exact information about the insn sizes, but we may assume
27213    quite safely that we are informed about all 1 byte insns and memory
27214    address sizes.  This is enough to eliminate unnecessary padding in
27215    99% of cases.  */
27216
27217 static int
27218 min_insn_size (rtx insn)
27219 {
27220   int l = 0;
27221
27222   if (!INSN_P (insn) || !active_insn_p (insn))
27223     return 0;
27224
27225   /* Discard alignments we've emit and jump instructions.  */
27226   if (GET_CODE (PATTERN (insn)) == UNSPEC_VOLATILE
27227       && XINT (PATTERN (insn), 1) == UNSPECV_ALIGN)
27228     return 0;
27229   if (JUMP_P (insn)
27230       && (GET_CODE (PATTERN (insn)) == ADDR_VEC
27231           || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC))
27232     return 0;
27233
27234   /* Important case - calls are always 5 bytes.
27235      It is common to have many calls in the row.  */
27236   if (CALL_P (insn)
27237       && symbolic_reference_mentioned_p (PATTERN (insn))
27238       && !SIBLING_CALL_P (insn))
27239     return 5;
27240   if (get_attr_length (insn) <= 1)
27241     return 1;
27242
27243   /* For normal instructions we may rely on the sizes of addresses
27244      and the presence of symbol to require 4 bytes of encoding.
27245      This is not the case for jumps where references are PC relative.  */
27246   if (!JUMP_P (insn))
27247     {
27248       l = get_attr_length_address (insn);
27249       if (l < 4 && symbolic_reference_mentioned_p (PATTERN (insn)))
27250         l = 4;
27251     }
27252   if (l)
27253     return 1+l;
27254   else
27255     return 2;
27256 }
27257
27258 /* AMD K8 core mispredicts jumps when there are more than 3 jumps in 16 byte
27259    window.  */
27260
27261 static void
27262 ix86_avoid_jump_mispredicts (void)
27263 {
27264   rtx insn, start = get_insns ();
27265   int nbytes = 0, njumps = 0;
27266   int isjump = 0;
27267
27268   /* Look for all minimal intervals of instructions containing 4 jumps.
27269      The intervals are bounded by START and INSN.  NBYTES is the total
27270      size of instructions in the interval including INSN and not including
27271      START.  When the NBYTES is smaller than 16 bytes, it is possible
27272      that the end of START and INSN ends up in the same 16byte page.
27273
27274      The smallest offset in the page INSN can start is the case where START
27275      ends on the offset 0.  Offset of INSN is then NBYTES - sizeof (INSN).
27276      We add p2align to 16byte window with maxskip 15 - NBYTES + sizeof (INSN).
27277      */
27278   for (insn = start; insn; insn = NEXT_INSN (insn))
27279     {
27280       int min_size;
27281
27282       if (GET_CODE (insn) == CODE_LABEL)
27283         {
27284           int align = label_to_alignment (insn);
27285           int max_skip = label_to_max_skip (insn);
27286
27287           if (max_skip > 15)
27288             max_skip = 15;
27289           /* If align > 3, only up to 16 - max_skip - 1 bytes can be
27290              already in the current 16 byte page, because otherwise
27291              ASM_OUTPUT_MAX_SKIP_ALIGN could skip max_skip or fewer
27292              bytes to reach 16 byte boundary.  */
27293           if (align <= 0
27294               || (align <= 3 && max_skip != (1 << align) - 1))
27295             max_skip = 0;
27296           if (dump_file)
27297             fprintf (dump_file, "Label %i with max_skip %i\n",
27298                      INSN_UID (insn), max_skip);
27299           if (max_skip)
27300             {
27301               while (nbytes + max_skip >= 16)
27302                 {
27303                   start = NEXT_INSN (start);
27304                   if ((JUMP_P (start)
27305                        && GET_CODE (PATTERN (start)) != ADDR_VEC
27306                        && GET_CODE (PATTERN (start)) != ADDR_DIFF_VEC)
27307                       || CALL_P (start))
27308                     njumps--, isjump = 1;
27309                   else
27310                     isjump = 0;
27311                   nbytes -= min_insn_size (start);
27312                 }
27313             }
27314           continue;
27315         }
27316
27317       min_size = min_insn_size (insn);
27318       nbytes += min_size;
27319       if (dump_file)
27320         fprintf (dump_file, "Insn %i estimated to %i bytes\n",
27321                  INSN_UID (insn), min_size);
27322       if ((JUMP_P (insn)
27323            && GET_CODE (PATTERN (insn)) != ADDR_VEC
27324            && GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC)
27325           || CALL_P (insn))
27326         njumps++;
27327       else
27328         continue;
27329
27330       while (njumps > 3)
27331         {
27332           start = NEXT_INSN (start);
27333           if ((JUMP_P (start)
27334                && GET_CODE (PATTERN (start)) != ADDR_VEC
27335                && GET_CODE (PATTERN (start)) != ADDR_DIFF_VEC)
27336               || CALL_P (start))
27337             njumps--, isjump = 1;
27338           else
27339             isjump = 0;
27340           nbytes -= min_insn_size (start);
27341         }
27342       gcc_assert (njumps >= 0);
27343       if (dump_file)
27344         fprintf (dump_file, "Interval %i to %i has %i bytes\n",
27345                  INSN_UID (start), INSN_UID (insn), nbytes);
27346
27347       if (njumps == 3 && isjump && nbytes < 16)
27348         {
27349           int padsize = 15 - nbytes + min_insn_size (insn);
27350
27351           if (dump_file)
27352             fprintf (dump_file, "Padding insn %i by %i bytes!\n",
27353                      INSN_UID (insn), padsize);
27354           emit_insn_before (gen_pad (GEN_INT (padsize)), insn);
27355         }
27356     }
27357 }
27358 #endif
27359
27360 /* AMD Athlon works faster
27361    when RET is not destination of conditional jump or directly preceded
27362    by other jump instruction.  We avoid the penalty by inserting NOP just
27363    before the RET instructions in such cases.  */
27364 static void
27365 ix86_pad_returns (void)
27366 {
27367   edge e;
27368   edge_iterator ei;
27369
27370   FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
27371     {
27372       basic_block bb = e->src;
27373       rtx ret = BB_END (bb);
27374       rtx prev;
27375       bool replace = false;
27376
27377       if (!JUMP_P (ret) || GET_CODE (PATTERN (ret)) != RETURN
27378           || optimize_bb_for_size_p (bb))
27379         continue;
27380       for (prev = PREV_INSN (ret); prev; prev = PREV_INSN (prev))
27381         if (active_insn_p (prev) || LABEL_P (prev))
27382           break;
27383       if (prev && LABEL_P (prev))
27384         {
27385           edge e;
27386           edge_iterator ei;
27387
27388           FOR_EACH_EDGE (e, ei, bb->preds)
27389             if (EDGE_FREQUENCY (e) && e->src->index >= 0
27390                 && !(e->flags & EDGE_FALLTHRU))
27391               replace = true;
27392         }
27393       if (!replace)
27394         {
27395           prev = prev_active_insn (ret);
27396           if (prev
27397               && ((JUMP_P (prev) && any_condjump_p (prev))
27398                   || CALL_P (prev)))
27399             replace = true;
27400           /* Empty functions get branch mispredict even when the jump destination
27401              is not visible to us.  */
27402           if (!prev && cfun->function_frequency > FUNCTION_FREQUENCY_UNLIKELY_EXECUTED)
27403             replace = true;
27404         }
27405       if (replace)
27406         {
27407           emit_insn_before (gen_return_internal_long (), ret);
27408           delete_insn (ret);
27409         }
27410     }
27411 }
27412
27413 /* Implement machine specific optimizations.  We implement padding of returns
27414    for K8 CPUs and pass to avoid 4 jumps in the single 16 byte window.  */
27415 static void
27416 ix86_reorg (void)
27417 {
27418   if (optimize && optimize_function_for_speed_p (cfun))
27419     {
27420       if (TARGET_PAD_RETURNS)
27421         ix86_pad_returns ();
27422 #ifdef ASM_OUTPUT_MAX_SKIP_PAD
27423       if (TARGET_FOUR_JUMP_LIMIT)
27424         ix86_avoid_jump_mispredicts ();
27425 #endif
27426     }
27427 }
27428
27429 /* Return nonzero when QImode register that must be represented via REX prefix
27430    is used.  */
27431 bool
27432 x86_extended_QIreg_mentioned_p (rtx insn)
27433 {
27434   int i;
27435   extract_insn_cached (insn);
27436   for (i = 0; i < recog_data.n_operands; i++)
27437     if (REG_P (recog_data.operand[i])
27438         && REGNO (recog_data.operand[i]) > BX_REG)
27439        return true;
27440   return false;
27441 }
27442
27443 /* Return nonzero when P points to register encoded via REX prefix.
27444    Called via for_each_rtx.  */
27445 static int
27446 extended_reg_mentioned_1 (rtx *p, void *data ATTRIBUTE_UNUSED)
27447 {
27448    unsigned int regno;
27449    if (!REG_P (*p))
27450      return 0;
27451    regno = REGNO (*p);
27452    return REX_INT_REGNO_P (regno) || REX_SSE_REGNO_P (regno);
27453 }
27454
27455 /* Return true when INSN mentions register that must be encoded using REX
27456    prefix.  */
27457 bool
27458 x86_extended_reg_mentioned_p (rtx insn)
27459 {
27460   return for_each_rtx (INSN_P (insn) ? &PATTERN (insn) : &insn,
27461                        extended_reg_mentioned_1, NULL);
27462 }
27463
27464 /* Generate an unsigned DImode/SImode to FP conversion.  This is the same code
27465    optabs would emit if we didn't have TFmode patterns.  */
27466
27467 void
27468 x86_emit_floatuns (rtx operands[2])
27469 {
27470   rtx neglab, donelab, i0, i1, f0, in, out;
27471   enum machine_mode mode, inmode;
27472
27473   inmode = GET_MODE (operands[1]);
27474   gcc_assert (inmode == SImode || inmode == DImode);
27475
27476   out = operands[0];
27477   in = force_reg (inmode, operands[1]);
27478   mode = GET_MODE (out);
27479   neglab = gen_label_rtx ();
27480   donelab = gen_label_rtx ();
27481   f0 = gen_reg_rtx (mode);
27482
27483   emit_cmp_and_jump_insns (in, const0_rtx, LT, const0_rtx, inmode, 0, neglab);
27484
27485   expand_float (out, in, 0);
27486
27487   emit_jump_insn (gen_jump (donelab));
27488   emit_barrier ();
27489
27490   emit_label (neglab);
27491
27492   i0 = expand_simple_binop (inmode, LSHIFTRT, in, const1_rtx, NULL,
27493                             1, OPTAB_DIRECT);
27494   i1 = expand_simple_binop (inmode, AND, in, const1_rtx, NULL,
27495                             1, OPTAB_DIRECT);
27496   i0 = expand_simple_binop (inmode, IOR, i0, i1, i0, 1, OPTAB_DIRECT);
27497
27498   expand_float (f0, i0, 0);
27499
27500   emit_insn (gen_rtx_SET (VOIDmode, out, gen_rtx_PLUS (mode, f0, f0)));
27501
27502   emit_label (donelab);
27503 }
27504 \f
27505 /* A subroutine of ix86_expand_vector_init.  Store into TARGET a vector
27506    with all elements equal to VAR.  Return true if successful.  */
27507
27508 static bool
27509 ix86_expand_vector_init_duplicate (bool mmx_ok, enum machine_mode mode,
27510                                    rtx target, rtx val)
27511 {
27512   enum machine_mode hmode, smode, wsmode, wvmode;
27513   rtx x;
27514
27515   switch (mode)
27516     {
27517     case V2SImode:
27518     case V2SFmode:
27519       if (!mmx_ok)
27520         return false;
27521       /* FALLTHRU */
27522
27523     case V2DFmode:
27524     case V2DImode:
27525     case V4SFmode:
27526     case V4SImode:
27527       val = force_reg (GET_MODE_INNER (mode), val);
27528       x = gen_rtx_VEC_DUPLICATE (mode, val);
27529       emit_insn (gen_rtx_SET (VOIDmode, target, x));
27530       return true;
27531
27532     case V4HImode:
27533       if (!mmx_ok)
27534         return false;
27535       if (TARGET_SSE || TARGET_3DNOW_A)
27536         {
27537           val = gen_lowpart (SImode, val);
27538           x = gen_rtx_TRUNCATE (HImode, val);
27539           x = gen_rtx_VEC_DUPLICATE (mode, x);
27540           emit_insn (gen_rtx_SET (VOIDmode, target, x));
27541           return true;
27542         }
27543       else
27544         {
27545           smode = HImode;
27546           wsmode = SImode;
27547           wvmode = V2SImode;
27548           goto widen;
27549         }
27550
27551     case V8QImode:
27552       if (!mmx_ok)
27553         return false;
27554       smode = QImode;
27555       wsmode = HImode;
27556       wvmode = V4HImode;
27557       goto widen;
27558     case V8HImode:
27559       if (TARGET_SSE2)
27560         {
27561           rtx tmp1, tmp2;
27562           /* Extend HImode to SImode using a paradoxical SUBREG.  */
27563           tmp1 = gen_reg_rtx (SImode);
27564           emit_move_insn (tmp1, gen_lowpart (SImode, val));
27565           /* Insert the SImode value as low element of V4SImode vector. */
27566           tmp2 = gen_reg_rtx (V4SImode);
27567           tmp1 = gen_rtx_VEC_MERGE (V4SImode,
27568                                     gen_rtx_VEC_DUPLICATE (V4SImode, tmp1),
27569                                     CONST0_RTX (V4SImode),
27570                                     const1_rtx);
27571           emit_insn (gen_rtx_SET (VOIDmode, tmp2, tmp1));
27572           /* Cast the V4SImode vector back to a V8HImode vector.  */
27573           tmp1 = gen_reg_rtx (V8HImode);
27574           emit_move_insn (tmp1, gen_lowpart (V8HImode, tmp2));
27575           /* Duplicate the low short through the whole low SImode word.  */
27576           emit_insn (gen_sse2_punpcklwd (tmp1, tmp1, tmp1));
27577           /* Cast the V8HImode vector back to a V4SImode vector.  */
27578           tmp2 = gen_reg_rtx (V4SImode);
27579           emit_move_insn (tmp2, gen_lowpart (V4SImode, tmp1));
27580           /* Replicate the low element of the V4SImode vector.  */
27581           emit_insn (gen_sse2_pshufd (tmp2, tmp2, const0_rtx));
27582           /* Cast the V2SImode back to V8HImode, and store in target.  */
27583           emit_move_insn (target, gen_lowpart (V8HImode, tmp2));
27584           return true;
27585         }
27586       smode = HImode;
27587       wsmode = SImode;
27588       wvmode = V4SImode;
27589       goto widen;
27590     case V16QImode:
27591       if (TARGET_SSE2)
27592         {
27593           rtx tmp1, tmp2;
27594           /* Extend QImode to SImode using a paradoxical SUBREG.  */
27595           tmp1 = gen_reg_rtx (SImode);
27596           emit_move_insn (tmp1, gen_lowpart (SImode, val));
27597           /* Insert the SImode value as low element of V4SImode vector. */
27598           tmp2 = gen_reg_rtx (V4SImode);
27599           tmp1 = gen_rtx_VEC_MERGE (V4SImode,
27600                                     gen_rtx_VEC_DUPLICATE (V4SImode, tmp1),
27601                                     CONST0_RTX (V4SImode),
27602                                     const1_rtx);
27603           emit_insn (gen_rtx_SET (VOIDmode, tmp2, tmp1));
27604           /* Cast the V4SImode vector back to a V16QImode vector.  */
27605           tmp1 = gen_reg_rtx (V16QImode);
27606           emit_move_insn (tmp1, gen_lowpart (V16QImode, tmp2));
27607           /* Duplicate the low byte through the whole low SImode word.  */
27608           emit_insn (gen_sse2_punpcklbw (tmp1, tmp1, tmp1));
27609           emit_insn (gen_sse2_punpcklbw (tmp1, tmp1, tmp1));
27610           /* Cast the V16QImode vector back to a V4SImode vector.  */
27611           tmp2 = gen_reg_rtx (V4SImode);
27612           emit_move_insn (tmp2, gen_lowpart (V4SImode, tmp1));
27613           /* Replicate the low element of the V4SImode vector.  */
27614           emit_insn (gen_sse2_pshufd (tmp2, tmp2, const0_rtx));
27615           /* Cast the V2SImode back to V16QImode, and store in target.  */
27616           emit_move_insn (target, gen_lowpart (V16QImode, tmp2));
27617           return true;
27618         }
27619       smode = QImode;
27620       wsmode = HImode;
27621       wvmode = V8HImode;
27622       goto widen;
27623     widen:
27624       /* Replicate the value once into the next wider mode and recurse.  */
27625       val = convert_modes (wsmode, smode, val, true);
27626       x = expand_simple_binop (wsmode, ASHIFT, val,
27627                                GEN_INT (GET_MODE_BITSIZE (smode)),
27628                                NULL_RTX, 1, OPTAB_LIB_WIDEN);
27629       val = expand_simple_binop (wsmode, IOR, val, x, x, 1, OPTAB_LIB_WIDEN);
27630
27631       x = gen_reg_rtx (wvmode);
27632       if (!ix86_expand_vector_init_duplicate (mmx_ok, wvmode, x, val))
27633         gcc_unreachable ();
27634       emit_move_insn (target, gen_lowpart (mode, x));
27635       return true;
27636
27637     case V4DFmode:
27638       hmode = V2DFmode;
27639       goto half;
27640     case V4DImode:
27641       hmode = V2DImode;
27642       goto half;
27643     case V8SFmode:
27644       hmode = V4SFmode;
27645       goto half;
27646     case V8SImode:
27647       hmode = V4SImode;
27648       goto half;
27649     case V16HImode:
27650       hmode = V8HImode;
27651       goto half;
27652     case V32QImode:
27653       hmode = V16QImode;
27654       goto half;
27655 half:
27656       {
27657         rtx tmp = gen_reg_rtx (hmode);
27658         ix86_expand_vector_init_duplicate (mmx_ok, hmode, tmp, val);
27659         emit_insn (gen_rtx_SET (VOIDmode, target,
27660                                 gen_rtx_VEC_CONCAT (mode, tmp, tmp)));
27661       }
27662       return true;
27663
27664     default:
27665       return false;
27666     }
27667 }
27668
27669 /* A subroutine of ix86_expand_vector_init.  Store into TARGET a vector
27670    whose ONE_VAR element is VAR, and other elements are zero.  Return true
27671    if successful.  */
27672
27673 static bool
27674 ix86_expand_vector_init_one_nonzero (bool mmx_ok, enum machine_mode mode,
27675                                      rtx target, rtx var, int one_var)
27676 {
27677   enum machine_mode vsimode;
27678   rtx new_target;
27679   rtx x, tmp;
27680   bool use_vector_set = false;
27681
27682   switch (mode)
27683     {
27684     case V2DImode:
27685       /* For SSE4.1, we normally use vector set.  But if the second
27686          element is zero and inter-unit moves are OK, we use movq
27687          instead.  */
27688       use_vector_set = (TARGET_64BIT
27689                         && TARGET_SSE4_1
27690                         && !(TARGET_INTER_UNIT_MOVES
27691                              && one_var == 0));
27692       break;
27693     case V16QImode:
27694     case V4SImode:
27695     case V4SFmode:
27696       use_vector_set = TARGET_SSE4_1;
27697       break;
27698     case V8HImode:
27699       use_vector_set = TARGET_SSE2;
27700       break;
27701     case V4HImode:
27702       use_vector_set = TARGET_SSE || TARGET_3DNOW_A;
27703       break;
27704     case V32QImode:
27705     case V16HImode:
27706     case V8SImode:
27707     case V8SFmode:
27708     case V4DFmode:
27709       use_vector_set = TARGET_AVX;
27710       break;
27711     case V4DImode:
27712       /* Use ix86_expand_vector_set in 64bit mode only.  */
27713       use_vector_set = TARGET_AVX && TARGET_64BIT;
27714       break;
27715     default:
27716       break;
27717     }
27718
27719   if (use_vector_set)
27720     {
27721       emit_insn (gen_rtx_SET (VOIDmode, target, CONST0_RTX (mode)));
27722       var = force_reg (GET_MODE_INNER (mode), var);
27723       ix86_expand_vector_set (mmx_ok, target, var, one_var);
27724       return true; 
27725     }
27726
27727   switch (mode)
27728     {
27729     case V2SFmode:
27730     case V2SImode:
27731       if (!mmx_ok)
27732         return false;
27733       /* FALLTHRU */
27734
27735     case V2DFmode:
27736     case V2DImode:
27737       if (one_var != 0)
27738         return false;
27739       var = force_reg (GET_MODE_INNER (mode), var);
27740       x = gen_rtx_VEC_CONCAT (mode, var, CONST0_RTX (GET_MODE_INNER (mode)));
27741       emit_insn (gen_rtx_SET (VOIDmode, target, x));
27742       return true;
27743
27744     case V4SFmode:
27745     case V4SImode:
27746       if (!REG_P (target) || REGNO (target) < FIRST_PSEUDO_REGISTER)
27747         new_target = gen_reg_rtx (mode);
27748       else
27749         new_target = target;
27750       var = force_reg (GET_MODE_INNER (mode), var);
27751       x = gen_rtx_VEC_DUPLICATE (mode, var);
27752       x = gen_rtx_VEC_MERGE (mode, x, CONST0_RTX (mode), const1_rtx);
27753       emit_insn (gen_rtx_SET (VOIDmode, new_target, x));
27754       if (one_var != 0)
27755         {
27756           /* We need to shuffle the value to the correct position, so
27757              create a new pseudo to store the intermediate result.  */
27758
27759           /* With SSE2, we can use the integer shuffle insns.  */
27760           if (mode != V4SFmode && TARGET_SSE2)
27761             {
27762               emit_insn (gen_sse2_pshufd_1 (new_target, new_target,
27763                                             GEN_INT (1),
27764                                             GEN_INT (one_var == 1 ? 0 : 1),
27765                                             GEN_INT (one_var == 2 ? 0 : 1),
27766                                             GEN_INT (one_var == 3 ? 0 : 1)));
27767               if (target != new_target)
27768                 emit_move_insn (target, new_target);
27769               return true;
27770             }
27771
27772           /* Otherwise convert the intermediate result to V4SFmode and
27773              use the SSE1 shuffle instructions.  */
27774           if (mode != V4SFmode)
27775             {
27776               tmp = gen_reg_rtx (V4SFmode);
27777               emit_move_insn (tmp, gen_lowpart (V4SFmode, new_target));
27778             }
27779           else
27780             tmp = new_target;
27781
27782           emit_insn (gen_sse_shufps_v4sf (tmp, tmp, tmp,
27783                                        GEN_INT (1),
27784                                        GEN_INT (one_var == 1 ? 0 : 1),
27785                                        GEN_INT (one_var == 2 ? 0+4 : 1+4),
27786                                        GEN_INT (one_var == 3 ? 0+4 : 1+4)));
27787
27788           if (mode != V4SFmode)
27789             emit_move_insn (target, gen_lowpart (V4SImode, tmp));
27790           else if (tmp != target)
27791             emit_move_insn (target, tmp);
27792         }
27793       else if (target != new_target)
27794         emit_move_insn (target, new_target);
27795       return true;
27796
27797     case V8HImode:
27798     case V16QImode:
27799       vsimode = V4SImode;
27800       goto widen;
27801     case V4HImode:
27802     case V8QImode:
27803       if (!mmx_ok)
27804         return false;
27805       vsimode = V2SImode;
27806       goto widen;
27807     widen:
27808       if (one_var != 0)
27809         return false;
27810
27811       /* Zero extend the variable element to SImode and recurse.  */
27812       var = convert_modes (SImode, GET_MODE_INNER (mode), var, true);
27813
27814       x = gen_reg_rtx (vsimode);
27815       if (!ix86_expand_vector_init_one_nonzero (mmx_ok, vsimode, x,
27816                                                 var, one_var))
27817         gcc_unreachable ();
27818
27819       emit_move_insn (target, gen_lowpart (mode, x));
27820       return true;
27821
27822     default:
27823       return false;
27824     }
27825 }
27826
27827 /* A subroutine of ix86_expand_vector_init.  Store into TARGET a vector
27828    consisting of the values in VALS.  It is known that all elements
27829    except ONE_VAR are constants.  Return true if successful.  */
27830
27831 static bool
27832 ix86_expand_vector_init_one_var (bool mmx_ok, enum machine_mode mode,
27833                                  rtx target, rtx vals, int one_var)
27834 {
27835   rtx var = XVECEXP (vals, 0, one_var);
27836   enum machine_mode wmode;
27837   rtx const_vec, x;
27838
27839   const_vec = copy_rtx (vals);
27840   XVECEXP (const_vec, 0, one_var) = CONST0_RTX (GET_MODE_INNER (mode));
27841   const_vec = gen_rtx_CONST_VECTOR (mode, XVEC (const_vec, 0));
27842
27843   switch (mode)
27844     {
27845     case V2DFmode:
27846     case V2DImode:
27847     case V2SFmode:
27848     case V2SImode:
27849       /* For the two element vectors, it's just as easy to use
27850          the general case.  */
27851       return false;
27852
27853     case V4DImode:
27854       /* Use ix86_expand_vector_set in 64bit mode only.  */
27855       if (!TARGET_64BIT)
27856         return false;
27857     case V4DFmode:
27858     case V8SFmode:
27859     case V8SImode:
27860     case V16HImode:
27861     case V32QImode:
27862     case V4SFmode:
27863     case V4SImode:
27864     case V8HImode:
27865     case V4HImode:
27866       break;
27867
27868     case V16QImode:
27869       if (TARGET_SSE4_1)
27870         break;
27871       wmode = V8HImode;
27872       goto widen;
27873     case V8QImode:
27874       wmode = V4HImode;
27875       goto widen;
27876     widen:
27877       /* There's no way to set one QImode entry easily.  Combine
27878          the variable value with its adjacent constant value, and
27879          promote to an HImode set.  */
27880       x = XVECEXP (vals, 0, one_var ^ 1);
27881       if (one_var & 1)
27882         {
27883           var = convert_modes (HImode, QImode, var, true);
27884           var = expand_simple_binop (HImode, ASHIFT, var, GEN_INT (8),
27885                                      NULL_RTX, 1, OPTAB_LIB_WIDEN);
27886           x = GEN_INT (INTVAL (x) & 0xff);
27887         }
27888       else
27889         {
27890           var = convert_modes (HImode, QImode, var, true);
27891           x = gen_int_mode (INTVAL (x) << 8, HImode);
27892         }
27893       if (x != const0_rtx)
27894         var = expand_simple_binop (HImode, IOR, var, x, var,
27895                                    1, OPTAB_LIB_WIDEN);
27896
27897       x = gen_reg_rtx (wmode);
27898       emit_move_insn (x, gen_lowpart (wmode, const_vec));
27899       ix86_expand_vector_set (mmx_ok, x, var, one_var >> 1);
27900
27901       emit_move_insn (target, gen_lowpart (mode, x));
27902       return true;
27903
27904     default:
27905       return false;
27906     }
27907
27908   emit_move_insn (target, const_vec);
27909   ix86_expand_vector_set (mmx_ok, target, var, one_var);
27910   return true;
27911 }
27912
27913 /* A subroutine of ix86_expand_vector_init_general.  Use vector
27914    concatenate to handle the most general case: all values variable,
27915    and none identical.  */
27916
27917 static void
27918 ix86_expand_vector_init_concat (enum machine_mode mode,
27919                                 rtx target, rtx *ops, int n)
27920 {
27921   enum machine_mode cmode, hmode = VOIDmode;
27922   rtx first[8], second[4];
27923   rtvec v;
27924   int i, j;
27925
27926   switch (n)
27927     {
27928     case 2:
27929       switch (mode)
27930         {
27931         case V8SImode:
27932           cmode = V4SImode;
27933           break;
27934         case V8SFmode:
27935           cmode = V4SFmode;
27936           break;
27937         case V4DImode:
27938           cmode = V2DImode;
27939           break;
27940         case V4DFmode:
27941           cmode = V2DFmode;
27942           break;
27943         case V4SImode:
27944           cmode = V2SImode;
27945           break;
27946         case V4SFmode:
27947           cmode = V2SFmode;
27948           break;
27949         case V2DImode:
27950           cmode = DImode;
27951           break;
27952         case V2SImode:
27953           cmode = SImode;
27954           break;
27955         case V2DFmode:
27956           cmode = DFmode;
27957           break;
27958         case V2SFmode:
27959           cmode = SFmode;
27960           break;
27961         default:
27962           gcc_unreachable ();
27963         }
27964
27965       if (!register_operand (ops[1], cmode))
27966         ops[1] = force_reg (cmode, ops[1]);
27967       if (!register_operand (ops[0], cmode))
27968         ops[0] = force_reg (cmode, ops[0]);
27969       emit_insn (gen_rtx_SET (VOIDmode, target,
27970                               gen_rtx_VEC_CONCAT (mode, ops[0],
27971                                                   ops[1])));
27972       break;
27973
27974     case 4:
27975       switch (mode)
27976         {
27977         case V4DImode:
27978           cmode = V2DImode;
27979           break;
27980         case V4DFmode:
27981           cmode = V2DFmode;
27982           break;
27983         case V4SImode:
27984           cmode = V2SImode;
27985           break;
27986         case V4SFmode:
27987           cmode = V2SFmode;
27988           break;
27989         default:
27990           gcc_unreachable ();
27991         }
27992       goto half;
27993
27994     case 8:
27995       switch (mode)
27996         {
27997         case V8SImode:
27998           cmode = V2SImode;
27999           hmode = V4SImode;
28000           break;
28001         case V8SFmode:
28002           cmode = V2SFmode;
28003           hmode = V4SFmode;
28004           break;
28005         default:
28006           gcc_unreachable ();
28007         }
28008       goto half;
28009
28010 half:
28011       /* FIXME: We process inputs backward to help RA.  PR 36222.  */
28012       i = n - 1;
28013       j = (n >> 1) - 1;
28014       for (; i > 0; i -= 2, j--)
28015         {
28016           first[j] = gen_reg_rtx (cmode);
28017           v = gen_rtvec (2, ops[i - 1], ops[i]);
28018           ix86_expand_vector_init (false, first[j],
28019                                    gen_rtx_PARALLEL (cmode, v));
28020         }
28021
28022       n >>= 1;
28023       if (n > 2)
28024         {
28025           gcc_assert (hmode != VOIDmode);
28026           for (i = j = 0; i < n; i += 2, j++)
28027             {
28028               second[j] = gen_reg_rtx (hmode);
28029               ix86_expand_vector_init_concat (hmode, second [j],
28030                                               &first [i], 2);
28031             }
28032           n >>= 1;
28033           ix86_expand_vector_init_concat (mode, target, second, n);
28034         }
28035       else
28036         ix86_expand_vector_init_concat (mode, target, first, n);
28037       break;
28038
28039     default:
28040       gcc_unreachable ();
28041     }
28042 }
28043
28044 /* A subroutine of ix86_expand_vector_init_general.  Use vector
28045    interleave to handle the most general case: all values variable,
28046    and none identical.  */
28047
28048 static void
28049 ix86_expand_vector_init_interleave (enum machine_mode mode,
28050                                     rtx target, rtx *ops, int n)
28051 {
28052   enum machine_mode first_imode, second_imode, third_imode, inner_mode;
28053   int i, j;
28054   rtx op0, op1;
28055   rtx (*gen_load_even) (rtx, rtx, rtx);
28056   rtx (*gen_interleave_first_low) (rtx, rtx, rtx);
28057   rtx (*gen_interleave_second_low) (rtx, rtx, rtx);
28058   
28059   switch (mode)
28060     {
28061     case V8HImode:
28062       gen_load_even = gen_vec_setv8hi;
28063       gen_interleave_first_low = gen_vec_interleave_lowv4si;
28064       gen_interleave_second_low = gen_vec_interleave_lowv2di;
28065       inner_mode = HImode;
28066       first_imode = V4SImode;
28067       second_imode = V2DImode;
28068       third_imode = VOIDmode;
28069       break;
28070     case V16QImode:
28071       gen_load_even = gen_vec_setv16qi;
28072       gen_interleave_first_low = gen_vec_interleave_lowv8hi;
28073       gen_interleave_second_low = gen_vec_interleave_lowv4si;
28074       inner_mode = QImode;
28075       first_imode = V8HImode;
28076       second_imode = V4SImode;
28077       third_imode = V2DImode;
28078       break;
28079     default:
28080       gcc_unreachable ();
28081     }
28082      
28083   for (i = 0; i < n; i++)
28084     {
28085       /* Extend the odd elment to SImode using a paradoxical SUBREG.  */
28086       op0 = gen_reg_rtx (SImode);
28087       emit_move_insn (op0, gen_lowpart (SImode, ops [i + i]));
28088
28089       /* Insert the SImode value as low element of V4SImode vector. */
28090       op1 = gen_reg_rtx (V4SImode);
28091       op0 = gen_rtx_VEC_MERGE (V4SImode,
28092                                gen_rtx_VEC_DUPLICATE (V4SImode,
28093                                                       op0),
28094                                CONST0_RTX (V4SImode),
28095                                const1_rtx);
28096       emit_insn (gen_rtx_SET (VOIDmode, op1, op0));
28097
28098       /* Cast the V4SImode vector back to a vector in orignal mode.  */
28099       op0 = gen_reg_rtx (mode);
28100       emit_move_insn (op0, gen_lowpart (mode, op1));
28101       
28102       /* Load even elements into the second positon.  */
28103       emit_insn ((*gen_load_even) (op0,
28104                                    force_reg (inner_mode,
28105                                               ops [i + i + 1]),
28106                                    const1_rtx));
28107
28108       /* Cast vector to FIRST_IMODE vector.  */
28109       ops[i] = gen_reg_rtx (first_imode);
28110       emit_move_insn (ops[i], gen_lowpart (first_imode, op0));
28111     }
28112
28113   /* Interleave low FIRST_IMODE vectors.  */
28114   for (i = j = 0; i < n; i += 2, j++)
28115     {
28116       op0 = gen_reg_rtx (first_imode);
28117       emit_insn ((*gen_interleave_first_low) (op0, ops[i], ops[i + 1]));
28118
28119       /* Cast FIRST_IMODE vector to SECOND_IMODE vector.  */
28120       ops[j] = gen_reg_rtx (second_imode);
28121       emit_move_insn (ops[j], gen_lowpart (second_imode, op0));
28122     }
28123
28124   /* Interleave low SECOND_IMODE vectors.  */
28125   switch (second_imode)
28126     {
28127     case V4SImode:
28128       for (i = j = 0; i < n / 2; i += 2, j++)
28129         {
28130           op0 = gen_reg_rtx (second_imode);
28131           emit_insn ((*gen_interleave_second_low) (op0, ops[i],
28132                                                    ops[i + 1]));
28133
28134           /* Cast the SECOND_IMODE vector to the THIRD_IMODE
28135              vector.  */
28136           ops[j] = gen_reg_rtx (third_imode);
28137           emit_move_insn (ops[j], gen_lowpart (third_imode, op0));
28138         }
28139       second_imode = V2DImode;
28140       gen_interleave_second_low = gen_vec_interleave_lowv2di;
28141       /* FALLTHRU */
28142
28143     case V2DImode:
28144       op0 = gen_reg_rtx (second_imode);
28145       emit_insn ((*gen_interleave_second_low) (op0, ops[0],
28146                                                ops[1]));
28147
28148       /* Cast the SECOND_IMODE vector back to a vector on original
28149          mode.  */
28150       emit_insn (gen_rtx_SET (VOIDmode, target,
28151                               gen_lowpart (mode, op0)));
28152       break;
28153
28154     default:
28155       gcc_unreachable ();
28156     }
28157 }
28158
28159 /* A subroutine of ix86_expand_vector_init.  Handle the most general case:
28160    all values variable, and none identical.  */
28161
28162 static void
28163 ix86_expand_vector_init_general (bool mmx_ok, enum machine_mode mode,
28164                                  rtx target, rtx vals)
28165 {
28166   rtx ops[32], op0, op1;
28167   enum machine_mode half_mode = VOIDmode;
28168   int n, i;
28169
28170   switch (mode)
28171     {
28172     case V2SFmode:
28173     case V2SImode:
28174       if (!mmx_ok && !TARGET_SSE)
28175         break;
28176       /* FALLTHRU */
28177
28178     case V8SFmode:
28179     case V8SImode:
28180     case V4DFmode:
28181     case V4DImode:
28182     case V4SFmode:
28183     case V4SImode:
28184     case V2DFmode:
28185     case V2DImode:
28186       n = GET_MODE_NUNITS (mode);
28187       for (i = 0; i < n; i++)
28188         ops[i] = XVECEXP (vals, 0, i);
28189       ix86_expand_vector_init_concat (mode, target, ops, n);
28190       return;
28191
28192     case V32QImode:
28193       half_mode = V16QImode;
28194       goto half;
28195
28196     case V16HImode:
28197       half_mode = V8HImode;
28198       goto half;
28199
28200 half:
28201       n = GET_MODE_NUNITS (mode);
28202       for (i = 0; i < n; i++)
28203         ops[i] = XVECEXP (vals, 0, i);
28204       op0 = gen_reg_rtx (half_mode);
28205       op1 = gen_reg_rtx (half_mode);
28206       ix86_expand_vector_init_interleave (half_mode, op0, ops,
28207                                           n >> 2);
28208       ix86_expand_vector_init_interleave (half_mode, op1,
28209                                           &ops [n >> 1], n >> 2);
28210       emit_insn (gen_rtx_SET (VOIDmode, target,
28211                               gen_rtx_VEC_CONCAT (mode, op0, op1)));
28212       return;
28213
28214     case V16QImode:
28215       if (!TARGET_SSE4_1)
28216         break;
28217       /* FALLTHRU */
28218
28219     case V8HImode:
28220       if (!TARGET_SSE2)
28221         break;
28222
28223       /* Don't use ix86_expand_vector_init_interleave if we can't
28224          move from GPR to SSE register directly.  */ 
28225       if (!TARGET_INTER_UNIT_MOVES)
28226         break;
28227
28228       n = GET_MODE_NUNITS (mode);
28229       for (i = 0; i < n; i++)
28230         ops[i] = XVECEXP (vals, 0, i);
28231       ix86_expand_vector_init_interleave (mode, target, ops, n >> 1);
28232       return;
28233
28234     case V4HImode:
28235     case V8QImode:
28236       break;
28237
28238     default:
28239       gcc_unreachable ();
28240     }
28241
28242     {
28243       int i, j, n_elts, n_words, n_elt_per_word;
28244       enum machine_mode inner_mode;
28245       rtx words[4], shift;
28246
28247       inner_mode = GET_MODE_INNER (mode);
28248       n_elts = GET_MODE_NUNITS (mode);
28249       n_words = GET_MODE_SIZE (mode) / UNITS_PER_WORD;
28250       n_elt_per_word = n_elts / n_words;
28251       shift = GEN_INT (GET_MODE_BITSIZE (inner_mode));
28252
28253       for (i = 0; i < n_words; ++i)
28254         {
28255           rtx word = NULL_RTX;
28256
28257           for (j = 0; j < n_elt_per_word; ++j)
28258             {
28259               rtx elt = XVECEXP (vals, 0, (i+1)*n_elt_per_word - j - 1);
28260               elt = convert_modes (word_mode, inner_mode, elt, true);
28261
28262               if (j == 0)
28263                 word = elt;
28264               else
28265                 {
28266                   word = expand_simple_binop (word_mode, ASHIFT, word, shift,
28267                                               word, 1, OPTAB_LIB_WIDEN);
28268                   word = expand_simple_binop (word_mode, IOR, word, elt,
28269                                               word, 1, OPTAB_LIB_WIDEN);
28270                 }
28271             }
28272
28273           words[i] = word;
28274         }
28275
28276       if (n_words == 1)
28277         emit_move_insn (target, gen_lowpart (mode, words[0]));
28278       else if (n_words == 2)
28279         {
28280           rtx tmp = gen_reg_rtx (mode);
28281           emit_clobber (tmp);
28282           emit_move_insn (gen_lowpart (word_mode, tmp), words[0]);
28283           emit_move_insn (gen_highpart (word_mode, tmp), words[1]);
28284           emit_move_insn (target, tmp);
28285         }
28286       else if (n_words == 4)
28287         {
28288           rtx tmp = gen_reg_rtx (V4SImode);
28289           gcc_assert (word_mode == SImode);
28290           vals = gen_rtx_PARALLEL (V4SImode, gen_rtvec_v (4, words));
28291           ix86_expand_vector_init_general (false, V4SImode, tmp, vals);
28292           emit_move_insn (target, gen_lowpart (mode, tmp));
28293         }
28294       else
28295         gcc_unreachable ();
28296     }
28297 }
28298
28299 /* Initialize vector TARGET via VALS.  Suppress the use of MMX
28300    instructions unless MMX_OK is true.  */
28301
28302 void
28303 ix86_expand_vector_init (bool mmx_ok, rtx target, rtx vals)
28304 {
28305   enum machine_mode mode = GET_MODE (target);
28306   enum machine_mode inner_mode = GET_MODE_INNER (mode);
28307   int n_elts = GET_MODE_NUNITS (mode);
28308   int n_var = 0, one_var = -1;
28309   bool all_same = true, all_const_zero = true;
28310   int i;
28311   rtx x;
28312
28313   for (i = 0; i < n_elts; ++i)
28314     {
28315       x = XVECEXP (vals, 0, i);
28316       if (!(CONST_INT_P (x)
28317             || GET_CODE (x) == CONST_DOUBLE
28318             || GET_CODE (x) == CONST_FIXED))
28319         n_var++, one_var = i;
28320       else if (x != CONST0_RTX (inner_mode))
28321         all_const_zero = false;
28322       if (i > 0 && !rtx_equal_p (x, XVECEXP (vals, 0, 0)))
28323         all_same = false;
28324     }
28325
28326   /* Constants are best loaded from the constant pool.  */
28327   if (n_var == 0)
28328     {
28329       emit_move_insn (target, gen_rtx_CONST_VECTOR (mode, XVEC (vals, 0)));
28330       return;
28331     }
28332
28333   /* If all values are identical, broadcast the value.  */
28334   if (all_same
28335       && ix86_expand_vector_init_duplicate (mmx_ok, mode, target,
28336                                             XVECEXP (vals, 0, 0)))
28337     return;
28338
28339   /* Values where only one field is non-constant are best loaded from
28340      the pool and overwritten via move later.  */
28341   if (n_var == 1)
28342     {
28343       if (all_const_zero
28344           && ix86_expand_vector_init_one_nonzero (mmx_ok, mode, target,
28345                                                   XVECEXP (vals, 0, one_var),
28346                                                   one_var))
28347         return;
28348
28349       if (ix86_expand_vector_init_one_var (mmx_ok, mode, target, vals, one_var))
28350         return;
28351     }
28352
28353   ix86_expand_vector_init_general (mmx_ok, mode, target, vals);
28354 }
28355
28356 void
28357 ix86_expand_vector_set (bool mmx_ok, rtx target, rtx val, int elt)
28358 {
28359   enum machine_mode mode = GET_MODE (target);
28360   enum machine_mode inner_mode = GET_MODE_INNER (mode);
28361   enum machine_mode half_mode;
28362   bool use_vec_merge = false;
28363   rtx tmp;
28364   static rtx (*gen_extract[6][2]) (rtx, rtx)
28365     = {
28366         { gen_vec_extract_lo_v32qi, gen_vec_extract_hi_v32qi },
28367         { gen_vec_extract_lo_v16hi, gen_vec_extract_hi_v16hi },
28368         { gen_vec_extract_lo_v8si, gen_vec_extract_hi_v8si },
28369         { gen_vec_extract_lo_v4di, gen_vec_extract_hi_v4di },
28370         { gen_vec_extract_lo_v8sf, gen_vec_extract_hi_v8sf },
28371         { gen_vec_extract_lo_v4df, gen_vec_extract_hi_v4df }
28372       };
28373   static rtx (*gen_insert[6][2]) (rtx, rtx, rtx)
28374     = {
28375         { gen_vec_set_lo_v32qi, gen_vec_set_hi_v32qi },
28376         { gen_vec_set_lo_v16hi, gen_vec_set_hi_v16hi },
28377         { gen_vec_set_lo_v8si, gen_vec_set_hi_v8si },
28378         { gen_vec_set_lo_v4di, gen_vec_set_hi_v4di },
28379         { gen_vec_set_lo_v8sf, gen_vec_set_hi_v8sf },
28380         { gen_vec_set_lo_v4df, gen_vec_set_hi_v4df }
28381       };
28382   int i, j, n;
28383
28384   switch (mode)
28385     {
28386     case V2SFmode:
28387     case V2SImode:
28388       if (mmx_ok)
28389         {
28390           tmp = gen_reg_rtx (GET_MODE_INNER (mode));
28391           ix86_expand_vector_extract (true, tmp, target, 1 - elt);
28392           if (elt == 0)
28393             tmp = gen_rtx_VEC_CONCAT (mode, tmp, val);
28394           else
28395             tmp = gen_rtx_VEC_CONCAT (mode, val, tmp);
28396           emit_insn (gen_rtx_SET (VOIDmode, target, tmp));
28397           return;
28398         }
28399       break;
28400
28401     case V2DImode:
28402       use_vec_merge = TARGET_SSE4_1;
28403       if (use_vec_merge)
28404         break;
28405
28406     case V2DFmode:
28407       {
28408         rtx op0, op1;
28409
28410         /* For the two element vectors, we implement a VEC_CONCAT with
28411            the extraction of the other element.  */
28412
28413         tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (1, GEN_INT (1 - elt)));
28414         tmp = gen_rtx_VEC_SELECT (inner_mode, target, tmp);
28415
28416         if (elt == 0)
28417           op0 = val, op1 = tmp;
28418         else
28419           op0 = tmp, op1 = val;
28420
28421         tmp = gen_rtx_VEC_CONCAT (mode, op0, op1);
28422         emit_insn (gen_rtx_SET (VOIDmode, target, tmp));
28423       }
28424       return;
28425
28426     case V4SFmode:
28427       use_vec_merge = TARGET_SSE4_1;
28428       if (use_vec_merge)
28429         break;
28430
28431       switch (elt)
28432         {
28433         case 0:
28434           use_vec_merge = true;
28435           break;
28436
28437         case 1:
28438           /* tmp = target = A B C D */
28439           tmp = copy_to_reg (target);
28440           /* target = A A B B */
28441           emit_insn (gen_sse_unpcklps (target, target, target));
28442           /* target = X A B B */
28443           ix86_expand_vector_set (false, target, val, 0);
28444           /* target = A X C D  */
28445           emit_insn (gen_sse_shufps_v4sf (target, target, tmp,
28446                                        GEN_INT (1), GEN_INT (0),
28447                                        GEN_INT (2+4), GEN_INT (3+4)));
28448           return;
28449
28450         case 2:
28451           /* tmp = target = A B C D */
28452           tmp = copy_to_reg (target);
28453           /* tmp = X B C D */
28454           ix86_expand_vector_set (false, tmp, val, 0);
28455           /* target = A B X D */
28456           emit_insn (gen_sse_shufps_v4sf (target, target, tmp,
28457                                        GEN_INT (0), GEN_INT (1),
28458                                        GEN_INT (0+4), GEN_INT (3+4)));
28459           return;
28460
28461         case 3:
28462           /* tmp = target = A B C D */
28463           tmp = copy_to_reg (target);
28464           /* tmp = X B C D */
28465           ix86_expand_vector_set (false, tmp, val, 0);
28466           /* target = A B X D */
28467           emit_insn (gen_sse_shufps_v4sf (target, target, tmp,
28468                                        GEN_INT (0), GEN_INT (1),
28469                                        GEN_INT (2+4), GEN_INT (0+4)));
28470           return;
28471
28472         default:
28473           gcc_unreachable ();
28474         }
28475       break;
28476
28477     case V4SImode:
28478       use_vec_merge = TARGET_SSE4_1;
28479       if (use_vec_merge)
28480         break;
28481
28482       /* Element 0 handled by vec_merge below.  */
28483       if (elt == 0)
28484         {
28485           use_vec_merge = true;
28486           break;
28487         }
28488
28489       if (TARGET_SSE2)
28490         {
28491           /* With SSE2, use integer shuffles to swap element 0 and ELT,
28492              store into element 0, then shuffle them back.  */
28493
28494           rtx order[4];
28495
28496           order[0] = GEN_INT (elt);
28497           order[1] = const1_rtx;
28498           order[2] = const2_rtx;
28499           order[3] = GEN_INT (3);
28500           order[elt] = const0_rtx;
28501
28502           emit_insn (gen_sse2_pshufd_1 (target, target, order[0],
28503                                         order[1], order[2], order[3]));
28504
28505           ix86_expand_vector_set (false, target, val, 0);
28506
28507           emit_insn (gen_sse2_pshufd_1 (target, target, order[0],
28508                                         order[1], order[2], order[3]));
28509         }
28510       else
28511         {
28512           /* For SSE1, we have to reuse the V4SF code.  */
28513           ix86_expand_vector_set (false, gen_lowpart (V4SFmode, target),
28514                                   gen_lowpart (SFmode, val), elt);
28515         }
28516       return;
28517
28518     case V8HImode:
28519       use_vec_merge = TARGET_SSE2;
28520       break;
28521     case V4HImode:
28522       use_vec_merge = mmx_ok && (TARGET_SSE || TARGET_3DNOW_A);
28523       break;
28524
28525     case V16QImode:
28526       use_vec_merge = TARGET_SSE4_1;
28527       break;
28528
28529     case V8QImode:
28530       break;
28531
28532     case V32QImode:
28533       half_mode = V16QImode;
28534       j = 0;
28535       n = 16;
28536       goto half;
28537
28538     case V16HImode:
28539       half_mode = V8HImode;
28540       j = 1;
28541       n = 8;
28542       goto half;
28543
28544     case V8SImode:
28545       half_mode = V4SImode;
28546       j = 2;
28547       n = 4;
28548       goto half;
28549
28550     case V4DImode:
28551       half_mode = V2DImode;
28552       j = 3;
28553       n = 2;
28554       goto half;
28555
28556     case V8SFmode:
28557       half_mode = V4SFmode;
28558       j = 4;
28559       n = 4;
28560       goto half;
28561
28562     case V4DFmode:
28563       half_mode = V2DFmode;
28564       j = 5;
28565       n = 2;
28566       goto half;
28567
28568 half:
28569       /* Compute offset.  */
28570       i = elt / n;
28571       elt %= n;
28572
28573       gcc_assert (i <= 1);
28574
28575       /* Extract the half.  */
28576       tmp = gen_reg_rtx (half_mode);
28577       emit_insn ((*gen_extract[j][i]) (tmp, target));
28578
28579       /* Put val in tmp at elt.  */
28580       ix86_expand_vector_set (false, tmp, val, elt);
28581
28582       /* Put it back.  */
28583       emit_insn ((*gen_insert[j][i]) (target, target, tmp));
28584       return;
28585
28586     default:
28587       break;
28588     }
28589
28590   if (use_vec_merge)
28591     {
28592       tmp = gen_rtx_VEC_DUPLICATE (mode, val);
28593       tmp = gen_rtx_VEC_MERGE (mode, tmp, target, GEN_INT (1 << elt));
28594       emit_insn (gen_rtx_SET (VOIDmode, target, tmp));
28595     }
28596   else
28597     {
28598       rtx mem = assign_stack_temp (mode, GET_MODE_SIZE (mode), false);
28599
28600       emit_move_insn (mem, target);
28601
28602       tmp = adjust_address (mem, inner_mode, elt*GET_MODE_SIZE (inner_mode));
28603       emit_move_insn (tmp, val);
28604
28605       emit_move_insn (target, mem);
28606     }
28607 }
28608
28609 void
28610 ix86_expand_vector_extract (bool mmx_ok, rtx target, rtx vec, int elt)
28611 {
28612   enum machine_mode mode = GET_MODE (vec);
28613   enum machine_mode inner_mode = GET_MODE_INNER (mode);
28614   bool use_vec_extr = false;
28615   rtx tmp;
28616
28617   switch (mode)
28618     {
28619     case V2SImode:
28620     case V2SFmode:
28621       if (!mmx_ok)
28622         break;
28623       /* FALLTHRU */
28624
28625     case V2DFmode:
28626     case V2DImode:
28627       use_vec_extr = true;
28628       break;
28629
28630     case V4SFmode:
28631       use_vec_extr = TARGET_SSE4_1;
28632       if (use_vec_extr)
28633         break;
28634
28635       switch (elt)
28636         {
28637         case 0:
28638           tmp = vec;
28639           break;
28640
28641         case 1:
28642         case 3:
28643           tmp = gen_reg_rtx (mode);
28644           emit_insn (gen_sse_shufps_v4sf (tmp, vec, vec,
28645                                        GEN_INT (elt), GEN_INT (elt),
28646                                        GEN_INT (elt+4), GEN_INT (elt+4)));
28647           break;
28648
28649         case 2:
28650           tmp = gen_reg_rtx (mode);
28651           emit_insn (gen_sse_unpckhps (tmp, vec, vec));
28652           break;
28653
28654         default:
28655           gcc_unreachable ();
28656         }
28657       vec = tmp;
28658       use_vec_extr = true;
28659       elt = 0;
28660       break;
28661
28662     case V4SImode:
28663       use_vec_extr = TARGET_SSE4_1;
28664       if (use_vec_extr)
28665         break;
28666
28667       if (TARGET_SSE2)
28668         {
28669           switch (elt)
28670             {
28671             case 0:
28672               tmp = vec;
28673               break;
28674
28675             case 1:
28676             case 3:
28677               tmp = gen_reg_rtx (mode);
28678               emit_insn (gen_sse2_pshufd_1 (tmp, vec,
28679                                             GEN_INT (elt), GEN_INT (elt),
28680                                             GEN_INT (elt), GEN_INT (elt)));
28681               break;
28682
28683             case 2:
28684               tmp = gen_reg_rtx (mode);
28685               emit_insn (gen_sse2_punpckhdq (tmp, vec, vec));
28686               break;
28687
28688             default:
28689               gcc_unreachable ();
28690             }
28691           vec = tmp;
28692           use_vec_extr = true;
28693           elt = 0;
28694         }
28695       else
28696         {
28697           /* For SSE1, we have to reuse the V4SF code.  */
28698           ix86_expand_vector_extract (false, gen_lowpart (SFmode, target),
28699                                       gen_lowpart (V4SFmode, vec), elt);
28700           return;
28701         }
28702       break;
28703
28704     case V8HImode:
28705       use_vec_extr = TARGET_SSE2;
28706       break;
28707     case V4HImode:
28708       use_vec_extr = mmx_ok && (TARGET_SSE || TARGET_3DNOW_A);
28709       break;
28710
28711     case V16QImode:
28712       use_vec_extr = TARGET_SSE4_1;
28713       break;
28714
28715     case V8QImode:
28716       /* ??? Could extract the appropriate HImode element and shift.  */
28717     default:
28718       break;
28719     }
28720
28721   if (use_vec_extr)
28722     {
28723       tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (1, GEN_INT (elt)));
28724       tmp = gen_rtx_VEC_SELECT (inner_mode, vec, tmp);
28725
28726       /* Let the rtl optimizers know about the zero extension performed.  */
28727       if (inner_mode == QImode || inner_mode == HImode)
28728         {
28729           tmp = gen_rtx_ZERO_EXTEND (SImode, tmp);
28730           target = gen_lowpart (SImode, target);
28731         }
28732
28733       emit_insn (gen_rtx_SET (VOIDmode, target, tmp));
28734     }
28735   else
28736     {
28737       rtx mem = assign_stack_temp (mode, GET_MODE_SIZE (mode), false);
28738
28739       emit_move_insn (mem, vec);
28740
28741       tmp = adjust_address (mem, inner_mode, elt*GET_MODE_SIZE (inner_mode));
28742       emit_move_insn (target, tmp);
28743     }
28744 }
28745
28746 /* Expand a vector reduction on V4SFmode for SSE1.  FN is the binary
28747    pattern to reduce; DEST is the destination; IN is the input vector.  */
28748
28749 void
28750 ix86_expand_reduc_v4sf (rtx (*fn) (rtx, rtx, rtx), rtx dest, rtx in)
28751 {
28752   rtx tmp1, tmp2, tmp3;
28753
28754   tmp1 = gen_reg_rtx (V4SFmode);
28755   tmp2 = gen_reg_rtx (V4SFmode);
28756   tmp3 = gen_reg_rtx (V4SFmode);
28757
28758   emit_insn (gen_sse_movhlps (tmp1, in, in));
28759   emit_insn (fn (tmp2, tmp1, in));
28760
28761   emit_insn (gen_sse_shufps_v4sf (tmp3, tmp2, tmp2,
28762                                GEN_INT (1), GEN_INT (1),
28763                                GEN_INT (1+4), GEN_INT (1+4)));
28764   emit_insn (fn (dest, tmp2, tmp3));
28765 }
28766 \f
28767 /* Target hook for scalar_mode_supported_p.  */
28768 static bool
28769 ix86_scalar_mode_supported_p (enum machine_mode mode)
28770 {
28771   if (DECIMAL_FLOAT_MODE_P (mode))
28772     return true;
28773   else if (mode == TFmode)
28774     return true;
28775   else
28776     return default_scalar_mode_supported_p (mode);
28777 }
28778
28779 /* Implements target hook vector_mode_supported_p.  */
28780 static bool
28781 ix86_vector_mode_supported_p (enum machine_mode mode)
28782 {
28783   if (TARGET_SSE && VALID_SSE_REG_MODE (mode))
28784     return true;
28785   if (TARGET_SSE2 && VALID_SSE2_REG_MODE (mode))
28786     return true;
28787   if (TARGET_AVX && VALID_AVX256_REG_MODE (mode))
28788     return true;
28789   if (TARGET_MMX && VALID_MMX_REG_MODE (mode))
28790     return true;
28791   if (TARGET_3DNOW && VALID_MMX_REG_MODE_3DNOW (mode))
28792     return true;
28793   return false;
28794 }
28795
28796 /* Target hook for c_mode_for_suffix.  */
28797 static enum machine_mode
28798 ix86_c_mode_for_suffix (char suffix)
28799 {
28800   if (suffix == 'q')
28801     return TFmode;
28802   if (suffix == 'w')
28803     return XFmode;
28804
28805   return VOIDmode;
28806 }
28807
28808 /* Worker function for TARGET_MD_ASM_CLOBBERS.
28809
28810    We do this in the new i386 backend to maintain source compatibility
28811    with the old cc0-based compiler.  */
28812
28813 static tree
28814 ix86_md_asm_clobbers (tree outputs ATTRIBUTE_UNUSED,
28815                       tree inputs ATTRIBUTE_UNUSED,
28816                       tree clobbers)
28817 {
28818   clobbers = tree_cons (NULL_TREE, build_string (5, "flags"),
28819                         clobbers);
28820   clobbers = tree_cons (NULL_TREE, build_string (4, "fpsr"),
28821                         clobbers);
28822   return clobbers;
28823 }
28824
28825 /* Implements target vector targetm.asm.encode_section_info.  This
28826    is not used by netware.  */
28827
28828 static void ATTRIBUTE_UNUSED
28829 ix86_encode_section_info (tree decl, rtx rtl, int first)
28830 {
28831   default_encode_section_info (decl, rtl, first);
28832
28833   if (TREE_CODE (decl) == VAR_DECL
28834       && (TREE_STATIC (decl) || DECL_EXTERNAL (decl))
28835       && ix86_in_large_data_p (decl))
28836     SYMBOL_REF_FLAGS (XEXP (rtl, 0)) |= SYMBOL_FLAG_FAR_ADDR;
28837 }
28838
28839 /* Worker function for REVERSE_CONDITION.  */
28840
28841 enum rtx_code
28842 ix86_reverse_condition (enum rtx_code code, enum machine_mode mode)
28843 {
28844   return (mode != CCFPmode && mode != CCFPUmode
28845           ? reverse_condition (code)
28846           : reverse_condition_maybe_unordered (code));
28847 }
28848
28849 /* Output code to perform an x87 FP register move, from OPERANDS[1]
28850    to OPERANDS[0].  */
28851
28852 const char *
28853 output_387_reg_move (rtx insn, rtx *operands)
28854 {
28855   if (REG_P (operands[0]))
28856     {
28857       if (REG_P (operands[1])
28858           && find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
28859         {
28860           if (REGNO (operands[0]) == FIRST_STACK_REG)
28861             return output_387_ffreep (operands, 0);
28862           return "fstp\t%y0";
28863         }
28864       if (STACK_TOP_P (operands[0]))
28865         return "fld%Z1\t%y1";
28866       return "fst\t%y0";
28867     }
28868   else if (MEM_P (operands[0]))
28869     {
28870       gcc_assert (REG_P (operands[1]));
28871       if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
28872         return "fstp%Z0\t%y0";
28873       else
28874         {
28875           /* There is no non-popping store to memory for XFmode.
28876              So if we need one, follow the store with a load.  */
28877           if (GET_MODE (operands[0]) == XFmode)
28878             return "fstp%Z0\t%y0\n\tfld%Z0\t%y0";
28879           else
28880             return "fst%Z0\t%y0";
28881         }
28882     }
28883   else
28884     gcc_unreachable();
28885 }
28886
28887 /* Output code to perform a conditional jump to LABEL, if C2 flag in
28888    FP status register is set.  */
28889
28890 void
28891 ix86_emit_fp_unordered_jump (rtx label)
28892 {
28893   rtx reg = gen_reg_rtx (HImode);
28894   rtx temp;
28895
28896   emit_insn (gen_x86_fnstsw_1 (reg));
28897
28898   if (TARGET_SAHF && (TARGET_USE_SAHF || optimize_insn_for_size_p ()))
28899     {
28900       emit_insn (gen_x86_sahf_1 (reg));
28901
28902       temp = gen_rtx_REG (CCmode, FLAGS_REG);
28903       temp = gen_rtx_UNORDERED (VOIDmode, temp, const0_rtx);
28904     }
28905   else
28906     {
28907       emit_insn (gen_testqi_ext_ccno_0 (reg, GEN_INT (0x04)));
28908
28909       temp = gen_rtx_REG (CCNOmode, FLAGS_REG);
28910       temp = gen_rtx_NE (VOIDmode, temp, const0_rtx);
28911     }
28912
28913   temp = gen_rtx_IF_THEN_ELSE (VOIDmode, temp,
28914                               gen_rtx_LABEL_REF (VOIDmode, label),
28915                               pc_rtx);
28916   temp = gen_rtx_SET (VOIDmode, pc_rtx, temp);
28917
28918   emit_jump_insn (temp);
28919   predict_jump (REG_BR_PROB_BASE * 10 / 100);
28920 }
28921
28922 /* Output code to perform a log1p XFmode calculation.  */
28923
28924 void ix86_emit_i387_log1p (rtx op0, rtx op1)
28925 {
28926   rtx label1 = gen_label_rtx ();
28927   rtx label2 = gen_label_rtx ();
28928
28929   rtx tmp = gen_reg_rtx (XFmode);
28930   rtx tmp2 = gen_reg_rtx (XFmode);
28931   rtx test;
28932
28933   emit_insn (gen_absxf2 (tmp, op1));
28934   test = gen_rtx_GE (VOIDmode, tmp,
28935     CONST_DOUBLE_FROM_REAL_VALUE (
28936        REAL_VALUE_ATOF ("0.29289321881345247561810596348408353", XFmode),
28937        XFmode));
28938   emit_jump_insn (gen_cbranchxf4 (test, XEXP (test, 0), XEXP (test, 1), label1));
28939
28940   emit_move_insn (tmp2, standard_80387_constant_rtx (4)); /* fldln2 */
28941   emit_insn (gen_fyl2xp1xf3_i387 (op0, op1, tmp2));
28942   emit_jump (label2);
28943
28944   emit_label (label1);
28945   emit_move_insn (tmp, CONST1_RTX (XFmode));
28946   emit_insn (gen_addxf3 (tmp, op1, tmp));
28947   emit_move_insn (tmp2, standard_80387_constant_rtx (4)); /* fldln2 */
28948   emit_insn (gen_fyl2xxf3_i387 (op0, tmp, tmp2));
28949
28950   emit_label (label2);
28951 }
28952
28953 /* Output code to perform a Newton-Rhapson approximation of a single precision
28954    floating point divide [http://en.wikipedia.org/wiki/N-th_root_algorithm].  */
28955
28956 void ix86_emit_swdivsf (rtx res, rtx a, rtx b, enum machine_mode mode)
28957 {
28958   rtx x0, x1, e0, e1, two;
28959
28960   x0 = gen_reg_rtx (mode);
28961   e0 = gen_reg_rtx (mode);
28962   e1 = gen_reg_rtx (mode);
28963   x1 = gen_reg_rtx (mode);
28964
28965   two = CONST_DOUBLE_FROM_REAL_VALUE (dconst2, SFmode);
28966
28967   if (VECTOR_MODE_P (mode))
28968     two = ix86_build_const_vector (SFmode, true, two);
28969
28970   two = force_reg (mode, two);
28971
28972   /* a / b = a * rcp(b) * (2.0 - b * rcp(b)) */
28973
28974   /* x0 = rcp(b) estimate */
28975   emit_insn (gen_rtx_SET (VOIDmode, x0,
28976                           gen_rtx_UNSPEC (mode, gen_rtvec (1, b),
28977                                           UNSPEC_RCP)));
28978   /* e0 = x0 * b */
28979   emit_insn (gen_rtx_SET (VOIDmode, e0,
28980                           gen_rtx_MULT (mode, x0, b)));
28981   /* e1 = 2. - e0 */
28982   emit_insn (gen_rtx_SET (VOIDmode, e1,
28983                           gen_rtx_MINUS (mode, two, e0)));
28984   /* x1 = x0 * e1 */
28985   emit_insn (gen_rtx_SET (VOIDmode, x1,
28986                           gen_rtx_MULT (mode, x0, e1)));
28987   /* res = a * x1 */
28988   emit_insn (gen_rtx_SET (VOIDmode, res,
28989                           gen_rtx_MULT (mode, a, x1)));
28990 }
28991
28992 /* Output code to perform a Newton-Rhapson approximation of a
28993    single precision floating point [reciprocal] square root.  */
28994
28995 void ix86_emit_swsqrtsf (rtx res, rtx a, enum machine_mode mode,
28996                          bool recip)
28997 {
28998   rtx x0, e0, e1, e2, e3, mthree, mhalf;
28999   REAL_VALUE_TYPE r;
29000
29001   x0 = gen_reg_rtx (mode);
29002   e0 = gen_reg_rtx (mode);
29003   e1 = gen_reg_rtx (mode);
29004   e2 = gen_reg_rtx (mode);
29005   e3 = gen_reg_rtx (mode);
29006
29007   real_from_integer (&r, VOIDmode, -3, -1, 0);
29008   mthree = CONST_DOUBLE_FROM_REAL_VALUE (r, SFmode);
29009
29010   real_arithmetic (&r, NEGATE_EXPR, &dconsthalf, NULL);
29011   mhalf = CONST_DOUBLE_FROM_REAL_VALUE (r, SFmode);
29012
29013   if (VECTOR_MODE_P (mode))
29014     {
29015       mthree = ix86_build_const_vector (SFmode, true, mthree);
29016       mhalf = ix86_build_const_vector (SFmode, true, mhalf);
29017     }
29018
29019   /* sqrt(a)  = -0.5 * a * rsqrtss(a) * (a * rsqrtss(a) * rsqrtss(a) - 3.0)
29020      rsqrt(a) = -0.5     * rsqrtss(a) * (a * rsqrtss(a) * rsqrtss(a) - 3.0) */
29021
29022   /* x0 = rsqrt(a) estimate */
29023   emit_insn (gen_rtx_SET (VOIDmode, x0,
29024                           gen_rtx_UNSPEC (mode, gen_rtvec (1, a),
29025                                           UNSPEC_RSQRT)));
29026
29027   /* If (a == 0.0) Filter out infinity to prevent NaN for sqrt(0.0).  */
29028   if (!recip)
29029     {
29030       rtx zero, mask;
29031
29032       zero = gen_reg_rtx (mode);
29033       mask = gen_reg_rtx (mode);
29034
29035       zero = force_reg (mode, CONST0_RTX(mode));
29036       emit_insn (gen_rtx_SET (VOIDmode, mask,
29037                               gen_rtx_NE (mode, zero, a)));
29038
29039       emit_insn (gen_rtx_SET (VOIDmode, x0,
29040                               gen_rtx_AND (mode, x0, mask)));
29041     }
29042
29043   /* e0 = x0 * a */
29044   emit_insn (gen_rtx_SET (VOIDmode, e0,
29045                           gen_rtx_MULT (mode, x0, a)));
29046   /* e1 = e0 * x0 */
29047   emit_insn (gen_rtx_SET (VOIDmode, e1,
29048                           gen_rtx_MULT (mode, e0, x0)));
29049
29050   /* e2 = e1 - 3. */
29051   mthree = force_reg (mode, mthree);
29052   emit_insn (gen_rtx_SET (VOIDmode, e2,
29053                           gen_rtx_PLUS (mode, e1, mthree)));
29054
29055   mhalf = force_reg (mode, mhalf);
29056   if (recip)
29057     /* e3 = -.5 * x0 */
29058     emit_insn (gen_rtx_SET (VOIDmode, e3,
29059                             gen_rtx_MULT (mode, x0, mhalf)));
29060   else
29061     /* e3 = -.5 * e0 */
29062     emit_insn (gen_rtx_SET (VOIDmode, e3,
29063                             gen_rtx_MULT (mode, e0, mhalf)));
29064   /* ret = e2 * e3 */
29065   emit_insn (gen_rtx_SET (VOIDmode, res,
29066                           gen_rtx_MULT (mode, e2, e3)));
29067 }
29068
29069 /* Solaris implementation of TARGET_ASM_NAMED_SECTION.  */
29070
29071 static void ATTRIBUTE_UNUSED
29072 i386_solaris_elf_named_section (const char *name, unsigned int flags,
29073                                 tree decl)
29074 {
29075   /* With Binutils 2.15, the "@unwind" marker must be specified on
29076      every occurrence of the ".eh_frame" section, not just the first
29077      one.  */
29078   if (TARGET_64BIT
29079       && strcmp (name, ".eh_frame") == 0)
29080     {
29081       fprintf (asm_out_file, "\t.section\t%s,\"%s\",@unwind\n", name,
29082                flags & SECTION_WRITE ? "aw" : "a");
29083       return;
29084     }
29085   default_elf_asm_named_section (name, flags, decl);
29086 }
29087
29088 /* Return the mangling of TYPE if it is an extended fundamental type.  */
29089
29090 static const char *
29091 ix86_mangle_type (const_tree type)
29092 {
29093   type = TYPE_MAIN_VARIANT (type);
29094
29095   if (TREE_CODE (type) != VOID_TYPE && TREE_CODE (type) != BOOLEAN_TYPE
29096       && TREE_CODE (type) != INTEGER_TYPE && TREE_CODE (type) != REAL_TYPE)
29097     return NULL;
29098
29099   switch (TYPE_MODE (type))
29100     {
29101     case TFmode:
29102       /* __float128 is "g".  */
29103       return "g";
29104     case XFmode:
29105       /* "long double" or __float80 is "e".  */
29106       return "e";
29107     default:
29108       return NULL;
29109     }
29110 }
29111
29112 /* For 32-bit code we can save PIC register setup by using
29113    __stack_chk_fail_local hidden function instead of calling
29114    __stack_chk_fail directly.  64-bit code doesn't need to setup any PIC
29115    register, so it is better to call __stack_chk_fail directly.  */
29116
29117 static tree
29118 ix86_stack_protect_fail (void)
29119 {
29120   return TARGET_64BIT
29121          ? default_external_stack_protect_fail ()
29122          : default_hidden_stack_protect_fail ();
29123 }
29124
29125 /* Select a format to encode pointers in exception handling data.  CODE
29126    is 0 for data, 1 for code labels, 2 for function pointers.  GLOBAL is
29127    true if the symbol may be affected by dynamic relocations.
29128
29129    ??? All x86 object file formats are capable of representing this.
29130    After all, the relocation needed is the same as for the call insn.
29131    Whether or not a particular assembler allows us to enter such, I
29132    guess we'll have to see.  */
29133 int
29134 asm_preferred_eh_data_format (int code, int global)
29135 {
29136   if (flag_pic)
29137     {
29138       int type = DW_EH_PE_sdata8;
29139       if (!TARGET_64BIT
29140           || ix86_cmodel == CM_SMALL_PIC
29141           || (ix86_cmodel == CM_MEDIUM_PIC && (global || code)))
29142         type = DW_EH_PE_sdata4;
29143       return (global ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel | type;
29144     }
29145   if (ix86_cmodel == CM_SMALL
29146       || (ix86_cmodel == CM_MEDIUM && code))
29147     return DW_EH_PE_udata4;
29148   return DW_EH_PE_absptr;
29149 }
29150 \f
29151 /* Expand copysign from SIGN to the positive value ABS_VALUE
29152    storing in RESULT.  If MASK is non-null, it shall be a mask to mask out
29153    the sign-bit.  */
29154 static void
29155 ix86_sse_copysign_to_positive (rtx result, rtx abs_value, rtx sign, rtx mask)
29156 {
29157   enum machine_mode mode = GET_MODE (sign);
29158   rtx sgn = gen_reg_rtx (mode);
29159   if (mask == NULL_RTX)
29160     {
29161       mask = ix86_build_signbit_mask (mode, VECTOR_MODE_P (mode), false);
29162       if (!VECTOR_MODE_P (mode))
29163         {
29164           /* We need to generate a scalar mode mask in this case.  */
29165           rtx tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (1, const0_rtx));
29166           tmp = gen_rtx_VEC_SELECT (mode, mask, tmp);
29167           mask = gen_reg_rtx (mode);
29168           emit_insn (gen_rtx_SET (VOIDmode, mask, tmp));
29169         }
29170     }
29171   else
29172     mask = gen_rtx_NOT (mode, mask);
29173   emit_insn (gen_rtx_SET (VOIDmode, sgn,
29174                           gen_rtx_AND (mode, mask, sign)));
29175   emit_insn (gen_rtx_SET (VOIDmode, result,
29176                           gen_rtx_IOR (mode, abs_value, sgn)));
29177 }
29178
29179 /* Expand fabs (OP0) and return a new rtx that holds the result.  The
29180    mask for masking out the sign-bit is stored in *SMASK, if that is
29181    non-null.  */
29182 static rtx
29183 ix86_expand_sse_fabs (rtx op0, rtx *smask)
29184 {
29185   enum machine_mode mode = GET_MODE (op0);
29186   rtx xa, mask;
29187
29188   xa = gen_reg_rtx (mode);
29189   mask = ix86_build_signbit_mask (mode, VECTOR_MODE_P (mode), true);
29190   if (!VECTOR_MODE_P (mode))
29191     {
29192       /* We need to generate a scalar mode mask in this case.  */
29193       rtx tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (1, const0_rtx));
29194       tmp = gen_rtx_VEC_SELECT (mode, mask, tmp);
29195       mask = gen_reg_rtx (mode);
29196       emit_insn (gen_rtx_SET (VOIDmode, mask, tmp));
29197     }
29198   emit_insn (gen_rtx_SET (VOIDmode, xa,
29199                           gen_rtx_AND (mode, op0, mask)));
29200
29201   if (smask)
29202     *smask = mask;
29203
29204   return xa;
29205 }
29206
29207 /* Expands a comparison of OP0 with OP1 using comparison code CODE,
29208    swapping the operands if SWAP_OPERANDS is true.  The expanded
29209    code is a forward jump to a newly created label in case the
29210    comparison is true.  The generated label rtx is returned.  */
29211 static rtx
29212 ix86_expand_sse_compare_and_jump (enum rtx_code code, rtx op0, rtx op1,
29213                                   bool swap_operands)
29214 {
29215   rtx label, tmp;
29216
29217   if (swap_operands)
29218     {
29219       tmp = op0;
29220       op0 = op1;
29221       op1 = tmp;
29222     }
29223
29224   label = gen_label_rtx ();
29225   tmp = gen_rtx_REG (CCFPUmode, FLAGS_REG);
29226   emit_insn (gen_rtx_SET (VOIDmode, tmp,
29227                           gen_rtx_COMPARE (CCFPUmode, op0, op1)));
29228   tmp = gen_rtx_fmt_ee (code, VOIDmode, tmp, const0_rtx);
29229   tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp,
29230                               gen_rtx_LABEL_REF (VOIDmode, label), pc_rtx);
29231   tmp = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, tmp));
29232   JUMP_LABEL (tmp) = label;
29233
29234   return label;
29235 }
29236
29237 /* Expand a mask generating SSE comparison instruction comparing OP0 with OP1
29238    using comparison code CODE.  Operands are swapped for the comparison if
29239    SWAP_OPERANDS is true.  Returns a rtx for the generated mask.  */
29240 static rtx
29241 ix86_expand_sse_compare_mask (enum rtx_code code, rtx op0, rtx op1,
29242                               bool swap_operands)
29243 {
29244   enum machine_mode mode = GET_MODE (op0);
29245   rtx mask = gen_reg_rtx (mode);
29246
29247   if (swap_operands)
29248     {
29249       rtx tmp = op0;
29250       op0 = op1;
29251       op1 = tmp;
29252     }
29253
29254   if (mode == DFmode)
29255     emit_insn (gen_sse2_maskcmpdf3 (mask, op0, op1,
29256                                     gen_rtx_fmt_ee (code, mode, op0, op1)));
29257   else
29258     emit_insn (gen_sse_maskcmpsf3 (mask, op0, op1,
29259                                    gen_rtx_fmt_ee (code, mode, op0, op1)));
29260
29261   return mask;
29262 }
29263
29264 /* Generate and return a rtx of mode MODE for 2**n where n is the number
29265    of bits of the mantissa of MODE, which must be one of DFmode or SFmode.  */
29266 static rtx
29267 ix86_gen_TWO52 (enum machine_mode mode)
29268 {
29269   REAL_VALUE_TYPE TWO52r;
29270   rtx TWO52;
29271
29272   real_ldexp (&TWO52r, &dconst1, mode == DFmode ? 52 : 23);
29273   TWO52 = const_double_from_real_value (TWO52r, mode);
29274   TWO52 = force_reg (mode, TWO52);
29275
29276   return TWO52;
29277 }
29278
29279 /* Expand SSE sequence for computing lround from OP1 storing
29280    into OP0.  */
29281 void
29282 ix86_expand_lround (rtx op0, rtx op1)
29283 {
29284   /* C code for the stuff we're doing below:
29285        tmp = op1 + copysign (nextafter (0.5, 0.0), op1)
29286        return (long)tmp;
29287    */
29288   enum machine_mode mode = GET_MODE (op1);
29289   const struct real_format *fmt;
29290   REAL_VALUE_TYPE pred_half, half_minus_pred_half;
29291   rtx adj;
29292
29293   /* load nextafter (0.5, 0.0) */
29294   fmt = REAL_MODE_FORMAT (mode);
29295   real_2expN (&half_minus_pred_half, -(fmt->p) - 1, mode);
29296   REAL_ARITHMETIC (pred_half, MINUS_EXPR, dconsthalf, half_minus_pred_half);
29297
29298   /* adj = copysign (0.5, op1) */
29299   adj = force_reg (mode, const_double_from_real_value (pred_half, mode));
29300   ix86_sse_copysign_to_positive (adj, adj, force_reg (mode, op1), NULL_RTX);
29301
29302   /* adj = op1 + adj */
29303   adj = expand_simple_binop (mode, PLUS, adj, op1, NULL_RTX, 0, OPTAB_DIRECT);
29304
29305   /* op0 = (imode)adj */
29306   expand_fix (op0, adj, 0);
29307 }
29308
29309 /* Expand SSE2 sequence for computing lround from OPERAND1 storing
29310    into OPERAND0.  */
29311 void
29312 ix86_expand_lfloorceil (rtx op0, rtx op1, bool do_floor)
29313 {
29314   /* C code for the stuff we're doing below (for do_floor):
29315         xi = (long)op1;
29316         xi -= (double)xi > op1 ? 1 : 0;
29317         return xi;
29318    */
29319   enum machine_mode fmode = GET_MODE (op1);
29320   enum machine_mode imode = GET_MODE (op0);
29321   rtx ireg, freg, label, tmp;
29322
29323   /* reg = (long)op1 */
29324   ireg = gen_reg_rtx (imode);
29325   expand_fix (ireg, op1, 0);
29326
29327   /* freg = (double)reg */
29328   freg = gen_reg_rtx (fmode);
29329   expand_float (freg, ireg, 0);
29330
29331   /* ireg = (freg > op1) ? ireg - 1 : ireg */
29332   label = ix86_expand_sse_compare_and_jump (UNLE,
29333                                             freg, op1, !do_floor);
29334   tmp = expand_simple_binop (imode, do_floor ? MINUS : PLUS,
29335                              ireg, const1_rtx, NULL_RTX, 0, OPTAB_DIRECT);
29336   emit_move_insn (ireg, tmp);
29337
29338   emit_label (label);
29339   LABEL_NUSES (label) = 1;
29340
29341   emit_move_insn (op0, ireg);
29342 }
29343
29344 /* Expand rint (IEEE round to nearest) rounding OPERAND1 and storing the
29345    result in OPERAND0.  */
29346 void
29347 ix86_expand_rint (rtx operand0, rtx operand1)
29348 {
29349   /* C code for the stuff we're doing below:
29350         xa = fabs (operand1);
29351         if (!isless (xa, 2**52))
29352           return operand1;
29353         xa = xa + 2**52 - 2**52;
29354         return copysign (xa, operand1);
29355    */
29356   enum machine_mode mode = GET_MODE (operand0);
29357   rtx res, xa, label, TWO52, mask;
29358
29359   res = gen_reg_rtx (mode);
29360   emit_move_insn (res, operand1);
29361
29362   /* xa = abs (operand1) */
29363   xa = ix86_expand_sse_fabs (res, &mask);
29364
29365   /* if (!isless (xa, TWO52)) goto label; */
29366   TWO52 = ix86_gen_TWO52 (mode);
29367   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
29368
29369   xa = expand_simple_binop (mode, PLUS, xa, TWO52, NULL_RTX, 0, OPTAB_DIRECT);
29370   xa = expand_simple_binop (mode, MINUS, xa, TWO52, xa, 0, OPTAB_DIRECT);
29371
29372   ix86_sse_copysign_to_positive (res, xa, res, mask);
29373
29374   emit_label (label);
29375   LABEL_NUSES (label) = 1;
29376
29377   emit_move_insn (operand0, res);
29378 }
29379
29380 /* Expand SSE2 sequence for computing floor or ceil from OPERAND1 storing
29381    into OPERAND0.  */
29382 void
29383 ix86_expand_floorceildf_32 (rtx operand0, rtx operand1, bool do_floor)
29384 {
29385   /* C code for the stuff we expand below.
29386         double xa = fabs (x), x2;
29387         if (!isless (xa, TWO52))
29388           return x;
29389         xa = xa + TWO52 - TWO52;
29390         x2 = copysign (xa, x);
29391      Compensate.  Floor:
29392         if (x2 > x)
29393           x2 -= 1;
29394      Compensate.  Ceil:
29395         if (x2 < x)
29396           x2 -= -1;
29397         return x2;
29398    */
29399   enum machine_mode mode = GET_MODE (operand0);
29400   rtx xa, TWO52, tmp, label, one, res, mask;
29401
29402   TWO52 = ix86_gen_TWO52 (mode);
29403
29404   /* Temporary for holding the result, initialized to the input
29405      operand to ease control flow.  */
29406   res = gen_reg_rtx (mode);
29407   emit_move_insn (res, operand1);
29408
29409   /* xa = abs (operand1) */
29410   xa = ix86_expand_sse_fabs (res, &mask);
29411
29412   /* if (!isless (xa, TWO52)) goto label; */
29413   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
29414
29415   /* xa = xa + TWO52 - TWO52; */
29416   xa = expand_simple_binop (mode, PLUS, xa, TWO52, NULL_RTX, 0, OPTAB_DIRECT);
29417   xa = expand_simple_binop (mode, MINUS, xa, TWO52, xa, 0, OPTAB_DIRECT);
29418
29419   /* xa = copysign (xa, operand1) */
29420   ix86_sse_copysign_to_positive (xa, xa, res, mask);
29421
29422   /* generate 1.0 or -1.0 */
29423   one = force_reg (mode,
29424                    const_double_from_real_value (do_floor
29425                                                  ? dconst1 : dconstm1, mode));
29426
29427   /* Compensate: xa = xa - (xa > operand1 ? 1 : 0) */
29428   tmp = ix86_expand_sse_compare_mask (UNGT, xa, res, !do_floor);
29429   emit_insn (gen_rtx_SET (VOIDmode, tmp,
29430                           gen_rtx_AND (mode, one, tmp)));
29431   /* We always need to subtract here to preserve signed zero.  */
29432   tmp = expand_simple_binop (mode, MINUS,
29433                              xa, tmp, NULL_RTX, 0, OPTAB_DIRECT);
29434   emit_move_insn (res, tmp);
29435
29436   emit_label (label);
29437   LABEL_NUSES (label) = 1;
29438
29439   emit_move_insn (operand0, res);
29440 }
29441
29442 /* Expand SSE2 sequence for computing floor or ceil from OPERAND1 storing
29443    into OPERAND0.  */
29444 void
29445 ix86_expand_floorceil (rtx operand0, rtx operand1, bool do_floor)
29446 {
29447   /* C code for the stuff we expand below.
29448         double xa = fabs (x), x2;
29449         if (!isless (xa, TWO52))
29450           return x;
29451         x2 = (double)(long)x;
29452      Compensate.  Floor:
29453         if (x2 > x)
29454           x2 -= 1;
29455      Compensate.  Ceil:
29456         if (x2 < x)
29457           x2 += 1;
29458         if (HONOR_SIGNED_ZEROS (mode))
29459           return copysign (x2, x);
29460         return x2;
29461    */
29462   enum machine_mode mode = GET_MODE (operand0);
29463   rtx xa, xi, TWO52, tmp, label, one, res, mask;
29464
29465   TWO52 = ix86_gen_TWO52 (mode);
29466
29467   /* Temporary for holding the result, initialized to the input
29468      operand to ease control flow.  */
29469   res = gen_reg_rtx (mode);
29470   emit_move_insn (res, operand1);
29471
29472   /* xa = abs (operand1) */
29473   xa = ix86_expand_sse_fabs (res, &mask);
29474
29475   /* if (!isless (xa, TWO52)) goto label; */
29476   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
29477
29478   /* xa = (double)(long)x */
29479   xi = gen_reg_rtx (mode == DFmode ? DImode : SImode);
29480   expand_fix (xi, res, 0);
29481   expand_float (xa, xi, 0);
29482
29483   /* generate 1.0 */
29484   one = force_reg (mode, const_double_from_real_value (dconst1, mode));
29485
29486   /* Compensate: xa = xa - (xa > operand1 ? 1 : 0) */
29487   tmp = ix86_expand_sse_compare_mask (UNGT, xa, res, !do_floor);
29488   emit_insn (gen_rtx_SET (VOIDmode, tmp,
29489                           gen_rtx_AND (mode, one, tmp)));
29490   tmp = expand_simple_binop (mode, do_floor ? MINUS : PLUS,
29491                              xa, tmp, NULL_RTX, 0, OPTAB_DIRECT);
29492   emit_move_insn (res, tmp);
29493
29494   if (HONOR_SIGNED_ZEROS (mode))
29495     ix86_sse_copysign_to_positive (res, res, force_reg (mode, operand1), mask);
29496
29497   emit_label (label);
29498   LABEL_NUSES (label) = 1;
29499
29500   emit_move_insn (operand0, res);
29501 }
29502
29503 /* Expand SSE sequence for computing round from OPERAND1 storing
29504    into OPERAND0.  Sequence that works without relying on DImode truncation
29505    via cvttsd2siq that is only available on 64bit targets.  */
29506 void
29507 ix86_expand_rounddf_32 (rtx operand0, rtx operand1)
29508 {
29509   /* C code for the stuff we expand below.
29510         double xa = fabs (x), xa2, x2;
29511         if (!isless (xa, TWO52))
29512           return x;
29513      Using the absolute value and copying back sign makes
29514      -0.0 -> -0.0 correct.
29515         xa2 = xa + TWO52 - TWO52;
29516      Compensate.
29517         dxa = xa2 - xa;
29518         if (dxa <= -0.5)
29519           xa2 += 1;
29520         else if (dxa > 0.5)
29521           xa2 -= 1;
29522         x2 = copysign (xa2, x);
29523         return x2;
29524    */
29525   enum machine_mode mode = GET_MODE (operand0);
29526   rtx xa, xa2, dxa, TWO52, tmp, label, half, mhalf, one, res, mask;
29527
29528   TWO52 = ix86_gen_TWO52 (mode);
29529
29530   /* Temporary for holding the result, initialized to the input
29531      operand to ease control flow.  */
29532   res = gen_reg_rtx (mode);
29533   emit_move_insn (res, operand1);
29534
29535   /* xa = abs (operand1) */
29536   xa = ix86_expand_sse_fabs (res, &mask);
29537
29538   /* if (!isless (xa, TWO52)) goto label; */
29539   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
29540
29541   /* xa2 = xa + TWO52 - TWO52; */
29542   xa2 = expand_simple_binop (mode, PLUS, xa, TWO52, NULL_RTX, 0, OPTAB_DIRECT);
29543   xa2 = expand_simple_binop (mode, MINUS, xa2, TWO52, xa2, 0, OPTAB_DIRECT);
29544
29545   /* dxa = xa2 - xa; */
29546   dxa = expand_simple_binop (mode, MINUS, xa2, xa, NULL_RTX, 0, OPTAB_DIRECT);
29547
29548   /* generate 0.5, 1.0 and -0.5 */
29549   half = force_reg (mode, const_double_from_real_value (dconsthalf, mode));
29550   one = expand_simple_binop (mode, PLUS, half, half, NULL_RTX, 0, OPTAB_DIRECT);
29551   mhalf = expand_simple_binop (mode, MINUS, half, one, NULL_RTX,
29552                                0, OPTAB_DIRECT);
29553
29554   /* Compensate.  */
29555   tmp = gen_reg_rtx (mode);
29556   /* xa2 = xa2 - (dxa > 0.5 ? 1 : 0) */
29557   tmp = ix86_expand_sse_compare_mask (UNGT, dxa, half, false);
29558   emit_insn (gen_rtx_SET (VOIDmode, tmp,
29559                           gen_rtx_AND (mode, one, tmp)));
29560   xa2 = expand_simple_binop (mode, MINUS, xa2, tmp, NULL_RTX, 0, OPTAB_DIRECT);
29561   /* xa2 = xa2 + (dxa <= -0.5 ? 1 : 0) */
29562   tmp = ix86_expand_sse_compare_mask (UNGE, mhalf, dxa, false);
29563   emit_insn (gen_rtx_SET (VOIDmode, tmp,
29564                           gen_rtx_AND (mode, one, tmp)));
29565   xa2 = expand_simple_binop (mode, PLUS, xa2, tmp, NULL_RTX, 0, OPTAB_DIRECT);
29566
29567   /* res = copysign (xa2, operand1) */
29568   ix86_sse_copysign_to_positive (res, xa2, force_reg (mode, operand1), mask);
29569
29570   emit_label (label);
29571   LABEL_NUSES (label) = 1;
29572
29573   emit_move_insn (operand0, res);
29574 }
29575
29576 /* Expand SSE sequence for computing trunc from OPERAND1 storing
29577    into OPERAND0.  */
29578 void
29579 ix86_expand_trunc (rtx operand0, rtx operand1)
29580 {
29581   /* C code for SSE variant we expand below.
29582         double xa = fabs (x), x2;
29583         if (!isless (xa, TWO52))
29584           return x;
29585         x2 = (double)(long)x;
29586         if (HONOR_SIGNED_ZEROS (mode))
29587           return copysign (x2, x);
29588         return x2;
29589    */
29590   enum machine_mode mode = GET_MODE (operand0);
29591   rtx xa, xi, TWO52, label, res, mask;
29592
29593   TWO52 = ix86_gen_TWO52 (mode);
29594
29595   /* Temporary for holding the result, initialized to the input
29596      operand to ease control flow.  */
29597   res = gen_reg_rtx (mode);
29598   emit_move_insn (res, operand1);
29599
29600   /* xa = abs (operand1) */
29601   xa = ix86_expand_sse_fabs (res, &mask);
29602
29603   /* if (!isless (xa, TWO52)) goto label; */
29604   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
29605
29606   /* x = (double)(long)x */
29607   xi = gen_reg_rtx (mode == DFmode ? DImode : SImode);
29608   expand_fix (xi, res, 0);
29609   expand_float (res, xi, 0);
29610
29611   if (HONOR_SIGNED_ZEROS (mode))
29612     ix86_sse_copysign_to_positive (res, res, force_reg (mode, operand1), mask);
29613
29614   emit_label (label);
29615   LABEL_NUSES (label) = 1;
29616
29617   emit_move_insn (operand0, res);
29618 }
29619
29620 /* Expand SSE sequence for computing trunc from OPERAND1 storing
29621    into OPERAND0.  */
29622 void
29623 ix86_expand_truncdf_32 (rtx operand0, rtx operand1)
29624 {
29625   enum machine_mode mode = GET_MODE (operand0);
29626   rtx xa, mask, TWO52, label, one, res, smask, tmp;
29627
29628   /* C code for SSE variant we expand below.
29629         double xa = fabs (x), x2;
29630         if (!isless (xa, TWO52))
29631           return x;
29632         xa2 = xa + TWO52 - TWO52;
29633      Compensate:
29634         if (xa2 > xa)
29635           xa2 -= 1.0;
29636         x2 = copysign (xa2, x);
29637         return x2;
29638    */
29639
29640   TWO52 = ix86_gen_TWO52 (mode);
29641
29642   /* Temporary for holding the result, initialized to the input
29643      operand to ease control flow.  */
29644   res = gen_reg_rtx (mode);
29645   emit_move_insn (res, operand1);
29646
29647   /* xa = abs (operand1) */
29648   xa = ix86_expand_sse_fabs (res, &smask);
29649
29650   /* if (!isless (xa, TWO52)) goto label; */
29651   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
29652
29653   /* res = xa + TWO52 - TWO52; */
29654   tmp = expand_simple_binop (mode, PLUS, xa, TWO52, NULL_RTX, 0, OPTAB_DIRECT);
29655   tmp = expand_simple_binop (mode, MINUS, tmp, TWO52, tmp, 0, OPTAB_DIRECT);
29656   emit_move_insn (res, tmp);
29657
29658   /* generate 1.0 */
29659   one = force_reg (mode, const_double_from_real_value (dconst1, mode));
29660
29661   /* Compensate: res = xa2 - (res > xa ? 1 : 0)  */
29662   mask = ix86_expand_sse_compare_mask (UNGT, res, xa, false);
29663   emit_insn (gen_rtx_SET (VOIDmode, mask,
29664                           gen_rtx_AND (mode, mask, one)));
29665   tmp = expand_simple_binop (mode, MINUS,
29666                              res, mask, NULL_RTX, 0, OPTAB_DIRECT);
29667   emit_move_insn (res, tmp);
29668
29669   /* res = copysign (res, operand1) */
29670   ix86_sse_copysign_to_positive (res, res, force_reg (mode, operand1), smask);
29671
29672   emit_label (label);
29673   LABEL_NUSES (label) = 1;
29674
29675   emit_move_insn (operand0, res);
29676 }
29677
29678 /* Expand SSE sequence for computing round from OPERAND1 storing
29679    into OPERAND0.  */
29680 void
29681 ix86_expand_round (rtx operand0, rtx operand1)
29682 {
29683   /* C code for the stuff we're doing below:
29684         double xa = fabs (x);
29685         if (!isless (xa, TWO52))
29686           return x;
29687         xa = (double)(long)(xa + nextafter (0.5, 0.0));
29688         return copysign (xa, x);
29689    */
29690   enum machine_mode mode = GET_MODE (operand0);
29691   rtx res, TWO52, xa, label, xi, half, mask;
29692   const struct real_format *fmt;
29693   REAL_VALUE_TYPE pred_half, half_minus_pred_half;
29694
29695   /* Temporary for holding the result, initialized to the input
29696      operand to ease control flow.  */
29697   res = gen_reg_rtx (mode);
29698   emit_move_insn (res, operand1);
29699
29700   TWO52 = ix86_gen_TWO52 (mode);
29701   xa = ix86_expand_sse_fabs (res, &mask);
29702   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
29703
29704   /* load nextafter (0.5, 0.0) */
29705   fmt = REAL_MODE_FORMAT (mode);
29706   real_2expN (&half_minus_pred_half, -(fmt->p) - 1, mode);
29707   REAL_ARITHMETIC (pred_half, MINUS_EXPR, dconsthalf, half_minus_pred_half);
29708
29709   /* xa = xa + 0.5 */
29710   half = force_reg (mode, const_double_from_real_value (pred_half, mode));
29711   xa = expand_simple_binop (mode, PLUS, xa, half, NULL_RTX, 0, OPTAB_DIRECT);
29712
29713   /* xa = (double)(int64_t)xa */
29714   xi = gen_reg_rtx (mode == DFmode ? DImode : SImode);
29715   expand_fix (xi, xa, 0);
29716   expand_float (xa, xi, 0);
29717
29718   /* res = copysign (xa, operand1) */
29719   ix86_sse_copysign_to_positive (res, xa, force_reg (mode, operand1), mask);
29720
29721   emit_label (label);
29722   LABEL_NUSES (label) = 1;
29723
29724   emit_move_insn (operand0, res);
29725 }
29726
29727 \f
29728 /* Validate whether a SSE5 instruction is valid or not.
29729    OPERANDS is the array of operands.
29730    NUM is the number of operands.
29731    USES_OC0 is true if the instruction uses OC0 and provides 4 variants.
29732    NUM_MEMORY is the maximum number of memory operands to accept.  
29733    when COMMUTATIVE is set, operand 1 and 2 can be swapped.  */
29734
29735 bool
29736 ix86_sse5_valid_op_p (rtx operands[], rtx insn ATTRIBUTE_UNUSED, int num,
29737                       bool uses_oc0, int num_memory, bool commutative)
29738 {
29739   int mem_mask;
29740   int mem_count;
29741   int i;
29742
29743   /* Count the number of memory arguments */
29744   mem_mask = 0;
29745   mem_count = 0;
29746   for (i = 0; i < num; i++)
29747     {
29748       enum machine_mode mode = GET_MODE (operands[i]);
29749       if (register_operand (operands[i], mode))
29750         ;
29751
29752       else if (memory_operand (operands[i], mode))
29753         {
29754           mem_mask |= (1 << i);
29755           mem_count++;
29756         }
29757
29758       else
29759         {
29760           rtx pattern = PATTERN (insn);
29761
29762           /* allow 0 for pcmov */
29763           if (GET_CODE (pattern) != SET
29764               || GET_CODE (SET_SRC (pattern)) != IF_THEN_ELSE
29765               || i < 2
29766               || operands[i] != CONST0_RTX (mode))
29767             return false;
29768         }
29769     }
29770
29771   /* Special case pmacsdq{l,h} where we allow the 3rd argument to be
29772      a memory operation.  */
29773   if (num_memory < 0)
29774     {
29775       num_memory = -num_memory;
29776       if ((mem_mask & (1 << (num-1))) != 0)
29777         {
29778           mem_mask &= ~(1 << (num-1));
29779           mem_count--;
29780         }
29781     }
29782
29783   /* If there were no memory operations, allow the insn */
29784   if (mem_mask == 0)
29785     return true;
29786
29787   /* Do not allow the destination register to be a memory operand.  */
29788   else if (mem_mask & (1 << 0))
29789     return false;
29790
29791   /* If there are too many memory operations, disallow the instruction.  While
29792      the hardware only allows 1 memory reference, before register allocation
29793      for some insns, we allow two memory operations sometimes in order to allow
29794      code like the following to be optimized:
29795
29796         float fmadd (float *a, float *b, float *c) { return (*a * *b) + *c; }
29797
29798     or similar cases that are vectorized into using the fmaddss
29799     instruction.  */
29800   else if (mem_count > num_memory)
29801     return false;
29802
29803   /* Don't allow more than one memory operation if not optimizing.  */
29804   else if (mem_count > 1 && !optimize)
29805     return false;
29806
29807   else if (num == 4 && mem_count == 1)
29808     {
29809       /* formats (destination is the first argument), example fmaddss:
29810          xmm1, xmm1, xmm2, xmm3/mem
29811          xmm1, xmm1, xmm2/mem, xmm3
29812          xmm1, xmm2, xmm3/mem, xmm1
29813          xmm1, xmm2/mem, xmm3, xmm1 */
29814       if (uses_oc0)
29815         return ((mem_mask == (1 << 1))
29816                 || (mem_mask == (1 << 2))
29817                 || (mem_mask == (1 << 3)));
29818
29819       /* format, example pmacsdd:
29820          xmm1, xmm2, xmm3/mem, xmm1 */
29821       if (commutative)
29822         return (mem_mask == (1 << 2) || mem_mask == (1 << 1));
29823       else
29824         return (mem_mask == (1 << 2));
29825     }
29826
29827   else if (num == 4 && num_memory == 2)
29828     {
29829       /* If there are two memory operations, we can load one of the memory ops
29830          into the destination register.  This is for optimizing the
29831          multiply/add ops, which the combiner has optimized both the multiply
29832          and the add insns to have a memory operation.  We have to be careful
29833          that the destination doesn't overlap with the inputs.  */
29834       rtx op0 = operands[0];
29835
29836       if (reg_mentioned_p (op0, operands[1])
29837           || reg_mentioned_p (op0, operands[2])
29838           || reg_mentioned_p (op0, operands[3]))
29839         return false;
29840
29841       /* formats (destination is the first argument), example fmaddss:
29842          xmm1, xmm1, xmm2, xmm3/mem
29843          xmm1, xmm1, xmm2/mem, xmm3
29844          xmm1, xmm2, xmm3/mem, xmm1
29845          xmm1, xmm2/mem, xmm3, xmm1
29846
29847          For the oc0 case, we will load either operands[1] or operands[3] into
29848          operands[0], so any combination of 2 memory operands is ok.  */
29849       if (uses_oc0)
29850         return true;
29851
29852       /* format, example pmacsdd:
29853          xmm1, xmm2, xmm3/mem, xmm1
29854
29855          For the integer multiply/add instructions be more restrictive and
29856          require operands[2] and operands[3] to be the memory operands.  */
29857       if (commutative)
29858         return (mem_mask == ((1 << 1) | (1 << 3)) || ((1 << 2) | (1 << 3)));
29859       else
29860         return (mem_mask == ((1 << 2) | (1 << 3)));
29861     }
29862
29863   else if (num == 3 && num_memory == 1)
29864     {
29865       /* formats, example protb:
29866          xmm1, xmm2, xmm3/mem
29867          xmm1, xmm2/mem, xmm3 */
29868       if (uses_oc0)
29869         return ((mem_mask == (1 << 1)) || (mem_mask == (1 << 2)));
29870
29871       /* format, example comeq:
29872          xmm1, xmm2, xmm3/mem */
29873       else
29874         return (mem_mask == (1 << 2));
29875     }
29876
29877   else
29878     gcc_unreachable ();
29879
29880   return false;
29881 }
29882
29883 \f
29884 /* Fixup an SSE5 instruction that has 2 memory input references into a form the
29885    hardware will allow by using the destination register to load one of the
29886    memory operations.  Presently this is used by the multiply/add routines to
29887    allow 2 memory references.  */
29888
29889 void
29890 ix86_expand_sse5_multiple_memory (rtx operands[],
29891                                   int num,
29892                                   enum machine_mode mode)
29893 {
29894   rtx op0 = operands[0];
29895   if (num != 4
29896       || memory_operand (op0, mode)
29897       || reg_mentioned_p (op0, operands[1])
29898       || reg_mentioned_p (op0, operands[2])
29899       || reg_mentioned_p (op0, operands[3]))
29900     gcc_unreachable ();
29901
29902   /* For 2 memory operands, pick either operands[1] or operands[3] to move into
29903      the destination register.  */
29904   if (memory_operand (operands[1], mode))
29905     {
29906       emit_move_insn (op0, operands[1]);
29907       operands[1] = op0;
29908     }
29909   else if (memory_operand (operands[3], mode))
29910     {
29911       emit_move_insn (op0, operands[3]);
29912       operands[3] = op0;
29913     }
29914   else
29915     gcc_unreachable ();
29916
29917   return;
29918 }
29919
29920 \f
29921 /* Table of valid machine attributes.  */
29922 static const struct attribute_spec ix86_attribute_table[] =
29923 {
29924   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
29925   /* Stdcall attribute says callee is responsible for popping arguments
29926      if they are not variable.  */
29927   { "stdcall",   0, 0, false, true,  true,  ix86_handle_cconv_attribute },
29928   /* Fastcall attribute says callee is responsible for popping arguments
29929      if they are not variable.  */
29930   { "fastcall",  0, 0, false, true,  true,  ix86_handle_cconv_attribute },
29931   /* Cdecl attribute says the callee is a normal C declaration */
29932   { "cdecl",     0, 0, false, true,  true,  ix86_handle_cconv_attribute },
29933   /* Regparm attribute specifies how many integer arguments are to be
29934      passed in registers.  */
29935   { "regparm",   1, 1, false, true,  true,  ix86_handle_cconv_attribute },
29936   /* Sseregparm attribute says we are using x86_64 calling conventions
29937      for FP arguments.  */
29938   { "sseregparm", 0, 0, false, true, true, ix86_handle_cconv_attribute },
29939   /* force_align_arg_pointer says this function realigns the stack at entry.  */
29940   { (const char *)&ix86_force_align_arg_pointer_string, 0, 0,
29941     false, true,  true, ix86_handle_cconv_attribute },
29942 #if TARGET_DLLIMPORT_DECL_ATTRIBUTES
29943   { "dllimport", 0, 0, false, false, false, handle_dll_attribute },
29944   { "dllexport", 0, 0, false, false, false, handle_dll_attribute },
29945   { "shared",    0, 0, true,  false, false, ix86_handle_shared_attribute },
29946 #endif
29947   { "ms_struct", 0, 0, false, false,  false, ix86_handle_struct_attribute },
29948   { "gcc_struct", 0, 0, false, false,  false, ix86_handle_struct_attribute },
29949 #ifdef SUBTARGET_ATTRIBUTE_TABLE
29950   SUBTARGET_ATTRIBUTE_TABLE,
29951 #endif
29952   /* ms_abi and sysv_abi calling convention function attributes.  */
29953   { "ms_abi", 0, 0, false, true, true, ix86_handle_abi_attribute },
29954   { "sysv_abi", 0, 0, false, true, true, ix86_handle_abi_attribute },
29955   /* End element.  */
29956   { NULL,        0, 0, false, false, false, NULL }
29957 };
29958
29959 /* Implement targetm.vectorize.builtin_vectorization_cost.  */
29960 static int
29961 x86_builtin_vectorization_cost (bool runtime_test)
29962 {
29963   /* If the branch of the runtime test is taken - i.e. - the vectorized
29964      version is skipped - this incurs a misprediction cost (because the
29965      vectorized version is expected to be the fall-through).  So we subtract
29966      the latency of a mispredicted branch from the costs that are incured
29967      when the vectorized version is executed.
29968
29969      TODO: The values in individual target tables have to be tuned or new
29970      fields may be needed. For eg. on K8, the default branch path is the
29971      not-taken path. If the taken path is predicted correctly, the minimum
29972      penalty of going down the taken-path is 1 cycle. If the taken-path is
29973      not predicted correctly, then the minimum penalty is 10 cycles.  */
29974
29975   if (runtime_test)
29976     {
29977       return (-(ix86_cost->cond_taken_branch_cost));
29978     }
29979   else
29980     return 0;
29981 }
29982
29983 /* This function returns the calling abi specific va_list type node.
29984    It returns  the FNDECL specific va_list type.  */
29985
29986 tree
29987 ix86_fn_abi_va_list (tree fndecl)
29988 {
29989   if (!TARGET_64BIT)
29990     return va_list_type_node;
29991   gcc_assert (fndecl != NULL_TREE);
29992
29993   if (ix86_function_abi ((const_tree) fndecl) == MS_ABI)
29994     return ms_va_list_type_node;
29995   else
29996     return sysv_va_list_type_node;
29997 }
29998
29999 /* Returns the canonical va_list type specified by TYPE. If there
30000    is no valid TYPE provided, it return NULL_TREE.  */
30001
30002 tree
30003 ix86_canonical_va_list_type (tree type)
30004 {
30005   tree wtype, htype;
30006
30007   /* Resolve references and pointers to va_list type.  */
30008   if (INDIRECT_REF_P (type))
30009     type = TREE_TYPE (type);
30010   else if (POINTER_TYPE_P (type) && POINTER_TYPE_P (TREE_TYPE(type)))
30011     type = TREE_TYPE (type);
30012
30013   if (TARGET_64BIT)
30014     {
30015       wtype = va_list_type_node;
30016           gcc_assert (wtype != NULL_TREE);
30017       htype = type;
30018       if (TREE_CODE (wtype) == ARRAY_TYPE)
30019         {
30020           /* If va_list is an array type, the argument may have decayed
30021              to a pointer type, e.g. by being passed to another function.
30022              In that case, unwrap both types so that we can compare the
30023              underlying records.  */
30024           if (TREE_CODE (htype) == ARRAY_TYPE
30025               || POINTER_TYPE_P (htype))
30026             {
30027               wtype = TREE_TYPE (wtype);
30028               htype = TREE_TYPE (htype);
30029             }
30030         }
30031       if (TYPE_MAIN_VARIANT (wtype) == TYPE_MAIN_VARIANT (htype))
30032         return va_list_type_node;
30033       wtype = sysv_va_list_type_node;
30034           gcc_assert (wtype != NULL_TREE);
30035       htype = type;
30036       if (TREE_CODE (wtype) == ARRAY_TYPE)
30037         {
30038           /* If va_list is an array type, the argument may have decayed
30039              to a pointer type, e.g. by being passed to another function.
30040              In that case, unwrap both types so that we can compare the
30041              underlying records.  */
30042           if (TREE_CODE (htype) == ARRAY_TYPE
30043               || POINTER_TYPE_P (htype))
30044             {
30045               wtype = TREE_TYPE (wtype);
30046               htype = TREE_TYPE (htype);
30047             }
30048         }
30049       if (TYPE_MAIN_VARIANT (wtype) == TYPE_MAIN_VARIANT (htype))
30050         return sysv_va_list_type_node;
30051       wtype = ms_va_list_type_node;
30052           gcc_assert (wtype != NULL_TREE);
30053       htype = type;
30054       if (TREE_CODE (wtype) == ARRAY_TYPE)
30055         {
30056           /* If va_list is an array type, the argument may have decayed
30057              to a pointer type, e.g. by being passed to another function.
30058              In that case, unwrap both types so that we can compare the
30059              underlying records.  */
30060           if (TREE_CODE (htype) == ARRAY_TYPE
30061               || POINTER_TYPE_P (htype))
30062             {
30063               wtype = TREE_TYPE (wtype);
30064               htype = TREE_TYPE (htype);
30065             }
30066         }
30067       if (TYPE_MAIN_VARIANT (wtype) == TYPE_MAIN_VARIANT (htype))
30068         return ms_va_list_type_node;
30069       return NULL_TREE;
30070     }
30071   return std_canonical_va_list_type (type);
30072 }
30073
30074 /* Iterate through the target-specific builtin types for va_list.
30075     IDX denotes the iterator, *PTREE is set to the result type of
30076     the va_list builtin, and *PNAME to its internal type.
30077     Returns zero if there is no element for this index, otherwise
30078     IDX should be increased upon the next call.
30079     Note, do not iterate a base builtin's name like __builtin_va_list.
30080     Used from c_common_nodes_and_builtins.  */
30081
30082 int
30083 ix86_enum_va_list (int idx, const char **pname, tree *ptree)
30084 {
30085   if (!TARGET_64BIT)
30086     return 0;
30087   switch (idx) {
30088   case 0:
30089     *ptree = ms_va_list_type_node;
30090     *pname = "__builtin_ms_va_list";
30091     break;
30092   case 1:
30093     *ptree = sysv_va_list_type_node;
30094     *pname = "__builtin_sysv_va_list";
30095     break;
30096   default:
30097     return 0;
30098   }
30099   return 1;
30100 }
30101
30102 /* Initialize the GCC target structure.  */
30103 #undef TARGET_RETURN_IN_MEMORY
30104 #define TARGET_RETURN_IN_MEMORY ix86_return_in_memory
30105
30106 #undef TARGET_LEGITIMIZE_ADDRESS
30107 #define TARGET_LEGITIMIZE_ADDRESS ix86_legitimize_address
30108
30109 #undef TARGET_ATTRIBUTE_TABLE
30110 #define TARGET_ATTRIBUTE_TABLE ix86_attribute_table
30111 #if TARGET_DLLIMPORT_DECL_ATTRIBUTES
30112 #  undef TARGET_MERGE_DECL_ATTRIBUTES
30113 #  define TARGET_MERGE_DECL_ATTRIBUTES merge_dllimport_decl_attributes
30114 #endif
30115
30116 #undef TARGET_COMP_TYPE_ATTRIBUTES
30117 #define TARGET_COMP_TYPE_ATTRIBUTES ix86_comp_type_attributes
30118
30119 #undef TARGET_INIT_BUILTINS
30120 #define TARGET_INIT_BUILTINS ix86_init_builtins
30121 #undef TARGET_EXPAND_BUILTIN
30122 #define TARGET_EXPAND_BUILTIN ix86_expand_builtin
30123
30124 #undef TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION
30125 #define TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION \
30126   ix86_builtin_vectorized_function
30127
30128 #undef TARGET_VECTORIZE_BUILTIN_CONVERSION
30129 #define TARGET_VECTORIZE_BUILTIN_CONVERSION ix86_vectorize_builtin_conversion
30130
30131 #undef TARGET_BUILTIN_RECIPROCAL
30132 #define TARGET_BUILTIN_RECIPROCAL ix86_builtin_reciprocal
30133
30134 #undef TARGET_ASM_FUNCTION_EPILOGUE
30135 #define TARGET_ASM_FUNCTION_EPILOGUE ix86_output_function_epilogue
30136
30137 #undef TARGET_ENCODE_SECTION_INFO
30138 #ifndef SUBTARGET_ENCODE_SECTION_INFO
30139 #define TARGET_ENCODE_SECTION_INFO ix86_encode_section_info
30140 #else
30141 #define TARGET_ENCODE_SECTION_INFO SUBTARGET_ENCODE_SECTION_INFO
30142 #endif
30143
30144 #undef TARGET_ASM_OPEN_PAREN
30145 #define TARGET_ASM_OPEN_PAREN ""
30146 #undef TARGET_ASM_CLOSE_PAREN
30147 #define TARGET_ASM_CLOSE_PAREN ""
30148
30149 #undef TARGET_ASM_ALIGNED_HI_OP
30150 #define TARGET_ASM_ALIGNED_HI_OP ASM_SHORT
30151 #undef TARGET_ASM_ALIGNED_SI_OP
30152 #define TARGET_ASM_ALIGNED_SI_OP ASM_LONG
30153 #ifdef ASM_QUAD
30154 #undef TARGET_ASM_ALIGNED_DI_OP
30155 #define TARGET_ASM_ALIGNED_DI_OP ASM_QUAD
30156 #endif
30157
30158 #undef TARGET_ASM_UNALIGNED_HI_OP
30159 #define TARGET_ASM_UNALIGNED_HI_OP TARGET_ASM_ALIGNED_HI_OP
30160 #undef TARGET_ASM_UNALIGNED_SI_OP
30161 #define TARGET_ASM_UNALIGNED_SI_OP TARGET_ASM_ALIGNED_SI_OP
30162 #undef TARGET_ASM_UNALIGNED_DI_OP
30163 #define TARGET_ASM_UNALIGNED_DI_OP TARGET_ASM_ALIGNED_DI_OP
30164
30165 #undef TARGET_SCHED_ADJUST_COST
30166 #define TARGET_SCHED_ADJUST_COST ix86_adjust_cost
30167 #undef TARGET_SCHED_ISSUE_RATE
30168 #define TARGET_SCHED_ISSUE_RATE ix86_issue_rate
30169 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
30170 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD \
30171   ia32_multipass_dfa_lookahead
30172
30173 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
30174 #define TARGET_FUNCTION_OK_FOR_SIBCALL ix86_function_ok_for_sibcall
30175
30176 #ifdef HAVE_AS_TLS
30177 #undef TARGET_HAVE_TLS
30178 #define TARGET_HAVE_TLS true
30179 #endif
30180 #undef TARGET_CANNOT_FORCE_CONST_MEM
30181 #define TARGET_CANNOT_FORCE_CONST_MEM ix86_cannot_force_const_mem
30182 #undef TARGET_USE_BLOCKS_FOR_CONSTANT_P
30183 #define TARGET_USE_BLOCKS_FOR_CONSTANT_P hook_bool_mode_const_rtx_true
30184
30185 #undef TARGET_DELEGITIMIZE_ADDRESS
30186 #define TARGET_DELEGITIMIZE_ADDRESS ix86_delegitimize_address
30187
30188 #undef TARGET_MS_BITFIELD_LAYOUT_P
30189 #define TARGET_MS_BITFIELD_LAYOUT_P ix86_ms_bitfield_layout_p
30190
30191 #if TARGET_MACHO
30192 #undef TARGET_BINDS_LOCAL_P
30193 #define TARGET_BINDS_LOCAL_P darwin_binds_local_p
30194 #endif
30195 #if TARGET_DLLIMPORT_DECL_ATTRIBUTES
30196 #undef TARGET_BINDS_LOCAL_P
30197 #define TARGET_BINDS_LOCAL_P i386_pe_binds_local_p
30198 #endif
30199
30200 #undef TARGET_ASM_OUTPUT_MI_THUNK
30201 #define TARGET_ASM_OUTPUT_MI_THUNK x86_output_mi_thunk
30202 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
30203 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK x86_can_output_mi_thunk
30204
30205 #undef TARGET_ASM_FILE_START
30206 #define TARGET_ASM_FILE_START x86_file_start
30207
30208 #undef TARGET_DEFAULT_TARGET_FLAGS
30209 #define TARGET_DEFAULT_TARGET_FLAGS     \
30210   (TARGET_DEFAULT                       \
30211    | TARGET_SUBTARGET_DEFAULT           \
30212    | TARGET_TLS_DIRECT_SEG_REFS_DEFAULT)
30213
30214 #undef TARGET_HANDLE_OPTION
30215 #define TARGET_HANDLE_OPTION ix86_handle_option
30216
30217 #undef TARGET_RTX_COSTS
30218 #define TARGET_RTX_COSTS ix86_rtx_costs
30219 #undef TARGET_ADDRESS_COST
30220 #define TARGET_ADDRESS_COST ix86_address_cost
30221
30222 #undef TARGET_FIXED_CONDITION_CODE_REGS
30223 #define TARGET_FIXED_CONDITION_CODE_REGS ix86_fixed_condition_code_regs
30224 #undef TARGET_CC_MODES_COMPATIBLE
30225 #define TARGET_CC_MODES_COMPATIBLE ix86_cc_modes_compatible
30226
30227 #undef TARGET_MACHINE_DEPENDENT_REORG
30228 #define TARGET_MACHINE_DEPENDENT_REORG ix86_reorg
30229
30230 #undef TARGET_BUILTIN_SETJMP_FRAME_VALUE
30231 #define TARGET_BUILTIN_SETJMP_FRAME_VALUE ix86_builtin_setjmp_frame_value
30232
30233 #undef TARGET_BUILD_BUILTIN_VA_LIST
30234 #define TARGET_BUILD_BUILTIN_VA_LIST ix86_build_builtin_va_list
30235
30236 #undef TARGET_FN_ABI_VA_LIST
30237 #define TARGET_FN_ABI_VA_LIST ix86_fn_abi_va_list
30238
30239 #undef TARGET_CANONICAL_VA_LIST_TYPE
30240 #define TARGET_CANONICAL_VA_LIST_TYPE ix86_canonical_va_list_type
30241
30242 #undef TARGET_EXPAND_BUILTIN_VA_START
30243 #define TARGET_EXPAND_BUILTIN_VA_START ix86_va_start
30244
30245 #undef TARGET_MD_ASM_CLOBBERS
30246 #define TARGET_MD_ASM_CLOBBERS ix86_md_asm_clobbers
30247
30248 #undef TARGET_PROMOTE_PROTOTYPES
30249 #define TARGET_PROMOTE_PROTOTYPES hook_bool_const_tree_true
30250 #undef TARGET_STRUCT_VALUE_RTX
30251 #define TARGET_STRUCT_VALUE_RTX ix86_struct_value_rtx
30252 #undef TARGET_SETUP_INCOMING_VARARGS
30253 #define TARGET_SETUP_INCOMING_VARARGS ix86_setup_incoming_varargs
30254 #undef TARGET_MUST_PASS_IN_STACK
30255 #define TARGET_MUST_PASS_IN_STACK ix86_must_pass_in_stack
30256 #undef TARGET_PASS_BY_REFERENCE
30257 #define TARGET_PASS_BY_REFERENCE ix86_pass_by_reference
30258 #undef TARGET_INTERNAL_ARG_POINTER
30259 #define TARGET_INTERNAL_ARG_POINTER ix86_internal_arg_pointer
30260 #undef TARGET_UPDATE_STACK_BOUNDARY
30261 #define TARGET_UPDATE_STACK_BOUNDARY ix86_update_stack_boundary
30262 #undef TARGET_GET_DRAP_RTX
30263 #define TARGET_GET_DRAP_RTX ix86_get_drap_rtx
30264 #undef TARGET_DWARF_HANDLE_FRAME_UNSPEC
30265 #define TARGET_DWARF_HANDLE_FRAME_UNSPEC ix86_dwarf_handle_frame_unspec
30266 #undef TARGET_STRICT_ARGUMENT_NAMING
30267 #define TARGET_STRICT_ARGUMENT_NAMING hook_bool_CUMULATIVE_ARGS_true
30268
30269 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
30270 #define TARGET_GIMPLIFY_VA_ARG_EXPR ix86_gimplify_va_arg
30271
30272 #undef TARGET_SCALAR_MODE_SUPPORTED_P
30273 #define TARGET_SCALAR_MODE_SUPPORTED_P ix86_scalar_mode_supported_p
30274
30275 #undef TARGET_VECTOR_MODE_SUPPORTED_P
30276 #define TARGET_VECTOR_MODE_SUPPORTED_P ix86_vector_mode_supported_p
30277
30278 #undef TARGET_C_MODE_FOR_SUFFIX
30279 #define TARGET_C_MODE_FOR_SUFFIX ix86_c_mode_for_suffix
30280
30281 #ifdef HAVE_AS_TLS
30282 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
30283 #define TARGET_ASM_OUTPUT_DWARF_DTPREL i386_output_dwarf_dtprel
30284 #endif
30285
30286 #ifdef SUBTARGET_INSERT_ATTRIBUTES
30287 #undef TARGET_INSERT_ATTRIBUTES
30288 #define TARGET_INSERT_ATTRIBUTES SUBTARGET_INSERT_ATTRIBUTES
30289 #endif
30290
30291 #undef TARGET_MANGLE_TYPE
30292 #define TARGET_MANGLE_TYPE ix86_mangle_type
30293
30294 #undef TARGET_STACK_PROTECT_FAIL
30295 #define TARGET_STACK_PROTECT_FAIL ix86_stack_protect_fail
30296
30297 #undef TARGET_FUNCTION_VALUE
30298 #define TARGET_FUNCTION_VALUE ix86_function_value
30299
30300 #undef TARGET_SECONDARY_RELOAD
30301 #define TARGET_SECONDARY_RELOAD ix86_secondary_reload
30302
30303 #undef TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST
30304 #define TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST x86_builtin_vectorization_cost
30305
30306 #undef TARGET_SET_CURRENT_FUNCTION
30307 #define TARGET_SET_CURRENT_FUNCTION ix86_set_current_function
30308
30309 #undef TARGET_OPTION_VALID_ATTRIBUTE_P
30310 #define TARGET_OPTION_VALID_ATTRIBUTE_P ix86_valid_target_attribute_p
30311
30312 #undef TARGET_OPTION_SAVE
30313 #define TARGET_OPTION_SAVE ix86_function_specific_save
30314
30315 #undef TARGET_OPTION_RESTORE
30316 #define TARGET_OPTION_RESTORE ix86_function_specific_restore
30317
30318 #undef TARGET_OPTION_PRINT
30319 #define TARGET_OPTION_PRINT ix86_function_specific_print
30320
30321 #undef TARGET_OPTION_CAN_INLINE_P
30322 #define TARGET_OPTION_CAN_INLINE_P ix86_can_inline_p
30323
30324 #undef TARGET_EXPAND_TO_RTL_HOOK
30325 #define TARGET_EXPAND_TO_RTL_HOOK ix86_maybe_switch_abi
30326
30327 #undef TARGET_LEGITIMATE_ADDRESS_P
30328 #define TARGET_LEGITIMATE_ADDRESS_P ix86_legitimate_address_p
30329
30330 struct gcc_target targetm = TARGET_INITIALIZER;
30331 \f
30332 #include "gt-i386.h"