OSDN Git Service

2009-03-17 H.J. Lu <hongjiu.lu@intel.com>
[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 "c-common.h"
39 #include "except.h"
40 #include "function.h"
41 #include "recog.h"
42 #include "expr.h"
43 #include "optabs.h"
44 #include "toplev.h"
45 #include "basic-block.h"
46 #include "ggc.h"
47 #include "target.h"
48 #include "target-def.h"
49 #include "langhooks.h"
50 #include "cgraph.h"
51 #include "gimple.h"
52 #include "dwarf2.h"
53 #include "df.h"
54 #include "tm-constrs.h"
55 #include "params.h"
56 #include "cselib.h"
57
58 static int x86_builtin_vectorization_cost (bool);
59 static rtx legitimize_dllimport_symbol (rtx, bool);
60
61 #ifndef CHECK_STACK_LIMIT
62 #define CHECK_STACK_LIMIT (-1)
63 #endif
64
65 /* Return index of given mode in mult and division cost tables.  */
66 #define MODE_INDEX(mode)                                        \
67   ((mode) == QImode ? 0                                         \
68    : (mode) == HImode ? 1                                       \
69    : (mode) == SImode ? 2                                       \
70    : (mode) == DImode ? 3                                       \
71    : 4)
72
73 /* Processor costs (relative to an add) */
74 /* We assume COSTS_N_INSNS is defined as (N)*4 and an addition is 2 bytes.  */
75 #define COSTS_N_BYTES(N) ((N) * 2)
76
77 #define DUMMY_STRINGOP_ALGS {libcall, {{-1, libcall}}}
78
79 const
80 struct processor_costs ix86_size_cost = {/* costs for tuning for size */
81   COSTS_N_BYTES (2),                    /* cost of an add instruction */
82   COSTS_N_BYTES (3),                    /* cost of a lea instruction */
83   COSTS_N_BYTES (2),                    /* variable shift costs */
84   COSTS_N_BYTES (3),                    /* constant shift costs */
85   {COSTS_N_BYTES (3),                   /* cost of starting multiply for QI */
86    COSTS_N_BYTES (3),                   /*                               HI */
87    COSTS_N_BYTES (3),                   /*                               SI */
88    COSTS_N_BYTES (3),                   /*                               DI */
89    COSTS_N_BYTES (5)},                  /*                            other */
90   0,                                    /* cost of multiply per each bit set */
91   {COSTS_N_BYTES (3),                   /* cost of a divide/mod for QI */
92    COSTS_N_BYTES (3),                   /*                          HI */
93    COSTS_N_BYTES (3),                   /*                          SI */
94    COSTS_N_BYTES (3),                   /*                          DI */
95    COSTS_N_BYTES (5)},                  /*                       other */
96   COSTS_N_BYTES (3),                    /* cost of movsx */
97   COSTS_N_BYTES (3),                    /* cost of movzx */
98   0,                                    /* "large" insn */
99   2,                                    /* MOVE_RATIO */
100   2,                                    /* cost for loading QImode using movzbl */
101   {2, 2, 2},                            /* cost of loading integer registers
102                                            in QImode, HImode and SImode.
103                                            Relative to reg-reg move (2).  */
104   {2, 2, 2},                            /* cost of storing integer registers */
105   2,                                    /* cost of reg,reg fld/fst */
106   {2, 2, 2},                            /* cost of loading fp registers
107                                            in SFmode, DFmode and XFmode */
108   {2, 2, 2},                            /* cost of storing fp registers
109                                            in SFmode, DFmode and XFmode */
110   3,                                    /* cost of moving MMX register */
111   {3, 3},                               /* cost of loading MMX registers
112                                            in SImode and DImode */
113   {3, 3},                               /* cost of storing MMX registers
114                                            in SImode and DImode */
115   3,                                    /* cost of moving SSE register */
116   {3, 3, 3},                            /* cost of loading SSE registers
117                                            in SImode, DImode and TImode */
118   {3, 3, 3},                            /* cost of storing SSE registers
119                                            in SImode, DImode and TImode */
120   3,                                    /* MMX or SSE register to integer */
121   0,                                    /* size of l1 cache  */
122   0,                                    /* size of l2 cache  */
123   0,                                    /* size of prefetch block */
124   0,                                    /* number of parallel prefetches */
125   2,                                    /* Branch cost */
126   COSTS_N_BYTES (2),                    /* cost of FADD and FSUB insns.  */
127   COSTS_N_BYTES (2),                    /* cost of FMUL instruction.  */
128   COSTS_N_BYTES (2),                    /* cost of FDIV instruction.  */
129   COSTS_N_BYTES (2),                    /* cost of FABS instruction.  */
130   COSTS_N_BYTES (2),                    /* cost of FCHS instruction.  */
131   COSTS_N_BYTES (2),                    /* cost of FSQRT instruction.  */
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    {rep_prefix_1_byte, {{-1, rep_prefix_1_byte}}}},
136   1,                                    /* scalar_stmt_cost.  */
137   1,                                    /* scalar load_cost.  */
138   1,                                    /* scalar_store_cost.  */
139   1,                                    /* vec_stmt_cost.  */
140   1,                                    /* vec_to_scalar_cost.  */
141   1,                                    /* scalar_to_vec_cost.  */
142   1,                                    /* vec_align_load_cost.  */
143   1,                                    /* vec_unalign_load_cost.  */
144   1,                                    /* vec_store_cost.  */
145   1,                                    /* cond_taken_branch_cost.  */
146   1,                                    /* cond_not_taken_branch_cost.  */
147 };
148
149 /* Processor costs (relative to an add) */
150 static const
151 struct processor_costs i386_cost = {    /* 386 specific costs */
152   COSTS_N_INSNS (1),                    /* cost of an add instruction */
153   COSTS_N_INSNS (1),                    /* cost of a lea instruction */
154   COSTS_N_INSNS (3),                    /* variable shift costs */
155   COSTS_N_INSNS (2),                    /* constant shift costs */
156   {COSTS_N_INSNS (6),                   /* cost of starting multiply for QI */
157    COSTS_N_INSNS (6),                   /*                               HI */
158    COSTS_N_INSNS (6),                   /*                               SI */
159    COSTS_N_INSNS (6),                   /*                               DI */
160    COSTS_N_INSNS (6)},                  /*                               other */
161   COSTS_N_INSNS (1),                    /* cost of multiply per each bit set */
162   {COSTS_N_INSNS (23),                  /* cost of a divide/mod for QI */
163    COSTS_N_INSNS (23),                  /*                          HI */
164    COSTS_N_INSNS (23),                  /*                          SI */
165    COSTS_N_INSNS (23),                  /*                          DI */
166    COSTS_N_INSNS (23)},                 /*                          other */
167   COSTS_N_INSNS (3),                    /* cost of movsx */
168   COSTS_N_INSNS (2),                    /* cost of movzx */
169   15,                                   /* "large" insn */
170   3,                                    /* MOVE_RATIO */
171   4,                                    /* cost for loading QImode using movzbl */
172   {2, 4, 2},                            /* cost of loading integer registers
173                                            in QImode, HImode and SImode.
174                                            Relative to reg-reg move (2).  */
175   {2, 4, 2},                            /* cost of storing integer registers */
176   2,                                    /* cost of reg,reg fld/fst */
177   {8, 8, 8},                            /* cost of loading fp registers
178                                            in SFmode, DFmode and XFmode */
179   {8, 8, 8},                            /* cost of storing fp registers
180                                            in SFmode, DFmode and XFmode */
181   2,                                    /* cost of moving MMX register */
182   {4, 8},                               /* cost of loading MMX registers
183                                            in SImode and DImode */
184   {4, 8},                               /* cost of storing MMX registers
185                                            in SImode and DImode */
186   2,                                    /* cost of moving SSE register */
187   {4, 8, 16},                           /* cost of loading SSE registers
188                                            in SImode, DImode and TImode */
189   {4, 8, 16},                           /* cost of storing SSE registers
190                                            in SImode, DImode and TImode */
191   3,                                    /* MMX or SSE register to integer */
192   0,                                    /* size of l1 cache  */
193   0,                                    /* size of l2 cache  */
194   0,                                    /* size of prefetch block */
195   0,                                    /* number of parallel prefetches */
196   1,                                    /* Branch cost */
197   COSTS_N_INSNS (23),                   /* cost of FADD and FSUB insns.  */
198   COSTS_N_INSNS (27),                   /* cost of FMUL instruction.  */
199   COSTS_N_INSNS (88),                   /* cost of FDIV instruction.  */
200   COSTS_N_INSNS (22),                   /* cost of FABS instruction.  */
201   COSTS_N_INSNS (24),                   /* cost of FCHS instruction.  */
202   COSTS_N_INSNS (122),                  /* cost of FSQRT instruction.  */
203   {{rep_prefix_1_byte, {{-1, rep_prefix_1_byte}}},
204    DUMMY_STRINGOP_ALGS},
205   {{rep_prefix_1_byte, {{-1, rep_prefix_1_byte}}},
206    DUMMY_STRINGOP_ALGS},
207   1,                                    /* scalar_stmt_cost.  */
208   1,                                    /* scalar load_cost.  */
209   1,                                    /* scalar_store_cost.  */
210   1,                                    /* vec_stmt_cost.  */
211   1,                                    /* vec_to_scalar_cost.  */
212   1,                                    /* scalar_to_vec_cost.  */
213   1,                                    /* vec_align_load_cost.  */
214   2,                                    /* vec_unalign_load_cost.  */
215   1,                                    /* vec_store_cost.  */
216   3,                                    /* cond_taken_branch_cost.  */
217   1,                                    /* cond_not_taken_branch_cost.  */
218 };
219
220 static const
221 struct processor_costs i486_cost = {    /* 486 specific costs */
222   COSTS_N_INSNS (1),                    /* cost of an add instruction */
223   COSTS_N_INSNS (1),                    /* cost of a lea instruction */
224   COSTS_N_INSNS (3),                    /* variable shift costs */
225   COSTS_N_INSNS (2),                    /* constant shift costs */
226   {COSTS_N_INSNS (12),                  /* cost of starting multiply for QI */
227    COSTS_N_INSNS (12),                  /*                               HI */
228    COSTS_N_INSNS (12),                  /*                               SI */
229    COSTS_N_INSNS (12),                  /*                               DI */
230    COSTS_N_INSNS (12)},                 /*                               other */
231   1,                                    /* cost of multiply per each bit set */
232   {COSTS_N_INSNS (40),                  /* cost of a divide/mod for QI */
233    COSTS_N_INSNS (40),                  /*                          HI */
234    COSTS_N_INSNS (40),                  /*                          SI */
235    COSTS_N_INSNS (40),                  /*                          DI */
236    COSTS_N_INSNS (40)},                 /*                          other */
237   COSTS_N_INSNS (3),                    /* cost of movsx */
238   COSTS_N_INSNS (2),                    /* cost of movzx */
239   15,                                   /* "large" insn */
240   3,                                    /* MOVE_RATIO */
241   4,                                    /* cost for loading QImode using movzbl */
242   {2, 4, 2},                            /* cost of loading integer registers
243                                            in QImode, HImode and SImode.
244                                            Relative to reg-reg move (2).  */
245   {2, 4, 2},                            /* cost of storing integer registers */
246   2,                                    /* cost of reg,reg fld/fst */
247   {8, 8, 8},                            /* cost of loading fp registers
248                                            in SFmode, DFmode and XFmode */
249   {8, 8, 8},                            /* cost of storing fp registers
250                                            in SFmode, DFmode and XFmode */
251   2,                                    /* cost of moving MMX register */
252   {4, 8},                               /* cost of loading MMX registers
253                                            in SImode and DImode */
254   {4, 8},                               /* cost of storing MMX registers
255                                            in SImode and DImode */
256   2,                                    /* cost of moving SSE register */
257   {4, 8, 16},                           /* cost of loading SSE registers
258                                            in SImode, DImode and TImode */
259   {4, 8, 16},                           /* cost of storing SSE registers
260                                            in SImode, DImode and TImode */
261   3,                                    /* MMX or SSE register to integer */
262   4,                                    /* size of l1 cache.  486 has 8kB cache
263                                            shared for code and data, so 4kB is
264                                            not really precise.  */
265   4,                                    /* size of l2 cache  */
266   0,                                    /* size of prefetch block */
267   0,                                    /* number of parallel prefetches */
268   1,                                    /* Branch cost */
269   COSTS_N_INSNS (8),                    /* cost of FADD and FSUB insns.  */
270   COSTS_N_INSNS (16),                   /* cost of FMUL instruction.  */
271   COSTS_N_INSNS (73),                   /* cost of FDIV instruction.  */
272   COSTS_N_INSNS (3),                    /* cost of FABS instruction.  */
273   COSTS_N_INSNS (3),                    /* cost of FCHS instruction.  */
274   COSTS_N_INSNS (83),                   /* cost of FSQRT instruction.  */
275   {{rep_prefix_4_byte, {{-1, rep_prefix_4_byte}}},
276    DUMMY_STRINGOP_ALGS},
277   {{rep_prefix_4_byte, {{-1, rep_prefix_4_byte}}},
278    DUMMY_STRINGOP_ALGS},
279   1,                                    /* scalar_stmt_cost.  */
280   1,                                    /* scalar load_cost.  */
281   1,                                    /* scalar_store_cost.  */
282   1,                                    /* vec_stmt_cost.  */
283   1,                                    /* vec_to_scalar_cost.  */
284   1,                                    /* scalar_to_vec_cost.  */
285   1,                                    /* vec_align_load_cost.  */
286   2,                                    /* vec_unalign_load_cost.  */
287   1,                                    /* vec_store_cost.  */
288   3,                                    /* cond_taken_branch_cost.  */
289   1,                                    /* cond_not_taken_branch_cost.  */
290 };
291
292 static const
293 struct processor_costs pentium_cost = {
294   COSTS_N_INSNS (1),                    /* cost of an add instruction */
295   COSTS_N_INSNS (1),                    /* cost of a lea instruction */
296   COSTS_N_INSNS (4),                    /* variable shift costs */
297   COSTS_N_INSNS (1),                    /* constant shift costs */
298   {COSTS_N_INSNS (11),                  /* cost of starting multiply for QI */
299    COSTS_N_INSNS (11),                  /*                               HI */
300    COSTS_N_INSNS (11),                  /*                               SI */
301    COSTS_N_INSNS (11),                  /*                               DI */
302    COSTS_N_INSNS (11)},                 /*                               other */
303   0,                                    /* cost of multiply per each bit set */
304   {COSTS_N_INSNS (25),                  /* cost of a divide/mod for QI */
305    COSTS_N_INSNS (25),                  /*                          HI */
306    COSTS_N_INSNS (25),                  /*                          SI */
307    COSTS_N_INSNS (25),                  /*                          DI */
308    COSTS_N_INSNS (25)},                 /*                          other */
309   COSTS_N_INSNS (3),                    /* cost of movsx */
310   COSTS_N_INSNS (2),                    /* cost of movzx */
311   8,                                    /* "large" insn */
312   6,                                    /* MOVE_RATIO */
313   6,                                    /* cost for loading QImode using movzbl */
314   {2, 4, 2},                            /* cost of loading integer registers
315                                            in QImode, HImode and SImode.
316                                            Relative to reg-reg move (2).  */
317   {2, 4, 2},                            /* cost of storing integer registers */
318   2,                                    /* cost of reg,reg fld/fst */
319   {2, 2, 6},                            /* cost of loading fp registers
320                                            in SFmode, DFmode and XFmode */
321   {4, 4, 6},                            /* cost of storing fp registers
322                                            in SFmode, DFmode and XFmode */
323   8,                                    /* cost of moving MMX register */
324   {8, 8},                               /* cost of loading MMX registers
325                                            in SImode and DImode */
326   {8, 8},                               /* cost of storing MMX registers
327                                            in SImode and DImode */
328   2,                                    /* cost of moving SSE register */
329   {4, 8, 16},                           /* cost of loading SSE registers
330                                            in SImode, DImode and TImode */
331   {4, 8, 16},                           /* cost of storing SSE registers
332                                            in SImode, DImode and TImode */
333   3,                                    /* MMX or SSE register to integer */
334   8,                                    /* size of l1 cache.  */
335   8,                                    /* size of l2 cache  */
336   0,                                    /* size of prefetch block */
337   0,                                    /* number of parallel prefetches */
338   2,                                    /* Branch cost */
339   COSTS_N_INSNS (3),                    /* cost of FADD and FSUB insns.  */
340   COSTS_N_INSNS (3),                    /* cost of FMUL instruction.  */
341   COSTS_N_INSNS (39),                   /* cost of FDIV instruction.  */
342   COSTS_N_INSNS (1),                    /* cost of FABS instruction.  */
343   COSTS_N_INSNS (1),                    /* cost of FCHS instruction.  */
344   COSTS_N_INSNS (70),                   /* cost of FSQRT instruction.  */
345   {{libcall, {{256, rep_prefix_4_byte}, {-1, libcall}}},
346    DUMMY_STRINGOP_ALGS},
347   {{libcall, {{-1, rep_prefix_4_byte}}},
348    DUMMY_STRINGOP_ALGS},
349   1,                                    /* scalar_stmt_cost.  */
350   1,                                    /* scalar load_cost.  */
351   1,                                    /* scalar_store_cost.  */
352   1,                                    /* vec_stmt_cost.  */
353   1,                                    /* vec_to_scalar_cost.  */
354   1,                                    /* scalar_to_vec_cost.  */
355   1,                                    /* vec_align_load_cost.  */
356   2,                                    /* vec_unalign_load_cost.  */
357   1,                                    /* vec_store_cost.  */
358   3,                                    /* cond_taken_branch_cost.  */
359   1,                                    /* cond_not_taken_branch_cost.  */
360 };
361
362 static const
363 struct processor_costs pentiumpro_cost = {
364   COSTS_N_INSNS (1),                    /* cost of an add instruction */
365   COSTS_N_INSNS (1),                    /* cost of a lea instruction */
366   COSTS_N_INSNS (1),                    /* variable shift costs */
367   COSTS_N_INSNS (1),                    /* constant shift costs */
368   {COSTS_N_INSNS (4),                   /* cost of starting multiply for QI */
369    COSTS_N_INSNS (4),                   /*                               HI */
370    COSTS_N_INSNS (4),                   /*                               SI */
371    COSTS_N_INSNS (4),                   /*                               DI */
372    COSTS_N_INSNS (4)},                  /*                               other */
373   0,                                    /* cost of multiply per each bit set */
374   {COSTS_N_INSNS (17),                  /* cost of a divide/mod for QI */
375    COSTS_N_INSNS (17),                  /*                          HI */
376    COSTS_N_INSNS (17),                  /*                          SI */
377    COSTS_N_INSNS (17),                  /*                          DI */
378    COSTS_N_INSNS (17)},                 /*                          other */
379   COSTS_N_INSNS (1),                    /* cost of movsx */
380   COSTS_N_INSNS (1),                    /* cost of movzx */
381   8,                                    /* "large" insn */
382   6,                                    /* MOVE_RATIO */
383   2,                                    /* cost for loading QImode using movzbl */
384   {4, 4, 4},                            /* cost of loading integer registers
385                                            in QImode, HImode and SImode.
386                                            Relative to reg-reg move (2).  */
387   {2, 2, 2},                            /* cost of storing integer registers */
388   2,                                    /* cost of reg,reg fld/fst */
389   {2, 2, 6},                            /* cost of loading fp registers
390                                            in SFmode, DFmode and XFmode */
391   {4, 4, 6},                            /* cost of storing fp registers
392                                            in SFmode, DFmode and XFmode */
393   2,                                    /* cost of moving MMX register */
394   {2, 2},                               /* cost of loading MMX registers
395                                            in SImode and DImode */
396   {2, 2},                               /* cost of storing MMX registers
397                                            in SImode and DImode */
398   2,                                    /* cost of moving SSE register */
399   {2, 2, 8},                            /* cost of loading SSE registers
400                                            in SImode, DImode and TImode */
401   {2, 2, 8},                            /* cost of storing SSE registers
402                                            in SImode, DImode and TImode */
403   3,                                    /* MMX or SSE register to integer */
404   8,                                    /* size of l1 cache.  */
405   256,                                  /* size of l2 cache  */
406   32,                                   /* size of prefetch block */
407   6,                                    /* number of parallel prefetches */
408   2,                                    /* Branch cost */
409   COSTS_N_INSNS (3),                    /* cost of FADD and FSUB insns.  */
410   COSTS_N_INSNS (5),                    /* cost of FMUL instruction.  */
411   COSTS_N_INSNS (56),                   /* cost of FDIV instruction.  */
412   COSTS_N_INSNS (2),                    /* cost of FABS instruction.  */
413   COSTS_N_INSNS (2),                    /* cost of FCHS instruction.  */
414   COSTS_N_INSNS (56),                   /* cost of FSQRT instruction.  */
415   /* PentiumPro has optimized rep instructions for blocks aligned by 8 bytes (we ensure
416      the alignment).  For small blocks inline loop is still a noticeable win, for bigger
417      blocks either rep movsl or rep movsb is way to go.  Rep movsb has apparently
418      more expensive startup time in CPU, but after 4K the difference is down in the noise.
419    */
420   {{rep_prefix_4_byte, {{128, loop}, {1024, unrolled_loop},
421                         {8192, rep_prefix_4_byte}, {-1, rep_prefix_1_byte}}},
422    DUMMY_STRINGOP_ALGS},
423   {{rep_prefix_4_byte, {{1024, unrolled_loop},
424                         {8192, rep_prefix_4_byte}, {-1, libcall}}},
425    DUMMY_STRINGOP_ALGS},
426   1,                                    /* scalar_stmt_cost.  */
427   1,                                    /* scalar load_cost.  */
428   1,                                    /* scalar_store_cost.  */
429   1,                                    /* vec_stmt_cost.  */
430   1,                                    /* vec_to_scalar_cost.  */
431   1,                                    /* scalar_to_vec_cost.  */
432   1,                                    /* vec_align_load_cost.  */
433   2,                                    /* vec_unalign_load_cost.  */
434   1,                                    /* vec_store_cost.  */
435   3,                                    /* cond_taken_branch_cost.  */
436   1,                                    /* cond_not_taken_branch_cost.  */
437 };
438
439 static const
440 struct processor_costs geode_cost = {
441   COSTS_N_INSNS (1),                    /* cost of an add instruction */
442   COSTS_N_INSNS (1),                    /* cost of a lea instruction */
443   COSTS_N_INSNS (2),                    /* variable shift costs */
444   COSTS_N_INSNS (1),                    /* constant shift costs */
445   {COSTS_N_INSNS (3),                   /* cost of starting multiply for QI */
446    COSTS_N_INSNS (4),                   /*                               HI */
447    COSTS_N_INSNS (7),                   /*                               SI */
448    COSTS_N_INSNS (7),                   /*                               DI */
449    COSTS_N_INSNS (7)},                  /*                               other */
450   0,                                    /* cost of multiply per each bit set */
451   {COSTS_N_INSNS (15),                  /* cost of a divide/mod for QI */
452    COSTS_N_INSNS (23),                  /*                          HI */
453    COSTS_N_INSNS (39),                  /*                          SI */
454    COSTS_N_INSNS (39),                  /*                          DI */
455    COSTS_N_INSNS (39)},                 /*                          other */
456   COSTS_N_INSNS (1),                    /* cost of movsx */
457   COSTS_N_INSNS (1),                    /* cost of movzx */
458   8,                                    /* "large" insn */
459   4,                                    /* MOVE_RATIO */
460   1,                                    /* cost for loading QImode using movzbl */
461   {1, 1, 1},                            /* cost of loading integer registers
462                                            in QImode, HImode and SImode.
463                                            Relative to reg-reg move (2).  */
464   {1, 1, 1},                            /* cost of storing integer registers */
465   1,                                    /* cost of reg,reg fld/fst */
466   {1, 1, 1},                            /* cost of loading fp registers
467                                            in SFmode, DFmode and XFmode */
468   {4, 6, 6},                            /* cost of storing fp registers
469                                            in SFmode, DFmode and XFmode */
470
471   1,                                    /* cost of moving MMX register */
472   {1, 1},                               /* cost of loading MMX registers
473                                            in SImode and DImode */
474   {1, 1},                               /* cost of storing MMX registers
475                                            in SImode and DImode */
476   1,                                    /* cost of moving SSE register */
477   {1, 1, 1},                            /* cost of loading SSE registers
478                                            in SImode, DImode and TImode */
479   {1, 1, 1},                            /* cost of storing SSE registers
480                                            in SImode, DImode and TImode */
481   1,                                    /* MMX or SSE register to integer */
482   64,                                   /* size of l1 cache.  */
483   128,                                  /* size of l2 cache.  */
484   32,                                   /* size of prefetch block */
485   1,                                    /* number of parallel prefetches */
486   1,                                    /* Branch cost */
487   COSTS_N_INSNS (6),                    /* cost of FADD and FSUB insns.  */
488   COSTS_N_INSNS (11),                   /* cost of FMUL instruction.  */
489   COSTS_N_INSNS (47),                   /* cost of FDIV instruction.  */
490   COSTS_N_INSNS (1),                    /* cost of FABS instruction.  */
491   COSTS_N_INSNS (1),                    /* cost of FCHS instruction.  */
492   COSTS_N_INSNS (54),                   /* cost of FSQRT instruction.  */
493   {{libcall, {{256, rep_prefix_4_byte}, {-1, libcall}}},
494    DUMMY_STRINGOP_ALGS},
495   {{libcall, {{256, rep_prefix_4_byte}, {-1, libcall}}},
496    DUMMY_STRINGOP_ALGS},
497   1,                                    /* scalar_stmt_cost.  */
498   1,                                    /* scalar load_cost.  */
499   1,                                    /* scalar_store_cost.  */
500   1,                                    /* vec_stmt_cost.  */
501   1,                                    /* vec_to_scalar_cost.  */
502   1,                                    /* scalar_to_vec_cost.  */
503   1,                                    /* vec_align_load_cost.  */
504   2,                                    /* vec_unalign_load_cost.  */
505   1,                                    /* vec_store_cost.  */
506   3,                                    /* cond_taken_branch_cost.  */
507   1,                                    /* cond_not_taken_branch_cost.  */
508 };
509
510 static const
511 struct processor_costs k6_cost = {
512   COSTS_N_INSNS (1),                    /* cost of an add instruction */
513   COSTS_N_INSNS (2),                    /* cost of a lea instruction */
514   COSTS_N_INSNS (1),                    /* variable shift costs */
515   COSTS_N_INSNS (1),                    /* constant shift costs */
516   {COSTS_N_INSNS (3),                   /* cost of starting multiply for QI */
517    COSTS_N_INSNS (3),                   /*                               HI */
518    COSTS_N_INSNS (3),                   /*                               SI */
519    COSTS_N_INSNS (3),                   /*                               DI */
520    COSTS_N_INSNS (3)},                  /*                               other */
521   0,                                    /* cost of multiply per each bit set */
522   {COSTS_N_INSNS (18),                  /* cost of a divide/mod for QI */
523    COSTS_N_INSNS (18),                  /*                          HI */
524    COSTS_N_INSNS (18),                  /*                          SI */
525    COSTS_N_INSNS (18),                  /*                          DI */
526    COSTS_N_INSNS (18)},                 /*                          other */
527   COSTS_N_INSNS (2),                    /* cost of movsx */
528   COSTS_N_INSNS (2),                    /* cost of movzx */
529   8,                                    /* "large" insn */
530   4,                                    /* MOVE_RATIO */
531   3,                                    /* cost for loading QImode using movzbl */
532   {4, 5, 4},                            /* cost of loading integer registers
533                                            in QImode, HImode and SImode.
534                                            Relative to reg-reg move (2).  */
535   {2, 3, 2},                            /* cost of storing integer registers */
536   4,                                    /* cost of reg,reg fld/fst */
537   {6, 6, 6},                            /* cost of loading fp registers
538                                            in SFmode, DFmode and XFmode */
539   {4, 4, 4},                            /* cost of storing fp registers
540                                            in SFmode, DFmode and XFmode */
541   2,                                    /* cost of moving MMX register */
542   {2, 2},                               /* cost of loading MMX registers
543                                            in SImode and DImode */
544   {2, 2},                               /* cost of storing MMX registers
545                                            in SImode and DImode */
546   2,                                    /* cost of moving SSE register */
547   {2, 2, 8},                            /* cost of loading SSE registers
548                                            in SImode, DImode and TImode */
549   {2, 2, 8},                            /* cost of storing SSE registers
550                                            in SImode, DImode and TImode */
551   6,                                    /* MMX or SSE register to integer */
552   32,                                   /* size of l1 cache.  */
553   32,                                   /* size of l2 cache.  Some models
554                                            have integrated l2 cache, but
555                                            optimizing for k6 is not important
556                                            enough to worry about that.  */
557   32,                                   /* size of prefetch block */
558   1,                                    /* number of parallel prefetches */
559   1,                                    /* Branch cost */
560   COSTS_N_INSNS (2),                    /* cost of FADD and FSUB insns.  */
561   COSTS_N_INSNS (2),                    /* cost of FMUL instruction.  */
562   COSTS_N_INSNS (56),                   /* cost of FDIV instruction.  */
563   COSTS_N_INSNS (2),                    /* cost of FABS instruction.  */
564   COSTS_N_INSNS (2),                    /* cost of FCHS instruction.  */
565   COSTS_N_INSNS (56),                   /* cost of FSQRT instruction.  */
566   {{libcall, {{256, rep_prefix_4_byte}, {-1, libcall}}},
567    DUMMY_STRINGOP_ALGS},
568   {{libcall, {{256, rep_prefix_4_byte}, {-1, libcall}}},
569    DUMMY_STRINGOP_ALGS},
570   1,                                    /* scalar_stmt_cost.  */
571   1,                                    /* scalar load_cost.  */
572   1,                                    /* scalar_store_cost.  */
573   1,                                    /* vec_stmt_cost.  */
574   1,                                    /* vec_to_scalar_cost.  */
575   1,                                    /* scalar_to_vec_cost.  */
576   1,                                    /* vec_align_load_cost.  */
577   2,                                    /* vec_unalign_load_cost.  */
578   1,                                    /* vec_store_cost.  */
579   3,                                    /* cond_taken_branch_cost.  */
580   1,                                    /* cond_not_taken_branch_cost.  */
581 };
582
583 static const
584 struct processor_costs athlon_cost = {
585   COSTS_N_INSNS (1),                    /* cost of an add instruction */
586   COSTS_N_INSNS (2),                    /* cost of a lea instruction */
587   COSTS_N_INSNS (1),                    /* variable shift costs */
588   COSTS_N_INSNS (1),                    /* constant shift costs */
589   {COSTS_N_INSNS (5),                   /* cost of starting multiply for QI */
590    COSTS_N_INSNS (5),                   /*                               HI */
591    COSTS_N_INSNS (5),                   /*                               SI */
592    COSTS_N_INSNS (5),                   /*                               DI */
593    COSTS_N_INSNS (5)},                  /*                               other */
594   0,                                    /* cost of multiply per each bit set */
595   {COSTS_N_INSNS (18),                  /* cost of a divide/mod for QI */
596    COSTS_N_INSNS (26),                  /*                          HI */
597    COSTS_N_INSNS (42),                  /*                          SI */
598    COSTS_N_INSNS (74),                  /*                          DI */
599    COSTS_N_INSNS (74)},                 /*                          other */
600   COSTS_N_INSNS (1),                    /* cost of movsx */
601   COSTS_N_INSNS (1),                    /* cost of movzx */
602   8,                                    /* "large" insn */
603   9,                                    /* MOVE_RATIO */
604   4,                                    /* cost for loading QImode using movzbl */
605   {3, 4, 3},                            /* cost of loading integer registers
606                                            in QImode, HImode and SImode.
607                                            Relative to reg-reg move (2).  */
608   {3, 4, 3},                            /* cost of storing integer registers */
609   4,                                    /* cost of reg,reg fld/fst */
610   {4, 4, 12},                           /* cost of loading fp registers
611                                            in SFmode, DFmode and XFmode */
612   {6, 6, 8},                            /* cost of storing fp registers
613                                            in SFmode, DFmode and XFmode */
614   2,                                    /* cost of moving MMX register */
615   {4, 4},                               /* cost of loading MMX registers
616                                            in SImode and DImode */
617   {4, 4},                               /* cost of storing MMX registers
618                                            in SImode and DImode */
619   2,                                    /* cost of moving SSE register */
620   {4, 4, 6},                            /* cost of loading SSE registers
621                                            in SImode, DImode and TImode */
622   {4, 4, 5},                            /* cost of storing SSE registers
623                                            in SImode, DImode and TImode */
624   5,                                    /* MMX or SSE register to integer */
625   64,                                   /* size of l1 cache.  */
626   256,                                  /* size of l2 cache.  */
627   64,                                   /* size of prefetch block */
628   6,                                    /* number of parallel prefetches */
629   5,                                    /* Branch cost */
630   COSTS_N_INSNS (4),                    /* cost of FADD and FSUB insns.  */
631   COSTS_N_INSNS (4),                    /* cost of FMUL instruction.  */
632   COSTS_N_INSNS (24),                   /* cost of FDIV instruction.  */
633   COSTS_N_INSNS (2),                    /* cost of FABS instruction.  */
634   COSTS_N_INSNS (2),                    /* cost of FCHS instruction.  */
635   COSTS_N_INSNS (35),                   /* cost of FSQRT instruction.  */
636   /* For some reason, Athlon deals better with REP prefix (relative to loops)
637      compared to K8. Alignment becomes important after 8 bytes for memcpy and
638      128 bytes for memset.  */
639   {{libcall, {{2048, rep_prefix_4_byte}, {-1, libcall}}},
640    DUMMY_STRINGOP_ALGS},
641   {{libcall, {{2048, rep_prefix_4_byte}, {-1, libcall}}},
642    DUMMY_STRINGOP_ALGS},
643   1,                                    /* scalar_stmt_cost.  */
644   1,                                    /* scalar load_cost.  */
645   1,                                    /* scalar_store_cost.  */
646   1,                                    /* vec_stmt_cost.  */
647   1,                                    /* vec_to_scalar_cost.  */
648   1,                                    /* scalar_to_vec_cost.  */
649   1,                                    /* vec_align_load_cost.  */
650   2,                                    /* vec_unalign_load_cost.  */
651   1,                                    /* vec_store_cost.  */
652   3,                                    /* cond_taken_branch_cost.  */
653   1,                                    /* cond_not_taken_branch_cost.  */
654 };
655
656 static const
657 struct processor_costs k8_cost = {
658   COSTS_N_INSNS (1),                    /* cost of an add instruction */
659   COSTS_N_INSNS (2),                    /* cost of a lea instruction */
660   COSTS_N_INSNS (1),                    /* variable shift costs */
661   COSTS_N_INSNS (1),                    /* constant shift costs */
662   {COSTS_N_INSNS (3),                   /* cost of starting multiply for QI */
663    COSTS_N_INSNS (4),                   /*                               HI */
664    COSTS_N_INSNS (3),                   /*                               SI */
665    COSTS_N_INSNS (4),                   /*                               DI */
666    COSTS_N_INSNS (5)},                  /*                               other */
667   0,                                    /* cost of multiply per each bit set */
668   {COSTS_N_INSNS (18),                  /* cost of a divide/mod for QI */
669    COSTS_N_INSNS (26),                  /*                          HI */
670    COSTS_N_INSNS (42),                  /*                          SI */
671    COSTS_N_INSNS (74),                  /*                          DI */
672    COSTS_N_INSNS (74)},                 /*                          other */
673   COSTS_N_INSNS (1),                    /* cost of movsx */
674   COSTS_N_INSNS (1),                    /* cost of movzx */
675   8,                                    /* "large" insn */
676   9,                                    /* MOVE_RATIO */
677   4,                                    /* cost for loading QImode using movzbl */
678   {3, 4, 3},                            /* cost of loading integer registers
679                                            in QImode, HImode and SImode.
680                                            Relative to reg-reg move (2).  */
681   {3, 4, 3},                            /* cost of storing integer registers */
682   4,                                    /* cost of reg,reg fld/fst */
683   {4, 4, 12},                           /* cost of loading fp registers
684                                            in SFmode, DFmode and XFmode */
685   {6, 6, 8},                            /* cost of storing fp registers
686                                            in SFmode, DFmode and XFmode */
687   2,                                    /* cost of moving MMX register */
688   {3, 3},                               /* cost of loading MMX registers
689                                            in SImode and DImode */
690   {4, 4},                               /* cost of storing MMX registers
691                                            in SImode and DImode */
692   2,                                    /* cost of moving SSE register */
693   {4, 3, 6},                            /* cost of loading SSE registers
694                                            in SImode, DImode and TImode */
695   {4, 4, 5},                            /* cost of storing SSE registers
696                                            in SImode, DImode and TImode */
697   5,                                    /* MMX or SSE register to integer */
698   64,                                   /* size of l1 cache.  */
699   512,                                  /* size of l2 cache.  */
700   64,                                   /* size of prefetch block */
701   /* New AMD processors never drop prefetches; if they cannot be performed
702      immediately, they are queued.  We set number of simultaneous prefetches
703      to a large constant to reflect this (it probably is not a good idea not
704      to limit number of prefetches at all, as their execution also takes some
705      time).  */
706   100,                                  /* number of parallel prefetches */
707   3,                                    /* Branch cost */
708   COSTS_N_INSNS (4),                    /* cost of FADD and FSUB insns.  */
709   COSTS_N_INSNS (4),                    /* cost of FMUL instruction.  */
710   COSTS_N_INSNS (19),                   /* cost of FDIV instruction.  */
711   COSTS_N_INSNS (2),                    /* cost of FABS instruction.  */
712   COSTS_N_INSNS (2),                    /* cost of FCHS instruction.  */
713   COSTS_N_INSNS (35),                   /* cost of FSQRT instruction.  */
714   /* K8 has optimized REP instruction for medium sized blocks, but for very small
715      blocks it is better to use loop. For large blocks, libcall can do
716      nontemporary accesses and beat inline considerably.  */
717   {{libcall, {{6, loop}, {14, unrolled_loop}, {-1, rep_prefix_4_byte}}},
718    {libcall, {{16, loop}, {8192, rep_prefix_8_byte}, {-1, libcall}}}},
719   {{libcall, {{8, loop}, {24, unrolled_loop},
720               {2048, rep_prefix_4_byte}, {-1, libcall}}},
721    {libcall, {{48, unrolled_loop}, {8192, rep_prefix_8_byte}, {-1, libcall}}}},
722   4,                                    /* scalar_stmt_cost.  */
723   2,                                    /* scalar load_cost.  */
724   2,                                    /* scalar_store_cost.  */
725   5,                                    /* vec_stmt_cost.  */
726   0,                                    /* vec_to_scalar_cost.  */
727   2,                                    /* scalar_to_vec_cost.  */
728   2,                                    /* vec_align_load_cost.  */
729   3,                                    /* vec_unalign_load_cost.  */
730   3,                                    /* vec_store_cost.  */
731   3,                                    /* cond_taken_branch_cost.  */
732   2,                                    /* cond_not_taken_branch_cost.  */
733 };
734
735 struct processor_costs amdfam10_cost = {
736   COSTS_N_INSNS (1),                    /* cost of an add instruction */
737   COSTS_N_INSNS (2),                    /* cost of a lea instruction */
738   COSTS_N_INSNS (1),                    /* variable shift costs */
739   COSTS_N_INSNS (1),                    /* constant shift costs */
740   {COSTS_N_INSNS (3),                   /* cost of starting multiply for QI */
741    COSTS_N_INSNS (4),                   /*                               HI */
742    COSTS_N_INSNS (3),                   /*                               SI */
743    COSTS_N_INSNS (4),                   /*                               DI */
744    COSTS_N_INSNS (5)},                  /*                               other */
745   0,                                    /* cost of multiply per each bit set */
746   {COSTS_N_INSNS (19),                  /* cost of a divide/mod for QI */
747    COSTS_N_INSNS (35),                  /*                          HI */
748    COSTS_N_INSNS (51),                  /*                          SI */
749    COSTS_N_INSNS (83),                  /*                          DI */
750    COSTS_N_INSNS (83)},                 /*                          other */
751   COSTS_N_INSNS (1),                    /* cost of movsx */
752   COSTS_N_INSNS (1),                    /* cost of movzx */
753   8,                                    /* "large" insn */
754   9,                                    /* MOVE_RATIO */
755   4,                                    /* cost for loading QImode using movzbl */
756   {3, 4, 3},                            /* cost of loading integer registers
757                                            in QImode, HImode and SImode.
758                                            Relative to reg-reg move (2).  */
759   {3, 4, 3},                            /* cost of storing integer registers */
760   4,                                    /* cost of reg,reg fld/fst */
761   {4, 4, 12},                           /* cost of loading fp registers
762                                            in SFmode, DFmode and XFmode */
763   {6, 6, 8},                            /* cost of storing fp registers
764                                            in SFmode, DFmode and XFmode */
765   2,                                    /* cost of moving MMX register */
766   {3, 3},                               /* cost of loading MMX registers
767                                            in SImode and DImode */
768   {4, 4},                               /* cost of storing MMX registers
769                                            in SImode and DImode */
770   2,                                    /* cost of moving SSE register */
771   {4, 4, 3},                            /* cost of loading SSE registers
772                                            in SImode, DImode and TImode */
773   {4, 4, 5},                            /* cost of storing SSE registers
774                                            in SImode, DImode and TImode */
775   3,                                    /* MMX or SSE register to integer */
776                                         /* On K8
777                                             MOVD reg64, xmmreg  Double  FSTORE 4
778                                             MOVD reg32, xmmreg  Double  FSTORE 4
779                                            On AMDFAM10
780                                             MOVD reg64, xmmreg  Double  FADD 3
781                                                                 1/1  1/1
782                                             MOVD reg32, xmmreg  Double  FADD 3
783                                                                 1/1  1/1 */
784   64,                                   /* size of l1 cache.  */
785   512,                                  /* size of l2 cache.  */
786   64,                                   /* size of prefetch block */
787   /* New AMD processors never drop prefetches; if they cannot be performed
788      immediately, they are queued.  We set number of simultaneous prefetches
789      to a large constant to reflect this (it probably is not a good idea not
790      to limit number of prefetches at all, as their execution also takes some
791      time).  */
792   100,                                  /* number of parallel prefetches */
793   2,                                    /* Branch cost */
794   COSTS_N_INSNS (4),                    /* cost of FADD and FSUB insns.  */
795   COSTS_N_INSNS (4),                    /* cost of FMUL instruction.  */
796   COSTS_N_INSNS (19),                   /* cost of FDIV instruction.  */
797   COSTS_N_INSNS (2),                    /* cost of FABS instruction.  */
798   COSTS_N_INSNS (2),                    /* cost of FCHS instruction.  */
799   COSTS_N_INSNS (35),                   /* cost of FSQRT instruction.  */
800
801   /* AMDFAM10 has optimized REP instruction for medium sized blocks, but for
802      very small blocks it is better to use loop. For large blocks, libcall can
803      do nontemporary accesses and beat inline considerably.  */
804   {{libcall, {{6, loop}, {14, unrolled_loop}, {-1, rep_prefix_4_byte}}},
805    {libcall, {{16, loop}, {8192, rep_prefix_8_byte}, {-1, libcall}}}},
806   {{libcall, {{8, loop}, {24, unrolled_loop},
807               {2048, rep_prefix_4_byte}, {-1, libcall}}},
808    {libcall, {{48, unrolled_loop}, {8192, rep_prefix_8_byte}, {-1, libcall}}}},
809   4,                                    /* scalar_stmt_cost.  */
810   2,                                    /* scalar load_cost.  */
811   2,                                    /* scalar_store_cost.  */
812   6,                                    /* vec_stmt_cost.  */
813   0,                                    /* vec_to_scalar_cost.  */
814   2,                                    /* scalar_to_vec_cost.  */
815   2,                                    /* vec_align_load_cost.  */
816   2,                                    /* vec_unalign_load_cost.  */
817   2,                                    /* vec_store_cost.  */
818   2,                                    /* cond_taken_branch_cost.  */
819   1,                                    /* cond_not_taken_branch_cost.  */
820 };
821
822 static const
823 struct processor_costs pentium4_cost = {
824   COSTS_N_INSNS (1),                    /* cost of an add instruction */
825   COSTS_N_INSNS (3),                    /* cost of a lea instruction */
826   COSTS_N_INSNS (4),                    /* variable shift costs */
827   COSTS_N_INSNS (4),                    /* constant shift costs */
828   {COSTS_N_INSNS (15),                  /* cost of starting multiply for QI */
829    COSTS_N_INSNS (15),                  /*                               HI */
830    COSTS_N_INSNS (15),                  /*                               SI */
831    COSTS_N_INSNS (15),                  /*                               DI */
832    COSTS_N_INSNS (15)},                 /*                               other */
833   0,                                    /* cost of multiply per each bit set */
834   {COSTS_N_INSNS (56),                  /* cost of a divide/mod for QI */
835    COSTS_N_INSNS (56),                  /*                          HI */
836    COSTS_N_INSNS (56),                  /*                          SI */
837    COSTS_N_INSNS (56),                  /*                          DI */
838    COSTS_N_INSNS (56)},                 /*                          other */
839   COSTS_N_INSNS (1),                    /* cost of movsx */
840   COSTS_N_INSNS (1),                    /* cost of movzx */
841   16,                                   /* "large" insn */
842   6,                                    /* MOVE_RATIO */
843   2,                                    /* cost for loading QImode using movzbl */
844   {4, 5, 4},                            /* cost of loading integer registers
845                                            in QImode, HImode and SImode.
846                                            Relative to reg-reg move (2).  */
847   {2, 3, 2},                            /* cost of storing integer registers */
848   2,                                    /* cost of reg,reg fld/fst */
849   {2, 2, 6},                            /* cost of loading fp registers
850                                            in SFmode, DFmode and XFmode */
851   {4, 4, 6},                            /* cost of storing fp registers
852                                            in SFmode, DFmode and XFmode */
853   2,                                    /* cost of moving MMX register */
854   {2, 2},                               /* cost of loading MMX registers
855                                            in SImode and DImode */
856   {2, 2},                               /* cost of storing MMX registers
857                                            in SImode and DImode */
858   12,                                   /* cost of moving SSE register */
859   {12, 12, 12},                         /* cost of loading SSE registers
860                                            in SImode, DImode and TImode */
861   {2, 2, 8},                            /* cost of storing SSE registers
862                                            in SImode, DImode and TImode */
863   10,                                   /* MMX or SSE register to integer */
864   8,                                    /* size of l1 cache.  */
865   256,                                  /* size of l2 cache.  */
866   64,                                   /* size of prefetch block */
867   6,                                    /* number of parallel prefetches */
868   2,                                    /* Branch cost */
869   COSTS_N_INSNS (5),                    /* cost of FADD and FSUB insns.  */
870   COSTS_N_INSNS (7),                    /* cost of FMUL instruction.  */
871   COSTS_N_INSNS (43),                   /* cost of FDIV instruction.  */
872   COSTS_N_INSNS (2),                    /* cost of FABS instruction.  */
873   COSTS_N_INSNS (2),                    /* cost of FCHS instruction.  */
874   COSTS_N_INSNS (43),                   /* cost of FSQRT instruction.  */
875   {{libcall, {{12, loop_1_byte}, {-1, rep_prefix_4_byte}}},
876    DUMMY_STRINGOP_ALGS},
877   {{libcall, {{6, loop_1_byte}, {48, loop}, {20480, rep_prefix_4_byte},
878    {-1, libcall}}},
879    DUMMY_STRINGOP_ALGS},
880   1,                                    /* scalar_stmt_cost.  */
881   1,                                    /* scalar load_cost.  */
882   1,                                    /* scalar_store_cost.  */
883   1,                                    /* vec_stmt_cost.  */
884   1,                                    /* vec_to_scalar_cost.  */
885   1,                                    /* scalar_to_vec_cost.  */
886   1,                                    /* vec_align_load_cost.  */
887   2,                                    /* vec_unalign_load_cost.  */
888   1,                                    /* vec_store_cost.  */
889   3,                                    /* cond_taken_branch_cost.  */
890   1,                                    /* cond_not_taken_branch_cost.  */
891 };
892
893 static const
894 struct processor_costs nocona_cost = {
895   COSTS_N_INSNS (1),                    /* cost of an add instruction */
896   COSTS_N_INSNS (1),                    /* cost of a lea instruction */
897   COSTS_N_INSNS (1),                    /* variable shift costs */
898   COSTS_N_INSNS (1),                    /* constant shift costs */
899   {COSTS_N_INSNS (10),                  /* cost of starting multiply for QI */
900    COSTS_N_INSNS (10),                  /*                               HI */
901    COSTS_N_INSNS (10),                  /*                               SI */
902    COSTS_N_INSNS (10),                  /*                               DI */
903    COSTS_N_INSNS (10)},                 /*                               other */
904   0,                                    /* cost of multiply per each bit set */
905   {COSTS_N_INSNS (66),                  /* cost of a divide/mod for QI */
906    COSTS_N_INSNS (66),                  /*                          HI */
907    COSTS_N_INSNS (66),                  /*                          SI */
908    COSTS_N_INSNS (66),                  /*                          DI */
909    COSTS_N_INSNS (66)},                 /*                          other */
910   COSTS_N_INSNS (1),                    /* cost of movsx */
911   COSTS_N_INSNS (1),                    /* cost of movzx */
912   16,                                   /* "large" insn */
913   17,                                   /* MOVE_RATIO */
914   4,                                    /* cost for loading QImode using movzbl */
915   {4, 4, 4},                            /* cost of loading integer registers
916                                            in QImode, HImode and SImode.
917                                            Relative to reg-reg move (2).  */
918   {4, 4, 4},                            /* cost of storing integer registers */
919   3,                                    /* cost of reg,reg fld/fst */
920   {12, 12, 12},                         /* cost of loading fp registers
921                                            in SFmode, DFmode and XFmode */
922   {4, 4, 4},                            /* cost of storing fp registers
923                                            in SFmode, DFmode and XFmode */
924   6,                                    /* cost of moving MMX register */
925   {12, 12},                             /* cost of loading MMX registers
926                                            in SImode and DImode */
927   {12, 12},                             /* cost of storing MMX registers
928                                            in SImode and DImode */
929   6,                                    /* cost of moving SSE register */
930   {12, 12, 12},                         /* cost of loading SSE registers
931                                            in SImode, DImode and TImode */
932   {12, 12, 12},                         /* cost of storing SSE registers
933                                            in SImode, DImode and TImode */
934   8,                                    /* MMX or SSE register to integer */
935   8,                                    /* size of l1 cache.  */
936   1024,                                 /* size of l2 cache.  */
937   128,                                  /* size of prefetch block */
938   8,                                    /* number of parallel prefetches */
939   1,                                    /* Branch cost */
940   COSTS_N_INSNS (6),                    /* cost of FADD and FSUB insns.  */
941   COSTS_N_INSNS (8),                    /* cost of FMUL instruction.  */
942   COSTS_N_INSNS (40),                   /* cost of FDIV instruction.  */
943   COSTS_N_INSNS (3),                    /* cost of FABS instruction.  */
944   COSTS_N_INSNS (3),                    /* cost of FCHS instruction.  */
945   COSTS_N_INSNS (44),                   /* cost of FSQRT instruction.  */
946   {{libcall, {{12, loop_1_byte}, {-1, rep_prefix_4_byte}}},
947    {libcall, {{32, loop}, {20000, rep_prefix_8_byte},
948               {100000, unrolled_loop}, {-1, libcall}}}},
949   {{libcall, {{6, loop_1_byte}, {48, loop}, {20480, rep_prefix_4_byte},
950    {-1, libcall}}},
951    {libcall, {{24, loop}, {64, unrolled_loop},
952               {8192, rep_prefix_8_byte}, {-1, libcall}}}},
953   1,                                    /* scalar_stmt_cost.  */
954   1,                                    /* scalar load_cost.  */
955   1,                                    /* scalar_store_cost.  */
956   1,                                    /* vec_stmt_cost.  */
957   1,                                    /* vec_to_scalar_cost.  */
958   1,                                    /* scalar_to_vec_cost.  */
959   1,                                    /* vec_align_load_cost.  */
960   2,                                    /* vec_unalign_load_cost.  */
961   1,                                    /* vec_store_cost.  */
962   3,                                    /* cond_taken_branch_cost.  */
963   1,                                    /* cond_not_taken_branch_cost.  */
964 };
965
966 static const
967 struct processor_costs core2_cost = {
968   COSTS_N_INSNS (1),                    /* cost of an add instruction */
969   COSTS_N_INSNS (1) + 1,                /* cost of a lea instruction */
970   COSTS_N_INSNS (1),                    /* variable shift costs */
971   COSTS_N_INSNS (1),                    /* constant shift costs */
972   {COSTS_N_INSNS (3),                   /* cost of starting multiply for QI */
973    COSTS_N_INSNS (3),                   /*                               HI */
974    COSTS_N_INSNS (3),                   /*                               SI */
975    COSTS_N_INSNS (3),                   /*                               DI */
976    COSTS_N_INSNS (3)},                  /*                               other */
977   0,                                    /* cost of multiply per each bit set */
978   {COSTS_N_INSNS (22),                  /* cost of a divide/mod for QI */
979    COSTS_N_INSNS (22),                  /*                          HI */
980    COSTS_N_INSNS (22),                  /*                          SI */
981    COSTS_N_INSNS (22),                  /*                          DI */
982    COSTS_N_INSNS (22)},                 /*                          other */
983   COSTS_N_INSNS (1),                    /* cost of movsx */
984   COSTS_N_INSNS (1),                    /* cost of movzx */
985   8,                                    /* "large" insn */
986   16,                                   /* MOVE_RATIO */
987   2,                                    /* cost for loading QImode using movzbl */
988   {6, 6, 6},                            /* cost of loading integer registers
989                                            in QImode, HImode and SImode.
990                                            Relative to reg-reg move (2).  */
991   {4, 4, 4},                            /* cost of storing integer registers */
992   2,                                    /* cost of reg,reg fld/fst */
993   {6, 6, 6},                            /* cost of loading fp registers
994                                            in SFmode, DFmode and XFmode */
995   {4, 4, 4},                            /* cost of storing fp registers
996                                            in SFmode, DFmode and XFmode */
997   2,                                    /* cost of moving MMX register */
998   {6, 6},                               /* cost of loading MMX registers
999                                            in SImode and DImode */
1000   {4, 4},                               /* cost of storing MMX registers
1001                                            in SImode and DImode */
1002   2,                                    /* cost of moving SSE register */
1003   {6, 6, 6},                            /* cost of loading SSE registers
1004                                            in SImode, DImode and TImode */
1005   {4, 4, 4},                            /* cost of storing SSE registers
1006                                            in SImode, DImode and TImode */
1007   2,                                    /* MMX or SSE register to integer */
1008   32,                                   /* size of l1 cache.  */
1009   2048,                                 /* size of l2 cache.  */
1010   128,                                  /* size of prefetch block */
1011   8,                                    /* number of parallel prefetches */
1012   3,                                    /* Branch cost */
1013   COSTS_N_INSNS (3),                    /* cost of FADD and FSUB insns.  */
1014   COSTS_N_INSNS (5),                    /* cost of FMUL instruction.  */
1015   COSTS_N_INSNS (32),                   /* cost of FDIV instruction.  */
1016   COSTS_N_INSNS (1),                    /* cost of FABS instruction.  */
1017   COSTS_N_INSNS (1),                    /* cost of FCHS instruction.  */
1018   COSTS_N_INSNS (58),                   /* cost of FSQRT instruction.  */
1019   {{libcall, {{11, loop}, {-1, rep_prefix_4_byte}}},
1020    {libcall, {{32, loop}, {64, rep_prefix_4_byte},
1021               {8192, rep_prefix_8_byte}, {-1, libcall}}}},
1022   {{libcall, {{8, loop}, {15, unrolled_loop},
1023               {2048, rep_prefix_4_byte}, {-1, libcall}}},
1024    {libcall, {{24, loop}, {32, unrolled_loop},
1025               {8192, rep_prefix_8_byte}, {-1, libcall}}}},
1026   1,                                    /* scalar_stmt_cost.  */
1027   1,                                    /* scalar load_cost.  */
1028   1,                                    /* scalar_store_cost.  */
1029   1,                                    /* vec_stmt_cost.  */
1030   1,                                    /* vec_to_scalar_cost.  */
1031   1,                                    /* scalar_to_vec_cost.  */
1032   1,                                    /* vec_align_load_cost.  */
1033   2,                                    /* vec_unalign_load_cost.  */
1034   1,                                    /* vec_store_cost.  */
1035   3,                                    /* cond_taken_branch_cost.  */
1036   1,                                    /* cond_not_taken_branch_cost.  */
1037 };
1038
1039 /* Generic64 should produce code tuned for Nocona and K8.  */
1040 static const
1041 struct processor_costs generic64_cost = {
1042   COSTS_N_INSNS (1),                    /* cost of an add instruction */
1043   /* On all chips taken into consideration lea is 2 cycles and more.  With
1044      this cost however our current implementation of synth_mult results in
1045      use of unnecessary temporary registers causing regression on several
1046      SPECfp benchmarks.  */
1047   COSTS_N_INSNS (1) + 1,                /* cost of a lea instruction */
1048   COSTS_N_INSNS (1),                    /* variable shift costs */
1049   COSTS_N_INSNS (1),                    /* constant shift costs */
1050   {COSTS_N_INSNS (3),                   /* cost of starting multiply for QI */
1051    COSTS_N_INSNS (4),                   /*                               HI */
1052    COSTS_N_INSNS (3),                   /*                               SI */
1053    COSTS_N_INSNS (4),                   /*                               DI */
1054    COSTS_N_INSNS (2)},                  /*                               other */
1055   0,                                    /* cost of multiply per each bit set */
1056   {COSTS_N_INSNS (18),                  /* cost of a divide/mod for QI */
1057    COSTS_N_INSNS (26),                  /*                          HI */
1058    COSTS_N_INSNS (42),                  /*                          SI */
1059    COSTS_N_INSNS (74),                  /*                          DI */
1060    COSTS_N_INSNS (74)},                 /*                          other */
1061   COSTS_N_INSNS (1),                    /* cost of movsx */
1062   COSTS_N_INSNS (1),                    /* cost of movzx */
1063   8,                                    /* "large" insn */
1064   17,                                   /* MOVE_RATIO */
1065   4,                                    /* cost for loading QImode using movzbl */
1066   {4, 4, 4},                            /* cost of loading integer registers
1067                                            in QImode, HImode and SImode.
1068                                            Relative to reg-reg move (2).  */
1069   {4, 4, 4},                            /* cost of storing integer registers */
1070   4,                                    /* cost of reg,reg fld/fst */
1071   {12, 12, 12},                         /* cost of loading fp registers
1072                                            in SFmode, DFmode and XFmode */
1073   {6, 6, 8},                            /* cost of storing fp registers
1074                                            in SFmode, DFmode and XFmode */
1075   2,                                    /* cost of moving MMX register */
1076   {8, 8},                               /* cost of loading MMX registers
1077                                            in SImode and DImode */
1078   {8, 8},                               /* cost of storing MMX registers
1079                                            in SImode and DImode */
1080   2,                                    /* cost of moving SSE register */
1081   {8, 8, 8},                            /* cost of loading SSE registers
1082                                            in SImode, DImode and TImode */
1083   {8, 8, 8},                            /* cost of storing SSE registers
1084                                            in SImode, DImode and TImode */
1085   5,                                    /* MMX or SSE register to integer */
1086   32,                                   /* size of l1 cache.  */
1087   512,                                  /* size of l2 cache.  */
1088   64,                                   /* size of prefetch block */
1089   6,                                    /* number of parallel prefetches */
1090   /* Benchmarks shows large regressions on K8 sixtrack benchmark when this value
1091      is increased to perhaps more appropriate value of 5.  */
1092   3,                                    /* Branch cost */
1093   COSTS_N_INSNS (8),                    /* cost of FADD and FSUB insns.  */
1094   COSTS_N_INSNS (8),                    /* cost of FMUL instruction.  */
1095   COSTS_N_INSNS (20),                   /* cost of FDIV instruction.  */
1096   COSTS_N_INSNS (8),                    /* cost of FABS instruction.  */
1097   COSTS_N_INSNS (8),                    /* cost of FCHS instruction.  */
1098   COSTS_N_INSNS (40),                   /* cost of FSQRT instruction.  */
1099   {DUMMY_STRINGOP_ALGS,
1100    {libcall, {{32, loop}, {8192, rep_prefix_8_byte}, {-1, libcall}}}},
1101   {DUMMY_STRINGOP_ALGS,
1102    {libcall, {{32, loop}, {8192, rep_prefix_8_byte}, {-1, libcall}}}},
1103   1,                                    /* scalar_stmt_cost.  */
1104   1,                                    /* scalar load_cost.  */
1105   1,                                    /* scalar_store_cost.  */
1106   1,                                    /* vec_stmt_cost.  */
1107   1,                                    /* vec_to_scalar_cost.  */
1108   1,                                    /* scalar_to_vec_cost.  */
1109   1,                                    /* vec_align_load_cost.  */
1110   2,                                    /* vec_unalign_load_cost.  */
1111   1,                                    /* vec_store_cost.  */
1112   3,                                    /* cond_taken_branch_cost.  */
1113   1,                                    /* cond_not_taken_branch_cost.  */
1114 };
1115
1116 /* Generic32 should produce code tuned for Athlon, PPro, Pentium4, Nocona and K8.  */
1117 static const
1118 struct processor_costs generic32_cost = {
1119   COSTS_N_INSNS (1),                    /* cost of an add instruction */
1120   COSTS_N_INSNS (1) + 1,                /* cost of a lea instruction */
1121   COSTS_N_INSNS (1),                    /* variable shift costs */
1122   COSTS_N_INSNS (1),                    /* constant shift costs */
1123   {COSTS_N_INSNS (3),                   /* cost of starting multiply for QI */
1124    COSTS_N_INSNS (4),                   /*                               HI */
1125    COSTS_N_INSNS (3),                   /*                               SI */
1126    COSTS_N_INSNS (4),                   /*                               DI */
1127    COSTS_N_INSNS (2)},                  /*                               other */
1128   0,                                    /* cost of multiply per each bit set */
1129   {COSTS_N_INSNS (18),                  /* cost of a divide/mod for QI */
1130    COSTS_N_INSNS (26),                  /*                          HI */
1131    COSTS_N_INSNS (42),                  /*                          SI */
1132    COSTS_N_INSNS (74),                  /*                          DI */
1133    COSTS_N_INSNS (74)},                 /*                          other */
1134   COSTS_N_INSNS (1),                    /* cost of movsx */
1135   COSTS_N_INSNS (1),                    /* cost of movzx */
1136   8,                                    /* "large" insn */
1137   17,                                   /* MOVE_RATIO */
1138   4,                                    /* cost for loading QImode using movzbl */
1139   {4, 4, 4},                            /* cost of loading integer registers
1140                                            in QImode, HImode and SImode.
1141                                            Relative to reg-reg move (2).  */
1142   {4, 4, 4},                            /* cost of storing integer registers */
1143   4,                                    /* cost of reg,reg fld/fst */
1144   {12, 12, 12},                         /* cost of loading fp registers
1145                                            in SFmode, DFmode and XFmode */
1146   {6, 6, 8},                            /* cost of storing fp registers
1147                                            in SFmode, DFmode and XFmode */
1148   2,                                    /* cost of moving MMX register */
1149   {8, 8},                               /* cost of loading MMX registers
1150                                            in SImode and DImode */
1151   {8, 8},                               /* cost of storing MMX registers
1152                                            in SImode and DImode */
1153   2,                                    /* cost of moving SSE register */
1154   {8, 8, 8},                            /* cost of loading SSE registers
1155                                            in SImode, DImode and TImode */
1156   {8, 8, 8},                            /* cost of storing SSE registers
1157                                            in SImode, DImode and TImode */
1158   5,                                    /* MMX or SSE register to integer */
1159   32,                                   /* size of l1 cache.  */
1160   256,                                  /* size of l2 cache.  */
1161   64,                                   /* size of prefetch block */
1162   6,                                    /* number of parallel prefetches */
1163   3,                                    /* Branch cost */
1164   COSTS_N_INSNS (8),                    /* cost of FADD and FSUB insns.  */
1165   COSTS_N_INSNS (8),                    /* cost of FMUL instruction.  */
1166   COSTS_N_INSNS (20),                   /* cost of FDIV instruction.  */
1167   COSTS_N_INSNS (8),                    /* cost of FABS instruction.  */
1168   COSTS_N_INSNS (8),                    /* cost of FCHS instruction.  */
1169   COSTS_N_INSNS (40),                   /* cost of FSQRT instruction.  */
1170   {{libcall, {{32, loop}, {8192, rep_prefix_4_byte}, {-1, libcall}}},
1171    DUMMY_STRINGOP_ALGS},
1172   {{libcall, {{32, loop}, {8192, rep_prefix_4_byte}, {-1, libcall}}},
1173    DUMMY_STRINGOP_ALGS},
1174   1,                                    /* scalar_stmt_cost.  */
1175   1,                                    /* scalar load_cost.  */
1176   1,                                    /* scalar_store_cost.  */
1177   1,                                    /* vec_stmt_cost.  */
1178   1,                                    /* vec_to_scalar_cost.  */
1179   1,                                    /* scalar_to_vec_cost.  */
1180   1,                                    /* vec_align_load_cost.  */
1181   2,                                    /* vec_unalign_load_cost.  */
1182   1,                                    /* vec_store_cost.  */
1183   3,                                    /* cond_taken_branch_cost.  */
1184   1,                                    /* cond_not_taken_branch_cost.  */
1185 };
1186
1187 const struct processor_costs *ix86_cost = &pentium_cost;
1188
1189 /* Processor feature/optimization bitmasks.  */
1190 #define m_386 (1<<PROCESSOR_I386)
1191 #define m_486 (1<<PROCESSOR_I486)
1192 #define m_PENT (1<<PROCESSOR_PENTIUM)
1193 #define m_PPRO (1<<PROCESSOR_PENTIUMPRO)
1194 #define m_PENT4  (1<<PROCESSOR_PENTIUM4)
1195 #define m_NOCONA  (1<<PROCESSOR_NOCONA)
1196 #define m_CORE2  (1<<PROCESSOR_CORE2)
1197
1198 #define m_GEODE  (1<<PROCESSOR_GEODE)
1199 #define m_K6  (1<<PROCESSOR_K6)
1200 #define m_K6_GEODE  (m_K6 | m_GEODE)
1201 #define m_K8  (1<<PROCESSOR_K8)
1202 #define m_ATHLON  (1<<PROCESSOR_ATHLON)
1203 #define m_ATHLON_K8  (m_K8 | m_ATHLON)
1204 #define m_AMDFAM10  (1<<PROCESSOR_AMDFAM10)
1205 #define m_AMD_MULTIPLE  (m_K8 | m_ATHLON | m_AMDFAM10)
1206
1207 #define m_GENERIC32 (1<<PROCESSOR_GENERIC32)
1208 #define m_GENERIC64 (1<<PROCESSOR_GENERIC64)
1209
1210 /* Generic instruction choice should be common subset of supported CPUs
1211    (PPro/PENT4/NOCONA/CORE2/Athlon/K8).  */
1212 #define m_GENERIC (m_GENERIC32 | m_GENERIC64)
1213
1214 /* Feature tests against the various tunings.  */
1215 unsigned char ix86_tune_features[X86_TUNE_LAST];
1216
1217 /* Feature tests against the various tunings used to create ix86_tune_features
1218    based on the processor mask.  */
1219 static unsigned int initial_ix86_tune_features[X86_TUNE_LAST] = {
1220   /* X86_TUNE_USE_LEAVE: Leave does not affect Nocona SPEC2000 results
1221      negatively, so enabling for Generic64 seems like good code size
1222      tradeoff.  We can't enable it for 32bit generic because it does not
1223      work well with PPro base chips.  */
1224   m_386 | m_K6_GEODE | m_AMD_MULTIPLE | m_CORE2 | m_GENERIC64,
1225
1226   /* X86_TUNE_PUSH_MEMORY */
1227   m_386 | m_K6_GEODE | m_AMD_MULTIPLE | m_PENT4
1228   | m_NOCONA | m_CORE2 | m_GENERIC,
1229
1230   /* X86_TUNE_ZERO_EXTEND_WITH_AND */
1231   m_486 | m_PENT,
1232
1233   /* X86_TUNE_UNROLL_STRLEN */
1234   m_486 | m_PENT | m_PPRO | m_AMD_MULTIPLE | m_K6 | m_CORE2 | m_GENERIC,
1235
1236   /* X86_TUNE_DEEP_BRANCH_PREDICTION */
1237   m_PPRO | m_K6_GEODE | m_AMD_MULTIPLE | m_PENT4 | m_GENERIC,
1238
1239   /* X86_TUNE_BRANCH_PREDICTION_HINTS: Branch hints were put in P4 based
1240      on simulation result. But after P4 was made, no performance benefit
1241      was observed with branch hints.  It also increases the code size.
1242      As a result, icc never generates branch hints.  */
1243   0,
1244
1245   /* X86_TUNE_DOUBLE_WITH_ADD */
1246   ~m_386,
1247
1248   /* X86_TUNE_USE_SAHF */
1249   m_PPRO | m_K6_GEODE | m_K8 | m_AMDFAM10 | m_PENT4
1250   | m_NOCONA | m_CORE2 | m_GENERIC,
1251
1252   /* X86_TUNE_MOVX: Enable to zero extend integer registers to avoid
1253      partial dependencies.  */
1254   m_AMD_MULTIPLE | m_PPRO | m_PENT4 | m_NOCONA
1255   | m_CORE2 | m_GENERIC | m_GEODE /* m_386 | m_K6 */,
1256
1257   /* X86_TUNE_PARTIAL_REG_STALL: We probably ought to watch for partial
1258      register stalls on Generic32 compilation setting as well.  However
1259      in current implementation the partial register stalls are not eliminated
1260      very well - they can be introduced via subregs synthesized by combine
1261      and can happen in caller/callee saving sequences.  Because this option
1262      pays back little on PPro based chips and is in conflict with partial reg
1263      dependencies used by Athlon/P4 based chips, it is better to leave it off
1264      for generic32 for now.  */
1265   m_PPRO,
1266
1267   /* X86_TUNE_PARTIAL_FLAG_REG_STALL */
1268   m_CORE2 | m_GENERIC,
1269
1270   /* X86_TUNE_USE_HIMODE_FIOP */
1271   m_386 | m_486 | m_K6_GEODE,
1272
1273   /* X86_TUNE_USE_SIMODE_FIOP */
1274   ~(m_PPRO | m_AMD_MULTIPLE | m_PENT | m_CORE2 | m_GENERIC),
1275
1276   /* X86_TUNE_USE_MOV0 */
1277   m_K6,
1278
1279   /* X86_TUNE_USE_CLTD */
1280   ~(m_PENT | m_K6 | m_CORE2 | m_GENERIC),
1281
1282   /* X86_TUNE_USE_XCHGB: Use xchgb %rh,%rl instead of rolw/rorw $8,rx.  */
1283   m_PENT4,
1284
1285   /* X86_TUNE_SPLIT_LONG_MOVES */
1286   m_PPRO,
1287
1288   /* X86_TUNE_READ_MODIFY_WRITE */
1289   ~m_PENT,
1290
1291   /* X86_TUNE_READ_MODIFY */
1292   ~(m_PENT | m_PPRO),
1293
1294   /* X86_TUNE_PROMOTE_QIMODE */
1295   m_K6_GEODE | m_PENT | m_386 | m_486 | m_AMD_MULTIPLE | m_CORE2
1296   | m_GENERIC /* | m_PENT4 ? */,
1297
1298   /* X86_TUNE_FAST_PREFIX */
1299   ~(m_PENT | m_486 | m_386),
1300
1301   /* X86_TUNE_SINGLE_STRINGOP */
1302   m_386 | m_PENT4 | m_NOCONA,
1303
1304   /* X86_TUNE_QIMODE_MATH */
1305   ~0,
1306
1307   /* X86_TUNE_HIMODE_MATH: On PPro this flag is meant to avoid partial
1308      register stalls.  Just like X86_TUNE_PARTIAL_REG_STALL this option
1309      might be considered for Generic32 if our scheme for avoiding partial
1310      stalls was more effective.  */
1311   ~m_PPRO,
1312
1313   /* X86_TUNE_PROMOTE_QI_REGS */
1314   0,
1315
1316   /* X86_TUNE_PROMOTE_HI_REGS */
1317   m_PPRO,
1318
1319   /* X86_TUNE_ADD_ESP_4: Enable if add/sub is preferred over 1/2 push/pop.  */
1320   m_AMD_MULTIPLE | m_K6_GEODE | m_PENT4 | m_NOCONA | m_CORE2 | m_GENERIC,
1321
1322   /* X86_TUNE_ADD_ESP_8 */
1323   m_AMD_MULTIPLE | m_PPRO | m_K6_GEODE | m_386
1324   | m_486 | m_PENT4 | m_NOCONA | m_CORE2 | m_GENERIC,
1325
1326   /* X86_TUNE_SUB_ESP_4 */
1327   m_AMD_MULTIPLE | m_PPRO | m_PENT4 | m_NOCONA | m_CORE2 | m_GENERIC,
1328
1329   /* X86_TUNE_SUB_ESP_8 */
1330   m_AMD_MULTIPLE | m_PPRO | m_386 | m_486
1331   | m_PENT4 | m_NOCONA | m_CORE2 | m_GENERIC,
1332
1333   /* X86_TUNE_INTEGER_DFMODE_MOVES: Enable if integer moves are preferred
1334      for DFmode copies */
1335   ~(m_AMD_MULTIPLE | m_PENT4 | m_NOCONA | m_PPRO | m_CORE2
1336     | m_GENERIC | m_GEODE),
1337
1338   /* X86_TUNE_PARTIAL_REG_DEPENDENCY */
1339   m_AMD_MULTIPLE | m_PENT4 | m_NOCONA | m_CORE2 | m_GENERIC,
1340
1341   /* X86_TUNE_SSE_PARTIAL_REG_DEPENDENCY: In the Generic model we have a
1342      conflict here in between PPro/Pentium4 based chips that thread 128bit
1343      SSE registers as single units versus K8 based chips that divide SSE
1344      registers to two 64bit halves.  This knob promotes all store destinations
1345      to be 128bit to allow register renaming on 128bit SSE units, but usually
1346      results in one extra microop on 64bit SSE units.  Experimental results
1347      shows that disabling this option on P4 brings over 20% SPECfp regression,
1348      while enabling it on K8 brings roughly 2.4% regression that can be partly
1349      masked by careful scheduling of moves.  */
1350   m_PENT4 | m_NOCONA | m_PPRO | m_CORE2 | m_GENERIC | m_AMDFAM10,
1351
1352   /* X86_TUNE_SSE_UNALIGNED_MOVE_OPTIMAL */
1353   m_AMDFAM10,
1354
1355   /* X86_TUNE_SSE_SPLIT_REGS: Set for machines where the type and dependencies
1356      are resolved on SSE register parts instead of whole registers, so we may
1357      maintain just lower part of scalar values in proper format leaving the
1358      upper part undefined.  */
1359   m_ATHLON_K8,
1360
1361   /* X86_TUNE_SSE_TYPELESS_STORES */
1362   m_AMD_MULTIPLE,
1363
1364   /* X86_TUNE_SSE_LOAD0_BY_PXOR */
1365   m_PPRO | m_PENT4 | m_NOCONA,
1366
1367   /* X86_TUNE_MEMORY_MISMATCH_STALL */
1368   m_AMD_MULTIPLE | m_PENT4 | m_NOCONA | m_CORE2 | m_GENERIC,
1369
1370   /* X86_TUNE_PROLOGUE_USING_MOVE */
1371   m_ATHLON_K8 | m_PPRO | m_CORE2 | m_GENERIC,
1372
1373   /* X86_TUNE_EPILOGUE_USING_MOVE */
1374   m_ATHLON_K8 | m_PPRO | m_CORE2 | m_GENERIC,
1375
1376   /* X86_TUNE_SHIFT1 */
1377   ~m_486,
1378
1379   /* X86_TUNE_USE_FFREEP */
1380   m_AMD_MULTIPLE,
1381
1382   /* X86_TUNE_INTER_UNIT_MOVES */
1383   ~(m_AMD_MULTIPLE | m_GENERIC),
1384
1385   /* X86_TUNE_INTER_UNIT_CONVERSIONS */
1386   ~(m_AMDFAM10),
1387
1388   /* X86_TUNE_FOUR_JUMP_LIMIT: Some CPU cores are not able to predict more
1389      than 4 branch instructions in the 16 byte window.  */
1390   m_PPRO | m_AMD_MULTIPLE | m_PENT4 | m_NOCONA | m_CORE2 | m_GENERIC,
1391
1392   /* X86_TUNE_SCHEDULE */
1393   m_PPRO | m_AMD_MULTIPLE | m_K6_GEODE | m_PENT | m_CORE2 | m_GENERIC,
1394
1395   /* X86_TUNE_USE_BT */
1396   m_AMD_MULTIPLE | m_CORE2 | m_GENERIC,
1397
1398   /* X86_TUNE_USE_INCDEC */
1399   ~(m_PENT4 | m_NOCONA | m_GENERIC),
1400
1401   /* X86_TUNE_PAD_RETURNS */
1402   m_AMD_MULTIPLE | m_CORE2 | m_GENERIC,
1403
1404   /* X86_TUNE_EXT_80387_CONSTANTS */
1405   m_K6_GEODE | m_ATHLON_K8 | m_PENT4 | m_NOCONA | m_PPRO | m_CORE2 | m_GENERIC,
1406
1407   /* X86_TUNE_SHORTEN_X87_SSE */
1408   ~m_K8,
1409
1410   /* X86_TUNE_AVOID_VECTOR_DECODE */
1411   m_K8 | m_GENERIC64,
1412
1413   /* X86_TUNE_PROMOTE_HIMODE_IMUL: Modern CPUs have same latency for HImode
1414      and SImode multiply, but 386 and 486 do HImode multiply faster.  */
1415   ~(m_386 | m_486),
1416
1417   /* X86_TUNE_SLOW_IMUL_IMM32_MEM: Imul of 32-bit constant and memory is
1418      vector path on AMD machines.  */
1419   m_K8 | m_GENERIC64 | m_AMDFAM10,
1420
1421   /* X86_TUNE_SLOW_IMUL_IMM8: Imul of 8-bit constant is vector path on AMD
1422      machines.  */
1423   m_K8 | m_GENERIC64 | m_AMDFAM10,
1424
1425   /* X86_TUNE_MOVE_M1_VIA_OR: On pentiums, it is faster to load -1 via OR
1426      than a MOV.  */
1427   m_PENT,
1428
1429   /* X86_TUNE_NOT_UNPAIRABLE: NOT is not pairable on Pentium, while XOR is,
1430      but one byte longer.  */
1431   m_PENT,
1432
1433   /* X86_TUNE_NOT_VECTORMODE: On AMD K6, NOT is vector decoded with memory
1434      operand that cannot be represented using a modRM byte.  The XOR
1435      replacement is long decoded, so this split helps here as well.  */
1436   m_K6,
1437
1438   /* X86_TUNE_USE_VECTOR_FP_CONVERTS: Prefer vector packed SSE conversion
1439      from FP to FP. */
1440   m_AMDFAM10 | m_GENERIC,
1441
1442   /* X86_TUNE_USE_VECTOR_CONVERTS: Prefer vector packed SSE conversion
1443      from integer to FP. */
1444   m_AMDFAM10,
1445
1446   /* X86_TUNE_FUSE_CMP_AND_BRANCH: Fuse a compare or test instruction
1447      with a subsequent conditional jump instruction into a single
1448      compare-and-branch uop.  */
1449   m_CORE2,
1450 };
1451
1452 /* Feature tests against the various architecture variations.  */
1453 unsigned char ix86_arch_features[X86_ARCH_LAST];
1454
1455 /* Feature tests against the various architecture variations, used to create
1456    ix86_arch_features based on the processor mask.  */
1457 static unsigned int initial_ix86_arch_features[X86_ARCH_LAST] = {
1458   /* X86_ARCH_CMOVE: Conditional move was added for pentiumpro.  */
1459   ~(m_386 | m_486 | m_PENT | m_K6),
1460
1461   /* X86_ARCH_CMPXCHG: Compare and exchange was added for 80486.  */
1462   ~m_386,
1463
1464   /* X86_ARCH_CMPXCHG8B: Compare and exchange 8 bytes was added for pentium. */
1465   ~(m_386 | m_486),
1466
1467   /* X86_ARCH_XADD: Exchange and add was added for 80486.  */
1468   ~m_386,
1469
1470   /* X86_ARCH_BSWAP: Byteswap was added for 80486.  */
1471   ~m_386,
1472 };
1473
1474 static const unsigned int x86_accumulate_outgoing_args
1475   = m_AMD_MULTIPLE | m_PENT4 | m_NOCONA | m_PPRO | m_CORE2 | m_GENERIC;
1476
1477 static const unsigned int x86_arch_always_fancy_math_387
1478   = m_PENT | m_PPRO | m_AMD_MULTIPLE | m_PENT4
1479     | m_NOCONA | m_CORE2 | m_GENERIC;
1480
1481 static enum stringop_alg stringop_alg = no_stringop;
1482
1483 /* In case the average insn count for single function invocation is
1484    lower than this constant, emit fast (but longer) prologue and
1485    epilogue code.  */
1486 #define FAST_PROLOGUE_INSN_COUNT 20
1487
1488 /* Names for 8 (low), 8 (high), and 16-bit registers, respectively.  */
1489 static const char *const qi_reg_name[] = QI_REGISTER_NAMES;
1490 static const char *const qi_high_reg_name[] = QI_HIGH_REGISTER_NAMES;
1491 static const char *const hi_reg_name[] = HI_REGISTER_NAMES;
1492
1493 /* Array of the smallest class containing reg number REGNO, indexed by
1494    REGNO.  Used by REGNO_REG_CLASS in i386.h.  */
1495
1496 enum reg_class const regclass_map[FIRST_PSEUDO_REGISTER] =
1497 {
1498   /* ax, dx, cx, bx */
1499   AREG, DREG, CREG, BREG,
1500   /* si, di, bp, sp */
1501   SIREG, DIREG, NON_Q_REGS, NON_Q_REGS,
1502   /* FP registers */
1503   FP_TOP_REG, FP_SECOND_REG, FLOAT_REGS, FLOAT_REGS,
1504   FLOAT_REGS, FLOAT_REGS, FLOAT_REGS, FLOAT_REGS,
1505   /* arg pointer */
1506   NON_Q_REGS,
1507   /* flags, fpsr, fpcr, frame */
1508   NO_REGS, NO_REGS, NO_REGS, NON_Q_REGS,
1509   /* SSE registers */
1510   SSE_FIRST_REG, SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS,
1511   SSE_REGS, SSE_REGS,
1512   /* MMX registers */
1513   MMX_REGS, MMX_REGS, MMX_REGS, MMX_REGS, MMX_REGS, MMX_REGS,
1514   MMX_REGS, MMX_REGS,
1515   /* REX registers */
1516   NON_Q_REGS, NON_Q_REGS, NON_Q_REGS, NON_Q_REGS,
1517   NON_Q_REGS, NON_Q_REGS, NON_Q_REGS, NON_Q_REGS,
1518   /* SSE REX registers */
1519   SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS, SSE_REGS,
1520   SSE_REGS, SSE_REGS,
1521 };
1522
1523 /* The "default" register map used in 32bit mode.  */
1524
1525 int const dbx_register_map[FIRST_PSEUDO_REGISTER] =
1526 {
1527   0, 2, 1, 3, 6, 7, 4, 5,               /* general regs */
1528   12, 13, 14, 15, 16, 17, 18, 19,       /* fp regs */
1529   -1, -1, -1, -1, -1,                   /* arg, flags, fpsr, fpcr, frame */
1530   21, 22, 23, 24, 25, 26, 27, 28,       /* SSE */
1531   29, 30, 31, 32, 33, 34, 35, 36,       /* MMX */
1532   -1, -1, -1, -1, -1, -1, -1, -1,       /* extended integer registers */
1533   -1, -1, -1, -1, -1, -1, -1, -1,       /* extended SSE registers */
1534 };
1535
1536 /* The "default" register map used in 64bit mode.  */
1537
1538 int const dbx64_register_map[FIRST_PSEUDO_REGISTER] =
1539 {
1540   0, 1, 2, 3, 4, 5, 6, 7,               /* general regs */
1541   33, 34, 35, 36, 37, 38, 39, 40,       /* fp regs */
1542   -1, -1, -1, -1, -1,                   /* arg, flags, fpsr, fpcr, frame */
1543   17, 18, 19, 20, 21, 22, 23, 24,       /* SSE */
1544   41, 42, 43, 44, 45, 46, 47, 48,       /* MMX */
1545   8,9,10,11,12,13,14,15,                /* extended integer registers */
1546   25, 26, 27, 28, 29, 30, 31, 32,       /* extended SSE registers */
1547 };
1548
1549 /* Define the register numbers to be used in Dwarf debugging information.
1550    The SVR4 reference port C compiler uses the following register numbers
1551    in its Dwarf output code:
1552         0 for %eax (gcc regno = 0)
1553         1 for %ecx (gcc regno = 2)
1554         2 for %edx (gcc regno = 1)
1555         3 for %ebx (gcc regno = 3)
1556         4 for %esp (gcc regno = 7)
1557         5 for %ebp (gcc regno = 6)
1558         6 for %esi (gcc regno = 4)
1559         7 for %edi (gcc regno = 5)
1560    The following three DWARF register numbers are never generated by
1561    the SVR4 C compiler or by the GNU compilers, but SDB on x86/svr4
1562    believes these numbers have these meanings.
1563         8  for %eip    (no gcc equivalent)
1564         9  for %eflags (gcc regno = 17)
1565         10 for %trapno (no gcc equivalent)
1566    It is not at all clear how we should number the FP stack registers
1567    for the x86 architecture.  If the version of SDB on x86/svr4 were
1568    a bit less brain dead with respect to floating-point then we would
1569    have a precedent to follow with respect to DWARF register numbers
1570    for x86 FP registers, but the SDB on x86/svr4 is so completely
1571    broken with respect to FP registers that it is hardly worth thinking
1572    of it as something to strive for compatibility with.
1573    The version of x86/svr4 SDB I have at the moment does (partially)
1574    seem to believe that DWARF register number 11 is associated with
1575    the x86 register %st(0), but that's about all.  Higher DWARF
1576    register numbers don't seem to be associated with anything in
1577    particular, and even for DWARF regno 11, SDB only seems to under-
1578    stand that it should say that a variable lives in %st(0) (when
1579    asked via an `=' command) if we said it was in DWARF regno 11,
1580    but SDB still prints garbage when asked for the value of the
1581    variable in question (via a `/' command).
1582    (Also note that the labels SDB prints for various FP stack regs
1583    when doing an `x' command are all wrong.)
1584    Note that these problems generally don't affect the native SVR4
1585    C compiler because it doesn't allow the use of -O with -g and
1586    because when it is *not* optimizing, it allocates a memory
1587    location for each floating-point variable, and the memory
1588    location is what gets described in the DWARF AT_location
1589    attribute for the variable in question.
1590    Regardless of the severe mental illness of the x86/svr4 SDB, we
1591    do something sensible here and we use the following DWARF
1592    register numbers.  Note that these are all stack-top-relative
1593    numbers.
1594         11 for %st(0) (gcc regno = 8)
1595         12 for %st(1) (gcc regno = 9)
1596         13 for %st(2) (gcc regno = 10)
1597         14 for %st(3) (gcc regno = 11)
1598         15 for %st(4) (gcc regno = 12)
1599         16 for %st(5) (gcc regno = 13)
1600         17 for %st(6) (gcc regno = 14)
1601         18 for %st(7) (gcc regno = 15)
1602 */
1603 int const svr4_dbx_register_map[FIRST_PSEUDO_REGISTER] =
1604 {
1605   0, 2, 1, 3, 6, 7, 5, 4,               /* general regs */
1606   11, 12, 13, 14, 15, 16, 17, 18,       /* fp regs */
1607   -1, 9, -1, -1, -1,                    /* arg, flags, fpsr, fpcr, frame */
1608   21, 22, 23, 24, 25, 26, 27, 28,       /* SSE registers */
1609   29, 30, 31, 32, 33, 34, 35, 36,       /* MMX registers */
1610   -1, -1, -1, -1, -1, -1, -1, -1,       /* extended integer registers */
1611   -1, -1, -1, -1, -1, -1, -1, -1,       /* extended SSE registers */
1612 };
1613
1614 /* Test and compare insns in i386.md store the information needed to
1615    generate branch and scc insns here.  */
1616
1617 rtx ix86_compare_op0 = NULL_RTX;
1618 rtx ix86_compare_op1 = NULL_RTX;
1619 rtx ix86_compare_emitted = NULL_RTX;
1620
1621 /* Define parameter passing and return registers.  */
1622
1623 static int const x86_64_int_parameter_registers[6] =
1624 {
1625   DI_REG, SI_REG, DX_REG, CX_REG, R8_REG, R9_REG
1626 };
1627
1628 static int const x86_64_ms_abi_int_parameter_registers[4] =
1629 {
1630   CX_REG, DX_REG, R8_REG, R9_REG
1631 };
1632
1633 static int const x86_64_int_return_registers[4] =
1634 {
1635   AX_REG, DX_REG, DI_REG, SI_REG
1636 };
1637
1638 /* Define the structure for the machine field in struct function.  */
1639
1640 struct stack_local_entry GTY(())
1641 {
1642   unsigned short mode;
1643   unsigned short n;
1644   rtx rtl;
1645   struct stack_local_entry *next;
1646 };
1647
1648 /* Structure describing stack frame layout.
1649    Stack grows downward:
1650
1651    [arguments]
1652                                               <- ARG_POINTER
1653    saved pc
1654
1655    saved frame pointer if frame_pointer_needed
1656                                               <- HARD_FRAME_POINTER
1657    [saved regs]
1658
1659    [padding0]
1660
1661    [saved SSE regs]
1662
1663    [padding1]          \
1664                         )
1665    [va_arg registers]  (
1666                         > to_allocate         <- FRAME_POINTER
1667    [frame]             (
1668                         )
1669    [padding2]          /
1670   */
1671 struct ix86_frame
1672 {
1673   int padding0;
1674   int nsseregs;
1675   int nregs;
1676   int padding1;
1677   int va_arg_size;
1678   HOST_WIDE_INT frame;
1679   int padding2;
1680   int outgoing_arguments_size;
1681   int red_zone_size;
1682
1683   HOST_WIDE_INT to_allocate;
1684   /* The offsets relative to ARG_POINTER.  */
1685   HOST_WIDE_INT frame_pointer_offset;
1686   HOST_WIDE_INT hard_frame_pointer_offset;
1687   HOST_WIDE_INT stack_pointer_offset;
1688
1689   /* When save_regs_using_mov is set, emit prologue using
1690      move instead of push instructions.  */
1691   bool save_regs_using_mov;
1692 };
1693
1694 /* Code model option.  */
1695 enum cmodel ix86_cmodel;
1696 /* Asm dialect.  */
1697 enum asm_dialect ix86_asm_dialect = ASM_ATT;
1698 /* TLS dialects.  */
1699 enum tls_dialect ix86_tls_dialect = TLS_DIALECT_GNU;
1700
1701 /* Which unit we are generating floating point math for.  */
1702 enum fpmath_unit ix86_fpmath;
1703
1704 /* Which cpu are we scheduling for.  */
1705 enum attr_cpu ix86_schedule;
1706
1707 /* Which cpu are we optimizing for.  */
1708 enum processor_type ix86_tune;
1709
1710 /* Which instruction set architecture to use.  */
1711 enum processor_type ix86_arch;
1712
1713 /* true if sse prefetch instruction is not NOOP.  */
1714 int x86_prefetch_sse;
1715
1716 /* ix86_regparm_string as a number */
1717 static int ix86_regparm;
1718
1719 /* -mstackrealign option */
1720 extern int ix86_force_align_arg_pointer;
1721 static const char ix86_force_align_arg_pointer_string[]
1722   = "force_align_arg_pointer";
1723
1724 static rtx (*ix86_gen_leave) (void);
1725 static rtx (*ix86_gen_pop1) (rtx);
1726 static rtx (*ix86_gen_add3) (rtx, rtx, rtx);
1727 static rtx (*ix86_gen_sub3) (rtx, rtx, rtx);
1728 static rtx (*ix86_gen_sub3_carry) (rtx, rtx, rtx, rtx);
1729 static rtx (*ix86_gen_one_cmpl2) (rtx, rtx);
1730 static rtx (*ix86_gen_monitor) (rtx, rtx, rtx);
1731 static rtx (*ix86_gen_andsp) (rtx, rtx, rtx);
1732
1733 /* Preferred alignment for stack boundary in bits.  */
1734 unsigned int ix86_preferred_stack_boundary;
1735
1736 /* Alignment for incoming stack boundary in bits specified at
1737    command line.  */
1738 static unsigned int ix86_user_incoming_stack_boundary;
1739
1740 /* Default alignment for incoming stack boundary in bits.  */
1741 static unsigned int ix86_default_incoming_stack_boundary;
1742
1743 /* Alignment for incoming stack boundary in bits.  */
1744 unsigned int ix86_incoming_stack_boundary;
1745
1746 /* Values 1-5: see jump.c */
1747 int ix86_branch_cost;
1748
1749 /* Calling abi specific va_list type nodes.  */
1750 static GTY(()) tree sysv_va_list_type_node;
1751 static GTY(()) tree ms_va_list_type_node;
1752
1753 /* Variables which are this size or smaller are put in the data/bss
1754    or ldata/lbss sections.  */
1755
1756 int ix86_section_threshold = 65536;
1757
1758 /* Prefix built by ASM_GENERATE_INTERNAL_LABEL.  */
1759 char internal_label_prefix[16];
1760 int internal_label_prefix_len;
1761
1762 /* Fence to use after loop using movnt.  */
1763 tree x86_mfence;
1764
1765 /* Register class used for passing given 64bit part of the argument.
1766    These represent classes as documented by the PS ABI, with the exception
1767    of SSESF, SSEDF classes, that are basically SSE class, just gcc will
1768    use SF or DFmode move instead of DImode to avoid reformatting penalties.
1769
1770    Similarly we play games with INTEGERSI_CLASS to use cheaper SImode moves
1771    whenever possible (upper half does contain padding).  */
1772 enum x86_64_reg_class
1773   {
1774     X86_64_NO_CLASS,
1775     X86_64_INTEGER_CLASS,
1776     X86_64_INTEGERSI_CLASS,
1777     X86_64_SSE_CLASS,
1778     X86_64_SSESF_CLASS,
1779     X86_64_SSEDF_CLASS,
1780     X86_64_SSEUP_CLASS,
1781     X86_64_X87_CLASS,
1782     X86_64_X87UP_CLASS,
1783     X86_64_COMPLEX_X87_CLASS,
1784     X86_64_MEMORY_CLASS
1785   };
1786
1787 #define MAX_CLASSES 4
1788
1789 /* Table of constants used by fldpi, fldln2, etc....  */
1790 static REAL_VALUE_TYPE ext_80387_constants_table [5];
1791 static bool ext_80387_constants_init = 0;
1792
1793 \f
1794 static struct machine_function * ix86_init_machine_status (void);
1795 static rtx ix86_function_value (const_tree, const_tree, bool);
1796 static int ix86_function_regparm (const_tree, const_tree);
1797 static void ix86_compute_frame_layout (struct ix86_frame *);
1798 static bool ix86_expand_vector_init_one_nonzero (bool, enum machine_mode,
1799                                                  rtx, rtx, int);
1800 static void ix86_add_new_builtins (int);
1801
1802 enum ix86_function_specific_strings
1803 {
1804   IX86_FUNCTION_SPECIFIC_ARCH,
1805   IX86_FUNCTION_SPECIFIC_TUNE,
1806   IX86_FUNCTION_SPECIFIC_FPMATH,
1807   IX86_FUNCTION_SPECIFIC_MAX
1808 };
1809
1810 static char *ix86_target_string (int, int, const char *, const char *,
1811                                  const char *, bool);
1812 static void ix86_debug_options (void) ATTRIBUTE_UNUSED;
1813 static void ix86_function_specific_save (struct cl_target_option *);
1814 static void ix86_function_specific_restore (struct cl_target_option *);
1815 static void ix86_function_specific_print (FILE *, int,
1816                                           struct cl_target_option *);
1817 static bool ix86_valid_target_attribute_p (tree, tree, tree, int);
1818 static bool ix86_valid_target_attribute_inner_p (tree, char *[]);
1819 static bool ix86_can_inline_p (tree, tree);
1820 static void ix86_set_current_function (tree);
1821
1822 \f
1823 /* The svr4 ABI for the i386 says that records and unions are returned
1824    in memory.  */
1825 #ifndef DEFAULT_PCC_STRUCT_RETURN
1826 #define DEFAULT_PCC_STRUCT_RETURN 1
1827 #endif
1828
1829 /* Whether -mtune= or -march= were specified */
1830 static int ix86_tune_defaulted;
1831 static int ix86_arch_specified;
1832
1833 /* Bit flags that specify the ISA we are compiling for.  */
1834 int ix86_isa_flags = TARGET_64BIT_DEFAULT | TARGET_SUBTARGET_ISA_DEFAULT;
1835
1836 /* A mask of ix86_isa_flags that includes bit X if X
1837    was set or cleared on the command line.  */
1838 static int ix86_isa_flags_explicit;
1839
1840 /* Define a set of ISAs which are available when a given ISA is
1841    enabled.  MMX and SSE ISAs are handled separately.  */
1842
1843 #define OPTION_MASK_ISA_MMX_SET OPTION_MASK_ISA_MMX
1844 #define OPTION_MASK_ISA_3DNOW_SET \
1845   (OPTION_MASK_ISA_3DNOW | OPTION_MASK_ISA_MMX_SET)
1846
1847 #define OPTION_MASK_ISA_SSE_SET OPTION_MASK_ISA_SSE
1848 #define OPTION_MASK_ISA_SSE2_SET \
1849   (OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_SSE_SET)
1850 #define OPTION_MASK_ISA_SSE3_SET \
1851   (OPTION_MASK_ISA_SSE3 | OPTION_MASK_ISA_SSE2_SET)
1852 #define OPTION_MASK_ISA_SSSE3_SET \
1853   (OPTION_MASK_ISA_SSSE3 | OPTION_MASK_ISA_SSE3_SET)
1854 #define OPTION_MASK_ISA_SSE4_1_SET \
1855   (OPTION_MASK_ISA_SSE4_1 | OPTION_MASK_ISA_SSSE3_SET)
1856 #define OPTION_MASK_ISA_SSE4_2_SET \
1857   (OPTION_MASK_ISA_SSE4_2 | OPTION_MASK_ISA_SSE4_1_SET)
1858 #define OPTION_MASK_ISA_AVX_SET \
1859   (OPTION_MASK_ISA_AVX | OPTION_MASK_ISA_SSE4_2_SET)
1860 #define OPTION_MASK_ISA_FMA_SET \
1861   (OPTION_MASK_ISA_FMA | OPTION_MASK_ISA_AVX_SET)
1862
1863 /* SSE4 includes both SSE4.1 and SSE4.2. -msse4 should be the same
1864    as -msse4.2.  */
1865 #define OPTION_MASK_ISA_SSE4_SET OPTION_MASK_ISA_SSE4_2_SET
1866
1867 #define OPTION_MASK_ISA_SSE4A_SET \
1868   (OPTION_MASK_ISA_SSE4A | OPTION_MASK_ISA_SSE3_SET)
1869 #define OPTION_MASK_ISA_SSE5_SET \
1870   (OPTION_MASK_ISA_SSE5 | OPTION_MASK_ISA_SSE4A_SET)
1871
1872 /* AES and PCLMUL need SSE2 because they use xmm registers */
1873 #define OPTION_MASK_ISA_AES_SET \
1874   (OPTION_MASK_ISA_AES | OPTION_MASK_ISA_SSE2_SET)
1875 #define OPTION_MASK_ISA_PCLMUL_SET \
1876   (OPTION_MASK_ISA_PCLMUL | OPTION_MASK_ISA_SSE2_SET)
1877
1878 #define OPTION_MASK_ISA_ABM_SET \
1879   (OPTION_MASK_ISA_ABM | OPTION_MASK_ISA_POPCNT)
1880 #define OPTION_MASK_ISA_POPCNT_SET OPTION_MASK_ISA_POPCNT
1881 #define OPTION_MASK_ISA_CX16_SET OPTION_MASK_ISA_CX16
1882 #define OPTION_MASK_ISA_SAHF_SET OPTION_MASK_ISA_SAHF
1883
1884 /* Define a set of ISAs which aren't available when a given ISA is
1885    disabled.  MMX and SSE ISAs are handled separately.  */
1886
1887 #define OPTION_MASK_ISA_MMX_UNSET \
1888   (OPTION_MASK_ISA_MMX | OPTION_MASK_ISA_3DNOW_UNSET)
1889 #define OPTION_MASK_ISA_3DNOW_UNSET \
1890   (OPTION_MASK_ISA_3DNOW | OPTION_MASK_ISA_3DNOW_A_UNSET)
1891 #define OPTION_MASK_ISA_3DNOW_A_UNSET OPTION_MASK_ISA_3DNOW_A
1892
1893 #define OPTION_MASK_ISA_SSE_UNSET \
1894   (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_SSE2_UNSET)
1895 #define OPTION_MASK_ISA_SSE2_UNSET \
1896   (OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_SSE3_UNSET)
1897 #define OPTION_MASK_ISA_SSE3_UNSET \
1898   (OPTION_MASK_ISA_SSE3 \
1899    | OPTION_MASK_ISA_SSSE3_UNSET \
1900    | OPTION_MASK_ISA_SSE4A_UNSET )
1901 #define OPTION_MASK_ISA_SSSE3_UNSET \
1902   (OPTION_MASK_ISA_SSSE3 | OPTION_MASK_ISA_SSE4_1_UNSET)
1903 #define OPTION_MASK_ISA_SSE4_1_UNSET \
1904   (OPTION_MASK_ISA_SSE4_1 | OPTION_MASK_ISA_SSE4_2_UNSET)
1905 #define OPTION_MASK_ISA_SSE4_2_UNSET \
1906   (OPTION_MASK_ISA_SSE4_2 | OPTION_MASK_ISA_AVX_UNSET )
1907 #define OPTION_MASK_ISA_AVX_UNSET \
1908   (OPTION_MASK_ISA_AVX | OPTION_MASK_ISA_FMA_UNSET)
1909 #define OPTION_MASK_ISA_FMA_UNSET OPTION_MASK_ISA_FMA
1910
1911 /* SSE4 includes both SSE4.1 and SSE4.2.  -mno-sse4 should the same
1912    as -mno-sse4.1. */
1913 #define OPTION_MASK_ISA_SSE4_UNSET OPTION_MASK_ISA_SSE4_1_UNSET
1914
1915 #define OPTION_MASK_ISA_SSE4A_UNSET \
1916   (OPTION_MASK_ISA_SSE4A | OPTION_MASK_ISA_SSE5_UNSET)
1917 #define OPTION_MASK_ISA_SSE5_UNSET OPTION_MASK_ISA_SSE5
1918 #define OPTION_MASK_ISA_AES_UNSET OPTION_MASK_ISA_AES
1919 #define OPTION_MASK_ISA_PCLMUL_UNSET OPTION_MASK_ISA_PCLMUL
1920 #define OPTION_MASK_ISA_ABM_UNSET OPTION_MASK_ISA_ABM
1921 #define OPTION_MASK_ISA_POPCNT_UNSET OPTION_MASK_ISA_POPCNT
1922 #define OPTION_MASK_ISA_CX16_UNSET OPTION_MASK_ISA_CX16
1923 #define OPTION_MASK_ISA_SAHF_UNSET OPTION_MASK_ISA_SAHF
1924
1925 /* Vectorization library interface and handlers.  */
1926 tree (*ix86_veclib_handler)(enum built_in_function, tree, tree) = NULL;
1927 static tree ix86_veclibabi_svml (enum built_in_function, tree, tree);
1928 static tree ix86_veclibabi_acml (enum built_in_function, tree, tree);
1929
1930 /* Processor target table, indexed by processor number */
1931 struct ptt
1932 {
1933   const struct processor_costs *cost;           /* Processor costs */
1934   const int align_loop;                         /* Default alignments.  */
1935   const int align_loop_max_skip;
1936   const int align_jump;
1937   const int align_jump_max_skip;
1938   const int align_func;
1939 };
1940
1941 static const struct ptt processor_target_table[PROCESSOR_max] =
1942 {
1943   {&i386_cost, 4, 3, 4, 3, 4},
1944   {&i486_cost, 16, 15, 16, 15, 16},
1945   {&pentium_cost, 16, 7, 16, 7, 16},
1946   {&pentiumpro_cost, 16, 15, 16, 10, 16},
1947   {&geode_cost, 0, 0, 0, 0, 0},
1948   {&k6_cost, 32, 7, 32, 7, 32},
1949   {&athlon_cost, 16, 7, 16, 7, 16},
1950   {&pentium4_cost, 0, 0, 0, 0, 0},
1951   {&k8_cost, 16, 7, 16, 7, 16},
1952   {&nocona_cost, 0, 0, 0, 0, 0},
1953   {&core2_cost, 16, 10, 16, 10, 16},
1954   {&generic32_cost, 16, 7, 16, 7, 16},
1955   {&generic64_cost, 16, 10, 16, 10, 16},
1956   {&amdfam10_cost, 32, 24, 32, 7, 32}
1957 };
1958
1959 static const char *const cpu_names[TARGET_CPU_DEFAULT_max] =
1960 {
1961   "generic",
1962   "i386",
1963   "i486",
1964   "pentium",
1965   "pentium-mmx",
1966   "pentiumpro",
1967   "pentium2",
1968   "pentium3",
1969   "pentium4",
1970   "pentium-m",
1971   "prescott",
1972   "nocona",
1973   "core2",
1974   "geode",
1975   "k6",
1976   "k6-2",
1977   "k6-3",
1978   "athlon",
1979   "athlon-4",
1980   "k8",
1981   "amdfam10"
1982 };
1983 \f
1984 /* Implement TARGET_HANDLE_OPTION.  */
1985
1986 static bool
1987 ix86_handle_option (size_t code, const char *arg ATTRIBUTE_UNUSED, int value)
1988 {
1989   switch (code)
1990     {
1991     case OPT_mmmx:
1992       if (value)
1993         {
1994           ix86_isa_flags |= OPTION_MASK_ISA_MMX_SET;
1995           ix86_isa_flags_explicit |= OPTION_MASK_ISA_MMX_SET;
1996         }
1997       else
1998         {
1999           ix86_isa_flags &= ~OPTION_MASK_ISA_MMX_UNSET;
2000           ix86_isa_flags_explicit |= OPTION_MASK_ISA_MMX_UNSET;
2001         }
2002       return true;
2003
2004     case OPT_m3dnow:
2005       if (value)
2006         {
2007           ix86_isa_flags |= OPTION_MASK_ISA_3DNOW_SET;
2008           ix86_isa_flags_explicit |= OPTION_MASK_ISA_3DNOW_SET;
2009         }
2010       else
2011         {
2012           ix86_isa_flags &= ~OPTION_MASK_ISA_3DNOW_UNSET;
2013           ix86_isa_flags_explicit |= OPTION_MASK_ISA_3DNOW_UNSET;
2014         }
2015       return true;
2016
2017     case OPT_m3dnowa:
2018       return false;
2019
2020     case OPT_msse:
2021       if (value)
2022         {
2023           ix86_isa_flags |= OPTION_MASK_ISA_SSE_SET;
2024           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE_SET;
2025         }
2026       else
2027         {
2028           ix86_isa_flags &= ~OPTION_MASK_ISA_SSE_UNSET;
2029           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE_UNSET;
2030         }
2031       return true;
2032
2033     case OPT_msse2:
2034       if (value)
2035         {
2036           ix86_isa_flags |= OPTION_MASK_ISA_SSE2_SET;
2037           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE2_SET;
2038         }
2039       else
2040         {
2041           ix86_isa_flags &= ~OPTION_MASK_ISA_SSE2_UNSET;
2042           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE2_UNSET;
2043         }
2044       return true;
2045
2046     case OPT_msse3:
2047       if (value)
2048         {
2049           ix86_isa_flags |= OPTION_MASK_ISA_SSE3_SET;
2050           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE3_SET;
2051         }
2052       else
2053         {
2054           ix86_isa_flags &= ~OPTION_MASK_ISA_SSE3_UNSET;
2055           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE3_UNSET;
2056         }
2057       return true;
2058
2059     case OPT_mssse3:
2060       if (value)
2061         {
2062           ix86_isa_flags |= OPTION_MASK_ISA_SSSE3_SET;
2063           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSSE3_SET;
2064         }
2065       else
2066         {
2067           ix86_isa_flags &= ~OPTION_MASK_ISA_SSSE3_UNSET;
2068           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSSE3_UNSET;
2069         }
2070       return true;
2071
2072     case OPT_msse4_1:
2073       if (value)
2074         {
2075           ix86_isa_flags |= OPTION_MASK_ISA_SSE4_1_SET;
2076           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_1_SET;
2077         }
2078       else
2079         {
2080           ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4_1_UNSET;
2081           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_1_UNSET;
2082         }
2083       return true;
2084
2085     case OPT_msse4_2:
2086       if (value)
2087         {
2088           ix86_isa_flags |= OPTION_MASK_ISA_SSE4_2_SET;
2089           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_2_SET;
2090         }
2091       else
2092         {
2093           ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4_2_UNSET;
2094           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_2_UNSET;
2095         }
2096       return true;
2097
2098     case OPT_mavx:
2099       if (value)
2100         {
2101           ix86_isa_flags |= OPTION_MASK_ISA_AVX_SET;
2102           ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX_SET;
2103         }
2104       else
2105         {
2106           ix86_isa_flags &= ~OPTION_MASK_ISA_AVX_UNSET;
2107           ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX_UNSET;
2108         }
2109       return true;
2110
2111     case OPT_mfma:
2112       if (value)
2113         {
2114           ix86_isa_flags |= OPTION_MASK_ISA_FMA_SET;
2115           ix86_isa_flags_explicit |= OPTION_MASK_ISA_FMA_SET;
2116         }
2117       else
2118         {
2119           ix86_isa_flags &= ~OPTION_MASK_ISA_FMA_UNSET;
2120           ix86_isa_flags_explicit |= OPTION_MASK_ISA_FMA_UNSET;
2121         }
2122       return true;
2123
2124     case OPT_msse4:
2125       ix86_isa_flags |= OPTION_MASK_ISA_SSE4_SET;
2126       ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_SET;
2127       return true;
2128
2129     case OPT_mno_sse4:
2130       ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4_UNSET;
2131       ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4_UNSET;
2132       return true;
2133
2134     case OPT_msse4a:
2135       if (value)
2136         {
2137           ix86_isa_flags |= OPTION_MASK_ISA_SSE4A_SET;
2138           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4A_SET;
2139         }
2140       else
2141         {
2142           ix86_isa_flags &= ~OPTION_MASK_ISA_SSE4A_UNSET;
2143           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE4A_UNSET;
2144         }
2145       return true;
2146
2147     case OPT_msse5:
2148       if (value)
2149         {
2150           ix86_isa_flags |= OPTION_MASK_ISA_SSE5_SET;
2151           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE5_SET;
2152         }
2153       else
2154         {
2155           ix86_isa_flags &= ~OPTION_MASK_ISA_SSE5_UNSET;
2156           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SSE5_UNSET;
2157         }
2158       return true;
2159
2160     case OPT_mabm:
2161       if (value)
2162         {
2163           ix86_isa_flags |= OPTION_MASK_ISA_ABM_SET;
2164           ix86_isa_flags_explicit |= OPTION_MASK_ISA_ABM_SET;
2165         }
2166       else
2167         {
2168           ix86_isa_flags &= ~OPTION_MASK_ISA_ABM_UNSET;
2169           ix86_isa_flags_explicit |= OPTION_MASK_ISA_ABM_UNSET;
2170         }
2171       return true;
2172
2173     case OPT_mpopcnt:
2174       if (value)
2175         {
2176           ix86_isa_flags |= OPTION_MASK_ISA_POPCNT_SET;
2177           ix86_isa_flags_explicit |= OPTION_MASK_ISA_POPCNT_SET;
2178         }
2179       else
2180         {
2181           ix86_isa_flags &= ~OPTION_MASK_ISA_POPCNT_UNSET;
2182           ix86_isa_flags_explicit |= OPTION_MASK_ISA_POPCNT_UNSET;
2183         }
2184       return true;
2185
2186     case OPT_msahf:
2187       if (value)
2188         {
2189           ix86_isa_flags |= OPTION_MASK_ISA_SAHF_SET;
2190           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SAHF_SET;
2191         }
2192       else
2193         {
2194           ix86_isa_flags &= ~OPTION_MASK_ISA_SAHF_UNSET;
2195           ix86_isa_flags_explicit |= OPTION_MASK_ISA_SAHF_UNSET;
2196         }
2197       return true;
2198
2199     case OPT_mcx16:
2200       if (value)
2201         {
2202           ix86_isa_flags |= OPTION_MASK_ISA_CX16_SET;
2203           ix86_isa_flags_explicit |= OPTION_MASK_ISA_CX16_SET;
2204         }
2205       else
2206         {
2207           ix86_isa_flags &= ~OPTION_MASK_ISA_CX16_UNSET;
2208           ix86_isa_flags_explicit |= OPTION_MASK_ISA_CX16_UNSET;
2209         }
2210       return true;
2211
2212     case OPT_maes:
2213       if (value)
2214         {
2215           ix86_isa_flags |= OPTION_MASK_ISA_AES_SET;
2216           ix86_isa_flags_explicit |= OPTION_MASK_ISA_AES_SET;
2217         }
2218       else
2219         {
2220           ix86_isa_flags &= ~OPTION_MASK_ISA_AES_UNSET;
2221           ix86_isa_flags_explicit |= OPTION_MASK_ISA_AES_UNSET;
2222         }
2223       return true;
2224
2225     case OPT_mpclmul:
2226       if (value)
2227         {
2228           ix86_isa_flags |= OPTION_MASK_ISA_PCLMUL_SET;
2229           ix86_isa_flags_explicit |= OPTION_MASK_ISA_PCLMUL_SET;
2230         }
2231       else
2232         {
2233           ix86_isa_flags &= ~OPTION_MASK_ISA_PCLMUL_UNSET;
2234           ix86_isa_flags_explicit |= OPTION_MASK_ISA_PCLMUL_UNSET;
2235         }
2236       return true;
2237
2238     default:
2239       return true;
2240     }
2241 }
2242 \f
2243 /* Return a string the documents the current -m options.  The caller is
2244    responsible for freeing the string.  */
2245
2246 static char *
2247 ix86_target_string (int isa, int flags, const char *arch, const char *tune,
2248                     const char *fpmath, bool add_nl_p)
2249 {
2250   struct ix86_target_opts
2251   {
2252     const char *option;         /* option string */
2253     int mask;                   /* isa mask options */
2254   };
2255
2256   /* This table is ordered so that options like -msse5 or -msse4.2 that imply
2257      preceding options while match those first.  */
2258   static struct ix86_target_opts isa_opts[] =
2259   {
2260     { "-m64",           OPTION_MASK_ISA_64BIT },
2261     { "-msse5",         OPTION_MASK_ISA_SSE5 },
2262     { "-msse4a",        OPTION_MASK_ISA_SSE4A },
2263     { "-msse4.2",       OPTION_MASK_ISA_SSE4_2 },
2264     { "-msse4.1",       OPTION_MASK_ISA_SSE4_1 },
2265     { "-mssse3",        OPTION_MASK_ISA_SSSE3 },
2266     { "-msse3",         OPTION_MASK_ISA_SSE3 },
2267     { "-msse2",         OPTION_MASK_ISA_SSE2 },
2268     { "-msse",          OPTION_MASK_ISA_SSE },
2269     { "-m3dnow",        OPTION_MASK_ISA_3DNOW },
2270     { "-m3dnowa",       OPTION_MASK_ISA_3DNOW_A },
2271     { "-mmmx",          OPTION_MASK_ISA_MMX },
2272     { "-mabm",          OPTION_MASK_ISA_ABM },
2273     { "-mpopcnt",       OPTION_MASK_ISA_POPCNT },
2274     { "-maes",          OPTION_MASK_ISA_AES },
2275     { "-mpclmul",       OPTION_MASK_ISA_PCLMUL },
2276   };
2277
2278   /* Flag options.  */
2279   static struct ix86_target_opts flag_opts[] =
2280   {
2281     { "-m128bit-long-double",           MASK_128BIT_LONG_DOUBLE },
2282     { "-m80387",                        MASK_80387 },
2283     { "-maccumulate-outgoing-args",     MASK_ACCUMULATE_OUTGOING_ARGS },
2284     { "-malign-double",                 MASK_ALIGN_DOUBLE },
2285     { "-mcld",                          MASK_CLD },
2286     { "-mfp-ret-in-387",                MASK_FLOAT_RETURNS },
2287     { "-mieee-fp",                      MASK_IEEE_FP },
2288     { "-minline-all-stringops",         MASK_INLINE_ALL_STRINGOPS },
2289     { "-minline-stringops-dynamically", MASK_INLINE_STRINGOPS_DYNAMICALLY },
2290     { "-mms-bitfields",                 MASK_MS_BITFIELD_LAYOUT },
2291     { "-mno-align-stringops",           MASK_NO_ALIGN_STRINGOPS },
2292     { "-mno-fancy-math-387",            MASK_NO_FANCY_MATH_387 },
2293     { "-mno-fused-madd",                MASK_NO_FUSED_MADD },
2294     { "-mno-push-args",                 MASK_NO_PUSH_ARGS },
2295     { "-mno-red-zone",                  MASK_NO_RED_ZONE },
2296     { "-momit-leaf-frame-pointer",      MASK_OMIT_LEAF_FRAME_POINTER },
2297     { "-mrecip",                        MASK_RECIP },
2298     { "-mrtd",                          MASK_RTD },
2299     { "-msseregparm",                   MASK_SSEREGPARM },
2300     { "-mstack-arg-probe",              MASK_STACK_PROBE },
2301     { "-mtls-direct-seg-refs",          MASK_TLS_DIRECT_SEG_REFS },
2302   };
2303
2304   const char *opts[ARRAY_SIZE (isa_opts) + ARRAY_SIZE (flag_opts) + 6][2];
2305
2306   char isa_other[40];
2307   char target_other[40];
2308   unsigned num = 0;
2309   unsigned i, j;
2310   char *ret;
2311   char *ptr;
2312   size_t len;
2313   size_t line_len;
2314   size_t sep_len;
2315
2316   memset (opts, '\0', sizeof (opts));
2317
2318   /* Add -march= option.  */
2319   if (arch)
2320     {
2321       opts[num][0] = "-march=";
2322       opts[num++][1] = arch;
2323     }
2324
2325   /* Add -mtune= option.  */
2326   if (tune)
2327     {
2328       opts[num][0] = "-mtune=";
2329       opts[num++][1] = tune;
2330     }
2331
2332   /* Pick out the options in isa options.  */
2333   for (i = 0; i < ARRAY_SIZE (isa_opts); i++)
2334     {
2335       if ((isa & isa_opts[i].mask) != 0)
2336         {
2337           opts[num++][0] = isa_opts[i].option;
2338           isa &= ~ isa_opts[i].mask;
2339         }
2340     }
2341
2342   if (isa && add_nl_p)
2343     {
2344       opts[num++][0] = isa_other;
2345       sprintf (isa_other, "(other isa: 0x%x)", isa);
2346     }
2347
2348   /* Add flag options.  */
2349   for (i = 0; i < ARRAY_SIZE (flag_opts); i++)
2350     {
2351       if ((flags & flag_opts[i].mask) != 0)
2352         {
2353           opts[num++][0] = flag_opts[i].option;
2354           flags &= ~ flag_opts[i].mask;
2355         }
2356     }
2357
2358   if (flags && add_nl_p)
2359     {
2360       opts[num++][0] = target_other;
2361       sprintf (target_other, "(other flags: 0x%x)", isa);
2362     }
2363
2364   /* Add -fpmath= option.  */
2365   if (fpmath)
2366     {
2367       opts[num][0] = "-mfpmath=";
2368       opts[num++][1] = fpmath;
2369     }
2370
2371   /* Any options?  */
2372   if (num == 0)
2373     return NULL;
2374
2375   gcc_assert (num < ARRAY_SIZE (opts));
2376
2377   /* Size the string.  */
2378   len = 0;
2379   sep_len = (add_nl_p) ? 3 : 1;
2380   for (i = 0; i < num; i++)
2381     {
2382       len += sep_len;
2383       for (j = 0; j < 2; j++)
2384         if (opts[i][j])
2385           len += strlen (opts[i][j]);
2386     }
2387
2388   /* Build the string.  */
2389   ret = ptr = (char *) xmalloc (len);
2390   line_len = 0;
2391
2392   for (i = 0; i < num; i++)
2393     {
2394       size_t len2[2];
2395
2396       for (j = 0; j < 2; j++)
2397         len2[j] = (opts[i][j]) ? strlen (opts[i][j]) : 0;
2398
2399       if (i != 0)
2400         {
2401           *ptr++ = ' ';
2402           line_len++;
2403
2404           if (add_nl_p && line_len + len2[0] + len2[1] > 70)
2405             {
2406               *ptr++ = '\\';
2407               *ptr++ = '\n';
2408               line_len = 0;
2409             }
2410         }
2411
2412       for (j = 0; j < 2; j++)
2413         if (opts[i][j])
2414           {
2415             memcpy (ptr, opts[i][j], len2[j]);
2416             ptr += len2[j];
2417             line_len += len2[j];
2418           }
2419     }
2420
2421   *ptr = '\0';
2422   gcc_assert (ret + len >= ptr);
2423
2424   return ret;
2425 }
2426
2427 /* Function that is callable from the debugger to print the current
2428    options.  */
2429 void
2430 ix86_debug_options (void)
2431 {
2432   char *opts = ix86_target_string (ix86_isa_flags, target_flags,
2433                                    ix86_arch_string, ix86_tune_string,
2434                                    ix86_fpmath_string, true);
2435
2436   if (opts)
2437     {
2438       fprintf (stderr, "%s\n\n", opts);
2439       free (opts);
2440     }
2441   else
2442     fprintf (stderr, "<no options>\n\n");
2443
2444   return;
2445 }
2446 \f
2447 /* Sometimes certain combinations of command options do not make
2448    sense on a particular target machine.  You can define a macro
2449    `OVERRIDE_OPTIONS' to take account of this.  This macro, if
2450    defined, is executed once just after all the command options have
2451    been parsed.
2452
2453    Don't use this macro to turn on various extra optimizations for
2454    `-O'.  That is what `OPTIMIZATION_OPTIONS' is for.  */
2455
2456 void
2457 override_options (bool main_args_p)
2458 {
2459   int i;
2460   unsigned int ix86_arch_mask, ix86_tune_mask;
2461   const char *prefix;
2462   const char *suffix;
2463   const char *sw;
2464
2465   /* Comes from final.c -- no real reason to change it.  */
2466 #define MAX_CODE_ALIGN 16
2467
2468   enum pta_flags
2469     {
2470       PTA_SSE = 1 << 0,
2471       PTA_SSE2 = 1 << 1,
2472       PTA_SSE3 = 1 << 2,
2473       PTA_MMX = 1 << 3,
2474       PTA_PREFETCH_SSE = 1 << 4,
2475       PTA_3DNOW = 1 << 5,
2476       PTA_3DNOW_A = 1 << 6,
2477       PTA_64BIT = 1 << 7,
2478       PTA_SSSE3 = 1 << 8,
2479       PTA_CX16 = 1 << 9,
2480       PTA_POPCNT = 1 << 10,
2481       PTA_ABM = 1 << 11,
2482       PTA_SSE4A = 1 << 12,
2483       PTA_NO_SAHF = 1 << 13,
2484       PTA_SSE4_1 = 1 << 14,
2485       PTA_SSE4_2 = 1 << 15,
2486       PTA_SSE5 = 1 << 16,
2487       PTA_AES = 1 << 17,
2488       PTA_PCLMUL = 1 << 18,
2489       PTA_AVX = 1 << 19,
2490       PTA_FMA = 1 << 20 
2491     };
2492
2493   static struct pta
2494     {
2495       const char *const name;           /* processor name or nickname.  */
2496       const enum processor_type processor;
2497       const enum attr_cpu schedule;
2498       const unsigned /*enum pta_flags*/ flags;
2499     }
2500   const processor_alias_table[] =
2501     {
2502       {"i386", PROCESSOR_I386, CPU_NONE, 0},
2503       {"i486", PROCESSOR_I486, CPU_NONE, 0},
2504       {"i586", PROCESSOR_PENTIUM, CPU_PENTIUM, 0},
2505       {"pentium", PROCESSOR_PENTIUM, CPU_PENTIUM, 0},
2506       {"pentium-mmx", PROCESSOR_PENTIUM, CPU_PENTIUM, PTA_MMX},
2507       {"winchip-c6", PROCESSOR_I486, CPU_NONE, PTA_MMX},
2508       {"winchip2", PROCESSOR_I486, CPU_NONE, PTA_MMX | PTA_3DNOW},
2509       {"c3", PROCESSOR_I486, CPU_NONE, PTA_MMX | PTA_3DNOW},
2510       {"c3-2", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO, PTA_MMX | PTA_SSE},
2511       {"i686", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO, 0},
2512       {"pentiumpro", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO, 0},
2513       {"pentium2", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO, PTA_MMX},
2514       {"pentium3", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO,
2515         PTA_MMX | PTA_SSE},
2516       {"pentium3m", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO,
2517         PTA_MMX | PTA_SSE},
2518       {"pentium-m", PROCESSOR_PENTIUMPRO, CPU_PENTIUMPRO,
2519         PTA_MMX | PTA_SSE | PTA_SSE2},
2520       {"pentium4", PROCESSOR_PENTIUM4, CPU_NONE,
2521         PTA_MMX |PTA_SSE | PTA_SSE2},
2522       {"pentium4m", PROCESSOR_PENTIUM4, CPU_NONE,
2523         PTA_MMX | PTA_SSE | PTA_SSE2},
2524       {"prescott", PROCESSOR_NOCONA, CPU_NONE,
2525         PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3},
2526       {"nocona", PROCESSOR_NOCONA, CPU_NONE,
2527         PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
2528         | PTA_CX16 | PTA_NO_SAHF},
2529       {"core2", PROCESSOR_CORE2, CPU_CORE2,
2530         PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
2531         | PTA_SSSE3 | PTA_CX16},
2532       {"geode", PROCESSOR_GEODE, CPU_GEODE,
2533         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A |PTA_PREFETCH_SSE},
2534       {"k6", PROCESSOR_K6, CPU_K6, PTA_MMX},
2535       {"k6-2", PROCESSOR_K6, CPU_K6, PTA_MMX | PTA_3DNOW},
2536       {"k6-3", PROCESSOR_K6, CPU_K6, PTA_MMX | PTA_3DNOW},
2537       {"athlon", PROCESSOR_ATHLON, CPU_ATHLON,
2538         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_PREFETCH_SSE},
2539       {"athlon-tbird", PROCESSOR_ATHLON, CPU_ATHLON,
2540         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_PREFETCH_SSE},
2541       {"athlon-4", PROCESSOR_ATHLON, CPU_ATHLON,
2542         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE},
2543       {"athlon-xp", PROCESSOR_ATHLON, CPU_ATHLON,
2544         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE},
2545       {"athlon-mp", PROCESSOR_ATHLON, CPU_ATHLON,
2546         PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE},
2547       {"x86-64", PROCESSOR_K8, CPU_K8,
2548         PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_NO_SAHF},
2549       {"k8", PROCESSOR_K8, CPU_K8,
2550         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2551         | PTA_SSE2 | PTA_NO_SAHF},
2552       {"k8-sse3", PROCESSOR_K8, CPU_K8,
2553         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2554         | PTA_SSE2 | PTA_SSE3 | PTA_NO_SAHF},
2555       {"opteron", PROCESSOR_K8, CPU_K8,
2556         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2557         | PTA_SSE2 | PTA_NO_SAHF},
2558       {"opteron-sse3", PROCESSOR_K8, CPU_K8,
2559         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2560         | PTA_SSE2 | PTA_SSE3 | PTA_NO_SAHF},
2561       {"athlon64", PROCESSOR_K8, CPU_K8,
2562         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2563         | PTA_SSE2 | PTA_NO_SAHF},
2564       {"athlon64-sse3", PROCESSOR_K8, CPU_K8,
2565         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2566         | PTA_SSE2 | PTA_SSE3 | PTA_NO_SAHF},
2567       {"athlon-fx", PROCESSOR_K8, CPU_K8,
2568         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2569         | PTA_SSE2 | PTA_NO_SAHF},
2570       {"amdfam10", PROCESSOR_AMDFAM10, CPU_AMDFAM10,
2571         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2572         | PTA_SSE2 | PTA_SSE3 | PTA_SSE4A | PTA_CX16 | PTA_ABM},
2573       {"barcelona", PROCESSOR_AMDFAM10, CPU_AMDFAM10,
2574         PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
2575         | PTA_SSE2 | PTA_SSE3 | PTA_SSE4A | PTA_CX16 | PTA_ABM},
2576       {"generic32", PROCESSOR_GENERIC32, CPU_PENTIUMPRO,
2577         0 /* flags are only used for -march switch.  */ },
2578       {"generic64", PROCESSOR_GENERIC64, CPU_GENERIC64,
2579         PTA_64BIT /* flags are only used for -march switch.  */ },
2580     };
2581
2582   int const pta_size = ARRAY_SIZE (processor_alias_table);
2583
2584   /* Set up prefix/suffix so the error messages refer to either the command
2585      line argument, or the attribute(target).  */
2586   if (main_args_p)
2587     {
2588       prefix = "-m";
2589       suffix = "";
2590       sw = "switch";
2591     }
2592   else
2593     {
2594       prefix = "option(\"";
2595       suffix = "\")";
2596       sw = "attribute";
2597     }
2598
2599 #ifdef SUBTARGET_OVERRIDE_OPTIONS
2600   SUBTARGET_OVERRIDE_OPTIONS;
2601 #endif
2602
2603 #ifdef SUBSUBTARGET_OVERRIDE_OPTIONS
2604   SUBSUBTARGET_OVERRIDE_OPTIONS;
2605 #endif
2606
2607   /* -fPIC is the default for x86_64.  */
2608   if (TARGET_MACHO && TARGET_64BIT)
2609     flag_pic = 2;
2610
2611   /* Set the default values for switches whose default depends on TARGET_64BIT
2612      in case they weren't overwritten by command line options.  */
2613   if (TARGET_64BIT)
2614     {
2615       /* Mach-O doesn't support omitting the frame pointer for now.  */
2616       if (flag_omit_frame_pointer == 2)
2617         flag_omit_frame_pointer = (TARGET_MACHO ? 0 : 1);
2618       if (flag_asynchronous_unwind_tables == 2)
2619         flag_asynchronous_unwind_tables = 1;
2620       if (flag_pcc_struct_return == 2)
2621         flag_pcc_struct_return = 0;
2622     }
2623   else
2624     {
2625       if (flag_omit_frame_pointer == 2)
2626         flag_omit_frame_pointer = 0;
2627       if (flag_asynchronous_unwind_tables == 2)
2628         flag_asynchronous_unwind_tables = 0;
2629       if (flag_pcc_struct_return == 2)
2630         flag_pcc_struct_return = DEFAULT_PCC_STRUCT_RETURN;
2631     }
2632
2633   /* Need to check -mtune=generic first.  */
2634   if (ix86_tune_string)
2635     {
2636       if (!strcmp (ix86_tune_string, "generic")
2637           || !strcmp (ix86_tune_string, "i686")
2638           /* As special support for cross compilers we read -mtune=native
2639              as -mtune=generic.  With native compilers we won't see the
2640              -mtune=native, as it was changed by the driver.  */
2641           || !strcmp (ix86_tune_string, "native"))
2642         {
2643           if (TARGET_64BIT)
2644             ix86_tune_string = "generic64";
2645           else
2646             ix86_tune_string = "generic32";
2647         }
2648       /* If this call is for setting the option attribute, allow the
2649          generic32/generic64 that was previously set.  */
2650       else if (!main_args_p
2651                && (!strcmp (ix86_tune_string, "generic32")
2652                    || !strcmp (ix86_tune_string, "generic64")))
2653         ;
2654       else if (!strncmp (ix86_tune_string, "generic", 7))
2655         error ("bad value (%s) for %stune=%s %s",
2656                ix86_tune_string, prefix, suffix, sw);
2657     }
2658   else
2659     {
2660       if (ix86_arch_string)
2661         ix86_tune_string = ix86_arch_string;
2662       if (!ix86_tune_string)
2663         {
2664           ix86_tune_string = cpu_names[TARGET_CPU_DEFAULT];
2665           ix86_tune_defaulted = 1;
2666         }
2667
2668       /* ix86_tune_string is set to ix86_arch_string or defaulted.  We
2669          need to use a sensible tune option.  */
2670       if (!strcmp (ix86_tune_string, "generic")
2671           || !strcmp (ix86_tune_string, "x86-64")
2672           || !strcmp (ix86_tune_string, "i686"))
2673         {
2674           if (TARGET_64BIT)
2675             ix86_tune_string = "generic64";
2676           else
2677             ix86_tune_string = "generic32";
2678         }
2679     }
2680   if (ix86_stringop_string)
2681     {
2682       if (!strcmp (ix86_stringop_string, "rep_byte"))
2683         stringop_alg = rep_prefix_1_byte;
2684       else if (!strcmp (ix86_stringop_string, "libcall"))
2685         stringop_alg = libcall;
2686       else if (!strcmp (ix86_stringop_string, "rep_4byte"))
2687         stringop_alg = rep_prefix_4_byte;
2688       else if (!strcmp (ix86_stringop_string, "rep_8byte")
2689                && TARGET_64BIT)
2690         /* rep; movq isn't available in 32-bit code.  */
2691         stringop_alg = rep_prefix_8_byte;
2692       else if (!strcmp (ix86_stringop_string, "byte_loop"))
2693         stringop_alg = loop_1_byte;
2694       else if (!strcmp (ix86_stringop_string, "loop"))
2695         stringop_alg = loop;
2696       else if (!strcmp (ix86_stringop_string, "unrolled_loop"))
2697         stringop_alg = unrolled_loop;
2698       else
2699         error ("bad value (%s) for %sstringop-strategy=%s %s",
2700                ix86_stringop_string, prefix, suffix, sw);
2701     }
2702   if (!strcmp (ix86_tune_string, "x86-64"))
2703     warning (OPT_Wdeprecated, "%stune=x86-64%s is deprecated.  Use "
2704              "%stune=k8%s or %stune=generic%s instead as appropriate.",
2705              prefix, suffix, prefix, suffix, prefix, suffix);
2706
2707   if (!ix86_arch_string)
2708     ix86_arch_string = TARGET_64BIT ? "x86-64" : "i386";
2709   else
2710     ix86_arch_specified = 1;
2711
2712   if (!strcmp (ix86_arch_string, "generic"))
2713     error ("generic CPU can be used only for %stune=%s %s",
2714            prefix, suffix, sw);
2715   if (!strncmp (ix86_arch_string, "generic", 7))
2716     error ("bad value (%s) for %sarch=%s %s",
2717            ix86_arch_string, prefix, suffix, sw);
2718
2719   if (ix86_cmodel_string != 0)
2720     {
2721       if (!strcmp (ix86_cmodel_string, "small"))
2722         ix86_cmodel = flag_pic ? CM_SMALL_PIC : CM_SMALL;
2723       else if (!strcmp (ix86_cmodel_string, "medium"))
2724         ix86_cmodel = flag_pic ? CM_MEDIUM_PIC : CM_MEDIUM;
2725       else if (!strcmp (ix86_cmodel_string, "large"))
2726         ix86_cmodel = flag_pic ? CM_LARGE_PIC : CM_LARGE;
2727       else if (flag_pic)
2728         error ("code model %s does not support PIC mode", ix86_cmodel_string);
2729       else if (!strcmp (ix86_cmodel_string, "32"))
2730         ix86_cmodel = CM_32;
2731       else if (!strcmp (ix86_cmodel_string, "kernel") && !flag_pic)
2732         ix86_cmodel = CM_KERNEL;
2733       else
2734         error ("bad value (%s) for %scmodel=%s %s",
2735                ix86_cmodel_string, prefix, suffix, sw);
2736     }
2737   else
2738     {
2739       /* For TARGET_64BIT and MS_ABI, force pic on, in order to enable the
2740          use of rip-relative addressing.  This eliminates fixups that
2741          would otherwise be needed if this object is to be placed in a
2742          DLL, and is essentially just as efficient as direct addressing.  */
2743       if (TARGET_64BIT && DEFAULT_ABI == MS_ABI)
2744         ix86_cmodel = CM_SMALL_PIC, flag_pic = 1;
2745       else if (TARGET_64BIT)
2746         ix86_cmodel = flag_pic ? CM_SMALL_PIC : CM_SMALL;
2747       else
2748         ix86_cmodel = CM_32;
2749     }
2750   if (ix86_asm_string != 0)
2751     {
2752       if (! TARGET_MACHO
2753           && !strcmp (ix86_asm_string, "intel"))
2754         ix86_asm_dialect = ASM_INTEL;
2755       else if (!strcmp (ix86_asm_string, "att"))
2756         ix86_asm_dialect = ASM_ATT;
2757       else
2758         error ("bad value (%s) for %sasm=%s %s",
2759                ix86_asm_string, prefix, suffix, sw);
2760     }
2761   if ((TARGET_64BIT == 0) != (ix86_cmodel == CM_32))
2762     error ("code model %qs not supported in the %s bit mode",
2763            ix86_cmodel_string, TARGET_64BIT ? "64" : "32");
2764   if ((TARGET_64BIT != 0) != ((ix86_isa_flags & OPTION_MASK_ISA_64BIT) != 0))
2765     sorry ("%i-bit mode not compiled in",
2766            (ix86_isa_flags & OPTION_MASK_ISA_64BIT) ? 64 : 32);
2767
2768   for (i = 0; i < pta_size; i++)
2769     if (! strcmp (ix86_arch_string, processor_alias_table[i].name))
2770       {
2771         ix86_schedule = processor_alias_table[i].schedule;
2772         ix86_arch = processor_alias_table[i].processor;
2773         /* Default cpu tuning to the architecture.  */
2774         ix86_tune = ix86_arch;
2775
2776         if (TARGET_64BIT && !(processor_alias_table[i].flags & PTA_64BIT))
2777           error ("CPU you selected does not support x86-64 "
2778                  "instruction set");
2779
2780         if (processor_alias_table[i].flags & PTA_MMX
2781             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_MMX))
2782           ix86_isa_flags |= OPTION_MASK_ISA_MMX;
2783         if (processor_alias_table[i].flags & PTA_3DNOW
2784             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_3DNOW))
2785           ix86_isa_flags |= OPTION_MASK_ISA_3DNOW;
2786         if (processor_alias_table[i].flags & PTA_3DNOW_A
2787             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_3DNOW_A))
2788           ix86_isa_flags |= OPTION_MASK_ISA_3DNOW_A;
2789         if (processor_alias_table[i].flags & PTA_SSE
2790             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE))
2791           ix86_isa_flags |= OPTION_MASK_ISA_SSE;
2792         if (processor_alias_table[i].flags & PTA_SSE2
2793             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE2))
2794           ix86_isa_flags |= OPTION_MASK_ISA_SSE2;
2795         if (processor_alias_table[i].flags & PTA_SSE3
2796             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE3))
2797           ix86_isa_flags |= OPTION_MASK_ISA_SSE3;
2798         if (processor_alias_table[i].flags & PTA_SSSE3
2799             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSSE3))
2800           ix86_isa_flags |= OPTION_MASK_ISA_SSSE3;
2801         if (processor_alias_table[i].flags & PTA_SSE4_1
2802             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE4_1))
2803           ix86_isa_flags |= OPTION_MASK_ISA_SSE4_1;
2804         if (processor_alias_table[i].flags & PTA_SSE4_2
2805             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE4_2))
2806           ix86_isa_flags |= OPTION_MASK_ISA_SSE4_2;
2807         if (processor_alias_table[i].flags & PTA_AVX
2808             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_AVX))
2809           ix86_isa_flags |= OPTION_MASK_ISA_AVX;
2810         if (processor_alias_table[i].flags & PTA_FMA
2811             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_FMA))
2812           ix86_isa_flags |= OPTION_MASK_ISA_FMA;
2813         if (processor_alias_table[i].flags & PTA_SSE4A
2814             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE4A))
2815           ix86_isa_flags |= OPTION_MASK_ISA_SSE4A;
2816         if (processor_alias_table[i].flags & PTA_SSE5
2817             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SSE5))
2818           ix86_isa_flags |= OPTION_MASK_ISA_SSE5;
2819         if (processor_alias_table[i].flags & PTA_ABM
2820             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_ABM))
2821           ix86_isa_flags |= OPTION_MASK_ISA_ABM;
2822         if (processor_alias_table[i].flags & PTA_CX16
2823             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_CX16))
2824           ix86_isa_flags |= OPTION_MASK_ISA_CX16;
2825         if (processor_alias_table[i].flags & (PTA_POPCNT | PTA_ABM)
2826             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_POPCNT))
2827           ix86_isa_flags |= OPTION_MASK_ISA_POPCNT;
2828         if (!(TARGET_64BIT && (processor_alias_table[i].flags & PTA_NO_SAHF))
2829             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_SAHF))
2830           ix86_isa_flags |= OPTION_MASK_ISA_SAHF;
2831         if (processor_alias_table[i].flags & PTA_AES
2832             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_AES))
2833           ix86_isa_flags |= OPTION_MASK_ISA_AES;
2834         if (processor_alias_table[i].flags & PTA_PCLMUL
2835             && !(ix86_isa_flags_explicit & OPTION_MASK_ISA_PCLMUL))
2836           ix86_isa_flags |= OPTION_MASK_ISA_PCLMUL;
2837         if (processor_alias_table[i].flags & (PTA_PREFETCH_SSE | PTA_SSE))
2838           x86_prefetch_sse = true;
2839
2840         break;
2841       }
2842
2843   if (i == pta_size)
2844     error ("bad value (%s) for %sarch=%s %s",
2845            ix86_arch_string, prefix, suffix, sw);
2846
2847   ix86_arch_mask = 1u << ix86_arch;
2848   for (i = 0; i < X86_ARCH_LAST; ++i)
2849     ix86_arch_features[i] = !!(initial_ix86_arch_features[i] & ix86_arch_mask);
2850
2851   for (i = 0; i < pta_size; i++)
2852     if (! strcmp (ix86_tune_string, processor_alias_table[i].name))
2853       {
2854         ix86_schedule = processor_alias_table[i].schedule;
2855         ix86_tune = processor_alias_table[i].processor;
2856         if (TARGET_64BIT && !(processor_alias_table[i].flags & PTA_64BIT))
2857           {
2858             if (ix86_tune_defaulted)
2859               {
2860                 ix86_tune_string = "x86-64";
2861                 for (i = 0; i < pta_size; i++)
2862                   if (! strcmp (ix86_tune_string,
2863                                 processor_alias_table[i].name))
2864                     break;
2865                 ix86_schedule = processor_alias_table[i].schedule;
2866                 ix86_tune = processor_alias_table[i].processor;
2867               }
2868             else
2869               error ("CPU you selected does not support x86-64 "
2870                      "instruction set");
2871           }
2872         /* Intel CPUs have always interpreted SSE prefetch instructions as
2873            NOPs; so, we can enable SSE prefetch instructions even when
2874            -mtune (rather than -march) points us to a processor that has them.
2875            However, the VIA C3 gives a SIGILL, so we only do that for i686 and
2876            higher processors.  */
2877         if (TARGET_CMOVE
2878             && (processor_alias_table[i].flags & (PTA_PREFETCH_SSE | PTA_SSE)))
2879           x86_prefetch_sse = true;
2880         break;
2881       }
2882   if (i == pta_size)
2883     error ("bad value (%s) for %stune=%s %s",
2884            ix86_tune_string, prefix, suffix, sw);
2885
2886   ix86_tune_mask = 1u << ix86_tune;
2887   for (i = 0; i < X86_TUNE_LAST; ++i)
2888     ix86_tune_features[i] = !!(initial_ix86_tune_features[i] & ix86_tune_mask);
2889
2890   if (optimize_size)
2891     ix86_cost = &ix86_size_cost;
2892   else
2893     ix86_cost = processor_target_table[ix86_tune].cost;
2894
2895   /* Arrange to set up i386_stack_locals for all functions.  */
2896   init_machine_status = ix86_init_machine_status;
2897
2898   /* Validate -mregparm= value.  */
2899   if (ix86_regparm_string)
2900     {
2901       if (TARGET_64BIT)
2902         warning (0, "%sregparm%s is ignored in 64-bit mode", prefix, suffix);
2903       i = atoi (ix86_regparm_string);
2904       if (i < 0 || i > REGPARM_MAX)
2905         error ("%sregparm=%d%s is not between 0 and %d",
2906                prefix, i, suffix, REGPARM_MAX);
2907       else
2908         ix86_regparm = i;
2909     }
2910   if (TARGET_64BIT)
2911     ix86_regparm = REGPARM_MAX;
2912
2913   /* If the user has provided any of the -malign-* options,
2914      warn and use that value only if -falign-* is not set.
2915      Remove this code in GCC 3.2 or later.  */
2916   if (ix86_align_loops_string)
2917     {
2918       warning (0, "%salign-loops%s is obsolete, use -falign-loops%s",
2919                prefix, suffix, suffix);
2920       if (align_loops == 0)
2921         {
2922           i = atoi (ix86_align_loops_string);
2923           if (i < 0 || i > MAX_CODE_ALIGN)
2924             error ("%salign-loops=%d%s is not between 0 and %d",
2925                    prefix, i, suffix, MAX_CODE_ALIGN);
2926           else
2927             align_loops = 1 << i;
2928         }
2929     }
2930
2931   if (ix86_align_jumps_string)
2932     {
2933       warning (0, "%salign-jumps%s is obsolete, use -falign-jumps%s",
2934                prefix, suffix, suffix);
2935       if (align_jumps == 0)
2936         {
2937           i = atoi (ix86_align_jumps_string);
2938           if (i < 0 || i > MAX_CODE_ALIGN)
2939             error ("%salign-loops=%d%s is not between 0 and %d",
2940                    prefix, i, suffix, MAX_CODE_ALIGN);
2941           else
2942             align_jumps = 1 << i;
2943         }
2944     }
2945
2946   if (ix86_align_funcs_string)
2947     {
2948       warning (0, "%salign-functions%s is obsolete, use -falign-functions%s",
2949                prefix, suffix, suffix);
2950       if (align_functions == 0)
2951         {
2952           i = atoi (ix86_align_funcs_string);
2953           if (i < 0 || i > MAX_CODE_ALIGN)
2954             error ("%salign-loops=%d%s is not between 0 and %d",
2955                    prefix, i, suffix, MAX_CODE_ALIGN);
2956           else
2957             align_functions = 1 << i;
2958         }
2959     }
2960
2961   /* Default align_* from the processor table.  */
2962   if (align_loops == 0)
2963     {
2964       align_loops = processor_target_table[ix86_tune].align_loop;
2965       align_loops_max_skip = processor_target_table[ix86_tune].align_loop_max_skip;
2966     }
2967   if (align_jumps == 0)
2968     {
2969       align_jumps = processor_target_table[ix86_tune].align_jump;
2970       align_jumps_max_skip = processor_target_table[ix86_tune].align_jump_max_skip;
2971     }
2972   if (align_functions == 0)
2973     {
2974       align_functions = processor_target_table[ix86_tune].align_func;
2975     }
2976
2977   /* Validate -mbranch-cost= value, or provide default.  */
2978   ix86_branch_cost = ix86_cost->branch_cost;
2979   if (ix86_branch_cost_string)
2980     {
2981       i = atoi (ix86_branch_cost_string);
2982       if (i < 0 || i > 5)
2983         error ("%sbranch-cost=%d%s is not between 0 and 5", prefix, i, suffix);
2984       else
2985         ix86_branch_cost = i;
2986     }
2987   if (ix86_section_threshold_string)
2988     {
2989       i = atoi (ix86_section_threshold_string);
2990       if (i < 0)
2991         error ("%slarge-data-threshold=%d%s is negative", prefix, i, suffix);
2992       else
2993         ix86_section_threshold = i;
2994     }
2995
2996   if (ix86_tls_dialect_string)
2997     {
2998       if (strcmp (ix86_tls_dialect_string, "gnu") == 0)
2999         ix86_tls_dialect = TLS_DIALECT_GNU;
3000       else if (strcmp (ix86_tls_dialect_string, "gnu2") == 0)
3001         ix86_tls_dialect = TLS_DIALECT_GNU2;
3002       else if (strcmp (ix86_tls_dialect_string, "sun") == 0)
3003         ix86_tls_dialect = TLS_DIALECT_SUN;
3004       else
3005         error ("bad value (%s) for %stls-dialect=%s %s",
3006                ix86_tls_dialect_string, prefix, suffix, sw);
3007     }
3008
3009   if (ix87_precision_string)
3010     {
3011       i = atoi (ix87_precision_string);
3012       if (i != 32 && i != 64 && i != 80)
3013         error ("pc%d is not valid precision setting (32, 64 or 80)", i);
3014     }
3015
3016   if (TARGET_64BIT)
3017     {
3018       target_flags |= TARGET_SUBTARGET64_DEFAULT & ~target_flags_explicit;
3019
3020       /* Enable by default the SSE and MMX builtins.  Do allow the user to
3021          explicitly disable any of these.  In particular, disabling SSE and
3022          MMX for kernel code is extremely useful.  */
3023       if (!ix86_arch_specified)
3024       ix86_isa_flags
3025         |= ((OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_MMX
3026              | TARGET_SUBTARGET64_ISA_DEFAULT) & ~ix86_isa_flags_explicit);
3027
3028       if (TARGET_RTD)
3029         warning (0, "%srtd%s is ignored in 64bit mode", prefix, suffix);
3030     }
3031   else
3032     {
3033       target_flags |= TARGET_SUBTARGET32_DEFAULT & ~target_flags_explicit;
3034
3035       if (!ix86_arch_specified)
3036       ix86_isa_flags
3037         |= TARGET_SUBTARGET32_ISA_DEFAULT & ~ix86_isa_flags_explicit;
3038
3039       /* i386 ABI does not specify red zone.  It still makes sense to use it
3040          when programmer takes care to stack from being destroyed.  */
3041       if (!(target_flags_explicit & MASK_NO_RED_ZONE))
3042         target_flags |= MASK_NO_RED_ZONE;
3043     }
3044
3045   /* Keep nonleaf frame pointers.  */
3046   if (flag_omit_frame_pointer)
3047     target_flags &= ~MASK_OMIT_LEAF_FRAME_POINTER;
3048   else if (TARGET_OMIT_LEAF_FRAME_POINTER)
3049     flag_omit_frame_pointer = 1;
3050
3051   /* If we're doing fast math, we don't care about comparison order
3052      wrt NaNs.  This lets us use a shorter comparison sequence.  */
3053   if (flag_finite_math_only)
3054     target_flags &= ~MASK_IEEE_FP;
3055
3056   /* If the architecture always has an FPU, turn off NO_FANCY_MATH_387,
3057      since the insns won't need emulation.  */
3058   if (x86_arch_always_fancy_math_387 & ix86_arch_mask)
3059     target_flags &= ~MASK_NO_FANCY_MATH_387;
3060
3061   /* Likewise, if the target doesn't have a 387, or we've specified
3062      software floating point, don't use 387 inline intrinsics.  */
3063   if (!TARGET_80387)
3064     target_flags |= MASK_NO_FANCY_MATH_387;
3065
3066   /* Turn on MMX builtins for -msse.  */
3067   if (TARGET_SSE)
3068     {
3069       ix86_isa_flags |= OPTION_MASK_ISA_MMX & ~ix86_isa_flags_explicit;
3070       x86_prefetch_sse = true;
3071     }
3072
3073   /* Turn on popcnt instruction for -msse4.2 or -mabm.  */
3074   if (TARGET_SSE4_2 || TARGET_ABM)
3075     ix86_isa_flags |= OPTION_MASK_ISA_POPCNT & ~ix86_isa_flags_explicit;
3076
3077   /* Validate -mpreferred-stack-boundary= value or default it to
3078      PREFERRED_STACK_BOUNDARY_DEFAULT.  */
3079   ix86_preferred_stack_boundary = PREFERRED_STACK_BOUNDARY_DEFAULT;
3080   if (ix86_preferred_stack_boundary_string)
3081     {
3082       i = atoi (ix86_preferred_stack_boundary_string);
3083       if (i < (TARGET_64BIT ? 4 : 2) || i > 12)
3084         error ("%spreferred-stack-boundary=%d%s is not between %d and 12",
3085                prefix, i, suffix, TARGET_64BIT ? 4 : 2);
3086       else
3087         ix86_preferred_stack_boundary = (1 << i) * BITS_PER_UNIT;
3088     }
3089
3090   /* Set the default value for -mstackrealign.  */
3091   if (ix86_force_align_arg_pointer == -1)
3092     ix86_force_align_arg_pointer = STACK_REALIGN_DEFAULT;
3093
3094   /* Validate -mincoming-stack-boundary= value or default it to
3095      MIN_STACK_BOUNDARY/PREFERRED_STACK_BOUNDARY.  */
3096   if (ix86_force_align_arg_pointer)
3097     ix86_default_incoming_stack_boundary = MIN_STACK_BOUNDARY;
3098   else
3099     ix86_default_incoming_stack_boundary = PREFERRED_STACK_BOUNDARY;
3100   ix86_incoming_stack_boundary = ix86_default_incoming_stack_boundary;
3101   if (ix86_incoming_stack_boundary_string)
3102     {
3103       i = atoi (ix86_incoming_stack_boundary_string);
3104       if (i < (TARGET_64BIT ? 4 : 2) || i > 12)
3105         error ("-mincoming-stack-boundary=%d is not between %d and 12",
3106                i, TARGET_64BIT ? 4 : 2);
3107       else
3108         {
3109           ix86_user_incoming_stack_boundary = (1 << i) * BITS_PER_UNIT;
3110           ix86_incoming_stack_boundary
3111             = ix86_user_incoming_stack_boundary;
3112         }
3113     }
3114
3115   /* Accept -msseregparm only if at least SSE support is enabled.  */
3116   if (TARGET_SSEREGPARM
3117       && ! TARGET_SSE)
3118     error ("%ssseregparm%s used without SSE enabled", prefix, suffix);
3119
3120   ix86_fpmath = TARGET_FPMATH_DEFAULT;
3121   if (ix86_fpmath_string != 0)
3122     {
3123       if (! strcmp (ix86_fpmath_string, "387"))
3124         ix86_fpmath = FPMATH_387;
3125       else if (! strcmp (ix86_fpmath_string, "sse"))
3126         {
3127           if (!TARGET_SSE)
3128             {
3129               warning (0, "SSE instruction set disabled, using 387 arithmetics");
3130               ix86_fpmath = FPMATH_387;
3131             }
3132           else
3133             ix86_fpmath = FPMATH_SSE;
3134         }
3135       else if (! strcmp (ix86_fpmath_string, "387,sse")
3136                || ! strcmp (ix86_fpmath_string, "387+sse")
3137                || ! strcmp (ix86_fpmath_string, "sse,387")
3138                || ! strcmp (ix86_fpmath_string, "sse+387")
3139                || ! strcmp (ix86_fpmath_string, "both"))
3140         {
3141           if (!TARGET_SSE)
3142             {
3143               warning (0, "SSE instruction set disabled, using 387 arithmetics");
3144               ix86_fpmath = FPMATH_387;
3145             }
3146           else if (!TARGET_80387)
3147             {
3148               warning (0, "387 instruction set disabled, using SSE arithmetics");
3149               ix86_fpmath = FPMATH_SSE;
3150             }
3151           else
3152             ix86_fpmath = (enum fpmath_unit) (FPMATH_SSE | FPMATH_387);
3153         }
3154       else
3155         error ("bad value (%s) for %sfpmath=%s %s",
3156                ix86_fpmath_string, prefix, suffix, sw);
3157     }
3158
3159   /* If the i387 is disabled, then do not return values in it. */
3160   if (!TARGET_80387)
3161     target_flags &= ~MASK_FLOAT_RETURNS;
3162
3163   /* Use external vectorized library in vectorizing intrinsics.  */
3164   if (ix86_veclibabi_string)
3165     {
3166       if (strcmp (ix86_veclibabi_string, "svml") == 0)
3167         ix86_veclib_handler = ix86_veclibabi_svml;
3168       else if (strcmp (ix86_veclibabi_string, "acml") == 0)
3169         ix86_veclib_handler = ix86_veclibabi_acml;
3170       else
3171         error ("unknown vectorization library ABI type (%s) for "
3172                "%sveclibabi=%s %s", ix86_veclibabi_string,
3173                prefix, suffix, sw);
3174     }
3175
3176   if ((x86_accumulate_outgoing_args & ix86_tune_mask)
3177       && !(target_flags_explicit & MASK_ACCUMULATE_OUTGOING_ARGS)
3178       && !optimize_size)
3179     target_flags |= MASK_ACCUMULATE_OUTGOING_ARGS;
3180
3181   /* ??? Unwind info is not correct around the CFG unless either a frame
3182      pointer is present or M_A_O_A is set.  Fixing this requires rewriting
3183      unwind info generation to be aware of the CFG and propagating states
3184      around edges.  */
3185   if ((flag_unwind_tables || flag_asynchronous_unwind_tables
3186        || flag_exceptions || flag_non_call_exceptions)
3187       && flag_omit_frame_pointer
3188       && !(target_flags & MASK_ACCUMULATE_OUTGOING_ARGS))
3189     {
3190       if (target_flags_explicit & MASK_ACCUMULATE_OUTGOING_ARGS)
3191         warning (0, "unwind tables currently require either a frame pointer "
3192                  "or %saccumulate-outgoing-args%s for correctness",
3193                  prefix, suffix);
3194       target_flags |= MASK_ACCUMULATE_OUTGOING_ARGS;
3195     }
3196
3197   /* If stack probes are required, the space used for large function
3198      arguments on the stack must also be probed, so enable
3199      -maccumulate-outgoing-args so this happens in the prologue.  */
3200   if (TARGET_STACK_PROBE
3201       && !(target_flags & MASK_ACCUMULATE_OUTGOING_ARGS))
3202     {
3203       if (target_flags_explicit & MASK_ACCUMULATE_OUTGOING_ARGS)
3204         warning (0, "stack probing requires %saccumulate-outgoing-args%s "
3205                  "for correctness", prefix, suffix);
3206       target_flags |= MASK_ACCUMULATE_OUTGOING_ARGS;
3207     }
3208
3209   /* For sane SSE instruction set generation we need fcomi instruction.
3210      It is safe to enable all CMOVE instructions.  */
3211   if (TARGET_SSE)
3212     TARGET_CMOVE = 1;
3213
3214   /* Figure out what ASM_GENERATE_INTERNAL_LABEL builds as a prefix.  */
3215   {
3216     char *p;
3217     ASM_GENERATE_INTERNAL_LABEL (internal_label_prefix, "LX", 0);
3218     p = strchr (internal_label_prefix, 'X');
3219     internal_label_prefix_len = p - internal_label_prefix;
3220     *p = '\0';
3221   }
3222
3223   /* When scheduling description is not available, disable scheduler pass
3224      so it won't slow down the compilation and make x87 code slower.  */
3225   if (!TARGET_SCHEDULE)
3226     flag_schedule_insns_after_reload = flag_schedule_insns = 0;
3227
3228   if (!PARAM_SET_P (PARAM_SIMULTANEOUS_PREFETCHES))
3229     set_param_value ("simultaneous-prefetches",
3230                      ix86_cost->simultaneous_prefetches);
3231   if (!PARAM_SET_P (PARAM_L1_CACHE_LINE_SIZE))
3232     set_param_value ("l1-cache-line-size", ix86_cost->prefetch_block);
3233   if (!PARAM_SET_P (PARAM_L1_CACHE_SIZE))
3234     set_param_value ("l1-cache-size", ix86_cost->l1_cache_size);
3235   if (!PARAM_SET_P (PARAM_L2_CACHE_SIZE))
3236     set_param_value ("l2-cache-size", ix86_cost->l2_cache_size);
3237
3238   /* If using typedef char *va_list, signal that __builtin_va_start (&ap, 0)
3239      can be optimized to ap = __builtin_next_arg (0).  */
3240   if (!TARGET_64BIT)
3241     targetm.expand_builtin_va_start = NULL;
3242
3243   if (TARGET_64BIT)
3244     {
3245       ix86_gen_leave = gen_leave_rex64;
3246       ix86_gen_pop1 = gen_popdi1;
3247       ix86_gen_add3 = gen_adddi3;
3248       ix86_gen_sub3 = gen_subdi3;
3249       ix86_gen_sub3_carry = gen_subdi3_carry_rex64;
3250       ix86_gen_one_cmpl2 = gen_one_cmpldi2;
3251       ix86_gen_monitor = gen_sse3_monitor64;
3252       ix86_gen_andsp = gen_anddi3;
3253     }
3254   else
3255     {
3256       ix86_gen_leave = gen_leave;
3257       ix86_gen_pop1 = gen_popsi1;
3258       ix86_gen_add3 = gen_addsi3;
3259       ix86_gen_sub3 = gen_subsi3;
3260       ix86_gen_sub3_carry = gen_subsi3_carry;
3261       ix86_gen_one_cmpl2 = gen_one_cmplsi2;
3262       ix86_gen_monitor = gen_sse3_monitor;
3263       ix86_gen_andsp = gen_andsi3;
3264     }
3265
3266 #ifdef USE_IX86_CLD
3267   /* Use -mcld by default for 32-bit code if configured with --enable-cld.  */
3268   if (!TARGET_64BIT)
3269     target_flags |= MASK_CLD & ~target_flags_explicit;
3270 #endif
3271
3272   /* Save the initial options in case the user does function specific options */
3273   if (main_args_p)
3274     target_option_default_node = target_option_current_node
3275       = build_target_option_node ();
3276 }
3277 \f
3278 /* Save the current options */
3279
3280 static void
3281 ix86_function_specific_save (struct cl_target_option *ptr)
3282 {
3283   gcc_assert (IN_RANGE (ix86_arch, 0, 255));
3284   gcc_assert (IN_RANGE (ix86_schedule, 0, 255));
3285   gcc_assert (IN_RANGE (ix86_tune, 0, 255));
3286   gcc_assert (IN_RANGE (ix86_fpmath, 0, 255));
3287   gcc_assert (IN_RANGE (ix86_branch_cost, 0, 255));
3288
3289   ptr->arch = ix86_arch;
3290   ptr->schedule = ix86_schedule;
3291   ptr->tune = ix86_tune;
3292   ptr->fpmath = ix86_fpmath;
3293   ptr->branch_cost = ix86_branch_cost;
3294   ptr->tune_defaulted = ix86_tune_defaulted;
3295   ptr->arch_specified = ix86_arch_specified;
3296   ptr->ix86_isa_flags_explicit = ix86_isa_flags_explicit;
3297   ptr->target_flags_explicit = target_flags_explicit;
3298 }
3299
3300 /* Restore the current options */
3301
3302 static void
3303 ix86_function_specific_restore (struct cl_target_option *ptr)
3304 {
3305   enum processor_type old_tune = ix86_tune;
3306   enum processor_type old_arch = ix86_arch;
3307   unsigned int ix86_arch_mask, ix86_tune_mask;
3308   int i;
3309
3310   ix86_arch = ptr->arch;
3311   ix86_schedule = ptr->schedule;
3312   ix86_tune = ptr->tune;
3313   ix86_fpmath = ptr->fpmath;
3314   ix86_branch_cost = ptr->branch_cost;
3315   ix86_tune_defaulted = ptr->tune_defaulted;
3316   ix86_arch_specified = ptr->arch_specified;
3317   ix86_isa_flags_explicit = ptr->ix86_isa_flags_explicit;
3318   target_flags_explicit = ptr->target_flags_explicit;
3319
3320   /* Recreate the arch feature tests if the arch changed */
3321   if (old_arch != ix86_arch)
3322     {
3323       ix86_arch_mask = 1u << ix86_arch;
3324       for (i = 0; i < X86_ARCH_LAST; ++i)
3325         ix86_arch_features[i]
3326           = !!(initial_ix86_arch_features[i] & ix86_arch_mask);
3327     }
3328
3329   /* Recreate the tune optimization tests */
3330   if (old_tune != ix86_tune)
3331     {
3332       ix86_tune_mask = 1u << ix86_tune;
3333       for (i = 0; i < X86_TUNE_LAST; ++i)
3334         ix86_tune_features[i]
3335           = !!(initial_ix86_tune_features[i] & ix86_tune_mask);
3336     }
3337 }
3338
3339 /* Print the current options */
3340
3341 static void
3342 ix86_function_specific_print (FILE *file, int indent,
3343                               struct cl_target_option *ptr)
3344 {
3345   char *target_string
3346     = ix86_target_string (ptr->ix86_isa_flags, ptr->target_flags,
3347                           NULL, NULL, NULL, false);
3348
3349   fprintf (file, "%*sarch = %d (%s)\n",
3350            indent, "",
3351            ptr->arch,
3352            ((ptr->arch < TARGET_CPU_DEFAULT_max)
3353             ? cpu_names[ptr->arch]
3354             : "<unknown>"));
3355
3356   fprintf (file, "%*stune = %d (%s)\n",
3357            indent, "",
3358            ptr->tune,
3359            ((ptr->tune < TARGET_CPU_DEFAULT_max)
3360             ? cpu_names[ptr->tune]
3361             : "<unknown>"));
3362
3363   fprintf (file, "%*sfpmath = %d%s%s\n", indent, "", ptr->fpmath,
3364            (ptr->fpmath & FPMATH_387) ? ", 387" : "",
3365            (ptr->fpmath & FPMATH_SSE) ? ", sse" : "");
3366   fprintf (file, "%*sbranch_cost = %d\n", indent, "", ptr->branch_cost);
3367
3368   if (target_string)
3369     {
3370       fprintf (file, "%*s%s\n", indent, "", target_string);
3371       free (target_string);
3372     }
3373 }
3374
3375 \f
3376 /* Inner function to process the attribute((target(...))), take an argument and
3377    set the current options from the argument. If we have a list, recursively go
3378    over the list.  */
3379
3380 static bool
3381 ix86_valid_target_attribute_inner_p (tree args, char *p_strings[])
3382 {
3383   char *next_optstr;
3384   bool ret = true;
3385
3386 #define IX86_ATTR_ISA(S,O)   { S, sizeof (S)-1, ix86_opt_isa, O, 0 }
3387 #define IX86_ATTR_STR(S,O)   { S, sizeof (S)-1, ix86_opt_str, O, 0 }
3388 #define IX86_ATTR_YES(S,O,M) { S, sizeof (S)-1, ix86_opt_yes, O, M }
3389 #define IX86_ATTR_NO(S,O,M)  { S, sizeof (S)-1, ix86_opt_no,  O, M }
3390
3391   enum ix86_opt_type
3392   {
3393     ix86_opt_unknown,
3394     ix86_opt_yes,
3395     ix86_opt_no,
3396     ix86_opt_str,
3397     ix86_opt_isa
3398   };
3399
3400   static const struct
3401   {
3402     const char *string;
3403     size_t len;
3404     enum ix86_opt_type type;
3405     int opt;
3406     int mask;
3407   } attrs[] = {
3408     /* isa options */
3409     IX86_ATTR_ISA ("3dnow",     OPT_m3dnow),
3410     IX86_ATTR_ISA ("abm",       OPT_mabm),
3411     IX86_ATTR_ISA ("aes",       OPT_maes),
3412     IX86_ATTR_ISA ("avx",       OPT_mavx),
3413     IX86_ATTR_ISA ("mmx",       OPT_mmmx),
3414     IX86_ATTR_ISA ("pclmul",    OPT_mpclmul),
3415     IX86_ATTR_ISA ("popcnt",    OPT_mpopcnt),
3416     IX86_ATTR_ISA ("sse",       OPT_msse),
3417     IX86_ATTR_ISA ("sse2",      OPT_msse2),
3418     IX86_ATTR_ISA ("sse3",      OPT_msse3),
3419     IX86_ATTR_ISA ("sse4",      OPT_msse4),
3420     IX86_ATTR_ISA ("sse4.1",    OPT_msse4_1),
3421     IX86_ATTR_ISA ("sse4.2",    OPT_msse4_2),
3422     IX86_ATTR_ISA ("sse4a",     OPT_msse4a),
3423     IX86_ATTR_ISA ("sse5",      OPT_msse5),
3424     IX86_ATTR_ISA ("ssse3",     OPT_mssse3),
3425
3426     /* string options */
3427     IX86_ATTR_STR ("arch=",     IX86_FUNCTION_SPECIFIC_ARCH),
3428     IX86_ATTR_STR ("fpmath=",   IX86_FUNCTION_SPECIFIC_FPMATH),
3429     IX86_ATTR_STR ("tune=",     IX86_FUNCTION_SPECIFIC_TUNE),
3430
3431     /* flag options */
3432     IX86_ATTR_YES ("cld",
3433                    OPT_mcld,
3434                    MASK_CLD),
3435
3436     IX86_ATTR_NO ("fancy-math-387",
3437                   OPT_mfancy_math_387,
3438                   MASK_NO_FANCY_MATH_387),
3439
3440     IX86_ATTR_NO ("fused-madd",
3441                   OPT_mfused_madd,
3442                   MASK_NO_FUSED_MADD),
3443
3444     IX86_ATTR_YES ("ieee-fp",
3445                    OPT_mieee_fp,
3446                    MASK_IEEE_FP),
3447
3448     IX86_ATTR_YES ("inline-all-stringops",
3449                    OPT_minline_all_stringops,
3450                    MASK_INLINE_ALL_STRINGOPS),
3451
3452     IX86_ATTR_YES ("inline-stringops-dynamically",
3453                    OPT_minline_stringops_dynamically,
3454                    MASK_INLINE_STRINGOPS_DYNAMICALLY),
3455
3456     IX86_ATTR_NO ("align-stringops",
3457                   OPT_mno_align_stringops,
3458                   MASK_NO_ALIGN_STRINGOPS),
3459
3460     IX86_ATTR_YES ("recip",
3461                    OPT_mrecip,
3462                    MASK_RECIP),
3463
3464   };
3465
3466   /* If this is a list, recurse to get the options.  */
3467   if (TREE_CODE (args) == TREE_LIST)
3468     {
3469       bool ret = true;
3470
3471       for (; args; args = TREE_CHAIN (args))
3472         if (TREE_VALUE (args)
3473             && !ix86_valid_target_attribute_inner_p (TREE_VALUE (args), p_strings))
3474           ret = false;
3475
3476       return ret;
3477     }
3478
3479   else if (TREE_CODE (args) != STRING_CST)
3480     gcc_unreachable ();
3481
3482   /* Handle multiple arguments separated by commas.  */
3483   next_optstr = ASTRDUP (TREE_STRING_POINTER (args));
3484
3485   while (next_optstr && *next_optstr != '\0')
3486     {
3487       char *p = next_optstr;
3488       char *orig_p = p;
3489       char *comma = strchr (next_optstr, ',');
3490       const char *opt_string;
3491       size_t len, opt_len;
3492       int opt;
3493       bool opt_set_p;
3494       char ch;
3495       unsigned i;
3496       enum ix86_opt_type type = ix86_opt_unknown;
3497       int mask = 0;
3498
3499       if (comma)
3500         {
3501           *comma = '\0';
3502           len = comma - next_optstr;
3503           next_optstr = comma + 1;
3504         }
3505       else
3506         {
3507           len = strlen (p);
3508           next_optstr = NULL;
3509         }
3510
3511       /* Recognize no-xxx.  */
3512       if (len > 3 && p[0] == 'n' && p[1] == 'o' && p[2] == '-')
3513         {
3514           opt_set_p = false;
3515           p += 3;
3516           len -= 3;
3517         }
3518       else
3519         opt_set_p = true;
3520
3521       /* Find the option.  */
3522       ch = *p;
3523       opt = N_OPTS;
3524       for (i = 0; i < ARRAY_SIZE (attrs); i++)
3525         {
3526           type = attrs[i].type;
3527           opt_len = attrs[i].len;
3528           if (ch == attrs[i].string[0]
3529               && ((type != ix86_opt_str) ? len == opt_len : len > opt_len)
3530               && memcmp (p, attrs[i].string, opt_len) == 0)
3531             {
3532               opt = attrs[i].opt;
3533               mask = attrs[i].mask;
3534               opt_string = attrs[i].string;
3535               break;
3536             }
3537         }
3538
3539       /* Process the option.  */
3540       if (opt == N_OPTS)
3541         {
3542           error ("attribute(target(\"%s\")) is unknown", orig_p);
3543           ret = false;
3544         }
3545
3546       else if (type == ix86_opt_isa)
3547         ix86_handle_option (opt, p, opt_set_p);
3548
3549       else if (type == ix86_opt_yes || type == ix86_opt_no)
3550         {
3551           if (type == ix86_opt_no)
3552             opt_set_p = !opt_set_p;
3553
3554           if (opt_set_p)
3555             target_flags |= mask;
3556           else
3557             target_flags &= ~mask;
3558         }
3559
3560       else if (type == ix86_opt_str)
3561         {
3562           if (p_strings[opt])
3563             {
3564               error ("option(\"%s\") was already specified", opt_string);
3565               ret = false;
3566             }
3567           else
3568             p_strings[opt] = xstrdup (p + opt_len);
3569         }
3570
3571       else
3572         gcc_unreachable ();
3573     }
3574
3575   return ret;
3576 }
3577
3578 /* Return a TARGET_OPTION_NODE tree of the target options listed or NULL.  */
3579
3580 tree
3581 ix86_valid_target_attribute_tree (tree args)
3582 {
3583   const char *orig_arch_string = ix86_arch_string;
3584   const char *orig_tune_string = ix86_tune_string;
3585   const char *orig_fpmath_string = ix86_fpmath_string;
3586   int orig_tune_defaulted = ix86_tune_defaulted;
3587   int orig_arch_specified = ix86_arch_specified;
3588   char *option_strings[IX86_FUNCTION_SPECIFIC_MAX] = { NULL, NULL, NULL };
3589   tree t = NULL_TREE;
3590   int i;
3591   struct cl_target_option *def
3592     = TREE_TARGET_OPTION (target_option_default_node);
3593
3594   /* Process each of the options on the chain.  */
3595   if (! ix86_valid_target_attribute_inner_p (args, option_strings))
3596     return NULL_TREE;
3597
3598   /* If the changed options are different from the default, rerun override_options,
3599      and then save the options away.  The string options are are attribute options,
3600      and will be undone when we copy the save structure.  */
3601   if (ix86_isa_flags != def->ix86_isa_flags
3602       || target_flags != def->target_flags
3603       || option_strings[IX86_FUNCTION_SPECIFIC_ARCH]
3604       || option_strings[IX86_FUNCTION_SPECIFIC_TUNE]
3605       || option_strings[IX86_FUNCTION_SPECIFIC_FPMATH])
3606     {
3607       /* If we are using the default tune= or arch=, undo the string assigned,
3608          and use the default.  */
3609       if (option_strings[IX86_FUNCTION_SPECIFIC_ARCH])
3610         ix86_arch_string = option_strings[IX86_FUNCTION_SPECIFIC_ARCH];
3611       else if (!orig_arch_specified)
3612         ix86_arch_string = NULL;
3613
3614       if (option_strings[IX86_FUNCTION_SPECIFIC_TUNE])
3615         ix86_tune_string = option_strings[IX86_FUNCTION_SPECIFIC_TUNE];
3616       else if (orig_tune_defaulted)
3617         ix86_tune_string = NULL;
3618
3619       /* If fpmath= is not set, and we now have sse2 on 32-bit, use it.  */
3620       if (option_strings[IX86_FUNCTION_SPECIFIC_FPMATH])
3621         ix86_fpmath_string = option_strings[IX86_FUNCTION_SPECIFIC_FPMATH];
3622       else if (!TARGET_64BIT && TARGET_SSE)
3623         ix86_fpmath_string = "sse,387";
3624
3625       /* Do any overrides, such as arch=xxx, or tune=xxx support.  */
3626       override_options (false);
3627
3628       /* Add any builtin functions with the new isa if any.  */
3629       ix86_add_new_builtins (ix86_isa_flags);
3630
3631       /* Save the current options unless we are validating options for
3632          #pragma.  */
3633       t = build_target_option_node ();
3634
3635       ix86_arch_string = orig_arch_string;
3636       ix86_tune_string = orig_tune_string;
3637       ix86_fpmath_string = orig_fpmath_string;
3638
3639       /* Free up memory allocated to hold the strings */
3640       for (i = 0; i < IX86_FUNCTION_SPECIFIC_MAX; i++)
3641         if (option_strings[i])
3642           free (option_strings[i]);
3643     }
3644
3645   return t;
3646 }
3647
3648 /* Hook to validate attribute((target("string"))).  */
3649
3650 static bool
3651 ix86_valid_target_attribute_p (tree fndecl,
3652                                tree ARG_UNUSED (name),
3653                                tree args,
3654                                int ARG_UNUSED (flags))
3655 {
3656   struct cl_target_option cur_target;
3657   bool ret = true;
3658   tree old_optimize = build_optimization_node ();
3659   tree new_target, new_optimize;
3660   tree func_optimize = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl);
3661
3662   /* If the function changed the optimization levels as well as setting target
3663      options, start with the optimizations specified.  */
3664   if (func_optimize && func_optimize != old_optimize)
3665     cl_optimization_restore (TREE_OPTIMIZATION (func_optimize));
3666
3667   /* The target attributes may also change some optimization flags, so update
3668      the optimization options if necessary.  */
3669   cl_target_option_save (&cur_target);
3670   new_target = ix86_valid_target_attribute_tree (args);
3671   new_optimize = build_optimization_node ();
3672
3673   if (!new_target)
3674     ret = false;
3675
3676   else if (fndecl)
3677     {
3678       DECL_FUNCTION_SPECIFIC_TARGET (fndecl) = new_target;
3679
3680       if (old_optimize != new_optimize)
3681         DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl) = new_optimize;
3682     }
3683
3684   cl_target_option_restore (&cur_target);
3685
3686   if (old_optimize != new_optimize)
3687     cl_optimization_restore (TREE_OPTIMIZATION (old_optimize));
3688
3689   return ret;
3690 }
3691
3692 \f
3693 /* Hook to determine if one function can safely inline another.  */
3694
3695 static bool
3696 ix86_can_inline_p (tree caller, tree callee)
3697 {
3698   bool ret = false;
3699   tree caller_tree = DECL_FUNCTION_SPECIFIC_TARGET (caller);
3700   tree callee_tree = DECL_FUNCTION_SPECIFIC_TARGET (callee);
3701
3702   /* If callee has no option attributes, then it is ok to inline.  */
3703   if (!callee_tree)
3704     ret = true;
3705
3706   /* If caller has no option attributes, but callee does then it is not ok to
3707      inline.  */
3708   else if (!caller_tree)
3709     ret = false;
3710
3711   else
3712     {
3713       struct cl_target_option *caller_opts = TREE_TARGET_OPTION (caller_tree);
3714       struct cl_target_option *callee_opts = TREE_TARGET_OPTION (callee_tree);
3715
3716       /* Callee's isa options should a subset of the caller's, i.e. a SSE5 function
3717          can inline a SSE2 function but a SSE2 function can't inline a SSE5
3718          function.  */
3719       if ((caller_opts->ix86_isa_flags & callee_opts->ix86_isa_flags)
3720           != callee_opts->ix86_isa_flags)
3721         ret = false;
3722
3723       /* See if we have the same non-isa options.  */
3724       else if (caller_opts->target_flags != callee_opts->target_flags)
3725         ret = false;
3726
3727       /* See if arch, tune, etc. are the same.  */
3728       else if (caller_opts->arch != callee_opts->arch)
3729         ret = false;
3730
3731       else if (caller_opts->tune != callee_opts->tune)
3732         ret = false;
3733
3734       else if (caller_opts->fpmath != callee_opts->fpmath)
3735         ret = false;
3736
3737       else if (caller_opts->branch_cost != callee_opts->branch_cost)
3738         ret = false;
3739
3740       else
3741         ret = true;
3742     }
3743
3744   return ret;
3745 }
3746
3747 \f
3748 /* Remember the last target of ix86_set_current_function.  */
3749 static GTY(()) tree ix86_previous_fndecl;
3750
3751 /* Establish appropriate back-end context for processing the function
3752    FNDECL.  The argument might be NULL to indicate processing at top
3753    level, outside of any function scope.  */
3754 static void
3755 ix86_set_current_function (tree fndecl)
3756 {
3757   /* Only change the context if the function changes.  This hook is called
3758      several times in the course of compiling a function, and we don't want to
3759      slow things down too much or call target_reinit when it isn't safe.  */
3760   if (fndecl && fndecl != ix86_previous_fndecl)
3761     {
3762       tree old_tree = (ix86_previous_fndecl
3763                        ? DECL_FUNCTION_SPECIFIC_TARGET (ix86_previous_fndecl)
3764                        : NULL_TREE);
3765
3766       tree new_tree = (fndecl
3767                        ? DECL_FUNCTION_SPECIFIC_TARGET (fndecl)
3768                        : NULL_TREE);
3769
3770       ix86_previous_fndecl = fndecl;
3771       if (old_tree == new_tree)
3772         ;
3773
3774       else if (new_tree)
3775         {
3776           cl_target_option_restore (TREE_TARGET_OPTION (new_tree));
3777           target_reinit ();
3778         }
3779
3780       else if (old_tree)
3781         {
3782           struct cl_target_option *def
3783             = TREE_TARGET_OPTION (target_option_current_node);
3784
3785           cl_target_option_restore (def);
3786           target_reinit ();
3787         }
3788     }
3789 }
3790
3791 \f
3792 /* Return true if this goes in large data/bss.  */
3793
3794 static bool
3795 ix86_in_large_data_p (tree exp)
3796 {
3797   if (ix86_cmodel != CM_MEDIUM && ix86_cmodel != CM_MEDIUM_PIC)
3798     return false;
3799
3800   /* Functions are never large data.  */
3801   if (TREE_CODE (exp) == FUNCTION_DECL)
3802     return false;
3803
3804   if (TREE_CODE (exp) == VAR_DECL && DECL_SECTION_NAME (exp))
3805     {
3806       const char *section = TREE_STRING_POINTER (DECL_SECTION_NAME (exp));
3807       if (strcmp (section, ".ldata") == 0
3808           || strcmp (section, ".lbss") == 0)
3809         return true;
3810       return false;
3811     }
3812   else
3813     {
3814       HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (exp));
3815
3816       /* If this is an incomplete type with size 0, then we can't put it
3817          in data because it might be too big when completed.  */
3818       if (!size || size > ix86_section_threshold)
3819         return true;
3820     }
3821
3822   return false;
3823 }
3824
3825 /* Switch to the appropriate section for output of DECL.
3826    DECL is either a `VAR_DECL' node or a constant of some sort.
3827    RELOC indicates whether forming the initial value of DECL requires
3828    link-time relocations.  */
3829
3830 static section * x86_64_elf_select_section (tree, int, unsigned HOST_WIDE_INT)
3831         ATTRIBUTE_UNUSED;
3832
3833 static section *
3834 x86_64_elf_select_section (tree decl, int reloc,
3835                            unsigned HOST_WIDE_INT align)
3836 {
3837   if ((ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_MEDIUM_PIC)
3838       && ix86_in_large_data_p (decl))
3839     {
3840       const char *sname = NULL;
3841       unsigned int flags = SECTION_WRITE;
3842       switch (categorize_decl_for_section (decl, reloc))
3843         {
3844         case SECCAT_DATA:
3845           sname = ".ldata";
3846           break;
3847         case SECCAT_DATA_REL:
3848           sname = ".ldata.rel";
3849           break;
3850         case SECCAT_DATA_REL_LOCAL:
3851           sname = ".ldata.rel.local";
3852           break;
3853         case SECCAT_DATA_REL_RO:
3854           sname = ".ldata.rel.ro";
3855           break;
3856         case SECCAT_DATA_REL_RO_LOCAL:
3857           sname = ".ldata.rel.ro.local";
3858           break;
3859         case SECCAT_BSS:
3860           sname = ".lbss";
3861           flags |= SECTION_BSS;
3862           break;
3863         case SECCAT_RODATA:
3864         case SECCAT_RODATA_MERGE_STR:
3865         case SECCAT_RODATA_MERGE_STR_INIT:
3866         case SECCAT_RODATA_MERGE_CONST:
3867           sname = ".lrodata";
3868           flags = 0;
3869           break;
3870         case SECCAT_SRODATA:
3871         case SECCAT_SDATA:
3872         case SECCAT_SBSS:
3873           gcc_unreachable ();
3874         case SECCAT_TEXT:
3875         case SECCAT_TDATA:
3876         case SECCAT_TBSS:
3877           /* We don't split these for medium model.  Place them into
3878              default sections and hope for best.  */
3879           break;
3880         case SECCAT_EMUTLS_VAR:
3881         case SECCAT_EMUTLS_TMPL:
3882           gcc_unreachable ();
3883         }
3884       if (sname)
3885         {
3886           /* We might get called with string constants, but get_named_section
3887              doesn't like them as they are not DECLs.  Also, we need to set
3888              flags in that case.  */
3889           if (!DECL_P (decl))
3890             return get_section (sname, flags, NULL);
3891           return get_named_section (decl, sname, reloc);
3892         }
3893     }
3894   return default_elf_select_section (decl, reloc, align);
3895 }
3896
3897 /* Build up a unique section name, expressed as a
3898    STRING_CST node, and assign it to DECL_SECTION_NAME (decl).
3899    RELOC indicates whether the initial value of EXP requires
3900    link-time relocations.  */
3901
3902 static void ATTRIBUTE_UNUSED
3903 x86_64_elf_unique_section (tree decl, int reloc)
3904 {
3905   if ((ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_MEDIUM_PIC)
3906       && ix86_in_large_data_p (decl))
3907     {
3908       const char *prefix = NULL;
3909       /* We only need to use .gnu.linkonce if we don't have COMDAT groups.  */
3910       bool one_only = DECL_ONE_ONLY (decl) && !HAVE_COMDAT_GROUP;
3911
3912       switch (categorize_decl_for_section (decl, reloc))
3913         {
3914         case SECCAT_DATA:
3915         case SECCAT_DATA_REL:
3916         case SECCAT_DATA_REL_LOCAL:
3917         case SECCAT_DATA_REL_RO:
3918         case SECCAT_DATA_REL_RO_LOCAL:
3919           prefix = one_only ? ".ld" : ".ldata";
3920           break;
3921         case SECCAT_BSS:
3922           prefix = one_only ? ".lb" : ".lbss";
3923           break;
3924         case SECCAT_RODATA:
3925         case SECCAT_RODATA_MERGE_STR:
3926         case SECCAT_RODATA_MERGE_STR_INIT:
3927         case SECCAT_RODATA_MERGE_CONST:
3928           prefix = one_only ? ".lr" : ".lrodata";
3929           break;
3930         case SECCAT_SRODATA:
3931         case SECCAT_SDATA:
3932         case SECCAT_SBSS:
3933           gcc_unreachable ();
3934         case SECCAT_TEXT:
3935         case SECCAT_TDATA:
3936         case SECCAT_TBSS:
3937           /* We don't split these for medium model.  Place them into
3938              default sections and hope for best.  */
3939           break;
3940         case SECCAT_EMUTLS_VAR:
3941           prefix = targetm.emutls.var_section;
3942           break;
3943         case SECCAT_EMUTLS_TMPL:
3944           prefix = targetm.emutls.tmpl_section;
3945           break;
3946         }
3947       if (prefix)
3948         {
3949           const char *name, *linkonce;
3950           char *string;
3951
3952           name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
3953           name = targetm.strip_name_encoding (name);
3954           
3955           /* If we're using one_only, then there needs to be a .gnu.linkonce
3956              prefix to the section name.  */
3957           linkonce = one_only ? ".gnu.linkonce" : "";
3958   
3959           string = ACONCAT ((linkonce, prefix, ".", name, NULL));
3960           
3961           DECL_SECTION_NAME (decl) = build_string (strlen (string), string);
3962           return;
3963         }
3964     }
3965   default_unique_section (decl, reloc);
3966 }
3967
3968 #ifdef COMMON_ASM_OP
3969 /* This says how to output assembler code to declare an
3970    uninitialized external linkage data object.
3971
3972    For medium model x86-64 we need to use .largecomm opcode for
3973    large objects.  */
3974 void
3975 x86_elf_aligned_common (FILE *file,
3976                         const char *name, unsigned HOST_WIDE_INT size,
3977                         int align)
3978 {
3979   if ((ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_MEDIUM_PIC)
3980       && size > (unsigned int)ix86_section_threshold)
3981     fprintf (file, ".largecomm\t");
3982   else
3983     fprintf (file, "%s", COMMON_ASM_OP);
3984   assemble_name (file, name);
3985   fprintf (file, ","HOST_WIDE_INT_PRINT_UNSIGNED",%u\n",
3986            size, align / BITS_PER_UNIT);
3987 }
3988 #endif
3989
3990 /* Utility function for targets to use in implementing
3991    ASM_OUTPUT_ALIGNED_BSS.  */
3992
3993 void
3994 x86_output_aligned_bss (FILE *file, tree decl ATTRIBUTE_UNUSED,
3995                         const char *name, unsigned HOST_WIDE_INT size,
3996                         int align)
3997 {
3998   if ((ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_MEDIUM_PIC)
3999       && size > (unsigned int)ix86_section_threshold)
4000     switch_to_section (get_named_section (decl, ".lbss", 0));
4001   else
4002     switch_to_section (bss_section);
4003   ASM_OUTPUT_ALIGN (file, floor_log2 (align / BITS_PER_UNIT));
4004 #ifdef ASM_DECLARE_OBJECT_NAME
4005   last_assemble_variable_decl = decl;
4006   ASM_DECLARE_OBJECT_NAME (file, name, decl);
4007 #else
4008   /* Standard thing is just output label for the object.  */
4009   ASM_OUTPUT_LABEL (file, name);
4010 #endif /* ASM_DECLARE_OBJECT_NAME */
4011   ASM_OUTPUT_SKIP (file, size ? size : 1);
4012 }
4013 \f
4014 void
4015 optimization_options (int level, int size ATTRIBUTE_UNUSED)
4016 {
4017   /* For -O2 and beyond, turn off -fschedule-insns by default.  It tends to
4018      make the problem with not enough registers even worse.  */
4019 #ifdef INSN_SCHEDULING
4020   if (level > 1)
4021     flag_schedule_insns = 0;
4022 #endif
4023
4024   if (TARGET_MACHO)
4025     /* The Darwin libraries never set errno, so we might as well
4026        avoid calling them when that's the only reason we would.  */
4027     flag_errno_math = 0;
4028
4029   /* The default values of these switches depend on the TARGET_64BIT
4030      that is not known at this moment.  Mark these values with 2 and
4031      let user the to override these.  In case there is no command line option
4032      specifying them, we will set the defaults in override_options.  */
4033   if (optimize >= 1)
4034     flag_omit_frame_pointer = 2;
4035   flag_pcc_struct_return = 2;
4036   flag_asynchronous_unwind_tables = 2;
4037   flag_vect_cost_model = 1;
4038 #ifdef SUBTARGET_OPTIMIZATION_OPTIONS
4039   SUBTARGET_OPTIMIZATION_OPTIONS;
4040 #endif
4041 }
4042 \f
4043 /* Decide whether we can make a sibling call to a function.  DECL is the
4044    declaration of the function being targeted by the call and EXP is the
4045    CALL_EXPR representing the call.  */
4046
4047 static bool
4048 ix86_function_ok_for_sibcall (tree decl, tree exp)
4049 {
4050   tree func;
4051   rtx a, b;
4052
4053   /* If we are generating position-independent code, we cannot sibcall
4054      optimize any indirect call, or a direct call to a global function,
4055      as the PLT requires %ebx be live.  */
4056   if (!TARGET_64BIT && flag_pic && (!decl || !targetm.binds_local_p (decl)))
4057     return false;
4058
4059   if (decl)
4060     func = decl;
4061   else
4062     {
4063       func = TREE_TYPE (CALL_EXPR_FN (exp));
4064       if (POINTER_TYPE_P (func))
4065         func = TREE_TYPE (func);
4066     }
4067
4068   /* Check that the return value locations are the same.  Like
4069      if we are returning floats on the 80387 register stack, we cannot
4070      make a sibcall from a function that doesn't return a float to a
4071      function that does or, conversely, from a function that does return
4072      a float to a function that doesn't; the necessary stack adjustment
4073      would not be executed.  This is also the place we notice
4074      differences in the return value ABI.  Note that it is ok for one
4075      of the functions to have void return type as long as the return
4076      value of the other is passed in a register.  */
4077   a = ix86_function_value (TREE_TYPE (exp), func, false);
4078   b = ix86_function_value (TREE_TYPE (DECL_RESULT (cfun->decl)),
4079                            cfun->decl, false);
4080   if (STACK_REG_P (a) || STACK_REG_P (b))
4081     {
4082       if (!rtx_equal_p (a, b))
4083         return false;
4084     }
4085   else if (VOID_TYPE_P (TREE_TYPE (DECL_RESULT (cfun->decl))))
4086     ;
4087   else if (!rtx_equal_p (a, b))
4088     return false;
4089
4090   /* If this call is indirect, we'll need to be able to use a call-clobbered
4091      register for the address of the target function.  Make sure that all
4092      such registers are not used for passing parameters.  */
4093   if (!decl && !TARGET_64BIT)
4094     {
4095       tree type;
4096
4097       /* We're looking at the CALL_EXPR, we need the type of the function.  */
4098       type = CALL_EXPR_FN (exp);                /* pointer expression */
4099       type = TREE_TYPE (type);                  /* pointer type */
4100       type = TREE_TYPE (type);                  /* function type */
4101
4102       if (ix86_function_regparm (type, NULL) >= 3)
4103         {
4104           /* ??? Need to count the actual number of registers to be used,
4105              not the possible number of registers.  Fix later.  */
4106           return false;
4107         }
4108     }
4109
4110   /* Dllimport'd functions are also called indirectly.  */
4111   if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
4112       && !TARGET_64BIT
4113       && decl && DECL_DLLIMPORT_P (decl)
4114       && ix86_function_regparm (TREE_TYPE (decl), NULL) >= 3)
4115     return false;
4116
4117   /* If we need to align the outgoing stack, then sibcalling would
4118      unalign the stack, which may break the called function.  */
4119   if (ix86_incoming_stack_boundary < PREFERRED_STACK_BOUNDARY)
4120     return false;
4121
4122   /* Otherwise okay.  That also includes certain types of indirect calls.  */
4123   return true;
4124 }
4125
4126 /* Handle "cdecl", "stdcall", "fastcall", "regparm" and "sseregparm"
4127    calling convention attributes;
4128    arguments as in struct attribute_spec.handler.  */
4129
4130 static tree
4131 ix86_handle_cconv_attribute (tree *node, tree name,
4132                                    tree args,
4133                                    int flags ATTRIBUTE_UNUSED,
4134                                    bool *no_add_attrs)
4135 {
4136   if (TREE_CODE (*node) != FUNCTION_TYPE
4137       && TREE_CODE (*node) != METHOD_TYPE
4138       && TREE_CODE (*node) != FIELD_DECL
4139       && TREE_CODE (*node) != TYPE_DECL)
4140     {
4141       warning (OPT_Wattributes, "%qs attribute only applies to functions",
4142                IDENTIFIER_POINTER (name));
4143       *no_add_attrs = true;
4144       return NULL_TREE;
4145     }
4146
4147   /* Can combine regparm with all attributes but fastcall.  */
4148   if (is_attribute_p ("regparm", name))
4149     {
4150       tree cst;
4151
4152       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (*node)))
4153         {
4154           error ("fastcall and regparm attributes are not compatible");
4155         }
4156
4157       cst = TREE_VALUE (args);
4158       if (TREE_CODE (cst) != INTEGER_CST)
4159         {
4160           warning (OPT_Wattributes,
4161                    "%qs attribute requires an integer constant argument",
4162                    IDENTIFIER_POINTER (name));
4163           *no_add_attrs = true;
4164         }
4165       else if (compare_tree_int (cst, REGPARM_MAX) > 0)
4166         {
4167           warning (OPT_Wattributes, "argument to %qs attribute larger than %d",
4168                    IDENTIFIER_POINTER (name), REGPARM_MAX);
4169           *no_add_attrs = true;
4170         }
4171
4172       return NULL_TREE;
4173     }
4174
4175   if (TARGET_64BIT)
4176     {
4177       /* Do not warn when emulating the MS ABI.  */
4178       if (TREE_CODE (*node) != FUNCTION_TYPE || ix86_function_type_abi (*node)!=MS_ABI)
4179         warning (OPT_Wattributes, "%qs attribute ignored",
4180                  IDENTIFIER_POINTER (name));
4181       *no_add_attrs = true;
4182       return NULL_TREE;
4183     }
4184
4185   /* Can combine fastcall with stdcall (redundant) and sseregparm.  */
4186   if (is_attribute_p ("fastcall", name))
4187     {
4188       if (lookup_attribute ("cdecl", TYPE_ATTRIBUTES (*node)))
4189         {
4190           error ("fastcall and cdecl attributes are not compatible");
4191         }
4192       if (lookup_attribute ("stdcall", TYPE_ATTRIBUTES (*node)))
4193         {
4194           error ("fastcall and stdcall attributes are not compatible");
4195         }
4196       if (lookup_attribute ("regparm", TYPE_ATTRIBUTES (*node)))
4197         {
4198           error ("fastcall and regparm attributes are not compatible");
4199         }
4200     }
4201
4202   /* Can combine stdcall with fastcall (redundant), regparm and
4203      sseregparm.  */
4204   else if (is_attribute_p ("stdcall", name))
4205     {
4206       if (lookup_attribute ("cdecl", TYPE_ATTRIBUTES (*node)))
4207         {
4208           error ("stdcall and cdecl attributes are not compatible");
4209         }
4210       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (*node)))
4211         {
4212           error ("stdcall and fastcall attributes are not compatible");
4213         }
4214     }
4215
4216   /* Can combine cdecl with regparm and sseregparm.  */
4217   else if (is_attribute_p ("cdecl", name))
4218     {
4219       if (lookup_attribute ("stdcall", TYPE_ATTRIBUTES (*node)))
4220         {
4221           error ("stdcall and cdecl attributes are not compatible");
4222         }
4223       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (*node)))
4224         {
4225           error ("fastcall and cdecl attributes are not compatible");
4226         }
4227     }
4228
4229   /* Can combine sseregparm with all attributes.  */
4230
4231   return NULL_TREE;
4232 }
4233
4234 /* Return 0 if the attributes for two types are incompatible, 1 if they
4235    are compatible, and 2 if they are nearly compatible (which causes a
4236    warning to be generated).  */
4237
4238 static int
4239 ix86_comp_type_attributes (const_tree type1, const_tree type2)
4240 {
4241   /* Check for mismatch of non-default calling convention.  */
4242   const char *const rtdstr = TARGET_RTD ? "cdecl" : "stdcall";
4243
4244   if (TREE_CODE (type1) != FUNCTION_TYPE
4245       && TREE_CODE (type1) != METHOD_TYPE)
4246     return 1;
4247
4248   /* Check for mismatched fastcall/regparm types.  */
4249   if ((!lookup_attribute ("fastcall", TYPE_ATTRIBUTES (type1))
4250        != !lookup_attribute ("fastcall", TYPE_ATTRIBUTES (type2)))
4251       || (ix86_function_regparm (type1, NULL)
4252           != ix86_function_regparm (type2, NULL)))
4253     return 0;
4254
4255   /* Check for mismatched sseregparm types.  */
4256   if (!lookup_attribute ("sseregparm", TYPE_ATTRIBUTES (type1))
4257       != !lookup_attribute ("sseregparm", TYPE_ATTRIBUTES (type2)))
4258     return 0;
4259
4260   /* Check for mismatched return types (cdecl vs stdcall).  */
4261   if (!lookup_attribute (rtdstr, TYPE_ATTRIBUTES (type1))
4262       != !lookup_attribute (rtdstr, TYPE_ATTRIBUTES (type2)))
4263     return 0;
4264
4265   return 1;
4266 }
4267 \f
4268 /* Return the regparm value for a function with the indicated TYPE and DECL.
4269    DECL may be NULL when calling function indirectly
4270    or considering a libcall.  */
4271
4272 static int
4273 ix86_function_regparm (const_tree type, const_tree decl)
4274 {
4275   tree attr;
4276   int regparm;
4277
4278   static bool error_issued;
4279
4280   if (TARGET_64BIT)
4281     return (ix86_function_type_abi (type) == SYSV_ABI
4282             ? X86_64_REGPARM_MAX : X64_REGPARM_MAX);
4283
4284   regparm = ix86_regparm;
4285   attr = lookup_attribute ("regparm", TYPE_ATTRIBUTES (type));
4286   if (attr)
4287     {
4288       regparm
4289         = TREE_INT_CST_LOW (TREE_VALUE (TREE_VALUE (attr)));
4290
4291       if (decl && TREE_CODE (decl) == FUNCTION_DECL)
4292         {
4293           /* We can't use regparm(3) for nested functions because
4294              these pass static chain pointer in %ecx register.  */
4295           if (!error_issued && regparm == 3
4296               && decl_function_context (decl)
4297               && !DECL_NO_STATIC_CHAIN (decl))
4298             {
4299               error ("nested functions are limited to 2 register parameters");
4300               error_issued = true;
4301               return 0;
4302             }
4303         }
4304
4305       return regparm;
4306     }
4307
4308   if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (type)))
4309     return 2;
4310
4311   /* Use register calling convention for local functions when possible.  */
4312   if (decl && TREE_CODE (decl) == FUNCTION_DECL
4313       && !profile_flag)
4314     {
4315       /* FIXME: remove this CONST_CAST when cgraph.[ch] is constified.  */
4316       struct cgraph_local_info *i = cgraph_local_info (CONST_CAST_TREE(decl));
4317       if (i && i->local)
4318         {
4319           int local_regparm, globals = 0, regno;
4320           struct function *f;
4321
4322           /* Make sure no regparm register is taken by a
4323              fixed register variable.  */
4324           for (local_regparm = 0; local_regparm < REGPARM_MAX; local_regparm++)
4325             if (fixed_regs[local_regparm])
4326               break;
4327
4328           /* We can't use regparm(3) for nested functions as these use
4329              static chain pointer in third argument.  */
4330           if (local_regparm == 3
4331               && decl_function_context (decl)
4332               && !DECL_NO_STATIC_CHAIN (decl))
4333             local_regparm = 2;
4334
4335           /* If the function realigns its stackpointer, the prologue will
4336              clobber %ecx.  If we've already generated code for the callee,
4337              the callee DECL_STRUCT_FUNCTION is gone, so we fall back to
4338              scanning the attributes for the self-realigning property.  */
4339           f = DECL_STRUCT_FUNCTION (decl);
4340           /* Since current internal arg pointer won't conflict with
4341              parameter passing regs, so no need to change stack
4342              realignment and adjust regparm number.
4343
4344              Each fixed register usage increases register pressure,
4345              so less registers should be used for argument passing.
4346              This functionality can be overriden by an explicit
4347              regparm value.  */
4348           for (regno = 0; regno <= DI_REG; regno++)
4349             if (fixed_regs[regno])
4350               globals++;
4351
4352           local_regparm
4353             = globals < local_regparm ? local_regparm - globals : 0;
4354
4355           if (local_regparm > regparm)
4356             regparm = local_regparm;
4357         }
4358     }
4359
4360   return regparm;
4361 }
4362
4363 /* Return 1 or 2, if we can pass up to SSE_REGPARM_MAX SFmode (1) and
4364    DFmode (2) arguments in SSE registers for a function with the
4365    indicated TYPE and DECL.  DECL may be NULL when calling function
4366    indirectly or considering a libcall.  Otherwise return 0.  */
4367
4368 static int
4369 ix86_function_sseregparm (const_tree type, const_tree decl, bool warn)
4370 {
4371   gcc_assert (!TARGET_64BIT);
4372
4373   /* Use SSE registers to pass SFmode and DFmode arguments if requested
4374      by the sseregparm attribute.  */
4375   if (TARGET_SSEREGPARM
4376       || (type && lookup_attribute ("sseregparm", TYPE_ATTRIBUTES (type))))
4377     {
4378       if (!TARGET_SSE)
4379         {
4380           if (warn)
4381             {
4382               if (decl)
4383                 error ("Calling %qD with attribute sseregparm without "
4384                        "SSE/SSE2 enabled", decl);
4385               else
4386                 error ("Calling %qT with attribute sseregparm without "
4387                        "SSE/SSE2 enabled", type);
4388             }
4389           return 0;
4390         }
4391
4392       return 2;
4393     }
4394
4395   /* For local functions, pass up to SSE_REGPARM_MAX SFmode
4396      (and DFmode for SSE2) arguments in SSE registers.  */
4397   if (decl && TARGET_SSE_MATH && !profile_flag)
4398     {
4399       /* FIXME: remove this CONST_CAST when cgraph.[ch] is constified.  */
4400       struct cgraph_local_info *i = cgraph_local_info (CONST_CAST_TREE(decl));
4401       if (i && i->local)
4402         return TARGET_SSE2 ? 2 : 1;
4403     }
4404
4405   return 0;
4406 }
4407
4408 /* Return true if EAX is live at the start of the function.  Used by
4409    ix86_expand_prologue to determine if we need special help before
4410    calling allocate_stack_worker.  */
4411
4412 static bool
4413 ix86_eax_live_at_start_p (void)
4414 {
4415   /* Cheat.  Don't bother working forward from ix86_function_regparm
4416      to the function type to whether an actual argument is located in
4417      eax.  Instead just look at cfg info, which is still close enough
4418      to correct at this point.  This gives false positives for broken
4419      functions that might use uninitialized data that happens to be
4420      allocated in eax, but who cares?  */
4421   return REGNO_REG_SET_P (df_get_live_out (ENTRY_BLOCK_PTR), 0);
4422 }
4423
4424 /* Value is the number of bytes of arguments automatically
4425    popped when returning from a subroutine call.
4426    FUNDECL is the declaration node of the function (as a tree),
4427    FUNTYPE is the data type of the function (as a tree),
4428    or for a library call it is an identifier node for the subroutine name.
4429    SIZE is the number of bytes of arguments passed on the stack.
4430
4431    On the 80386, the RTD insn may be used to pop them if the number
4432      of args is fixed, but if the number is variable then the caller
4433      must pop them all.  RTD can't be used for library calls now
4434      because the library is compiled with the Unix compiler.
4435    Use of RTD is a selectable option, since it is incompatible with
4436    standard Unix calling sequences.  If the option is not selected,
4437    the caller must always pop the args.
4438
4439    The attribute stdcall is equivalent to RTD on a per module basis.  */
4440
4441 int
4442 ix86_return_pops_args (tree fundecl, tree funtype, int size)
4443 {
4444   int rtd;
4445
4446   /* None of the 64-bit ABIs pop arguments.  */
4447   if (TARGET_64BIT)
4448     return 0;
4449
4450   rtd = TARGET_RTD && (!fundecl || TREE_CODE (fundecl) != IDENTIFIER_NODE);
4451
4452   /* Cdecl functions override -mrtd, and never pop the stack.  */
4453   if (! lookup_attribute ("cdecl", TYPE_ATTRIBUTES (funtype)))
4454     {
4455       /* Stdcall and fastcall functions will pop the stack if not
4456          variable args.  */
4457       if (lookup_attribute ("stdcall", TYPE_ATTRIBUTES (funtype))
4458           || lookup_attribute ("fastcall", TYPE_ATTRIBUTES (funtype)))
4459         rtd = 1;
4460
4461       if (rtd && ! stdarg_p (funtype))
4462         return size;
4463     }
4464
4465   /* Lose any fake structure return argument if it is passed on the stack.  */
4466   if (aggregate_value_p (TREE_TYPE (funtype), fundecl)
4467       && !KEEP_AGGREGATE_RETURN_POINTER)
4468     {
4469       int nregs = ix86_function_regparm (funtype, fundecl);
4470       if (nregs == 0)
4471         return GET_MODE_SIZE (Pmode);
4472     }
4473
4474   return 0;
4475 }
4476 \f
4477 /* Argument support functions.  */
4478
4479 /* Return true when register may be used to pass function parameters.  */
4480 bool
4481 ix86_function_arg_regno_p (int regno)
4482 {
4483   int i;
4484   const int *parm_regs;
4485
4486   if (!TARGET_64BIT)
4487     {
4488       if (TARGET_MACHO)
4489         return (regno < REGPARM_MAX
4490                 || (TARGET_SSE && SSE_REGNO_P (regno) && !fixed_regs[regno]));
4491       else
4492         return (regno < REGPARM_MAX
4493                 || (TARGET_MMX && MMX_REGNO_P (regno)
4494                     && (regno < FIRST_MMX_REG + MMX_REGPARM_MAX))
4495                 || (TARGET_SSE && SSE_REGNO_P (regno)
4496                     && (regno < FIRST_SSE_REG + SSE_REGPARM_MAX)));
4497     }
4498
4499   if (TARGET_MACHO)
4500     {
4501       if (SSE_REGNO_P (regno) && TARGET_SSE)
4502         return true;
4503     }
4504   else
4505     {
4506       if (TARGET_SSE && SSE_REGNO_P (regno)
4507           && (regno < FIRST_SSE_REG + SSE_REGPARM_MAX))
4508         return true;
4509     }
4510
4511   /* TODO: The function should depend on current function ABI but
4512      builtins.c would need updating then. Therefore we use the
4513      default ABI.  */
4514
4515   /* RAX is used as hidden argument to va_arg functions.  */
4516   if (DEFAULT_ABI == SYSV_ABI && regno == AX_REG)
4517     return true;
4518
4519   if (DEFAULT_ABI == MS_ABI)
4520     parm_regs = x86_64_ms_abi_int_parameter_registers;
4521   else
4522     parm_regs = x86_64_int_parameter_registers;
4523   for (i = 0; i < (DEFAULT_ABI == MS_ABI ? X64_REGPARM_MAX
4524                                          : X86_64_REGPARM_MAX); i++)
4525     if (regno == parm_regs[i])
4526       return true;
4527   return false;
4528 }
4529
4530 /* Return if we do not know how to pass TYPE solely in registers.  */
4531
4532 static bool
4533 ix86_must_pass_in_stack (enum machine_mode mode, const_tree type)
4534 {
4535   if (must_pass_in_stack_var_size_or_pad (mode, type))
4536     return true;
4537
4538   /* For 32-bit, we want TImode aggregates to go on the stack.  But watch out!
4539      The layout_type routine is crafty and tries to trick us into passing
4540      currently unsupported vector types on the stack by using TImode.  */
4541   return (!TARGET_64BIT && mode == TImode
4542           && type && TREE_CODE (type) != VECTOR_TYPE);
4543 }
4544
4545 /* It returns the size, in bytes, of the area reserved for arguments passed
4546    in registers for the function represented by fndecl dependent to the used
4547    abi format.  */
4548 int
4549 ix86_reg_parm_stack_space (const_tree fndecl)
4550 {
4551   int call_abi = SYSV_ABI;
4552   if (fndecl != NULL_TREE && TREE_CODE (fndecl) == FUNCTION_DECL)
4553     call_abi = ix86_function_abi (fndecl);
4554   else
4555     call_abi = ix86_function_type_abi (fndecl);
4556   if (call_abi == MS_ABI)
4557     return 32;
4558   return 0;
4559 }
4560
4561 /* Returns value SYSV_ABI, MS_ABI dependent on fntype, specifying the
4562    call abi used.  */
4563 int
4564 ix86_function_type_abi (const_tree fntype)
4565 {
4566   if (TARGET_64BIT && fntype != NULL)
4567     {
4568       int abi;
4569       if (DEFAULT_ABI == SYSV_ABI)
4570         abi = lookup_attribute ("ms_abi", TYPE_ATTRIBUTES (fntype)) ? MS_ABI : SYSV_ABI;
4571       else
4572         abi = lookup_attribute ("sysv_abi", TYPE_ATTRIBUTES (fntype)) ? SYSV_ABI : MS_ABI;
4573
4574       return abi;
4575     }
4576   return DEFAULT_ABI;
4577 }
4578
4579 int
4580 ix86_function_abi (const_tree fndecl)
4581 {
4582   if (! fndecl)
4583     return DEFAULT_ABI;
4584   return ix86_function_type_abi (TREE_TYPE (fndecl));
4585 }
4586
4587 /* Returns value SYSV_ABI, MS_ABI dependent on cfun, specifying the
4588    call abi used.  */
4589 int
4590 ix86_cfun_abi (void)
4591 {
4592   if (! cfun || ! TARGET_64BIT)
4593     return DEFAULT_ABI;
4594   return cfun->machine->call_abi;
4595 }
4596
4597 /* regclass.c  */
4598 extern void init_regs (void);
4599
4600 /* Implementation of call abi switching target hook. Specific to FNDECL
4601    the specific call register sets are set. See also CONDITIONAL_REGISTER_USAGE
4602    for more details.  */
4603 void
4604 ix86_call_abi_override (const_tree fndecl)
4605 {
4606   if (fndecl == NULL_TREE)
4607     cfun->machine->call_abi = DEFAULT_ABI;
4608   else
4609     cfun->machine->call_abi = ix86_function_type_abi (TREE_TYPE (fndecl));
4610 }
4611
4612 /* MS and SYSV ABI have different set of call used registers.  Avoid expensive
4613    re-initialization of init_regs each time we switch function context since
4614    this is needed only during RTL expansion.  */
4615 static void
4616 ix86_maybe_switch_abi (void)
4617 {
4618   if (TARGET_64BIT &&
4619       call_used_regs[SI_REG] == (cfun->machine->call_abi == MS_ABI))
4620     reinit_regs ();
4621 }
4622
4623 /* Initialize a variable CUM of type CUMULATIVE_ARGS
4624    for a call to a function whose data type is FNTYPE.
4625    For a library call, FNTYPE is 0.  */
4626
4627 void
4628 init_cumulative_args (CUMULATIVE_ARGS *cum,  /* Argument info to initialize */
4629                       tree fntype,      /* tree ptr for function decl */
4630                       rtx libname,      /* SYMBOL_REF of library name or 0 */
4631                       tree fndecl)
4632 {
4633   struct cgraph_local_info *i = fndecl ? cgraph_local_info (fndecl) : NULL;
4634   memset (cum, 0, sizeof (*cum));
4635
4636   if (fndecl)
4637    cum->call_abi = ix86_function_abi (fndecl);
4638   else
4639    cum->call_abi = ix86_function_type_abi (fntype);
4640   /* Set up the number of registers to use for passing arguments.  */
4641
4642   if (cum->call_abi == MS_ABI && !ACCUMULATE_OUTGOING_ARGS)
4643     sorry ("ms_abi attribute require -maccumulate-outgoing-args or subtarget optimization implying it");
4644   cum->nregs = ix86_regparm;
4645   if (TARGET_64BIT)
4646     {
4647       if (cum->call_abi != DEFAULT_ABI)
4648         cum->nregs = DEFAULT_ABI != SYSV_ABI ? X86_64_REGPARM_MAX
4649                                              : X64_REGPARM_MAX;
4650     }
4651   if (TARGET_SSE)
4652     {
4653       cum->sse_nregs = SSE_REGPARM_MAX;
4654       if (TARGET_64BIT)
4655         {
4656           if (cum->call_abi != DEFAULT_ABI)
4657             cum->sse_nregs = DEFAULT_ABI != SYSV_ABI ? X86_64_SSE_REGPARM_MAX
4658                                                      : X64_SSE_REGPARM_MAX;
4659         }
4660     }
4661   if (TARGET_MMX)
4662     cum->mmx_nregs = MMX_REGPARM_MAX;
4663   cum->warn_avx = true;
4664   cum->warn_sse = true;
4665   cum->warn_mmx = true;
4666
4667   /* Because type might mismatch in between caller and callee, we need to
4668      use actual type of function for local calls.
4669      FIXME: cgraph_analyze can be told to actually record if function uses
4670      va_start so for local functions maybe_vaarg can be made aggressive
4671      helping K&R code.
4672      FIXME: once typesytem is fixed, we won't need this code anymore.  */
4673   if (i && i->local)
4674     fntype = TREE_TYPE (fndecl);
4675   cum->maybe_vaarg = (fntype
4676                       ? (!prototype_p (fntype) || stdarg_p (fntype))
4677                       : !libname);
4678
4679   if (!TARGET_64BIT)
4680     {
4681       /* If there are variable arguments, then we won't pass anything
4682          in registers in 32-bit mode. */
4683       if (stdarg_p (fntype))
4684         {
4685           cum->nregs = 0;
4686           cum->sse_nregs = 0;
4687           cum->mmx_nregs = 0;
4688           cum->warn_avx = 0;
4689           cum->warn_sse = 0;
4690           cum->warn_mmx = 0;
4691           return;
4692         }
4693
4694       /* Use ecx and edx registers if function has fastcall attribute,
4695          else look for regparm information.  */
4696       if (fntype)
4697         {
4698           if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (fntype)))
4699             {
4700               cum->nregs = 2;
4701               cum->fastcall = 1;
4702             }
4703           else
4704             cum->nregs = ix86_function_regparm (fntype, fndecl);
4705         }
4706
4707       /* Set up the number of SSE registers used for passing SFmode
4708          and DFmode arguments.  Warn for mismatching ABI.  */
4709       cum->float_in_sse = ix86_function_sseregparm (fntype, fndecl, true);
4710     }
4711 }
4712
4713 /* Return the "natural" mode for TYPE.  In most cases, this is just TYPE_MODE.
4714    But in the case of vector types, it is some vector mode.
4715
4716    When we have only some of our vector isa extensions enabled, then there
4717    are some modes for which vector_mode_supported_p is false.  For these
4718    modes, the generic vector support in gcc will choose some non-vector mode
4719    in order to implement the type.  By computing the natural mode, we'll
4720    select the proper ABI location for the operand and not depend on whatever
4721    the middle-end decides to do with these vector types.
4722
4723    The midde-end can't deal with the vector types > 16 bytes.  In this
4724    case, we return the original mode and warn ABI change if CUM isn't
4725    NULL.  */
4726
4727 static enum machine_mode
4728 type_natural_mode (const_tree type, CUMULATIVE_ARGS *cum)
4729 {
4730   enum machine_mode mode = TYPE_MODE (type);
4731
4732   if (TREE_CODE (type) == VECTOR_TYPE && !VECTOR_MODE_P (mode))
4733     {
4734       HOST_WIDE_INT size = int_size_in_bytes (type);
4735       if ((size == 8 || size == 16 || size == 32)
4736           /* ??? Generic code allows us to create width 1 vectors.  Ignore.  */
4737           && TYPE_VECTOR_SUBPARTS (type) > 1)
4738         {
4739           enum machine_mode innermode = TYPE_MODE (TREE_TYPE (type));
4740
4741           if (TREE_CODE (TREE_TYPE (type)) == REAL_TYPE)
4742             mode = MIN_MODE_VECTOR_FLOAT;
4743           else
4744             mode = MIN_MODE_VECTOR_INT;
4745
4746           /* Get the mode which has this inner mode and number of units.  */
4747           for (; mode != VOIDmode; mode = GET_MODE_WIDER_MODE (mode))
4748             if (GET_MODE_NUNITS (mode) == TYPE_VECTOR_SUBPARTS (type)
4749                 && GET_MODE_INNER (mode) == innermode)
4750               {
4751                 if (size == 32 && !TARGET_AVX)
4752                   {
4753                     static bool warnedavx;
4754
4755                     if (cum
4756                         && !warnedavx 
4757                         && cum->warn_avx)
4758                       {
4759                         warnedavx = true;
4760                         warning (0, "AVX vector argument without AVX "
4761                                  "enabled changes the ABI");
4762                       }
4763                     return TYPE_MODE (type);
4764                   }
4765                 else
4766                   return mode;
4767               }
4768
4769           gcc_unreachable ();
4770         }
4771     }
4772
4773   return mode;
4774 }
4775
4776 /* We want to pass a value in REGNO whose "natural" mode is MODE.  However,
4777    this may not agree with the mode that the type system has chosen for the
4778    register, which is ORIG_MODE.  If ORIG_MODE is not BLKmode, then we can
4779    go ahead and use it.  Otherwise we have to build a PARALLEL instead.  */
4780
4781 static rtx
4782 gen_reg_or_parallel (enum machine_mode mode, enum machine_mode orig_mode,
4783                      unsigned int regno)
4784 {
4785   rtx tmp;
4786
4787   if (orig_mode != BLKmode)
4788     tmp = gen_rtx_REG (orig_mode, regno);
4789   else
4790     {
4791       tmp = gen_rtx_REG (mode, regno);
4792       tmp = gen_rtx_EXPR_LIST (VOIDmode, tmp, const0_rtx);
4793       tmp = gen_rtx_PARALLEL (orig_mode, gen_rtvec (1, tmp));
4794     }
4795
4796   return tmp;
4797 }
4798
4799 /* x86-64 register passing implementation.  See x86-64 ABI for details.  Goal
4800    of this code is to classify each 8bytes of incoming argument by the register
4801    class and assign registers accordingly.  */
4802
4803 /* Return the union class of CLASS1 and CLASS2.
4804    See the x86-64 PS ABI for details.  */
4805
4806 static enum x86_64_reg_class
4807 merge_classes (enum x86_64_reg_class class1, enum x86_64_reg_class class2)
4808 {
4809   /* Rule #1: If both classes are equal, this is the resulting class.  */
4810   if (class1 == class2)
4811     return class1;
4812
4813   /* Rule #2: If one of the classes is NO_CLASS, the resulting class is
4814      the other class.  */
4815   if (class1 == X86_64_NO_CLASS)
4816     return class2;
4817   if (class2 == X86_64_NO_CLASS)
4818     return class1;
4819
4820   /* Rule #3: If one of the classes is MEMORY, the result is MEMORY.  */
4821   if (class1 == X86_64_MEMORY_CLASS || class2 == X86_64_MEMORY_CLASS)
4822     return X86_64_MEMORY_CLASS;
4823
4824   /* Rule #4: If one of the classes is INTEGER, the result is INTEGER.  */
4825   if ((class1 == X86_64_INTEGERSI_CLASS && class2 == X86_64_SSESF_CLASS)
4826       || (class2 == X86_64_INTEGERSI_CLASS && class1 == X86_64_SSESF_CLASS))
4827     return X86_64_INTEGERSI_CLASS;
4828   if (class1 == X86_64_INTEGER_CLASS || class1 == X86_64_INTEGERSI_CLASS
4829       || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS)
4830     return X86_64_INTEGER_CLASS;
4831
4832   /* Rule #5: If one of the classes is X87, X87UP, or COMPLEX_X87 class,
4833      MEMORY is used.  */
4834   if (class1 == X86_64_X87_CLASS
4835       || class1 == X86_64_X87UP_CLASS
4836       || class1 == X86_64_COMPLEX_X87_CLASS
4837       || class2 == X86_64_X87_CLASS
4838       || class2 == X86_64_X87UP_CLASS
4839       || class2 == X86_64_COMPLEX_X87_CLASS)
4840     return X86_64_MEMORY_CLASS;
4841
4842   /* Rule #6: Otherwise class SSE is used.  */
4843   return X86_64_SSE_CLASS;
4844 }
4845
4846 /* Classify the argument of type TYPE and mode MODE.
4847    CLASSES will be filled by the register class used to pass each word
4848    of the operand.  The number of words is returned.  In case the parameter
4849    should be passed in memory, 0 is returned. As a special case for zero
4850    sized containers, classes[0] will be NO_CLASS and 1 is returned.
4851
4852    BIT_OFFSET is used internally for handling records and specifies offset
4853    of the offset in bits modulo 256 to avoid overflow cases.
4854
4855    See the x86-64 PS ABI for details.
4856 */
4857
4858 static int
4859 classify_argument (enum machine_mode mode, const_tree type,
4860                    enum x86_64_reg_class classes[MAX_CLASSES], int bit_offset)
4861 {
4862   HOST_WIDE_INT bytes =
4863     (mode == BLKmode) ? int_size_in_bytes (type) : (int) GET_MODE_SIZE (mode);
4864   int words = (bytes + (bit_offset % 64) / 8 + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
4865
4866   /* Variable sized entities are always passed/returned in memory.  */
4867   if (bytes < 0)
4868     return 0;
4869
4870   if (mode != VOIDmode
4871       && targetm.calls.must_pass_in_stack (mode, type))
4872     return 0;
4873
4874   if (type && AGGREGATE_TYPE_P (type))
4875     {
4876       int i;
4877       tree field;
4878       enum x86_64_reg_class subclasses[MAX_CLASSES];
4879
4880       /* On x86-64 we pass structures larger than 32 bytes on the stack.  */
4881       if (bytes > 32)
4882         return 0;
4883
4884       for (i = 0; i < words; i++)
4885         classes[i] = X86_64_NO_CLASS;
4886
4887       /* Zero sized arrays or structures are NO_CLASS.  We return 0 to
4888          signalize memory class, so handle it as special case.  */
4889       if (!words)
4890         {
4891           classes[0] = X86_64_NO_CLASS;
4892           return 1;
4893         }
4894
4895       /* Classify each field of record and merge classes.  */
4896       switch (TREE_CODE (type))
4897         {
4898         case RECORD_TYPE:
4899           /* And now merge the fields of structure.  */
4900           for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
4901             {
4902               if (TREE_CODE (field) == FIELD_DECL)
4903                 {
4904                   int num;
4905
4906                   if (TREE_TYPE (field) == error_mark_node)
4907                     continue;
4908
4909                   /* Bitfields are always classified as integer.  Handle them
4910                      early, since later code would consider them to be
4911                      misaligned integers.  */
4912                   if (DECL_BIT_FIELD (field))
4913                     {
4914                       for (i = (int_bit_position (field) + (bit_offset % 64)) / 8 / 8;
4915                            i < ((int_bit_position (field) + (bit_offset % 64))
4916                                 + tree_low_cst (DECL_SIZE (field), 0)
4917                                 + 63) / 8 / 8; i++)
4918                         classes[i] =
4919                           merge_classes (X86_64_INTEGER_CLASS,
4920                                          classes[i]);
4921                     }
4922                   else
4923                     {
4924                       num = classify_argument (TYPE_MODE (TREE_TYPE (field)),
4925                                                TREE_TYPE (field), subclasses,
4926                                                (int_bit_position (field)
4927                                                 + bit_offset) % 256);
4928                       if (!num)
4929                         return 0;
4930                       for (i = 0; i < num; i++)
4931                         {
4932                           int pos =
4933                             (int_bit_position (field) + (bit_offset % 64)) / 8 / 8;
4934                           classes[i + pos] =
4935                             merge_classes (subclasses[i], classes[i + pos]);
4936                         }
4937                     }
4938                 }
4939             }
4940           break;
4941
4942         case ARRAY_TYPE:
4943           /* Arrays are handled as small records.  */
4944           {
4945             int num;
4946             num = classify_argument (TYPE_MODE (TREE_TYPE (type)),
4947                                      TREE_TYPE (type), subclasses, bit_offset);
4948             if (!num)
4949               return 0;
4950
4951             /* The partial classes are now full classes.  */
4952             if (subclasses[0] == X86_64_SSESF_CLASS && bytes != 4)
4953               subclasses[0] = X86_64_SSE_CLASS;
4954             if (subclasses[0] == X86_64_INTEGERSI_CLASS
4955                 && !((bit_offset % 64) == 0 && bytes == 4))
4956               subclasses[0] = X86_64_INTEGER_CLASS;
4957
4958             for (i = 0; i < words; i++)
4959               classes[i] = subclasses[i % num];
4960
4961             break;
4962           }
4963         case UNION_TYPE:
4964         case QUAL_UNION_TYPE:
4965           /* Unions are similar to RECORD_TYPE but offset is always 0.
4966              */
4967           for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
4968             {
4969               if (TREE_CODE (field) == FIELD_DECL)
4970                 {
4971                   int num;
4972
4973                   if (TREE_TYPE (field) == error_mark_node)
4974                     continue;
4975
4976                   num = classify_argument (TYPE_MODE (TREE_TYPE (field)),
4977                                            TREE_TYPE (field), subclasses,
4978                                            bit_offset);
4979                   if (!num)
4980                     return 0;
4981                   for (i = 0; i < num; i++)
4982                     classes[i] = merge_classes (subclasses[i], classes[i]);
4983                 }
4984             }
4985           break;
4986
4987         default:
4988           gcc_unreachable ();
4989         }
4990
4991       if (words > 2)
4992         {
4993           /* When size > 16 bytes, if the first one isn't
4994              X86_64_SSE_CLASS or any other ones aren't
4995              X86_64_SSEUP_CLASS, everything should be passed in
4996              memory.  */
4997           if (classes[0] != X86_64_SSE_CLASS)
4998               return 0;
4999
5000           for (i = 1; i < words; i++)
5001             if (classes[i] != X86_64_SSEUP_CLASS)
5002               return 0;
5003         }
5004
5005       /* Final merger cleanup.  */
5006       for (i = 0; i < words; i++)
5007         {
5008           /* If one class is MEMORY, everything should be passed in
5009              memory.  */
5010           if (classes[i] == X86_64_MEMORY_CLASS)
5011             return 0;
5012
5013           /* The X86_64_SSEUP_CLASS should be always preceded by
5014              X86_64_SSE_CLASS or X86_64_SSEUP_CLASS.  */
5015           if (classes[i] == X86_64_SSEUP_CLASS
5016               && classes[i - 1] != X86_64_SSE_CLASS
5017               && classes[i - 1] != X86_64_SSEUP_CLASS)
5018             {
5019               /* The first one should never be X86_64_SSEUP_CLASS.  */
5020               gcc_assert (i != 0);
5021               classes[i] = X86_64_SSE_CLASS;
5022             }
5023
5024           /*  If X86_64_X87UP_CLASS isn't preceded by X86_64_X87_CLASS,
5025                everything should be passed in memory.  */
5026           if (classes[i] == X86_64_X87UP_CLASS
5027               && (classes[i - 1] != X86_64_X87_CLASS))
5028             {
5029               static bool warned;
5030
5031               /* The first one should never be X86_64_X87UP_CLASS.  */
5032               gcc_assert (i != 0);
5033               if (!warned && warn_psabi)
5034                 {
5035                   warned = true;
5036                   inform (input_location,
5037                           "The ABI of passing union with long double"
5038                           " has changed in GCC 4.4");
5039                 }
5040               return 0;
5041             }
5042         }
5043       return words;
5044     }
5045
5046   /* Compute alignment needed.  We align all types to natural boundaries with
5047      exception of XFmode that is aligned to 64bits.  */
5048   if (mode != VOIDmode && mode != BLKmode)
5049     {
5050       int mode_alignment = GET_MODE_BITSIZE (mode);
5051
5052       if (mode == XFmode)
5053         mode_alignment = 128;
5054       else if (mode == XCmode)
5055         mode_alignment = 256;
5056       if (COMPLEX_MODE_P (mode))
5057         mode_alignment /= 2;
5058       /* Misaligned fields are always returned in memory.  */
5059       if (bit_offset % mode_alignment)
5060         return 0;
5061     }
5062
5063   /* for V1xx modes, just use the base mode */
5064   if (VECTOR_MODE_P (mode) && mode != V1DImode
5065       && GET_MODE_SIZE (GET_MODE_INNER (mode)) == bytes)
5066     mode = GET_MODE_INNER (mode);
5067
5068   /* Classification of atomic types.  */
5069   switch (mode)
5070     {
5071     case SDmode:
5072     case DDmode:
5073       classes[0] = X86_64_SSE_CLASS;
5074       return 1;
5075     case TDmode:
5076       classes[0] = X86_64_SSE_CLASS;
5077       classes[1] = X86_64_SSEUP_CLASS;
5078       return 2;
5079     case DImode:
5080     case SImode:
5081     case HImode:
5082     case QImode:
5083     case CSImode:
5084     case CHImode:
5085     case CQImode:
5086       {
5087         int size = (bit_offset % 64)+ (int) GET_MODE_BITSIZE (mode);
5088
5089         if (size <= 32)
5090           {
5091             classes[0] = X86_64_INTEGERSI_CLASS;
5092             return 1;
5093           }
5094         else if (size <= 64)
5095           {
5096             classes[0] = X86_64_INTEGER_CLASS;
5097             return 1;
5098           }
5099         else if (size <= 64+32)
5100           {
5101             classes[0] = X86_64_INTEGER_CLASS;
5102             classes[1] = X86_64_INTEGERSI_CLASS;
5103             return 2;
5104           }
5105         else if (size <= 64+64)
5106           {
5107             classes[0] = classes[1] = X86_64_INTEGER_CLASS;
5108             return 2;
5109           }
5110         else
5111           gcc_unreachable ();
5112       }
5113     case CDImode:
5114     case TImode:
5115       classes[0] = classes[1] = X86_64_INTEGER_CLASS;
5116       return 2;
5117     case COImode:
5118     case OImode:
5119       /* OImode shouldn't be used directly.  */
5120       gcc_unreachable ();
5121     case CTImode:
5122       return 0;
5123     case SFmode:
5124       if (!(bit_offset % 64))
5125         classes[0] = X86_64_SSESF_CLASS;
5126       else
5127         classes[0] = X86_64_SSE_CLASS;
5128       return 1;
5129     case DFmode:
5130       classes[0] = X86_64_SSEDF_CLASS;
5131       return 1;
5132     case XFmode:
5133       classes[0] = X86_64_X87_CLASS;
5134       classes[1] = X86_64_X87UP_CLASS;
5135       return 2;
5136     case TFmode:
5137       classes[0] = X86_64_SSE_CLASS;
5138       classes[1] = X86_64_SSEUP_CLASS;
5139       return 2;
5140     case SCmode:
5141       classes[0] = X86_64_SSE_CLASS;
5142       return 1;
5143     case DCmode:
5144       classes[0] = X86_64_SSEDF_CLASS;
5145       classes[1] = X86_64_SSEDF_CLASS;
5146       return 2;
5147     case XCmode:
5148       classes[0] = X86_64_COMPLEX_X87_CLASS;
5149       return 1;
5150     case TCmode:
5151       /* This modes is larger than 16 bytes.  */
5152       return 0;
5153     case V8SFmode:
5154     case V8SImode:
5155     case V32QImode:
5156     case V16HImode:
5157     case V4DFmode:
5158     case V4DImode:
5159       classes[0] = X86_64_SSE_CLASS;
5160       classes[1] = X86_64_SSEUP_CLASS;
5161       classes[2] = X86_64_SSEUP_CLASS;
5162       classes[3] = X86_64_SSEUP_CLASS;
5163       return 4;
5164     case V4SFmode:
5165     case V4SImode:
5166     case V16QImode:
5167     case V8HImode:
5168     case V2DFmode:
5169     case V2DImode:
5170       classes[0] = X86_64_SSE_CLASS;
5171       classes[1] = X86_64_SSEUP_CLASS;
5172       return 2;
5173     case V1DImode:
5174     case V2SFmode:
5175     case V2SImode:
5176     case V4HImode:
5177     case V8QImode:
5178       classes[0] = X86_64_SSE_CLASS;
5179       return 1;
5180     case BLKmode:
5181     case VOIDmode:
5182       return 0;
5183     default:
5184       gcc_assert (VECTOR_MODE_P (mode));
5185
5186       if (bytes > 16)
5187         return 0;
5188
5189       gcc_assert (GET_MODE_CLASS (GET_MODE_INNER (mode)) == MODE_INT);
5190
5191       if (bit_offset + GET_MODE_BITSIZE (mode) <= 32)
5192         classes[0] = X86_64_INTEGERSI_CLASS;
5193       else
5194         classes[0] = X86_64_INTEGER_CLASS;
5195       classes[1] = X86_64_INTEGER_CLASS;
5196       return 1 + (bytes > 8);
5197     }
5198 }
5199
5200 /* Examine the argument and return set number of register required in each
5201    class.  Return 0 iff parameter should be passed in memory.  */
5202 static int
5203 examine_argument (enum machine_mode mode, const_tree type, int in_return,
5204                   int *int_nregs, int *sse_nregs)
5205 {
5206   enum x86_64_reg_class regclass[MAX_CLASSES];
5207   int n = classify_argument (mode, type, regclass, 0);
5208
5209   *int_nregs = 0;
5210   *sse_nregs = 0;
5211   if (!n)
5212     return 0;
5213   for (n--; n >= 0; n--)
5214     switch (regclass[n])
5215       {
5216       case X86_64_INTEGER_CLASS:
5217       case X86_64_INTEGERSI_CLASS:
5218         (*int_nregs)++;
5219         break;
5220       case X86_64_SSE_CLASS:
5221       case X86_64_SSESF_CLASS:
5222       case X86_64_SSEDF_CLASS:
5223         (*sse_nregs)++;
5224         break;
5225       case X86_64_NO_CLASS:
5226       case X86_64_SSEUP_CLASS:
5227         break;
5228       case X86_64_X87_CLASS:
5229       case X86_64_X87UP_CLASS:
5230         if (!in_return)
5231           return 0;
5232         break;
5233       case X86_64_COMPLEX_X87_CLASS:
5234         return in_return ? 2 : 0;
5235       case X86_64_MEMORY_CLASS:
5236         gcc_unreachable ();
5237       }
5238   return 1;
5239 }
5240
5241 /* Construct container for the argument used by GCC interface.  See
5242    FUNCTION_ARG for the detailed description.  */
5243
5244 static rtx
5245 construct_container (enum machine_mode mode, enum machine_mode orig_mode,
5246                      const_tree type, int in_return, int nintregs, int nsseregs,
5247                      const int *intreg, int sse_regno)
5248 {
5249   /* The following variables hold the static issued_error state.  */
5250   static bool issued_sse_arg_error;
5251   static bool issued_sse_ret_error;
5252   static bool issued_x87_ret_error;
5253
5254   enum machine_mode tmpmode;
5255   int bytes =
5256     (mode == BLKmode) ? int_size_in_bytes (type) : (int) GET_MODE_SIZE (mode);
5257   enum x86_64_reg_class regclass[MAX_CLASSES];
5258   int n;
5259   int i;
5260   int nexps = 0;
5261   int needed_sseregs, needed_intregs;
5262   rtx exp[MAX_CLASSES];
5263   rtx ret;
5264
5265   n = classify_argument (mode, type, regclass, 0);
5266   if (!n)
5267     return NULL;
5268   if (!examine_argument (mode, type, in_return, &needed_intregs,
5269                          &needed_sseregs))
5270     return NULL;
5271   if (needed_intregs > nintregs || needed_sseregs > nsseregs)
5272     return NULL;
5273
5274   /* We allowed the user to turn off SSE for kernel mode.  Don't crash if
5275      some less clueful developer tries to use floating-point anyway.  */
5276   if (needed_sseregs && !TARGET_SSE)
5277     {
5278       if (in_return)
5279         {
5280           if (!issued_sse_ret_error)
5281             {
5282               error ("SSE register return with SSE disabled");
5283               issued_sse_ret_error = true;
5284             }
5285         }
5286       else if (!issued_sse_arg_error)
5287         {
5288           error ("SSE register argument with SSE disabled");
5289           issued_sse_arg_error = true;
5290         }
5291       return NULL;
5292     }
5293
5294   /* Likewise, error if the ABI requires us to return values in the
5295      x87 registers and the user specified -mno-80387.  */
5296   if (!TARGET_80387 && in_return)
5297     for (i = 0; i < n; i++)
5298       if (regclass[i] == X86_64_X87_CLASS
5299           || regclass[i] == X86_64_X87UP_CLASS
5300           || regclass[i] == X86_64_COMPLEX_X87_CLASS)
5301         {
5302           if (!issued_x87_ret_error)
5303             {
5304               error ("x87 register return with x87 disabled");
5305               issued_x87_ret_error = true;
5306             }
5307           return NULL;
5308         }
5309
5310   /* First construct simple cases.  Avoid SCmode, since we want to use
5311      single register to pass this type.  */
5312   if (n == 1 && mode != SCmode)
5313     switch (regclass[0])
5314       {
5315       case X86_64_INTEGER_CLASS:
5316       case X86_64_INTEGERSI_CLASS:
5317         return gen_rtx_REG (mode, intreg[0]);
5318       case X86_64_SSE_CLASS:
5319       case X86_64_SSESF_CLASS:
5320       case X86_64_SSEDF_CLASS:
5321         return gen_reg_or_parallel (mode, orig_mode, SSE_REGNO (sse_regno));
5322       case X86_64_X87_CLASS:
5323       case X86_64_COMPLEX_X87_CLASS:
5324         return gen_rtx_REG (mode, FIRST_STACK_REG);
5325       case X86_64_NO_CLASS:
5326         /* Zero sized array, struct or class.  */
5327         return NULL;
5328       default:
5329         gcc_unreachable ();
5330       }
5331   if (n == 2 && regclass[0] == X86_64_SSE_CLASS
5332       && regclass[1] == X86_64_SSEUP_CLASS && mode != BLKmode)
5333     return gen_rtx_REG (mode, SSE_REGNO (sse_regno));
5334   if (n == 4
5335       && regclass[0] == X86_64_SSE_CLASS
5336       && regclass[1] == X86_64_SSEUP_CLASS
5337       && regclass[2] == X86_64_SSEUP_CLASS
5338       && regclass[3] == X86_64_SSEUP_CLASS
5339       && mode != BLKmode)
5340     return gen_rtx_REG (mode, SSE_REGNO (sse_regno));
5341
5342   if (n == 2
5343       && regclass[0] == X86_64_X87_CLASS && regclass[1] == X86_64_X87UP_CLASS)
5344     return gen_rtx_REG (XFmode, FIRST_STACK_REG);
5345   if (n == 2 && regclass[0] == X86_64_INTEGER_CLASS
5346       && regclass[1] == X86_64_INTEGER_CLASS
5347       && (mode == CDImode || mode == TImode || mode == TFmode)
5348       && intreg[0] + 1 == intreg[1])
5349     return gen_rtx_REG (mode, intreg[0]);
5350
5351   /* Otherwise figure out the entries of the PARALLEL.  */
5352   for (i = 0; i < n; i++)
5353     {
5354       int pos;
5355
5356       switch (regclass[i])
5357         {
5358           case X86_64_NO_CLASS:
5359             break;
5360           case X86_64_INTEGER_CLASS:
5361           case X86_64_INTEGERSI_CLASS:
5362             /* Merge TImodes on aligned occasions here too.  */
5363             if (i * 8 + 8 > bytes)
5364               tmpmode = mode_for_size ((bytes - i * 8) * BITS_PER_UNIT, MODE_INT, 0);
5365             else if (regclass[i] == X86_64_INTEGERSI_CLASS)
5366               tmpmode = SImode;
5367             else
5368               tmpmode = DImode;
5369             /* We've requested 24 bytes we don't have mode for.  Use DImode.  */
5370             if (tmpmode == BLKmode)
5371               tmpmode = DImode;
5372             exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
5373                                                gen_rtx_REG (tmpmode, *intreg),
5374                                                GEN_INT (i*8));
5375             intreg++;
5376             break;
5377           case X86_64_SSESF_CLASS:
5378             exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
5379                                                gen_rtx_REG (SFmode,
5380                                                             SSE_REGNO (sse_regno)),
5381                                                GEN_INT (i*8));
5382             sse_regno++;
5383             break;
5384           case X86_64_SSEDF_CLASS:
5385             exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
5386                                                gen_rtx_REG (DFmode,
5387                                                             SSE_REGNO (sse_regno)),
5388                                                GEN_INT (i*8));
5389             sse_regno++;
5390             break;
5391           case X86_64_SSE_CLASS:
5392             pos = i;
5393             switch (n)
5394               {
5395               case 1:
5396                 tmpmode = DImode;
5397                 break;
5398               case 2:
5399                 if (i == 0 && regclass[1] == X86_64_SSEUP_CLASS)
5400                   {
5401                     tmpmode = TImode;
5402                     i++;
5403                   }
5404                 else
5405                   tmpmode = DImode;
5406                 break;
5407               case 4:
5408                 gcc_assert (i == 0
5409                             && regclass[1] == X86_64_SSEUP_CLASS
5410                             && regclass[2] == X86_64_SSEUP_CLASS
5411                             && regclass[3] == X86_64_SSEUP_CLASS);
5412                 tmpmode = OImode;
5413                 i += 3;
5414                 break;
5415               default:
5416                 gcc_unreachable ();
5417               }
5418             exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
5419                                                gen_rtx_REG (tmpmode,
5420                                                             SSE_REGNO (sse_regno)),
5421                                                GEN_INT (pos*8));
5422             sse_regno++;
5423             break;
5424           default:
5425             gcc_unreachable ();
5426         }
5427     }
5428
5429   /* Empty aligned struct, union or class.  */
5430   if (nexps == 0)
5431     return NULL;
5432
5433   ret =  gen_rtx_PARALLEL (mode, rtvec_alloc (nexps));
5434   for (i = 0; i < nexps; i++)
5435     XVECEXP (ret, 0, i) = exp [i];
5436   return ret;
5437 }
5438
5439 /* Update the data in CUM to advance over an argument of mode MODE
5440    and data type TYPE.  (TYPE is null for libcalls where that information
5441    may not be available.)  */
5442
5443 static void
5444 function_arg_advance_32 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5445                          tree type, HOST_WIDE_INT bytes, HOST_WIDE_INT words)
5446 {
5447   switch (mode)
5448     {
5449     default:
5450       break;
5451
5452     case BLKmode:
5453       if (bytes < 0)
5454         break;
5455       /* FALLTHRU */
5456
5457     case DImode:
5458     case SImode:
5459     case HImode:
5460     case QImode:
5461       cum->words += words;
5462       cum->nregs -= words;
5463       cum->regno += words;
5464
5465       if (cum->nregs <= 0)
5466         {
5467           cum->nregs = 0;
5468           cum->regno = 0;
5469         }
5470       break;
5471
5472     case OImode:
5473       /* OImode shouldn't be used directly.  */
5474       gcc_unreachable ();
5475
5476     case DFmode:
5477       if (cum->float_in_sse < 2)
5478         break;
5479     case SFmode:
5480       if (cum->float_in_sse < 1)
5481         break;
5482       /* FALLTHRU */
5483
5484     case V8SFmode:
5485     case V8SImode:
5486     case V32QImode:
5487     case V16HImode:
5488     case V4DFmode:
5489     case V4DImode:
5490     case TImode:
5491     case V16QImode:
5492     case V8HImode:
5493     case V4SImode:
5494     case V2DImode:
5495     case V4SFmode:
5496     case V2DFmode:
5497       if (!type || !AGGREGATE_TYPE_P (type))
5498         {
5499           cum->sse_words += words;
5500           cum->sse_nregs -= 1;
5501           cum->sse_regno += 1;
5502           if (cum->sse_nregs <= 0)
5503             {
5504               cum->sse_nregs = 0;
5505               cum->sse_regno = 0;
5506             }
5507         }
5508       break;
5509
5510     case V8QImode:
5511     case V4HImode:
5512     case V2SImode:
5513     case V2SFmode:
5514     case V1DImode:
5515       if (!type || !AGGREGATE_TYPE_P (type))
5516         {
5517           cum->mmx_words += words;
5518           cum->mmx_nregs -= 1;
5519           cum->mmx_regno += 1;
5520           if (cum->mmx_nregs <= 0)
5521             {
5522               cum->mmx_nregs = 0;
5523               cum->mmx_regno = 0;
5524             }
5525         }
5526       break;
5527     }
5528 }
5529
5530 static void
5531 function_arg_advance_64 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5532                          tree type, HOST_WIDE_INT words, int named)
5533 {
5534   int int_nregs, sse_nregs;
5535
5536   /* Unnamed 256bit vector mode parameters are passed on stack.  */
5537   if (!named && VALID_AVX256_REG_MODE (mode))
5538     return;
5539
5540   if (!examine_argument (mode, type, 0, &int_nregs, &sse_nregs))
5541     cum->words += words;
5542   else if (sse_nregs <= cum->sse_nregs && int_nregs <= cum->nregs)
5543     {
5544       cum->nregs -= int_nregs;
5545       cum->sse_nregs -= sse_nregs;
5546       cum->regno += int_nregs;
5547       cum->sse_regno += sse_nregs;
5548     }
5549   else
5550     cum->words += words;
5551 }
5552
5553 static void
5554 function_arg_advance_ms_64 (CUMULATIVE_ARGS *cum, HOST_WIDE_INT bytes,
5555                             HOST_WIDE_INT words)
5556 {
5557   /* Otherwise, this should be passed indirect.  */
5558   gcc_assert (bytes == 1 || bytes == 2 || bytes == 4 || bytes == 8);
5559
5560   cum->words += words;
5561   if (cum->nregs > 0)
5562     {
5563       cum->nregs -= 1;
5564       cum->regno += 1;
5565     }
5566 }
5567
5568 void
5569 function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5570                       tree type, int named)
5571 {
5572   HOST_WIDE_INT bytes, words;
5573
5574   if (mode == BLKmode)
5575     bytes = int_size_in_bytes (type);
5576   else
5577     bytes = GET_MODE_SIZE (mode);
5578   words = (bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
5579
5580   if (type)
5581     mode = type_natural_mode (type, NULL);
5582
5583   if (TARGET_64BIT && (cum ? cum->call_abi : DEFAULT_ABI) == MS_ABI)
5584     function_arg_advance_ms_64 (cum, bytes, words);
5585   else if (TARGET_64BIT)
5586     function_arg_advance_64 (cum, mode, type, words, named);
5587   else
5588     function_arg_advance_32 (cum, mode, type, bytes, words);
5589 }
5590
5591 /* Define where to put the arguments to a function.
5592    Value is zero to push the argument on the stack,
5593    or a hard register in which to store the argument.
5594
5595    MODE is the argument's machine mode.
5596    TYPE is the data type of the argument (as a tree).
5597     This is null for libcalls where that information may
5598     not be available.
5599    CUM is a variable of type CUMULATIVE_ARGS which gives info about
5600     the preceding args and about the function being called.
5601    NAMED is nonzero if this argument is a named parameter
5602     (otherwise it is an extra parameter matching an ellipsis).  */
5603
5604 static rtx
5605 function_arg_32 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5606                  enum machine_mode orig_mode, tree type,
5607                  HOST_WIDE_INT bytes, HOST_WIDE_INT words)
5608 {
5609   static bool warnedsse, warnedmmx;
5610
5611   /* Avoid the AL settings for the Unix64 ABI.  */
5612   if (mode == VOIDmode)
5613     return constm1_rtx;
5614
5615   switch (mode)
5616     {
5617     default:
5618       break;
5619
5620     case BLKmode:
5621       if (bytes < 0)
5622         break;
5623       /* FALLTHRU */
5624     case DImode:
5625     case SImode:
5626     case HImode:
5627     case QImode:
5628       if (words <= cum->nregs)
5629         {
5630           int regno = cum->regno;
5631
5632           /* Fastcall allocates the first two DWORD (SImode) or
5633             smaller arguments to ECX and EDX if it isn't an
5634             aggregate type .  */
5635           if (cum->fastcall)
5636             {
5637               if (mode == BLKmode
5638                   || mode == DImode
5639                   || (type && AGGREGATE_TYPE_P (type)))
5640                 break;
5641
5642               /* ECX not EAX is the first allocated register.  */
5643               if (regno == AX_REG)
5644                 regno = CX_REG;
5645             }
5646           return gen_rtx_REG (mode, regno);
5647         }
5648       break;
5649
5650     case DFmode:
5651       if (cum->float_in_sse < 2)
5652         break;
5653     case SFmode:
5654       if (cum->float_in_sse < 1)
5655         break;
5656       /* FALLTHRU */
5657     case TImode:
5658       /* In 32bit, we pass TImode in xmm registers.  */
5659     case V16QImode:
5660     case V8HImode:
5661     case V4SImode:
5662     case V2DImode:
5663     case V4SFmode:
5664     case V2DFmode:
5665       if (!type || !AGGREGATE_TYPE_P (type))
5666         {
5667           if (!TARGET_SSE && !warnedsse && cum->warn_sse)
5668             {
5669               warnedsse = true;
5670               warning (0, "SSE vector argument without SSE enabled "
5671                        "changes the ABI");
5672             }
5673           if (cum->sse_nregs)
5674             return gen_reg_or_parallel (mode, orig_mode,
5675                                         cum->sse_regno + FIRST_SSE_REG);
5676         }
5677       break;
5678
5679     case OImode:
5680       /* OImode shouldn't be used directly.  */
5681       gcc_unreachable ();
5682
5683     case V8SFmode:
5684     case V8SImode:
5685     case V32QImode:
5686     case V16HImode:
5687     case V4DFmode:
5688     case V4DImode:
5689       if (!type || !AGGREGATE_TYPE_P (type))
5690         {
5691           if (cum->sse_nregs)
5692             return gen_reg_or_parallel (mode, orig_mode,
5693                                         cum->sse_regno + FIRST_SSE_REG);
5694         }
5695       break;
5696
5697     case V8QImode:
5698     case V4HImode:
5699     case V2SImode:
5700     case V2SFmode:
5701     case V1DImode:
5702       if (!type || !AGGREGATE_TYPE_P (type))
5703         {
5704           if (!TARGET_MMX && !warnedmmx && cum->warn_mmx)
5705             {
5706               warnedmmx = true;
5707               warning (0, "MMX vector argument without MMX enabled "
5708                        "changes the ABI");
5709             }
5710           if (cum->mmx_nregs)
5711             return gen_reg_or_parallel (mode, orig_mode,
5712                                         cum->mmx_regno + FIRST_MMX_REG);
5713         }
5714       break;
5715     }
5716
5717   return NULL_RTX;
5718 }
5719
5720 static rtx
5721 function_arg_64 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5722                  enum machine_mode orig_mode, tree type, int named)
5723 {
5724   /* Handle a hidden AL argument containing number of registers
5725      for varargs x86-64 functions.  */
5726   if (mode == VOIDmode)
5727     return GEN_INT (cum->maybe_vaarg
5728                     ? (cum->sse_nregs < 0
5729                        ? (cum->call_abi == DEFAULT_ABI
5730                           ? SSE_REGPARM_MAX
5731                           : (DEFAULT_ABI != SYSV_ABI ? X86_64_SSE_REGPARM_MAX
5732                                                      : X64_SSE_REGPARM_MAX))
5733                : cum->sse_regno)
5734                     : -1);
5735
5736   switch (mode)
5737     {
5738     default:
5739       break;
5740
5741     case V8SFmode:
5742     case V8SImode:
5743     case V32QImode:
5744     case V16HImode:
5745     case V4DFmode:
5746     case V4DImode:
5747       /* Unnamed 256bit vector mode parameters are passed on stack.  */
5748       if (!named)
5749         return NULL;
5750       break;
5751     }
5752
5753   return construct_container (mode, orig_mode, type, 0, cum->nregs,
5754                               cum->sse_nregs,
5755                               &x86_64_int_parameter_registers [cum->regno],
5756                               cum->sse_regno);
5757 }
5758
5759 static rtx
5760 function_arg_ms_64 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5761                     enum machine_mode orig_mode, int named,
5762                     HOST_WIDE_INT bytes)
5763 {
5764   unsigned int regno;
5765
5766   /* We need to add clobber for MS_ABI->SYSV ABI calls in expand_call.
5767      We use value of -2 to specify that current function call is MSABI.  */
5768   if (mode == VOIDmode)
5769     return GEN_INT (-2);
5770
5771   /* If we've run out of registers, it goes on the stack.  */
5772   if (cum->nregs == 0)
5773     return NULL_RTX;
5774
5775   regno = x86_64_ms_abi_int_parameter_registers[cum->regno];
5776
5777   /* Only floating point modes are passed in anything but integer regs.  */
5778   if (TARGET_SSE && (mode == SFmode || mode == DFmode))
5779     {
5780       if (named)
5781         regno = cum->regno + FIRST_SSE_REG;
5782       else
5783         {
5784           rtx t1, t2;
5785
5786           /* Unnamed floating parameters are passed in both the
5787              SSE and integer registers.  */
5788           t1 = gen_rtx_REG (mode, cum->regno + FIRST_SSE_REG);
5789           t2 = gen_rtx_REG (mode, regno);
5790           t1 = gen_rtx_EXPR_LIST (VOIDmode, t1, const0_rtx);
5791           t2 = gen_rtx_EXPR_LIST (VOIDmode, t2, const0_rtx);
5792           return gen_rtx_PARALLEL (mode, gen_rtvec (2, t1, t2));
5793         }
5794     }
5795   /* Handle aggregated types passed in register.  */
5796   if (orig_mode == BLKmode)
5797     {
5798       if (bytes > 0 && bytes <= 8)
5799         mode = (bytes > 4 ? DImode : SImode);
5800       if (mode == BLKmode)
5801         mode = DImode;
5802     }
5803
5804   return gen_reg_or_parallel (mode, orig_mode, regno);
5805 }
5806
5807 rtx
5808 function_arg (CUMULATIVE_ARGS *cum, enum machine_mode omode,
5809               tree type, int named)
5810 {
5811   enum machine_mode mode = omode;
5812   HOST_WIDE_INT bytes, words;
5813
5814   if (mode == BLKmode)
5815     bytes = int_size_in_bytes (type);
5816   else
5817     bytes = GET_MODE_SIZE (mode);
5818   words = (bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
5819
5820   /* To simplify the code below, represent vector types with a vector mode
5821      even if MMX/SSE are not active.  */
5822   if (type && TREE_CODE (type) == VECTOR_TYPE)
5823     mode = type_natural_mode (type, cum);
5824
5825   if (TARGET_64BIT && (cum ? cum->call_abi : DEFAULT_ABI) == MS_ABI)
5826     return function_arg_ms_64 (cum, mode, omode, named, bytes);
5827   else if (TARGET_64BIT)
5828     return function_arg_64 (cum, mode, omode, type, named);
5829   else
5830     return function_arg_32 (cum, mode, omode, type, bytes, words);
5831 }
5832
5833 /* A C expression that indicates when an argument must be passed by
5834    reference.  If nonzero for an argument, a copy of that argument is
5835    made in memory and a pointer to the argument is passed instead of
5836    the argument itself.  The pointer is passed in whatever way is
5837    appropriate for passing a pointer to that type.  */
5838
5839 static bool
5840 ix86_pass_by_reference (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
5841                         enum machine_mode mode ATTRIBUTE_UNUSED,
5842                         const_tree type, bool named ATTRIBUTE_UNUSED)
5843 {
5844   /* See Windows x64 Software Convention.  */
5845   if (TARGET_64BIT && (cum ? cum->call_abi : DEFAULT_ABI) == MS_ABI)
5846     {
5847       int msize = (int) GET_MODE_SIZE (mode);
5848       if (type)
5849         {
5850           /* Arrays are passed by reference.  */
5851           if (TREE_CODE (type) == ARRAY_TYPE)
5852             return true;
5853
5854           if (AGGREGATE_TYPE_P (type))
5855             {
5856               /* Structs/unions of sizes other than 8, 16, 32, or 64 bits
5857                  are passed by reference.  */
5858               msize = int_size_in_bytes (type);
5859             }
5860         }
5861
5862       /* __m128 is passed by reference.  */
5863       switch (msize) {
5864       case 1: case 2: case 4: case 8:
5865         break;
5866       default:
5867         return true;
5868       }
5869     }
5870   else if (TARGET_64BIT && type && int_size_in_bytes (type) == -1)
5871     return 1;
5872
5873   return 0;
5874 }
5875
5876 /* Return true when TYPE should be 128bit aligned for 32bit argument passing
5877    ABI.  */
5878 static bool
5879 contains_aligned_value_p (tree type)
5880 {
5881   enum machine_mode mode = TYPE_MODE (type);
5882   if (((TARGET_SSE && SSE_REG_MODE_P (mode))
5883        || mode == TDmode
5884        || mode == TFmode
5885        || mode == TCmode)
5886       && (!TYPE_USER_ALIGN (type) || TYPE_ALIGN (type) > 128))
5887     return true;
5888   if (TYPE_ALIGN (type) < 128)
5889     return false;
5890
5891   if (AGGREGATE_TYPE_P (type))
5892     {
5893       /* Walk the aggregates recursively.  */
5894       switch (TREE_CODE (type))
5895         {
5896         case RECORD_TYPE:
5897         case UNION_TYPE:
5898         case QUAL_UNION_TYPE:
5899           {
5900             tree field;
5901
5902             /* Walk all the structure fields.  */
5903             for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
5904               {
5905                 if (TREE_CODE (field) == FIELD_DECL
5906                     && contains_aligned_value_p (TREE_TYPE (field)))
5907                   return true;
5908               }
5909             break;
5910           }
5911
5912         case ARRAY_TYPE:
5913           /* Just for use if some languages passes arrays by value.  */
5914           if (contains_aligned_value_p (TREE_TYPE (type)))
5915             return true;
5916           break;
5917
5918         default:
5919           gcc_unreachable ();
5920         }
5921     }
5922   return false;
5923 }
5924
5925 /* Gives the alignment boundary, in bits, of an argument with the
5926    specified mode and type.  */
5927
5928 int
5929 ix86_function_arg_boundary (enum machine_mode mode, tree type)
5930 {
5931   int align;
5932   if (type)
5933     {
5934       /* Since canonical type is used for call, we convert it to
5935          canonical type if needed.  */
5936       if (!TYPE_STRUCTURAL_EQUALITY_P (type))
5937         type = TYPE_CANONICAL (type);
5938       align = TYPE_ALIGN (type);
5939     }
5940   else
5941     align = GET_MODE_ALIGNMENT (mode);
5942   if (align < PARM_BOUNDARY)
5943     align = PARM_BOUNDARY;
5944   /* In 32bit, only _Decimal128 and __float128 are aligned to their
5945      natural boundaries.  */
5946   if (!TARGET_64BIT && mode != TDmode && mode != TFmode)
5947     {
5948       /* i386 ABI defines all arguments to be 4 byte aligned.  We have to
5949          make an exception for SSE modes since these require 128bit
5950          alignment.
5951
5952          The handling here differs from field_alignment.  ICC aligns MMX
5953          arguments to 4 byte boundaries, while structure fields are aligned
5954          to 8 byte boundaries.  */
5955       if (!type)
5956         {
5957           if (!(TARGET_SSE && SSE_REG_MODE_P (mode)))
5958             align = PARM_BOUNDARY;
5959         }
5960       else
5961         {
5962           if (!contains_aligned_value_p (type))
5963             align = PARM_BOUNDARY;
5964         }
5965     }
5966   if (align > BIGGEST_ALIGNMENT)
5967     align = BIGGEST_ALIGNMENT;
5968   return align;
5969 }
5970
5971 /* Return true if N is a possible register number of function value.  */
5972
5973 bool
5974 ix86_function_value_regno_p (int regno)
5975 {
5976   switch (regno)
5977     {
5978     case 0:
5979       return true;
5980
5981     case FIRST_FLOAT_REG:
5982       /* TODO: The function should depend on current function ABI but
5983        builtins.c would need updating then. Therefore we use the
5984        default ABI.  */
5985       if (TARGET_64BIT && DEFAULT_ABI == MS_ABI)
5986         return false;
5987       return TARGET_FLOAT_RETURNS_IN_80387;
5988
5989     case FIRST_SSE_REG:
5990       return TARGET_SSE;
5991
5992     case FIRST_MMX_REG:
5993       if (TARGET_MACHO || TARGET_64BIT)
5994         return false;
5995       return TARGET_MMX;
5996     }
5997
5998   return false;
5999 }
6000
6001 /* Define how to find the value returned by a function.
6002    VALTYPE is the data type of the value (as a tree).
6003    If the precise function being called is known, FUNC is its FUNCTION_DECL;
6004    otherwise, FUNC is 0.  */
6005
6006 static rtx
6007 function_value_32 (enum machine_mode orig_mode, enum machine_mode mode,
6008                    const_tree fntype, const_tree fn)
6009 {
6010   unsigned int regno;
6011
6012   /* 8-byte vector modes in %mm0. See ix86_return_in_memory for where
6013      we normally prevent this case when mmx is not available.  However
6014      some ABIs may require the result to be returned like DImode.  */
6015   if (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 8)
6016     regno = TARGET_MMX ? FIRST_MMX_REG : 0;
6017
6018   /* 16-byte vector modes in %xmm0.  See ix86_return_in_memory for where
6019      we prevent this case when sse is not available.  However some ABIs
6020      may require the result to be returned like integer TImode.  */
6021   else if (mode == TImode
6022            || (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 16))
6023     regno = TARGET_SSE ? FIRST_SSE_REG : 0;
6024
6025   /* 32-byte vector modes in %ymm0.   */
6026   else if (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 32)
6027     regno = TARGET_AVX ? FIRST_SSE_REG : 0;
6028
6029   /* Floating point return values in %st(0) (unless -mno-fp-ret-in-387).  */
6030   else if (X87_FLOAT_MODE_P (mode) && TARGET_FLOAT_RETURNS_IN_80387)
6031     regno = FIRST_FLOAT_REG;
6032   else
6033     /* Most things go in %eax.  */
6034     regno = AX_REG;
6035
6036   /* Override FP return register with %xmm0 for local functions when
6037      SSE math is enabled or for functions with sseregparm attribute.  */
6038   if ((fn || fntype) && (mode == SFmode || mode == DFmode))
6039     {
6040       int sse_level = ix86_function_sseregparm (fntype, fn, false);
6041       if ((sse_level >= 1 && mode == SFmode)
6042           || (sse_level == 2 && mode == DFmode))
6043         regno = FIRST_SSE_REG;
6044     }
6045
6046   /* OImode shouldn't be used directly.  */
6047   gcc_assert (mode != OImode);
6048
6049   return gen_rtx_REG (orig_mode, regno);
6050 }
6051
6052 static rtx
6053 function_value_64 (enum machine_mode orig_mode, enum machine_mode mode,
6054                    const_tree valtype)
6055 {
6056   rtx ret;
6057
6058   /* Handle libcalls, which don't provide a type node.  */
6059   if (valtype == NULL)
6060     {
6061       switch (mode)
6062         {
6063         case SFmode:
6064         case SCmode:
6065         case DFmode:
6066         case DCmode:
6067         case TFmode:
6068         case SDmode:
6069         case DDmode:
6070         case TDmode:
6071           return gen_rtx_REG (mode, FIRST_SSE_REG);
6072         case XFmode:
6073         case XCmode:
6074           return gen_rtx_REG (mode, FIRST_FLOAT_REG);
6075         case TCmode:
6076           return NULL;
6077         default:
6078           return gen_rtx_REG (mode, AX_REG);
6079         }
6080     }
6081
6082   ret = construct_container (mode, orig_mode, valtype, 1,
6083                              X86_64_REGPARM_MAX, X86_64_SSE_REGPARM_MAX,
6084                              x86_64_int_return_registers, 0);
6085
6086   /* For zero sized structures, construct_container returns NULL, but we
6087      need to keep rest of compiler happy by returning meaningful value.  */
6088   if (!ret)
6089     ret = gen_rtx_REG (orig_mode, AX_REG);
6090
6091   return ret;
6092 }
6093
6094 static rtx
6095 function_value_ms_64 (enum machine_mode orig_mode, enum machine_mode mode)
6096 {
6097   unsigned int regno = AX_REG;
6098
6099   if (TARGET_SSE)
6100     {
6101       switch (GET_MODE_SIZE (mode))
6102         {
6103         case 16:
6104           if((SCALAR_INT_MODE_P (mode) || VECTOR_MODE_P (mode))
6105              && !COMPLEX_MODE_P (mode))
6106             regno = FIRST_SSE_REG;
6107           break;
6108         case 8:
6109         case 4:
6110           if (mode == SFmode || mode == DFmode)
6111             regno = FIRST_SSE_REG;
6112           break;
6113         default:
6114           break;
6115         }
6116     }
6117   return gen_rtx_REG (orig_mode, regno);
6118 }
6119
6120 static rtx
6121 ix86_function_value_1 (const_tree valtype, const_tree fntype_or_decl,
6122                        enum machine_mode orig_mode, enum machine_mode mode)
6123 {
6124   const_tree fn, fntype;
6125
6126   fn = NULL_TREE;
6127   if (fntype_or_decl && DECL_P (fntype_or_decl))
6128     fn = fntype_or_decl;
6129   fntype = fn ? TREE_TYPE (fn) : fntype_or_decl;
6130
6131   if (TARGET_64BIT && ix86_function_type_abi (fntype) == MS_ABI)
6132     return function_value_ms_64 (orig_mode, mode);
6133   else if (TARGET_64BIT)
6134     return function_value_64 (orig_mode, mode, valtype);
6135   else
6136     return function_value_32 (orig_mode, mode, fntype, fn);
6137 }
6138
6139 static rtx
6140 ix86_function_value (const_tree valtype, const_tree fntype_or_decl,
6141                      bool outgoing ATTRIBUTE_UNUSED)
6142 {
6143   enum machine_mode mode, orig_mode;
6144
6145   orig_mode = TYPE_MODE (valtype);
6146   mode = type_natural_mode (valtype, NULL);
6147   return ix86_function_value_1 (valtype, fntype_or_decl, orig_mode, mode);
6148 }
6149
6150 rtx
6151 ix86_libcall_value (enum machine_mode mode)
6152 {
6153   return ix86_function_value_1 (NULL, NULL, mode, mode);
6154 }
6155
6156 /* Return true iff type is returned in memory.  */
6157
6158 static int ATTRIBUTE_UNUSED
6159 return_in_memory_32 (const_tree type, enum machine_mode mode)
6160 {
6161   HOST_WIDE_INT size;
6162
6163   if (mode == BLKmode)
6164     return 1;
6165
6166   size = int_size_in_bytes (type);
6167
6168   if (MS_AGGREGATE_RETURN && AGGREGATE_TYPE_P (type) && size <= 8)
6169     return 0;
6170
6171   if (VECTOR_MODE_P (mode) || mode == TImode)
6172     {
6173       /* User-created vectors small enough to fit in EAX.  */
6174       if (size < 8)
6175         return 0;
6176
6177       /* MMX/3dNow values are returned in MM0,
6178          except when it doesn't exits.  */
6179       if (size == 8)
6180         return (TARGET_MMX ? 0 : 1);
6181
6182       /* SSE values are returned in XMM0, except when it doesn't exist.  */
6183       if (size == 16)
6184         return (TARGET_SSE ? 0 : 1);
6185
6186       /* AVX values are returned in YMM0, except when it doesn't exist.  */
6187       if (size == 32)
6188         return TARGET_AVX ? 0 : 1;
6189     }
6190
6191   if (mode == XFmode)
6192     return 0;
6193
6194   if (size > 12)
6195     return 1;
6196
6197   /* OImode shouldn't be used directly.  */
6198   gcc_assert (mode != OImode);
6199
6200   return 0;
6201 }
6202
6203 static int ATTRIBUTE_UNUSED
6204 return_in_memory_64 (const_tree type, enum machine_mode mode)
6205 {
6206   int needed_intregs, needed_sseregs;
6207   return !examine_argument (mode, type, 1, &needed_intregs, &needed_sseregs);
6208 }
6209
6210 static int ATTRIBUTE_UNUSED
6211 return_in_memory_ms_64 (const_tree type, enum machine_mode mode)
6212 {
6213   HOST_WIDE_INT size = int_size_in_bytes (type);
6214
6215   /* __m128 is returned in xmm0.  */
6216   if ((SCALAR_INT_MODE_P (mode) || VECTOR_MODE_P (mode))
6217       && !COMPLEX_MODE_P (mode) && (GET_MODE_SIZE (mode) == 16 || size == 16))
6218     return 0;
6219
6220   /* Otherwise, the size must be exactly in [1248]. */
6221   return (size != 1 && size != 2 && size != 4 && size != 8);
6222 }
6223
6224 static bool
6225 ix86_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
6226 {
6227 #ifdef SUBTARGET_RETURN_IN_MEMORY
6228   return SUBTARGET_RETURN_IN_MEMORY (type, fntype);
6229 #else
6230   const enum machine_mode mode = type_natural_mode (type, NULL);
6231  
6232   if (TARGET_64BIT)
6233     {
6234       if (ix86_function_type_abi (fntype) == MS_ABI)
6235         return return_in_memory_ms_64 (type, mode);
6236       else
6237         return return_in_memory_64 (type, mode);
6238     }
6239   else
6240     return return_in_memory_32 (type, mode);
6241 #endif
6242 }
6243
6244 /* Return false iff TYPE is returned in memory.  This version is used
6245    on Solaris 10.  It is similar to the generic ix86_return_in_memory,
6246    but differs notably in that when MMX is available, 8-byte vectors
6247    are returned in memory, rather than in MMX registers.  */
6248
6249 bool
6250 ix86_sol10_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
6251 {
6252   int size;
6253   enum machine_mode mode = type_natural_mode (type, NULL);
6254
6255   if (TARGET_64BIT)
6256     return return_in_memory_64 (type, mode);
6257
6258   if (mode == BLKmode)
6259     return 1;
6260
6261   size = int_size_in_bytes (type);
6262
6263   if (VECTOR_MODE_P (mode))
6264     {
6265       /* Return in memory only if MMX registers *are* available.  This
6266          seems backwards, but it is consistent with the existing
6267          Solaris x86 ABI.  */
6268       if (size == 8)
6269         return TARGET_MMX;
6270       if (size == 16)
6271         return !TARGET_SSE;
6272     }
6273   else if (mode == TImode)
6274     return !TARGET_SSE;
6275   else if (mode == XFmode)
6276     return 0;
6277
6278   return size > 12;
6279 }
6280
6281 /* When returning SSE vector types, we have a choice of either
6282      (1) being abi incompatible with a -march switch, or
6283      (2) generating an error.
6284    Given no good solution, I think the safest thing is one warning.
6285    The user won't be able to use -Werror, but....
6286
6287    Choose the STRUCT_VALUE_RTX hook because that's (at present) only
6288    called in response to actually generating a caller or callee that
6289    uses such a type.  As opposed to TARGET_RETURN_IN_MEMORY, which is called
6290    via aggregate_value_p for general type probing from tree-ssa.  */
6291
6292 static rtx
6293 ix86_struct_value_rtx (tree type, int incoming ATTRIBUTE_UNUSED)
6294 {
6295   static bool warnedsse, warnedmmx;
6296
6297   if (!TARGET_64BIT && type)
6298     {
6299       /* Look at the return type of the function, not the function type.  */
6300       enum machine_mode mode = TYPE_MODE (TREE_TYPE (type));
6301
6302       if (!TARGET_SSE && !warnedsse)
6303         {
6304           if (mode == TImode
6305               || (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 16))
6306             {
6307               warnedsse = true;
6308               warning (0, "SSE vector return without SSE enabled "
6309                        "changes the ABI");
6310             }
6311         }
6312
6313       if (!TARGET_MMX && !warnedmmx)
6314         {
6315           if (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 8)
6316             {
6317               warnedmmx = true;
6318               warning (0, "MMX vector return without MMX enabled "
6319                        "changes the ABI");
6320             }
6321         }
6322     }
6323
6324   return NULL;
6325 }
6326
6327 \f
6328 /* Create the va_list data type.  */
6329
6330 /* Returns the calling convention specific va_list date type.
6331    The argument ABI can be DEFAULT_ABI, MS_ABI, or SYSV_ABI.  */
6332
6333 static tree
6334 ix86_build_builtin_va_list_abi (enum calling_abi abi)
6335 {
6336   tree f_gpr, f_fpr, f_ovf, f_sav, record, type_decl;
6337
6338   /* For i386 we use plain pointer to argument area.  */
6339   if (!TARGET_64BIT || abi == MS_ABI)
6340     return build_pointer_type (char_type_node);
6341
6342   record = (*lang_hooks.types.make_type) (RECORD_TYPE);
6343   type_decl = build_decl (TYPE_DECL, get_identifier ("__va_list_tag"), record);
6344
6345   f_gpr = build_decl (FIELD_DECL, get_identifier ("gp_offset"),
6346                       unsigned_type_node);
6347   f_fpr = build_decl (FIELD_DECL, get_identifier ("fp_offset"),
6348                       unsigned_type_node);
6349   f_ovf = build_decl (FIELD_DECL, get_identifier ("overflow_arg_area"),
6350                       ptr_type_node);
6351   f_sav = build_decl (FIELD_DECL, get_identifier ("reg_save_area"),
6352                       ptr_type_node);
6353
6354   va_list_gpr_counter_field = f_gpr;
6355   va_list_fpr_counter_field = f_fpr;
6356
6357   DECL_FIELD_CONTEXT (f_gpr) = record;
6358   DECL_FIELD_CONTEXT (f_fpr) = record;
6359   DECL_FIELD_CONTEXT (f_ovf) = record;
6360   DECL_FIELD_CONTEXT (f_sav) = record;
6361
6362   TREE_CHAIN (record) = type_decl;
6363   TYPE_NAME (record) = type_decl;
6364   TYPE_FIELDS (record) = f_gpr;
6365   TREE_CHAIN (f_gpr) = f_fpr;
6366   TREE_CHAIN (f_fpr) = f_ovf;
6367   TREE_CHAIN (f_ovf) = f_sav;
6368
6369   layout_type (record);
6370
6371   /* The correct type is an array type of one element.  */
6372   return build_array_type (record, build_index_type (size_zero_node));
6373 }
6374
6375 /* Setup the builtin va_list data type and for 64-bit the additional
6376    calling convention specific va_list data types.  */
6377
6378 static tree
6379 ix86_build_builtin_va_list (void)
6380 {
6381   tree ret = ix86_build_builtin_va_list_abi (DEFAULT_ABI);
6382
6383   /* Initialize abi specific va_list builtin types.  */
6384   if (TARGET_64BIT)
6385     {
6386       tree t;
6387       if (DEFAULT_ABI == MS_ABI)
6388         {
6389           t = ix86_build_builtin_va_list_abi (SYSV_ABI);
6390           if (TREE_CODE (t) != RECORD_TYPE)
6391             t = build_variant_type_copy (t);
6392           sysv_va_list_type_node = t;
6393         }
6394       else
6395         {
6396           t = ret;
6397           if (TREE_CODE (t) != RECORD_TYPE)
6398             t = build_variant_type_copy (t);
6399           sysv_va_list_type_node = t;
6400         }
6401       if (DEFAULT_ABI != MS_ABI)
6402         {
6403           t = ix86_build_builtin_va_list_abi (MS_ABI);
6404           if (TREE_CODE (t) != RECORD_TYPE)
6405             t = build_variant_type_copy (t);
6406           ms_va_list_type_node = t;
6407         }
6408       else
6409         {
6410           t = ret;
6411           if (TREE_CODE (t) != RECORD_TYPE)
6412             t = build_variant_type_copy (t);
6413           ms_va_list_type_node = t;
6414         }
6415     }
6416
6417   return ret;
6418 }
6419
6420 /* Worker function for TARGET_SETUP_INCOMING_VARARGS.  */
6421
6422 static void
6423 setup_incoming_varargs_64 (CUMULATIVE_ARGS *cum)
6424 {
6425   rtx save_area, mem;
6426   rtx label;
6427   rtx label_ref;
6428   rtx tmp_reg;
6429   rtx nsse_reg;
6430   alias_set_type set;
6431   int i;
6432   int regparm = ix86_regparm;
6433
6434   if (cum->call_abi != DEFAULT_ABI)
6435     regparm = DEFAULT_ABI != SYSV_ABI ? X86_64_REGPARM_MAX : X64_REGPARM_MAX;
6436
6437   /* GPR size of varargs save area.  */
6438   if (cfun->va_list_gpr_size)
6439     ix86_varargs_gpr_size = X86_64_REGPARM_MAX * UNITS_PER_WORD;
6440   else
6441     ix86_varargs_gpr_size = 0;
6442
6443   /* FPR size of varargs save area.  We don't need it if we don't pass
6444      anything in SSE registers.  */
6445   if (cum->sse_nregs && cfun->va_list_fpr_size)
6446     ix86_varargs_fpr_size = X86_64_SSE_REGPARM_MAX * 16;
6447   else
6448     ix86_varargs_fpr_size = 0;
6449
6450   if (! ix86_varargs_gpr_size && ! ix86_varargs_fpr_size)
6451     return;
6452
6453   save_area = frame_pointer_rtx;
6454   set = get_varargs_alias_set ();
6455
6456   for (i = cum->regno;
6457        i < regparm
6458        && i < cum->regno + cfun->va_list_gpr_size / UNITS_PER_WORD;
6459        i++)
6460     {
6461       mem = gen_rtx_MEM (Pmode,
6462                          plus_constant (save_area, i * UNITS_PER_WORD));
6463       MEM_NOTRAP_P (mem) = 1;
6464       set_mem_alias_set (mem, set);
6465       emit_move_insn (mem, gen_rtx_REG (Pmode,
6466                                         x86_64_int_parameter_registers[i]));
6467     }
6468
6469   if (ix86_varargs_fpr_size)
6470     {
6471       /* Now emit code to save SSE registers.  The AX parameter contains number
6472          of SSE parameter registers used to call this function.  We use
6473          sse_prologue_save insn template that produces computed jump across
6474          SSE saves.  We need some preparation work to get this working.  */
6475
6476       label = gen_label_rtx ();
6477       label_ref = gen_rtx_LABEL_REF (Pmode, label);
6478
6479       /* Compute address to jump to :
6480          label - eax*4 + nnamed_sse_arguments*4 Or
6481          label - eax*5 + nnamed_sse_arguments*5 for AVX.  */
6482       tmp_reg = gen_reg_rtx (Pmode);
6483       nsse_reg = gen_reg_rtx (Pmode);
6484       emit_insn (gen_zero_extendqidi2 (nsse_reg, gen_rtx_REG (QImode, AX_REG)));
6485       emit_insn (gen_rtx_SET (VOIDmode, tmp_reg,
6486                               gen_rtx_MULT (Pmode, nsse_reg,
6487                                             GEN_INT (4))));
6488
6489       /* vmovaps is one byte longer than movaps.  */
6490       if (TARGET_AVX)
6491         emit_insn (gen_rtx_SET (VOIDmode, tmp_reg,
6492                                 gen_rtx_PLUS (Pmode, tmp_reg,
6493                                               nsse_reg)));
6494
6495       if (cum->sse_regno)
6496         emit_move_insn
6497           (nsse_reg,
6498            gen_rtx_CONST (DImode,
6499                           gen_rtx_PLUS (DImode,
6500                                         label_ref,
6501                                         GEN_INT (cum->sse_regno
6502                                                  * (TARGET_AVX ? 5 : 4)))));
6503       else
6504         emit_move_insn (nsse_reg, label_ref);
6505       emit_insn (gen_subdi3 (nsse_reg, nsse_reg, tmp_reg));
6506
6507       /* Compute address of memory block we save into.  We always use pointer
6508          pointing 127 bytes after first byte to store - this is needed to keep
6509          instruction size limited by 4 bytes (5 bytes for AVX) with one
6510          byte displacement.  */
6511       tmp_reg = gen_reg_rtx (Pmode);
6512       emit_insn (gen_rtx_SET (VOIDmode, tmp_reg,
6513                               plus_constant (save_area,
6514                                              ix86_varargs_gpr_size + 127)));
6515       mem = gen_rtx_MEM (BLKmode, plus_constant (tmp_reg, -127));
6516       MEM_NOTRAP_P (mem) = 1;
6517       set_mem_alias_set (mem, set);
6518       set_mem_align (mem, BITS_PER_WORD);
6519
6520       /* And finally do the dirty job!  */
6521       emit_insn (gen_sse_prologue_save (mem, nsse_reg,
6522                                         GEN_INT (cum->sse_regno), label));
6523     }
6524 }
6525
6526 static void
6527 setup_incoming_varargs_ms_64 (CUMULATIVE_ARGS *cum)
6528 {
6529   alias_set_type set = get_varargs_alias_set ();
6530   int i;
6531
6532   for (i = cum->regno; i < X64_REGPARM_MAX; i++)
6533     {
6534       rtx reg, mem;
6535
6536       mem = gen_rtx_MEM (Pmode,
6537                          plus_constant (virtual_incoming_args_rtx,
6538                                         i * UNITS_PER_WORD));
6539       MEM_NOTRAP_P (mem) = 1;
6540       set_mem_alias_set (mem, set);
6541
6542       reg = gen_rtx_REG (Pmode, x86_64_ms_abi_int_parameter_registers[i]);
6543       emit_move_insn (mem, reg);
6544     }
6545 }
6546
6547 static void
6548 ix86_setup_incoming_varargs (CUMULATIVE_ARGS *cum, enum machine_mode mode,
6549                              tree type, int *pretend_size ATTRIBUTE_UNUSED,
6550                              int no_rtl)
6551 {
6552   CUMULATIVE_ARGS next_cum;
6553   tree fntype;
6554
6555   /* This argument doesn't appear to be used anymore.  Which is good,
6556      because the old code here didn't suppress rtl generation.  */
6557   gcc_assert (!no_rtl);
6558
6559   if (!TARGET_64BIT)
6560     return;
6561
6562   fntype = TREE_TYPE (current_function_decl);
6563
6564   /* For varargs, we do not want to skip the dummy va_dcl argument.
6565      For stdargs, we do want to skip the last named argument.  */
6566   next_cum = *cum;
6567   if (stdarg_p (fntype))
6568     function_arg_advance (&next_cum, mode, type, 1);
6569
6570   if (cum->call_abi == MS_ABI)
6571     setup_incoming_varargs_ms_64 (&next_cum);
6572   else
6573     setup_incoming_varargs_64 (&next_cum);
6574 }
6575
6576 /* Checks if TYPE is of kind va_list char *.  */
6577
6578 static bool
6579 is_va_list_char_pointer (tree type)
6580 {
6581   tree canonic;
6582
6583   /* For 32-bit it is always true.  */
6584   if (!TARGET_64BIT)
6585     return true;
6586   canonic = ix86_canonical_va_list_type (type);
6587   return (canonic == ms_va_list_type_node
6588           || (DEFAULT_ABI == MS_ABI && canonic == va_list_type_node));
6589 }
6590
6591 /* Implement va_start.  */
6592
6593 static void
6594 ix86_va_start (tree valist, rtx nextarg)
6595 {
6596   HOST_WIDE_INT words, n_gpr, n_fpr;
6597   tree f_gpr, f_fpr, f_ovf, f_sav;
6598   tree gpr, fpr, ovf, sav, t;
6599   tree type;
6600
6601   /* Only 64bit target needs something special.  */
6602   if (!TARGET_64BIT || is_va_list_char_pointer (TREE_TYPE (valist)))
6603     {
6604       std_expand_builtin_va_start (valist, nextarg);
6605       return;
6606     }
6607
6608   f_gpr = TYPE_FIELDS (TREE_TYPE (sysv_va_list_type_node));
6609   f_fpr = TREE_CHAIN (f_gpr);
6610   f_ovf = TREE_CHAIN (f_fpr);
6611   f_sav = TREE_CHAIN (f_ovf);
6612
6613   valist = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (valist)), valist);
6614   gpr = build3 (COMPONENT_REF, TREE_TYPE (f_gpr), valist, f_gpr, NULL_TREE);
6615   fpr = build3 (COMPONENT_REF, TREE_TYPE (f_fpr), valist, f_fpr, NULL_TREE);
6616   ovf = build3 (COMPONENT_REF, TREE_TYPE (f_ovf), valist, f_ovf, NULL_TREE);
6617   sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), valist, f_sav, NULL_TREE);
6618
6619   /* Count number of gp and fp argument registers used.  */
6620   words = crtl->args.info.words;
6621   n_gpr = crtl->args.info.regno;
6622   n_fpr = crtl->args.info.sse_regno;
6623
6624   if (cfun->va_list_gpr_size)
6625     {
6626       type = TREE_TYPE (gpr);
6627       t = build2 (MODIFY_EXPR, type,
6628                   gpr, build_int_cst (type, n_gpr * 8));
6629       TREE_SIDE_EFFECTS (t) = 1;
6630       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
6631     }
6632
6633   if (TARGET_SSE && cfun->va_list_fpr_size)
6634     {
6635       type = TREE_TYPE (fpr);
6636       t = build2 (MODIFY_EXPR, type, fpr,
6637                   build_int_cst (type, n_fpr * 16 + 8*X86_64_REGPARM_MAX));
6638       TREE_SIDE_EFFECTS (t) = 1;
6639       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
6640     }
6641
6642   /* Find the overflow area.  */
6643   type = TREE_TYPE (ovf);
6644   t = make_tree (type, crtl->args.internal_arg_pointer);
6645   if (words != 0)
6646     t = build2 (POINTER_PLUS_EXPR, type, t,
6647                 size_int (words * UNITS_PER_WORD));
6648   t = build2 (MODIFY_EXPR, type, ovf, t);
6649   TREE_SIDE_EFFECTS (t) = 1;
6650   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
6651
6652   if (ix86_varargs_gpr_size || ix86_varargs_fpr_size)
6653     {
6654       /* Find the register save area.
6655          Prologue of the function save it right above stack frame.  */
6656       type = TREE_TYPE (sav);
6657       t = make_tree (type, frame_pointer_rtx);
6658       if (!ix86_varargs_gpr_size)
6659         t = build2 (POINTER_PLUS_EXPR, type, t,
6660                     size_int (-8 * X86_64_REGPARM_MAX));
6661       t = build2 (MODIFY_EXPR, type, sav, t);
6662       TREE_SIDE_EFFECTS (t) = 1;
6663       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
6664     }
6665 }
6666
6667 /* Implement va_arg.  */
6668
6669 static tree
6670 ix86_gimplify_va_arg (tree valist, tree type, gimple_seq *pre_p,
6671                       gimple_seq *post_p)
6672 {
6673   static const int intreg[6] = { 0, 1, 2, 3, 4, 5 };
6674   tree f_gpr, f_fpr, f_ovf, f_sav;
6675   tree gpr, fpr, ovf, sav, t;
6676   int size, rsize;
6677   tree lab_false, lab_over = NULL_TREE;
6678   tree addr, t2;
6679   rtx container;
6680   int indirect_p = 0;
6681   tree ptrtype;
6682   enum machine_mode nat_mode;
6683   int arg_boundary;
6684
6685   /* Only 64bit target needs something special.  */
6686   if (!TARGET_64BIT || is_va_list_char_pointer (TREE_TYPE (valist)))
6687     return std_gimplify_va_arg_expr (valist, type, pre_p, post_p);
6688
6689   f_gpr = TYPE_FIELDS (TREE_TYPE (sysv_va_list_type_node));
6690   f_fpr = TREE_CHAIN (f_gpr);
6691   f_ovf = TREE_CHAIN (f_fpr);
6692   f_sav = TREE_CHAIN (f_ovf);
6693
6694   gpr = build3 (COMPONENT_REF, TREE_TYPE (f_gpr),
6695                 build_va_arg_indirect_ref (valist), f_gpr, NULL_TREE);
6696   valist = build_va_arg_indirect_ref (valist);
6697   fpr = build3 (COMPONENT_REF, TREE_TYPE (f_fpr), valist, f_fpr, NULL_TREE);
6698   ovf = build3 (COMPONENT_REF, TREE_TYPE (f_ovf), valist, f_ovf, NULL_TREE);
6699   sav = build3 (COMPONENT_REF, TREE_TYPE (f_sav), valist, f_sav, NULL_TREE);
6700
6701   indirect_p = pass_by_reference (NULL, TYPE_MODE (type), type, false);
6702   if (indirect_p)
6703     type = build_pointer_type (type);
6704   size = int_size_in_bytes (type);
6705   rsize = (size + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
6706
6707   nat_mode = type_natural_mode (type, NULL);
6708   switch (nat_mode)
6709     {
6710     case V8SFmode:
6711     case V8SImode:
6712     case V32QImode:
6713     case V16HImode:
6714     case V4DFmode:
6715     case V4DImode:
6716       /* Unnamed 256bit vector mode parameters are passed on stack.  */
6717       if (ix86_cfun_abi () == SYSV_ABI)
6718         {
6719           container = NULL;
6720           break;
6721         }
6722
6723     default:
6724       container = construct_container (nat_mode, TYPE_MODE (type),
6725                                        type, 0, X86_64_REGPARM_MAX,
6726                                        X86_64_SSE_REGPARM_MAX, intreg,
6727                                        0);
6728       break;
6729     }
6730
6731   /* Pull the value out of the saved registers.  */
6732
6733   addr = create_tmp_var (ptr_type_node, "addr");
6734   DECL_POINTER_ALIAS_SET (addr) = get_varargs_alias_set ();
6735
6736   if (container)
6737     {
6738       int needed_intregs, needed_sseregs;
6739       bool need_temp;
6740       tree int_addr, sse_addr;
6741
6742       lab_false = create_artificial_label ();
6743       lab_over = create_artificial_label ();
6744
6745       examine_argument (nat_mode, type, 0, &needed_intregs, &needed_sseregs);
6746
6747       need_temp = (!REG_P (container)
6748                    && ((needed_intregs && TYPE_ALIGN (type) > 64)
6749                        || TYPE_ALIGN (type) > 128));
6750
6751       /* In case we are passing structure, verify that it is consecutive block
6752          on the register save area.  If not we need to do moves.  */
6753       if (!need_temp && !REG_P (container))
6754         {
6755           /* Verify that all registers are strictly consecutive  */
6756           if (SSE_REGNO_P (REGNO (XEXP (XVECEXP (container, 0, 0), 0))))
6757             {
6758               int i;
6759
6760               for (i = 0; i < XVECLEN (container, 0) && !need_temp; i++)
6761                 {
6762                   rtx slot = XVECEXP (container, 0, i);
6763                   if (REGNO (XEXP (slot, 0)) != FIRST_SSE_REG + (unsigned int) i
6764                       || INTVAL (XEXP (slot, 1)) != i * 16)
6765                     need_temp = 1;
6766                 }
6767             }
6768           else
6769             {
6770               int i;
6771
6772               for (i = 0; i < XVECLEN (container, 0) && !need_temp; i++)
6773                 {
6774                   rtx slot = XVECEXP (container, 0, i);
6775                   if (REGNO (XEXP (slot, 0)) != (unsigned int) i
6776                       || INTVAL (XEXP (slot, 1)) != i * 8)
6777                     need_temp = 1;
6778                 }
6779             }
6780         }
6781       if (!need_temp)
6782         {
6783           int_addr = addr;
6784           sse_addr = addr;
6785         }
6786       else
6787         {
6788           int_addr = create_tmp_var (ptr_type_node, "int_addr");
6789           DECL_POINTER_ALIAS_SET (int_addr) = get_varargs_alias_set ();
6790           sse_addr = create_tmp_var (ptr_type_node, "sse_addr");
6791           DECL_POINTER_ALIAS_SET (sse_addr) = get_varargs_alias_set ();
6792         }
6793
6794       /* First ensure that we fit completely in registers.  */
6795       if (needed_intregs)
6796         {
6797           t = build_int_cst (TREE_TYPE (gpr),
6798                              (X86_64_REGPARM_MAX - needed_intregs + 1) * 8);
6799           t = build2 (GE_EXPR, boolean_type_node, gpr, t);
6800           t2 = build1 (GOTO_EXPR, void_type_node, lab_false);
6801           t = build3 (COND_EXPR, void_type_node, t, t2, NULL_TREE);
6802           gimplify_and_add (t, pre_p);
6803         }
6804       if (needed_sseregs)
6805         {
6806           t = build_int_cst (TREE_TYPE (fpr),
6807                              (X86_64_SSE_REGPARM_MAX - needed_sseregs + 1) * 16
6808                              + X86_64_REGPARM_MAX * 8);
6809           t = build2 (GE_EXPR, boolean_type_node, fpr, t);
6810           t2 = build1 (GOTO_EXPR, void_type_node, lab_false);
6811           t = build3 (COND_EXPR, void_type_node, t, t2, NULL_TREE);
6812           gimplify_and_add (t, pre_p);
6813         }
6814
6815       /* Compute index to start of area used for integer regs.  */
6816       if (needed_intregs)
6817         {
6818           /* int_addr = gpr + sav; */
6819           t = fold_convert (sizetype, gpr);
6820           t = build2 (POINTER_PLUS_EXPR, ptr_type_node, sav, t);
6821           gimplify_assign (int_addr, t, pre_p);
6822         }
6823       if (needed_sseregs)
6824         {
6825           /* sse_addr = fpr + sav; */
6826           t = fold_convert (sizetype, fpr);
6827           t = build2 (POINTER_PLUS_EXPR, ptr_type_node, sav, t);
6828           gimplify_assign (sse_addr, t, pre_p);
6829         }
6830       if (need_temp)
6831         {
6832           int i;
6833           tree temp = create_tmp_var (type, "va_arg_tmp");
6834
6835           /* addr = &temp; */
6836           t = build1 (ADDR_EXPR, build_pointer_type (type), temp);
6837           gimplify_assign (addr, t, pre_p);
6838
6839           for (i = 0; i < XVECLEN (container, 0); i++)
6840             {
6841               rtx slot = XVECEXP (container, 0, i);
6842               rtx reg = XEXP (slot, 0);
6843               enum machine_mode mode = GET_MODE (reg);
6844               tree piece_type = lang_hooks.types.type_for_mode (mode, 1);
6845               tree addr_type = build_pointer_type (piece_type);
6846               tree daddr_type = build_pointer_type_for_mode (piece_type,
6847                                                              ptr_mode, true);
6848               tree src_addr, src;
6849               int src_offset;
6850               tree dest_addr, dest;
6851
6852               if (SSE_REGNO_P (REGNO (reg)))
6853                 {
6854                   src_addr = sse_addr;
6855                   src_offset = (REGNO (reg) - FIRST_SSE_REG) * 16;
6856                 }
6857               else
6858                 {
6859                   src_addr = int_addr;
6860                   src_offset = REGNO (reg) * 8;
6861                 }
6862               src_addr = fold_convert (addr_type, src_addr);
6863               src_addr = fold_build2 (POINTER_PLUS_EXPR, addr_type, src_addr,
6864                                       size_int (src_offset));
6865               src = build_va_arg_indirect_ref (src_addr);
6866
6867               dest_addr = fold_convert (daddr_type, addr);
6868               dest_addr = fold_build2 (POINTER_PLUS_EXPR, daddr_type, dest_addr,
6869                                        size_int (INTVAL (XEXP (slot, 1))));
6870               dest = build_va_arg_indirect_ref (dest_addr);
6871
6872               gimplify_assign (dest, src, pre_p);
6873             }
6874         }
6875
6876       if (needed_intregs)
6877         {
6878           t = build2 (PLUS_EXPR, TREE_TYPE (gpr), gpr,
6879                       build_int_cst (TREE_TYPE (gpr), needed_intregs * 8));
6880           gimplify_assign (gpr, t, pre_p);
6881         }
6882
6883       if (needed_sseregs)
6884         {
6885           t = build2 (PLUS_EXPR, TREE_TYPE (fpr), fpr,
6886                       build_int_cst (TREE_TYPE (fpr), needed_sseregs * 16));
6887           gimplify_assign (fpr, t, pre_p);
6888         }
6889
6890       gimple_seq_add_stmt (pre_p, gimple_build_goto (lab_over));
6891
6892       gimple_seq_add_stmt (pre_p, gimple_build_label (lab_false));
6893     }
6894
6895   /* ... otherwise out of the overflow area.  */
6896
6897   /* When we align parameter on stack for caller, if the parameter
6898      alignment is beyond MAX_SUPPORTED_STACK_ALIGNMENT, it will be
6899      aligned at MAX_SUPPORTED_STACK_ALIGNMENT.  We will match callee
6900      here with caller.  */
6901   arg_boundary = FUNCTION_ARG_BOUNDARY (VOIDmode, type);
6902   if ((unsigned int) arg_boundary > MAX_SUPPORTED_STACK_ALIGNMENT)
6903     arg_boundary = MAX_SUPPORTED_STACK_ALIGNMENT;
6904
6905   /* Care for on-stack alignment if needed.  */
6906   if (arg_boundary <= 64
6907       || integer_zerop (TYPE_SIZE (type)))
6908     t = ovf;
6909  else
6910     {
6911       HOST_WIDE_INT align = arg_boundary / 8;
6912       t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ovf), ovf,
6913                   size_int (align - 1));
6914       t = fold_convert (sizetype, t);
6915       t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t,
6916                   size_int (-align));
6917       t = fold_convert (TREE_TYPE (ovf), t);
6918     }
6919   gimplify_expr (&t, pre_p, NULL, is_gimple_val, fb_rvalue);
6920   gimplify_assign (addr, t, pre_p);
6921
6922   t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t,
6923               size_int (rsize * UNITS_PER_WORD));
6924   gimplify_assign (unshare_expr (ovf), t, pre_p);
6925
6926   if (container)
6927     gimple_seq_add_stmt (pre_p, gimple_build_label (lab_over));
6928
6929   ptrtype = build_pointer_type (type);
6930   addr = fold_convert (ptrtype, addr);
6931
6932   if (indirect_p)
6933     addr = build_va_arg_indirect_ref (addr);
6934   return build_va_arg_indirect_ref (addr);
6935 }
6936 \f
6937 /* Return nonzero if OPNUM's MEM should be matched
6938    in movabs* patterns.  */
6939
6940 int
6941 ix86_check_movabs (rtx insn, int opnum)
6942 {
6943   rtx set, mem;
6944
6945   set = PATTERN (insn);
6946   if (GET_CODE (set) == PARALLEL)
6947     set = XVECEXP (set, 0, 0);
6948   gcc_assert (GET_CODE (set) == SET);
6949   mem = XEXP (set, opnum);
6950   while (GET_CODE (mem) == SUBREG)
6951     mem = SUBREG_REG (mem);
6952   gcc_assert (MEM_P (mem));
6953   return (volatile_ok || !MEM_VOLATILE_P (mem));
6954 }
6955 \f
6956 /* Initialize the table of extra 80387 mathematical constants.  */
6957
6958 static void
6959 init_ext_80387_constants (void)
6960 {
6961   static const char * cst[5] =
6962   {
6963     "0.3010299956639811952256464283594894482",  /* 0: fldlg2  */
6964     "0.6931471805599453094286904741849753009",  /* 1: fldln2  */
6965     "1.4426950408889634073876517827983434472",  /* 2: fldl2e  */
6966     "3.3219280948873623478083405569094566090",  /* 3: fldl2t  */
6967     "3.1415926535897932385128089594061862044",  /* 4: fldpi   */
6968   };
6969   int i;
6970
6971   for (i = 0; i < 5; i++)
6972     {
6973       real_from_string (&ext_80387_constants_table[i], cst[i]);
6974       /* Ensure each constant is rounded to XFmode precision.  */
6975       real_convert (&ext_80387_constants_table[i],
6976                     XFmode, &ext_80387_constants_table[i]);
6977     }
6978
6979   ext_80387_constants_init = 1;
6980 }
6981
6982 /* Return true if the constant is something that can be loaded with
6983    a special instruction.  */
6984
6985 int
6986 standard_80387_constant_p (rtx x)
6987 {
6988   enum machine_mode mode = GET_MODE (x);
6989
6990   REAL_VALUE_TYPE r;
6991
6992   if (!(X87_FLOAT_MODE_P (mode) && (GET_CODE (x) == CONST_DOUBLE)))
6993     return -1;
6994
6995   if (x == CONST0_RTX (mode))
6996     return 1;
6997   if (x == CONST1_RTX (mode))
6998     return 2;
6999
7000   REAL_VALUE_FROM_CONST_DOUBLE (r, x);
7001
7002   /* For XFmode constants, try to find a special 80387 instruction when
7003      optimizing for size or on those CPUs that benefit from them.  */
7004   if (mode == XFmode
7005       && (optimize_function_for_size_p (cfun) || TARGET_EXT_80387_CONSTANTS))
7006     {
7007       int i;
7008
7009       if (! ext_80387_constants_init)
7010         init_ext_80387_constants ();
7011
7012       for (i = 0; i < 5; i++)
7013         if (real_identical (&r, &ext_80387_constants_table[i]))
7014           return i + 3;
7015     }
7016
7017   /* Load of the constant -0.0 or -1.0 will be split as
7018      fldz;fchs or fld1;fchs sequence.  */
7019   if (real_isnegzero (&r))
7020     return 8;
7021   if (real_identical (&r, &dconstm1))
7022     return 9;
7023
7024   return 0;
7025 }
7026
7027 /* Return the opcode of the special instruction to be used to load
7028    the constant X.  */
7029
7030 const char *
7031 standard_80387_constant_opcode (rtx x)
7032 {
7033   switch (standard_80387_constant_p (x))
7034     {
7035     case 1:
7036       return "fldz";
7037     case 2:
7038       return "fld1";
7039     case 3:
7040       return "fldlg2";
7041     case 4:
7042       return "fldln2";
7043     case 5:
7044       return "fldl2e";
7045     case 6:
7046       return "fldl2t";
7047     case 7:
7048       return "fldpi";
7049     case 8:
7050     case 9:
7051       return "#";
7052     default:
7053       gcc_unreachable ();
7054     }
7055 }
7056
7057 /* Return the CONST_DOUBLE representing the 80387 constant that is
7058    loaded by the specified special instruction.  The argument IDX
7059    matches the return value from standard_80387_constant_p.  */
7060
7061 rtx
7062 standard_80387_constant_rtx (int idx)
7063 {
7064   int i;
7065
7066   if (! ext_80387_constants_init)
7067     init_ext_80387_constants ();
7068
7069   switch (idx)
7070     {
7071     case 3:
7072     case 4:
7073     case 5:
7074     case 6:
7075     case 7:
7076       i = idx - 3;
7077       break;
7078
7079     default:
7080       gcc_unreachable ();
7081     }
7082
7083   return CONST_DOUBLE_FROM_REAL_VALUE (ext_80387_constants_table[i],
7084                                        XFmode);
7085 }
7086
7087 /* Return 1 if mode is a valid mode for sse.  */
7088 static int
7089 standard_sse_mode_p (enum machine_mode mode)
7090 {
7091   switch (mode)
7092     {
7093     case V16QImode:
7094     case V8HImode:
7095     case V4SImode:
7096     case V2DImode:
7097     case V4SFmode:
7098     case V2DFmode:
7099       return 1;
7100
7101     default:
7102       return 0;
7103     }
7104 }
7105
7106 /* Return 1 if X is all 0s.  For all 1s, return 2 if X is in 128bit
7107    SSE modes and SSE2 is enabled,  return 3 if X is in 256bit AVX
7108    modes and AVX is enabled.  */
7109
7110 int
7111 standard_sse_constant_p (rtx x)
7112 {
7113   enum machine_mode mode = GET_MODE (x);
7114
7115   if (x == const0_rtx || x == CONST0_RTX (GET_MODE (x)))
7116     return 1;
7117   if (vector_all_ones_operand (x, mode))
7118     {
7119       if (standard_sse_mode_p (mode))
7120         return TARGET_SSE2 ? 2 : -2;
7121       else if (VALID_AVX256_REG_MODE (mode))
7122         return TARGET_AVX ? 3 : -3;
7123     }
7124
7125   return 0;
7126 }
7127
7128 /* Return the opcode of the special instruction to be used to load
7129    the constant X.  */
7130
7131 const char *
7132 standard_sse_constant_opcode (rtx insn, rtx x)
7133 {
7134   switch (standard_sse_constant_p (x))
7135     {
7136     case 1:
7137       switch (get_attr_mode (insn))
7138         {
7139         case MODE_V4SF:
7140           return TARGET_AVX ? "vxorps\t%0, %0, %0" : "xorps\t%0, %0";
7141         case MODE_V2DF:
7142           return TARGET_AVX ? "vxorpd\t%0, %0, %0" : "xorpd\t%0, %0";
7143         case MODE_TI:
7144           return TARGET_AVX ? "vpxor\t%0, %0, %0" : "pxor\t%0, %0";
7145         case MODE_V8SF:
7146           return "vxorps\t%x0, %x0, %x0";
7147         case MODE_V4DF:
7148           return "vxorpd\t%x0, %x0, %x0";
7149         case MODE_OI:
7150           return "vpxor\t%x0, %x0, %x0";
7151         default:
7152           gcc_unreachable ();
7153         }
7154     case 2:
7155       if (TARGET_AVX)
7156         switch (get_attr_mode (insn))
7157           {
7158           case MODE_V4SF:
7159           case MODE_V2DF:
7160           case MODE_TI:
7161             return "vpcmpeqd\t%0, %0, %0";
7162             break;
7163           default:
7164             gcc_unreachable ();
7165         }
7166       else
7167         return "pcmpeqd\t%0, %0";
7168     }
7169   gcc_unreachable ();
7170 }
7171
7172 /* Returns 1 if OP contains a symbol reference */
7173
7174 int
7175 symbolic_reference_mentioned_p (rtx op)
7176 {
7177   const char *fmt;
7178   int i;
7179
7180   if (GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == LABEL_REF)
7181     return 1;
7182
7183   fmt = GET_RTX_FORMAT (GET_CODE (op));
7184   for (i = GET_RTX_LENGTH (GET_CODE (op)) - 1; i >= 0; i--)
7185     {
7186       if (fmt[i] == 'E')
7187         {
7188           int j;
7189
7190           for (j = XVECLEN (op, i) - 1; j >= 0; j--)
7191             if (symbolic_reference_mentioned_p (XVECEXP (op, i, j)))
7192               return 1;
7193         }
7194
7195       else if (fmt[i] == 'e' && symbolic_reference_mentioned_p (XEXP (op, i)))
7196         return 1;
7197     }
7198
7199   return 0;
7200 }
7201
7202 /* Return 1 if it is appropriate to emit `ret' instructions in the
7203    body of a function.  Do this only if the epilogue is simple, needing a
7204    couple of insns.  Prior to reloading, we can't tell how many registers
7205    must be saved, so return 0 then.  Return 0 if there is no frame
7206    marker to de-allocate.  */
7207
7208 int
7209 ix86_can_use_return_insn_p (void)
7210 {
7211   struct ix86_frame frame;
7212
7213   if (! reload_completed || frame_pointer_needed)
7214     return 0;
7215
7216   /* Don't allow more than 32 pop, since that's all we can do
7217      with one instruction.  */
7218   if (crtl->args.pops_args
7219       && crtl->args.size >= 32768)
7220     return 0;
7221
7222   ix86_compute_frame_layout (&frame);
7223   return frame.to_allocate == 0 && (frame.nregs + frame.nsseregs) == 0;
7224 }
7225 \f
7226 /* Value should be nonzero if functions must have frame pointers.
7227    Zero means the frame pointer need not be set up (and parms may
7228    be accessed via the stack pointer) in functions that seem suitable.  */
7229
7230 int
7231 ix86_frame_pointer_required (void)
7232 {
7233   /* If we accessed previous frames, then the generated code expects
7234      to be able to access the saved ebp value in our frame.  */
7235   if (cfun->machine->accesses_prev_frame)
7236     return 1;
7237
7238   /* Several x86 os'es need a frame pointer for other reasons,
7239      usually pertaining to setjmp.  */
7240   if (SUBTARGET_FRAME_POINTER_REQUIRED)
7241     return 1;
7242
7243   /* In override_options, TARGET_OMIT_LEAF_FRAME_POINTER turns off
7244      the frame pointer by default.  Turn it back on now if we've not
7245      got a leaf function.  */
7246   if (TARGET_OMIT_LEAF_FRAME_POINTER
7247       && (!current_function_is_leaf
7248           || ix86_current_function_calls_tls_descriptor))
7249     return 1;
7250
7251   if (crtl->profile)
7252     return 1;
7253
7254   return 0;
7255 }
7256
7257 /* Record that the current function accesses previous call frames.  */
7258
7259 void
7260 ix86_setup_frame_addresses (void)
7261 {
7262   cfun->machine->accesses_prev_frame = 1;
7263 }
7264 \f
7265 #if (defined(HAVE_GAS_HIDDEN) && (SUPPORTS_ONE_ONLY - 0)) || TARGET_MACHO
7266 # define USE_HIDDEN_LINKONCE 1
7267 #else
7268 # define USE_HIDDEN_LINKONCE 0
7269 #endif
7270
7271 static int pic_labels_used;
7272
7273 /* Fills in the label name that should be used for a pc thunk for
7274    the given register.  */
7275
7276 static void
7277 get_pc_thunk_name (char name[32], unsigned int regno)
7278 {
7279   gcc_assert (!TARGET_64BIT);
7280
7281   if (USE_HIDDEN_LINKONCE)
7282     sprintf (name, "__i686.get_pc_thunk.%s", reg_names[regno]);
7283   else
7284     ASM_GENERATE_INTERNAL_LABEL (name, "LPR", regno);
7285 }
7286
7287
7288 /* This function generates code for -fpic that loads %ebx with
7289    the return address of the caller and then returns.  */
7290
7291 void
7292 ix86_file_end (void)
7293 {
7294   rtx xops[2];
7295   int regno;
7296
7297   for (regno = 0; regno < 8; ++regno)
7298     {
7299       char name[32];
7300
7301       if (! ((pic_labels_used >> regno) & 1))
7302         continue;
7303
7304       get_pc_thunk_name (name, regno);
7305
7306 #if TARGET_MACHO
7307       if (TARGET_MACHO)
7308         {
7309           switch_to_section (darwin_sections[text_coal_section]);
7310           fputs ("\t.weak_definition\t", asm_out_file);
7311           assemble_name (asm_out_file, name);
7312           fputs ("\n\t.private_extern\t", asm_out_file);
7313           assemble_name (asm_out_file, name);
7314           fputs ("\n", asm_out_file);
7315           ASM_OUTPUT_LABEL (asm_out_file, name);
7316         }
7317       else
7318 #endif
7319       if (USE_HIDDEN_LINKONCE)
7320         {
7321           tree decl;
7322
7323           decl = build_decl (FUNCTION_DECL, get_identifier (name),
7324                              error_mark_node);
7325           TREE_PUBLIC (decl) = 1;
7326           TREE_STATIC (decl) = 1;
7327           DECL_ONE_ONLY (decl) = 1;
7328
7329           (*targetm.asm_out.unique_section) (decl, 0);
7330           switch_to_section (get_named_section (decl, NULL, 0));
7331
7332           (*targetm.asm_out.globalize_label) (asm_out_file, name);
7333           fputs ("\t.hidden\t", asm_out_file);
7334           assemble_name (asm_out_file, name);
7335           fputc ('\n', asm_out_file);
7336           ASM_DECLARE_FUNCTION_NAME (asm_out_file, name, decl);
7337         }
7338       else
7339         {
7340           switch_to_section (text_section);
7341           ASM_OUTPUT_LABEL (asm_out_file, name);
7342         }
7343
7344       xops[0] = gen_rtx_REG (Pmode, regno);
7345       xops[1] = gen_rtx_MEM (Pmode, stack_pointer_rtx);
7346       output_asm_insn ("mov%z0\t{%1, %0|%0, %1}", xops);
7347       output_asm_insn ("ret", xops);
7348     }
7349
7350   if (NEED_INDICATE_EXEC_STACK)
7351     file_end_indicate_exec_stack ();
7352 }
7353
7354 /* Emit code for the SET_GOT patterns.  */
7355
7356 const char *
7357 output_set_got (rtx dest, rtx label ATTRIBUTE_UNUSED)
7358 {
7359   rtx xops[3];
7360
7361   xops[0] = dest;
7362
7363   if (TARGET_VXWORKS_RTP && flag_pic)
7364     {
7365       /* Load (*VXWORKS_GOTT_BASE) into the PIC register.  */
7366       xops[2] = gen_rtx_MEM (Pmode,
7367                              gen_rtx_SYMBOL_REF (Pmode, VXWORKS_GOTT_BASE));
7368       output_asm_insn ("mov{l}\t{%2, %0|%0, %2}", xops);
7369
7370       /* Load (*VXWORKS_GOTT_BASE)[VXWORKS_GOTT_INDEX] into the PIC register.
7371          Use %P and a local symbol in order to print VXWORKS_GOTT_INDEX as
7372          an unadorned address.  */
7373       xops[2] = gen_rtx_SYMBOL_REF (Pmode, VXWORKS_GOTT_INDEX);
7374       SYMBOL_REF_FLAGS (xops[2]) |= SYMBOL_FLAG_LOCAL;
7375       output_asm_insn ("mov{l}\t{%P2(%0), %0|%0, DWORD PTR %P2[%0]}", xops);
7376       return "";
7377     }
7378
7379   xops[1] = gen_rtx_SYMBOL_REF (Pmode, GOT_SYMBOL_NAME);
7380
7381   if (! TARGET_DEEP_BRANCH_PREDICTION || !flag_pic)
7382     {
7383       xops[2] = gen_rtx_LABEL_REF (Pmode, label ? label : gen_label_rtx ());
7384
7385       if (!flag_pic)
7386         output_asm_insn ("mov%z0\t{%2, %0|%0, %2}", xops);
7387       else
7388         output_asm_insn ("call\t%a2", xops);
7389
7390 #if TARGET_MACHO
7391       /* Output the Mach-O "canonical" label name ("Lxx$pb") here too.  This
7392          is what will be referenced by the Mach-O PIC subsystem.  */
7393       if (!label)
7394         ASM_OUTPUT_LABEL (asm_out_file, MACHOPIC_FUNCTION_BASE_NAME);
7395 #endif
7396
7397       (*targetm.asm_out.internal_label) (asm_out_file, "L",
7398                                  CODE_LABEL_NUMBER (XEXP (xops[2], 0)));
7399
7400       if (flag_pic)
7401         output_asm_insn ("pop%z0\t%0", xops);
7402     }
7403   else
7404     {
7405       char name[32];
7406       get_pc_thunk_name (name, REGNO (dest));
7407       pic_labels_used |= 1 << REGNO (dest);
7408
7409       xops[2] = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (name));
7410       xops[2] = gen_rtx_MEM (QImode, xops[2]);
7411       output_asm_insn ("call\t%X2", xops);
7412       /* Output the Mach-O "canonical" label name ("Lxx$pb") here too.  This
7413          is what will be referenced by the Mach-O PIC subsystem.  */
7414 #if TARGET_MACHO
7415       if (!label)
7416         ASM_OUTPUT_LABEL (asm_out_file, MACHOPIC_FUNCTION_BASE_NAME);
7417       else
7418         targetm.asm_out.internal_label (asm_out_file, "L",
7419                                            CODE_LABEL_NUMBER (label));
7420 #endif
7421     }
7422
7423   if (TARGET_MACHO)
7424     return "";
7425
7426   if (!flag_pic || TARGET_DEEP_BRANCH_PREDICTION)
7427     output_asm_insn ("add%z0\t{%1, %0|%0, %1}", xops);
7428   else
7429     output_asm_insn ("add%z0\t{%1+[.-%a2], %0|%0, %1+(.-%a2)}", xops);
7430
7431   return "";
7432 }
7433
7434 /* Generate an "push" pattern for input ARG.  */
7435
7436 static rtx
7437 gen_push (rtx arg)
7438 {
7439   return gen_rtx_SET (VOIDmode,
7440                       gen_rtx_MEM (Pmode,
7441                                    gen_rtx_PRE_DEC (Pmode,
7442                                                     stack_pointer_rtx)),
7443                       arg);
7444 }
7445
7446 /* Return >= 0 if there is an unused call-clobbered register available
7447    for the entire function.  */
7448
7449 static unsigned int
7450 ix86_select_alt_pic_regnum (void)
7451 {
7452   if (current_function_is_leaf && !crtl->profile
7453       && !ix86_current_function_calls_tls_descriptor)
7454     {
7455       int i, drap;
7456       /* Can't use the same register for both PIC and DRAP.  */
7457       if (crtl->drap_reg)
7458         drap = REGNO (crtl->drap_reg);
7459       else
7460         drap = -1;
7461       for (i = 2; i >= 0; --i)
7462         if (i != drap && !df_regs_ever_live_p (i))
7463           return i;
7464     }
7465
7466   return INVALID_REGNUM;
7467 }
7468
7469 /* Return 1 if we need to save REGNO.  */
7470 static int
7471 ix86_save_reg (unsigned int regno, int maybe_eh_return)
7472 {
7473   if (pic_offset_table_rtx
7474       && regno == REAL_PIC_OFFSET_TABLE_REGNUM
7475       && (df_regs_ever_live_p (REAL_PIC_OFFSET_TABLE_REGNUM)
7476           || crtl->profile
7477           || crtl->calls_eh_return
7478           || crtl->uses_const_pool))
7479     {
7480       if (ix86_select_alt_pic_regnum () != INVALID_REGNUM)
7481         return 0;
7482       return 1;
7483     }
7484
7485   if (crtl->calls_eh_return && maybe_eh_return)
7486     {
7487       unsigned i;
7488       for (i = 0; ; i++)
7489         {
7490           unsigned test = EH_RETURN_DATA_REGNO (i);
7491           if (test == INVALID_REGNUM)
7492             break;
7493           if (test == regno)
7494             return 1;
7495         }
7496     }
7497
7498   if (crtl->drap_reg
7499       && regno == REGNO (crtl->drap_reg))
7500     return 1;
7501
7502   return (df_regs_ever_live_p (regno)
7503           && !call_used_regs[regno]
7504           && !fixed_regs[regno]
7505           && (regno != HARD_FRAME_POINTER_REGNUM || !frame_pointer_needed));
7506 }
7507
7508 /* Return number of saved general prupose registers.  */
7509
7510 static int
7511 ix86_nsaved_regs (void)
7512 {
7513   int nregs = 0;
7514   int regno;
7515
7516   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
7517     if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
7518       nregs ++;
7519   return nregs;
7520 }
7521
7522 /* Return number of saved SSE registrers.  */
7523
7524 static int
7525 ix86_nsaved_sseregs (void)
7526 {
7527   int nregs = 0;
7528   int regno;
7529
7530   if (ix86_cfun_abi () != MS_ABI)
7531     return 0;
7532   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
7533     if (SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
7534       nregs ++;
7535   return nregs;
7536 }
7537
7538 /* Given FROM and TO register numbers, say whether this elimination is
7539    allowed.  If stack alignment is needed, we can only replace argument
7540    pointer with hard frame pointer, or replace frame pointer with stack
7541    pointer.  Otherwise, frame pointer elimination is automatically
7542    handled and all other eliminations are valid.  */
7543
7544 int
7545 ix86_can_eliminate (int from, int to)
7546 {
7547   if (stack_realign_fp)
7548     return ((from == ARG_POINTER_REGNUM
7549              && to == HARD_FRAME_POINTER_REGNUM)
7550             || (from == FRAME_POINTER_REGNUM
7551                 && to == STACK_POINTER_REGNUM));
7552   else
7553     return to == STACK_POINTER_REGNUM ? !frame_pointer_needed : 1;
7554 }
7555
7556 /* Return the offset between two registers, one to be eliminated, and the other
7557    its replacement, at the start of a routine.  */
7558
7559 HOST_WIDE_INT
7560 ix86_initial_elimination_offset (int from, int to)
7561 {
7562   struct ix86_frame frame;
7563   ix86_compute_frame_layout (&frame);
7564
7565   if (from == ARG_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
7566     return frame.hard_frame_pointer_offset;
7567   else if (from == FRAME_POINTER_REGNUM
7568            && to == HARD_FRAME_POINTER_REGNUM)
7569     return frame.hard_frame_pointer_offset - frame.frame_pointer_offset;
7570   else
7571     {
7572       gcc_assert (to == STACK_POINTER_REGNUM);
7573
7574       if (from == ARG_POINTER_REGNUM)
7575         return frame.stack_pointer_offset;
7576
7577       gcc_assert (from == FRAME_POINTER_REGNUM);
7578       return frame.stack_pointer_offset - frame.frame_pointer_offset;
7579     }
7580 }
7581
7582 /* In a dynamically-aligned function, we can't know the offset from
7583    stack pointer to frame pointer, so we must ensure that setjmp
7584    eliminates fp against the hard fp (%ebp) rather than trying to
7585    index from %esp up to the top of the frame across a gap that is
7586    of unknown (at compile-time) size.  */
7587 static rtx
7588 ix86_builtin_setjmp_frame_value (void)
7589 {
7590   return stack_realign_fp ? hard_frame_pointer_rtx : virtual_stack_vars_rtx;
7591 }
7592
7593 /* Fill structure ix86_frame about frame of currently computed function.  */
7594
7595 static void
7596 ix86_compute_frame_layout (struct ix86_frame *frame)
7597 {
7598   HOST_WIDE_INT total_size;
7599   unsigned int stack_alignment_needed;
7600   HOST_WIDE_INT offset;
7601   unsigned int preferred_alignment;
7602   HOST_WIDE_INT size = get_frame_size ();
7603
7604   frame->nregs = ix86_nsaved_regs ();
7605   frame->nsseregs = ix86_nsaved_sseregs ();
7606   total_size = size;
7607
7608   stack_alignment_needed = crtl->stack_alignment_needed / BITS_PER_UNIT;
7609   preferred_alignment = crtl->preferred_stack_boundary / BITS_PER_UNIT;
7610
7611   /* MS ABI seem to require stack alignment to be always 16 except for function
7612      prologues.  */
7613   if (ix86_cfun_abi () == MS_ABI && preferred_alignment < 16)
7614     {
7615       preferred_alignment = 16;
7616       stack_alignment_needed = 16;
7617       crtl->preferred_stack_boundary = 128;
7618       crtl->stack_alignment_needed = 128;
7619     }
7620
7621   gcc_assert (!size || stack_alignment_needed);
7622   gcc_assert (preferred_alignment >= STACK_BOUNDARY / BITS_PER_UNIT);
7623   gcc_assert (preferred_alignment <= stack_alignment_needed);
7624
7625   /* During reload iteration the amount of registers saved can change.
7626      Recompute the value as needed.  Do not recompute when amount of registers
7627      didn't change as reload does multiple calls to the function and does not
7628      expect the decision to change within single iteration.  */
7629   if (!optimize_function_for_size_p (cfun)
7630       && cfun->machine->use_fast_prologue_epilogue_nregs != frame->nregs)
7631     {
7632       int count = frame->nregs;
7633
7634       cfun->machine->use_fast_prologue_epilogue_nregs = count;
7635       /* The fast prologue uses move instead of push to save registers.  This
7636          is significantly longer, but also executes faster as modern hardware
7637          can execute the moves in parallel, but can't do that for push/pop.
7638
7639          Be careful about choosing what prologue to emit:  When function takes
7640          many instructions to execute we may use slow version as well as in
7641          case function is known to be outside hot spot (this is known with
7642          feedback only).  Weight the size of function by number of registers
7643          to save as it is cheap to use one or two push instructions but very
7644          slow to use many of them.  */
7645       if (count)
7646         count = (count - 1) * FAST_PROLOGUE_INSN_COUNT;
7647       if (cfun->function_frequency < FUNCTION_FREQUENCY_NORMAL
7648           || (flag_branch_probabilities
7649               && cfun->function_frequency < FUNCTION_FREQUENCY_HOT))
7650         cfun->machine->use_fast_prologue_epilogue = false;
7651       else
7652         cfun->machine->use_fast_prologue_epilogue
7653            = !expensive_function_p (count);
7654     }
7655   if (TARGET_PROLOGUE_USING_MOVE
7656       && cfun->machine->use_fast_prologue_epilogue)
7657     frame->save_regs_using_mov = true;
7658   else
7659     frame->save_regs_using_mov = false;
7660
7661
7662   /* Skip return address and saved base pointer.  */
7663   offset = frame_pointer_needed ? UNITS_PER_WORD * 2 : UNITS_PER_WORD;
7664
7665   frame->hard_frame_pointer_offset = offset;
7666
7667   /* Set offset to aligned because the realigned frame starts from
7668      here.  */
7669   if (stack_realign_fp)
7670     offset = (offset + stack_alignment_needed -1) & -stack_alignment_needed;
7671
7672   /* Register save area */
7673   offset += frame->nregs * UNITS_PER_WORD;
7674
7675   /* Align SSE reg save area.  */
7676   if (frame->nsseregs)
7677     frame->padding0 = ((offset + 16 - 1) & -16) - offset;
7678   else
7679     frame->padding0 = 0;
7680   
7681   /* SSE register save area.  */
7682   offset += frame->padding0 + frame->nsseregs * 16;
7683
7684   /* Va-arg area */
7685   frame->va_arg_size = ix86_varargs_gpr_size + ix86_varargs_fpr_size;
7686   offset += frame->va_arg_size;
7687
7688   /* Align start of frame for local function.  */
7689   frame->padding1 = ((offset + stack_alignment_needed - 1)
7690                      & -stack_alignment_needed) - offset;
7691
7692   offset += frame->padding1;
7693
7694   /* Frame pointer points here.  */
7695   frame->frame_pointer_offset = offset;
7696
7697   offset += size;
7698
7699   /* Add outgoing arguments area.  Can be skipped if we eliminated
7700      all the function calls as dead code.
7701      Skipping is however impossible when function calls alloca.  Alloca
7702      expander assumes that last crtl->outgoing_args_size
7703      of stack frame are unused.  */
7704   if (ACCUMULATE_OUTGOING_ARGS
7705       && (!current_function_is_leaf || cfun->calls_alloca
7706           || ix86_current_function_calls_tls_descriptor))
7707     {
7708       offset += crtl->outgoing_args_size;
7709       frame->outgoing_arguments_size = crtl->outgoing_args_size;
7710     }
7711   else
7712     frame->outgoing_arguments_size = 0;
7713
7714   /* Align stack boundary.  Only needed if we're calling another function
7715      or using alloca.  */
7716   if (!current_function_is_leaf || cfun->calls_alloca
7717       || ix86_current_function_calls_tls_descriptor)
7718     frame->padding2 = ((offset + preferred_alignment - 1)
7719                        & -preferred_alignment) - offset;
7720   else
7721     frame->padding2 = 0;
7722
7723   offset += frame->padding2;
7724
7725   /* We've reached end of stack frame.  */
7726   frame->stack_pointer_offset = offset;
7727
7728   /* Size prologue needs to allocate.  */
7729   frame->to_allocate =
7730     (size + frame->padding1 + frame->padding2
7731      + frame->outgoing_arguments_size + frame->va_arg_size);
7732
7733   if ((!frame->to_allocate && frame->nregs <= 1)
7734       || (TARGET_64BIT && frame->to_allocate >= (HOST_WIDE_INT) 0x80000000))
7735     frame->save_regs_using_mov = false;
7736
7737   if (!TARGET_64BIT_MS_ABI && TARGET_RED_ZONE && current_function_sp_is_unchanging
7738       && current_function_is_leaf
7739       && !ix86_current_function_calls_tls_descriptor)
7740     {
7741       frame->red_zone_size = frame->to_allocate;
7742       if (frame->save_regs_using_mov)
7743         frame->red_zone_size += frame->nregs * UNITS_PER_WORD;
7744       if (frame->red_zone_size > RED_ZONE_SIZE - RED_ZONE_RESERVE)
7745         frame->red_zone_size = RED_ZONE_SIZE - RED_ZONE_RESERVE;
7746     }
7747   else
7748     frame->red_zone_size = 0;
7749   frame->to_allocate -= frame->red_zone_size;
7750   frame->stack_pointer_offset -= frame->red_zone_size;
7751 #if 0
7752   fprintf (stderr, "\n");
7753   fprintf (stderr, "size: %ld\n", (long)size);
7754   fprintf (stderr, "nregs: %ld\n", (long)frame->nregs);
7755   fprintf (stderr, "nsseregs: %ld\n", (long)frame->nsseregs);
7756   fprintf (stderr, "padding0: %ld\n", (long)frame->padding0);
7757   fprintf (stderr, "alignment1: %ld\n", (long)stack_alignment_needed);
7758   fprintf (stderr, "padding1: %ld\n", (long)frame->padding1);
7759   fprintf (stderr, "va_arg: %ld\n", (long)frame->va_arg_size);
7760   fprintf (stderr, "padding2: %ld\n", (long)frame->padding2);
7761   fprintf (stderr, "to_allocate: %ld\n", (long)frame->to_allocate);
7762   fprintf (stderr, "red_zone_size: %ld\n", (long)frame->red_zone_size);
7763   fprintf (stderr, "frame_pointer_offset: %ld\n", (long)frame->frame_pointer_offset);
7764   fprintf (stderr, "hard_frame_pointer_offset: %ld\n",
7765            (long)frame->hard_frame_pointer_offset);
7766   fprintf (stderr, "stack_pointer_offset: %ld\n", (long)frame->stack_pointer_offset);
7767   fprintf (stderr, "current_function_is_leaf: %ld\n", (long)current_function_is_leaf);
7768   fprintf (stderr, "cfun->calls_alloca: %ld\n", (long)cfun->calls_alloca);
7769   fprintf (stderr, "x86_current_function_calls_tls_descriptor: %ld\n", (long)ix86_current_function_calls_tls_descriptor);
7770 #endif
7771 }
7772
7773 /* Emit code to save registers in the prologue.  */
7774
7775 static void
7776 ix86_emit_save_regs (void)
7777 {
7778   unsigned int regno;
7779   rtx insn;
7780
7781   for (regno = FIRST_PSEUDO_REGISTER - 1; regno-- > 0; )
7782     if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
7783       {
7784         insn = emit_insn (gen_push (gen_rtx_REG (Pmode, regno)));
7785         RTX_FRAME_RELATED_P (insn) = 1;
7786       }
7787 }
7788
7789 /* Emit code to save registers using MOV insns.  First register
7790    is restored from POINTER + OFFSET.  */
7791 static void
7792 ix86_emit_save_regs_using_mov (rtx pointer, HOST_WIDE_INT offset)
7793 {
7794   unsigned int regno;
7795   rtx insn;
7796
7797   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
7798     if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
7799       {
7800         insn = emit_move_insn (adjust_address (gen_rtx_MEM (Pmode, pointer),
7801                                                Pmode, offset),
7802                                gen_rtx_REG (Pmode, regno));
7803         RTX_FRAME_RELATED_P (insn) = 1;
7804         offset += UNITS_PER_WORD;
7805       }
7806 }
7807
7808 /* Emit code to save registers using MOV insns.  First register
7809    is restored from POINTER + OFFSET.  */
7810 static void
7811 ix86_emit_save_sse_regs_using_mov (rtx pointer, HOST_WIDE_INT offset)
7812 {
7813   unsigned int regno;
7814   rtx insn;
7815   rtx mem;
7816
7817   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
7818     if (SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
7819       {
7820         mem = adjust_address (gen_rtx_MEM (TImode, pointer), TImode, offset);
7821         set_mem_align (mem, 128);
7822         insn = emit_move_insn (mem, gen_rtx_REG (TImode, regno));
7823         RTX_FRAME_RELATED_P (insn) = 1;
7824         offset += 16;
7825       }
7826 }
7827
7828 /* Expand prologue or epilogue stack adjustment.
7829    The pattern exist to put a dependency on all ebp-based memory accesses.
7830    STYLE should be negative if instructions should be marked as frame related,
7831    zero if %r11 register is live and cannot be freely used and positive
7832    otherwise.  */
7833
7834 static void
7835 pro_epilogue_adjust_stack (rtx dest, rtx src, rtx offset, int style)
7836 {
7837   rtx insn;
7838
7839   if (! TARGET_64BIT)
7840     insn = emit_insn (gen_pro_epilogue_adjust_stack_1 (dest, src, offset));
7841   else if (x86_64_immediate_operand (offset, DImode))
7842     insn = emit_insn (gen_pro_epilogue_adjust_stack_rex64 (dest, src, offset));
7843   else
7844     {
7845       rtx r11;
7846       /* r11 is used by indirect sibcall return as well, set before the
7847          epilogue and used after the epilogue.  ATM indirect sibcall
7848          shouldn't be used together with huge frame sizes in one
7849          function because of the frame_size check in sibcall.c.  */
7850       gcc_assert (style);
7851       r11 = gen_rtx_REG (DImode, R11_REG);
7852       insn = emit_insn (gen_rtx_SET (DImode, r11, offset));
7853       if (style < 0)
7854         RTX_FRAME_RELATED_P (insn) = 1;
7855       insn = emit_insn (gen_pro_epilogue_adjust_stack_rex64_2 (dest, src, r11,
7856                                                                offset));
7857     }
7858   if (style < 0)
7859     RTX_FRAME_RELATED_P (insn) = 1;
7860 }
7861
7862 /* Find an available register to be used as dynamic realign argument
7863    pointer regsiter.  Such a register will be written in prologue and
7864    used in begin of body, so it must not be
7865         1. parameter passing register.
7866         2. GOT pointer.
7867    We reuse static-chain register if it is available.  Otherwise, we
7868    use DI for i386 and R13 for x86-64.  We chose R13 since it has
7869    shorter encoding.
7870
7871    Return: the regno of chosen register.  */
7872
7873 static unsigned int 
7874 find_drap_reg (void)
7875 {
7876   tree decl = cfun->decl;
7877
7878   if (TARGET_64BIT)
7879     {
7880       /* Use R13 for nested function or function need static chain.
7881          Since function with tail call may use any caller-saved
7882          registers in epilogue, DRAP must not use caller-saved
7883          register in such case.  */
7884       if ((decl_function_context (decl)
7885            && !DECL_NO_STATIC_CHAIN (decl))
7886           || crtl->tail_call_emit)
7887         return R13_REG;
7888
7889       return R10_REG;
7890     }
7891   else
7892     {
7893       /* Use DI for nested function or function need static chain.
7894          Since function with tail call may use any caller-saved
7895          registers in epilogue, DRAP must not use caller-saved
7896          register in such case.  */
7897       if ((decl_function_context (decl)
7898            && !DECL_NO_STATIC_CHAIN (decl))
7899           || crtl->tail_call_emit)
7900         return DI_REG;
7901     
7902       /* Reuse static chain register if it isn't used for parameter
7903          passing.  */
7904       if (ix86_function_regparm (TREE_TYPE (decl), decl) <= 2
7905           && !lookup_attribute ("fastcall",
7906                                 TYPE_ATTRIBUTES (TREE_TYPE (decl))))
7907         return CX_REG;
7908       else
7909         return DI_REG;
7910     }
7911 }
7912
7913 /* Update incoming stack boundary and estimated stack alignment.  */
7914
7915 static void
7916 ix86_update_stack_boundary (void)
7917 {
7918   /* Prefer the one specified at command line. */
7919   ix86_incoming_stack_boundary 
7920     = (ix86_user_incoming_stack_boundary
7921        ? ix86_user_incoming_stack_boundary
7922        : ix86_default_incoming_stack_boundary);
7923
7924   /* Incoming stack alignment can be changed on individual functions
7925      via force_align_arg_pointer attribute.  We use the smallest
7926      incoming stack boundary.  */
7927   if (ix86_incoming_stack_boundary > MIN_STACK_BOUNDARY
7928       && lookup_attribute (ix86_force_align_arg_pointer_string,
7929                            TYPE_ATTRIBUTES (TREE_TYPE (current_function_decl))))
7930     ix86_incoming_stack_boundary = MIN_STACK_BOUNDARY;
7931
7932   /* The incoming stack frame has to be aligned at least at
7933      parm_stack_boundary.  */
7934   if (ix86_incoming_stack_boundary < crtl->parm_stack_boundary)
7935     ix86_incoming_stack_boundary = crtl->parm_stack_boundary;
7936
7937   /* Stack at entrance of main is aligned by runtime.  We use the
7938      smallest incoming stack boundary. */
7939   if (ix86_incoming_stack_boundary > MAIN_STACK_BOUNDARY
7940       && DECL_NAME (current_function_decl)
7941       && MAIN_NAME_P (DECL_NAME (current_function_decl))
7942       && DECL_FILE_SCOPE_P (current_function_decl))
7943     ix86_incoming_stack_boundary = MAIN_STACK_BOUNDARY;
7944
7945   /* x86_64 vararg needs 16byte stack alignment for register save
7946      area.  */
7947   if (TARGET_64BIT
7948       && cfun->stdarg
7949       && crtl->stack_alignment_estimated < 128)
7950     crtl->stack_alignment_estimated = 128;
7951 }
7952
7953 /* Handle the TARGET_GET_DRAP_RTX hook.  Return NULL if no DRAP is
7954    needed or an rtx for DRAP otherwise.  */
7955
7956 static rtx
7957 ix86_get_drap_rtx (void)
7958 {
7959   if (ix86_force_drap || !ACCUMULATE_OUTGOING_ARGS)
7960     crtl->need_drap = true;
7961
7962   if (stack_realign_drap)
7963     {
7964       /* Assign DRAP to vDRAP and returns vDRAP */
7965       unsigned int regno = find_drap_reg ();
7966       rtx drap_vreg;
7967       rtx arg_ptr;
7968       rtx seq, insn;
7969
7970       arg_ptr = gen_rtx_REG (Pmode, regno);
7971       crtl->drap_reg = arg_ptr;
7972
7973       start_sequence ();
7974       drap_vreg = copy_to_reg (arg_ptr);
7975       seq = get_insns ();
7976       end_sequence ();
7977       
7978       insn = emit_insn_before (seq, NEXT_INSN (entry_of_function ()));
7979       RTX_FRAME_RELATED_P (insn) = 1;
7980       return drap_vreg;
7981     }
7982   else
7983     return NULL;
7984 }
7985
7986 /* Handle the TARGET_INTERNAL_ARG_POINTER hook.  */
7987
7988 static rtx
7989 ix86_internal_arg_pointer (void)
7990 {
7991   return virtual_incoming_args_rtx;
7992 }
7993
7994 /* Handle the TARGET_DWARF_HANDLE_FRAME_UNSPEC hook.
7995    This is called from dwarf2out.c to emit call frame instructions
7996    for frame-related insns containing UNSPECs and UNSPEC_VOLATILEs. */
7997 static void
7998 ix86_dwarf_handle_frame_unspec (const char *label, rtx pattern, int index)
7999 {
8000   rtx unspec = SET_SRC (pattern);
8001   gcc_assert (GET_CODE (unspec) == UNSPEC);
8002
8003   switch (index)
8004     {
8005     case UNSPEC_REG_SAVE:
8006       dwarf2out_reg_save_reg (label, XVECEXP (unspec, 0, 0),
8007                               SET_DEST (pattern));
8008       break;
8009     case UNSPEC_DEF_CFA:
8010       dwarf2out_def_cfa (label, REGNO (SET_DEST (pattern)),
8011                          INTVAL (XVECEXP (unspec, 0, 0)));
8012       break;
8013     default:
8014       gcc_unreachable ();
8015     }
8016 }
8017
8018 /* Finalize stack_realign_needed flag, which will guide prologue/epilogue
8019    to be generated in correct form.  */
8020 static void 
8021 ix86_finalize_stack_realign_flags (void)
8022 {
8023   /* Check if stack realign is really needed after reload, and 
8024      stores result in cfun */
8025   unsigned int incoming_stack_boundary
8026     = (crtl->parm_stack_boundary > ix86_incoming_stack_boundary
8027        ? crtl->parm_stack_boundary : ix86_incoming_stack_boundary);
8028   unsigned int stack_realign = (incoming_stack_boundary
8029                                 < (current_function_is_leaf
8030                                    ? crtl->max_used_stack_slot_alignment
8031                                    : crtl->stack_alignment_needed));
8032
8033   if (crtl->stack_realign_finalized)
8034     {
8035       /* After stack_realign_needed is finalized, we can't no longer
8036          change it.  */
8037       gcc_assert (crtl->stack_realign_needed == stack_realign);
8038     }
8039   else
8040     {
8041       crtl->stack_realign_needed = stack_realign;
8042       crtl->stack_realign_finalized = true;
8043     }
8044 }
8045
8046 /* Expand the prologue into a bunch of separate insns.  */
8047
8048 void
8049 ix86_expand_prologue (void)
8050 {
8051   rtx insn;
8052   bool pic_reg_used;
8053   struct ix86_frame frame;
8054   HOST_WIDE_INT allocate;
8055
8056   ix86_finalize_stack_realign_flags ();
8057
8058   /* DRAP should not coexist with stack_realign_fp */
8059   gcc_assert (!(crtl->drap_reg && stack_realign_fp));
8060
8061   ix86_compute_frame_layout (&frame);
8062
8063   /* Emit prologue code to adjust stack alignment and setup DRAP, in case
8064      of DRAP is needed and stack realignment is really needed after reload */
8065   if (crtl->drap_reg && crtl->stack_realign_needed)
8066     {
8067       rtx x, y;
8068       int align_bytes = crtl->stack_alignment_needed / BITS_PER_UNIT;
8069       int param_ptr_offset = (call_used_regs[REGNO (crtl->drap_reg)]
8070                               ? 0 : UNITS_PER_WORD);
8071
8072       gcc_assert (stack_realign_drap);
8073
8074       /* Grab the argument pointer.  */
8075       x = plus_constant (stack_pointer_rtx, 
8076                          (UNITS_PER_WORD + param_ptr_offset));
8077       y = crtl->drap_reg;
8078
8079       /* Only need to push parameter pointer reg if it is caller
8080          saved reg */
8081       if (!call_used_regs[REGNO (crtl->drap_reg)])
8082         {
8083           /* Push arg pointer reg */
8084           insn = emit_insn (gen_push (y));
8085           RTX_FRAME_RELATED_P (insn) = 1;
8086         }
8087
8088       insn = emit_insn (gen_rtx_SET (VOIDmode, y, x));
8089       RTX_FRAME_RELATED_P (insn) = 1; 
8090
8091       /* Align the stack.  */
8092       insn = emit_insn ((*ix86_gen_andsp) (stack_pointer_rtx,
8093                                            stack_pointer_rtx,
8094                                            GEN_INT (-align_bytes)));
8095       RTX_FRAME_RELATED_P (insn) = 1;
8096
8097       /* Replicate the return address on the stack so that return
8098          address can be reached via (argp - 1) slot.  This is needed
8099          to implement macro RETURN_ADDR_RTX and intrinsic function
8100          expand_builtin_return_addr etc.  */
8101       x = crtl->drap_reg;
8102       x = gen_frame_mem (Pmode,
8103                          plus_constant (x, -UNITS_PER_WORD));
8104       insn = emit_insn (gen_push (x));
8105       RTX_FRAME_RELATED_P (insn) = 1;
8106     }
8107
8108   /* Note: AT&T enter does NOT have reversed args.  Enter is probably
8109      slower on all targets.  Also sdb doesn't like it.  */
8110
8111   if (frame_pointer_needed)
8112     {
8113       insn = emit_insn (gen_push (hard_frame_pointer_rtx));
8114       RTX_FRAME_RELATED_P (insn) = 1;
8115
8116       insn = emit_move_insn (hard_frame_pointer_rtx, stack_pointer_rtx);
8117       RTX_FRAME_RELATED_P (insn) = 1;
8118     }
8119
8120   if (stack_realign_fp)
8121     {
8122       int align_bytes = crtl->stack_alignment_needed / BITS_PER_UNIT;
8123       gcc_assert (align_bytes > MIN_STACK_BOUNDARY / BITS_PER_UNIT);
8124
8125       /* Align the stack.  */
8126       insn = emit_insn ((*ix86_gen_andsp) (stack_pointer_rtx,
8127                                            stack_pointer_rtx,
8128                                            GEN_INT (-align_bytes)));
8129       RTX_FRAME_RELATED_P (insn) = 1;
8130     }
8131
8132   allocate = frame.to_allocate + frame.nsseregs * 16 + frame.padding0;
8133
8134   if (!frame.save_regs_using_mov)
8135     ix86_emit_save_regs ();
8136   else
8137     allocate += frame.nregs * UNITS_PER_WORD;
8138
8139   /* When using red zone we may start register saving before allocating
8140      the stack frame saving one cycle of the prologue. However I will
8141      avoid doing this if I am going to have to probe the stack since
8142      at least on x86_64 the stack probe can turn into a call that clobbers
8143      a red zone location */
8144   if (!TARGET_64BIT_MS_ABI && TARGET_RED_ZONE && frame.save_regs_using_mov
8145       && (! TARGET_STACK_PROBE || allocate < CHECK_STACK_LIMIT))
8146     ix86_emit_save_regs_using_mov ((frame_pointer_needed
8147                                      && !crtl->stack_realign_needed) 
8148                                    ? hard_frame_pointer_rtx
8149                                    : stack_pointer_rtx,
8150                                    -frame.nregs * UNITS_PER_WORD);
8151
8152   if (allocate == 0)
8153     ;
8154   else if (! TARGET_STACK_PROBE || allocate < CHECK_STACK_LIMIT)
8155     pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
8156                                GEN_INT (-allocate), -1);
8157   else
8158     {
8159       /* Only valid for Win32.  */
8160       rtx eax = gen_rtx_REG (Pmode, AX_REG);
8161       bool eax_live;
8162       rtx t;
8163
8164       gcc_assert (!TARGET_64BIT || cfun->machine->call_abi == MS_ABI);
8165
8166       if (cfun->machine->call_abi == MS_ABI)
8167         eax_live = false;
8168       else
8169         eax_live = ix86_eax_live_at_start_p ();
8170
8171       if (eax_live)
8172         {
8173           emit_insn (gen_push (eax));
8174           allocate -= UNITS_PER_WORD;
8175         }
8176
8177       emit_move_insn (eax, GEN_INT (allocate));
8178
8179       if (TARGET_64BIT)
8180         insn = gen_allocate_stack_worker_64 (eax, eax);
8181       else
8182         insn = gen_allocate_stack_worker_32 (eax, eax);
8183       insn = emit_insn (insn);
8184       RTX_FRAME_RELATED_P (insn) = 1;
8185       t = gen_rtx_PLUS (Pmode, stack_pointer_rtx, GEN_INT (-allocate));
8186       t = gen_rtx_SET (VOIDmode, stack_pointer_rtx, t);
8187       REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
8188                                             t, REG_NOTES (insn));
8189
8190       if (eax_live)
8191         {
8192           if (frame_pointer_needed)
8193             t = plus_constant (hard_frame_pointer_rtx,
8194                                allocate
8195                                - frame.to_allocate
8196                                - frame.nregs * UNITS_PER_WORD);
8197           else
8198             t = plus_constant (stack_pointer_rtx, allocate);
8199           emit_move_insn (eax, gen_rtx_MEM (Pmode, t));
8200         }
8201     }
8202
8203   if (frame.save_regs_using_mov
8204       && !(!TARGET_64BIT_MS_ABI && TARGET_RED_ZONE
8205          && (! TARGET_STACK_PROBE || allocate < CHECK_STACK_LIMIT)))
8206     {
8207       if (!frame_pointer_needed
8208           || !frame.to_allocate
8209           || crtl->stack_realign_needed)
8210         ix86_emit_save_regs_using_mov (stack_pointer_rtx,
8211                                        frame.to_allocate
8212                                        + frame.nsseregs * 16 + frame.padding0);
8213       else
8214         ix86_emit_save_regs_using_mov (hard_frame_pointer_rtx,
8215                                        -frame.nregs * UNITS_PER_WORD);
8216     }
8217   if (!frame_pointer_needed
8218       || !frame.to_allocate
8219       || crtl->stack_realign_needed)
8220     ix86_emit_save_sse_regs_using_mov (stack_pointer_rtx,
8221                                        frame.to_allocate);
8222   else
8223     ix86_emit_save_sse_regs_using_mov (hard_frame_pointer_rtx,
8224                                        - frame.nregs * UNITS_PER_WORD
8225                                        - frame.nsseregs * 16
8226                                        - frame.padding0);
8227
8228   pic_reg_used = false;
8229   if (pic_offset_table_rtx
8230       && (df_regs_ever_live_p (REAL_PIC_OFFSET_TABLE_REGNUM)
8231           || crtl->profile))
8232     {
8233       unsigned int alt_pic_reg_used = ix86_select_alt_pic_regnum ();
8234
8235       if (alt_pic_reg_used != INVALID_REGNUM)
8236         SET_REGNO (pic_offset_table_rtx, alt_pic_reg_used);
8237
8238       pic_reg_used = true;
8239     }
8240
8241   if (pic_reg_used)
8242     {
8243       if (TARGET_64BIT)
8244         {
8245           if (ix86_cmodel == CM_LARGE_PIC)
8246             {
8247               rtx tmp_reg = gen_rtx_REG (DImode, R11_REG);
8248               rtx label = gen_label_rtx ();
8249               emit_label (label);
8250               LABEL_PRESERVE_P (label) = 1;
8251               gcc_assert (REGNO (pic_offset_table_rtx) != REGNO (tmp_reg));
8252               insn = emit_insn (gen_set_rip_rex64 (pic_offset_table_rtx, label));
8253               insn = emit_insn (gen_set_got_offset_rex64 (tmp_reg, label));
8254               insn = emit_insn (gen_adddi3 (pic_offset_table_rtx,
8255                                             pic_offset_table_rtx, tmp_reg));
8256             }
8257           else
8258             insn = emit_insn (gen_set_got_rex64 (pic_offset_table_rtx));
8259         }
8260       else
8261         insn = emit_insn (gen_set_got (pic_offset_table_rtx));
8262     }
8263
8264   /* In the pic_reg_used case, make sure that the got load isn't deleted
8265      when mcount needs it.  Blockage to avoid call movement across mcount
8266      call is emitted in generic code after the NOTE_INSN_PROLOGUE_END
8267      note.  */
8268   if (crtl->profile && pic_reg_used)
8269     emit_insn (gen_prologue_use (pic_offset_table_rtx));
8270
8271   if (crtl->drap_reg && !crtl->stack_realign_needed)
8272     {
8273       /* vDRAP is setup but after reload it turns out stack realign
8274          isn't necessary, here we will emit prologue to setup DRAP
8275          without stack realign adjustment */
8276       int drap_bp_offset = UNITS_PER_WORD * 2;
8277       rtx x = plus_constant (hard_frame_pointer_rtx, drap_bp_offset);
8278       insn = emit_insn (gen_rtx_SET (VOIDmode, crtl->drap_reg, x));
8279     }
8280
8281   /* Prevent instructions from being scheduled into register save push
8282      sequence when access to the redzone area is done through frame pointer.
8283      The offset betweeh the frame pointer and the stack pointer is calculated
8284      relative to the value of the stack pointer at the end of the function
8285      prologue, and moving instructions that access redzone area via frame
8286      pointer inside push sequence violates this assumption.  */
8287   if (frame_pointer_needed && frame.red_zone_size)
8288     emit_insn (gen_memory_blockage ());
8289
8290   /* Emit cld instruction if stringops are used in the function.  */
8291   if (TARGET_CLD && ix86_current_function_needs_cld)
8292     emit_insn (gen_cld ());
8293 }
8294
8295 /* Emit code to restore saved registers using MOV insns.  First register
8296    is restored from POINTER + OFFSET.  */
8297 static void
8298 ix86_emit_restore_regs_using_mov (rtx pointer, HOST_WIDE_INT offset,
8299                                   int maybe_eh_return)
8300 {
8301   int regno;
8302   rtx base_address = gen_rtx_MEM (Pmode, pointer);
8303
8304   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
8305     if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, maybe_eh_return))
8306       {
8307         /* Ensure that adjust_address won't be forced to produce pointer
8308            out of range allowed by x86-64 instruction set.  */
8309         if (TARGET_64BIT && offset != trunc_int_for_mode (offset, SImode))
8310           {
8311             rtx r11;
8312
8313             r11 = gen_rtx_REG (DImode, R11_REG);
8314             emit_move_insn (r11, GEN_INT (offset));
8315             emit_insn (gen_adddi3 (r11, r11, pointer));
8316             base_address = gen_rtx_MEM (Pmode, r11);
8317             offset = 0;
8318           }
8319         emit_move_insn (gen_rtx_REG (Pmode, regno),
8320                         adjust_address (base_address, Pmode, offset));
8321         offset += UNITS_PER_WORD;
8322       }
8323 }
8324
8325 /* Emit code to restore saved registers using MOV insns.  First register
8326    is restored from POINTER + OFFSET.  */
8327 static void
8328 ix86_emit_restore_sse_regs_using_mov (rtx pointer, HOST_WIDE_INT offset,
8329                                       int maybe_eh_return)
8330 {
8331   int regno;
8332   rtx base_address = gen_rtx_MEM (TImode, pointer);
8333   rtx mem;
8334
8335   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
8336     if (SSE_REGNO_P (regno) && ix86_save_reg (regno, maybe_eh_return))
8337       {
8338         /* Ensure that adjust_address won't be forced to produce pointer
8339            out of range allowed by x86-64 instruction set.  */
8340         if (TARGET_64BIT && offset != trunc_int_for_mode (offset, SImode))
8341           {
8342             rtx r11;
8343
8344             r11 = gen_rtx_REG (DImode, R11_REG);
8345             emit_move_insn (r11, GEN_INT (offset));
8346             emit_insn (gen_adddi3 (r11, r11, pointer));
8347             base_address = gen_rtx_MEM (TImode, r11);
8348             offset = 0;
8349           }
8350         mem = adjust_address (base_address, TImode, offset);
8351         set_mem_align (mem, 128);
8352         emit_move_insn (gen_rtx_REG (TImode, regno), mem);
8353         offset += 16;
8354       }
8355 }
8356
8357 /* Restore function stack, frame, and registers.  */
8358
8359 void
8360 ix86_expand_epilogue (int style)
8361 {
8362   int regno;
8363   int sp_valid;
8364   struct ix86_frame frame;
8365   HOST_WIDE_INT offset;
8366
8367   ix86_finalize_stack_realign_flags ();
8368
8369  /* When stack is realigned, SP must be valid.  */
8370   sp_valid = (!frame_pointer_needed
8371               || current_function_sp_is_unchanging
8372               || stack_realign_fp);
8373
8374   ix86_compute_frame_layout (&frame);
8375
8376   /* See the comment about red zone and frame
8377      pointer usage in ix86_expand_prologue.  */
8378   if (frame_pointer_needed && frame.red_zone_size)
8379     emit_insn (gen_memory_blockage ()); 
8380
8381   /* Calculate start of saved registers relative to ebp.  Special care
8382      must be taken for the normal return case of a function using
8383      eh_return: the eax and edx registers are marked as saved, but not
8384      restored along this path.  */
8385   offset = frame.nregs;
8386   if (crtl->calls_eh_return && style != 2)
8387     offset -= 2;
8388   offset *= -UNITS_PER_WORD;
8389   offset -= frame.nsseregs * 16 + frame.padding0;
8390
8391   /* If we're only restoring one register and sp is not valid then
8392      using a move instruction to restore the register since it's
8393      less work than reloading sp and popping the register.
8394
8395      The default code result in stack adjustment using add/lea instruction,
8396      while this code results in LEAVE instruction (or discrete equivalent),
8397      so it is profitable in some other cases as well.  Especially when there
8398      are no registers to restore.  We also use this code when TARGET_USE_LEAVE
8399      and there is exactly one register to pop. This heuristic may need some
8400      tuning in future.  */
8401   if ((!sp_valid && (frame.nregs + frame.nsseregs) <= 1)
8402       || (TARGET_EPILOGUE_USING_MOVE
8403           && cfun->machine->use_fast_prologue_epilogue
8404           && ((frame.nregs + frame.nsseregs) > 1 || frame.to_allocate))
8405       || (frame_pointer_needed && !(frame.nregs + frame.nsseregs) && frame.to_allocate)
8406       || (frame_pointer_needed && TARGET_USE_LEAVE
8407           && cfun->machine->use_fast_prologue_epilogue
8408           && (frame.nregs + frame.nsseregs) == 1)
8409       || crtl->calls_eh_return)
8410     {
8411       /* Restore registers.  We can use ebp or esp to address the memory
8412          locations.  If both are available, default to ebp, since offsets
8413          are known to be small.  Only exception is esp pointing directly
8414          to the end of block of saved registers, where we may simplify
8415          addressing mode.  
8416
8417          If we are realigning stack with bp and sp, regs restore can't
8418          be addressed by bp. sp must be used instead.  */
8419
8420       if (!frame_pointer_needed
8421           || (sp_valid && !frame.to_allocate) 
8422           || stack_realign_fp)
8423         {
8424           ix86_emit_restore_sse_regs_using_mov (stack_pointer_rtx,
8425                                                 frame.to_allocate, style == 2);
8426           ix86_emit_restore_regs_using_mov (stack_pointer_rtx,
8427                                             frame.to_allocate
8428                                             + frame.nsseregs * 16
8429                                             + frame.padding0, style == 2);
8430         }
8431       else
8432         {
8433           ix86_emit_restore_sse_regs_using_mov (hard_frame_pointer_rtx,
8434                                                 offset, style == 2);
8435           ix86_emit_restore_regs_using_mov (hard_frame_pointer_rtx,
8436                                             offset
8437                                             + frame.nsseregs * 16
8438                                             + frame.padding0, style == 2);
8439         }
8440
8441       /* eh_return epilogues need %ecx added to the stack pointer.  */
8442       if (style == 2)
8443         {
8444           rtx tmp, sa = EH_RETURN_STACKADJ_RTX;
8445
8446           /* Stack align doesn't work with eh_return.  */
8447           gcc_assert (!crtl->stack_realign_needed);
8448
8449           if (frame_pointer_needed)
8450             {
8451               tmp = gen_rtx_PLUS (Pmode, hard_frame_pointer_rtx, sa);
8452               tmp = plus_constant (tmp, UNITS_PER_WORD);
8453               emit_insn (gen_rtx_SET (VOIDmode, sa, tmp));
8454
8455               tmp = gen_rtx_MEM (Pmode, hard_frame_pointer_rtx);
8456               emit_move_insn (hard_frame_pointer_rtx, tmp);
8457
8458               pro_epilogue_adjust_stack (stack_pointer_rtx, sa,
8459                                          const0_rtx, style);
8460             }
8461           else
8462             {
8463               tmp = gen_rtx_PLUS (Pmode, stack_pointer_rtx, sa);
8464               tmp = plus_constant (tmp, (frame.to_allocate
8465                                          + frame.nregs * UNITS_PER_WORD
8466                                          + frame.nsseregs * 16
8467                                          + frame.padding0));
8468               emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx, tmp));
8469             }
8470         }
8471       else if (!frame_pointer_needed)
8472         pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
8473                                    GEN_INT (frame.to_allocate
8474                                             + frame.nregs * UNITS_PER_WORD
8475                                             + frame.nsseregs * 16
8476                                             + frame.padding0),
8477                                    style);
8478       /* If not an i386, mov & pop is faster than "leave".  */
8479       else if (TARGET_USE_LEAVE || optimize_function_for_size_p (cfun)
8480                || !cfun->machine->use_fast_prologue_epilogue)
8481         emit_insn ((*ix86_gen_leave) ());
8482       else
8483         {
8484           pro_epilogue_adjust_stack (stack_pointer_rtx,
8485                                      hard_frame_pointer_rtx,
8486                                      const0_rtx, style);
8487
8488           emit_insn ((*ix86_gen_pop1) (hard_frame_pointer_rtx));
8489         }
8490     }
8491   else
8492     {
8493       /* First step is to deallocate the stack frame so that we can
8494          pop the registers.
8495
8496          If we realign stack with frame pointer, then stack pointer
8497          won't be able to recover via lea $offset(%bp), %sp, because
8498          there is a padding area between bp and sp for realign. 
8499          "add $to_allocate, %sp" must be used instead.  */
8500       if (!sp_valid)
8501         {
8502           gcc_assert (frame_pointer_needed);
8503           gcc_assert (!stack_realign_fp);
8504           pro_epilogue_adjust_stack (stack_pointer_rtx,
8505                                      hard_frame_pointer_rtx,
8506                                      GEN_INT (offset), style);
8507           ix86_emit_restore_sse_regs_using_mov (stack_pointer_rtx,
8508                                                 frame.to_allocate, style == 2);
8509           pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
8510                                      GEN_INT (frame.nsseregs * 16), style);
8511         }
8512       else if (frame.to_allocate || frame.nsseregs)
8513         {
8514           ix86_emit_restore_sse_regs_using_mov (stack_pointer_rtx,
8515                                                 frame.to_allocate,
8516                                                 style == 2);
8517           pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
8518                                      GEN_INT (frame.to_allocate
8519                                               + frame.nsseregs * 16
8520                                               + frame.padding0), style);
8521         }
8522
8523       for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
8524         if (!SSE_REGNO_P (regno) && ix86_save_reg (regno, false))
8525           emit_insn ((*ix86_gen_pop1) (gen_rtx_REG (Pmode, regno)));
8526       if (frame_pointer_needed)
8527         {
8528           /* Leave results in shorter dependency chains on CPUs that are
8529              able to grok it fast.  */
8530           if (TARGET_USE_LEAVE)
8531             emit_insn ((*ix86_gen_leave) ());
8532           else
8533             {
8534               /* For stack realigned really happens, recover stack 
8535                  pointer to hard frame pointer is a must, if not using 
8536                  leave.  */
8537               if (stack_realign_fp)
8538                 pro_epilogue_adjust_stack (stack_pointer_rtx,
8539                                            hard_frame_pointer_rtx,
8540                                            const0_rtx, style);
8541               emit_insn ((*ix86_gen_pop1) (hard_frame_pointer_rtx));
8542             }
8543         }
8544     }
8545
8546   if (crtl->drap_reg && crtl->stack_realign_needed)
8547     {
8548       int param_ptr_offset = (call_used_regs[REGNO (crtl->drap_reg)]
8549                               ? 0 : UNITS_PER_WORD);
8550       gcc_assert (stack_realign_drap);
8551       emit_insn ((*ix86_gen_add3) (stack_pointer_rtx,
8552                                    crtl->drap_reg,
8553                                    GEN_INT (-(UNITS_PER_WORD
8554                                               + param_ptr_offset))));
8555       if (!call_used_regs[REGNO (crtl->drap_reg)])
8556         emit_insn ((*ix86_gen_pop1) (crtl->drap_reg));
8557       
8558     }
8559
8560   /* Sibcall epilogues don't want a return instruction.  */
8561   if (style == 0)
8562     return;
8563
8564   if (crtl->args.pops_args && crtl->args.size)
8565     {
8566       rtx popc = GEN_INT (crtl->args.pops_args);
8567
8568       /* i386 can only pop 64K bytes.  If asked to pop more, pop
8569          return address, do explicit add, and jump indirectly to the
8570          caller.  */
8571
8572       if (crtl->args.pops_args >= 65536)
8573         {
8574           rtx ecx = gen_rtx_REG (SImode, CX_REG);
8575
8576           /* There is no "pascal" calling convention in any 64bit ABI.  */
8577           gcc_assert (!TARGET_64BIT);
8578
8579           emit_insn (gen_popsi1 (ecx));
8580           emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx, popc));
8581           emit_jump_insn (gen_return_indirect_internal (ecx));
8582         }
8583       else
8584         emit_jump_insn (gen_return_pop_internal (popc));
8585     }
8586   else
8587     emit_jump_insn (gen_return_internal ());
8588 }
8589
8590 /* Reset from the function's potential modifications.  */
8591
8592 static void
8593 ix86_output_function_epilogue (FILE *file ATTRIBUTE_UNUSED,
8594                                HOST_WIDE_INT size ATTRIBUTE_UNUSED)
8595 {
8596   if (pic_offset_table_rtx)
8597     SET_REGNO (pic_offset_table_rtx, REAL_PIC_OFFSET_TABLE_REGNUM);
8598 #if TARGET_MACHO
8599   /* Mach-O doesn't support labels at the end of objects, so if
8600      it looks like we might want one, insert a NOP.  */
8601   {
8602     rtx insn = get_last_insn ();
8603     while (insn
8604            && NOTE_P (insn)
8605            && NOTE_KIND (insn) != NOTE_INSN_DELETED_LABEL)
8606       insn = PREV_INSN (insn);
8607     if (insn
8608         && (LABEL_P (insn)
8609             || (NOTE_P (insn)
8610                 && NOTE_KIND (insn) == NOTE_INSN_DELETED_LABEL)))
8611       fputs ("\tnop\n", file);
8612   }
8613 #endif
8614
8615 }
8616 \f
8617 /* Extract the parts of an RTL expression that is a valid memory address
8618    for an instruction.  Return 0 if the structure of the address is
8619    grossly off.  Return -1 if the address contains ASHIFT, so it is not
8620    strictly valid, but still used for computing length of lea instruction.  */
8621
8622 int
8623 ix86_decompose_address (rtx addr, struct ix86_address *out)
8624 {
8625   rtx base = NULL_RTX, index = NULL_RTX, disp = NULL_RTX;
8626   rtx base_reg, index_reg;
8627   HOST_WIDE_INT scale = 1;
8628   rtx scale_rtx = NULL_RTX;
8629   int retval = 1;
8630   enum ix86_address_seg seg = SEG_DEFAULT;
8631
8632   if (REG_P (addr) || GET_CODE (addr) == SUBREG)
8633     base = addr;
8634   else if (GET_CODE (addr) == PLUS)
8635     {
8636       rtx addends[4], op;
8637       int n = 0, i;
8638
8639       op = addr;
8640       do
8641         {
8642           if (n >= 4)
8643             return 0;
8644           addends[n++] = XEXP (op, 1);
8645           op = XEXP (op, 0);
8646         }
8647       while (GET_CODE (op) == PLUS);
8648       if (n >= 4)
8649         return 0;
8650       addends[n] = op;
8651
8652       for (i = n; i >= 0; --i)
8653         {
8654           op = addends[i];
8655           switch (GET_CODE (op))
8656             {
8657             case MULT:
8658               if (index)
8659                 return 0;
8660               index = XEXP (op, 0);
8661               scale_rtx = XEXP (op, 1);
8662               break;
8663
8664             case UNSPEC:
8665               if (XINT (op, 1) == UNSPEC_TP
8666                   && TARGET_TLS_DIRECT_SEG_REFS
8667                   && seg == SEG_DEFAULT)
8668                 seg = TARGET_64BIT ? SEG_FS : SEG_GS;
8669               else
8670                 return 0;
8671               break;
8672
8673             case REG:
8674             case SUBREG:
8675               if (!base)
8676                 base = op;
8677               else if (!index)
8678                 index = op;
8679               else
8680                 return 0;
8681               break;
8682
8683             case CONST:
8684             case CONST_INT:
8685             case SYMBOL_REF:
8686             case LABEL_REF:
8687               if (disp)
8688                 return 0;
8689               disp = op;
8690               break;
8691
8692             default:
8693               return 0;
8694             }
8695         }
8696     }
8697   else if (GET_CODE (addr) == MULT)
8698     {
8699       index = XEXP (addr, 0);           /* index*scale */
8700       scale_rtx = XEXP (addr, 1);
8701     }
8702   else if (GET_CODE (addr) == ASHIFT)
8703     {
8704       rtx tmp;
8705
8706       /* We're called for lea too, which implements ashift on occasion.  */
8707       index = XEXP (addr, 0);
8708       tmp = XEXP (addr, 1);
8709       if (!CONST_INT_P (tmp))
8710         return 0;
8711       scale = INTVAL (tmp);
8712       if ((unsigned HOST_WIDE_INT) scale > 3)
8713         return 0;
8714       scale = 1 << scale;
8715       retval = -1;
8716     }
8717   else
8718     disp = addr;                        /* displacement */
8719
8720   /* Extract the integral value of scale.  */
8721   if (scale_rtx)
8722     {
8723       if (!CONST_INT_P (scale_rtx))
8724         return 0;
8725       scale = INTVAL (scale_rtx);
8726     }
8727
8728   base_reg = base && GET_CODE (base) == SUBREG ? SUBREG_REG (base) : base;
8729   index_reg = index && GET_CODE (index) == SUBREG ? SUBREG_REG (index) : index;
8730
8731   /* Allow arg pointer and stack pointer as index if there is not scaling.  */
8732   if (base_reg && index_reg && scale == 1
8733       && (index_reg == arg_pointer_rtx
8734           || index_reg == frame_pointer_rtx
8735           || (REG_P (index_reg) && REGNO (index_reg) == STACK_POINTER_REGNUM)))
8736     {
8737       rtx tmp;
8738       tmp = base, base = index, index = tmp;
8739       tmp = base_reg, base_reg = index_reg, index_reg = tmp;
8740     }
8741
8742   /* Special case: %ebp cannot be encoded as a base without a displacement.  */
8743   if ((base_reg == hard_frame_pointer_rtx
8744        || base_reg == frame_pointer_rtx
8745        || base_reg == arg_pointer_rtx) && !disp)
8746     disp = const0_rtx;
8747
8748   /* Special case: on K6, [%esi] makes the instruction vector decoded.
8749      Avoid this by transforming to [%esi+0].
8750      Reload calls address legitimization without cfun defined, so we need
8751      to test cfun for being non-NULL. */
8752   if (TARGET_K6 && cfun && optimize_function_for_speed_p (cfun)
8753       && base_reg && !index_reg && !disp
8754       && REG_P (base_reg)
8755       && REGNO_REG_CLASS (REGNO (base_reg)) == SIREG)
8756     disp = const0_rtx;
8757
8758   /* Special case: encode reg+reg instead of reg*2.  */
8759   if (!base && index && scale && scale == 2)
8760     base = index, base_reg = index_reg, scale = 1;
8761
8762   /* Special case: scaling cannot be encoded without base or displacement.  */
8763   if (!base && !disp && index && scale != 1)
8764     disp = const0_rtx;
8765
8766   out->base = base;
8767   out->index = index;
8768   out->disp = disp;
8769   out->scale = scale;
8770   out->seg = seg;
8771
8772   return retval;
8773 }
8774 \f
8775 /* Return cost of the memory address x.
8776    For i386, it is better to use a complex address than let gcc copy
8777    the address into a reg and make a new pseudo.  But not if the address
8778    requires to two regs - that would mean more pseudos with longer
8779    lifetimes.  */
8780 static int
8781 ix86_address_cost (rtx x, bool speed ATTRIBUTE_UNUSED)
8782 {
8783   struct ix86_address parts;
8784   int cost = 1;
8785   int ok = ix86_decompose_address (x, &parts);
8786
8787   gcc_assert (ok);
8788
8789   if (parts.base && GET_CODE (parts.base) == SUBREG)
8790     parts.base = SUBREG_REG (parts.base);
8791   if (parts.index && GET_CODE (parts.index) == SUBREG)
8792     parts.index = SUBREG_REG (parts.index);
8793
8794   /* Attempt to minimize number of registers in the address.  */
8795   if ((parts.base
8796        && (!REG_P (parts.base) || REGNO (parts.base) >= FIRST_PSEUDO_REGISTER))
8797       || (parts.index
8798           && (!REG_P (parts.index)
8799               || REGNO (parts.index) >= FIRST_PSEUDO_REGISTER)))
8800     cost++;
8801
8802   if (parts.base
8803       && (!REG_P (parts.base) || REGNO (parts.base) >= FIRST_PSEUDO_REGISTER)
8804       && parts.index
8805       && (!REG_P (parts.index) || REGNO (parts.index) >= FIRST_PSEUDO_REGISTER)
8806       && parts.base != parts.index)
8807     cost++;
8808
8809   /* AMD-K6 don't like addresses with ModR/M set to 00_xxx_100b,
8810      since it's predecode logic can't detect the length of instructions
8811      and it degenerates to vector decoded.  Increase cost of such
8812      addresses here.  The penalty is minimally 2 cycles.  It may be worthwhile
8813      to split such addresses or even refuse such addresses at all.
8814
8815      Following addressing modes are affected:
8816       [base+scale*index]
8817       [scale*index+disp]
8818       [base+index]
8819
8820      The first and last case  may be avoidable by explicitly coding the zero in
8821      memory address, but I don't have AMD-K6 machine handy to check this
8822      theory.  */
8823
8824   if (TARGET_K6
8825       && ((!parts.disp && parts.base && parts.index && parts.scale != 1)
8826           || (parts.disp && !parts.base && parts.index && parts.scale != 1)
8827           || (!parts.disp && parts.base && parts.index && parts.scale == 1)))
8828     cost += 10;
8829
8830   return cost;
8831 }
8832 \f
8833 /* Allow {LABEL | SYMBOL}_REF - SYMBOL_REF-FOR-PICBASE for Mach-O as
8834    this is used for to form addresses to local data when -fPIC is in
8835    use.  */
8836
8837 static bool
8838 darwin_local_data_pic (rtx disp)
8839 {
8840   return (GET_CODE (disp) == UNSPEC
8841           && XINT (disp, 1) == UNSPEC_MACHOPIC_OFFSET);
8842 }
8843
8844 /* Determine if a given RTX is a valid constant.  We already know this
8845    satisfies CONSTANT_P.  */
8846
8847 bool
8848 legitimate_constant_p (rtx x)
8849 {
8850   switch (GET_CODE (x))
8851     {
8852     case CONST:
8853       x = XEXP (x, 0);
8854
8855       if (GET_CODE (x) == PLUS)
8856         {
8857           if (!CONST_INT_P (XEXP (x, 1)))
8858             return false;
8859           x = XEXP (x, 0);
8860         }
8861
8862       if (TARGET_MACHO && darwin_local_data_pic (x))
8863         return true;
8864
8865       /* Only some unspecs are valid as "constants".  */
8866       if (GET_CODE (x) == UNSPEC)
8867         switch (XINT (x, 1))
8868           {
8869           case UNSPEC_GOT:
8870           case UNSPEC_GOTOFF:
8871           case UNSPEC_PLTOFF:
8872             return TARGET_64BIT;
8873           case UNSPEC_TPOFF:
8874           case UNSPEC_NTPOFF:
8875             x = XVECEXP (x, 0, 0);
8876             return (GET_CODE (x) == SYMBOL_REF
8877                     && SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_EXEC);
8878           case UNSPEC_DTPOFF:
8879             x = XVECEXP (x, 0, 0);
8880             return (GET_CODE (x) == SYMBOL_REF
8881                     && SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_DYNAMIC);
8882           default:
8883             return false;
8884           }
8885
8886       /* We must have drilled down to a symbol.  */
8887       if (GET_CODE (x) == LABEL_REF)
8888         return true;
8889       if (GET_CODE (x) != SYMBOL_REF)
8890         return false;
8891       /* FALLTHRU */
8892
8893     case SYMBOL_REF:
8894       /* TLS symbols are never valid.  */
8895       if (SYMBOL_REF_TLS_MODEL (x))
8896         return false;
8897
8898       /* DLLIMPORT symbols are never valid.  */
8899       if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
8900           && SYMBOL_REF_DLLIMPORT_P (x))
8901         return false;
8902       break;
8903
8904     case CONST_DOUBLE:
8905       if (GET_MODE (x) == TImode
8906           && x != CONST0_RTX (TImode)
8907           && !TARGET_64BIT)
8908         return false;
8909       break;
8910
8911     case CONST_VECTOR:
8912       if (x == CONST0_RTX (GET_MODE (x)))
8913         return true;
8914       return false;
8915
8916     default:
8917       break;
8918     }
8919
8920   /* Otherwise we handle everything else in the move patterns.  */
8921   return true;
8922 }
8923
8924 /* Determine if it's legal to put X into the constant pool.  This
8925    is not possible for the address of thread-local symbols, which
8926    is checked above.  */
8927
8928 static bool
8929 ix86_cannot_force_const_mem (rtx x)
8930 {
8931   /* We can always put integral constants and vectors in memory.  */
8932   switch (GET_CODE (x))
8933     {
8934     case CONST_INT:
8935     case CONST_DOUBLE:
8936     case CONST_VECTOR:
8937       return false;
8938
8939     default:
8940       break;
8941     }
8942   return !legitimate_constant_p (x);
8943 }
8944
8945 /* Determine if a given RTX is a valid constant address.  */
8946
8947 bool
8948 constant_address_p (rtx x)
8949 {
8950   return CONSTANT_P (x) && legitimate_address_p (Pmode, x, 1);
8951 }
8952
8953 /* Nonzero if the constant value X is a legitimate general operand
8954    when generating PIC code.  It is given that flag_pic is on and
8955    that X satisfies CONSTANT_P or is a CONST_DOUBLE.  */
8956
8957 bool
8958 legitimate_pic_operand_p (rtx x)
8959 {
8960   rtx inner;
8961
8962   switch (GET_CODE (x))
8963     {
8964     case CONST:
8965       inner = XEXP (x, 0);
8966       if (GET_CODE (inner) == PLUS
8967           && CONST_INT_P (XEXP (inner, 1)))
8968         inner = XEXP (inner, 0);
8969
8970       /* Only some unspecs are valid as "constants".  */
8971       if (GET_CODE (inner) == UNSPEC)
8972         switch (XINT (inner, 1))
8973           {
8974           case UNSPEC_GOT:
8975           case UNSPEC_GOTOFF:
8976           case UNSPEC_PLTOFF:
8977             return TARGET_64BIT;
8978           case UNSPEC_TPOFF:
8979             x = XVECEXP (inner, 0, 0);
8980             return (GET_CODE (x) == SYMBOL_REF
8981                     && SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_EXEC);
8982           case UNSPEC_MACHOPIC_OFFSET:
8983             return legitimate_pic_address_disp_p (x);
8984           default:
8985             return false;
8986           }
8987       /* FALLTHRU */
8988
8989     case SYMBOL_REF:
8990     case LABEL_REF:
8991       return legitimate_pic_address_disp_p (x);
8992
8993     default:
8994       return true;
8995     }
8996 }
8997
8998 /* Determine if a given CONST RTX is a valid memory displacement
8999    in PIC mode.  */
9000
9001 int
9002 legitimate_pic_address_disp_p (rtx disp)
9003 {
9004   bool saw_plus;
9005
9006   /* In 64bit mode we can allow direct addresses of symbols and labels
9007      when they are not dynamic symbols.  */
9008   if (TARGET_64BIT)
9009     {
9010       rtx op0 = disp, op1;
9011
9012       switch (GET_CODE (disp))
9013         {
9014         case LABEL_REF:
9015           return true;
9016
9017         case CONST:
9018           if (GET_CODE (XEXP (disp, 0)) != PLUS)
9019             break;
9020           op0 = XEXP (XEXP (disp, 0), 0);
9021           op1 = XEXP (XEXP (disp, 0), 1);
9022           if (!CONST_INT_P (op1)
9023               || INTVAL (op1) >= 16*1024*1024
9024               || INTVAL (op1) < -16*1024*1024)
9025             break;
9026           if (GET_CODE (op0) == LABEL_REF)
9027             return true;
9028           if (GET_CODE (op0) != SYMBOL_REF)
9029             break;
9030           /* FALLTHRU */
9031
9032         case SYMBOL_REF:
9033           /* TLS references should always be enclosed in UNSPEC.  */
9034           if (SYMBOL_REF_TLS_MODEL (op0))
9035             return false;
9036           if (!SYMBOL_REF_FAR_ADDR_P (op0) && SYMBOL_REF_LOCAL_P (op0)
9037               && ix86_cmodel != CM_LARGE_PIC)
9038             return true;
9039           break;
9040
9041         default:
9042           break;
9043         }
9044     }
9045   if (GET_CODE (disp) != CONST)
9046     return 0;
9047   disp = XEXP (disp, 0);
9048
9049   if (TARGET_64BIT)
9050     {
9051       /* We are unsafe to allow PLUS expressions.  This limit allowed distance
9052          of GOT tables.  We should not need these anyway.  */
9053       if (GET_CODE (disp) != UNSPEC
9054           || (XINT (disp, 1) != UNSPEC_GOTPCREL
9055               && XINT (disp, 1) != UNSPEC_GOTOFF
9056               && XINT (disp, 1) != UNSPEC_PLTOFF))
9057         return 0;
9058
9059       if (GET_CODE (XVECEXP (disp, 0, 0)) != SYMBOL_REF
9060           && GET_CODE (XVECEXP (disp, 0, 0)) != LABEL_REF)
9061         return 0;
9062       return 1;
9063     }
9064
9065   saw_plus = false;
9066   if (GET_CODE (disp) == PLUS)
9067     {
9068       if (!CONST_INT_P (XEXP (disp, 1)))
9069         return 0;
9070       disp = XEXP (disp, 0);
9071       saw_plus = true;
9072     }
9073
9074   if (TARGET_MACHO && darwin_local_data_pic (disp))
9075     return 1;
9076
9077   if (GET_CODE (disp) != UNSPEC)
9078     return 0;
9079
9080   switch (XINT (disp, 1))
9081     {
9082     case UNSPEC_GOT:
9083       if (saw_plus)
9084         return false;
9085       /* We need to check for both symbols and labels because VxWorks loads
9086          text labels with @GOT rather than @GOTOFF.  See gotoff_operand for
9087          details.  */
9088       return (GET_CODE (XVECEXP (disp, 0, 0)) == SYMBOL_REF
9089               || GET_CODE (XVECEXP (disp, 0, 0)) == LABEL_REF);
9090     case UNSPEC_GOTOFF:
9091       /* Refuse GOTOFF in 64bit mode since it is always 64bit when used.
9092          While ABI specify also 32bit relocation but we don't produce it in
9093          small PIC model at all.  */
9094       if ((GET_CODE (XVECEXP (disp, 0, 0)) == SYMBOL_REF
9095            || GET_CODE (XVECEXP (disp, 0, 0)) == LABEL_REF)
9096           && !TARGET_64BIT)
9097         return gotoff_operand (XVECEXP (disp, 0, 0), Pmode);
9098       return false;
9099     case UNSPEC_GOTTPOFF:
9100     case UNSPEC_GOTNTPOFF:
9101     case UNSPEC_INDNTPOFF:
9102       if (saw_plus)
9103         return false;
9104       disp = XVECEXP (disp, 0, 0);
9105       return (GET_CODE (disp) == SYMBOL_REF
9106               && SYMBOL_REF_TLS_MODEL (disp) == TLS_MODEL_INITIAL_EXEC);
9107     case UNSPEC_NTPOFF:
9108       disp = XVECEXP (disp, 0, 0);
9109       return (GET_CODE (disp) == SYMBOL_REF
9110               && SYMBOL_REF_TLS_MODEL (disp) == TLS_MODEL_LOCAL_EXEC);
9111     case UNSPEC_DTPOFF:
9112       disp = XVECEXP (disp, 0, 0);
9113       return (GET_CODE (disp) == SYMBOL_REF
9114               && SYMBOL_REF_TLS_MODEL (disp) == TLS_MODEL_LOCAL_DYNAMIC);
9115     }
9116
9117   return 0;
9118 }
9119
9120 /* GO_IF_LEGITIMATE_ADDRESS recognizes an RTL expression that is a valid
9121    memory address for an instruction.  The MODE argument is the machine mode
9122    for the MEM expression that wants to use this address.
9123
9124    It only recognizes address in canonical form.  LEGITIMIZE_ADDRESS should
9125    convert common non-canonical forms to canonical form so that they will
9126    be recognized.  */
9127
9128 int
9129 legitimate_address_p (enum machine_mode mode ATTRIBUTE_UNUSED,
9130                       rtx addr, int strict)
9131 {
9132   struct ix86_address parts;
9133   rtx base, index, disp;
9134   HOST_WIDE_INT scale;
9135   const char *reason = NULL;
9136   rtx reason_rtx = NULL_RTX;
9137
9138   if (ix86_decompose_address (addr, &parts) <= 0)
9139     {
9140       reason = "decomposition failed";
9141       goto report_error;
9142     }
9143
9144   base = parts.base;
9145   index = parts.index;
9146   disp = parts.disp;
9147   scale = parts.scale;
9148
9149   /* Validate base register.
9150
9151      Don't allow SUBREG's that span more than a word here.  It can lead to spill
9152      failures when the base is one word out of a two word structure, which is
9153      represented internally as a DImode int.  */
9154
9155   if (base)
9156     {
9157       rtx reg;
9158       reason_rtx = base;
9159
9160       if (REG_P (base))
9161         reg = base;
9162       else if (GET_CODE (base) == SUBREG
9163                && REG_P (SUBREG_REG (base))
9164                && GET_MODE_SIZE (GET_MODE (SUBREG_REG (base)))
9165                   <= UNITS_PER_WORD)
9166         reg = SUBREG_REG (base);
9167       else
9168         {
9169           reason = "base is not a register";
9170           goto report_error;
9171         }
9172
9173       if (GET_MODE (base) != Pmode)
9174         {
9175           reason = "base is not in Pmode";
9176           goto report_error;
9177         }
9178
9179       if ((strict && ! REG_OK_FOR_BASE_STRICT_P (reg))
9180           || (! strict && ! REG_OK_FOR_BASE_NONSTRICT_P (reg)))
9181         {
9182           reason = "base is not valid";
9183           goto report_error;
9184         }
9185     }
9186
9187   /* Validate index register.
9188
9189      Don't allow SUBREG's that span more than a word here -- same as above.  */
9190
9191   if (index)
9192     {
9193       rtx reg;
9194       reason_rtx = index;
9195
9196       if (REG_P (index))
9197         reg = index;
9198       else if (GET_CODE (index) == SUBREG
9199                && REG_P (SUBREG_REG (index))
9200                && GET_MODE_SIZE (GET_MODE (SUBREG_REG (index)))
9201                   <= UNITS_PER_WORD)
9202         reg = SUBREG_REG (index);
9203       else
9204         {
9205           reason = "index is not a register";
9206           goto report_error;
9207         }
9208
9209       if (GET_MODE (index) != Pmode)
9210         {
9211           reason = "index is not in Pmode";
9212           goto report_error;
9213         }
9214
9215       if ((strict && ! REG_OK_FOR_INDEX_STRICT_P (reg))
9216           || (! strict && ! REG_OK_FOR_INDEX_NONSTRICT_P (reg)))
9217         {
9218           reason = "index is not valid";
9219           goto report_error;
9220         }
9221     }
9222
9223   /* Validate scale factor.  */
9224   if (scale != 1)
9225     {
9226       reason_rtx = GEN_INT (scale);
9227       if (!index)
9228         {
9229           reason = "scale without index";
9230           goto report_error;
9231         }
9232
9233       if (scale != 2 && scale != 4 && scale != 8)
9234         {
9235           reason = "scale is not a valid multiplier";
9236           goto report_error;
9237         }
9238     }
9239
9240   /* Validate displacement.  */
9241   if (disp)
9242     {
9243       reason_rtx = disp;
9244
9245       if (GET_CODE (disp) == CONST
9246           && GET_CODE (XEXP (disp, 0)) == UNSPEC
9247           && XINT (XEXP (disp, 0), 1) != UNSPEC_MACHOPIC_OFFSET)
9248         switch (XINT (XEXP (disp, 0), 1))
9249           {
9250           /* Refuse GOTOFF and GOT in 64bit mode since it is always 64bit when
9251              used.  While ABI specify also 32bit relocations, we don't produce
9252              them at all and use IP relative instead.  */
9253           case UNSPEC_GOT:
9254           case UNSPEC_GOTOFF:
9255             gcc_assert (flag_pic);
9256             if (!TARGET_64BIT)
9257               goto is_legitimate_pic;
9258             reason = "64bit address unspec";
9259             goto report_error;
9260
9261           case UNSPEC_GOTPCREL:
9262             gcc_assert (flag_pic);
9263             goto is_legitimate_pic;
9264
9265           case UNSPEC_GOTTPOFF:
9266           case UNSPEC_GOTNTPOFF:
9267           case UNSPEC_INDNTPOFF:
9268           case UNSPEC_NTPOFF:
9269           case UNSPEC_DTPOFF:
9270             break;
9271
9272           default:
9273             reason = "invalid address unspec";
9274             goto report_error;
9275           }
9276
9277       else if (SYMBOLIC_CONST (disp)
9278                && (flag_pic
9279                    || (TARGET_MACHO
9280 #if TARGET_MACHO
9281                        && MACHOPIC_INDIRECT
9282                        && !machopic_operand_p (disp)
9283 #endif
9284                )))
9285         {
9286
9287         is_legitimate_pic:
9288           if (TARGET_64BIT && (index || base))
9289             {
9290               /* foo@dtpoff(%rX) is ok.  */
9291               if (GET_CODE (disp) != CONST
9292                   || GET_CODE (XEXP (disp, 0)) != PLUS
9293                   || GET_CODE (XEXP (XEXP (disp, 0), 0)) != UNSPEC
9294                   || !CONST_INT_P (XEXP (XEXP (disp, 0), 1))
9295                   || (XINT (XEXP (XEXP (disp, 0), 0), 1) != UNSPEC_DTPOFF
9296                       && XINT (XEXP (XEXP (disp, 0), 0), 1) != UNSPEC_NTPOFF))
9297                 {
9298                   reason = "non-constant pic memory reference";
9299                   goto report_error;
9300                 }
9301             }
9302           else if (! legitimate_pic_address_disp_p (disp))
9303             {
9304               reason = "displacement is an invalid pic construct";
9305               goto report_error;
9306             }
9307
9308           /* This code used to verify that a symbolic pic displacement
9309              includes the pic_offset_table_rtx register.
9310
9311              While this is good idea, unfortunately these constructs may
9312              be created by "adds using lea" optimization for incorrect
9313              code like:
9314
9315              int a;
9316              int foo(int i)
9317                {
9318                  return *(&a+i);
9319                }
9320
9321              This code is nonsensical, but results in addressing
9322              GOT table with pic_offset_table_rtx base.  We can't
9323              just refuse it easily, since it gets matched by
9324              "addsi3" pattern, that later gets split to lea in the
9325              case output register differs from input.  While this
9326              can be handled by separate addsi pattern for this case
9327              that never results in lea, this seems to be easier and
9328              correct fix for crash to disable this test.  */
9329         }
9330       else if (GET_CODE (disp) != LABEL_REF
9331                && !CONST_INT_P (disp)
9332                && (GET_CODE (disp) != CONST
9333                    || !legitimate_constant_p (disp))
9334                && (GET_CODE (disp) != SYMBOL_REF
9335                    || !legitimate_constant_p (disp)))
9336         {
9337           reason = "displacement is not constant";
9338           goto report_error;
9339         }
9340       else if (TARGET_64BIT
9341                && !x86_64_immediate_operand (disp, VOIDmode))
9342         {
9343           reason = "displacement is out of range";
9344           goto report_error;
9345         }
9346     }
9347
9348   /* Everything looks valid.  */
9349   return TRUE;
9350
9351  report_error:
9352   return FALSE;
9353 }
9354 \f
9355 /* Return a unique alias set for the GOT.  */
9356
9357 static alias_set_type
9358 ix86_GOT_alias_set (void)
9359 {
9360   static alias_set_type set = -1;
9361   if (set == -1)
9362     set = new_alias_set ();
9363   return set;
9364 }
9365
9366 /* Return a legitimate reference for ORIG (an address) using the
9367    register REG.  If REG is 0, a new pseudo is generated.
9368
9369    There are two types of references that must be handled:
9370
9371    1. Global data references must load the address from the GOT, via
9372       the PIC reg.  An insn is emitted to do this load, and the reg is
9373       returned.
9374
9375    2. Static data references, constant pool addresses, and code labels
9376       compute the address as an offset from the GOT, whose base is in
9377       the PIC reg.  Static data objects have SYMBOL_FLAG_LOCAL set to
9378       differentiate them from global data objects.  The returned
9379       address is the PIC reg + an unspec constant.
9380
9381    GO_IF_LEGITIMATE_ADDRESS rejects symbolic references unless the PIC
9382    reg also appears in the address.  */
9383
9384 static rtx
9385 legitimize_pic_address (rtx orig, rtx reg)
9386 {
9387   rtx addr = orig;
9388   rtx new_rtx = orig;
9389   rtx base;
9390
9391 #if TARGET_MACHO
9392   if (TARGET_MACHO && !TARGET_64BIT)
9393     {
9394       if (reg == 0)
9395         reg = gen_reg_rtx (Pmode);
9396       /* Use the generic Mach-O PIC machinery.  */
9397       return machopic_legitimize_pic_address (orig, GET_MODE (orig), reg);
9398     }
9399 #endif
9400
9401   if (TARGET_64BIT && legitimate_pic_address_disp_p (addr))
9402     new_rtx = addr;
9403   else if (TARGET_64BIT
9404            && ix86_cmodel != CM_SMALL_PIC
9405            && gotoff_operand (addr, Pmode))
9406     {
9407       rtx tmpreg;
9408       /* This symbol may be referenced via a displacement from the PIC
9409          base address (@GOTOFF).  */
9410
9411       if (reload_in_progress)
9412         df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
9413       if (GET_CODE (addr) == CONST)
9414         addr = XEXP (addr, 0);
9415       if (GET_CODE (addr) == PLUS)
9416           {
9417             new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, XEXP (addr, 0)),
9418                                       UNSPEC_GOTOFF);
9419             new_rtx = gen_rtx_PLUS (Pmode, new_rtx, XEXP (addr, 1));
9420           }
9421         else
9422           new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOTOFF);
9423       new_rtx = gen_rtx_CONST (Pmode, new_rtx);
9424       if (!reg)
9425         tmpreg = gen_reg_rtx (Pmode);
9426       else
9427         tmpreg = reg;
9428       emit_move_insn (tmpreg, new_rtx);
9429
9430       if (reg != 0)
9431         {
9432           new_rtx = expand_simple_binop (Pmode, PLUS, reg, pic_offset_table_rtx,
9433                                          tmpreg, 1, OPTAB_DIRECT);
9434           new_rtx = reg;
9435         }
9436       else new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, tmpreg);
9437     }
9438   else if (!TARGET_64BIT && gotoff_operand (addr, Pmode))
9439     {
9440       /* This symbol may be referenced via a displacement from the PIC
9441          base address (@GOTOFF).  */
9442
9443       if (reload_in_progress)
9444         df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
9445       if (GET_CODE (addr) == CONST)
9446         addr = XEXP (addr, 0);
9447       if (GET_CODE (addr) == PLUS)
9448           {
9449             new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, XEXP (addr, 0)),
9450                                       UNSPEC_GOTOFF);
9451             new_rtx = gen_rtx_PLUS (Pmode, new_rtx, XEXP (addr, 1));
9452           }
9453         else
9454           new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOTOFF);
9455       new_rtx = gen_rtx_CONST (Pmode, new_rtx);
9456       new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, new_rtx);
9457
9458       if (reg != 0)
9459         {
9460           emit_move_insn (reg, new_rtx);
9461           new_rtx = reg;
9462         }
9463     }
9464   else if ((GET_CODE (addr) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (addr) == 0)
9465            /* We can't use @GOTOFF for text labels on VxWorks;
9466               see gotoff_operand.  */
9467            || (TARGET_VXWORKS_RTP && GET_CODE (addr) == LABEL_REF))
9468     {
9469       if (TARGET_DLLIMPORT_DECL_ATTRIBUTES)
9470         {
9471           if (GET_CODE (addr) == SYMBOL_REF && SYMBOL_REF_DLLIMPORT_P (addr))
9472             return legitimize_dllimport_symbol (addr, true);
9473           if (GET_CODE (addr) == CONST && GET_CODE (XEXP (addr, 0)) == PLUS
9474               && GET_CODE (XEXP (XEXP (addr, 0), 0)) == SYMBOL_REF
9475               && SYMBOL_REF_DLLIMPORT_P (XEXP (XEXP (addr, 0), 0)))
9476             {
9477               rtx t = legitimize_dllimport_symbol (XEXP (XEXP (addr, 0), 0), true);
9478               return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (addr, 0), 1));
9479             }
9480         }
9481
9482       if (TARGET_64BIT && ix86_cmodel != CM_LARGE_PIC)
9483         {
9484           new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOTPCREL);
9485           new_rtx = gen_rtx_CONST (Pmode, new_rtx);
9486           new_rtx = gen_const_mem (Pmode, new_rtx);
9487           set_mem_alias_set (new_rtx, ix86_GOT_alias_set ());
9488
9489           if (reg == 0)
9490             reg = gen_reg_rtx (Pmode);
9491           /* Use directly gen_movsi, otherwise the address is loaded
9492              into register for CSE.  We don't want to CSE this addresses,
9493              instead we CSE addresses from the GOT table, so skip this.  */
9494           emit_insn (gen_movsi (reg, new_rtx));
9495           new_rtx = reg;
9496         }
9497       else
9498         {
9499           /* This symbol must be referenced via a load from the
9500              Global Offset Table (@GOT).  */
9501
9502           if (reload_in_progress)
9503             df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
9504           new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_GOT);
9505           new_rtx = gen_rtx_CONST (Pmode, new_rtx);
9506           if (TARGET_64BIT)
9507             new_rtx = force_reg (Pmode, new_rtx);
9508           new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, new_rtx);
9509           new_rtx = gen_const_mem (Pmode, new_rtx);
9510           set_mem_alias_set (new_rtx, ix86_GOT_alias_set ());
9511
9512           if (reg == 0)
9513             reg = gen_reg_rtx (Pmode);
9514           emit_move_insn (reg, new_rtx);
9515           new_rtx = reg;
9516         }
9517     }
9518   else
9519     {
9520       if (CONST_INT_P (addr)
9521           && !x86_64_immediate_operand (addr, VOIDmode))
9522         {
9523           if (reg)
9524             {
9525               emit_move_insn (reg, addr);
9526               new_rtx = reg;
9527             }
9528           else
9529             new_rtx = force_reg (Pmode, addr);
9530         }
9531       else if (GET_CODE (addr) == CONST)
9532         {
9533           addr = XEXP (addr, 0);
9534
9535           /* We must match stuff we generate before.  Assume the only
9536              unspecs that can get here are ours.  Not that we could do
9537              anything with them anyway....  */
9538           if (GET_CODE (addr) == UNSPEC
9539               || (GET_CODE (addr) == PLUS
9540                   && GET_CODE (XEXP (addr, 0)) == UNSPEC))
9541             return orig;
9542           gcc_assert (GET_CODE (addr) == PLUS);
9543         }
9544       if (GET_CODE (addr) == PLUS)
9545         {
9546           rtx op0 = XEXP (addr, 0), op1 = XEXP (addr, 1);
9547
9548           /* Check first to see if this is a constant offset from a @GOTOFF
9549              symbol reference.  */
9550           if (gotoff_operand (op0, Pmode)
9551               && CONST_INT_P (op1))
9552             {
9553               if (!TARGET_64BIT)
9554                 {
9555                   if (reload_in_progress)
9556                     df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
9557                   new_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, op0),
9558                                             UNSPEC_GOTOFF);
9559                   new_rtx = gen_rtx_PLUS (Pmode, new_rtx, op1);
9560                   new_rtx = gen_rtx_CONST (Pmode, new_rtx);
9561                   new_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, new_rtx);
9562
9563                   if (reg != 0)
9564                     {
9565                       emit_move_insn (reg, new_rtx);
9566                       new_rtx = reg;
9567                     }
9568                 }
9569               else
9570                 {
9571                   if (INTVAL (op1) < -16*1024*1024
9572                       || INTVAL (op1) >= 16*1024*1024)
9573                     {
9574                       if (!x86_64_immediate_operand (op1, Pmode))
9575                         op1 = force_reg (Pmode, op1);
9576                       new_rtx = gen_rtx_PLUS (Pmode, force_reg (Pmode, op0), op1);
9577                     }
9578                 }
9579             }
9580           else
9581             {
9582               base = legitimize_pic_address (XEXP (addr, 0), reg);
9583               new_rtx  = legitimize_pic_address (XEXP (addr, 1),
9584                                                  base == reg ? NULL_RTX : reg);
9585
9586               if (CONST_INT_P (new_rtx))
9587                 new_rtx = plus_constant (base, INTVAL (new_rtx));
9588               else
9589                 {
9590                   if (GET_CODE (new_rtx) == PLUS && CONSTANT_P (XEXP (new_rtx, 1)))
9591                     {
9592                       base = gen_rtx_PLUS (Pmode, base, XEXP (new_rtx, 0));
9593                       new_rtx = XEXP (new_rtx, 1);
9594                     }
9595                   new_rtx = gen_rtx_PLUS (Pmode, base, new_rtx);
9596                 }
9597             }
9598         }
9599     }
9600   return new_rtx;
9601 }
9602 \f
9603 /* Load the thread pointer.  If TO_REG is true, force it into a register.  */
9604
9605 static rtx
9606 get_thread_pointer (int to_reg)
9607 {
9608   rtx tp, reg, insn;
9609
9610   tp = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx), UNSPEC_TP);
9611   if (!to_reg)
9612     return tp;
9613
9614   reg = gen_reg_rtx (Pmode);
9615   insn = gen_rtx_SET (VOIDmode, reg, tp);
9616   insn = emit_insn (insn);
9617
9618   return reg;
9619 }
9620
9621 /* A subroutine of legitimize_address and ix86_expand_move.  FOR_MOV is
9622    false if we expect this to be used for a memory address and true if
9623    we expect to load the address into a register.  */
9624
9625 static rtx
9626 legitimize_tls_address (rtx x, enum tls_model model, int for_mov)
9627 {
9628   rtx dest, base, off, pic, tp;
9629   int type;
9630
9631   switch (model)
9632     {
9633     case TLS_MODEL_GLOBAL_DYNAMIC:
9634       dest = gen_reg_rtx (Pmode);
9635       tp = TARGET_GNU2_TLS ? get_thread_pointer (1) : 0;
9636
9637       if (TARGET_64BIT && ! TARGET_GNU2_TLS)
9638         {
9639           rtx rax = gen_rtx_REG (Pmode, AX_REG), insns;
9640
9641           start_sequence ();
9642           emit_call_insn (gen_tls_global_dynamic_64 (rax, x));
9643           insns = get_insns ();
9644           end_sequence ();
9645
9646           RTL_CONST_CALL_P (insns) = 1;
9647           emit_libcall_block (insns, dest, rax, x);
9648         }
9649       else if (TARGET_64BIT && TARGET_GNU2_TLS)
9650         emit_insn (gen_tls_global_dynamic_64 (dest, x));
9651       else
9652         emit_insn (gen_tls_global_dynamic_32 (dest, x));
9653
9654       if (TARGET_GNU2_TLS)
9655         {
9656           dest = force_reg (Pmode, gen_rtx_PLUS (Pmode, tp, dest));
9657
9658           set_unique_reg_note (get_last_insn (), REG_EQUIV, x);
9659         }
9660       break;
9661
9662     case TLS_MODEL_LOCAL_DYNAMIC:
9663       base = gen_reg_rtx (Pmode);
9664       tp = TARGET_GNU2_TLS ? get_thread_pointer (1) : 0;
9665
9666       if (TARGET_64BIT && ! TARGET_GNU2_TLS)
9667         {
9668           rtx rax = gen_rtx_REG (Pmode, AX_REG), insns, note;
9669
9670           start_sequence ();
9671           emit_call_insn (gen_tls_local_dynamic_base_64 (rax));
9672           insns = get_insns ();
9673           end_sequence ();
9674
9675           note = gen_rtx_EXPR_LIST (VOIDmode, const0_rtx, NULL);
9676           note = gen_rtx_EXPR_LIST (VOIDmode, ix86_tls_get_addr (), note);
9677           RTL_CONST_CALL_P (insns) = 1;
9678           emit_libcall_block (insns, base, rax, note);
9679         }
9680       else if (TARGET_64BIT && TARGET_GNU2_TLS)
9681         emit_insn (gen_tls_local_dynamic_base_64 (base));
9682       else
9683         emit_insn (gen_tls_local_dynamic_base_32 (base));
9684
9685       if (TARGET_GNU2_TLS)
9686         {
9687           rtx x = ix86_tls_module_base ();
9688
9689           set_unique_reg_note (get_last_insn (), REG_EQUIV,
9690                                gen_rtx_MINUS (Pmode, x, tp));
9691         }
9692
9693       off = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, x), UNSPEC_DTPOFF);
9694       off = gen_rtx_CONST (Pmode, off);
9695
9696       dest = force_reg (Pmode, gen_rtx_PLUS (Pmode, base, off));
9697
9698       if (TARGET_GNU2_TLS)
9699         {
9700           dest = force_reg (Pmode, gen_rtx_PLUS (Pmode, dest, tp));
9701
9702           set_unique_reg_note (get_last_insn (), REG_EQUIV, x);
9703         }
9704
9705       break;
9706
9707     case TLS_MODEL_INITIAL_EXEC:
9708       if (TARGET_64BIT)
9709         {
9710           pic = NULL;
9711           type = UNSPEC_GOTNTPOFF;
9712         }
9713       else if (flag_pic)
9714         {
9715           if (reload_in_progress)
9716             df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
9717           pic = pic_offset_table_rtx;
9718           type = TARGET_ANY_GNU_TLS ? UNSPEC_GOTNTPOFF : UNSPEC_GOTTPOFF;
9719         }
9720       else if (!TARGET_ANY_GNU_TLS)
9721         {
9722           pic = gen_reg_rtx (Pmode);
9723           emit_insn (gen_set_got (pic));
9724           type = UNSPEC_GOTTPOFF;
9725         }
9726       else
9727         {
9728           pic = NULL;
9729           type = UNSPEC_INDNTPOFF;
9730         }
9731
9732       off = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, x), type);
9733       off = gen_rtx_CONST (Pmode, off);
9734       if (pic)
9735         off = gen_rtx_PLUS (Pmode, pic, off);
9736       off = gen_const_mem (Pmode, off);
9737       set_mem_alias_set (off, ix86_GOT_alias_set ());
9738
9739       if (TARGET_64BIT || TARGET_ANY_GNU_TLS)
9740         {
9741           base = get_thread_pointer (for_mov || !TARGET_TLS_DIRECT_SEG_REFS);
9742           off = force_reg (Pmode, off);
9743           return gen_rtx_PLUS (Pmode, base, off);
9744         }
9745       else
9746         {
9747           base = get_thread_pointer (true);
9748           dest = gen_reg_rtx (Pmode);
9749           emit_insn (gen_subsi3 (dest, base, off));
9750         }
9751       break;
9752
9753     case TLS_MODEL_LOCAL_EXEC:
9754       off = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, x),
9755                             (TARGET_64BIT || TARGET_ANY_GNU_TLS)
9756                             ? UNSPEC_NTPOFF : UNSPEC_TPOFF);
9757       off = gen_rtx_CONST (Pmode, off);
9758
9759       if (TARGET_64BIT || TARGET_ANY_GNU_TLS)
9760         {
9761           base = get_thread_pointer (for_mov || !TARGET_TLS_DIRECT_SEG_REFS);
9762           return gen_rtx_PLUS (Pmode, base, off);
9763         }
9764       else
9765         {
9766           base = get_thread_pointer (true);
9767           dest = gen_reg_rtx (Pmode);
9768           emit_insn (gen_subsi3 (dest, base, off));
9769         }
9770       break;
9771
9772     default:
9773       gcc_unreachable ();
9774     }
9775
9776   return dest;
9777 }
9778
9779 /* Create or return the unique __imp_DECL dllimport symbol corresponding
9780    to symbol DECL.  */
9781
9782 static GTY((if_marked ("tree_map_marked_p"), param_is (struct tree_map)))
9783   htab_t dllimport_map;
9784
9785 static tree
9786 get_dllimport_decl (tree decl)
9787 {
9788   struct tree_map *h, in;
9789   void **loc;
9790   const char *name;
9791   const char *prefix;
9792   size_t namelen, prefixlen;
9793   char *imp_name;
9794   tree to;
9795   rtx rtl;
9796
9797   if (!dllimport_map)
9798     dllimport_map = htab_create_ggc (512, tree_map_hash, tree_map_eq, 0);
9799
9800   in.hash = htab_hash_pointer (decl);
9801   in.base.from = decl;
9802   loc = htab_find_slot_with_hash (dllimport_map, &in, in.hash, INSERT);
9803   h = (struct tree_map *) *loc;
9804   if (h)
9805     return h->to;
9806
9807   *loc = h = GGC_NEW (struct tree_map);
9808   h->hash = in.hash;
9809   h->base.from = decl;
9810   h->to = to = build_decl (VAR_DECL, NULL, ptr_type_node);
9811   DECL_ARTIFICIAL (to) = 1;
9812   DECL_IGNORED_P (to) = 1;
9813   DECL_EXTERNAL (to) = 1;
9814   TREE_READONLY (to) = 1;
9815
9816   name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
9817   name = targetm.strip_name_encoding (name);
9818   prefix = name[0] == FASTCALL_PREFIX || user_label_prefix[0] == 0
9819     ? "*__imp_" : "*__imp__";
9820   namelen = strlen (name);
9821   prefixlen = strlen (prefix);
9822   imp_name = (char *) alloca (namelen + prefixlen + 1);
9823   memcpy (imp_name, prefix, prefixlen);
9824   memcpy (imp_name + prefixlen, name, namelen + 1);
9825
9826   name = ggc_alloc_string (imp_name, namelen + prefixlen);
9827   rtl = gen_rtx_SYMBOL_REF (Pmode, name);
9828   SET_SYMBOL_REF_DECL (rtl, to);
9829   SYMBOL_REF_FLAGS (rtl) = SYMBOL_FLAG_LOCAL;
9830
9831   rtl = gen_const_mem (Pmode, rtl);
9832   set_mem_alias_set (rtl, ix86_GOT_alias_set ());
9833
9834   SET_DECL_RTL (to, rtl);
9835   SET_DECL_ASSEMBLER_NAME (to, get_identifier (name));
9836
9837   return to;
9838 }
9839
9840 /* Expand SYMBOL into its corresponding dllimport symbol.  WANT_REG is
9841    true if we require the result be a register.  */
9842
9843 static rtx
9844 legitimize_dllimport_symbol (rtx symbol, bool want_reg)
9845 {
9846   tree imp_decl;
9847   rtx x;
9848
9849   gcc_assert (SYMBOL_REF_DECL (symbol));
9850   imp_decl = get_dllimport_decl (SYMBOL_REF_DECL (symbol));
9851
9852   x = DECL_RTL (imp_decl);
9853   if (want_reg)
9854     x = force_reg (Pmode, x);
9855   return x;
9856 }
9857
9858 /* Try machine-dependent ways of modifying an illegitimate address
9859    to be legitimate.  If we find one, return the new, valid address.
9860    This macro is used in only one place: `memory_address' in explow.c.
9861
9862    OLDX is the address as it was before break_out_memory_refs was called.
9863    In some cases it is useful to look at this to decide what needs to be done.
9864
9865    MODE and WIN are passed so that this macro can use
9866    GO_IF_LEGITIMATE_ADDRESS.
9867
9868    It is always safe for this macro to do nothing.  It exists to recognize
9869    opportunities to optimize the output.
9870
9871    For the 80386, we handle X+REG by loading X into a register R and
9872    using R+REG.  R will go in a general reg and indexing will be used.
9873    However, if REG is a broken-out memory address or multiplication,
9874    nothing needs to be done because REG can certainly go in a general reg.
9875
9876    When -fpic is used, special handling is needed for symbolic references.
9877    See comments by legitimize_pic_address in i386.c for details.  */
9878
9879 rtx
9880 legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED, enum machine_mode mode)
9881 {
9882   int changed = 0;
9883   unsigned log;
9884
9885   log = GET_CODE (x) == SYMBOL_REF ? SYMBOL_REF_TLS_MODEL (x) : 0;
9886   if (log)
9887     return legitimize_tls_address (x, (enum tls_model) log, false);
9888   if (GET_CODE (x) == CONST
9889       && GET_CODE (XEXP (x, 0)) == PLUS
9890       && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
9891       && (log = SYMBOL_REF_TLS_MODEL (XEXP (XEXP (x, 0), 0))))
9892     {
9893       rtx t = legitimize_tls_address (XEXP (XEXP (x, 0), 0),
9894                                       (enum tls_model) log, false);
9895       return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (x, 0), 1));
9896     }
9897
9898   if (TARGET_DLLIMPORT_DECL_ATTRIBUTES)
9899     {
9900       if (GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_DLLIMPORT_P (x))
9901         return legitimize_dllimport_symbol (x, true);
9902       if (GET_CODE (x) == CONST
9903           && GET_CODE (XEXP (x, 0)) == PLUS
9904           && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
9905           && SYMBOL_REF_DLLIMPORT_P (XEXP (XEXP (x, 0), 0)))
9906         {
9907           rtx t = legitimize_dllimport_symbol (XEXP (XEXP (x, 0), 0), true);
9908           return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (x, 0), 1));
9909         }
9910     }
9911
9912   if (flag_pic && SYMBOLIC_CONST (x))
9913     return legitimize_pic_address (x, 0);
9914
9915   /* Canonicalize shifts by 0, 1, 2, 3 into multiply */
9916   if (GET_CODE (x) == ASHIFT
9917       && CONST_INT_P (XEXP (x, 1))
9918       && (unsigned HOST_WIDE_INT) INTVAL (XEXP (x, 1)) < 4)
9919     {
9920       changed = 1;
9921       log = INTVAL (XEXP (x, 1));
9922       x = gen_rtx_MULT (Pmode, force_reg (Pmode, XEXP (x, 0)),
9923                         GEN_INT (1 << log));
9924     }
9925
9926   if (GET_CODE (x) == PLUS)
9927     {
9928       /* Canonicalize shifts by 0, 1, 2, 3 into multiply.  */
9929
9930       if (GET_CODE (XEXP (x, 0)) == ASHIFT
9931           && CONST_INT_P (XEXP (XEXP (x, 0), 1))
9932           && (unsigned HOST_WIDE_INT) INTVAL (XEXP (XEXP (x, 0), 1)) < 4)
9933         {
9934           changed = 1;
9935           log = INTVAL (XEXP (XEXP (x, 0), 1));
9936           XEXP (x, 0) = gen_rtx_MULT (Pmode,
9937                                       force_reg (Pmode, XEXP (XEXP (x, 0), 0)),
9938                                       GEN_INT (1 << log));
9939         }
9940
9941       if (GET_CODE (XEXP (x, 1)) == ASHIFT
9942           && CONST_INT_P (XEXP (XEXP (x, 1), 1))
9943           && (unsigned HOST_WIDE_INT) INTVAL (XEXP (XEXP (x, 1), 1)) < 4)
9944         {
9945           changed = 1;
9946           log = INTVAL (XEXP (XEXP (x, 1), 1));
9947           XEXP (x, 1) = gen_rtx_MULT (Pmode,
9948                                       force_reg (Pmode, XEXP (XEXP (x, 1), 0)),
9949                                       GEN_INT (1 << log));
9950         }
9951
9952       /* Put multiply first if it isn't already.  */
9953       if (GET_CODE (XEXP (x, 1)) == MULT)
9954         {
9955           rtx tmp = XEXP (x, 0);
9956           XEXP (x, 0) = XEXP (x, 1);
9957           XEXP (x, 1) = tmp;
9958           changed = 1;
9959         }
9960
9961       /* Canonicalize (plus (mult (reg) (const)) (plus (reg) (const)))
9962          into (plus (plus (mult (reg) (const)) (reg)) (const)).  This can be
9963          created by virtual register instantiation, register elimination, and
9964          similar optimizations.  */
9965       if (GET_CODE (XEXP (x, 0)) == MULT && GET_CODE (XEXP (x, 1)) == PLUS)
9966         {
9967           changed = 1;
9968           x = gen_rtx_PLUS (Pmode,
9969                             gen_rtx_PLUS (Pmode, XEXP (x, 0),
9970                                           XEXP (XEXP (x, 1), 0)),
9971                             XEXP (XEXP (x, 1), 1));
9972         }
9973
9974       /* Canonicalize
9975          (plus (plus (mult (reg) (const)) (plus (reg) (const))) const)
9976          into (plus (plus (mult (reg) (const)) (reg)) (const)).  */
9977       else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 0)) == PLUS
9978                && GET_CODE (XEXP (XEXP (x, 0), 0)) == MULT
9979                && GET_CODE (XEXP (XEXP (x, 0), 1)) == PLUS
9980                && CONSTANT_P (XEXP (x, 1)))
9981         {
9982           rtx constant;
9983           rtx other = NULL_RTX;
9984
9985           if (CONST_INT_P (XEXP (x, 1)))
9986             {
9987               constant = XEXP (x, 1);
9988               other = XEXP (XEXP (XEXP (x, 0), 1), 1);
9989             }
9990           else if (CONST_INT_P (XEXP (XEXP (XEXP (x, 0), 1), 1)))
9991             {
9992               constant = XEXP (XEXP (XEXP (x, 0), 1), 1);
9993               other = XEXP (x, 1);
9994             }
9995           else
9996             constant = 0;
9997
9998           if (constant)
9999             {
10000               changed = 1;
10001               x = gen_rtx_PLUS (Pmode,
10002                                 gen_rtx_PLUS (Pmode, XEXP (XEXP (x, 0), 0),
10003                                               XEXP (XEXP (XEXP (x, 0), 1), 0)),
10004                                 plus_constant (other, INTVAL (constant)));
10005             }
10006         }
10007
10008       if (changed && legitimate_address_p (mode, x, FALSE))
10009         return x;
10010
10011       if (GET_CODE (XEXP (x, 0)) == MULT)
10012         {
10013           changed = 1;
10014           XEXP (x, 0) = force_operand (XEXP (x, 0), 0);
10015         }
10016
10017       if (GET_CODE (XEXP (x, 1)) == MULT)
10018         {
10019           changed = 1;
10020           XEXP (x, 1) = force_operand (XEXP (x, 1), 0);
10021         }
10022
10023       if (changed
10024           && REG_P (XEXP (x, 1))
10025           && REG_P (XEXP (x, 0)))
10026         return x;
10027
10028       if (flag_pic && SYMBOLIC_CONST (XEXP (x, 1)))
10029         {
10030           changed = 1;
10031           x = legitimize_pic_address (x, 0);
10032         }
10033
10034       if (changed && legitimate_address_p (mode, x, FALSE))
10035         return x;
10036
10037       if (REG_P (XEXP (x, 0)))
10038         {
10039           rtx temp = gen_reg_rtx (Pmode);
10040           rtx val  = force_operand (XEXP (x, 1), temp);
10041           if (val != temp)
10042             emit_move_insn (temp, val);
10043
10044           XEXP (x, 1) = temp;
10045           return x;
10046         }
10047
10048       else if (REG_P (XEXP (x, 1)))
10049         {
10050           rtx temp = gen_reg_rtx (Pmode);
10051           rtx val  = force_operand (XEXP (x, 0), temp);
10052           if (val != temp)
10053             emit_move_insn (temp, val);
10054
10055           XEXP (x, 0) = temp;
10056           return x;
10057         }
10058     }
10059
10060   return x;
10061 }
10062 \f
10063 /* Print an integer constant expression in assembler syntax.  Addition
10064    and subtraction are the only arithmetic that may appear in these
10065    expressions.  FILE is the stdio stream to write to, X is the rtx, and
10066    CODE is the operand print code from the output string.  */
10067
10068 static void
10069 output_pic_addr_const (FILE *file, rtx x, int code)
10070 {
10071   char buf[256];
10072
10073   switch (GET_CODE (x))
10074     {
10075     case PC:
10076       gcc_assert (flag_pic);
10077       putc ('.', file);
10078       break;
10079
10080     case SYMBOL_REF:
10081       if (! TARGET_MACHO || TARGET_64BIT)
10082         output_addr_const (file, x);
10083       else
10084         {
10085           const char *name = XSTR (x, 0);
10086
10087           /* Mark the decl as referenced so that cgraph will
10088              output the function.  */
10089           if (SYMBOL_REF_DECL (x))
10090             mark_decl_referenced (SYMBOL_REF_DECL (x));
10091
10092 #if TARGET_MACHO
10093           if (MACHOPIC_INDIRECT
10094               && machopic_classify_symbol (x) == MACHOPIC_UNDEFINED_FUNCTION)
10095             name = machopic_indirection_name (x, /*stub_p=*/true);
10096 #endif
10097           assemble_name (file, name);
10098         }
10099       if (!TARGET_MACHO && !(TARGET_64BIT && DEFAULT_ABI == MS_ABI)
10100           && code == 'P' && ! SYMBOL_REF_LOCAL_P (x))
10101         fputs ("@PLT", file);
10102       break;
10103
10104     case LABEL_REF:
10105       x = XEXP (x, 0);
10106       /* FALLTHRU */
10107     case CODE_LABEL:
10108       ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (x));
10109       assemble_name (asm_out_file, buf);
10110       break;
10111
10112     case CONST_INT:
10113       fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (x));
10114       break;
10115
10116     case CONST:
10117       /* This used to output parentheses around the expression,
10118          but that does not work on the 386 (either ATT or BSD assembler).  */
10119       output_pic_addr_const (file, XEXP (x, 0), code);
10120       break;
10121
10122     case CONST_DOUBLE:
10123       if (GET_MODE (x) == VOIDmode)
10124         {
10125           /* We can use %d if the number is <32 bits and positive.  */
10126           if (CONST_DOUBLE_HIGH (x) || CONST_DOUBLE_LOW (x) < 0)
10127             fprintf (file, "0x%lx%08lx",
10128                      (unsigned long) CONST_DOUBLE_HIGH (x),
10129                      (unsigned long) CONST_DOUBLE_LOW (x));
10130           else
10131             fprintf (file, HOST_WIDE_INT_PRINT_DEC, CONST_DOUBLE_LOW (x));
10132         }
10133       else
10134         /* We can't handle floating point constants;
10135            PRINT_OPERAND must handle them.  */
10136         output_operand_lossage ("floating constant misused");
10137       break;
10138
10139     case PLUS:
10140       /* Some assemblers need integer constants to appear first.  */
10141       if (CONST_INT_P (XEXP (x, 0)))
10142         {
10143           output_pic_addr_const (file, XEXP (x, 0), code);
10144           putc ('+', file);
10145           output_pic_addr_const (file, XEXP (x, 1), code);
10146         }
10147       else
10148         {
10149           gcc_assert (CONST_INT_P (XEXP (x, 1)));
10150           output_pic_addr_const (file, XEXP (x, 1), code);
10151           putc ('+', file);
10152           output_pic_addr_const (file, XEXP (x, 0), code);
10153         }
10154       break;
10155
10156     case MINUS:
10157       if (!TARGET_MACHO)
10158         putc (ASSEMBLER_DIALECT == ASM_INTEL ? '(' : '[', file);
10159       output_pic_addr_const (file, XEXP (x, 0), code);
10160       putc ('-', file);
10161       output_pic_addr_const (file, XEXP (x, 1), code);
10162       if (!TARGET_MACHO)
10163         putc (ASSEMBLER_DIALECT == ASM_INTEL ? ')' : ']', file);
10164       break;
10165
10166      case UNSPEC:
10167        gcc_assert (XVECLEN (x, 0) == 1);
10168        output_pic_addr_const (file, XVECEXP (x, 0, 0), code);
10169        switch (XINT (x, 1))
10170         {
10171         case UNSPEC_GOT:
10172           fputs ("@GOT", file);
10173           break;
10174         case UNSPEC_GOTOFF:
10175           fputs ("@GOTOFF", file);
10176           break;
10177         case UNSPEC_PLTOFF:
10178           fputs ("@PLTOFF", file);
10179           break;
10180         case UNSPEC_GOTPCREL:
10181           fputs (ASSEMBLER_DIALECT == ASM_ATT ?
10182                  "@GOTPCREL(%rip)" : "@GOTPCREL[rip]", file);
10183           break;
10184         case UNSPEC_GOTTPOFF:
10185           /* FIXME: This might be @TPOFF in Sun ld too.  */
10186           fputs ("@GOTTPOFF", file);
10187           break;
10188         case UNSPEC_TPOFF:
10189           fputs ("@TPOFF", file);
10190           break;
10191         case UNSPEC_NTPOFF:
10192           if (TARGET_64BIT)
10193             fputs ("@TPOFF", file);
10194           else
10195             fputs ("@NTPOFF", file);
10196           break;
10197         case UNSPEC_DTPOFF:
10198           fputs ("@DTPOFF", file);
10199           break;
10200         case UNSPEC_GOTNTPOFF:
10201           if (TARGET_64BIT)
10202             fputs (ASSEMBLER_DIALECT == ASM_ATT ?
10203                    "@GOTTPOFF(%rip)": "@GOTTPOFF[rip]", file);
10204           else
10205             fputs ("@GOTNTPOFF", file);
10206           break;
10207         case UNSPEC_INDNTPOFF:
10208           fputs ("@INDNTPOFF", file);
10209           break;
10210 #if TARGET_MACHO
10211         case UNSPEC_MACHOPIC_OFFSET:
10212           putc ('-', file);
10213           machopic_output_function_base_name (file);
10214           break;
10215 #endif
10216         default:
10217           output_operand_lossage ("invalid UNSPEC as operand");
10218           break;
10219         }
10220        break;
10221
10222     default:
10223       output_operand_lossage ("invalid expression as operand");
10224     }
10225 }
10226
10227 /* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL.
10228    We need to emit DTP-relative relocations.  */
10229
10230 static void ATTRIBUTE_UNUSED
10231 i386_output_dwarf_dtprel (FILE *file, int size, rtx x)
10232 {
10233   fputs (ASM_LONG, file);
10234   output_addr_const (file, x);
10235   fputs ("@DTPOFF", file);
10236   switch (size)
10237     {
10238     case 4:
10239       break;
10240     case 8:
10241       fputs (", 0", file);
10242       break;
10243     default:
10244       gcc_unreachable ();
10245    }
10246 }
10247
10248 /* Return true if X is a representation of the PIC register.  This copes
10249    with calls from ix86_find_base_term, where the register might have
10250    been replaced by a cselib value.  */
10251
10252 static bool
10253 ix86_pic_register_p (rtx x)
10254 {
10255   if (GET_CODE (x) == VALUE)
10256     return (pic_offset_table_rtx
10257             && rtx_equal_for_cselib_p (x, pic_offset_table_rtx));
10258   else
10259     return REG_P (x) && REGNO (x) == PIC_OFFSET_TABLE_REGNUM;
10260 }
10261
10262 /* In the name of slightly smaller debug output, and to cater to
10263    general assembler lossage, recognize PIC+GOTOFF and turn it back
10264    into a direct symbol reference.
10265
10266    On Darwin, this is necessary to avoid a crash, because Darwin
10267    has a different PIC label for each routine but the DWARF debugging
10268    information is not associated with any particular routine, so it's
10269    necessary to remove references to the PIC label from RTL stored by
10270    the DWARF output code.  */
10271
10272 static rtx
10273 ix86_delegitimize_address (rtx orig_x)
10274 {
10275   rtx x = orig_x;
10276   /* reg_addend is NULL or a multiple of some register.  */
10277   rtx reg_addend = NULL_RTX;
10278   /* const_addend is NULL or a const_int.  */
10279   rtx const_addend = NULL_RTX;
10280   /* This is the result, or NULL.  */
10281   rtx result = NULL_RTX;
10282
10283   if (MEM_P (x))
10284     x = XEXP (x, 0);
10285
10286   if (TARGET_64BIT)
10287     {
10288       if (GET_CODE (x) != CONST
10289           || GET_CODE (XEXP (x, 0)) != UNSPEC
10290           || XINT (XEXP (x, 0), 1) != UNSPEC_GOTPCREL
10291           || !MEM_P (orig_x))
10292         return orig_x;
10293       return XVECEXP (XEXP (x, 0), 0, 0);
10294     }
10295
10296   if (GET_CODE (x) != PLUS
10297       || GET_CODE (XEXP (x, 1)) != CONST)
10298     return orig_x;
10299
10300   if (ix86_pic_register_p (XEXP (x, 0)))
10301     /* %ebx + GOT/GOTOFF */
10302     ;
10303   else if (GET_CODE (XEXP (x, 0)) == PLUS)
10304     {
10305       /* %ebx + %reg * scale + GOT/GOTOFF */
10306       reg_addend = XEXP (x, 0);
10307       if (ix86_pic_register_p (XEXP (reg_addend, 0)))
10308         reg_addend = XEXP (reg_addend, 1);
10309       else if (ix86_pic_register_p (XEXP (reg_addend, 1)))
10310         reg_addend = XEXP (reg_addend, 0);
10311       else
10312         return orig_x;
10313       if (!REG_P (reg_addend)
10314           && GET_CODE (reg_addend) != MULT
10315           && GET_CODE (reg_addend) != ASHIFT)
10316         return orig_x;
10317     }
10318   else
10319     return orig_x;
10320
10321   x = XEXP (XEXP (x, 1), 0);
10322   if (GET_CODE (x) == PLUS
10323       && CONST_INT_P (XEXP (x, 1)))
10324     {
10325       const_addend = XEXP (x, 1);
10326       x = XEXP (x, 0);
10327     }
10328
10329   if (GET_CODE (x) == UNSPEC
10330       && ((XINT (x, 1) == UNSPEC_GOT && MEM_P (orig_x))
10331           || (XINT (x, 1) == UNSPEC_GOTOFF && !MEM_P (orig_x))))
10332     result = XVECEXP (x, 0, 0);
10333
10334   if (TARGET_MACHO && darwin_local_data_pic (x)
10335       && !MEM_P (orig_x))
10336     result = XVECEXP (x, 0, 0);
10337
10338   if (! result)
10339     return orig_x;
10340
10341   if (const_addend)
10342     result = gen_rtx_CONST (Pmode, gen_rtx_PLUS (Pmode, result, const_addend));
10343   if (reg_addend)
10344     result = gen_rtx_PLUS (Pmode, reg_addend, result);
10345   return result;
10346 }
10347
10348 /* If X is a machine specific address (i.e. a symbol or label being
10349    referenced as a displacement from the GOT implemented using an
10350    UNSPEC), then return the base term.  Otherwise return X.  */
10351
10352 rtx
10353 ix86_find_base_term (rtx x)
10354 {
10355   rtx term;
10356
10357   if (TARGET_64BIT)
10358     {
10359       if (GET_CODE (x) != CONST)
10360         return x;
10361       term = XEXP (x, 0);
10362       if (GET_CODE (term) == PLUS
10363           && (CONST_INT_P (XEXP (term, 1))
10364               || GET_CODE (XEXP (term, 1)) == CONST_DOUBLE))
10365         term = XEXP (term, 0);
10366       if (GET_CODE (term) != UNSPEC
10367           || XINT (term, 1) != UNSPEC_GOTPCREL)
10368         return x;
10369
10370       return XVECEXP (term, 0, 0);
10371     }
10372
10373   return ix86_delegitimize_address (x);
10374 }
10375 \f
10376 static void
10377 put_condition_code (enum rtx_code code, enum machine_mode mode, int reverse,
10378                     int fp, FILE *file)
10379 {
10380   const char *suffix;
10381
10382   if (mode == CCFPmode || mode == CCFPUmode)
10383     {
10384       enum rtx_code second_code, bypass_code;
10385       ix86_fp_comparison_codes (code, &bypass_code, &code, &second_code);
10386       gcc_assert (bypass_code == UNKNOWN && second_code == UNKNOWN);
10387       code = ix86_fp_compare_code_to_integer (code);
10388       mode = CCmode;
10389     }
10390   if (reverse)
10391     code = reverse_condition (code);
10392
10393   switch (code)
10394     {
10395     case EQ:
10396       switch (mode)
10397         {
10398         case CCAmode:
10399           suffix = "a";
10400           break;
10401
10402         case CCCmode:
10403           suffix = "c";
10404           break;
10405
10406         case CCOmode:
10407           suffix = "o";
10408           break;
10409
10410         case CCSmode:
10411           suffix = "s";
10412           break;
10413
10414         default:
10415           suffix = "e";
10416         }
10417       break;
10418     case NE:
10419       switch (mode)
10420         {
10421         case CCAmode:
10422           suffix = "na";
10423           break;
10424
10425         case CCCmode:
10426           suffix = "nc";
10427           break;
10428
10429         case CCOmode:
10430           suffix = "no";
10431           break;
10432
10433         case CCSmode:
10434           suffix = "ns";
10435           break;
10436
10437         default:
10438           suffix = "ne";
10439         }
10440       break;
10441     case GT:
10442       gcc_assert (mode == CCmode || mode == CCNOmode || mode == CCGCmode);
10443       suffix = "g";
10444       break;
10445     case GTU:
10446       /* ??? Use "nbe" instead of "a" for fcmov lossage on some assemblers.
10447          Those same assemblers have the same but opposite lossage on cmov.  */
10448       if (mode == CCmode)
10449         suffix = fp ? "nbe" : "a";
10450       else if (mode == CCCmode)
10451         suffix = "b";
10452       else
10453         gcc_unreachable ();
10454       break;
10455     case LT:
10456       switch (mode)
10457         {
10458         case CCNOmode:
10459         case CCGOCmode:
10460           suffix = "s";
10461           break;
10462
10463         case CCmode:
10464         case CCGCmode:
10465           suffix = "l";
10466           break;
10467
10468         default:
10469           gcc_unreachable ();
10470         }
10471       break;
10472     case LTU:
10473       gcc_assert (mode == CCmode || mode == CCCmode);
10474       suffix = "b";
10475       break;
10476     case GE:
10477       switch (mode)
10478         {
10479         case CCNOmode:
10480         case CCGOCmode:
10481           suffix = "ns";
10482           break;
10483
10484         case CCmode:
10485         case CCGCmode:
10486           suffix = "ge";
10487           break;
10488
10489         default:
10490           gcc_unreachable ();
10491         }
10492       break;
10493     case GEU:
10494       /* ??? As above.  */
10495       gcc_assert (mode == CCmode || mode == CCCmode);
10496       suffix = fp ? "nb" : "ae";
10497       break;
10498     case LE:
10499       gcc_assert (mode == CCmode || mode == CCGCmode || mode == CCNOmode);
10500       suffix = "le";
10501       break;
10502     case LEU:
10503       /* ??? As above.  */
10504       if (mode == CCmode)
10505         suffix = "be";
10506       else if (mode == CCCmode)
10507         suffix = fp ? "nb" : "ae";
10508       else
10509         gcc_unreachable ();
10510       break;
10511     case UNORDERED:
10512       suffix = fp ? "u" : "p";
10513       break;
10514     case ORDERED:
10515       suffix = fp ? "nu" : "np";
10516       break;
10517     default:
10518       gcc_unreachable ();
10519     }
10520   fputs (suffix, file);
10521 }
10522
10523 /* Print the name of register X to FILE based on its machine mode and number.
10524    If CODE is 'w', pretend the mode is HImode.
10525    If CODE is 'b', pretend the mode is QImode.
10526    If CODE is 'k', pretend the mode is SImode.
10527    If CODE is 'q', pretend the mode is DImode.
10528    If CODE is 'x', pretend the mode is V4SFmode.
10529    If CODE is 't', pretend the mode is V8SFmode.
10530    If CODE is 'h', pretend the reg is the 'high' byte register.
10531    If CODE is 'y', print "st(0)" instead of "st", if the reg is stack op.
10532    If CODE is 'd', duplicate the operand for AVX instruction.
10533  */
10534
10535 void
10536 print_reg (rtx x, int code, FILE *file)
10537 {
10538   const char *reg;
10539   bool duplicated = code == 'd' && TARGET_AVX;
10540
10541   gcc_assert (x == pc_rtx
10542               || (REGNO (x) != ARG_POINTER_REGNUM
10543                   && REGNO (x) != FRAME_POINTER_REGNUM
10544                   && REGNO (x) != FLAGS_REG
10545                   && REGNO (x) != FPSR_REG
10546                   && REGNO (x) != FPCR_REG));
10547
10548   if (ASSEMBLER_DIALECT == ASM_ATT)
10549     putc ('%', file);
10550
10551   if (x == pc_rtx)
10552     {
10553       gcc_assert (TARGET_64BIT);
10554       fputs ("rip", file);
10555       return;
10556     }
10557
10558   if (code == 'w' || MMX_REG_P (x))
10559     code = 2;
10560   else if (code == 'b')
10561     code = 1;
10562   else if (code == 'k')
10563     code = 4;
10564   else if (code == 'q')
10565     code = 8;
10566   else if (code == 'y')
10567     code = 3;
10568   else if (code == 'h')
10569     code = 0;
10570   else if (code == 'x')
10571     code = 16;
10572   else if (code == 't')
10573     code = 32;
10574   else
10575     code = GET_MODE_SIZE (GET_MODE (x));
10576
10577   /* Irritatingly, AMD extended registers use different naming convention
10578      from the normal registers.  */
10579   if (REX_INT_REG_P (x))
10580     {
10581       gcc_assert (TARGET_64BIT);
10582       switch (code)
10583         {
10584           case 0:
10585             error ("extended registers have no high halves");
10586             break;
10587           case 1:
10588             fprintf (file, "r%ib", REGNO (x) - FIRST_REX_INT_REG + 8);
10589             break;
10590           case 2:
10591             fprintf (file, "r%iw", REGNO (x) - FIRST_REX_INT_REG + 8);
10592             break;
10593           case 4:
10594             fprintf (file, "r%id", REGNO (x) - FIRST_REX_INT_REG + 8);
10595             break;
10596           case 8:
10597             fprintf (file, "r%i", REGNO (x) - FIRST_REX_INT_REG + 8);
10598             break;
10599           default:
10600             error ("unsupported operand size for extended register");
10601             break;
10602         }
10603       return;
10604     }
10605
10606   reg = NULL;
10607   switch (code)
10608     {
10609     case 3:
10610       if (STACK_TOP_P (x))
10611         {
10612           reg = "st(0)";
10613           break;
10614         }
10615       /* FALLTHRU */
10616     case 8:
10617     case 4:
10618     case 12:
10619       if (! ANY_FP_REG_P (x))
10620         putc (code == 8 && TARGET_64BIT ? 'r' : 'e', file);
10621       /* FALLTHRU */
10622     case 16:
10623     case 2:
10624     normal:
10625       reg = hi_reg_name[REGNO (x)];
10626       break;
10627     case 1:
10628       if (REGNO (x) >= ARRAY_SIZE (qi_reg_name))
10629         goto normal;
10630       reg = qi_reg_name[REGNO (x)];
10631       break;
10632     case 0:
10633       if (REGNO (x) >= ARRAY_SIZE (qi_high_reg_name))
10634         goto normal;
10635       reg = qi_high_reg_name[REGNO (x)];
10636       break;
10637     case 32:
10638       if (SSE_REG_P (x))
10639         {
10640           gcc_assert (!duplicated);
10641           putc ('y', file);
10642           fputs (hi_reg_name[REGNO (x)] + 1, file);
10643           return;
10644         }
10645       break;
10646     default:
10647       gcc_unreachable ();
10648     }
10649
10650   fputs (reg, file);
10651   if (duplicated)
10652     {
10653       if (ASSEMBLER_DIALECT == ASM_ATT)
10654         fprintf (file, ", %%%s", reg);
10655       else
10656         fprintf (file, ", %s", reg);
10657     }
10658 }
10659
10660 /* Locate some local-dynamic symbol still in use by this function
10661    so that we can print its name in some tls_local_dynamic_base
10662    pattern.  */
10663
10664 static int
10665 get_some_local_dynamic_name_1 (rtx *px, void *data ATTRIBUTE_UNUSED)
10666 {
10667   rtx x = *px;
10668
10669   if (GET_CODE (x) == SYMBOL_REF
10670       && SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_DYNAMIC)
10671     {
10672       cfun->machine->some_ld_name = XSTR (x, 0);
10673       return 1;
10674     }
10675
10676   return 0;
10677 }
10678
10679 static const char *
10680 get_some_local_dynamic_name (void)
10681 {
10682   rtx insn;
10683
10684   if (cfun->machine->some_ld_name)
10685     return cfun->machine->some_ld_name;
10686
10687   for (insn = get_insns (); insn ; insn = NEXT_INSN (insn))
10688     if (INSN_P (insn)
10689         && for_each_rtx (&PATTERN (insn), get_some_local_dynamic_name_1, 0))
10690       return cfun->machine->some_ld_name;
10691
10692   gcc_unreachable ();
10693 }
10694
10695 /* Meaning of CODE:
10696    L,W,B,Q,S,T -- print the opcode suffix for specified size of operand.
10697    C -- print opcode suffix for set/cmov insn.
10698    c -- like C, but print reversed condition
10699    E,e -- likewise, but for compare-and-branch fused insn.
10700    F,f -- likewise, but for floating-point.
10701    O -- if HAVE_AS_IX86_CMOV_SUN_SYNTAX, expand to "w.", "l." or "q.",
10702         otherwise nothing
10703    R -- print the prefix for register names.
10704    z -- print the opcode suffix for the size of the current operand.
10705    * -- print a star (in certain assembler syntax)
10706    A -- print an absolute memory reference.
10707    w -- print the operand as if it's a "word" (HImode) even if it isn't.
10708    s -- print a shift double count, followed by the assemblers argument
10709         delimiter.
10710    b -- print the QImode name of the register for the indicated operand.
10711         %b0 would print %al if operands[0] is reg 0.
10712    w --  likewise, print the HImode name of the register.
10713    k --  likewise, print the SImode name of the register.
10714    q --  likewise, print the DImode name of the register.
10715    x --  likewise, print the V4SFmode name of the register.
10716    t --  likewise, print the V8SFmode name of the register.
10717    h -- print the QImode name for a "high" register, either ah, bh, ch or dh.
10718    y -- print "st(0)" instead of "st" as a register.
10719    d -- print duplicated register operand for AVX instruction.
10720    D -- print condition for SSE cmp instruction.
10721    P -- if PIC, print an @PLT suffix.
10722    X -- don't print any sort of PIC '@' suffix for a symbol.
10723    & -- print some in-use local-dynamic symbol name.
10724    H -- print a memory address offset by 8; used for sse high-parts
10725    Y -- print condition for SSE5 com* instruction.
10726    + -- print a branch hint as 'cs' or 'ds' prefix
10727    ; -- print a semicolon (after prefixes due to bug in older gas).
10728  */
10729
10730 void
10731 print_operand (FILE *file, rtx x, int code)
10732 {
10733   if (code)
10734     {
10735       switch (code)
10736         {
10737         case '*':
10738           if (ASSEMBLER_DIALECT == ASM_ATT)
10739             putc ('*', file);
10740           return;
10741
10742         case '&':
10743           assemble_name (file, get_some_local_dynamic_name ());
10744           return;
10745
10746         case 'A':
10747           switch (ASSEMBLER_DIALECT)
10748             {
10749             case ASM_ATT:
10750               putc ('*', file);
10751               break;
10752
10753             case ASM_INTEL:
10754               /* Intel syntax. For absolute addresses, registers should not
10755                  be surrounded by braces.  */
10756               if (!REG_P (x))
10757                 {
10758                   putc ('[', file);
10759                   PRINT_OPERAND (file, x, 0);
10760                   putc (']', file);
10761                   return;
10762                 }
10763               break;
10764
10765             default:
10766               gcc_unreachable ();
10767             }
10768
10769           PRINT_OPERAND (file, x, 0);
10770           return;
10771
10772
10773         case 'L':
10774           if (ASSEMBLER_DIALECT == ASM_ATT)
10775             putc ('l', file);
10776           return;
10777
10778         case 'W':
10779           if (ASSEMBLER_DIALECT == ASM_ATT)
10780             putc ('w', file);
10781           return;
10782
10783         case 'B':
10784           if (ASSEMBLER_DIALECT == ASM_ATT)
10785             putc ('b', file);
10786           return;
10787
10788         case 'Q':
10789           if (ASSEMBLER_DIALECT == ASM_ATT)
10790             putc ('l', file);
10791           return;
10792
10793         case 'S':
10794           if (ASSEMBLER_DIALECT == ASM_ATT)
10795             putc ('s', file);
10796           return;
10797
10798         case 'T':
10799           if (ASSEMBLER_DIALECT == ASM_ATT)
10800             putc ('t', file);
10801           return;
10802
10803         case 'z':
10804           /* 387 opcodes don't get size suffixes if the operands are
10805              registers.  */
10806           if (STACK_REG_P (x))
10807             return;
10808
10809           /* Likewise if using Intel opcodes.  */
10810           if (ASSEMBLER_DIALECT == ASM_INTEL)
10811             return;
10812
10813           /* This is the size of op from size of operand.  */
10814           switch (GET_MODE_SIZE (GET_MODE (x)))
10815             {
10816             case 1:
10817               putc ('b', file);
10818               return;
10819
10820             case 2:
10821               if (MEM_P (x))
10822                 {
10823 #ifdef HAVE_GAS_FILDS_FISTS
10824                   putc ('s', file);
10825 #endif
10826                   return;
10827                 }
10828               else
10829                 putc ('w', file);
10830               return;
10831
10832             case 4:
10833               if (GET_MODE (x) == SFmode)
10834                 {
10835                   putc ('s', file);
10836                   return;
10837                 }
10838               else
10839                 putc ('l', file);
10840               return;
10841
10842             case 12:
10843             case 16:
10844               putc ('t', file);
10845               return;
10846
10847             case 8:
10848               if (GET_MODE_CLASS (GET_MODE (x)) == MODE_INT)
10849                 {
10850                   if (MEM_P (x))
10851                     {
10852 #ifdef GAS_MNEMONICS
10853                       putc ('q', file);
10854 #else
10855                       putc ('l', file);
10856                       putc ('l', file);
10857 #endif
10858                     }
10859                   else
10860                     putc ('q', file);
10861                 }
10862               else
10863                 putc ('l', file);
10864               return;
10865
10866             default:
10867               gcc_unreachable ();
10868             }
10869
10870         case 'd':
10871         case 'b':
10872         case 'w':
10873         case 'k':
10874         case 'q':
10875         case 'h':
10876         case 't':
10877         case 'y':
10878         case 'x':
10879         case 'X':
10880         case 'P':
10881           break;
10882
10883         case 's':
10884           if (CONST_INT_P (x) || ! SHIFT_DOUBLE_OMITS_COUNT)
10885             {
10886               PRINT_OPERAND (file, x, 0);
10887               fputs (", ", file);
10888             }
10889           return;
10890
10891         case 'D':
10892           /* Little bit of braindamage here.  The SSE compare instructions
10893              does use completely different names for the comparisons that the
10894              fp conditional moves.  */
10895           if (TARGET_AVX)
10896             {
10897               switch (GET_CODE (x))
10898                 {
10899                 case EQ:
10900                   fputs ("eq", file);
10901                   break;
10902                 case UNEQ:
10903                   fputs ("eq_us", file);
10904                   break;
10905                 case LT:
10906                   fputs ("lt", file);
10907                   break;
10908                 case UNLT:
10909                   fputs ("nge", file);
10910                   break;
10911                 case LE:
10912                   fputs ("le", file);
10913                   break;
10914                 case UNLE:
10915                   fputs ("ngt", file);
10916                   break;
10917                 case UNORDERED:
10918                   fputs ("unord", file);
10919                   break;
10920                 case NE:
10921                   fputs ("neq", file);
10922                   break;
10923                 case LTGT:
10924                   fputs ("neq_oq", file);
10925                   break;
10926                 case GE:
10927                   fputs ("ge", file);
10928                   break;
10929                 case UNGE:
10930                   fputs ("nlt", file);
10931                   break;
10932                 case GT:
10933                   fputs ("gt", file);
10934                   break;
10935                 case UNGT:
10936                   fputs ("nle", file);
10937                   break;
10938                 case ORDERED:
10939                   fputs ("ord", file);
10940                   break;
10941                 default:
10942                   output_operand_lossage ("operand is not a condition code, invalid operand code 'D'");
10943                   return;
10944                 }
10945             }
10946           else
10947             {
10948               switch (GET_CODE (x))
10949                 {
10950                 case EQ:
10951                 case UNEQ:
10952                   fputs ("eq", file);
10953                   break;
10954                 case LT:
10955                 case UNLT:
10956                   fputs ("lt", file);
10957                   break;
10958                 case LE:
10959                 case UNLE:
10960                   fputs ("le", file);
10961                   break;
10962                 case UNORDERED:
10963                   fputs ("unord", file);
10964                   break;
10965                 case NE:
10966                 case LTGT:
10967                   fputs ("neq", file);
10968                   break;
10969                 case UNGE:
10970                 case GE:
10971                   fputs ("nlt", file);
10972                   break;
10973                 case UNGT:
10974                 case GT:
10975                   fputs ("nle", file);
10976                   break;
10977                 case ORDERED:
10978                   fputs ("ord", file);
10979                   break;
10980                 default:
10981                   output_operand_lossage ("operand is not a condition code, invalid operand code 'D'");
10982                   return;
10983                 }
10984             }
10985           return;
10986         case 'O':
10987 #ifdef HAVE_AS_IX86_CMOV_SUN_SYNTAX
10988           if (ASSEMBLER_DIALECT == ASM_ATT)
10989             {
10990               switch (GET_MODE (x))
10991                 {
10992                 case HImode: putc ('w', file); break;
10993                 case SImode:
10994                 case SFmode: putc ('l', file); break;
10995                 case DImode:
10996                 case DFmode: putc ('q', file); break;
10997                 default: gcc_unreachable ();
10998                 }
10999               putc ('.', file);
11000             }
11001 #endif
11002           return;
11003         case 'C':
11004           if (!COMPARISON_P (x))
11005             {
11006               output_operand_lossage ("operand is neither a constant nor a "
11007                                       "condition code, invalid operand code "
11008                                       "'C'");
11009               return;
11010             }
11011           put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 0, 0, file);
11012           return;
11013         case 'F':
11014           if (!COMPARISON_P (x))
11015             {
11016               output_operand_lossage ("operand is neither a constant nor a "
11017                                       "condition code, invalid operand code "
11018                                       "'F'");
11019               return;
11020             }
11021 #ifdef HAVE_AS_IX86_CMOV_SUN_SYNTAX
11022           if (ASSEMBLER_DIALECT == ASM_ATT)
11023             putc ('.', file);
11024 #endif
11025           put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 0, 1, file);
11026           return;
11027
11028           /* Like above, but reverse condition */
11029         case 'c':
11030           /* Check to see if argument to %c is really a constant
11031              and not a condition code which needs to be reversed.  */
11032           if (!COMPARISON_P (x))
11033             {
11034               output_operand_lossage ("operand is neither a constant nor a "
11035                                       "condition code, invalid operand "
11036                                       "code 'c'");
11037               return;
11038             }
11039           put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 1, 0, file);
11040           return;
11041         case 'f':
11042           if (!COMPARISON_P (x))
11043             {
11044               output_operand_lossage ("operand is neither a constant nor a "
11045                                       "condition code, invalid operand "
11046                                       "code 'f'");
11047               return;
11048             }
11049 #ifdef HAVE_AS_IX86_CMOV_SUN_SYNTAX
11050           if (ASSEMBLER_DIALECT == ASM_ATT)
11051             putc ('.', file);
11052 #endif
11053           put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 1, 1, file);
11054           return;
11055
11056         case 'E':
11057           put_condition_code (GET_CODE (x), CCmode, 0, 0, file);
11058           return;
11059
11060         case 'e':
11061           put_condition_code (GET_CODE (x), CCmode, 1, 0, file);
11062           return;
11063
11064         case 'H':
11065           /* It doesn't actually matter what mode we use here, as we're
11066              only going to use this for printing.  */
11067           x = adjust_address_nv (x, DImode, 8);
11068           break;
11069
11070         case '+':
11071           {
11072             rtx x;
11073
11074             if (!optimize
11075                 || optimize_function_for_size_p (cfun) || !TARGET_BRANCH_PREDICTION_HINTS)
11076               return;
11077
11078             x = find_reg_note (current_output_insn, REG_BR_PROB, 0);
11079             if (x)
11080               {
11081                 int pred_val = INTVAL (XEXP (x, 0));
11082
11083                 if (pred_val < REG_BR_PROB_BASE * 45 / 100
11084                     || pred_val > REG_BR_PROB_BASE * 55 / 100)
11085                   {
11086                     int taken = pred_val > REG_BR_PROB_BASE / 2;
11087                     int cputaken = final_forward_branch_p (current_output_insn) == 0;
11088
11089                     /* Emit hints only in the case default branch prediction
11090                        heuristics would fail.  */
11091                     if (taken != cputaken)
11092                       {
11093                         /* We use 3e (DS) prefix for taken branches and
11094                            2e (CS) prefix for not taken branches.  */
11095                         if (taken)
11096                           fputs ("ds ; ", file);
11097                         else
11098                           fputs ("cs ; ", file);
11099                       }
11100                   }
11101               }
11102             return;
11103           }
11104
11105         case 'Y':
11106           switch (GET_CODE (x))
11107             {
11108             case NE:
11109               fputs ("neq", file);
11110               break;
11111             case EQ:
11112               fputs ("eq", file);
11113               break;
11114             case GE:
11115             case GEU:
11116               fputs (INTEGRAL_MODE_P (GET_MODE (x)) ? "ge" : "unlt", file);
11117               break;
11118             case GT:
11119             case GTU:
11120               fputs (INTEGRAL_MODE_P (GET_MODE (x)) ? "gt" : "unle", file);
11121               break;
11122             case LE:
11123             case LEU:
11124               fputs ("le", file);
11125               break;
11126             case LT:
11127             case LTU:
11128               fputs ("lt", file);
11129               break;
11130             case UNORDERED:
11131               fputs ("unord", file);
11132               break;
11133             case ORDERED:
11134               fputs ("ord", file);
11135               break;
11136             case UNEQ:
11137               fputs ("ueq", file);
11138               break;
11139             case UNGE:
11140               fputs ("nlt", file);
11141               break;
11142             case UNGT:
11143               fputs ("nle", file);
11144               break;
11145             case UNLE:
11146               fputs ("ule", file);
11147               break;
11148             case UNLT:
11149               fputs ("ult", file);
11150               break;
11151             case LTGT:
11152               fputs ("une", file);
11153               break;
11154             default:
11155               output_operand_lossage ("operand is not a condition code, invalid operand code 'D'");
11156               return;
11157             }
11158           return;
11159
11160         case ';':
11161 #if TARGET_MACHO
11162           fputs (" ; ", file);
11163 #else
11164           fputc (' ', file);
11165 #endif
11166           return;
11167
11168         default:
11169             output_operand_lossage ("invalid operand code '%c'", code);
11170         }
11171     }
11172
11173   if (REG_P (x))
11174     print_reg (x, code, file);
11175
11176   else if (MEM_P (x))
11177     {
11178       /* No `byte ptr' prefix for call instructions or BLKmode operands.  */
11179       if (ASSEMBLER_DIALECT == ASM_INTEL && code != 'X' && code != 'P'
11180           && GET_MODE (x) != BLKmode)
11181         {
11182           const char * size;
11183           switch (GET_MODE_SIZE (GET_MODE (x)))
11184             {
11185             case 1: size = "BYTE"; break;
11186             case 2: size = "WORD"; break;
11187             case 4: size = "DWORD"; break;
11188             case 8: size = "QWORD"; break;
11189             case 12: size = "XWORD"; break;
11190             case 16:
11191               if (GET_MODE (x) == XFmode)
11192                 size = "XWORD";
11193               else
11194                 size = "XMMWORD";
11195               break;
11196             default:
11197               gcc_unreachable ();
11198             }
11199
11200           /* Check for explicit size override (codes 'b', 'w' and 'k')  */
11201           if (code == 'b')
11202             size = "BYTE";
11203           else if (code == 'w')
11204             size = "WORD";
11205           else if (code == 'k')
11206             size = "DWORD";
11207
11208           fputs (size, file);
11209           fputs (" PTR ", file);
11210         }
11211
11212       x = XEXP (x, 0);
11213       /* Avoid (%rip) for call operands.  */
11214       if (CONSTANT_ADDRESS_P (x) && code == 'P'
11215           && !CONST_INT_P (x))
11216         output_addr_const (file, x);
11217       else if (this_is_asm_operands && ! address_operand (x, VOIDmode))
11218         output_operand_lossage ("invalid constraints for operand");
11219       else
11220         output_address (x);
11221     }
11222
11223   else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == SFmode)
11224     {
11225       REAL_VALUE_TYPE r;
11226       long l;
11227
11228       REAL_VALUE_FROM_CONST_DOUBLE (r, x);
11229       REAL_VALUE_TO_TARGET_SINGLE (r, l);
11230
11231       if (ASSEMBLER_DIALECT == ASM_ATT)
11232         putc ('$', file);
11233       fprintf (file, "0x%08lx", (long unsigned int) l);
11234     }
11235
11236   /* These float cases don't actually occur as immediate operands.  */
11237   else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == DFmode)
11238     {
11239       char dstr[30];
11240
11241       real_to_decimal (dstr, CONST_DOUBLE_REAL_VALUE (x), sizeof (dstr), 0, 1);
11242       fprintf (file, "%s", dstr);
11243     }
11244
11245   else if (GET_CODE (x) == CONST_DOUBLE
11246            && GET_MODE (x) == XFmode)
11247     {
11248       char dstr[30];
11249
11250       real_to_decimal (dstr, CONST_DOUBLE_REAL_VALUE (x), sizeof (dstr), 0, 1);
11251       fprintf (file, "%s", dstr);
11252     }
11253
11254   else
11255     {
11256       /* We have patterns that allow zero sets of memory, for instance.
11257          In 64-bit mode, we should probably support all 8-byte vectors,
11258          since we can in fact encode that into an immediate.  */
11259       if (GET_CODE (x) == CONST_VECTOR)
11260         {
11261           gcc_assert (x == CONST0_RTX (GET_MODE (x)));
11262           x = const0_rtx;
11263         }
11264
11265       if (code != 'P')
11266         {
11267           if (CONST_INT_P (x) || GET_CODE (x) == CONST_DOUBLE)
11268             {
11269               if (ASSEMBLER_DIALECT == ASM_ATT)
11270                 putc ('$', file);
11271             }
11272           else if (GET_CODE (x) == CONST || GET_CODE (x) == SYMBOL_REF
11273                    || GET_CODE (x) == LABEL_REF)
11274             {
11275               if (ASSEMBLER_DIALECT == ASM_ATT)
11276                 putc ('$', file);
11277               else
11278                 fputs ("OFFSET FLAT:", file);
11279             }
11280         }
11281       if (CONST_INT_P (x))
11282         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (x));
11283       else if (flag_pic)
11284         output_pic_addr_const (file, x, code);
11285       else
11286         output_addr_const (file, x);
11287     }
11288 }
11289 \f
11290 /* Print a memory operand whose address is ADDR.  */
11291
11292 void
11293 print_operand_address (FILE *file, rtx addr)
11294 {
11295   struct ix86_address parts;
11296   rtx base, index, disp;
11297   int scale;
11298   int ok = ix86_decompose_address (addr, &parts);
11299
11300   gcc_assert (ok);
11301
11302   base = parts.base;
11303   index = parts.index;
11304   disp = parts.disp;
11305   scale = parts.scale;
11306
11307   switch (parts.seg)
11308     {
11309     case SEG_DEFAULT:
11310       break;
11311     case SEG_FS:
11312     case SEG_GS:
11313       if (ASSEMBLER_DIALECT == ASM_ATT)
11314         putc ('%', file);
11315       fputs ((parts.seg == SEG_FS ? "fs:" : "gs:"), file);
11316       break;
11317     default:
11318       gcc_unreachable ();
11319     }
11320
11321   /* Use one byte shorter RIP relative addressing for 64bit mode.  */
11322   if (TARGET_64BIT && !base && !index)
11323     {
11324       rtx symbol = disp;
11325
11326       if (GET_CODE (disp) == CONST
11327           && GET_CODE (XEXP (disp, 0)) == PLUS
11328           && CONST_INT_P (XEXP (XEXP (disp, 0), 1)))
11329         symbol = XEXP (XEXP (disp, 0), 0);
11330
11331       if (GET_CODE (symbol) == LABEL_REF
11332           || (GET_CODE (symbol) == SYMBOL_REF
11333               && SYMBOL_REF_TLS_MODEL (symbol) == 0))
11334         base = pc_rtx;
11335     }
11336   if (!base && !index)
11337     {
11338       /* Displacement only requires special attention.  */
11339
11340       if (CONST_INT_P (disp))
11341         {
11342           if (ASSEMBLER_DIALECT == ASM_INTEL && parts.seg == SEG_DEFAULT)
11343             fputs ("ds:", file);
11344           fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (disp));
11345         }
11346       else if (flag_pic)
11347         output_pic_addr_const (file, disp, 0);
11348       else
11349         output_addr_const (file, disp);
11350     }
11351   else
11352     {
11353       if (ASSEMBLER_DIALECT == ASM_ATT)
11354         {
11355           if (disp)
11356             {
11357               if (flag_pic)
11358                 output_pic_addr_const (file, disp, 0);
11359               else if (GET_CODE (disp) == LABEL_REF)
11360                 output_asm_label (disp);
11361               else
11362                 output_addr_const (file, disp);
11363             }
11364
11365           putc ('(', file);
11366           if (base)
11367             print_reg (base, 0, file);
11368           if (index)
11369             {
11370               putc (',', file);
11371               print_reg (index, 0, file);
11372               if (scale != 1)
11373                 fprintf (file, ",%d", scale);
11374             }
11375           putc (')', file);
11376         }
11377       else
11378         {
11379           rtx offset = NULL_RTX;
11380
11381           if (disp)
11382             {
11383               /* Pull out the offset of a symbol; print any symbol itself.  */
11384               if (GET_CODE (disp) == CONST
11385                   && GET_CODE (XEXP (disp, 0)) == PLUS
11386                   && CONST_INT_P (XEXP (XEXP (disp, 0), 1)))
11387                 {
11388                   offset = XEXP (XEXP (disp, 0), 1);
11389                   disp = gen_rtx_CONST (VOIDmode,
11390                                         XEXP (XEXP (disp, 0), 0));
11391                 }
11392
11393               if (flag_pic)
11394                 output_pic_addr_const (file, disp, 0);
11395               else if (GET_CODE (disp) == LABEL_REF)
11396                 output_asm_label (disp);
11397               else if (CONST_INT_P (disp))
11398                 offset = disp;
11399               else
11400                 output_addr_const (file, disp);
11401             }
11402
11403           putc ('[', file);
11404           if (base)
11405             {
11406               print_reg (base, 0, file);
11407               if (offset)
11408                 {
11409                   if (INTVAL (offset) >= 0)
11410                     putc ('+', file);
11411                   fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (offset));
11412                 }
11413             }
11414           else if (offset)
11415             fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (offset));
11416           else
11417             putc ('0', file);
11418
11419           if (index)
11420             {
11421               putc ('+', file);
11422               print_reg (index, 0, file);
11423               if (scale != 1)
11424                 fprintf (file, "*%d", scale);
11425             }
11426           putc (']', file);
11427         }
11428     }
11429 }
11430
11431 bool
11432 output_addr_const_extra (FILE *file, rtx x)
11433 {
11434   rtx op;
11435
11436   if (GET_CODE (x) != UNSPEC)
11437     return false;
11438
11439   op = XVECEXP (x, 0, 0);
11440   switch (XINT (x, 1))
11441     {
11442     case UNSPEC_GOTTPOFF:
11443       output_addr_const (file, op);
11444       /* FIXME: This might be @TPOFF in Sun ld.  */
11445       fputs ("@GOTTPOFF", file);
11446       break;
11447     case UNSPEC_TPOFF:
11448       output_addr_const (file, op);
11449       fputs ("@TPOFF", file);
11450       break;
11451     case UNSPEC_NTPOFF:
11452       output_addr_const (file, op);
11453       if (TARGET_64BIT)
11454         fputs ("@TPOFF", file);
11455       else
11456         fputs ("@NTPOFF", file);
11457       break;
11458     case UNSPEC_DTPOFF:
11459       output_addr_const (file, op);
11460       fputs ("@DTPOFF", file);
11461       break;
11462     case UNSPEC_GOTNTPOFF:
11463       output_addr_const (file, op);
11464       if (TARGET_64BIT)
11465         fputs (ASSEMBLER_DIALECT == ASM_ATT ?
11466                "@GOTTPOFF(%rip)" : "@GOTTPOFF[rip]", file);
11467       else
11468         fputs ("@GOTNTPOFF", file);
11469       break;
11470     case UNSPEC_INDNTPOFF:
11471       output_addr_const (file, op);
11472       fputs ("@INDNTPOFF", file);
11473       break;
11474 #if TARGET_MACHO
11475     case UNSPEC_MACHOPIC_OFFSET:
11476       output_addr_const (file, op);
11477       putc ('-', file);
11478       machopic_output_function_base_name (file);
11479       break;
11480 #endif
11481
11482     default:
11483       return false;
11484     }
11485
11486   return true;
11487 }
11488 \f
11489 /* Split one or more DImode RTL references into pairs of SImode
11490    references.  The RTL can be REG, offsettable MEM, integer constant, or
11491    CONST_DOUBLE.  "operands" is a pointer to an array of DImode RTL to
11492    split and "num" is its length.  lo_half and hi_half are output arrays
11493    that parallel "operands".  */
11494
11495 void
11496 split_di (rtx operands[], int num, rtx lo_half[], rtx hi_half[])
11497 {
11498   while (num--)
11499     {
11500       rtx op = operands[num];
11501
11502       /* simplify_subreg refuse to split volatile memory addresses,
11503          but we still have to handle it.  */
11504       if (MEM_P (op))
11505         {
11506           lo_half[num] = adjust_address (op, SImode, 0);
11507           hi_half[num] = adjust_address (op, SImode, 4);
11508         }
11509       else
11510         {
11511           lo_half[num] = simplify_gen_subreg (SImode, op,
11512                                               GET_MODE (op) == VOIDmode
11513                                               ? DImode : GET_MODE (op), 0);
11514           hi_half[num] = simplify_gen_subreg (SImode, op,
11515                                               GET_MODE (op) == VOIDmode
11516                                               ? DImode : GET_MODE (op), 4);
11517         }
11518     }
11519 }
11520 /* Split one or more TImode RTL references into pairs of DImode
11521    references.  The RTL can be REG, offsettable MEM, integer constant, or
11522    CONST_DOUBLE.  "operands" is a pointer to an array of DImode RTL to
11523    split and "num" is its length.  lo_half and hi_half are output arrays
11524    that parallel "operands".  */
11525
11526 void
11527 split_ti (rtx operands[], int num, rtx lo_half[], rtx hi_half[])
11528 {
11529   while (num--)
11530     {
11531       rtx op = operands[num];
11532
11533       /* simplify_subreg refuse to split volatile memory addresses, but we
11534          still have to handle it.  */
11535       if (MEM_P (op))
11536         {
11537           lo_half[num] = adjust_address (op, DImode, 0);
11538           hi_half[num] = adjust_address (op, DImode, 8);
11539         }
11540       else
11541         {
11542           lo_half[num] = simplify_gen_subreg (DImode, op, TImode, 0);
11543           hi_half[num] = simplify_gen_subreg (DImode, op, TImode, 8);
11544         }
11545     }
11546 }
11547 \f
11548 /* Output code to perform a 387 binary operation in INSN, one of PLUS,
11549    MINUS, MULT or DIV.  OPERANDS are the insn operands, where operands[3]
11550    is the expression of the binary operation.  The output may either be
11551    emitted here, or returned to the caller, like all output_* functions.
11552
11553    There is no guarantee that the operands are the same mode, as they
11554    might be within FLOAT or FLOAT_EXTEND expressions.  */
11555
11556 #ifndef SYSV386_COMPAT
11557 /* Set to 1 for compatibility with brain-damaged assemblers.  No-one
11558    wants to fix the assemblers because that causes incompatibility
11559    with gcc.  No-one wants to fix gcc because that causes
11560    incompatibility with assemblers...  You can use the option of
11561    -DSYSV386_COMPAT=0 if you recompile both gcc and gas this way.  */
11562 #define SYSV386_COMPAT 1
11563 #endif
11564
11565 const char *
11566 output_387_binary_op (rtx insn, rtx *operands)
11567 {
11568   static char buf[40];
11569   const char *p;
11570   const char *ssep;
11571   int is_sse = SSE_REG_P (operands[0]) || SSE_REG_P (operands[1]) || SSE_REG_P (operands[2]);
11572
11573 #ifdef ENABLE_CHECKING
11574   /* Even if we do not want to check the inputs, this documents input
11575      constraints.  Which helps in understanding the following code.  */
11576   if (STACK_REG_P (operands[0])
11577       && ((REG_P (operands[1])
11578            && REGNO (operands[0]) == REGNO (operands[1])
11579            && (STACK_REG_P (operands[2]) || MEM_P (operands[2])))
11580           || (REG_P (operands[2])
11581               && REGNO (operands[0]) == REGNO (operands[2])
11582               && (STACK_REG_P (operands[1]) || MEM_P (operands[1]))))
11583       && (STACK_TOP_P (operands[1]) || STACK_TOP_P (operands[2])))
11584     ; /* ok */
11585   else
11586     gcc_assert (is_sse);
11587 #endif
11588
11589   switch (GET_CODE (operands[3]))
11590     {
11591     case PLUS:
11592       if (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
11593           || GET_MODE_CLASS (GET_MODE (operands[2])) == MODE_INT)
11594         p = "fiadd";
11595       else
11596         p = "fadd";
11597       ssep = "vadd";
11598       break;
11599
11600     case MINUS:
11601       if (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
11602           || GET_MODE_CLASS (GET_MODE (operands[2])) == MODE_INT)
11603         p = "fisub";
11604       else
11605         p = "fsub";
11606       ssep = "vsub";
11607       break;
11608
11609     case MULT:
11610       if (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
11611           || GET_MODE_CLASS (GET_MODE (operands[2])) == MODE_INT)
11612         p = "fimul";
11613       else
11614         p = "fmul";
11615       ssep = "vmul";
11616       break;
11617
11618     case DIV:
11619       if (GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT
11620           || GET_MODE_CLASS (GET_MODE (operands[2])) == MODE_INT)
11621         p = "fidiv";
11622       else
11623         p = "fdiv";
11624       ssep = "vdiv";
11625       break;
11626
11627     default:
11628       gcc_unreachable ();
11629     }
11630
11631   if (is_sse)
11632    {
11633      if (TARGET_AVX)
11634        {
11635          strcpy (buf, ssep);
11636          if (GET_MODE (operands[0]) == SFmode)
11637            strcat (buf, "ss\t{%2, %1, %0|%0, %1, %2}");
11638          else
11639            strcat (buf, "sd\t{%2, %1, %0|%0, %1, %2}");
11640        }
11641      else
11642        {
11643          strcpy (buf, ssep + 1);
11644          if (GET_MODE (operands[0]) == SFmode)
11645            strcat (buf, "ss\t{%2, %0|%0, %2}");
11646          else
11647            strcat (buf, "sd\t{%2, %0|%0, %2}");
11648        }
11649       return buf;
11650    }
11651   strcpy (buf, p);
11652
11653   switch (GET_CODE (operands[3]))
11654     {
11655     case MULT:
11656     case PLUS:
11657       if (REG_P (operands[2]) && REGNO (operands[0]) == REGNO (operands[2]))
11658         {
11659           rtx temp = operands[2];
11660           operands[2] = operands[1];
11661           operands[1] = temp;
11662         }
11663
11664       /* know operands[0] == operands[1].  */
11665
11666       if (MEM_P (operands[2]))
11667         {
11668           p = "%z2\t%2";
11669           break;
11670         }
11671
11672       if (find_regno_note (insn, REG_DEAD, REGNO (operands[2])))
11673         {
11674           if (STACK_TOP_P (operands[0]))
11675             /* How is it that we are storing to a dead operand[2]?
11676                Well, presumably operands[1] is dead too.  We can't
11677                store the result to st(0) as st(0) gets popped on this
11678                instruction.  Instead store to operands[2] (which I
11679                think has to be st(1)).  st(1) will be popped later.
11680                gcc <= 2.8.1 didn't have this check and generated
11681                assembly code that the Unixware assembler rejected.  */
11682             p = "p\t{%0, %2|%2, %0}";   /* st(1) = st(0) op st(1); pop */
11683           else
11684             p = "p\t{%2, %0|%0, %2}";   /* st(r1) = st(r1) op st(0); pop */
11685           break;
11686         }
11687
11688       if (STACK_TOP_P (operands[0]))
11689         p = "\t{%y2, %0|%0, %y2}";      /* st(0) = st(0) op st(r2) */
11690       else
11691         p = "\t{%2, %0|%0, %2}";        /* st(r1) = st(r1) op st(0) */
11692       break;
11693
11694     case MINUS:
11695     case DIV:
11696       if (MEM_P (operands[1]))
11697         {
11698           p = "r%z1\t%1";
11699           break;
11700         }
11701
11702       if (MEM_P (operands[2]))
11703         {
11704           p = "%z2\t%2";
11705           break;
11706         }
11707
11708       if (find_regno_note (insn, REG_DEAD, REGNO (operands[2])))
11709         {
11710 #if SYSV386_COMPAT
11711           /* The SystemV/386 SVR3.2 assembler, and probably all AT&T
11712              derived assemblers, confusingly reverse the direction of
11713              the operation for fsub{r} and fdiv{r} when the
11714              destination register is not st(0).  The Intel assembler
11715              doesn't have this brain damage.  Read !SYSV386_COMPAT to
11716              figure out what the hardware really does.  */
11717           if (STACK_TOP_P (operands[0]))
11718             p = "{p\t%0, %2|rp\t%2, %0}";
11719           else
11720             p = "{rp\t%2, %0|p\t%0, %2}";
11721 #else
11722           if (STACK_TOP_P (operands[0]))
11723             /* As above for fmul/fadd, we can't store to st(0).  */
11724             p = "rp\t{%0, %2|%2, %0}";  /* st(1) = st(0) op st(1); pop */
11725           else
11726             p = "p\t{%2, %0|%0, %2}";   /* st(r1) = st(r1) op st(0); pop */
11727 #endif
11728           break;
11729         }
11730
11731       if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
11732         {
11733 #if SYSV386_COMPAT
11734           if (STACK_TOP_P (operands[0]))
11735             p = "{rp\t%0, %1|p\t%1, %0}";
11736           else
11737             p = "{p\t%1, %0|rp\t%0, %1}";
11738 #else
11739           if (STACK_TOP_P (operands[0]))
11740             p = "p\t{%0, %1|%1, %0}";   /* st(1) = st(1) op st(0); pop */
11741           else
11742             p = "rp\t{%1, %0|%0, %1}";  /* st(r2) = st(0) op st(r2); pop */
11743 #endif
11744           break;
11745         }
11746
11747       if (STACK_TOP_P (operands[0]))
11748         {
11749           if (STACK_TOP_P (operands[1]))
11750             p = "\t{%y2, %0|%0, %y2}";  /* st(0) = st(0) op st(r2) */
11751           else
11752             p = "r\t{%y1, %0|%0, %y1}"; /* st(0) = st(r1) op st(0) */
11753           break;
11754         }
11755       else if (STACK_TOP_P (operands[1]))
11756         {
11757 #if SYSV386_COMPAT
11758           p = "{\t%1, %0|r\t%0, %1}";
11759 #else
11760           p = "r\t{%1, %0|%0, %1}";     /* st(r2) = st(0) op st(r2) */
11761 #endif
11762         }
11763       else
11764         {
11765 #if SYSV386_COMPAT
11766           p = "{r\t%2, %0|\t%0, %2}";
11767 #else
11768           p = "\t{%2, %0|%0, %2}";      /* st(r1) = st(r1) op st(0) */
11769 #endif
11770         }
11771       break;
11772
11773     default:
11774       gcc_unreachable ();
11775     }
11776
11777   strcat (buf, p);
11778   return buf;
11779 }
11780
11781 /* Return needed mode for entity in optimize_mode_switching pass.  */
11782
11783 int
11784 ix86_mode_needed (int entity, rtx insn)
11785 {
11786   enum attr_i387_cw mode;
11787
11788   /* The mode UNINITIALIZED is used to store control word after a
11789      function call or ASM pattern.  The mode ANY specify that function
11790      has no requirements on the control word and make no changes in the
11791      bits we are interested in.  */
11792
11793   if (CALL_P (insn)
11794       || (NONJUMP_INSN_P (insn)
11795           && (asm_noperands (PATTERN (insn)) >= 0
11796               || GET_CODE (PATTERN (insn)) == ASM_INPUT)))
11797     return I387_CW_UNINITIALIZED;
11798
11799   if (recog_memoized (insn) < 0)
11800     return I387_CW_ANY;
11801
11802   mode = get_attr_i387_cw (insn);
11803
11804   switch (entity)
11805     {
11806     case I387_TRUNC:
11807       if (mode == I387_CW_TRUNC)
11808         return mode;
11809       break;
11810
11811     case I387_FLOOR:
11812       if (mode == I387_CW_FLOOR)
11813         return mode;
11814       break;
11815
11816     case I387_CEIL:
11817       if (mode == I387_CW_CEIL)
11818         return mode;
11819       break;
11820
11821     case I387_MASK_PM:
11822       if (mode == I387_CW_MASK_PM)
11823         return mode;
11824       break;
11825
11826     default:
11827       gcc_unreachable ();
11828     }
11829
11830   return I387_CW_ANY;
11831 }
11832
11833 /* Output code to initialize control word copies used by trunc?f?i and
11834    rounding patterns.  CURRENT_MODE is set to current control word,
11835    while NEW_MODE is set to new control word.  */
11836
11837 void
11838 emit_i387_cw_initialization (int mode)
11839 {
11840   rtx stored_mode = assign_386_stack_local (HImode, SLOT_CW_STORED);
11841   rtx new_mode;
11842
11843   enum ix86_stack_slot slot;
11844
11845   rtx reg = gen_reg_rtx (HImode);
11846
11847   emit_insn (gen_x86_fnstcw_1 (stored_mode));
11848   emit_move_insn (reg, copy_rtx (stored_mode));
11849
11850   if (TARGET_64BIT || TARGET_PARTIAL_REG_STALL
11851       || optimize_function_for_size_p (cfun))
11852     {
11853       switch (mode)
11854         {
11855         case I387_CW_TRUNC:
11856           /* round toward zero (truncate) */
11857           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0c00)));
11858           slot = SLOT_CW_TRUNC;
11859           break;
11860
11861         case I387_CW_FLOOR:
11862           /* round down toward -oo */
11863           emit_insn (gen_andhi3 (reg, reg, GEN_INT (~0x0c00)));
11864           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0400)));
11865           slot = SLOT_CW_FLOOR;
11866           break;
11867
11868         case I387_CW_CEIL:
11869           /* round up toward +oo */
11870           emit_insn (gen_andhi3 (reg, reg, GEN_INT (~0x0c00)));
11871           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0800)));
11872           slot = SLOT_CW_CEIL;
11873           break;
11874
11875         case I387_CW_MASK_PM:
11876           /* mask precision exception for nearbyint() */
11877           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0020)));
11878           slot = SLOT_CW_MASK_PM;
11879           break;
11880
11881         default:
11882           gcc_unreachable ();
11883         }
11884     }
11885   else
11886     {
11887       switch (mode)
11888         {
11889         case I387_CW_TRUNC:
11890           /* round toward zero (truncate) */
11891           emit_insn (gen_movsi_insv_1 (reg, GEN_INT (0xc)));
11892           slot = SLOT_CW_TRUNC;
11893           break;
11894
11895         case I387_CW_FLOOR:
11896           /* round down toward -oo */
11897           emit_insn (gen_movsi_insv_1 (reg, GEN_INT (0x4)));
11898           slot = SLOT_CW_FLOOR;
11899           break;
11900
11901         case I387_CW_CEIL:
11902           /* round up toward +oo */
11903           emit_insn (gen_movsi_insv_1 (reg, GEN_INT (0x8)));
11904           slot = SLOT_CW_CEIL;
11905           break;
11906
11907         case I387_CW_MASK_PM:
11908           /* mask precision exception for nearbyint() */
11909           emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0020)));
11910           slot = SLOT_CW_MASK_PM;
11911           break;
11912
11913         default:
11914           gcc_unreachable ();
11915         }
11916     }
11917
11918   gcc_assert (slot < MAX_386_STACK_LOCALS);
11919
11920   new_mode = assign_386_stack_local (HImode, slot);
11921   emit_move_insn (new_mode, reg);
11922 }
11923
11924 /* Output code for INSN to convert a float to a signed int.  OPERANDS
11925    are the insn operands.  The output may be [HSD]Imode and the input
11926    operand may be [SDX]Fmode.  */
11927
11928 const char *
11929 output_fix_trunc (rtx insn, rtx *operands, int fisttp)
11930 {
11931   int stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
11932   int dimode_p = GET_MODE (operands[0]) == DImode;
11933   int round_mode = get_attr_i387_cw (insn);
11934
11935   /* Jump through a hoop or two for DImode, since the hardware has no
11936      non-popping instruction.  We used to do this a different way, but
11937      that was somewhat fragile and broke with post-reload splitters.  */
11938   if ((dimode_p || fisttp) && !stack_top_dies)
11939     output_asm_insn ("fld\t%y1", operands);
11940
11941   gcc_assert (STACK_TOP_P (operands[1]));
11942   gcc_assert (MEM_P (operands[0]));
11943   gcc_assert (GET_MODE (operands[1]) != TFmode);
11944
11945   if (fisttp)
11946       output_asm_insn ("fisttp%z0\t%0", operands);
11947   else
11948     {
11949       if (round_mode != I387_CW_ANY)
11950         output_asm_insn ("fldcw\t%3", operands);
11951       if (stack_top_dies || dimode_p)
11952         output_asm_insn ("fistp%z0\t%0", operands);
11953       else
11954         output_asm_insn ("fist%z0\t%0", operands);
11955       if (round_mode != I387_CW_ANY)
11956         output_asm_insn ("fldcw\t%2", operands);
11957     }
11958
11959   return "";
11960 }
11961
11962 /* Output code for x87 ffreep insn.  The OPNO argument, which may only
11963    have the values zero or one, indicates the ffreep insn's operand
11964    from the OPERANDS array.  */
11965
11966 static const char *
11967 output_387_ffreep (rtx *operands ATTRIBUTE_UNUSED, int opno)
11968 {
11969   if (TARGET_USE_FFREEP)
11970 #if HAVE_AS_IX86_FFREEP
11971     return opno ? "ffreep\t%y1" : "ffreep\t%y0";
11972 #else
11973     {
11974       static char retval[] = ".word\t0xc_df";
11975       int regno = REGNO (operands[opno]);
11976
11977       gcc_assert (FP_REGNO_P (regno));
11978
11979       retval[9] = '0' + (regno - FIRST_STACK_REG);
11980       return retval;
11981     }
11982 #endif
11983
11984   return opno ? "fstp\t%y1" : "fstp\t%y0";
11985 }
11986
11987
11988 /* Output code for INSN to compare OPERANDS.  EFLAGS_P is 1 when fcomi
11989    should be used.  UNORDERED_P is true when fucom should be used.  */
11990
11991 const char *
11992 output_fp_compare (rtx insn, rtx *operands, int eflags_p, int unordered_p)
11993 {
11994   int stack_top_dies;
11995   rtx cmp_op0, cmp_op1;
11996   int is_sse = SSE_REG_P (operands[0]) || SSE_REG_P (operands[1]);
11997
11998   if (eflags_p)
11999     {
12000       cmp_op0 = operands[0];
12001       cmp_op1 = operands[1];
12002     }
12003   else
12004     {
12005       cmp_op0 = operands[1];
12006       cmp_op1 = operands[2];
12007     }
12008
12009   if (is_sse)
12010     {
12011       static const char ucomiss[] = "vucomiss\t{%1, %0|%0, %1}";
12012       static const char ucomisd[] = "vucomisd\t{%1, %0|%0, %1}";
12013       static const char comiss[] = "vcomiss\t{%1, %0|%0, %1}";
12014       static const char comisd[] = "vcomisd\t{%1, %0|%0, %1}";
12015
12016       if (GET_MODE (operands[0]) == SFmode)
12017         if (unordered_p)
12018           return &ucomiss[TARGET_AVX ? 0 : 1];
12019         else
12020           return &comiss[TARGET_AVX ? 0 : 1];
12021       else
12022         if (unordered_p)
12023           return &ucomisd[TARGET_AVX ? 0 : 1];
12024         else
12025           return &comisd[TARGET_AVX ? 0 : 1];
12026     }
12027
12028   gcc_assert (STACK_TOP_P (cmp_op0));
12029
12030   stack_top_dies = find_regno_note (insn, REG_DEAD, FIRST_STACK_REG) != 0;
12031
12032   if (cmp_op1 == CONST0_RTX (GET_MODE (cmp_op1)))
12033     {
12034       if (stack_top_dies)
12035         {
12036           output_asm_insn ("ftst\n\tfnstsw\t%0", operands);
12037           return output_387_ffreep (operands, 1);
12038         }
12039       else
12040         return "ftst\n\tfnstsw\t%0";
12041     }
12042
12043   if (STACK_REG_P (cmp_op1)
12044       && stack_top_dies
12045       && find_regno_note (insn, REG_DEAD, REGNO (cmp_op1))
12046       && REGNO (cmp_op1) != FIRST_STACK_REG)
12047     {
12048       /* If both the top of the 387 stack dies, and the other operand
12049          is also a stack register that dies, then this must be a
12050          `fcompp' float compare */
12051
12052       if (eflags_p)
12053         {
12054           /* There is no double popping fcomi variant.  Fortunately,
12055              eflags is immune from the fstp's cc clobbering.  */
12056           if (unordered_p)
12057             output_asm_insn ("fucomip\t{%y1, %0|%0, %y1}", operands);
12058           else
12059             output_asm_insn ("fcomip\t{%y1, %0|%0, %y1}", operands);
12060           return output_387_ffreep (operands, 0);
12061         }
12062       else
12063         {
12064           if (unordered_p)
12065             return "fucompp\n\tfnstsw\t%0";
12066           else
12067             return "fcompp\n\tfnstsw\t%0";
12068         }
12069     }
12070   else
12071     {
12072       /* Encoded here as eflags_p | intmode | unordered_p | stack_top_dies.  */
12073
12074       static const char * const alt[16] =
12075       {
12076         "fcom%z2\t%y2\n\tfnstsw\t%0",
12077         "fcomp%z2\t%y2\n\tfnstsw\t%0",
12078         "fucom%z2\t%y2\n\tfnstsw\t%0",
12079         "fucomp%z2\t%y2\n\tfnstsw\t%0",
12080
12081         "ficom%z2\t%y2\n\tfnstsw\t%0",
12082         "ficomp%z2\t%y2\n\tfnstsw\t%0",
12083         NULL,
12084         NULL,
12085
12086         "fcomi\t{%y1, %0|%0, %y1}",
12087         "fcomip\t{%y1, %0|%0, %y1}",
12088         "fucomi\t{%y1, %0|%0, %y1}",
12089         "fucomip\t{%y1, %0|%0, %y1}",
12090
12091         NULL,
12092         NULL,
12093         NULL,
12094         NULL
12095       };
12096
12097       int mask;
12098       const char *ret;
12099
12100       mask  = eflags_p << 3;
12101       mask |= (GET_MODE_CLASS (GET_MODE (cmp_op1)) == MODE_INT) << 2;
12102       mask |= unordered_p << 1;
12103       mask |= stack_top_dies;
12104
12105       gcc_assert (mask < 16);
12106       ret = alt[mask];
12107       gcc_assert (ret);
12108
12109       return ret;
12110     }
12111 }
12112
12113 void
12114 ix86_output_addr_vec_elt (FILE *file, int value)
12115 {
12116   const char *directive = ASM_LONG;
12117
12118 #ifdef ASM_QUAD
12119   if (TARGET_64BIT)
12120     directive = ASM_QUAD;
12121 #else
12122   gcc_assert (!TARGET_64BIT);
12123 #endif
12124
12125   fprintf (file, "%s%s%d\n", directive, LPREFIX, value);
12126 }
12127
12128 void
12129 ix86_output_addr_diff_elt (FILE *file, int value, int rel)
12130 {
12131   const char *directive = ASM_LONG;
12132
12133 #ifdef ASM_QUAD
12134   if (TARGET_64BIT && CASE_VECTOR_MODE == DImode)
12135     directive = ASM_QUAD;
12136 #else
12137   gcc_assert (!TARGET_64BIT);
12138 #endif
12139   /* We can't use @GOTOFF for text labels on VxWorks; see gotoff_operand.  */
12140   if (TARGET_64BIT || TARGET_VXWORKS_RTP)
12141     fprintf (file, "%s%s%d-%s%d\n",
12142              directive, LPREFIX, value, LPREFIX, rel);
12143   else if (HAVE_AS_GOTOFF_IN_DATA)
12144     fprintf (file, "%s%s%d@GOTOFF\n", ASM_LONG, LPREFIX, value);
12145 #if TARGET_MACHO
12146   else if (TARGET_MACHO)
12147     {
12148       fprintf (file, "%s%s%d-", ASM_LONG, LPREFIX, value);
12149       machopic_output_function_base_name (file);
12150       fprintf(file, "\n");
12151     }
12152 #endif
12153   else
12154     asm_fprintf (file, "%s%U%s+[.-%s%d]\n",
12155                  ASM_LONG, GOT_SYMBOL_NAME, LPREFIX, value);
12156 }
12157 \f
12158 /* Generate either "mov $0, reg" or "xor reg, reg", as appropriate
12159    for the target.  */
12160
12161 void
12162 ix86_expand_clear (rtx dest)
12163 {
12164   rtx tmp;
12165
12166   /* We play register width games, which are only valid after reload.  */
12167   gcc_assert (reload_completed);
12168
12169   /* Avoid HImode and its attendant prefix byte.  */
12170   if (GET_MODE_SIZE (GET_MODE (dest)) < 4)
12171     dest = gen_rtx_REG (SImode, REGNO (dest));
12172   tmp = gen_rtx_SET (VOIDmode, dest, const0_rtx);
12173
12174   /* This predicate should match that for movsi_xor and movdi_xor_rex64.  */
12175   if (reload_completed && (!TARGET_USE_MOV0 || optimize_insn_for_speed_p ()))
12176     {
12177       rtx clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
12178       tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, tmp, clob));
12179     }
12180
12181   emit_insn (tmp);
12182 }
12183
12184 /* X is an unchanging MEM.  If it is a constant pool reference, return
12185    the constant pool rtx, else NULL.  */
12186
12187 rtx
12188 maybe_get_pool_constant (rtx x)
12189 {
12190   x = ix86_delegitimize_address (XEXP (x, 0));
12191
12192   if (GET_CODE (x) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (x))
12193     return get_pool_constant (x);
12194
12195   return NULL_RTX;
12196 }
12197
12198 void
12199 ix86_expand_move (enum machine_mode mode, rtx operands[])
12200 {
12201   rtx op0, op1;
12202   enum tls_model model;
12203
12204   op0 = operands[0];
12205   op1 = operands[1];
12206
12207   if (GET_CODE (op1) == SYMBOL_REF)
12208     {
12209       model = SYMBOL_REF_TLS_MODEL (op1);
12210       if (model)
12211         {
12212           op1 = legitimize_tls_address (op1, model, true);
12213           op1 = force_operand (op1, op0);
12214           if (op1 == op0)
12215             return;
12216         }
12217       else if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
12218                && SYMBOL_REF_DLLIMPORT_P (op1))
12219         op1 = legitimize_dllimport_symbol (op1, false);
12220     }
12221   else if (GET_CODE (op1) == CONST
12222            && GET_CODE (XEXP (op1, 0)) == PLUS
12223            && GET_CODE (XEXP (XEXP (op1, 0), 0)) == SYMBOL_REF)
12224     {
12225       rtx addend = XEXP (XEXP (op1, 0), 1);
12226       rtx symbol = XEXP (XEXP (op1, 0), 0);
12227       rtx tmp = NULL;
12228
12229       model = SYMBOL_REF_TLS_MODEL (symbol);
12230       if (model)
12231         tmp = legitimize_tls_address (symbol, model, true);
12232       else if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
12233                && SYMBOL_REF_DLLIMPORT_P (symbol))
12234         tmp = legitimize_dllimport_symbol (symbol, true);
12235
12236       if (tmp)
12237         {
12238           tmp = force_operand (tmp, NULL);
12239           tmp = expand_simple_binop (Pmode, PLUS, tmp, addend,
12240                                      op0, 1, OPTAB_DIRECT);
12241           if (tmp == op0)
12242             return;
12243         }
12244     }
12245
12246   if (flag_pic && mode == Pmode && symbolic_operand (op1, Pmode))
12247     {
12248       if (TARGET_MACHO && !TARGET_64BIT)
12249         {
12250 #if TARGET_MACHO
12251           if (MACHOPIC_PURE)
12252             {
12253               rtx temp = ((reload_in_progress
12254                            || ((op0 && REG_P (op0))
12255                                && mode == Pmode))
12256                           ? op0 : gen_reg_rtx (Pmode));
12257               op1 = machopic_indirect_data_reference (op1, temp);
12258               op1 = machopic_legitimize_pic_address (op1, mode,
12259                                                      temp == op1 ? 0 : temp);
12260             }
12261           else if (MACHOPIC_INDIRECT)
12262             op1 = machopic_indirect_data_reference (op1, 0);
12263           if (op0 == op1)
12264             return;
12265 #endif
12266         }
12267       else
12268         {
12269           if (MEM_P (op0))
12270             op1 = force_reg (Pmode, op1);
12271           else if (!TARGET_64BIT || !x86_64_movabs_operand (op1, Pmode))
12272             {
12273               rtx reg = !can_create_pseudo_p () ? op0 : NULL_RTX;
12274               op1 = legitimize_pic_address (op1, reg);
12275               if (op0 == op1)
12276                 return;
12277             }
12278         }
12279     }
12280   else
12281     {
12282       if (MEM_P (op0)
12283           && (PUSH_ROUNDING (GET_MODE_SIZE (mode)) != GET_MODE_SIZE (mode)
12284               || !push_operand (op0, mode))
12285           && MEM_P (op1))
12286         op1 = force_reg (mode, op1);
12287
12288       if (push_operand (op0, mode)
12289           && ! general_no_elim_operand (op1, mode))
12290         op1 = copy_to_mode_reg (mode, op1);
12291
12292       /* Force large constants in 64bit compilation into register
12293          to get them CSEed.  */
12294       if (can_create_pseudo_p ()
12295           && (mode == DImode) && TARGET_64BIT
12296           && immediate_operand (op1, mode)
12297           && !x86_64_zext_immediate_operand (op1, VOIDmode)
12298           && !register_operand (op0, mode)
12299           && optimize)
12300         op1 = copy_to_mode_reg (mode, op1);
12301
12302       if (can_create_pseudo_p ()
12303           && FLOAT_MODE_P (mode)
12304           && GET_CODE (op1) == CONST_DOUBLE)
12305         {
12306           /* If we are loading a floating point constant to a register,
12307              force the value to memory now, since we'll get better code
12308              out the back end.  */
12309
12310           op1 = validize_mem (force_const_mem (mode, op1));
12311           if (!register_operand (op0, mode))
12312             {
12313               rtx temp = gen_reg_rtx (mode);
12314               emit_insn (gen_rtx_SET (VOIDmode, temp, op1));
12315               emit_move_insn (op0, temp);
12316               return;
12317             }
12318         }
12319     }
12320
12321   emit_insn (gen_rtx_SET (VOIDmode, op0, op1));
12322 }
12323
12324 void
12325 ix86_expand_vector_move (enum machine_mode mode, rtx operands[])
12326 {
12327   rtx op0 = operands[0], op1 = operands[1];
12328   unsigned int align = GET_MODE_ALIGNMENT (mode);
12329
12330   /* Force constants other than zero into memory.  We do not know how
12331      the instructions used to build constants modify the upper 64 bits
12332      of the register, once we have that information we may be able
12333      to handle some of them more efficiently.  */
12334   if (can_create_pseudo_p ()
12335       && register_operand (op0, mode)
12336       && (CONSTANT_P (op1)
12337           || (GET_CODE (op1) == SUBREG
12338               && CONSTANT_P (SUBREG_REG (op1))))
12339       && standard_sse_constant_p (op1) <= 0)
12340     op1 = validize_mem (force_const_mem (mode, op1));
12341
12342   /* We need to check memory alignment for SSE mode since attribute
12343      can make operands unaligned.  */
12344   if (can_create_pseudo_p ()
12345       && SSE_REG_MODE_P (mode)
12346       && ((MEM_P (op0) && (MEM_ALIGN (op0) < align))
12347           || (MEM_P (op1) && (MEM_ALIGN (op1) < align))))
12348     {
12349       rtx tmp[2];
12350
12351       /* ix86_expand_vector_move_misalign() does not like constants ... */
12352       if (CONSTANT_P (op1)
12353           || (GET_CODE (op1) == SUBREG
12354               && CONSTANT_P (SUBREG_REG (op1))))
12355         op1 = validize_mem (force_const_mem (mode, op1));
12356
12357       /* ... nor both arguments in memory.  */
12358       if (!register_operand (op0, mode)
12359           && !register_operand (op1, mode))
12360         op1 = force_reg (mode, op1);
12361
12362       tmp[0] = op0; tmp[1] = op1;
12363       ix86_expand_vector_move_misalign (mode, tmp);
12364       return;
12365     }
12366
12367   /* Make operand1 a register if it isn't already.  */
12368   if (can_create_pseudo_p ()
12369       && !register_operand (op0, mode)
12370       && !register_operand (op1, mode))
12371     {
12372       emit_move_insn (op0, force_reg (GET_MODE (op0), op1));
12373       return;
12374     }
12375
12376   emit_insn (gen_rtx_SET (VOIDmode, op0, op1));
12377 }
12378
12379 /* Implement the movmisalign patterns for SSE.  Non-SSE modes go
12380    straight to ix86_expand_vector_move.  */
12381 /* Code generation for scalar reg-reg moves of single and double precision data:
12382      if (x86_sse_partial_reg_dependency == true | x86_sse_split_regs == true)
12383        movaps reg, reg
12384      else
12385        movss reg, reg
12386      if (x86_sse_partial_reg_dependency == true)
12387        movapd reg, reg
12388      else
12389        movsd reg, reg
12390
12391    Code generation for scalar loads of double precision data:
12392      if (x86_sse_split_regs == true)
12393        movlpd mem, reg      (gas syntax)
12394      else
12395        movsd mem, reg
12396
12397    Code generation for unaligned packed loads of single precision data
12398    (x86_sse_unaligned_move_optimal overrides x86_sse_partial_reg_dependency):
12399      if (x86_sse_unaligned_move_optimal)
12400        movups mem, reg
12401
12402      if (x86_sse_partial_reg_dependency == true)
12403        {
12404          xorps  reg, reg
12405          movlps mem, reg
12406          movhps mem+8, reg
12407        }
12408      else
12409        {
12410          movlps mem, reg
12411          movhps mem+8, reg
12412        }
12413
12414    Code generation for unaligned packed loads of double precision data
12415    (x86_sse_unaligned_move_optimal overrides x86_sse_split_regs):
12416      if (x86_sse_unaligned_move_optimal)
12417        movupd mem, reg
12418
12419      if (x86_sse_split_regs == true)
12420        {
12421          movlpd mem, reg
12422          movhpd mem+8, reg
12423        }
12424      else
12425        {
12426          movsd  mem, reg
12427          movhpd mem+8, reg
12428        }
12429  */
12430
12431 void
12432 ix86_expand_vector_move_misalign (enum machine_mode mode, rtx operands[])
12433 {
12434   rtx op0, op1, m;
12435
12436   op0 = operands[0];
12437   op1 = operands[1];
12438
12439   if (TARGET_AVX)
12440     {
12441       switch (GET_MODE_CLASS (mode))
12442         {
12443         case MODE_VECTOR_INT:
12444         case MODE_INT:
12445           switch (GET_MODE_SIZE (mode))
12446             {
12447             case 16:
12448               op0 = gen_lowpart (V16QImode, op0);
12449               op1 = gen_lowpart (V16QImode, op1);
12450               emit_insn (gen_avx_movdqu (op0, op1));
12451               break;
12452             case 32:
12453               op0 = gen_lowpart (V32QImode, op0);
12454               op1 = gen_lowpart (V32QImode, op1);
12455               emit_insn (gen_avx_movdqu256 (op0, op1));
12456               break;
12457             default:
12458               gcc_unreachable ();
12459             }
12460           break;
12461         case MODE_VECTOR_FLOAT:
12462           op0 = gen_lowpart (mode, op0);
12463           op1 = gen_lowpart (mode, op1);
12464
12465           switch (mode)
12466             { 
12467             case V4SFmode:
12468               emit_insn (gen_avx_movups (op0, op1));
12469               break;
12470             case V8SFmode:
12471               emit_insn (gen_avx_movups256 (op0, op1));
12472               break;
12473             case V2DFmode:
12474               emit_insn (gen_avx_movupd (op0, op1));
12475               break;
12476             case V4DFmode:
12477               emit_insn (gen_avx_movupd256 (op0, op1));
12478               break;
12479             default:
12480               gcc_unreachable ();
12481             }
12482           break;
12483
12484         default:
12485           gcc_unreachable ();
12486         }
12487
12488       return;
12489     }
12490
12491   if (MEM_P (op1))
12492     {
12493       /* If we're optimizing for size, movups is the smallest.  */
12494       if (optimize_insn_for_size_p ())
12495         {
12496           op0 = gen_lowpart (V4SFmode, op0);
12497           op1 = gen_lowpart (V4SFmode, op1);
12498           emit_insn (gen_sse_movups (op0, op1));
12499           return;
12500         }
12501
12502       /* ??? If we have typed data, then it would appear that using
12503          movdqu is the only way to get unaligned data loaded with
12504          integer type.  */
12505       if (TARGET_SSE2 && GET_MODE_CLASS (mode) == MODE_VECTOR_INT)
12506         {
12507           op0 = gen_lowpart (V16QImode, op0);
12508           op1 = gen_lowpart (V16QImode, op1);
12509           emit_insn (gen_sse2_movdqu (op0, op1));
12510           return;
12511         }
12512
12513       if (TARGET_SSE2 && mode == V2DFmode)
12514         {
12515           rtx zero;
12516
12517           if (TARGET_SSE_UNALIGNED_MOVE_OPTIMAL)
12518             {
12519               op0 = gen_lowpart (V2DFmode, op0);
12520               op1 = gen_lowpart (V2DFmode, op1);
12521               emit_insn (gen_sse2_movupd (op0, op1));
12522               return;
12523             }
12524
12525           /* When SSE registers are split into halves, we can avoid
12526              writing to the top half twice.  */
12527           if (TARGET_SSE_SPLIT_REGS)
12528             {
12529               emit_clobber (op0);
12530               zero = op0;
12531             }
12532           else
12533             {
12534               /* ??? Not sure about the best option for the Intel chips.
12535                  The following would seem to satisfy; the register is
12536                  entirely cleared, breaking the dependency chain.  We
12537                  then store to the upper half, with a dependency depth
12538                  of one.  A rumor has it that Intel recommends two movsd
12539                  followed by an unpacklpd, but this is unconfirmed.  And
12540                  given that the dependency depth of the unpacklpd would
12541                  still be one, I'm not sure why this would be better.  */
12542               zero = CONST0_RTX (V2DFmode);
12543             }
12544
12545           m = adjust_address (op1, DFmode, 0);
12546           emit_insn (gen_sse2_loadlpd (op0, zero, m));
12547           m = adjust_address (op1, DFmode, 8);
12548           emit_insn (gen_sse2_loadhpd (op0, op0, m));
12549         }
12550       else
12551         {
12552           if (TARGET_SSE_UNALIGNED_MOVE_OPTIMAL)
12553             {
12554               op0 = gen_lowpart (V4SFmode, op0);
12555               op1 = gen_lowpart (V4SFmode, op1);
12556               emit_insn (gen_sse_movups (op0, op1));
12557               return;
12558             }
12559
12560           if (TARGET_SSE_PARTIAL_REG_DEPENDENCY)
12561             emit_move_insn (op0, CONST0_RTX (mode));
12562           else
12563             emit_clobber (op0);
12564
12565           if (mode != V4SFmode)
12566             op0 = gen_lowpart (V4SFmode, op0);
12567           m = adjust_address (op1, V2SFmode, 0);
12568           emit_insn (gen_sse_loadlps (op0, op0, m));
12569           m = adjust_address (op1, V2SFmode, 8);
12570           emit_insn (gen_sse_loadhps (op0, op0, m));
12571         }
12572     }
12573   else if (MEM_P (op0))
12574     {
12575       /* If we're optimizing for size, movups is the smallest.  */
12576       if (optimize_insn_for_size_p ())
12577         {
12578           op0 = gen_lowpart (V4SFmode, op0);
12579           op1 = gen_lowpart (V4SFmode, op1);
12580           emit_insn (gen_sse_movups (op0, op1));
12581           return;
12582         }
12583
12584       /* ??? Similar to above, only less clear because of quote
12585          typeless stores unquote.  */
12586       if (TARGET_SSE2 && !TARGET_SSE_TYPELESS_STORES
12587           && GET_MODE_CLASS (mode) == MODE_VECTOR_INT)
12588         {
12589           op0 = gen_lowpart (V16QImode, op0);
12590           op1 = gen_lowpart (V16QImode, op1);
12591           emit_insn (gen_sse2_movdqu (op0, op1));
12592           return;
12593         }
12594
12595       if (TARGET_SSE2 && mode == V2DFmode)
12596         {
12597           m = adjust_address (op0, DFmode, 0);
12598           emit_insn (gen_sse2_storelpd (m, op1));
12599           m = adjust_address (op0, DFmode, 8);
12600           emit_insn (gen_sse2_storehpd (m, op1));
12601         }
12602       else
12603         {
12604           if (mode != V4SFmode)
12605             op1 = gen_lowpart (V4SFmode, op1);
12606           m = adjust_address (op0, V2SFmode, 0);
12607           emit_insn (gen_sse_storelps (m, op1));
12608           m = adjust_address (op0, V2SFmode, 8);
12609           emit_insn (gen_sse_storehps (m, op1));
12610         }
12611     }
12612   else
12613     gcc_unreachable ();
12614 }
12615
12616 /* Expand a push in MODE.  This is some mode for which we do not support
12617    proper push instructions, at least from the registers that we expect
12618    the value to live in.  */
12619
12620 void
12621 ix86_expand_push (enum machine_mode mode, rtx x)
12622 {
12623   rtx tmp;
12624
12625   tmp = expand_simple_binop (Pmode, PLUS, stack_pointer_rtx,
12626                              GEN_INT (-GET_MODE_SIZE (mode)),
12627                              stack_pointer_rtx, 1, OPTAB_DIRECT);
12628   if (tmp != stack_pointer_rtx)
12629     emit_move_insn (stack_pointer_rtx, tmp);
12630
12631   tmp = gen_rtx_MEM (mode, stack_pointer_rtx);
12632
12633   /* When we push an operand onto stack, it has to be aligned at least
12634      at the function argument boundary.  However since we don't have
12635      the argument type, we can't determine the actual argument
12636      boundary.  */
12637   emit_move_insn (tmp, x);
12638 }
12639
12640 /* Helper function of ix86_fixup_binary_operands to canonicalize
12641    operand order.  Returns true if the operands should be swapped.  */
12642
12643 static bool
12644 ix86_swap_binary_operands_p (enum rtx_code code, enum machine_mode mode,
12645                              rtx operands[])
12646 {
12647   rtx dst = operands[0];
12648   rtx src1 = operands[1];
12649   rtx src2 = operands[2];
12650
12651   /* If the operation is not commutative, we can't do anything.  */
12652   if (GET_RTX_CLASS (code) != RTX_COMM_ARITH)
12653     return false;
12654
12655   /* Highest priority is that src1 should match dst.  */
12656   if (rtx_equal_p (dst, src1))
12657     return false;
12658   if (rtx_equal_p (dst, src2))
12659     return true;
12660
12661   /* Next highest priority is that immediate constants come second.  */
12662   if (immediate_operand (src2, mode))
12663     return false;
12664   if (immediate_operand (src1, mode))
12665     return true;
12666
12667   /* Lowest priority is that memory references should come second.  */
12668   if (MEM_P (src2))
12669     return false;
12670   if (MEM_P (src1))
12671     return true;
12672
12673   return false;
12674 }
12675
12676
12677 /* Fix up OPERANDS to satisfy ix86_binary_operator_ok.  Return the
12678    destination to use for the operation.  If different from the true
12679    destination in operands[0], a copy operation will be required.  */
12680
12681 rtx
12682 ix86_fixup_binary_operands (enum rtx_code code, enum machine_mode mode,
12683                             rtx operands[])
12684 {
12685   rtx dst = operands[0];
12686   rtx src1 = operands[1];
12687   rtx src2 = operands[2];
12688
12689   /* Canonicalize operand order.  */
12690   if (ix86_swap_binary_operands_p (code, mode, operands))
12691     {
12692       rtx temp;
12693
12694       /* It is invalid to swap operands of different modes.  */
12695       gcc_assert (GET_MODE (src1) == GET_MODE (src2));
12696
12697       temp = src1;
12698       src1 = src2;
12699       src2 = temp;
12700     }
12701
12702   /* Both source operands cannot be in memory.  */
12703   if (MEM_P (src1) && MEM_P (src2))
12704     {
12705       /* Optimization: Only read from memory once.  */
12706       if (rtx_equal_p (src1, src2))
12707         {
12708           src2 = force_reg (mode, src2);
12709           src1 = src2;
12710         }
12711       else
12712         src2 = force_reg (mode, src2);
12713     }
12714
12715   /* If the destination is memory, and we do not have matching source
12716      operands, do things in registers.  */
12717   if (MEM_P (dst) && !rtx_equal_p (dst, src1))
12718     dst = gen_reg_rtx (mode);
12719
12720   /* Source 1 cannot be a constant.  */
12721   if (CONSTANT_P (src1))
12722     src1 = force_reg (mode, src1);
12723
12724   /* Source 1 cannot be a non-matching memory.  */
12725   if (MEM_P (src1) && !rtx_equal_p (dst, src1))
12726     src1 = force_reg (mode, src1);
12727
12728   operands[1] = src1;
12729   operands[2] = src2;
12730   return dst;
12731 }
12732
12733 /* Similarly, but assume that the destination has already been
12734    set up properly.  */
12735
12736 void
12737 ix86_fixup_binary_operands_no_copy (enum rtx_code code,
12738                                     enum machine_mode mode, rtx operands[])
12739 {
12740   rtx dst = ix86_fixup_binary_operands (code, mode, operands);
12741   gcc_assert (dst == operands[0]);
12742 }
12743
12744 /* Attempt to expand a binary operator.  Make the expansion closer to the
12745    actual machine, then just general_operand, which will allow 3 separate
12746    memory references (one output, two input) in a single insn.  */
12747
12748 void
12749 ix86_expand_binary_operator (enum rtx_code code, enum machine_mode mode,
12750                              rtx operands[])
12751 {
12752   rtx src1, src2, dst, op, clob;
12753
12754   dst = ix86_fixup_binary_operands (code, mode, operands);
12755   src1 = operands[1];
12756   src2 = operands[2];
12757
12758  /* Emit the instruction.  */
12759
12760   op = gen_rtx_SET (VOIDmode, dst, gen_rtx_fmt_ee (code, mode, src1, src2));
12761   if (reload_in_progress)
12762     {
12763       /* Reload doesn't know about the flags register, and doesn't know that
12764          it doesn't want to clobber it.  We can only do this with PLUS.  */
12765       gcc_assert (code == PLUS);
12766       emit_insn (op);
12767     }
12768   else
12769     {
12770       clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
12771       emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, op, clob)));
12772     }
12773
12774   /* Fix up the destination if needed.  */
12775   if (dst != operands[0])
12776     emit_move_insn (operands[0], dst);
12777 }
12778
12779 /* Return TRUE or FALSE depending on whether the binary operator meets the
12780    appropriate constraints.  */
12781
12782 int
12783 ix86_binary_operator_ok (enum rtx_code code, enum machine_mode mode,
12784                          rtx operands[3])
12785 {
12786   rtx dst = operands[0];
12787   rtx src1 = operands[1];
12788   rtx src2 = operands[2];
12789
12790   /* Both source operands cannot be in memory.  */
12791   if (MEM_P (src1) && MEM_P (src2))
12792     return 0;
12793
12794   /* Canonicalize operand order for commutative operators.  */
12795   if (ix86_swap_binary_operands_p (code, mode, operands))
12796     {
12797       rtx temp = src1;
12798       src1 = src2;
12799       src2 = temp;
12800     }
12801
12802   /* If the destination is memory, we must have a matching source operand.  */
12803   if (MEM_P (dst) && !rtx_equal_p (dst, src1))
12804       return 0;
12805
12806   /* Source 1 cannot be a constant.  */
12807   if (CONSTANT_P (src1))
12808     return 0;
12809
12810   /* Source 1 cannot be a non-matching memory.  */
12811   if (MEM_P (src1) && !rtx_equal_p (dst, src1))
12812     return 0;
12813
12814   return 1;
12815 }
12816
12817 /* Attempt to expand a unary operator.  Make the expansion closer to the
12818    actual machine, then just general_operand, which will allow 2 separate
12819    memory references (one output, one input) in a single insn.  */
12820
12821 void
12822 ix86_expand_unary_operator (enum rtx_code code, enum machine_mode mode,
12823                             rtx operands[])
12824 {
12825   int matching_memory;
12826   rtx src, dst, op, clob;
12827
12828   dst = operands[0];
12829   src = operands[1];
12830
12831   /* If the destination is memory, and we do not have matching source
12832      operands, do things in registers.  */
12833   matching_memory = 0;
12834   if (MEM_P (dst))
12835     {
12836       if (rtx_equal_p (dst, src))
12837         matching_memory = 1;
12838       else
12839         dst = gen_reg_rtx (mode);
12840     }
12841
12842   /* When source operand is memory, destination must match.  */
12843   if (MEM_P (src) && !matching_memory)
12844     src = force_reg (mode, src);
12845
12846   /* Emit the instruction.  */
12847
12848   op = gen_rtx_SET (VOIDmode, dst, gen_rtx_fmt_e (code, mode, src));
12849   if (reload_in_progress || code == NOT)
12850     {
12851       /* Reload doesn't know about the flags register, and doesn't know that
12852          it doesn't want to clobber it.  */
12853       gcc_assert (code == NOT);
12854       emit_insn (op);
12855     }
12856   else
12857     {
12858       clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
12859       emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, op, clob)));
12860     }
12861
12862   /* Fix up the destination if needed.  */
12863   if (dst != operands[0])
12864     emit_move_insn (operands[0], dst);
12865 }
12866
12867 /* Return TRUE or FALSE depending on whether the unary operator meets the
12868    appropriate constraints.  */
12869
12870 int
12871 ix86_unary_operator_ok (enum rtx_code code ATTRIBUTE_UNUSED,
12872                         enum machine_mode mode ATTRIBUTE_UNUSED,
12873                         rtx operands[2] ATTRIBUTE_UNUSED)
12874 {
12875   /* If one of operands is memory, source and destination must match.  */
12876   if ((MEM_P (operands[0])
12877        || MEM_P (operands[1]))
12878       && ! rtx_equal_p (operands[0], operands[1]))
12879     return FALSE;
12880   return TRUE;
12881 }
12882
12883 /* Post-reload splitter for converting an SF or DFmode value in an
12884    SSE register into an unsigned SImode.  */
12885
12886 void
12887 ix86_split_convert_uns_si_sse (rtx operands[])
12888 {
12889   enum machine_mode vecmode;
12890   rtx value, large, zero_or_two31, input, two31, x;
12891
12892   large = operands[1];
12893   zero_or_two31 = operands[2];
12894   input = operands[3];
12895   two31 = operands[4];
12896   vecmode = GET_MODE (large);
12897   value = gen_rtx_REG (vecmode, REGNO (operands[0]));
12898
12899   /* Load up the value into the low element.  We must ensure that the other
12900      elements are valid floats -- zero is the easiest such value.  */
12901   if (MEM_P (input))
12902     {
12903       if (vecmode == V4SFmode)
12904         emit_insn (gen_vec_setv4sf_0 (value, CONST0_RTX (V4SFmode), input));
12905       else
12906         emit_insn (gen_sse2_loadlpd (value, CONST0_RTX (V2DFmode), input));
12907     }
12908   else
12909     {
12910       input = gen_rtx_REG (vecmode, REGNO (input));
12911       emit_move_insn (value, CONST0_RTX (vecmode));
12912       if (vecmode == V4SFmode)
12913         emit_insn (gen_sse_movss (value, value, input));
12914       else
12915         emit_insn (gen_sse2_movsd (value, value, input));
12916     }
12917
12918   emit_move_insn (large, two31);
12919   emit_move_insn (zero_or_two31, MEM_P (two31) ? large : two31);
12920
12921   x = gen_rtx_fmt_ee (LE, vecmode, large, value);
12922   emit_insn (gen_rtx_SET (VOIDmode, large, x));
12923
12924   x = gen_rtx_AND (vecmode, zero_or_two31, large);
12925   emit_insn (gen_rtx_SET (VOIDmode, zero_or_two31, x));
12926
12927   x = gen_rtx_MINUS (vecmode, value, zero_or_two31);
12928   emit_insn (gen_rtx_SET (VOIDmode, value, x));
12929
12930   large = gen_rtx_REG (V4SImode, REGNO (large));
12931   emit_insn (gen_ashlv4si3 (large, large, GEN_INT (31)));
12932
12933   x = gen_rtx_REG (V4SImode, REGNO (value));
12934   if (vecmode == V4SFmode)
12935     emit_insn (gen_sse2_cvttps2dq (x, value));
12936   else
12937     emit_insn (gen_sse2_cvttpd2dq (x, value));
12938   value = x;
12939
12940   emit_insn (gen_xorv4si3 (value, value, large));
12941 }
12942
12943 /* Convert an unsigned DImode value into a DFmode, using only SSE.
12944    Expects the 64-bit DImode to be supplied in a pair of integral
12945    registers.  Requires SSE2; will use SSE3 if available.  For x86_32,
12946    -mfpmath=sse, !optimize_size only.  */
12947
12948 void
12949 ix86_expand_convert_uns_didf_sse (rtx target, rtx input)
12950 {
12951   REAL_VALUE_TYPE bias_lo_rvt, bias_hi_rvt;
12952   rtx int_xmm, fp_xmm;
12953   rtx biases, exponents;
12954   rtx x;
12955
12956   int_xmm = gen_reg_rtx (V4SImode);
12957   if (TARGET_INTER_UNIT_MOVES)
12958     emit_insn (gen_movdi_to_sse (int_xmm, input));
12959   else if (TARGET_SSE_SPLIT_REGS)
12960     {
12961       emit_clobber (int_xmm);
12962       emit_move_insn (gen_lowpart (DImode, int_xmm), input);
12963     }
12964   else
12965     {
12966       x = gen_reg_rtx (V2DImode);
12967       ix86_expand_vector_init_one_nonzero (false, V2DImode, x, input, 0);
12968       emit_move_insn (int_xmm, gen_lowpart (V4SImode, x));
12969     }
12970
12971   x = gen_rtx_CONST_VECTOR (V4SImode,
12972                             gen_rtvec (4, GEN_INT (0x43300000UL),
12973                                        GEN_INT (0x45300000UL),
12974                                        const0_rtx, const0_rtx));
12975   exponents = validize_mem (force_const_mem (V4SImode, x));
12976
12977   /* int_xmm = {0x45300000UL, fp_xmm/hi, 0x43300000, fp_xmm/lo } */
12978   emit_insn (gen_sse2_punpckldq (int_xmm, int_xmm, exponents));
12979
12980   /* Concatenating (juxtaposing) (0x43300000UL ## fp_value_low_xmm)
12981      yields a valid DF value equal to (0x1.0p52 + double(fp_value_lo_xmm)).
12982      Similarly (0x45300000UL ## fp_value_hi_xmm) yields
12983      (0x1.0p84 + double(fp_value_hi_xmm)).
12984      Note these exponents differ by 32.  */
12985
12986   fp_xmm = copy_to_mode_reg (V2DFmode, gen_lowpart (V2DFmode, int_xmm));
12987
12988   /* Subtract off those 0x1.0p52 and 0x1.0p84 biases, to produce values
12989      in [0,2**32-1] and [0]+[2**32,2**64-1] respectively.  */
12990   real_ldexp (&bias_lo_rvt, &dconst1, 52);
12991   real_ldexp (&bias_hi_rvt, &dconst1, 84);
12992   biases = const_double_from_real_value (bias_lo_rvt, DFmode);
12993   x = const_double_from_real_value (bias_hi_rvt, DFmode);
12994   biases = gen_rtx_CONST_VECTOR (V2DFmode, gen_rtvec (2, biases, x));
12995   biases = validize_mem (force_const_mem (V2DFmode, biases));
12996   emit_insn (gen_subv2df3 (fp_xmm, fp_xmm, biases));
12997
12998   /* Add the upper and lower DFmode values together.  */
12999   if (TARGET_SSE3)
13000     emit_insn (gen_sse3_haddv2df3 (fp_xmm, fp_xmm, fp_xmm));
13001   else
13002     {
13003       x = copy_to_mode_reg (V2DFmode, fp_xmm);
13004       emit_insn (gen_sse2_unpckhpd (fp_xmm, fp_xmm, fp_xmm));
13005       emit_insn (gen_addv2df3 (fp_xmm, fp_xmm, x));
13006     }
13007
13008   ix86_expand_vector_extract (false, target, fp_xmm, 0);
13009 }
13010
13011 /* Not used, but eases macroization of patterns.  */
13012 void
13013 ix86_expand_convert_uns_sixf_sse (rtx target ATTRIBUTE_UNUSED,
13014                                   rtx input ATTRIBUTE_UNUSED)
13015 {
13016   gcc_unreachable ();
13017 }
13018
13019 /* Convert an unsigned SImode value into a DFmode.  Only currently used
13020    for SSE, but applicable anywhere.  */
13021
13022 void
13023 ix86_expand_convert_uns_sidf_sse (rtx target, rtx input)
13024 {
13025   REAL_VALUE_TYPE TWO31r;
13026   rtx x, fp;
13027
13028   x = expand_simple_binop (SImode, PLUS, input, GEN_INT (-2147483647 - 1),
13029                            NULL, 1, OPTAB_DIRECT);
13030
13031   fp = gen_reg_rtx (DFmode);
13032   emit_insn (gen_floatsidf2 (fp, x));
13033
13034   real_ldexp (&TWO31r, &dconst1, 31);
13035   x = const_double_from_real_value (TWO31r, DFmode);
13036
13037   x = expand_simple_binop (DFmode, PLUS, fp, x, target, 0, OPTAB_DIRECT);
13038   if (x != target)
13039     emit_move_insn (target, x);
13040 }
13041
13042 /* Convert a signed DImode value into a DFmode.  Only used for SSE in
13043    32-bit mode; otherwise we have a direct convert instruction.  */
13044
13045 void
13046 ix86_expand_convert_sign_didf_sse (rtx target, rtx input)
13047 {
13048   REAL_VALUE_TYPE TWO32r;
13049   rtx fp_lo, fp_hi, x;
13050
13051   fp_lo = gen_reg_rtx (DFmode);
13052   fp_hi = gen_reg_rtx (DFmode);
13053
13054   emit_insn (gen_floatsidf2 (fp_hi, gen_highpart (SImode, input)));
13055
13056   real_ldexp (&TWO32r, &dconst1, 32);
13057   x = const_double_from_real_value (TWO32r, DFmode);
13058   fp_hi = expand_simple_binop (DFmode, MULT, fp_hi, x, fp_hi, 0, OPTAB_DIRECT);
13059
13060   ix86_expand_convert_uns_sidf_sse (fp_lo, gen_lowpart (SImode, input));
13061
13062   x = expand_simple_binop (DFmode, PLUS, fp_hi, fp_lo, target,
13063                            0, OPTAB_DIRECT);
13064   if (x != target)
13065     emit_move_insn (target, x);
13066 }
13067
13068 /* Convert an unsigned SImode value into a SFmode, using only SSE.
13069    For x86_32, -mfpmath=sse, !optimize_size only.  */
13070 void
13071 ix86_expand_convert_uns_sisf_sse (rtx target, rtx input)
13072 {
13073   REAL_VALUE_TYPE ONE16r;
13074   rtx fp_hi, fp_lo, int_hi, int_lo, x;
13075
13076   real_ldexp (&ONE16r, &dconst1, 16);
13077   x = const_double_from_real_value (ONE16r, SFmode);
13078   int_lo = expand_simple_binop (SImode, AND, input, GEN_INT(0xffff),
13079                                       NULL, 0, OPTAB_DIRECT);
13080   int_hi = expand_simple_binop (SImode, LSHIFTRT, input, GEN_INT(16),
13081                                       NULL, 0, OPTAB_DIRECT);
13082   fp_hi = gen_reg_rtx (SFmode);
13083   fp_lo = gen_reg_rtx (SFmode);
13084   emit_insn (gen_floatsisf2 (fp_hi, int_hi));
13085   emit_insn (gen_floatsisf2 (fp_lo, int_lo));
13086   fp_hi = expand_simple_binop (SFmode, MULT, fp_hi, x, fp_hi,
13087                                0, OPTAB_DIRECT);
13088   fp_hi = expand_simple_binop (SFmode, PLUS, fp_hi, fp_lo, target,
13089                                0, OPTAB_DIRECT);
13090   if (!rtx_equal_p (target, fp_hi))
13091     emit_move_insn (target, fp_hi);
13092 }
13093
13094 /* A subroutine of ix86_build_signbit_mask_vector.  If VECT is true,
13095    then replicate the value for all elements of the vector
13096    register.  */
13097
13098 rtx
13099 ix86_build_const_vector (enum machine_mode mode, bool vect, rtx value)
13100 {
13101   rtvec v;
13102   switch (mode)
13103     {
13104     case SImode:
13105       gcc_assert (vect);
13106       v = gen_rtvec (4, value, value, value, value);
13107       return gen_rtx_CONST_VECTOR (V4SImode, v);
13108
13109     case DImode:
13110       gcc_assert (vect);
13111       v = gen_rtvec (2, value, value);
13112       return gen_rtx_CONST_VECTOR (V2DImode, v);
13113
13114     case SFmode:
13115       if (vect)
13116         v = gen_rtvec (4, value, value, value, value);
13117       else
13118         v = gen_rtvec (4, value, CONST0_RTX (SFmode),
13119                        CONST0_RTX (SFmode), CONST0_RTX (SFmode));
13120       return gen_rtx_CONST_VECTOR (V4SFmode, v);
13121
13122     case DFmode:
13123       if (vect)
13124         v = gen_rtvec (2, value, value);
13125       else
13126         v = gen_rtvec (2, value, CONST0_RTX (DFmode));
13127       return gen_rtx_CONST_VECTOR (V2DFmode, v);
13128
13129     default:
13130       gcc_unreachable ();
13131     }
13132 }
13133
13134 /* A subroutine of ix86_expand_fp_absneg_operator, copysign expanders
13135    and ix86_expand_int_vcond.  Create a mask for the sign bit in MODE
13136    for an SSE register.  If VECT is true, then replicate the mask for
13137    all elements of the vector register.  If INVERT is true, then create
13138    a mask excluding the sign bit.  */
13139
13140 rtx
13141 ix86_build_signbit_mask (enum machine_mode mode, bool vect, bool invert)
13142 {
13143   enum machine_mode vec_mode, imode;
13144   HOST_WIDE_INT hi, lo;
13145   int shift = 63;
13146   rtx v;
13147   rtx mask;
13148
13149   /* Find the sign bit, sign extended to 2*HWI.  */
13150   switch (mode)
13151     {
13152     case SImode:
13153     case SFmode:
13154       imode = SImode;
13155       vec_mode = (mode == SImode) ? V4SImode : V4SFmode;
13156       lo = 0x80000000, hi = lo < 0;
13157       break;
13158
13159     case DImode:
13160     case DFmode:
13161       imode = DImode;
13162       vec_mode = (mode == DImode) ? V2DImode : V2DFmode;
13163       if (HOST_BITS_PER_WIDE_INT >= 64)
13164         lo = (HOST_WIDE_INT)1 << shift, hi = -1;
13165       else
13166         lo = 0, hi = (HOST_WIDE_INT)1 << (shift - HOST_BITS_PER_WIDE_INT);
13167       break;
13168
13169     case TImode:
13170     case TFmode:
13171       vec_mode = VOIDmode;
13172       if (HOST_BITS_PER_WIDE_INT >= 64)
13173         {
13174           imode = TImode;
13175           lo = 0, hi = (HOST_WIDE_INT)1 << shift;
13176         }
13177       else
13178         {
13179           rtvec vec;
13180
13181           imode = DImode;
13182           lo = 0, hi = (HOST_WIDE_INT)1 << (shift - HOST_BITS_PER_WIDE_INT);
13183
13184           if (invert)
13185             {
13186               lo = ~lo, hi = ~hi;
13187               v = constm1_rtx;
13188             }
13189           else
13190             v = const0_rtx;
13191
13192           mask = immed_double_const (lo, hi, imode);
13193
13194           vec = gen_rtvec (2, v, mask);
13195           v = gen_rtx_CONST_VECTOR (V2DImode, vec);
13196           v = copy_to_mode_reg (mode, gen_lowpart (mode, v));
13197
13198           return v;
13199         }
13200      break;
13201
13202     default:
13203       gcc_unreachable ();
13204     }
13205
13206   if (invert)
13207     lo = ~lo, hi = ~hi;
13208
13209   /* Force this value into the low part of a fp vector constant.  */
13210   mask = immed_double_const (lo, hi, imode);
13211   mask = gen_lowpart (mode, mask);
13212
13213   if (vec_mode == VOIDmode)
13214     return force_reg (mode, mask);
13215
13216   v = ix86_build_const_vector (mode, vect, mask);
13217   return force_reg (vec_mode, v);
13218 }
13219
13220 /* Generate code for floating point ABS or NEG.  */
13221
13222 void
13223 ix86_expand_fp_absneg_operator (enum rtx_code code, enum machine_mode mode,
13224                                 rtx operands[])
13225 {
13226   rtx mask, set, use, clob, dst, src;
13227   bool use_sse = false;
13228   bool vector_mode = VECTOR_MODE_P (mode);
13229   enum machine_mode elt_mode = mode;
13230
13231   if (vector_mode)
13232     {
13233       elt_mode = GET_MODE_INNER (mode);
13234       use_sse = true;
13235     }
13236   else if (mode == TFmode)
13237     use_sse = true;
13238   else if (TARGET_SSE_MATH)
13239     use_sse = SSE_FLOAT_MODE_P (mode);
13240
13241   /* NEG and ABS performed with SSE use bitwise mask operations.
13242      Create the appropriate mask now.  */
13243   if (use_sse)
13244     mask = ix86_build_signbit_mask (elt_mode, vector_mode, code == ABS);
13245   else
13246     mask = NULL_RTX;
13247
13248   dst = operands[0];
13249   src = operands[1];
13250
13251   if (vector_mode)
13252     {
13253       set = gen_rtx_fmt_ee (code == NEG ? XOR : AND, mode, src, mask);
13254       set = gen_rtx_SET (VOIDmode, dst, set);
13255       emit_insn (set);
13256     }
13257   else
13258     {
13259       set = gen_rtx_fmt_e (code, mode, src);
13260       set = gen_rtx_SET (VOIDmode, dst, set);
13261       if (mask)
13262         {
13263           use = gen_rtx_USE (VOIDmode, mask);
13264           clob = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
13265           emit_insn (gen_rtx_PARALLEL (VOIDmode,
13266                                        gen_rtvec (3, set, use, clob)));
13267         }
13268       else
13269         emit_insn (set);
13270     }
13271 }
13272
13273 /* Expand a copysign operation.  Special case operand 0 being a constant.  */
13274
13275 void
13276 ix86_expand_copysign (rtx operands[])
13277 {
13278   enum machine_mode mode;
13279   rtx dest, op0, op1, mask, nmask;
13280
13281   dest = operands[0];
13282   op0 = operands[1];
13283   op1 = operands[2];
13284
13285   mode = GET_MODE (dest);
13286
13287   if (GET_CODE (op0) == CONST_DOUBLE)
13288     {
13289       rtx (*copysign_insn)(rtx, rtx, rtx, rtx);
13290
13291       if (real_isneg (CONST_DOUBLE_REAL_VALUE (op0)))
13292         op0 = simplify_unary_operation (ABS, mode, op0, mode);
13293
13294       if (mode == SFmode || mode == DFmode)
13295         {
13296           enum machine_mode vmode;
13297
13298           vmode = mode == SFmode ? V4SFmode : V2DFmode;
13299
13300           if (op0 == CONST0_RTX (mode))
13301             op0 = CONST0_RTX (vmode);
13302           else
13303             {
13304               rtvec v;
13305
13306               if (mode == SFmode)
13307                 v = gen_rtvec (4, op0, CONST0_RTX (SFmode),
13308                                CONST0_RTX (SFmode), CONST0_RTX (SFmode));
13309               else
13310                 v = gen_rtvec (2, op0, CONST0_RTX (DFmode));
13311
13312               op0 = force_reg (vmode, gen_rtx_CONST_VECTOR (vmode, v));
13313             }
13314         }
13315       else if (op0 != CONST0_RTX (mode))
13316         op0 = force_reg (mode, op0);
13317
13318       mask = ix86_build_signbit_mask (mode, 0, 0);
13319
13320       if (mode == SFmode)
13321         copysign_insn = gen_copysignsf3_const;
13322       else if (mode == DFmode)
13323         copysign_insn = gen_copysigndf3_const;
13324       else
13325         copysign_insn = gen_copysigntf3_const;
13326
13327         emit_insn (copysign_insn (dest, op0, op1, mask));
13328     }
13329   else
13330     {
13331       rtx (*copysign_insn)(rtx, rtx, rtx, rtx, rtx, rtx);
13332
13333       nmask = ix86_build_signbit_mask (mode, 0, 1);
13334       mask = ix86_build_signbit_mask (mode, 0, 0);
13335
13336       if (mode == SFmode)
13337         copysign_insn = gen_copysignsf3_var;
13338       else if (mode == DFmode)
13339         copysign_insn = gen_copysigndf3_var;
13340       else
13341         copysign_insn = gen_copysigntf3_var;
13342
13343       emit_insn (copysign_insn (dest, NULL_RTX, op0, op1, nmask, mask));
13344     }
13345 }
13346
13347 /* Deconstruct a copysign operation into bit masks.  Operand 0 is known to
13348    be a constant, and so has already been expanded into a vector constant.  */
13349
13350 void
13351 ix86_split_copysign_const (rtx operands[])
13352 {
13353   enum machine_mode mode, vmode;
13354   rtx dest, op0, op1, mask, x;
13355
13356   dest = operands[0];
13357   op0 = operands[1];
13358   op1 = operands[2];
13359   mask = operands[3];
13360
13361   mode = GET_MODE (dest);
13362   vmode = GET_MODE (mask);
13363
13364   dest = simplify_gen_subreg (vmode, dest, mode, 0);
13365   x = gen_rtx_AND (vmode, dest, mask);
13366   emit_insn (gen_rtx_SET (VOIDmode, dest, x));
13367
13368   if (op0 != CONST0_RTX (vmode))
13369     {
13370       x = gen_rtx_IOR (vmode, dest, op0);
13371       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
13372     }
13373 }
13374
13375 /* Deconstruct a copysign operation into bit masks.  Operand 0 is variable,
13376    so we have to do two masks.  */
13377
13378 void
13379 ix86_split_copysign_var (rtx operands[])
13380 {
13381   enum machine_mode mode, vmode;
13382   rtx dest, scratch, op0, op1, mask, nmask, x;
13383
13384   dest = operands[0];
13385   scratch = operands[1];
13386   op0 = operands[2];
13387   op1 = operands[3];
13388   nmask = operands[4];
13389   mask = operands[5];
13390
13391   mode = GET_MODE (dest);
13392   vmode = GET_MODE (mask);
13393
13394   if (rtx_equal_p (op0, op1))
13395     {
13396       /* Shouldn't happen often (it's useless, obviously), but when it does
13397          we'd generate incorrect code if we continue below.  */
13398       emit_move_insn (dest, op0);
13399       return;
13400     }
13401
13402   if (REG_P (mask) && REGNO (dest) == REGNO (mask))     /* alternative 0 */
13403     {
13404       gcc_assert (REGNO (op1) == REGNO (scratch));
13405
13406       x = gen_rtx_AND (vmode, scratch, mask);
13407       emit_insn (gen_rtx_SET (VOIDmode, scratch, x));
13408
13409       dest = mask;
13410       op0 = simplify_gen_subreg (vmode, op0, mode, 0);
13411       x = gen_rtx_NOT (vmode, dest);
13412       x = gen_rtx_AND (vmode, x, op0);
13413       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
13414     }
13415   else
13416     {
13417       if (REGNO (op1) == REGNO (scratch))               /* alternative 1,3 */
13418         {
13419           x = gen_rtx_AND (vmode, scratch, mask);
13420         }
13421       else                                              /* alternative 2,4 */
13422         {
13423           gcc_assert (REGNO (mask) == REGNO (scratch));
13424           op1 = simplify_gen_subreg (vmode, op1, mode, 0);
13425           x = gen_rtx_AND (vmode, scratch, op1);
13426         }
13427       emit_insn (gen_rtx_SET (VOIDmode, scratch, x));
13428
13429       if (REGNO (op0) == REGNO (dest))                  /* alternative 1,2 */
13430         {
13431           dest = simplify_gen_subreg (vmode, op0, mode, 0);
13432           x = gen_rtx_AND (vmode, dest, nmask);
13433         }
13434       else                                              /* alternative 3,4 */
13435         {
13436           gcc_assert (REGNO (nmask) == REGNO (dest));
13437           dest = nmask;
13438           op0 = simplify_gen_subreg (vmode, op0, mode, 0);
13439           x = gen_rtx_AND (vmode, dest, op0);
13440         }
13441       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
13442     }
13443
13444   x = gen_rtx_IOR (vmode, dest, scratch);
13445   emit_insn (gen_rtx_SET (VOIDmode, dest, x));
13446 }
13447
13448 /* Return TRUE or FALSE depending on whether the first SET in INSN
13449    has source and destination with matching CC modes, and that the
13450    CC mode is at least as constrained as REQ_MODE.  */
13451
13452 int
13453 ix86_match_ccmode (rtx insn, enum machine_mode req_mode)
13454 {
13455   rtx set;
13456   enum machine_mode set_mode;
13457
13458   set = PATTERN (insn);
13459   if (GET_CODE (set) == PARALLEL)
13460     set = XVECEXP (set, 0, 0);
13461   gcc_assert (GET_CODE (set) == SET);
13462   gcc_assert (GET_CODE (SET_SRC (set)) == COMPARE);
13463
13464   set_mode = GET_MODE (SET_DEST (set));
13465   switch (set_mode)
13466     {
13467     case CCNOmode:
13468       if (req_mode != CCNOmode
13469           && (req_mode != CCmode
13470               || XEXP (SET_SRC (set), 1) != const0_rtx))
13471         return 0;
13472       break;
13473     case CCmode:
13474       if (req_mode == CCGCmode)
13475         return 0;
13476       /* FALLTHRU */
13477     case CCGCmode:
13478       if (req_mode == CCGOCmode || req_mode == CCNOmode)
13479         return 0;
13480       /* FALLTHRU */
13481     case CCGOCmode:
13482       if (req_mode == CCZmode)
13483         return 0;
13484       /* FALLTHRU */
13485     case CCAmode:
13486     case CCCmode:
13487     case CCOmode:
13488     case CCSmode:
13489     case CCZmode:
13490       break;
13491
13492     default:
13493       gcc_unreachable ();
13494     }
13495
13496   return (GET_MODE (SET_SRC (set)) == set_mode);
13497 }
13498
13499 /* Generate insn patterns to do an integer compare of OPERANDS.  */
13500
13501 static rtx
13502 ix86_expand_int_compare (enum rtx_code code, rtx op0, rtx op1)
13503 {
13504   enum machine_mode cmpmode;
13505   rtx tmp, flags;
13506
13507   cmpmode = SELECT_CC_MODE (code, op0, op1);
13508   flags = gen_rtx_REG (cmpmode, FLAGS_REG);
13509
13510   /* This is very simple, but making the interface the same as in the
13511      FP case makes the rest of the code easier.  */
13512   tmp = gen_rtx_COMPARE (cmpmode, op0, op1);
13513   emit_insn (gen_rtx_SET (VOIDmode, flags, tmp));
13514
13515   /* Return the test that should be put into the flags user, i.e.
13516      the bcc, scc, or cmov instruction.  */
13517   return gen_rtx_fmt_ee (code, VOIDmode, flags, const0_rtx);
13518 }
13519
13520 /* Figure out whether to use ordered or unordered fp comparisons.
13521    Return the appropriate mode to use.  */
13522
13523 enum machine_mode
13524 ix86_fp_compare_mode (enum rtx_code code ATTRIBUTE_UNUSED)
13525 {
13526   /* ??? In order to make all comparisons reversible, we do all comparisons
13527      non-trapping when compiling for IEEE.  Once gcc is able to distinguish
13528      all forms trapping and nontrapping comparisons, we can make inequality
13529      comparisons trapping again, since it results in better code when using
13530      FCOM based compares.  */
13531   return TARGET_IEEE_FP ? CCFPUmode : CCFPmode;
13532 }
13533
13534 enum machine_mode
13535 ix86_cc_mode (enum rtx_code code, rtx op0, rtx op1)
13536 {
13537   enum machine_mode mode = GET_MODE (op0);
13538
13539   if (SCALAR_FLOAT_MODE_P (mode))
13540     {
13541       gcc_assert (!DECIMAL_FLOAT_MODE_P (mode));
13542       return ix86_fp_compare_mode (code);
13543     }
13544
13545   switch (code)
13546     {
13547       /* Only zero flag is needed.  */
13548     case EQ:                    /* ZF=0 */
13549     case NE:                    /* ZF!=0 */
13550       return CCZmode;
13551       /* Codes needing carry flag.  */
13552     case GEU:                   /* CF=0 */
13553     case LTU:                   /* CF=1 */
13554       /* Detect overflow checks.  They need just the carry flag.  */
13555       if (GET_CODE (op0) == PLUS
13556           && rtx_equal_p (op1, XEXP (op0, 0)))
13557         return CCCmode;
13558       else
13559         return CCmode;
13560     case GTU:                   /* CF=0 & ZF=0 */
13561     case LEU:                   /* CF=1 | ZF=1 */
13562       /* Detect overflow checks.  They need just the carry flag.  */
13563       if (GET_CODE (op0) == MINUS
13564           && rtx_equal_p (op1, XEXP (op0, 0)))
13565         return CCCmode;
13566       else
13567         return CCmode;
13568       /* Codes possibly doable only with sign flag when
13569          comparing against zero.  */
13570     case GE:                    /* SF=OF   or   SF=0 */
13571     case LT:                    /* SF<>OF  or   SF=1 */
13572       if (op1 == const0_rtx)
13573         return CCGOCmode;
13574       else
13575         /* For other cases Carry flag is not required.  */
13576         return CCGCmode;
13577       /* Codes doable only with sign flag when comparing
13578          against zero, but we miss jump instruction for it
13579          so we need to use relational tests against overflow
13580          that thus needs to be zero.  */
13581     case GT:                    /* ZF=0 & SF=OF */
13582     case LE:                    /* ZF=1 | SF<>OF */
13583       if (op1 == const0_rtx)
13584         return CCNOmode;
13585       else
13586         return CCGCmode;
13587       /* strcmp pattern do (use flags) and combine may ask us for proper
13588          mode.  */
13589     case USE:
13590       return CCmode;
13591     default:
13592       gcc_unreachable ();
13593     }
13594 }
13595
13596 /* Return the fixed registers used for condition codes.  */
13597
13598 static bool
13599 ix86_fixed_condition_code_regs (unsigned int *p1, unsigned int *p2)
13600 {
13601   *p1 = FLAGS_REG;
13602   *p2 = FPSR_REG;
13603   return true;
13604 }
13605
13606 /* If two condition code modes are compatible, return a condition code
13607    mode which is compatible with both.  Otherwise, return
13608    VOIDmode.  */
13609
13610 static enum machine_mode
13611 ix86_cc_modes_compatible (enum machine_mode m1, enum machine_mode m2)
13612 {
13613   if (m1 == m2)
13614     return m1;
13615
13616   if (GET_MODE_CLASS (m1) != MODE_CC || GET_MODE_CLASS (m2) != MODE_CC)
13617     return VOIDmode;
13618
13619   if ((m1 == CCGCmode && m2 == CCGOCmode)
13620       || (m1 == CCGOCmode && m2 == CCGCmode))
13621     return CCGCmode;
13622
13623   switch (m1)
13624     {
13625     default:
13626       gcc_unreachable ();
13627
13628     case CCmode:
13629     case CCGCmode:
13630     case CCGOCmode:
13631     case CCNOmode:
13632     case CCAmode:
13633     case CCCmode:
13634     case CCOmode:
13635     case CCSmode:
13636     case CCZmode:
13637       switch (m2)
13638         {
13639         default:
13640           return VOIDmode;
13641
13642         case CCmode:
13643         case CCGCmode:
13644         case CCGOCmode:
13645         case CCNOmode:
13646         case CCAmode:
13647         case CCCmode:
13648         case CCOmode:
13649         case CCSmode:
13650         case CCZmode:
13651           return CCmode;
13652         }
13653
13654     case CCFPmode:
13655     case CCFPUmode:
13656       /* These are only compatible with themselves, which we already
13657          checked above.  */
13658       return VOIDmode;
13659     }
13660 }
13661
13662 /* Split comparison code CODE into comparisons we can do using branch
13663    instructions.  BYPASS_CODE is comparison code for branch that will
13664    branch around FIRST_CODE and SECOND_CODE.  If some of branches
13665    is not required, set value to UNKNOWN.
13666    We never require more than two branches.  */
13667
13668 void
13669 ix86_fp_comparison_codes (enum rtx_code code, enum rtx_code *bypass_code,
13670                           enum rtx_code *first_code,
13671                           enum rtx_code *second_code)
13672 {
13673   *first_code = code;
13674   *bypass_code = UNKNOWN;
13675   *second_code = UNKNOWN;
13676
13677   /* The fcomi comparison sets flags as follows:
13678
13679      cmp    ZF PF CF
13680      >      0  0  0
13681      <      0  0  1
13682      =      1  0  0
13683      un     1  1  1 */
13684
13685   switch (code)
13686     {
13687     case GT:                    /* GTU - CF=0 & ZF=0 */
13688     case GE:                    /* GEU - CF=0 */
13689     case ORDERED:               /* PF=0 */
13690     case UNORDERED:             /* PF=1 */
13691     case UNEQ:                  /* EQ - ZF=1 */
13692     case UNLT:                  /* LTU - CF=1 */
13693     case UNLE:                  /* LEU - CF=1 | ZF=1 */
13694     case LTGT:                  /* EQ - ZF=0 */
13695       break;
13696     case LT:                    /* LTU - CF=1 - fails on unordered */
13697       *first_code = UNLT;
13698       *bypass_code = UNORDERED;
13699       break;
13700     case LE:                    /* LEU - CF=1 | ZF=1 - fails on unordered */
13701       *first_code = UNLE;
13702       *bypass_code = UNORDERED;
13703       break;
13704     case EQ:                    /* EQ - ZF=1 - fails on unordered */
13705       *first_code = UNEQ;
13706       *bypass_code = UNORDERED;
13707       break;
13708     case NE:                    /* NE - ZF=0 - fails on unordered */
13709       *first_code = LTGT;
13710       *second_code = UNORDERED;
13711       break;
13712     case UNGE:                  /* GEU - CF=0 - fails on unordered */
13713       *first_code = GE;
13714       *second_code = UNORDERED;
13715       break;
13716     case UNGT:                  /* GTU - CF=0 & ZF=0 - fails on unordered */
13717       *first_code = GT;
13718       *second_code = UNORDERED;
13719       break;
13720     default:
13721       gcc_unreachable ();
13722     }
13723   if (!TARGET_IEEE_FP)
13724     {
13725       *second_code = UNKNOWN;
13726       *bypass_code = UNKNOWN;
13727     }
13728 }
13729
13730 /* Return cost of comparison done fcom + arithmetics operations on AX.
13731    All following functions do use number of instructions as a cost metrics.
13732    In future this should be tweaked to compute bytes for optimize_size and
13733    take into account performance of various instructions on various CPUs.  */
13734 static int
13735 ix86_fp_comparison_arithmetics_cost (enum rtx_code code)
13736 {
13737   if (!TARGET_IEEE_FP)
13738     return 4;
13739   /* The cost of code output by ix86_expand_fp_compare.  */
13740   switch (code)
13741     {
13742     case UNLE:
13743     case UNLT:
13744     case LTGT:
13745     case GT:
13746     case GE:
13747     case UNORDERED:
13748     case ORDERED:
13749     case UNEQ:
13750       return 4;
13751       break;
13752     case LT:
13753     case NE:
13754     case EQ:
13755     case UNGE:
13756       return 5;
13757       break;
13758     case LE:
13759     case UNGT:
13760       return 6;
13761       break;
13762     default:
13763       gcc_unreachable ();
13764     }
13765 }
13766
13767 /* Return cost of comparison done using fcomi operation.
13768    See ix86_fp_comparison_arithmetics_cost for the metrics.  */
13769 static int
13770 ix86_fp_comparison_fcomi_cost (enum rtx_code code)
13771 {
13772   enum rtx_code bypass_code, first_code, second_code;
13773   /* Return arbitrarily high cost when instruction is not supported - this
13774      prevents gcc from using it.  */
13775   if (!TARGET_CMOVE)
13776     return 1024;
13777   ix86_fp_comparison_codes (code, &bypass_code, &first_code, &second_code);
13778   return (bypass_code != UNKNOWN || second_code != UNKNOWN) + 2;
13779 }
13780
13781 /* Return cost of comparison done using sahf operation.
13782    See ix86_fp_comparison_arithmetics_cost for the metrics.  */
13783 static int
13784 ix86_fp_comparison_sahf_cost (enum rtx_code code)
13785 {
13786   enum rtx_code bypass_code, first_code, second_code;
13787   /* Return arbitrarily high cost when instruction is not preferred - this
13788      avoids gcc from using it.  */
13789   if (!(TARGET_SAHF && (TARGET_USE_SAHF || optimize_insn_for_size_p ())))
13790     return 1024;
13791   ix86_fp_comparison_codes (code, &bypass_code, &first_code, &second_code);
13792   return (bypass_code != UNKNOWN || second_code != UNKNOWN) + 3;
13793 }
13794
13795 /* Compute cost of the comparison done using any method.
13796    See ix86_fp_comparison_arithmetics_cost for the metrics.  */
13797 static int
13798 ix86_fp_comparison_cost (enum rtx_code code)
13799 {
13800   int fcomi_cost, sahf_cost, arithmetics_cost = 1024;
13801   int min;
13802
13803   fcomi_cost = ix86_fp_comparison_fcomi_cost (code);
13804   sahf_cost = ix86_fp_comparison_sahf_cost (code);
13805
13806   min = arithmetics_cost = ix86_fp_comparison_arithmetics_cost (code);
13807   if (min > sahf_cost)
13808     min = sahf_cost;
13809   if (min > fcomi_cost)
13810     min = fcomi_cost;
13811   return min;
13812 }
13813
13814 /* Return true if we should use an FCOMI instruction for this
13815    fp comparison.  */
13816
13817 int
13818 ix86_use_fcomi_compare (enum rtx_code code ATTRIBUTE_UNUSED)
13819 {
13820   enum rtx_code swapped_code = swap_condition (code);
13821
13822   return ((ix86_fp_comparison_cost (code)
13823            == ix86_fp_comparison_fcomi_cost (code))
13824           || (ix86_fp_comparison_cost (swapped_code)
13825               == ix86_fp_comparison_fcomi_cost (swapped_code)));
13826 }
13827
13828 /* Swap, force into registers, or otherwise massage the two operands
13829    to a fp comparison.  The operands are updated in place; the new
13830    comparison code is returned.  */
13831
13832 static enum rtx_code
13833 ix86_prepare_fp_compare_args (enum rtx_code code, rtx *pop0, rtx *pop1)
13834 {
13835   enum machine_mode fpcmp_mode = ix86_fp_compare_mode (code);
13836   rtx op0 = *pop0, op1 = *pop1;
13837   enum machine_mode op_mode = GET_MODE (op0);
13838   int is_sse = TARGET_SSE_MATH && SSE_FLOAT_MODE_P (op_mode);
13839
13840   /* All of the unordered compare instructions only work on registers.
13841      The same is true of the fcomi compare instructions.  The XFmode
13842      compare instructions require registers except when comparing
13843      against zero or when converting operand 1 from fixed point to
13844      floating point.  */
13845
13846   if (!is_sse
13847       && (fpcmp_mode == CCFPUmode
13848           || (op_mode == XFmode
13849               && ! (standard_80387_constant_p (op0) == 1
13850                     || standard_80387_constant_p (op1) == 1)
13851               && GET_CODE (op1) != FLOAT)
13852           || ix86_use_fcomi_compare (code)))
13853     {
13854       op0 = force_reg (op_mode, op0);
13855       op1 = force_reg (op_mode, op1);
13856     }
13857   else
13858     {
13859       /* %%% We only allow op1 in memory; op0 must be st(0).  So swap
13860          things around if they appear profitable, otherwise force op0
13861          into a register.  */
13862
13863       if (standard_80387_constant_p (op0) == 0
13864           || (MEM_P (op0)
13865               && ! (standard_80387_constant_p (op1) == 0
13866                     || MEM_P (op1))))
13867         {
13868           rtx tmp;
13869           tmp = op0, op0 = op1, op1 = tmp;
13870           code = swap_condition (code);
13871         }
13872
13873       if (!REG_P (op0))
13874         op0 = force_reg (op_mode, op0);
13875
13876       if (CONSTANT_P (op1))
13877         {
13878           int tmp = standard_80387_constant_p (op1);
13879           if (tmp == 0)
13880             op1 = validize_mem (force_const_mem (op_mode, op1));
13881           else if (tmp == 1)
13882             {
13883               if (TARGET_CMOVE)
13884                 op1 = force_reg (op_mode, op1);
13885             }
13886           else
13887             op1 = force_reg (op_mode, op1);
13888         }
13889     }
13890
13891   /* Try to rearrange the comparison to make it cheaper.  */
13892   if (ix86_fp_comparison_cost (code)
13893       > ix86_fp_comparison_cost (swap_condition (code))
13894       && (REG_P (op1) || can_create_pseudo_p ()))
13895     {
13896       rtx tmp;
13897       tmp = op0, op0 = op1, op1 = tmp;
13898       code = swap_condition (code);
13899       if (!REG_P (op0))
13900         op0 = force_reg (op_mode, op0);
13901     }
13902
13903   *pop0 = op0;
13904   *pop1 = op1;
13905   return code;
13906 }
13907
13908 /* Convert comparison codes we use to represent FP comparison to integer
13909    code that will result in proper branch.  Return UNKNOWN if no such code
13910    is available.  */
13911
13912 enum rtx_code
13913 ix86_fp_compare_code_to_integer (enum rtx_code code)
13914 {
13915   switch (code)
13916     {
13917     case GT:
13918       return GTU;
13919     case GE:
13920       return GEU;
13921     case ORDERED:
13922     case UNORDERED:
13923       return code;
13924       break;
13925     case UNEQ:
13926       return EQ;
13927       break;
13928     case UNLT:
13929       return LTU;
13930       break;
13931     case UNLE:
13932       return LEU;
13933       break;
13934     case LTGT:
13935       return NE;
13936       break;
13937     default:
13938       return UNKNOWN;
13939     }
13940 }
13941
13942 /* Generate insn patterns to do a floating point compare of OPERANDS.  */
13943
13944 static rtx
13945 ix86_expand_fp_compare (enum rtx_code code, rtx op0, rtx op1, rtx scratch,
13946                         rtx *second_test, rtx *bypass_test)
13947 {
13948   enum machine_mode fpcmp_mode, intcmp_mode;
13949   rtx tmp, tmp2;
13950   int cost = ix86_fp_comparison_cost (code);
13951   enum rtx_code bypass_code, first_code, second_code;
13952
13953   fpcmp_mode = ix86_fp_compare_mode (code);
13954   code = ix86_prepare_fp_compare_args (code, &op0, &op1);
13955
13956   if (second_test)
13957     *second_test = NULL_RTX;
13958   if (bypass_test)
13959     *bypass_test = NULL_RTX;
13960
13961   ix86_fp_comparison_codes (code, &bypass_code, &first_code, &second_code);
13962
13963   /* Do fcomi/sahf based test when profitable.  */
13964   if (ix86_fp_comparison_arithmetics_cost (code) > cost
13965       && (bypass_code == UNKNOWN || bypass_test)
13966       && (second_code == UNKNOWN || second_test))
13967     {
13968       tmp = gen_rtx_COMPARE (fpcmp_mode, op0, op1);
13969       tmp = gen_rtx_SET (VOIDmode, gen_rtx_REG (fpcmp_mode, FLAGS_REG),
13970                          tmp);
13971       if (TARGET_CMOVE)
13972         emit_insn (tmp);
13973       else
13974         {
13975           gcc_assert (TARGET_SAHF);
13976
13977           if (!scratch)
13978             scratch = gen_reg_rtx (HImode);
13979           tmp2 = gen_rtx_CLOBBER (VOIDmode, scratch);
13980
13981           emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, tmp, tmp2)));
13982         }
13983
13984       /* The FP codes work out to act like unsigned.  */
13985       intcmp_mode = fpcmp_mode;
13986       code = first_code;
13987       if (bypass_code != UNKNOWN)
13988         *bypass_test = gen_rtx_fmt_ee (bypass_code, VOIDmode,
13989                                        gen_rtx_REG (intcmp_mode, FLAGS_REG),
13990                                        const0_rtx);
13991       if (second_code != UNKNOWN)
13992         *second_test = gen_rtx_fmt_ee (second_code, VOIDmode,
13993                                        gen_rtx_REG (intcmp_mode, FLAGS_REG),
13994                                        const0_rtx);
13995     }
13996   else
13997     {
13998       /* Sadness wrt reg-stack pops killing fpsr -- gotta get fnstsw first.  */
13999       tmp = gen_rtx_COMPARE (fpcmp_mode, op0, op1);
14000       tmp2 = gen_rtx_UNSPEC (HImode, gen_rtvec (1, tmp), UNSPEC_FNSTSW);
14001       if (!scratch)
14002         scratch = gen_reg_rtx (HImode);
14003       emit_insn (gen_rtx_SET (VOIDmode, scratch, tmp2));
14004
14005       /* In the unordered case, we have to check C2 for NaN's, which
14006          doesn't happen to work out to anything nice combination-wise.
14007          So do some bit twiddling on the value we've got in AH to come
14008          up with an appropriate set of condition codes.  */
14009
14010       intcmp_mode = CCNOmode;
14011       switch (code)
14012         {
14013         case GT:
14014         case UNGT:
14015           if (code == GT || !TARGET_IEEE_FP)
14016             {
14017               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x45)));
14018               code = EQ;
14019             }
14020           else
14021             {
14022               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
14023               emit_insn (gen_addqi_ext_1 (scratch, scratch, constm1_rtx));
14024               emit_insn (gen_cmpqi_ext_3 (scratch, GEN_INT (0x44)));
14025               intcmp_mode = CCmode;
14026               code = GEU;
14027             }
14028           break;
14029         case LT:
14030         case UNLT:
14031           if (code == LT && TARGET_IEEE_FP)
14032             {
14033               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
14034               emit_insn (gen_cmpqi_ext_3 (scratch, GEN_INT (0x01)));
14035               intcmp_mode = CCmode;
14036               code = EQ;
14037             }
14038           else
14039             {
14040               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x01)));
14041               code = NE;
14042             }
14043           break;
14044         case GE:
14045         case UNGE:
14046           if (code == GE || !TARGET_IEEE_FP)
14047             {
14048               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x05)));
14049               code = EQ;
14050             }
14051           else
14052             {
14053               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
14054               emit_insn (gen_xorqi_cc_ext_1 (scratch, scratch,
14055                                              GEN_INT (0x01)));
14056               code = NE;
14057             }
14058           break;
14059         case LE:
14060         case UNLE:
14061           if (code == LE && TARGET_IEEE_FP)
14062             {
14063               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
14064               emit_insn (gen_addqi_ext_1 (scratch, scratch, constm1_rtx));
14065               emit_insn (gen_cmpqi_ext_3 (scratch, GEN_INT (0x40)));
14066               intcmp_mode = CCmode;
14067               code = LTU;
14068             }
14069           else
14070             {
14071               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x45)));
14072               code = NE;
14073             }
14074           break;
14075         case EQ:
14076         case UNEQ:
14077           if (code == EQ && TARGET_IEEE_FP)
14078             {
14079               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
14080               emit_insn (gen_cmpqi_ext_3 (scratch, GEN_INT (0x40)));
14081               intcmp_mode = CCmode;
14082               code = EQ;
14083             }
14084           else
14085             {
14086               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x40)));
14087               code = NE;
14088               break;
14089             }
14090           break;
14091         case NE:
14092         case LTGT:
14093           if (code == NE && TARGET_IEEE_FP)
14094             {
14095               emit_insn (gen_andqi_ext_0 (scratch, scratch, GEN_INT (0x45)));
14096               emit_insn (gen_xorqi_cc_ext_1 (scratch, scratch,
14097                                              GEN_INT (0x40)));
14098               code = NE;
14099             }
14100           else
14101             {
14102               emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x40)));
14103               code = EQ;
14104             }
14105           break;
14106
14107         case UNORDERED:
14108           emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x04)));
14109           code = NE;
14110           break;
14111         case ORDERED:
14112           emit_insn (gen_testqi_ext_ccno_0 (scratch, GEN_INT (0x04)));
14113           code = EQ;
14114           break;
14115
14116         default:
14117           gcc_unreachable ();
14118         }
14119     }
14120
14121   /* Return the test that should be put into the flags user, i.e.
14122      the bcc, scc, or cmov instruction.  */
14123   return gen_rtx_fmt_ee (code, VOIDmode,
14124                          gen_rtx_REG (intcmp_mode, FLAGS_REG),
14125                          const0_rtx);
14126 }
14127
14128 rtx
14129 ix86_expand_compare (enum rtx_code code, rtx *second_test, rtx *bypass_test)
14130 {
14131   rtx op0, op1, ret;
14132   op0 = ix86_compare_op0;
14133   op1 = ix86_compare_op1;
14134
14135   if (second_test)
14136     *second_test = NULL_RTX;
14137   if (bypass_test)
14138     *bypass_test = NULL_RTX;
14139
14140   if (ix86_compare_emitted)
14141     {
14142       ret = gen_rtx_fmt_ee (code, VOIDmode, ix86_compare_emitted, const0_rtx);
14143       ix86_compare_emitted = NULL_RTX;
14144     }
14145   else if (SCALAR_FLOAT_MODE_P (GET_MODE (op0)))
14146     {
14147       gcc_assert (!DECIMAL_FLOAT_MODE_P (GET_MODE (op0)));
14148       ret = ix86_expand_fp_compare (code, op0, op1, NULL_RTX,
14149                                     second_test, bypass_test);
14150     }
14151   else
14152     ret = ix86_expand_int_compare (code, op0, op1);
14153
14154   return ret;
14155 }
14156
14157 /* Return true if the CODE will result in nontrivial jump sequence.  */
14158 bool
14159 ix86_fp_jump_nontrivial_p (enum rtx_code code)
14160 {
14161   enum rtx_code bypass_code, first_code, second_code;
14162   if (!TARGET_CMOVE)
14163     return true;
14164   ix86_fp_comparison_codes (code, &bypass_code, &first_code, &second_code);
14165   return bypass_code != UNKNOWN || second_code != UNKNOWN;
14166 }
14167
14168 void
14169 ix86_expand_branch (enum rtx_code code, rtx label)
14170 {
14171   rtx tmp;
14172
14173   /* If we have emitted a compare insn, go straight to simple.
14174      ix86_expand_compare won't emit anything if ix86_compare_emitted
14175      is non NULL.  */
14176   if (ix86_compare_emitted)
14177     goto simple;
14178
14179   switch (GET_MODE (ix86_compare_op0))
14180     {
14181     case QImode:
14182     case HImode:
14183     case SImode:
14184       simple:
14185       tmp = ix86_expand_compare (code, NULL, NULL);
14186       tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp,
14187                                   gen_rtx_LABEL_REF (VOIDmode, label),
14188                                   pc_rtx);
14189       emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, tmp));
14190       return;
14191
14192     case SFmode:
14193     case DFmode:
14194     case XFmode:
14195       {
14196         rtvec vec;
14197         int use_fcomi;
14198         enum rtx_code bypass_code, first_code, second_code;
14199
14200         code = ix86_prepare_fp_compare_args (code, &ix86_compare_op0,
14201                                              &ix86_compare_op1);
14202
14203         ix86_fp_comparison_codes (code, &bypass_code, &first_code, &second_code);
14204
14205         /* Check whether we will use the natural sequence with one jump.  If
14206            so, we can expand jump early.  Otherwise delay expansion by
14207            creating compound insn to not confuse optimizers.  */
14208         if (bypass_code == UNKNOWN && second_code == UNKNOWN)
14209           {
14210             ix86_split_fp_branch (code, ix86_compare_op0, ix86_compare_op1,
14211                                   gen_rtx_LABEL_REF (VOIDmode, label),
14212                                   pc_rtx, NULL_RTX, NULL_RTX);
14213           }
14214         else
14215           {
14216             tmp = gen_rtx_fmt_ee (code, VOIDmode,
14217                                   ix86_compare_op0, ix86_compare_op1);
14218             tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp,
14219                                         gen_rtx_LABEL_REF (VOIDmode, label),
14220                                         pc_rtx);
14221             tmp = gen_rtx_SET (VOIDmode, pc_rtx, tmp);
14222
14223             use_fcomi = ix86_use_fcomi_compare (code);
14224             vec = rtvec_alloc (3 + !use_fcomi);
14225             RTVEC_ELT (vec, 0) = tmp;
14226             RTVEC_ELT (vec, 1)
14227               = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCFPmode, FPSR_REG));
14228             RTVEC_ELT (vec, 2)
14229               = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCFPmode, FLAGS_REG));
14230             if (! use_fcomi)
14231               RTVEC_ELT (vec, 3)
14232                 = gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (HImode));
14233
14234             emit_jump_insn (gen_rtx_PARALLEL (VOIDmode, vec));
14235           }
14236         return;
14237       }
14238
14239     case DImode:
14240       if (TARGET_64BIT)
14241         goto simple;
14242     case TImode:
14243       /* Expand DImode branch into multiple compare+branch.  */
14244       {
14245         rtx lo[2], hi[2], label2;
14246         enum rtx_code code1, code2, code3;
14247         enum machine_mode submode;
14248
14249         if (CONSTANT_P (ix86_compare_op0) && ! CONSTANT_P (ix86_compare_op1))
14250           {
14251             tmp = ix86_compare_op0;
14252             ix86_compare_op0 = ix86_compare_op1;
14253             ix86_compare_op1 = tmp;
14254             code = swap_condition (code);
14255           }
14256         if (GET_MODE (ix86_compare_op0) == DImode)
14257           {
14258             split_di (&ix86_compare_op0, 1, lo+0, hi+0);
14259             split_di (&ix86_compare_op1, 1, lo+1, hi+1);
14260             submode = SImode;
14261           }
14262         else
14263           {
14264             split_ti (&ix86_compare_op0, 1, lo+0, hi+0);
14265             split_ti (&ix86_compare_op1, 1, lo+1, hi+1);
14266             submode = DImode;
14267           }
14268
14269         /* When comparing for equality, we can use (hi0^hi1)|(lo0^lo1) to
14270            avoid two branches.  This costs one extra insn, so disable when
14271            optimizing for size.  */
14272
14273         if ((code == EQ || code == NE)
14274             && (!optimize_insn_for_size_p ()
14275                 || hi[1] == const0_rtx || lo[1] == const0_rtx))
14276           {
14277             rtx xor0, xor1;
14278
14279             xor1 = hi[0];
14280             if (hi[1] != const0_rtx)
14281               xor1 = expand_binop (submode, xor_optab, xor1, hi[1],
14282                                    NULL_RTX, 0, OPTAB_WIDEN);
14283
14284             xor0 = lo[0];
14285             if (lo[1] != const0_rtx)
14286               xor0 = expand_binop (submode, xor_optab, xor0, lo[1],
14287                                    NULL_RTX, 0, OPTAB_WIDEN);
14288
14289             tmp = expand_binop (submode, ior_optab, xor1, xor0,
14290                                 NULL_RTX, 0, OPTAB_WIDEN);
14291
14292             ix86_compare_op0 = tmp;
14293             ix86_compare_op1 = const0_rtx;
14294             ix86_expand_branch (code, label);
14295             return;
14296           }
14297
14298         /* Otherwise, if we are doing less-than or greater-or-equal-than,
14299            op1 is a constant and the low word is zero, then we can just
14300            examine the high word.  Similarly for low word -1 and
14301            less-or-equal-than or greater-than.  */
14302
14303         if (CONST_INT_P (hi[1]))
14304           switch (code)
14305             {
14306             case LT: case LTU: case GE: case GEU:
14307               if (lo[1] == const0_rtx)
14308                 {
14309                   ix86_compare_op0 = hi[0];
14310                   ix86_compare_op1 = hi[1];
14311                   ix86_expand_branch (code, label);
14312                   return;
14313                 }
14314               break;
14315             case LE: case LEU: case GT: case GTU:
14316               if (lo[1] == constm1_rtx)
14317                 {
14318                   ix86_compare_op0 = hi[0];
14319                   ix86_compare_op1 = hi[1];
14320                   ix86_expand_branch (code, label);
14321                   return;
14322                 }
14323               break;
14324             default:
14325               break;
14326             }
14327
14328         /* Otherwise, we need two or three jumps.  */
14329
14330         label2 = gen_label_rtx ();
14331
14332         code1 = code;
14333         code2 = swap_condition (code);
14334         code3 = unsigned_condition (code);
14335
14336         switch (code)
14337           {
14338           case LT: case GT: case LTU: case GTU:
14339             break;
14340
14341           case LE:   code1 = LT;  code2 = GT;  break;
14342           case GE:   code1 = GT;  code2 = LT;  break;
14343           case LEU:  code1 = LTU; code2 = GTU; break;
14344           case GEU:  code1 = GTU; code2 = LTU; break;
14345
14346           case EQ:   code1 = UNKNOWN; code2 = NE;  break;
14347           case NE:   code2 = UNKNOWN; break;
14348
14349           default:
14350             gcc_unreachable ();
14351           }
14352
14353         /*
14354          * a < b =>
14355          *    if (hi(a) < hi(b)) goto true;
14356          *    if (hi(a) > hi(b)) goto false;
14357          *    if (lo(a) < lo(b)) goto true;
14358          *  false:
14359          */
14360
14361         ix86_compare_op0 = hi[0];
14362         ix86_compare_op1 = hi[1];
14363
14364         if (code1 != UNKNOWN)
14365           ix86_expand_branch (code1, label);
14366         if (code2 != UNKNOWN)
14367           ix86_expand_branch (code2, label2);
14368
14369         ix86_compare_op0 = lo[0];
14370         ix86_compare_op1 = lo[1];
14371         ix86_expand_branch (code3, label);
14372
14373         if (code2 != UNKNOWN)
14374           emit_label (label2);
14375         return;
14376       }
14377
14378     default:
14379       gcc_unreachable ();
14380     }
14381 }
14382
14383 /* Split branch based on floating point condition.  */
14384 void
14385 ix86_split_fp_branch (enum rtx_code code, rtx op1, rtx op2,
14386                       rtx target1, rtx target2, rtx tmp, rtx pushed)
14387 {
14388   rtx second, bypass;
14389   rtx label = NULL_RTX;
14390   rtx condition;
14391   int bypass_probability = -1, second_probability = -1, probability = -1;
14392   rtx i;
14393
14394   if (target2 != pc_rtx)
14395     {
14396       rtx tmp = target2;
14397       code = reverse_condition_maybe_unordered (code);
14398       target2 = target1;
14399       target1 = tmp;
14400     }
14401
14402   condition = ix86_expand_fp_compare (code, op1, op2,
14403                                       tmp, &second, &bypass);
14404
14405   /* Remove pushed operand from stack.  */
14406   if (pushed)
14407     ix86_free_from_memory (GET_MODE (pushed));
14408
14409   if (split_branch_probability >= 0)
14410     {
14411       /* Distribute the probabilities across the jumps.
14412          Assume the BYPASS and SECOND to be always test
14413          for UNORDERED.  */
14414       probability = split_branch_probability;
14415
14416       /* Value of 1 is low enough to make no need for probability
14417          to be updated.  Later we may run some experiments and see
14418          if unordered values are more frequent in practice.  */
14419       if (bypass)
14420         bypass_probability = 1;
14421       if (second)
14422         second_probability = 1;
14423     }
14424   if (bypass != NULL_RTX)
14425     {
14426       label = gen_label_rtx ();
14427       i = emit_jump_insn (gen_rtx_SET
14428                           (VOIDmode, pc_rtx,
14429                            gen_rtx_IF_THEN_ELSE (VOIDmode,
14430                                                  bypass,
14431                                                  gen_rtx_LABEL_REF (VOIDmode,
14432                                                                     label),
14433                                                  pc_rtx)));
14434       if (bypass_probability >= 0)
14435         REG_NOTES (i)
14436           = gen_rtx_EXPR_LIST (REG_BR_PROB,
14437                                GEN_INT (bypass_probability),
14438                                REG_NOTES (i));
14439     }
14440   i = emit_jump_insn (gen_rtx_SET
14441                       (VOIDmode, pc_rtx,
14442                        gen_rtx_IF_THEN_ELSE (VOIDmode,
14443                                              condition, target1, target2)));
14444   if (probability >= 0)
14445     REG_NOTES (i)
14446       = gen_rtx_EXPR_LIST (REG_BR_PROB,
14447                            GEN_INT (probability),
14448                            REG_NOTES (i));
14449   if (second != NULL_RTX)
14450     {
14451       i = emit_jump_insn (gen_rtx_SET
14452                           (VOIDmode, pc_rtx,
14453                            gen_rtx_IF_THEN_ELSE (VOIDmode, second, target1,
14454                                                  target2)));
14455       if (second_probability >= 0)
14456         REG_NOTES (i)
14457           = gen_rtx_EXPR_LIST (REG_BR_PROB,
14458                                GEN_INT (second_probability),
14459                                REG_NOTES (i));
14460     }
14461   if (label != NULL_RTX)
14462     emit_label (label);
14463 }
14464
14465 int
14466 ix86_expand_setcc (enum rtx_code code, rtx dest)
14467 {
14468   rtx ret, tmp, tmpreg, equiv;
14469   rtx second_test, bypass_test;
14470
14471   if (GET_MODE (ix86_compare_op0) == (TARGET_64BIT ? TImode : DImode))
14472     return 0; /* FAIL */
14473
14474   gcc_assert (GET_MODE (dest) == QImode);
14475
14476   ret = ix86_expand_compare (code, &second_test, &bypass_test);
14477   PUT_MODE (ret, QImode);
14478
14479   tmp = dest;
14480   tmpreg = dest;
14481
14482   emit_insn (gen_rtx_SET (VOIDmode, tmp, ret));
14483   if (bypass_test || second_test)
14484     {
14485       rtx test = second_test;
14486       int bypass = 0;
14487       rtx tmp2 = gen_reg_rtx (QImode);
14488       if (bypass_test)
14489         {
14490           gcc_assert (!second_test);
14491           test = bypass_test;
14492           bypass = 1;
14493           PUT_CODE (test, reverse_condition_maybe_unordered (GET_CODE (test)));
14494         }
14495       PUT_MODE (test, QImode);
14496       emit_insn (gen_rtx_SET (VOIDmode, tmp2, test));
14497
14498       if (bypass)
14499         emit_insn (gen_andqi3 (tmp, tmpreg, tmp2));
14500       else
14501         emit_insn (gen_iorqi3 (tmp, tmpreg, tmp2));
14502     }
14503
14504   /* Attach a REG_EQUAL note describing the comparison result.  */
14505   if (ix86_compare_op0 && ix86_compare_op1)
14506     {
14507       equiv = simplify_gen_relational (code, QImode,
14508                                        GET_MODE (ix86_compare_op0),
14509                                        ix86_compare_op0, ix86_compare_op1);
14510       set_unique_reg_note (get_last_insn (), REG_EQUAL, equiv);
14511     }
14512
14513   return 1; /* DONE */
14514 }
14515
14516 /* Expand comparison setting or clearing carry flag.  Return true when
14517    successful and set pop for the operation.  */
14518 static bool
14519 ix86_expand_carry_flag_compare (enum rtx_code code, rtx op0, rtx op1, rtx *pop)
14520 {
14521   enum machine_mode mode =
14522     GET_MODE (op0) != VOIDmode ? GET_MODE (op0) : GET_MODE (op1);
14523
14524   /* Do not handle DImode compares that go through special path.  */
14525   if (mode == (TARGET_64BIT ? TImode : DImode))
14526     return false;
14527
14528   if (SCALAR_FLOAT_MODE_P (mode))
14529     {
14530       rtx second_test = NULL, bypass_test = NULL;
14531       rtx compare_op, compare_seq;
14532
14533       gcc_assert (!DECIMAL_FLOAT_MODE_P (mode));
14534
14535       /* Shortcut:  following common codes never translate
14536          into carry flag compares.  */
14537       if (code == EQ || code == NE || code == UNEQ || code == LTGT
14538           || code == ORDERED || code == UNORDERED)
14539         return false;
14540
14541       /* These comparisons require zero flag; swap operands so they won't.  */
14542       if ((code == GT || code == UNLE || code == LE || code == UNGT)
14543           && !TARGET_IEEE_FP)
14544         {
14545           rtx tmp = op0;
14546           op0 = op1;
14547           op1 = tmp;
14548           code = swap_condition (code);
14549         }
14550
14551       /* Try to expand the comparison and verify that we end up with
14552          carry flag based comparison.  This fails to be true only when
14553          we decide to expand comparison using arithmetic that is not
14554          too common scenario.  */
14555       start_sequence ();
14556       compare_op = ix86_expand_fp_compare (code, op0, op1, NULL_RTX,
14557                                            &second_test, &bypass_test);
14558       compare_seq = get_insns ();
14559       end_sequence ();
14560
14561       if (second_test || bypass_test)
14562         return false;
14563
14564       if (GET_MODE (XEXP (compare_op, 0)) == CCFPmode
14565           || GET_MODE (XEXP (compare_op, 0)) == CCFPUmode)
14566         code = ix86_fp_compare_code_to_integer (GET_CODE (compare_op));
14567       else
14568         code = GET_CODE (compare_op);
14569
14570       if (code != LTU && code != GEU)
14571         return false;
14572
14573       emit_insn (compare_seq);
14574       *pop = compare_op;
14575       return true;
14576     }
14577
14578   if (!INTEGRAL_MODE_P (mode))
14579     return false;
14580
14581   switch (code)
14582     {
14583     case LTU:
14584     case GEU:
14585       break;
14586
14587     /* Convert a==0 into (unsigned)a<1.  */
14588     case EQ:
14589     case NE:
14590       if (op1 != const0_rtx)
14591         return false;
14592       op1 = const1_rtx;
14593       code = (code == EQ ? LTU : GEU);
14594       break;
14595
14596     /* Convert a>b into b<a or a>=b-1.  */
14597     case GTU:
14598     case LEU:
14599       if (CONST_INT_P (op1))
14600         {
14601           op1 = gen_int_mode (INTVAL (op1) + 1, GET_MODE (op0));
14602           /* Bail out on overflow.  We still can swap operands but that
14603              would force loading of the constant into register.  */
14604           if (op1 == const0_rtx
14605               || !x86_64_immediate_operand (op1, GET_MODE (op1)))
14606             return false;
14607           code = (code == GTU ? GEU : LTU);
14608         }
14609       else
14610         {
14611           rtx tmp = op1;
14612           op1 = op0;
14613           op0 = tmp;
14614           code = (code == GTU ? LTU : GEU);
14615         }
14616       break;
14617
14618     /* Convert a>=0 into (unsigned)a<0x80000000.  */
14619     case LT:
14620     case GE:
14621       if (mode == DImode || op1 != const0_rtx)
14622         return false;
14623       op1 = gen_int_mode (1 << (GET_MODE_BITSIZE (mode) - 1), mode);
14624       code = (code == LT ? GEU : LTU);
14625       break;
14626     case LE:
14627     case GT:
14628       if (mode == DImode || op1 != constm1_rtx)
14629         return false;
14630       op1 = gen_int_mode (1 << (GET_MODE_BITSIZE (mode) - 1), mode);
14631       code = (code == LE ? GEU : LTU);
14632       break;
14633
14634     default:
14635       return false;
14636     }
14637   /* Swapping operands may cause constant to appear as first operand.  */
14638   if (!nonimmediate_operand (op0, VOIDmode))
14639     {
14640       if (!can_create_pseudo_p ())
14641         return false;
14642       op0 = force_reg (mode, op0);
14643     }
14644   ix86_compare_op0 = op0;
14645   ix86_compare_op1 = op1;
14646   *pop = ix86_expand_compare (code, NULL, NULL);
14647   gcc_assert (GET_CODE (*pop) == LTU || GET_CODE (*pop) == GEU);
14648   return true;
14649 }
14650
14651 int
14652 ix86_expand_int_movcc (rtx operands[])
14653 {
14654   enum rtx_code code = GET_CODE (operands[1]), compare_code;
14655   rtx compare_seq, compare_op;
14656   rtx second_test, bypass_test;
14657   enum machine_mode mode = GET_MODE (operands[0]);
14658   bool sign_bit_compare_p = false;;
14659
14660   start_sequence ();
14661   compare_op = ix86_expand_compare (code, &second_test, &bypass_test);
14662   compare_seq = get_insns ();
14663   end_sequence ();
14664
14665   compare_code = GET_CODE (compare_op);
14666
14667   if ((ix86_compare_op1 == const0_rtx && (code == GE || code == LT))
14668       || (ix86_compare_op1 == constm1_rtx && (code == GT || code == LE)))
14669     sign_bit_compare_p = true;
14670
14671   /* Don't attempt mode expansion here -- if we had to expand 5 or 6
14672      HImode insns, we'd be swallowed in word prefix ops.  */
14673
14674   if ((mode != HImode || TARGET_FAST_PREFIX)
14675       && (mode != (TARGET_64BIT ? TImode : DImode))
14676       && CONST_INT_P (operands[2])
14677       && CONST_INT_P (operands[3]))
14678     {
14679       rtx out = operands[0];
14680       HOST_WIDE_INT ct = INTVAL (operands[2]);
14681       HOST_WIDE_INT cf = INTVAL (operands[3]);
14682       HOST_WIDE_INT diff;
14683
14684       diff = ct - cf;
14685       /*  Sign bit compares are better done using shifts than we do by using
14686           sbb.  */
14687       if (sign_bit_compare_p
14688           || ix86_expand_carry_flag_compare (code, ix86_compare_op0,
14689                                              ix86_compare_op1, &compare_op))
14690         {
14691           /* Detect overlap between destination and compare sources.  */
14692           rtx tmp = out;
14693
14694           if (!sign_bit_compare_p)
14695             {
14696               bool fpcmp = false;
14697
14698               compare_code = GET_CODE (compare_op);
14699
14700               if (GET_MODE (XEXP (compare_op, 0)) == CCFPmode
14701                   || GET_MODE (XEXP (compare_op, 0)) == CCFPUmode)
14702                 {
14703                   fpcmp = true;
14704                   compare_code = ix86_fp_compare_code_to_integer (compare_code);
14705                 }
14706
14707               /* To simplify rest of code, restrict to the GEU case.  */
14708               if (compare_code == LTU)
14709                 {
14710                   HOST_WIDE_INT tmp = ct;
14711                   ct = cf;
14712                   cf = tmp;
14713                   compare_code = reverse_condition (compare_code);
14714                   code = reverse_condition (code);
14715                 }
14716               else
14717                 {
14718                   if (fpcmp)
14719                     PUT_CODE (compare_op,
14720                               reverse_condition_maybe_unordered
14721                                 (GET_CODE (compare_op)));
14722                   else
14723                     PUT_CODE (compare_op, reverse_condition (GET_CODE (compare_op)));
14724                 }
14725               diff = ct - cf;
14726
14727               if (reg_overlap_mentioned_p (out, ix86_compare_op0)
14728                   || reg_overlap_mentioned_p (out, ix86_compare_op1))
14729                 tmp = gen_reg_rtx (mode);
14730
14731               if (mode == DImode)
14732                 emit_insn (gen_x86_movdicc_0_m1_rex64 (tmp, compare_op));
14733               else
14734                 emit_insn (gen_x86_movsicc_0_m1 (gen_lowpart (SImode, tmp), compare_op));
14735             }
14736           else
14737             {
14738               if (code == GT || code == GE)
14739                 code = reverse_condition (code);
14740               else
14741                 {
14742                   HOST_WIDE_INT tmp = ct;
14743                   ct = cf;
14744                   cf = tmp;
14745                   diff = ct - cf;
14746                 }
14747               tmp = emit_store_flag (tmp, code, ix86_compare_op0,
14748                                      ix86_compare_op1, VOIDmode, 0, -1);
14749             }
14750
14751           if (diff == 1)
14752             {
14753               /*
14754                * cmpl op0,op1
14755                * sbbl dest,dest
14756                * [addl dest, ct]
14757                *
14758                * Size 5 - 8.
14759                */
14760               if (ct)
14761                 tmp = expand_simple_binop (mode, PLUS,
14762                                            tmp, GEN_INT (ct),
14763                                            copy_rtx (tmp), 1, OPTAB_DIRECT);
14764             }
14765           else if (cf == -1)
14766             {
14767               /*
14768                * cmpl op0,op1
14769                * sbbl dest,dest
14770                * orl $ct, dest
14771                *
14772                * Size 8.
14773                */
14774               tmp = expand_simple_binop (mode, IOR,
14775                                          tmp, GEN_INT (ct),
14776                                          copy_rtx (tmp), 1, OPTAB_DIRECT);
14777             }
14778           else if (diff == -1 && ct)
14779             {
14780               /*
14781                * cmpl op0,op1
14782                * sbbl dest,dest
14783                * notl dest
14784                * [addl dest, cf]
14785                *
14786                * Size 8 - 11.
14787                */
14788               tmp = expand_simple_unop (mode, NOT, tmp, copy_rtx (tmp), 1);
14789               if (cf)
14790                 tmp = expand_simple_binop (mode, PLUS,
14791                                            copy_rtx (tmp), GEN_INT (cf),
14792                                            copy_rtx (tmp), 1, OPTAB_DIRECT);
14793             }
14794           else
14795             {
14796               /*
14797                * cmpl op0,op1
14798                * sbbl dest,dest
14799                * [notl dest]
14800                * andl cf - ct, dest
14801                * [addl dest, ct]
14802                *
14803                * Size 8 - 11.
14804                */
14805
14806               if (cf == 0)
14807                 {
14808                   cf = ct;
14809                   ct = 0;
14810                   tmp = expand_simple_unop (mode, NOT, tmp, copy_rtx (tmp), 1);
14811                 }
14812
14813               tmp = expand_simple_binop (mode, AND,
14814                                          copy_rtx (tmp),
14815                                          gen_int_mode (cf - ct, mode),
14816                                          copy_rtx (tmp), 1, OPTAB_DIRECT);
14817               if (ct)
14818                 tmp = expand_simple_binop (mode, PLUS,
14819                                            copy_rtx (tmp), GEN_INT (ct),
14820                                            copy_rtx (tmp), 1, OPTAB_DIRECT);
14821             }
14822
14823           if (!rtx_equal_p (tmp, out))
14824             emit_move_insn (copy_rtx (out), copy_rtx (tmp));
14825
14826           return 1; /* DONE */
14827         }
14828
14829       if (diff < 0)
14830         {
14831           enum machine_mode cmp_mode = GET_MODE (ix86_compare_op0);
14832
14833           HOST_WIDE_INT tmp;
14834           tmp = ct, ct = cf, cf = tmp;
14835           diff = -diff;
14836
14837           if (SCALAR_FLOAT_MODE_P (cmp_mode))
14838             {
14839               gcc_assert (!DECIMAL_FLOAT_MODE_P (cmp_mode));
14840
14841               /* We may be reversing unordered compare to normal compare, that
14842                  is not valid in general (we may convert non-trapping condition
14843                  to trapping one), however on i386 we currently emit all
14844                  comparisons unordered.  */
14845               compare_code = reverse_condition_maybe_unordered (compare_code);
14846               code = reverse_condition_maybe_unordered (code);
14847             }
14848           else
14849             {
14850               compare_code = reverse_condition (compare_code);
14851               code = reverse_condition (code);
14852             }
14853         }
14854
14855       compare_code = UNKNOWN;
14856       if (GET_MODE_CLASS (GET_MODE (ix86_compare_op0)) == MODE_INT
14857           && CONST_INT_P (ix86_compare_op1))
14858         {
14859           if (ix86_compare_op1 == const0_rtx
14860               && (code == LT || code == GE))
14861             compare_code = code;
14862           else if (ix86_compare_op1 == constm1_rtx)
14863             {
14864               if (code == LE)
14865                 compare_code = LT;
14866               else if (code == GT)
14867                 compare_code = GE;
14868             }
14869         }
14870
14871       /* Optimize dest = (op0 < 0) ? -1 : cf.  */
14872       if (compare_code != UNKNOWN
14873           && GET_MODE (ix86_compare_op0) == GET_MODE (out)
14874           && (cf == -1 || ct == -1))
14875         {
14876           /* If lea code below could be used, only optimize
14877              if it results in a 2 insn sequence.  */
14878
14879           if (! (diff == 1 || diff == 2 || diff == 4 || diff == 8
14880                  || diff == 3 || diff == 5 || diff == 9)
14881               || (compare_code == LT && ct == -1)
14882               || (compare_code == GE && cf == -1))
14883             {
14884               /*
14885                * notl op1       (if necessary)
14886                * sarl $31, op1
14887                * orl cf, op1
14888                */
14889               if (ct != -1)
14890                 {
14891                   cf = ct;
14892                   ct = -1;
14893                   code = reverse_condition (code);
14894                 }
14895
14896               out = emit_store_flag (out, code, ix86_compare_op0,
14897                                      ix86_compare_op1, VOIDmode, 0, -1);
14898
14899               out = expand_simple_binop (mode, IOR,
14900                                          out, GEN_INT (cf),
14901                                          out, 1, OPTAB_DIRECT);
14902               if (out != operands[0])
14903                 emit_move_insn (operands[0], out);
14904
14905               return 1; /* DONE */
14906             }
14907         }
14908
14909
14910       if ((diff == 1 || diff == 2 || diff == 4 || diff == 8
14911            || diff == 3 || diff == 5 || diff == 9)
14912           && ((mode != QImode && mode != HImode) || !TARGET_PARTIAL_REG_STALL)
14913           && (mode != DImode
14914               || x86_64_immediate_operand (GEN_INT (cf), VOIDmode)))
14915         {
14916           /*
14917            * xorl dest,dest
14918            * cmpl op1,op2
14919            * setcc dest
14920            * lea cf(dest*(ct-cf)),dest
14921            *
14922            * Size 14.
14923            *
14924            * This also catches the degenerate setcc-only case.
14925            */
14926
14927           rtx tmp;
14928           int nops;
14929
14930           out = emit_store_flag (out, code, ix86_compare_op0,
14931                                  ix86_compare_op1, VOIDmode, 0, 1);
14932
14933           nops = 0;
14934           /* On x86_64 the lea instruction operates on Pmode, so we need
14935              to get arithmetics done in proper mode to match.  */
14936           if (diff == 1)
14937             tmp = copy_rtx (out);
14938           else
14939             {
14940               rtx out1;
14941               out1 = copy_rtx (out);
14942               tmp = gen_rtx_MULT (mode, out1, GEN_INT (diff & ~1));
14943               nops++;
14944               if (diff & 1)
14945                 {
14946                   tmp = gen_rtx_PLUS (mode, tmp, out1);
14947                   nops++;
14948                 }
14949             }
14950           if (cf != 0)
14951             {
14952               tmp = gen_rtx_PLUS (mode, tmp, GEN_INT (cf));
14953               nops++;
14954             }
14955           if (!rtx_equal_p (tmp, out))
14956             {
14957               if (nops == 1)
14958                 out = force_operand (tmp, copy_rtx (out));
14959               else
14960                 emit_insn (gen_rtx_SET (VOIDmode, copy_rtx (out), copy_rtx (tmp)));
14961             }
14962           if (!rtx_equal_p (out, operands[0]))
14963             emit_move_insn (operands[0], copy_rtx (out));
14964
14965           return 1; /* DONE */
14966         }
14967
14968       /*
14969        * General case:                  Jumpful:
14970        *   xorl dest,dest               cmpl op1, op2
14971        *   cmpl op1, op2                movl ct, dest
14972        *   setcc dest                   jcc 1f
14973        *   decl dest                    movl cf, dest
14974        *   andl (cf-ct),dest            1:
14975        *   addl ct,dest
14976        *
14977        * Size 20.                       Size 14.
14978        *
14979        * This is reasonably steep, but branch mispredict costs are
14980        * high on modern cpus, so consider failing only if optimizing
14981        * for space.
14982        */
14983
14984       if ((!TARGET_CMOVE || (mode == QImode && TARGET_PARTIAL_REG_STALL))
14985           && BRANCH_COST (optimize_insn_for_speed_p (),
14986                           false) >= 2)
14987         {
14988           if (cf == 0)
14989             {
14990               enum machine_mode cmp_mode = GET_MODE (ix86_compare_op0);
14991
14992               cf = ct;
14993               ct = 0;
14994
14995               if (SCALAR_FLOAT_MODE_P (cmp_mode))
14996                 {
14997                   gcc_assert (!DECIMAL_FLOAT_MODE_P (cmp_mode));
14998
14999                   /* We may be reversing unordered compare to normal compare,
15000                      that is not valid in general (we may convert non-trapping
15001                      condition to trapping one), however on i386 we currently
15002                      emit all comparisons unordered.  */
15003                   code = reverse_condition_maybe_unordered (code);
15004                 }
15005               else
15006                 {
15007                   code = reverse_condition (code);
15008                   if (compare_code != UNKNOWN)
15009                     compare_code = reverse_condition (compare_code);
15010                 }
15011             }
15012
15013           if (compare_code != UNKNOWN)
15014             {
15015               /* notl op1       (if needed)
15016                  sarl $31, op1
15017                  andl (cf-ct), op1
15018                  addl ct, op1
15019
15020                  For x < 0 (resp. x <= -1) there will be no notl,
15021                  so if possible swap the constants to get rid of the
15022                  complement.
15023                  True/false will be -1/0 while code below (store flag
15024                  followed by decrement) is 0/-1, so the constants need
15025                  to be exchanged once more.  */
15026
15027               if (compare_code == GE || !cf)
15028                 {
15029                   code = reverse_condition (code);
15030                   compare_code = LT;
15031                 }
15032               else
15033                 {
15034                   HOST_WIDE_INT tmp = cf;
15035                   cf = ct;
15036                   ct = tmp;
15037                 }
15038
15039               out = emit_store_flag (out, code, ix86_compare_op0,
15040                                      ix86_compare_op1, VOIDmode, 0, -1);
15041             }
15042           else
15043             {
15044               out = emit_store_flag (out, code, ix86_compare_op0,
15045                                      ix86_compare_op1, VOIDmode, 0, 1);
15046
15047               out = expand_simple_binop (mode, PLUS, copy_rtx (out), constm1_rtx,
15048                                          copy_rtx (out), 1, OPTAB_DIRECT);
15049             }
15050
15051           out = expand_simple_binop (mode, AND, copy_rtx (out),
15052                                      gen_int_mode (cf - ct, mode),
15053                                      copy_rtx (out), 1, OPTAB_DIRECT);
15054           if (ct)
15055             out = expand_simple_binop (mode, PLUS, copy_rtx (out), GEN_INT (ct),
15056                                        copy_rtx (out), 1, OPTAB_DIRECT);
15057           if (!rtx_equal_p (out, operands[0]))
15058             emit_move_insn (operands[0], copy_rtx (out));
15059
15060           return 1; /* DONE */
15061         }
15062     }
15063
15064   if (!TARGET_CMOVE || (mode == QImode && TARGET_PARTIAL_REG_STALL))
15065     {
15066       /* Try a few things more with specific constants and a variable.  */
15067
15068       optab op;
15069       rtx var, orig_out, out, tmp;
15070
15071       if (BRANCH_COST (optimize_insn_for_speed_p (), false) <= 2)
15072         return 0; /* FAIL */
15073
15074       /* If one of the two operands is an interesting constant, load a
15075          constant with the above and mask it in with a logical operation.  */
15076
15077       if (CONST_INT_P (operands[2]))
15078         {
15079           var = operands[3];
15080           if (INTVAL (operands[2]) == 0 && operands[3] != constm1_rtx)
15081             operands[3] = constm1_rtx, op = and_optab;
15082           else if (INTVAL (operands[2]) == -1 && operands[3] != const0_rtx)
15083             operands[3] = const0_rtx, op = ior_optab;
15084           else
15085             return 0; /* FAIL */
15086         }
15087       else if (CONST_INT_P (operands[3]))
15088         {
15089           var = operands[2];
15090           if (INTVAL (operands[3]) == 0 && operands[2] != constm1_rtx)
15091             operands[2] = constm1_rtx, op = and_optab;
15092           else if (INTVAL (operands[3]) == -1 && operands[3] != const0_rtx)
15093             operands[2] = const0_rtx, op = ior_optab;
15094           else
15095             return 0; /* FAIL */
15096         }
15097       else
15098         return 0; /* FAIL */
15099
15100       orig_out = operands[0];
15101       tmp = gen_reg_rtx (mode);
15102       operands[0] = tmp;
15103
15104       /* Recurse to get the constant loaded.  */
15105       if (ix86_expand_int_movcc (operands) == 0)
15106         return 0; /* FAIL */
15107
15108       /* Mask in the interesting variable.  */
15109       out = expand_binop (mode, op, var, tmp, orig_out, 0,
15110                           OPTAB_WIDEN);
15111       if (!rtx_equal_p (out, orig_out))
15112         emit_move_insn (copy_rtx (orig_out), copy_rtx (out));
15113
15114       return 1; /* DONE */
15115     }
15116
15117   /*
15118    * For comparison with above,
15119    *
15120    * movl cf,dest
15121    * movl ct,tmp
15122    * cmpl op1,op2
15123    * cmovcc tmp,dest
15124    *
15125    * Size 15.
15126    */
15127
15128   if (! nonimmediate_operand (operands[2], mode))
15129     operands[2] = force_reg (mode, operands[2]);
15130   if (! nonimmediate_operand (operands[3], mode))
15131     operands[3] = force_reg (mode, operands[3]);
15132
15133   if (bypass_test && reg_overlap_mentioned_p (operands[0], operands[3]))
15134     {
15135       rtx tmp = gen_reg_rtx (mode);
15136       emit_move_insn (tmp, operands[3]);
15137       operands[3] = tmp;
15138     }
15139   if (second_test && reg_overlap_mentioned_p (operands[0], operands[2]))
15140     {
15141       rtx tmp = gen_reg_rtx (mode);
15142       emit_move_insn (tmp, operands[2]);
15143       operands[2] = tmp;
15144     }
15145
15146   if (! register_operand (operands[2], VOIDmode)
15147       && (mode == QImode
15148           || ! register_operand (operands[3], VOIDmode)))
15149     operands[2] = force_reg (mode, operands[2]);
15150
15151   if (mode == QImode
15152       && ! register_operand (operands[3], VOIDmode))
15153     operands[3] = force_reg (mode, operands[3]);
15154
15155   emit_insn (compare_seq);
15156   emit_insn (gen_rtx_SET (VOIDmode, operands[0],
15157                           gen_rtx_IF_THEN_ELSE (mode,
15158                                                 compare_op, operands[2],
15159                                                 operands[3])));
15160   if (bypass_test)
15161     emit_insn (gen_rtx_SET (VOIDmode, copy_rtx (operands[0]),
15162                             gen_rtx_IF_THEN_ELSE (mode,
15163                                   bypass_test,
15164                                   copy_rtx (operands[3]),
15165                                   copy_rtx (operands[0]))));
15166   if (second_test)
15167     emit_insn (gen_rtx_SET (VOIDmode, copy_rtx (operands[0]),
15168                             gen_rtx_IF_THEN_ELSE (mode,
15169                                   second_test,
15170                                   copy_rtx (operands[2]),
15171                                   copy_rtx (operands[0]))));
15172
15173   return 1; /* DONE */
15174 }
15175
15176 /* Swap, force into registers, or otherwise massage the two operands
15177    to an sse comparison with a mask result.  Thus we differ a bit from
15178    ix86_prepare_fp_compare_args which expects to produce a flags result.
15179
15180    The DEST operand exists to help determine whether to commute commutative
15181    operators.  The POP0/POP1 operands are updated in place.  The new
15182    comparison code is returned, or UNKNOWN if not implementable.  */
15183
15184 static enum rtx_code
15185 ix86_prepare_sse_fp_compare_args (rtx dest, enum rtx_code code,
15186                                   rtx *pop0, rtx *pop1)
15187 {
15188   rtx tmp;
15189
15190   switch (code)
15191     {
15192     case LTGT:
15193     case UNEQ:
15194       /* We have no LTGT as an operator.  We could implement it with
15195          NE & ORDERED, but this requires an extra temporary.  It's
15196          not clear that it's worth it.  */
15197       return UNKNOWN;
15198
15199     case LT:
15200     case LE:
15201     case UNGT:
15202     case UNGE:
15203       /* These are supported directly.  */
15204       break;
15205
15206     case EQ:
15207     case NE:
15208     case UNORDERED:
15209     case ORDERED:
15210       /* For commutative operators, try to canonicalize the destination
15211          operand to be first in the comparison - this helps reload to
15212          avoid extra moves.  */
15213       if (!dest || !rtx_equal_p (dest, *pop1))
15214         break;
15215       /* FALLTHRU */
15216
15217     case GE:
15218     case GT:
15219     case UNLE:
15220     case UNLT:
15221       /* These are not supported directly.  Swap the comparison operands
15222          to transform into something that is supported.  */
15223       tmp = *pop0;
15224       *pop0 = *pop1;
15225       *pop1 = tmp;
15226       code = swap_condition (code);
15227       break;
15228
15229     default:
15230       gcc_unreachable ();
15231     }
15232
15233   return code;
15234 }
15235
15236 /* Detect conditional moves that exactly match min/max operational
15237    semantics.  Note that this is IEEE safe, as long as we don't
15238    interchange the operands.
15239
15240    Returns FALSE if this conditional move doesn't match a MIN/MAX,
15241    and TRUE if the operation is successful and instructions are emitted.  */
15242
15243 static bool
15244 ix86_expand_sse_fp_minmax (rtx dest, enum rtx_code code, rtx cmp_op0,
15245                            rtx cmp_op1, rtx if_true, rtx if_false)
15246 {
15247   enum machine_mode mode;
15248   bool is_min;
15249   rtx tmp;
15250
15251   if (code == LT)
15252     ;
15253   else if (code == UNGE)
15254     {
15255       tmp = if_true;
15256       if_true = if_false;
15257       if_false = tmp;
15258     }
15259   else
15260     return false;
15261
15262   if (rtx_equal_p (cmp_op0, if_true) && rtx_equal_p (cmp_op1, if_false))
15263     is_min = true;
15264   else if (rtx_equal_p (cmp_op1, if_true) && rtx_equal_p (cmp_op0, if_false))
15265     is_min = false;
15266   else
15267     return false;
15268
15269   mode = GET_MODE (dest);
15270
15271   /* We want to check HONOR_NANS and HONOR_SIGNED_ZEROS here,
15272      but MODE may be a vector mode and thus not appropriate.  */
15273   if (!flag_finite_math_only || !flag_unsafe_math_optimizations)
15274     {
15275       int u = is_min ? UNSPEC_IEEE_MIN : UNSPEC_IEEE_MAX;
15276       rtvec v;
15277
15278       if_true = force_reg (mode, if_true);
15279       v = gen_rtvec (2, if_true, if_false);
15280       tmp = gen_rtx_UNSPEC (mode, v, u);
15281     }
15282   else
15283     {
15284       code = is_min ? SMIN : SMAX;
15285       tmp = gen_rtx_fmt_ee (code, mode, if_true, if_false);
15286     }
15287
15288   emit_insn (gen_rtx_SET (VOIDmode, dest, tmp));
15289   return true;
15290 }
15291
15292 /* Expand an sse vector comparison.  Return the register with the result.  */
15293
15294 static rtx
15295 ix86_expand_sse_cmp (rtx dest, enum rtx_code code, rtx cmp_op0, rtx cmp_op1,
15296                      rtx op_true, rtx op_false)
15297 {
15298   enum machine_mode mode = GET_MODE (dest);
15299   rtx x;
15300
15301   cmp_op0 = force_reg (mode, cmp_op0);
15302   if (!nonimmediate_operand (cmp_op1, mode))
15303     cmp_op1 = force_reg (mode, cmp_op1);
15304
15305   if (optimize
15306       || reg_overlap_mentioned_p (dest, op_true)
15307       || reg_overlap_mentioned_p (dest, op_false))
15308     dest = gen_reg_rtx (mode);
15309
15310   x = gen_rtx_fmt_ee (code, mode, cmp_op0, cmp_op1);
15311   emit_insn (gen_rtx_SET (VOIDmode, dest, x));
15312
15313   return dest;
15314 }
15315
15316 /* Expand DEST = CMP ? OP_TRUE : OP_FALSE into a sequence of logical
15317    operations.  This is used for both scalar and vector conditional moves.  */
15318
15319 static void
15320 ix86_expand_sse_movcc (rtx dest, rtx cmp, rtx op_true, rtx op_false)
15321 {
15322   enum machine_mode mode = GET_MODE (dest);
15323   rtx t2, t3, x;
15324
15325   if (op_false == CONST0_RTX (mode))
15326     {
15327       op_true = force_reg (mode, op_true);
15328       x = gen_rtx_AND (mode, cmp, op_true);
15329       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
15330     }
15331   else if (op_true == CONST0_RTX (mode))
15332     {
15333       op_false = force_reg (mode, op_false);
15334       x = gen_rtx_NOT (mode, cmp);
15335       x = gen_rtx_AND (mode, x, op_false);
15336       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
15337     }
15338   else if (TARGET_SSE5)
15339     {
15340       rtx pcmov = gen_rtx_SET (mode, dest,
15341                                gen_rtx_IF_THEN_ELSE (mode, cmp,
15342                                                      op_true,
15343                                                      op_false));
15344       emit_insn (pcmov);
15345     }
15346   else
15347     {
15348       op_true = force_reg (mode, op_true);
15349       op_false = force_reg (mode, op_false);
15350
15351       t2 = gen_reg_rtx (mode);
15352       if (optimize)
15353         t3 = gen_reg_rtx (mode);
15354       else
15355         t3 = dest;
15356
15357       x = gen_rtx_AND (mode, op_true, cmp);
15358       emit_insn (gen_rtx_SET (VOIDmode, t2, x));
15359
15360       x = gen_rtx_NOT (mode, cmp);
15361       x = gen_rtx_AND (mode, x, op_false);
15362       emit_insn (gen_rtx_SET (VOIDmode, t3, x));
15363
15364       x = gen_rtx_IOR (mode, t3, t2);
15365       emit_insn (gen_rtx_SET (VOIDmode, dest, x));
15366     }
15367 }
15368
15369 /* Expand a floating-point conditional move.  Return true if successful.  */
15370
15371 int
15372 ix86_expand_fp_movcc (rtx operands[])
15373 {
15374   enum machine_mode mode = GET_MODE (operands[0]);
15375   enum rtx_code code = GET_CODE (operands[1]);
15376   rtx tmp, compare_op, second_test, bypass_test;
15377
15378   if (TARGET_SSE_MATH && SSE_FLOAT_MODE_P (mode))
15379     {
15380       enum machine_mode cmode;
15381
15382       /* Since we've no cmove for sse registers, don't force bad register
15383          allocation just to gain access to it.  Deny movcc when the
15384          comparison mode doesn't match the move mode.  */
15385       cmode = GET_MODE (ix86_compare_op0);
15386       if (cmode == VOIDmode)
15387         cmode = GET_MODE (ix86_compare_op1);
15388       if (cmode != mode)
15389         return 0;
15390
15391       code = ix86_prepare_sse_fp_compare_args (operands[0], code,
15392                                                &ix86_compare_op0,
15393                                                &ix86_compare_op1);
15394       if (code == UNKNOWN)
15395         return 0;
15396
15397       if (ix86_expand_sse_fp_minmax (operands[0], code, ix86_compare_op0,
15398                                      ix86_compare_op1, operands[2],
15399                                      operands[3]))
15400         return 1;
15401
15402       tmp = ix86_expand_sse_cmp (operands[0], code, ix86_compare_op0,
15403                                  ix86_compare_op1, operands[2], operands[3]);
15404       ix86_expand_sse_movcc (operands[0], tmp, operands[2], operands[3]);
15405       return 1;
15406     }
15407
15408   /* The floating point conditional move instructions don't directly
15409      support conditions resulting from a signed integer comparison.  */
15410
15411   compare_op = ix86_expand_compare (code, &second_test, &bypass_test);
15412
15413   /* The floating point conditional move instructions don't directly
15414      support signed integer comparisons.  */
15415
15416   if (!fcmov_comparison_operator (compare_op, VOIDmode))
15417     {
15418       gcc_assert (!second_test && !bypass_test);
15419       tmp = gen_reg_rtx (QImode);
15420       ix86_expand_setcc (code, tmp);
15421       code = NE;
15422       ix86_compare_op0 = tmp;
15423       ix86_compare_op1 = const0_rtx;
15424       compare_op = ix86_expand_compare (code,  &second_test, &bypass_test);
15425     }
15426   if (bypass_test && reg_overlap_mentioned_p (operands[0], operands[3]))
15427     {
15428       tmp = gen_reg_rtx (mode);
15429       emit_move_insn (tmp, operands[3]);
15430       operands[3] = tmp;
15431     }
15432   if (second_test && reg_overlap_mentioned_p (operands[0], operands[2]))
15433     {
15434       tmp = gen_reg_rtx (mode);
15435       emit_move_insn (tmp, operands[2]);
15436       operands[2] = tmp;
15437     }
15438
15439   emit_insn (gen_rtx_SET (VOIDmode, operands[0],
15440                           gen_rtx_IF_THEN_ELSE (mode, compare_op,
15441                                                 operands[2], operands[3])));
15442   if (bypass_test)
15443     emit_insn (gen_rtx_SET (VOIDmode, operands[0],
15444                             gen_rtx_IF_THEN_ELSE (mode, bypass_test,
15445                                                   operands[3], operands[0])));
15446   if (second_test)
15447     emit_insn (gen_rtx_SET (VOIDmode, operands[0],
15448                             gen_rtx_IF_THEN_ELSE (mode, second_test,
15449                                                   operands[2], operands[0])));
15450
15451   return 1;
15452 }
15453
15454 /* Expand a floating-point vector conditional move; a vcond operation
15455    rather than a movcc operation.  */
15456
15457 bool
15458 ix86_expand_fp_vcond (rtx operands[])
15459 {
15460   enum rtx_code code = GET_CODE (operands[3]);
15461   rtx cmp;
15462
15463   code = ix86_prepare_sse_fp_compare_args (operands[0], code,
15464                                            &operands[4], &operands[5]);
15465   if (code == UNKNOWN)
15466     return false;
15467
15468   if (ix86_expand_sse_fp_minmax (operands[0], code, operands[4],
15469                                  operands[5], operands[1], operands[2]))
15470     return true;
15471
15472   cmp = ix86_expand_sse_cmp (operands[0], code, operands[4], operands[5],
15473                              operands[1], operands[2]);
15474   ix86_expand_sse_movcc (operands[0], cmp, operands[1], operands[2]);
15475   return true;
15476 }
15477
15478 /* Expand a signed/unsigned integral vector conditional move.  */
15479
15480 bool
15481 ix86_expand_int_vcond (rtx operands[])
15482 {
15483   enum machine_mode mode = GET_MODE (operands[0]);
15484   enum rtx_code code = GET_CODE (operands[3]);
15485   bool negate = false;
15486   rtx x, cop0, cop1;
15487
15488   cop0 = operands[4];
15489   cop1 = operands[5];
15490
15491   /* SSE5 supports all of the comparisons on all vector int types.  */
15492   if (!TARGET_SSE5)
15493     {
15494       /* Canonicalize the comparison to EQ, GT, GTU.  */
15495       switch (code)
15496         {
15497         case EQ:
15498         case GT:
15499         case GTU:
15500           break;
15501
15502         case NE:
15503         case LE:
15504         case LEU:
15505           code = reverse_condition (code);
15506           negate = true;
15507           break;
15508
15509         case GE:
15510         case GEU:
15511           code = reverse_condition (code);
15512           negate = true;
15513           /* FALLTHRU */
15514
15515         case LT:
15516         case LTU:
15517           code = swap_condition (code);
15518           x = cop0, cop0 = cop1, cop1 = x;
15519           break;
15520
15521         default:
15522           gcc_unreachable ();
15523         }
15524
15525       /* Only SSE4.1/SSE4.2 supports V2DImode.  */
15526       if (mode == V2DImode)
15527         {
15528           switch (code)
15529             {
15530             case EQ:
15531               /* SSE4.1 supports EQ.  */
15532               if (!TARGET_SSE4_1)
15533                 return false;
15534               break;
15535
15536             case GT:
15537             case GTU:
15538               /* SSE4.2 supports GT/GTU.  */
15539               if (!TARGET_SSE4_2)
15540                 return false;
15541               break;
15542
15543             default:
15544               gcc_unreachable ();
15545             }
15546         }
15547
15548       /* Unsigned parallel compare is not supported by the hardware.  Play some
15549          tricks to turn this into a signed comparison against 0.  */
15550       if (code == GTU)
15551         {
15552           cop0 = force_reg (mode, cop0);
15553
15554           switch (mode)
15555             {
15556             case V4SImode:
15557             case V2DImode:
15558               {
15559                 rtx t1, t2, mask;
15560
15561                 /* Perform a parallel modulo subtraction.  */
15562                 t1 = gen_reg_rtx (mode);
15563                 emit_insn ((mode == V4SImode
15564                             ? gen_subv4si3
15565                             : gen_subv2di3) (t1, cop0, cop1));
15566
15567                 /* Extract the original sign bit of op0.  */
15568                 mask = ix86_build_signbit_mask (GET_MODE_INNER (mode),
15569                                                 true, false);
15570                 t2 = gen_reg_rtx (mode);
15571                 emit_insn ((mode == V4SImode
15572                             ? gen_andv4si3
15573                             : gen_andv2di3) (t2, cop0, mask));
15574
15575                 /* XOR it back into the result of the subtraction.  This results
15576                    in the sign bit set iff we saw unsigned underflow.  */
15577                 x = gen_reg_rtx (mode);
15578                 emit_insn ((mode == V4SImode
15579                             ? gen_xorv4si3
15580                             : gen_xorv2di3) (x, t1, t2));
15581
15582                 code = GT;
15583               }
15584               break;
15585
15586             case V16QImode:
15587             case V8HImode:
15588               /* Perform a parallel unsigned saturating subtraction.  */
15589               x = gen_reg_rtx (mode);
15590               emit_insn (gen_rtx_SET (VOIDmode, x,
15591                                       gen_rtx_US_MINUS (mode, cop0, cop1)));
15592
15593               code = EQ;
15594               negate = !negate;
15595               break;
15596
15597             default:
15598               gcc_unreachable ();
15599             }
15600
15601           cop0 = x;
15602           cop1 = CONST0_RTX (mode);
15603         }
15604     }
15605
15606   x = ix86_expand_sse_cmp (operands[0], code, cop0, cop1,
15607                            operands[1+negate], operands[2-negate]);
15608
15609   ix86_expand_sse_movcc (operands[0], x, operands[1+negate],
15610                          operands[2-negate]);
15611   return true;
15612 }
15613
15614 /* Unpack OP[1] into the next wider integer vector type.  UNSIGNED_P is
15615    true if we should do zero extension, else sign extension.  HIGH_P is
15616    true if we want the N/2 high elements, else the low elements.  */
15617
15618 void
15619 ix86_expand_sse_unpack (rtx operands[2], bool unsigned_p, bool high_p)
15620 {
15621   enum machine_mode imode = GET_MODE (operands[1]);
15622   rtx (*unpack)(rtx, rtx, rtx);
15623   rtx se, dest;
15624
15625   switch (imode)
15626     {
15627     case V16QImode:
15628       if (high_p)
15629         unpack = gen_vec_interleave_highv16qi;
15630       else
15631         unpack = gen_vec_interleave_lowv16qi;
15632       break;
15633     case V8HImode:
15634       if (high_p)
15635         unpack = gen_vec_interleave_highv8hi;
15636       else
15637         unpack = gen_vec_interleave_lowv8hi;
15638       break;
15639     case V4SImode:
15640       if (high_p)
15641         unpack = gen_vec_interleave_highv4si;
15642       else
15643         unpack = gen_vec_interleave_lowv4si;
15644       break;
15645     default:
15646       gcc_unreachable ();
15647     }
15648
15649   dest = gen_lowpart (imode, operands[0]);
15650
15651   if (unsigned_p)
15652     se = force_reg (imode, CONST0_RTX (imode));
15653   else
15654     se = ix86_expand_sse_cmp (gen_reg_rtx (imode), GT, CONST0_RTX (imode),
15655                               operands[1], pc_rtx, pc_rtx);
15656
15657   emit_insn (unpack (dest, operands[1], se));
15658 }
15659
15660 /* This function performs the same task as ix86_expand_sse_unpack,
15661    but with SSE4.1 instructions.  */
15662
15663 void
15664 ix86_expand_sse4_unpack (rtx operands[2], bool unsigned_p, bool high_p)
15665 {
15666   enum machine_mode imode = GET_MODE (operands[1]);
15667   rtx (*unpack)(rtx, rtx);
15668   rtx src, dest;
15669
15670   switch (imode)
15671     {
15672     case V16QImode:
15673       if (unsigned_p)
15674         unpack = gen_sse4_1_zero_extendv8qiv8hi2;
15675       else
15676         unpack = gen_sse4_1_extendv8qiv8hi2;
15677       break;
15678     case V8HImode:
15679       if (unsigned_p)
15680         unpack = gen_sse4_1_zero_extendv4hiv4si2;
15681       else
15682         unpack = gen_sse4_1_extendv4hiv4si2;
15683       break;
15684     case V4SImode:
15685       if (unsigned_p)
15686         unpack = gen_sse4_1_zero_extendv2siv2di2;
15687       else
15688         unpack = gen_sse4_1_extendv2siv2di2;
15689       break;
15690     default:
15691       gcc_unreachable ();
15692     }
15693
15694   dest = operands[0];
15695   if (high_p)
15696     {
15697       /* Shift higher 8 bytes to lower 8 bytes.  */
15698       src = gen_reg_rtx (imode);
15699       emit_insn (gen_sse2_lshrti3 (gen_lowpart (TImode, src),
15700                                    gen_lowpart (TImode, operands[1]),
15701                                    GEN_INT (64)));
15702     }
15703   else
15704     src = operands[1];
15705
15706   emit_insn (unpack (dest, src));
15707 }
15708
15709 /* This function performs the same task as ix86_expand_sse_unpack,
15710    but with sse5 instructions.  */
15711
15712 void
15713 ix86_expand_sse5_unpack (rtx operands[2], bool unsigned_p, bool high_p)
15714 {
15715   enum machine_mode imode = GET_MODE (operands[1]);
15716   int pperm_bytes[16];
15717   int i;
15718   int h = (high_p) ? 8 : 0;
15719   int h2;
15720   int sign_extend;
15721   rtvec v = rtvec_alloc (16);
15722   rtvec vs;
15723   rtx x, p;
15724   rtx op0 = operands[0], op1 = operands[1];
15725
15726   switch (imode)
15727     {
15728     case V16QImode:
15729       vs = rtvec_alloc (8);
15730       h2 = (high_p) ? 8 : 0;
15731       for (i = 0; i < 8; i++)
15732         {
15733           pperm_bytes[2*i+0] = PPERM_SRC | PPERM_SRC2 | i | h;
15734           pperm_bytes[2*i+1] = ((unsigned_p)
15735                                 ? PPERM_ZERO
15736                                 : PPERM_SIGN | PPERM_SRC2 | i | h);
15737         }
15738
15739       for (i = 0; i < 16; i++)
15740         RTVEC_ELT (v, i) = GEN_INT (pperm_bytes[i]);
15741
15742       for (i = 0; i < 8; i++)
15743         RTVEC_ELT (vs, i) = GEN_INT (i + h2);
15744
15745       p = gen_rtx_PARALLEL (VOIDmode, vs);
15746       x = force_reg (V16QImode, gen_rtx_CONST_VECTOR (V16QImode, v));
15747       if (unsigned_p)
15748         emit_insn (gen_sse5_pperm_zero_v16qi_v8hi (op0, op1, p, x));
15749       else
15750         emit_insn (gen_sse5_pperm_sign_v16qi_v8hi (op0, op1, p, x));
15751       break;
15752
15753     case V8HImode:
15754       vs = rtvec_alloc (4);
15755       h2 = (high_p) ? 4 : 0;
15756       for (i = 0; i < 4; i++)
15757         {
15758           sign_extend = ((unsigned_p)
15759                          ? PPERM_ZERO
15760                          : PPERM_SIGN | PPERM_SRC2 | ((2*i) + 1 + h));
15761           pperm_bytes[4*i+0] = PPERM_SRC | PPERM_SRC2 | ((2*i) + 0 + h);
15762           pperm_bytes[4*i+1] = PPERM_SRC | PPERM_SRC2 | ((2*i) + 1 + h);
15763           pperm_bytes[4*i+2] = sign_extend;
15764           pperm_bytes[4*i+3] = sign_extend;
15765         }
15766
15767       for (i = 0; i < 16; i++)
15768         RTVEC_ELT (v, i) = GEN_INT (pperm_bytes[i]);
15769
15770       for (i = 0; i < 4; i++)
15771         RTVEC_ELT (vs, i) = GEN_INT (i + h2);
15772
15773       p = gen_rtx_PARALLEL (VOIDmode, vs);
15774       x = force_reg (V16QImode, gen_rtx_CONST_VECTOR (V16QImode, v));
15775       if (unsigned_p)
15776         emit_insn (gen_sse5_pperm_zero_v8hi_v4si (op0, op1, p, x));
15777       else
15778         emit_insn (gen_sse5_pperm_sign_v8hi_v4si (op0, op1, p, x));
15779       break;
15780
15781     case V4SImode:
15782       vs = rtvec_alloc (2);
15783       h2 = (high_p) ? 2 : 0;
15784       for (i = 0; i < 2; i++)
15785         {
15786           sign_extend = ((unsigned_p)
15787                          ? PPERM_ZERO
15788                          : PPERM_SIGN | PPERM_SRC2 | ((4*i) + 3 + h));
15789           pperm_bytes[8*i+0] = PPERM_SRC | PPERM_SRC2 | ((4*i) + 0 + h);
15790           pperm_bytes[8*i+1] = PPERM_SRC | PPERM_SRC2 | ((4*i) + 1 + h);
15791           pperm_bytes[8*i+2] = PPERM_SRC | PPERM_SRC2 | ((4*i) + 2 + h);
15792           pperm_bytes[8*i+3] = PPERM_SRC | PPERM_SRC2 | ((4*i) + 3 + h);
15793           pperm_bytes[8*i+4] = sign_extend;
15794           pperm_bytes[8*i+5] = sign_extend;
15795           pperm_bytes[8*i+6] = sign_extend;
15796           pperm_bytes[8*i+7] = sign_extend;
15797         }
15798
15799       for (i = 0; i < 16; i++)
15800         RTVEC_ELT (v, i) = GEN_INT (pperm_bytes[i]);
15801
15802       for (i = 0; i < 2; i++)
15803         RTVEC_ELT (vs, i) = GEN_INT (i + h2);
15804
15805       p = gen_rtx_PARALLEL (VOIDmode, vs);
15806       x = force_reg (V16QImode, gen_rtx_CONST_VECTOR (V16QImode, v));
15807       if (unsigned_p)
15808         emit_insn (gen_sse5_pperm_zero_v4si_v2di (op0, op1, p, x));
15809       else
15810         emit_insn (gen_sse5_pperm_sign_v4si_v2di (op0, op1, p, x));
15811       break;
15812
15813     default:
15814       gcc_unreachable ();
15815     }
15816
15817   return;
15818 }
15819
15820 /* Pack the high bits from OPERANDS[1] and low bits from OPERANDS[2] into the
15821    next narrower integer vector type */
15822 void
15823 ix86_expand_sse5_pack (rtx operands[3])
15824 {
15825   enum machine_mode imode = GET_MODE (operands[0]);
15826   int pperm_bytes[16];
15827   int i;
15828   rtvec v = rtvec_alloc (16);
15829   rtx x;
15830   rtx op0 = operands[0];
15831   rtx op1 = operands[1];
15832   rtx op2 = operands[2];
15833
15834   switch (imode)
15835     {
15836     case V16QImode:
15837       for (i = 0; i < 8; i++)
15838         {
15839           pperm_bytes[i+0] = PPERM_SRC | PPERM_SRC1 | (i*2);
15840           pperm_bytes[i+8] = PPERM_SRC | PPERM_SRC2 | (i*2);
15841         }
15842
15843       for (i = 0; i < 16; i++)
15844         RTVEC_ELT (v, i) = GEN_INT (pperm_bytes[i]);
15845
15846       x = force_reg (V16QImode, gen_rtx_CONST_VECTOR (V16QImode, v));
15847       emit_insn (gen_sse5_pperm_pack_v8hi_v16qi (op0, op1, op2, x));
15848       break;
15849
15850     case V8HImode:
15851       for (i = 0; i < 4; i++)
15852         {
15853           pperm_bytes[(2*i)+0] = PPERM_SRC | PPERM_SRC1 | ((i*4) + 0);
15854           pperm_bytes[(2*i)+1] = PPERM_SRC | PPERM_SRC1 | ((i*4) + 1);
15855           pperm_bytes[(2*i)+8] = PPERM_SRC | PPERM_SRC2 | ((i*4) + 0);
15856           pperm_bytes[(2*i)+9] = PPERM_SRC | PPERM_SRC2 | ((i*4) + 1);
15857         }
15858
15859       for (i = 0; i < 16; i++)
15860         RTVEC_ELT (v, i) = GEN_INT (pperm_bytes[i]);
15861
15862       x = force_reg (V16QImode, gen_rtx_CONST_VECTOR (V16QImode, v));
15863       emit_insn (gen_sse5_pperm_pack_v4si_v8hi (op0, op1, op2, x));
15864       break;
15865
15866     case V4SImode:
15867       for (i = 0; i < 2; i++)
15868         {
15869           pperm_bytes[(4*i)+0]  = PPERM_SRC | PPERM_SRC1 | ((i*8) + 0);
15870           pperm_bytes[(4*i)+1]  = PPERM_SRC | PPERM_SRC1 | ((i*8) + 1);
15871           pperm_bytes[(4*i)+2]  = PPERM_SRC | PPERM_SRC1 | ((i*8) + 2);
15872           pperm_bytes[(4*i)+3]  = PPERM_SRC | PPERM_SRC1 | ((i*8) + 3);
15873           pperm_bytes[(4*i)+8]  = PPERM_SRC | PPERM_SRC2 | ((i*8) + 0);
15874           pperm_bytes[(4*i)+9]  = PPERM_SRC | PPERM_SRC2 | ((i*8) + 1);
15875           pperm_bytes[(4*i)+10] = PPERM_SRC | PPERM_SRC2 | ((i*8) + 2);
15876           pperm_bytes[(4*i)+11] = PPERM_SRC | PPERM_SRC2 | ((i*8) + 3);
15877         }
15878
15879       for (i = 0; i < 16; i++)
15880         RTVEC_ELT (v, i) = GEN_INT (pperm_bytes[i]);
15881
15882       x = force_reg (V16QImode, gen_rtx_CONST_VECTOR (V16QImode, v));
15883       emit_insn (gen_sse5_pperm_pack_v2di_v4si (op0, op1, op2, x));
15884       break;
15885
15886     default:
15887       gcc_unreachable ();
15888     }
15889
15890   return;
15891 }
15892
15893 /* Expand conditional increment or decrement using adb/sbb instructions.
15894    The default case using setcc followed by the conditional move can be
15895    done by generic code.  */
15896 int
15897 ix86_expand_int_addcc (rtx operands[])
15898 {
15899   enum rtx_code code = GET_CODE (operands[1]);
15900   rtx compare_op;
15901   rtx val = const0_rtx;
15902   bool fpcmp = false;
15903   enum machine_mode mode = GET_MODE (operands[0]);
15904
15905   if (operands[3] != const1_rtx
15906       && operands[3] != constm1_rtx)
15907     return 0;
15908   if (!ix86_expand_carry_flag_compare (code, ix86_compare_op0,
15909                                        ix86_compare_op1, &compare_op))
15910      return 0;
15911   code = GET_CODE (compare_op);
15912
15913   if (GET_MODE (XEXP (compare_op, 0)) == CCFPmode
15914       || GET_MODE (XEXP (compare_op, 0)) == CCFPUmode)
15915     {
15916       fpcmp = true;
15917       code = ix86_fp_compare_code_to_integer (code);
15918     }
15919
15920   if (code != LTU)
15921     {
15922       val = constm1_rtx;
15923       if (fpcmp)
15924         PUT_CODE (compare_op,
15925                   reverse_condition_maybe_unordered
15926                     (GET_CODE (compare_op)));
15927       else
15928         PUT_CODE (compare_op, reverse_condition (GET_CODE (compare_op)));
15929     }
15930   PUT_MODE (compare_op, mode);
15931
15932   /* Construct either adc or sbb insn.  */
15933   if ((code == LTU) == (operands[3] == constm1_rtx))
15934     {
15935       switch (GET_MODE (operands[0]))
15936         {
15937           case QImode:
15938             emit_insn (gen_subqi3_carry (operands[0], operands[2], val, compare_op));
15939             break;
15940           case HImode:
15941             emit_insn (gen_subhi3_carry (operands[0], operands[2], val, compare_op));
15942             break;
15943           case SImode:
15944             emit_insn (gen_subsi3_carry (operands[0], operands[2], val, compare_op));
15945             break;
15946           case DImode:
15947             emit_insn (gen_subdi3_carry_rex64 (operands[0], operands[2], val, compare_op));
15948             break;
15949           default:
15950             gcc_unreachable ();
15951         }
15952     }
15953   else
15954     {
15955       switch (GET_MODE (operands[0]))
15956         {
15957           case QImode:
15958             emit_insn (gen_addqi3_carry (operands[0], operands[2], val, compare_op));
15959             break;
15960           case HImode:
15961             emit_insn (gen_addhi3_carry (operands[0], operands[2], val, compare_op));
15962             break;
15963           case SImode:
15964             emit_insn (gen_addsi3_carry (operands[0], operands[2], val, compare_op));
15965             break;
15966           case DImode:
15967             emit_insn (gen_adddi3_carry_rex64 (operands[0], operands[2], val, compare_op));
15968             break;
15969           default:
15970             gcc_unreachable ();
15971         }
15972     }
15973   return 1; /* DONE */
15974 }
15975
15976
15977 /* Split operands 0 and 1 into SImode parts.  Similar to split_di, but
15978    works for floating pointer parameters and nonoffsetable memories.
15979    For pushes, it returns just stack offsets; the values will be saved
15980    in the right order.  Maximally three parts are generated.  */
15981
15982 static int
15983 ix86_split_to_parts (rtx operand, rtx *parts, enum machine_mode mode)
15984 {
15985   int size;
15986
15987   if (!TARGET_64BIT)
15988     size = mode==XFmode ? 3 : GET_MODE_SIZE (mode) / 4;
15989   else
15990     size = (GET_MODE_SIZE (mode) + 4) / 8;
15991
15992   gcc_assert (!REG_P (operand) || !MMX_REGNO_P (REGNO (operand)));
15993   gcc_assert (size >= 2 && size <= 4);
15994
15995   /* Optimize constant pool reference to immediates.  This is used by fp
15996      moves, that force all constants to memory to allow combining.  */
15997   if (MEM_P (operand) && MEM_READONLY_P (operand))
15998     {
15999       rtx tmp = maybe_get_pool_constant (operand);
16000       if (tmp)
16001         operand = tmp;
16002     }
16003
16004   if (MEM_P (operand) && !offsettable_memref_p (operand))
16005     {
16006       /* The only non-offsetable memories we handle are pushes.  */
16007       int ok = push_operand (operand, VOIDmode);
16008
16009       gcc_assert (ok);
16010
16011       operand = copy_rtx (operand);
16012       PUT_MODE (operand, Pmode);
16013       parts[0] = parts[1] = parts[2] = parts[3] = operand;
16014       return size;
16015     }
16016
16017   if (GET_CODE (operand) == CONST_VECTOR)
16018     {
16019       enum machine_mode imode = int_mode_for_mode (mode);
16020       /* Caution: if we looked through a constant pool memory above,
16021          the operand may actually have a different mode now.  That's
16022          ok, since we want to pun this all the way back to an integer.  */
16023       operand = simplify_subreg (imode, operand, GET_MODE (operand), 0);
16024       gcc_assert (operand != NULL);
16025       mode = imode;
16026     }
16027
16028   if (!TARGET_64BIT)
16029     {
16030       if (mode == DImode)
16031         split_di (&operand, 1, &parts[0], &parts[1]);
16032       else
16033         {
16034           int i;
16035
16036           if (REG_P (operand))
16037             {
16038               gcc_assert (reload_completed);
16039               for (i = 0; i < size; i++)
16040                 parts[i] = gen_rtx_REG (SImode, REGNO (operand) + i);
16041             }
16042           else if (offsettable_memref_p (operand))
16043             {
16044               operand = adjust_address (operand, SImode, 0);
16045               parts[0] = operand;
16046               for (i = 1; i < size; i++)
16047                 parts[i] = adjust_address (operand, SImode, 4 * i);
16048             }
16049           else if (GET_CODE (operand) == CONST_DOUBLE)
16050             {
16051               REAL_VALUE_TYPE r;
16052               long l[4];
16053
16054               REAL_VALUE_FROM_CONST_DOUBLE (r, operand);
16055               switch (mode)
16056                 {
16057                 case TFmode:
16058                   real_to_target (l, &r, mode);
16059                   parts[3] = gen_int_mode (l[3], SImode);
16060                   parts[2] = gen_int_mode (l[2], SImode);
16061                   break;
16062                 case XFmode:
16063                   REAL_VALUE_TO_TARGET_LONG_DOUBLE (r, l);
16064                   parts[2] = gen_int_mode (l[2], SImode);
16065                   break;
16066                 case DFmode:
16067                   REAL_VALUE_TO_TARGET_DOUBLE (r, l);
16068                   break;
16069                 default:
16070                   gcc_unreachable ();
16071                 }
16072               parts[1] = gen_int_mode (l[1], SImode);
16073               parts[0] = gen_int_mode (l[0], SImode);
16074             }
16075           else
16076             gcc_unreachable ();
16077         }
16078     }
16079   else
16080     {
16081       if (mode == TImode)
16082         split_ti (&operand, 1, &parts[0], &parts[1]);
16083       if (mode == XFmode || mode == TFmode)
16084         {
16085           enum machine_mode upper_mode = mode==XFmode ? SImode : DImode;
16086           if (REG_P (operand))
16087             {
16088               gcc_assert (reload_completed);
16089               parts[0] = gen_rtx_REG (DImode, REGNO (operand) + 0);
16090               parts[1] = gen_rtx_REG (upper_mode, REGNO (operand) + 1);
16091             }
16092           else if (offsettable_memref_p (operand))
16093             {
16094               operand = adjust_address (operand, DImode, 0);
16095               parts[0] = operand;
16096               parts[1] = adjust_address (operand, upper_mode, 8);
16097             }
16098           else if (GET_CODE (operand) == CONST_DOUBLE)
16099             {
16100               REAL_VALUE_TYPE r;
16101               long l[4];
16102
16103               REAL_VALUE_FROM_CONST_DOUBLE (r, operand);
16104               real_to_target (l, &r, mode);
16105
16106               /* Do not use shift by 32 to avoid warning on 32bit systems.  */
16107               if (HOST_BITS_PER_WIDE_INT >= 64)
16108                 parts[0]
16109                   = gen_int_mode
16110                       ((l[0] & (((HOST_WIDE_INT) 2 << 31) - 1))
16111                        + ((((HOST_WIDE_INT) l[1]) << 31) << 1),
16112                        DImode);
16113               else
16114                 parts[0] = immed_double_const (l[0], l[1], DImode);
16115
16116               if (upper_mode == SImode)
16117                 parts[1] = gen_int_mode (l[2], SImode);
16118               else if (HOST_BITS_PER_WIDE_INT >= 64)
16119                 parts[1]
16120                   = gen_int_mode
16121                       ((l[2] & (((HOST_WIDE_INT) 2 << 31) - 1))
16122                        + ((((HOST_WIDE_INT) l[3]) << 31) << 1),
16123                        DImode);
16124               else
16125                 parts[1] = immed_double_const (l[2], l[3], DImode);
16126             }
16127           else
16128             gcc_unreachable ();
16129         }
16130     }
16131
16132   return size;
16133 }
16134
16135 /* Emit insns to perform a move or push of DI, DF, XF, and TF values.
16136    Return false when normal moves are needed; true when all required
16137    insns have been emitted.  Operands 2-4 contain the input values
16138    int the correct order; operands 5-7 contain the output values.  */
16139
16140 void
16141 ix86_split_long_move (rtx operands[])
16142 {
16143   rtx part[2][4];
16144   int nparts, i, j;
16145   int push = 0;
16146   int collisions = 0;
16147   enum machine_mode mode = GET_MODE (operands[0]);
16148   bool collisionparts[4];
16149
16150   /* The DFmode expanders may ask us to move double.
16151      For 64bit target this is single move.  By hiding the fact
16152      here we simplify i386.md splitters.  */
16153   if (GET_MODE_SIZE (GET_MODE (operands[0])) == 8 && TARGET_64BIT)
16154     {
16155       /* Optimize constant pool reference to immediates.  This is used by
16156          fp moves, that force all constants to memory to allow combining.  */
16157
16158       if (MEM_P (operands[1])
16159           && GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF
16160           && CONSTANT_POOL_ADDRESS_P (XEXP (operands[1], 0)))
16161         operands[1] = get_pool_constant (XEXP (operands[1], 0));
16162       if (push_operand (operands[0], VOIDmode))
16163         {
16164           operands[0] = copy_rtx (operands[0]);
16165           PUT_MODE (operands[0], Pmode);
16166         }
16167       else
16168         operands[0] = gen_lowpart (DImode, operands[0]);
16169       operands[1] = gen_lowpart (DImode, operands[1]);
16170       emit_move_insn (operands[0], operands[1]);
16171       return;
16172     }
16173
16174   /* The only non-offsettable memory we handle is push.  */
16175   if (push_operand (operands[0], VOIDmode))
16176     push = 1;
16177   else
16178     gcc_assert (!MEM_P (operands[0])
16179                 || offsettable_memref_p (operands[0]));
16180
16181   nparts = ix86_split_to_parts (operands[1], part[1], GET_MODE (operands[0]));
16182   ix86_split_to_parts (operands[0], part[0], GET_MODE (operands[0]));
16183
16184   /* When emitting push, take care for source operands on the stack.  */
16185   if (push && MEM_P (operands[1])
16186       && reg_overlap_mentioned_p (stack_pointer_rtx, operands[1]))
16187     for (i = 0; i < nparts - 1; i++)
16188       part[1][i] = change_address (part[1][i],
16189                                    GET_MODE (part[1][i]),
16190                                    XEXP (part[1][i + 1], 0));
16191
16192   /* We need to do copy in the right order in case an address register
16193      of the source overlaps the destination.  */
16194   if (REG_P (part[0][0]) && MEM_P (part[1][0]))
16195     {
16196       rtx tmp;
16197
16198       for (i = 0; i < nparts; i++)
16199         {
16200           collisionparts[i]
16201             = reg_overlap_mentioned_p (part[0][i], XEXP (part[1][0], 0));
16202           if (collisionparts[i])
16203             collisions++;
16204         }
16205
16206       /* Collision in the middle part can be handled by reordering.  */
16207       if (collisions == 1 && nparts == 3 && collisionparts [1])
16208         {
16209           tmp = part[0][1]; part[0][1] = part[0][2]; part[0][2] = tmp;
16210           tmp = part[1][1]; part[1][1] = part[1][2]; part[1][2] = tmp;
16211         }
16212       else if (collisions == 1
16213                && nparts == 4
16214                && (collisionparts [1] || collisionparts [2]))
16215         {
16216           if (collisionparts [1])
16217             {
16218               tmp = part[0][1]; part[0][1] = part[0][2]; part[0][2] = tmp;
16219               tmp = part[1][1]; part[1][1] = part[1][2]; part[1][2] = tmp;
16220             }
16221           else
16222             {
16223               tmp = part[0][2]; part[0][2] = part[0][3]; part[0][3] = tmp;
16224               tmp = part[1][2]; part[1][2] = part[1][3]; part[1][3] = tmp;
16225             }
16226         }
16227
16228       /* If there are more collisions, we can't handle it by reordering.
16229          Do an lea to the last part and use only one colliding move.  */
16230       else if (collisions > 1)
16231         {
16232           rtx base;
16233
16234           collisions = 1;
16235
16236           base = part[0][nparts - 1];
16237
16238           /* Handle the case when the last part isn't valid for lea.
16239              Happens in 64-bit mode storing the 12-byte XFmode.  */
16240           if (GET_MODE (base) != Pmode)
16241             base = gen_rtx_REG (Pmode, REGNO (base));
16242
16243           emit_insn (gen_rtx_SET (VOIDmode, base, XEXP (part[1][0], 0)));
16244           part[1][0] = replace_equiv_address (part[1][0], base);
16245           for (i = 1; i < nparts; i++)
16246             {
16247               tmp = plus_constant (base, UNITS_PER_WORD * i);
16248               part[1][i] = replace_equiv_address (part[1][i], tmp);
16249             }
16250         }
16251     }
16252
16253   if (push)
16254     {
16255       if (!TARGET_64BIT)
16256         {
16257           if (nparts == 3)
16258             {
16259               if (TARGET_128BIT_LONG_DOUBLE && mode == XFmode)
16260                 emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx, GEN_INT (-4)));
16261               emit_move_insn (part[0][2], part[1][2]);
16262             }
16263           else if (nparts == 4)
16264             {
16265               emit_move_insn (part[0][3], part[1][3]);
16266               emit_move_insn (part[0][2], part[1][2]);
16267             }
16268         }
16269       else
16270         {
16271           /* In 64bit mode we don't have 32bit push available.  In case this is
16272              register, it is OK - we will just use larger counterpart.  We also
16273              retype memory - these comes from attempt to avoid REX prefix on
16274              moving of second half of TFmode value.  */
16275           if (GET_MODE (part[1][1]) == SImode)
16276             {
16277               switch (GET_CODE (part[1][1]))
16278                 {
16279                 case MEM:
16280                   part[1][1] = adjust_address (part[1][1], DImode, 0);
16281                   break;
16282
16283                 case REG:
16284                   part[1][1] = gen_rtx_REG (DImode, REGNO (part[1][1]));
16285                   break;
16286
16287                 default:
16288                   gcc_unreachable ();
16289                 }
16290
16291               if (GET_MODE (part[1][0]) == SImode)
16292                 part[1][0] = part[1][1];
16293             }
16294         }
16295       emit_move_insn (part[0][1], part[1][1]);
16296       emit_move_insn (part[0][0], part[1][0]);
16297       return;
16298     }
16299
16300   /* Choose correct order to not overwrite the source before it is copied.  */
16301   if ((REG_P (part[0][0])
16302        && REG_P (part[1][1])
16303        && (REGNO (part[0][0]) == REGNO (part[1][1])
16304            || (nparts == 3
16305                && REGNO (part[0][0]) == REGNO (part[1][2]))
16306            || (nparts == 4
16307                && REGNO (part[0][0]) == REGNO (part[1][3]))))
16308       || (collisions > 0
16309           && reg_overlap_mentioned_p (part[0][0], XEXP (part[1][0], 0))))
16310     {
16311       for (i = 0, j = nparts - 1; i < nparts; i++, j--)
16312         {
16313           operands[2 + i] = part[0][j];
16314           operands[6 + i] = part[1][j];
16315         }
16316     }
16317   else
16318     {
16319       for (i = 0; i < nparts; i++)
16320         {
16321           operands[2 + i] = part[0][i];
16322           operands[6 + i] = part[1][i];
16323         }
16324     }
16325
16326   /* If optimizing for size, attempt to locally unCSE nonzero constants.  */
16327   if (optimize_insn_for_size_p ())
16328     {
16329       for (j = 0; j < nparts - 1; j++)
16330         if (CONST_INT_P (operands[6 + j])
16331             && operands[6 + j] != const0_rtx
16332             && REG_P (operands[2 + j]))
16333           for (i = j; i < nparts - 1; i++)
16334             if (CONST_INT_P (operands[7 + i])
16335                 && INTVAL (operands[7 + i]) == INTVAL (operands[6 + j]))
16336               operands[7 + i] = operands[2 + j];
16337     }
16338
16339   for (i = 0; i < nparts; i++)
16340     emit_move_insn (operands[2 + i], operands[6 + i]);
16341
16342   return;
16343 }
16344
16345 /* Helper function of ix86_split_ashl used to generate an SImode/DImode
16346    left shift by a constant, either using a single shift or
16347    a sequence of add instructions.  */
16348
16349 static void
16350 ix86_expand_ashl_const (rtx operand, int count, enum machine_mode mode)
16351 {
16352   if (count == 1)
16353     {
16354       emit_insn ((mode == DImode
16355                   ? gen_addsi3
16356                   : gen_adddi3) (operand, operand, operand));
16357     }
16358   else if (!optimize_insn_for_size_p ()
16359            && count * ix86_cost->add <= ix86_cost->shift_const)
16360     {
16361       int i;
16362       for (i=0; i<count; i++)
16363         {
16364           emit_insn ((mode == DImode
16365                       ? gen_addsi3
16366                       : gen_adddi3) (operand, operand, operand));
16367         }
16368     }
16369   else
16370     emit_insn ((mode == DImode
16371                 ? gen_ashlsi3
16372                 : gen_ashldi3) (operand, operand, GEN_INT (count)));
16373 }
16374
16375 void
16376 ix86_split_ashl (rtx *operands, rtx scratch, enum machine_mode mode)
16377 {
16378   rtx low[2], high[2];
16379   int count;
16380   const int single_width = mode == DImode ? 32 : 64;
16381
16382   if (CONST_INT_P (operands[2]))
16383     {
16384       (mode == DImode ? split_di : split_ti) (operands, 2, low, high);
16385       count = INTVAL (operands[2]) & (single_width * 2 - 1);
16386
16387       if (count >= single_width)
16388         {
16389           emit_move_insn (high[0], low[1]);
16390           emit_move_insn (low[0], const0_rtx);
16391
16392           if (count > single_width)
16393             ix86_expand_ashl_const (high[0], count - single_width, mode);
16394         }
16395       else
16396         {
16397           if (!rtx_equal_p (operands[0], operands[1]))
16398             emit_move_insn (operands[0], operands[1]);
16399           emit_insn ((mode == DImode
16400                      ? gen_x86_shld
16401                      : gen_x86_64_shld) (high[0], low[0], GEN_INT (count)));
16402           ix86_expand_ashl_const (low[0], count, mode);
16403         }
16404       return;
16405     }
16406
16407   (mode == DImode ? split_di : split_ti) (operands, 1, low, high);
16408
16409   if (operands[1] == const1_rtx)
16410     {
16411       /* Assuming we've chosen a QImode capable registers, then 1 << N
16412          can be done with two 32/64-bit shifts, no branches, no cmoves.  */
16413       if (ANY_QI_REG_P (low[0]) && ANY_QI_REG_P (high[0]))
16414         {
16415           rtx s, d, flags = gen_rtx_REG (CCZmode, FLAGS_REG);
16416
16417           ix86_expand_clear (low[0]);
16418           ix86_expand_clear (high[0]);
16419           emit_insn (gen_testqi_ccz_1 (operands[2], GEN_INT (single_width)));
16420
16421           d = gen_lowpart (QImode, low[0]);
16422           d = gen_rtx_STRICT_LOW_PART (VOIDmode, d);
16423           s = gen_rtx_EQ (QImode, flags, const0_rtx);
16424           emit_insn (gen_rtx_SET (VOIDmode, d, s));
16425
16426           d = gen_lowpart (QImode, high[0]);
16427           d = gen_rtx_STRICT_LOW_PART (VOIDmode, d);
16428           s = gen_rtx_NE (QImode, flags, const0_rtx);
16429           emit_insn (gen_rtx_SET (VOIDmode, d, s));
16430         }
16431
16432       /* Otherwise, we can get the same results by manually performing
16433          a bit extract operation on bit 5/6, and then performing the two
16434          shifts.  The two methods of getting 0/1 into low/high are exactly
16435          the same size.  Avoiding the shift in the bit extract case helps
16436          pentium4 a bit; no one else seems to care much either way.  */
16437       else
16438         {
16439           rtx x;
16440
16441           if (TARGET_PARTIAL_REG_STALL && !optimize_insn_for_size_p ())
16442             x = gen_rtx_ZERO_EXTEND (mode == DImode ? SImode : DImode, operands[2]);
16443           else
16444             x = gen_lowpart (mode == DImode ? SImode : DImode, operands[2]);
16445           emit_insn (gen_rtx_SET (VOIDmode, high[0], x));
16446
16447           emit_insn ((mode == DImode
16448                       ? gen_lshrsi3
16449                       : gen_lshrdi3) (high[0], high[0], GEN_INT (mode == DImode ? 5 : 6)));
16450           emit_insn ((mode == DImode
16451                       ? gen_andsi3
16452                       : gen_anddi3) (high[0], high[0], GEN_INT (1)));
16453           emit_move_insn (low[0], high[0]);
16454           emit_insn ((mode == DImode
16455                       ? gen_xorsi3
16456                       : gen_xordi3) (low[0], low[0], GEN_INT (1)));
16457         }
16458
16459       emit_insn ((mode == DImode
16460                     ? gen_ashlsi3
16461                     : gen_ashldi3) (low[0], low[0], operands[2]));
16462       emit_insn ((mode == DImode
16463                     ? gen_ashlsi3
16464                     : gen_ashldi3) (high[0], high[0], operands[2]));
16465       return;
16466     }
16467
16468   if (operands[1] == constm1_rtx)
16469     {
16470       /* For -1 << N, we can avoid the shld instruction, because we
16471          know that we're shifting 0...31/63 ones into a -1.  */
16472       emit_move_insn (low[0], constm1_rtx);
16473       if (optimize_insn_for_size_p ())
16474         emit_move_insn (high[0], low[0]);
16475       else
16476         emit_move_insn (high[0], constm1_rtx);
16477     }
16478   else
16479     {
16480       if (!rtx_equal_p (operands[0], operands[1]))
16481         emit_move_insn (operands[0], operands[1]);
16482
16483       (mode == DImode ? split_di : split_ti) (operands, 1, low, high);
16484       emit_insn ((mode == DImode
16485                   ? gen_x86_shld
16486                   : gen_x86_64_shld) (high[0], low[0], operands[2]));
16487     }
16488
16489   emit_insn ((mode == DImode ? gen_ashlsi3 : gen_ashldi3) (low[0], low[0], operands[2]));
16490
16491   if (TARGET_CMOVE && scratch)
16492     {
16493       ix86_expand_clear (scratch);
16494       emit_insn ((mode == DImode
16495                   ? gen_x86_shift_adj_1
16496                   : gen_x86_64_shift_adj_1) (high[0], low[0], operands[2],
16497                                              scratch));
16498     }
16499   else
16500     emit_insn ((mode == DImode
16501                 ? gen_x86_shift_adj_2
16502                 : gen_x86_64_shift_adj_2) (high[0], low[0], operands[2]));
16503 }
16504
16505 void
16506 ix86_split_ashr (rtx *operands, rtx scratch, enum machine_mode mode)
16507 {
16508   rtx low[2], high[2];
16509   int count;
16510   const int single_width = mode == DImode ? 32 : 64;
16511
16512   if (CONST_INT_P (operands[2]))
16513     {
16514       (mode == DImode ? split_di : split_ti) (operands, 2, low, high);
16515       count = INTVAL (operands[2]) & (single_width * 2 - 1);
16516
16517       if (count == single_width * 2 - 1)
16518         {
16519           emit_move_insn (high[0], high[1]);
16520           emit_insn ((mode == DImode
16521                       ? gen_ashrsi3
16522                       : gen_ashrdi3) (high[0], high[0],
16523                                       GEN_INT (single_width - 1)));
16524           emit_move_insn (low[0], high[0]);
16525
16526         }
16527       else if (count >= single_width)
16528         {
16529           emit_move_insn (low[0], high[1]);
16530           emit_move_insn (high[0], low[0]);
16531           emit_insn ((mode == DImode
16532                       ? gen_ashrsi3
16533                       : gen_ashrdi3) (high[0], high[0],
16534                                       GEN_INT (single_width - 1)));
16535           if (count > single_width)
16536             emit_insn ((mode == DImode
16537                         ? gen_ashrsi3
16538                         : gen_ashrdi3) (low[0], low[0],
16539                                         GEN_INT (count - single_width)));
16540         }
16541       else
16542         {
16543           if (!rtx_equal_p (operands[0], operands[1]))
16544             emit_move_insn (operands[0], operands[1]);
16545           emit_insn ((mode == DImode
16546                       ? gen_x86_shrd
16547                       : gen_x86_64_shrd) (low[0], high[0], GEN_INT (count)));
16548           emit_insn ((mode == DImode
16549                       ? gen_ashrsi3
16550                       : gen_ashrdi3) (high[0], high[0], GEN_INT (count)));
16551         }
16552     }
16553   else
16554     {
16555       if (!rtx_equal_p (operands[0], operands[1]))
16556         emit_move_insn (operands[0], operands[1]);
16557
16558       (mode == DImode ? split_di : split_ti) (operands, 1, low, high);
16559
16560       emit_insn ((mode == DImode
16561                   ? gen_x86_shrd
16562                   : gen_x86_64_shrd) (low[0], high[0], operands[2]));
16563       emit_insn ((mode == DImode
16564                   ? gen_ashrsi3
16565                   : gen_ashrdi3)  (high[0], high[0], operands[2]));
16566
16567       if (TARGET_CMOVE && scratch)
16568         {
16569           emit_move_insn (scratch, high[0]);
16570           emit_insn ((mode == DImode
16571                       ? gen_ashrsi3
16572                       : gen_ashrdi3) (scratch, scratch,
16573                                       GEN_INT (single_width - 1)));
16574           emit_insn ((mode == DImode
16575                       ? gen_x86_shift_adj_1
16576                       : gen_x86_64_shift_adj_1) (low[0], high[0], operands[2],
16577                                                  scratch));
16578         }
16579       else
16580         emit_insn ((mode == DImode
16581                     ? gen_x86_shift_adj_3
16582                     : gen_x86_64_shift_adj_3) (low[0], high[0], operands[2]));
16583     }
16584 }
16585
16586 void
16587 ix86_split_lshr (rtx *operands, rtx scratch, enum machine_mode mode)
16588 {
16589   rtx low[2], high[2];
16590   int count;
16591   const int single_width = mode == DImode ? 32 : 64;
16592
16593   if (CONST_INT_P (operands[2]))
16594     {
16595       (mode == DImode ? split_di : split_ti) (operands, 2, low, high);
16596       count = INTVAL (operands[2]) & (single_width * 2 - 1);
16597
16598       if (count >= single_width)
16599         {
16600           emit_move_insn (low[0], high[1]);
16601           ix86_expand_clear (high[0]);
16602
16603           if (count > single_width)
16604             emit_insn ((mode == DImode
16605                         ? gen_lshrsi3
16606                         : gen_lshrdi3) (low[0], low[0],
16607                                         GEN_INT (count - single_width)));
16608         }
16609       else
16610         {
16611           if (!rtx_equal_p (operands[0], operands[1]))
16612             emit_move_insn (operands[0], operands[1]);
16613           emit_insn ((mode == DImode
16614                       ? gen_x86_shrd
16615                       : gen_x86_64_shrd) (low[0], high[0], GEN_INT (count)));
16616           emit_insn ((mode == DImode
16617                       ? gen_lshrsi3
16618                       : gen_lshrdi3) (high[0], high[0], GEN_INT (count)));
16619         }
16620     }
16621   else
16622     {
16623       if (!rtx_equal_p (operands[0], operands[1]))
16624         emit_move_insn (operands[0], operands[1]);
16625
16626       (mode == DImode ? split_di : split_ti) (operands, 1, low, high);
16627
16628       emit_insn ((mode == DImode
16629                   ? gen_x86_shrd
16630                   : gen_x86_64_shrd) (low[0], high[0], operands[2]));
16631       emit_insn ((mode == DImode
16632                   ? gen_lshrsi3
16633                   : gen_lshrdi3) (high[0], high[0], operands[2]));
16634
16635       /* Heh.  By reversing the arguments, we can reuse this pattern.  */
16636       if (TARGET_CMOVE && scratch)
16637         {
16638           ix86_expand_clear (scratch);
16639           emit_insn ((mode == DImode
16640                       ? gen_x86_shift_adj_1
16641                       : gen_x86_64_shift_adj_1) (low[0], high[0], operands[2],
16642                                                  scratch));
16643         }
16644       else
16645         emit_insn ((mode == DImode
16646                     ? gen_x86_shift_adj_2
16647                     : gen_x86_64_shift_adj_2) (low[0], high[0], operands[2]));
16648     }
16649 }
16650
16651 /* Predict just emitted jump instruction to be taken with probability PROB.  */
16652 static void
16653 predict_jump (int prob)
16654 {
16655   rtx insn = get_last_insn ();
16656   gcc_assert (JUMP_P (insn));
16657   REG_NOTES (insn)
16658     = gen_rtx_EXPR_LIST (REG_BR_PROB,
16659                          GEN_INT (prob),
16660                          REG_NOTES (insn));
16661 }
16662
16663 /* Helper function for the string operations below.  Dest VARIABLE whether
16664    it is aligned to VALUE bytes.  If true, jump to the label.  */
16665 static rtx
16666 ix86_expand_aligntest (rtx variable, int value, bool epilogue)
16667 {
16668   rtx label = gen_label_rtx ();
16669   rtx tmpcount = gen_reg_rtx (GET_MODE (variable));
16670   if (GET_MODE (variable) == DImode)
16671     emit_insn (gen_anddi3 (tmpcount, variable, GEN_INT (value)));
16672   else
16673     emit_insn (gen_andsi3 (tmpcount, variable, GEN_INT (value)));
16674   emit_cmp_and_jump_insns (tmpcount, const0_rtx, EQ, 0, GET_MODE (variable),
16675                            1, label);
16676   if (epilogue)
16677     predict_jump (REG_BR_PROB_BASE * 50 / 100);
16678   else
16679     predict_jump (REG_BR_PROB_BASE * 90 / 100);
16680   return label;
16681 }
16682
16683 /* Adjust COUNTER by the VALUE.  */
16684 static void
16685 ix86_adjust_counter (rtx countreg, HOST_WIDE_INT value)
16686 {
16687   if (GET_MODE (countreg) == DImode)
16688     emit_insn (gen_adddi3 (countreg, countreg, GEN_INT (-value)));
16689   else
16690     emit_insn (gen_addsi3 (countreg, countreg, GEN_INT (-value)));
16691 }
16692
16693 /* Zero extend possibly SImode EXP to Pmode register.  */
16694 rtx
16695 ix86_zero_extend_to_Pmode (rtx exp)
16696 {
16697   rtx r;
16698   if (GET_MODE (exp) == VOIDmode)
16699     return force_reg (Pmode, exp);
16700   if (GET_MODE (exp) == Pmode)
16701     return copy_to_mode_reg (Pmode, exp);
16702   r = gen_reg_rtx (Pmode);
16703   emit_insn (gen_zero_extendsidi2 (r, exp));
16704   return r;
16705 }
16706
16707 /* Divide COUNTREG by SCALE.  */
16708 static rtx
16709 scale_counter (rtx countreg, int scale)
16710 {
16711   rtx sc;
16712   rtx piece_size_mask;
16713
16714   if (scale == 1)
16715     return countreg;
16716   if (CONST_INT_P (countreg))
16717     return GEN_INT (INTVAL (countreg) / scale);
16718   gcc_assert (REG_P (countreg));
16719
16720   piece_size_mask = GEN_INT (scale - 1);
16721   sc = expand_simple_binop (GET_MODE (countreg), LSHIFTRT, countreg,
16722                             GEN_INT (exact_log2 (scale)),
16723                             NULL, 1, OPTAB_DIRECT);
16724   return sc;
16725 }
16726
16727 /* Return mode for the memcpy/memset loop counter.  Prefer SImode over
16728    DImode for constant loop counts.  */
16729
16730 static enum machine_mode
16731 counter_mode (rtx count_exp)
16732 {
16733   if (GET_MODE (count_exp) != VOIDmode)
16734     return GET_MODE (count_exp);
16735   if (GET_CODE (count_exp) != CONST_INT)
16736     return Pmode;
16737   if (TARGET_64BIT && (INTVAL (count_exp) & ~0xffffffff))
16738     return DImode;
16739   return SImode;
16740 }
16741
16742 /* When SRCPTR is non-NULL, output simple loop to move memory
16743    pointer to SRCPTR to DESTPTR via chunks of MODE unrolled UNROLL times,
16744    overall size is COUNT specified in bytes.  When SRCPTR is NULL, output the
16745    equivalent loop to set memory by VALUE (supposed to be in MODE).
16746
16747    The size is rounded down to whole number of chunk size moved at once.
16748    SRCMEM and DESTMEM provide MEMrtx to feed proper aliasing info.  */
16749
16750
16751 static void
16752 expand_set_or_movmem_via_loop (rtx destmem, rtx srcmem,
16753                                rtx destptr, rtx srcptr, rtx value,
16754                                rtx count, enum machine_mode mode, int unroll,
16755                                int expected_size)
16756 {
16757   rtx out_label, top_label, iter, tmp;
16758   enum machine_mode iter_mode = counter_mode (count);
16759   rtx piece_size = GEN_INT (GET_MODE_SIZE (mode) * unroll);
16760   rtx piece_size_mask = GEN_INT (~((GET_MODE_SIZE (mode) * unroll) - 1));
16761   rtx size;
16762   rtx x_addr;
16763   rtx y_addr;
16764   int i;
16765
16766   top_label = gen_label_rtx ();
16767   out_label = gen_label_rtx ();
16768   iter = gen_reg_rtx (iter_mode);
16769
16770   size = expand_simple_binop (iter_mode, AND, count, piece_size_mask,
16771                               NULL, 1, OPTAB_DIRECT);
16772   /* Those two should combine.  */
16773   if (piece_size == const1_rtx)
16774     {
16775       emit_cmp_and_jump_insns (size, const0_rtx, EQ, NULL_RTX, iter_mode,
16776                                true, out_label);
16777       predict_jump (REG_BR_PROB_BASE * 10 / 100);
16778     }
16779   emit_move_insn (iter, const0_rtx);
16780
16781   emit_label (top_label);
16782
16783   tmp = convert_modes (Pmode, iter_mode, iter, true);
16784   x_addr = gen_rtx_PLUS (Pmode, destptr, tmp);
16785   destmem = change_address (destmem, mode, x_addr);
16786
16787   if (srcmem)
16788     {
16789       y_addr = gen_rtx_PLUS (Pmode, srcptr, copy_rtx (tmp));
16790       srcmem = change_address (srcmem, mode, y_addr);
16791
16792       /* When unrolling for chips that reorder memory reads and writes,
16793          we can save registers by using single temporary.
16794          Also using 4 temporaries is overkill in 32bit mode.  */
16795       if (!TARGET_64BIT && 0)
16796         {
16797           for (i = 0; i < unroll; i++)
16798             {
16799               if (i)
16800                 {
16801                   destmem =
16802                     adjust_address (copy_rtx (destmem), mode, GET_MODE_SIZE (mode));
16803                   srcmem =
16804                     adjust_address (copy_rtx (srcmem), mode, GET_MODE_SIZE (mode));
16805                 }
16806               emit_move_insn (destmem, srcmem);
16807             }
16808         }
16809       else
16810         {
16811           rtx tmpreg[4];
16812           gcc_assert (unroll <= 4);
16813           for (i = 0; i < unroll; i++)
16814             {
16815               tmpreg[i] = gen_reg_rtx (mode);
16816               if (i)
16817                 {
16818                   srcmem =
16819                     adjust_address (copy_rtx (srcmem), mode, GET_MODE_SIZE (mode));
16820                 }
16821               emit_move_insn (tmpreg[i], srcmem);
16822             }
16823           for (i = 0; i < unroll; i++)
16824             {
16825               if (i)
16826                 {
16827                   destmem =
16828                     adjust_address (copy_rtx (destmem), mode, GET_MODE_SIZE (mode));
16829                 }
16830               emit_move_insn (destmem, tmpreg[i]);
16831             }
16832         }
16833     }
16834   else
16835     for (i = 0; i < unroll; i++)
16836       {
16837         if (i)
16838           destmem =
16839             adjust_address (copy_rtx (destmem), mode, GET_MODE_SIZE (mode));
16840         emit_move_insn (destmem, value);
16841       }
16842
16843   tmp = expand_simple_binop (iter_mode, PLUS, iter, piece_size, iter,
16844                              true, OPTAB_LIB_WIDEN);
16845   if (tmp != iter)
16846     emit_move_insn (iter, tmp);
16847
16848   emit_cmp_and_jump_insns (iter, size, LT, NULL_RTX, iter_mode,
16849                            true, top_label);
16850   if (expected_size != -1)
16851     {
16852       expected_size /= GET_MODE_SIZE (mode) * unroll;
16853       if (expected_size == 0)
16854         predict_jump (0);
16855       else if (expected_size > REG_BR_PROB_BASE)
16856         predict_jump (REG_BR_PROB_BASE - 1);
16857       else
16858         predict_jump (REG_BR_PROB_BASE - (REG_BR_PROB_BASE + expected_size / 2) / expected_size);
16859     }
16860   else
16861     predict_jump (REG_BR_PROB_BASE * 80 / 100);
16862   iter = ix86_zero_extend_to_Pmode (iter);
16863   tmp = expand_simple_binop (Pmode, PLUS, destptr, iter, destptr,
16864                              true, OPTAB_LIB_WIDEN);
16865   if (tmp != destptr)
16866     emit_move_insn (destptr, tmp);
16867   if (srcptr)
16868     {
16869       tmp = expand_simple_binop (Pmode, PLUS, srcptr, iter, srcptr,
16870                                  true, OPTAB_LIB_WIDEN);
16871       if (tmp != srcptr)
16872         emit_move_insn (srcptr, tmp);
16873     }
16874   emit_label (out_label);
16875 }
16876
16877 /* Output "rep; mov" instruction.
16878    Arguments have same meaning as for previous function */
16879 static void
16880 expand_movmem_via_rep_mov (rtx destmem, rtx srcmem,
16881                            rtx destptr, rtx srcptr,
16882                            rtx count,
16883                            enum machine_mode mode)
16884 {
16885   rtx destexp;
16886   rtx srcexp;
16887   rtx countreg;
16888
16889   /* If the size is known, it is shorter to use rep movs.  */
16890   if (mode == QImode && CONST_INT_P (count)
16891       && !(INTVAL (count) & 3))
16892     mode = SImode;
16893
16894   if (destptr != XEXP (destmem, 0) || GET_MODE (destmem) != BLKmode)
16895     destmem = adjust_automodify_address_nv (destmem, BLKmode, destptr, 0);
16896   if (srcptr != XEXP (srcmem, 0) || GET_MODE (srcmem) != BLKmode)
16897     srcmem = adjust_automodify_address_nv (srcmem, BLKmode, srcptr, 0);
16898   countreg = ix86_zero_extend_to_Pmode (scale_counter (count, GET_MODE_SIZE (mode)));
16899   if (mode != QImode)
16900     {
16901       destexp = gen_rtx_ASHIFT (Pmode, countreg,
16902                                 GEN_INT (exact_log2 (GET_MODE_SIZE (mode))));
16903       destexp = gen_rtx_PLUS (Pmode, destexp, destptr);
16904       srcexp = gen_rtx_ASHIFT (Pmode, countreg,
16905                                GEN_INT (exact_log2 (GET_MODE_SIZE (mode))));
16906       srcexp = gen_rtx_PLUS (Pmode, srcexp, srcptr);
16907     }
16908   else
16909     {
16910       destexp = gen_rtx_PLUS (Pmode, destptr, countreg);
16911       srcexp = gen_rtx_PLUS (Pmode, srcptr, countreg);
16912     }
16913   if (CONST_INT_P (count))
16914     {
16915       count = GEN_INT (INTVAL (count)
16916                        & ~((HOST_WIDE_INT) GET_MODE_SIZE (mode) - 1));
16917       destmem = shallow_copy_rtx (destmem);
16918       srcmem = shallow_copy_rtx (srcmem);
16919       set_mem_size (destmem, count);
16920       set_mem_size (srcmem, count);
16921     }
16922   else
16923     {
16924       if (MEM_SIZE (destmem))
16925         set_mem_size (destmem, NULL_RTX);
16926       if (MEM_SIZE (srcmem))
16927         set_mem_size (srcmem, NULL_RTX);
16928     }
16929   emit_insn (gen_rep_mov (destptr, destmem, srcptr, srcmem, countreg,
16930                           destexp, srcexp));
16931 }
16932
16933 /* Output "rep; stos" instruction.
16934    Arguments have same meaning as for previous function */
16935 static void
16936 expand_setmem_via_rep_stos (rtx destmem, rtx destptr, rtx value,
16937                             rtx count, enum machine_mode mode,
16938                             rtx orig_value)
16939 {
16940   rtx destexp;
16941   rtx countreg;
16942
16943   if (destptr != XEXP (destmem, 0) || GET_MODE (destmem) != BLKmode)
16944     destmem = adjust_automodify_address_nv (destmem, BLKmode, destptr, 0);
16945   value = force_reg (mode, gen_lowpart (mode, value));
16946   countreg = ix86_zero_extend_to_Pmode (scale_counter (count, GET_MODE_SIZE (mode)));
16947   if (mode != QImode)
16948     {
16949       destexp = gen_rtx_ASHIFT (Pmode, countreg,
16950                                 GEN_INT (exact_log2 (GET_MODE_SIZE (mode))));
16951       destexp = gen_rtx_PLUS (Pmode, destexp, destptr);
16952     }
16953   else
16954     destexp = gen_rtx_PLUS (Pmode, destptr, countreg);
16955   if (orig_value == const0_rtx && CONST_INT_P (count))
16956     {
16957       count = GEN_INT (INTVAL (count)
16958                        & ~((HOST_WIDE_INT) GET_MODE_SIZE (mode) - 1));
16959       destmem = shallow_copy_rtx (destmem);
16960       set_mem_size (destmem, count);
16961     }
16962   else if (MEM_SIZE (destmem))
16963     set_mem_size (destmem, NULL_RTX);
16964   emit_insn (gen_rep_stos (destptr, countreg, destmem, value, destexp));
16965 }
16966
16967 static void
16968 emit_strmov (rtx destmem, rtx srcmem,
16969              rtx destptr, rtx srcptr, enum machine_mode mode, int offset)
16970 {
16971   rtx src = adjust_automodify_address_nv (srcmem, mode, srcptr, offset);
16972   rtx dest = adjust_automodify_address_nv (destmem, mode, destptr, offset);
16973   emit_insn (gen_strmov (destptr, dest, srcptr, src));
16974 }
16975
16976 /* Output code to copy at most count & (max_size - 1) bytes from SRC to DEST.  */
16977 static void
16978 expand_movmem_epilogue (rtx destmem, rtx srcmem,
16979                         rtx destptr, rtx srcptr, rtx count, int max_size)
16980 {
16981   rtx src, dest;
16982   if (CONST_INT_P (count))
16983     {
16984       HOST_WIDE_INT countval = INTVAL (count);
16985       int offset = 0;
16986
16987       if ((countval & 0x10) && max_size > 16)
16988         {
16989           if (TARGET_64BIT)
16990             {
16991               emit_strmov (destmem, srcmem, destptr, srcptr, DImode, offset);
16992               emit_strmov (destmem, srcmem, destptr, srcptr, DImode, offset + 8);
16993             }
16994           else
16995             gcc_unreachable ();
16996           offset += 16;
16997         }
16998       if ((countval & 0x08) && max_size > 8)
16999         {
17000           if (TARGET_64BIT)
17001             emit_strmov (destmem, srcmem, destptr, srcptr, DImode, offset);
17002           else
17003             {
17004               emit_strmov (destmem, srcmem, destptr, srcptr, SImode, offset);
17005               emit_strmov (destmem, srcmem, destptr, srcptr, SImode, offset + 4);
17006             }
17007           offset += 8;
17008         }
17009       if ((countval & 0x04) && max_size > 4)
17010         {
17011           emit_strmov (destmem, srcmem, destptr, srcptr, SImode, offset);
17012           offset += 4;
17013         }
17014       if ((countval & 0x02) && max_size > 2)
17015         {
17016           emit_strmov (destmem, srcmem, destptr, srcptr, HImode, offset);
17017           offset += 2;
17018         }
17019       if ((countval & 0x01) && max_size > 1)
17020         {
17021           emit_strmov (destmem, srcmem, destptr, srcptr, QImode, offset);
17022           offset += 1;
17023         }
17024       return;
17025     }
17026   if (max_size > 8)
17027     {
17028       count = expand_simple_binop (GET_MODE (count), AND, count, GEN_INT (max_size - 1),
17029                                     count, 1, OPTAB_DIRECT);
17030       expand_set_or_movmem_via_loop (destmem, srcmem, destptr, srcptr, NULL,
17031                                      count, QImode, 1, 4);
17032       return;
17033     }
17034
17035   /* When there are stringops, we can cheaply increase dest and src pointers.
17036      Otherwise we save code size by maintaining offset (zero is readily
17037      available from preceding rep operation) and using x86 addressing modes.
17038    */
17039   if (TARGET_SINGLE_STRINGOP)
17040     {
17041       if (max_size > 4)
17042         {
17043           rtx label = ix86_expand_aligntest (count, 4, true);
17044           src = change_address (srcmem, SImode, srcptr);
17045           dest = change_address (destmem, SImode, destptr);
17046           emit_insn (gen_strmov (destptr, dest, srcptr, src));
17047           emit_label (label);
17048           LABEL_NUSES (label) = 1;
17049         }
17050       if (max_size > 2)
17051         {
17052           rtx label = ix86_expand_aligntest (count, 2, true);
17053           src = change_address (srcmem, HImode, srcptr);
17054           dest = change_address (destmem, HImode, destptr);
17055           emit_insn (gen_strmov (destptr, dest, srcptr, src));
17056           emit_label (label);
17057           LABEL_NUSES (label) = 1;
17058         }
17059       if (max_size > 1)
17060         {
17061           rtx label = ix86_expand_aligntest (count, 1, true);
17062           src = change_address (srcmem, QImode, srcptr);
17063           dest = change_address (destmem, QImode, destptr);
17064           emit_insn (gen_strmov (destptr, dest, srcptr, src));
17065           emit_label (label);
17066           LABEL_NUSES (label) = 1;
17067         }
17068     }
17069   else
17070     {
17071       rtx offset = force_reg (Pmode, const0_rtx);
17072       rtx tmp;
17073
17074       if (max_size > 4)
17075         {
17076           rtx label = ix86_expand_aligntest (count, 4, true);
17077           src = change_address (srcmem, SImode, srcptr);
17078           dest = change_address (destmem, SImode, destptr);
17079           emit_move_insn (dest, src);
17080           tmp = expand_simple_binop (Pmode, PLUS, offset, GEN_INT (4), NULL,
17081                                      true, OPTAB_LIB_WIDEN);
17082           if (tmp != offset)
17083             emit_move_insn (offset, tmp);
17084           emit_label (label);
17085           LABEL_NUSES (label) = 1;
17086         }
17087       if (max_size > 2)
17088         {
17089           rtx label = ix86_expand_aligntest (count, 2, true);
17090           tmp = gen_rtx_PLUS (Pmode, srcptr, offset);
17091           src = change_address (srcmem, HImode, tmp);
17092           tmp = gen_rtx_PLUS (Pmode, destptr, offset);
17093           dest = change_address (destmem, HImode, tmp);
17094           emit_move_insn (dest, src);
17095           tmp = expand_simple_binop (Pmode, PLUS, offset, GEN_INT (2), tmp,
17096                                      true, OPTAB_LIB_WIDEN);
17097           if (tmp != offset)
17098             emit_move_insn (offset, tmp);
17099           emit_label (label);
17100           LABEL_NUSES (label) = 1;
17101         }
17102       if (max_size > 1)
17103         {
17104           rtx label = ix86_expand_aligntest (count, 1, true);
17105           tmp = gen_rtx_PLUS (Pmode, srcptr, offset);
17106           src = change_address (srcmem, QImode, tmp);
17107           tmp = gen_rtx_PLUS (Pmode, destptr, offset);
17108           dest = change_address (destmem, QImode, tmp);
17109           emit_move_insn (dest, src);
17110           emit_label (label);
17111           LABEL_NUSES (label) = 1;
17112         }
17113     }
17114 }
17115
17116 /* Output code to set at most count & (max_size - 1) bytes starting by DEST.  */
17117 static void
17118 expand_setmem_epilogue_via_loop (rtx destmem, rtx destptr, rtx value,
17119                                  rtx count, int max_size)
17120 {
17121   count =
17122     expand_simple_binop (counter_mode (count), AND, count,
17123                          GEN_INT (max_size - 1), count, 1, OPTAB_DIRECT);
17124   expand_set_or_movmem_via_loop (destmem, NULL, destptr, NULL,
17125                                  gen_lowpart (QImode, value), count, QImode,
17126                                  1, max_size / 2);
17127 }
17128
17129 /* Output code to set at most count & (max_size - 1) bytes starting by DEST.  */
17130 static void
17131 expand_setmem_epilogue (rtx destmem, rtx destptr, rtx value, rtx count, int max_size)
17132 {
17133   rtx dest;
17134
17135   if (CONST_INT_P (count))
17136     {
17137       HOST_WIDE_INT countval = INTVAL (count);
17138       int offset = 0;
17139
17140       if ((countval & 0x10) && max_size > 16)
17141         {
17142           if (TARGET_64BIT)
17143             {
17144               dest = adjust_automodify_address_nv (destmem, DImode, destptr, offset);
17145               emit_insn (gen_strset (destptr, dest, value));
17146               dest = adjust_automodify_address_nv (destmem, DImode, destptr, offset + 8);
17147               emit_insn (gen_strset (destptr, dest, value));
17148             }
17149           else
17150             gcc_unreachable ();
17151           offset += 16;
17152         }
17153       if ((countval & 0x08) && max_size > 8)
17154         {
17155           if (TARGET_64BIT)
17156             {
17157               dest = adjust_automodify_address_nv (destmem, DImode, destptr, offset);
17158               emit_insn (gen_strset (destptr, dest, value));
17159             }
17160           else
17161             {
17162               dest = adjust_automodify_address_nv (destmem, SImode, destptr, offset);
17163               emit_insn (gen_strset (destptr, dest, value));
17164               dest = adjust_automodify_address_nv (destmem, SImode, destptr, offset + 4);
17165               emit_insn (gen_strset (destptr, dest, value));
17166             }
17167           offset += 8;
17168         }
17169       if ((countval & 0x04) && max_size > 4)
17170         {
17171           dest = adjust_automodify_address_nv (destmem, SImode, destptr, offset);
17172           emit_insn (gen_strset (destptr, dest, gen_lowpart (SImode, value)));
17173           offset += 4;
17174         }
17175       if ((countval & 0x02) && max_size > 2)
17176         {
17177           dest = adjust_automodify_address_nv (destmem, HImode, destptr, offset);
17178           emit_insn (gen_strset (destptr, dest, gen_lowpart (HImode, value)));
17179           offset += 2;
17180         }
17181       if ((countval & 0x01) && max_size > 1)
17182         {
17183           dest = adjust_automodify_address_nv (destmem, QImode, destptr, offset);
17184           emit_insn (gen_strset (destptr, dest, gen_lowpart (QImode, value)));
17185           offset += 1;
17186         }
17187       return;
17188     }
17189   if (max_size > 32)
17190     {
17191       expand_setmem_epilogue_via_loop (destmem, destptr, value, count, max_size);
17192       return;
17193     }
17194   if (max_size > 16)
17195     {
17196       rtx label = ix86_expand_aligntest (count, 16, true);
17197       if (TARGET_64BIT)
17198         {
17199           dest = change_address (destmem, DImode, destptr);
17200           emit_insn (gen_strset (destptr, dest, value));
17201           emit_insn (gen_strset (destptr, dest, value));
17202         }
17203       else
17204         {
17205           dest = change_address (destmem, SImode, destptr);
17206           emit_insn (gen_strset (destptr, dest, value));
17207           emit_insn (gen_strset (destptr, dest, value));
17208           emit_insn (gen_strset (destptr, dest, value));
17209           emit_insn (gen_strset (destptr, dest, value));
17210         }
17211       emit_label (label);
17212       LABEL_NUSES (label) = 1;
17213     }
17214   if (max_size > 8)
17215     {
17216       rtx label = ix86_expand_aligntest (count, 8, true);
17217       if (TARGET_64BIT)
17218         {
17219           dest = change_address (destmem, DImode, destptr);
17220           emit_insn (gen_strset (destptr, dest, value));
17221         }
17222       else
17223         {
17224           dest = change_address (destmem, SImode, destptr);
17225           emit_insn (gen_strset (destptr, dest, value));
17226           emit_insn (gen_strset (destptr, dest, value));
17227         }
17228       emit_label (label);
17229       LABEL_NUSES (label) = 1;
17230     }
17231   if (max_size > 4)
17232     {
17233       rtx label = ix86_expand_aligntest (count, 4, true);
17234       dest = change_address (destmem, SImode, destptr);
17235       emit_insn (gen_strset (destptr, dest, gen_lowpart (SImode, value)));
17236       emit_label (label);
17237       LABEL_NUSES (label) = 1;
17238     }
17239   if (max_size > 2)
17240     {
17241       rtx label = ix86_expand_aligntest (count, 2, true);
17242       dest = change_address (destmem, HImode, destptr);
17243       emit_insn (gen_strset (destptr, dest, gen_lowpart (HImode, value)));
17244       emit_label (label);
17245       LABEL_NUSES (label) = 1;
17246     }
17247   if (max_size > 1)
17248     {
17249       rtx label = ix86_expand_aligntest (count, 1, true);
17250       dest = change_address (destmem, QImode, destptr);
17251       emit_insn (gen_strset (destptr, dest, gen_lowpart (QImode, value)));
17252       emit_label (label);
17253       LABEL_NUSES (label) = 1;
17254     }
17255 }
17256
17257 /* Copy enough from DEST to SRC to align DEST known to by aligned by ALIGN to
17258    DESIRED_ALIGNMENT.  */
17259 static void
17260 expand_movmem_prologue (rtx destmem, rtx srcmem,
17261                         rtx destptr, rtx srcptr, rtx count,
17262                         int align, int desired_alignment)
17263 {
17264   if (align <= 1 && desired_alignment > 1)
17265     {
17266       rtx label = ix86_expand_aligntest (destptr, 1, false);
17267       srcmem = change_address (srcmem, QImode, srcptr);
17268       destmem = change_address (destmem, QImode, destptr);
17269       emit_insn (gen_strmov (destptr, destmem, srcptr, srcmem));
17270       ix86_adjust_counter (count, 1);
17271       emit_label (label);
17272       LABEL_NUSES (label) = 1;
17273     }
17274   if (align <= 2 && desired_alignment > 2)
17275     {
17276       rtx label = ix86_expand_aligntest (destptr, 2, false);
17277       srcmem = change_address (srcmem, HImode, srcptr);
17278       destmem = change_address (destmem, HImode, destptr);
17279       emit_insn (gen_strmov (destptr, destmem, srcptr, srcmem));
17280       ix86_adjust_counter (count, 2);
17281       emit_label (label);
17282       LABEL_NUSES (label) = 1;
17283     }
17284   if (align <= 4 && desired_alignment > 4)
17285     {
17286       rtx label = ix86_expand_aligntest (destptr, 4, false);
17287       srcmem = change_address (srcmem, SImode, srcptr);
17288       destmem = change_address (destmem, SImode, destptr);
17289       emit_insn (gen_strmov (destptr, destmem, srcptr, srcmem));
17290       ix86_adjust_counter (count, 4);
17291       emit_label (label);
17292       LABEL_NUSES (label) = 1;
17293     }
17294   gcc_assert (desired_alignment <= 8);
17295 }
17296
17297 /* Copy enough from DST to SRC to align DST known to DESIRED_ALIGN.
17298    ALIGN_BYTES is how many bytes need to be copied.  */
17299 static rtx
17300 expand_constant_movmem_prologue (rtx dst, rtx *srcp, rtx destreg, rtx srcreg,
17301                                  int desired_align, int align_bytes)
17302 {
17303   rtx src = *srcp;
17304   rtx src_size, dst_size;
17305   int off = 0;
17306   int src_align_bytes = get_mem_align_offset (src, desired_align * BITS_PER_UNIT);
17307   if (src_align_bytes >= 0)
17308     src_align_bytes = desired_align - src_align_bytes;
17309   src_size = MEM_SIZE (src);
17310   dst_size = MEM_SIZE (dst);
17311   if (align_bytes & 1)
17312     {
17313       dst = adjust_automodify_address_nv (dst, QImode, destreg, 0);
17314       src = adjust_automodify_address_nv (src, QImode, srcreg, 0);
17315       off = 1;
17316       emit_insn (gen_strmov (destreg, dst, srcreg, src));
17317     }
17318   if (align_bytes & 2)
17319     {
17320       dst = adjust_automodify_address_nv (dst, HImode, destreg, off);
17321       src = adjust_automodify_address_nv (src, HImode, srcreg, off);
17322       if (MEM_ALIGN (dst) < 2 * BITS_PER_UNIT)
17323         set_mem_align (dst, 2 * BITS_PER_UNIT);
17324       if (src_align_bytes >= 0
17325           && (src_align_bytes & 1) == (align_bytes & 1)
17326           && MEM_ALIGN (src) < 2 * BITS_PER_UNIT)
17327         set_mem_align (src, 2 * BITS_PER_UNIT);
17328       off = 2;
17329       emit_insn (gen_strmov (destreg, dst, srcreg, src));
17330     }
17331   if (align_bytes & 4)
17332     {
17333       dst = adjust_automodify_address_nv (dst, SImode, destreg, off);
17334       src = adjust_automodify_address_nv (src, SImode, srcreg, off);
17335       if (MEM_ALIGN (dst) < 4 * BITS_PER_UNIT)
17336         set_mem_align (dst, 4 * BITS_PER_UNIT);
17337       if (src_align_bytes >= 0)
17338         {
17339           unsigned int src_align = 0;
17340           if ((src_align_bytes & 3) == (align_bytes & 3))
17341             src_align = 4;
17342           else if ((src_align_bytes & 1) == (align_bytes & 1))
17343             src_align = 2;
17344           if (MEM_ALIGN (src) < src_align * BITS_PER_UNIT)
17345             set_mem_align (src, src_align * BITS_PER_UNIT);
17346         }
17347       off = 4;
17348       emit_insn (gen_strmov (destreg, dst, srcreg, src));
17349     }
17350   dst = adjust_automodify_address_nv (dst, BLKmode, destreg, off);
17351   src = adjust_automodify_address_nv (src, BLKmode, srcreg, off);
17352   if (MEM_ALIGN (dst) < (unsigned int) desired_align * BITS_PER_UNIT)
17353     set_mem_align (dst, desired_align * BITS_PER_UNIT);
17354   if (src_align_bytes >= 0)
17355     {
17356       unsigned int src_align = 0;
17357       if ((src_align_bytes & 7) == (align_bytes & 7))
17358         src_align = 8;
17359       else if ((src_align_bytes & 3) == (align_bytes & 3))
17360         src_align = 4;
17361       else if ((src_align_bytes & 1) == (align_bytes & 1))
17362         src_align = 2;
17363       if (src_align > (unsigned int) desired_align)
17364         src_align = desired_align;
17365       if (MEM_ALIGN (src) < src_align * BITS_PER_UNIT)
17366         set_mem_align (src, src_align * BITS_PER_UNIT);
17367     }
17368   if (dst_size)
17369     set_mem_size (dst, GEN_INT (INTVAL (dst_size) - align_bytes));
17370   if (src_size)
17371     set_mem_size (dst, GEN_INT (INTVAL (src_size) - align_bytes));
17372   *srcp = src;
17373   return dst;
17374 }
17375
17376 /* Set enough from DEST to align DEST known to by aligned by ALIGN to
17377    DESIRED_ALIGNMENT.  */
17378 static void
17379 expand_setmem_prologue (rtx destmem, rtx destptr, rtx value, rtx count,
17380                         int align, int desired_alignment)
17381 {
17382   if (align <= 1 && desired_alignment > 1)
17383     {
17384       rtx label = ix86_expand_aligntest (destptr, 1, false);
17385       destmem = change_address (destmem, QImode, destptr);
17386       emit_insn (gen_strset (destptr, destmem, gen_lowpart (QImode, value)));
17387       ix86_adjust_counter (count, 1);
17388       emit_label (label);
17389       LABEL_NUSES (label) = 1;
17390     }
17391   if (align <= 2 && desired_alignment > 2)
17392     {
17393       rtx label = ix86_expand_aligntest (destptr, 2, false);
17394       destmem = change_address (destmem, HImode, destptr);
17395       emit_insn (gen_strset (destptr, destmem, gen_lowpart (HImode, value)));
17396       ix86_adjust_counter (count, 2);
17397       emit_label (label);
17398       LABEL_NUSES (label) = 1;
17399     }
17400   if (align <= 4 && desired_alignment > 4)
17401     {
17402       rtx label = ix86_expand_aligntest (destptr, 4, false);
17403       destmem = change_address (destmem, SImode, destptr);
17404       emit_insn (gen_strset (destptr, destmem, gen_lowpart (SImode, value)));
17405       ix86_adjust_counter (count, 4);
17406       emit_label (label);
17407       LABEL_NUSES (label) = 1;
17408     }
17409   gcc_assert (desired_alignment <= 8);
17410 }
17411
17412 /* Set enough from DST to align DST known to by aligned by ALIGN to
17413    DESIRED_ALIGN.  ALIGN_BYTES is how many bytes need to be stored.  */
17414 static rtx
17415 expand_constant_setmem_prologue (rtx dst, rtx destreg, rtx value,
17416                                  int desired_align, int align_bytes)
17417 {
17418   int off = 0;
17419   rtx dst_size = MEM_SIZE (dst);
17420   if (align_bytes & 1)
17421     {
17422       dst = adjust_automodify_address_nv (dst, QImode, destreg, 0);
17423       off = 1;
17424       emit_insn (gen_strset (destreg, dst,
17425                              gen_lowpart (QImode, value)));
17426     }
17427   if (align_bytes & 2)
17428     {
17429       dst = adjust_automodify_address_nv (dst, HImode, destreg, off);
17430       if (MEM_ALIGN (dst) < 2 * BITS_PER_UNIT)
17431         set_mem_align (dst, 2 * BITS_PER_UNIT);
17432       off = 2;
17433       emit_insn (gen_strset (destreg, dst,
17434                              gen_lowpart (HImode, value)));
17435     }
17436   if (align_bytes & 4)
17437     {
17438       dst = adjust_automodify_address_nv (dst, SImode, destreg, off);
17439       if (MEM_ALIGN (dst) < 4 * BITS_PER_UNIT)
17440         set_mem_align (dst, 4 * BITS_PER_UNIT);
17441       off = 4;
17442       emit_insn (gen_strset (destreg, dst,
17443                              gen_lowpart (SImode, value)));
17444     }
17445   dst = adjust_automodify_address_nv (dst, BLKmode, destreg, off);
17446   if (MEM_ALIGN (dst) < (unsigned int) desired_align * BITS_PER_UNIT)
17447     set_mem_align (dst, desired_align * BITS_PER_UNIT);
17448   if (dst_size)
17449     set_mem_size (dst, GEN_INT (INTVAL (dst_size) - align_bytes));
17450   return dst;
17451 }
17452
17453 /* Given COUNT and EXPECTED_SIZE, decide on codegen of string operation.  */
17454 static enum stringop_alg
17455 decide_alg (HOST_WIDE_INT count, HOST_WIDE_INT expected_size, bool memset,
17456             int *dynamic_check)
17457 {
17458   const struct stringop_algs * algs;
17459   bool optimize_for_speed;
17460   /* Algorithms using the rep prefix want at least edi and ecx;
17461      additionally, memset wants eax and memcpy wants esi.  Don't
17462      consider such algorithms if the user has appropriated those
17463      registers for their own purposes.  */
17464   bool rep_prefix_usable = !(fixed_regs[CX_REG] || fixed_regs[DI_REG]
17465                              || (memset
17466                                  ? fixed_regs[AX_REG] : fixed_regs[SI_REG]));
17467
17468 #define ALG_USABLE_P(alg) (rep_prefix_usable                    \
17469                            || (alg != rep_prefix_1_byte         \
17470                                && alg != rep_prefix_4_byte      \
17471                                && alg != rep_prefix_8_byte))
17472   const struct processor_costs *cost;
17473   
17474   /* Even if the string operation call is cold, we still might spend a lot
17475      of time processing large blocks.  */
17476   if (optimize_function_for_size_p (cfun)
17477       || (optimize_insn_for_size_p ()
17478           && expected_size != -1 && expected_size < 256))
17479     optimize_for_speed = false;
17480   else
17481     optimize_for_speed = true;
17482
17483   cost = optimize_for_speed ? ix86_cost : &ix86_size_cost;
17484
17485   *dynamic_check = -1;
17486   if (memset)
17487     algs = &cost->memset[TARGET_64BIT != 0];
17488   else
17489     algs = &cost->memcpy[TARGET_64BIT != 0];
17490   if (stringop_alg != no_stringop && ALG_USABLE_P (stringop_alg))
17491     return stringop_alg;
17492   /* rep; movq or rep; movl is the smallest variant.  */
17493   else if (!optimize_for_speed)
17494     {
17495       if (!count || (count & 3))
17496         return rep_prefix_usable ? rep_prefix_1_byte : loop_1_byte;
17497       else
17498         return rep_prefix_usable ? rep_prefix_4_byte : loop;
17499     }
17500   /* Very tiny blocks are best handled via the loop, REP is expensive to setup.
17501    */
17502   else if (expected_size != -1 && expected_size < 4)
17503     return loop_1_byte;
17504   else if (expected_size != -1)
17505     {
17506       unsigned int i;
17507       enum stringop_alg alg = libcall;
17508       for (i = 0; i < NAX_STRINGOP_ALGS; i++)
17509         {
17510           /* We get here if the algorithms that were not libcall-based
17511              were rep-prefix based and we are unable to use rep prefixes
17512              based on global register usage.  Break out of the loop and
17513              use the heuristic below.  */
17514           if (algs->size[i].max == 0)
17515             break;
17516           if (algs->size[i].max >= expected_size || algs->size[i].max == -1)
17517             {
17518               enum stringop_alg candidate = algs->size[i].alg;
17519
17520               if (candidate != libcall && ALG_USABLE_P (candidate))
17521                 alg = candidate;
17522               /* Honor TARGET_INLINE_ALL_STRINGOPS by picking
17523                  last non-libcall inline algorithm.  */
17524               if (TARGET_INLINE_ALL_STRINGOPS)
17525                 {
17526                   /* When the current size is best to be copied by a libcall,
17527                      but we are still forced to inline, run the heuristic below
17528                      that will pick code for medium sized blocks.  */
17529                   if (alg != libcall)
17530                     return alg;
17531                   break;
17532                 }
17533               else if (ALG_USABLE_P (candidate))
17534                 return candidate;
17535             }
17536         }
17537       gcc_assert (TARGET_INLINE_ALL_STRINGOPS || !rep_prefix_usable);
17538     }
17539   /* When asked to inline the call anyway, try to pick meaningful choice.
17540      We look for maximal size of block that is faster to copy by hand and
17541      take blocks of at most of that size guessing that average size will
17542      be roughly half of the block.
17543
17544      If this turns out to be bad, we might simply specify the preferred
17545      choice in ix86_costs.  */
17546   if ((TARGET_INLINE_ALL_STRINGOPS || TARGET_INLINE_STRINGOPS_DYNAMICALLY)
17547       && (algs->unknown_size == libcall || !ALG_USABLE_P (algs->unknown_size)))
17548     {
17549       int max = -1;
17550       enum stringop_alg alg;
17551       int i;
17552       bool any_alg_usable_p = true;
17553
17554       for (i = 0; i < NAX_STRINGOP_ALGS; i++)
17555         {
17556           enum stringop_alg candidate = algs->size[i].alg;
17557           any_alg_usable_p = any_alg_usable_p && ALG_USABLE_P (candidate);
17558
17559           if (candidate != libcall && candidate
17560               && ALG_USABLE_P (candidate))
17561               max = algs->size[i].max;
17562         }
17563       /* If there aren't any usable algorithms, then recursing on
17564          smaller sizes isn't going to find anything.  Just return the
17565          simple byte-at-a-time copy loop.  */
17566       if (!any_alg_usable_p)
17567         {
17568           /* Pick something reasonable.  */
17569           if (TARGET_INLINE_STRINGOPS_DYNAMICALLY)
17570             *dynamic_check = 128;
17571           return loop_1_byte;
17572         }
17573       if (max == -1)
17574         max = 4096;
17575       alg = decide_alg (count, max / 2, memset, dynamic_check);
17576       gcc_assert (*dynamic_check == -1);
17577       gcc_assert (alg != libcall);
17578       if (TARGET_INLINE_STRINGOPS_DYNAMICALLY)
17579         *dynamic_check = max;
17580       return alg;
17581     }
17582   return ALG_USABLE_P (algs->unknown_size) ? algs->unknown_size : libcall;
17583 #undef ALG_USABLE_P
17584 }
17585
17586 /* Decide on alignment.  We know that the operand is already aligned to ALIGN
17587    (ALIGN can be based on profile feedback and thus it is not 100% guaranteed).  */
17588 static int
17589 decide_alignment (int align,
17590                   enum stringop_alg alg,
17591                   int expected_size)
17592 {
17593   int desired_align = 0;
17594   switch (alg)
17595     {
17596       case no_stringop:
17597         gcc_unreachable ();
17598       case loop:
17599       case unrolled_loop:
17600         desired_align = GET_MODE_SIZE (Pmode);
17601         break;
17602       case rep_prefix_8_byte:
17603         desired_align = 8;
17604         break;
17605       case rep_prefix_4_byte:
17606         /* PentiumPro has special logic triggering for 8 byte aligned blocks.
17607            copying whole cacheline at once.  */
17608         if (TARGET_PENTIUMPRO)
17609           desired_align = 8;
17610         else
17611           desired_align = 4;
17612         break;
17613       case rep_prefix_1_byte:
17614         /* PentiumPro has special logic triggering for 8 byte aligned blocks.
17615            copying whole cacheline at once.  */
17616         if (TARGET_PENTIUMPRO)
17617           desired_align = 8;
17618         else
17619           desired_align = 1;
17620         break;
17621       case loop_1_byte:
17622         desired_align = 1;
17623         break;
17624       case libcall:
17625         return 0;
17626     }
17627
17628   if (optimize_size)
17629     desired_align = 1;
17630   if (desired_align < align)
17631     desired_align = align;
17632   if (expected_size != -1 && expected_size < 4)
17633     desired_align = align;
17634   return desired_align;
17635 }
17636
17637 /* Return the smallest power of 2 greater than VAL.  */
17638 static int
17639 smallest_pow2_greater_than (int val)
17640 {
17641   int ret = 1;
17642   while (ret <= val)
17643     ret <<= 1;
17644   return ret;
17645 }
17646
17647 /* Expand string move (memcpy) operation.  Use i386 string operations when
17648    profitable.  expand_setmem contains similar code.  The code depends upon
17649    architecture, block size and alignment, but always has the same
17650    overall structure:
17651
17652    1) Prologue guard: Conditional that jumps up to epilogues for small
17653       blocks that can be handled by epilogue alone.  This is faster but
17654       also needed for correctness, since prologue assume the block is larger
17655       than the desired alignment.
17656
17657       Optional dynamic check for size and libcall for large
17658       blocks is emitted here too, with -minline-stringops-dynamically.
17659
17660    2) Prologue: copy first few bytes in order to get destination aligned
17661       to DESIRED_ALIGN.  It is emitted only when ALIGN is less than
17662       DESIRED_ALIGN and and up to DESIRED_ALIGN - ALIGN bytes can be copied.
17663       We emit either a jump tree on power of two sized blocks, or a byte loop.
17664
17665    3) Main body: the copying loop itself, copying in SIZE_NEEDED chunks
17666       with specified algorithm.
17667
17668    4) Epilogue: code copying tail of the block that is too small to be
17669       handled by main body (or up to size guarded by prologue guard).  */
17670
17671 int
17672 ix86_expand_movmem (rtx dst, rtx src, rtx count_exp, rtx align_exp,
17673                     rtx expected_align_exp, rtx expected_size_exp)
17674 {
17675   rtx destreg;
17676   rtx srcreg;
17677   rtx label = NULL;
17678   rtx tmp;
17679   rtx jump_around_label = NULL;
17680   HOST_WIDE_INT align = 1;
17681   unsigned HOST_WIDE_INT count = 0;
17682   HOST_WIDE_INT expected_size = -1;
17683   int size_needed = 0, epilogue_size_needed;
17684   int desired_align = 0, align_bytes = 0;
17685   enum stringop_alg alg;
17686   int dynamic_check;
17687   bool need_zero_guard = false;
17688
17689   if (CONST_INT_P (align_exp))
17690     align = INTVAL (align_exp);
17691   /* i386 can do misaligned access on reasonably increased cost.  */
17692   if (CONST_INT_P (expected_align_exp)
17693       && INTVAL (expected_align_exp) > align)
17694     align = INTVAL (expected_align_exp);
17695   /* ALIGN is the minimum of destination and source alignment, but we care here
17696      just about destination alignment.  */
17697   else if (MEM_ALIGN (dst) > (unsigned HOST_WIDE_INT) align * BITS_PER_UNIT)
17698     align = MEM_ALIGN (dst) / BITS_PER_UNIT;
17699
17700   if (CONST_INT_P (count_exp))
17701     count = expected_size = INTVAL (count_exp);
17702   if (CONST_INT_P (expected_size_exp) && count == 0)
17703     expected_size = INTVAL (expected_size_exp);
17704
17705   /* Make sure we don't need to care about overflow later on.  */
17706   if (count > ((unsigned HOST_WIDE_INT) 1 << 30))
17707     return 0;
17708
17709   /* Step 0: Decide on preferred algorithm, desired alignment and
17710      size of chunks to be copied by main loop.  */
17711
17712   alg = decide_alg (count, expected_size, false, &dynamic_check);
17713   desired_align = decide_alignment (align, alg, expected_size);
17714
17715   if (!TARGET_ALIGN_STRINGOPS)
17716     align = desired_align;
17717
17718   if (alg == libcall)
17719     return 0;
17720   gcc_assert (alg != no_stringop);
17721   if (!count)
17722     count_exp = copy_to_mode_reg (GET_MODE (count_exp), count_exp);
17723   destreg = copy_to_mode_reg (Pmode, XEXP (dst, 0));
17724   srcreg = copy_to_mode_reg (Pmode, XEXP (src, 0));
17725   switch (alg)
17726     {
17727     case libcall:
17728     case no_stringop:
17729       gcc_unreachable ();
17730     case loop:
17731       need_zero_guard = true;
17732       size_needed = GET_MODE_SIZE (Pmode);
17733       break;
17734     case unrolled_loop:
17735       need_zero_guard = true;
17736       size_needed = GET_MODE_SIZE (Pmode) * (TARGET_64BIT ? 4 : 2);
17737       break;
17738     case rep_prefix_8_byte:
17739       size_needed = 8;
17740       break;
17741     case rep_prefix_4_byte:
17742       size_needed = 4;
17743       break;
17744     case rep_prefix_1_byte:
17745       size_needed = 1;
17746       break;
17747     case loop_1_byte:
17748       need_zero_guard = true;
17749       size_needed = 1;
17750       break;
17751     }
17752
17753   epilogue_size_needed = size_needed;
17754
17755   /* Step 1: Prologue guard.  */
17756
17757   /* Alignment code needs count to be in register.  */
17758   if (CONST_INT_P (count_exp) && desired_align > align)
17759     {
17760       if (INTVAL (count_exp) > desired_align
17761           && INTVAL (count_exp) > size_needed)
17762         {
17763           align_bytes
17764             = get_mem_align_offset (dst, desired_align * BITS_PER_UNIT);
17765           if (align_bytes <= 0)
17766             align_bytes = 0;
17767           else
17768             align_bytes = desired_align - align_bytes;
17769         }
17770       if (align_bytes == 0)
17771         count_exp = force_reg (counter_mode (count_exp), count_exp);
17772     }
17773   gcc_assert (desired_align >= 1 && align >= 1);
17774
17775   /* Ensure that alignment prologue won't copy past end of block.  */
17776   if (size_needed > 1 || (desired_align > 1 && desired_align > align))
17777     {
17778       epilogue_size_needed = MAX (size_needed - 1, desired_align - align);
17779       /* Epilogue always copies COUNT_EXP & EPILOGUE_SIZE_NEEDED bytes.
17780          Make sure it is power of 2.  */
17781       epilogue_size_needed = smallest_pow2_greater_than (epilogue_size_needed);
17782
17783       if (count)
17784         {
17785           if (count < (unsigned HOST_WIDE_INT)epilogue_size_needed)
17786             {
17787               /* If main algorithm works on QImode, no epilogue is needed.
17788                  For small sizes just don't align anything.  */
17789               if (size_needed == 1)
17790                 desired_align = align;
17791               else
17792                 goto epilogue;
17793             }
17794         }
17795       else
17796         {
17797           label = gen_label_rtx ();
17798           emit_cmp_and_jump_insns (count_exp,
17799                                    GEN_INT (epilogue_size_needed),
17800                                    LTU, 0, counter_mode (count_exp), 1, label);
17801           if (expected_size == -1 || expected_size < epilogue_size_needed)
17802             predict_jump (REG_BR_PROB_BASE * 60 / 100);
17803           else
17804             predict_jump (REG_BR_PROB_BASE * 20 / 100);
17805         }
17806     }
17807
17808   /* Emit code to decide on runtime whether library call or inline should be
17809      used.  */
17810   if (dynamic_check != -1)
17811     {
17812       if (CONST_INT_P (count_exp))
17813         {
17814           if (UINTVAL (count_exp) >= (unsigned HOST_WIDE_INT)dynamic_check)
17815             {
17816               emit_block_move_via_libcall (dst, src, count_exp, false);
17817               count_exp = const0_rtx;
17818               goto epilogue;
17819             }
17820         }
17821       else
17822         {
17823           rtx hot_label = gen_label_rtx ();
17824           jump_around_label = gen_label_rtx ();
17825           emit_cmp_and_jump_insns (count_exp, GEN_INT (dynamic_check - 1),
17826                                    LEU, 0, GET_MODE (count_exp), 1, hot_label);
17827           predict_jump (REG_BR_PROB_BASE * 90 / 100);
17828           emit_block_move_via_libcall (dst, src, count_exp, false);
17829           emit_jump (jump_around_label);
17830           emit_label (hot_label);
17831         }
17832     }
17833
17834   /* Step 2: Alignment prologue.  */
17835
17836   if (desired_align > align)
17837     {
17838       if (align_bytes == 0)
17839         {
17840           /* Except for the first move in epilogue, we no longer know
17841              constant offset in aliasing info.  It don't seems to worth
17842              the pain to maintain it for the first move, so throw away
17843              the info early.  */
17844           src = change_address (src, BLKmode, srcreg);
17845           dst = change_address (dst, BLKmode, destreg);
17846           expand_movmem_prologue (dst, src, destreg, srcreg, count_exp, align,
17847                                   desired_align);
17848         }
17849       else
17850         {
17851           /* If we know how many bytes need to be stored before dst is
17852              sufficiently aligned, maintain aliasing info accurately.  */
17853           dst = expand_constant_movmem_prologue (dst, &src, destreg, srcreg,
17854                                                  desired_align, align_bytes);
17855           count_exp = plus_constant (count_exp, -align_bytes);
17856           count -= align_bytes;
17857         }
17858       if (need_zero_guard
17859           && (count < (unsigned HOST_WIDE_INT) size_needed
17860               || (align_bytes == 0
17861                   && count < ((unsigned HOST_WIDE_INT) size_needed
17862                               + desired_align - align))))
17863         {
17864           /* It is possible that we copied enough so the main loop will not
17865              execute.  */
17866           gcc_assert (size_needed > 1);
17867           if (label == NULL_RTX)
17868             label = gen_label_rtx ();
17869           emit_cmp_and_jump_insns (count_exp,
17870                                    GEN_INT (size_needed),
17871                                    LTU, 0, counter_mode (count_exp), 1, label);
17872           if (expected_size == -1
17873               || expected_size < (desired_align - align) / 2 + size_needed)
17874             predict_jump (REG_BR_PROB_BASE * 20 / 100);
17875           else
17876             predict_jump (REG_BR_PROB_BASE * 60 / 100);
17877         }
17878     }
17879   if (label && size_needed == 1)
17880     {
17881       emit_label (label);
17882       LABEL_NUSES (label) = 1;
17883       label = NULL;
17884       epilogue_size_needed = 1;
17885     }
17886   else if (label == NULL_RTX)
17887     epilogue_size_needed = size_needed;
17888
17889   /* Step 3: Main loop.  */
17890
17891   switch (alg)
17892     {
17893     case libcall:
17894     case no_stringop:
17895       gcc_unreachable ();
17896     case loop_1_byte:
17897       expand_set_or_movmem_via_loop (dst, src, destreg, srcreg, NULL,
17898                                      count_exp, QImode, 1, expected_size);
17899       break;
17900     case loop:
17901       expand_set_or_movmem_via_loop (dst, src, destreg, srcreg, NULL,
17902                                      count_exp, Pmode, 1, expected_size);
17903       break;
17904     case unrolled_loop:
17905       /* Unroll only by factor of 2 in 32bit mode, since we don't have enough
17906          registers for 4 temporaries anyway.  */
17907       expand_set_or_movmem_via_loop (dst, src, destreg, srcreg, NULL,
17908                                      count_exp, Pmode, TARGET_64BIT ? 4 : 2,
17909                                      expected_size);
17910       break;
17911     case rep_prefix_8_byte:
17912       expand_movmem_via_rep_mov (dst, src, destreg, srcreg, count_exp,
17913                                  DImode);
17914       break;
17915     case rep_prefix_4_byte:
17916       expand_movmem_via_rep_mov (dst, src, destreg, srcreg, count_exp,
17917                                  SImode);
17918       break;
17919     case rep_prefix_1_byte:
17920       expand_movmem_via_rep_mov (dst, src, destreg, srcreg, count_exp,
17921                                  QImode);
17922       break;
17923     }
17924   /* Adjust properly the offset of src and dest memory for aliasing.  */
17925   if (CONST_INT_P (count_exp))
17926     {
17927       src = adjust_automodify_address_nv (src, BLKmode, srcreg,
17928                                           (count / size_needed) * size_needed);
17929       dst = adjust_automodify_address_nv (dst, BLKmode, destreg,
17930                                           (count / size_needed) * size_needed);
17931     }
17932   else
17933     {
17934       src = change_address (src, BLKmode, srcreg);
17935       dst = change_address (dst, BLKmode, destreg);
17936     }
17937
17938   /* Step 4: Epilogue to copy the remaining bytes.  */
17939  epilogue:
17940   if (label)
17941     {
17942       /* When the main loop is done, COUNT_EXP might hold original count,
17943          while we want to copy only COUNT_EXP & SIZE_NEEDED bytes.
17944          Epilogue code will actually copy COUNT_EXP & EPILOGUE_SIZE_NEEDED
17945          bytes. Compensate if needed.  */
17946
17947       if (size_needed < epilogue_size_needed)
17948         {
17949           tmp =
17950             expand_simple_binop (counter_mode (count_exp), AND, count_exp,
17951                                  GEN_INT (size_needed - 1), count_exp, 1,
17952                                  OPTAB_DIRECT);
17953           if (tmp != count_exp)
17954             emit_move_insn (count_exp, tmp);
17955         }
17956       emit_label (label);
17957       LABEL_NUSES (label) = 1;
17958     }
17959
17960   if (count_exp != const0_rtx && epilogue_size_needed > 1)
17961     expand_movmem_epilogue (dst, src, destreg, srcreg, count_exp,
17962                             epilogue_size_needed);
17963   if (jump_around_label)
17964     emit_label (jump_around_label);
17965   return 1;
17966 }
17967
17968 /* Helper function for memcpy.  For QImode value 0xXY produce
17969    0xXYXYXYXY of wide specified by MODE.  This is essentially
17970    a * 0x10101010, but we can do slightly better than
17971    synth_mult by unwinding the sequence by hand on CPUs with
17972    slow multiply.  */
17973 static rtx
17974 promote_duplicated_reg (enum machine_mode mode, rtx val)
17975 {
17976   enum machine_mode valmode = GET_MODE (val);
17977   rtx tmp;
17978   int nops = mode == DImode ? 3 : 2;
17979
17980   gcc_assert (mode == SImode || mode == DImode);
17981   if (val == const0_rtx)
17982     return copy_to_mode_reg (mode, const0_rtx);
17983   if (CONST_INT_P (val))
17984     {
17985       HOST_WIDE_INT v = INTVAL (val) & 255;
17986
17987       v |= v << 8;
17988       v |= v << 16;
17989       if (mode == DImode)
17990         v |= (v << 16) << 16;
17991       return copy_to_mode_reg (mode, gen_int_mode (v, mode));
17992     }
17993
17994   if (valmode == VOIDmode)
17995     valmode = QImode;
17996   if (valmode != QImode)
17997     val = gen_lowpart (QImode, val);
17998   if (mode == QImode)
17999     return val;
18000   if (!TARGET_PARTIAL_REG_STALL)
18001     nops--;
18002   if (ix86_cost->mult_init[mode == DImode ? 3 : 2]
18003       + ix86_cost->mult_bit * (mode == DImode ? 8 : 4)
18004       <= (ix86_cost->shift_const + ix86_cost->add) * nops
18005           + (COSTS_N_INSNS (TARGET_PARTIAL_REG_STALL == 0)))
18006     {
18007       rtx reg = convert_modes (mode, QImode, val, true);
18008       tmp = promote_duplicated_reg (mode, const1_rtx);
18009       return expand_simple_binop (mode, MULT, reg, tmp, NULL, 1,
18010                                   OPTAB_DIRECT);
18011     }
18012   else
18013     {
18014       rtx reg = convert_modes (mode, QImode, val, true);
18015
18016       if (!TARGET_PARTIAL_REG_STALL)
18017         if (mode == SImode)
18018           emit_insn (gen_movsi_insv_1 (reg, reg));
18019         else
18020           emit_insn (gen_movdi_insv_1_rex64 (reg, reg));
18021       else
18022         {
18023           tmp = expand_simple_binop (mode, ASHIFT, reg, GEN_INT (8),
18024                                      NULL, 1, OPTAB_DIRECT);
18025           reg =
18026             expand_simple_binop (mode, IOR, reg, tmp, reg, 1, OPTAB_DIRECT);
18027         }
18028       tmp = expand_simple_binop (mode, ASHIFT, reg, GEN_INT (16),
18029                                  NULL, 1, OPTAB_DIRECT);
18030       reg = expand_simple_binop (mode, IOR, reg, tmp, reg, 1, OPTAB_DIRECT);
18031       if (mode == SImode)
18032         return reg;
18033       tmp = expand_simple_binop (mode, ASHIFT, reg, GEN_INT (32),
18034                                  NULL, 1, OPTAB_DIRECT);
18035       reg = expand_simple_binop (mode, IOR, reg, tmp, reg, 1, OPTAB_DIRECT);
18036       return reg;
18037     }
18038 }
18039
18040 /* Duplicate value VAL using promote_duplicated_reg into maximal size that will
18041    be needed by main loop copying SIZE_NEEDED chunks and prologue getting
18042    alignment from ALIGN to DESIRED_ALIGN.  */
18043 static rtx
18044 promote_duplicated_reg_to_size (rtx val, int size_needed, int desired_align, int align)
18045 {
18046   rtx promoted_val;
18047
18048   if (TARGET_64BIT
18049       && (size_needed > 4 || (desired_align > align && desired_align > 4)))
18050     promoted_val = promote_duplicated_reg (DImode, val);
18051   else if (size_needed > 2 || (desired_align > align && desired_align > 2))
18052     promoted_val = promote_duplicated_reg (SImode, val);
18053   else if (size_needed > 1 || (desired_align > align && desired_align > 1))
18054     promoted_val = promote_duplicated_reg (HImode, val);
18055   else
18056     promoted_val = val;
18057
18058   return promoted_val;
18059 }
18060
18061 /* Expand string clear operation (bzero).  Use i386 string operations when
18062    profitable.  See expand_movmem comment for explanation of individual
18063    steps performed.  */
18064 int
18065 ix86_expand_setmem (rtx dst, rtx count_exp, rtx val_exp, rtx align_exp,
18066                     rtx expected_align_exp, rtx expected_size_exp)
18067 {
18068   rtx destreg;
18069   rtx label = NULL;
18070   rtx tmp;
18071   rtx jump_around_label = NULL;
18072   HOST_WIDE_INT align = 1;
18073   unsigned HOST_WIDE_INT count = 0;
18074   HOST_WIDE_INT expected_size = -1;
18075   int size_needed = 0, epilogue_size_needed;
18076   int desired_align = 0, align_bytes = 0;
18077   enum stringop_alg alg;
18078   rtx promoted_val = NULL;
18079   bool force_loopy_epilogue = false;
18080   int dynamic_check;
18081   bool need_zero_guard = false;
18082
18083   if (CONST_INT_P (align_exp))
18084     align = INTVAL (align_exp);
18085   /* i386 can do misaligned access on reasonably increased cost.  */
18086   if (CONST_INT_P (expected_align_exp)
18087       && INTVAL (expected_align_exp) > align)
18088     align = INTVAL (expected_align_exp);
18089   if (CONST_INT_P (count_exp))
18090     count = expected_size = INTVAL (count_exp);
18091   if (CONST_INT_P (expected_size_exp) && count == 0)
18092     expected_size = INTVAL (expected_size_exp);
18093
18094   /* Make sure we don't need to care about overflow later on.  */
18095   if (count > ((unsigned HOST_WIDE_INT) 1 << 30))
18096     return 0;
18097
18098   /* Step 0: Decide on preferred algorithm, desired alignment and
18099      size of chunks to be copied by main loop.  */
18100
18101   alg = decide_alg (count, expected_size, true, &dynamic_check);
18102   desired_align = decide_alignment (align, alg, expected_size);
18103
18104   if (!TARGET_ALIGN_STRINGOPS)
18105     align = desired_align;
18106
18107   if (alg == libcall)
18108     return 0;
18109   gcc_assert (alg != no_stringop);
18110   if (!count)
18111     count_exp = copy_to_mode_reg (counter_mode (count_exp), count_exp);
18112   destreg = copy_to_mode_reg (Pmode, XEXP (dst, 0));
18113   switch (alg)
18114     {
18115     case libcall:
18116     case no_stringop:
18117       gcc_unreachable ();
18118     case loop:
18119       need_zero_guard = true;
18120       size_needed = GET_MODE_SIZE (Pmode);
18121       break;
18122     case unrolled_loop:
18123       need_zero_guard = true;
18124       size_needed = GET_MODE_SIZE (Pmode) * 4;
18125       break;
18126     case rep_prefix_8_byte:
18127       size_needed = 8;
18128       break;
18129     case rep_prefix_4_byte:
18130       size_needed = 4;
18131       break;
18132     case rep_prefix_1_byte:
18133       size_needed = 1;
18134       break;
18135     case loop_1_byte:
18136       need_zero_guard = true;
18137       size_needed = 1;
18138       break;
18139     }
18140   epilogue_size_needed = size_needed;
18141
18142   /* Step 1: Prologue guard.  */
18143
18144   /* Alignment code needs count to be in register.  */
18145   if (CONST_INT_P (count_exp) && desired_align > align)
18146     {
18147       if (INTVAL (count_exp) > desired_align
18148           && INTVAL (count_exp) > size_needed)
18149         {
18150           align_bytes
18151             = get_mem_align_offset (dst, desired_align * BITS_PER_UNIT);
18152           if (align_bytes <= 0)
18153             align_bytes = 0;
18154           else
18155             align_bytes = desired_align - align_bytes;
18156         }
18157       if (align_bytes == 0)
18158         {
18159           enum machine_mode mode = SImode;
18160           if (TARGET_64BIT && (count & ~0xffffffff))
18161             mode = DImode;
18162           count_exp = force_reg (mode, count_exp);
18163         }
18164     }
18165   /* Do the cheap promotion to allow better CSE across the
18166      main loop and epilogue (ie one load of the big constant in the
18167      front of all code.  */
18168   if (CONST_INT_P (val_exp))
18169     promoted_val = promote_duplicated_reg_to_size (val_exp, size_needed,
18170                                                    desired_align, align);
18171   /* Ensure that alignment prologue won't copy past end of block.  */
18172   if (size_needed > 1 || (desired_align > 1 && desired_align > align))
18173     {
18174       epilogue_size_needed = MAX (size_needed - 1, desired_align - align);
18175       /* Epilogue always copies COUNT_EXP & (EPILOGUE_SIZE_NEEDED - 1) bytes.
18176          Make sure it is power of 2.  */
18177       epilogue_size_needed = smallest_pow2_greater_than (epilogue_size_needed);
18178
18179       /* To improve performance of small blocks, we jump around the VAL
18180          promoting mode.  This mean that if the promoted VAL is not constant,
18181          we might not use it in the epilogue and have to use byte
18182          loop variant.  */
18183       if (epilogue_size_needed > 2 && !promoted_val)
18184         force_loopy_epilogue = true;
18185       if (count)
18186         {
18187           if (count < (unsigned HOST_WIDE_INT)epilogue_size_needed)
18188             {
18189               /* If main algorithm works on QImode, no epilogue is needed.
18190                  For small sizes just don't align anything.  */
18191               if (size_needed == 1)
18192                 desired_align = align;
18193               else
18194                 goto epilogue;
18195             }
18196         }
18197       else
18198         {
18199           label = gen_label_rtx ();
18200           emit_cmp_and_jump_insns (count_exp,
18201                                    GEN_INT (epilogue_size_needed),
18202                                    LTU, 0, counter_mode (count_exp), 1, label);
18203           if (expected_size == -1 || expected_size <= epilogue_size_needed)
18204             predict_jump (REG_BR_PROB_BASE * 60 / 100);
18205           else
18206             predict_jump (REG_BR_PROB_BASE * 20 / 100);
18207         }
18208     }
18209   if (dynamic_check != -1)
18210     {
18211       rtx hot_label = gen_label_rtx ();
18212       jump_around_label = gen_label_rtx ();
18213       emit_cmp_and_jump_insns (count_exp, GEN_INT (dynamic_check - 1),
18214                                LEU, 0, counter_mode (count_exp), 1, hot_label);
18215       predict_jump (REG_BR_PROB_BASE * 90 / 100);
18216       set_storage_via_libcall (dst, count_exp, val_exp, false);
18217       emit_jump (jump_around_label);
18218       emit_label (hot_label);
18219     }
18220
18221   /* Step 2: Alignment prologue.  */
18222
18223   /* Do the expensive promotion once we branched off the small blocks.  */
18224   if (!promoted_val)
18225     promoted_val = promote_duplicated_reg_to_size (val_exp, size_needed,
18226                                                    desired_align, align);
18227   gcc_assert (desired_align >= 1 && align >= 1);
18228
18229   if (desired_align > align)
18230     {
18231       if (align_bytes == 0)
18232         {
18233           /* Except for the first move in epilogue, we no longer know
18234              constant offset in aliasing info.  It don't seems to worth
18235              the pain to maintain it for the first move, so throw away
18236              the info early.  */
18237           dst = change_address (dst, BLKmode, destreg);
18238           expand_setmem_prologue (dst, destreg, promoted_val, count_exp, align,
18239                                   desired_align);
18240         }
18241       else
18242         {
18243           /* If we know how many bytes need to be stored before dst is
18244              sufficiently aligned, maintain aliasing info accurately.  */
18245           dst = expand_constant_setmem_prologue (dst, destreg, promoted_val,
18246                                                  desired_align, align_bytes);
18247           count_exp = plus_constant (count_exp, -align_bytes);
18248           count -= align_bytes;
18249         }
18250       if (need_zero_guard
18251           && (count < (unsigned HOST_WIDE_INT) size_needed
18252               || (align_bytes == 0
18253                   && count < ((unsigned HOST_WIDE_INT) size_needed
18254                               + desired_align - align))))
18255         {
18256           /* It is possible that we copied enough so the main loop will not
18257              execute.  */
18258           gcc_assert (size_needed > 1);
18259           if (label == NULL_RTX)
18260             label = gen_label_rtx ();
18261           emit_cmp_and_jump_insns (count_exp,
18262                                    GEN_INT (size_needed),
18263                                    LTU, 0, counter_mode (count_exp), 1, label);
18264           if (expected_size == -1
18265               || expected_size < (desired_align - align) / 2 + size_needed)
18266             predict_jump (REG_BR_PROB_BASE * 20 / 100);
18267           else
18268             predict_jump (REG_BR_PROB_BASE * 60 / 100);
18269         }
18270     }
18271   if (label && size_needed == 1)
18272     {
18273       emit_label (label);
18274       LABEL_NUSES (label) = 1;
18275       label = NULL;
18276       promoted_val = val_exp;
18277       epilogue_size_needed = 1;
18278     }
18279   else if (label == NULL_RTX)
18280     epilogue_size_needed = size_needed;
18281
18282   /* Step 3: Main loop.  */
18283
18284   switch (alg)
18285     {
18286     case libcall:
18287     case no_stringop:
18288       gcc_unreachable ();
18289     case loop_1_byte:
18290       expand_set_or_movmem_via_loop (dst, NULL, destreg, NULL, promoted_val,
18291                                      count_exp, QImode, 1, expected_size);
18292       break;
18293     case loop:
18294       expand_set_or_movmem_via_loop (dst, NULL, destreg, NULL, promoted_val,
18295                                      count_exp, Pmode, 1, expected_size);
18296       break;
18297     case unrolled_loop:
18298       expand_set_or_movmem_via_loop (dst, NULL, destreg, NULL, promoted_val,
18299                                      count_exp, Pmode, 4, expected_size);
18300       break;
18301     case rep_prefix_8_byte:
18302       expand_setmem_via_rep_stos (dst, destreg, promoted_val, count_exp,
18303                                   DImode, val_exp);
18304       break;
18305     case rep_prefix_4_byte:
18306       expand_setmem_via_rep_stos (dst, destreg, promoted_val, count_exp,
18307                                   SImode, val_exp);
18308       break;
18309     case rep_prefix_1_byte:
18310       expand_setmem_via_rep_stos (dst, destreg, promoted_val, count_exp,
18311                                   QImode, val_exp);
18312       break;
18313     }
18314   /* Adjust properly the offset of src and dest memory for aliasing.  */
18315   if (CONST_INT_P (count_exp))
18316     dst = adjust_automodify_address_nv (dst, BLKmode, destreg,
18317                                         (count / size_needed) * size_needed);
18318   else
18319     dst = change_address (dst, BLKmode, destreg);
18320
18321   /* Step 4: Epilogue to copy the remaining bytes.  */
18322
18323   if (label)
18324     {
18325       /* When the main loop is done, COUNT_EXP might hold original count,
18326          while we want to copy only COUNT_EXP & SIZE_NEEDED bytes.
18327          Epilogue code will actually copy COUNT_EXP & EPILOGUE_SIZE_NEEDED
18328          bytes. Compensate if needed.  */
18329
18330       if (size_needed < epilogue_size_needed)
18331         {
18332           tmp =
18333             expand_simple_binop (counter_mode (count_exp), AND, count_exp,
18334                                  GEN_INT (size_needed - 1), count_exp, 1,
18335                                  OPTAB_DIRECT);
18336           if (tmp != count_exp)
18337             emit_move_insn (count_exp, tmp);
18338         }
18339       emit_label (label);
18340       LABEL_NUSES (label) = 1;
18341     }
18342  epilogue:
18343   if (count_exp != const0_rtx && epilogue_size_needed > 1)
18344     {
18345       if (force_loopy_epilogue)
18346         expand_setmem_epilogue_via_loop (dst, destreg, val_exp, count_exp,
18347                                          epilogue_size_needed);
18348       else
18349         expand_setmem_epilogue (dst, destreg, promoted_val, count_exp,
18350                                 epilogue_size_needed);
18351     }
18352   if (jump_around_label)
18353     emit_label (jump_around_label);
18354   return 1;
18355 }
18356
18357 /* Expand the appropriate insns for doing strlen if not just doing
18358    repnz; scasb
18359
18360    out = result, initialized with the start address
18361    align_rtx = alignment of the address.
18362    scratch = scratch register, initialized with the startaddress when
18363         not aligned, otherwise undefined
18364
18365    This is just the body. It needs the initializations mentioned above and
18366    some address computing at the end.  These things are done in i386.md.  */
18367
18368 static void
18369 ix86_expand_strlensi_unroll_1 (rtx out, rtx src, rtx align_rtx)
18370 {
18371   int align;
18372   rtx tmp;
18373   rtx align_2_label = NULL_RTX;
18374   rtx align_3_label = NULL_RTX;
18375   rtx align_4_label = gen_label_rtx ();
18376   rtx end_0_label = gen_label_rtx ();
18377   rtx mem;
18378   rtx tmpreg = gen_reg_rtx (SImode);
18379   rtx scratch = gen_reg_rtx (SImode);
18380   rtx cmp;
18381
18382   align = 0;
18383   if (CONST_INT_P (align_rtx))
18384     align = INTVAL (align_rtx);
18385
18386   /* Loop to check 1..3 bytes for null to get an aligned pointer.  */
18387
18388   /* Is there a known alignment and is it less than 4?  */
18389   if (align < 4)
18390     {
18391       rtx scratch1 = gen_reg_rtx (Pmode);
18392       emit_move_insn (scratch1, out);
18393       /* Is there a known alignment and is it not 2? */
18394       if (align != 2)
18395         {
18396           align_3_label = gen_label_rtx (); /* Label when aligned to 3-byte */
18397           align_2_label = gen_label_rtx (); /* Label when aligned to 2-byte */
18398
18399           /* Leave just the 3 lower bits.  */
18400           align_rtx = expand_binop (Pmode, and_optab, scratch1, GEN_INT (3),
18401                                     NULL_RTX, 0, OPTAB_WIDEN);
18402
18403           emit_cmp_and_jump_insns (align_rtx, const0_rtx, EQ, NULL,
18404                                    Pmode, 1, align_4_label);
18405           emit_cmp_and_jump_insns (align_rtx, const2_rtx, EQ, NULL,
18406                                    Pmode, 1, align_2_label);
18407           emit_cmp_and_jump_insns (align_rtx, const2_rtx, GTU, NULL,
18408                                    Pmode, 1, align_3_label);
18409         }
18410       else
18411         {
18412           /* Since the alignment is 2, we have to check 2 or 0 bytes;
18413              check if is aligned to 4 - byte.  */
18414
18415           align_rtx = expand_binop (Pmode, and_optab, scratch1, const2_rtx,
18416                                     NULL_RTX, 0, OPTAB_WIDEN);
18417
18418           emit_cmp_and_jump_insns (align_rtx, const0_rtx, EQ, NULL,
18419                                    Pmode, 1, align_4_label);
18420         }
18421
18422       mem = change_address (src, QImode, out);
18423
18424       /* Now compare the bytes.  */
18425
18426       /* Compare the first n unaligned byte on a byte per byte basis.  */
18427       emit_cmp_and_jump_insns (mem, const0_rtx, EQ, NULL,
18428                                QImode, 1, end_0_label);
18429
18430       /* Increment the address.  */
18431       emit_insn ((*ix86_gen_add3) (out, out, const1_rtx));
18432
18433       /* Not needed with an alignment of 2 */
18434       if (align != 2)
18435         {
18436           emit_label (align_2_label);
18437
18438           emit_cmp_and_jump_insns (mem, const0_rtx, EQ, NULL, QImode, 1,
18439                                    end_0_label);
18440
18441           emit_insn ((*ix86_gen_add3) (out, out, const1_rtx));
18442
18443           emit_label (align_3_label);
18444         }
18445
18446       emit_cmp_and_jump_insns (mem, const0_rtx, EQ, NULL, QImode, 1,
18447                                end_0_label);
18448
18449       emit_insn ((*ix86_gen_add3) (out, out, const1_rtx));
18450     }
18451
18452   /* Generate loop to check 4 bytes at a time.  It is not a good idea to
18453      align this loop.  It gives only huge programs, but does not help to
18454      speed up.  */
18455   emit_label (align_4_label);
18456
18457   mem = change_address (src, SImode, out);
18458   emit_move_insn (scratch, mem);
18459   emit_insn ((*ix86_gen_add3) (out, out, GEN_INT (4)));
18460
18461   /* This formula yields a nonzero result iff one of the bytes is zero.
18462      This saves three branches inside loop and many cycles.  */
18463
18464   emit_insn (gen_addsi3 (tmpreg, scratch, GEN_INT (-0x01010101)));
18465   emit_insn (gen_one_cmplsi2 (scratch, scratch));
18466   emit_insn (gen_andsi3 (tmpreg, tmpreg, scratch));
18467   emit_insn (gen_andsi3 (tmpreg, tmpreg,
18468                          gen_int_mode (0x80808080, SImode)));
18469   emit_cmp_and_jump_insns (tmpreg, const0_rtx, EQ, 0, SImode, 1,
18470                            align_4_label);
18471
18472   if (TARGET_CMOVE)
18473     {
18474        rtx reg = gen_reg_rtx (SImode);
18475        rtx reg2 = gen_reg_rtx (Pmode);
18476        emit_move_insn (reg, tmpreg);
18477        emit_insn (gen_lshrsi3 (reg, reg, GEN_INT (16)));
18478
18479        /* If zero is not in the first two bytes, move two bytes forward.  */
18480        emit_insn (gen_testsi_ccno_1 (tmpreg, GEN_INT (0x8080)));
18481        tmp = gen_rtx_REG (CCNOmode, FLAGS_REG);
18482        tmp = gen_rtx_EQ (VOIDmode, tmp, const0_rtx);
18483        emit_insn (gen_rtx_SET (VOIDmode, tmpreg,
18484                                gen_rtx_IF_THEN_ELSE (SImode, tmp,
18485                                                      reg,
18486                                                      tmpreg)));
18487        /* Emit lea manually to avoid clobbering of flags.  */
18488        emit_insn (gen_rtx_SET (SImode, reg2,
18489                                gen_rtx_PLUS (Pmode, out, const2_rtx)));
18490
18491        tmp = gen_rtx_REG (CCNOmode, FLAGS_REG);
18492        tmp = gen_rtx_EQ (VOIDmode, tmp, const0_rtx);
18493        emit_insn (gen_rtx_SET (VOIDmode, out,
18494                                gen_rtx_IF_THEN_ELSE (Pmode, tmp,
18495                                                      reg2,
18496                                                      out)));
18497
18498     }
18499   else
18500     {
18501        rtx end_2_label = gen_label_rtx ();
18502        /* Is zero in the first two bytes? */
18503
18504        emit_insn (gen_testsi_ccno_1 (tmpreg, GEN_INT (0x8080)));
18505        tmp = gen_rtx_REG (CCNOmode, FLAGS_REG);
18506        tmp = gen_rtx_NE (VOIDmode, tmp, const0_rtx);
18507        tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp,
18508                             gen_rtx_LABEL_REF (VOIDmode, end_2_label),
18509                             pc_rtx);
18510        tmp = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, tmp));
18511        JUMP_LABEL (tmp) = end_2_label;
18512
18513        /* Not in the first two.  Move two bytes forward.  */
18514        emit_insn (gen_lshrsi3 (tmpreg, tmpreg, GEN_INT (16)));
18515        emit_insn ((*ix86_gen_add3) (out, out, const2_rtx));
18516
18517        emit_label (end_2_label);
18518
18519     }
18520
18521   /* Avoid branch in fixing the byte.  */
18522   tmpreg = gen_lowpart (QImode, tmpreg);
18523   emit_insn (gen_addqi3_cc (tmpreg, tmpreg, tmpreg));
18524   cmp = gen_rtx_LTU (Pmode, gen_rtx_REG (CCmode, FLAGS_REG), const0_rtx);
18525   emit_insn ((*ix86_gen_sub3_carry) (out, out, GEN_INT (3), cmp));
18526
18527   emit_label (end_0_label);
18528 }
18529
18530 /* Expand strlen.  */
18531
18532 int
18533 ix86_expand_strlen (rtx out, rtx src, rtx eoschar, rtx align)
18534 {
18535   rtx addr, scratch1, scratch2, scratch3, scratch4;
18536
18537   /* The generic case of strlen expander is long.  Avoid it's
18538      expanding unless TARGET_INLINE_ALL_STRINGOPS.  */
18539
18540   if (TARGET_UNROLL_STRLEN && eoschar == const0_rtx && optimize > 1
18541       && !TARGET_INLINE_ALL_STRINGOPS
18542       && !optimize_insn_for_size_p ()
18543       && (!CONST_INT_P (align) || INTVAL (align) < 4))
18544     return 0;
18545
18546   addr = force_reg (Pmode, XEXP (src, 0));
18547   scratch1 = gen_reg_rtx (Pmode);
18548
18549   if (TARGET_UNROLL_STRLEN && eoschar == const0_rtx && optimize > 1
18550       && !optimize_insn_for_size_p ())
18551     {
18552       /* Well it seems that some optimizer does not combine a call like
18553          foo(strlen(bar), strlen(bar));
18554          when the move and the subtraction is done here.  It does calculate
18555          the length just once when these instructions are done inside of
18556          output_strlen_unroll().  But I think since &bar[strlen(bar)] is
18557          often used and I use one fewer register for the lifetime of
18558          output_strlen_unroll() this is better.  */
18559
18560       emit_move_insn (out, addr);
18561
18562       ix86_expand_strlensi_unroll_1 (out, src, align);
18563
18564       /* strlensi_unroll_1 returns the address of the zero at the end of
18565          the string, like memchr(), so compute the length by subtracting
18566          the start address.  */
18567       emit_insn ((*ix86_gen_sub3) (out, out, addr));
18568     }
18569   else
18570     {
18571       rtx unspec;
18572
18573       /* Can't use this if the user has appropriated eax, ecx, or edi.  */
18574       if (fixed_regs[AX_REG] || fixed_regs[CX_REG] || fixed_regs[DI_REG])
18575         return false;
18576
18577       scratch2 = gen_reg_rtx (Pmode);
18578       scratch3 = gen_reg_rtx (Pmode);
18579       scratch4 = force_reg (Pmode, constm1_rtx);
18580
18581       emit_move_insn (scratch3, addr);
18582       eoschar = force_reg (QImode, eoschar);
18583
18584       src = replace_equiv_address_nv (src, scratch3);
18585
18586       /* If .md starts supporting :P, this can be done in .md.  */
18587       unspec = gen_rtx_UNSPEC (Pmode, gen_rtvec (4, src, eoschar, align,
18588                                                  scratch4), UNSPEC_SCAS);
18589       emit_insn (gen_strlenqi_1 (scratch1, scratch3, unspec));
18590       emit_insn ((*ix86_gen_one_cmpl2) (scratch2, scratch1));
18591       emit_insn ((*ix86_gen_add3) (out, scratch2, constm1_rtx));
18592     }
18593   return 1;
18594 }
18595
18596 /* For given symbol (function) construct code to compute address of it's PLT
18597    entry in large x86-64 PIC model.  */
18598 rtx
18599 construct_plt_address (rtx symbol)
18600 {
18601   rtx tmp = gen_reg_rtx (Pmode);
18602   rtx unspec = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, symbol), UNSPEC_PLTOFF);
18603
18604   gcc_assert (GET_CODE (symbol) == SYMBOL_REF);
18605   gcc_assert (ix86_cmodel == CM_LARGE_PIC);
18606
18607   emit_move_insn (tmp, gen_rtx_CONST (Pmode, unspec));
18608   emit_insn (gen_adddi3 (tmp, tmp, pic_offset_table_rtx));
18609   return tmp;
18610 }
18611
18612 void
18613 ix86_expand_call (rtx retval, rtx fnaddr, rtx callarg1,
18614                   rtx callarg2,
18615                   rtx pop, int sibcall)
18616 {
18617   rtx use = NULL, call;
18618
18619   if (pop == const0_rtx)
18620     pop = NULL;
18621   gcc_assert (!TARGET_64BIT || !pop);
18622
18623   if (TARGET_MACHO && !TARGET_64BIT)
18624     {
18625 #if TARGET_MACHO
18626       if (flag_pic && GET_CODE (XEXP (fnaddr, 0)) == SYMBOL_REF)
18627         fnaddr = machopic_indirect_call_target (fnaddr);
18628 #endif
18629     }
18630   else
18631     {
18632       /* Static functions and indirect calls don't need the pic register.  */
18633       if (flag_pic && (!TARGET_64BIT || ix86_cmodel == CM_LARGE_PIC)
18634           && GET_CODE (XEXP (fnaddr, 0)) == SYMBOL_REF
18635           && ! SYMBOL_REF_LOCAL_P (XEXP (fnaddr, 0)))
18636         use_reg (&use, pic_offset_table_rtx);
18637     }
18638
18639   if (TARGET_64BIT && INTVAL (callarg2) >= 0)
18640     {
18641       rtx al = gen_rtx_REG (QImode, AX_REG);
18642       emit_move_insn (al, callarg2);
18643       use_reg (&use, al);
18644     }
18645
18646   if (ix86_cmodel == CM_LARGE_PIC
18647       && GET_CODE (fnaddr) == MEM
18648       && GET_CODE (XEXP (fnaddr, 0)) == SYMBOL_REF
18649       && !local_symbolic_operand (XEXP (fnaddr, 0), VOIDmode))
18650     fnaddr = gen_rtx_MEM (QImode, construct_plt_address (XEXP (fnaddr, 0)));
18651   else if (! call_insn_operand (XEXP (fnaddr, 0), Pmode))
18652     {
18653       fnaddr = copy_to_mode_reg (Pmode, XEXP (fnaddr, 0));
18654       fnaddr = gen_rtx_MEM (QImode, fnaddr);
18655     }
18656   if (sibcall && TARGET_64BIT
18657       && !constant_call_address_operand (XEXP (fnaddr, 0), Pmode))
18658     {
18659       rtx addr;
18660       addr = copy_to_mode_reg (Pmode, XEXP (fnaddr, 0));
18661       fnaddr = gen_rtx_REG (Pmode, R11_REG);
18662       emit_move_insn (fnaddr, addr);
18663       fnaddr = gen_rtx_MEM (QImode, fnaddr);
18664     }
18665
18666   call = gen_rtx_CALL (VOIDmode, fnaddr, callarg1);
18667   if (retval)
18668     call = gen_rtx_SET (VOIDmode, retval, call);
18669   if (pop)
18670     {
18671       pop = gen_rtx_PLUS (Pmode, stack_pointer_rtx, pop);
18672       pop = gen_rtx_SET (VOIDmode, stack_pointer_rtx, pop);
18673       call = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, call, pop));
18674     }
18675   if (TARGET_64BIT
18676       && ix86_cfun_abi () == MS_ABI
18677       && (!callarg2 || INTVAL (callarg2) != -2))
18678     {
18679       /* We need to represent that SI and DI registers are clobbered
18680          by SYSV calls.  */
18681       static int clobbered_registers[] = {
18682         XMM6_REG, XMM7_REG, XMM8_REG,
18683         XMM9_REG, XMM10_REG, XMM11_REG,
18684         XMM12_REG, XMM13_REG, XMM14_REG,
18685         XMM15_REG, SI_REG, DI_REG
18686       };
18687       unsigned int i;
18688       rtx vec[ARRAY_SIZE (clobbered_registers) + 2];
18689       rtx unspec = gen_rtx_UNSPEC (VOIDmode, gen_rtvec (1, const0_rtx),
18690                                    UNSPEC_MS_TO_SYSV_CALL);
18691
18692       vec[0] = call;
18693       vec[1] = unspec;
18694       for (i = 0; i < ARRAY_SIZE (clobbered_registers); i++)
18695         vec[i + 2] = gen_rtx_CLOBBER (SSE_REGNO_P (clobbered_registers[i])
18696                                       ? TImode : DImode,
18697                                       gen_rtx_REG
18698                                         (SSE_REGNO_P (clobbered_registers[i])
18699                                                       ? TImode : DImode,
18700                                          clobbered_registers[i]));
18701
18702       call = gen_rtx_PARALLEL (VOIDmode,
18703                                gen_rtvec_v (ARRAY_SIZE (clobbered_registers)
18704                                + 2, vec));
18705     }
18706
18707   call = emit_call_insn (call);
18708   if (use)
18709     CALL_INSN_FUNCTION_USAGE (call) = use;
18710 }
18711
18712 \f
18713 /* Clear stack slot assignments remembered from previous functions.
18714    This is called from INIT_EXPANDERS once before RTL is emitted for each
18715    function.  */
18716
18717 static struct machine_function *
18718 ix86_init_machine_status (void)
18719 {
18720   struct machine_function *f;
18721
18722   f = GGC_CNEW (struct machine_function);
18723   f->use_fast_prologue_epilogue_nregs = -1;
18724   f->tls_descriptor_call_expanded_p = 0;
18725   f->call_abi = DEFAULT_ABI;
18726
18727   return f;
18728 }
18729
18730 /* Return a MEM corresponding to a stack slot with mode MODE.
18731    Allocate a new slot if necessary.
18732
18733    The RTL for a function can have several slots available: N is
18734    which slot to use.  */
18735
18736 rtx
18737 assign_386_stack_local (enum machine_mode mode, enum ix86_stack_slot n)
18738 {
18739   struct stack_local_entry *s;
18740
18741   gcc_assert (n < MAX_386_STACK_LOCALS);
18742
18743   /* Virtual slot is valid only before vregs are instantiated.  */
18744   gcc_assert ((n == SLOT_VIRTUAL) == !virtuals_instantiated);
18745
18746   for (s = ix86_stack_locals; s; s = s->next)
18747     if (s->mode == mode && s->n == n)
18748       return copy_rtx (s->rtl);
18749
18750   s = (struct stack_local_entry *)
18751     ggc_alloc (sizeof (struct stack_local_entry));
18752   s->n = n;
18753   s->mode = mode;
18754   s->rtl = assign_stack_local (mode, GET_MODE_SIZE (mode), 0);
18755
18756   s->next = ix86_stack_locals;
18757   ix86_stack_locals = s;
18758   return s->rtl;
18759 }
18760
18761 /* Construct the SYMBOL_REF for the tls_get_addr function.  */
18762
18763 static GTY(()) rtx ix86_tls_symbol;
18764 rtx
18765 ix86_tls_get_addr (void)
18766 {
18767
18768   if (!ix86_tls_symbol)
18769     {
18770       ix86_tls_symbol = gen_rtx_SYMBOL_REF (Pmode,
18771                                             (TARGET_ANY_GNU_TLS
18772                                              && !TARGET_64BIT)
18773                                             ? "___tls_get_addr"
18774                                             : "__tls_get_addr");
18775     }
18776
18777   return ix86_tls_symbol;
18778 }
18779
18780 /* Construct the SYMBOL_REF for the _TLS_MODULE_BASE_ symbol.  */
18781
18782 static GTY(()) rtx ix86_tls_module_base_symbol;
18783 rtx
18784 ix86_tls_module_base (void)
18785 {
18786
18787   if (!ix86_tls_module_base_symbol)
18788     {
18789       ix86_tls_module_base_symbol = gen_rtx_SYMBOL_REF (Pmode,
18790                                                         "_TLS_MODULE_BASE_");
18791       SYMBOL_REF_FLAGS (ix86_tls_module_base_symbol)
18792         |= TLS_MODEL_GLOBAL_DYNAMIC << SYMBOL_FLAG_TLS_SHIFT;
18793     }
18794
18795   return ix86_tls_module_base_symbol;
18796 }
18797 \f
18798 /* Calculate the length of the memory address in the instruction
18799    encoding.  Does not include the one-byte modrm, opcode, or prefix.  */
18800
18801 int
18802 memory_address_length (rtx addr)
18803 {
18804   struct ix86_address parts;
18805   rtx base, index, disp;
18806   int len;
18807   int ok;
18808
18809   if (GET_CODE (addr) == PRE_DEC
18810       || GET_CODE (addr) == POST_INC
18811       || GET_CODE (addr) == PRE_MODIFY
18812       || GET_CODE (addr) == POST_MODIFY)
18813     return 0;
18814
18815   ok = ix86_decompose_address (addr, &parts);
18816   gcc_assert (ok);
18817
18818   if (parts.base && GET_CODE (parts.base) == SUBREG)
18819     parts.base = SUBREG_REG (parts.base);
18820   if (parts.index && GET_CODE (parts.index) == SUBREG)
18821     parts.index = SUBREG_REG (parts.index);
18822
18823   base = parts.base;
18824   index = parts.index;
18825   disp = parts.disp;
18826   len = 0;
18827
18828   /* Rule of thumb:
18829        - esp as the base always wants an index,
18830        - ebp as the base always wants a displacement.  */
18831
18832   /* Register Indirect.  */
18833   if (base && !index && !disp)
18834     {
18835       /* esp (for its index) and ebp (for its displacement) need
18836          the two-byte modrm form.  */
18837       if (addr == stack_pointer_rtx
18838           || addr == arg_pointer_rtx
18839           || addr == frame_pointer_rtx
18840           || addr == hard_frame_pointer_rtx)
18841         len = 1;
18842     }
18843
18844   /* Direct Addressing.  */
18845   else if (disp && !base && !index)
18846     len = 4;
18847
18848   else
18849     {
18850       /* Find the length of the displacement constant.  */
18851       if (disp)
18852         {
18853           if (base && satisfies_constraint_K (disp))
18854             len = 1;
18855           else
18856             len = 4;
18857         }
18858       /* ebp always wants a displacement.  */
18859       else if (base == hard_frame_pointer_rtx)
18860         len = 1;
18861
18862       /* An index requires the two-byte modrm form....  */
18863       if (index
18864           /* ...like esp, which always wants an index.  */
18865           || base == stack_pointer_rtx
18866           || base == arg_pointer_rtx
18867           || base == frame_pointer_rtx)
18868         len += 1;
18869     }
18870
18871   return len;
18872 }
18873
18874 /* Compute default value for "length_immediate" attribute.  When SHORTFORM
18875    is set, expect that insn have 8bit immediate alternative.  */
18876 int
18877 ix86_attr_length_immediate_default (rtx insn, int shortform)
18878 {
18879   int len = 0;
18880   int i;
18881   extract_insn_cached (insn);
18882   for (i = recog_data.n_operands - 1; i >= 0; --i)
18883     if (CONSTANT_P (recog_data.operand[i]))
18884       {
18885         gcc_assert (!len);
18886         if (shortform && satisfies_constraint_K (recog_data.operand[i]))
18887           len = 1;
18888         else
18889           {
18890             switch (get_attr_mode (insn))
18891               {
18892                 case MODE_QI:
18893                   len+=1;
18894                   break;
18895                 case MODE_HI:
18896                   len+=2;
18897                   break;
18898                 case MODE_SI:
18899                   len+=4;
18900                   break;
18901                 /* Immediates for DImode instructions are encoded as 32bit sign extended values.  */
18902                 case MODE_DI:
18903                   len+=4;
18904                   break;
18905                 default:
18906                   fatal_insn ("unknown insn mode", insn);
18907               }
18908           }
18909       }
18910   return len;
18911 }
18912 /* Compute default value for "length_address" attribute.  */
18913 int
18914 ix86_attr_length_address_default (rtx insn)
18915 {
18916   int i;
18917
18918   if (get_attr_type (insn) == TYPE_LEA)
18919     {
18920       rtx set = PATTERN (insn);
18921
18922       if (GET_CODE (set) == PARALLEL)
18923         set = XVECEXP (set, 0, 0);
18924
18925       gcc_assert (GET_CODE (set) == SET);
18926
18927       return memory_address_length (SET_SRC (set));
18928     }
18929
18930   extract_insn_cached (insn);
18931   for (i = recog_data.n_operands - 1; i >= 0; --i)
18932     if (MEM_P (recog_data.operand[i]))
18933       {
18934         return memory_address_length (XEXP (recog_data.operand[i], 0));
18935         break;
18936       }
18937   return 0;
18938 }
18939
18940 /* Compute default value for "length_vex" attribute. It includes
18941    2 or 3 byte VEX prefix and 1 opcode byte.  */
18942
18943 int
18944 ix86_attr_length_vex_default (rtx insn, int has_0f_opcode,
18945                               int has_vex_w)
18946 {
18947   int i;
18948
18949   /* Only 0f opcode can use 2 byte VEX prefix and  VEX W bit uses 3
18950      byte VEX prefix.  */
18951   if (!has_0f_opcode || has_vex_w)
18952     return 3 + 1;
18953
18954  /* We can always use 2 byte VEX prefix in 32bit.  */
18955   if (!TARGET_64BIT)
18956     return 2 + 1;
18957
18958   extract_insn_cached (insn);
18959
18960   for (i = recog_data.n_operands - 1; i >= 0; --i)
18961     if (REG_P (recog_data.operand[i]))
18962       {
18963         /* REX.W bit uses 3 byte VEX prefix.  */
18964         if (GET_MODE (recog_data.operand[i]) == DImode)
18965           return 3 + 1;
18966       }
18967     else
18968       {
18969         /* REX.X or REX.B bits use 3 byte VEX prefix.  */
18970         if (MEM_P (recog_data.operand[i])
18971             && x86_extended_reg_mentioned_p (recog_data.operand[i]))
18972           return 3 + 1;
18973       }
18974
18975   return 2 + 1;
18976 }
18977 \f
18978 /* Return the maximum number of instructions a cpu can issue.  */
18979
18980 static int
18981 ix86_issue_rate (void)
18982 {
18983   switch (ix86_tune)
18984     {
18985     case PROCESSOR_PENTIUM:
18986     case PROCESSOR_K6:
18987       return 2;
18988
18989     case PROCESSOR_PENTIUMPRO:
18990     case PROCESSOR_PENTIUM4:
18991     case PROCESSOR_ATHLON:
18992     case PROCESSOR_K8:
18993     case PROCESSOR_AMDFAM10:
18994     case PROCESSOR_NOCONA:
18995     case PROCESSOR_GENERIC32:
18996     case PROCESSOR_GENERIC64:
18997       return 3;
18998
18999     case PROCESSOR_CORE2:
19000       return 4;
19001
19002     default:
19003       return 1;
19004     }
19005 }
19006
19007 /* A subroutine of ix86_adjust_cost -- return true iff INSN reads flags set
19008    by DEP_INSN and nothing set by DEP_INSN.  */
19009
19010 static int
19011 ix86_flags_dependent (rtx insn, rtx dep_insn, enum attr_type insn_type)
19012 {
19013   rtx set, set2;
19014
19015   /* Simplify the test for uninteresting insns.  */
19016   if (insn_type != TYPE_SETCC
19017       && insn_type != TYPE_ICMOV
19018       && insn_type != TYPE_FCMOV
19019       && insn_type != TYPE_IBR)
19020     return 0;
19021
19022   if ((set = single_set (dep_insn)) != 0)
19023     {
19024       set = SET_DEST (set);
19025       set2 = NULL_RTX;
19026     }
19027   else if (GET_CODE (PATTERN (dep_insn)) == PARALLEL
19028            && XVECLEN (PATTERN (dep_insn), 0) == 2
19029            && GET_CODE (XVECEXP (PATTERN (dep_insn), 0, 0)) == SET
19030            && GET_CODE (XVECEXP (PATTERN (dep_insn), 0, 1)) == SET)
19031     {
19032       set = SET_DEST (XVECEXP (PATTERN (dep_insn), 0, 0));
19033       set2 = SET_DEST (XVECEXP (PATTERN (dep_insn), 0, 0));
19034     }
19035   else
19036     return 0;
19037
19038   if (!REG_P (set) || REGNO (set) != FLAGS_REG)
19039     return 0;
19040
19041   /* This test is true if the dependent insn reads the flags but
19042      not any other potentially set register.  */
19043   if (!reg_overlap_mentioned_p (set, PATTERN (insn)))
19044     return 0;
19045
19046   if (set2 && reg_overlap_mentioned_p (set2, PATTERN (insn)))
19047     return 0;
19048
19049   return 1;
19050 }
19051
19052 /* A subroutine of ix86_adjust_cost -- return true iff INSN has a memory
19053    address with operands set by DEP_INSN.  */
19054
19055 static int
19056 ix86_agi_dependent (rtx insn, rtx dep_insn, enum attr_type insn_type)
19057 {
19058   rtx addr;
19059
19060   if (insn_type == TYPE_LEA
19061       && TARGET_PENTIUM)
19062     {
19063       addr = PATTERN (insn);
19064
19065       if (GET_CODE (addr) == PARALLEL)
19066         addr = XVECEXP (addr, 0, 0);
19067
19068       gcc_assert (GET_CODE (addr) == SET);
19069
19070       addr = SET_SRC (addr);
19071     }
19072   else
19073     {
19074       int i;
19075       extract_insn_cached (insn);
19076       for (i = recog_data.n_operands - 1; i >= 0; --i)
19077         if (MEM_P (recog_data.operand[i]))
19078           {
19079             addr = XEXP (recog_data.operand[i], 0);
19080             goto found;
19081           }
19082       return 0;
19083     found:;
19084     }
19085
19086   return modified_in_p (addr, dep_insn);
19087 }
19088
19089 static int
19090 ix86_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
19091 {
19092   enum attr_type insn_type, dep_insn_type;
19093   enum attr_memory memory;
19094   rtx set, set2;
19095   int dep_insn_code_number;
19096
19097   /* Anti and output dependencies have zero cost on all CPUs.  */
19098   if (REG_NOTE_KIND (link) != 0)
19099     return 0;
19100
19101   dep_insn_code_number = recog_memoized (dep_insn);
19102
19103   /* If we can't recognize the insns, we can't really do anything.  */
19104   if (dep_insn_code_number < 0 || recog_memoized (insn) < 0)
19105     return cost;
19106
19107   insn_type = get_attr_type (insn);
19108   dep_insn_type = get_attr_type (dep_insn);
19109
19110   switch (ix86_tune)
19111     {
19112     case PROCESSOR_PENTIUM:
19113       /* Address Generation Interlock adds a cycle of latency.  */
19114       if (ix86_agi_dependent (insn, dep_insn, insn_type))
19115         cost += 1;
19116
19117       /* ??? Compares pair with jump/setcc.  */
19118       if (ix86_flags_dependent (insn, dep_insn, insn_type))
19119         cost = 0;
19120
19121       /* Floating point stores require value to be ready one cycle earlier.  */
19122       if (insn_type == TYPE_FMOV
19123           && get_attr_memory (insn) == MEMORY_STORE
19124           && !ix86_agi_dependent (insn, dep_insn, insn_type))
19125         cost += 1;
19126       break;
19127
19128     case PROCESSOR_PENTIUMPRO:
19129       memory = get_attr_memory (insn);
19130
19131       /* INT->FP conversion is expensive.  */
19132       if (get_attr_fp_int_src (dep_insn))
19133         cost += 5;
19134
19135       /* There is one cycle extra latency between an FP op and a store.  */
19136       if (insn_type == TYPE_FMOV
19137           && (set = single_set (dep_insn)) != NULL_RTX
19138           && (set2 = single_set (insn)) != NULL_RTX
19139           && rtx_equal_p (SET_DEST (set), SET_SRC (set2))
19140           && MEM_P (SET_DEST (set2)))
19141         cost += 1;
19142
19143       /* Show ability of reorder buffer to hide latency of load by executing
19144          in parallel with previous instruction in case
19145          previous instruction is not needed to compute the address.  */
19146       if ((memory == MEMORY_LOAD || memory == MEMORY_BOTH)
19147           && !ix86_agi_dependent (insn, dep_insn, insn_type))
19148         {
19149           /* Claim moves to take one cycle, as core can issue one load
19150              at time and the next load can start cycle later.  */
19151           if (dep_insn_type == TYPE_IMOV
19152               || dep_insn_type == TYPE_FMOV)
19153             cost = 1;
19154           else if (cost > 1)
19155             cost--;
19156         }
19157       break;
19158
19159     case PROCESSOR_K6:
19160       memory = get_attr_memory (insn);
19161
19162       /* The esp dependency is resolved before the instruction is really
19163          finished.  */
19164       if ((insn_type == TYPE_PUSH || insn_type == TYPE_POP)
19165           && (dep_insn_type == TYPE_PUSH || dep_insn_type == TYPE_POP))
19166         return 1;
19167
19168       /* INT->FP conversion is expensive.  */
19169       if (get_attr_fp_int_src (dep_insn))
19170         cost += 5;
19171
19172       /* Show ability of reorder buffer to hide latency of load by executing
19173          in parallel with previous instruction in case
19174          previous instruction is not needed to compute the address.  */
19175       if ((memory == MEMORY_LOAD || memory == MEMORY_BOTH)
19176           && !ix86_agi_dependent (insn, dep_insn, insn_type))
19177         {
19178           /* Claim moves to take one cycle, as core can issue one load
19179              at time and the next load can start cycle later.  */
19180           if (dep_insn_type == TYPE_IMOV
19181               || dep_insn_type == TYPE_FMOV)
19182             cost = 1;
19183           else if (cost > 2)
19184             cost -= 2;
19185           else
19186             cost = 1;
19187         }
19188       break;
19189
19190     case PROCESSOR_ATHLON:
19191     case PROCESSOR_K8:
19192     case PROCESSOR_AMDFAM10:
19193     case PROCESSOR_GENERIC32:
19194     case PROCESSOR_GENERIC64:
19195       memory = get_attr_memory (insn);
19196
19197       /* Show ability of reorder buffer to hide latency of load by executing
19198          in parallel with previous instruction in case
19199          previous instruction is not needed to compute the address.  */
19200       if ((memory == MEMORY_LOAD || memory == MEMORY_BOTH)
19201           && !ix86_agi_dependent (insn, dep_insn, insn_type))
19202         {
19203           enum attr_unit unit = get_attr_unit (insn);
19204           int loadcost = 3;
19205
19206           /* Because of the difference between the length of integer and
19207              floating unit pipeline preparation stages, the memory operands
19208              for floating point are cheaper.
19209
19210              ??? For Athlon it the difference is most probably 2.  */
19211           if (unit == UNIT_INTEGER || unit == UNIT_UNKNOWN)
19212             loadcost = 3;
19213           else
19214             loadcost = TARGET_ATHLON ? 2 : 0;
19215
19216           if (cost >= loadcost)
19217             cost -= loadcost;
19218           else
19219             cost = 0;
19220         }
19221
19222     default:
19223       break;
19224     }
19225
19226   return cost;
19227 }
19228
19229 /* How many alternative schedules to try.  This should be as wide as the
19230    scheduling freedom in the DFA, but no wider.  Making this value too
19231    large results extra work for the scheduler.  */
19232
19233 static int
19234 ia32_multipass_dfa_lookahead (void)
19235 {
19236   switch (ix86_tune)
19237     {
19238     case PROCESSOR_PENTIUM:
19239       return 2;
19240
19241     case PROCESSOR_PENTIUMPRO:
19242     case PROCESSOR_K6:
19243       return 1;
19244
19245     default:
19246       return 0;
19247     }
19248 }
19249
19250 \f
19251 /* Compute the alignment given to a constant that is being placed in memory.
19252    EXP is the constant and ALIGN is the alignment that the object would
19253    ordinarily have.
19254    The value of this function is used instead of that alignment to align
19255    the object.  */
19256
19257 int
19258 ix86_constant_alignment (tree exp, int align)
19259 {
19260   if (TREE_CODE (exp) == REAL_CST || TREE_CODE (exp) == VECTOR_CST
19261       || TREE_CODE (exp) == INTEGER_CST)
19262     {
19263       if (TYPE_MODE (TREE_TYPE (exp)) == DFmode && align < 64)
19264         return 64;
19265       else if (ALIGN_MODE_128 (TYPE_MODE (TREE_TYPE (exp))) && align < 128)
19266         return 128;
19267     }
19268   else if (!optimize_size && TREE_CODE (exp) == STRING_CST
19269            && TREE_STRING_LENGTH (exp) >= 31 && align < BITS_PER_WORD)
19270     return BITS_PER_WORD;
19271
19272   return align;
19273 }
19274
19275 /* Compute the alignment for a static variable.
19276    TYPE is the data type, and ALIGN is the alignment that
19277    the object would ordinarily have.  The value of this function is used
19278    instead of that alignment to align the object.  */
19279
19280 int
19281 ix86_data_alignment (tree type, int align)
19282 {
19283   int max_align = optimize_size ? BITS_PER_WORD : MIN (256, MAX_OFILE_ALIGNMENT);
19284
19285   if (AGGREGATE_TYPE_P (type)
19286       && TYPE_SIZE (type)
19287       && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
19288       && (TREE_INT_CST_LOW (TYPE_SIZE (type)) >= (unsigned) max_align
19289           || TREE_INT_CST_HIGH (TYPE_SIZE (type)))
19290       && align < max_align)
19291     align = max_align;
19292
19293   /* x86-64 ABI requires arrays greater than 16 bytes to be aligned
19294      to 16byte boundary.  */
19295   if (TARGET_64BIT)
19296     {
19297       if (AGGREGATE_TYPE_P (type)
19298            && TYPE_SIZE (type)
19299            && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
19300            && (TREE_INT_CST_LOW (TYPE_SIZE (type)) >= 128
19301                || TREE_INT_CST_HIGH (TYPE_SIZE (type))) && align < 128)
19302         return 128;
19303     }
19304
19305   if (TREE_CODE (type) == ARRAY_TYPE)
19306     {
19307       if (TYPE_MODE (TREE_TYPE (type)) == DFmode && align < 64)
19308         return 64;
19309       if (ALIGN_MODE_128 (TYPE_MODE (TREE_TYPE (type))) && align < 128)
19310         return 128;
19311     }
19312   else if (TREE_CODE (type) == COMPLEX_TYPE)
19313     {
19314
19315       if (TYPE_MODE (type) == DCmode && align < 64)
19316         return 64;
19317       if ((TYPE_MODE (type) == XCmode
19318            || TYPE_MODE (type) == TCmode) && align < 128)
19319         return 128;
19320     }
19321   else if ((TREE_CODE (type) == RECORD_TYPE
19322             || TREE_CODE (type) == UNION_TYPE
19323             || TREE_CODE (type) == QUAL_UNION_TYPE)
19324            && TYPE_FIELDS (type))
19325     {
19326       if (DECL_MODE (TYPE_FIELDS (type)) == DFmode && align < 64)
19327         return 64;
19328       if (ALIGN_MODE_128 (DECL_MODE (TYPE_FIELDS (type))) && align < 128)
19329         return 128;
19330     }
19331   else if (TREE_CODE (type) == REAL_TYPE || TREE_CODE (type) == VECTOR_TYPE
19332            || TREE_CODE (type) == INTEGER_TYPE)
19333     {
19334       if (TYPE_MODE (type) == DFmode && align < 64)
19335         return 64;
19336       if (ALIGN_MODE_128 (TYPE_MODE (type)) && align < 128)
19337         return 128;
19338     }
19339
19340   return align;
19341 }
19342
19343 /* Compute the alignment for a local variable or a stack slot.  EXP is
19344    the data type or decl itself, MODE is the widest mode available and
19345    ALIGN is the alignment that the object would ordinarily have.  The
19346    value of this macro is used instead of that alignment to align the
19347    object.  */
19348
19349 unsigned int
19350 ix86_local_alignment (tree exp, enum machine_mode mode,
19351                       unsigned int align)
19352 {
19353   tree type, decl;
19354
19355   if (exp && DECL_P (exp))
19356     {
19357       type = TREE_TYPE (exp);
19358       decl = exp;
19359     }
19360   else
19361     {
19362       type = exp;
19363       decl = NULL;
19364     }
19365
19366   /* Don't do dynamic stack realignment for long long objects with
19367      -mpreferred-stack-boundary=2.  */
19368   if (!TARGET_64BIT
19369       && align == 64
19370       && ix86_preferred_stack_boundary < 64
19371       && (mode == DImode || (type && TYPE_MODE (type) == DImode))
19372       && (!type || !TYPE_USER_ALIGN (type))
19373       && (!decl || !DECL_USER_ALIGN (decl)))
19374     align = 32;
19375
19376   /* If TYPE is NULL, we are allocating a stack slot for caller-save
19377      register in MODE.  We will return the largest alignment of XF
19378      and DF.  */
19379   if (!type)
19380     {
19381       if (mode == XFmode && align < GET_MODE_ALIGNMENT (DFmode))
19382         align = GET_MODE_ALIGNMENT (DFmode);
19383       return align;
19384     }
19385
19386   /* x86-64 ABI requires arrays greater than 16 bytes to be aligned
19387      to 16byte boundary.  */
19388   if (TARGET_64BIT)
19389     {
19390       if (AGGREGATE_TYPE_P (type)
19391            && TYPE_SIZE (type)
19392            && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
19393            && (TREE_INT_CST_LOW (TYPE_SIZE (type)) >= 16
19394                || TREE_INT_CST_HIGH (TYPE_SIZE (type))) && align < 128)
19395         return 128;
19396     }
19397   if (TREE_CODE (type) == ARRAY_TYPE)
19398     {
19399       if (TYPE_MODE (TREE_TYPE (type)) == DFmode && align < 64)
19400         return 64;
19401       if (ALIGN_MODE_128 (TYPE_MODE (TREE_TYPE (type))) && align < 128)
19402         return 128;
19403     }
19404   else if (TREE_CODE (type) == COMPLEX_TYPE)
19405     {
19406       if (TYPE_MODE (type) == DCmode && align < 64)
19407         return 64;
19408       if ((TYPE_MODE (type) == XCmode
19409            || TYPE_MODE (type) == TCmode) && align < 128)
19410         return 128;
19411     }
19412   else if ((TREE_CODE (type) == RECORD_TYPE
19413             || TREE_CODE (type) == UNION_TYPE
19414             || TREE_CODE (type) == QUAL_UNION_TYPE)
19415            && TYPE_FIELDS (type))
19416     {
19417       if (DECL_MODE (TYPE_FIELDS (type)) == DFmode && align < 64)
19418         return 64;
19419       if (ALIGN_MODE_128 (DECL_MODE (TYPE_FIELDS (type))) && align < 128)
19420         return 128;
19421     }
19422   else if (TREE_CODE (type) == REAL_TYPE || TREE_CODE (type) == VECTOR_TYPE
19423            || TREE_CODE (type) == INTEGER_TYPE)
19424     {
19425
19426       if (TYPE_MODE (type) == DFmode && align < 64)
19427         return 64;
19428       if (ALIGN_MODE_128 (TYPE_MODE (type)) && align < 128)
19429         return 128;
19430     }
19431   return align;
19432 }
19433 \f
19434 /* Emit RTL insns to initialize the variable parts of a trampoline.
19435    FNADDR is an RTX for the address of the function's pure code.
19436    CXT is an RTX for the static chain value for the function.  */
19437 void
19438 x86_initialize_trampoline (rtx tramp, rtx fnaddr, rtx cxt)
19439 {
19440   if (!TARGET_64BIT)
19441     {
19442       /* Compute offset from the end of the jmp to the target function.  */
19443       rtx disp = expand_binop (SImode, sub_optab, fnaddr,
19444                                plus_constant (tramp, 10),
19445                                NULL_RTX, 1, OPTAB_DIRECT);
19446       emit_move_insn (gen_rtx_MEM (QImode, tramp),
19447                       gen_int_mode (0xb9, QImode));
19448       emit_move_insn (gen_rtx_MEM (SImode, plus_constant (tramp, 1)), cxt);
19449       emit_move_insn (gen_rtx_MEM (QImode, plus_constant (tramp, 5)),
19450                       gen_int_mode (0xe9, QImode));
19451       emit_move_insn (gen_rtx_MEM (SImode, plus_constant (tramp, 6)), disp);
19452     }
19453   else
19454     {
19455       int offset = 0;
19456       /* Try to load address using shorter movl instead of movabs.
19457          We may want to support movq for kernel mode, but kernel does not use
19458          trampolines at the moment.  */
19459       if (x86_64_zext_immediate_operand (fnaddr, VOIDmode))
19460         {
19461           fnaddr = copy_to_mode_reg (DImode, fnaddr);
19462           emit_move_insn (gen_rtx_MEM (HImode, plus_constant (tramp, offset)),
19463                           gen_int_mode (0xbb41, HImode));
19464           emit_move_insn (gen_rtx_MEM (SImode, plus_constant (tramp, offset + 2)),
19465                           gen_lowpart (SImode, fnaddr));
19466           offset += 6;
19467         }
19468       else
19469         {
19470           emit_move_insn (gen_rtx_MEM (HImode, plus_constant (tramp, offset)),
19471                           gen_int_mode (0xbb49, HImode));
19472           emit_move_insn (gen_rtx_MEM (DImode, plus_constant (tramp, offset + 2)),
19473                           fnaddr);
19474           offset += 10;
19475         }
19476       /* Load static chain using movabs to r10.  */
19477       emit_move_insn (gen_rtx_MEM (HImode, plus_constant (tramp, offset)),
19478                       gen_int_mode (0xba49, HImode));
19479       emit_move_insn (gen_rtx_MEM (DImode, plus_constant (tramp, offset + 2)),
19480                       cxt);
19481       offset += 10;
19482       /* Jump to the r11 */
19483       emit_move_insn (gen_rtx_MEM (HImode, plus_constant (tramp, offset)),
19484                       gen_int_mode (0xff49, HImode));
19485       emit_move_insn (gen_rtx_MEM (QImode, plus_constant (tramp, offset+2)),
19486                       gen_int_mode (0xe3, QImode));
19487       offset += 3;
19488       gcc_assert (offset <= TRAMPOLINE_SIZE);
19489     }
19490
19491 #ifdef ENABLE_EXECUTE_STACK
19492   emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__enable_execute_stack"),
19493                      LCT_NORMAL, VOIDmode, 1, tramp, Pmode);
19494 #endif
19495 }
19496 \f
19497 /* Codes for all the SSE/MMX builtins.  */
19498 enum ix86_builtins
19499 {
19500   IX86_BUILTIN_ADDPS,
19501   IX86_BUILTIN_ADDSS,
19502   IX86_BUILTIN_DIVPS,
19503   IX86_BUILTIN_DIVSS,
19504   IX86_BUILTIN_MULPS,
19505   IX86_BUILTIN_MULSS,
19506   IX86_BUILTIN_SUBPS,
19507   IX86_BUILTIN_SUBSS,
19508
19509   IX86_BUILTIN_CMPEQPS,
19510   IX86_BUILTIN_CMPLTPS,
19511   IX86_BUILTIN_CMPLEPS,
19512   IX86_BUILTIN_CMPGTPS,
19513   IX86_BUILTIN_CMPGEPS,
19514   IX86_BUILTIN_CMPNEQPS,
19515   IX86_BUILTIN_CMPNLTPS,
19516   IX86_BUILTIN_CMPNLEPS,
19517   IX86_BUILTIN_CMPNGTPS,
19518   IX86_BUILTIN_CMPNGEPS,
19519   IX86_BUILTIN_CMPORDPS,
19520   IX86_BUILTIN_CMPUNORDPS,
19521   IX86_BUILTIN_CMPEQSS,
19522   IX86_BUILTIN_CMPLTSS,
19523   IX86_BUILTIN_CMPLESS,
19524   IX86_BUILTIN_CMPNEQSS,
19525   IX86_BUILTIN_CMPNLTSS,
19526   IX86_BUILTIN_CMPNLESS,
19527   IX86_BUILTIN_CMPNGTSS,
19528   IX86_BUILTIN_CMPNGESS,
19529   IX86_BUILTIN_CMPORDSS,
19530   IX86_BUILTIN_CMPUNORDSS,
19531
19532   IX86_BUILTIN_COMIEQSS,
19533   IX86_BUILTIN_COMILTSS,
19534   IX86_BUILTIN_COMILESS,
19535   IX86_BUILTIN_COMIGTSS,
19536   IX86_BUILTIN_COMIGESS,
19537   IX86_BUILTIN_COMINEQSS,
19538   IX86_BUILTIN_UCOMIEQSS,
19539   IX86_BUILTIN_UCOMILTSS,
19540   IX86_BUILTIN_UCOMILESS,
19541   IX86_BUILTIN_UCOMIGTSS,
19542   IX86_BUILTIN_UCOMIGESS,
19543   IX86_BUILTIN_UCOMINEQSS,
19544
19545   IX86_BUILTIN_CVTPI2PS,
19546   IX86_BUILTIN_CVTPS2PI,
19547   IX86_BUILTIN_CVTSI2SS,
19548   IX86_BUILTIN_CVTSI642SS,
19549   IX86_BUILTIN_CVTSS2SI,
19550   IX86_BUILTIN_CVTSS2SI64,
19551   IX86_BUILTIN_CVTTPS2PI,
19552   IX86_BUILTIN_CVTTSS2SI,
19553   IX86_BUILTIN_CVTTSS2SI64,
19554
19555   IX86_BUILTIN_MAXPS,
19556   IX86_BUILTIN_MAXSS,
19557   IX86_BUILTIN_MINPS,
19558   IX86_BUILTIN_MINSS,
19559
19560   IX86_BUILTIN_LOADUPS,
19561   IX86_BUILTIN_STOREUPS,
19562   IX86_BUILTIN_MOVSS,
19563
19564   IX86_BUILTIN_MOVHLPS,
19565   IX86_BUILTIN_MOVLHPS,
19566   IX86_BUILTIN_LOADHPS,
19567   IX86_BUILTIN_LOADLPS,
19568   IX86_BUILTIN_STOREHPS,
19569   IX86_BUILTIN_STORELPS,
19570
19571   IX86_BUILTIN_MASKMOVQ,
19572   IX86_BUILTIN_MOVMSKPS,
19573   IX86_BUILTIN_PMOVMSKB,
19574
19575   IX86_BUILTIN_MOVNTPS,
19576   IX86_BUILTIN_MOVNTQ,
19577
19578   IX86_BUILTIN_LOADDQU,
19579   IX86_BUILTIN_STOREDQU,
19580
19581   IX86_BUILTIN_PACKSSWB,
19582   IX86_BUILTIN_PACKSSDW,
19583   IX86_BUILTIN_PACKUSWB,
19584
19585   IX86_BUILTIN_PADDB,
19586   IX86_BUILTIN_PADDW,
19587   IX86_BUILTIN_PADDD,
19588   IX86_BUILTIN_PADDQ,
19589   IX86_BUILTIN_PADDSB,
19590   IX86_BUILTIN_PADDSW,
19591   IX86_BUILTIN_PADDUSB,
19592   IX86_BUILTIN_PADDUSW,
19593   IX86_BUILTIN_PSUBB,
19594   IX86_BUILTIN_PSUBW,
19595   IX86_BUILTIN_PSUBD,
19596   IX86_BUILTIN_PSUBQ,
19597   IX86_BUILTIN_PSUBSB,
19598   IX86_BUILTIN_PSUBSW,
19599   IX86_BUILTIN_PSUBUSB,
19600   IX86_BUILTIN_PSUBUSW,
19601
19602   IX86_BUILTIN_PAND,
19603   IX86_BUILTIN_PANDN,
19604   IX86_BUILTIN_POR,
19605   IX86_BUILTIN_PXOR,
19606
19607   IX86_BUILTIN_PAVGB,
19608   IX86_BUILTIN_PAVGW,
19609
19610   IX86_BUILTIN_PCMPEQB,
19611   IX86_BUILTIN_PCMPEQW,
19612   IX86_BUILTIN_PCMPEQD,
19613   IX86_BUILTIN_PCMPGTB,
19614   IX86_BUILTIN_PCMPGTW,
19615   IX86_BUILTIN_PCMPGTD,
19616
19617   IX86_BUILTIN_PMADDWD,
19618
19619   IX86_BUILTIN_PMAXSW,
19620   IX86_BUILTIN_PMAXUB,
19621   IX86_BUILTIN_PMINSW,
19622   IX86_BUILTIN_PMINUB,
19623
19624   IX86_BUILTIN_PMULHUW,
19625   IX86_BUILTIN_PMULHW,
19626   IX86_BUILTIN_PMULLW,
19627
19628   IX86_BUILTIN_PSADBW,
19629   IX86_BUILTIN_PSHUFW,
19630
19631   IX86_BUILTIN_PSLLW,
19632   IX86_BUILTIN_PSLLD,
19633   IX86_BUILTIN_PSLLQ,
19634   IX86_BUILTIN_PSRAW,
19635   IX86_BUILTIN_PSRAD,
19636   IX86_BUILTIN_PSRLW,
19637   IX86_BUILTIN_PSRLD,
19638   IX86_BUILTIN_PSRLQ,
19639   IX86_BUILTIN_PSLLWI,
19640   IX86_BUILTIN_PSLLDI,
19641   IX86_BUILTIN_PSLLQI,
19642   IX86_BUILTIN_PSRAWI,
19643   IX86_BUILTIN_PSRADI,
19644   IX86_BUILTIN_PSRLWI,
19645   IX86_BUILTIN_PSRLDI,
19646   IX86_BUILTIN_PSRLQI,
19647
19648   IX86_BUILTIN_PUNPCKHBW,
19649   IX86_BUILTIN_PUNPCKHWD,
19650   IX86_BUILTIN_PUNPCKHDQ,
19651   IX86_BUILTIN_PUNPCKLBW,
19652   IX86_BUILTIN_PUNPCKLWD,
19653   IX86_BUILTIN_PUNPCKLDQ,
19654
19655   IX86_BUILTIN_SHUFPS,
19656
19657   IX86_BUILTIN_RCPPS,
19658   IX86_BUILTIN_RCPSS,
19659   IX86_BUILTIN_RSQRTPS,
19660   IX86_BUILTIN_RSQRTPS_NR,
19661   IX86_BUILTIN_RSQRTSS,
19662   IX86_BUILTIN_RSQRTF,
19663   IX86_BUILTIN_SQRTPS,
19664   IX86_BUILTIN_SQRTPS_NR,
19665   IX86_BUILTIN_SQRTSS,
19666
19667   IX86_BUILTIN_UNPCKHPS,
19668   IX86_BUILTIN_UNPCKLPS,
19669
19670   IX86_BUILTIN_ANDPS,
19671   IX86_BUILTIN_ANDNPS,
19672   IX86_BUILTIN_ORPS,
19673   IX86_BUILTIN_XORPS,
19674
19675   IX86_BUILTIN_EMMS,
19676   IX86_BUILTIN_LDMXCSR,
19677   IX86_BUILTIN_STMXCSR,
19678   IX86_BUILTIN_SFENCE,
19679
19680   /* 3DNow! Original */
19681   IX86_BUILTIN_FEMMS,
19682   IX86_BUILTIN_PAVGUSB,
19683   IX86_BUILTIN_PF2ID,
19684   IX86_BUILTIN_PFACC,
19685   IX86_BUILTIN_PFADD,
19686   IX86_BUILTIN_PFCMPEQ,
19687   IX86_BUILTIN_PFCMPGE,
19688   IX86_BUILTIN_PFCMPGT,
19689   IX86_BUILTIN_PFMAX,
19690   IX86_BUILTIN_PFMIN,
19691   IX86_BUILTIN_PFMUL,
19692   IX86_BUILTIN_PFRCP,
19693   IX86_BUILTIN_PFRCPIT1,
19694   IX86_BUILTIN_PFRCPIT2,
19695   IX86_BUILTIN_PFRSQIT1,
19696   IX86_BUILTIN_PFRSQRT,
19697   IX86_BUILTIN_PFSUB,
19698   IX86_BUILTIN_PFSUBR,
19699   IX86_BUILTIN_PI2FD,
19700   IX86_BUILTIN_PMULHRW,
19701
19702   /* 3DNow! Athlon Extensions */
19703   IX86_BUILTIN_PF2IW,
19704   IX86_BUILTIN_PFNACC,
19705   IX86_BUILTIN_PFPNACC,
19706   IX86_BUILTIN_PI2FW,
19707   IX86_BUILTIN_PSWAPDSI,
19708   IX86_BUILTIN_PSWAPDSF,
19709
19710   /* SSE2 */
19711   IX86_BUILTIN_ADDPD,
19712   IX86_BUILTIN_ADDSD,
19713   IX86_BUILTIN_DIVPD,
19714   IX86_BUILTIN_DIVSD,
19715   IX86_BUILTIN_MULPD,
19716   IX86_BUILTIN_MULSD,
19717   IX86_BUILTIN_SUBPD,
19718   IX86_BUILTIN_SUBSD,
19719
19720   IX86_BUILTIN_CMPEQPD,
19721   IX86_BUILTIN_CMPLTPD,
19722   IX86_BUILTIN_CMPLEPD,
19723   IX86_BUILTIN_CMPGTPD,
19724   IX86_BUILTIN_CMPGEPD,
19725   IX86_BUILTIN_CMPNEQPD,
19726   IX86_BUILTIN_CMPNLTPD,
19727   IX86_BUILTIN_CMPNLEPD,
19728   IX86_BUILTIN_CMPNGTPD,
19729   IX86_BUILTIN_CMPNGEPD,
19730   IX86_BUILTIN_CMPORDPD,
19731   IX86_BUILTIN_CMPUNORDPD,
19732   IX86_BUILTIN_CMPEQSD,
19733   IX86_BUILTIN_CMPLTSD,
19734   IX86_BUILTIN_CMPLESD,
19735   IX86_BUILTIN_CMPNEQSD,
19736   IX86_BUILTIN_CMPNLTSD,
19737   IX86_BUILTIN_CMPNLESD,
19738   IX86_BUILTIN_CMPORDSD,
19739   IX86_BUILTIN_CMPUNORDSD,
19740
19741   IX86_BUILTIN_COMIEQSD,
19742   IX86_BUILTIN_COMILTSD,
19743   IX86_BUILTIN_COMILESD,
19744   IX86_BUILTIN_COMIGTSD,
19745   IX86_BUILTIN_COMIGESD,
19746   IX86_BUILTIN_COMINEQSD,
19747   IX86_BUILTIN_UCOMIEQSD,
19748   IX86_BUILTIN_UCOMILTSD,
19749   IX86_BUILTIN_UCOMILESD,
19750   IX86_BUILTIN_UCOMIGTSD,
19751   IX86_BUILTIN_UCOMIGESD,
19752   IX86_BUILTIN_UCOMINEQSD,
19753
19754   IX86_BUILTIN_MAXPD,
19755   IX86_BUILTIN_MAXSD,
19756   IX86_BUILTIN_MINPD,
19757   IX86_BUILTIN_MINSD,
19758
19759   IX86_BUILTIN_ANDPD,
19760   IX86_BUILTIN_ANDNPD,
19761   IX86_BUILTIN_ORPD,
19762   IX86_BUILTIN_XORPD,
19763
19764   IX86_BUILTIN_SQRTPD,
19765   IX86_BUILTIN_SQRTSD,
19766
19767   IX86_BUILTIN_UNPCKHPD,
19768   IX86_BUILTIN_UNPCKLPD,
19769
19770   IX86_BUILTIN_SHUFPD,
19771
19772   IX86_BUILTIN_LOADUPD,
19773   IX86_BUILTIN_STOREUPD,
19774   IX86_BUILTIN_MOVSD,
19775
19776   IX86_BUILTIN_LOADHPD,
19777   IX86_BUILTIN_LOADLPD,
19778
19779   IX86_BUILTIN_CVTDQ2PD,
19780   IX86_BUILTIN_CVTDQ2PS,
19781
19782   IX86_BUILTIN_CVTPD2DQ,
19783   IX86_BUILTIN_CVTPD2PI,
19784   IX86_BUILTIN_CVTPD2PS,
19785   IX86_BUILTIN_CVTTPD2DQ,
19786   IX86_BUILTIN_CVTTPD2PI,
19787
19788   IX86_BUILTIN_CVTPI2PD,
19789   IX86_BUILTIN_CVTSI2SD,
19790   IX86_BUILTIN_CVTSI642SD,
19791
19792   IX86_BUILTIN_CVTSD2SI,
19793   IX86_BUILTIN_CVTSD2SI64,
19794   IX86_BUILTIN_CVTSD2SS,
19795   IX86_BUILTIN_CVTSS2SD,
19796   IX86_BUILTIN_CVTTSD2SI,
19797   IX86_BUILTIN_CVTTSD2SI64,
19798
19799   IX86_BUILTIN_CVTPS2DQ,
19800   IX86_BUILTIN_CVTPS2PD,
19801   IX86_BUILTIN_CVTTPS2DQ,
19802
19803   IX86_BUILTIN_MOVNTI,
19804   IX86_BUILTIN_MOVNTPD,
19805   IX86_BUILTIN_MOVNTDQ,
19806
19807   IX86_BUILTIN_MOVQ128,
19808
19809   /* SSE2 MMX */
19810   IX86_BUILTIN_MASKMOVDQU,
19811   IX86_BUILTIN_MOVMSKPD,
19812   IX86_BUILTIN_PMOVMSKB128,
19813
19814   IX86_BUILTIN_PACKSSWB128,
19815   IX86_BUILTIN_PACKSSDW128,
19816   IX86_BUILTIN_PACKUSWB128,
19817
19818   IX86_BUILTIN_PADDB128,
19819   IX86_BUILTIN_PADDW128,
19820   IX86_BUILTIN_PADDD128,
19821   IX86_BUILTIN_PADDQ128,
19822   IX86_BUILTIN_PADDSB128,
19823   IX86_BUILTIN_PADDSW128,
19824   IX86_BUILTIN_PADDUSB128,
19825   IX86_BUILTIN_PADDUSW128,
19826   IX86_BUILTIN_PSUBB128,
19827   IX86_BUILTIN_PSUBW128,
19828   IX86_BUILTIN_PSUBD128,
19829   IX86_BUILTIN_PSUBQ128,
19830   IX86_BUILTIN_PSUBSB128,
19831   IX86_BUILTIN_PSUBSW128,
19832   IX86_BUILTIN_PSUBUSB128,
19833   IX86_BUILTIN_PSUBUSW128,
19834
19835   IX86_BUILTIN_PAND128,
19836   IX86_BUILTIN_PANDN128,
19837   IX86_BUILTIN_POR128,
19838   IX86_BUILTIN_PXOR128,
19839
19840   IX86_BUILTIN_PAVGB128,
19841   IX86_BUILTIN_PAVGW128,
19842
19843   IX86_BUILTIN_PCMPEQB128,
19844   IX86_BUILTIN_PCMPEQW128,
19845   IX86_BUILTIN_PCMPEQD128,
19846   IX86_BUILTIN_PCMPGTB128,
19847   IX86_BUILTIN_PCMPGTW128,
19848   IX86_BUILTIN_PCMPGTD128,
19849
19850   IX86_BUILTIN_PMADDWD128,
19851
19852   IX86_BUILTIN_PMAXSW128,
19853   IX86_BUILTIN_PMAXUB128,
19854   IX86_BUILTIN_PMINSW128,
19855   IX86_BUILTIN_PMINUB128,
19856
19857   IX86_BUILTIN_PMULUDQ,
19858   IX86_BUILTIN_PMULUDQ128,
19859   IX86_BUILTIN_PMULHUW128,
19860   IX86_BUILTIN_PMULHW128,
19861   IX86_BUILTIN_PMULLW128,
19862
19863   IX86_BUILTIN_PSADBW128,
19864   IX86_BUILTIN_PSHUFHW,
19865   IX86_BUILTIN_PSHUFLW,
19866   IX86_BUILTIN_PSHUFD,
19867
19868   IX86_BUILTIN_PSLLDQI128,
19869   IX86_BUILTIN_PSLLWI128,
19870   IX86_BUILTIN_PSLLDI128,
19871   IX86_BUILTIN_PSLLQI128,
19872   IX86_BUILTIN_PSRAWI128,
19873   IX86_BUILTIN_PSRADI128,
19874   IX86_BUILTIN_PSRLDQI128,
19875   IX86_BUILTIN_PSRLWI128,
19876   IX86_BUILTIN_PSRLDI128,
19877   IX86_BUILTIN_PSRLQI128,
19878
19879   IX86_BUILTIN_PSLLDQ128,
19880   IX86_BUILTIN_PSLLW128,
19881   IX86_BUILTIN_PSLLD128,
19882   IX86_BUILTIN_PSLLQ128,
19883   IX86_BUILTIN_PSRAW128,
19884   IX86_BUILTIN_PSRAD128,
19885   IX86_BUILTIN_PSRLW128,
19886   IX86_BUILTIN_PSRLD128,
19887   IX86_BUILTIN_PSRLQ128,
19888
19889   IX86_BUILTIN_PUNPCKHBW128,
19890   IX86_BUILTIN_PUNPCKHWD128,
19891   IX86_BUILTIN_PUNPCKHDQ128,
19892   IX86_BUILTIN_PUNPCKHQDQ128,
19893   IX86_BUILTIN_PUNPCKLBW128,
19894   IX86_BUILTIN_PUNPCKLWD128,
19895   IX86_BUILTIN_PUNPCKLDQ128,
19896   IX86_BUILTIN_PUNPCKLQDQ128,
19897
19898   IX86_BUILTIN_CLFLUSH,
19899   IX86_BUILTIN_MFENCE,
19900   IX86_BUILTIN_LFENCE,
19901
19902   /* SSE3.  */
19903   IX86_BUILTIN_ADDSUBPS,
19904   IX86_BUILTIN_HADDPS,
19905   IX86_BUILTIN_HSUBPS,
19906   IX86_BUILTIN_MOVSHDUP,
19907   IX86_BUILTIN_MOVSLDUP,
19908   IX86_BUILTIN_ADDSUBPD,
19909   IX86_BUILTIN_HADDPD,
19910   IX86_BUILTIN_HSUBPD,
19911   IX86_BUILTIN_LDDQU,
19912
19913   IX86_BUILTIN_MONITOR,
19914   IX86_BUILTIN_MWAIT,
19915
19916   /* SSSE3.  */
19917   IX86_BUILTIN_PHADDW,
19918   IX86_BUILTIN_PHADDD,
19919   IX86_BUILTIN_PHADDSW,
19920   IX86_BUILTIN_PHSUBW,
19921   IX86_BUILTIN_PHSUBD,
19922   IX86_BUILTIN_PHSUBSW,
19923   IX86_BUILTIN_PMADDUBSW,
19924   IX86_BUILTIN_PMULHRSW,
19925   IX86_BUILTIN_PSHUFB,
19926   IX86_BUILTIN_PSIGNB,
19927   IX86_BUILTIN_PSIGNW,
19928   IX86_BUILTIN_PSIGND,
19929   IX86_BUILTIN_PALIGNR,
19930   IX86_BUILTIN_PABSB,
19931   IX86_BUILTIN_PABSW,
19932   IX86_BUILTIN_PABSD,
19933
19934   IX86_BUILTIN_PHADDW128,
19935   IX86_BUILTIN_PHADDD128,
19936   IX86_BUILTIN_PHADDSW128,
19937   IX86_BUILTIN_PHSUBW128,
19938   IX86_BUILTIN_PHSUBD128,
19939   IX86_BUILTIN_PHSUBSW128,
19940   IX86_BUILTIN_PMADDUBSW128,
19941   IX86_BUILTIN_PMULHRSW128,
19942   IX86_BUILTIN_PSHUFB128,
19943   IX86_BUILTIN_PSIGNB128,
19944   IX86_BUILTIN_PSIGNW128,
19945   IX86_BUILTIN_PSIGND128,
19946   IX86_BUILTIN_PALIGNR128,
19947   IX86_BUILTIN_PABSB128,
19948   IX86_BUILTIN_PABSW128,
19949   IX86_BUILTIN_PABSD128,
19950
19951   /* AMDFAM10 - SSE4A New Instructions.  */
19952   IX86_BUILTIN_MOVNTSD,
19953   IX86_BUILTIN_MOVNTSS,
19954   IX86_BUILTIN_EXTRQI,
19955   IX86_BUILTIN_EXTRQ,
19956   IX86_BUILTIN_INSERTQI,
19957   IX86_BUILTIN_INSERTQ,
19958
19959   /* SSE4.1.  */
19960   IX86_BUILTIN_BLENDPD,
19961   IX86_BUILTIN_BLENDPS,
19962   IX86_BUILTIN_BLENDVPD,
19963   IX86_BUILTIN_BLENDVPS,
19964   IX86_BUILTIN_PBLENDVB128,
19965   IX86_BUILTIN_PBLENDW128,
19966
19967   IX86_BUILTIN_DPPD,
19968   IX86_BUILTIN_DPPS,
19969
19970   IX86_BUILTIN_INSERTPS128,
19971
19972   IX86_BUILTIN_MOVNTDQA,
19973   IX86_BUILTIN_MPSADBW128,
19974   IX86_BUILTIN_PACKUSDW128,
19975   IX86_BUILTIN_PCMPEQQ,
19976   IX86_BUILTIN_PHMINPOSUW128,
19977
19978   IX86_BUILTIN_PMAXSB128,
19979   IX86_BUILTIN_PMAXSD128,
19980   IX86_BUILTIN_PMAXUD128,
19981   IX86_BUILTIN_PMAXUW128,
19982
19983   IX86_BUILTIN_PMINSB128,
19984   IX86_BUILTIN_PMINSD128,
19985   IX86_BUILTIN_PMINUD128,
19986   IX86_BUILTIN_PMINUW128,
19987
19988   IX86_BUILTIN_PMOVSXBW128,
19989   IX86_BUILTIN_PMOVSXBD128,
19990   IX86_BUILTIN_PMOVSXBQ128,
19991   IX86_BUILTIN_PMOVSXWD128,
19992   IX86_BUILTIN_PMOVSXWQ128,
19993   IX86_BUILTIN_PMOVSXDQ128,
19994
19995   IX86_BUILTIN_PMOVZXBW128,
19996   IX86_BUILTIN_PMOVZXBD128,
19997   IX86_BUILTIN_PMOVZXBQ128,
19998   IX86_BUILTIN_PMOVZXWD128,
19999   IX86_BUILTIN_PMOVZXWQ128,
20000   IX86_BUILTIN_PMOVZXDQ128,
20001
20002   IX86_BUILTIN_PMULDQ128,
20003   IX86_BUILTIN_PMULLD128,
20004
20005   IX86_BUILTIN_ROUNDPD,
20006   IX86_BUILTIN_ROUNDPS,
20007   IX86_BUILTIN_ROUNDSD,
20008   IX86_BUILTIN_ROUNDSS,
20009
20010   IX86_BUILTIN_PTESTZ,
20011   IX86_BUILTIN_PTESTC,
20012   IX86_BUILTIN_PTESTNZC,
20013
20014   IX86_BUILTIN_VEC_INIT_V2SI,
20015   IX86_BUILTIN_VEC_INIT_V4HI,
20016   IX86_BUILTIN_VEC_INIT_V8QI,
20017   IX86_BUILTIN_VEC_EXT_V2DF,
20018   IX86_BUILTIN_VEC_EXT_V2DI,
20019   IX86_BUILTIN_VEC_EXT_V4SF,
20020   IX86_BUILTIN_VEC_EXT_V4SI,
20021   IX86_BUILTIN_VEC_EXT_V8HI,
20022   IX86_BUILTIN_VEC_EXT_V2SI,
20023   IX86_BUILTIN_VEC_EXT_V4HI,
20024   IX86_BUILTIN_VEC_EXT_V16QI,
20025   IX86_BUILTIN_VEC_SET_V2DI,
20026   IX86_BUILTIN_VEC_SET_V4SF,
20027   IX86_BUILTIN_VEC_SET_V4SI,
20028   IX86_BUILTIN_VEC_SET_V8HI,
20029   IX86_BUILTIN_VEC_SET_V4HI,
20030   IX86_BUILTIN_VEC_SET_V16QI,
20031
20032   IX86_BUILTIN_VEC_PACK_SFIX,
20033
20034   /* SSE4.2.  */
20035   IX86_BUILTIN_CRC32QI,
20036   IX86_BUILTIN_CRC32HI,
20037   IX86_BUILTIN_CRC32SI,
20038   IX86_BUILTIN_CRC32DI,
20039
20040   IX86_BUILTIN_PCMPESTRI128,
20041   IX86_BUILTIN_PCMPESTRM128,
20042   IX86_BUILTIN_PCMPESTRA128,
20043   IX86_BUILTIN_PCMPESTRC128,
20044   IX86_BUILTIN_PCMPESTRO128,
20045   IX86_BUILTIN_PCMPESTRS128,
20046   IX86_BUILTIN_PCMPESTRZ128,
20047   IX86_BUILTIN_PCMPISTRI128,
20048   IX86_BUILTIN_PCMPISTRM128,
20049   IX86_BUILTIN_PCMPISTRA128,
20050   IX86_BUILTIN_PCMPISTRC128,
20051   IX86_BUILTIN_PCMPISTRO128,
20052   IX86_BUILTIN_PCMPISTRS128,
20053   IX86_BUILTIN_PCMPISTRZ128,
20054
20055   IX86_BUILTIN_PCMPGTQ,
20056
20057   /* AES instructions */
20058   IX86_BUILTIN_AESENC128,
20059   IX86_BUILTIN_AESENCLAST128,
20060   IX86_BUILTIN_AESDEC128,
20061   IX86_BUILTIN_AESDECLAST128,
20062   IX86_BUILTIN_AESIMC128,
20063   IX86_BUILTIN_AESKEYGENASSIST128,
20064
20065   /* PCLMUL instruction */
20066   IX86_BUILTIN_PCLMULQDQ128,
20067
20068   /* AVX */
20069   IX86_BUILTIN_ADDPD256,
20070   IX86_BUILTIN_ADDPS256,
20071   IX86_BUILTIN_ADDSUBPD256,
20072   IX86_BUILTIN_ADDSUBPS256,
20073   IX86_BUILTIN_ANDPD256,
20074   IX86_BUILTIN_ANDPS256,
20075   IX86_BUILTIN_ANDNPD256,
20076   IX86_BUILTIN_ANDNPS256,
20077   IX86_BUILTIN_BLENDPD256,
20078   IX86_BUILTIN_BLENDPS256,
20079   IX86_BUILTIN_BLENDVPD256,
20080   IX86_BUILTIN_BLENDVPS256,
20081   IX86_BUILTIN_DIVPD256,
20082   IX86_BUILTIN_DIVPS256,
20083   IX86_BUILTIN_DPPS256,
20084   IX86_BUILTIN_HADDPD256,
20085   IX86_BUILTIN_HADDPS256,
20086   IX86_BUILTIN_HSUBPD256,
20087   IX86_BUILTIN_HSUBPS256,
20088   IX86_BUILTIN_MAXPD256,
20089   IX86_BUILTIN_MAXPS256,
20090   IX86_BUILTIN_MINPD256,
20091   IX86_BUILTIN_MINPS256,
20092   IX86_BUILTIN_MULPD256,
20093   IX86_BUILTIN_MULPS256,
20094   IX86_BUILTIN_ORPD256,
20095   IX86_BUILTIN_ORPS256,
20096   IX86_BUILTIN_SHUFPD256,
20097   IX86_BUILTIN_SHUFPS256,
20098   IX86_BUILTIN_SUBPD256,
20099   IX86_BUILTIN_SUBPS256,
20100   IX86_BUILTIN_XORPD256,
20101   IX86_BUILTIN_XORPS256,
20102   IX86_BUILTIN_CMPSD,
20103   IX86_BUILTIN_CMPSS,
20104   IX86_BUILTIN_CMPPD,
20105   IX86_BUILTIN_CMPPS,
20106   IX86_BUILTIN_CMPPD256,
20107   IX86_BUILTIN_CMPPS256,
20108   IX86_BUILTIN_CVTDQ2PD256,
20109   IX86_BUILTIN_CVTDQ2PS256,
20110   IX86_BUILTIN_CVTPD2PS256,
20111   IX86_BUILTIN_CVTPS2DQ256,
20112   IX86_BUILTIN_CVTPS2PD256,
20113   IX86_BUILTIN_CVTTPD2DQ256,
20114   IX86_BUILTIN_CVTPD2DQ256,
20115   IX86_BUILTIN_CVTTPS2DQ256,
20116   IX86_BUILTIN_EXTRACTF128PD256,
20117   IX86_BUILTIN_EXTRACTF128PS256,
20118   IX86_BUILTIN_EXTRACTF128SI256,
20119   IX86_BUILTIN_VZEROALL,
20120   IX86_BUILTIN_VZEROUPPER,
20121   IX86_BUILTIN_VZEROUPPER_REX64,
20122   IX86_BUILTIN_VPERMILVARPD,
20123   IX86_BUILTIN_VPERMILVARPS,
20124   IX86_BUILTIN_VPERMILVARPD256,
20125   IX86_BUILTIN_VPERMILVARPS256,
20126   IX86_BUILTIN_VPERMILPD,
20127   IX86_BUILTIN_VPERMILPS,
20128   IX86_BUILTIN_VPERMILPD256,
20129   IX86_BUILTIN_VPERMILPS256,
20130   IX86_BUILTIN_VPERM2F128PD256,
20131   IX86_BUILTIN_VPERM2F128PS256,
20132   IX86_BUILTIN_VPERM2F128SI256,
20133   IX86_BUILTIN_VBROADCASTSS,
20134   IX86_BUILTIN_VBROADCASTSD256,
20135   IX86_BUILTIN_VBROADCASTSS256,
20136   IX86_BUILTIN_VBROADCASTPD256,
20137   IX86_BUILTIN_VBROADCASTPS256,
20138   IX86_BUILTIN_VINSERTF128PD256,
20139   IX86_BUILTIN_VINSERTF128PS256,
20140   IX86_BUILTIN_VINSERTF128SI256,
20141   IX86_BUILTIN_LOADUPD256,
20142   IX86_BUILTIN_LOADUPS256,
20143   IX86_BUILTIN_STOREUPD256,
20144   IX86_BUILTIN_STOREUPS256,
20145   IX86_BUILTIN_LDDQU256,
20146   IX86_BUILTIN_MOVNTDQ256,
20147   IX86_BUILTIN_MOVNTPD256,
20148   IX86_BUILTIN_MOVNTPS256,
20149   IX86_BUILTIN_LOADDQU256,
20150   IX86_BUILTIN_STOREDQU256,
20151   IX86_BUILTIN_MASKLOADPD,
20152   IX86_BUILTIN_MASKLOADPS,
20153   IX86_BUILTIN_MASKSTOREPD,
20154   IX86_BUILTIN_MASKSTOREPS,
20155   IX86_BUILTIN_MASKLOADPD256,
20156   IX86_BUILTIN_MASKLOADPS256,
20157   IX86_BUILTIN_MASKSTOREPD256,
20158   IX86_BUILTIN_MASKSTOREPS256,
20159   IX86_BUILTIN_MOVSHDUP256,
20160   IX86_BUILTIN_MOVSLDUP256,
20161   IX86_BUILTIN_MOVDDUP256,
20162
20163   IX86_BUILTIN_SQRTPD256,
20164   IX86_BUILTIN_SQRTPS256,
20165   IX86_BUILTIN_SQRTPS_NR256,
20166   IX86_BUILTIN_RSQRTPS256,
20167   IX86_BUILTIN_RSQRTPS_NR256,
20168
20169   IX86_BUILTIN_RCPPS256,
20170
20171   IX86_BUILTIN_ROUNDPD256,
20172   IX86_BUILTIN_ROUNDPS256,
20173
20174   IX86_BUILTIN_UNPCKHPD256,
20175   IX86_BUILTIN_UNPCKLPD256,
20176   IX86_BUILTIN_UNPCKHPS256,
20177   IX86_BUILTIN_UNPCKLPS256,
20178
20179   IX86_BUILTIN_SI256_SI,
20180   IX86_BUILTIN_PS256_PS,
20181   IX86_BUILTIN_PD256_PD,
20182   IX86_BUILTIN_SI_SI256,
20183   IX86_BUILTIN_PS_PS256,
20184   IX86_BUILTIN_PD_PD256,
20185
20186   IX86_BUILTIN_VTESTZPD,
20187   IX86_BUILTIN_VTESTCPD,
20188   IX86_BUILTIN_VTESTNZCPD,
20189   IX86_BUILTIN_VTESTZPS,
20190   IX86_BUILTIN_VTESTCPS,
20191   IX86_BUILTIN_VTESTNZCPS,
20192   IX86_BUILTIN_VTESTZPD256,
20193   IX86_BUILTIN_VTESTCPD256,
20194   IX86_BUILTIN_VTESTNZCPD256,
20195   IX86_BUILTIN_VTESTZPS256,
20196   IX86_BUILTIN_VTESTCPS256,
20197   IX86_BUILTIN_VTESTNZCPS256,
20198   IX86_BUILTIN_PTESTZ256,
20199   IX86_BUILTIN_PTESTC256,
20200   IX86_BUILTIN_PTESTNZC256,
20201
20202   IX86_BUILTIN_MOVMSKPD256,
20203   IX86_BUILTIN_MOVMSKPS256,
20204
20205   /* TFmode support builtins.  */
20206   IX86_BUILTIN_INFQ,
20207   IX86_BUILTIN_FABSQ,
20208   IX86_BUILTIN_COPYSIGNQ,
20209
20210   /* SSE5 instructions */
20211   IX86_BUILTIN_FMADDSS,
20212   IX86_BUILTIN_FMADDSD,
20213   IX86_BUILTIN_FMADDPS,
20214   IX86_BUILTIN_FMADDPD,
20215   IX86_BUILTIN_FMSUBSS,
20216   IX86_BUILTIN_FMSUBSD,
20217   IX86_BUILTIN_FMSUBPS,
20218   IX86_BUILTIN_FMSUBPD,
20219   IX86_BUILTIN_FNMADDSS,
20220   IX86_BUILTIN_FNMADDSD,
20221   IX86_BUILTIN_FNMADDPS,
20222   IX86_BUILTIN_FNMADDPD,
20223   IX86_BUILTIN_FNMSUBSS,
20224   IX86_BUILTIN_FNMSUBSD,
20225   IX86_BUILTIN_FNMSUBPS,
20226   IX86_BUILTIN_FNMSUBPD,
20227   IX86_BUILTIN_PCMOV,
20228   IX86_BUILTIN_PCMOV_V2DI,
20229   IX86_BUILTIN_PCMOV_V4SI,
20230   IX86_BUILTIN_PCMOV_V8HI,
20231   IX86_BUILTIN_PCMOV_V16QI,
20232   IX86_BUILTIN_PCMOV_V4SF,
20233   IX86_BUILTIN_PCMOV_V2DF,
20234   IX86_BUILTIN_PPERM,
20235   IX86_BUILTIN_PERMPS,
20236   IX86_BUILTIN_PERMPD,
20237   IX86_BUILTIN_PMACSSWW,
20238   IX86_BUILTIN_PMACSWW,
20239   IX86_BUILTIN_PMACSSWD,
20240   IX86_BUILTIN_PMACSWD,
20241   IX86_BUILTIN_PMACSSDD,
20242   IX86_BUILTIN_PMACSDD,
20243   IX86_BUILTIN_PMACSSDQL,
20244   IX86_BUILTIN_PMACSSDQH,
20245   IX86_BUILTIN_PMACSDQL,
20246   IX86_BUILTIN_PMACSDQH,
20247   IX86_BUILTIN_PMADCSSWD,
20248   IX86_BUILTIN_PMADCSWD,
20249   IX86_BUILTIN_PHADDBW,
20250   IX86_BUILTIN_PHADDBD,
20251   IX86_BUILTIN_PHADDBQ,
20252   IX86_BUILTIN_PHADDWD,
20253   IX86_BUILTIN_PHADDWQ,
20254   IX86_BUILTIN_PHADDDQ,
20255   IX86_BUILTIN_PHADDUBW,
20256   IX86_BUILTIN_PHADDUBD,
20257   IX86_BUILTIN_PHADDUBQ,
20258   IX86_BUILTIN_PHADDUWD,
20259   IX86_BUILTIN_PHADDUWQ,
20260   IX86_BUILTIN_PHADDUDQ,
20261   IX86_BUILTIN_PHSUBBW,
20262   IX86_BUILTIN_PHSUBWD,
20263   IX86_BUILTIN_PHSUBDQ,
20264   IX86_BUILTIN_PROTB,
20265   IX86_BUILTIN_PROTW,
20266   IX86_BUILTIN_PROTD,
20267   IX86_BUILTIN_PROTQ,
20268   IX86_BUILTIN_PROTB_IMM,
20269   IX86_BUILTIN_PROTW_IMM,
20270   IX86_BUILTIN_PROTD_IMM,
20271   IX86_BUILTIN_PROTQ_IMM,
20272   IX86_BUILTIN_PSHLB,
20273   IX86_BUILTIN_PSHLW,
20274   IX86_BUILTIN_PSHLD,
20275   IX86_BUILTIN_PSHLQ,
20276   IX86_BUILTIN_PSHAB,
20277   IX86_BUILTIN_PSHAW,
20278   IX86_BUILTIN_PSHAD,
20279   IX86_BUILTIN_PSHAQ,
20280   IX86_BUILTIN_FRCZSS,
20281   IX86_BUILTIN_FRCZSD,
20282   IX86_BUILTIN_FRCZPS,
20283   IX86_BUILTIN_FRCZPD,
20284   IX86_BUILTIN_CVTPH2PS,
20285   IX86_BUILTIN_CVTPS2PH,
20286
20287   IX86_BUILTIN_COMEQSS,
20288   IX86_BUILTIN_COMNESS,
20289   IX86_BUILTIN_COMLTSS,
20290   IX86_BUILTIN_COMLESS,
20291   IX86_BUILTIN_COMGTSS,
20292   IX86_BUILTIN_COMGESS,
20293   IX86_BUILTIN_COMUEQSS,
20294   IX86_BUILTIN_COMUNESS,
20295   IX86_BUILTIN_COMULTSS,
20296   IX86_BUILTIN_COMULESS,
20297   IX86_BUILTIN_COMUGTSS,
20298   IX86_BUILTIN_COMUGESS,
20299   IX86_BUILTIN_COMORDSS,
20300   IX86_BUILTIN_COMUNORDSS,
20301   IX86_BUILTIN_COMFALSESS,
20302   IX86_BUILTIN_COMTRUESS,
20303
20304   IX86_BUILTIN_COMEQSD,
20305   IX86_BUILTIN_COMNESD,
20306   IX86_BUILTIN_COMLTSD,
20307   IX86_BUILTIN_COMLESD,
20308   IX86_BUILTIN_COMGTSD,
20309   IX86_BUILTIN_COMGESD,
20310   IX86_BUILTIN_COMUEQSD,
20311   IX86_BUILTIN_COMUNESD,
20312   IX86_BUILTIN_COMULTSD,
20313   IX86_BUILTIN_COMULESD,
20314   IX86_BUILTIN_COMUGTSD,
20315   IX86_BUILTIN_COMUGESD,
20316   IX86_BUILTIN_COMORDSD,
20317   IX86_BUILTIN_COMUNORDSD,
20318   IX86_BUILTIN_COMFALSESD,
20319   IX86_BUILTIN_COMTRUESD,
20320
20321   IX86_BUILTIN_COMEQPS,
20322   IX86_BUILTIN_COMNEPS,
20323   IX86_BUILTIN_COMLTPS,
20324   IX86_BUILTIN_COMLEPS,
20325   IX86_BUILTIN_COMGTPS,
20326   IX86_BUILTIN_COMGEPS,
20327   IX86_BUILTIN_COMUEQPS,
20328   IX86_BUILTIN_COMUNEPS,
20329   IX86_BUILTIN_COMULTPS,
20330   IX86_BUILTIN_COMULEPS,
20331   IX86_BUILTIN_COMUGTPS,
20332   IX86_BUILTIN_COMUGEPS,
20333   IX86_BUILTIN_COMORDPS,
20334   IX86_BUILTIN_COMUNORDPS,
20335   IX86_BUILTIN_COMFALSEPS,
20336   IX86_BUILTIN_COMTRUEPS,
20337
20338   IX86_BUILTIN_COMEQPD,
20339   IX86_BUILTIN_COMNEPD,
20340   IX86_BUILTIN_COMLTPD,
20341   IX86_BUILTIN_COMLEPD,
20342   IX86_BUILTIN_COMGTPD,
20343   IX86_BUILTIN_COMGEPD,
20344   IX86_BUILTIN_COMUEQPD,
20345   IX86_BUILTIN_COMUNEPD,
20346   IX86_BUILTIN_COMULTPD,
20347   IX86_BUILTIN_COMULEPD,
20348   IX86_BUILTIN_COMUGTPD,
20349   IX86_BUILTIN_COMUGEPD,
20350   IX86_BUILTIN_COMORDPD,
20351   IX86_BUILTIN_COMUNORDPD,
20352   IX86_BUILTIN_COMFALSEPD,
20353   IX86_BUILTIN_COMTRUEPD,
20354
20355   IX86_BUILTIN_PCOMEQUB,
20356   IX86_BUILTIN_PCOMNEUB,
20357   IX86_BUILTIN_PCOMLTUB,
20358   IX86_BUILTIN_PCOMLEUB,
20359   IX86_BUILTIN_PCOMGTUB,
20360   IX86_BUILTIN_PCOMGEUB,
20361   IX86_BUILTIN_PCOMFALSEUB,
20362   IX86_BUILTIN_PCOMTRUEUB,
20363   IX86_BUILTIN_PCOMEQUW,
20364   IX86_BUILTIN_PCOMNEUW,
20365   IX86_BUILTIN_PCOMLTUW,
20366   IX86_BUILTIN_PCOMLEUW,
20367   IX86_BUILTIN_PCOMGTUW,
20368   IX86_BUILTIN_PCOMGEUW,
20369   IX86_BUILTIN_PCOMFALSEUW,
20370   IX86_BUILTIN_PCOMTRUEUW,
20371   IX86_BUILTIN_PCOMEQUD,
20372   IX86_BUILTIN_PCOMNEUD,
20373   IX86_BUILTIN_PCOMLTUD,
20374   IX86_BUILTIN_PCOMLEUD,
20375   IX86_BUILTIN_PCOMGTUD,
20376   IX86_BUILTIN_PCOMGEUD,
20377   IX86_BUILTIN_PCOMFALSEUD,
20378   IX86_BUILTIN_PCOMTRUEUD,
20379   IX86_BUILTIN_PCOMEQUQ,
20380   IX86_BUILTIN_PCOMNEUQ,
20381   IX86_BUILTIN_PCOMLTUQ,
20382   IX86_BUILTIN_PCOMLEUQ,
20383   IX86_BUILTIN_PCOMGTUQ,
20384   IX86_BUILTIN_PCOMGEUQ,
20385   IX86_BUILTIN_PCOMFALSEUQ,
20386   IX86_BUILTIN_PCOMTRUEUQ,
20387
20388   IX86_BUILTIN_PCOMEQB,
20389   IX86_BUILTIN_PCOMNEB,
20390   IX86_BUILTIN_PCOMLTB,
20391   IX86_BUILTIN_PCOMLEB,
20392   IX86_BUILTIN_PCOMGTB,
20393   IX86_BUILTIN_PCOMGEB,
20394   IX86_BUILTIN_PCOMFALSEB,
20395   IX86_BUILTIN_PCOMTRUEB,
20396   IX86_BUILTIN_PCOMEQW,
20397   IX86_BUILTIN_PCOMNEW,
20398   IX86_BUILTIN_PCOMLTW,
20399   IX86_BUILTIN_PCOMLEW,
20400   IX86_BUILTIN_PCOMGTW,
20401   IX86_BUILTIN_PCOMGEW,
20402   IX86_BUILTIN_PCOMFALSEW,
20403   IX86_BUILTIN_PCOMTRUEW,
20404   IX86_BUILTIN_PCOMEQD,
20405   IX86_BUILTIN_PCOMNED,
20406   IX86_BUILTIN_PCOMLTD,
20407   IX86_BUILTIN_PCOMLED,
20408   IX86_BUILTIN_PCOMGTD,
20409   IX86_BUILTIN_PCOMGED,
20410   IX86_BUILTIN_PCOMFALSED,
20411   IX86_BUILTIN_PCOMTRUED,
20412   IX86_BUILTIN_PCOMEQQ,
20413   IX86_BUILTIN_PCOMNEQ,
20414   IX86_BUILTIN_PCOMLTQ,
20415   IX86_BUILTIN_PCOMLEQ,
20416   IX86_BUILTIN_PCOMGTQ,
20417   IX86_BUILTIN_PCOMGEQ,
20418   IX86_BUILTIN_PCOMFALSEQ,
20419   IX86_BUILTIN_PCOMTRUEQ,
20420
20421   IX86_BUILTIN_MAX
20422 };
20423
20424 /* Table for the ix86 builtin decls.  */
20425 static GTY(()) tree ix86_builtins[(int) IX86_BUILTIN_MAX];
20426
20427 /* Table of all of the builtin functions that are possible with different ISA's
20428    but are waiting to be built until a function is declared to use that
20429    ISA.  */
20430 struct builtin_isa GTY(())
20431 {
20432   tree type;                    /* builtin type to use in the declaration */
20433   const char *name;             /* function name */
20434   int isa;                      /* isa_flags this builtin is defined for */
20435   bool const_p;                 /* true if the declaration is constant */
20436 };
20437
20438 static GTY(()) struct builtin_isa ix86_builtins_isa[(int) IX86_BUILTIN_MAX];
20439
20440
20441 /* Add an ix86 target builtin function with CODE, NAME and TYPE.  Save the MASK
20442  * of which isa_flags to use in the ix86_builtins_isa array.  Stores the
20443  * function decl in the ix86_builtins array.  Returns the function decl or
20444  * NULL_TREE, if the builtin was not added.
20445  *
20446  * If the front end has a special hook for builtin functions, delay adding
20447  * builtin functions that aren't in the current ISA until the ISA is changed
20448  * with function specific optimization.  Doing so, can save about 300K for the
20449  * default compiler.  When the builtin is expanded, check at that time whether
20450  * it is valid.
20451  *
20452  * If the front end doesn't have a special hook, record all builtins, even if
20453  * it isn't an instruction set in the current ISA in case the user uses
20454  * function specific options for a different ISA, so that we don't get scope
20455  * errors if a builtin is added in the middle of a function scope.  */
20456
20457 static inline tree
20458 def_builtin (int mask, const char *name, tree type, enum ix86_builtins code)
20459 {
20460   tree decl = NULL_TREE;
20461
20462   if (!(mask & OPTION_MASK_ISA_64BIT) || TARGET_64BIT)
20463     {
20464       ix86_builtins_isa[(int) code].isa = mask;
20465
20466       if ((mask & ix86_isa_flags) != 0
20467           || (lang_hooks.builtin_function
20468               == lang_hooks.builtin_function_ext_scope))
20469
20470         {
20471           decl = add_builtin_function (name, type, code, BUILT_IN_MD, NULL,
20472                                        NULL_TREE);
20473           ix86_builtins[(int) code] = decl;
20474           ix86_builtins_isa[(int) code].type = NULL_TREE;
20475         }
20476       else
20477         {
20478           ix86_builtins[(int) code] = NULL_TREE;
20479           ix86_builtins_isa[(int) code].const_p = false;
20480           ix86_builtins_isa[(int) code].type = type;
20481           ix86_builtins_isa[(int) code].name = name;
20482         }
20483     }
20484
20485   return decl;
20486 }
20487
20488 /* Like def_builtin, but also marks the function decl "const".  */
20489
20490 static inline tree
20491 def_builtin_const (int mask, const char *name, tree type,
20492                    enum ix86_builtins code)
20493 {
20494   tree decl = def_builtin (mask, name, type, code);
20495   if (decl)
20496     TREE_READONLY (decl) = 1;
20497   else
20498     ix86_builtins_isa[(int) code].const_p = true;
20499
20500   return decl;
20501 }
20502
20503 /* Add any new builtin functions for a given ISA that may not have been
20504    declared.  This saves a bit of space compared to adding all of the
20505    declarations to the tree, even if we didn't use them.  */
20506
20507 static void
20508 ix86_add_new_builtins (int isa)
20509 {
20510   int i;
20511   tree decl;
20512
20513   for (i = 0; i < (int)IX86_BUILTIN_MAX; i++)
20514     {
20515       if ((ix86_builtins_isa[i].isa & isa) != 0
20516           && ix86_builtins_isa[i].type != NULL_TREE)
20517         {
20518           decl = add_builtin_function_ext_scope (ix86_builtins_isa[i].name,
20519                                                  ix86_builtins_isa[i].type,
20520                                                  i, BUILT_IN_MD, NULL,
20521                                                  NULL_TREE);
20522
20523           ix86_builtins[i] = decl;
20524           ix86_builtins_isa[i].type = NULL_TREE;
20525           if (ix86_builtins_isa[i].const_p)
20526             TREE_READONLY (decl) = 1;
20527         }
20528     }
20529 }
20530
20531 /* Bits for builtin_description.flag.  */
20532
20533 /* Set when we don't support the comparison natively, and should
20534    swap_comparison in order to support it.  */
20535 #define BUILTIN_DESC_SWAP_OPERANDS      1
20536
20537 struct builtin_description
20538 {
20539   const unsigned int mask;
20540   const enum insn_code icode;
20541   const char *const name;
20542   const enum ix86_builtins code;
20543   const enum rtx_code comparison;
20544   const int flag;
20545 };
20546
20547 static const struct builtin_description bdesc_comi[] =
20548 {
20549   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comieq", IX86_BUILTIN_COMIEQSS, UNEQ, 0 },
20550   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comilt", IX86_BUILTIN_COMILTSS, UNLT, 0 },
20551   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comile", IX86_BUILTIN_COMILESS, UNLE, 0 },
20552   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comigt", IX86_BUILTIN_COMIGTSS, GT, 0 },
20553   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comige", IX86_BUILTIN_COMIGESS, GE, 0 },
20554   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_comi, "__builtin_ia32_comineq", IX86_BUILTIN_COMINEQSS, LTGT, 0 },
20555   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomieq", IX86_BUILTIN_UCOMIEQSS, UNEQ, 0 },
20556   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomilt", IX86_BUILTIN_UCOMILTSS, UNLT, 0 },
20557   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomile", IX86_BUILTIN_UCOMILESS, UNLE, 0 },
20558   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomigt", IX86_BUILTIN_UCOMIGTSS, GT, 0 },
20559   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomige", IX86_BUILTIN_UCOMIGESS, GE, 0 },
20560   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_ucomi, "__builtin_ia32_ucomineq", IX86_BUILTIN_UCOMINEQSS, LTGT, 0 },
20561   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdeq", IX86_BUILTIN_COMIEQSD, UNEQ, 0 },
20562   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdlt", IX86_BUILTIN_COMILTSD, UNLT, 0 },
20563   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdle", IX86_BUILTIN_COMILESD, UNLE, 0 },
20564   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdgt", IX86_BUILTIN_COMIGTSD, GT, 0 },
20565   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdge", IX86_BUILTIN_COMIGESD, GE, 0 },
20566   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_comi, "__builtin_ia32_comisdneq", IX86_BUILTIN_COMINEQSD, LTGT, 0 },
20567   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdeq", IX86_BUILTIN_UCOMIEQSD, UNEQ, 0 },
20568   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdlt", IX86_BUILTIN_UCOMILTSD, UNLT, 0 },
20569   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdle", IX86_BUILTIN_UCOMILESD, UNLE, 0 },
20570   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdgt", IX86_BUILTIN_UCOMIGTSD, GT, 0 },
20571   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdge", IX86_BUILTIN_UCOMIGESD, GE, 0 },
20572   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ucomi, "__builtin_ia32_ucomisdneq", IX86_BUILTIN_UCOMINEQSD, LTGT, 0 },
20573 };
20574
20575 static const struct builtin_description bdesc_pcmpestr[] =
20576 {
20577   /* SSE4.2 */
20578   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestri128", IX86_BUILTIN_PCMPESTRI128, UNKNOWN, 0 },
20579   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestrm128", IX86_BUILTIN_PCMPESTRM128, UNKNOWN, 0 },
20580   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestria128", IX86_BUILTIN_PCMPESTRA128, UNKNOWN, (int) CCAmode },
20581   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestric128", IX86_BUILTIN_PCMPESTRC128, UNKNOWN, (int) CCCmode },
20582   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestrio128", IX86_BUILTIN_PCMPESTRO128, UNKNOWN, (int) CCOmode },
20583   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestris128", IX86_BUILTIN_PCMPESTRS128, UNKNOWN, (int) CCSmode },
20584   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpestr, "__builtin_ia32_pcmpestriz128", IX86_BUILTIN_PCMPESTRZ128, UNKNOWN, (int) CCZmode },
20585 };
20586
20587 static const struct builtin_description bdesc_pcmpistr[] =
20588 {
20589   /* SSE4.2 */
20590   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistri128", IX86_BUILTIN_PCMPISTRI128, UNKNOWN, 0 },
20591   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistrm128", IX86_BUILTIN_PCMPISTRM128, UNKNOWN, 0 },
20592   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistria128", IX86_BUILTIN_PCMPISTRA128, UNKNOWN, (int) CCAmode },
20593   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistric128", IX86_BUILTIN_PCMPISTRC128, UNKNOWN, (int) CCCmode },
20594   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistrio128", IX86_BUILTIN_PCMPISTRO128, UNKNOWN, (int) CCOmode },
20595   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistris128", IX86_BUILTIN_PCMPISTRS128, UNKNOWN, (int) CCSmode },
20596   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_pcmpistr, "__builtin_ia32_pcmpistriz128", IX86_BUILTIN_PCMPISTRZ128, UNKNOWN, (int) CCZmode },
20597 };
20598
20599 /* Special builtin types */
20600 enum ix86_special_builtin_type
20601 {
20602   SPECIAL_FTYPE_UNKNOWN,
20603   VOID_FTYPE_VOID,
20604   V32QI_FTYPE_PCCHAR,
20605   V16QI_FTYPE_PCCHAR,
20606   V8SF_FTYPE_PCV4SF,
20607   V8SF_FTYPE_PCFLOAT,
20608   V4DF_FTYPE_PCV2DF,
20609   V4DF_FTYPE_PCDOUBLE,
20610   V4SF_FTYPE_PCFLOAT,
20611   V2DF_FTYPE_PCDOUBLE,
20612   V8SF_FTYPE_PCV8SF_V8SF,
20613   V4DF_FTYPE_PCV4DF_V4DF,
20614   V4SF_FTYPE_V4SF_PCV2SF,
20615   V4SF_FTYPE_PCV4SF_V4SF,
20616   V2DF_FTYPE_V2DF_PCDOUBLE,
20617   V2DF_FTYPE_PCV2DF_V2DF,
20618   V2DI_FTYPE_PV2DI,
20619   VOID_FTYPE_PV2SF_V4SF,
20620   VOID_FTYPE_PV4DI_V4DI,
20621   VOID_FTYPE_PV2DI_V2DI,
20622   VOID_FTYPE_PCHAR_V32QI,
20623   VOID_FTYPE_PCHAR_V16QI,
20624   VOID_FTYPE_PFLOAT_V8SF,
20625   VOID_FTYPE_PFLOAT_V4SF,
20626   VOID_FTYPE_PDOUBLE_V4DF,
20627   VOID_FTYPE_PDOUBLE_V2DF,
20628   VOID_FTYPE_PDI_DI,
20629   VOID_FTYPE_PINT_INT,
20630   VOID_FTYPE_PV8SF_V8SF_V8SF,
20631   VOID_FTYPE_PV4DF_V4DF_V4DF,
20632   VOID_FTYPE_PV4SF_V4SF_V4SF,
20633   VOID_FTYPE_PV2DF_V2DF_V2DF
20634 };
20635
20636 /* Builtin types */
20637 enum ix86_builtin_type
20638 {
20639   FTYPE_UNKNOWN,
20640   FLOAT128_FTYPE_FLOAT128,
20641   FLOAT_FTYPE_FLOAT,
20642   FLOAT128_FTYPE_FLOAT128_FLOAT128,
20643   INT_FTYPE_V8SF_V8SF_PTEST,
20644   INT_FTYPE_V4DI_V4DI_PTEST,
20645   INT_FTYPE_V4DF_V4DF_PTEST,
20646   INT_FTYPE_V4SF_V4SF_PTEST,
20647   INT_FTYPE_V2DI_V2DI_PTEST,
20648   INT_FTYPE_V2DF_V2DF_PTEST,
20649   INT64_FTYPE_V4SF,
20650   INT64_FTYPE_V2DF,
20651   INT_FTYPE_V16QI,
20652   INT_FTYPE_V8QI,
20653   INT_FTYPE_V8SF,
20654   INT_FTYPE_V4DF,
20655   INT_FTYPE_V4SF,
20656   INT_FTYPE_V2DF,
20657   V16QI_FTYPE_V16QI,
20658   V8SI_FTYPE_V8SF,
20659   V8SI_FTYPE_V4SI,
20660   V8HI_FTYPE_V8HI,
20661   V8HI_FTYPE_V16QI,
20662   V8QI_FTYPE_V8QI,
20663   V8SF_FTYPE_V8SF,
20664   V8SF_FTYPE_V8SI,
20665   V8SF_FTYPE_V4SF,
20666   V4SI_FTYPE_V4SI,
20667   V4SI_FTYPE_V16QI,
20668   V4SI_FTYPE_V8SI,
20669   V4SI_FTYPE_V8HI,
20670   V4SI_FTYPE_V4DF,
20671   V4SI_FTYPE_V4SF,
20672   V4SI_FTYPE_V2DF,
20673   V4HI_FTYPE_V4HI,
20674   V4DF_FTYPE_V4DF,
20675   V4DF_FTYPE_V4SI,
20676   V4DF_FTYPE_V4SF,
20677   V4DF_FTYPE_V2DF,
20678   V4SF_FTYPE_V4DF,
20679   V4SF_FTYPE_V4SF,
20680   V4SF_FTYPE_V4SF_VEC_MERGE,
20681   V4SF_FTYPE_V8SF,
20682   V4SF_FTYPE_V4SI,
20683   V4SF_FTYPE_V2DF,
20684   V2DI_FTYPE_V2DI,
20685   V2DI_FTYPE_V16QI,
20686   V2DI_FTYPE_V8HI,
20687   V2DI_FTYPE_V4SI,
20688   V2DF_FTYPE_V2DF,
20689   V2DF_FTYPE_V2DF_VEC_MERGE,
20690   V2DF_FTYPE_V4SI,
20691   V2DF_FTYPE_V4DF,
20692   V2DF_FTYPE_V4SF,
20693   V2DF_FTYPE_V2SI,
20694   V2SI_FTYPE_V2SI,
20695   V2SI_FTYPE_V4SF,
20696   V2SI_FTYPE_V2SF,
20697   V2SI_FTYPE_V2DF,
20698   V2SF_FTYPE_V2SF,
20699   V2SF_FTYPE_V2SI,
20700   V16QI_FTYPE_V16QI_V16QI,
20701   V16QI_FTYPE_V8HI_V8HI,
20702   V8QI_FTYPE_V8QI_V8QI,
20703   V8QI_FTYPE_V4HI_V4HI,
20704   V8HI_FTYPE_V8HI_V8HI,
20705   V8HI_FTYPE_V8HI_V8HI_COUNT,
20706   V8HI_FTYPE_V16QI_V16QI,
20707   V8HI_FTYPE_V4SI_V4SI,
20708   V8HI_FTYPE_V8HI_SI_COUNT,
20709   V8SF_FTYPE_V8SF_V8SF,
20710   V8SF_FTYPE_V8SF_V8SI,
20711   V4SI_FTYPE_V4SI_V4SI,
20712   V4SI_FTYPE_V4SI_V4SI_COUNT,
20713   V4SI_FTYPE_V8HI_V8HI,
20714   V4SI_FTYPE_V4SF_V4SF,
20715   V4SI_FTYPE_V2DF_V2DF,
20716   V4SI_FTYPE_V4SI_SI_COUNT,
20717   V4HI_FTYPE_V4HI_V4HI,
20718   V4HI_FTYPE_V4HI_V4HI_COUNT,
20719   V4HI_FTYPE_V8QI_V8QI,
20720   V4HI_FTYPE_V2SI_V2SI,
20721   V4HI_FTYPE_V4HI_SI_COUNT,
20722   V4DF_FTYPE_V4DF_V4DF,
20723   V4DF_FTYPE_V4DF_V4DI,
20724   V4SF_FTYPE_V4SF_V4SF,
20725   V4SF_FTYPE_V4SF_V4SF_SWAP,
20726   V4SF_FTYPE_V4SF_V4SI,
20727   V4SF_FTYPE_V4SF_V2SI,
20728   V4SF_FTYPE_V4SF_V2DF,
20729   V4SF_FTYPE_V4SF_DI,
20730   V4SF_FTYPE_V4SF_SI,
20731   V2DI_FTYPE_V2DI_V2DI,
20732   V2DI_FTYPE_V2DI_V2DI_COUNT,
20733   V2DI_FTYPE_V16QI_V16QI,
20734   V2DI_FTYPE_V4SI_V4SI,
20735   V2DI_FTYPE_V2DI_V16QI,
20736   V2DI_FTYPE_V2DF_V2DF,
20737   V2DI_FTYPE_V2DI_SI_COUNT,
20738   V2SI_FTYPE_V2SI_V2SI,
20739   V2SI_FTYPE_V2SI_V2SI_COUNT,
20740   V2SI_FTYPE_V4HI_V4HI,
20741   V2SI_FTYPE_V2SF_V2SF,
20742   V2SI_FTYPE_V2SI_SI_COUNT,
20743   V2DF_FTYPE_V2DF_V2DF,
20744   V2DF_FTYPE_V2DF_V2DF_SWAP,
20745   V2DF_FTYPE_V2DF_V4SF,
20746   V2DF_FTYPE_V2DF_V2DI,
20747   V2DF_FTYPE_V2DF_DI,
20748   V2DF_FTYPE_V2DF_SI,
20749   V2SF_FTYPE_V2SF_V2SF,
20750   V1DI_FTYPE_V1DI_V1DI,
20751   V1DI_FTYPE_V1DI_V1DI_COUNT,
20752   V1DI_FTYPE_V8QI_V8QI,
20753   V1DI_FTYPE_V2SI_V2SI,
20754   V1DI_FTYPE_V1DI_SI_COUNT,
20755   UINT64_FTYPE_UINT64_UINT64,
20756   UINT_FTYPE_UINT_UINT,
20757   UINT_FTYPE_UINT_USHORT,
20758   UINT_FTYPE_UINT_UCHAR,
20759   V8HI_FTYPE_V8HI_INT,
20760   V4SI_FTYPE_V4SI_INT,
20761   V4HI_FTYPE_V4HI_INT,
20762   V8SF_FTYPE_V8SF_INT,
20763   V4SI_FTYPE_V8SI_INT,
20764   V4SF_FTYPE_V8SF_INT,
20765   V2DF_FTYPE_V4DF_INT,
20766   V4DF_FTYPE_V4DF_INT,
20767   V4SF_FTYPE_V4SF_INT,
20768   V2DI_FTYPE_V2DI_INT,
20769   V2DI2TI_FTYPE_V2DI_INT,
20770   V2DF_FTYPE_V2DF_INT,
20771   V16QI_FTYPE_V16QI_V16QI_V16QI,
20772   V8SF_FTYPE_V8SF_V8SF_V8SF,
20773   V4DF_FTYPE_V4DF_V4DF_V4DF,
20774   V4SF_FTYPE_V4SF_V4SF_V4SF,
20775   V2DF_FTYPE_V2DF_V2DF_V2DF,
20776   V16QI_FTYPE_V16QI_V16QI_INT,
20777   V8SI_FTYPE_V8SI_V8SI_INT,
20778   V8SI_FTYPE_V8SI_V4SI_INT,
20779   V8HI_FTYPE_V8HI_V8HI_INT,
20780   V8SF_FTYPE_V8SF_V8SF_INT,
20781   V8SF_FTYPE_V8SF_V4SF_INT,
20782   V4SI_FTYPE_V4SI_V4SI_INT,
20783   V4DF_FTYPE_V4DF_V4DF_INT,
20784   V4DF_FTYPE_V4DF_V2DF_INT,
20785   V4SF_FTYPE_V4SF_V4SF_INT,
20786   V2DI_FTYPE_V2DI_V2DI_INT,
20787   V2DI2TI_FTYPE_V2DI_V2DI_INT,
20788   V1DI2DI_FTYPE_V1DI_V1DI_INT,
20789   V2DF_FTYPE_V2DF_V2DF_INT,
20790   V2DI_FTYPE_V2DI_UINT_UINT,
20791   V2DI_FTYPE_V2DI_V2DI_UINT_UINT
20792 };
20793
20794 /* Special builtins with variable number of arguments.  */
20795 static const struct builtin_description bdesc_special_args[] =
20796 {
20797   /* MMX */
20798   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_emms, "__builtin_ia32_emms", IX86_BUILTIN_EMMS, UNKNOWN, (int) VOID_FTYPE_VOID },
20799
20800   /* 3DNow! */
20801   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_femms, "__builtin_ia32_femms", IX86_BUILTIN_FEMMS, UNKNOWN, (int) VOID_FTYPE_VOID },
20802
20803   /* SSE */
20804   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movups, "__builtin_ia32_storeups", IX86_BUILTIN_STOREUPS, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V4SF },
20805   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movntv4sf, "__builtin_ia32_movntps", IX86_BUILTIN_MOVNTPS, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V4SF },
20806   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movups, "__builtin_ia32_loadups", IX86_BUILTIN_LOADUPS, UNKNOWN, (int) V4SF_FTYPE_PCFLOAT },
20807
20808   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_loadhps_exp, "__builtin_ia32_loadhps", IX86_BUILTIN_LOADHPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_PCV2SF },
20809   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_loadlps_exp, "__builtin_ia32_loadlps", IX86_BUILTIN_LOADLPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_PCV2SF },
20810   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_storehps, "__builtin_ia32_storehps", IX86_BUILTIN_STOREHPS, UNKNOWN, (int) VOID_FTYPE_PV2SF_V4SF },
20811   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_storelps, "__builtin_ia32_storelps", IX86_BUILTIN_STORELPS, UNKNOWN, (int) VOID_FTYPE_PV2SF_V4SF },
20812
20813   /* SSE or 3DNow!A  */
20814   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, CODE_FOR_sse_sfence, "__builtin_ia32_sfence", IX86_BUILTIN_SFENCE, UNKNOWN, (int) VOID_FTYPE_VOID },
20815   { 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 },
20816
20817   /* SSE2 */
20818   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_lfence, "__builtin_ia32_lfence", IX86_BUILTIN_LFENCE, UNKNOWN, (int) VOID_FTYPE_VOID },
20819   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_mfence, 0, IX86_BUILTIN_MFENCE, UNKNOWN, (int) VOID_FTYPE_VOID },
20820   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movupd, "__builtin_ia32_storeupd", IX86_BUILTIN_STOREUPD, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V2DF },
20821   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movdqu, "__builtin_ia32_storedqu", IX86_BUILTIN_STOREDQU, UNKNOWN, (int) VOID_FTYPE_PCHAR_V16QI },
20822   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movntv2df, "__builtin_ia32_movntpd", IX86_BUILTIN_MOVNTPD, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V2DF },
20823   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movntv2di, "__builtin_ia32_movntdq", IX86_BUILTIN_MOVNTDQ, UNKNOWN, (int) VOID_FTYPE_PV2DI_V2DI },
20824   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movntsi, "__builtin_ia32_movnti", IX86_BUILTIN_MOVNTI, UNKNOWN, (int) VOID_FTYPE_PINT_INT },
20825   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movupd, "__builtin_ia32_loadupd", IX86_BUILTIN_LOADUPD, UNKNOWN, (int) V2DF_FTYPE_PCDOUBLE },
20826   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movdqu, "__builtin_ia32_loaddqu", IX86_BUILTIN_LOADDQU, UNKNOWN, (int) V16QI_FTYPE_PCCHAR },
20827
20828   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_loadhpd_exp, "__builtin_ia32_loadhpd", IX86_BUILTIN_LOADHPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_PCDOUBLE },
20829   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_loadlpd_exp, "__builtin_ia32_loadlpd", IX86_BUILTIN_LOADLPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_PCDOUBLE },
20830
20831   /* SSE3 */
20832   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_lddqu, "__builtin_ia32_lddqu", IX86_BUILTIN_LDDQU, UNKNOWN, (int) V16QI_FTYPE_PCCHAR },
20833
20834   /* SSE4.1 */
20835   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_movntdqa, "__builtin_ia32_movntdqa", IX86_BUILTIN_MOVNTDQA, UNKNOWN, (int) V2DI_FTYPE_PV2DI },
20836
20837   /* SSE4A */
20838   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_vmmovntv2df, "__builtin_ia32_movntsd", IX86_BUILTIN_MOVNTSD, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V2DF },
20839   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_vmmovntv4sf, "__builtin_ia32_movntss", IX86_BUILTIN_MOVNTSS, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V4SF },
20840
20841   /* AVX */
20842   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vzeroall, "__builtin_ia32_vzeroall", IX86_BUILTIN_VZEROALL, UNKNOWN, (int) VOID_FTYPE_VOID },
20843   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vzeroupper, 0, IX86_BUILTIN_VZEROUPPER, UNKNOWN, (int) VOID_FTYPE_VOID },
20844   { OPTION_MASK_ISA_AVX | OPTION_MASK_ISA_64BIT, CODE_FOR_avx_vzeroupper_rex64, 0, IX86_BUILTIN_VZEROUPPER_REX64, UNKNOWN, (int) VOID_FTYPE_VOID },
20845
20846   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vbroadcastss, "__builtin_ia32_vbroadcastss", IX86_BUILTIN_VBROADCASTSS, UNKNOWN, (int) V4SF_FTYPE_PCFLOAT },
20847   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vbroadcastsd256, "__builtin_ia32_vbroadcastsd256", IX86_BUILTIN_VBROADCASTSD256, UNKNOWN, (int) V4DF_FTYPE_PCDOUBLE },
20848   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vbroadcastss256, "__builtin_ia32_vbroadcastss256", IX86_BUILTIN_VBROADCASTSS256, UNKNOWN, (int) V8SF_FTYPE_PCFLOAT },
20849   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vbroadcastf128_pd256, "__builtin_ia32_vbroadcastf128_pd256", IX86_BUILTIN_VBROADCASTPD256, UNKNOWN, (int) V4DF_FTYPE_PCV2DF },
20850   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vbroadcastf128_ps256, "__builtin_ia32_vbroadcastf128_ps256", IX86_BUILTIN_VBROADCASTPS256, UNKNOWN, (int) V8SF_FTYPE_PCV4SF },
20851
20852   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movupd256, "__builtin_ia32_loadupd256", IX86_BUILTIN_LOADUPD256, UNKNOWN, (int) V4DF_FTYPE_PCDOUBLE },
20853   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movups256, "__builtin_ia32_loadups256", IX86_BUILTIN_LOADUPS256, UNKNOWN, (int) V8SF_FTYPE_PCFLOAT },
20854   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movupd256, "__builtin_ia32_storeupd256", IX86_BUILTIN_STOREUPD256, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V4DF },
20855   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movups256, "__builtin_ia32_storeups256", IX86_BUILTIN_STOREUPS256, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V8SF },
20856   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movdqu256, "__builtin_ia32_loaddqu256", IX86_BUILTIN_LOADDQU256, UNKNOWN, (int) V32QI_FTYPE_PCCHAR },
20857   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movdqu256, "__builtin_ia32_storedqu256", IX86_BUILTIN_STOREDQU256, UNKNOWN, (int) VOID_FTYPE_PCHAR_V32QI },
20858   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_lddqu256, "__builtin_ia32_lddqu256", IX86_BUILTIN_LDDQU256, UNKNOWN, (int) V32QI_FTYPE_PCCHAR },
20859
20860   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movntv4di, "__builtin_ia32_movntdq256", IX86_BUILTIN_MOVNTDQ256, UNKNOWN, (int) VOID_FTYPE_PV4DI_V4DI },
20861   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movntv4df, "__builtin_ia32_movntpd256", IX86_BUILTIN_MOVNTPD256, UNKNOWN, (int) VOID_FTYPE_PDOUBLE_V4DF },
20862   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movntv8sf, "__builtin_ia32_movntps256", IX86_BUILTIN_MOVNTPS256, UNKNOWN, (int) VOID_FTYPE_PFLOAT_V8SF },
20863
20864   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskloadpd, "__builtin_ia32_maskloadpd", IX86_BUILTIN_MASKLOADPD, UNKNOWN, (int) V2DF_FTYPE_PCV2DF_V2DF },
20865   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskloadps, "__builtin_ia32_maskloadps", IX86_BUILTIN_MASKLOADPS, UNKNOWN, (int) V4SF_FTYPE_PCV4SF_V4SF },
20866   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskloadpd256, "__builtin_ia32_maskloadpd256", IX86_BUILTIN_MASKLOADPD256, UNKNOWN, (int) V4DF_FTYPE_PCV4DF_V4DF },
20867   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskloadps256, "__builtin_ia32_maskloadps256", IX86_BUILTIN_MASKLOADPS256, UNKNOWN, (int) V8SF_FTYPE_PCV8SF_V8SF },
20868   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskstorepd, "__builtin_ia32_maskstorepd", IX86_BUILTIN_MASKSTOREPD, UNKNOWN, (int) VOID_FTYPE_PV2DF_V2DF_V2DF },
20869   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskstoreps, "__builtin_ia32_maskstoreps", IX86_BUILTIN_MASKSTOREPS, UNKNOWN, (int) VOID_FTYPE_PV4SF_V4SF_V4SF },
20870   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskstorepd256, "__builtin_ia32_maskstorepd256", IX86_BUILTIN_MASKSTOREPD256, UNKNOWN, (int) VOID_FTYPE_PV4DF_V4DF_V4DF },
20871   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_maskstoreps256, "__builtin_ia32_maskstoreps256", IX86_BUILTIN_MASKSTOREPS256, UNKNOWN, (int) VOID_FTYPE_PV8SF_V8SF_V8SF },
20872 };
20873
20874 /* Builtins with variable number of arguments.  */
20875 static const struct builtin_description bdesc_args[] =
20876 {
20877   /* MMX */
20878   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_addv8qi3, "__builtin_ia32_paddb", IX86_BUILTIN_PADDB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
20879   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_addv4hi3, "__builtin_ia32_paddw", IX86_BUILTIN_PADDW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
20880   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_addv2si3, "__builtin_ia32_paddd", IX86_BUILTIN_PADDD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
20881   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_subv8qi3, "__builtin_ia32_psubb", IX86_BUILTIN_PSUBB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
20882   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_subv4hi3, "__builtin_ia32_psubw", IX86_BUILTIN_PSUBW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
20883   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_subv2si3, "__builtin_ia32_psubd", IX86_BUILTIN_PSUBD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
20884
20885   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ssaddv8qi3, "__builtin_ia32_paddsb", IX86_BUILTIN_PADDSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
20886   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ssaddv4hi3, "__builtin_ia32_paddsw", IX86_BUILTIN_PADDSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
20887   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_sssubv8qi3, "__builtin_ia32_psubsb", IX86_BUILTIN_PSUBSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
20888   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_sssubv4hi3, "__builtin_ia32_psubsw", IX86_BUILTIN_PSUBSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
20889   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_usaddv8qi3, "__builtin_ia32_paddusb", IX86_BUILTIN_PADDUSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
20890   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_usaddv4hi3, "__builtin_ia32_paddusw", IX86_BUILTIN_PADDUSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
20891   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ussubv8qi3, "__builtin_ia32_psubusb", IX86_BUILTIN_PSUBUSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
20892   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ussubv4hi3, "__builtin_ia32_psubusw", IX86_BUILTIN_PSUBUSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
20893
20894   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_mulv4hi3, "__builtin_ia32_pmullw", IX86_BUILTIN_PMULLW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
20895   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_smulv4hi3_highpart, "__builtin_ia32_pmulhw", IX86_BUILTIN_PMULHW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
20896
20897   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_andv2si3, "__builtin_ia32_pand", IX86_BUILTIN_PAND, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
20898   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_andnotv2si3, "__builtin_ia32_pandn", IX86_BUILTIN_PANDN, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
20899   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_iorv2si3, "__builtin_ia32_por", IX86_BUILTIN_POR, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
20900   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_xorv2si3, "__builtin_ia32_pxor", IX86_BUILTIN_PXOR, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
20901
20902   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_eqv8qi3, "__builtin_ia32_pcmpeqb", IX86_BUILTIN_PCMPEQB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
20903   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_eqv4hi3, "__builtin_ia32_pcmpeqw", IX86_BUILTIN_PCMPEQW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
20904   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_eqv2si3, "__builtin_ia32_pcmpeqd", IX86_BUILTIN_PCMPEQD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
20905   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_gtv8qi3, "__builtin_ia32_pcmpgtb", IX86_BUILTIN_PCMPGTB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
20906   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_gtv4hi3, "__builtin_ia32_pcmpgtw", IX86_BUILTIN_PCMPGTW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
20907   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_gtv2si3, "__builtin_ia32_pcmpgtd", IX86_BUILTIN_PCMPGTD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
20908
20909   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpckhbw, "__builtin_ia32_punpckhbw", IX86_BUILTIN_PUNPCKHBW, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
20910   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpckhwd, "__builtin_ia32_punpckhwd", IX86_BUILTIN_PUNPCKHWD, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
20911   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpckhdq, "__builtin_ia32_punpckhdq", IX86_BUILTIN_PUNPCKHDQ, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
20912   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpcklbw, "__builtin_ia32_punpcklbw", IX86_BUILTIN_PUNPCKLBW, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
20913   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpcklwd, "__builtin_ia32_punpcklwd", IX86_BUILTIN_PUNPCKLWD, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI},
20914   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_punpckldq, "__builtin_ia32_punpckldq", IX86_BUILTIN_PUNPCKLDQ, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI},
20915
20916   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_packsswb, "__builtin_ia32_packsswb", IX86_BUILTIN_PACKSSWB, UNKNOWN, (int) V8QI_FTYPE_V4HI_V4HI },
20917   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_packssdw, "__builtin_ia32_packssdw", IX86_BUILTIN_PACKSSDW, UNKNOWN, (int) V4HI_FTYPE_V2SI_V2SI },
20918   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_packuswb, "__builtin_ia32_packuswb", IX86_BUILTIN_PACKUSWB, UNKNOWN, (int) V8QI_FTYPE_V4HI_V4HI },
20919
20920   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_pmaddwd, "__builtin_ia32_pmaddwd", IX86_BUILTIN_PMADDWD, UNKNOWN, (int) V2SI_FTYPE_V4HI_V4HI },
20921
20922   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv4hi3, "__builtin_ia32_psllwi", IX86_BUILTIN_PSLLWI, UNKNOWN, (int) V4HI_FTYPE_V4HI_SI_COUNT },
20923   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv2si3, "__builtin_ia32_pslldi", IX86_BUILTIN_PSLLDI, UNKNOWN, (int) V2SI_FTYPE_V2SI_SI_COUNT },
20924   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv1di3, "__builtin_ia32_psllqi", IX86_BUILTIN_PSLLQI, UNKNOWN, (int) V1DI_FTYPE_V1DI_SI_COUNT },
20925   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv4hi3, "__builtin_ia32_psllw", IX86_BUILTIN_PSLLW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI_COUNT },
20926   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv2si3, "__builtin_ia32_pslld", IX86_BUILTIN_PSLLD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI_COUNT },
20927   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashlv1di3, "__builtin_ia32_psllq", IX86_BUILTIN_PSLLQ, UNKNOWN, (int) V1DI_FTYPE_V1DI_V1DI_COUNT },
20928
20929   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv4hi3, "__builtin_ia32_psrlwi", IX86_BUILTIN_PSRLWI, UNKNOWN, (int) V4HI_FTYPE_V4HI_SI_COUNT },
20930   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv2si3, "__builtin_ia32_psrldi", IX86_BUILTIN_PSRLDI, UNKNOWN, (int) V2SI_FTYPE_V2SI_SI_COUNT },
20931   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv1di3, "__builtin_ia32_psrlqi", IX86_BUILTIN_PSRLQI, UNKNOWN, (int) V1DI_FTYPE_V1DI_SI_COUNT },
20932   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv4hi3, "__builtin_ia32_psrlw", IX86_BUILTIN_PSRLW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI_COUNT },
20933   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv2si3, "__builtin_ia32_psrld", IX86_BUILTIN_PSRLD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI_COUNT },
20934   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_lshrv1di3, "__builtin_ia32_psrlq", IX86_BUILTIN_PSRLQ, UNKNOWN, (int) V1DI_FTYPE_V1DI_V1DI_COUNT },
20935
20936   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashrv4hi3, "__builtin_ia32_psrawi", IX86_BUILTIN_PSRAWI, UNKNOWN, (int) V4HI_FTYPE_V4HI_SI_COUNT },
20937   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashrv2si3, "__builtin_ia32_psradi", IX86_BUILTIN_PSRADI, UNKNOWN, (int) V2SI_FTYPE_V2SI_SI_COUNT },
20938   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashrv4hi3, "__builtin_ia32_psraw", IX86_BUILTIN_PSRAW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI_COUNT },
20939   { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_ashrv2si3, "__builtin_ia32_psrad", IX86_BUILTIN_PSRAD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI_COUNT },
20940
20941   /* 3DNow! */
20942   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_pf2id, "__builtin_ia32_pf2id", IX86_BUILTIN_PF2ID, UNKNOWN, (int) V2SI_FTYPE_V2SF },
20943   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_floatv2si2, "__builtin_ia32_pi2fd", IX86_BUILTIN_PI2FD, UNKNOWN, (int) V2SF_FTYPE_V2SI },
20944   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rcpv2sf2, "__builtin_ia32_pfrcp", IX86_BUILTIN_PFRCP, UNKNOWN, (int) V2SF_FTYPE_V2SF },
20945   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rsqrtv2sf2, "__builtin_ia32_pfrsqrt", IX86_BUILTIN_PFRSQRT, UNKNOWN, (int) V2SF_FTYPE_V2SF },
20946
20947   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_uavgv8qi3, "__builtin_ia32_pavgusb", IX86_BUILTIN_PAVGUSB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
20948   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_haddv2sf3, "__builtin_ia32_pfacc", IX86_BUILTIN_PFACC, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
20949   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_addv2sf3, "__builtin_ia32_pfadd", IX86_BUILTIN_PFADD, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
20950   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_eqv2sf3, "__builtin_ia32_pfcmpeq", IX86_BUILTIN_PFCMPEQ, UNKNOWN, (int) V2SI_FTYPE_V2SF_V2SF },
20951   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_gev2sf3, "__builtin_ia32_pfcmpge", IX86_BUILTIN_PFCMPGE, UNKNOWN, (int) V2SI_FTYPE_V2SF_V2SF },
20952   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_gtv2sf3, "__builtin_ia32_pfcmpgt", IX86_BUILTIN_PFCMPGT, UNKNOWN, (int) V2SI_FTYPE_V2SF_V2SF },
20953   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_smaxv2sf3, "__builtin_ia32_pfmax", IX86_BUILTIN_PFMAX, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
20954   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_sminv2sf3, "__builtin_ia32_pfmin", IX86_BUILTIN_PFMIN, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
20955   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_mulv2sf3, "__builtin_ia32_pfmul", IX86_BUILTIN_PFMUL, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
20956   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rcpit1v2sf3, "__builtin_ia32_pfrcpit1", IX86_BUILTIN_PFRCPIT1, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
20957   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rcpit2v2sf3, "__builtin_ia32_pfrcpit2", IX86_BUILTIN_PFRCPIT2, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
20958   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_rsqit1v2sf3, "__builtin_ia32_pfrsqit1", IX86_BUILTIN_PFRSQIT1, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
20959   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_subv2sf3, "__builtin_ia32_pfsub", IX86_BUILTIN_PFSUB, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
20960   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_subrv2sf3, "__builtin_ia32_pfsubr", IX86_BUILTIN_PFSUBR, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
20961   { OPTION_MASK_ISA_3DNOW, CODE_FOR_mmx_pmulhrwv4hi3, "__builtin_ia32_pmulhrw", IX86_BUILTIN_PMULHRW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
20962
20963   /* 3DNow!A */
20964   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pf2iw, "__builtin_ia32_pf2iw", IX86_BUILTIN_PF2IW, UNKNOWN, (int) V2SI_FTYPE_V2SF },
20965   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pi2fw, "__builtin_ia32_pi2fw", IX86_BUILTIN_PI2FW, UNKNOWN, (int) V2SF_FTYPE_V2SI },
20966   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pswapdv2si2, "__builtin_ia32_pswapdsi", IX86_BUILTIN_PSWAPDSI, UNKNOWN, (int) V2SI_FTYPE_V2SI },
20967   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pswapdv2sf2, "__builtin_ia32_pswapdsf", IX86_BUILTIN_PSWAPDSF, UNKNOWN, (int) V2SF_FTYPE_V2SF },
20968   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_hsubv2sf3, "__builtin_ia32_pfnacc", IX86_BUILTIN_PFNACC, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
20969   { OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_addsubv2sf3, "__builtin_ia32_pfpnacc", IX86_BUILTIN_PFPNACC, UNKNOWN, (int) V2SF_FTYPE_V2SF_V2SF },
20970
20971   /* SSE */
20972   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movmskps, "__builtin_ia32_movmskps", IX86_BUILTIN_MOVMSKPS, UNKNOWN, (int) INT_FTYPE_V4SF },
20973   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_sqrtv4sf2, "__builtin_ia32_sqrtps", IX86_BUILTIN_SQRTPS, UNKNOWN, (int) V4SF_FTYPE_V4SF },
20974   { OPTION_MASK_ISA_SSE, CODE_FOR_sqrtv4sf2, "__builtin_ia32_sqrtps_nr", IX86_BUILTIN_SQRTPS_NR, UNKNOWN, (int) V4SF_FTYPE_V4SF },
20975   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_rsqrtv4sf2, "__builtin_ia32_rsqrtps", IX86_BUILTIN_RSQRTPS, UNKNOWN, (int) V4SF_FTYPE_V4SF },
20976   { OPTION_MASK_ISA_SSE, CODE_FOR_rsqrtv4sf2, "__builtin_ia32_rsqrtps_nr", IX86_BUILTIN_RSQRTPS_NR, UNKNOWN, (int) V4SF_FTYPE_V4SF },
20977   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_rcpv4sf2, "__builtin_ia32_rcpps", IX86_BUILTIN_RCPPS, UNKNOWN, (int) V4SF_FTYPE_V4SF },
20978   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvtps2pi, "__builtin_ia32_cvtps2pi", IX86_BUILTIN_CVTPS2PI, UNKNOWN, (int) V2SI_FTYPE_V4SF },
20979   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvtss2si, "__builtin_ia32_cvtss2si", IX86_BUILTIN_CVTSS2SI, UNKNOWN, (int) INT_FTYPE_V4SF },
20980   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_64BIT, CODE_FOR_sse_cvtss2siq, "__builtin_ia32_cvtss2si64", IX86_BUILTIN_CVTSS2SI64, UNKNOWN, (int) INT64_FTYPE_V4SF },
20981   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvttps2pi, "__builtin_ia32_cvttps2pi", IX86_BUILTIN_CVTTPS2PI, UNKNOWN, (int) V2SI_FTYPE_V4SF },
20982   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvttss2si, "__builtin_ia32_cvttss2si", IX86_BUILTIN_CVTTSS2SI, UNKNOWN, (int) INT_FTYPE_V4SF },
20983   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_64BIT, CODE_FOR_sse_cvttss2siq, "__builtin_ia32_cvttss2si64", IX86_BUILTIN_CVTTSS2SI64, UNKNOWN, (int) INT64_FTYPE_V4SF },
20984
20985   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_shufps, "__builtin_ia32_shufps", IX86_BUILTIN_SHUFPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
20986
20987   { OPTION_MASK_ISA_SSE, CODE_FOR_addv4sf3, "__builtin_ia32_addps", IX86_BUILTIN_ADDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
20988   { OPTION_MASK_ISA_SSE, CODE_FOR_subv4sf3, "__builtin_ia32_subps", IX86_BUILTIN_SUBPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
20989   { OPTION_MASK_ISA_SSE, CODE_FOR_mulv4sf3, "__builtin_ia32_mulps", IX86_BUILTIN_MULPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
20990   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_divv4sf3, "__builtin_ia32_divps", IX86_BUILTIN_DIVPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
20991   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmaddv4sf3,  "__builtin_ia32_addss", IX86_BUILTIN_ADDSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
20992   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmsubv4sf3,  "__builtin_ia32_subss", IX86_BUILTIN_SUBSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
20993   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmulv4sf3,  "__builtin_ia32_mulss", IX86_BUILTIN_MULSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
20994   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmdivv4sf3,  "__builtin_ia32_divss", IX86_BUILTIN_DIVSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
20995
20996   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpeqps", IX86_BUILTIN_CMPEQPS, EQ, (int) V4SF_FTYPE_V4SF_V4SF },
20997   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpltps", IX86_BUILTIN_CMPLTPS, LT, (int) V4SF_FTYPE_V4SF_V4SF },
20998   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpleps", IX86_BUILTIN_CMPLEPS, LE, (int) V4SF_FTYPE_V4SF_V4SF },
20999   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpgtps", IX86_BUILTIN_CMPGTPS, LT, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
21000   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpgeps", IX86_BUILTIN_CMPGEPS, LE, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
21001   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpunordps", IX86_BUILTIN_CMPUNORDPS, UNORDERED, (int) V4SF_FTYPE_V4SF_V4SF },
21002   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpneqps", IX86_BUILTIN_CMPNEQPS, NE, (int) V4SF_FTYPE_V4SF_V4SF },
21003   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpnltps", IX86_BUILTIN_CMPNLTPS, UNGE, (int) V4SF_FTYPE_V4SF_V4SF },
21004   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpnleps", IX86_BUILTIN_CMPNLEPS, UNGT, (int) V4SF_FTYPE_V4SF_V4SF },
21005   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpngtps", IX86_BUILTIN_CMPNGTPS, UNGE, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
21006   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpngeps", IX86_BUILTIN_CMPNGEPS, UNGT, (int) V4SF_FTYPE_V4SF_V4SF_SWAP},
21007   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_maskcmpv4sf3, "__builtin_ia32_cmpordps", IX86_BUILTIN_CMPORDPS, ORDERED, (int) V4SF_FTYPE_V4SF_V4SF },
21008   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpeqss", IX86_BUILTIN_CMPEQSS, EQ, (int) V4SF_FTYPE_V4SF_V4SF },
21009   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpltss", IX86_BUILTIN_CMPLTSS, LT, (int) V4SF_FTYPE_V4SF_V4SF },
21010   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpless", IX86_BUILTIN_CMPLESS, LE, (int) V4SF_FTYPE_V4SF_V4SF },
21011   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpunordss", IX86_BUILTIN_CMPUNORDSS, UNORDERED, (int) V4SF_FTYPE_V4SF_V4SF },
21012   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpneqss", IX86_BUILTIN_CMPNEQSS, NE, (int) V4SF_FTYPE_V4SF_V4SF },
21013   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpnltss", IX86_BUILTIN_CMPNLTSS, UNGE, (int) V4SF_FTYPE_V4SF_V4SF },
21014   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpnless", IX86_BUILTIN_CMPNLESS, UNGT, (int) V4SF_FTYPE_V4SF_V4SF },
21015   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpngtss", IX86_BUILTIN_CMPNGTSS, UNGE, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
21016   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpngess", IX86_BUILTIN_CMPNGESS, UNGT, (int) V4SF_FTYPE_V4SF_V4SF_SWAP },
21017   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpordss", IX86_BUILTIN_CMPORDSS, ORDERED, (int) V4SF_FTYPE_V4SF_V4SF },
21018
21019   { OPTION_MASK_ISA_SSE, CODE_FOR_sminv4sf3, "__builtin_ia32_minps", IX86_BUILTIN_MINPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21020   { OPTION_MASK_ISA_SSE, CODE_FOR_smaxv4sf3, "__builtin_ia32_maxps", IX86_BUILTIN_MAXPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21021   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmsminv4sf3, "__builtin_ia32_minss", IX86_BUILTIN_MINSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21022   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmsmaxv4sf3, "__builtin_ia32_maxss", IX86_BUILTIN_MAXSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21023
21024   { OPTION_MASK_ISA_SSE, CODE_FOR_andv4sf3, "__builtin_ia32_andps", IX86_BUILTIN_ANDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21025   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_andnotv4sf3,  "__builtin_ia32_andnps", IX86_BUILTIN_ANDNPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21026   { OPTION_MASK_ISA_SSE, CODE_FOR_iorv4sf3, "__builtin_ia32_orps", IX86_BUILTIN_ORPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21027   { OPTION_MASK_ISA_SSE, CODE_FOR_xorv4sf3,  "__builtin_ia32_xorps", IX86_BUILTIN_XORPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21028
21029   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movss,  "__builtin_ia32_movss", IX86_BUILTIN_MOVSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21030   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movhlps_exp,  "__builtin_ia32_movhlps", IX86_BUILTIN_MOVHLPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21031   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_movlhps_exp,  "__builtin_ia32_movlhps", IX86_BUILTIN_MOVLHPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21032   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_unpckhps, "__builtin_ia32_unpckhps", IX86_BUILTIN_UNPCKHPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21033   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_unpcklps, "__builtin_ia32_unpcklps", IX86_BUILTIN_UNPCKLPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21034
21035   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvtpi2ps, "__builtin_ia32_cvtpi2ps", IX86_BUILTIN_CVTPI2PS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V2SI },
21036   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_cvtsi2ss, "__builtin_ia32_cvtsi2ss", IX86_BUILTIN_CVTSI2SS, UNKNOWN, (int) V4SF_FTYPE_V4SF_SI },
21037   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_64BIT, CODE_FOR_sse_cvtsi2ssq, "__builtin_ia32_cvtsi642ss", IX86_BUILTIN_CVTSI642SS, UNKNOWN, V4SF_FTYPE_V4SF_DI },
21038
21039   { OPTION_MASK_ISA_SSE, CODE_FOR_rsqrtsf2, "__builtin_ia32_rsqrtf", IX86_BUILTIN_RSQRTF, UNKNOWN, (int) FLOAT_FTYPE_FLOAT },
21040
21041   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmsqrtv4sf2, "__builtin_ia32_sqrtss", IX86_BUILTIN_SQRTSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_VEC_MERGE },
21042   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmrsqrtv4sf2, "__builtin_ia32_rsqrtss", IX86_BUILTIN_RSQRTSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_VEC_MERGE },
21043   { OPTION_MASK_ISA_SSE, CODE_FOR_sse_vmrcpv4sf2, "__builtin_ia32_rcpss", IX86_BUILTIN_RCPSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_VEC_MERGE },
21044
21045   /* SSE MMX or 3Dnow!A */
21046   { 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 },
21047   { 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 },
21048   { 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 },
21049
21050   { 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 },
21051   { 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 },
21052   { 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 },
21053   { 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 },
21054
21055   { 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 },
21056   { OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, CODE_FOR_mmx_pmovmskb, "__builtin_ia32_pmovmskb", IX86_BUILTIN_PMOVMSKB, UNKNOWN, (int) INT_FTYPE_V8QI },
21057
21058   { 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 },
21059
21060   /* SSE2 */
21061   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_shufpd, "__builtin_ia32_shufpd", IX86_BUILTIN_SHUFPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
21062
21063   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movmskpd, "__builtin_ia32_movmskpd", IX86_BUILTIN_MOVMSKPD, UNKNOWN, (int) INT_FTYPE_V2DF  },
21064   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pmovmskb, "__builtin_ia32_pmovmskb128", IX86_BUILTIN_PMOVMSKB128, UNKNOWN, (int) INT_FTYPE_V16QI },
21065   { OPTION_MASK_ISA_SSE2, CODE_FOR_sqrtv2df2, "__builtin_ia32_sqrtpd", IX86_BUILTIN_SQRTPD, UNKNOWN, (int) V2DF_FTYPE_V2DF },
21066   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtdq2pd, "__builtin_ia32_cvtdq2pd", IX86_BUILTIN_CVTDQ2PD, UNKNOWN, (int) V2DF_FTYPE_V4SI },
21067   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtdq2ps, "__builtin_ia32_cvtdq2ps", IX86_BUILTIN_CVTDQ2PS, UNKNOWN, (int) V4SF_FTYPE_V4SI },
21068
21069   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtpd2dq, "__builtin_ia32_cvtpd2dq", IX86_BUILTIN_CVTPD2DQ, UNKNOWN, (int) V4SI_FTYPE_V2DF },
21070   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtpd2pi, "__builtin_ia32_cvtpd2pi", IX86_BUILTIN_CVTPD2PI, UNKNOWN, (int) V2SI_FTYPE_V2DF },
21071   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtpd2ps, "__builtin_ia32_cvtpd2ps", IX86_BUILTIN_CVTPD2PS, UNKNOWN, (int) V4SF_FTYPE_V2DF },
21072   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvttpd2dq, "__builtin_ia32_cvttpd2dq", IX86_BUILTIN_CVTTPD2DQ, UNKNOWN, (int) V4SI_FTYPE_V2DF },
21073   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvttpd2pi, "__builtin_ia32_cvttpd2pi", IX86_BUILTIN_CVTTPD2PI, UNKNOWN, (int) V2SI_FTYPE_V2DF },
21074
21075   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtpi2pd, "__builtin_ia32_cvtpi2pd", IX86_BUILTIN_CVTPI2PD, UNKNOWN, (int) V2DF_FTYPE_V2SI },
21076
21077   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtsd2si, "__builtin_ia32_cvtsd2si", IX86_BUILTIN_CVTSD2SI, UNKNOWN, (int) INT_FTYPE_V2DF },
21078   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvttsd2si, "__builtin_ia32_cvttsd2si", IX86_BUILTIN_CVTTSD2SI, UNKNOWN, (int) INT_FTYPE_V2DF },
21079   { OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_64BIT, CODE_FOR_sse2_cvtsd2siq, "__builtin_ia32_cvtsd2si64", IX86_BUILTIN_CVTSD2SI64, UNKNOWN, (int) INT64_FTYPE_V2DF },
21080   { OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_64BIT, CODE_FOR_sse2_cvttsd2siq, "__builtin_ia32_cvttsd2si64", IX86_BUILTIN_CVTTSD2SI64, UNKNOWN, (int) INT64_FTYPE_V2DF },
21081
21082   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtps2dq, "__builtin_ia32_cvtps2dq", IX86_BUILTIN_CVTPS2DQ, UNKNOWN, (int) V4SI_FTYPE_V4SF },
21083   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtps2pd, "__builtin_ia32_cvtps2pd", IX86_BUILTIN_CVTPS2PD, UNKNOWN, (int) V2DF_FTYPE_V4SF },
21084   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvttps2dq, "__builtin_ia32_cvttps2dq", IX86_BUILTIN_CVTTPS2DQ, UNKNOWN, (int) V4SI_FTYPE_V4SF },
21085
21086   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv2df3, "__builtin_ia32_addpd", IX86_BUILTIN_ADDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21087   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv2df3, "__builtin_ia32_subpd", IX86_BUILTIN_SUBPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21088   { OPTION_MASK_ISA_SSE2, CODE_FOR_mulv2df3, "__builtin_ia32_mulpd", IX86_BUILTIN_MULPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21089   { OPTION_MASK_ISA_SSE2, CODE_FOR_divv2df3, "__builtin_ia32_divpd", IX86_BUILTIN_DIVPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21090   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmaddv2df3,  "__builtin_ia32_addsd", IX86_BUILTIN_ADDSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21091   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmsubv2df3,  "__builtin_ia32_subsd", IX86_BUILTIN_SUBSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21092   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmulv2df3,  "__builtin_ia32_mulsd", IX86_BUILTIN_MULSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21093   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmdivv2df3,  "__builtin_ia32_divsd", IX86_BUILTIN_DIVSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21094
21095   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpeqpd", IX86_BUILTIN_CMPEQPD, EQ, (int) V2DF_FTYPE_V2DF_V2DF },
21096   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpltpd", IX86_BUILTIN_CMPLTPD, LT, (int) V2DF_FTYPE_V2DF_V2DF },
21097   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmplepd", IX86_BUILTIN_CMPLEPD, LE, (int) V2DF_FTYPE_V2DF_V2DF },
21098   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpgtpd", IX86_BUILTIN_CMPGTPD, LT, (int) V2DF_FTYPE_V2DF_V2DF_SWAP },
21099   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpgepd", IX86_BUILTIN_CMPGEPD, LE, (int) V2DF_FTYPE_V2DF_V2DF_SWAP},
21100   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpunordpd", IX86_BUILTIN_CMPUNORDPD, UNORDERED, (int) V2DF_FTYPE_V2DF_V2DF },
21101   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpneqpd", IX86_BUILTIN_CMPNEQPD, NE, (int) V2DF_FTYPE_V2DF_V2DF },
21102   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpnltpd", IX86_BUILTIN_CMPNLTPD, UNGE, (int) V2DF_FTYPE_V2DF_V2DF },
21103   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpnlepd", IX86_BUILTIN_CMPNLEPD, UNGT, (int) V2DF_FTYPE_V2DF_V2DF },
21104   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpngtpd", IX86_BUILTIN_CMPNGTPD, UNGE, (int) V2DF_FTYPE_V2DF_V2DF_SWAP },
21105   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpngepd", IX86_BUILTIN_CMPNGEPD, UNGT, (int) V2DF_FTYPE_V2DF_V2DF_SWAP },
21106   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_maskcmpv2df3, "__builtin_ia32_cmpordpd", IX86_BUILTIN_CMPORDPD, ORDERED, (int) V2DF_FTYPE_V2DF_V2DF },
21107   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpeqsd", IX86_BUILTIN_CMPEQSD, EQ, (int) V2DF_FTYPE_V2DF_V2DF },
21108   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpltsd", IX86_BUILTIN_CMPLTSD, LT, (int) V2DF_FTYPE_V2DF_V2DF },
21109   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmplesd", IX86_BUILTIN_CMPLESD, LE, (int) V2DF_FTYPE_V2DF_V2DF },
21110   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpunordsd", IX86_BUILTIN_CMPUNORDSD, UNORDERED, (int) V2DF_FTYPE_V2DF_V2DF },
21111   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpneqsd", IX86_BUILTIN_CMPNEQSD, NE, (int) V2DF_FTYPE_V2DF_V2DF },
21112   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpnltsd", IX86_BUILTIN_CMPNLTSD, UNGE, (int) V2DF_FTYPE_V2DF_V2DF },
21113   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpnlesd", IX86_BUILTIN_CMPNLESD, UNGT, (int) V2DF_FTYPE_V2DF_V2DF },
21114   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmmaskcmpv2df3, "__builtin_ia32_cmpordsd", IX86_BUILTIN_CMPORDSD, ORDERED, (int) V2DF_FTYPE_V2DF_V2DF },
21115
21116   { OPTION_MASK_ISA_SSE2, CODE_FOR_sminv2df3, "__builtin_ia32_minpd", IX86_BUILTIN_MINPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21117   { OPTION_MASK_ISA_SSE2, CODE_FOR_smaxv2df3, "__builtin_ia32_maxpd", IX86_BUILTIN_MAXPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21118   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmsminv2df3, "__builtin_ia32_minsd", IX86_BUILTIN_MINSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21119   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmsmaxv2df3, "__builtin_ia32_maxsd", IX86_BUILTIN_MAXSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21120
21121   { OPTION_MASK_ISA_SSE2, CODE_FOR_andv2df3, "__builtin_ia32_andpd", IX86_BUILTIN_ANDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21122   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_andnotv2df3,  "__builtin_ia32_andnpd", IX86_BUILTIN_ANDNPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21123   { OPTION_MASK_ISA_SSE2, CODE_FOR_iorv2df3, "__builtin_ia32_orpd", IX86_BUILTIN_ORPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21124   { OPTION_MASK_ISA_SSE2, CODE_FOR_xorv2df3,  "__builtin_ia32_xorpd", IX86_BUILTIN_XORPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21125
21126   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_movsd,  "__builtin_ia32_movsd", IX86_BUILTIN_MOVSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21127   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_unpckhpd_exp, "__builtin_ia32_unpckhpd", IX86_BUILTIN_UNPCKHPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21128   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_unpcklpd_exp, "__builtin_ia32_unpcklpd", IX86_BUILTIN_UNPCKLPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21129
21130   { 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 },
21131
21132   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv16qi3, "__builtin_ia32_paddb128", IX86_BUILTIN_PADDB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21133   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv8hi3, "__builtin_ia32_paddw128", IX86_BUILTIN_PADDW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21134   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv4si3, "__builtin_ia32_paddd128", IX86_BUILTIN_PADDD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21135   { OPTION_MASK_ISA_SSE2, CODE_FOR_addv2di3, "__builtin_ia32_paddq128", IX86_BUILTIN_PADDQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21136   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv16qi3, "__builtin_ia32_psubb128", IX86_BUILTIN_PSUBB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21137   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv8hi3, "__builtin_ia32_psubw128", IX86_BUILTIN_PSUBW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21138   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv4si3, "__builtin_ia32_psubd128", IX86_BUILTIN_PSUBD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21139   { OPTION_MASK_ISA_SSE2, CODE_FOR_subv2di3, "__builtin_ia32_psubq128", IX86_BUILTIN_PSUBQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21140
21141   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ssaddv16qi3, "__builtin_ia32_paddsb128", IX86_BUILTIN_PADDSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21142   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ssaddv8hi3, "__builtin_ia32_paddsw128", IX86_BUILTIN_PADDSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21143   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_sssubv16qi3, "__builtin_ia32_psubsb128", IX86_BUILTIN_PSUBSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21144   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_sssubv8hi3, "__builtin_ia32_psubsw128", IX86_BUILTIN_PSUBSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21145   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_usaddv16qi3, "__builtin_ia32_paddusb128", IX86_BUILTIN_PADDUSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21146   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_usaddv8hi3, "__builtin_ia32_paddusw128", IX86_BUILTIN_PADDUSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21147   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ussubv16qi3, "__builtin_ia32_psubusb128", IX86_BUILTIN_PSUBUSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21148   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ussubv8hi3, "__builtin_ia32_psubusw128", IX86_BUILTIN_PSUBUSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21149
21150   { OPTION_MASK_ISA_SSE2, CODE_FOR_mulv8hi3, "__builtin_ia32_pmullw128", IX86_BUILTIN_PMULLW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21151   { OPTION_MASK_ISA_SSE2, CODE_FOR_smulv8hi3_highpart, "__builtin_ia32_pmulhw128", IX86_BUILTIN_PMULHW128, UNKNOWN,(int) V8HI_FTYPE_V8HI_V8HI },
21152
21153   { OPTION_MASK_ISA_SSE2, CODE_FOR_andv2di3, "__builtin_ia32_pand128", IX86_BUILTIN_PAND128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21154   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_andnotv2di3, "__builtin_ia32_pandn128", IX86_BUILTIN_PANDN128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21155   { OPTION_MASK_ISA_SSE2, CODE_FOR_iorv2di3, "__builtin_ia32_por128", IX86_BUILTIN_POR128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21156   { OPTION_MASK_ISA_SSE2, CODE_FOR_xorv2di3, "__builtin_ia32_pxor128", IX86_BUILTIN_PXOR128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21157
21158   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_uavgv16qi3, "__builtin_ia32_pavgb128", IX86_BUILTIN_PAVGB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21159   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_uavgv8hi3, "__builtin_ia32_pavgw128", IX86_BUILTIN_PAVGW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21160
21161   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_eqv16qi3, "__builtin_ia32_pcmpeqb128", IX86_BUILTIN_PCMPEQB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21162   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_eqv8hi3, "__builtin_ia32_pcmpeqw128", IX86_BUILTIN_PCMPEQW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21163   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_eqv4si3, "__builtin_ia32_pcmpeqd128", IX86_BUILTIN_PCMPEQD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI  },
21164   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_gtv16qi3, "__builtin_ia32_pcmpgtb128", IX86_BUILTIN_PCMPGTB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21165   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_gtv8hi3, "__builtin_ia32_pcmpgtw128", IX86_BUILTIN_PCMPGTW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21166   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_gtv4si3, "__builtin_ia32_pcmpgtd128", IX86_BUILTIN_PCMPGTD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI  },
21167
21168   { OPTION_MASK_ISA_SSE2, CODE_FOR_umaxv16qi3, "__builtin_ia32_pmaxub128", IX86_BUILTIN_PMAXUB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21169   { OPTION_MASK_ISA_SSE2, CODE_FOR_smaxv8hi3, "__builtin_ia32_pmaxsw128", IX86_BUILTIN_PMAXSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21170   { OPTION_MASK_ISA_SSE2, CODE_FOR_uminv16qi3, "__builtin_ia32_pminub128", IX86_BUILTIN_PMINUB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21171   { OPTION_MASK_ISA_SSE2, CODE_FOR_sminv8hi3, "__builtin_ia32_pminsw128", IX86_BUILTIN_PMINSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21172
21173   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_punpckhbw, "__builtin_ia32_punpckhbw128", IX86_BUILTIN_PUNPCKHBW128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21174   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_punpckhwd, "__builtin_ia32_punpckhwd128", IX86_BUILTIN_PUNPCKHWD128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI  },
21175   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_punpckhdq, "__builtin_ia32_punpckhdq128", IX86_BUILTIN_PUNPCKHDQ128, UNKNOWN,  (int) V4SI_FTYPE_V4SI_V4SI },
21176   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_punpckhqdq, "__builtin_ia32_punpckhqdq128", IX86_BUILTIN_PUNPCKHQDQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21177   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_punpcklbw, "__builtin_ia32_punpcklbw128", IX86_BUILTIN_PUNPCKLBW128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21178   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_punpcklwd, "__builtin_ia32_punpcklwd128", IX86_BUILTIN_PUNPCKLWD128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21179   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_punpckldq, "__builtin_ia32_punpckldq128", IX86_BUILTIN_PUNPCKLDQ128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21180   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_punpcklqdq, "__builtin_ia32_punpcklqdq128", IX86_BUILTIN_PUNPCKLQDQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21181
21182   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_packsswb, "__builtin_ia32_packsswb128", IX86_BUILTIN_PACKSSWB128, UNKNOWN, (int) V16QI_FTYPE_V8HI_V8HI },
21183   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_packssdw, "__builtin_ia32_packssdw128", IX86_BUILTIN_PACKSSDW128, UNKNOWN, (int) V8HI_FTYPE_V4SI_V4SI },
21184   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_packuswb, "__builtin_ia32_packuswb128", IX86_BUILTIN_PACKUSWB128, UNKNOWN, (int) V16QI_FTYPE_V8HI_V8HI },
21185
21186   { OPTION_MASK_ISA_SSE2, CODE_FOR_umulv8hi3_highpart, "__builtin_ia32_pmulhuw128", IX86_BUILTIN_PMULHUW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21187   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_psadbw, "__builtin_ia32_psadbw128", IX86_BUILTIN_PSADBW128, UNKNOWN, (int) V2DI_FTYPE_V16QI_V16QI },
21188
21189   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_umulv1siv1di3, "__builtin_ia32_pmuludq", IX86_BUILTIN_PMULUDQ, UNKNOWN, (int) V1DI_FTYPE_V2SI_V2SI },
21190   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_umulv2siv2di3, "__builtin_ia32_pmuludq128", IX86_BUILTIN_PMULUDQ128, UNKNOWN, (int) V2DI_FTYPE_V4SI_V4SI },
21191
21192   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pmaddwd, "__builtin_ia32_pmaddwd128", IX86_BUILTIN_PMADDWD128, UNKNOWN, (int) V4SI_FTYPE_V8HI_V8HI },
21193
21194   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtsi2sd, "__builtin_ia32_cvtsi2sd", IX86_BUILTIN_CVTSI2SD, UNKNOWN, (int) V2DF_FTYPE_V2DF_SI },
21195   { OPTION_MASK_ISA_SSE2 | OPTION_MASK_ISA_64BIT, CODE_FOR_sse2_cvtsi2sdq, "__builtin_ia32_cvtsi642sd", IX86_BUILTIN_CVTSI642SD, UNKNOWN, (int) V2DF_FTYPE_V2DF_DI },
21196   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtsd2ss, "__builtin_ia32_cvtsd2ss", IX86_BUILTIN_CVTSD2SS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V2DF },
21197   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_cvtss2sd, "__builtin_ia32_cvtss2sd", IX86_BUILTIN_CVTSS2SD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V4SF },
21198
21199   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_ashlti3, "__builtin_ia32_pslldqi128", IX86_BUILTIN_PSLLDQI128, UNKNOWN, (int) V2DI2TI_FTYPE_V2DI_INT },
21200   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv8hi3, "__builtin_ia32_psllwi128", IX86_BUILTIN_PSLLWI128, UNKNOWN, (int) V8HI_FTYPE_V8HI_SI_COUNT },
21201   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv4si3, "__builtin_ia32_pslldi128", IX86_BUILTIN_PSLLDI128, UNKNOWN, (int) V4SI_FTYPE_V4SI_SI_COUNT },
21202   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv2di3, "__builtin_ia32_psllqi128", IX86_BUILTIN_PSLLQI128, UNKNOWN, (int) V2DI_FTYPE_V2DI_SI_COUNT },
21203   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv8hi3, "__builtin_ia32_psllw128", IX86_BUILTIN_PSLLW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI_COUNT },
21204   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv4si3, "__builtin_ia32_pslld128", IX86_BUILTIN_PSLLD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI_COUNT },
21205   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashlv2di3, "__builtin_ia32_psllq128", IX86_BUILTIN_PSLLQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_COUNT },
21206
21207   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_lshrti3, "__builtin_ia32_psrldqi128", IX86_BUILTIN_PSRLDQI128, UNKNOWN, (int) V2DI2TI_FTYPE_V2DI_INT },
21208   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv8hi3, "__builtin_ia32_psrlwi128", IX86_BUILTIN_PSRLWI128, UNKNOWN, (int) V8HI_FTYPE_V8HI_SI_COUNT },
21209   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv4si3, "__builtin_ia32_psrldi128", IX86_BUILTIN_PSRLDI128, UNKNOWN, (int) V4SI_FTYPE_V4SI_SI_COUNT },
21210   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv2di3, "__builtin_ia32_psrlqi128", IX86_BUILTIN_PSRLQI128, UNKNOWN, (int) V2DI_FTYPE_V2DI_SI_COUNT },
21211   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv8hi3, "__builtin_ia32_psrlw128", IX86_BUILTIN_PSRLW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI_COUNT },
21212   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv4si3, "__builtin_ia32_psrld128", IX86_BUILTIN_PSRLD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI_COUNT },
21213   { OPTION_MASK_ISA_SSE2, CODE_FOR_lshrv2di3, "__builtin_ia32_psrlq128", IX86_BUILTIN_PSRLQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_COUNT },
21214
21215   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashrv8hi3, "__builtin_ia32_psrawi128", IX86_BUILTIN_PSRAWI128, UNKNOWN, (int) V8HI_FTYPE_V8HI_SI_COUNT },
21216   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashrv4si3, "__builtin_ia32_psradi128", IX86_BUILTIN_PSRADI128, UNKNOWN, (int) V4SI_FTYPE_V4SI_SI_COUNT },
21217   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashrv8hi3, "__builtin_ia32_psraw128", IX86_BUILTIN_PSRAW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI_COUNT },
21218   { OPTION_MASK_ISA_SSE2, CODE_FOR_ashrv4si3, "__builtin_ia32_psrad128", IX86_BUILTIN_PSRAD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI_COUNT },
21219
21220   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pshufd, "__builtin_ia32_pshufd", IX86_BUILTIN_PSHUFD, UNKNOWN, (int) V4SI_FTYPE_V4SI_INT },
21221   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pshuflw, "__builtin_ia32_pshuflw", IX86_BUILTIN_PSHUFLW, UNKNOWN, (int) V8HI_FTYPE_V8HI_INT },
21222   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_pshufhw, "__builtin_ia32_pshufhw", IX86_BUILTIN_PSHUFHW, UNKNOWN, (int) V8HI_FTYPE_V8HI_INT },
21223
21224   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmsqrtv2df2, "__builtin_ia32_sqrtsd", IX86_BUILTIN_SQRTSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_VEC_MERGE },
21225
21226   { OPTION_MASK_ISA_SSE2, CODE_FOR_abstf2, 0, IX86_BUILTIN_FABSQ, UNKNOWN, (int) FLOAT128_FTYPE_FLOAT128 },
21227   { OPTION_MASK_ISA_SSE2, CODE_FOR_copysigntf3, 0, IX86_BUILTIN_COPYSIGNQ, UNKNOWN, (int) FLOAT128_FTYPE_FLOAT128_FLOAT128 },
21228
21229   { OPTION_MASK_ISA_SSE, CODE_FOR_sse2_movq128, "__builtin_ia32_movq128", IX86_BUILTIN_MOVQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI },
21230
21231   /* SSE2 MMX */
21232   { OPTION_MASK_ISA_SSE2, CODE_FOR_mmx_addv1di3, "__builtin_ia32_paddq", IX86_BUILTIN_PADDQ, UNKNOWN, (int) V1DI_FTYPE_V1DI_V1DI },
21233   { OPTION_MASK_ISA_SSE2, CODE_FOR_mmx_subv1di3, "__builtin_ia32_psubq", IX86_BUILTIN_PSUBQ, UNKNOWN, (int) V1DI_FTYPE_V1DI_V1DI },
21234
21235   /* SSE3 */
21236   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_movshdup, "__builtin_ia32_movshdup", IX86_BUILTIN_MOVSHDUP, UNKNOWN, (int) V4SF_FTYPE_V4SF},
21237   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_movsldup, "__builtin_ia32_movsldup", IX86_BUILTIN_MOVSLDUP, UNKNOWN, (int) V4SF_FTYPE_V4SF },
21238
21239   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_addsubv4sf3, "__builtin_ia32_addsubps", IX86_BUILTIN_ADDSUBPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21240   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_addsubv2df3, "__builtin_ia32_addsubpd", IX86_BUILTIN_ADDSUBPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21241   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_haddv4sf3, "__builtin_ia32_haddps", IX86_BUILTIN_HADDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21242   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_haddv2df3, "__builtin_ia32_haddpd", IX86_BUILTIN_HADDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21243   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_hsubv4sf3, "__builtin_ia32_hsubps", IX86_BUILTIN_HSUBPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF },
21244   { OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_hsubv2df3, "__builtin_ia32_hsubpd", IX86_BUILTIN_HSUBPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
21245
21246   /* SSSE3 */
21247   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv16qi2, "__builtin_ia32_pabsb128", IX86_BUILTIN_PABSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI },
21248   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv8qi2, "__builtin_ia32_pabsb", IX86_BUILTIN_PABSB, UNKNOWN, (int) V8QI_FTYPE_V8QI },
21249   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv8hi2, "__builtin_ia32_pabsw128", IX86_BUILTIN_PABSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI },
21250   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv4hi2, "__builtin_ia32_pabsw", IX86_BUILTIN_PABSW, UNKNOWN, (int) V4HI_FTYPE_V4HI },
21251   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv4si2, "__builtin_ia32_pabsd128", IX86_BUILTIN_PABSD128, UNKNOWN, (int) V4SI_FTYPE_V4SI },
21252   { OPTION_MASK_ISA_SSSE3, CODE_FOR_absv2si2, "__builtin_ia32_pabsd", IX86_BUILTIN_PABSD, UNKNOWN, (int) V2SI_FTYPE_V2SI },
21253
21254   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phaddwv8hi3, "__builtin_ia32_phaddw128", IX86_BUILTIN_PHADDW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21255   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phaddwv4hi3, "__builtin_ia32_phaddw", IX86_BUILTIN_PHADDW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21256   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phadddv4si3, "__builtin_ia32_phaddd128", IX86_BUILTIN_PHADDD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21257   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phadddv2si3, "__builtin_ia32_phaddd", IX86_BUILTIN_PHADDD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21258   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phaddswv8hi3, "__builtin_ia32_phaddsw128", IX86_BUILTIN_PHADDSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21259   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phaddswv4hi3, "__builtin_ia32_phaddsw", IX86_BUILTIN_PHADDSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21260   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubwv8hi3, "__builtin_ia32_phsubw128", IX86_BUILTIN_PHSUBW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21261   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubwv4hi3, "__builtin_ia32_phsubw", IX86_BUILTIN_PHSUBW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21262   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubdv4si3, "__builtin_ia32_phsubd128", IX86_BUILTIN_PHSUBD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21263   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubdv2si3, "__builtin_ia32_phsubd", IX86_BUILTIN_PHSUBD, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21264   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubswv8hi3, "__builtin_ia32_phsubsw128", IX86_BUILTIN_PHSUBSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21265   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phsubswv4hi3, "__builtin_ia32_phsubsw", IX86_BUILTIN_PHSUBSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21266   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pmaddubsw128, "__builtin_ia32_pmaddubsw128", IX86_BUILTIN_PMADDUBSW128, UNKNOWN, (int) V8HI_FTYPE_V16QI_V16QI },
21267   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pmaddubsw, "__builtin_ia32_pmaddubsw", IX86_BUILTIN_PMADDUBSW, UNKNOWN, (int) V4HI_FTYPE_V8QI_V8QI },
21268   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pmulhrswv8hi3, "__builtin_ia32_pmulhrsw128", IX86_BUILTIN_PMULHRSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21269   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pmulhrswv4hi3, "__builtin_ia32_pmulhrsw", IX86_BUILTIN_PMULHRSW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21270   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pshufbv16qi3, "__builtin_ia32_pshufb128", IX86_BUILTIN_PSHUFB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21271   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_pshufbv8qi3, "__builtin_ia32_pshufb", IX86_BUILTIN_PSHUFB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21272   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv16qi3, "__builtin_ia32_psignb128", IX86_BUILTIN_PSIGNB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21273   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv8qi3, "__builtin_ia32_psignb", IX86_BUILTIN_PSIGNB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI },
21274   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv8hi3, "__builtin_ia32_psignw128", IX86_BUILTIN_PSIGNW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21275   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv4hi3, "__builtin_ia32_psignw", IX86_BUILTIN_PSIGNW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI },
21276   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv4si3, "__builtin_ia32_psignd128", IX86_BUILTIN_PSIGND128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21277   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_psignv2si3, "__builtin_ia32_psignd", IX86_BUILTIN_PSIGND, UNKNOWN, (int) V2SI_FTYPE_V2SI_V2SI },
21278
21279   /* SSSE3.  */
21280   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_palignrti, "__builtin_ia32_palignr128", IX86_BUILTIN_PALIGNR128, UNKNOWN, (int) V2DI2TI_FTYPE_V2DI_V2DI_INT },
21281   { OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_palignrdi, "__builtin_ia32_palignr", IX86_BUILTIN_PALIGNR, UNKNOWN, (int) V1DI2DI_FTYPE_V1DI_V1DI_INT },
21282
21283   /* SSE4.1 */
21284   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_blendpd, "__builtin_ia32_blendpd", IX86_BUILTIN_BLENDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
21285   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_blendps, "__builtin_ia32_blendps", IX86_BUILTIN_BLENDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
21286   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_blendvpd, "__builtin_ia32_blendvpd", IX86_BUILTIN_BLENDVPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_V2DF },
21287   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_blendvps, "__builtin_ia32_blendvps", IX86_BUILTIN_BLENDVPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_V4SF },
21288   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_dppd, "__builtin_ia32_dppd", IX86_BUILTIN_DPPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
21289   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_dpps, "__builtin_ia32_dpps", IX86_BUILTIN_DPPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
21290   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_insertps, "__builtin_ia32_insertps128", IX86_BUILTIN_INSERTPS128, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
21291   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_mpsadbw, "__builtin_ia32_mpsadbw128", IX86_BUILTIN_MPSADBW128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI_INT },
21292   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_pblendvb, "__builtin_ia32_pblendvb128", IX86_BUILTIN_PBLENDVB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI_V16QI },
21293   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_pblendw, "__builtin_ia32_pblendw128", IX86_BUILTIN_PBLENDW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI_INT },
21294
21295   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_extendv8qiv8hi2, "__builtin_ia32_pmovsxbw128", IX86_BUILTIN_PMOVSXBW128, UNKNOWN, (int) V8HI_FTYPE_V16QI },
21296   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_extendv4qiv4si2, "__builtin_ia32_pmovsxbd128", IX86_BUILTIN_PMOVSXBD128, UNKNOWN, (int) V4SI_FTYPE_V16QI },
21297   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_extendv2qiv2di2, "__builtin_ia32_pmovsxbq128", IX86_BUILTIN_PMOVSXBQ128, UNKNOWN, (int) V2DI_FTYPE_V16QI },
21298   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_extendv4hiv4si2, "__builtin_ia32_pmovsxwd128", IX86_BUILTIN_PMOVSXWD128, UNKNOWN, (int) V4SI_FTYPE_V8HI },
21299   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_extendv2hiv2di2, "__builtin_ia32_pmovsxwq128", IX86_BUILTIN_PMOVSXWQ128, UNKNOWN, (int) V2DI_FTYPE_V8HI },
21300   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_extendv2siv2di2, "__builtin_ia32_pmovsxdq128", IX86_BUILTIN_PMOVSXDQ128, UNKNOWN, (int) V2DI_FTYPE_V4SI },
21301   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv8qiv8hi2, "__builtin_ia32_pmovzxbw128", IX86_BUILTIN_PMOVZXBW128, UNKNOWN, (int) V8HI_FTYPE_V16QI },
21302   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv4qiv4si2, "__builtin_ia32_pmovzxbd128", IX86_BUILTIN_PMOVZXBD128, UNKNOWN, (int) V4SI_FTYPE_V16QI },
21303   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv2qiv2di2, "__builtin_ia32_pmovzxbq128", IX86_BUILTIN_PMOVZXBQ128, UNKNOWN, (int) V2DI_FTYPE_V16QI },
21304   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv4hiv4si2, "__builtin_ia32_pmovzxwd128", IX86_BUILTIN_PMOVZXWD128, UNKNOWN, (int) V4SI_FTYPE_V8HI },
21305   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv2hiv2di2, "__builtin_ia32_pmovzxwq128", IX86_BUILTIN_PMOVZXWQ128, UNKNOWN, (int) V2DI_FTYPE_V8HI },
21306   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_zero_extendv2siv2di2, "__builtin_ia32_pmovzxdq128", IX86_BUILTIN_PMOVZXDQ128, UNKNOWN, (int) V2DI_FTYPE_V4SI },
21307   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_phminposuw, "__builtin_ia32_phminposuw128", IX86_BUILTIN_PHMINPOSUW128, UNKNOWN, (int) V8HI_FTYPE_V8HI },
21308
21309   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_packusdw, "__builtin_ia32_packusdw128", IX86_BUILTIN_PACKUSDW128, UNKNOWN, (int) V8HI_FTYPE_V4SI_V4SI },
21310   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_eqv2di3, "__builtin_ia32_pcmpeqq", IX86_BUILTIN_PCMPEQQ, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21311   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_smaxv16qi3, "__builtin_ia32_pmaxsb128", IX86_BUILTIN_PMAXSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21312   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_smaxv4si3, "__builtin_ia32_pmaxsd128", IX86_BUILTIN_PMAXSD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21313   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_umaxv4si3, "__builtin_ia32_pmaxud128", IX86_BUILTIN_PMAXUD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21314   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_umaxv8hi3, "__builtin_ia32_pmaxuw128", IX86_BUILTIN_PMAXUW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21315   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sminv16qi3, "__builtin_ia32_pminsb128", IX86_BUILTIN_PMINSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI },
21316   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sminv4si3, "__builtin_ia32_pminsd128", IX86_BUILTIN_PMINSD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21317   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_uminv4si3, "__builtin_ia32_pminud128", IX86_BUILTIN_PMINUD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21318   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_uminv8hi3, "__builtin_ia32_pminuw128", IX86_BUILTIN_PMINUW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI },
21319   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_sse4_1_mulv2siv2di3, "__builtin_ia32_pmuldq128", IX86_BUILTIN_PMULDQ128, UNKNOWN, (int) V2DI_FTYPE_V4SI_V4SI },
21320   { OPTION_MASK_ISA_SSE4_1, CODE_FOR_mulv4si3, "__builtin_ia32_pmulld128", IX86_BUILTIN_PMULLD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI },
21321
21322   /* SSE4.1 and SSE5 */
21323   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_roundpd, "__builtin_ia32_roundpd", IX86_BUILTIN_ROUNDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_INT },
21324   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_roundps, "__builtin_ia32_roundps", IX86_BUILTIN_ROUNDPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_INT },
21325   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_roundsd, "__builtin_ia32_roundsd", IX86_BUILTIN_ROUNDSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
21326   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_roundss, "__builtin_ia32_roundss", IX86_BUILTIN_ROUNDSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
21327
21328   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_ptest, "__builtin_ia32_ptestz128", IX86_BUILTIN_PTESTZ, EQ, (int) INT_FTYPE_V2DI_V2DI_PTEST },
21329   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_ptest, "__builtin_ia32_ptestc128", IX86_BUILTIN_PTESTC, LTU, (int) INT_FTYPE_V2DI_V2DI_PTEST },
21330   { OPTION_MASK_ISA_ROUND, CODE_FOR_sse4_1_ptest, "__builtin_ia32_ptestnzc128", IX86_BUILTIN_PTESTNZC, GTU, (int) INT_FTYPE_V2DI_V2DI_PTEST },
21331
21332   /* SSE4.2 */
21333   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_gtv2di3, "__builtin_ia32_pcmpgtq", IX86_BUILTIN_PCMPGTQ, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21334   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_crc32qi, "__builtin_ia32_crc32qi", IX86_BUILTIN_CRC32QI, UNKNOWN, (int) UINT_FTYPE_UINT_UCHAR },
21335   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_crc32hi, "__builtin_ia32_crc32hi", IX86_BUILTIN_CRC32HI, UNKNOWN, (int) UINT_FTYPE_UINT_USHORT },
21336   { OPTION_MASK_ISA_SSE4_2, CODE_FOR_sse4_2_crc32si, "__builtin_ia32_crc32si", IX86_BUILTIN_CRC32SI, UNKNOWN, (int) UINT_FTYPE_UINT_UINT },
21337   { 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 },
21338
21339   /* SSE4A */
21340   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_extrqi, "__builtin_ia32_extrqi", IX86_BUILTIN_EXTRQI, UNKNOWN, (int) V2DI_FTYPE_V2DI_UINT_UINT },
21341   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_extrq, "__builtin_ia32_extrq", IX86_BUILTIN_EXTRQ, UNKNOWN, (int) V2DI_FTYPE_V2DI_V16QI },
21342   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_insertqi, "__builtin_ia32_insertqi", IX86_BUILTIN_INSERTQI, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_UINT_UINT },
21343   { OPTION_MASK_ISA_SSE4A, CODE_FOR_sse4a_insertq, "__builtin_ia32_insertq", IX86_BUILTIN_INSERTQ, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21344
21345   /* AES */
21346   { OPTION_MASK_ISA_SSE2, CODE_FOR_aeskeygenassist, 0, IX86_BUILTIN_AESKEYGENASSIST128, UNKNOWN, (int) V2DI_FTYPE_V2DI_INT },
21347   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesimc, 0, IX86_BUILTIN_AESIMC128, UNKNOWN, (int) V2DI_FTYPE_V2DI },
21348
21349   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesenc, 0, IX86_BUILTIN_AESENC128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21350   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesenclast, 0, IX86_BUILTIN_AESENCLAST128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21351   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesdec, 0, IX86_BUILTIN_AESDEC128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21352   { OPTION_MASK_ISA_SSE2, CODE_FOR_aesdeclast, 0, IX86_BUILTIN_AESDECLAST128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI },
21353
21354   /* PCLMUL */
21355   { OPTION_MASK_ISA_SSE2, CODE_FOR_pclmulqdq, 0, IX86_BUILTIN_PCLMULQDQ128, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI_INT },
21356
21357   /* AVX */
21358   { OPTION_MASK_ISA_AVX, CODE_FOR_addv4df3, "__builtin_ia32_addpd256", IX86_BUILTIN_ADDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21359   { OPTION_MASK_ISA_AVX, CODE_FOR_addv8sf3, "__builtin_ia32_addps256", IX86_BUILTIN_ADDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21360   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_addsubv4df3, "__builtin_ia32_addsubpd256", IX86_BUILTIN_ADDSUBPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21361   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_addsubv8sf3, "__builtin_ia32_addsubps256", IX86_BUILTIN_ADDSUBPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21362   { OPTION_MASK_ISA_AVX, CODE_FOR_andv4df3, "__builtin_ia32_andpd256", IX86_BUILTIN_ANDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21363   { OPTION_MASK_ISA_AVX, CODE_FOR_andv8sf3, "__builtin_ia32_andps256", IX86_BUILTIN_ANDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21364   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_andnotv4df3, "__builtin_ia32_andnpd256", IX86_BUILTIN_ANDNPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21365   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_andnotv8sf3, "__builtin_ia32_andnps256", IX86_BUILTIN_ANDNPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21366   { OPTION_MASK_ISA_AVX, CODE_FOR_divv4df3, "__builtin_ia32_divpd256", IX86_BUILTIN_DIVPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21367   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_divv8sf3, "__builtin_ia32_divps256", IX86_BUILTIN_DIVPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21368   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_haddv4df3, "__builtin_ia32_haddpd256", IX86_BUILTIN_HADDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21369   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_hsubv8sf3, "__builtin_ia32_hsubps256", IX86_BUILTIN_HSUBPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21370   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_hsubv4df3, "__builtin_ia32_hsubpd256", IX86_BUILTIN_HSUBPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21371   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_haddv8sf3, "__builtin_ia32_haddps256", IX86_BUILTIN_HADDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21372   { OPTION_MASK_ISA_AVX, CODE_FOR_smaxv4df3, "__builtin_ia32_maxpd256", IX86_BUILTIN_MAXPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21373   { OPTION_MASK_ISA_AVX, CODE_FOR_smaxv8sf3, "__builtin_ia32_maxps256", IX86_BUILTIN_MAXPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21374   { OPTION_MASK_ISA_AVX, CODE_FOR_sminv4df3, "__builtin_ia32_minpd256", IX86_BUILTIN_MINPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21375   { OPTION_MASK_ISA_AVX, CODE_FOR_sminv8sf3, "__builtin_ia32_minps256", IX86_BUILTIN_MINPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21376   { OPTION_MASK_ISA_AVX, CODE_FOR_mulv4df3, "__builtin_ia32_mulpd256", IX86_BUILTIN_MULPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21377   { OPTION_MASK_ISA_AVX, CODE_FOR_mulv8sf3, "__builtin_ia32_mulps256", IX86_BUILTIN_MULPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21378   { OPTION_MASK_ISA_AVX, CODE_FOR_iorv4df3, "__builtin_ia32_orpd256", IX86_BUILTIN_ORPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21379   { OPTION_MASK_ISA_AVX, CODE_FOR_iorv8sf3, "__builtin_ia32_orps256", IX86_BUILTIN_ORPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21380   { OPTION_MASK_ISA_AVX, CODE_FOR_subv4df3, "__builtin_ia32_subpd256", IX86_BUILTIN_SUBPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21381   { OPTION_MASK_ISA_AVX, CODE_FOR_subv8sf3, "__builtin_ia32_subps256", IX86_BUILTIN_SUBPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21382   { OPTION_MASK_ISA_AVX, CODE_FOR_xorv4df3, "__builtin_ia32_xorpd256", IX86_BUILTIN_XORPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21383   { OPTION_MASK_ISA_AVX, CODE_FOR_xorv8sf3, "__builtin_ia32_xorps256", IX86_BUILTIN_XORPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21384
21385   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilvarv2df3, "__builtin_ia32_vpermilvarpd", IX86_BUILTIN_VPERMILVARPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DI },
21386   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilvarv4sf3, "__builtin_ia32_vpermilvarps", IX86_BUILTIN_VPERMILVARPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SI },
21387   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilvarv4df3, "__builtin_ia32_vpermilvarpd256", IX86_BUILTIN_VPERMILVARPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DI },
21388   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilvarv8sf3, "__builtin_ia32_vpermilvarps256", IX86_BUILTIN_VPERMILVARPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SI },
21389
21390   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_blendpd256, "__builtin_ia32_blendpd256", IX86_BUILTIN_BLENDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_INT },
21391   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_blendps256, "__builtin_ia32_blendps256", IX86_BUILTIN_BLENDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
21392   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_blendvpd256, "__builtin_ia32_blendvpd256", IX86_BUILTIN_BLENDVPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_V4DF },
21393   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_blendvps256, "__builtin_ia32_blendvps256", IX86_BUILTIN_BLENDVPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_V8SF },
21394   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_dpps256, "__builtin_ia32_dpps256", IX86_BUILTIN_DPPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
21395   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_shufpd256, "__builtin_ia32_shufpd256", IX86_BUILTIN_SHUFPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_INT },
21396   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_shufps256, "__builtin_ia32_shufps256", IX86_BUILTIN_SHUFPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
21397   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmpsdv2df3, "__builtin_ia32_cmpsd", IX86_BUILTIN_CMPSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
21398   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmpssv4sf3, "__builtin_ia32_cmpss", IX86_BUILTIN_CMPSS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
21399   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmppdv2df3, "__builtin_ia32_cmppd", IX86_BUILTIN_CMPPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF_INT },
21400   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmppsv4sf3, "__builtin_ia32_cmpps", IX86_BUILTIN_CMPPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_V4SF_INT },
21401   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmppdv4df3, "__builtin_ia32_cmppd256", IX86_BUILTIN_CMPPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_INT },
21402   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cmppsv8sf3, "__builtin_ia32_cmpps256", IX86_BUILTIN_CMPPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
21403   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vextractf128v4df, "__builtin_ia32_vextractf128_pd256", IX86_BUILTIN_EXTRACTF128PD256, UNKNOWN, (int) V2DF_FTYPE_V4DF_INT },
21404   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vextractf128v8sf, "__builtin_ia32_vextractf128_ps256", IX86_BUILTIN_EXTRACTF128PS256, UNKNOWN, (int) V4SF_FTYPE_V8SF_INT },
21405   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vextractf128v8si, "__builtin_ia32_vextractf128_si256", IX86_BUILTIN_EXTRACTF128SI256, UNKNOWN, (int) V4SI_FTYPE_V8SI_INT },
21406   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtdq2pd256, "__builtin_ia32_cvtdq2pd256", IX86_BUILTIN_CVTDQ2PD256, UNKNOWN, (int) V4DF_FTYPE_V4SI },
21407   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtdq2ps256, "__builtin_ia32_cvtdq2ps256", IX86_BUILTIN_CVTDQ2PS256, UNKNOWN, (int) V8SF_FTYPE_V8SI },
21408   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtpd2ps256, "__builtin_ia32_cvtpd2ps256", IX86_BUILTIN_CVTPD2PS256, UNKNOWN, (int) V4SF_FTYPE_V4DF },
21409   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtps2dq256, "__builtin_ia32_cvtps2dq256", IX86_BUILTIN_CVTPS2DQ256, UNKNOWN, (int) V8SI_FTYPE_V8SF },
21410   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtps2pd256, "__builtin_ia32_cvtps2pd256", IX86_BUILTIN_CVTPS2PD256, UNKNOWN, (int) V4DF_FTYPE_V4SF },
21411   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvttpd2dq256, "__builtin_ia32_cvttpd2dq256", IX86_BUILTIN_CVTTPD2DQ256, UNKNOWN, (int) V4SI_FTYPE_V4DF },
21412   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvtpd2dq256, "__builtin_ia32_cvtpd2dq256", IX86_BUILTIN_CVTPD2DQ256, UNKNOWN, (int) V4SI_FTYPE_V4DF },
21413   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_cvttps2dq256, "__builtin_ia32_cvttps2dq256", IX86_BUILTIN_CVTTPS2DQ256, UNKNOWN, (int) V8SI_FTYPE_V8SF },
21414   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vperm2f128v4df3, "__builtin_ia32_vperm2f128_pd256", IX86_BUILTIN_VPERM2F128PD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF_INT },
21415   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vperm2f128v8sf3, "__builtin_ia32_vperm2f128_ps256", IX86_BUILTIN_VPERM2F128PS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF_INT },
21416   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vperm2f128v8si3, "__builtin_ia32_vperm2f128_si256", IX86_BUILTIN_VPERM2F128SI256, UNKNOWN, (int) V8SI_FTYPE_V8SI_V8SI_INT },
21417   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilv2df, "__builtin_ia32_vpermilpd", IX86_BUILTIN_VPERMILPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_INT },
21418   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilv4sf, "__builtin_ia32_vpermilps", IX86_BUILTIN_VPERMILPS, UNKNOWN, (int) V4SF_FTYPE_V4SF_INT },
21419   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilv4df, "__builtin_ia32_vpermilpd256", IX86_BUILTIN_VPERMILPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_INT },
21420   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vpermilv8sf, "__builtin_ia32_vpermilps256", IX86_BUILTIN_VPERMILPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_INT },
21421   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vinsertf128v4df, "__builtin_ia32_vinsertf128_pd256", IX86_BUILTIN_VINSERTF128PD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V2DF_INT },
21422   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vinsertf128v8sf, "__builtin_ia32_vinsertf128_ps256", IX86_BUILTIN_VINSERTF128PS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V4SF_INT },
21423   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vinsertf128v8si, "__builtin_ia32_vinsertf128_si256", IX86_BUILTIN_VINSERTF128SI256, UNKNOWN, (int) V8SI_FTYPE_V8SI_V4SI_INT },
21424
21425   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movshdup256, "__builtin_ia32_movshdup256", IX86_BUILTIN_MOVSHDUP256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
21426   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movsldup256, "__builtin_ia32_movsldup256", IX86_BUILTIN_MOVSLDUP256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
21427   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movddup256, "__builtin_ia32_movddup256", IX86_BUILTIN_MOVDDUP256, UNKNOWN, (int) V4DF_FTYPE_V4DF },
21428
21429   { OPTION_MASK_ISA_AVX, CODE_FOR_sqrtv4df2, "__builtin_ia32_sqrtpd256", IX86_BUILTIN_SQRTPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF },
21430   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_sqrtv8sf2, "__builtin_ia32_sqrtps256", IX86_BUILTIN_SQRTPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
21431   { OPTION_MASK_ISA_AVX, CODE_FOR_sqrtv8sf2, "__builtin_ia32_sqrtps_nr256", IX86_BUILTIN_SQRTPS_NR256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
21432   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_rsqrtv8sf2, "__builtin_ia32_rsqrtps256", IX86_BUILTIN_RSQRTPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
21433   { OPTION_MASK_ISA_AVX, CODE_FOR_rsqrtv8sf2, "__builtin_ia32_rsqrtps_nr256", IX86_BUILTIN_RSQRTPS_NR256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
21434
21435   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_rcpv8sf2, "__builtin_ia32_rcpps256", IX86_BUILTIN_RCPPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF },
21436
21437   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_roundpd256, "__builtin_ia32_roundpd256", IX86_BUILTIN_ROUNDPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_INT },
21438   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_roundps256, "__builtin_ia32_roundps256", IX86_BUILTIN_ROUNDPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_INT },
21439
21440   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_unpckhpd256,  "__builtin_ia32_unpckhpd256", IX86_BUILTIN_UNPCKHPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21441   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_unpcklpd256,  "__builtin_ia32_unpcklpd256", IX86_BUILTIN_UNPCKLPD256, UNKNOWN, (int) V4DF_FTYPE_V4DF_V4DF },
21442   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_unpckhps256,  "__builtin_ia32_unpckhps256", IX86_BUILTIN_UNPCKHPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21443   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_unpcklps256,  "__builtin_ia32_unpcklps256", IX86_BUILTIN_UNPCKLPS256, UNKNOWN, (int) V8SF_FTYPE_V8SF_V8SF },
21444
21445   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_si256_si, "__builtin_ia32_si256_si", IX86_BUILTIN_SI256_SI, UNKNOWN, (int) V8SI_FTYPE_V4SI },
21446   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_ps256_ps, "__builtin_ia32_ps256_ps", IX86_BUILTIN_PS256_PS, UNKNOWN, (int) V8SF_FTYPE_V4SF },
21447   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_pd256_pd, "__builtin_ia32_pd256_pd", IX86_BUILTIN_PD256_PD, UNKNOWN, (int) V4DF_FTYPE_V2DF },
21448   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_si_si256, "__builtin_ia32_si_si256", IX86_BUILTIN_SI_SI256, UNKNOWN, (int) V4SI_FTYPE_V8SI },
21449   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_ps_ps256, "__builtin_ia32_ps_ps256", IX86_BUILTIN_PS_PS256, UNKNOWN, (int) V4SF_FTYPE_V8SF },
21450   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_pd_pd256, "__builtin_ia32_pd_pd256", IX86_BUILTIN_PD_PD256, UNKNOWN, (int) V2DF_FTYPE_V4DF },
21451
21452   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd, "__builtin_ia32_vtestzpd", IX86_BUILTIN_VTESTZPD, EQ, (int) INT_FTYPE_V2DF_V2DF_PTEST },
21453   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd, "__builtin_ia32_vtestcpd", IX86_BUILTIN_VTESTCPD, LTU, (int) INT_FTYPE_V2DF_V2DF_PTEST },
21454   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd, "__builtin_ia32_vtestnzcpd", IX86_BUILTIN_VTESTNZCPD, GTU, (int) INT_FTYPE_V2DF_V2DF_PTEST },
21455   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps, "__builtin_ia32_vtestzps", IX86_BUILTIN_VTESTZPS, EQ, (int) INT_FTYPE_V4SF_V4SF_PTEST },
21456   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps, "__builtin_ia32_vtestcps", IX86_BUILTIN_VTESTCPS, LTU, (int) INT_FTYPE_V4SF_V4SF_PTEST },
21457   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps, "__builtin_ia32_vtestnzcps", IX86_BUILTIN_VTESTNZCPS, GTU, (int) INT_FTYPE_V4SF_V4SF_PTEST },
21458   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd256, "__builtin_ia32_vtestzpd256", IX86_BUILTIN_VTESTZPD256, EQ, (int) INT_FTYPE_V4DF_V4DF_PTEST },
21459   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd256, "__builtin_ia32_vtestcpd256", IX86_BUILTIN_VTESTCPD256, LTU, (int) INT_FTYPE_V4DF_V4DF_PTEST },
21460   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestpd256, "__builtin_ia32_vtestnzcpd256", IX86_BUILTIN_VTESTNZCPD256, GTU, (int) INT_FTYPE_V4DF_V4DF_PTEST },
21461   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps256, "__builtin_ia32_vtestzps256", IX86_BUILTIN_VTESTZPS256, EQ, (int) INT_FTYPE_V8SF_V8SF_PTEST },
21462   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps256, "__builtin_ia32_vtestcps256", IX86_BUILTIN_VTESTCPS256, LTU, (int) INT_FTYPE_V8SF_V8SF_PTEST },
21463   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_vtestps256, "__builtin_ia32_vtestnzcps256", IX86_BUILTIN_VTESTNZCPS256, GTU, (int) INT_FTYPE_V8SF_V8SF_PTEST },
21464   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_ptest256, "__builtin_ia32_ptestz256", IX86_BUILTIN_PTESTZ256, EQ, (int) INT_FTYPE_V4DI_V4DI_PTEST },
21465   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_ptest256, "__builtin_ia32_ptestc256", IX86_BUILTIN_PTESTC256, LTU, (int) INT_FTYPE_V4DI_V4DI_PTEST },
21466   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_ptest256, "__builtin_ia32_ptestnzc256", IX86_BUILTIN_PTESTNZC256, GTU, (int) INT_FTYPE_V4DI_V4DI_PTEST },
21467
21468   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movmskpd256, "__builtin_ia32_movmskpd256", IX86_BUILTIN_MOVMSKPD256, UNKNOWN, (int) INT_FTYPE_V4DF  },
21469   { OPTION_MASK_ISA_AVX, CODE_FOR_avx_movmskps256, "__builtin_ia32_movmskps256", IX86_BUILTIN_MOVMSKPS256, UNKNOWN, (int) INT_FTYPE_V8SF },
21470 };
21471
21472 /* SSE5 */
21473 enum multi_arg_type {
21474   MULTI_ARG_UNKNOWN,
21475   MULTI_ARG_3_SF,
21476   MULTI_ARG_3_DF,
21477   MULTI_ARG_3_DI,
21478   MULTI_ARG_3_SI,
21479   MULTI_ARG_3_SI_DI,
21480   MULTI_ARG_3_HI,
21481   MULTI_ARG_3_HI_SI,
21482   MULTI_ARG_3_QI,
21483   MULTI_ARG_3_PERMPS,
21484   MULTI_ARG_3_PERMPD,
21485   MULTI_ARG_2_SF,
21486   MULTI_ARG_2_DF,
21487   MULTI_ARG_2_DI,
21488   MULTI_ARG_2_SI,
21489   MULTI_ARG_2_HI,
21490   MULTI_ARG_2_QI,
21491   MULTI_ARG_2_DI_IMM,
21492   MULTI_ARG_2_SI_IMM,
21493   MULTI_ARG_2_HI_IMM,
21494   MULTI_ARG_2_QI_IMM,
21495   MULTI_ARG_2_SF_CMP,
21496   MULTI_ARG_2_DF_CMP,
21497   MULTI_ARG_2_DI_CMP,
21498   MULTI_ARG_2_SI_CMP,
21499   MULTI_ARG_2_HI_CMP,
21500   MULTI_ARG_2_QI_CMP,
21501   MULTI_ARG_2_DI_TF,
21502   MULTI_ARG_2_SI_TF,
21503   MULTI_ARG_2_HI_TF,
21504   MULTI_ARG_2_QI_TF,
21505   MULTI_ARG_2_SF_TF,
21506   MULTI_ARG_2_DF_TF,
21507   MULTI_ARG_1_SF,
21508   MULTI_ARG_1_DF,
21509   MULTI_ARG_1_DI,
21510   MULTI_ARG_1_SI,
21511   MULTI_ARG_1_HI,
21512   MULTI_ARG_1_QI,
21513   MULTI_ARG_1_SI_DI,
21514   MULTI_ARG_1_HI_DI,
21515   MULTI_ARG_1_HI_SI,
21516   MULTI_ARG_1_QI_DI,
21517   MULTI_ARG_1_QI_SI,
21518   MULTI_ARG_1_QI_HI,
21519   MULTI_ARG_1_PH2PS,
21520   MULTI_ARG_1_PS2PH
21521 };
21522
21523 static const struct builtin_description bdesc_multi_arg[] =
21524 {
21525   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_vmfmaddv4sf4,     "__builtin_ia32_fmaddss",    IX86_BUILTIN_FMADDSS,    0,            (int)MULTI_ARG_3_SF },
21526   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_vmfmaddv2df4,     "__builtin_ia32_fmaddsd",    IX86_BUILTIN_FMADDSD,    0,            (int)MULTI_ARG_3_DF },
21527   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_fmaddv4sf4,       "__builtin_ia32_fmaddps",    IX86_BUILTIN_FMADDPS,    0,            (int)MULTI_ARG_3_SF },
21528   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_fmaddv2df4,       "__builtin_ia32_fmaddpd",    IX86_BUILTIN_FMADDPD,    0,            (int)MULTI_ARG_3_DF },
21529   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_vmfmsubv4sf4,     "__builtin_ia32_fmsubss",    IX86_BUILTIN_FMSUBSS,    0,            (int)MULTI_ARG_3_SF },
21530   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_vmfmsubv2df4,     "__builtin_ia32_fmsubsd",    IX86_BUILTIN_FMSUBSD,    0,            (int)MULTI_ARG_3_DF },
21531   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_fmsubv4sf4,       "__builtin_ia32_fmsubps",    IX86_BUILTIN_FMSUBPS,    0,            (int)MULTI_ARG_3_SF },
21532   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_fmsubv2df4,       "__builtin_ia32_fmsubpd",    IX86_BUILTIN_FMSUBPD,    0,            (int)MULTI_ARG_3_DF },
21533   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_vmfnmaddv4sf4,    "__builtin_ia32_fnmaddss",   IX86_BUILTIN_FNMADDSS,   0,            (int)MULTI_ARG_3_SF },
21534   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_vmfnmaddv2df4,    "__builtin_ia32_fnmaddsd",   IX86_BUILTIN_FNMADDSD,   0,            (int)MULTI_ARG_3_DF },
21535   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_fnmaddv4sf4,      "__builtin_ia32_fnmaddps",   IX86_BUILTIN_FNMADDPS,   0,            (int)MULTI_ARG_3_SF },
21536   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_fnmaddv2df4,      "__builtin_ia32_fnmaddpd",   IX86_BUILTIN_FNMADDPD,   0,            (int)MULTI_ARG_3_DF },
21537   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_vmfnmsubv4sf4,    "__builtin_ia32_fnmsubss",   IX86_BUILTIN_FNMSUBSS,   0,            (int)MULTI_ARG_3_SF },
21538   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_vmfnmsubv2df4,    "__builtin_ia32_fnmsubsd",   IX86_BUILTIN_FNMSUBSD,   0,            (int)MULTI_ARG_3_DF },
21539   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_fnmsubv4sf4,      "__builtin_ia32_fnmsubps",   IX86_BUILTIN_FNMSUBPS,   0,            (int)MULTI_ARG_3_SF },
21540   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5i_fnmsubv2df4,      "__builtin_ia32_fnmsubpd",   IX86_BUILTIN_FNMSUBPD,   0,            (int)MULTI_ARG_3_DF },
21541   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcmov_v2di,        "__builtin_ia32_pcmov",      IX86_BUILTIN_PCMOV,      0,            (int)MULTI_ARG_3_DI },
21542   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcmov_v2di,        "__builtin_ia32_pcmov_v2di", IX86_BUILTIN_PCMOV_V2DI, 0,            (int)MULTI_ARG_3_DI },
21543   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcmov_v4si,        "__builtin_ia32_pcmov_v4si", IX86_BUILTIN_PCMOV_V4SI, 0,            (int)MULTI_ARG_3_SI },
21544   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcmov_v8hi,        "__builtin_ia32_pcmov_v8hi", IX86_BUILTIN_PCMOV_V8HI, 0,            (int)MULTI_ARG_3_HI },
21545   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcmov_v16qi,       "__builtin_ia32_pcmov_v16qi",IX86_BUILTIN_PCMOV_V16QI,0,            (int)MULTI_ARG_3_QI },
21546   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcmov_v2df,        "__builtin_ia32_pcmov_v2df", IX86_BUILTIN_PCMOV_V2DF, 0,            (int)MULTI_ARG_3_DF },
21547   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcmov_v4sf,        "__builtin_ia32_pcmov_v4sf", IX86_BUILTIN_PCMOV_V4SF, 0,            (int)MULTI_ARG_3_SF },
21548   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pperm,             "__builtin_ia32_pperm",      IX86_BUILTIN_PPERM,      0,            (int)MULTI_ARG_3_QI },
21549   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_permv4sf,          "__builtin_ia32_permps",     IX86_BUILTIN_PERMPS,     0,            (int)MULTI_ARG_3_PERMPS },
21550   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_permv2df,          "__builtin_ia32_permpd",     IX86_BUILTIN_PERMPD,     0,            (int)MULTI_ARG_3_PERMPD },
21551   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmacssww,          "__builtin_ia32_pmacssww",   IX86_BUILTIN_PMACSSWW,   0,            (int)MULTI_ARG_3_HI },
21552   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmacsww,           "__builtin_ia32_pmacsww",    IX86_BUILTIN_PMACSWW,    0,            (int)MULTI_ARG_3_HI },
21553   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmacsswd,          "__builtin_ia32_pmacsswd",   IX86_BUILTIN_PMACSSWD,   0,            (int)MULTI_ARG_3_HI_SI },
21554   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmacswd,           "__builtin_ia32_pmacswd",    IX86_BUILTIN_PMACSWD,    0,            (int)MULTI_ARG_3_HI_SI },
21555   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmacssdd,          "__builtin_ia32_pmacssdd",   IX86_BUILTIN_PMACSSDD,   0,            (int)MULTI_ARG_3_SI },
21556   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmacsdd,           "__builtin_ia32_pmacsdd",    IX86_BUILTIN_PMACSDD,    0,            (int)MULTI_ARG_3_SI },
21557   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmacssdql,         "__builtin_ia32_pmacssdql",  IX86_BUILTIN_PMACSSDQL,  0,            (int)MULTI_ARG_3_SI_DI },
21558   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmacssdqh,         "__builtin_ia32_pmacssdqh",  IX86_BUILTIN_PMACSSDQH,  0,            (int)MULTI_ARG_3_SI_DI },
21559   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmacsdql,          "__builtin_ia32_pmacsdql",   IX86_BUILTIN_PMACSDQL,   0,            (int)MULTI_ARG_3_SI_DI },
21560   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmacsdqh,          "__builtin_ia32_pmacsdqh",   IX86_BUILTIN_PMACSDQH,   0,            (int)MULTI_ARG_3_SI_DI },
21561   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmadcsswd,         "__builtin_ia32_pmadcsswd",  IX86_BUILTIN_PMADCSSWD,  0,            (int)MULTI_ARG_3_HI_SI },
21562   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pmadcswd,          "__builtin_ia32_pmadcswd",   IX86_BUILTIN_PMADCSWD,   0,            (int)MULTI_ARG_3_HI_SI },
21563   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vrotlv2di3,        "__builtin_ia32_protq",      IX86_BUILTIN_PROTQ,      0,            (int)MULTI_ARG_2_DI },
21564   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vrotlv4si3,        "__builtin_ia32_protd",      IX86_BUILTIN_PROTD,      0,            (int)MULTI_ARG_2_SI },
21565   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vrotlv8hi3,        "__builtin_ia32_protw",      IX86_BUILTIN_PROTW,      0,            (int)MULTI_ARG_2_HI },
21566   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vrotlv16qi3,       "__builtin_ia32_protb",      IX86_BUILTIN_PROTB,      0,            (int)MULTI_ARG_2_QI },
21567   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_rotlv2di3,         "__builtin_ia32_protqi",     IX86_BUILTIN_PROTQ_IMM,  0,            (int)MULTI_ARG_2_DI_IMM },
21568   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_rotlv4si3,         "__builtin_ia32_protdi",     IX86_BUILTIN_PROTD_IMM,  0,            (int)MULTI_ARG_2_SI_IMM },
21569   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_rotlv8hi3,         "__builtin_ia32_protwi",     IX86_BUILTIN_PROTW_IMM,  0,            (int)MULTI_ARG_2_HI_IMM },
21570   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_rotlv16qi3,        "__builtin_ia32_protbi",     IX86_BUILTIN_PROTB_IMM,  0,            (int)MULTI_ARG_2_QI_IMM },
21571   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_ashlv2di3,         "__builtin_ia32_pshaq",      IX86_BUILTIN_PSHAQ,      0,            (int)MULTI_ARG_2_DI },
21572   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_ashlv4si3,         "__builtin_ia32_pshad",      IX86_BUILTIN_PSHAD,      0,            (int)MULTI_ARG_2_SI },
21573   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_ashlv8hi3,         "__builtin_ia32_pshaw",      IX86_BUILTIN_PSHAW,      0,            (int)MULTI_ARG_2_HI },
21574   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_ashlv16qi3,        "__builtin_ia32_pshab",      IX86_BUILTIN_PSHAB,      0,            (int)MULTI_ARG_2_QI },
21575   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_lshlv2di3,         "__builtin_ia32_pshlq",      IX86_BUILTIN_PSHLQ,      0,            (int)MULTI_ARG_2_DI },
21576   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_lshlv4si3,         "__builtin_ia32_pshld",      IX86_BUILTIN_PSHLD,      0,            (int)MULTI_ARG_2_SI },
21577   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_lshlv8hi3,         "__builtin_ia32_pshlw",      IX86_BUILTIN_PSHLW,      0,            (int)MULTI_ARG_2_HI },
21578   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_lshlv16qi3,        "__builtin_ia32_pshlb",      IX86_BUILTIN_PSHLB,      0,            (int)MULTI_ARG_2_QI },
21579   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmfrczv4sf2,       "__builtin_ia32_frczss",     IX86_BUILTIN_FRCZSS,     0,            (int)MULTI_ARG_2_SF },
21580   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmfrczv2df2,       "__builtin_ia32_frczsd",     IX86_BUILTIN_FRCZSD,     0,            (int)MULTI_ARG_2_DF },
21581   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_frczv4sf2,         "__builtin_ia32_frczps",     IX86_BUILTIN_FRCZPS,     0,            (int)MULTI_ARG_1_SF },
21582   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_frczv2df2,         "__builtin_ia32_frczpd",     IX86_BUILTIN_FRCZPD,     0,            (int)MULTI_ARG_1_DF },
21583   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_cvtph2ps,          "__builtin_ia32_cvtph2ps",   IX86_BUILTIN_CVTPH2PS,   0,            (int)MULTI_ARG_1_PH2PS },
21584   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_cvtps2ph,          "__builtin_ia32_cvtps2ph",   IX86_BUILTIN_CVTPS2PH,   0,            (int)MULTI_ARG_1_PS2PH },
21585   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phaddbw,           "__builtin_ia32_phaddbw",    IX86_BUILTIN_PHADDBW,    0,            (int)MULTI_ARG_1_QI_HI },
21586   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phaddbd,           "__builtin_ia32_phaddbd",    IX86_BUILTIN_PHADDBD,    0,            (int)MULTI_ARG_1_QI_SI },
21587   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phaddbq,           "__builtin_ia32_phaddbq",    IX86_BUILTIN_PHADDBQ,    0,            (int)MULTI_ARG_1_QI_DI },
21588   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phaddwd,           "__builtin_ia32_phaddwd",    IX86_BUILTIN_PHADDWD,    0,            (int)MULTI_ARG_1_HI_SI },
21589   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phaddwq,           "__builtin_ia32_phaddwq",    IX86_BUILTIN_PHADDWQ,    0,            (int)MULTI_ARG_1_HI_DI },
21590   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phadddq,           "__builtin_ia32_phadddq",    IX86_BUILTIN_PHADDDQ,    0,            (int)MULTI_ARG_1_SI_DI },
21591   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phaddubw,          "__builtin_ia32_phaddubw",   IX86_BUILTIN_PHADDUBW,   0,            (int)MULTI_ARG_1_QI_HI },
21592   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phaddubd,          "__builtin_ia32_phaddubd",   IX86_BUILTIN_PHADDUBD,   0,            (int)MULTI_ARG_1_QI_SI },
21593   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phaddubq,          "__builtin_ia32_phaddubq",   IX86_BUILTIN_PHADDUBQ,   0,            (int)MULTI_ARG_1_QI_DI },
21594   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phadduwd,          "__builtin_ia32_phadduwd",   IX86_BUILTIN_PHADDUWD,   0,            (int)MULTI_ARG_1_HI_SI },
21595   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phadduwq,          "__builtin_ia32_phadduwq",   IX86_BUILTIN_PHADDUWQ,   0,            (int)MULTI_ARG_1_HI_DI },
21596   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phaddudq,          "__builtin_ia32_phaddudq",   IX86_BUILTIN_PHADDUDQ,   0,            (int)MULTI_ARG_1_SI_DI },
21597   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phsubbw,           "__builtin_ia32_phsubbw",    IX86_BUILTIN_PHSUBBW,    0,            (int)MULTI_ARG_1_QI_HI },
21598   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phsubwd,           "__builtin_ia32_phsubwd",    IX86_BUILTIN_PHSUBWD,    0,            (int)MULTI_ARG_1_HI_SI },
21599   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_phsubdq,           "__builtin_ia32_phsubdq",    IX86_BUILTIN_PHSUBDQ,    0,            (int)MULTI_ARG_1_SI_DI },
21600
21601   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comeqss",    IX86_BUILTIN_COMEQSS,    EQ,           (int)MULTI_ARG_2_SF_CMP },
21602   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comness",    IX86_BUILTIN_COMNESS,    NE,           (int)MULTI_ARG_2_SF_CMP },
21603   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comneqss",   IX86_BUILTIN_COMNESS,    NE,           (int)MULTI_ARG_2_SF_CMP },
21604   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comltss",    IX86_BUILTIN_COMLTSS,    LT,           (int)MULTI_ARG_2_SF_CMP },
21605   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comless",    IX86_BUILTIN_COMLESS,    LE,           (int)MULTI_ARG_2_SF_CMP },
21606   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comgtss",    IX86_BUILTIN_COMGTSS,    GT,           (int)MULTI_ARG_2_SF_CMP },
21607   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comgess",    IX86_BUILTIN_COMGESS,    GE,           (int)MULTI_ARG_2_SF_CMP },
21608   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comueqss",   IX86_BUILTIN_COMUEQSS,   UNEQ,         (int)MULTI_ARG_2_SF_CMP },
21609   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comuness",   IX86_BUILTIN_COMUNESS,   LTGT,         (int)MULTI_ARG_2_SF_CMP },
21610   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comuneqss",  IX86_BUILTIN_COMUNESS,   LTGT,         (int)MULTI_ARG_2_SF_CMP },
21611   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comunltss",  IX86_BUILTIN_COMULTSS,   UNLT,         (int)MULTI_ARG_2_SF_CMP },
21612   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comunless",  IX86_BUILTIN_COMULESS,   UNLE,         (int)MULTI_ARG_2_SF_CMP },
21613   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comungtss",  IX86_BUILTIN_COMUGTSS,   UNGT,         (int)MULTI_ARG_2_SF_CMP },
21614   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comungess",  IX86_BUILTIN_COMUGESS,   UNGE,         (int)MULTI_ARG_2_SF_CMP },
21615   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comordss",   IX86_BUILTIN_COMORDSS,   ORDERED,      (int)MULTI_ARG_2_SF_CMP },
21616   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv4sf3,    "__builtin_ia32_comunordss", IX86_BUILTIN_COMUNORDSS, UNORDERED,    (int)MULTI_ARG_2_SF_CMP },
21617
21618   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comeqsd",    IX86_BUILTIN_COMEQSD,    EQ,           (int)MULTI_ARG_2_DF_CMP },
21619   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comnesd",    IX86_BUILTIN_COMNESD,    NE,           (int)MULTI_ARG_2_DF_CMP },
21620   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comneqsd",   IX86_BUILTIN_COMNESD,    NE,           (int)MULTI_ARG_2_DF_CMP },
21621   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comltsd",    IX86_BUILTIN_COMLTSD,    LT,           (int)MULTI_ARG_2_DF_CMP },
21622   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comlesd",    IX86_BUILTIN_COMLESD,    LE,           (int)MULTI_ARG_2_DF_CMP },
21623   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comgtsd",    IX86_BUILTIN_COMGTSD,    GT,           (int)MULTI_ARG_2_DF_CMP },
21624   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comgesd",    IX86_BUILTIN_COMGESD,    GE,           (int)MULTI_ARG_2_DF_CMP },
21625   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comueqsd",   IX86_BUILTIN_COMUEQSD,   UNEQ,         (int)MULTI_ARG_2_DF_CMP },
21626   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comunesd",   IX86_BUILTIN_COMUNESD,   LTGT,         (int)MULTI_ARG_2_DF_CMP },
21627   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comuneqsd",  IX86_BUILTIN_COMUNESD,   LTGT,         (int)MULTI_ARG_2_DF_CMP },
21628   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comunltsd",  IX86_BUILTIN_COMULTSD,   UNLT,         (int)MULTI_ARG_2_DF_CMP },
21629   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comunlesd",  IX86_BUILTIN_COMULESD,   UNLE,         (int)MULTI_ARG_2_DF_CMP },
21630   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comungtsd",  IX86_BUILTIN_COMUGTSD,   UNGT,         (int)MULTI_ARG_2_DF_CMP },
21631   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comungesd",  IX86_BUILTIN_COMUGESD,   UNGE,         (int)MULTI_ARG_2_DF_CMP },
21632   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comordsd",   IX86_BUILTIN_COMORDSD,   ORDERED,      (int)MULTI_ARG_2_DF_CMP },
21633   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_vmmaskcmpv2df3,    "__builtin_ia32_comunordsd", IX86_BUILTIN_COMUNORDSD, UNORDERED,    (int)MULTI_ARG_2_DF_CMP },
21634
21635   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comeqps",    IX86_BUILTIN_COMEQPS,    EQ,           (int)MULTI_ARG_2_SF_CMP },
21636   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comneps",    IX86_BUILTIN_COMNEPS,    NE,           (int)MULTI_ARG_2_SF_CMP },
21637   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comneqps",   IX86_BUILTIN_COMNEPS,    NE,           (int)MULTI_ARG_2_SF_CMP },
21638   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comltps",    IX86_BUILTIN_COMLTPS,    LT,           (int)MULTI_ARG_2_SF_CMP },
21639   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comleps",    IX86_BUILTIN_COMLEPS,    LE,           (int)MULTI_ARG_2_SF_CMP },
21640   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comgtps",    IX86_BUILTIN_COMGTPS,    GT,           (int)MULTI_ARG_2_SF_CMP },
21641   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comgeps",    IX86_BUILTIN_COMGEPS,    GE,           (int)MULTI_ARG_2_SF_CMP },
21642   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comueqps",   IX86_BUILTIN_COMUEQPS,   UNEQ,         (int)MULTI_ARG_2_SF_CMP },
21643   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comuneps",   IX86_BUILTIN_COMUNEPS,   LTGT,         (int)MULTI_ARG_2_SF_CMP },
21644   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comuneqps",  IX86_BUILTIN_COMUNEPS,   LTGT,         (int)MULTI_ARG_2_SF_CMP },
21645   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comunltps",  IX86_BUILTIN_COMULTPS,   UNLT,         (int)MULTI_ARG_2_SF_CMP },
21646   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comunleps",  IX86_BUILTIN_COMULEPS,   UNLE,         (int)MULTI_ARG_2_SF_CMP },
21647   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comungtps",  IX86_BUILTIN_COMUGTPS,   UNGT,         (int)MULTI_ARG_2_SF_CMP },
21648   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comungeps",  IX86_BUILTIN_COMUGEPS,   UNGE,         (int)MULTI_ARG_2_SF_CMP },
21649   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comordps",   IX86_BUILTIN_COMORDPS,   ORDERED,      (int)MULTI_ARG_2_SF_CMP },
21650   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4sf3,      "__builtin_ia32_comunordps", IX86_BUILTIN_COMUNORDPS, UNORDERED,    (int)MULTI_ARG_2_SF_CMP },
21651
21652   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comeqpd",    IX86_BUILTIN_COMEQPD,    EQ,           (int)MULTI_ARG_2_DF_CMP },
21653   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comnepd",    IX86_BUILTIN_COMNEPD,    NE,           (int)MULTI_ARG_2_DF_CMP },
21654   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comneqpd",   IX86_BUILTIN_COMNEPD,    NE,           (int)MULTI_ARG_2_DF_CMP },
21655   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comltpd",    IX86_BUILTIN_COMLTPD,    LT,           (int)MULTI_ARG_2_DF_CMP },
21656   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comlepd",    IX86_BUILTIN_COMLEPD,    LE,           (int)MULTI_ARG_2_DF_CMP },
21657   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comgtpd",    IX86_BUILTIN_COMGTPD,    GT,           (int)MULTI_ARG_2_DF_CMP },
21658   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comgepd",    IX86_BUILTIN_COMGEPD,    GE,           (int)MULTI_ARG_2_DF_CMP },
21659   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comueqpd",   IX86_BUILTIN_COMUEQPD,   UNEQ,         (int)MULTI_ARG_2_DF_CMP },
21660   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comunepd",   IX86_BUILTIN_COMUNEPD,   LTGT,         (int)MULTI_ARG_2_DF_CMP },
21661   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comuneqpd",  IX86_BUILTIN_COMUNEPD,   LTGT,         (int)MULTI_ARG_2_DF_CMP },
21662   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comunltpd",  IX86_BUILTIN_COMULTPD,   UNLT,         (int)MULTI_ARG_2_DF_CMP },
21663   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comunlepd",  IX86_BUILTIN_COMULEPD,   UNLE,         (int)MULTI_ARG_2_DF_CMP },
21664   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comungtpd",  IX86_BUILTIN_COMUGTPD,   UNGT,         (int)MULTI_ARG_2_DF_CMP },
21665   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comungepd",  IX86_BUILTIN_COMUGEPD,   UNGE,         (int)MULTI_ARG_2_DF_CMP },
21666   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comordpd",   IX86_BUILTIN_COMORDPD,   ORDERED,      (int)MULTI_ARG_2_DF_CMP },
21667   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2df3,      "__builtin_ia32_comunordpd", IX86_BUILTIN_COMUNORDPD, UNORDERED,    (int)MULTI_ARG_2_DF_CMP },
21668
21669   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv16qi3,     "__builtin_ia32_pcomeqb",    IX86_BUILTIN_PCOMEQB,    EQ,           (int)MULTI_ARG_2_QI_CMP },
21670   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv16qi3,     "__builtin_ia32_pcomneb",    IX86_BUILTIN_PCOMNEB,    NE,           (int)MULTI_ARG_2_QI_CMP },
21671   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv16qi3,     "__builtin_ia32_pcomneqb",   IX86_BUILTIN_PCOMNEB,    NE,           (int)MULTI_ARG_2_QI_CMP },
21672   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv16qi3,     "__builtin_ia32_pcomltb",    IX86_BUILTIN_PCOMLTB,    LT,           (int)MULTI_ARG_2_QI_CMP },
21673   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv16qi3,     "__builtin_ia32_pcomleb",    IX86_BUILTIN_PCOMLEB,    LE,           (int)MULTI_ARG_2_QI_CMP },
21674   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv16qi3,     "__builtin_ia32_pcomgtb",    IX86_BUILTIN_PCOMGTB,    GT,           (int)MULTI_ARG_2_QI_CMP },
21675   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv16qi3,     "__builtin_ia32_pcomgeb",    IX86_BUILTIN_PCOMGEB,    GE,           (int)MULTI_ARG_2_QI_CMP },
21676
21677   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv8hi3,      "__builtin_ia32_pcomeqw",    IX86_BUILTIN_PCOMEQW,    EQ,           (int)MULTI_ARG_2_HI_CMP },
21678   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv8hi3,      "__builtin_ia32_pcomnew",    IX86_BUILTIN_PCOMNEW,    NE,           (int)MULTI_ARG_2_HI_CMP },
21679   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv8hi3,      "__builtin_ia32_pcomneqw",   IX86_BUILTIN_PCOMNEW,    NE,           (int)MULTI_ARG_2_HI_CMP },
21680   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv8hi3,      "__builtin_ia32_pcomltw",    IX86_BUILTIN_PCOMLTW,    LT,           (int)MULTI_ARG_2_HI_CMP },
21681   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv8hi3,      "__builtin_ia32_pcomlew",    IX86_BUILTIN_PCOMLEW,    LE,           (int)MULTI_ARG_2_HI_CMP },
21682   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv8hi3,      "__builtin_ia32_pcomgtw",    IX86_BUILTIN_PCOMGTW,    GT,           (int)MULTI_ARG_2_HI_CMP },
21683   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv8hi3,      "__builtin_ia32_pcomgew",    IX86_BUILTIN_PCOMGEW,    GE,           (int)MULTI_ARG_2_HI_CMP },
21684
21685   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4si3,      "__builtin_ia32_pcomeqd",    IX86_BUILTIN_PCOMEQD,    EQ,           (int)MULTI_ARG_2_SI_CMP },
21686   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4si3,      "__builtin_ia32_pcomned",    IX86_BUILTIN_PCOMNED,    NE,           (int)MULTI_ARG_2_SI_CMP },
21687   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4si3,      "__builtin_ia32_pcomneqd",   IX86_BUILTIN_PCOMNED,    NE,           (int)MULTI_ARG_2_SI_CMP },
21688   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4si3,      "__builtin_ia32_pcomltd",    IX86_BUILTIN_PCOMLTD,    LT,           (int)MULTI_ARG_2_SI_CMP },
21689   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4si3,      "__builtin_ia32_pcomled",    IX86_BUILTIN_PCOMLED,    LE,           (int)MULTI_ARG_2_SI_CMP },
21690   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4si3,      "__builtin_ia32_pcomgtd",    IX86_BUILTIN_PCOMGTD,    GT,           (int)MULTI_ARG_2_SI_CMP },
21691   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv4si3,      "__builtin_ia32_pcomged",    IX86_BUILTIN_PCOMGED,    GE,           (int)MULTI_ARG_2_SI_CMP },
21692
21693   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2di3,      "__builtin_ia32_pcomeqq",    IX86_BUILTIN_PCOMEQQ,    EQ,           (int)MULTI_ARG_2_DI_CMP },
21694   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2di3,      "__builtin_ia32_pcomneq",    IX86_BUILTIN_PCOMNEQ,    NE,           (int)MULTI_ARG_2_DI_CMP },
21695   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2di3,      "__builtin_ia32_pcomneqq",   IX86_BUILTIN_PCOMNEQ,    NE,           (int)MULTI_ARG_2_DI_CMP },
21696   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2di3,      "__builtin_ia32_pcomltq",    IX86_BUILTIN_PCOMLTQ,    LT,           (int)MULTI_ARG_2_DI_CMP },
21697   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2di3,      "__builtin_ia32_pcomleq",    IX86_BUILTIN_PCOMLEQ,    LE,           (int)MULTI_ARG_2_DI_CMP },
21698   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2di3,      "__builtin_ia32_pcomgtq",    IX86_BUILTIN_PCOMGTQ,    GT,           (int)MULTI_ARG_2_DI_CMP },
21699   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmpv2di3,      "__builtin_ia32_pcomgeq",    IX86_BUILTIN_PCOMGEQ,    GE,           (int)MULTI_ARG_2_DI_CMP },
21700
21701   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v16qi3,"__builtin_ia32_pcomequb",   IX86_BUILTIN_PCOMEQUB,   EQ,           (int)MULTI_ARG_2_QI_CMP },
21702   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v16qi3,"__builtin_ia32_pcomneub",   IX86_BUILTIN_PCOMNEUB,   NE,           (int)MULTI_ARG_2_QI_CMP },
21703   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v16qi3,"__builtin_ia32_pcomnequb",  IX86_BUILTIN_PCOMNEUB,   NE,           (int)MULTI_ARG_2_QI_CMP },
21704   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv16qi3, "__builtin_ia32_pcomltub",   IX86_BUILTIN_PCOMLTUB,   LTU,          (int)MULTI_ARG_2_QI_CMP },
21705   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv16qi3, "__builtin_ia32_pcomleub",   IX86_BUILTIN_PCOMLEUB,   LEU,          (int)MULTI_ARG_2_QI_CMP },
21706   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv16qi3, "__builtin_ia32_pcomgtub",   IX86_BUILTIN_PCOMGTUB,   GTU,          (int)MULTI_ARG_2_QI_CMP },
21707   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv16qi3, "__builtin_ia32_pcomgeub",   IX86_BUILTIN_PCOMGEUB,   GEU,          (int)MULTI_ARG_2_QI_CMP },
21708
21709   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v8hi3, "__builtin_ia32_pcomequw",   IX86_BUILTIN_PCOMEQUW,   EQ,           (int)MULTI_ARG_2_HI_CMP },
21710   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v8hi3, "__builtin_ia32_pcomneuw",   IX86_BUILTIN_PCOMNEUW,   NE,           (int)MULTI_ARG_2_HI_CMP },
21711   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v8hi3, "__builtin_ia32_pcomnequw",  IX86_BUILTIN_PCOMNEUW,   NE,           (int)MULTI_ARG_2_HI_CMP },
21712   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv8hi3,  "__builtin_ia32_pcomltuw",   IX86_BUILTIN_PCOMLTUW,   LTU,          (int)MULTI_ARG_2_HI_CMP },
21713   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv8hi3,  "__builtin_ia32_pcomleuw",   IX86_BUILTIN_PCOMLEUW,   LEU,          (int)MULTI_ARG_2_HI_CMP },
21714   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv8hi3,  "__builtin_ia32_pcomgtuw",   IX86_BUILTIN_PCOMGTUW,   GTU,          (int)MULTI_ARG_2_HI_CMP },
21715   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv8hi3,  "__builtin_ia32_pcomgeuw",   IX86_BUILTIN_PCOMGEUW,   GEU,          (int)MULTI_ARG_2_HI_CMP },
21716
21717   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v4si3, "__builtin_ia32_pcomequd",   IX86_BUILTIN_PCOMEQUD,   EQ,           (int)MULTI_ARG_2_SI_CMP },
21718   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v4si3, "__builtin_ia32_pcomneud",   IX86_BUILTIN_PCOMNEUD,   NE,           (int)MULTI_ARG_2_SI_CMP },
21719   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v4si3, "__builtin_ia32_pcomnequd",  IX86_BUILTIN_PCOMNEUD,   NE,           (int)MULTI_ARG_2_SI_CMP },
21720   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv4si3,  "__builtin_ia32_pcomltud",   IX86_BUILTIN_PCOMLTUD,   LTU,          (int)MULTI_ARG_2_SI_CMP },
21721   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv4si3,  "__builtin_ia32_pcomleud",   IX86_BUILTIN_PCOMLEUD,   LEU,          (int)MULTI_ARG_2_SI_CMP },
21722   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv4si3,  "__builtin_ia32_pcomgtud",   IX86_BUILTIN_PCOMGTUD,   GTU,          (int)MULTI_ARG_2_SI_CMP },
21723   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv4si3,  "__builtin_ia32_pcomgeud",   IX86_BUILTIN_PCOMGEUD,   GEU,          (int)MULTI_ARG_2_SI_CMP },
21724
21725   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v2di3, "__builtin_ia32_pcomequq",   IX86_BUILTIN_PCOMEQUQ,   EQ,           (int)MULTI_ARG_2_DI_CMP },
21726   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v2di3, "__builtin_ia32_pcomneuq",   IX86_BUILTIN_PCOMNEUQ,   NE,           (int)MULTI_ARG_2_DI_CMP },
21727   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_uns2v2di3, "__builtin_ia32_pcomnequq",  IX86_BUILTIN_PCOMNEUQ,   NE,           (int)MULTI_ARG_2_DI_CMP },
21728   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv2di3,  "__builtin_ia32_pcomltuq",   IX86_BUILTIN_PCOMLTUQ,   LTU,          (int)MULTI_ARG_2_DI_CMP },
21729   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv2di3,  "__builtin_ia32_pcomleuq",   IX86_BUILTIN_PCOMLEUQ,   LEU,          (int)MULTI_ARG_2_DI_CMP },
21730   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv2di3,  "__builtin_ia32_pcomgtuq",   IX86_BUILTIN_PCOMGTUQ,   GTU,          (int)MULTI_ARG_2_DI_CMP },
21731   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_maskcmp_unsv2di3,  "__builtin_ia32_pcomgeuq",   IX86_BUILTIN_PCOMGEUQ,   GEU,          (int)MULTI_ARG_2_DI_CMP },
21732
21733   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_com_tfv4sf3,       "__builtin_ia32_comfalsess", IX86_BUILTIN_COMFALSESS, COM_FALSE_S,  (int)MULTI_ARG_2_SF_TF },
21734   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_com_tfv4sf3,       "__builtin_ia32_comtruess",  IX86_BUILTIN_COMTRUESS,  COM_TRUE_S,   (int)MULTI_ARG_2_SF_TF },
21735   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_com_tfv4sf3,       "__builtin_ia32_comfalseps", IX86_BUILTIN_COMFALSEPS, COM_FALSE_P,  (int)MULTI_ARG_2_SF_TF },
21736   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_com_tfv4sf3,       "__builtin_ia32_comtrueps",  IX86_BUILTIN_COMTRUEPS,  COM_TRUE_P,   (int)MULTI_ARG_2_SF_TF },
21737   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_com_tfv2df3,       "__builtin_ia32_comfalsesd", IX86_BUILTIN_COMFALSESD, COM_FALSE_S,  (int)MULTI_ARG_2_DF_TF },
21738   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_com_tfv2df3,       "__builtin_ia32_comtruesd",  IX86_BUILTIN_COMTRUESD,  COM_TRUE_S,   (int)MULTI_ARG_2_DF_TF },
21739   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_com_tfv2df3,       "__builtin_ia32_comfalsepd", IX86_BUILTIN_COMFALSEPD, COM_FALSE_P,  (int)MULTI_ARG_2_DF_TF },
21740   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_com_tfv2df3,       "__builtin_ia32_comtruepd",  IX86_BUILTIN_COMTRUEPD,  COM_TRUE_P,   (int)MULTI_ARG_2_DF_TF },
21741
21742   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv16qi3,     "__builtin_ia32_pcomfalseb", IX86_BUILTIN_PCOMFALSEB, PCOM_FALSE,   (int)MULTI_ARG_2_QI_TF },
21743   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv8hi3,      "__builtin_ia32_pcomfalsew", IX86_BUILTIN_PCOMFALSEW, PCOM_FALSE,   (int)MULTI_ARG_2_HI_TF },
21744   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv4si3,      "__builtin_ia32_pcomfalsed", IX86_BUILTIN_PCOMFALSED, PCOM_FALSE,   (int)MULTI_ARG_2_SI_TF },
21745   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv2di3,      "__builtin_ia32_pcomfalseq", IX86_BUILTIN_PCOMFALSEQ, PCOM_FALSE,   (int)MULTI_ARG_2_DI_TF },
21746   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv16qi3,     "__builtin_ia32_pcomfalseub",IX86_BUILTIN_PCOMFALSEUB,PCOM_FALSE,   (int)MULTI_ARG_2_QI_TF },
21747   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv8hi3,      "__builtin_ia32_pcomfalseuw",IX86_BUILTIN_PCOMFALSEUW,PCOM_FALSE,   (int)MULTI_ARG_2_HI_TF },
21748   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv4si3,      "__builtin_ia32_pcomfalseud",IX86_BUILTIN_PCOMFALSEUD,PCOM_FALSE,   (int)MULTI_ARG_2_SI_TF },
21749   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv2di3,      "__builtin_ia32_pcomfalseuq",IX86_BUILTIN_PCOMFALSEUQ,PCOM_FALSE,   (int)MULTI_ARG_2_DI_TF },
21750
21751   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv16qi3,     "__builtin_ia32_pcomtrueb",  IX86_BUILTIN_PCOMTRUEB,  PCOM_TRUE,    (int)MULTI_ARG_2_QI_TF },
21752   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv8hi3,      "__builtin_ia32_pcomtruew",  IX86_BUILTIN_PCOMTRUEW,  PCOM_TRUE,    (int)MULTI_ARG_2_HI_TF },
21753   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv4si3,      "__builtin_ia32_pcomtrued",  IX86_BUILTIN_PCOMTRUED,  PCOM_TRUE,    (int)MULTI_ARG_2_SI_TF },
21754   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv2di3,      "__builtin_ia32_pcomtrueq",  IX86_BUILTIN_PCOMTRUEQ,  PCOM_TRUE,    (int)MULTI_ARG_2_DI_TF },
21755   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv16qi3,     "__builtin_ia32_pcomtrueub", IX86_BUILTIN_PCOMTRUEUB, PCOM_TRUE,    (int)MULTI_ARG_2_QI_TF },
21756   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv8hi3,      "__builtin_ia32_pcomtrueuw", IX86_BUILTIN_PCOMTRUEUW, PCOM_TRUE,    (int)MULTI_ARG_2_HI_TF },
21757   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv4si3,      "__builtin_ia32_pcomtrueud", IX86_BUILTIN_PCOMTRUEUD, PCOM_TRUE,    (int)MULTI_ARG_2_SI_TF },
21758   { OPTION_MASK_ISA_SSE5, CODE_FOR_sse5_pcom_tfv2di3,      "__builtin_ia32_pcomtrueuq", IX86_BUILTIN_PCOMTRUEUQ, PCOM_TRUE,    (int)MULTI_ARG_2_DI_TF },
21759 };
21760
21761 /* Set up all the MMX/SSE builtins, even builtins for instructions that are not
21762    in the current target ISA to allow the user to compile particular modules
21763    with different target specific options that differ from the command line
21764    options.  */
21765 static void
21766 ix86_init_mmx_sse_builtins (void)
21767 {
21768   const struct builtin_description * d;
21769   size_t i;
21770
21771   tree V16QI_type_node = build_vector_type_for_mode (char_type_node, V16QImode);
21772   tree V2SI_type_node = build_vector_type_for_mode (intSI_type_node, V2SImode);
21773   tree V1DI_type_node
21774     = build_vector_type_for_mode (long_long_integer_type_node, V1DImode);
21775   tree V2SF_type_node = build_vector_type_for_mode (float_type_node, V2SFmode);
21776   tree V2DI_type_node
21777     = build_vector_type_for_mode (long_long_integer_type_node, V2DImode);
21778   tree V2DF_type_node = build_vector_type_for_mode (double_type_node, V2DFmode);
21779   tree V4SF_type_node = build_vector_type_for_mode (float_type_node, V4SFmode);
21780   tree V4SI_type_node = build_vector_type_for_mode (intSI_type_node, V4SImode);
21781   tree V4HI_type_node = build_vector_type_for_mode (intHI_type_node, V4HImode);
21782   tree V8QI_type_node = build_vector_type_for_mode (char_type_node, V8QImode);
21783   tree V8HI_type_node = build_vector_type_for_mode (intHI_type_node, V8HImode);
21784
21785   tree pchar_type_node = build_pointer_type (char_type_node);
21786   tree pcchar_type_node
21787     = build_pointer_type (build_type_variant (char_type_node, 1, 0));
21788   tree pfloat_type_node = build_pointer_type (float_type_node);
21789   tree pcfloat_type_node
21790     = build_pointer_type (build_type_variant (float_type_node, 1, 0));
21791   tree pv2sf_type_node = build_pointer_type (V2SF_type_node);
21792   tree pcv2sf_type_node
21793     = build_pointer_type (build_type_variant (V2SF_type_node, 1, 0));
21794   tree pv2di_type_node = build_pointer_type (V2DI_type_node);
21795   tree pdi_type_node = build_pointer_type (long_long_unsigned_type_node);
21796
21797   /* Comparisons.  */
21798   tree int_ftype_v4sf_v4sf
21799     = build_function_type_list (integer_type_node,
21800                                 V4SF_type_node, V4SF_type_node, NULL_TREE);
21801   tree v4si_ftype_v4sf_v4sf
21802     = build_function_type_list (V4SI_type_node,
21803                                 V4SF_type_node, V4SF_type_node, NULL_TREE);
21804   /* MMX/SSE/integer conversions.  */
21805   tree int_ftype_v4sf
21806     = build_function_type_list (integer_type_node,
21807                                 V4SF_type_node, NULL_TREE);
21808   tree int64_ftype_v4sf
21809     = build_function_type_list (long_long_integer_type_node,
21810                                 V4SF_type_node, NULL_TREE);
21811   tree int_ftype_v8qi
21812     = build_function_type_list (integer_type_node, V8QI_type_node, NULL_TREE);
21813   tree v4sf_ftype_v4sf_int
21814     = build_function_type_list (V4SF_type_node,
21815                                 V4SF_type_node, integer_type_node, NULL_TREE);
21816   tree v4sf_ftype_v4sf_int64
21817     = build_function_type_list (V4SF_type_node,
21818                                 V4SF_type_node, long_long_integer_type_node,
21819                                 NULL_TREE);
21820   tree v4sf_ftype_v4sf_v2si
21821     = build_function_type_list (V4SF_type_node,
21822                                 V4SF_type_node, V2SI_type_node, NULL_TREE);
21823
21824   /* Miscellaneous.  */
21825   tree v8qi_ftype_v4hi_v4hi
21826     = build_function_type_list (V8QI_type_node,
21827                                 V4HI_type_node, V4HI_type_node, NULL_TREE);
21828   tree v4hi_ftype_v2si_v2si
21829     = build_function_type_list (V4HI_type_node,
21830                                 V2SI_type_node, V2SI_type_node, NULL_TREE);
21831   tree v4sf_ftype_v4sf_v4sf_int
21832     = build_function_type_list (V4SF_type_node,
21833                                 V4SF_type_node, V4SF_type_node,
21834                                 integer_type_node, NULL_TREE);
21835   tree v2si_ftype_v4hi_v4hi
21836     = build_function_type_list (V2SI_type_node,
21837                                 V4HI_type_node, V4HI_type_node, NULL_TREE);
21838   tree v4hi_ftype_v4hi_int
21839     = build_function_type_list (V4HI_type_node,
21840                                 V4HI_type_node, integer_type_node, NULL_TREE);
21841   tree v2si_ftype_v2si_int
21842     = build_function_type_list (V2SI_type_node,
21843                                 V2SI_type_node, integer_type_node, NULL_TREE);
21844   tree v1di_ftype_v1di_int
21845     = build_function_type_list (V1DI_type_node,
21846                                 V1DI_type_node, integer_type_node, NULL_TREE);
21847
21848   tree void_ftype_void
21849     = build_function_type (void_type_node, void_list_node);
21850   tree void_ftype_unsigned
21851     = build_function_type_list (void_type_node, unsigned_type_node, NULL_TREE);
21852   tree void_ftype_unsigned_unsigned
21853     = build_function_type_list (void_type_node, unsigned_type_node,
21854                                 unsigned_type_node, NULL_TREE);
21855   tree void_ftype_pcvoid_unsigned_unsigned
21856     = build_function_type_list (void_type_node, const_ptr_type_node,
21857                                 unsigned_type_node, unsigned_type_node,
21858                                 NULL_TREE);
21859   tree unsigned_ftype_void
21860     = build_function_type (unsigned_type_node, void_list_node);
21861   tree v2si_ftype_v4sf
21862     = build_function_type_list (V2SI_type_node, V4SF_type_node, NULL_TREE);
21863   /* Loads/stores.  */
21864   tree void_ftype_v8qi_v8qi_pchar
21865     = build_function_type_list (void_type_node,
21866                                 V8QI_type_node, V8QI_type_node,
21867                                 pchar_type_node, NULL_TREE);
21868   tree v4sf_ftype_pcfloat
21869     = build_function_type_list (V4SF_type_node, pcfloat_type_node, NULL_TREE);
21870   tree v4sf_ftype_v4sf_pcv2sf
21871     = build_function_type_list (V4SF_type_node,
21872                                 V4SF_type_node, pcv2sf_type_node, NULL_TREE);
21873   tree void_ftype_pv2sf_v4sf
21874     = build_function_type_list (void_type_node,
21875                                 pv2sf_type_node, V4SF_type_node, NULL_TREE);
21876   tree void_ftype_pfloat_v4sf
21877     = build_function_type_list (void_type_node,
21878                                 pfloat_type_node, V4SF_type_node, NULL_TREE);
21879   tree void_ftype_pdi_di
21880     = build_function_type_list (void_type_node,
21881                                 pdi_type_node, long_long_unsigned_type_node,
21882                                 NULL_TREE);
21883   tree void_ftype_pv2di_v2di
21884     = build_function_type_list (void_type_node,
21885                                 pv2di_type_node, V2DI_type_node, NULL_TREE);
21886   /* Normal vector unops.  */
21887   tree v4sf_ftype_v4sf
21888     = build_function_type_list (V4SF_type_node, V4SF_type_node, NULL_TREE);
21889   tree v16qi_ftype_v16qi
21890     = build_function_type_list (V16QI_type_node, V16QI_type_node, NULL_TREE);
21891   tree v8hi_ftype_v8hi
21892     = build_function_type_list (V8HI_type_node, V8HI_type_node, NULL_TREE);
21893   tree v4si_ftype_v4si
21894     = build_function_type_list (V4SI_type_node, V4SI_type_node, NULL_TREE);
21895   tree v8qi_ftype_v8qi
21896     = build_function_type_list (V8QI_type_node, V8QI_type_node, NULL_TREE);
21897   tree v4hi_ftype_v4hi
21898     = build_function_type_list (V4HI_type_node, V4HI_type_node, NULL_TREE);
21899
21900   /* Normal vector binops.  */
21901   tree v4sf_ftype_v4sf_v4sf
21902     = build_function_type_list (V4SF_type_node,
21903                                 V4SF_type_node, V4SF_type_node, NULL_TREE);
21904   tree v8qi_ftype_v8qi_v8qi
21905     = build_function_type_list (V8QI_type_node,
21906                                 V8QI_type_node, V8QI_type_node, NULL_TREE);
21907   tree v4hi_ftype_v4hi_v4hi
21908     = build_function_type_list (V4HI_type_node,
21909                                 V4HI_type_node, V4HI_type_node, NULL_TREE);
21910   tree v2si_ftype_v2si_v2si
21911     = build_function_type_list (V2SI_type_node,
21912                                 V2SI_type_node, V2SI_type_node, NULL_TREE);
21913   tree v1di_ftype_v1di_v1di
21914     = build_function_type_list (V1DI_type_node,
21915                                 V1DI_type_node, V1DI_type_node, NULL_TREE);
21916   tree v1di_ftype_v1di_v1di_int
21917     = build_function_type_list (V1DI_type_node,
21918                                 V1DI_type_node, V1DI_type_node,
21919                                 integer_type_node, NULL_TREE);
21920   tree v2si_ftype_v2sf
21921     = build_function_type_list (V2SI_type_node, V2SF_type_node, NULL_TREE);
21922   tree v2sf_ftype_v2si
21923     = build_function_type_list (V2SF_type_node, V2SI_type_node, NULL_TREE);
21924   tree v2si_ftype_v2si
21925     = build_function_type_list (V2SI_type_node, V2SI_type_node, NULL_TREE);
21926   tree v2sf_ftype_v2sf
21927     = build_function_type_list (V2SF_type_node, V2SF_type_node, NULL_TREE);
21928   tree v2sf_ftype_v2sf_v2sf
21929     = build_function_type_list (V2SF_type_node,
21930                                 V2SF_type_node, V2SF_type_node, NULL_TREE);
21931   tree v2si_ftype_v2sf_v2sf
21932     = build_function_type_list (V2SI_type_node,
21933                                 V2SF_type_node, V2SF_type_node, NULL_TREE);
21934   tree pint_type_node    = build_pointer_type (integer_type_node);
21935   tree pdouble_type_node = build_pointer_type (double_type_node);
21936   tree pcdouble_type_node = build_pointer_type (
21937                                 build_type_variant (double_type_node, 1, 0));
21938   tree int_ftype_v2df_v2df
21939     = build_function_type_list (integer_type_node,
21940                                 V2DF_type_node, V2DF_type_node, NULL_TREE);
21941
21942   tree void_ftype_pcvoid
21943     = build_function_type_list (void_type_node, const_ptr_type_node, NULL_TREE);
21944   tree v4sf_ftype_v4si
21945     = build_function_type_list (V4SF_type_node, V4SI_type_node, NULL_TREE);
21946   tree v4si_ftype_v4sf
21947     = build_function_type_list (V4SI_type_node, V4SF_type_node, NULL_TREE);
21948   tree v2df_ftype_v4si
21949     = build_function_type_list (V2DF_type_node, V4SI_type_node, NULL_TREE);
21950   tree v4si_ftype_v2df
21951     = build_function_type_list (V4SI_type_node, V2DF_type_node, NULL_TREE);
21952   tree v4si_ftype_v2df_v2df
21953     = build_function_type_list (V4SI_type_node,
21954                                 V2DF_type_node, V2DF_type_node, NULL_TREE);
21955   tree v2si_ftype_v2df
21956     = build_function_type_list (V2SI_type_node, V2DF_type_node, NULL_TREE);
21957   tree v4sf_ftype_v2df
21958     = build_function_type_list (V4SF_type_node, V2DF_type_node, NULL_TREE);
21959   tree v2df_ftype_v2si
21960     = build_function_type_list (V2DF_type_node, V2SI_type_node, NULL_TREE);
21961   tree v2df_ftype_v4sf
21962     = build_function_type_list (V2DF_type_node, V4SF_type_node, NULL_TREE);
21963   tree int_ftype_v2df
21964     = build_function_type_list (integer_type_node, V2DF_type_node, NULL_TREE);
21965   tree int64_ftype_v2df
21966     = build_function_type_list (long_long_integer_type_node,
21967                                 V2DF_type_node, NULL_TREE);
21968   tree v2df_ftype_v2df_int
21969     = build_function_type_list (V2DF_type_node,
21970                                 V2DF_type_node, integer_type_node, NULL_TREE);
21971   tree v2df_ftype_v2df_int64
21972     = build_function_type_list (V2DF_type_node,
21973                                 V2DF_type_node, long_long_integer_type_node,
21974                                 NULL_TREE);
21975   tree v4sf_ftype_v4sf_v2df
21976     = build_function_type_list (V4SF_type_node,
21977                                 V4SF_type_node, V2DF_type_node, NULL_TREE);
21978   tree v2df_ftype_v2df_v4sf
21979     = build_function_type_list (V2DF_type_node,
21980                                 V2DF_type_node, V4SF_type_node, NULL_TREE);
21981   tree v2df_ftype_v2df_v2df_int
21982     = build_function_type_list (V2DF_type_node,
21983                                 V2DF_type_node, V2DF_type_node,
21984                                 integer_type_node,
21985                                 NULL_TREE);
21986   tree v2df_ftype_v2df_pcdouble
21987     = build_function_type_list (V2DF_type_node,
21988                                 V2DF_type_node, pcdouble_type_node, NULL_TREE);
21989   tree void_ftype_pdouble_v2df
21990     = build_function_type_list (void_type_node,
21991                                 pdouble_type_node, V2DF_type_node, NULL_TREE);
21992   tree void_ftype_pint_int
21993     = build_function_type_list (void_type_node,
21994                                 pint_type_node, integer_type_node, NULL_TREE);
21995   tree void_ftype_v16qi_v16qi_pchar
21996     = build_function_type_list (void_type_node,
21997                                 V16QI_type_node, V16QI_type_node,
21998                                 pchar_type_node, NULL_TREE);
21999   tree v2df_ftype_pcdouble
22000     = build_function_type_list (V2DF_type_node, pcdouble_type_node, NULL_TREE);
22001   tree v2df_ftype_v2df_v2df
22002     = build_function_type_list (V2DF_type_node,
22003                                 V2DF_type_node, V2DF_type_node, NULL_TREE);
22004   tree v16qi_ftype_v16qi_v16qi
22005     = build_function_type_list (V16QI_type_node,
22006                                 V16QI_type_node, V16QI_type_node, NULL_TREE);
22007   tree v8hi_ftype_v8hi_v8hi
22008     = build_function_type_list (V8HI_type_node,
22009                                 V8HI_type_node, V8HI_type_node, NULL_TREE);
22010   tree v4si_ftype_v4si_v4si
22011     = build_function_type_list (V4SI_type_node,
22012                                 V4SI_type_node, V4SI_type_node, NULL_TREE);
22013   tree v2di_ftype_v2di_v2di
22014     = build_function_type_list (V2DI_type_node,
22015                                 V2DI_type_node, V2DI_type_node, NULL_TREE);
22016   tree v2di_ftype_v2df_v2df
22017     = build_function_type_list (V2DI_type_node,
22018                                 V2DF_type_node, V2DF_type_node, NULL_TREE);
22019   tree v2df_ftype_v2df
22020     = build_function_type_list (V2DF_type_node, V2DF_type_node, NULL_TREE);
22021   tree v2di_ftype_v2di_int
22022     = build_function_type_list (V2DI_type_node,
22023                                 V2DI_type_node, integer_type_node, NULL_TREE);
22024   tree v2di_ftype_v2di_v2di_int
22025     = build_function_type_list (V2DI_type_node, V2DI_type_node,
22026                                 V2DI_type_node, integer_type_node, NULL_TREE);
22027   tree v4si_ftype_v4si_int
22028     = build_function_type_list (V4SI_type_node,
22029                                 V4SI_type_node, integer_type_node, NULL_TREE);
22030   tree v8hi_ftype_v8hi_int
22031     = build_function_type_list (V8HI_type_node,
22032                                 V8HI_type_node, integer_type_node, NULL_TREE);
22033   tree v4si_ftype_v8hi_v8hi
22034     = build_function_type_list (V4SI_type_node,
22035                                 V8HI_type_node, V8HI_type_node, NULL_TREE);
22036   tree v1di_ftype_v8qi_v8qi
22037     = build_function_type_list (V1DI_type_node,
22038                                 V8QI_type_node, V8QI_type_node, NULL_TREE);
22039   tree v1di_ftype_v2si_v2si
22040     = build_function_type_list (V1DI_type_node,
22041                                 V2SI_type_node, V2SI_type_node, NULL_TREE);
22042   tree v2di_ftype_v16qi_v16qi
22043     = build_function_type_list (V2DI_type_node,
22044                                 V16QI_type_node, V16QI_type_node, NULL_TREE);
22045   tree v2di_ftype_v4si_v4si
22046     = build_function_type_list (V2DI_type_node,
22047                                 V4SI_type_node, V4SI_type_node, NULL_TREE);
22048   tree int_ftype_v16qi
22049     = build_function_type_list (integer_type_node, V16QI_type_node, NULL_TREE);
22050   tree v16qi_ftype_pcchar
22051     = build_function_type_list (V16QI_type_node, pcchar_type_node, NULL_TREE);
22052   tree void_ftype_pchar_v16qi
22053     = build_function_type_list (void_type_node,
22054                                 pchar_type_node, V16QI_type_node, NULL_TREE);
22055
22056   tree v2di_ftype_v2di_unsigned_unsigned
22057     = build_function_type_list (V2DI_type_node, V2DI_type_node,
22058                                 unsigned_type_node, unsigned_type_node,
22059                                 NULL_TREE);
22060   tree v2di_ftype_v2di_v2di_unsigned_unsigned
22061     = build_function_type_list (V2DI_type_node, V2DI_type_node, V2DI_type_node,
22062                                 unsigned_type_node, unsigned_type_node,
22063                                 NULL_TREE);
22064   tree v2di_ftype_v2di_v16qi
22065     = build_function_type_list (V2DI_type_node, V2DI_type_node, V16QI_type_node,
22066                                 NULL_TREE);
22067   tree v2df_ftype_v2df_v2df_v2df
22068     = build_function_type_list (V2DF_type_node,
22069                                 V2DF_type_node, V2DF_type_node,
22070                                 V2DF_type_node, NULL_TREE);
22071   tree v4sf_ftype_v4sf_v4sf_v4sf
22072     = build_function_type_list (V4SF_type_node,
22073                                 V4SF_type_node, V4SF_type_node,
22074                                 V4SF_type_node, NULL_TREE);
22075   tree v8hi_ftype_v16qi
22076     = build_function_type_list (V8HI_type_node, V16QI_type_node,
22077                                 NULL_TREE);
22078   tree v4si_ftype_v16qi
22079     = build_function_type_list (V4SI_type_node, V16QI_type_node,
22080                                 NULL_TREE);
22081   tree v2di_ftype_v16qi
22082     = build_function_type_list (V2DI_type_node, V16QI_type_node,
22083                                 NULL_TREE);
22084   tree v4si_ftype_v8hi
22085     = build_function_type_list (V4SI_type_node, V8HI_type_node,
22086                                 NULL_TREE);
22087   tree v2di_ftype_v8hi
22088     = build_function_type_list (V2DI_type_node, V8HI_type_node,
22089                                 NULL_TREE);
22090   tree v2di_ftype_v4si
22091     = build_function_type_list (V2DI_type_node, V4SI_type_node,
22092                                 NULL_TREE);
22093   tree v2di_ftype_pv2di
22094     = build_function_type_list (V2DI_type_node, pv2di_type_node,
22095                                 NULL_TREE);
22096   tree v16qi_ftype_v16qi_v16qi_int
22097     = build_function_type_list (V16QI_type_node, V16QI_type_node,
22098                                 V16QI_type_node, integer_type_node,
22099                                 NULL_TREE);
22100   tree v16qi_ftype_v16qi_v16qi_v16qi
22101     = build_function_type_list (V16QI_type_node, V16QI_type_node,
22102                                 V16QI_type_node, V16QI_type_node,
22103                                 NULL_TREE);
22104   tree v8hi_ftype_v8hi_v8hi_int
22105     = build_function_type_list (V8HI_type_node, V8HI_type_node,
22106                                 V8HI_type_node, integer_type_node,
22107                                 NULL_TREE);
22108   tree v4si_ftype_v4si_v4si_int
22109     = build_function_type_list (V4SI_type_node, V4SI_type_node,
22110                                 V4SI_type_node, integer_type_node,
22111                                 NULL_TREE);
22112   tree int_ftype_v2di_v2di
22113     = build_function_type_list (integer_type_node,
22114                                 V2DI_type_node, V2DI_type_node,
22115                                 NULL_TREE);
22116   tree int_ftype_v16qi_int_v16qi_int_int
22117     = build_function_type_list (integer_type_node,
22118                                 V16QI_type_node,
22119                                 integer_type_node,
22120                                 V16QI_type_node,
22121                                 integer_type_node,
22122                                 integer_type_node,
22123                                 NULL_TREE);
22124   tree v16qi_ftype_v16qi_int_v16qi_int_int
22125     = build_function_type_list (V16QI_type_node,
22126                                 V16QI_type_node,
22127                                 integer_type_node,
22128                                 V16QI_type_node,
22129                                 integer_type_node,
22130                                 integer_type_node,
22131                                 NULL_TREE);
22132   tree int_ftype_v16qi_v16qi_int
22133     = build_function_type_list (integer_type_node,
22134                                 V16QI_type_node,
22135                                 V16QI_type_node,
22136                                 integer_type_node,
22137                                 NULL_TREE);
22138
22139   /* SSE5 instructions */
22140   tree v2di_ftype_v2di_v2di_v2di
22141     = build_function_type_list (V2DI_type_node,
22142                                 V2DI_type_node,
22143                                 V2DI_type_node,
22144                                 V2DI_type_node,
22145                                 NULL_TREE);
22146
22147   tree v4si_ftype_v4si_v4si_v4si
22148     = build_function_type_list (V4SI_type_node,
22149                                 V4SI_type_node,
22150                                 V4SI_type_node,
22151                                 V4SI_type_node,
22152                                 NULL_TREE);
22153
22154   tree v4si_ftype_v4si_v4si_v2di
22155     = build_function_type_list (V4SI_type_node,
22156                                 V4SI_type_node,
22157                                 V4SI_type_node,
22158                                 V2DI_type_node,
22159                                 NULL_TREE);
22160
22161   tree v8hi_ftype_v8hi_v8hi_v8hi
22162     = build_function_type_list (V8HI_type_node,
22163                                 V8HI_type_node,
22164                                 V8HI_type_node,
22165                                 V8HI_type_node,
22166                                 NULL_TREE);
22167
22168   tree v8hi_ftype_v8hi_v8hi_v4si
22169     = build_function_type_list (V8HI_type_node,
22170                                 V8HI_type_node,
22171                                 V8HI_type_node,
22172                                 V4SI_type_node,
22173                                 NULL_TREE);
22174
22175   tree v2df_ftype_v2df_v2df_v16qi
22176     = build_function_type_list (V2DF_type_node,
22177                                 V2DF_type_node,
22178                                 V2DF_type_node,
22179                                 V16QI_type_node,
22180                                 NULL_TREE);
22181
22182   tree v4sf_ftype_v4sf_v4sf_v16qi
22183     = build_function_type_list (V4SF_type_node,
22184                                 V4SF_type_node,
22185                                 V4SF_type_node,
22186                                 V16QI_type_node,
22187                                 NULL_TREE);
22188
22189   tree v2di_ftype_v2di_si
22190     = build_function_type_list (V2DI_type_node,
22191                                 V2DI_type_node,
22192                                 integer_type_node,
22193                                 NULL_TREE);
22194
22195   tree v4si_ftype_v4si_si
22196     = build_function_type_list (V4SI_type_node,
22197                                 V4SI_type_node,
22198                                 integer_type_node,
22199                                 NULL_TREE);
22200
22201   tree v8hi_ftype_v8hi_si
22202     = build_function_type_list (V8HI_type_node,
22203                                 V8HI_type_node,
22204                                 integer_type_node,
22205                                 NULL_TREE);
22206
22207   tree v16qi_ftype_v16qi_si
22208     = build_function_type_list (V16QI_type_node,
22209                                 V16QI_type_node,
22210                                 integer_type_node,
22211                                 NULL_TREE);
22212   tree v4sf_ftype_v4hi
22213     = build_function_type_list (V4SF_type_node,
22214                                 V4HI_type_node,
22215                                 NULL_TREE);
22216
22217   tree v4hi_ftype_v4sf
22218     = build_function_type_list (V4HI_type_node,
22219                                 V4SF_type_node,
22220                                 NULL_TREE);
22221
22222   tree v2di_ftype_v2di
22223     = build_function_type_list (V2DI_type_node, V2DI_type_node, NULL_TREE);
22224
22225   tree v16qi_ftype_v8hi_v8hi
22226     = build_function_type_list (V16QI_type_node,
22227                                 V8HI_type_node, V8HI_type_node,
22228                                 NULL_TREE);
22229   tree v8hi_ftype_v4si_v4si
22230     = build_function_type_list (V8HI_type_node,
22231                                 V4SI_type_node, V4SI_type_node,
22232                                 NULL_TREE);
22233   tree v8hi_ftype_v16qi_v16qi 
22234     = build_function_type_list (V8HI_type_node,
22235                                 V16QI_type_node, V16QI_type_node,
22236                                 NULL_TREE);
22237   tree v4hi_ftype_v8qi_v8qi 
22238     = build_function_type_list (V4HI_type_node,
22239                                 V8QI_type_node, V8QI_type_node,
22240                                 NULL_TREE);
22241   tree unsigned_ftype_unsigned_uchar
22242     = build_function_type_list (unsigned_type_node,
22243                                 unsigned_type_node,
22244                                 unsigned_char_type_node,
22245                                 NULL_TREE);
22246   tree unsigned_ftype_unsigned_ushort
22247     = build_function_type_list (unsigned_type_node,
22248                                 unsigned_type_node,
22249                                 short_unsigned_type_node,
22250                                 NULL_TREE);
22251   tree unsigned_ftype_unsigned_unsigned
22252     = build_function_type_list (unsigned_type_node,
22253                                 unsigned_type_node,
22254                                 unsigned_type_node,
22255                                 NULL_TREE);
22256   tree uint64_ftype_uint64_uint64
22257     = build_function_type_list (long_long_unsigned_type_node,
22258                                 long_long_unsigned_type_node,
22259                                 long_long_unsigned_type_node,
22260                                 NULL_TREE);
22261   tree float_ftype_float
22262     = build_function_type_list (float_type_node,
22263                                 float_type_node,
22264                                 NULL_TREE);
22265
22266   /* AVX builtins  */
22267   tree V32QI_type_node = build_vector_type_for_mode (char_type_node,
22268                                                      V32QImode);
22269   tree V8SI_type_node = build_vector_type_for_mode (intSI_type_node,
22270                                                     V8SImode);
22271   tree V8SF_type_node = build_vector_type_for_mode (float_type_node,
22272                                                     V8SFmode);
22273   tree V4DI_type_node = build_vector_type_for_mode (long_long_integer_type_node,
22274                                                     V4DImode);
22275   tree V4DF_type_node = build_vector_type_for_mode (double_type_node,
22276                                                     V4DFmode);
22277   tree v8sf_ftype_v8sf
22278     = build_function_type_list (V8SF_type_node,
22279                                 V8SF_type_node,
22280                                 NULL_TREE);
22281   tree v8si_ftype_v8sf
22282     = build_function_type_list (V8SI_type_node,
22283                                 V8SF_type_node,
22284                                 NULL_TREE);
22285   tree v8sf_ftype_v8si
22286     = build_function_type_list (V8SF_type_node,
22287                                 V8SI_type_node,
22288                                 NULL_TREE);
22289   tree v4si_ftype_v4df
22290     = build_function_type_list (V4SI_type_node,
22291                                 V4DF_type_node,
22292                                 NULL_TREE);
22293   tree v4df_ftype_v4df
22294     = build_function_type_list (V4DF_type_node,
22295                                 V4DF_type_node,
22296                                 NULL_TREE);
22297   tree v4df_ftype_v4si
22298     = build_function_type_list (V4DF_type_node,
22299                                 V4SI_type_node,
22300                                 NULL_TREE);
22301   tree v4df_ftype_v4sf
22302     = build_function_type_list (V4DF_type_node,
22303                                 V4SF_type_node,
22304                                 NULL_TREE);
22305   tree v4sf_ftype_v4df
22306     = build_function_type_list (V4SF_type_node,
22307                                 V4DF_type_node,
22308                                 NULL_TREE);
22309   tree v8sf_ftype_v8sf_v8sf
22310     = build_function_type_list (V8SF_type_node,
22311                                 V8SF_type_node, V8SF_type_node,
22312                                 NULL_TREE);
22313   tree v4df_ftype_v4df_v4df
22314     = build_function_type_list (V4DF_type_node,
22315                                 V4DF_type_node, V4DF_type_node,
22316                                 NULL_TREE);
22317   tree v8sf_ftype_v8sf_int
22318     = build_function_type_list (V8SF_type_node,
22319                                 V8SF_type_node, integer_type_node,
22320                                 NULL_TREE);
22321   tree v4si_ftype_v8si_int
22322     = build_function_type_list (V4SI_type_node,
22323                                 V8SI_type_node, integer_type_node,
22324                                 NULL_TREE);
22325   tree v4df_ftype_v4df_int
22326     = build_function_type_list (V4DF_type_node,
22327                                 V4DF_type_node, integer_type_node,
22328                                 NULL_TREE);
22329   tree v4sf_ftype_v8sf_int
22330     = build_function_type_list (V4SF_type_node,
22331                                 V8SF_type_node, integer_type_node,
22332                                 NULL_TREE);
22333   tree v2df_ftype_v4df_int
22334     = build_function_type_list (V2DF_type_node,
22335                                 V4DF_type_node, integer_type_node,
22336                                 NULL_TREE);
22337   tree v8sf_ftype_v8sf_v8sf_int
22338     = build_function_type_list (V8SF_type_node,
22339                                 V8SF_type_node, V8SF_type_node,
22340                                 integer_type_node,
22341                                 NULL_TREE);
22342   tree v8sf_ftype_v8sf_v8sf_v8sf
22343     = build_function_type_list (V8SF_type_node,
22344                                 V8SF_type_node, V8SF_type_node,
22345                                 V8SF_type_node,
22346                                 NULL_TREE);
22347   tree v4df_ftype_v4df_v4df_v4df
22348     = build_function_type_list (V4DF_type_node,
22349                                 V4DF_type_node, V4DF_type_node,
22350                                 V4DF_type_node,
22351                                 NULL_TREE);
22352   tree v8si_ftype_v8si_v8si_int
22353     = build_function_type_list (V8SI_type_node,
22354                                 V8SI_type_node, V8SI_type_node,
22355                                 integer_type_node,
22356                                 NULL_TREE);
22357   tree v4df_ftype_v4df_v4df_int
22358     = build_function_type_list (V4DF_type_node,
22359                                 V4DF_type_node, V4DF_type_node,
22360                                 integer_type_node,
22361                                 NULL_TREE);
22362   tree v8sf_ftype_pcfloat
22363     = build_function_type_list (V8SF_type_node,
22364                                 pcfloat_type_node,
22365                                 NULL_TREE);
22366   tree v4df_ftype_pcdouble
22367     = build_function_type_list (V4DF_type_node,
22368                                 pcdouble_type_node,
22369                                 NULL_TREE);
22370   tree pcv4sf_type_node
22371     = build_pointer_type (build_type_variant (V4SF_type_node, 1, 0));
22372   tree pcv2df_type_node
22373     = build_pointer_type (build_type_variant (V2DF_type_node, 1, 0));
22374   tree v8sf_ftype_pcv4sf
22375     = build_function_type_list (V8SF_type_node,
22376                                 pcv4sf_type_node,
22377                                 NULL_TREE);
22378   tree v4df_ftype_pcv2df
22379     = build_function_type_list (V4DF_type_node,
22380                                 pcv2df_type_node,
22381                                 NULL_TREE);
22382   tree v32qi_ftype_pcchar
22383     = build_function_type_list (V32QI_type_node,
22384                                 pcchar_type_node,
22385                                 NULL_TREE);
22386   tree void_ftype_pchar_v32qi
22387     = build_function_type_list (void_type_node,
22388                                 pchar_type_node, V32QI_type_node,
22389                                 NULL_TREE);
22390   tree v8si_ftype_v8si_v4si_int
22391     = build_function_type_list (V8SI_type_node,
22392                                 V8SI_type_node, V4SI_type_node,
22393                                 integer_type_node,
22394                                 NULL_TREE);
22395   tree pv4di_type_node = build_pointer_type (V4DI_type_node);
22396   tree void_ftype_pv4di_v4di
22397     = build_function_type_list (void_type_node,
22398                                 pv4di_type_node, V4DI_type_node,
22399                                 NULL_TREE);
22400   tree v8sf_ftype_v8sf_v4sf_int
22401     = build_function_type_list (V8SF_type_node,
22402                                 V8SF_type_node, V4SF_type_node,
22403                                 integer_type_node,
22404                                 NULL_TREE);
22405   tree v4df_ftype_v4df_v2df_int
22406     = build_function_type_list (V4DF_type_node,
22407                                 V4DF_type_node, V2DF_type_node,
22408                                 integer_type_node,
22409                                 NULL_TREE);
22410   tree void_ftype_pfloat_v8sf
22411     = build_function_type_list (void_type_node,
22412                                 pfloat_type_node, V8SF_type_node,
22413                                 NULL_TREE);
22414   tree void_ftype_pdouble_v4df
22415     = build_function_type_list (void_type_node,
22416                                 pdouble_type_node, V4DF_type_node,
22417                                 NULL_TREE);
22418   tree pv8sf_type_node = build_pointer_type (V8SF_type_node);
22419   tree pv4sf_type_node = build_pointer_type (V4SF_type_node);
22420   tree pv4df_type_node = build_pointer_type (V4DF_type_node);
22421   tree pv2df_type_node = build_pointer_type (V2DF_type_node);
22422   tree pcv8sf_type_node
22423     = build_pointer_type (build_type_variant (V8SF_type_node, 1, 0));
22424   tree pcv4df_type_node
22425     = build_pointer_type (build_type_variant (V4DF_type_node, 1, 0));
22426   tree v8sf_ftype_pcv8sf_v8sf
22427     = build_function_type_list (V8SF_type_node,
22428                                 pcv8sf_type_node, V8SF_type_node,
22429                                 NULL_TREE);
22430   tree v4df_ftype_pcv4df_v4df
22431     = build_function_type_list (V4DF_type_node,
22432                                 pcv4df_type_node, V4DF_type_node,
22433                                 NULL_TREE);
22434   tree v4sf_ftype_pcv4sf_v4sf
22435     = build_function_type_list (V4SF_type_node,
22436                                 pcv4sf_type_node, V4SF_type_node,
22437                                 NULL_TREE);
22438   tree v2df_ftype_pcv2df_v2df
22439     = build_function_type_list (V2DF_type_node,
22440                                 pcv2df_type_node, V2DF_type_node,
22441                                 NULL_TREE);
22442   tree void_ftype_pv8sf_v8sf_v8sf
22443     = build_function_type_list (void_type_node,
22444                                 pv8sf_type_node, V8SF_type_node,
22445                                 V8SF_type_node,
22446                                 NULL_TREE);
22447   tree void_ftype_pv4df_v4df_v4df
22448     = build_function_type_list (void_type_node,
22449                                 pv4df_type_node, V4DF_type_node,
22450                                 V4DF_type_node,
22451                                 NULL_TREE);
22452   tree void_ftype_pv4sf_v4sf_v4sf
22453     = build_function_type_list (void_type_node,
22454                                 pv4sf_type_node, V4SF_type_node,
22455                                 V4SF_type_node,
22456                                 NULL_TREE);
22457   tree void_ftype_pv2df_v2df_v2df
22458     = build_function_type_list (void_type_node,
22459                                 pv2df_type_node, V2DF_type_node,
22460                                 V2DF_type_node,
22461                                 NULL_TREE);
22462   tree v4df_ftype_v2df
22463     = build_function_type_list (V4DF_type_node,
22464                                 V2DF_type_node,
22465                                 NULL_TREE);
22466   tree v8sf_ftype_v4sf
22467     = build_function_type_list (V8SF_type_node,
22468                                 V4SF_type_node,
22469                                 NULL_TREE);
22470   tree v8si_ftype_v4si
22471     = build_function_type_list (V8SI_type_node,
22472                                 V4SI_type_node,
22473                                 NULL_TREE);
22474   tree v2df_ftype_v4df
22475     = build_function_type_list (V2DF_type_node,
22476                                 V4DF_type_node,
22477                                 NULL_TREE);
22478   tree v4sf_ftype_v8sf
22479     = build_function_type_list (V4SF_type_node,
22480                                 V8SF_type_node,
22481                                 NULL_TREE);
22482   tree v4si_ftype_v8si
22483     = build_function_type_list (V4SI_type_node,
22484                                 V8SI_type_node,
22485                                 NULL_TREE);
22486   tree int_ftype_v4df
22487     = build_function_type_list (integer_type_node,
22488                                 V4DF_type_node,
22489                                 NULL_TREE);
22490   tree int_ftype_v8sf
22491     = build_function_type_list (integer_type_node,
22492                                 V8SF_type_node,
22493                                 NULL_TREE);
22494   tree int_ftype_v8sf_v8sf
22495     = build_function_type_list (integer_type_node,
22496                                 V8SF_type_node, V8SF_type_node,
22497                                 NULL_TREE);
22498   tree int_ftype_v4di_v4di
22499     = build_function_type_list (integer_type_node,
22500                                 V4DI_type_node, V4DI_type_node,
22501                                 NULL_TREE);
22502   tree int_ftype_v4df_v4df
22503     = build_function_type_list (integer_type_node,
22504                                 V4DF_type_node, V4DF_type_node,
22505                                 NULL_TREE);
22506   tree v8sf_ftype_v8sf_v8si
22507     = build_function_type_list (V8SF_type_node,
22508                                 V8SF_type_node, V8SI_type_node,
22509                                 NULL_TREE);
22510   tree v4df_ftype_v4df_v4di
22511     = build_function_type_list (V4DF_type_node,
22512                                 V4DF_type_node, V4DI_type_node,
22513                                 NULL_TREE);
22514   tree v4sf_ftype_v4sf_v4si
22515     = build_function_type_list (V4SF_type_node,
22516                                 V4SF_type_node, V4SI_type_node, NULL_TREE);
22517   tree v2df_ftype_v2df_v2di
22518     = build_function_type_list (V2DF_type_node,
22519                                 V2DF_type_node, V2DI_type_node, NULL_TREE);
22520
22521   tree ftype;
22522
22523   /* Add all special builtins with variable number of operands.  */
22524   for (i = 0, d = bdesc_special_args;
22525        i < ARRAY_SIZE (bdesc_special_args);
22526        i++, d++)
22527     {
22528       tree type;
22529
22530       if (d->name == 0)
22531         continue;
22532
22533       switch ((enum ix86_special_builtin_type) d->flag)
22534         {
22535         case VOID_FTYPE_VOID:
22536           type = void_ftype_void;
22537           break;
22538         case V32QI_FTYPE_PCCHAR:
22539           type = v32qi_ftype_pcchar;
22540           break;
22541         case V16QI_FTYPE_PCCHAR:
22542           type = v16qi_ftype_pcchar;
22543           break;
22544         case V8SF_FTYPE_PCV4SF:
22545           type = v8sf_ftype_pcv4sf;
22546           break;
22547         case V8SF_FTYPE_PCFLOAT:
22548           type = v8sf_ftype_pcfloat;
22549           break;
22550         case V4DF_FTYPE_PCV2DF:
22551           type = v4df_ftype_pcv2df;
22552           break;
22553         case V4DF_FTYPE_PCDOUBLE:
22554           type = v4df_ftype_pcdouble;
22555           break;
22556         case V4SF_FTYPE_PCFLOAT:
22557           type = v4sf_ftype_pcfloat;
22558           break;
22559         case V2DI_FTYPE_PV2DI:
22560           type = v2di_ftype_pv2di;
22561           break;
22562         case V2DF_FTYPE_PCDOUBLE:
22563           type = v2df_ftype_pcdouble;
22564           break;
22565         case V8SF_FTYPE_PCV8SF_V8SF:
22566           type = v8sf_ftype_pcv8sf_v8sf;
22567           break;
22568         case V4DF_FTYPE_PCV4DF_V4DF:
22569           type = v4df_ftype_pcv4df_v4df;
22570           break;
22571         case V4SF_FTYPE_V4SF_PCV2SF:
22572           type = v4sf_ftype_v4sf_pcv2sf;
22573           break;
22574         case V4SF_FTYPE_PCV4SF_V4SF:
22575           type = v4sf_ftype_pcv4sf_v4sf;
22576           break;
22577         case V2DF_FTYPE_V2DF_PCDOUBLE:
22578           type = v2df_ftype_v2df_pcdouble;
22579           break;
22580         case V2DF_FTYPE_PCV2DF_V2DF:
22581           type = v2df_ftype_pcv2df_v2df;
22582           break;
22583         case VOID_FTYPE_PV2SF_V4SF:
22584           type = void_ftype_pv2sf_v4sf;
22585           break;
22586         case VOID_FTYPE_PV4DI_V4DI:
22587           type = void_ftype_pv4di_v4di;
22588           break;
22589         case VOID_FTYPE_PV2DI_V2DI:
22590           type = void_ftype_pv2di_v2di;
22591           break;
22592         case VOID_FTYPE_PCHAR_V32QI:
22593           type = void_ftype_pchar_v32qi;
22594           break;
22595         case VOID_FTYPE_PCHAR_V16QI:
22596           type = void_ftype_pchar_v16qi;
22597           break;
22598         case VOID_FTYPE_PFLOAT_V8SF:
22599           type = void_ftype_pfloat_v8sf;
22600           break;
22601         case VOID_FTYPE_PFLOAT_V4SF:
22602           type = void_ftype_pfloat_v4sf;
22603           break;
22604         case VOID_FTYPE_PDOUBLE_V4DF:
22605           type = void_ftype_pdouble_v4df;
22606           break;
22607         case VOID_FTYPE_PDOUBLE_V2DF:
22608           type = void_ftype_pdouble_v2df;
22609           break;
22610         case VOID_FTYPE_PDI_DI:
22611           type = void_ftype_pdi_di;
22612           break;
22613         case VOID_FTYPE_PINT_INT:
22614           type = void_ftype_pint_int;
22615           break;
22616         case VOID_FTYPE_PV8SF_V8SF_V8SF:
22617           type = void_ftype_pv8sf_v8sf_v8sf;
22618           break;
22619         case VOID_FTYPE_PV4DF_V4DF_V4DF:
22620           type = void_ftype_pv4df_v4df_v4df;
22621           break;
22622         case VOID_FTYPE_PV4SF_V4SF_V4SF:
22623           type = void_ftype_pv4sf_v4sf_v4sf;
22624           break;
22625         case VOID_FTYPE_PV2DF_V2DF_V2DF:
22626           type = void_ftype_pv2df_v2df_v2df;
22627           break;
22628         default:
22629           gcc_unreachable ();
22630         }
22631
22632       def_builtin (d->mask, d->name, type, d->code);
22633     }
22634
22635   /* Add all builtins with variable number of operands.  */
22636   for (i = 0, d = bdesc_args;
22637        i < ARRAY_SIZE (bdesc_args);
22638        i++, d++)
22639     {
22640       tree type;
22641
22642       if (d->name == 0)
22643         continue;
22644
22645       switch ((enum ix86_builtin_type) d->flag)
22646         {
22647         case FLOAT_FTYPE_FLOAT:
22648           type = float_ftype_float;
22649           break;
22650         case INT_FTYPE_V8SF_V8SF_PTEST:
22651           type = int_ftype_v8sf_v8sf;
22652           break;
22653         case INT_FTYPE_V4DI_V4DI_PTEST:
22654           type = int_ftype_v4di_v4di;
22655           break;
22656         case INT_FTYPE_V4DF_V4DF_PTEST:
22657           type = int_ftype_v4df_v4df;
22658           break;
22659         case INT_FTYPE_V4SF_V4SF_PTEST:
22660           type = int_ftype_v4sf_v4sf;
22661           break;
22662         case INT_FTYPE_V2DI_V2DI_PTEST:
22663           type = int_ftype_v2di_v2di;
22664           break;
22665         case INT_FTYPE_V2DF_V2DF_PTEST:
22666           type = int_ftype_v2df_v2df;
22667           break;
22668         case INT64_FTYPE_V4SF:
22669           type = int64_ftype_v4sf;
22670           break;
22671         case INT64_FTYPE_V2DF:
22672           type = int64_ftype_v2df;
22673           break;
22674         case INT_FTYPE_V16QI:
22675           type = int_ftype_v16qi;
22676           break;
22677         case INT_FTYPE_V8QI:
22678           type = int_ftype_v8qi;
22679           break;
22680         case INT_FTYPE_V8SF:
22681           type = int_ftype_v8sf;
22682           break;
22683         case INT_FTYPE_V4DF:
22684           type = int_ftype_v4df;
22685           break;
22686         case INT_FTYPE_V4SF:
22687           type = int_ftype_v4sf;
22688           break;
22689         case INT_FTYPE_V2DF:
22690           type = int_ftype_v2df;
22691           break;
22692         case V16QI_FTYPE_V16QI:
22693           type = v16qi_ftype_v16qi;
22694           break;
22695         case V8SI_FTYPE_V8SF:
22696           type = v8si_ftype_v8sf;
22697           break;
22698         case V8SI_FTYPE_V4SI:
22699           type = v8si_ftype_v4si;
22700           break;
22701         case V8HI_FTYPE_V8HI:
22702           type = v8hi_ftype_v8hi;
22703           break;
22704         case V8HI_FTYPE_V16QI:
22705           type = v8hi_ftype_v16qi;
22706           break;
22707         case V8QI_FTYPE_V8QI:
22708           type = v8qi_ftype_v8qi;
22709           break;
22710         case V8SF_FTYPE_V8SF:
22711           type = v8sf_ftype_v8sf;
22712           break;
22713         case V8SF_FTYPE_V8SI:
22714           type = v8sf_ftype_v8si;
22715           break;
22716         case V8SF_FTYPE_V4SF:
22717           type = v8sf_ftype_v4sf;
22718           break;
22719         case V4SI_FTYPE_V4DF:
22720           type = v4si_ftype_v4df;
22721           break;
22722         case V4SI_FTYPE_V4SI:
22723           type = v4si_ftype_v4si;
22724           break;
22725         case V4SI_FTYPE_V16QI:
22726           type = v4si_ftype_v16qi;
22727           break;
22728         case V4SI_FTYPE_V8SI:
22729           type = v4si_ftype_v8si;
22730           break;
22731         case V4SI_FTYPE_V8HI:
22732           type = v4si_ftype_v8hi;
22733           break;
22734         case V4SI_FTYPE_V4SF:
22735           type = v4si_ftype_v4sf;
22736           break;
22737         case V4SI_FTYPE_V2DF:
22738           type = v4si_ftype_v2df;
22739           break;
22740         case V4HI_FTYPE_V4HI:
22741           type = v4hi_ftype_v4hi;
22742           break;
22743         case V4DF_FTYPE_V4DF:
22744           type = v4df_ftype_v4df;
22745           break;
22746         case V4DF_FTYPE_V4SI:
22747           type = v4df_ftype_v4si;
22748           break;
22749         case V4DF_FTYPE_V4SF:
22750           type = v4df_ftype_v4sf;
22751           break;
22752         case V4DF_FTYPE_V2DF:
22753           type = v4df_ftype_v2df;
22754           break;
22755         case V4SF_FTYPE_V4SF:
22756         case V4SF_FTYPE_V4SF_VEC_MERGE:
22757           type = v4sf_ftype_v4sf;
22758           break;
22759         case V4SF_FTYPE_V8SF:
22760           type = v4sf_ftype_v8sf;
22761           break;
22762         case V4SF_FTYPE_V4SI:
22763           type = v4sf_ftype_v4si;
22764           break;
22765         case V4SF_FTYPE_V4DF:
22766           type = v4sf_ftype_v4df;
22767           break;
22768         case V4SF_FTYPE_V2DF:
22769           type = v4sf_ftype_v2df;
22770           break;
22771         case V2DI_FTYPE_V2DI:
22772           type = v2di_ftype_v2di;
22773           break;
22774         case V2DI_FTYPE_V16QI:
22775           type = v2di_ftype_v16qi;
22776           break;
22777         case V2DI_FTYPE_V8HI:
22778           type = v2di_ftype_v8hi;
22779           break;
22780         case V2DI_FTYPE_V4SI:
22781           type = v2di_ftype_v4si;
22782           break;
22783         case V2SI_FTYPE_V2SI:
22784           type = v2si_ftype_v2si;
22785           break;
22786         case V2SI_FTYPE_V4SF:
22787           type = v2si_ftype_v4sf;
22788           break;
22789         case V2SI_FTYPE_V2DF:
22790           type = v2si_ftype_v2df;
22791           break;
22792         case V2SI_FTYPE_V2SF:
22793           type = v2si_ftype_v2sf;
22794           break;
22795         case V2DF_FTYPE_V4DF:
22796           type = v2df_ftype_v4df;
22797           break;
22798         case V2DF_FTYPE_V4SF:
22799           type = v2df_ftype_v4sf;
22800           break;
22801         case V2DF_FTYPE_V2DF:
22802         case V2DF_FTYPE_V2DF_VEC_MERGE:
22803           type = v2df_ftype_v2df;
22804           break;
22805         case V2DF_FTYPE_V2SI:
22806           type = v2df_ftype_v2si;
22807           break;
22808         case V2DF_FTYPE_V4SI:
22809           type = v2df_ftype_v4si;
22810           break;
22811         case V2SF_FTYPE_V2SF:
22812           type = v2sf_ftype_v2sf;
22813           break;
22814         case V2SF_FTYPE_V2SI:
22815           type = v2sf_ftype_v2si;
22816           break;
22817         case V16QI_FTYPE_V16QI_V16QI:
22818           type = v16qi_ftype_v16qi_v16qi;
22819           break;
22820         case V16QI_FTYPE_V8HI_V8HI:
22821           type = v16qi_ftype_v8hi_v8hi;
22822           break;
22823         case V8QI_FTYPE_V8QI_V8QI:
22824           type = v8qi_ftype_v8qi_v8qi;
22825           break;
22826         case V8QI_FTYPE_V4HI_V4HI:
22827           type = v8qi_ftype_v4hi_v4hi;
22828           break;
22829         case V8HI_FTYPE_V8HI_V8HI:
22830         case V8HI_FTYPE_V8HI_V8HI_COUNT:
22831           type = v8hi_ftype_v8hi_v8hi;
22832           break;
22833         case V8HI_FTYPE_V16QI_V16QI:
22834           type = v8hi_ftype_v16qi_v16qi;
22835           break;
22836         case V8HI_FTYPE_V4SI_V4SI:
22837           type = v8hi_ftype_v4si_v4si;
22838           break;
22839         case V8HI_FTYPE_V8HI_SI_COUNT:
22840           type = v8hi_ftype_v8hi_int;
22841           break;
22842         case V8SF_FTYPE_V8SF_V8SF:
22843           type = v8sf_ftype_v8sf_v8sf;
22844           break;
22845         case V8SF_FTYPE_V8SF_V8SI:
22846           type = v8sf_ftype_v8sf_v8si;
22847           break;
22848         case V4SI_FTYPE_V4SI_V4SI:
22849         case V4SI_FTYPE_V4SI_V4SI_COUNT:
22850           type = v4si_ftype_v4si_v4si;
22851           break;
22852         case V4SI_FTYPE_V8HI_V8HI:
22853           type = v4si_ftype_v8hi_v8hi;
22854           break;
22855         case V4SI_FTYPE_V4SF_V4SF:
22856           type = v4si_ftype_v4sf_v4sf;
22857           break;
22858         case V4SI_FTYPE_V2DF_V2DF:
22859           type = v4si_ftype_v2df_v2df;
22860           break;
22861         case V4SI_FTYPE_V4SI_SI_COUNT:
22862           type = v4si_ftype_v4si_int;
22863           break;
22864         case V4HI_FTYPE_V4HI_V4HI:
22865         case V4HI_FTYPE_V4HI_V4HI_COUNT:
22866           type = v4hi_ftype_v4hi_v4hi;
22867           break;
22868         case V4HI_FTYPE_V8QI_V8QI:
22869           type = v4hi_ftype_v8qi_v8qi;
22870           break;
22871         case V4HI_FTYPE_V2SI_V2SI:
22872           type = v4hi_ftype_v2si_v2si;
22873           break;
22874         case V4HI_FTYPE_V4HI_SI_COUNT:
22875           type = v4hi_ftype_v4hi_int;
22876           break;
22877         case V4DF_FTYPE_V4DF_V4DF:
22878           type = v4df_ftype_v4df_v4df;
22879           break;
22880         case V4DF_FTYPE_V4DF_V4DI:
22881           type = v4df_ftype_v4df_v4di;
22882           break;
22883         case V4SF_FTYPE_V4SF_V4SF:
22884         case V4SF_FTYPE_V4SF_V4SF_SWAP:
22885           type = v4sf_ftype_v4sf_v4sf;
22886           break;
22887         case V4SF_FTYPE_V4SF_V4SI:
22888           type = v4sf_ftype_v4sf_v4si;
22889           break;
22890         case V4SF_FTYPE_V4SF_V2SI:
22891           type = v4sf_ftype_v4sf_v2si;
22892           break;
22893         case V4SF_FTYPE_V4SF_V2DF:
22894           type = v4sf_ftype_v4sf_v2df;
22895           break;
22896         case V4SF_FTYPE_V4SF_DI:
22897           type = v4sf_ftype_v4sf_int64;
22898           break;
22899         case V4SF_FTYPE_V4SF_SI:
22900           type = v4sf_ftype_v4sf_int;
22901           break;
22902         case V2DI_FTYPE_V2DI_V2DI:
22903         case V2DI_FTYPE_V2DI_V2DI_COUNT:
22904           type = v2di_ftype_v2di_v2di;
22905           break;
22906         case V2DI_FTYPE_V16QI_V16QI:
22907           type = v2di_ftype_v16qi_v16qi;
22908           break;
22909         case V2DI_FTYPE_V4SI_V4SI:
22910           type = v2di_ftype_v4si_v4si;
22911           break;
22912         case V2DI_FTYPE_V2DI_V16QI:
22913           type = v2di_ftype_v2di_v16qi;
22914           break;
22915         case V2DI_FTYPE_V2DF_V2DF:
22916           type = v2di_ftype_v2df_v2df;
22917           break;
22918         case V2DI_FTYPE_V2DI_SI_COUNT:
22919           type = v2di_ftype_v2di_int;
22920           break;
22921         case V2SI_FTYPE_V2SI_V2SI:
22922         case V2SI_FTYPE_V2SI_V2SI_COUNT:
22923           type = v2si_ftype_v2si_v2si;
22924           break;
22925         case V2SI_FTYPE_V4HI_V4HI:
22926           type = v2si_ftype_v4hi_v4hi;
22927           break;
22928         case V2SI_FTYPE_V2SF_V2SF:
22929           type = v2si_ftype_v2sf_v2sf;
22930           break;
22931         case V2SI_FTYPE_V2SI_SI_COUNT:
22932           type = v2si_ftype_v2si_int;
22933           break;
22934         case V2DF_FTYPE_V2DF_V2DF:
22935         case V2DF_FTYPE_V2DF_V2DF_SWAP:
22936           type = v2df_ftype_v2df_v2df;
22937           break;
22938         case V2DF_FTYPE_V2DF_V4SF:
22939           type = v2df_ftype_v2df_v4sf;
22940           break;
22941         case V2DF_FTYPE_V2DF_V2DI:
22942           type = v2df_ftype_v2df_v2di;
22943           break;
22944         case V2DF_FTYPE_V2DF_DI:
22945           type = v2df_ftype_v2df_int64;
22946           break;
22947         case V2DF_FTYPE_V2DF_SI:
22948           type = v2df_ftype_v2df_int;
22949           break;
22950         case V2SF_FTYPE_V2SF_V2SF:
22951           type = v2sf_ftype_v2sf_v2sf;
22952           break;
22953         case V1DI_FTYPE_V1DI_V1DI:
22954         case V1DI_FTYPE_V1DI_V1DI_COUNT:
22955           type = v1di_ftype_v1di_v1di;
22956           break;
22957         case V1DI_FTYPE_V8QI_V8QI:
22958           type = v1di_ftype_v8qi_v8qi;
22959           break;
22960         case V1DI_FTYPE_V2SI_V2SI:
22961           type = v1di_ftype_v2si_v2si;
22962           break;
22963         case V1DI_FTYPE_V1DI_SI_COUNT:
22964           type = v1di_ftype_v1di_int;
22965           break;
22966         case UINT64_FTYPE_UINT64_UINT64:
22967           type = uint64_ftype_uint64_uint64;
22968           break;
22969         case UINT_FTYPE_UINT_UINT:
22970           type = unsigned_ftype_unsigned_unsigned;
22971           break;
22972         case UINT_FTYPE_UINT_USHORT:
22973           type = unsigned_ftype_unsigned_ushort;
22974           break;
22975         case UINT_FTYPE_UINT_UCHAR:
22976           type = unsigned_ftype_unsigned_uchar;
22977           break;
22978         case V8HI_FTYPE_V8HI_INT:
22979           type = v8hi_ftype_v8hi_int;
22980           break;
22981         case V8SF_FTYPE_V8SF_INT:
22982           type = v8sf_ftype_v8sf_int;
22983           break;
22984         case V4SI_FTYPE_V4SI_INT:
22985           type = v4si_ftype_v4si_int;
22986           break;
22987         case V4SI_FTYPE_V8SI_INT:
22988           type = v4si_ftype_v8si_int;
22989           break;
22990         case V4HI_FTYPE_V4HI_INT:
22991           type = v4hi_ftype_v4hi_int;
22992           break;
22993         case V4DF_FTYPE_V4DF_INT:
22994           type = v4df_ftype_v4df_int;
22995           break;
22996         case V4SF_FTYPE_V4SF_INT:
22997           type = v4sf_ftype_v4sf_int;
22998           break;
22999         case V4SF_FTYPE_V8SF_INT:
23000           type = v4sf_ftype_v8sf_int;
23001           break;
23002         case V2DI_FTYPE_V2DI_INT:
23003         case V2DI2TI_FTYPE_V2DI_INT:
23004           type = v2di_ftype_v2di_int;
23005           break;
23006         case V2DF_FTYPE_V2DF_INT:
23007           type = v2df_ftype_v2df_int;
23008           break;
23009         case V2DF_FTYPE_V4DF_INT:
23010           type = v2df_ftype_v4df_int;
23011           break;
23012         case V16QI_FTYPE_V16QI_V16QI_V16QI:
23013           type = v16qi_ftype_v16qi_v16qi_v16qi;
23014           break;
23015         case V8SF_FTYPE_V8SF_V8SF_V8SF:
23016           type = v8sf_ftype_v8sf_v8sf_v8sf;
23017           break;
23018         case V4DF_FTYPE_V4DF_V4DF_V4DF:
23019           type = v4df_ftype_v4df_v4df_v4df;
23020           break;
23021         case V4SF_FTYPE_V4SF_V4SF_V4SF:
23022           type = v4sf_ftype_v4sf_v4sf_v4sf;
23023           break;
23024         case V2DF_FTYPE_V2DF_V2DF_V2DF:
23025           type = v2df_ftype_v2df_v2df_v2df;
23026           break;
23027         case V16QI_FTYPE_V16QI_V16QI_INT:
23028           type = v16qi_ftype_v16qi_v16qi_int;
23029           break;
23030         case V8SI_FTYPE_V8SI_V8SI_INT:
23031           type = v8si_ftype_v8si_v8si_int;
23032           break;
23033         case V8SI_FTYPE_V8SI_V4SI_INT:
23034           type = v8si_ftype_v8si_v4si_int;
23035           break;
23036         case V8HI_FTYPE_V8HI_V8HI_INT:
23037           type = v8hi_ftype_v8hi_v8hi_int;
23038           break;
23039         case V8SF_FTYPE_V8SF_V8SF_INT:
23040           type = v8sf_ftype_v8sf_v8sf_int;
23041           break;
23042         case V8SF_FTYPE_V8SF_V4SF_INT:
23043           type = v8sf_ftype_v8sf_v4sf_int;
23044           break;
23045         case V4SI_FTYPE_V4SI_V4SI_INT:
23046           type = v4si_ftype_v4si_v4si_int;
23047           break;
23048         case V4DF_FTYPE_V4DF_V4DF_INT:
23049           type = v4df_ftype_v4df_v4df_int;
23050           break;
23051         case V4DF_FTYPE_V4DF_V2DF_INT:
23052           type = v4df_ftype_v4df_v2df_int;
23053           break;
23054         case V4SF_FTYPE_V4SF_V4SF_INT:
23055           type = v4sf_ftype_v4sf_v4sf_int;
23056           break;
23057         case V2DI_FTYPE_V2DI_V2DI_INT:
23058         case V2DI2TI_FTYPE_V2DI_V2DI_INT:
23059           type = v2di_ftype_v2di_v2di_int;
23060           break;
23061         case V2DF_FTYPE_V2DF_V2DF_INT:
23062           type = v2df_ftype_v2df_v2df_int;
23063           break;
23064         case V2DI_FTYPE_V2DI_UINT_UINT:
23065           type = v2di_ftype_v2di_unsigned_unsigned;
23066           break;
23067         case V2DI_FTYPE_V2DI_V2DI_UINT_UINT:
23068           type = v2di_ftype_v2di_v2di_unsigned_unsigned;
23069           break;
23070         case V1DI2DI_FTYPE_V1DI_V1DI_INT:
23071           type = v1di_ftype_v1di_v1di_int;
23072           break;
23073         default:
23074           gcc_unreachable ();
23075         }
23076
23077       def_builtin_const (d->mask, d->name, type, d->code);
23078     }
23079
23080   /* pcmpestr[im] insns.  */
23081   for (i = 0, d = bdesc_pcmpestr;
23082        i < ARRAY_SIZE (bdesc_pcmpestr);
23083        i++, d++)
23084     {
23085       if (d->code == IX86_BUILTIN_PCMPESTRM128)
23086         ftype = v16qi_ftype_v16qi_int_v16qi_int_int;
23087       else
23088         ftype = int_ftype_v16qi_int_v16qi_int_int;
23089       def_builtin_const (d->mask, d->name, ftype, d->code);
23090     }
23091
23092   /* pcmpistr[im] insns.  */
23093   for (i = 0, d = bdesc_pcmpistr;
23094        i < ARRAY_SIZE (bdesc_pcmpistr);
23095        i++, d++)
23096     {
23097       if (d->code == IX86_BUILTIN_PCMPISTRM128)
23098         ftype = v16qi_ftype_v16qi_v16qi_int;
23099       else
23100         ftype = int_ftype_v16qi_v16qi_int;
23101       def_builtin_const (d->mask, d->name, ftype, d->code);
23102     }
23103
23104   /* comi/ucomi insns.  */
23105   for (i = 0, d = bdesc_comi; i < ARRAY_SIZE (bdesc_comi); i++, d++)
23106     if (d->mask == OPTION_MASK_ISA_SSE2)
23107       def_builtin_const (d->mask, d->name, int_ftype_v2df_v2df, d->code);
23108     else
23109       def_builtin_const (d->mask, d->name, int_ftype_v4sf_v4sf, d->code);
23110
23111   /* SSE */
23112   def_builtin (OPTION_MASK_ISA_SSE, "__builtin_ia32_ldmxcsr", void_ftype_unsigned, IX86_BUILTIN_LDMXCSR);
23113   def_builtin (OPTION_MASK_ISA_SSE, "__builtin_ia32_stmxcsr", unsigned_ftype_void, IX86_BUILTIN_STMXCSR);
23114
23115   /* SSE or 3DNow!A */
23116   def_builtin (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, "__builtin_ia32_maskmovq", void_ftype_v8qi_v8qi_pchar, IX86_BUILTIN_MASKMOVQ);
23117
23118   /* SSE2 */
23119   def_builtin (OPTION_MASK_ISA_SSE2, "__builtin_ia32_maskmovdqu", void_ftype_v16qi_v16qi_pchar, IX86_BUILTIN_MASKMOVDQU);
23120
23121   def_builtin (OPTION_MASK_ISA_SSE2, "__builtin_ia32_clflush", void_ftype_pcvoid, IX86_BUILTIN_CLFLUSH);
23122   x86_mfence = def_builtin (OPTION_MASK_ISA_SSE2, "__builtin_ia32_mfence", void_ftype_void, IX86_BUILTIN_MFENCE);
23123
23124   /* SSE3.  */
23125   def_builtin (OPTION_MASK_ISA_SSE3, "__builtin_ia32_monitor", void_ftype_pcvoid_unsigned_unsigned, IX86_BUILTIN_MONITOR);
23126   def_builtin (OPTION_MASK_ISA_SSE3, "__builtin_ia32_mwait", void_ftype_unsigned_unsigned, IX86_BUILTIN_MWAIT);
23127
23128   /* AES */
23129   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesenc128", v2di_ftype_v2di_v2di, IX86_BUILTIN_AESENC128);
23130   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesenclast128", v2di_ftype_v2di_v2di, IX86_BUILTIN_AESENCLAST128);
23131   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesdec128", v2di_ftype_v2di_v2di, IX86_BUILTIN_AESDEC128);
23132   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesdeclast128", v2di_ftype_v2di_v2di, IX86_BUILTIN_AESDECLAST128);
23133   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aesimc128", v2di_ftype_v2di, IX86_BUILTIN_AESIMC128);
23134   def_builtin_const (OPTION_MASK_ISA_AES, "__builtin_ia32_aeskeygenassist128", v2di_ftype_v2di_int, IX86_BUILTIN_AESKEYGENASSIST128);
23135
23136   /* PCLMUL */
23137   def_builtin_const (OPTION_MASK_ISA_PCLMUL, "__builtin_ia32_pclmulqdq128", v2di_ftype_v2di_v2di_int, IX86_BUILTIN_PCLMULQDQ128);
23138
23139   /* AVX */
23140   def_builtin (OPTION_MASK_ISA_AVX, "__builtin_ia32_vzeroupper", void_ftype_void,
23141                TARGET_64BIT ? IX86_BUILTIN_VZEROUPPER_REX64 : IX86_BUILTIN_VZEROUPPER);
23142
23143   /* Access to the vec_init patterns.  */
23144   ftype = build_function_type_list (V2SI_type_node, integer_type_node,
23145                                     integer_type_node, NULL_TREE);
23146   def_builtin_const (OPTION_MASK_ISA_MMX, "__builtin_ia32_vec_init_v2si", ftype, IX86_BUILTIN_VEC_INIT_V2SI);
23147
23148   ftype = build_function_type_list (V4HI_type_node, short_integer_type_node,
23149                                     short_integer_type_node,
23150                                     short_integer_type_node,
23151                                     short_integer_type_node, NULL_TREE);
23152   def_builtin_const (OPTION_MASK_ISA_MMX, "__builtin_ia32_vec_init_v4hi", ftype, IX86_BUILTIN_VEC_INIT_V4HI);
23153
23154   ftype = build_function_type_list (V8QI_type_node, char_type_node,
23155                                     char_type_node, char_type_node,
23156                                     char_type_node, char_type_node,
23157                                     char_type_node, char_type_node,
23158                                     char_type_node, NULL_TREE);
23159   def_builtin_const (OPTION_MASK_ISA_MMX, "__builtin_ia32_vec_init_v8qi", ftype, IX86_BUILTIN_VEC_INIT_V8QI);
23160
23161   /* Access to the vec_extract patterns.  */
23162   ftype = build_function_type_list (double_type_node, V2DF_type_node,
23163                                     integer_type_node, NULL_TREE);
23164   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v2df", ftype, IX86_BUILTIN_VEC_EXT_V2DF);
23165
23166   ftype = build_function_type_list (long_long_integer_type_node,
23167                                     V2DI_type_node, integer_type_node,
23168                                     NULL_TREE);
23169   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v2di", ftype, IX86_BUILTIN_VEC_EXT_V2DI);
23170
23171   ftype = build_function_type_list (float_type_node, V4SF_type_node,
23172                                     integer_type_node, NULL_TREE);
23173   def_builtin_const (OPTION_MASK_ISA_SSE, "__builtin_ia32_vec_ext_v4sf", ftype, IX86_BUILTIN_VEC_EXT_V4SF);
23174
23175   ftype = build_function_type_list (intSI_type_node, V4SI_type_node,
23176                                     integer_type_node, NULL_TREE);
23177   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v4si", ftype, IX86_BUILTIN_VEC_EXT_V4SI);
23178
23179   ftype = build_function_type_list (intHI_type_node, V8HI_type_node,
23180                                     integer_type_node, NULL_TREE);
23181   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v8hi", ftype, IX86_BUILTIN_VEC_EXT_V8HI);
23182
23183   ftype = build_function_type_list (intHI_type_node, V4HI_type_node,
23184                                     integer_type_node, NULL_TREE);
23185   def_builtin_const (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, "__builtin_ia32_vec_ext_v4hi", ftype, IX86_BUILTIN_VEC_EXT_V4HI);
23186
23187   ftype = build_function_type_list (intSI_type_node, V2SI_type_node,
23188                                     integer_type_node, NULL_TREE);
23189   def_builtin_const (OPTION_MASK_ISA_MMX, "__builtin_ia32_vec_ext_v2si", ftype, IX86_BUILTIN_VEC_EXT_V2SI);
23190
23191   ftype = build_function_type_list (intQI_type_node, V16QI_type_node,
23192                                     integer_type_node, NULL_TREE);
23193   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_ext_v16qi", ftype, IX86_BUILTIN_VEC_EXT_V16QI);
23194
23195   /* Access to the vec_set patterns.  */
23196   ftype = build_function_type_list (V2DI_type_node, V2DI_type_node,
23197                                     intDI_type_node,
23198                                     integer_type_node, NULL_TREE);
23199   def_builtin_const (OPTION_MASK_ISA_SSE4_1 | OPTION_MASK_ISA_64BIT, "__builtin_ia32_vec_set_v2di", ftype, IX86_BUILTIN_VEC_SET_V2DI);
23200
23201   ftype = build_function_type_list (V4SF_type_node, V4SF_type_node,
23202                                     float_type_node,
23203                                     integer_type_node, NULL_TREE);
23204   def_builtin_const (OPTION_MASK_ISA_SSE4_1, "__builtin_ia32_vec_set_v4sf", ftype, IX86_BUILTIN_VEC_SET_V4SF);
23205
23206   ftype = build_function_type_list (V4SI_type_node, V4SI_type_node,
23207                                     intSI_type_node,
23208                                     integer_type_node, NULL_TREE);
23209   def_builtin_const (OPTION_MASK_ISA_SSE4_1, "__builtin_ia32_vec_set_v4si", ftype, IX86_BUILTIN_VEC_SET_V4SI);
23210
23211   ftype = build_function_type_list (V8HI_type_node, V8HI_type_node,
23212                                     intHI_type_node,
23213                                     integer_type_node, NULL_TREE);
23214   def_builtin_const (OPTION_MASK_ISA_SSE2, "__builtin_ia32_vec_set_v8hi", ftype, IX86_BUILTIN_VEC_SET_V8HI);
23215
23216   ftype = build_function_type_list (V4HI_type_node, V4HI_type_node,
23217                                     intHI_type_node,
23218                                     integer_type_node, NULL_TREE);
23219   def_builtin_const (OPTION_MASK_ISA_SSE | OPTION_MASK_ISA_3DNOW_A, "__builtin_ia32_vec_set_v4hi", ftype, IX86_BUILTIN_VEC_SET_V4HI);
23220
23221   ftype = build_function_type_list (V16QI_type_node, V16QI_type_node,
23222                                     intQI_type_node,
23223                                     integer_type_node, NULL_TREE);
23224   def_builtin_const (OPTION_MASK_ISA_SSE4_1, "__builtin_ia32_vec_set_v16qi", ftype, IX86_BUILTIN_VEC_SET_V16QI);
23225
23226   /* Add SSE5 multi-arg argument instructions */
23227   for (i = 0, d = bdesc_multi_arg; i < ARRAY_SIZE (bdesc_multi_arg); i++, d++)
23228     {
23229       tree mtype = NULL_TREE;
23230
23231       if (d->name == 0)
23232         continue;
23233
23234       switch ((enum multi_arg_type)d->flag)
23235         {
23236         case MULTI_ARG_3_SF:     mtype = v4sf_ftype_v4sf_v4sf_v4sf;     break;
23237         case MULTI_ARG_3_DF:     mtype = v2df_ftype_v2df_v2df_v2df;     break;
23238         case MULTI_ARG_3_DI:     mtype = v2di_ftype_v2di_v2di_v2di;     break;
23239         case MULTI_ARG_3_SI:     mtype = v4si_ftype_v4si_v4si_v4si;     break;
23240         case MULTI_ARG_3_SI_DI:  mtype = v4si_ftype_v4si_v4si_v2di;     break;
23241         case MULTI_ARG_3_HI:     mtype = v8hi_ftype_v8hi_v8hi_v8hi;     break;
23242         case MULTI_ARG_3_HI_SI:  mtype = v8hi_ftype_v8hi_v8hi_v4si;     break;
23243         case MULTI_ARG_3_QI:     mtype = v16qi_ftype_v16qi_v16qi_v16qi; break;
23244         case MULTI_ARG_3_PERMPS: mtype = v4sf_ftype_v4sf_v4sf_v16qi;    break;
23245         case MULTI_ARG_3_PERMPD: mtype = v2df_ftype_v2df_v2df_v16qi;    break;
23246         case MULTI_ARG_2_SF:     mtype = v4sf_ftype_v4sf_v4sf;          break;
23247         case MULTI_ARG_2_DF:     mtype = v2df_ftype_v2df_v2df;          break;
23248         case MULTI_ARG_2_DI:     mtype = v2di_ftype_v2di_v2di;          break;
23249         case MULTI_ARG_2_SI:     mtype = v4si_ftype_v4si_v4si;          break;
23250         case MULTI_ARG_2_HI:     mtype = v8hi_ftype_v8hi_v8hi;          break;
23251         case MULTI_ARG_2_QI:     mtype = v16qi_ftype_v16qi_v16qi;       break;
23252         case MULTI_ARG_2_DI_IMM: mtype = v2di_ftype_v2di_si;            break;
23253         case MULTI_ARG_2_SI_IMM: mtype = v4si_ftype_v4si_si;            break;
23254         case MULTI_ARG_2_HI_IMM: mtype = v8hi_ftype_v8hi_si;            break;
23255         case MULTI_ARG_2_QI_IMM: mtype = v16qi_ftype_v16qi_si;          break;
23256         case MULTI_ARG_2_SF_CMP: mtype = v4sf_ftype_v4sf_v4sf;          break;
23257         case MULTI_ARG_2_DF_CMP: mtype = v2df_ftype_v2df_v2df;          break;
23258         case MULTI_ARG_2_DI_CMP: mtype = v2di_ftype_v2di_v2di;          break;
23259         case MULTI_ARG_2_SI_CMP: mtype = v4si_ftype_v4si_v4si;          break;
23260         case MULTI_ARG_2_HI_CMP: mtype = v8hi_ftype_v8hi_v8hi;          break;
23261         case MULTI_ARG_2_QI_CMP: mtype = v16qi_ftype_v16qi_v16qi;       break;
23262         case MULTI_ARG_2_SF_TF:  mtype = v4sf_ftype_v4sf_v4sf;          break;
23263         case MULTI_ARG_2_DF_TF:  mtype = v2df_ftype_v2df_v2df;          break;
23264         case MULTI_ARG_2_DI_TF:  mtype = v2di_ftype_v2di_v2di;          break;
23265         case MULTI_ARG_2_SI_TF:  mtype = v4si_ftype_v4si_v4si;          break;
23266         case MULTI_ARG_2_HI_TF:  mtype = v8hi_ftype_v8hi_v8hi;          break;
23267         case MULTI_ARG_2_QI_TF:  mtype = v16qi_ftype_v16qi_v16qi;       break;
23268         case MULTI_ARG_1_SF:     mtype = v4sf_ftype_v4sf;               break;
23269         case MULTI_ARG_1_DF:     mtype = v2df_ftype_v2df;               break;
23270         case MULTI_ARG_1_DI:     mtype = v2di_ftype_v2di;               break;
23271         case MULTI_ARG_1_SI:     mtype = v4si_ftype_v4si;               break;
23272         case MULTI_ARG_1_HI:     mtype = v8hi_ftype_v8hi;               break;
23273         case MULTI_ARG_1_QI:     mtype = v16qi_ftype_v16qi;             break;
23274         case MULTI_ARG_1_SI_DI:  mtype = v2di_ftype_v4si;               break;
23275         case MULTI_ARG_1_HI_DI:  mtype = v2di_ftype_v8hi;               break;
23276         case MULTI_ARG_1_HI_SI:  mtype = v4si_ftype_v8hi;               break;
23277         case MULTI_ARG_1_QI_DI:  mtype = v2di_ftype_v16qi;              break;
23278         case MULTI_ARG_1_QI_SI:  mtype = v4si_ftype_v16qi;              break;
23279         case MULTI_ARG_1_QI_HI:  mtype = v8hi_ftype_v16qi;              break;
23280         case MULTI_ARG_1_PH2PS:  mtype = v4sf_ftype_v4hi;               break;
23281         case MULTI_ARG_1_PS2PH:  mtype = v4hi_ftype_v4sf;               break;
23282         case MULTI_ARG_UNKNOWN:
23283         default:
23284           gcc_unreachable ();
23285         }
23286
23287       if (mtype)
23288         def_builtin_const (d->mask, d->name, mtype, d->code);
23289     }
23290 }
23291
23292 /* Internal method for ix86_init_builtins.  */
23293
23294 static void
23295 ix86_init_builtins_va_builtins_abi (void)
23296 {
23297   tree ms_va_ref, sysv_va_ref;
23298   tree fnvoid_va_end_ms, fnvoid_va_end_sysv;
23299   tree fnvoid_va_start_ms, fnvoid_va_start_sysv;
23300   tree fnvoid_va_copy_ms, fnvoid_va_copy_sysv;
23301   tree fnattr_ms = NULL_TREE, fnattr_sysv = NULL_TREE;
23302
23303   if (!TARGET_64BIT)
23304     return;
23305   fnattr_ms = build_tree_list (get_identifier ("ms_abi"), NULL_TREE);
23306   fnattr_sysv = build_tree_list (get_identifier ("sysv_abi"), NULL_TREE);
23307   ms_va_ref = build_reference_type (ms_va_list_type_node);
23308   sysv_va_ref =
23309     build_pointer_type (TREE_TYPE (sysv_va_list_type_node));
23310
23311   fnvoid_va_end_ms =
23312     build_function_type_list (void_type_node, ms_va_ref, NULL_TREE);
23313   fnvoid_va_start_ms =
23314     build_varargs_function_type_list (void_type_node, ms_va_ref, NULL_TREE);
23315   fnvoid_va_end_sysv =
23316     build_function_type_list (void_type_node, sysv_va_ref, NULL_TREE);
23317   fnvoid_va_start_sysv =
23318     build_varargs_function_type_list (void_type_node, sysv_va_ref,
23319                                        NULL_TREE);
23320   fnvoid_va_copy_ms =
23321     build_function_type_list (void_type_node, ms_va_ref, ms_va_list_type_node,
23322                               NULL_TREE);
23323   fnvoid_va_copy_sysv =
23324     build_function_type_list (void_type_node, sysv_va_ref,
23325                               sysv_va_ref, NULL_TREE);
23326
23327   add_builtin_function ("__builtin_ms_va_start", fnvoid_va_start_ms,
23328                         BUILT_IN_VA_START, BUILT_IN_NORMAL, NULL, fnattr_ms);
23329   add_builtin_function ("__builtin_ms_va_end", fnvoid_va_end_ms,
23330                         BUILT_IN_VA_END, BUILT_IN_NORMAL, NULL, fnattr_ms);
23331   add_builtin_function ("__builtin_ms_va_copy", fnvoid_va_copy_ms,
23332                         BUILT_IN_VA_COPY, BUILT_IN_NORMAL, NULL, fnattr_ms);
23333   add_builtin_function ("__builtin_sysv_va_start", fnvoid_va_start_sysv,
23334                         BUILT_IN_VA_START, BUILT_IN_NORMAL, NULL, fnattr_sysv);
23335   add_builtin_function ("__builtin_sysv_va_end", fnvoid_va_end_sysv,
23336                         BUILT_IN_VA_END, BUILT_IN_NORMAL, NULL, fnattr_sysv);
23337   add_builtin_function ("__builtin_sysv_va_copy", fnvoid_va_copy_sysv,
23338                         BUILT_IN_VA_COPY, BUILT_IN_NORMAL, NULL, fnattr_sysv);
23339 }
23340
23341 static void
23342 ix86_init_builtins (void)
23343 {
23344   tree float128_type_node = make_node (REAL_TYPE);
23345   tree ftype, decl;
23346
23347   /* The __float80 type.  */
23348   if (TYPE_MODE (long_double_type_node) == XFmode)
23349     (*lang_hooks.types.register_builtin_type) (long_double_type_node,
23350                                                "__float80");
23351   else
23352     {
23353       /* The __float80 type.  */
23354       tree float80_type_node = make_node (REAL_TYPE);
23355
23356       TYPE_PRECISION (float80_type_node) = 80;
23357       layout_type (float80_type_node);
23358       (*lang_hooks.types.register_builtin_type) (float80_type_node,
23359                                                  "__float80");
23360     }
23361
23362   /* The __float128 type.  */
23363   TYPE_PRECISION (float128_type_node) = 128;
23364   layout_type (float128_type_node);
23365   (*lang_hooks.types.register_builtin_type) (float128_type_node,
23366                                              "__float128");
23367
23368   /* TFmode support builtins.  */
23369   ftype = build_function_type (float128_type_node, void_list_node);
23370   decl = add_builtin_function ("__builtin_infq", ftype,
23371                                IX86_BUILTIN_INFQ, BUILT_IN_MD,
23372                                NULL, NULL_TREE);
23373   ix86_builtins[(int) IX86_BUILTIN_INFQ] = decl;
23374
23375   /* We will expand them to normal call if SSE2 isn't available since
23376      they are used by libgcc. */
23377   ftype = build_function_type_list (float128_type_node,
23378                                     float128_type_node,
23379                                     NULL_TREE);
23380   decl = add_builtin_function ("__builtin_fabsq", ftype,
23381                                IX86_BUILTIN_FABSQ, BUILT_IN_MD,
23382                                "__fabstf2", NULL_TREE);
23383   ix86_builtins[(int) IX86_BUILTIN_FABSQ] = decl;
23384   TREE_READONLY (decl) = 1;
23385
23386   ftype = build_function_type_list (float128_type_node,
23387                                     float128_type_node,
23388                                     float128_type_node,
23389                                     NULL_TREE);
23390   decl = add_builtin_function ("__builtin_copysignq", ftype,
23391                                IX86_BUILTIN_COPYSIGNQ, BUILT_IN_MD,
23392                                "__copysigntf3", NULL_TREE);
23393   ix86_builtins[(int) IX86_BUILTIN_COPYSIGNQ] = decl;
23394   TREE_READONLY (decl) = 1;
23395
23396   ix86_init_mmx_sse_builtins ();
23397   if (TARGET_64BIT)
23398     ix86_init_builtins_va_builtins_abi ();
23399 }
23400
23401 /* Errors in the source file can cause expand_expr to return const0_rtx
23402    where we expect a vector.  To avoid crashing, use one of the vector
23403    clear instructions.  */
23404 static rtx
23405 safe_vector_operand (rtx x, enum machine_mode mode)
23406 {
23407   if (x == const0_rtx)
23408     x = CONST0_RTX (mode);
23409   return x;
23410 }
23411
23412 /* Subroutine of ix86_expand_builtin to take care of binop insns.  */
23413
23414 static rtx
23415 ix86_expand_binop_builtin (enum insn_code icode, tree exp, rtx target)
23416 {
23417   rtx pat;
23418   tree arg0 = CALL_EXPR_ARG (exp, 0);
23419   tree arg1 = CALL_EXPR_ARG (exp, 1);
23420   rtx op0 = expand_normal (arg0);
23421   rtx op1 = expand_normal (arg1);
23422   enum machine_mode tmode = insn_data[icode].operand[0].mode;
23423   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
23424   enum machine_mode mode1 = insn_data[icode].operand[2].mode;
23425
23426   if (VECTOR_MODE_P (mode0))
23427     op0 = safe_vector_operand (op0, mode0);
23428   if (VECTOR_MODE_P (mode1))
23429     op1 = safe_vector_operand (op1, mode1);
23430
23431   if (optimize || !target
23432       || GET_MODE (target) != tmode
23433       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
23434     target = gen_reg_rtx (tmode);
23435
23436   if (GET_MODE (op1) == SImode && mode1 == TImode)
23437     {
23438       rtx x = gen_reg_rtx (V4SImode);
23439       emit_insn (gen_sse2_loadd (x, op1));
23440       op1 = gen_lowpart (TImode, x);
23441     }
23442
23443   if (!(*insn_data[icode].operand[1].predicate) (op0, mode0))
23444     op0 = copy_to_mode_reg (mode0, op0);
23445   if (!(*insn_data[icode].operand[2].predicate) (op1, mode1))
23446     op1 = copy_to_mode_reg (mode1, op1);
23447
23448   pat = GEN_FCN (icode) (target, op0, op1);
23449   if (! pat)
23450     return 0;
23451
23452   emit_insn (pat);
23453
23454   return target;
23455 }
23456
23457 /* Subroutine of ix86_expand_builtin to take care of 2-4 argument insns.  */
23458
23459 static rtx
23460 ix86_expand_multi_arg_builtin (enum insn_code icode, tree exp, rtx target,
23461                                enum multi_arg_type m_type,
23462                                enum insn_code sub_code)
23463 {
23464   rtx pat;
23465   int i;
23466   int nargs;
23467   bool comparison_p = false;
23468   bool tf_p = false;
23469   bool last_arg_constant = false;
23470   int num_memory = 0;
23471   struct {
23472     rtx op;
23473     enum machine_mode mode;
23474   } args[4];
23475
23476   enum machine_mode tmode = insn_data[icode].operand[0].mode;
23477
23478   switch (m_type)
23479     {
23480     case MULTI_ARG_3_SF:
23481     case MULTI_ARG_3_DF:
23482     case MULTI_ARG_3_DI:
23483     case MULTI_ARG_3_SI:
23484     case MULTI_ARG_3_SI_DI:
23485     case MULTI_ARG_3_HI:
23486     case MULTI_ARG_3_HI_SI:
23487     case MULTI_ARG_3_QI:
23488     case MULTI_ARG_3_PERMPS:
23489     case MULTI_ARG_3_PERMPD:
23490       nargs = 3;
23491       break;
23492
23493     case MULTI_ARG_2_SF:
23494     case MULTI_ARG_2_DF:
23495     case MULTI_ARG_2_DI:
23496     case MULTI_ARG_2_SI:
23497     case MULTI_ARG_2_HI:
23498     case MULTI_ARG_2_QI:
23499       nargs = 2;
23500       break;
23501
23502     case MULTI_ARG_2_DI_IMM:
23503     case MULTI_ARG_2_SI_IMM:
23504     case MULTI_ARG_2_HI_IMM:
23505     case MULTI_ARG_2_QI_IMM:
23506       nargs = 2;
23507       last_arg_constant = true;
23508       break;
23509
23510     case MULTI_ARG_1_SF:
23511     case MULTI_ARG_1_DF:
23512     case MULTI_ARG_1_DI:
23513     case MULTI_ARG_1_SI:
23514     case MULTI_ARG_1_HI:
23515     case MULTI_ARG_1_QI:
23516     case MULTI_ARG_1_SI_DI:
23517     case MULTI_ARG_1_HI_DI:
23518     case MULTI_ARG_1_HI_SI:
23519     case MULTI_ARG_1_QI_DI:
23520     case MULTI_ARG_1_QI_SI:
23521     case MULTI_ARG_1_QI_HI:
23522     case MULTI_ARG_1_PH2PS:
23523     case MULTI_ARG_1_PS2PH:
23524       nargs = 1;
23525       break;
23526
23527     case MULTI_ARG_2_SF_CMP:
23528     case MULTI_ARG_2_DF_CMP:
23529     case MULTI_ARG_2_DI_CMP:
23530     case MULTI_ARG_2_SI_CMP:
23531     case MULTI_ARG_2_HI_CMP:
23532     case MULTI_ARG_2_QI_CMP:
23533       nargs = 2;
23534       comparison_p = true;
23535       break;
23536
23537     case MULTI_ARG_2_SF_TF:
23538     case MULTI_ARG_2_DF_TF:
23539     case MULTI_ARG_2_DI_TF:
23540     case MULTI_ARG_2_SI_TF:
23541     case MULTI_ARG_2_HI_TF:
23542     case MULTI_ARG_2_QI_TF:
23543       nargs = 2;
23544       tf_p = true;
23545       break;
23546
23547     case MULTI_ARG_UNKNOWN:
23548     default:
23549       gcc_unreachable ();
23550     }
23551
23552   if (optimize || !target
23553       || GET_MODE (target) != tmode
23554       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
23555     target = gen_reg_rtx (tmode);
23556
23557   gcc_assert (nargs <= 4);
23558
23559   for (i = 0; i < nargs; i++)
23560     {
23561       tree arg = CALL_EXPR_ARG (exp, i);
23562       rtx op = expand_normal (arg);
23563       int adjust = (comparison_p) ? 1 : 0;
23564       enum machine_mode mode = insn_data[icode].operand[i+adjust+1].mode;
23565
23566       if (last_arg_constant && i == nargs-1)
23567         {
23568           if (GET_CODE (op) != CONST_INT)
23569             {
23570               error ("last argument must be an immediate");
23571               return gen_reg_rtx (tmode);
23572             }
23573         }
23574       else
23575         {
23576           if (VECTOR_MODE_P (mode))
23577             op = safe_vector_operand (op, mode);
23578
23579           /* If we aren't optimizing, only allow one memory operand to be
23580              generated.  */
23581           if (memory_operand (op, mode))
23582             num_memory++;
23583
23584           gcc_assert (GET_MODE (op) == mode || GET_MODE (op) == VOIDmode);
23585
23586           if (optimize
23587               || ! (*insn_data[icode].operand[i+adjust+1].predicate) (op, mode)
23588               || num_memory > 1)
23589             op = force_reg (mode, op);
23590         }
23591
23592       args[i].op = op;
23593       args[i].mode = mode;
23594     }
23595
23596   switch (nargs)
23597     {
23598     case 1:
23599       pat = GEN_FCN (icode) (target, args[0].op);
23600       break;
23601
23602     case 2:
23603       if (tf_p)
23604         pat = GEN_FCN (icode) (target, args[0].op, args[1].op,
23605                                GEN_INT ((int)sub_code));
23606       else if (! comparison_p)
23607         pat = GEN_FCN (icode) (target, args[0].op, args[1].op);
23608       else
23609         {
23610           rtx cmp_op = gen_rtx_fmt_ee (sub_code, GET_MODE (target),
23611                                        args[0].op,
23612                                        args[1].op);
23613
23614           pat = GEN_FCN (icode) (target, cmp_op, args[0].op, args[1].op);
23615         }
23616       break;
23617
23618     case 3:
23619       pat = GEN_FCN (icode) (target, args[0].op, args[1].op, args[2].op);
23620       break;
23621
23622     default:
23623       gcc_unreachable ();
23624     }
23625
23626   if (! pat)
23627     return 0;
23628
23629   emit_insn (pat);
23630   return target;
23631 }
23632
23633 /* Subroutine of ix86_expand_args_builtin to take care of scalar unop
23634    insns with vec_merge.  */
23635
23636 static rtx
23637 ix86_expand_unop_vec_merge_builtin (enum insn_code icode, tree exp,
23638                                     rtx target)
23639 {
23640   rtx pat;
23641   tree arg0 = CALL_EXPR_ARG (exp, 0);
23642   rtx op1, op0 = expand_normal (arg0);
23643   enum machine_mode tmode = insn_data[icode].operand[0].mode;
23644   enum machine_mode mode0 = insn_data[icode].operand[1].mode;
23645
23646   if (optimize || !target
23647       || GET_MODE (target) != tmode
23648       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
23649     target = gen_reg_rtx (tmode);
23650
23651   if (VECTOR_MODE_P (mode0))
23652     op0 = safe_vector_operand (op0, mode0);
23653
23654   if ((optimize && !register_operand (op0, mode0))
23655       || ! (*insn_data[icode].operand[1].predicate) (op0, mode0))
23656     op0 = copy_to_mode_reg (mode0, op0);
23657
23658   op1 = op0;
23659   if (! (*insn_data[icode].operand[2].predicate) (op1, mode0))
23660     op1 = copy_to_mode_reg (mode0, op1);
23661
23662   pat = GEN_FCN (icode) (target, op0, op1);
23663   if (! pat)
23664     return 0;
23665   emit_insn (pat);
23666   return target;
23667 }
23668
23669 /* Subroutine of ix86_expand_builtin to take care of comparison insns.  */
23670
23671 static rtx
23672 ix86_expand_sse_compare (const struct builtin_description *d,
23673                          tree exp, rtx target, bool swap)
23674 {
23675   rtx pat;
23676   tree arg0 = CALL_EXPR_ARG (exp, 0);
23677   tree arg1 = CALL_EXPR_ARG (exp, 1);
23678   rtx op0 = expand_normal (arg0);
23679   rtx op1 = expand_normal (arg1);
23680   rtx op2;
23681   enum machine_mode tmode = insn_data[d->icode].operand[0].mode;
23682   enum machine_mode mode0 = insn_data[d->icode].operand[1].mode;
23683   enum machine_mode mode1 = insn_data[d->icode].operand[2].mode;
23684   enum rtx_code comparison = d->comparison;
23685
23686   if (VECTOR_MODE_P (mode0))
23687     op0 = safe_vector_operand (op0, mode0);
23688   if (VECTOR_MODE_P (mode1))
23689     op1 = safe_vector_operand (op1, mode1);
23690
23691   /* Swap operands if we have a comparison that isn't available in
23692      hardware.  */
23693   if (swap)
23694     {
23695       rtx tmp = gen_reg_rtx (mode1);
23696       emit_move_insn (tmp, op1);
23697       op1 = op0;
23698       op0 = tmp;
23699     }
23700
23701   if (optimize || !target
23702       || GET_MODE (target) != tmode
23703       || ! (*insn_data[d->icode].operand[0].predicate) (target, tmode))
23704     target = gen_reg_rtx (tmode);
23705
23706   if ((optimize && !register_operand (op0, mode0))
23707       || ! (*insn_data[d->icode].operand[1].predicate) (op0, mode0))
23708     op0 = copy_to_mode_reg (mode0, op0);
23709   if ((optimize && !register_operand (op1, mode1))
23710       || ! (*insn_data[d->icode].operand[2].predicate) (op1, mode1))
23711     op1 = copy_to_mode_reg (mode1, op1);
23712
23713   op2 = gen_rtx_fmt_ee (comparison, mode0, op0, op1);
23714   pat = GEN_FCN (d->icode) (target, op0, op1, op2);
23715   if (! pat)
23716     return 0;
23717   emit_insn (pat);
23718   return target;
23719 }
23720
23721 /* Subroutine of ix86_expand_builtin to take care of comi insns.  */
23722
23723 static rtx
23724 ix86_expand_sse_comi (const struct builtin_description *d, tree exp,
23725                       rtx target)
23726 {
23727   rtx pat;
23728   tree arg0 = CALL_EXPR_ARG (exp, 0);
23729   tree arg1 = CALL_EXPR_ARG (exp, 1);
23730   rtx op0 = expand_normal (arg0);
23731   rtx op1 = expand_normal (arg1);
23732   enum machine_mode mode0 = insn_data[d->icode].operand[0].mode;
23733   enum machine_mode mode1 = insn_data[d->icode].operand[1].mode;
23734   enum rtx_code comparison = d->comparison;
23735
23736   if (VECTOR_MODE_P (mode0))
23737     op0 = safe_vector_operand (op0, mode0);
23738   if (VECTOR_MODE_P (mode1))
23739     op1 = safe_vector_operand (op1, mode1);
23740
23741   /* Swap operands if we have a comparison that isn't available in
23742      hardware.  */
23743   if (d->flag & BUILTIN_DESC_SWAP_OPERANDS)
23744     {
23745       rtx tmp = op1;
23746       op1 = op0;
23747       op0 = tmp;
23748     }
23749
23750   target = gen_reg_rtx (SImode);
23751   emit_move_insn (target, const0_rtx);
23752   target = gen_rtx_SUBREG (QImode, target, 0);
23753
23754   if ((optimize && !register_operand (op0, mode0))
23755       || !(*insn_data[d->icode].operand[0].predicate) (op0, mode0))
23756     op0 = copy_to_mode_reg (mode0, op0);
23757   if ((optimize && !register_operand (op1, mode1))
23758       || !(*insn_data[d->icode].operand[1].predicate) (op1, mode1))
23759     op1 = copy_to_mode_reg (mode1, op1);
23760
23761   pat = GEN_FCN (d->icode) (op0, op1);
23762   if (! pat)
23763     return 0;
23764   emit_insn (pat);
23765   emit_insn (gen_rtx_SET (VOIDmode,
23766                           gen_rtx_STRICT_LOW_PART (VOIDmode, target),
23767                           gen_rtx_fmt_ee (comparison, QImode,
23768                                           SET_DEST (pat),
23769                                           const0_rtx)));
23770
23771   return SUBREG_REG (target);
23772 }
23773
23774 /* Subroutine of ix86_expand_builtin to take care of ptest insns.  */
23775
23776 static rtx
23777 ix86_expand_sse_ptest (const struct builtin_description *d, tree exp,
23778                        rtx target)
23779 {
23780   rtx pat;
23781   tree arg0 = CALL_EXPR_ARG (exp, 0);
23782   tree arg1 = CALL_EXPR_ARG (exp, 1);
23783   rtx op0 = expand_normal (arg0);
23784   rtx op1 = expand_normal (arg1);
23785   enum machine_mode mode0 = insn_data[d->icode].operand[0].mode;
23786   enum machine_mode mode1 = insn_data[d->icode].operand[1].mode;
23787   enum rtx_code comparison = d->comparison;
23788
23789   if (VECTOR_MODE_P (mode0))
23790     op0 = safe_vector_operand (op0, mode0);
23791   if (VECTOR_MODE_P (mode1))
23792     op1 = safe_vector_operand (op1, mode1);
23793
23794   target = gen_reg_rtx (SImode);
23795   emit_move_insn (target, const0_rtx);
23796   target = gen_rtx_SUBREG (QImode, target, 0);
23797
23798   if ((optimize && !register_operand (op0, mode0))
23799       || !(*insn_data[d->icode].operand[0].predicate) (op0, mode0))
23800     op0 = copy_to_mode_reg (mode0, op0);
23801   if ((optimize && !register_operand (op1, mode1))
23802       || !(*insn_data[d->icode].operand[1].predicate) (op1, mode1))
23803     op1 = copy_to_mode_reg (mode1, op1);
23804
23805   pat = GEN_FCN (d->icode) (op0, op1);
23806   if (! pat)
23807     return 0;
23808   emit_insn (pat);
23809   emit_insn (gen_rtx_SET (VOIDmode,
23810                           gen_rtx_STRICT_LOW_PART (VOIDmode, target),
23811                           gen_rtx_fmt_ee (comparison, QImode,
23812                                           SET_DEST (pat),
23813                                           const0_rtx)));
23814
23815   return SUBREG_REG (target);
23816 }
23817
23818 /* Subroutine of ix86_expand_builtin to take care of pcmpestr[im] insns.  */
23819
23820 static rtx
23821 ix86_expand_sse_pcmpestr (const struct builtin_description *d,
23822                           tree exp, rtx target)
23823 {
23824   rtx pat;
23825   tree arg0 = CALL_EXPR_ARG (exp, 0);
23826   tree arg1 = CALL_EXPR_ARG (exp, 1);
23827   tree arg2 = CALL_EXPR_ARG (exp, 2);
23828   tree arg3 = CALL_EXPR_ARG (exp, 3);
23829   tree arg4 = CALL_EXPR_ARG (exp, 4);
23830   rtx scratch0, scratch1;
23831   rtx op0 = expand_normal (arg0);
23832   rtx op1 = expand_normal (arg1);
23833   rtx op2 = expand_normal (arg2);
23834   rtx op3 = expand_normal (arg3);
23835   rtx op4 = expand_normal (arg4);
23836   enum machine_mode tmode0, tmode1, modev2, modei3, modev4, modei5, modeimm;
23837
23838   tmode0 = insn_data[d->icode].operand[0].mode;
23839   tmode1 = insn_data[d->icode].operand[1].mode;
23840   modev2 = insn_data[d->icode].operand[2].mode;
23841   modei3 = insn_data[d->icode].operand[3].mode;
23842   modev4 = insn_data[d->icode].operand[4].mode;
23843   modei5 = insn_data[d->icode].operand[5].mode;
23844   modeimm = insn_data[d->icode].operand[6].mode;
23845
23846   if (VECTOR_MODE_P (modev2))
23847     op0 = safe_vector_operand (op0, modev2);
23848   if (VECTOR_MODE_P (modev4))
23849     op2 = safe_vector_operand (op2, modev4);
23850
23851   if (! (*insn_data[d->icode].operand[2].predicate) (op0, modev2))
23852     op0 = copy_to_mode_reg (modev2, op0);
23853   if (! (*insn_data[d->icode].operand[3].predicate) (op1, modei3))
23854     op1 = copy_to_mode_reg (modei3, op1);
23855   if ((optimize && !register_operand (op2, modev4))
23856       || !(*insn_data[d->icode].operand[4].predicate) (op2, modev4))
23857     op2 = copy_to_mode_reg (modev4, op2);
23858   if (! (*insn_data[d->icode].operand[5].predicate) (op3, modei5))
23859     op3 = copy_to_mode_reg (modei5, op3);
23860
23861   if (! (*insn_data[d->icode].operand[6].predicate) (op4, modeimm))
23862     {
23863       error ("the fifth argument must be a 8-bit immediate");
23864       return const0_rtx;
23865     }
23866
23867   if (d->code == IX86_BUILTIN_PCMPESTRI128)
23868     {
23869       if (optimize || !target
23870           || GET_MODE (target) != tmode0
23871           || ! (*insn_data[d->icode].operand[0].predicate) (target, tmode0))
23872         target = gen_reg_rtx (tmode0);
23873
23874       scratch1 = gen_reg_rtx (tmode1);
23875
23876       pat = GEN_FCN (d->icode) (target, scratch1, op0, op1, op2, op3, op4);
23877     }
23878   else if (d->code == IX86_BUILTIN_PCMPESTRM128)
23879     {
23880       if (optimize || !target
23881           || GET_MODE (target) != tmode1
23882           || ! (*insn_data[d->icode].operand[1].predicate) (target, tmode1))
23883         target = gen_reg_rtx (tmode1);
23884
23885       scratch0 = gen_reg_rtx (tmode0);
23886
23887       pat = GEN_FCN (d->icode) (scratch0, target, op0, op1, op2, op3, op4);
23888     }
23889   else
23890     {
23891       gcc_assert (d->flag);
23892
23893       scratch0 = gen_reg_rtx (tmode0);
23894       scratch1 = gen_reg_rtx (tmode1);
23895
23896       pat = GEN_FCN (d->icode) (scratch0, scratch1, op0, op1, op2, op3, op4);
23897     }
23898
23899   if (! pat)
23900     return 0;
23901
23902   emit_insn (pat);
23903
23904   if (d->flag)
23905     {
23906       target = gen_reg_rtx (SImode);
23907       emit_move_insn (target, const0_rtx);
23908       target = gen_rtx_SUBREG (QImode, target, 0);
23909
23910       emit_insn
23911         (gen_rtx_SET (VOIDmode, gen_rtx_STRICT_LOW_PART (VOIDmode, target),
23912                       gen_rtx_fmt_ee (EQ, QImode,
23913                                       gen_rtx_REG ((enum machine_mode) d->flag,
23914                                                    FLAGS_REG),
23915                                       const0_rtx)));
23916       return SUBREG_REG (target);
23917     }
23918   else
23919     return target;
23920 }
23921
23922
23923 /* Subroutine of ix86_expand_builtin to take care of pcmpistr[im] insns.  */
23924
23925 static rtx
23926 ix86_expand_sse_pcmpistr (const struct builtin_description *d,
23927                           tree exp, rtx target)
23928 {
23929   rtx pat;
23930   tree arg0 = CALL_EXPR_ARG (exp, 0);
23931   tree arg1 = CALL_EXPR_ARG (exp, 1);
23932   tree arg2 = CALL_EXPR_ARG (exp, 2);
23933   rtx scratch0, scratch1;
23934   rtx op0 = expand_normal (arg0);
23935   rtx op1 = expand_normal (arg1);
23936   rtx op2 = expand_normal (arg2);
23937   enum machine_mode tmode0, tmode1, modev2, modev3, modeimm;
23938
23939   tmode0 = insn_data[d->icode].operand[0].mode;
23940   tmode1 = insn_data[d->icode].operand[1].mode;
23941   modev2 = insn_data[d->icode].operand[2].mode;
23942   modev3 = insn_data[d->icode].operand[3].mode;
23943   modeimm = insn_data[d->icode].operand[4].mode;
23944
23945   if (VECTOR_MODE_P (modev2))
23946     op0 = safe_vector_operand (op0, modev2);
23947   if (VECTOR_MODE_P (modev3))
23948     op1 = safe_vector_operand (op1, modev3);
23949
23950   if (! (*insn_data[d->icode].operand[2].predicate) (op0, modev2))
23951     op0 = copy_to_mode_reg (modev2, op0);
23952   if ((optimize && !register_operand (op1, modev3))
23953       || !(*insn_data[d->icode].operand[3].predicate) (op1, modev3))
23954     op1 = copy_to_mode_reg (modev3, op1);
23955
23956   if (! (*insn_data[d->icode].operand[4].predicate) (op2, modeimm))
23957     {
23958       error ("the third argument must be a 8-bit immediate");
23959       return const0_rtx;
23960     }
23961
23962   if (d->code == IX86_BUILTIN_PCMPISTRI128)
23963     {
23964       if (optimize || !target
23965           || GET_MODE (target) != tmode0
23966           || ! (*insn_data[d->icode].operand[0].predicate) (target, tmode0))
23967         target = gen_reg_rtx (tmode0);
23968
23969       scratch1 = gen_reg_rtx (tmode1);
23970
23971       pat = GEN_FCN (d->icode) (target, scratch1, op0, op1, op2);
23972     }
23973   else if (d->code == IX86_BUILTIN_PCMPISTRM128)
23974     {
23975       if (optimize || !target
23976           || GET_MODE (target) != tmode1
23977           || ! (*insn_data[d->icode].operand[1].predicate) (target, tmode1))
23978         target = gen_reg_rtx (tmode1);
23979
23980       scratch0 = gen_reg_rtx (tmode0);
23981
23982       pat = GEN_FCN (d->icode) (scratch0, target, op0, op1, op2);
23983     }
23984   else
23985     {
23986       gcc_assert (d->flag);
23987
23988       scratch0 = gen_reg_rtx (tmode0);
23989       scratch1 = gen_reg_rtx (tmode1);
23990
23991       pat = GEN_FCN (d->icode) (scratch0, scratch1, op0, op1, op2);
23992     }
23993
23994   if (! pat)
23995     return 0;
23996
23997   emit_insn (pat);
23998
23999   if (d->flag)
24000     {
24001       target = gen_reg_rtx (SImode);
24002       emit_move_insn (target, const0_rtx);
24003       target = gen_rtx_SUBREG (QImode, target, 0);
24004
24005       emit_insn
24006         (gen_rtx_SET (VOIDmode, gen_rtx_STRICT_LOW_PART (VOIDmode, target),
24007                       gen_rtx_fmt_ee (EQ, QImode,
24008                                       gen_rtx_REG ((enum machine_mode) d->flag,
24009                                                    FLAGS_REG),
24010                                       const0_rtx)));
24011       return SUBREG_REG (target);
24012     }
24013   else
24014     return target;
24015 }
24016
24017 /* Subroutine of ix86_expand_builtin to take care of insns with
24018    variable number of operands.  */
24019
24020 static rtx
24021 ix86_expand_args_builtin (const struct builtin_description *d,
24022                           tree exp, rtx target)
24023 {
24024   rtx pat, real_target;
24025   unsigned int i, nargs;
24026   unsigned int nargs_constant = 0;
24027   int num_memory = 0;
24028   struct
24029     {
24030       rtx op;
24031       enum machine_mode mode;
24032     } args[4];
24033   bool last_arg_count = false;
24034   enum insn_code icode = d->icode;
24035   const struct insn_data *insn_p = &insn_data[icode];
24036   enum machine_mode tmode = insn_p->operand[0].mode;
24037   enum machine_mode rmode = VOIDmode;
24038   bool swap = false;
24039   enum rtx_code comparison = d->comparison;
24040
24041   switch ((enum ix86_builtin_type) d->flag)
24042     {
24043     case INT_FTYPE_V8SF_V8SF_PTEST:
24044     case INT_FTYPE_V4DI_V4DI_PTEST:
24045     case INT_FTYPE_V4DF_V4DF_PTEST:
24046     case INT_FTYPE_V4SF_V4SF_PTEST:
24047     case INT_FTYPE_V2DI_V2DI_PTEST:
24048     case INT_FTYPE_V2DF_V2DF_PTEST:
24049       return ix86_expand_sse_ptest (d, exp, target);
24050     case FLOAT128_FTYPE_FLOAT128:
24051     case FLOAT_FTYPE_FLOAT:
24052     case INT64_FTYPE_V4SF:
24053     case INT64_FTYPE_V2DF:
24054     case INT_FTYPE_V16QI:
24055     case INT_FTYPE_V8QI:
24056     case INT_FTYPE_V8SF:
24057     case INT_FTYPE_V4DF:
24058     case INT_FTYPE_V4SF:
24059     case INT_FTYPE_V2DF:
24060     case V16QI_FTYPE_V16QI:
24061     case V8SI_FTYPE_V8SF:
24062     case V8SI_FTYPE_V4SI:
24063     case V8HI_FTYPE_V8HI:
24064     case V8HI_FTYPE_V16QI:
24065     case V8QI_FTYPE_V8QI:
24066     case V8SF_FTYPE_V8SF:
24067     case V8SF_FTYPE_V8SI:
24068     case V8SF_FTYPE_V4SF:
24069     case V4SI_FTYPE_V4SI:
24070     case V4SI_FTYPE_V16QI:
24071     case V4SI_FTYPE_V4SF:
24072     case V4SI_FTYPE_V8SI:
24073     case V4SI_FTYPE_V8HI:
24074     case V4SI_FTYPE_V4DF:
24075     case V4SI_FTYPE_V2DF:
24076     case V4HI_FTYPE_V4HI:
24077     case V4DF_FTYPE_V4DF:
24078     case V4DF_FTYPE_V4SI:
24079     case V4DF_FTYPE_V4SF:
24080     case V4DF_FTYPE_V2DF:
24081     case V4SF_FTYPE_V4SF:
24082     case V4SF_FTYPE_V4SI:
24083     case V4SF_FTYPE_V8SF:
24084     case V4SF_FTYPE_V4DF:
24085     case V4SF_FTYPE_V2DF:
24086     case V2DI_FTYPE_V2DI:
24087     case V2DI_FTYPE_V16QI:
24088     case V2DI_FTYPE_V8HI:
24089     case V2DI_FTYPE_V4SI:
24090     case V2DF_FTYPE_V2DF:
24091     case V2DF_FTYPE_V4SI:
24092     case V2DF_FTYPE_V4DF:
24093     case V2DF_FTYPE_V4SF:
24094     case V2DF_FTYPE_V2SI:
24095     case V2SI_FTYPE_V2SI:
24096     case V2SI_FTYPE_V4SF:
24097     case V2SI_FTYPE_V2SF:
24098     case V2SI_FTYPE_V2DF:
24099     case V2SF_FTYPE_V2SF:
24100     case V2SF_FTYPE_V2SI:
24101       nargs = 1;
24102       break;
24103     case V4SF_FTYPE_V4SF_VEC_MERGE:
24104     case V2DF_FTYPE_V2DF_VEC_MERGE:
24105       return ix86_expand_unop_vec_merge_builtin (icode, exp, target);
24106     case FLOAT128_FTYPE_FLOAT128_FLOAT128:
24107     case V16QI_FTYPE_V16QI_V16QI:
24108     case V16QI_FTYPE_V8HI_V8HI:
24109     case V8QI_FTYPE_V8QI_V8QI:
24110     case V8QI_FTYPE_V4HI_V4HI:
24111     case V8HI_FTYPE_V8HI_V8HI:
24112     case V8HI_FTYPE_V16QI_V16QI:
24113     case V8HI_FTYPE_V4SI_V4SI:
24114     case V8SF_FTYPE_V8SF_V8SF:
24115     case V8SF_FTYPE_V8SF_V8SI:
24116     case V4SI_FTYPE_V4SI_V4SI:
24117     case V4SI_FTYPE_V8HI_V8HI:
24118     case V4SI_FTYPE_V4SF_V4SF:
24119     case V4SI_FTYPE_V2DF_V2DF:
24120     case V4HI_FTYPE_V4HI_V4HI:
24121     case V4HI_FTYPE_V8QI_V8QI:
24122     case V4HI_FTYPE_V2SI_V2SI:
24123     case V4DF_FTYPE_V4DF_V4DF:
24124     case V4DF_FTYPE_V4DF_V4DI:
24125     case V4SF_FTYPE_V4SF_V4SF:
24126     case V4SF_FTYPE_V4SF_V4SI:
24127     case V4SF_FTYPE_V4SF_V2SI:
24128     case V4SF_FTYPE_V4SF_V2DF:
24129     case V4SF_FTYPE_V4SF_DI:
24130     case V4SF_FTYPE_V4SF_SI:
24131     case V2DI_FTYPE_V2DI_V2DI:
24132     case V2DI_FTYPE_V16QI_V16QI:
24133     case V2DI_FTYPE_V4SI_V4SI:
24134     case V2DI_FTYPE_V2DI_V16QI:
24135     case V2DI_FTYPE_V2DF_V2DF:
24136     case V2SI_FTYPE_V2SI_V2SI:
24137     case V2SI_FTYPE_V4HI_V4HI:
24138     case V2SI_FTYPE_V2SF_V2SF:
24139     case V2DF_FTYPE_V2DF_V2DF:
24140     case V2DF_FTYPE_V2DF_V4SF:
24141     case V2DF_FTYPE_V2DF_V2DI:
24142     case V2DF_FTYPE_V2DF_DI:
24143     case V2DF_FTYPE_V2DF_SI:
24144     case V2SF_FTYPE_V2SF_V2SF:
24145     case V1DI_FTYPE_V1DI_V1DI:
24146     case V1DI_FTYPE_V8QI_V8QI:
24147     case V1DI_FTYPE_V2SI_V2SI:
24148       if (comparison == UNKNOWN)
24149         return ix86_expand_binop_builtin (icode, exp, target);
24150       nargs = 2;
24151       break;
24152     case V4SF_FTYPE_V4SF_V4SF_SWAP:
24153     case V2DF_FTYPE_V2DF_V2DF_SWAP:
24154       gcc_assert (comparison != UNKNOWN);
24155       nargs = 2;
24156       swap = true;
24157       break;
24158     case V8HI_FTYPE_V8HI_V8HI_COUNT:
24159     case V8HI_FTYPE_V8HI_SI_COUNT:
24160     case V4SI_FTYPE_V4SI_V4SI_COUNT:
24161     case V4SI_FTYPE_V4SI_SI_COUNT:
24162     case V4HI_FTYPE_V4HI_V4HI_COUNT:
24163     case V4HI_FTYPE_V4HI_SI_COUNT:
24164     case V2DI_FTYPE_V2DI_V2DI_COUNT:
24165     case V2DI_FTYPE_V2DI_SI_COUNT:
24166     case V2SI_FTYPE_V2SI_V2SI_COUNT:
24167     case V2SI_FTYPE_V2SI_SI_COUNT:
24168     case V1DI_FTYPE_V1DI_V1DI_COUNT:
24169     case V1DI_FTYPE_V1DI_SI_COUNT:
24170       nargs = 2;
24171       last_arg_count = true;
24172       break;
24173     case UINT64_FTYPE_UINT64_UINT64:
24174     case UINT_FTYPE_UINT_UINT:
24175     case UINT_FTYPE_UINT_USHORT:
24176     case UINT_FTYPE_UINT_UCHAR:
24177       nargs = 2;
24178       break;
24179     case V2DI2TI_FTYPE_V2DI_INT:
24180       nargs = 2;
24181       rmode = V2DImode;
24182       nargs_constant = 1;
24183       break;
24184     case V8HI_FTYPE_V8HI_INT:
24185     case V8SF_FTYPE_V8SF_INT:
24186     case V4SI_FTYPE_V4SI_INT:
24187     case V4SI_FTYPE_V8SI_INT:
24188     case V4HI_FTYPE_V4HI_INT:
24189     case V4DF_FTYPE_V4DF_INT:
24190     case V4SF_FTYPE_V4SF_INT:
24191     case V4SF_FTYPE_V8SF_INT:
24192     case V2DI_FTYPE_V2DI_INT:
24193     case V2DF_FTYPE_V2DF_INT:
24194     case V2DF_FTYPE_V4DF_INT:
24195       nargs = 2;
24196       nargs_constant = 1;
24197       break;
24198     case V16QI_FTYPE_V16QI_V16QI_V16QI:
24199     case V8SF_FTYPE_V8SF_V8SF_V8SF:
24200     case V4DF_FTYPE_V4DF_V4DF_V4DF:
24201     case V4SF_FTYPE_V4SF_V4SF_V4SF:
24202     case V2DF_FTYPE_V2DF_V2DF_V2DF:
24203       nargs = 3;
24204       break;
24205     case V16QI_FTYPE_V16QI_V16QI_INT:
24206     case V8HI_FTYPE_V8HI_V8HI_INT:
24207     case V8SI_FTYPE_V8SI_V8SI_INT:
24208     case V8SI_FTYPE_V8SI_V4SI_INT:
24209     case V8SF_FTYPE_V8SF_V8SF_INT: 
24210     case V8SF_FTYPE_V8SF_V4SF_INT: 
24211     case V4SI_FTYPE_V4SI_V4SI_INT:
24212     case V4DF_FTYPE_V4DF_V4DF_INT:
24213     case V4DF_FTYPE_V4DF_V2DF_INT:
24214     case V4SF_FTYPE_V4SF_V4SF_INT:
24215     case V2DI_FTYPE_V2DI_V2DI_INT:
24216     case V2DF_FTYPE_V2DF_V2DF_INT:
24217       nargs = 3;
24218       nargs_constant = 1;
24219       break;
24220     case V2DI2TI_FTYPE_V2DI_V2DI_INT:
24221       nargs = 3;
24222       rmode = V2DImode;
24223       nargs_constant = 1;
24224       break;
24225     case V1DI2DI_FTYPE_V1DI_V1DI_INT:
24226       nargs = 3;
24227       rmode = DImode;
24228       nargs_constant = 1;
24229       break;
24230     case V2DI_FTYPE_V2DI_UINT_UINT:
24231       nargs = 3;
24232       nargs_constant = 2;
24233       break;
24234     case V2DI_FTYPE_V2DI_V2DI_UINT_UINT:
24235       nargs = 4;
24236       nargs_constant = 2;
24237       break;
24238     default:
24239       gcc_unreachable ();
24240     }
24241
24242   gcc_assert (nargs <= ARRAY_SIZE (args));
24243
24244   if (comparison != UNKNOWN)
24245     {
24246       gcc_assert (nargs == 2);
24247       return ix86_expand_sse_compare (d, exp, target, swap);
24248     }
24249
24250   if (rmode == VOIDmode || rmode == tmode)
24251     {
24252       if (optimize
24253           || target == 0
24254           || GET_MODE (target) != tmode
24255           || ! (*insn_p->operand[0].predicate) (target, tmode))
24256         target = gen_reg_rtx (tmode);
24257       real_target = target;
24258     }
24259   else
24260     {
24261       target = gen_reg_rtx (rmode);
24262       real_target = simplify_gen_subreg (tmode, target, rmode, 0);
24263     }
24264
24265   for (i = 0; i < nargs; i++)
24266     {
24267       tree arg = CALL_EXPR_ARG (exp, i);
24268       rtx op = expand_normal (arg);
24269       enum machine_mode mode = insn_p->operand[i + 1].mode;
24270       bool match = (*insn_p->operand[i + 1].predicate) (op, mode);
24271
24272       if (last_arg_count && (i + 1) == nargs)
24273         {
24274           /* SIMD shift insns take either an 8-bit immediate or
24275              register as count.  But builtin functions take int as
24276              count.  If count doesn't match, we put it in register.  */
24277           if (!match)
24278             {
24279               op = simplify_gen_subreg (SImode, op, GET_MODE (op), 0);
24280               if (!(*insn_p->operand[i + 1].predicate) (op, mode))
24281                 op = copy_to_reg (op);
24282             }
24283         }
24284       else if ((nargs - i) <= nargs_constant)
24285         {
24286           if (!match)
24287             switch (icode)
24288               {
24289               case CODE_FOR_sse4_1_roundpd:
24290               case CODE_FOR_sse4_1_roundps:
24291               case CODE_FOR_sse4_1_roundsd:
24292               case CODE_FOR_sse4_1_roundss:
24293               case CODE_FOR_sse4_1_blendps:
24294               case CODE_FOR_avx_blendpd256:
24295               case CODE_FOR_avx_vpermilv4df:
24296               case CODE_FOR_avx_roundpd256:
24297               case CODE_FOR_avx_roundps256:
24298                 error ("the last argument must be a 4-bit immediate");
24299                 return const0_rtx;
24300
24301               case CODE_FOR_sse4_1_blendpd:
24302               case CODE_FOR_avx_vpermilv2df:
24303                 error ("the last argument must be a 2-bit immediate");
24304                 return const0_rtx;
24305
24306               case CODE_FOR_avx_vextractf128v4df:
24307               case CODE_FOR_avx_vextractf128v8sf:
24308               case CODE_FOR_avx_vextractf128v8si:
24309               case CODE_FOR_avx_vinsertf128v4df:
24310               case CODE_FOR_avx_vinsertf128v8sf:
24311               case CODE_FOR_avx_vinsertf128v8si:
24312                 error ("the last argument must be a 1-bit immediate");
24313                 return const0_rtx;
24314
24315               case CODE_FOR_avx_cmpsdv2df3:
24316               case CODE_FOR_avx_cmpssv4sf3:
24317               case CODE_FOR_avx_cmppdv2df3:
24318               case CODE_FOR_avx_cmppsv4sf3:
24319               case CODE_FOR_avx_cmppdv4df3:
24320               case CODE_FOR_avx_cmppsv8sf3:
24321                 error ("the last argument must be a 5-bit immediate");
24322                 return const0_rtx;
24323
24324              default:
24325                 switch (nargs_constant)
24326                   {
24327                   case 2:
24328                     if ((nargs - i) == nargs_constant)
24329                       {
24330                         error ("the next to last argument must be an 8-bit immediate");
24331                         break;
24332                       }
24333                   case 1:
24334                     error ("the last argument must be an 8-bit immediate");
24335                     break;
24336                   default:
24337                     gcc_unreachable ();
24338                   }
24339                 return const0_rtx;
24340               }
24341         }
24342       else
24343         {
24344           if (VECTOR_MODE_P (mode))
24345             op = safe_vector_operand (op, mode);
24346
24347           /* If we aren't optimizing, only allow one memory operand to
24348              be generated.  */
24349           if (memory_operand (op, mode))
24350             num_memory++;
24351
24352           if (GET_MODE (op) == mode || GET_MODE (op) == VOIDmode)
24353             {
24354               if (optimize || !match || num_memory > 1)
24355                 op = copy_to_mode_reg (mode, op);
24356             }
24357           else
24358             {
24359               op = copy_to_reg (op);
24360               op = simplify_gen_subreg (mode, op, GET_MODE (op), 0);
24361             }
24362         }
24363
24364       args[i].op = op;
24365       args[i].mode = mode;
24366     }
24367
24368   switch (nargs)
24369     {
24370     case 1:
24371       pat = GEN_FCN (icode) (real_target, args[0].op);
24372       break;
24373     case 2:
24374       pat = GEN_FCN (icode) (real_target, args[0].op, args[1].op);
24375       break;
24376     case 3:
24377       pat = GEN_FCN (icode) (real_target, args[0].op, args[1].op,
24378                              args[2].op);
24379       break;
24380     case 4:
24381       pat = GEN_FCN (icode) (real_target, args[0].op, args[1].op,
24382                              args[2].op, args[3].op);
24383       break;
24384     default:
24385       gcc_unreachable ();
24386     }
24387
24388   if (! pat)
24389     return 0;
24390
24391   emit_insn (pat);
24392   return target;
24393 }
24394
24395 /* Subroutine of ix86_expand_builtin to take care of special insns
24396    with variable number of operands.  */
24397
24398 static rtx
24399 ix86_expand_special_args_builtin (const struct builtin_description *d,
24400                                     tree exp, rtx target)
24401 {
24402   tree arg;
24403   rtx pat, op;
24404   unsigned int i, nargs, arg_adjust, memory;
24405   struct
24406     {
24407       rtx op;
24408       enum machine_mode mode;
24409     } args[2];
24410   enum insn_code icode = d->icode;
24411   bool last_arg_constant = false;
24412   const struct insn_data *insn_p = &insn_data[icode];
24413   enum machine_mode tmode = insn_p->operand[0].mode;
24414   enum { load, store } klass;
24415
24416   switch ((enum ix86_special_builtin_type) d->flag)
24417     {
24418     case VOID_FTYPE_VOID:
24419       emit_insn (GEN_FCN (icode) (target));
24420       return 0;
24421     case V2DI_FTYPE_PV2DI:
24422     case V32QI_FTYPE_PCCHAR:
24423     case V16QI_FTYPE_PCCHAR:
24424     case V8SF_FTYPE_PCV4SF:
24425     case V8SF_FTYPE_PCFLOAT:
24426     case V4SF_FTYPE_PCFLOAT:
24427     case V4DF_FTYPE_PCV2DF:
24428     case V4DF_FTYPE_PCDOUBLE:
24429     case V2DF_FTYPE_PCDOUBLE:
24430       nargs = 1;
24431       klass = load;
24432       memory = 0;
24433       break;
24434     case VOID_FTYPE_PV2SF_V4SF:
24435     case VOID_FTYPE_PV4DI_V4DI:
24436     case VOID_FTYPE_PV2DI_V2DI:
24437     case VOID_FTYPE_PCHAR_V32QI:
24438     case VOID_FTYPE_PCHAR_V16QI:
24439     case VOID_FTYPE_PFLOAT_V8SF:
24440     case VOID_FTYPE_PFLOAT_V4SF:
24441     case VOID_FTYPE_PDOUBLE_V4DF:
24442     case VOID_FTYPE_PDOUBLE_V2DF:
24443     case VOID_FTYPE_PDI_DI:
24444     case VOID_FTYPE_PINT_INT:
24445       nargs = 1;
24446       klass = store;
24447       /* Reserve memory operand for target.  */
24448       memory = ARRAY_SIZE (args);
24449       break;
24450     case V4SF_FTYPE_V4SF_PCV2SF:
24451     case V2DF_FTYPE_V2DF_PCDOUBLE:
24452       nargs = 2;
24453       klass = load;
24454       memory = 1;
24455       break;
24456     case V8SF_FTYPE_PCV8SF_V8SF:
24457     case V4DF_FTYPE_PCV4DF_V4DF:
24458     case V4SF_FTYPE_PCV4SF_V4SF:
24459     case V2DF_FTYPE_PCV2DF_V2DF:
24460       nargs = 2;
24461       klass = load;
24462       memory = 0;
24463       break;
24464     case VOID_FTYPE_PV8SF_V8SF_V8SF:
24465     case VOID_FTYPE_PV4DF_V4DF_V4DF:
24466     case VOID_FTYPE_PV4SF_V4SF_V4SF:
24467     case VOID_FTYPE_PV2DF_V2DF_V2DF:
24468       nargs = 2;
24469       klass = store;
24470       /* Reserve memory operand for target.  */
24471       memory = ARRAY_SIZE (args);
24472       break;
24473     default:
24474       gcc_unreachable ();
24475     }
24476
24477   gcc_assert (nargs <= ARRAY_SIZE (args));
24478
24479   if (klass == store)
24480     {
24481       arg = CALL_EXPR_ARG (exp, 0);
24482       op = expand_normal (arg);
24483       gcc_assert (target == 0);
24484       target = gen_rtx_MEM (tmode, copy_to_mode_reg (Pmode, op));
24485       arg_adjust = 1;
24486     }
24487   else
24488     {
24489       arg_adjust = 0;
24490       if (optimize
24491           || target == 0
24492           || GET_MODE (target) != tmode
24493           || ! (*insn_p->operand[0].predicate) (target, tmode))
24494         target = gen_reg_rtx (tmode);
24495     }
24496
24497   for (i = 0; i < nargs; i++)
24498     {
24499       enum machine_mode mode = insn_p->operand[i + 1].mode;
24500       bool match;
24501
24502       arg = CALL_EXPR_ARG (exp, i + arg_adjust);
24503       op = expand_normal (arg);
24504       match = (*insn_p->operand[i + 1].predicate) (op, mode);
24505
24506       if (last_arg_constant && (i + 1) == nargs)
24507         {
24508           if (!match)
24509             switch (icode)
24510               {
24511              default:
24512                 error ("the last argument must be an 8-bit immediate");
24513                 return const0_rtx;
24514               }
24515         }
24516       else
24517         {
24518           if (i == memory)
24519             {
24520               /* This must be the memory operand.  */
24521               op = gen_rtx_MEM (mode, copy_to_mode_reg (Pmode, op));
24522               gcc_assert (GET_MODE (op) == mode
24523                           || GET_MODE (op) == VOIDmode);
24524             }
24525           else
24526             {
24527               /* This must be register.  */
24528               if (VECTOR_MODE_P (mode))
24529                 op = safe_vector_operand (op, mode);
24530
24531               gcc_assert (GET_MODE (op) == mode
24532                           || GET_MODE (op) == VOIDmode);
24533               op = copy_to_mode_reg (mode, op);
24534             }
24535         }
24536
24537       args[i].op = op;
24538       args[i].mode = mode;
24539     }
24540
24541   switch (nargs)
24542     {
24543     case 1:
24544       pat = GEN_FCN (icode) (target, args[0].op);
24545       break;
24546     case 2:
24547       pat = GEN_FCN (icode) (target, args[0].op, args[1].op);
24548       break;
24549     default:
24550       gcc_unreachable ();
24551     }
24552
24553   if (! pat)
24554     return 0;
24555   emit_insn (pat);
24556   return klass == store ? 0 : target;
24557 }
24558
24559 /* Return the integer constant in ARG.  Constrain it to be in the range
24560    of the subparts of VEC_TYPE; issue an error if not.  */
24561
24562 static int
24563 get_element_number (tree vec_type, tree arg)
24564 {
24565   unsigned HOST_WIDE_INT elt, max = TYPE_VECTOR_SUBPARTS (vec_type) - 1;
24566
24567   if (!host_integerp (arg, 1)
24568       || (elt = tree_low_cst (arg, 1), elt > max))
24569     {
24570       error ("selector must be an integer constant in the range 0..%wi", max);
24571       return 0;
24572     }
24573
24574   return elt;
24575 }
24576
24577 /* A subroutine of ix86_expand_builtin.  These builtins are a wrapper around
24578    ix86_expand_vector_init.  We DO have language-level syntax for this, in
24579    the form of  (type){ init-list }.  Except that since we can't place emms
24580    instructions from inside the compiler, we can't allow the use of MMX
24581    registers unless the user explicitly asks for it.  So we do *not* define
24582    vec_set/vec_extract/vec_init patterns for MMX modes in mmx.md.  Instead
24583    we have builtins invoked by mmintrin.h that gives us license to emit
24584    these sorts of instructions.  */
24585
24586 static rtx
24587 ix86_expand_vec_init_builtin (tree type, tree exp, rtx target)
24588 {
24589   enum machine_mode tmode = TYPE_MODE (type);
24590   enum machine_mode inner_mode = GET_MODE_INNER (tmode);
24591   int i, n_elt = GET_MODE_NUNITS (tmode);
24592   rtvec v = rtvec_alloc (n_elt);
24593
24594   gcc_assert (VECTOR_MODE_P (tmode));
24595   gcc_assert (call_expr_nargs (exp) == n_elt);
24596
24597   for (i = 0; i < n_elt; ++i)
24598     {
24599       rtx x = expand_normal (CALL_EXPR_ARG (exp, i));
24600       RTVEC_ELT (v, i) = gen_lowpart (inner_mode, x);
24601     }
24602
24603   if (!target || !register_operand (target, tmode))
24604     target = gen_reg_rtx (tmode);
24605
24606   ix86_expand_vector_init (true, target, gen_rtx_PARALLEL (tmode, v));
24607   return target;
24608 }
24609
24610 /* A subroutine of ix86_expand_builtin.  These builtins are a wrapper around
24611    ix86_expand_vector_extract.  They would be redundant (for non-MMX) if we
24612    had a language-level syntax for referencing vector elements.  */
24613
24614 static rtx
24615 ix86_expand_vec_ext_builtin (tree exp, rtx target)
24616 {
24617   enum machine_mode tmode, mode0;
24618   tree arg0, arg1;
24619   int elt;
24620   rtx op0;
24621
24622   arg0 = CALL_EXPR_ARG (exp, 0);
24623   arg1 = CALL_EXPR_ARG (exp, 1);
24624
24625   op0 = expand_normal (arg0);
24626   elt = get_element_number (TREE_TYPE (arg0), arg1);
24627
24628   tmode = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0)));
24629   mode0 = TYPE_MODE (TREE_TYPE (arg0));
24630   gcc_assert (VECTOR_MODE_P (mode0));
24631
24632   op0 = force_reg (mode0, op0);
24633
24634   if (optimize || !target || !register_operand (target, tmode))
24635     target = gen_reg_rtx (tmode);
24636
24637   ix86_expand_vector_extract (true, target, op0, elt);
24638
24639   return target;
24640 }
24641
24642 /* A subroutine of ix86_expand_builtin.  These builtins are a wrapper around
24643    ix86_expand_vector_set.  They would be redundant (for non-MMX) if we had
24644    a language-level syntax for referencing vector elements.  */
24645
24646 static rtx
24647 ix86_expand_vec_set_builtin (tree exp)
24648 {
24649   enum machine_mode tmode, mode1;
24650   tree arg0, arg1, arg2;
24651   int elt;
24652   rtx op0, op1, target;
24653
24654   arg0 = CALL_EXPR_ARG (exp, 0);
24655   arg1 = CALL_EXPR_ARG (exp, 1);
24656   arg2 = CALL_EXPR_ARG (exp, 2);
24657
24658   tmode = TYPE_MODE (TREE_TYPE (arg0));
24659   mode1 = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0)));
24660   gcc_assert (VECTOR_MODE_P (tmode));
24661
24662   op0 = expand_expr (arg0, NULL_RTX, tmode, EXPAND_NORMAL);
24663   op1 = expand_expr (arg1, NULL_RTX, mode1, EXPAND_NORMAL);
24664   elt = get_element_number (TREE_TYPE (arg0), arg2);
24665
24666   if (GET_MODE (op1) != mode1 && GET_MODE (op1) != VOIDmode)
24667     op1 = convert_modes (mode1, GET_MODE (op1), op1, true);
24668
24669   op0 = force_reg (tmode, op0);
24670   op1 = force_reg (mode1, op1);
24671
24672   /* OP0 is the source of these builtin functions and shouldn't be
24673      modified.  Create a copy, use it and return it as target.  */
24674   target = gen_reg_rtx (tmode);
24675   emit_move_insn (target, op0);
24676   ix86_expand_vector_set (true, target, op1, elt);
24677
24678   return target;
24679 }
24680
24681 /* Expand an expression EXP that calls a built-in function,
24682    with result going to TARGET if that's convenient
24683    (and in mode MODE if that's convenient).
24684    SUBTARGET may be used as the target for computing one of EXP's operands.
24685    IGNORE is nonzero if the value is to be ignored.  */
24686
24687 static rtx
24688 ix86_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
24689                      enum machine_mode mode ATTRIBUTE_UNUSED,
24690                      int ignore ATTRIBUTE_UNUSED)
24691 {
24692   const struct builtin_description *d;
24693   size_t i;
24694   enum insn_code icode;
24695   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
24696   tree arg0, arg1, arg2;
24697   rtx op0, op1, op2, pat;
24698   enum machine_mode mode0, mode1, mode2;
24699   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
24700
24701   /* Determine whether the builtin function is available under the current ISA.
24702      Originally the builtin was not created if it wasn't applicable to the
24703      current ISA based on the command line switches.  With function specific
24704      options, we need to check in the context of the function making the call
24705      whether it is supported.  */
24706   if (ix86_builtins_isa[fcode].isa
24707       && !(ix86_builtins_isa[fcode].isa & ix86_isa_flags))
24708     {
24709       char *opts = ix86_target_string (ix86_builtins_isa[fcode].isa, 0, NULL,
24710                                        NULL, NULL, false);
24711
24712       if (!opts)
24713         error ("%qE needs unknown isa option", fndecl);
24714       else
24715         {
24716           gcc_assert (opts != NULL);
24717           error ("%qE needs isa option %s", fndecl, opts);
24718           free (opts);
24719         }
24720       return const0_rtx;
24721     }
24722
24723   switch (fcode)
24724     {
24725     case IX86_BUILTIN_MASKMOVQ:
24726     case IX86_BUILTIN_MASKMOVDQU:
24727       icode = (fcode == IX86_BUILTIN_MASKMOVQ
24728                ? CODE_FOR_mmx_maskmovq
24729                : CODE_FOR_sse2_maskmovdqu);
24730       /* Note the arg order is different from the operand order.  */
24731       arg1 = CALL_EXPR_ARG (exp, 0);
24732       arg2 = CALL_EXPR_ARG (exp, 1);
24733       arg0 = CALL_EXPR_ARG (exp, 2);
24734       op0 = expand_normal (arg0);
24735       op1 = expand_normal (arg1);
24736       op2 = expand_normal (arg2);
24737       mode0 = insn_data[icode].operand[0].mode;
24738       mode1 = insn_data[icode].operand[1].mode;
24739       mode2 = insn_data[icode].operand[2].mode;
24740
24741       op0 = force_reg (Pmode, op0);
24742       op0 = gen_rtx_MEM (mode1, op0);
24743
24744       if (! (*insn_data[icode].operand[0].predicate) (op0, mode0))
24745         op0 = copy_to_mode_reg (mode0, op0);
24746       if (! (*insn_data[icode].operand[1].predicate) (op1, mode1))
24747         op1 = copy_to_mode_reg (mode1, op1);
24748       if (! (*insn_data[icode].operand[2].predicate) (op2, mode2))
24749         op2 = copy_to_mode_reg (mode2, op2);
24750       pat = GEN_FCN (icode) (op0, op1, op2);
24751       if (! pat)
24752         return 0;
24753       emit_insn (pat);
24754       return 0;
24755
24756     case IX86_BUILTIN_LDMXCSR:
24757       op0 = expand_normal (CALL_EXPR_ARG (exp, 0));
24758       target = assign_386_stack_local (SImode, SLOT_VIRTUAL);
24759       emit_move_insn (target, op0);
24760       emit_insn (gen_sse_ldmxcsr (target));
24761       return 0;
24762
24763     case IX86_BUILTIN_STMXCSR:
24764       target = assign_386_stack_local (SImode, SLOT_VIRTUAL);
24765       emit_insn (gen_sse_stmxcsr (target));
24766       return copy_to_mode_reg (SImode, target);
24767
24768     case IX86_BUILTIN_CLFLUSH:
24769         arg0 = CALL_EXPR_ARG (exp, 0);
24770         op0 = expand_normal (arg0);
24771         icode = CODE_FOR_sse2_clflush;
24772         if (! (*insn_data[icode].operand[0].predicate) (op0, Pmode))
24773             op0 = copy_to_mode_reg (Pmode, op0);
24774
24775         emit_insn (gen_sse2_clflush (op0));
24776         return 0;
24777
24778     case IX86_BUILTIN_MONITOR:
24779       arg0 = CALL_EXPR_ARG (exp, 0);
24780       arg1 = CALL_EXPR_ARG (exp, 1);
24781       arg2 = CALL_EXPR_ARG (exp, 2);
24782       op0 = expand_normal (arg0);
24783       op1 = expand_normal (arg1);
24784       op2 = expand_normal (arg2);
24785       if (!REG_P (op0))
24786         op0 = copy_to_mode_reg (Pmode, op0);
24787       if (!REG_P (op1))
24788         op1 = copy_to_mode_reg (SImode, op1);
24789       if (!REG_P (op2))
24790         op2 = copy_to_mode_reg (SImode, op2);
24791       emit_insn ((*ix86_gen_monitor) (op0, op1, op2));
24792       return 0;
24793
24794     case IX86_BUILTIN_MWAIT:
24795       arg0 = CALL_EXPR_ARG (exp, 0);
24796       arg1 = CALL_EXPR_ARG (exp, 1);
24797       op0 = expand_normal (arg0);
24798       op1 = expand_normal (arg1);
24799       if (!REG_P (op0))
24800         op0 = copy_to_mode_reg (SImode, op0);
24801       if (!REG_P (op1))
24802         op1 = copy_to_mode_reg (SImode, op1);
24803       emit_insn (gen_sse3_mwait (op0, op1));
24804       return 0;
24805
24806     case IX86_BUILTIN_VEC_INIT_V2SI:
24807     case IX86_BUILTIN_VEC_INIT_V4HI:
24808     case IX86_BUILTIN_VEC_INIT_V8QI:
24809       return ix86_expand_vec_init_builtin (TREE_TYPE (exp), exp, target);
24810
24811     case IX86_BUILTIN_VEC_EXT_V2DF:
24812     case IX86_BUILTIN_VEC_EXT_V2DI:
24813     case IX86_BUILTIN_VEC_EXT_V4SF:
24814     case IX86_BUILTIN_VEC_EXT_V4SI:
24815     case IX86_BUILTIN_VEC_EXT_V8HI:
24816     case IX86_BUILTIN_VEC_EXT_V2SI:
24817     case IX86_BUILTIN_VEC_EXT_V4HI:
24818     case IX86_BUILTIN_VEC_EXT_V16QI:
24819       return ix86_expand_vec_ext_builtin (exp, target);
24820
24821     case IX86_BUILTIN_VEC_SET_V2DI:
24822     case IX86_BUILTIN_VEC_SET_V4SF:
24823     case IX86_BUILTIN_VEC_SET_V4SI:
24824     case IX86_BUILTIN_VEC_SET_V8HI:
24825     case IX86_BUILTIN_VEC_SET_V4HI:
24826     case IX86_BUILTIN_VEC_SET_V16QI:
24827       return ix86_expand_vec_set_builtin (exp);
24828
24829     case IX86_BUILTIN_INFQ:
24830       {
24831         REAL_VALUE_TYPE inf;
24832         rtx tmp;
24833
24834         real_inf (&inf);
24835         tmp = CONST_DOUBLE_FROM_REAL_VALUE (inf, mode);
24836
24837         tmp = validize_mem (force_const_mem (mode, tmp));
24838
24839         if (target == 0)
24840           target = gen_reg_rtx (mode);
24841
24842         emit_move_insn (target, tmp);
24843         return target;
24844       }
24845
24846     default:
24847       break;
24848     }
24849
24850   for (i = 0, d = bdesc_special_args;
24851        i < ARRAY_SIZE (bdesc_special_args);
24852        i++, d++)
24853     if (d->code == fcode)
24854       return ix86_expand_special_args_builtin (d, exp, target);
24855
24856   for (i = 0, d = bdesc_args;
24857        i < ARRAY_SIZE (bdesc_args);
24858        i++, d++)
24859     if (d->code == fcode)
24860       switch (fcode)
24861         {
24862         case IX86_BUILTIN_FABSQ:
24863         case IX86_BUILTIN_COPYSIGNQ:
24864           if (!TARGET_SSE2)
24865             /* Emit a normal call if SSE2 isn't available.  */
24866             return expand_call (exp, target, ignore);
24867         default:
24868           return ix86_expand_args_builtin (d, exp, target);
24869         }
24870
24871   for (i = 0, d = bdesc_comi; i < ARRAY_SIZE (bdesc_comi); i++, d++)
24872     if (d->code == fcode)
24873       return ix86_expand_sse_comi (d, exp, target);
24874
24875   for (i = 0, d = bdesc_pcmpestr;
24876        i < ARRAY_SIZE (bdesc_pcmpestr);
24877        i++, d++)
24878     if (d->code == fcode)
24879       return ix86_expand_sse_pcmpestr (d, exp, target);
24880
24881   for (i = 0, d = bdesc_pcmpistr;
24882        i < ARRAY_SIZE (bdesc_pcmpistr);
24883        i++, d++)
24884     if (d->code == fcode)
24885       return ix86_expand_sse_pcmpistr (d, exp, target);
24886
24887   for (i = 0, d = bdesc_multi_arg; i < ARRAY_SIZE (bdesc_multi_arg); i++, d++)
24888     if (d->code == fcode)
24889       return ix86_expand_multi_arg_builtin (d->icode, exp, target,
24890                                             (enum multi_arg_type)d->flag,
24891                                             d->comparison);
24892
24893   gcc_unreachable ();
24894 }
24895
24896 /* Returns a function decl for a vectorized version of the builtin function
24897    with builtin function code FN and the result vector type TYPE, or NULL_TREE
24898    if it is not available.  */
24899
24900 static tree
24901 ix86_builtin_vectorized_function (unsigned int fn, tree type_out,
24902                                   tree type_in)
24903 {
24904   enum machine_mode in_mode, out_mode;
24905   int in_n, out_n;
24906
24907   if (TREE_CODE (type_out) != VECTOR_TYPE
24908       || TREE_CODE (type_in) != VECTOR_TYPE)
24909     return NULL_TREE;
24910
24911   out_mode = TYPE_MODE (TREE_TYPE (type_out));
24912   out_n = TYPE_VECTOR_SUBPARTS (type_out);
24913   in_mode = TYPE_MODE (TREE_TYPE (type_in));
24914   in_n = TYPE_VECTOR_SUBPARTS (type_in);
24915
24916   switch (fn)
24917     {
24918     case BUILT_IN_SQRT:
24919       if (out_mode == DFmode && out_n == 2
24920           && in_mode == DFmode && in_n == 2)
24921         return ix86_builtins[IX86_BUILTIN_SQRTPD];
24922       break;
24923
24924     case BUILT_IN_SQRTF:
24925       if (out_mode == SFmode && out_n == 4
24926           && in_mode == SFmode && in_n == 4)
24927         return ix86_builtins[IX86_BUILTIN_SQRTPS_NR];
24928       break;
24929
24930     case BUILT_IN_LRINT:
24931       if (out_mode == SImode && out_n == 4
24932           && in_mode == DFmode && in_n == 2)
24933         return ix86_builtins[IX86_BUILTIN_VEC_PACK_SFIX];
24934       break;
24935
24936     case BUILT_IN_LRINTF:
24937       if (out_mode == SImode && out_n == 4
24938           && in_mode == SFmode && in_n == 4)
24939         return ix86_builtins[IX86_BUILTIN_CVTPS2DQ];
24940       break;
24941
24942     default:
24943       ;
24944     }
24945
24946   /* Dispatch to a handler for a vectorization library.  */
24947   if (ix86_veclib_handler)
24948     return (*ix86_veclib_handler)(fn, type_out, type_in);
24949
24950   return NULL_TREE;
24951 }
24952
24953 /* Handler for an SVML-style interface to
24954    a library with vectorized intrinsics.  */
24955
24956 static tree
24957 ix86_veclibabi_svml (enum built_in_function fn, tree type_out, tree type_in)
24958 {
24959   char name[20];
24960   tree fntype, new_fndecl, args;
24961   unsigned arity;
24962   const char *bname;
24963   enum machine_mode el_mode, in_mode;
24964   int n, in_n;
24965
24966   /* The SVML is suitable for unsafe math only.  */
24967   if (!flag_unsafe_math_optimizations)
24968     return NULL_TREE;
24969
24970   el_mode = TYPE_MODE (TREE_TYPE (type_out));
24971   n = TYPE_VECTOR_SUBPARTS (type_out);
24972   in_mode = TYPE_MODE (TREE_TYPE (type_in));
24973   in_n = TYPE_VECTOR_SUBPARTS (type_in);
24974   if (el_mode != in_mode
24975       || n != in_n)
24976     return NULL_TREE;
24977
24978   switch (fn)
24979     {
24980     case BUILT_IN_EXP:
24981     case BUILT_IN_LOG:
24982     case BUILT_IN_LOG10:
24983     case BUILT_IN_POW:
24984     case BUILT_IN_TANH:
24985     case BUILT_IN_TAN:
24986     case BUILT_IN_ATAN:
24987     case BUILT_IN_ATAN2:
24988     case BUILT_IN_ATANH:
24989     case BUILT_IN_CBRT:
24990     case BUILT_IN_SINH:
24991     case BUILT_IN_SIN:
24992     case BUILT_IN_ASINH:
24993     case BUILT_IN_ASIN:
24994     case BUILT_IN_COSH:
24995     case BUILT_IN_COS:
24996     case BUILT_IN_ACOSH:
24997     case BUILT_IN_ACOS:
24998       if (el_mode != DFmode || n != 2)
24999         return NULL_TREE;
25000       break;
25001
25002     case BUILT_IN_EXPF:
25003     case BUILT_IN_LOGF:
25004     case BUILT_IN_LOG10F:
25005     case BUILT_IN_POWF:
25006     case BUILT_IN_TANHF:
25007     case BUILT_IN_TANF:
25008     case BUILT_IN_ATANF:
25009     case BUILT_IN_ATAN2F:
25010     case BUILT_IN_ATANHF:
25011     case BUILT_IN_CBRTF:
25012     case BUILT_IN_SINHF:
25013     case BUILT_IN_SINF:
25014     case BUILT_IN_ASINHF:
25015     case BUILT_IN_ASINF:
25016     case BUILT_IN_COSHF:
25017     case BUILT_IN_COSF:
25018     case BUILT_IN_ACOSHF:
25019     case BUILT_IN_ACOSF:
25020       if (el_mode != SFmode || n != 4)
25021         return NULL_TREE;
25022       break;
25023
25024     default:
25025       return NULL_TREE;
25026     }
25027
25028   bname = IDENTIFIER_POINTER (DECL_NAME (implicit_built_in_decls[fn]));
25029
25030   if (fn == BUILT_IN_LOGF)
25031     strcpy (name, "vmlsLn4");
25032   else if (fn == BUILT_IN_LOG)
25033     strcpy (name, "vmldLn2");
25034   else if (n == 4)
25035     {
25036       sprintf (name, "vmls%s", bname+10);
25037       name[strlen (name)-1] = '4';
25038     }
25039   else
25040     sprintf (name, "vmld%s2", bname+10);
25041
25042   /* Convert to uppercase. */
25043   name[4] &= ~0x20;
25044
25045   arity = 0;
25046   for (args = DECL_ARGUMENTS (implicit_built_in_decls[fn]); args;
25047        args = TREE_CHAIN (args))
25048     arity++;
25049
25050   if (arity == 1)
25051     fntype = build_function_type_list (type_out, type_in, NULL);
25052   else
25053     fntype = build_function_type_list (type_out, type_in, type_in, NULL);
25054
25055   /* Build a function declaration for the vectorized function.  */
25056   new_fndecl = build_decl (FUNCTION_DECL, get_identifier (name), fntype);
25057   TREE_PUBLIC (new_fndecl) = 1;
25058   DECL_EXTERNAL (new_fndecl) = 1;
25059   DECL_IS_NOVOPS (new_fndecl) = 1;
25060   TREE_READONLY (new_fndecl) = 1;
25061
25062   return new_fndecl;
25063 }
25064
25065 /* Handler for an ACML-style interface to
25066    a library with vectorized intrinsics.  */
25067
25068 static tree
25069 ix86_veclibabi_acml (enum built_in_function fn, tree type_out, tree type_in)
25070 {
25071   char name[20] = "__vr.._";
25072   tree fntype, new_fndecl, args;
25073   unsigned arity;
25074   const char *bname;
25075   enum machine_mode el_mode, in_mode;
25076   int n, in_n;
25077
25078   /* The ACML is 64bits only and suitable for unsafe math only as
25079      it does not correctly support parts of IEEE with the required
25080      precision such as denormals.  */
25081   if (!TARGET_64BIT
25082       || !flag_unsafe_math_optimizations)
25083     return NULL_TREE;
25084
25085   el_mode = TYPE_MODE (TREE_TYPE (type_out));
25086   n = TYPE_VECTOR_SUBPARTS (type_out);
25087   in_mode = TYPE_MODE (TREE_TYPE (type_in));
25088   in_n = TYPE_VECTOR_SUBPARTS (type_in);
25089   if (el_mode != in_mode
25090       || n != in_n)
25091     return NULL_TREE;
25092
25093   switch (fn)
25094     {
25095     case BUILT_IN_SIN:
25096     case BUILT_IN_COS:
25097     case BUILT_IN_EXP:
25098     case BUILT_IN_LOG:
25099     case BUILT_IN_LOG2:
25100     case BUILT_IN_LOG10:
25101       name[4] = 'd';
25102       name[5] = '2';
25103       if (el_mode != DFmode
25104           || n != 2)
25105         return NULL_TREE;
25106       break;
25107
25108     case BUILT_IN_SINF:
25109     case BUILT_IN_COSF:
25110     case BUILT_IN_EXPF:
25111     case BUILT_IN_POWF:
25112     case BUILT_IN_LOGF:
25113     case BUILT_IN_LOG2F:
25114     case BUILT_IN_LOG10F:
25115       name[4] = 's';
25116       name[5] = '4';
25117       if (el_mode != SFmode
25118           || n != 4)
25119         return NULL_TREE;
25120       break;
25121
25122     default:
25123       return NULL_TREE;
25124     }
25125
25126   bname = IDENTIFIER_POINTER (DECL_NAME (implicit_built_in_decls[fn]));
25127   sprintf (name + 7, "%s", bname+10);
25128
25129   arity = 0;
25130   for (args = DECL_ARGUMENTS (implicit_built_in_decls[fn]); args;
25131        args = TREE_CHAIN (args))
25132     arity++;
25133
25134   if (arity == 1)
25135     fntype = build_function_type_list (type_out, type_in, NULL);
25136   else
25137     fntype = build_function_type_list (type_out, type_in, type_in, NULL);
25138
25139   /* Build a function declaration for the vectorized function.  */
25140   new_fndecl = build_decl (FUNCTION_DECL, get_identifier (name), fntype);
25141   TREE_PUBLIC (new_fndecl) = 1;
25142   DECL_EXTERNAL (new_fndecl) = 1;
25143   DECL_IS_NOVOPS (new_fndecl) = 1;
25144   TREE_READONLY (new_fndecl) = 1;
25145
25146   return new_fndecl;
25147 }
25148
25149
25150 /* Returns a decl of a function that implements conversion of an integer vector
25151    into a floating-point vector, or vice-versa. TYPE is the type of the integer
25152    side of the conversion.
25153    Return NULL_TREE if it is not available.  */
25154
25155 static tree
25156 ix86_vectorize_builtin_conversion (unsigned int code, tree type)
25157 {
25158   if (TREE_CODE (type) != VECTOR_TYPE)
25159     return NULL_TREE;
25160
25161   switch (code)
25162     {
25163     case FLOAT_EXPR:
25164       switch (TYPE_MODE (type))
25165         {
25166         case V4SImode:
25167           return ix86_builtins[IX86_BUILTIN_CVTDQ2PS];
25168         default:
25169           return NULL_TREE;
25170         }
25171
25172     case FIX_TRUNC_EXPR:
25173       switch (TYPE_MODE (type))
25174         {
25175         case V4SImode:
25176           return ix86_builtins[IX86_BUILTIN_CVTTPS2DQ];
25177         default:
25178           return NULL_TREE;
25179         }
25180     default:
25181       return NULL_TREE;
25182
25183     }
25184 }
25185
25186 /* Returns a code for a target-specific builtin that implements
25187    reciprocal of the function, or NULL_TREE if not available.  */
25188
25189 static tree
25190 ix86_builtin_reciprocal (unsigned int fn, bool md_fn,
25191                          bool sqrt ATTRIBUTE_UNUSED)
25192 {
25193   if (! (TARGET_SSE_MATH && TARGET_RECIP && !optimize_insn_for_size_p ()
25194          && flag_finite_math_only && !flag_trapping_math
25195          && flag_unsafe_math_optimizations))
25196     return NULL_TREE;
25197
25198   if (md_fn)
25199     /* Machine dependent builtins.  */
25200     switch (fn)
25201       {
25202         /* Vectorized version of sqrt to rsqrt conversion.  */
25203       case IX86_BUILTIN_SQRTPS_NR:
25204         return ix86_builtins[IX86_BUILTIN_RSQRTPS_NR];
25205
25206       default:
25207         return NULL_TREE;
25208       }
25209   else
25210     /* Normal builtins.  */
25211     switch (fn)
25212       {
25213         /* Sqrt to rsqrt conversion.  */
25214       case BUILT_IN_SQRTF:
25215         return ix86_builtins[IX86_BUILTIN_RSQRTF];
25216
25217       default:
25218         return NULL_TREE;
25219       }
25220 }
25221
25222 /* Store OPERAND to the memory after reload is completed.  This means
25223    that we can't easily use assign_stack_local.  */
25224 rtx
25225 ix86_force_to_memory (enum machine_mode mode, rtx operand)
25226 {
25227   rtx result;
25228
25229   gcc_assert (reload_completed);
25230   if (!TARGET_64BIT_MS_ABI && TARGET_RED_ZONE)
25231     {
25232       result = gen_rtx_MEM (mode,
25233                             gen_rtx_PLUS (Pmode,
25234                                           stack_pointer_rtx,
25235                                           GEN_INT (-RED_ZONE_SIZE)));
25236       emit_move_insn (result, operand);
25237     }
25238   else if ((TARGET_64BIT_MS_ABI || !TARGET_RED_ZONE) && TARGET_64BIT)
25239     {
25240       switch (mode)
25241         {
25242         case HImode:
25243         case SImode:
25244           operand = gen_lowpart (DImode, operand);
25245           /* FALLTHRU */
25246         case DImode:
25247           emit_insn (
25248                       gen_rtx_SET (VOIDmode,
25249                                    gen_rtx_MEM (DImode,
25250                                                 gen_rtx_PRE_DEC (DImode,
25251                                                         stack_pointer_rtx)),
25252                                    operand));
25253           break;
25254         default:
25255           gcc_unreachable ();
25256         }
25257       result = gen_rtx_MEM (mode, stack_pointer_rtx);
25258     }
25259   else
25260     {
25261       switch (mode)
25262         {
25263         case DImode:
25264           {
25265             rtx operands[2];
25266             split_di (&operand, 1, operands, operands + 1);
25267             emit_insn (
25268                         gen_rtx_SET (VOIDmode,
25269                                      gen_rtx_MEM (SImode,
25270                                                   gen_rtx_PRE_DEC (Pmode,
25271                                                         stack_pointer_rtx)),
25272                                      operands[1]));
25273             emit_insn (
25274                         gen_rtx_SET (VOIDmode,
25275                                      gen_rtx_MEM (SImode,
25276                                                   gen_rtx_PRE_DEC (Pmode,
25277                                                         stack_pointer_rtx)),
25278                                      operands[0]));
25279           }
25280           break;
25281         case HImode:
25282           /* Store HImodes as SImodes.  */
25283           operand = gen_lowpart (SImode, operand);
25284           /* FALLTHRU */
25285         case SImode:
25286           emit_insn (
25287                       gen_rtx_SET (VOIDmode,
25288                                    gen_rtx_MEM (GET_MODE (operand),
25289                                                 gen_rtx_PRE_DEC (SImode,
25290                                                         stack_pointer_rtx)),
25291                                    operand));
25292           break;
25293         default:
25294           gcc_unreachable ();
25295         }
25296       result = gen_rtx_MEM (mode, stack_pointer_rtx);
25297     }
25298   return result;
25299 }
25300
25301 /* Free operand from the memory.  */
25302 void
25303 ix86_free_from_memory (enum machine_mode mode)
25304 {
25305   if (!TARGET_RED_ZONE || TARGET_64BIT_MS_ABI)
25306     {
25307       int size;
25308
25309       if (mode == DImode || TARGET_64BIT)
25310         size = 8;
25311       else
25312         size = 4;
25313       /* Use LEA to deallocate stack space.  In peephole2 it will be converted
25314          to pop or add instruction if registers are available.  */
25315       emit_insn (gen_rtx_SET (VOIDmode, stack_pointer_rtx,
25316                               gen_rtx_PLUS (Pmode, stack_pointer_rtx,
25317                                             GEN_INT (size))));
25318     }
25319 }
25320
25321 /* Put float CONST_DOUBLE in the constant pool instead of fp regs.
25322    QImode must go into class Q_REGS.
25323    Narrow ALL_REGS to GENERAL_REGS.  This supports allowing movsf and
25324    movdf to do mem-to-mem moves through integer regs.  */
25325 enum reg_class
25326 ix86_preferred_reload_class (rtx x, enum reg_class regclass)
25327 {
25328   enum machine_mode mode = GET_MODE (x);
25329
25330   /* We're only allowed to return a subclass of CLASS.  Many of the
25331      following checks fail for NO_REGS, so eliminate that early.  */
25332   if (regclass == NO_REGS)
25333     return NO_REGS;
25334
25335   /* All classes can load zeros.  */
25336   if (x == CONST0_RTX (mode))
25337     return regclass;
25338
25339   /* Force constants into memory if we are loading a (nonzero) constant into
25340      an MMX or SSE register.  This is because there are no MMX/SSE instructions
25341      to load from a constant.  */
25342   if (CONSTANT_P (x)
25343       && (MAYBE_MMX_CLASS_P (regclass) || MAYBE_SSE_CLASS_P (regclass)))
25344     return NO_REGS;
25345
25346   /* Prefer SSE regs only, if we can use them for math.  */
25347   if (TARGET_SSE_MATH && !TARGET_MIX_SSE_I387 && SSE_FLOAT_MODE_P (mode))
25348     return SSE_CLASS_P (regclass) ? regclass : NO_REGS;
25349
25350   /* Floating-point constants need more complex checks.  */
25351   if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) != VOIDmode)
25352     {
25353       /* General regs can load everything.  */
25354       if (reg_class_subset_p (regclass, GENERAL_REGS))
25355         return regclass;
25356
25357       /* Floats can load 0 and 1 plus some others.  Note that we eliminated
25358          zero above.  We only want to wind up preferring 80387 registers if
25359          we plan on doing computation with them.  */
25360       if (TARGET_80387
25361           && standard_80387_constant_p (x))
25362         {
25363           /* Limit class to non-sse.  */
25364           if (regclass == FLOAT_SSE_REGS)
25365             return FLOAT_REGS;
25366           if (regclass == FP_TOP_SSE_REGS)
25367             return FP_TOP_REG;
25368           if (regclass == FP_SECOND_SSE_REGS)
25369             return FP_SECOND_REG;
25370           if (regclass == FLOAT_INT_REGS || regclass == FLOAT_REGS)
25371             return regclass;
25372         }
25373
25374       return NO_REGS;
25375     }
25376
25377   /* Generally when we see PLUS here, it's the function invariant
25378      (plus soft-fp const_int).  Which can only be computed into general
25379      regs.  */
25380   if (GET_CODE (x) == PLUS)
25381     return reg_class_subset_p (regclass, GENERAL_REGS) ? regclass : NO_REGS;
25382
25383   /* QImode constants are easy to load, but non-constant QImode data
25384      must go into Q_REGS.  */
25385   if (GET_MODE (x) == QImode && !CONSTANT_P (x))
25386     {
25387       if (reg_class_subset_p (regclass, Q_REGS))
25388         return regclass;
25389       if (reg_class_subset_p (Q_REGS, regclass))
25390         return Q_REGS;
25391       return NO_REGS;
25392     }
25393
25394   return regclass;
25395 }
25396
25397 /* Discourage putting floating-point values in SSE registers unless
25398    SSE math is being used, and likewise for the 387 registers.  */
25399 enum reg_class
25400 ix86_preferred_output_reload_class (rtx x, enum reg_class regclass)
25401 {
25402   enum machine_mode mode = GET_MODE (x);
25403
25404   /* Restrict the output reload class to the register bank that we are doing
25405      math on.  If we would like not to return a subset of CLASS, reject this
25406      alternative: if reload cannot do this, it will still use its choice.  */
25407   mode = GET_MODE (x);
25408   if (TARGET_SSE_MATH && SSE_FLOAT_MODE_P (mode))
25409     return MAYBE_SSE_CLASS_P (regclass) ? SSE_REGS : NO_REGS;
25410
25411   if (X87_FLOAT_MODE_P (mode))
25412     {
25413       if (regclass == FP_TOP_SSE_REGS)
25414         return FP_TOP_REG;
25415       else if (regclass == FP_SECOND_SSE_REGS)
25416         return FP_SECOND_REG;
25417       else
25418         return FLOAT_CLASS_P (regclass) ? regclass : NO_REGS;
25419     }
25420
25421   return regclass;
25422 }
25423
25424 static enum reg_class
25425 ix86_secondary_reload (bool in_p, rtx x, enum reg_class rclass,
25426                        enum machine_mode mode,
25427                        secondary_reload_info *sri ATTRIBUTE_UNUSED)
25428 {
25429   /* QImode spills from non-QI registers require
25430      intermediate register on 32bit targets.  */
25431   if (!in_p && mode == QImode && !TARGET_64BIT
25432       && (rclass == GENERAL_REGS
25433           || rclass == LEGACY_REGS
25434           || rclass == INDEX_REGS))
25435     {
25436       int regno;
25437
25438       if (REG_P (x))
25439         regno = REGNO (x);
25440       else
25441         regno = -1;
25442
25443       if (regno >= FIRST_PSEUDO_REGISTER || GET_CODE (x) == SUBREG)
25444         regno = true_regnum (x);
25445
25446       /* Return Q_REGS if the operand is in memory.  */
25447       if (regno == -1)
25448         return Q_REGS;
25449     }
25450
25451   return NO_REGS;
25452 }
25453
25454 /* If we are copying between general and FP registers, we need a memory
25455    location. The same is true for SSE and MMX registers.
25456
25457    To optimize register_move_cost performance, allow inline variant.
25458
25459    The macro can't work reliably when one of the CLASSES is class containing
25460    registers from multiple units (SSE, MMX, integer).  We avoid this by never
25461    combining those units in single alternative in the machine description.
25462    Ensure that this constraint holds to avoid unexpected surprises.
25463
25464    When STRICT is false, we are being called from REGISTER_MOVE_COST, so do not
25465    enforce these sanity checks.  */
25466
25467 static inline int
25468 inline_secondary_memory_needed (enum reg_class class1, enum reg_class class2,
25469                               enum machine_mode mode, int strict)
25470 {
25471   if (MAYBE_FLOAT_CLASS_P (class1) != FLOAT_CLASS_P (class1)
25472       || MAYBE_FLOAT_CLASS_P (class2) != FLOAT_CLASS_P (class2)
25473       || MAYBE_SSE_CLASS_P (class1) != SSE_CLASS_P (class1)
25474       || MAYBE_SSE_CLASS_P (class2) != SSE_CLASS_P (class2)
25475       || MAYBE_MMX_CLASS_P (class1) != MMX_CLASS_P (class1)
25476       || MAYBE_MMX_CLASS_P (class2) != MMX_CLASS_P (class2))
25477     {
25478       gcc_assert (!strict);
25479       return true;
25480     }
25481
25482   if (FLOAT_CLASS_P (class1) != FLOAT_CLASS_P (class2))
25483     return true;
25484
25485   /* ??? This is a lie.  We do have moves between mmx/general, and for
25486      mmx/sse2.  But by saying we need secondary memory we discourage the
25487      register allocator from using the mmx registers unless needed.  */
25488   if (MMX_CLASS_P (class1) != MMX_CLASS_P (class2))
25489     return true;
25490
25491   if (SSE_CLASS_P (class1) != SSE_CLASS_P (class2))
25492     {
25493       /* SSE1 doesn't have any direct moves from other classes.  */
25494       if (!TARGET_SSE2)
25495         return true;
25496
25497       /* If the target says that inter-unit moves are more expensive
25498          than moving through memory, then don't generate them.  */
25499       if (!TARGET_INTER_UNIT_MOVES)
25500         return true;
25501
25502       /* Between SSE and general, we have moves no larger than word size.  */
25503       if (GET_MODE_SIZE (mode) > UNITS_PER_WORD)
25504         return true;
25505     }
25506
25507   return false;
25508 }
25509
25510 int
25511 ix86_secondary_memory_needed (enum reg_class class1, enum reg_class class2,
25512                               enum machine_mode mode, int strict)
25513 {
25514   return inline_secondary_memory_needed (class1, class2, mode, strict);
25515 }
25516
25517 /* Return true if the registers in CLASS cannot represent the change from
25518    modes FROM to TO.  */
25519
25520 bool
25521 ix86_cannot_change_mode_class (enum machine_mode from, enum machine_mode to,
25522                                enum reg_class regclass)
25523 {
25524   if (from == to)
25525     return false;
25526
25527   /* x87 registers can't do subreg at all, as all values are reformatted
25528      to extended precision.  */
25529   if (MAYBE_FLOAT_CLASS_P (regclass))
25530     return true;
25531
25532   if (MAYBE_SSE_CLASS_P (regclass) || MAYBE_MMX_CLASS_P (regclass))
25533     {
25534       /* Vector registers do not support QI or HImode loads.  If we don't
25535          disallow a change to these modes, reload will assume it's ok to
25536          drop the subreg from (subreg:SI (reg:HI 100) 0).  This affects
25537          the vec_dupv4hi pattern.  */
25538       if (GET_MODE_SIZE (from) < 4)
25539         return true;
25540
25541       /* Vector registers do not support subreg with nonzero offsets, which
25542          are otherwise valid for integer registers.  Since we can't see
25543          whether we have a nonzero offset from here, prohibit all
25544          nonparadoxical subregs changing size.  */
25545       if (GET_MODE_SIZE (to) < GET_MODE_SIZE (from))
25546         return true;
25547     }
25548
25549   return false;
25550 }
25551
25552 /* Return the cost of moving data of mode M between a
25553    register and memory.  A value of 2 is the default; this cost is
25554    relative to those in `REGISTER_MOVE_COST'.
25555
25556    This function is used extensively by register_move_cost that is used to
25557    build tables at startup.  Make it inline in this case.
25558    When IN is 2, return maximum of in and out move cost.
25559
25560    If moving between registers and memory is more expensive than
25561    between two registers, you should define this macro to express the
25562    relative cost.
25563
25564    Model also increased moving costs of QImode registers in non
25565    Q_REGS classes.
25566  */
25567 static inline int
25568 inline_memory_move_cost (enum machine_mode mode, enum reg_class regclass,
25569                          int in)
25570 {
25571   int cost;
25572   if (FLOAT_CLASS_P (regclass))
25573     {
25574       int index;
25575       switch (mode)
25576         {
25577           case SFmode:
25578             index = 0;
25579             break;
25580           case DFmode:
25581             index = 1;
25582             break;
25583           case XFmode:
25584             index = 2;
25585             break;
25586           default:
25587             return 100;
25588         }
25589       if (in == 2)
25590         return MAX (ix86_cost->fp_load [index], ix86_cost->fp_store [index]);
25591       return in ? ix86_cost->fp_load [index] : ix86_cost->fp_store [index];
25592     }
25593   if (SSE_CLASS_P (regclass))
25594     {
25595       int index;
25596       switch (GET_MODE_SIZE (mode))
25597         {
25598           case 4:
25599             index = 0;
25600             break;
25601           case 8:
25602             index = 1;
25603             break;
25604           case 16:
25605             index = 2;
25606             break;
25607           default:
25608             return 100;
25609         }
25610       if (in == 2)
25611         return MAX (ix86_cost->sse_load [index], ix86_cost->sse_store [index]);
25612       return in ? ix86_cost->sse_load [index] : ix86_cost->sse_store [index];
25613     }
25614   if (MMX_CLASS_P (regclass))
25615     {
25616       int index;
25617       switch (GET_MODE_SIZE (mode))
25618         {
25619           case 4:
25620             index = 0;
25621             break;
25622           case 8:
25623             index = 1;
25624             break;
25625           default:
25626             return 100;
25627         }
25628       if (in)
25629         return MAX (ix86_cost->mmx_load [index], ix86_cost->mmx_store [index]);
25630       return in ? ix86_cost->mmx_load [index] : ix86_cost->mmx_store [index];
25631     }
25632   switch (GET_MODE_SIZE (mode))
25633     {
25634       case 1:
25635         if (Q_CLASS_P (regclass) || TARGET_64BIT)
25636           {
25637             if (!in)
25638               return ix86_cost->int_store[0];
25639             if (TARGET_PARTIAL_REG_DEPENDENCY
25640                 && optimize_function_for_speed_p (cfun))
25641               cost = ix86_cost->movzbl_load;
25642             else
25643               cost = ix86_cost->int_load[0];
25644             if (in == 2)
25645               return MAX (cost, ix86_cost->int_store[0]);
25646             return cost;
25647           }
25648         else
25649           {
25650            if (in == 2)
25651              return MAX (ix86_cost->movzbl_load, ix86_cost->int_store[0] + 4);
25652            if (in)
25653              return ix86_cost->movzbl_load;
25654            else
25655              return ix86_cost->int_store[0] + 4;
25656           }
25657         break;
25658       case 2:
25659         if (in == 2)
25660           return MAX (ix86_cost->int_load[1], ix86_cost->int_store[1]);
25661         return in ? ix86_cost->int_load[1] : ix86_cost->int_store[1];
25662       default:
25663         /* Compute number of 32bit moves needed.  TFmode is moved as XFmode.  */
25664         if (mode == TFmode)
25665           mode = XFmode;
25666         if (in == 2)
25667           cost = MAX (ix86_cost->int_load[2] , ix86_cost->int_store[2]);
25668         else if (in)
25669           cost = ix86_cost->int_load[2];
25670         else
25671           cost = ix86_cost->int_store[2];
25672         return (cost * (((int) GET_MODE_SIZE (mode)
25673                         + UNITS_PER_WORD - 1) / UNITS_PER_WORD));
25674     }
25675 }
25676
25677 int
25678 ix86_memory_move_cost (enum machine_mode mode, enum reg_class regclass, int in)
25679 {
25680   return inline_memory_move_cost (mode, regclass, in);
25681 }
25682
25683
25684 /* Return the cost of moving data from a register in class CLASS1 to
25685    one in class CLASS2.
25686
25687    It is not required that the cost always equal 2 when FROM is the same as TO;
25688    on some machines it is expensive to move between registers if they are not
25689    general registers.  */
25690
25691 int
25692 ix86_register_move_cost (enum machine_mode mode, enum reg_class class1,
25693                          enum reg_class class2)
25694 {
25695   /* In case we require secondary memory, compute cost of the store followed
25696      by load.  In order to avoid bad register allocation choices, we need
25697      for this to be *at least* as high as the symmetric MEMORY_MOVE_COST.  */
25698
25699   if (inline_secondary_memory_needed (class1, class2, mode, 0))
25700     {
25701       int cost = 1;
25702
25703       cost += inline_memory_move_cost (mode, class1, 2);
25704       cost += inline_memory_move_cost (mode, class2, 2);
25705
25706       /* In case of copying from general_purpose_register we may emit multiple
25707          stores followed by single load causing memory size mismatch stall.
25708          Count this as arbitrarily high cost of 20.  */
25709       if (CLASS_MAX_NREGS (class1, mode) > CLASS_MAX_NREGS (class2, mode))
25710         cost += 20;
25711
25712       /* In the case of FP/MMX moves, the registers actually overlap, and we
25713          have to switch modes in order to treat them differently.  */
25714       if ((MMX_CLASS_P (class1) && MAYBE_FLOAT_CLASS_P (class2))
25715           || (MMX_CLASS_P (class2) && MAYBE_FLOAT_CLASS_P (class1)))
25716         cost += 20;
25717
25718       return cost;
25719     }
25720
25721   /* Moves between SSE/MMX and integer unit are expensive.  */
25722   if (MMX_CLASS_P (class1) != MMX_CLASS_P (class2)
25723       || SSE_CLASS_P (class1) != SSE_CLASS_P (class2))
25724
25725     /* ??? By keeping returned value relatively high, we limit the number
25726        of moves between integer and MMX/SSE registers for all targets.
25727        Additionally, high value prevents problem with x86_modes_tieable_p(),
25728        where integer modes in MMX/SSE registers are not tieable
25729        because of missing QImode and HImode moves to, from or between
25730        MMX/SSE registers.  */
25731     return MAX (8, ix86_cost->mmxsse_to_integer);
25732
25733   if (MAYBE_FLOAT_CLASS_P (class1))
25734     return ix86_cost->fp_move;
25735   if (MAYBE_SSE_CLASS_P (class1))
25736     return ix86_cost->sse_move;
25737   if (MAYBE_MMX_CLASS_P (class1))
25738     return ix86_cost->mmx_move;
25739   return 2;
25740 }
25741
25742 /* Return 1 if hard register REGNO can hold a value of machine-mode MODE.  */
25743
25744 bool
25745 ix86_hard_regno_mode_ok (int regno, enum machine_mode mode)
25746 {
25747   /* Flags and only flags can only hold CCmode values.  */
25748   if (CC_REGNO_P (regno))
25749     return GET_MODE_CLASS (mode) == MODE_CC;
25750   if (GET_MODE_CLASS (mode) == MODE_CC
25751       || GET_MODE_CLASS (mode) == MODE_RANDOM
25752       || GET_MODE_CLASS (mode) == MODE_PARTIAL_INT)
25753     return 0;
25754   if (FP_REGNO_P (regno))
25755     return VALID_FP_MODE_P (mode);
25756   if (SSE_REGNO_P (regno))
25757     {
25758       /* We implement the move patterns for all vector modes into and
25759          out of SSE registers, even when no operation instructions
25760          are available.  OImode move is available only when AVX is
25761          enabled.  */
25762       return ((TARGET_AVX && mode == OImode)
25763               || VALID_AVX256_REG_MODE (mode)
25764               || VALID_SSE_REG_MODE (mode)
25765               || VALID_SSE2_REG_MODE (mode)
25766               || VALID_MMX_REG_MODE (mode)
25767               || VALID_MMX_REG_MODE_3DNOW (mode));
25768     }
25769   if (MMX_REGNO_P (regno))
25770     {
25771       /* We implement the move patterns for 3DNOW modes even in MMX mode,
25772          so if the register is available at all, then we can move data of
25773          the given mode into or out of it.  */
25774       return (VALID_MMX_REG_MODE (mode)
25775               || VALID_MMX_REG_MODE_3DNOW (mode));
25776     }
25777
25778   if (mode == QImode)
25779     {
25780       /* Take care for QImode values - they can be in non-QI regs,
25781          but then they do cause partial register stalls.  */
25782       if (regno <= BX_REG || TARGET_64BIT)
25783         return 1;
25784       if (!TARGET_PARTIAL_REG_STALL)
25785         return 1;
25786       return reload_in_progress || reload_completed;
25787     }
25788   /* We handle both integer and floats in the general purpose registers.  */
25789   else if (VALID_INT_MODE_P (mode))
25790     return 1;
25791   else if (VALID_FP_MODE_P (mode))
25792     return 1;
25793   else if (VALID_DFP_MODE_P (mode))
25794     return 1;
25795   /* Lots of MMX code casts 8 byte vector modes to DImode.  If we then go
25796      on to use that value in smaller contexts, this can easily force a
25797      pseudo to be allocated to GENERAL_REGS.  Since this is no worse than
25798      supporting DImode, allow it.  */
25799   else if (VALID_MMX_REG_MODE_3DNOW (mode) || VALID_MMX_REG_MODE (mode))
25800     return 1;
25801
25802   return 0;
25803 }
25804
25805 /* A subroutine of ix86_modes_tieable_p.  Return true if MODE is a
25806    tieable integer mode.  */
25807
25808 static bool
25809 ix86_tieable_integer_mode_p (enum machine_mode mode)
25810 {
25811   switch (mode)
25812     {
25813     case HImode:
25814     case SImode:
25815       return true;
25816
25817     case QImode:
25818       return TARGET_64BIT || !TARGET_PARTIAL_REG_STALL;
25819
25820     case DImode:
25821       return TARGET_64BIT;
25822
25823     default:
25824       return false;
25825     }
25826 }
25827
25828 /* Return true if MODE1 is accessible in a register that can hold MODE2
25829    without copying.  That is, all register classes that can hold MODE2
25830    can also hold MODE1.  */
25831
25832 bool
25833 ix86_modes_tieable_p (enum machine_mode mode1, enum machine_mode mode2)
25834 {
25835   if (mode1 == mode2)
25836     return true;
25837
25838   if (ix86_tieable_integer_mode_p (mode1)
25839       && ix86_tieable_integer_mode_p (mode2))
25840     return true;
25841
25842   /* MODE2 being XFmode implies fp stack or general regs, which means we
25843      can tie any smaller floating point modes to it.  Note that we do not
25844      tie this with TFmode.  */
25845   if (mode2 == XFmode)
25846     return mode1 == SFmode || mode1 == DFmode;
25847
25848   /* MODE2 being DFmode implies fp stack, general or sse regs, which means
25849      that we can tie it with SFmode.  */
25850   if (mode2 == DFmode)
25851     return mode1 == SFmode;
25852
25853   /* If MODE2 is only appropriate for an SSE register, then tie with
25854      any other mode acceptable to SSE registers.  */
25855   if (GET_MODE_SIZE (mode2) == 16
25856       && ix86_hard_regno_mode_ok (FIRST_SSE_REG, mode2))
25857     return (GET_MODE_SIZE (mode1) == 16
25858             && ix86_hard_regno_mode_ok (FIRST_SSE_REG, mode1));
25859
25860   /* If MODE2 is appropriate for an MMX register, then tie
25861      with any other mode acceptable to MMX registers.  */
25862   if (GET_MODE_SIZE (mode2) == 8
25863       && ix86_hard_regno_mode_ok (FIRST_MMX_REG, mode2))
25864     return (GET_MODE_SIZE (mode1) == 8
25865             && ix86_hard_regno_mode_ok (FIRST_MMX_REG, mode1));
25866
25867   return false;
25868 }
25869
25870 /* Compute a (partial) cost for rtx X.  Return true if the complete
25871    cost has been computed, and false if subexpressions should be
25872    scanned.  In either case, *TOTAL contains the cost result.  */
25873
25874 static bool
25875 ix86_rtx_costs (rtx x, int code, int outer_code_i, int *total, bool speed)
25876 {
25877   enum rtx_code outer_code = (enum rtx_code) outer_code_i;
25878   enum machine_mode mode = GET_MODE (x);
25879   const struct processor_costs *cost = speed ? ix86_cost : &ix86_size_cost;
25880
25881   switch (code)
25882     {
25883     case CONST_INT:
25884     case CONST:
25885     case LABEL_REF:
25886     case SYMBOL_REF:
25887       if (TARGET_64BIT && !x86_64_immediate_operand (x, VOIDmode))
25888         *total = 3;
25889       else if (TARGET_64BIT && !x86_64_zext_immediate_operand (x, VOIDmode))
25890         *total = 2;
25891       else if (flag_pic && SYMBOLIC_CONST (x)
25892                && (!TARGET_64BIT
25893                    || (!GET_CODE (x) != LABEL_REF
25894                        && (GET_CODE (x) != SYMBOL_REF
25895                            || !SYMBOL_REF_LOCAL_P (x)))))
25896         *total = 1;
25897       else
25898         *total = 0;
25899       return true;
25900
25901     case CONST_DOUBLE:
25902       if (mode == VOIDmode)
25903         *total = 0;
25904       else
25905         switch (standard_80387_constant_p (x))
25906           {
25907           case 1: /* 0.0 */
25908             *total = 1;
25909             break;
25910           default: /* Other constants */
25911             *total = 2;
25912             break;
25913           case 0:
25914           case -1:
25915             /* Start with (MEM (SYMBOL_REF)), since that's where
25916                it'll probably end up.  Add a penalty for size.  */
25917             *total = (COSTS_N_INSNS (1)
25918                       + (flag_pic != 0 && !TARGET_64BIT)
25919                       + (mode == SFmode ? 0 : mode == DFmode ? 1 : 2));
25920             break;
25921           }
25922       return true;
25923
25924     case ZERO_EXTEND:
25925       /* The zero extensions is often completely free on x86_64, so make
25926          it as cheap as possible.  */
25927       if (TARGET_64BIT && mode == DImode
25928           && GET_MODE (XEXP (x, 0)) == SImode)
25929         *total = 1;
25930       else if (TARGET_ZERO_EXTEND_WITH_AND)
25931         *total = cost->add;
25932       else
25933         *total = cost->movzx;
25934       return false;
25935
25936     case SIGN_EXTEND:
25937       *total = cost->movsx;
25938       return false;
25939
25940     case ASHIFT:
25941       if (CONST_INT_P (XEXP (x, 1))
25942           && (GET_MODE (XEXP (x, 0)) != DImode || TARGET_64BIT))
25943         {
25944           HOST_WIDE_INT value = INTVAL (XEXP (x, 1));
25945           if (value == 1)
25946             {
25947               *total = cost->add;
25948               return false;
25949             }
25950           if ((value == 2 || value == 3)
25951               && cost->lea <= cost->shift_const)
25952             {
25953               *total = cost->lea;
25954               return false;
25955             }
25956         }
25957       /* FALLTHRU */
25958
25959     case ROTATE:
25960     case ASHIFTRT:
25961     case LSHIFTRT:
25962     case ROTATERT:
25963       if (!TARGET_64BIT && GET_MODE (XEXP (x, 0)) == DImode)
25964         {
25965           if (CONST_INT_P (XEXP (x, 1)))
25966             {
25967               if (INTVAL (XEXP (x, 1)) > 32)
25968                 *total = cost->shift_const + COSTS_N_INSNS (2);
25969               else
25970                 *total = cost->shift_const * 2;
25971             }
25972           else
25973             {
25974               if (GET_CODE (XEXP (x, 1)) == AND)
25975                 *total = cost->shift_var * 2;
25976               else
25977                 *total = cost->shift_var * 6 + COSTS_N_INSNS (2);
25978             }
25979         }
25980       else
25981         {
25982           if (CONST_INT_P (XEXP (x, 1)))
25983             *total = cost->shift_const;
25984           else
25985             *total = cost->shift_var;
25986         }
25987       return false;
25988
25989     case MULT:
25990       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
25991         {
25992           /* ??? SSE scalar cost should be used here.  */
25993           *total = cost->fmul;
25994           return false;
25995         }
25996       else if (X87_FLOAT_MODE_P (mode))
25997         {
25998           *total = cost->fmul;
25999           return false;
26000         }
26001       else if (FLOAT_MODE_P (mode))
26002         {
26003           /* ??? SSE vector cost should be used here.  */
26004           *total = cost->fmul;
26005           return false;
26006         }
26007       else
26008         {
26009           rtx op0 = XEXP (x, 0);
26010           rtx op1 = XEXP (x, 1);
26011           int nbits;
26012           if (CONST_INT_P (XEXP (x, 1)))
26013             {
26014               unsigned HOST_WIDE_INT value = INTVAL (XEXP (x, 1));
26015               for (nbits = 0; value != 0; value &= value - 1)
26016                 nbits++;
26017             }
26018           else
26019             /* This is arbitrary.  */
26020             nbits = 7;
26021
26022           /* Compute costs correctly for widening multiplication.  */
26023           if ((GET_CODE (op0) == SIGN_EXTEND || GET_CODE (op0) == ZERO_EXTEND)
26024               && GET_MODE_SIZE (GET_MODE (XEXP (op0, 0))) * 2
26025                  == GET_MODE_SIZE (mode))
26026             {
26027               int is_mulwiden = 0;
26028               enum machine_mode inner_mode = GET_MODE (op0);
26029
26030               if (GET_CODE (op0) == GET_CODE (op1))
26031                 is_mulwiden = 1, op1 = XEXP (op1, 0);
26032               else if (CONST_INT_P (op1))
26033                 {
26034                   if (GET_CODE (op0) == SIGN_EXTEND)
26035                     is_mulwiden = trunc_int_for_mode (INTVAL (op1), inner_mode)
26036                                   == INTVAL (op1);
26037                   else
26038                     is_mulwiden = !(INTVAL (op1) & ~GET_MODE_MASK (inner_mode));
26039                 }
26040
26041               if (is_mulwiden)
26042                 op0 = XEXP (op0, 0), mode = GET_MODE (op0);
26043             }
26044
26045           *total = (cost->mult_init[MODE_INDEX (mode)]
26046                     + nbits * cost->mult_bit
26047                     + rtx_cost (op0, outer_code, speed) + rtx_cost (op1, outer_code, speed));
26048
26049           return true;
26050         }
26051
26052     case DIV:
26053     case UDIV:
26054     case MOD:
26055     case UMOD:
26056       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
26057         /* ??? SSE cost should be used here.  */
26058         *total = cost->fdiv;
26059       else if (X87_FLOAT_MODE_P (mode))
26060         *total = cost->fdiv;
26061       else if (FLOAT_MODE_P (mode))
26062         /* ??? SSE vector cost should be used here.  */
26063         *total = cost->fdiv;
26064       else
26065         *total = cost->divide[MODE_INDEX (mode)];
26066       return false;
26067
26068     case PLUS:
26069       if (GET_MODE_CLASS (mode) == MODE_INT
26070                && GET_MODE_BITSIZE (mode) <= GET_MODE_BITSIZE (Pmode))
26071         {
26072           if (GET_CODE (XEXP (x, 0)) == PLUS
26073               && GET_CODE (XEXP (XEXP (x, 0), 0)) == MULT
26074               && CONST_INT_P (XEXP (XEXP (XEXP (x, 0), 0), 1))
26075               && CONSTANT_P (XEXP (x, 1)))
26076             {
26077               HOST_WIDE_INT val = INTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1));
26078               if (val == 2 || val == 4 || val == 8)
26079                 {
26080                   *total = cost->lea;
26081                   *total += rtx_cost (XEXP (XEXP (x, 0), 1), outer_code, speed);
26082                   *total += rtx_cost (XEXP (XEXP (XEXP (x, 0), 0), 0),
26083                                       outer_code, speed);
26084                   *total += rtx_cost (XEXP (x, 1), outer_code, speed);
26085                   return true;
26086                 }
26087             }
26088           else if (GET_CODE (XEXP (x, 0)) == MULT
26089                    && CONST_INT_P (XEXP (XEXP (x, 0), 1)))
26090             {
26091               HOST_WIDE_INT val = INTVAL (XEXP (XEXP (x, 0), 1));
26092               if (val == 2 || val == 4 || val == 8)
26093                 {
26094                   *total = cost->lea;
26095                   *total += rtx_cost (XEXP (XEXP (x, 0), 0), outer_code, speed);
26096                   *total += rtx_cost (XEXP (x, 1), outer_code, speed);
26097                   return true;
26098                 }
26099             }
26100           else if (GET_CODE (XEXP (x, 0)) == PLUS)
26101             {
26102               *total = cost->lea;
26103               *total += rtx_cost (XEXP (XEXP (x, 0), 0), outer_code, speed);
26104               *total += rtx_cost (XEXP (XEXP (x, 0), 1), outer_code, speed);
26105               *total += rtx_cost (XEXP (x, 1), outer_code, speed);
26106               return true;
26107             }
26108         }
26109       /* FALLTHRU */
26110
26111     case MINUS:
26112       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
26113         {
26114           /* ??? SSE cost should be used here.  */
26115           *total = cost->fadd;
26116           return false;
26117         }
26118       else if (X87_FLOAT_MODE_P (mode))
26119         {
26120           *total = cost->fadd;
26121           return false;
26122         }
26123       else if (FLOAT_MODE_P (mode))
26124         {
26125           /* ??? SSE vector cost should be used here.  */
26126           *total = cost->fadd;
26127           return false;
26128         }
26129       /* FALLTHRU */
26130
26131     case AND:
26132     case IOR:
26133     case XOR:
26134       if (!TARGET_64BIT && mode == DImode)
26135         {
26136           *total = (cost->add * 2
26137                     + (rtx_cost (XEXP (x, 0), outer_code, speed)
26138                        << (GET_MODE (XEXP (x, 0)) != DImode))
26139                     + (rtx_cost (XEXP (x, 1), outer_code, speed)
26140                        << (GET_MODE (XEXP (x, 1)) != DImode)));
26141           return true;
26142         }
26143       /* FALLTHRU */
26144
26145     case NEG:
26146       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
26147         {
26148           /* ??? SSE cost should be used here.  */
26149           *total = cost->fchs;
26150           return false;
26151         }
26152       else if (X87_FLOAT_MODE_P (mode))
26153         {
26154           *total = cost->fchs;
26155           return false;
26156         }
26157       else if (FLOAT_MODE_P (mode))
26158         {
26159           /* ??? SSE vector cost should be used here.  */
26160           *total = cost->fchs;
26161           return false;
26162         }
26163       /* FALLTHRU */
26164
26165     case NOT:
26166       if (!TARGET_64BIT && mode == DImode)
26167         *total = cost->add * 2;
26168       else
26169         *total = cost->add;
26170       return false;
26171
26172     case COMPARE:
26173       if (GET_CODE (XEXP (x, 0)) == ZERO_EXTRACT
26174           && XEXP (XEXP (x, 0), 1) == const1_rtx
26175           && CONST_INT_P (XEXP (XEXP (x, 0), 2))
26176           && XEXP (x, 1) == const0_rtx)
26177         {
26178           /* This kind of construct is implemented using test[bwl].
26179              Treat it as if we had an AND.  */
26180           *total = (cost->add
26181                     + rtx_cost (XEXP (XEXP (x, 0), 0), outer_code, speed)
26182                     + rtx_cost (const1_rtx, outer_code, speed));
26183           return true;
26184         }
26185       return false;
26186
26187     case FLOAT_EXTEND:
26188       if (!(SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH))
26189         *total = 0;
26190       return false;
26191
26192     case ABS:
26193       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
26194         /* ??? SSE cost should be used here.  */
26195         *total = cost->fabs;
26196       else if (X87_FLOAT_MODE_P (mode))
26197         *total = cost->fabs;
26198       else if (FLOAT_MODE_P (mode))
26199         /* ??? SSE vector cost should be used here.  */
26200         *total = cost->fabs;
26201       return false;
26202
26203     case SQRT:
26204       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
26205         /* ??? SSE cost should be used here.  */
26206         *total = cost->fsqrt;
26207       else if (X87_FLOAT_MODE_P (mode))
26208         *total = cost->fsqrt;
26209       else if (FLOAT_MODE_P (mode))
26210         /* ??? SSE vector cost should be used here.  */
26211         *total = cost->fsqrt;
26212       return false;
26213
26214     case UNSPEC:
26215       if (XINT (x, 1) == UNSPEC_TP)
26216         *total = 0;
26217       return false;
26218
26219     default:
26220       return false;
26221     }
26222 }
26223
26224 #if TARGET_MACHO
26225
26226 static int current_machopic_label_num;
26227
26228 /* Given a symbol name and its associated stub, write out the
26229    definition of the stub.  */
26230
26231 void
26232 machopic_output_stub (FILE *file, const char *symb, const char *stub)
26233 {
26234   unsigned int length;
26235   char *binder_name, *symbol_name, lazy_ptr_name[32];
26236   int label = ++current_machopic_label_num;
26237
26238   /* For 64-bit we shouldn't get here.  */
26239   gcc_assert (!TARGET_64BIT);
26240
26241   /* Lose our funky encoding stuff so it doesn't contaminate the stub.  */
26242   symb = (*targetm.strip_name_encoding) (symb);
26243
26244   length = strlen (stub);
26245   binder_name = XALLOCAVEC (char, length + 32);
26246   GEN_BINDER_NAME_FOR_STUB (binder_name, stub, length);
26247
26248   length = strlen (symb);
26249   symbol_name = XALLOCAVEC (char, length + 32);
26250   GEN_SYMBOL_NAME_FOR_SYMBOL (symbol_name, symb, length);
26251
26252   sprintf (lazy_ptr_name, "L%d$lz", label);
26253
26254   if (MACHOPIC_PURE)
26255     switch_to_section (darwin_sections[machopic_picsymbol_stub_section]);
26256   else
26257     switch_to_section (darwin_sections[machopic_symbol_stub_section]);
26258
26259   fprintf (file, "%s:\n", stub);
26260   fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
26261
26262   if (MACHOPIC_PURE)
26263     {
26264       fprintf (file, "\tcall\tLPC$%d\nLPC$%d:\tpopl\t%%eax\n", label, label);
26265       fprintf (file, "\tmovl\t%s-LPC$%d(%%eax),%%edx\n", lazy_ptr_name, label);
26266       fprintf (file, "\tjmp\t*%%edx\n");
26267     }
26268   else
26269     fprintf (file, "\tjmp\t*%s\n", lazy_ptr_name);
26270
26271   fprintf (file, "%s:\n", binder_name);
26272
26273   if (MACHOPIC_PURE)
26274     {
26275       fprintf (file, "\tlea\t%s-LPC$%d(%%eax),%%eax\n", lazy_ptr_name, label);
26276       fprintf (file, "\tpushl\t%%eax\n");
26277     }
26278   else
26279     fprintf (file, "\tpushl\t$%s\n", lazy_ptr_name);
26280
26281   fprintf (file, "\tjmp\tdyld_stub_binding_helper\n");
26282
26283   switch_to_section (darwin_sections[machopic_lazy_symbol_ptr_section]);
26284   fprintf (file, "%s:\n", lazy_ptr_name);
26285   fprintf (file, "\t.indirect_symbol %s\n", symbol_name);
26286   fprintf (file, "\t.long %s\n", binder_name);
26287 }
26288
26289 void
26290 darwin_x86_file_end (void)
26291 {
26292   darwin_file_end ();
26293   ix86_file_end ();
26294 }
26295 #endif /* TARGET_MACHO */
26296
26297 /* Order the registers for register allocator.  */
26298
26299 void
26300 x86_order_regs_for_local_alloc (void)
26301 {
26302    int pos = 0;
26303    int i;
26304
26305    /* First allocate the local general purpose registers.  */
26306    for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
26307      if (GENERAL_REGNO_P (i) && call_used_regs[i])
26308         reg_alloc_order [pos++] = i;
26309
26310    /* Global general purpose registers.  */
26311    for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
26312      if (GENERAL_REGNO_P (i) && !call_used_regs[i])
26313         reg_alloc_order [pos++] = i;
26314
26315    /* x87 registers come first in case we are doing FP math
26316       using them.  */
26317    if (!TARGET_SSE_MATH)
26318      for (i = FIRST_STACK_REG; i <= LAST_STACK_REG; i++)
26319        reg_alloc_order [pos++] = i;
26320
26321    /* SSE registers.  */
26322    for (i = FIRST_SSE_REG; i <= LAST_SSE_REG; i++)
26323      reg_alloc_order [pos++] = i;
26324    for (i = FIRST_REX_SSE_REG; i <= LAST_REX_SSE_REG; i++)
26325      reg_alloc_order [pos++] = i;
26326
26327    /* x87 registers.  */
26328    if (TARGET_SSE_MATH)
26329      for (i = FIRST_STACK_REG; i <= LAST_STACK_REG; i++)
26330        reg_alloc_order [pos++] = i;
26331
26332    for (i = FIRST_MMX_REG; i <= LAST_MMX_REG; i++)
26333      reg_alloc_order [pos++] = i;
26334
26335    /* Initialize the rest of array as we do not allocate some registers
26336       at all.  */
26337    while (pos < FIRST_PSEUDO_REGISTER)
26338      reg_alloc_order [pos++] = 0;
26339 }
26340
26341 /* Handle a "ms_abi" or "sysv" attribute; arguments as in
26342    struct attribute_spec.handler.  */
26343 static tree
26344 ix86_handle_abi_attribute (tree *node, tree name,
26345                               tree args ATTRIBUTE_UNUSED,
26346                               int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
26347 {
26348   if (TREE_CODE (*node) != FUNCTION_TYPE
26349       && TREE_CODE (*node) != METHOD_TYPE
26350       && TREE_CODE (*node) != FIELD_DECL
26351       && TREE_CODE (*node) != TYPE_DECL)
26352     {
26353       warning (OPT_Wattributes, "%qs attribute only applies to functions",
26354                IDENTIFIER_POINTER (name));
26355       *no_add_attrs = true;
26356       return NULL_TREE;
26357     }
26358   if (!TARGET_64BIT)
26359     {
26360       warning (OPT_Wattributes, "%qs attribute only available for 64-bit",
26361                IDENTIFIER_POINTER (name));
26362       *no_add_attrs = true;
26363       return NULL_TREE;
26364     }
26365
26366   /* Can combine regparm with all attributes but fastcall.  */
26367   if (is_attribute_p ("ms_abi", name))
26368     {
26369       if (lookup_attribute ("sysv_abi", TYPE_ATTRIBUTES (*node)))
26370         {
26371           error ("ms_abi and sysv_abi attributes are not compatible");
26372         }
26373
26374       return NULL_TREE;
26375     }
26376   else if (is_attribute_p ("sysv_abi", name))
26377     {
26378       if (lookup_attribute ("ms_abi", TYPE_ATTRIBUTES (*node)))
26379         {
26380           error ("ms_abi and sysv_abi attributes are not compatible");
26381         }
26382
26383       return NULL_TREE;
26384     }
26385
26386   return NULL_TREE;
26387 }
26388
26389 /* Handle a "ms_struct" or "gcc_struct" attribute; arguments as in
26390    struct attribute_spec.handler.  */
26391 static tree
26392 ix86_handle_struct_attribute (tree *node, tree name,
26393                               tree args ATTRIBUTE_UNUSED,
26394                               int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
26395 {
26396   tree *type = NULL;
26397   if (DECL_P (*node))
26398     {
26399       if (TREE_CODE (*node) == TYPE_DECL)
26400         type = &TREE_TYPE (*node);
26401     }
26402   else
26403     type = node;
26404
26405   if (!(type && (TREE_CODE (*type) == RECORD_TYPE
26406                  || TREE_CODE (*type) == UNION_TYPE)))
26407     {
26408       warning (OPT_Wattributes, "%qs attribute ignored",
26409                IDENTIFIER_POINTER (name));
26410       *no_add_attrs = true;
26411     }
26412
26413   else if ((is_attribute_p ("ms_struct", name)
26414             && lookup_attribute ("gcc_struct", TYPE_ATTRIBUTES (*type)))
26415            || ((is_attribute_p ("gcc_struct", name)
26416                 && lookup_attribute ("ms_struct", TYPE_ATTRIBUTES (*type)))))
26417     {
26418       warning (OPT_Wattributes, "%qs incompatible attribute ignored",
26419                IDENTIFIER_POINTER (name));
26420       *no_add_attrs = true;
26421     }
26422
26423   return NULL_TREE;
26424 }
26425
26426 static bool
26427 ix86_ms_bitfield_layout_p (const_tree record_type)
26428 {
26429   return (TARGET_MS_BITFIELD_LAYOUT &&
26430           !lookup_attribute ("gcc_struct", TYPE_ATTRIBUTES (record_type)))
26431     || lookup_attribute ("ms_struct", TYPE_ATTRIBUTES (record_type));
26432 }
26433
26434 /* Returns an expression indicating where the this parameter is
26435    located on entry to the FUNCTION.  */
26436
26437 static rtx
26438 x86_this_parameter (tree function)
26439 {
26440   tree type = TREE_TYPE (function);
26441   bool aggr = aggregate_value_p (TREE_TYPE (type), type) != 0;
26442   int nregs;
26443
26444   if (TARGET_64BIT)
26445     {
26446       const int *parm_regs;
26447
26448       if (ix86_function_type_abi (type) == MS_ABI)
26449         parm_regs = x86_64_ms_abi_int_parameter_registers;
26450       else
26451         parm_regs = x86_64_int_parameter_registers;
26452       return gen_rtx_REG (DImode, parm_regs[aggr]);
26453     }
26454
26455   nregs = ix86_function_regparm (type, function);
26456
26457   if (nregs > 0 && !stdarg_p (type))
26458     {
26459       int regno;
26460
26461       if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (type)))
26462         regno = aggr ? DX_REG : CX_REG;
26463       else
26464         {
26465           regno = AX_REG;
26466           if (aggr)
26467             {
26468               regno = DX_REG;
26469               if (nregs == 1)
26470                 return gen_rtx_MEM (SImode,
26471                                     plus_constant (stack_pointer_rtx, 4));
26472             }
26473         }
26474       return gen_rtx_REG (SImode, regno);
26475     }
26476
26477   return gen_rtx_MEM (SImode, plus_constant (stack_pointer_rtx, aggr ? 8 : 4));
26478 }
26479
26480 /* Determine whether x86_output_mi_thunk can succeed.  */
26481
26482 static bool
26483 x86_can_output_mi_thunk (const_tree thunk ATTRIBUTE_UNUSED,
26484                          HOST_WIDE_INT delta ATTRIBUTE_UNUSED,
26485                          HOST_WIDE_INT vcall_offset, const_tree function)
26486 {
26487   /* 64-bit can handle anything.  */
26488   if (TARGET_64BIT)
26489     return true;
26490
26491   /* For 32-bit, everything's fine if we have one free register.  */
26492   if (ix86_function_regparm (TREE_TYPE (function), function) < 3)
26493     return true;
26494
26495   /* Need a free register for vcall_offset.  */
26496   if (vcall_offset)
26497     return false;
26498
26499   /* Need a free register for GOT references.  */
26500   if (flag_pic && !(*targetm.binds_local_p) (function))
26501     return false;
26502
26503   /* Otherwise ok.  */
26504   return true;
26505 }
26506
26507 /* Output the assembler code for a thunk function.  THUNK_DECL is the
26508    declaration for the thunk function itself, FUNCTION is the decl for
26509    the target function.  DELTA is an immediate constant offset to be
26510    added to THIS.  If VCALL_OFFSET is nonzero, the word at
26511    *(*this + vcall_offset) should be added to THIS.  */
26512
26513 static void
26514 x86_output_mi_thunk (FILE *file ATTRIBUTE_UNUSED,
26515                      tree thunk ATTRIBUTE_UNUSED, HOST_WIDE_INT delta,
26516                      HOST_WIDE_INT vcall_offset, tree function)
26517 {
26518   rtx xops[3];
26519   rtx this_param = x86_this_parameter (function);
26520   rtx this_reg, tmp;
26521
26522   /* If VCALL_OFFSET, we'll need THIS in a register.  Might as well
26523      pull it in now and let DELTA benefit.  */
26524   if (REG_P (this_param))
26525     this_reg = this_param;
26526   else if (vcall_offset)
26527     {
26528       /* Put the this parameter into %eax.  */
26529       xops[0] = this_param;
26530       xops[1] = this_reg = gen_rtx_REG (Pmode, AX_REG);
26531       output_asm_insn ("mov%z1\t{%0, %1|%1, %0}", xops);
26532     }
26533   else
26534     this_reg = NULL_RTX;
26535
26536   /* Adjust the this parameter by a fixed constant.  */
26537   if (delta)
26538     {
26539       xops[0] = GEN_INT (delta);
26540       xops[1] = this_reg ? this_reg : this_param;
26541       if (TARGET_64BIT)
26542         {
26543           if (!x86_64_general_operand (xops[0], DImode))
26544             {
26545               tmp = gen_rtx_REG (DImode, R10_REG);
26546               xops[1] = tmp;
26547               output_asm_insn ("mov{q}\t{%1, %0|%0, %1}", xops);
26548               xops[0] = tmp;
26549               xops[1] = this_param;
26550             }
26551           output_asm_insn ("add{q}\t{%0, %1|%1, %0}", xops);
26552         }
26553       else
26554         output_asm_insn ("add{l}\t{%0, %1|%1, %0}", xops);
26555     }
26556
26557   /* Adjust the this parameter by a value stored in the vtable.  */
26558   if (vcall_offset)
26559     {
26560       if (TARGET_64BIT)
26561         tmp = gen_rtx_REG (DImode, R10_REG);
26562       else
26563         {
26564           int tmp_regno = CX_REG;
26565           if (lookup_attribute ("fastcall",
26566                                 TYPE_ATTRIBUTES (TREE_TYPE (function))))
26567             tmp_regno = AX_REG;
26568           tmp = gen_rtx_REG (SImode, tmp_regno);
26569         }
26570
26571       xops[0] = gen_rtx_MEM (Pmode, this_reg);
26572       xops[1] = tmp;
26573       output_asm_insn ("mov%z1\t{%0, %1|%1, %0}", xops);
26574
26575       /* Adjust the this parameter.  */
26576       xops[0] = gen_rtx_MEM (Pmode, plus_constant (tmp, vcall_offset));
26577       if (TARGET_64BIT && !memory_operand (xops[0], Pmode))
26578         {
26579           rtx tmp2 = gen_rtx_REG (DImode, R11_REG);
26580           xops[0] = GEN_INT (vcall_offset);
26581           xops[1] = tmp2;
26582           output_asm_insn ("mov{q}\t{%0, %1|%1, %0}", xops);
26583           xops[0] = gen_rtx_MEM (Pmode, gen_rtx_PLUS (Pmode, tmp, tmp2));
26584         }
26585       xops[1] = this_reg;
26586       output_asm_insn ("add%z1\t{%0, %1|%1, %0}", xops);
26587     }
26588
26589   /* If necessary, drop THIS back to its stack slot.  */
26590   if (this_reg && this_reg != this_param)
26591     {
26592       xops[0] = this_reg;
26593       xops[1] = this_param;
26594       output_asm_insn ("mov%z1\t{%0, %1|%1, %0}", xops);
26595     }
26596
26597   xops[0] = XEXP (DECL_RTL (function), 0);
26598   if (TARGET_64BIT)
26599     {
26600       if (!flag_pic || (*targetm.binds_local_p) (function))
26601         output_asm_insn ("jmp\t%P0", xops);
26602       /* All thunks should be in the same object as their target,
26603          and thus binds_local_p should be true.  */
26604       else if (TARGET_64BIT && cfun->machine->call_abi == MS_ABI)
26605         gcc_unreachable ();
26606       else
26607         {
26608           tmp = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, xops[0]), UNSPEC_GOTPCREL);
26609           tmp = gen_rtx_CONST (Pmode, tmp);
26610           tmp = gen_rtx_MEM (QImode, tmp);
26611           xops[0] = tmp;
26612           output_asm_insn ("jmp\t%A0", xops);
26613         }
26614     }
26615   else
26616     {
26617       if (!flag_pic || (*targetm.binds_local_p) (function))
26618         output_asm_insn ("jmp\t%P0", xops);
26619       else
26620 #if TARGET_MACHO
26621         if (TARGET_MACHO)
26622           {
26623             rtx sym_ref = XEXP (DECL_RTL (function), 0);
26624             tmp = (gen_rtx_SYMBOL_REF
26625                    (Pmode,
26626                     machopic_indirection_name (sym_ref, /*stub_p=*/true)));
26627             tmp = gen_rtx_MEM (QImode, tmp);
26628             xops[0] = tmp;
26629             output_asm_insn ("jmp\t%0", xops);
26630           }
26631         else
26632 #endif /* TARGET_MACHO */
26633         {
26634           tmp = gen_rtx_REG (SImode, CX_REG);
26635           output_set_got (tmp, NULL_RTX);
26636
26637           xops[1] = tmp;
26638           output_asm_insn ("mov{l}\t{%0@GOT(%1), %1|%1, %0@GOT[%1]}", xops);
26639           output_asm_insn ("jmp\t{*}%1", xops);
26640         }
26641     }
26642 }
26643
26644 static void
26645 x86_file_start (void)
26646 {
26647   default_file_start ();
26648 #if TARGET_MACHO
26649   darwin_file_start ();
26650 #endif
26651   if (X86_FILE_START_VERSION_DIRECTIVE)
26652     fputs ("\t.version\t\"01.01\"\n", asm_out_file);
26653   if (X86_FILE_START_FLTUSED)
26654     fputs ("\t.global\t__fltused\n", asm_out_file);
26655   if (ix86_asm_dialect == ASM_INTEL)
26656     fputs ("\t.intel_syntax noprefix\n", asm_out_file);
26657 }
26658
26659 int
26660 x86_field_alignment (tree field, int computed)
26661 {
26662   enum machine_mode mode;
26663   tree type = TREE_TYPE (field);
26664
26665   if (TARGET_64BIT || TARGET_ALIGN_DOUBLE)
26666     return computed;
26667   mode = TYPE_MODE (strip_array_types (type));
26668   if (mode == DFmode || mode == DCmode
26669       || GET_MODE_CLASS (mode) == MODE_INT
26670       || GET_MODE_CLASS (mode) == MODE_COMPLEX_INT)
26671     return MIN (32, computed);
26672   return computed;
26673 }
26674
26675 /* Output assembler code to FILE to increment profiler label # LABELNO
26676    for profiling a function entry.  */
26677 void
26678 x86_function_profiler (FILE *file, int labelno ATTRIBUTE_UNUSED)
26679 {
26680   if (TARGET_64BIT)
26681     {
26682 #ifndef NO_PROFILE_COUNTERS
26683       fprintf (file, "\tleaq\t%sP%d@(%%rip),%%r11\n", LPREFIX, labelno);
26684 #endif
26685
26686       if (DEFAULT_ABI == SYSV_ABI && flag_pic)
26687         fprintf (file, "\tcall\t*%s@GOTPCREL(%%rip)\n", MCOUNT_NAME);
26688       else
26689         fprintf (file, "\tcall\t%s\n", MCOUNT_NAME);
26690     }
26691   else if (flag_pic)
26692     {
26693 #ifndef NO_PROFILE_COUNTERS
26694       fprintf (file, "\tleal\t%sP%d@GOTOFF(%%ebx),%%%s\n",
26695                LPREFIX, labelno, PROFILE_COUNT_REGISTER);
26696 #endif
26697       fprintf (file, "\tcall\t*%s@GOT(%%ebx)\n", MCOUNT_NAME);
26698     }
26699   else
26700     {
26701 #ifndef NO_PROFILE_COUNTERS
26702       fprintf (file, "\tmovl\t$%sP%d,%%%s\n", LPREFIX, labelno,
26703                PROFILE_COUNT_REGISTER);
26704 #endif
26705       fprintf (file, "\tcall\t%s\n", MCOUNT_NAME);
26706     }
26707 }
26708
26709 /* We don't have exact information about the insn sizes, but we may assume
26710    quite safely that we are informed about all 1 byte insns and memory
26711    address sizes.  This is enough to eliminate unnecessary padding in
26712    99% of cases.  */
26713
26714 static int
26715 min_insn_size (rtx insn)
26716 {
26717   int l = 0;
26718
26719   if (!INSN_P (insn) || !active_insn_p (insn))
26720     return 0;
26721
26722   /* Discard alignments we've emit and jump instructions.  */
26723   if (GET_CODE (PATTERN (insn)) == UNSPEC_VOLATILE
26724       && XINT (PATTERN (insn), 1) == UNSPECV_ALIGN)
26725     return 0;
26726   if (JUMP_P (insn)
26727       && (GET_CODE (PATTERN (insn)) == ADDR_VEC
26728           || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC))
26729     return 0;
26730
26731   /* Important case - calls are always 5 bytes.
26732      It is common to have many calls in the row.  */
26733   if (CALL_P (insn)
26734       && symbolic_reference_mentioned_p (PATTERN (insn))
26735       && !SIBLING_CALL_P (insn))
26736     return 5;
26737   if (get_attr_length (insn) <= 1)
26738     return 1;
26739
26740   /* For normal instructions we may rely on the sizes of addresses
26741      and the presence of symbol to require 4 bytes of encoding.
26742      This is not the case for jumps where references are PC relative.  */
26743   if (!JUMP_P (insn))
26744     {
26745       l = get_attr_length_address (insn);
26746       if (l < 4 && symbolic_reference_mentioned_p (PATTERN (insn)))
26747         l = 4;
26748     }
26749   if (l)
26750     return 1+l;
26751   else
26752     return 2;
26753 }
26754
26755 /* AMD K8 core mispredicts jumps when there are more than 3 jumps in 16 byte
26756    window.  */
26757
26758 static void
26759 ix86_avoid_jump_misspredicts (void)
26760 {
26761   rtx insn, start = get_insns ();
26762   int nbytes = 0, njumps = 0;
26763   int isjump = 0;
26764
26765   /* Look for all minimal intervals of instructions containing 4 jumps.
26766      The intervals are bounded by START and INSN.  NBYTES is the total
26767      size of instructions in the interval including INSN and not including
26768      START.  When the NBYTES is smaller than 16 bytes, it is possible
26769      that the end of START and INSN ends up in the same 16byte page.
26770
26771      The smallest offset in the page INSN can start is the case where START
26772      ends on the offset 0.  Offset of INSN is then NBYTES - sizeof (INSN).
26773      We add p2align to 16byte window with maxskip 17 - NBYTES + sizeof (INSN).
26774      */
26775   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
26776     {
26777
26778       nbytes += min_insn_size (insn);
26779       if (dump_file)
26780         fprintf(dump_file, "Insn %i estimated to %i bytes\n",
26781                 INSN_UID (insn), min_insn_size (insn));
26782       if ((JUMP_P (insn)
26783            && GET_CODE (PATTERN (insn)) != ADDR_VEC
26784            && GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC)
26785           || CALL_P (insn))
26786         njumps++;
26787       else
26788         continue;
26789
26790       while (njumps > 3)
26791         {
26792           start = NEXT_INSN (start);
26793           if ((JUMP_P (start)
26794                && GET_CODE (PATTERN (start)) != ADDR_VEC
26795                && GET_CODE (PATTERN (start)) != ADDR_DIFF_VEC)
26796               || CALL_P (start))
26797             njumps--, isjump = 1;
26798           else
26799             isjump = 0;
26800           nbytes -= min_insn_size (start);
26801         }
26802       gcc_assert (njumps >= 0);
26803       if (dump_file)
26804         fprintf (dump_file, "Interval %i to %i has %i bytes\n",
26805                 INSN_UID (start), INSN_UID (insn), nbytes);
26806
26807       if (njumps == 3 && isjump && nbytes < 16)
26808         {
26809           int padsize = 15 - nbytes + min_insn_size (insn);
26810
26811           if (dump_file)
26812             fprintf (dump_file, "Padding insn %i by %i bytes!\n",
26813                      INSN_UID (insn), padsize);
26814           emit_insn_before (gen_align (GEN_INT (padsize)), insn);
26815         }
26816     }
26817 }
26818
26819 /* AMD Athlon works faster
26820    when RET is not destination of conditional jump or directly preceded
26821    by other jump instruction.  We avoid the penalty by inserting NOP just
26822    before the RET instructions in such cases.  */
26823 static void
26824 ix86_pad_returns (void)
26825 {
26826   edge e;
26827   edge_iterator ei;
26828
26829   FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
26830     {
26831       basic_block bb = e->src;
26832       rtx ret = BB_END (bb);
26833       rtx prev;
26834       bool replace = false;
26835
26836       if (!JUMP_P (ret) || GET_CODE (PATTERN (ret)) != RETURN
26837           || optimize_bb_for_size_p (bb))
26838         continue;
26839       for (prev = PREV_INSN (ret); prev; prev = PREV_INSN (prev))
26840         if (active_insn_p (prev) || LABEL_P (prev))
26841           break;
26842       if (prev && LABEL_P (prev))
26843         {
26844           edge e;
26845           edge_iterator ei;
26846
26847           FOR_EACH_EDGE (e, ei, bb->preds)
26848             if (EDGE_FREQUENCY (e) && e->src->index >= 0
26849                 && !(e->flags & EDGE_FALLTHRU))
26850               replace = true;
26851         }
26852       if (!replace)
26853         {
26854           prev = prev_active_insn (ret);
26855           if (prev
26856               && ((JUMP_P (prev) && any_condjump_p (prev))
26857                   || CALL_P (prev)))
26858             replace = true;
26859           /* Empty functions get branch mispredict even when the jump destination
26860              is not visible to us.  */
26861           if (!prev && cfun->function_frequency > FUNCTION_FREQUENCY_UNLIKELY_EXECUTED)
26862             replace = true;
26863         }
26864       if (replace)
26865         {
26866           emit_insn_before (gen_return_internal_long (), ret);
26867           delete_insn (ret);
26868         }
26869     }
26870 }
26871
26872 /* Implement machine specific optimizations.  We implement padding of returns
26873    for K8 CPUs and pass to avoid 4 jumps in the single 16 byte window.  */
26874 static void
26875 ix86_reorg (void)
26876 {
26877   if (TARGET_PAD_RETURNS && optimize
26878       && optimize_function_for_speed_p (cfun))
26879     ix86_pad_returns ();
26880   if (TARGET_FOUR_JUMP_LIMIT && optimize
26881       && optimize_function_for_speed_p (cfun))
26882     ix86_avoid_jump_misspredicts ();
26883 }
26884
26885 /* Return nonzero when QImode register that must be represented via REX prefix
26886    is used.  */
26887 bool
26888 x86_extended_QIreg_mentioned_p (rtx insn)
26889 {
26890   int i;
26891   extract_insn_cached (insn);
26892   for (i = 0; i < recog_data.n_operands; i++)
26893     if (REG_P (recog_data.operand[i])
26894         && REGNO (recog_data.operand[i]) > BX_REG)
26895        return true;
26896   return false;
26897 }
26898
26899 /* Return nonzero when P points to register encoded via REX prefix.
26900    Called via for_each_rtx.  */
26901 static int
26902 extended_reg_mentioned_1 (rtx *p, void *data ATTRIBUTE_UNUSED)
26903 {
26904    unsigned int regno;
26905    if (!REG_P (*p))
26906      return 0;
26907    regno = REGNO (*p);
26908    return REX_INT_REGNO_P (regno) || REX_SSE_REGNO_P (regno);
26909 }
26910
26911 /* Return true when INSN mentions register that must be encoded using REX
26912    prefix.  */
26913 bool
26914 x86_extended_reg_mentioned_p (rtx insn)
26915 {
26916   return for_each_rtx (INSN_P (insn) ? &PATTERN (insn) : &insn,
26917                        extended_reg_mentioned_1, NULL);
26918 }
26919
26920 /* Generate an unsigned DImode/SImode to FP conversion.  This is the same code
26921    optabs would emit if we didn't have TFmode patterns.  */
26922
26923 void
26924 x86_emit_floatuns (rtx operands[2])
26925 {
26926   rtx neglab, donelab, i0, i1, f0, in, out;
26927   enum machine_mode mode, inmode;
26928
26929   inmode = GET_MODE (operands[1]);
26930   gcc_assert (inmode == SImode || inmode == DImode);
26931
26932   out = operands[0];
26933   in = force_reg (inmode, operands[1]);
26934   mode = GET_MODE (out);
26935   neglab = gen_label_rtx ();
26936   donelab = gen_label_rtx ();
26937   f0 = gen_reg_rtx (mode);
26938
26939   emit_cmp_and_jump_insns (in, const0_rtx, LT, const0_rtx, inmode, 0, neglab);
26940
26941   expand_float (out, in, 0);
26942
26943   emit_jump_insn (gen_jump (donelab));
26944   emit_barrier ();
26945
26946   emit_label (neglab);
26947
26948   i0 = expand_simple_binop (inmode, LSHIFTRT, in, const1_rtx, NULL,
26949                             1, OPTAB_DIRECT);
26950   i1 = expand_simple_binop (inmode, AND, in, const1_rtx, NULL,
26951                             1, OPTAB_DIRECT);
26952   i0 = expand_simple_binop (inmode, IOR, i0, i1, i0, 1, OPTAB_DIRECT);
26953
26954   expand_float (f0, i0, 0);
26955
26956   emit_insn (gen_rtx_SET (VOIDmode, out, gen_rtx_PLUS (mode, f0, f0)));
26957
26958   emit_label (donelab);
26959 }
26960 \f
26961 /* A subroutine of ix86_expand_vector_init.  Store into TARGET a vector
26962    with all elements equal to VAR.  Return true if successful.  */
26963
26964 static bool
26965 ix86_expand_vector_init_duplicate (bool mmx_ok, enum machine_mode mode,
26966                                    rtx target, rtx val)
26967 {
26968   enum machine_mode hmode, smode, wsmode, wvmode;
26969   rtx x;
26970
26971   switch (mode)
26972     {
26973     case V2SImode:
26974     case V2SFmode:
26975       if (!mmx_ok)
26976         return false;
26977       /* FALLTHRU */
26978
26979     case V2DFmode:
26980     case V2DImode:
26981     case V4SFmode:
26982     case V4SImode:
26983       val = force_reg (GET_MODE_INNER (mode), val);
26984       x = gen_rtx_VEC_DUPLICATE (mode, val);
26985       emit_insn (gen_rtx_SET (VOIDmode, target, x));
26986       return true;
26987
26988     case V4HImode:
26989       if (!mmx_ok)
26990         return false;
26991       if (TARGET_SSE || TARGET_3DNOW_A)
26992         {
26993           val = gen_lowpart (SImode, val);
26994           x = gen_rtx_TRUNCATE (HImode, val);
26995           x = gen_rtx_VEC_DUPLICATE (mode, x);
26996           emit_insn (gen_rtx_SET (VOIDmode, target, x));
26997           return true;
26998         }
26999       else
27000         {
27001           smode = HImode;
27002           wsmode = SImode;
27003           wvmode = V2SImode;
27004           goto widen;
27005         }
27006
27007     case V8QImode:
27008       if (!mmx_ok)
27009         return false;
27010       smode = QImode;
27011       wsmode = HImode;
27012       wvmode = V4HImode;
27013       goto widen;
27014     case V8HImode:
27015       if (TARGET_SSE2)
27016         {
27017           rtx tmp1, tmp2;
27018           /* Extend HImode to SImode using a paradoxical SUBREG.  */
27019           tmp1 = gen_reg_rtx (SImode);
27020           emit_move_insn (tmp1, gen_lowpart (SImode, val));
27021           /* Insert the SImode value as low element of V4SImode vector. */
27022           tmp2 = gen_reg_rtx (V4SImode);
27023           tmp1 = gen_rtx_VEC_MERGE (V4SImode,
27024                                     gen_rtx_VEC_DUPLICATE (V4SImode, tmp1),
27025                                     CONST0_RTX (V4SImode),
27026                                     const1_rtx);
27027           emit_insn (gen_rtx_SET (VOIDmode, tmp2, tmp1));
27028           /* Cast the V4SImode vector back to a V8HImode vector.  */
27029           tmp1 = gen_reg_rtx (V8HImode);
27030           emit_move_insn (tmp1, gen_lowpart (V8HImode, tmp2));
27031           /* Duplicate the low short through the whole low SImode word.  */
27032           emit_insn (gen_sse2_punpcklwd (tmp1, tmp1, tmp1));
27033           /* Cast the V8HImode vector back to a V4SImode vector.  */
27034           tmp2 = gen_reg_rtx (V4SImode);
27035           emit_move_insn (tmp2, gen_lowpart (V4SImode, tmp1));
27036           /* Replicate the low element of the V4SImode vector.  */
27037           emit_insn (gen_sse2_pshufd (tmp2, tmp2, const0_rtx));
27038           /* Cast the V2SImode back to V8HImode, and store in target.  */
27039           emit_move_insn (target, gen_lowpart (V8HImode, tmp2));
27040           return true;
27041         }
27042       smode = HImode;
27043       wsmode = SImode;
27044       wvmode = V4SImode;
27045       goto widen;
27046     case V16QImode:
27047       if (TARGET_SSE2)
27048         {
27049           rtx tmp1, tmp2;
27050           /* Extend QImode to SImode using a paradoxical SUBREG.  */
27051           tmp1 = gen_reg_rtx (SImode);
27052           emit_move_insn (tmp1, gen_lowpart (SImode, val));
27053           /* Insert the SImode value as low element of V4SImode vector. */
27054           tmp2 = gen_reg_rtx (V4SImode);
27055           tmp1 = gen_rtx_VEC_MERGE (V4SImode,
27056                                     gen_rtx_VEC_DUPLICATE (V4SImode, tmp1),
27057                                     CONST0_RTX (V4SImode),
27058                                     const1_rtx);
27059           emit_insn (gen_rtx_SET (VOIDmode, tmp2, tmp1));
27060           /* Cast the V4SImode vector back to a V16QImode vector.  */
27061           tmp1 = gen_reg_rtx (V16QImode);
27062           emit_move_insn (tmp1, gen_lowpart (V16QImode, tmp2));
27063           /* Duplicate the low byte through the whole low SImode word.  */
27064           emit_insn (gen_sse2_punpcklbw (tmp1, tmp1, tmp1));
27065           emit_insn (gen_sse2_punpcklbw (tmp1, tmp1, tmp1));
27066           /* Cast the V16QImode vector back to a V4SImode vector.  */
27067           tmp2 = gen_reg_rtx (V4SImode);
27068           emit_move_insn (tmp2, gen_lowpart (V4SImode, tmp1));
27069           /* Replicate the low element of the V4SImode vector.  */
27070           emit_insn (gen_sse2_pshufd (tmp2, tmp2, const0_rtx));
27071           /* Cast the V2SImode back to V16QImode, and store in target.  */
27072           emit_move_insn (target, gen_lowpart (V16QImode, tmp2));
27073           return true;
27074         }
27075       smode = QImode;
27076       wsmode = HImode;
27077       wvmode = V8HImode;
27078       goto widen;
27079     widen:
27080       /* Replicate the value once into the next wider mode and recurse.  */
27081       val = convert_modes (wsmode, smode, val, true);
27082       x = expand_simple_binop (wsmode, ASHIFT, val,
27083                                GEN_INT (GET_MODE_BITSIZE (smode)),
27084                                NULL_RTX, 1, OPTAB_LIB_WIDEN);
27085       val = expand_simple_binop (wsmode, IOR, val, x, x, 1, OPTAB_LIB_WIDEN);
27086
27087       x = gen_reg_rtx (wvmode);
27088       if (!ix86_expand_vector_init_duplicate (mmx_ok, wvmode, x, val))
27089         gcc_unreachable ();
27090       emit_move_insn (target, gen_lowpart (mode, x));
27091       return true;
27092
27093     case V4DFmode:
27094       hmode = V2DFmode;
27095       goto half;
27096     case V4DImode:
27097       hmode = V2DImode;
27098       goto half;
27099     case V8SFmode:
27100       hmode = V4SFmode;
27101       goto half;
27102     case V8SImode:
27103       hmode = V4SImode;
27104       goto half;
27105     case V16HImode:
27106       hmode = V8HImode;
27107       goto half;
27108     case V32QImode:
27109       hmode = V16QImode;
27110       goto half;
27111 half:
27112       {
27113         rtx tmp = gen_reg_rtx (hmode);
27114         ix86_expand_vector_init_duplicate (mmx_ok, hmode, tmp, val);
27115         emit_insn (gen_rtx_SET (VOIDmode, target,
27116                                 gen_rtx_VEC_CONCAT (mode, tmp, tmp)));
27117       }
27118       return true;
27119
27120     default:
27121       return false;
27122     }
27123 }
27124
27125 /* A subroutine of ix86_expand_vector_init.  Store into TARGET a vector
27126    whose ONE_VAR element is VAR, and other elements are zero.  Return true
27127    if successful.  */
27128
27129 static bool
27130 ix86_expand_vector_init_one_nonzero (bool mmx_ok, enum machine_mode mode,
27131                                      rtx target, rtx var, int one_var)
27132 {
27133   enum machine_mode vsimode;
27134   rtx new_target;
27135   rtx x, tmp;
27136   bool use_vector_set = false;
27137
27138   switch (mode)
27139     {
27140     case V2DImode:
27141       /* For SSE4.1, we normally use vector set.  But if the second
27142          element is zero and inter-unit moves are OK, we use movq
27143          instead.  */
27144       use_vector_set = (TARGET_64BIT
27145                         && TARGET_SSE4_1
27146                         && !(TARGET_INTER_UNIT_MOVES
27147                              && one_var == 0));
27148       break;
27149     case V16QImode:
27150     case V4SImode:
27151     case V4SFmode:
27152       use_vector_set = TARGET_SSE4_1;
27153       break;
27154     case V8HImode:
27155       use_vector_set = TARGET_SSE2;
27156       break;
27157     case V4HImode:
27158       use_vector_set = TARGET_SSE || TARGET_3DNOW_A;
27159       break;
27160     case V32QImode:
27161     case V16HImode:
27162     case V8SImode:
27163     case V8SFmode:
27164     case V4DFmode:
27165       use_vector_set = TARGET_AVX;
27166       break;
27167     case V4DImode:
27168       /* Use ix86_expand_vector_set in 64bit mode only.  */
27169       use_vector_set = TARGET_AVX && TARGET_64BIT;
27170       break;
27171     default:
27172       break;
27173     }
27174
27175   if (use_vector_set)
27176     {
27177       emit_insn (gen_rtx_SET (VOIDmode, target, CONST0_RTX (mode)));
27178       var = force_reg (GET_MODE_INNER (mode), var);
27179       ix86_expand_vector_set (mmx_ok, target, var, one_var);
27180       return true; 
27181     }
27182
27183   switch (mode)
27184     {
27185     case V2SFmode:
27186     case V2SImode:
27187       if (!mmx_ok)
27188         return false;
27189       /* FALLTHRU */
27190
27191     case V2DFmode:
27192     case V2DImode:
27193       if (one_var != 0)
27194         return false;
27195       var = force_reg (GET_MODE_INNER (mode), var);
27196       x = gen_rtx_VEC_CONCAT (mode, var, CONST0_RTX (GET_MODE_INNER (mode)));
27197       emit_insn (gen_rtx_SET (VOIDmode, target, x));
27198       return true;
27199
27200     case V4SFmode:
27201     case V4SImode:
27202       if (!REG_P (target) || REGNO (target) < FIRST_PSEUDO_REGISTER)
27203         new_target = gen_reg_rtx (mode);
27204       else
27205         new_target = target;
27206       var = force_reg (GET_MODE_INNER (mode), var);
27207       x = gen_rtx_VEC_DUPLICATE (mode, var);
27208       x = gen_rtx_VEC_MERGE (mode, x, CONST0_RTX (mode), const1_rtx);
27209       emit_insn (gen_rtx_SET (VOIDmode, new_target, x));
27210       if (one_var != 0)
27211         {
27212           /* We need to shuffle the value to the correct position, so
27213              create a new pseudo to store the intermediate result.  */
27214
27215           /* With SSE2, we can use the integer shuffle insns.  */
27216           if (mode != V4SFmode && TARGET_SSE2)
27217             {
27218               emit_insn (gen_sse2_pshufd_1 (new_target, new_target,
27219                                             GEN_INT (1),
27220                                             GEN_INT (one_var == 1 ? 0 : 1),
27221                                             GEN_INT (one_var == 2 ? 0 : 1),
27222                                             GEN_INT (one_var == 3 ? 0 : 1)));
27223               if (target != new_target)
27224                 emit_move_insn (target, new_target);
27225               return true;
27226             }
27227
27228           /* Otherwise convert the intermediate result to V4SFmode and
27229              use the SSE1 shuffle instructions.  */
27230           if (mode != V4SFmode)
27231             {
27232               tmp = gen_reg_rtx (V4SFmode);
27233               emit_move_insn (tmp, gen_lowpart (V4SFmode, new_target));
27234             }
27235           else
27236             tmp = new_target;
27237
27238           emit_insn (gen_sse_shufps_v4sf (tmp, tmp, tmp,
27239                                        GEN_INT (1),
27240                                        GEN_INT (one_var == 1 ? 0 : 1),
27241                                        GEN_INT (one_var == 2 ? 0+4 : 1+4),
27242                                        GEN_INT (one_var == 3 ? 0+4 : 1+4)));
27243
27244           if (mode != V4SFmode)
27245             emit_move_insn (target, gen_lowpart (V4SImode, tmp));
27246           else if (tmp != target)
27247             emit_move_insn (target, tmp);
27248         }
27249       else if (target != new_target)
27250         emit_move_insn (target, new_target);
27251       return true;
27252
27253     case V8HImode:
27254     case V16QImode:
27255       vsimode = V4SImode;
27256       goto widen;
27257     case V4HImode:
27258     case V8QImode:
27259       if (!mmx_ok)
27260         return false;
27261       vsimode = V2SImode;
27262       goto widen;
27263     widen:
27264       if (one_var != 0)
27265         return false;
27266
27267       /* Zero extend the variable element to SImode and recurse.  */
27268       var = convert_modes (SImode, GET_MODE_INNER (mode), var, true);
27269
27270       x = gen_reg_rtx (vsimode);
27271       if (!ix86_expand_vector_init_one_nonzero (mmx_ok, vsimode, x,
27272                                                 var, one_var))
27273         gcc_unreachable ();
27274
27275       emit_move_insn (target, gen_lowpart (mode, x));
27276       return true;
27277
27278     default:
27279       return false;
27280     }
27281 }
27282
27283 /* A subroutine of ix86_expand_vector_init.  Store into TARGET a vector
27284    consisting of the values in VALS.  It is known that all elements
27285    except ONE_VAR are constants.  Return true if successful.  */
27286
27287 static bool
27288 ix86_expand_vector_init_one_var (bool mmx_ok, enum machine_mode mode,
27289                                  rtx target, rtx vals, int one_var)
27290 {
27291   rtx var = XVECEXP (vals, 0, one_var);
27292   enum machine_mode wmode;
27293   rtx const_vec, x;
27294
27295   const_vec = copy_rtx (vals);
27296   XVECEXP (const_vec, 0, one_var) = CONST0_RTX (GET_MODE_INNER (mode));
27297   const_vec = gen_rtx_CONST_VECTOR (mode, XVEC (const_vec, 0));
27298
27299   switch (mode)
27300     {
27301     case V2DFmode:
27302     case V2DImode:
27303     case V2SFmode:
27304     case V2SImode:
27305       /* For the two element vectors, it's just as easy to use
27306          the general case.  */
27307       return false;
27308
27309     case V4DImode:
27310       /* Use ix86_expand_vector_set in 64bit mode only.  */
27311       if (!TARGET_64BIT)
27312         return false;
27313     case V4DFmode:
27314     case V8SFmode:
27315     case V8SImode:
27316     case V16HImode:
27317     case V32QImode:
27318     case V4SFmode:
27319     case V4SImode:
27320     case V8HImode:
27321     case V4HImode:
27322       break;
27323
27324     case V16QImode:
27325       if (TARGET_SSE4_1)
27326         break;
27327       wmode = V8HImode;
27328       goto widen;
27329     case V8QImode:
27330       wmode = V4HImode;
27331       goto widen;
27332     widen:
27333       /* There's no way to set one QImode entry easily.  Combine
27334          the variable value with its adjacent constant value, and
27335          promote to an HImode set.  */
27336       x = XVECEXP (vals, 0, one_var ^ 1);
27337       if (one_var & 1)
27338         {
27339           var = convert_modes (HImode, QImode, var, true);
27340           var = expand_simple_binop (HImode, ASHIFT, var, GEN_INT (8),
27341                                      NULL_RTX, 1, OPTAB_LIB_WIDEN);
27342           x = GEN_INT (INTVAL (x) & 0xff);
27343         }
27344       else
27345         {
27346           var = convert_modes (HImode, QImode, var, true);
27347           x = gen_int_mode (INTVAL (x) << 8, HImode);
27348         }
27349       if (x != const0_rtx)
27350         var = expand_simple_binop (HImode, IOR, var, x, var,
27351                                    1, OPTAB_LIB_WIDEN);
27352
27353       x = gen_reg_rtx (wmode);
27354       emit_move_insn (x, gen_lowpart (wmode, const_vec));
27355       ix86_expand_vector_set (mmx_ok, x, var, one_var >> 1);
27356
27357       emit_move_insn (target, gen_lowpart (mode, x));
27358       return true;
27359
27360     default:
27361       return false;
27362     }
27363
27364   emit_move_insn (target, const_vec);
27365   ix86_expand_vector_set (mmx_ok, target, var, one_var);
27366   return true;
27367 }
27368
27369 /* A subroutine of ix86_expand_vector_init_general.  Use vector
27370    concatenate to handle the most general case: all values variable,
27371    and none identical.  */
27372
27373 static void
27374 ix86_expand_vector_init_concat (enum machine_mode mode,
27375                                 rtx target, rtx *ops, int n)
27376 {
27377   enum machine_mode cmode, hmode = VOIDmode;
27378   rtx first[8], second[4];
27379   rtvec v;
27380   int i, j;
27381
27382   switch (n)
27383     {
27384     case 2:
27385       switch (mode)
27386         {
27387         case V8SImode:
27388           cmode = V4SImode;
27389           break;
27390         case V8SFmode:
27391           cmode = V4SFmode;
27392           break;
27393         case V4DImode:
27394           cmode = V2DImode;
27395           break;
27396         case V4DFmode:
27397           cmode = V2DFmode;
27398           break;
27399         case V4SImode:
27400           cmode = V2SImode;
27401           break;
27402         case V4SFmode:
27403           cmode = V2SFmode;
27404           break;
27405         case V2DImode:
27406           cmode = DImode;
27407           break;
27408         case V2SImode:
27409           cmode = SImode;
27410           break;
27411         case V2DFmode:
27412           cmode = DFmode;
27413           break;
27414         case V2SFmode:
27415           cmode = SFmode;
27416           break;
27417         default:
27418           gcc_unreachable ();
27419         }
27420
27421       if (!register_operand (ops[1], cmode))
27422         ops[1] = force_reg (cmode, ops[1]);
27423       if (!register_operand (ops[0], cmode))
27424         ops[0] = force_reg (cmode, ops[0]);
27425       emit_insn (gen_rtx_SET (VOIDmode, target,
27426                               gen_rtx_VEC_CONCAT (mode, ops[0],
27427                                                   ops[1])));
27428       break;
27429
27430     case 4:
27431       switch (mode)
27432         {
27433         case V4DImode:
27434           cmode = V2DImode;
27435           break;
27436         case V4DFmode:
27437           cmode = V2DFmode;
27438           break;
27439         case V4SImode:
27440           cmode = V2SImode;
27441           break;
27442         case V4SFmode:
27443           cmode = V2SFmode;
27444           break;
27445         default:
27446           gcc_unreachable ();
27447         }
27448       goto half;
27449
27450     case 8:
27451       switch (mode)
27452         {
27453         case V8SImode:
27454           cmode = V2SImode;
27455           hmode = V4SImode;
27456           break;
27457         case V8SFmode:
27458           cmode = V2SFmode;
27459           hmode = V4SFmode;
27460           break;
27461         default:
27462           gcc_unreachable ();
27463         }
27464       goto half;
27465
27466 half:
27467       /* FIXME: We process inputs backward to help RA.  PR 36222.  */
27468       i = n - 1;
27469       j = (n >> 1) - 1;
27470       for (; i > 0; i -= 2, j--)
27471         {
27472           first[j] = gen_reg_rtx (cmode);
27473           v = gen_rtvec (2, ops[i - 1], ops[i]);
27474           ix86_expand_vector_init (false, first[j],
27475                                    gen_rtx_PARALLEL (cmode, v));
27476         }
27477
27478       n >>= 1;
27479       if (n > 2)
27480         {
27481           gcc_assert (hmode != VOIDmode);
27482           for (i = j = 0; i < n; i += 2, j++)
27483             {
27484               second[j] = gen_reg_rtx (hmode);
27485               ix86_expand_vector_init_concat (hmode, second [j],
27486                                               &first [i], 2);
27487             }
27488           n >>= 1;
27489           ix86_expand_vector_init_concat (mode, target, second, n);
27490         }
27491       else
27492         ix86_expand_vector_init_concat (mode, target, first, n);
27493       break;
27494
27495     default:
27496       gcc_unreachable ();
27497     }
27498 }
27499
27500 /* A subroutine of ix86_expand_vector_init_general.  Use vector
27501    interleave to handle the most general case: all values variable,
27502    and none identical.  */
27503
27504 static void
27505 ix86_expand_vector_init_interleave (enum machine_mode mode,
27506                                     rtx target, rtx *ops, int n)
27507 {
27508   enum machine_mode first_imode, second_imode, third_imode, inner_mode;
27509   int i, j;
27510   rtx op0, op1;
27511   rtx (*gen_load_even) (rtx, rtx, rtx);
27512   rtx (*gen_interleave_first_low) (rtx, rtx, rtx);
27513   rtx (*gen_interleave_second_low) (rtx, rtx, rtx);
27514   
27515   switch (mode)
27516     {
27517     case V8HImode:
27518       gen_load_even = gen_vec_setv8hi;
27519       gen_interleave_first_low = gen_vec_interleave_lowv4si;
27520       gen_interleave_second_low = gen_vec_interleave_lowv2di;
27521       inner_mode = HImode;
27522       first_imode = V4SImode;
27523       second_imode = V2DImode;
27524       third_imode = VOIDmode;
27525       break;
27526     case V16QImode:
27527       gen_load_even = gen_vec_setv16qi;
27528       gen_interleave_first_low = gen_vec_interleave_lowv8hi;
27529       gen_interleave_second_low = gen_vec_interleave_lowv4si;
27530       inner_mode = QImode;
27531       first_imode = V8HImode;
27532       second_imode = V4SImode;
27533       third_imode = V2DImode;
27534       break;
27535     default:
27536       gcc_unreachable ();
27537     }
27538      
27539   for (i = 0; i < n; i++)
27540     {
27541       /* Extend the odd elment to SImode using a paradoxical SUBREG.  */
27542       op0 = gen_reg_rtx (SImode);
27543       emit_move_insn (op0, gen_lowpart (SImode, ops [i + i]));
27544
27545       /* Insert the SImode value as low element of V4SImode vector. */
27546       op1 = gen_reg_rtx (V4SImode);
27547       op0 = gen_rtx_VEC_MERGE (V4SImode,
27548                                gen_rtx_VEC_DUPLICATE (V4SImode,
27549                                                       op0),
27550                                CONST0_RTX (V4SImode),
27551                                const1_rtx);
27552       emit_insn (gen_rtx_SET (VOIDmode, op1, op0));
27553
27554       /* Cast the V4SImode vector back to a vector in orignal mode.  */
27555       op0 = gen_reg_rtx (mode);
27556       emit_move_insn (op0, gen_lowpart (mode, op1));
27557       
27558       /* Load even elements into the second positon.  */
27559       emit_insn ((*gen_load_even) (op0,
27560                                    force_reg (inner_mode,
27561                                               ops [i + i + 1]),
27562                                    const1_rtx));
27563
27564       /* Cast vector to FIRST_IMODE vector.  */
27565       ops[i] = gen_reg_rtx (first_imode);
27566       emit_move_insn (ops[i], gen_lowpart (first_imode, op0));
27567     }
27568
27569   /* Interleave low FIRST_IMODE vectors.  */
27570   for (i = j = 0; i < n; i += 2, j++)
27571     {
27572       op0 = gen_reg_rtx (first_imode);
27573       emit_insn ((*gen_interleave_first_low) (op0, ops[i], ops[i + 1]));
27574
27575       /* Cast FIRST_IMODE vector to SECOND_IMODE vector.  */
27576       ops[j] = gen_reg_rtx (second_imode);
27577       emit_move_insn (ops[j], gen_lowpart (second_imode, op0));
27578     }
27579
27580   /* Interleave low SECOND_IMODE vectors.  */
27581   switch (second_imode)
27582     {
27583     case V4SImode:
27584       for (i = j = 0; i < n / 2; i += 2, j++)
27585         {
27586           op0 = gen_reg_rtx (second_imode);
27587           emit_insn ((*gen_interleave_second_low) (op0, ops[i],
27588                                                    ops[i + 1]));
27589
27590           /* Cast the SECOND_IMODE vector to the THIRD_IMODE
27591              vector.  */
27592           ops[j] = gen_reg_rtx (third_imode);
27593           emit_move_insn (ops[j], gen_lowpart (third_imode, op0));
27594         }
27595       second_imode = V2DImode;
27596       gen_interleave_second_low = gen_vec_interleave_lowv2di;
27597       /* FALLTHRU */
27598
27599     case V2DImode:
27600       op0 = gen_reg_rtx (second_imode);
27601       emit_insn ((*gen_interleave_second_low) (op0, ops[0],
27602                                                ops[1]));
27603
27604       /* Cast the SECOND_IMODE vector back to a vector on original
27605          mode.  */
27606       emit_insn (gen_rtx_SET (VOIDmode, target,
27607                               gen_lowpart (mode, op0)));
27608       break;
27609
27610     default:
27611       gcc_unreachable ();
27612     }
27613 }
27614
27615 /* A subroutine of ix86_expand_vector_init.  Handle the most general case:
27616    all values variable, and none identical.  */
27617
27618 static void
27619 ix86_expand_vector_init_general (bool mmx_ok, enum machine_mode mode,
27620                                  rtx target, rtx vals)
27621 {
27622   rtx ops[32], op0, op1;
27623   enum machine_mode half_mode = VOIDmode;
27624   int n, i;
27625
27626   switch (mode)
27627     {
27628     case V2SFmode:
27629     case V2SImode:
27630       if (!mmx_ok && !TARGET_SSE)
27631         break;
27632       /* FALLTHRU */
27633
27634     case V8SFmode:
27635     case V8SImode:
27636     case V4DFmode:
27637     case V4DImode:
27638     case V4SFmode:
27639     case V4SImode:
27640     case V2DFmode:
27641     case V2DImode:
27642       n = GET_MODE_NUNITS (mode);
27643       for (i = 0; i < n; i++)
27644         ops[i] = XVECEXP (vals, 0, i);
27645       ix86_expand_vector_init_concat (mode, target, ops, n);
27646       return;
27647
27648     case V32QImode:
27649       half_mode = V16QImode;
27650       goto half;
27651
27652     case V16HImode:
27653       half_mode = V8HImode;
27654       goto half;
27655
27656 half:
27657       n = GET_MODE_NUNITS (mode);
27658       for (i = 0; i < n; i++)
27659         ops[i] = XVECEXP (vals, 0, i);
27660       op0 = gen_reg_rtx (half_mode);
27661       op1 = gen_reg_rtx (half_mode);
27662       ix86_expand_vector_init_interleave (half_mode, op0, ops,
27663                                           n >> 2);
27664       ix86_expand_vector_init_interleave (half_mode, op1,
27665                                           &ops [n >> 1], n >> 2);
27666       emit_insn (gen_rtx_SET (VOIDmode, target,
27667                               gen_rtx_VEC_CONCAT (mode, op0, op1)));
27668       return;
27669
27670     case V16QImode:
27671       if (!TARGET_SSE4_1)
27672         break;
27673       /* FALLTHRU */
27674
27675     case V8HImode:
27676       if (!TARGET_SSE2)
27677         break;
27678
27679       /* Don't use ix86_expand_vector_init_interleave if we can't
27680          move from GPR to SSE register directly.  */ 
27681       if (!TARGET_INTER_UNIT_MOVES)
27682         break;
27683
27684       n = GET_MODE_NUNITS (mode);
27685       for (i = 0; i < n; i++)
27686         ops[i] = XVECEXP (vals, 0, i);
27687       ix86_expand_vector_init_interleave (mode, target, ops, n >> 1);
27688       return;
27689
27690     case V4HImode:
27691     case V8QImode:
27692       break;
27693
27694     default:
27695       gcc_unreachable ();
27696     }
27697
27698     {
27699       int i, j, n_elts, n_words, n_elt_per_word;
27700       enum machine_mode inner_mode;
27701       rtx words[4], shift;
27702
27703       inner_mode = GET_MODE_INNER (mode);
27704       n_elts = GET_MODE_NUNITS (mode);
27705       n_words = GET_MODE_SIZE (mode) / UNITS_PER_WORD;
27706       n_elt_per_word = n_elts / n_words;
27707       shift = GEN_INT (GET_MODE_BITSIZE (inner_mode));
27708
27709       for (i = 0; i < n_words; ++i)
27710         {
27711           rtx word = NULL_RTX;
27712
27713           for (j = 0; j < n_elt_per_word; ++j)
27714             {
27715               rtx elt = XVECEXP (vals, 0, (i+1)*n_elt_per_word - j - 1);
27716               elt = convert_modes (word_mode, inner_mode, elt, true);
27717
27718               if (j == 0)
27719                 word = elt;
27720               else
27721                 {
27722                   word = expand_simple_binop (word_mode, ASHIFT, word, shift,
27723                                               word, 1, OPTAB_LIB_WIDEN);
27724                   word = expand_simple_binop (word_mode, IOR, word, elt,
27725                                               word, 1, OPTAB_LIB_WIDEN);
27726                 }
27727             }
27728
27729           words[i] = word;
27730         }
27731
27732       if (n_words == 1)
27733         emit_move_insn (target, gen_lowpart (mode, words[0]));
27734       else if (n_words == 2)
27735         {
27736           rtx tmp = gen_reg_rtx (mode);
27737           emit_clobber (tmp);
27738           emit_move_insn (gen_lowpart (word_mode, tmp), words[0]);
27739           emit_move_insn (gen_highpart (word_mode, tmp), words[1]);
27740           emit_move_insn (target, tmp);
27741         }
27742       else if (n_words == 4)
27743         {
27744           rtx tmp = gen_reg_rtx (V4SImode);
27745           gcc_assert (word_mode == SImode);
27746           vals = gen_rtx_PARALLEL (V4SImode, gen_rtvec_v (4, words));
27747           ix86_expand_vector_init_general (false, V4SImode, tmp, vals);
27748           emit_move_insn (target, gen_lowpart (mode, tmp));
27749         }
27750       else
27751         gcc_unreachable ();
27752     }
27753 }
27754
27755 /* Initialize vector TARGET via VALS.  Suppress the use of MMX
27756    instructions unless MMX_OK is true.  */
27757
27758 void
27759 ix86_expand_vector_init (bool mmx_ok, rtx target, rtx vals)
27760 {
27761   enum machine_mode mode = GET_MODE (target);
27762   enum machine_mode inner_mode = GET_MODE_INNER (mode);
27763   int n_elts = GET_MODE_NUNITS (mode);
27764   int n_var = 0, one_var = -1;
27765   bool all_same = true, all_const_zero = true;
27766   int i;
27767   rtx x;
27768
27769   for (i = 0; i < n_elts; ++i)
27770     {
27771       x = XVECEXP (vals, 0, i);
27772       if (!(CONST_INT_P (x)
27773             || GET_CODE (x) == CONST_DOUBLE
27774             || GET_CODE (x) == CONST_FIXED))
27775         n_var++, one_var = i;
27776       else if (x != CONST0_RTX (inner_mode))
27777         all_const_zero = false;
27778       if (i > 0 && !rtx_equal_p (x, XVECEXP (vals, 0, 0)))
27779         all_same = false;
27780     }
27781
27782   /* Constants are best loaded from the constant pool.  */
27783   if (n_var == 0)
27784     {
27785       emit_move_insn (target, gen_rtx_CONST_VECTOR (mode, XVEC (vals, 0)));
27786       return;
27787     }
27788
27789   /* If all values are identical, broadcast the value.  */
27790   if (all_same
27791       && ix86_expand_vector_init_duplicate (mmx_ok, mode, target,
27792                                             XVECEXP (vals, 0, 0)))
27793     return;
27794
27795   /* Values where only one field is non-constant are best loaded from
27796      the pool and overwritten via move later.  */
27797   if (n_var == 1)
27798     {
27799       if (all_const_zero
27800           && ix86_expand_vector_init_one_nonzero (mmx_ok, mode, target,
27801                                                   XVECEXP (vals, 0, one_var),
27802                                                   one_var))
27803         return;
27804
27805       if (ix86_expand_vector_init_one_var (mmx_ok, mode, target, vals, one_var))
27806         return;
27807     }
27808
27809   ix86_expand_vector_init_general (mmx_ok, mode, target, vals);
27810 }
27811
27812 void
27813 ix86_expand_vector_set (bool mmx_ok, rtx target, rtx val, int elt)
27814 {
27815   enum machine_mode mode = GET_MODE (target);
27816   enum machine_mode inner_mode = GET_MODE_INNER (mode);
27817   enum machine_mode half_mode;
27818   bool use_vec_merge = false;
27819   rtx tmp;
27820   static rtx (*gen_extract[6][2]) (rtx, rtx)
27821     = {
27822         { gen_vec_extract_lo_v32qi, gen_vec_extract_hi_v32qi },
27823         { gen_vec_extract_lo_v16hi, gen_vec_extract_hi_v16hi },
27824         { gen_vec_extract_lo_v8si, gen_vec_extract_hi_v8si },
27825         { gen_vec_extract_lo_v4di, gen_vec_extract_hi_v4di },
27826         { gen_vec_extract_lo_v8sf, gen_vec_extract_hi_v8sf },
27827         { gen_vec_extract_lo_v4df, gen_vec_extract_hi_v4df }
27828       };
27829   static rtx (*gen_insert[6][2]) (rtx, rtx, rtx)
27830     = {
27831         { gen_vec_set_lo_v32qi, gen_vec_set_hi_v32qi },
27832         { gen_vec_set_lo_v16hi, gen_vec_set_hi_v16hi },
27833         { gen_vec_set_lo_v8si, gen_vec_set_hi_v8si },
27834         { gen_vec_set_lo_v4di, gen_vec_set_hi_v4di },
27835         { gen_vec_set_lo_v8sf, gen_vec_set_hi_v8sf },
27836         { gen_vec_set_lo_v4df, gen_vec_set_hi_v4df }
27837       };
27838   int i, j, n;
27839
27840   switch (mode)
27841     {
27842     case V2SFmode:
27843     case V2SImode:
27844       if (mmx_ok)
27845         {
27846           tmp = gen_reg_rtx (GET_MODE_INNER (mode));
27847           ix86_expand_vector_extract (true, tmp, target, 1 - elt);
27848           if (elt == 0)
27849             tmp = gen_rtx_VEC_CONCAT (mode, tmp, val);
27850           else
27851             tmp = gen_rtx_VEC_CONCAT (mode, val, tmp);
27852           emit_insn (gen_rtx_SET (VOIDmode, target, tmp));
27853           return;
27854         }
27855       break;
27856
27857     case V2DImode:
27858       use_vec_merge = TARGET_SSE4_1;
27859       if (use_vec_merge)
27860         break;
27861
27862     case V2DFmode:
27863       {
27864         rtx op0, op1;
27865
27866         /* For the two element vectors, we implement a VEC_CONCAT with
27867            the extraction of the other element.  */
27868
27869         tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (1, GEN_INT (1 - elt)));
27870         tmp = gen_rtx_VEC_SELECT (inner_mode, target, tmp);
27871
27872         if (elt == 0)
27873           op0 = val, op1 = tmp;
27874         else
27875           op0 = tmp, op1 = val;
27876
27877         tmp = gen_rtx_VEC_CONCAT (mode, op0, op1);
27878         emit_insn (gen_rtx_SET (VOIDmode, target, tmp));
27879       }
27880       return;
27881
27882     case V4SFmode:
27883       use_vec_merge = TARGET_SSE4_1;
27884       if (use_vec_merge)
27885         break;
27886
27887       switch (elt)
27888         {
27889         case 0:
27890           use_vec_merge = true;
27891           break;
27892
27893         case 1:
27894           /* tmp = target = A B C D */
27895           tmp = copy_to_reg (target);
27896           /* target = A A B B */
27897           emit_insn (gen_sse_unpcklps (target, target, target));
27898           /* target = X A B B */
27899           ix86_expand_vector_set (false, target, val, 0);
27900           /* target = A X C D  */
27901           emit_insn (gen_sse_shufps_v4sf (target, target, tmp,
27902                                        GEN_INT (1), GEN_INT (0),
27903                                        GEN_INT (2+4), GEN_INT (3+4)));
27904           return;
27905
27906         case 2:
27907           /* tmp = target = A B C D */
27908           tmp = copy_to_reg (target);
27909           /* tmp = X B C D */
27910           ix86_expand_vector_set (false, tmp, val, 0);
27911           /* target = A B X D */
27912           emit_insn (gen_sse_shufps_v4sf (target, target, tmp,
27913                                        GEN_INT (0), GEN_INT (1),
27914                                        GEN_INT (0+4), GEN_INT (3+4)));
27915           return;
27916
27917         case 3:
27918           /* tmp = target = A B C D */
27919           tmp = copy_to_reg (target);
27920           /* tmp = X B C D */
27921           ix86_expand_vector_set (false, tmp, val, 0);
27922           /* target = A B X D */
27923           emit_insn (gen_sse_shufps_v4sf (target, target, tmp,
27924                                        GEN_INT (0), GEN_INT (1),
27925                                        GEN_INT (2+4), GEN_INT (0+4)));
27926           return;
27927
27928         default:
27929           gcc_unreachable ();
27930         }
27931       break;
27932
27933     case V4SImode:
27934       use_vec_merge = TARGET_SSE4_1;
27935       if (use_vec_merge)
27936         break;
27937
27938       /* Element 0 handled by vec_merge below.  */
27939       if (elt == 0)
27940         {
27941           use_vec_merge = true;
27942           break;
27943         }
27944
27945       if (TARGET_SSE2)
27946         {
27947           /* With SSE2, use integer shuffles to swap element 0 and ELT,
27948              store into element 0, then shuffle them back.  */
27949
27950           rtx order[4];
27951
27952           order[0] = GEN_INT (elt);
27953           order[1] = const1_rtx;
27954           order[2] = const2_rtx;
27955           order[3] = GEN_INT (3);
27956           order[elt] = const0_rtx;
27957
27958           emit_insn (gen_sse2_pshufd_1 (target, target, order[0],
27959                                         order[1], order[2], order[3]));
27960
27961           ix86_expand_vector_set (false, target, val, 0);
27962
27963           emit_insn (gen_sse2_pshufd_1 (target, target, order[0],
27964                                         order[1], order[2], order[3]));
27965         }
27966       else
27967         {
27968           /* For SSE1, we have to reuse the V4SF code.  */
27969           ix86_expand_vector_set (false, gen_lowpart (V4SFmode, target),
27970                                   gen_lowpart (SFmode, val), elt);
27971         }
27972       return;
27973
27974     case V8HImode:
27975       use_vec_merge = TARGET_SSE2;
27976       break;
27977     case V4HImode:
27978       use_vec_merge = mmx_ok && (TARGET_SSE || TARGET_3DNOW_A);
27979       break;
27980
27981     case V16QImode:
27982       use_vec_merge = TARGET_SSE4_1;
27983       break;
27984
27985     case V8QImode:
27986       break;
27987
27988     case V32QImode:
27989       half_mode = V16QImode;
27990       j = 0;
27991       n = 16;
27992       goto half;
27993
27994     case V16HImode:
27995       half_mode = V8HImode;
27996       j = 1;
27997       n = 8;
27998       goto half;
27999
28000     case V8SImode:
28001       half_mode = V4SImode;
28002       j = 2;
28003       n = 4;
28004       goto half;
28005
28006     case V4DImode:
28007       half_mode = V2DImode;
28008       j = 3;
28009       n = 2;
28010       goto half;
28011
28012     case V8SFmode:
28013       half_mode = V4SFmode;
28014       j = 4;
28015       n = 4;
28016       goto half;
28017
28018     case V4DFmode:
28019       half_mode = V2DFmode;
28020       j = 5;
28021       n = 2;
28022       goto half;
28023
28024 half:
28025       /* Compute offset.  */
28026       i = elt / n;
28027       elt %= n;
28028
28029       gcc_assert (i <= 1);
28030
28031       /* Extract the half.  */
28032       tmp = gen_reg_rtx (half_mode);
28033       emit_insn ((*gen_extract[j][i]) (tmp, target));
28034
28035       /* Put val in tmp at elt.  */
28036       ix86_expand_vector_set (false, tmp, val, elt);
28037
28038       /* Put it back.  */
28039       emit_insn ((*gen_insert[j][i]) (target, target, tmp));
28040       return;
28041
28042     default:
28043       break;
28044     }
28045
28046   if (use_vec_merge)
28047     {
28048       tmp = gen_rtx_VEC_DUPLICATE (mode, val);
28049       tmp = gen_rtx_VEC_MERGE (mode, tmp, target, GEN_INT (1 << elt));
28050       emit_insn (gen_rtx_SET (VOIDmode, target, tmp));
28051     }
28052   else
28053     {
28054       rtx mem = assign_stack_temp (mode, GET_MODE_SIZE (mode), false);
28055
28056       emit_move_insn (mem, target);
28057
28058       tmp = adjust_address (mem, inner_mode, elt*GET_MODE_SIZE (inner_mode));
28059       emit_move_insn (tmp, val);
28060
28061       emit_move_insn (target, mem);
28062     }
28063 }
28064
28065 void
28066 ix86_expand_vector_extract (bool mmx_ok, rtx target, rtx vec, int elt)
28067 {
28068   enum machine_mode mode = GET_MODE (vec);
28069   enum machine_mode inner_mode = GET_MODE_INNER (mode);
28070   bool use_vec_extr = false;
28071   rtx tmp;
28072
28073   switch (mode)
28074     {
28075     case V2SImode:
28076     case V2SFmode:
28077       if (!mmx_ok)
28078         break;
28079       /* FALLTHRU */
28080
28081     case V2DFmode:
28082     case V2DImode:
28083       use_vec_extr = true;
28084       break;
28085
28086     case V4SFmode:
28087       use_vec_extr = TARGET_SSE4_1;
28088       if (use_vec_extr)
28089         break;
28090
28091       switch (elt)
28092         {
28093         case 0:
28094           tmp = vec;
28095           break;
28096
28097         case 1:
28098         case 3:
28099           tmp = gen_reg_rtx (mode);
28100           emit_insn (gen_sse_shufps_v4sf (tmp, vec, vec,
28101                                        GEN_INT (elt), GEN_INT (elt),
28102                                        GEN_INT (elt+4), GEN_INT (elt+4)));
28103           break;
28104
28105         case 2:
28106           tmp = gen_reg_rtx (mode);
28107           emit_insn (gen_sse_unpckhps (tmp, vec, vec));
28108           break;
28109
28110         default:
28111           gcc_unreachable ();
28112         }
28113       vec = tmp;
28114       use_vec_extr = true;
28115       elt = 0;
28116       break;
28117
28118     case V4SImode:
28119       use_vec_extr = TARGET_SSE4_1;
28120       if (use_vec_extr)
28121         break;
28122
28123       if (TARGET_SSE2)
28124         {
28125           switch (elt)
28126             {
28127             case 0:
28128               tmp = vec;
28129               break;
28130
28131             case 1:
28132             case 3:
28133               tmp = gen_reg_rtx (mode);
28134               emit_insn (gen_sse2_pshufd_1 (tmp, vec,
28135                                             GEN_INT (elt), GEN_INT (elt),
28136                                             GEN_INT (elt), GEN_INT (elt)));
28137               break;
28138
28139             case 2:
28140               tmp = gen_reg_rtx (mode);
28141               emit_insn (gen_sse2_punpckhdq (tmp, vec, vec));
28142               break;
28143
28144             default:
28145               gcc_unreachable ();
28146             }
28147           vec = tmp;
28148           use_vec_extr = true;
28149           elt = 0;
28150         }
28151       else
28152         {
28153           /* For SSE1, we have to reuse the V4SF code.  */
28154           ix86_expand_vector_extract (false, gen_lowpart (SFmode, target),
28155                                       gen_lowpart (V4SFmode, vec), elt);
28156           return;
28157         }
28158       break;
28159
28160     case V8HImode:
28161       use_vec_extr = TARGET_SSE2;
28162       break;
28163     case V4HImode:
28164       use_vec_extr = mmx_ok && (TARGET_SSE || TARGET_3DNOW_A);
28165       break;
28166
28167     case V16QImode:
28168       use_vec_extr = TARGET_SSE4_1;
28169       break;
28170
28171     case V8QImode:
28172       /* ??? Could extract the appropriate HImode element and shift.  */
28173     default:
28174       break;
28175     }
28176
28177   if (use_vec_extr)
28178     {
28179       tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (1, GEN_INT (elt)));
28180       tmp = gen_rtx_VEC_SELECT (inner_mode, vec, tmp);
28181
28182       /* Let the rtl optimizers know about the zero extension performed.  */
28183       if (inner_mode == QImode || inner_mode == HImode)
28184         {
28185           tmp = gen_rtx_ZERO_EXTEND (SImode, tmp);
28186           target = gen_lowpart (SImode, target);
28187         }
28188
28189       emit_insn (gen_rtx_SET (VOIDmode, target, tmp));
28190     }
28191   else
28192     {
28193       rtx mem = assign_stack_temp (mode, GET_MODE_SIZE (mode), false);
28194
28195       emit_move_insn (mem, vec);
28196
28197       tmp = adjust_address (mem, inner_mode, elt*GET_MODE_SIZE (inner_mode));
28198       emit_move_insn (target, tmp);
28199     }
28200 }
28201
28202 /* Expand a vector reduction on V4SFmode for SSE1.  FN is the binary
28203    pattern to reduce; DEST is the destination; IN is the input vector.  */
28204
28205 void
28206 ix86_expand_reduc_v4sf (rtx (*fn) (rtx, rtx, rtx), rtx dest, rtx in)
28207 {
28208   rtx tmp1, tmp2, tmp3;
28209
28210   tmp1 = gen_reg_rtx (V4SFmode);
28211   tmp2 = gen_reg_rtx (V4SFmode);
28212   tmp3 = gen_reg_rtx (V4SFmode);
28213
28214   emit_insn (gen_sse_movhlps (tmp1, in, in));
28215   emit_insn (fn (tmp2, tmp1, in));
28216
28217   emit_insn (gen_sse_shufps_v4sf (tmp3, tmp2, tmp2,
28218                                GEN_INT (1), GEN_INT (1),
28219                                GEN_INT (1+4), GEN_INT (1+4)));
28220   emit_insn (fn (dest, tmp2, tmp3));
28221 }
28222 \f
28223 /* Target hook for scalar_mode_supported_p.  */
28224 static bool
28225 ix86_scalar_mode_supported_p (enum machine_mode mode)
28226 {
28227   if (DECIMAL_FLOAT_MODE_P (mode))
28228     return true;
28229   else if (mode == TFmode)
28230     return true;
28231   else
28232     return default_scalar_mode_supported_p (mode);
28233 }
28234
28235 /* Implements target hook vector_mode_supported_p.  */
28236 static bool
28237 ix86_vector_mode_supported_p (enum machine_mode mode)
28238 {
28239   if (TARGET_SSE && VALID_SSE_REG_MODE (mode))
28240     return true;
28241   if (TARGET_SSE2 && VALID_SSE2_REG_MODE (mode))
28242     return true;
28243   if (TARGET_AVX && VALID_AVX256_REG_MODE (mode))
28244     return true;
28245   if (TARGET_MMX && VALID_MMX_REG_MODE (mode))
28246     return true;
28247   if (TARGET_3DNOW && VALID_MMX_REG_MODE_3DNOW (mode))
28248     return true;
28249   return false;
28250 }
28251
28252 /* Target hook for c_mode_for_suffix.  */
28253 static enum machine_mode
28254 ix86_c_mode_for_suffix (char suffix)
28255 {
28256   if (suffix == 'q')
28257     return TFmode;
28258   if (suffix == 'w')
28259     return XFmode;
28260
28261   return VOIDmode;
28262 }
28263
28264 /* Worker function for TARGET_MD_ASM_CLOBBERS.
28265
28266    We do this in the new i386 backend to maintain source compatibility
28267    with the old cc0-based compiler.  */
28268
28269 static tree
28270 ix86_md_asm_clobbers (tree outputs ATTRIBUTE_UNUSED,
28271                       tree inputs ATTRIBUTE_UNUSED,
28272                       tree clobbers)
28273 {
28274   clobbers = tree_cons (NULL_TREE, build_string (5, "flags"),
28275                         clobbers);
28276   clobbers = tree_cons (NULL_TREE, build_string (4, "fpsr"),
28277                         clobbers);
28278   return clobbers;
28279 }
28280
28281 /* Implements target vector targetm.asm.encode_section_info.  This
28282    is not used by netware.  */
28283
28284 static void ATTRIBUTE_UNUSED
28285 ix86_encode_section_info (tree decl, rtx rtl, int first)
28286 {
28287   default_encode_section_info (decl, rtl, first);
28288
28289   if (TREE_CODE (decl) == VAR_DECL
28290       && (TREE_STATIC (decl) || DECL_EXTERNAL (decl))
28291       && ix86_in_large_data_p (decl))
28292     SYMBOL_REF_FLAGS (XEXP (rtl, 0)) |= SYMBOL_FLAG_FAR_ADDR;
28293 }
28294
28295 /* Worker function for REVERSE_CONDITION.  */
28296
28297 enum rtx_code
28298 ix86_reverse_condition (enum rtx_code code, enum machine_mode mode)
28299 {
28300   return (mode != CCFPmode && mode != CCFPUmode
28301           ? reverse_condition (code)
28302           : reverse_condition_maybe_unordered (code));
28303 }
28304
28305 /* Output code to perform an x87 FP register move, from OPERANDS[1]
28306    to OPERANDS[0].  */
28307
28308 const char *
28309 output_387_reg_move (rtx insn, rtx *operands)
28310 {
28311   if (REG_P (operands[0]))
28312     {
28313       if (REG_P (operands[1])
28314           && find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
28315         {
28316           if (REGNO (operands[0]) == FIRST_STACK_REG)
28317             return output_387_ffreep (operands, 0);
28318           return "fstp\t%y0";
28319         }
28320       if (STACK_TOP_P (operands[0]))
28321         return "fld%z1\t%y1";
28322       return "fst\t%y0";
28323     }
28324   else if (MEM_P (operands[0]))
28325     {
28326       gcc_assert (REG_P (operands[1]));
28327       if (find_regno_note (insn, REG_DEAD, REGNO (operands[1])))
28328         return "fstp%z0\t%y0";
28329       else
28330         {
28331           /* There is no non-popping store to memory for XFmode.
28332              So if we need one, follow the store with a load.  */
28333           if (GET_MODE (operands[0]) == XFmode)
28334             return "fstp%z0\t%y0\n\tfld%z0\t%y0";
28335           else
28336             return "fst%z0\t%y0";
28337         }
28338     }
28339   else
28340     gcc_unreachable();
28341 }
28342
28343 /* Output code to perform a conditional jump to LABEL, if C2 flag in
28344    FP status register is set.  */
28345
28346 void
28347 ix86_emit_fp_unordered_jump (rtx label)
28348 {
28349   rtx reg = gen_reg_rtx (HImode);
28350   rtx temp;
28351
28352   emit_insn (gen_x86_fnstsw_1 (reg));
28353
28354   if (TARGET_SAHF && (TARGET_USE_SAHF || optimize_insn_for_size_p ()))
28355     {
28356       emit_insn (gen_x86_sahf_1 (reg));
28357
28358       temp = gen_rtx_REG (CCmode, FLAGS_REG);
28359       temp = gen_rtx_UNORDERED (VOIDmode, temp, const0_rtx);
28360     }
28361   else
28362     {
28363       emit_insn (gen_testqi_ext_ccno_0 (reg, GEN_INT (0x04)));
28364
28365       temp = gen_rtx_REG (CCNOmode, FLAGS_REG);
28366       temp = gen_rtx_NE (VOIDmode, temp, const0_rtx);
28367     }
28368
28369   temp = gen_rtx_IF_THEN_ELSE (VOIDmode, temp,
28370                               gen_rtx_LABEL_REF (VOIDmode, label),
28371                               pc_rtx);
28372   temp = gen_rtx_SET (VOIDmode, pc_rtx, temp);
28373
28374   emit_jump_insn (temp);
28375   predict_jump (REG_BR_PROB_BASE * 10 / 100);
28376 }
28377
28378 /* Output code to perform a log1p XFmode calculation.  */
28379
28380 void ix86_emit_i387_log1p (rtx op0, rtx op1)
28381 {
28382   rtx label1 = gen_label_rtx ();
28383   rtx label2 = gen_label_rtx ();
28384
28385   rtx tmp = gen_reg_rtx (XFmode);
28386   rtx tmp2 = gen_reg_rtx (XFmode);
28387
28388   emit_insn (gen_absxf2 (tmp, op1));
28389   emit_insn (gen_cmpxf (tmp,
28390     CONST_DOUBLE_FROM_REAL_VALUE (
28391        REAL_VALUE_ATOF ("0.29289321881345247561810596348408353", XFmode),
28392        XFmode)));
28393   emit_jump_insn (gen_bge (label1));
28394
28395   emit_move_insn (tmp2, standard_80387_constant_rtx (4)); /* fldln2 */
28396   emit_insn (gen_fyl2xp1xf3_i387 (op0, op1, tmp2));
28397   emit_jump (label2);
28398
28399   emit_label (label1);
28400   emit_move_insn (tmp, CONST1_RTX (XFmode));
28401   emit_insn (gen_addxf3 (tmp, op1, tmp));
28402   emit_move_insn (tmp2, standard_80387_constant_rtx (4)); /* fldln2 */
28403   emit_insn (gen_fyl2xxf3_i387 (op0, tmp, tmp2));
28404
28405   emit_label (label2);
28406 }
28407
28408 /* Output code to perform a Newton-Rhapson approximation of a single precision
28409    floating point divide [http://en.wikipedia.org/wiki/N-th_root_algorithm].  */
28410
28411 void ix86_emit_swdivsf (rtx res, rtx a, rtx b, enum machine_mode mode)
28412 {
28413   rtx x0, x1, e0, e1, two;
28414
28415   x0 = gen_reg_rtx (mode);
28416   e0 = gen_reg_rtx (mode);
28417   e1 = gen_reg_rtx (mode);
28418   x1 = gen_reg_rtx (mode);
28419
28420   two = CONST_DOUBLE_FROM_REAL_VALUE (dconst2, SFmode);
28421
28422   if (VECTOR_MODE_P (mode))
28423     two = ix86_build_const_vector (SFmode, true, two);
28424
28425   two = force_reg (mode, two);
28426
28427   /* a / b = a * rcp(b) * (2.0 - b * rcp(b)) */
28428
28429   /* x0 = rcp(b) estimate */
28430   emit_insn (gen_rtx_SET (VOIDmode, x0,
28431                           gen_rtx_UNSPEC (mode, gen_rtvec (1, b),
28432                                           UNSPEC_RCP)));
28433   /* e0 = x0 * b */
28434   emit_insn (gen_rtx_SET (VOIDmode, e0,
28435                           gen_rtx_MULT (mode, x0, b)));
28436   /* e1 = 2. - e0 */
28437   emit_insn (gen_rtx_SET (VOIDmode, e1,
28438                           gen_rtx_MINUS (mode, two, e0)));
28439   /* x1 = x0 * e1 */
28440   emit_insn (gen_rtx_SET (VOIDmode, x1,
28441                           gen_rtx_MULT (mode, x0, e1)));
28442   /* res = a * x1 */
28443   emit_insn (gen_rtx_SET (VOIDmode, res,
28444                           gen_rtx_MULT (mode, a, x1)));
28445 }
28446
28447 /* Output code to perform a Newton-Rhapson approximation of a
28448    single precision floating point [reciprocal] square root.  */
28449
28450 void ix86_emit_swsqrtsf (rtx res, rtx a, enum machine_mode mode,
28451                          bool recip)
28452 {
28453   rtx x0, e0, e1, e2, e3, mthree, mhalf;
28454   REAL_VALUE_TYPE r;
28455
28456   x0 = gen_reg_rtx (mode);
28457   e0 = gen_reg_rtx (mode);
28458   e1 = gen_reg_rtx (mode);
28459   e2 = gen_reg_rtx (mode);
28460   e3 = gen_reg_rtx (mode);
28461
28462   real_from_integer (&r, VOIDmode, -3, -1, 0);
28463   mthree = CONST_DOUBLE_FROM_REAL_VALUE (r, SFmode);
28464
28465   real_arithmetic (&r, NEGATE_EXPR, &dconsthalf, NULL);
28466   mhalf = CONST_DOUBLE_FROM_REAL_VALUE (r, SFmode);
28467
28468   if (VECTOR_MODE_P (mode))
28469     {
28470       mthree = ix86_build_const_vector (SFmode, true, mthree);
28471       mhalf = ix86_build_const_vector (SFmode, true, mhalf);
28472     }
28473
28474   /* sqrt(a)  = -0.5 * a * rsqrtss(a) * (a * rsqrtss(a) * rsqrtss(a) - 3.0)
28475      rsqrt(a) = -0.5     * rsqrtss(a) * (a * rsqrtss(a) * rsqrtss(a) - 3.0) */
28476
28477   /* x0 = rsqrt(a) estimate */
28478   emit_insn (gen_rtx_SET (VOIDmode, x0,
28479                           gen_rtx_UNSPEC (mode, gen_rtvec (1, a),
28480                                           UNSPEC_RSQRT)));
28481
28482   /* If (a == 0.0) Filter out infinity to prevent NaN for sqrt(0.0).  */
28483   if (!recip)
28484     {
28485       rtx zero, mask;
28486
28487       zero = gen_reg_rtx (mode);
28488       mask = gen_reg_rtx (mode);
28489
28490       zero = force_reg (mode, CONST0_RTX(mode));
28491       emit_insn (gen_rtx_SET (VOIDmode, mask,
28492                               gen_rtx_NE (mode, zero, a)));
28493
28494       emit_insn (gen_rtx_SET (VOIDmode, x0,
28495                               gen_rtx_AND (mode, x0, mask)));
28496     }
28497
28498   /* e0 = x0 * a */
28499   emit_insn (gen_rtx_SET (VOIDmode, e0,
28500                           gen_rtx_MULT (mode, x0, a)));
28501   /* e1 = e0 * x0 */
28502   emit_insn (gen_rtx_SET (VOIDmode, e1,
28503                           gen_rtx_MULT (mode, e0, x0)));
28504
28505   /* e2 = e1 - 3. */
28506   mthree = force_reg (mode, mthree);
28507   emit_insn (gen_rtx_SET (VOIDmode, e2,
28508                           gen_rtx_PLUS (mode, e1, mthree)));
28509
28510   mhalf = force_reg (mode, mhalf);
28511   if (recip)
28512     /* e3 = -.5 * x0 */
28513     emit_insn (gen_rtx_SET (VOIDmode, e3,
28514                             gen_rtx_MULT (mode, x0, mhalf)));
28515   else
28516     /* e3 = -.5 * e0 */
28517     emit_insn (gen_rtx_SET (VOIDmode, e3,
28518                             gen_rtx_MULT (mode, e0, mhalf)));
28519   /* ret = e2 * e3 */
28520   emit_insn (gen_rtx_SET (VOIDmode, res,
28521                           gen_rtx_MULT (mode, e2, e3)));
28522 }
28523
28524 /* Solaris implementation of TARGET_ASM_NAMED_SECTION.  */
28525
28526 static void ATTRIBUTE_UNUSED
28527 i386_solaris_elf_named_section (const char *name, unsigned int flags,
28528                                 tree decl)
28529 {
28530   /* With Binutils 2.15, the "@unwind" marker must be specified on
28531      every occurrence of the ".eh_frame" section, not just the first
28532      one.  */
28533   if (TARGET_64BIT
28534       && strcmp (name, ".eh_frame") == 0)
28535     {
28536       fprintf (asm_out_file, "\t.section\t%s,\"%s\",@unwind\n", name,
28537                flags & SECTION_WRITE ? "aw" : "a");
28538       return;
28539     }
28540   default_elf_asm_named_section (name, flags, decl);
28541 }
28542
28543 /* Return the mangling of TYPE if it is an extended fundamental type.  */
28544
28545 static const char *
28546 ix86_mangle_type (const_tree type)
28547 {
28548   type = TYPE_MAIN_VARIANT (type);
28549
28550   if (TREE_CODE (type) != VOID_TYPE && TREE_CODE (type) != BOOLEAN_TYPE
28551       && TREE_CODE (type) != INTEGER_TYPE && TREE_CODE (type) != REAL_TYPE)
28552     return NULL;
28553
28554   switch (TYPE_MODE (type))
28555     {
28556     case TFmode:
28557       /* __float128 is "g".  */
28558       return "g";
28559     case XFmode:
28560       /* "long double" or __float80 is "e".  */
28561       return "e";
28562     default:
28563       return NULL;
28564     }
28565 }
28566
28567 /* For 32-bit code we can save PIC register setup by using
28568    __stack_chk_fail_local hidden function instead of calling
28569    __stack_chk_fail directly.  64-bit code doesn't need to setup any PIC
28570    register, so it is better to call __stack_chk_fail directly.  */
28571
28572 static tree
28573 ix86_stack_protect_fail (void)
28574 {
28575   return TARGET_64BIT
28576          ? default_external_stack_protect_fail ()
28577          : default_hidden_stack_protect_fail ();
28578 }
28579
28580 /* Select a format to encode pointers in exception handling data.  CODE
28581    is 0 for data, 1 for code labels, 2 for function pointers.  GLOBAL is
28582    true if the symbol may be affected by dynamic relocations.
28583
28584    ??? All x86 object file formats are capable of representing this.
28585    After all, the relocation needed is the same as for the call insn.
28586    Whether or not a particular assembler allows us to enter such, I
28587    guess we'll have to see.  */
28588 int
28589 asm_preferred_eh_data_format (int code, int global)
28590 {
28591   if (flag_pic)
28592     {
28593       int type = DW_EH_PE_sdata8;
28594       if (!TARGET_64BIT
28595           || ix86_cmodel == CM_SMALL_PIC
28596           || (ix86_cmodel == CM_MEDIUM_PIC && (global || code)))
28597         type = DW_EH_PE_sdata4;
28598       return (global ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel | type;
28599     }
28600   if (ix86_cmodel == CM_SMALL
28601       || (ix86_cmodel == CM_MEDIUM && code))
28602     return DW_EH_PE_udata4;
28603   return DW_EH_PE_absptr;
28604 }
28605 \f
28606 /* Expand copysign from SIGN to the positive value ABS_VALUE
28607    storing in RESULT.  If MASK is non-null, it shall be a mask to mask out
28608    the sign-bit.  */
28609 static void
28610 ix86_sse_copysign_to_positive (rtx result, rtx abs_value, rtx sign, rtx mask)
28611 {
28612   enum machine_mode mode = GET_MODE (sign);
28613   rtx sgn = gen_reg_rtx (mode);
28614   if (mask == NULL_RTX)
28615     {
28616       mask = ix86_build_signbit_mask (mode, VECTOR_MODE_P (mode), false);
28617       if (!VECTOR_MODE_P (mode))
28618         {
28619           /* We need to generate a scalar mode mask in this case.  */
28620           rtx tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (1, const0_rtx));
28621           tmp = gen_rtx_VEC_SELECT (mode, mask, tmp);
28622           mask = gen_reg_rtx (mode);
28623           emit_insn (gen_rtx_SET (VOIDmode, mask, tmp));
28624         }
28625     }
28626   else
28627     mask = gen_rtx_NOT (mode, mask);
28628   emit_insn (gen_rtx_SET (VOIDmode, sgn,
28629                           gen_rtx_AND (mode, mask, sign)));
28630   emit_insn (gen_rtx_SET (VOIDmode, result,
28631                           gen_rtx_IOR (mode, abs_value, sgn)));
28632 }
28633
28634 /* Expand fabs (OP0) and return a new rtx that holds the result.  The
28635    mask for masking out the sign-bit is stored in *SMASK, if that is
28636    non-null.  */
28637 static rtx
28638 ix86_expand_sse_fabs (rtx op0, rtx *smask)
28639 {
28640   enum machine_mode mode = GET_MODE (op0);
28641   rtx xa, mask;
28642
28643   xa = gen_reg_rtx (mode);
28644   mask = ix86_build_signbit_mask (mode, VECTOR_MODE_P (mode), true);
28645   if (!VECTOR_MODE_P (mode))
28646     {
28647       /* We need to generate a scalar mode mask in this case.  */
28648       rtx tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (1, const0_rtx));
28649       tmp = gen_rtx_VEC_SELECT (mode, mask, tmp);
28650       mask = gen_reg_rtx (mode);
28651       emit_insn (gen_rtx_SET (VOIDmode, mask, tmp));
28652     }
28653   emit_insn (gen_rtx_SET (VOIDmode, xa,
28654                           gen_rtx_AND (mode, op0, mask)));
28655
28656   if (smask)
28657     *smask = mask;
28658
28659   return xa;
28660 }
28661
28662 /* Expands a comparison of OP0 with OP1 using comparison code CODE,
28663    swapping the operands if SWAP_OPERANDS is true.  The expanded
28664    code is a forward jump to a newly created label in case the
28665    comparison is true.  The generated label rtx is returned.  */
28666 static rtx
28667 ix86_expand_sse_compare_and_jump (enum rtx_code code, rtx op0, rtx op1,
28668                                   bool swap_operands)
28669 {
28670   rtx label, tmp;
28671
28672   if (swap_operands)
28673     {
28674       tmp = op0;
28675       op0 = op1;
28676       op1 = tmp;
28677     }
28678
28679   label = gen_label_rtx ();
28680   tmp = gen_rtx_REG (CCFPUmode, FLAGS_REG);
28681   emit_insn (gen_rtx_SET (VOIDmode, tmp,
28682                           gen_rtx_COMPARE (CCFPUmode, op0, op1)));
28683   tmp = gen_rtx_fmt_ee (code, VOIDmode, tmp, const0_rtx);
28684   tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp,
28685                               gen_rtx_LABEL_REF (VOIDmode, label), pc_rtx);
28686   tmp = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, tmp));
28687   JUMP_LABEL (tmp) = label;
28688
28689   return label;
28690 }
28691
28692 /* Expand a mask generating SSE comparison instruction comparing OP0 with OP1
28693    using comparison code CODE.  Operands are swapped for the comparison if
28694    SWAP_OPERANDS is true.  Returns a rtx for the generated mask.  */
28695 static rtx
28696 ix86_expand_sse_compare_mask (enum rtx_code code, rtx op0, rtx op1,
28697                               bool swap_operands)
28698 {
28699   enum machine_mode mode = GET_MODE (op0);
28700   rtx mask = gen_reg_rtx (mode);
28701
28702   if (swap_operands)
28703     {
28704       rtx tmp = op0;
28705       op0 = op1;
28706       op1 = tmp;
28707     }
28708
28709   if (mode == DFmode)
28710     emit_insn (gen_sse2_maskcmpdf3 (mask, op0, op1,
28711                                     gen_rtx_fmt_ee (code, mode, op0, op1)));
28712   else
28713     emit_insn (gen_sse_maskcmpsf3 (mask, op0, op1,
28714                                    gen_rtx_fmt_ee (code, mode, op0, op1)));
28715
28716   return mask;
28717 }
28718
28719 /* Generate and return a rtx of mode MODE for 2**n where n is the number
28720    of bits of the mantissa of MODE, which must be one of DFmode or SFmode.  */
28721 static rtx
28722 ix86_gen_TWO52 (enum machine_mode mode)
28723 {
28724   REAL_VALUE_TYPE TWO52r;
28725   rtx TWO52;
28726
28727   real_ldexp (&TWO52r, &dconst1, mode == DFmode ? 52 : 23);
28728   TWO52 = const_double_from_real_value (TWO52r, mode);
28729   TWO52 = force_reg (mode, TWO52);
28730
28731   return TWO52;
28732 }
28733
28734 /* Expand SSE sequence for computing lround from OP1 storing
28735    into OP0.  */
28736 void
28737 ix86_expand_lround (rtx op0, rtx op1)
28738 {
28739   /* C code for the stuff we're doing below:
28740        tmp = op1 + copysign (nextafter (0.5, 0.0), op1)
28741        return (long)tmp;
28742    */
28743   enum machine_mode mode = GET_MODE (op1);
28744   const struct real_format *fmt;
28745   REAL_VALUE_TYPE pred_half, half_minus_pred_half;
28746   rtx adj;
28747
28748   /* load nextafter (0.5, 0.0) */
28749   fmt = REAL_MODE_FORMAT (mode);
28750   real_2expN (&half_minus_pred_half, -(fmt->p) - 1, mode);
28751   REAL_ARITHMETIC (pred_half, MINUS_EXPR, dconsthalf, half_minus_pred_half);
28752
28753   /* adj = copysign (0.5, op1) */
28754   adj = force_reg (mode, const_double_from_real_value (pred_half, mode));
28755   ix86_sse_copysign_to_positive (adj, adj, force_reg (mode, op1), NULL_RTX);
28756
28757   /* adj = op1 + adj */
28758   adj = expand_simple_binop (mode, PLUS, adj, op1, NULL_RTX, 0, OPTAB_DIRECT);
28759
28760   /* op0 = (imode)adj */
28761   expand_fix (op0, adj, 0);
28762 }
28763
28764 /* Expand SSE2 sequence for computing lround from OPERAND1 storing
28765    into OPERAND0.  */
28766 void
28767 ix86_expand_lfloorceil (rtx op0, rtx op1, bool do_floor)
28768 {
28769   /* C code for the stuff we're doing below (for do_floor):
28770         xi = (long)op1;
28771         xi -= (double)xi > op1 ? 1 : 0;
28772         return xi;
28773    */
28774   enum machine_mode fmode = GET_MODE (op1);
28775   enum machine_mode imode = GET_MODE (op0);
28776   rtx ireg, freg, label, tmp;
28777
28778   /* reg = (long)op1 */
28779   ireg = gen_reg_rtx (imode);
28780   expand_fix (ireg, op1, 0);
28781
28782   /* freg = (double)reg */
28783   freg = gen_reg_rtx (fmode);
28784   expand_float (freg, ireg, 0);
28785
28786   /* ireg = (freg > op1) ? ireg - 1 : ireg */
28787   label = ix86_expand_sse_compare_and_jump (UNLE,
28788                                             freg, op1, !do_floor);
28789   tmp = expand_simple_binop (imode, do_floor ? MINUS : PLUS,
28790                              ireg, const1_rtx, NULL_RTX, 0, OPTAB_DIRECT);
28791   emit_move_insn (ireg, tmp);
28792
28793   emit_label (label);
28794   LABEL_NUSES (label) = 1;
28795
28796   emit_move_insn (op0, ireg);
28797 }
28798
28799 /* Expand rint (IEEE round to nearest) rounding OPERAND1 and storing the
28800    result in OPERAND0.  */
28801 void
28802 ix86_expand_rint (rtx operand0, rtx operand1)
28803 {
28804   /* C code for the stuff we're doing below:
28805         xa = fabs (operand1);
28806         if (!isless (xa, 2**52))
28807           return operand1;
28808         xa = xa + 2**52 - 2**52;
28809         return copysign (xa, operand1);
28810    */
28811   enum machine_mode mode = GET_MODE (operand0);
28812   rtx res, xa, label, TWO52, mask;
28813
28814   res = gen_reg_rtx (mode);
28815   emit_move_insn (res, operand1);
28816
28817   /* xa = abs (operand1) */
28818   xa = ix86_expand_sse_fabs (res, &mask);
28819
28820   /* if (!isless (xa, TWO52)) goto label; */
28821   TWO52 = ix86_gen_TWO52 (mode);
28822   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
28823
28824   xa = expand_simple_binop (mode, PLUS, xa, TWO52, NULL_RTX, 0, OPTAB_DIRECT);
28825   xa = expand_simple_binop (mode, MINUS, xa, TWO52, xa, 0, OPTAB_DIRECT);
28826
28827   ix86_sse_copysign_to_positive (res, xa, res, mask);
28828
28829   emit_label (label);
28830   LABEL_NUSES (label) = 1;
28831
28832   emit_move_insn (operand0, res);
28833 }
28834
28835 /* Expand SSE2 sequence for computing floor or ceil from OPERAND1 storing
28836    into OPERAND0.  */
28837 void
28838 ix86_expand_floorceildf_32 (rtx operand0, rtx operand1, bool do_floor)
28839 {
28840   /* C code for the stuff we expand below.
28841         double xa = fabs (x), x2;
28842         if (!isless (xa, TWO52))
28843           return x;
28844         xa = xa + TWO52 - TWO52;
28845         x2 = copysign (xa, x);
28846      Compensate.  Floor:
28847         if (x2 > x)
28848           x2 -= 1;
28849      Compensate.  Ceil:
28850         if (x2 < x)
28851           x2 -= -1;
28852         return x2;
28853    */
28854   enum machine_mode mode = GET_MODE (operand0);
28855   rtx xa, TWO52, tmp, label, one, res, mask;
28856
28857   TWO52 = ix86_gen_TWO52 (mode);
28858
28859   /* Temporary for holding the result, initialized to the input
28860      operand to ease control flow.  */
28861   res = gen_reg_rtx (mode);
28862   emit_move_insn (res, operand1);
28863
28864   /* xa = abs (operand1) */
28865   xa = ix86_expand_sse_fabs (res, &mask);
28866
28867   /* if (!isless (xa, TWO52)) goto label; */
28868   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
28869
28870   /* xa = xa + TWO52 - TWO52; */
28871   xa = expand_simple_binop (mode, PLUS, xa, TWO52, NULL_RTX, 0, OPTAB_DIRECT);
28872   xa = expand_simple_binop (mode, MINUS, xa, TWO52, xa, 0, OPTAB_DIRECT);
28873
28874   /* xa = copysign (xa, operand1) */
28875   ix86_sse_copysign_to_positive (xa, xa, res, mask);
28876
28877   /* generate 1.0 or -1.0 */
28878   one = force_reg (mode,
28879                    const_double_from_real_value (do_floor
28880                                                  ? dconst1 : dconstm1, mode));
28881
28882   /* Compensate: xa = xa - (xa > operand1 ? 1 : 0) */
28883   tmp = ix86_expand_sse_compare_mask (UNGT, xa, res, !do_floor);
28884   emit_insn (gen_rtx_SET (VOIDmode, tmp,
28885                           gen_rtx_AND (mode, one, tmp)));
28886   /* We always need to subtract here to preserve signed zero.  */
28887   tmp = expand_simple_binop (mode, MINUS,
28888                              xa, tmp, NULL_RTX, 0, OPTAB_DIRECT);
28889   emit_move_insn (res, tmp);
28890
28891   emit_label (label);
28892   LABEL_NUSES (label) = 1;
28893
28894   emit_move_insn (operand0, res);
28895 }
28896
28897 /* Expand SSE2 sequence for computing floor or ceil from OPERAND1 storing
28898    into OPERAND0.  */
28899 void
28900 ix86_expand_floorceil (rtx operand0, rtx operand1, bool do_floor)
28901 {
28902   /* C code for the stuff we expand below.
28903         double xa = fabs (x), x2;
28904         if (!isless (xa, TWO52))
28905           return x;
28906         x2 = (double)(long)x;
28907      Compensate.  Floor:
28908         if (x2 > x)
28909           x2 -= 1;
28910      Compensate.  Ceil:
28911         if (x2 < x)
28912           x2 += 1;
28913         if (HONOR_SIGNED_ZEROS (mode))
28914           return copysign (x2, x);
28915         return x2;
28916    */
28917   enum machine_mode mode = GET_MODE (operand0);
28918   rtx xa, xi, TWO52, tmp, label, one, res, mask;
28919
28920   TWO52 = ix86_gen_TWO52 (mode);
28921
28922   /* Temporary for holding the result, initialized to the input
28923      operand to ease control flow.  */
28924   res = gen_reg_rtx (mode);
28925   emit_move_insn (res, operand1);
28926
28927   /* xa = abs (operand1) */
28928   xa = ix86_expand_sse_fabs (res, &mask);
28929
28930   /* if (!isless (xa, TWO52)) goto label; */
28931   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
28932
28933   /* xa = (double)(long)x */
28934   xi = gen_reg_rtx (mode == DFmode ? DImode : SImode);
28935   expand_fix (xi, res, 0);
28936   expand_float (xa, xi, 0);
28937
28938   /* generate 1.0 */
28939   one = force_reg (mode, const_double_from_real_value (dconst1, mode));
28940
28941   /* Compensate: xa = xa - (xa > operand1 ? 1 : 0) */
28942   tmp = ix86_expand_sse_compare_mask (UNGT, xa, res, !do_floor);
28943   emit_insn (gen_rtx_SET (VOIDmode, tmp,
28944                           gen_rtx_AND (mode, one, tmp)));
28945   tmp = expand_simple_binop (mode, do_floor ? MINUS : PLUS,
28946                              xa, tmp, NULL_RTX, 0, OPTAB_DIRECT);
28947   emit_move_insn (res, tmp);
28948
28949   if (HONOR_SIGNED_ZEROS (mode))
28950     ix86_sse_copysign_to_positive (res, res, force_reg (mode, operand1), mask);
28951
28952   emit_label (label);
28953   LABEL_NUSES (label) = 1;
28954
28955   emit_move_insn (operand0, res);
28956 }
28957
28958 /* Expand SSE sequence for computing round from OPERAND1 storing
28959    into OPERAND0.  Sequence that works without relying on DImode truncation
28960    via cvttsd2siq that is only available on 64bit targets.  */
28961 void
28962 ix86_expand_rounddf_32 (rtx operand0, rtx operand1)
28963 {
28964   /* C code for the stuff we expand below.
28965         double xa = fabs (x), xa2, x2;
28966         if (!isless (xa, TWO52))
28967           return x;
28968      Using the absolute value and copying back sign makes
28969      -0.0 -> -0.0 correct.
28970         xa2 = xa + TWO52 - TWO52;
28971      Compensate.
28972         dxa = xa2 - xa;
28973         if (dxa <= -0.5)
28974           xa2 += 1;
28975         else if (dxa > 0.5)
28976           xa2 -= 1;
28977         x2 = copysign (xa2, x);
28978         return x2;
28979    */
28980   enum machine_mode mode = GET_MODE (operand0);
28981   rtx xa, xa2, dxa, TWO52, tmp, label, half, mhalf, one, res, mask;
28982
28983   TWO52 = ix86_gen_TWO52 (mode);
28984
28985   /* Temporary for holding the result, initialized to the input
28986      operand to ease control flow.  */
28987   res = gen_reg_rtx (mode);
28988   emit_move_insn (res, operand1);
28989
28990   /* xa = abs (operand1) */
28991   xa = ix86_expand_sse_fabs (res, &mask);
28992
28993   /* if (!isless (xa, TWO52)) goto label; */
28994   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
28995
28996   /* xa2 = xa + TWO52 - TWO52; */
28997   xa2 = expand_simple_binop (mode, PLUS, xa, TWO52, NULL_RTX, 0, OPTAB_DIRECT);
28998   xa2 = expand_simple_binop (mode, MINUS, xa2, TWO52, xa2, 0, OPTAB_DIRECT);
28999
29000   /* dxa = xa2 - xa; */
29001   dxa = expand_simple_binop (mode, MINUS, xa2, xa, NULL_RTX, 0, OPTAB_DIRECT);
29002
29003   /* generate 0.5, 1.0 and -0.5 */
29004   half = force_reg (mode, const_double_from_real_value (dconsthalf, mode));
29005   one = expand_simple_binop (mode, PLUS, half, half, NULL_RTX, 0, OPTAB_DIRECT);
29006   mhalf = expand_simple_binop (mode, MINUS, half, one, NULL_RTX,
29007                                0, OPTAB_DIRECT);
29008
29009   /* Compensate.  */
29010   tmp = gen_reg_rtx (mode);
29011   /* xa2 = xa2 - (dxa > 0.5 ? 1 : 0) */
29012   tmp = ix86_expand_sse_compare_mask (UNGT, dxa, half, false);
29013   emit_insn (gen_rtx_SET (VOIDmode, tmp,
29014                           gen_rtx_AND (mode, one, tmp)));
29015   xa2 = expand_simple_binop (mode, MINUS, xa2, tmp, NULL_RTX, 0, OPTAB_DIRECT);
29016   /* xa2 = xa2 + (dxa <= -0.5 ? 1 : 0) */
29017   tmp = ix86_expand_sse_compare_mask (UNGE, mhalf, dxa, false);
29018   emit_insn (gen_rtx_SET (VOIDmode, tmp,
29019                           gen_rtx_AND (mode, one, tmp)));
29020   xa2 = expand_simple_binop (mode, PLUS, xa2, tmp, NULL_RTX, 0, OPTAB_DIRECT);
29021
29022   /* res = copysign (xa2, operand1) */
29023   ix86_sse_copysign_to_positive (res, xa2, force_reg (mode, operand1), mask);
29024
29025   emit_label (label);
29026   LABEL_NUSES (label) = 1;
29027
29028   emit_move_insn (operand0, res);
29029 }
29030
29031 /* Expand SSE sequence for computing trunc from OPERAND1 storing
29032    into OPERAND0.  */
29033 void
29034 ix86_expand_trunc (rtx operand0, rtx operand1)
29035 {
29036   /* C code for SSE variant we expand below.
29037         double xa = fabs (x), x2;
29038         if (!isless (xa, TWO52))
29039           return x;
29040         x2 = (double)(long)x;
29041         if (HONOR_SIGNED_ZEROS (mode))
29042           return copysign (x2, x);
29043         return x2;
29044    */
29045   enum machine_mode mode = GET_MODE (operand0);
29046   rtx xa, xi, TWO52, label, res, mask;
29047
29048   TWO52 = ix86_gen_TWO52 (mode);
29049
29050   /* Temporary for holding the result, initialized to the input
29051      operand to ease control flow.  */
29052   res = gen_reg_rtx (mode);
29053   emit_move_insn (res, operand1);
29054
29055   /* xa = abs (operand1) */
29056   xa = ix86_expand_sse_fabs (res, &mask);
29057
29058   /* if (!isless (xa, TWO52)) goto label; */
29059   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
29060
29061   /* x = (double)(long)x */
29062   xi = gen_reg_rtx (mode == DFmode ? DImode : SImode);
29063   expand_fix (xi, res, 0);
29064   expand_float (res, xi, 0);
29065
29066   if (HONOR_SIGNED_ZEROS (mode))
29067     ix86_sse_copysign_to_positive (res, res, force_reg (mode, operand1), mask);
29068
29069   emit_label (label);
29070   LABEL_NUSES (label) = 1;
29071
29072   emit_move_insn (operand0, res);
29073 }
29074
29075 /* Expand SSE sequence for computing trunc from OPERAND1 storing
29076    into OPERAND0.  */
29077 void
29078 ix86_expand_truncdf_32 (rtx operand0, rtx operand1)
29079 {
29080   enum machine_mode mode = GET_MODE (operand0);
29081   rtx xa, mask, TWO52, label, one, res, smask, tmp;
29082
29083   /* C code for SSE variant we expand below.
29084         double xa = fabs (x), x2;
29085         if (!isless (xa, TWO52))
29086           return x;
29087         xa2 = xa + TWO52 - TWO52;
29088      Compensate:
29089         if (xa2 > xa)
29090           xa2 -= 1.0;
29091         x2 = copysign (xa2, x);
29092         return x2;
29093    */
29094
29095   TWO52 = ix86_gen_TWO52 (mode);
29096
29097   /* Temporary for holding the result, initialized to the input
29098      operand to ease control flow.  */
29099   res = gen_reg_rtx (mode);
29100   emit_move_insn (res, operand1);
29101
29102   /* xa = abs (operand1) */
29103   xa = ix86_expand_sse_fabs (res, &smask);
29104
29105   /* if (!isless (xa, TWO52)) goto label; */
29106   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
29107
29108   /* res = xa + TWO52 - TWO52; */
29109   tmp = expand_simple_binop (mode, PLUS, xa, TWO52, NULL_RTX, 0, OPTAB_DIRECT);
29110   tmp = expand_simple_binop (mode, MINUS, tmp, TWO52, tmp, 0, OPTAB_DIRECT);
29111   emit_move_insn (res, tmp);
29112
29113   /* generate 1.0 */
29114   one = force_reg (mode, const_double_from_real_value (dconst1, mode));
29115
29116   /* Compensate: res = xa2 - (res > xa ? 1 : 0)  */
29117   mask = ix86_expand_sse_compare_mask (UNGT, res, xa, false);
29118   emit_insn (gen_rtx_SET (VOIDmode, mask,
29119                           gen_rtx_AND (mode, mask, one)));
29120   tmp = expand_simple_binop (mode, MINUS,
29121                              res, mask, NULL_RTX, 0, OPTAB_DIRECT);
29122   emit_move_insn (res, tmp);
29123
29124   /* res = copysign (res, operand1) */
29125   ix86_sse_copysign_to_positive (res, res, force_reg (mode, operand1), smask);
29126
29127   emit_label (label);
29128   LABEL_NUSES (label) = 1;
29129
29130   emit_move_insn (operand0, res);
29131 }
29132
29133 /* Expand SSE sequence for computing round from OPERAND1 storing
29134    into OPERAND0.  */
29135 void
29136 ix86_expand_round (rtx operand0, rtx operand1)
29137 {
29138   /* C code for the stuff we're doing below:
29139         double xa = fabs (x);
29140         if (!isless (xa, TWO52))
29141           return x;
29142         xa = (double)(long)(xa + nextafter (0.5, 0.0));
29143         return copysign (xa, x);
29144    */
29145   enum machine_mode mode = GET_MODE (operand0);
29146   rtx res, TWO52, xa, label, xi, half, mask;
29147   const struct real_format *fmt;
29148   REAL_VALUE_TYPE pred_half, half_minus_pred_half;
29149
29150   /* Temporary for holding the result, initialized to the input
29151      operand to ease control flow.  */
29152   res = gen_reg_rtx (mode);
29153   emit_move_insn (res, operand1);
29154
29155   TWO52 = ix86_gen_TWO52 (mode);
29156   xa = ix86_expand_sse_fabs (res, &mask);
29157   label = ix86_expand_sse_compare_and_jump (UNLE, TWO52, xa, false);
29158
29159   /* load nextafter (0.5, 0.0) */
29160   fmt = REAL_MODE_FORMAT (mode);
29161   real_2expN (&half_minus_pred_half, -(fmt->p) - 1, mode);
29162   REAL_ARITHMETIC (pred_half, MINUS_EXPR, dconsthalf, half_minus_pred_half);
29163
29164   /* xa = xa + 0.5 */
29165   half = force_reg (mode, const_double_from_real_value (pred_half, mode));
29166   xa = expand_simple_binop (mode, PLUS, xa, half, NULL_RTX, 0, OPTAB_DIRECT);
29167
29168   /* xa = (double)(int64_t)xa */
29169   xi = gen_reg_rtx (mode == DFmode ? DImode : SImode);
29170   expand_fix (xi, xa, 0);
29171   expand_float (xa, xi, 0);
29172
29173   /* res = copysign (xa, operand1) */
29174   ix86_sse_copysign_to_positive (res, xa, force_reg (mode, operand1), mask);
29175
29176   emit_label (label);
29177   LABEL_NUSES (label) = 1;
29178
29179   emit_move_insn (operand0, res);
29180 }
29181
29182 \f
29183 /* Validate whether a SSE5 instruction is valid or not.
29184    OPERANDS is the array of operands.
29185    NUM is the number of operands.
29186    USES_OC0 is true if the instruction uses OC0 and provides 4 variants.
29187    NUM_MEMORY is the maximum number of memory operands to accept.  
29188    when COMMUTATIVE is set, operand 1 and 2 can be swapped.  */
29189
29190 bool
29191 ix86_sse5_valid_op_p (rtx operands[], rtx insn ATTRIBUTE_UNUSED, int num,
29192                       bool uses_oc0, int num_memory, bool commutative)
29193 {
29194   int mem_mask;
29195   int mem_count;
29196   int i;
29197
29198   /* Count the number of memory arguments */
29199   mem_mask = 0;
29200   mem_count = 0;
29201   for (i = 0; i < num; i++)
29202     {
29203       enum machine_mode mode = GET_MODE (operands[i]);
29204       if (register_operand (operands[i], mode))
29205         ;
29206
29207       else if (memory_operand (operands[i], mode))
29208         {
29209           mem_mask |= (1 << i);
29210           mem_count++;
29211         }
29212
29213       else
29214         {
29215           rtx pattern = PATTERN (insn);
29216
29217           /* allow 0 for pcmov */
29218           if (GET_CODE (pattern) != SET
29219               || GET_CODE (SET_SRC (pattern)) != IF_THEN_ELSE
29220               || i < 2
29221               || operands[i] != CONST0_RTX (mode))
29222             return false;
29223         }
29224     }
29225
29226   /* Special case pmacsdq{l,h} where we allow the 3rd argument to be
29227      a memory operation.  */
29228   if (num_memory < 0)
29229     {
29230       num_memory = -num_memory;
29231       if ((mem_mask & (1 << (num-1))) != 0)
29232         {
29233           mem_mask &= ~(1 << (num-1));
29234           mem_count--;
29235         }
29236     }
29237
29238   /* If there were no memory operations, allow the insn */
29239   if (mem_mask == 0)
29240     return true;
29241
29242   /* Do not allow the destination register to be a memory operand.  */
29243   else if (mem_mask & (1 << 0))
29244     return false;
29245
29246   /* If there are too many memory operations, disallow the instruction.  While
29247      the hardware only allows 1 memory reference, before register allocation
29248      for some insns, we allow two memory operations sometimes in order to allow
29249      code like the following to be optimized:
29250
29251         float fmadd (float *a, float *b, float *c) { return (*a * *b) + *c; }
29252
29253     or similar cases that are vectorized into using the fmaddss
29254     instruction.  */
29255   else if (mem_count > num_memory)
29256     return false;
29257
29258   /* Don't allow more than one memory operation if not optimizing.  */
29259   else if (mem_count > 1 && !optimize)
29260     return false;
29261
29262   else if (num == 4 && mem_count == 1)
29263     {
29264       /* formats (destination is the first argument), example fmaddss:
29265          xmm1, xmm1, xmm2, xmm3/mem
29266          xmm1, xmm1, xmm2/mem, xmm3
29267          xmm1, xmm2, xmm3/mem, xmm1
29268          xmm1, xmm2/mem, xmm3, xmm1 */
29269       if (uses_oc0)
29270         return ((mem_mask == (1 << 1))
29271                 || (mem_mask == (1 << 2))
29272                 || (mem_mask == (1 << 3)));
29273
29274       /* format, example pmacsdd:
29275          xmm1, xmm2, xmm3/mem, xmm1 */
29276       if (commutative)
29277         return (mem_mask == (1 << 2) || mem_mask == (1 << 1));
29278       else
29279         return (mem_mask == (1 << 2));
29280     }
29281
29282   else if (num == 4 && num_memory == 2)
29283     {
29284       /* If there are two memory operations, we can load one of the memory ops
29285          into the destination register.  This is for optimizing the
29286          multiply/add ops, which the combiner has optimized both the multiply
29287          and the add insns to have a memory operation.  We have to be careful
29288          that the destination doesn't overlap with the inputs.  */
29289       rtx op0 = operands[0];
29290
29291       if (reg_mentioned_p (op0, operands[1])
29292           || reg_mentioned_p (op0, operands[2])
29293           || reg_mentioned_p (op0, operands[3]))
29294         return false;
29295
29296       /* formats (destination is the first argument), example fmaddss:
29297          xmm1, xmm1, xmm2, xmm3/mem
29298          xmm1, xmm1, xmm2/mem, xmm3
29299          xmm1, xmm2, xmm3/mem, xmm1
29300          xmm1, xmm2/mem, xmm3, xmm1
29301
29302          For the oc0 case, we will load either operands[1] or operands[3] into
29303          operands[0], so any combination of 2 memory operands is ok.  */
29304       if (uses_oc0)
29305         return true;
29306
29307       /* format, example pmacsdd:
29308          xmm1, xmm2, xmm3/mem, xmm1
29309
29310          For the integer multiply/add instructions be more restrictive and
29311          require operands[2] and operands[3] to be the memory operands.  */
29312       if (commutative)
29313         return (mem_mask == ((1 << 1) | (1 << 3)) || ((1 << 2) | (1 << 3)));
29314       else
29315         return (mem_mask == ((1 << 2) | (1 << 3)));
29316     }
29317
29318   else if (num == 3 && num_memory == 1)
29319     {
29320       /* formats, example protb:
29321          xmm1, xmm2, xmm3/mem
29322          xmm1, xmm2/mem, xmm3 */
29323       if (uses_oc0)
29324         return ((mem_mask == (1 << 1)) || (mem_mask == (1 << 2)));
29325
29326       /* format, example comeq:
29327          xmm1, xmm2, xmm3/mem */
29328       else
29329         return (mem_mask == (1 << 2));
29330     }
29331
29332   else
29333     gcc_unreachable ();
29334
29335   return false;
29336 }
29337
29338 \f
29339 /* Fixup an SSE5 instruction that has 2 memory input references into a form the
29340    hardware will allow by using the destination register to load one of the
29341    memory operations.  Presently this is used by the multiply/add routines to
29342    allow 2 memory references.  */
29343
29344 void
29345 ix86_expand_sse5_multiple_memory (rtx operands[],
29346                                   int num,
29347                                   enum machine_mode mode)
29348 {
29349   rtx op0 = operands[0];
29350   if (num != 4
29351       || memory_operand (op0, mode)
29352       || reg_mentioned_p (op0, operands[1])
29353       || reg_mentioned_p (op0, operands[2])
29354       || reg_mentioned_p (op0, operands[3]))
29355     gcc_unreachable ();
29356
29357   /* For 2 memory operands, pick either operands[1] or operands[3] to move into
29358      the destination register.  */
29359   if (memory_operand (operands[1], mode))
29360     {
29361       emit_move_insn (op0, operands[1]);
29362       operands[1] = op0;
29363     }
29364   else if (memory_operand (operands[3], mode))
29365     {
29366       emit_move_insn (op0, operands[3]);
29367       operands[3] = op0;
29368     }
29369   else
29370     gcc_unreachable ();
29371
29372   return;
29373 }
29374
29375 \f
29376 /* Table of valid machine attributes.  */
29377 static const struct attribute_spec ix86_attribute_table[] =
29378 {
29379   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
29380   /* Stdcall attribute says callee is responsible for popping arguments
29381      if they are not variable.  */
29382   { "stdcall",   0, 0, false, true,  true,  ix86_handle_cconv_attribute },
29383   /* Fastcall attribute says callee is responsible for popping arguments
29384      if they are not variable.  */
29385   { "fastcall",  0, 0, false, true,  true,  ix86_handle_cconv_attribute },
29386   /* Cdecl attribute says the callee is a normal C declaration */
29387   { "cdecl",     0, 0, false, true,  true,  ix86_handle_cconv_attribute },
29388   /* Regparm attribute specifies how many integer arguments are to be
29389      passed in registers.  */
29390   { "regparm",   1, 1, false, true,  true,  ix86_handle_cconv_attribute },
29391   /* Sseregparm attribute says we are using x86_64 calling conventions
29392      for FP arguments.  */
29393   { "sseregparm", 0, 0, false, true, true, ix86_handle_cconv_attribute },
29394   /* force_align_arg_pointer says this function realigns the stack at entry.  */
29395   { (const char *)&ix86_force_align_arg_pointer_string, 0, 0,
29396     false, true,  true, ix86_handle_cconv_attribute },
29397 #if TARGET_DLLIMPORT_DECL_ATTRIBUTES
29398   { "dllimport", 0, 0, false, false, false, handle_dll_attribute },
29399   { "dllexport", 0, 0, false, false, false, handle_dll_attribute },
29400   { "shared",    0, 0, true,  false, false, ix86_handle_shared_attribute },
29401 #endif
29402   { "ms_struct", 0, 0, false, false,  false, ix86_handle_struct_attribute },
29403   { "gcc_struct", 0, 0, false, false,  false, ix86_handle_struct_attribute },
29404 #ifdef SUBTARGET_ATTRIBUTE_TABLE
29405   SUBTARGET_ATTRIBUTE_TABLE,
29406 #endif
29407   /* ms_abi and sysv_abi calling convention function attributes.  */
29408   { "ms_abi", 0, 0, false, true, true, ix86_handle_abi_attribute },
29409   { "sysv_abi", 0, 0, false, true, true, ix86_handle_abi_attribute },
29410   /* End element.  */
29411   { NULL,        0, 0, false, false, false, NULL }
29412 };
29413
29414 /* Implement targetm.vectorize.builtin_vectorization_cost.  */
29415 static int
29416 x86_builtin_vectorization_cost (bool runtime_test)
29417 {
29418   /* If the branch of the runtime test is taken - i.e. - the vectorized
29419      version is skipped - this incurs a misprediction cost (because the
29420      vectorized version is expected to be the fall-through).  So we subtract
29421      the latency of a mispredicted branch from the costs that are incured
29422      when the vectorized version is executed.
29423
29424      TODO: The values in individual target tables have to be tuned or new
29425      fields may be needed. For eg. on K8, the default branch path is the
29426      not-taken path. If the taken path is predicted correctly, the minimum
29427      penalty of going down the taken-path is 1 cycle. If the taken-path is
29428      not predicted correctly, then the minimum penalty is 10 cycles.  */
29429
29430   if (runtime_test)
29431     {
29432       return (-(ix86_cost->cond_taken_branch_cost));
29433     }
29434   else
29435     return 0;
29436 }
29437
29438 /* This function returns the calling abi specific va_list type node.
29439    It returns  the FNDECL specific va_list type.  */
29440
29441 tree
29442 ix86_fn_abi_va_list (tree fndecl)
29443 {
29444   int abi;
29445
29446   if (!TARGET_64BIT)
29447     return va_list_type_node;
29448   gcc_assert (fndecl != NULL_TREE);
29449   abi = ix86_function_abi ((const_tree) fndecl);
29450
29451   if (abi == MS_ABI)
29452     return ms_va_list_type_node;
29453   else
29454     return sysv_va_list_type_node;
29455 }
29456
29457 /* Returns the canonical va_list type specified by TYPE. If there
29458    is no valid TYPE provided, it return NULL_TREE.  */
29459
29460 tree
29461 ix86_canonical_va_list_type (tree type)
29462 {
29463   tree wtype, htype;
29464
29465   /* Resolve references and pointers to va_list type.  */
29466   if (INDIRECT_REF_P (type))
29467     type = TREE_TYPE (type);
29468   else if (POINTER_TYPE_P (type) && POINTER_TYPE_P (TREE_TYPE(type)))
29469     type = TREE_TYPE (type);
29470
29471   if (TARGET_64BIT)
29472     {
29473       wtype = va_list_type_node;
29474           gcc_assert (wtype != NULL_TREE);
29475       htype = type;
29476       if (TREE_CODE (wtype) == ARRAY_TYPE)
29477         {
29478           /* If va_list is an array type, the argument may have decayed
29479              to a pointer type, e.g. by being passed to another function.
29480              In that case, unwrap both types so that we can compare the
29481              underlying records.  */
29482           if (TREE_CODE (htype) == ARRAY_TYPE
29483               || POINTER_TYPE_P (htype))
29484             {
29485               wtype = TREE_TYPE (wtype);
29486               htype = TREE_TYPE (htype);
29487             }
29488         }
29489       if (TYPE_MAIN_VARIANT (wtype) == TYPE_MAIN_VARIANT (htype))
29490         return va_list_type_node;
29491       wtype = sysv_va_list_type_node;
29492           gcc_assert (wtype != NULL_TREE);
29493       htype = type;
29494       if (TREE_CODE (wtype) == ARRAY_TYPE)
29495         {
29496           /* If va_list is an array type, the argument may have decayed
29497              to a pointer type, e.g. by being passed to another function.
29498              In that case, unwrap both types so that we can compare the
29499              underlying records.  */
29500           if (TREE_CODE (htype) == ARRAY_TYPE
29501               || POINTER_TYPE_P (htype))
29502             {
29503               wtype = TREE_TYPE (wtype);
29504               htype = TREE_TYPE (htype);
29505             }
29506         }
29507       if (TYPE_MAIN_VARIANT (wtype) == TYPE_MAIN_VARIANT (htype))
29508         return sysv_va_list_type_node;
29509       wtype = ms_va_list_type_node;
29510           gcc_assert (wtype != NULL_TREE);
29511       htype = type;
29512       if (TREE_CODE (wtype) == ARRAY_TYPE)
29513         {
29514           /* If va_list is an array type, the argument may have decayed
29515              to a pointer type, e.g. by being passed to another function.
29516              In that case, unwrap both types so that we can compare the
29517              underlying records.  */
29518           if (TREE_CODE (htype) == ARRAY_TYPE
29519               || POINTER_TYPE_P (htype))
29520             {
29521               wtype = TREE_TYPE (wtype);
29522               htype = TREE_TYPE (htype);
29523             }
29524         }
29525       if (TYPE_MAIN_VARIANT (wtype) == TYPE_MAIN_VARIANT (htype))
29526         return ms_va_list_type_node;
29527       return NULL_TREE;
29528     }
29529   return std_canonical_va_list_type (type);
29530 }
29531
29532 /* Iterate through the target-specific builtin types for va_list.
29533     IDX denotes the iterator, *PTREE is set to the result type of
29534     the va_list builtin, and *PNAME to its internal type.
29535     Returns zero if there is no element for this index, otherwise
29536     IDX should be increased upon the next call.
29537     Note, do not iterate a base builtin's name like __builtin_va_list.
29538     Used from c_common_nodes_and_builtins.  */
29539
29540 int
29541 ix86_enum_va_list (int idx, const char **pname, tree *ptree)
29542 {
29543   if (!TARGET_64BIT)
29544     return 0;
29545   switch (idx) {
29546   case 0:
29547     *ptree = ms_va_list_type_node;
29548     *pname = "__builtin_ms_va_list";
29549     break;
29550   case 1:
29551     *ptree = sysv_va_list_type_node;
29552     *pname = "__builtin_sysv_va_list";
29553     break;
29554   default:
29555     return 0;
29556   }
29557   return 1;
29558 }
29559
29560 /* Initialize the GCC target structure.  */
29561 #undef TARGET_RETURN_IN_MEMORY
29562 #define TARGET_RETURN_IN_MEMORY ix86_return_in_memory
29563
29564 #undef TARGET_ATTRIBUTE_TABLE
29565 #define TARGET_ATTRIBUTE_TABLE ix86_attribute_table
29566 #if TARGET_DLLIMPORT_DECL_ATTRIBUTES
29567 #  undef TARGET_MERGE_DECL_ATTRIBUTES
29568 #  define TARGET_MERGE_DECL_ATTRIBUTES merge_dllimport_decl_attributes
29569 #endif
29570
29571 #undef TARGET_COMP_TYPE_ATTRIBUTES
29572 #define TARGET_COMP_TYPE_ATTRIBUTES ix86_comp_type_attributes
29573
29574 #undef TARGET_INIT_BUILTINS
29575 #define TARGET_INIT_BUILTINS ix86_init_builtins
29576 #undef TARGET_EXPAND_BUILTIN
29577 #define TARGET_EXPAND_BUILTIN ix86_expand_builtin
29578
29579 #undef TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION
29580 #define TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION \
29581   ix86_builtin_vectorized_function
29582
29583 #undef TARGET_VECTORIZE_BUILTIN_CONVERSION
29584 #define TARGET_VECTORIZE_BUILTIN_CONVERSION ix86_vectorize_builtin_conversion
29585
29586 #undef TARGET_BUILTIN_RECIPROCAL
29587 #define TARGET_BUILTIN_RECIPROCAL ix86_builtin_reciprocal
29588
29589 #undef TARGET_ASM_FUNCTION_EPILOGUE
29590 #define TARGET_ASM_FUNCTION_EPILOGUE ix86_output_function_epilogue
29591
29592 #undef TARGET_ENCODE_SECTION_INFO
29593 #ifndef SUBTARGET_ENCODE_SECTION_INFO
29594 #define TARGET_ENCODE_SECTION_INFO ix86_encode_section_info
29595 #else
29596 #define TARGET_ENCODE_SECTION_INFO SUBTARGET_ENCODE_SECTION_INFO
29597 #endif
29598
29599 #undef TARGET_ASM_OPEN_PAREN
29600 #define TARGET_ASM_OPEN_PAREN ""
29601 #undef TARGET_ASM_CLOSE_PAREN
29602 #define TARGET_ASM_CLOSE_PAREN ""
29603
29604 #undef TARGET_ASM_ALIGNED_HI_OP
29605 #define TARGET_ASM_ALIGNED_HI_OP ASM_SHORT
29606 #undef TARGET_ASM_ALIGNED_SI_OP
29607 #define TARGET_ASM_ALIGNED_SI_OP ASM_LONG
29608 #ifdef ASM_QUAD
29609 #undef TARGET_ASM_ALIGNED_DI_OP
29610 #define TARGET_ASM_ALIGNED_DI_OP ASM_QUAD
29611 #endif
29612
29613 #undef TARGET_ASM_UNALIGNED_HI_OP
29614 #define TARGET_ASM_UNALIGNED_HI_OP TARGET_ASM_ALIGNED_HI_OP
29615 #undef TARGET_ASM_UNALIGNED_SI_OP
29616 #define TARGET_ASM_UNALIGNED_SI_OP TARGET_ASM_ALIGNED_SI_OP
29617 #undef TARGET_ASM_UNALIGNED_DI_OP
29618 #define TARGET_ASM_UNALIGNED_DI_OP TARGET_ASM_ALIGNED_DI_OP
29619
29620 #undef TARGET_SCHED_ADJUST_COST
29621 #define TARGET_SCHED_ADJUST_COST ix86_adjust_cost
29622 #undef TARGET_SCHED_ISSUE_RATE
29623 #define TARGET_SCHED_ISSUE_RATE ix86_issue_rate
29624 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
29625 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD \
29626   ia32_multipass_dfa_lookahead
29627
29628 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
29629 #define TARGET_FUNCTION_OK_FOR_SIBCALL ix86_function_ok_for_sibcall
29630
29631 #ifdef HAVE_AS_TLS
29632 #undef TARGET_HAVE_TLS
29633 #define TARGET_HAVE_TLS true
29634 #endif
29635 #undef TARGET_CANNOT_FORCE_CONST_MEM
29636 #define TARGET_CANNOT_FORCE_CONST_MEM ix86_cannot_force_const_mem
29637 #undef TARGET_USE_BLOCKS_FOR_CONSTANT_P
29638 #define TARGET_USE_BLOCKS_FOR_CONSTANT_P hook_bool_mode_const_rtx_true
29639
29640 #undef TARGET_DELEGITIMIZE_ADDRESS
29641 #define TARGET_DELEGITIMIZE_ADDRESS ix86_delegitimize_address
29642
29643 #undef TARGET_MS_BITFIELD_LAYOUT_P
29644 #define TARGET_MS_BITFIELD_LAYOUT_P ix86_ms_bitfield_layout_p
29645
29646 #if TARGET_MACHO
29647 #undef TARGET_BINDS_LOCAL_P
29648 #define TARGET_BINDS_LOCAL_P darwin_binds_local_p
29649 #endif
29650 #if TARGET_DLLIMPORT_DECL_ATTRIBUTES
29651 #undef TARGET_BINDS_LOCAL_P
29652 #define TARGET_BINDS_LOCAL_P i386_pe_binds_local_p
29653 #endif
29654
29655 #undef TARGET_ASM_OUTPUT_MI_THUNK
29656 #define TARGET_ASM_OUTPUT_MI_THUNK x86_output_mi_thunk
29657 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
29658 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK x86_can_output_mi_thunk
29659
29660 #undef TARGET_ASM_FILE_START
29661 #define TARGET_ASM_FILE_START x86_file_start
29662
29663 #undef TARGET_DEFAULT_TARGET_FLAGS
29664 #define TARGET_DEFAULT_TARGET_FLAGS     \
29665   (TARGET_DEFAULT                       \
29666    | TARGET_SUBTARGET_DEFAULT           \
29667    | TARGET_TLS_DIRECT_SEG_REFS_DEFAULT)
29668
29669 #undef TARGET_HANDLE_OPTION
29670 #define TARGET_HANDLE_OPTION ix86_handle_option
29671
29672 #undef TARGET_RTX_COSTS
29673 #define TARGET_RTX_COSTS ix86_rtx_costs
29674 #undef TARGET_ADDRESS_COST
29675 #define TARGET_ADDRESS_COST ix86_address_cost
29676
29677 #undef TARGET_FIXED_CONDITION_CODE_REGS
29678 #define TARGET_FIXED_CONDITION_CODE_REGS ix86_fixed_condition_code_regs
29679 #undef TARGET_CC_MODES_COMPATIBLE
29680 #define TARGET_CC_MODES_COMPATIBLE ix86_cc_modes_compatible
29681
29682 #undef TARGET_MACHINE_DEPENDENT_REORG
29683 #define TARGET_MACHINE_DEPENDENT_REORG ix86_reorg
29684
29685 #undef TARGET_BUILTIN_SETJMP_FRAME_VALUE
29686 #define TARGET_BUILTIN_SETJMP_FRAME_VALUE ix86_builtin_setjmp_frame_value
29687
29688 #undef TARGET_BUILD_BUILTIN_VA_LIST
29689 #define TARGET_BUILD_BUILTIN_VA_LIST ix86_build_builtin_va_list
29690
29691 #undef TARGET_FN_ABI_VA_LIST
29692 #define TARGET_FN_ABI_VA_LIST ix86_fn_abi_va_list
29693
29694 #undef TARGET_CANONICAL_VA_LIST_TYPE
29695 #define TARGET_CANONICAL_VA_LIST_TYPE ix86_canonical_va_list_type
29696
29697 #undef TARGET_EXPAND_BUILTIN_VA_START
29698 #define TARGET_EXPAND_BUILTIN_VA_START ix86_va_start
29699
29700 #undef TARGET_MD_ASM_CLOBBERS
29701 #define TARGET_MD_ASM_CLOBBERS ix86_md_asm_clobbers
29702
29703 #undef TARGET_PROMOTE_PROTOTYPES
29704 #define TARGET_PROMOTE_PROTOTYPES hook_bool_const_tree_true
29705 #undef TARGET_STRUCT_VALUE_RTX
29706 #define TARGET_STRUCT_VALUE_RTX ix86_struct_value_rtx
29707 #undef TARGET_SETUP_INCOMING_VARARGS
29708 #define TARGET_SETUP_INCOMING_VARARGS ix86_setup_incoming_varargs
29709 #undef TARGET_MUST_PASS_IN_STACK
29710 #define TARGET_MUST_PASS_IN_STACK ix86_must_pass_in_stack
29711 #undef TARGET_PASS_BY_REFERENCE
29712 #define TARGET_PASS_BY_REFERENCE ix86_pass_by_reference
29713 #undef TARGET_INTERNAL_ARG_POINTER
29714 #define TARGET_INTERNAL_ARG_POINTER ix86_internal_arg_pointer
29715 #undef TARGET_UPDATE_STACK_BOUNDARY
29716 #define TARGET_UPDATE_STACK_BOUNDARY ix86_update_stack_boundary
29717 #undef TARGET_GET_DRAP_RTX
29718 #define TARGET_GET_DRAP_RTX ix86_get_drap_rtx
29719 #undef TARGET_DWARF_HANDLE_FRAME_UNSPEC
29720 #define TARGET_DWARF_HANDLE_FRAME_UNSPEC ix86_dwarf_handle_frame_unspec
29721 #undef TARGET_STRICT_ARGUMENT_NAMING
29722 #define TARGET_STRICT_ARGUMENT_NAMING hook_bool_CUMULATIVE_ARGS_true
29723
29724 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
29725 #define TARGET_GIMPLIFY_VA_ARG_EXPR ix86_gimplify_va_arg
29726
29727 #undef TARGET_SCALAR_MODE_SUPPORTED_P
29728 #define TARGET_SCALAR_MODE_SUPPORTED_P ix86_scalar_mode_supported_p
29729
29730 #undef TARGET_VECTOR_MODE_SUPPORTED_P
29731 #define TARGET_VECTOR_MODE_SUPPORTED_P ix86_vector_mode_supported_p
29732
29733 #undef TARGET_C_MODE_FOR_SUFFIX
29734 #define TARGET_C_MODE_FOR_SUFFIX ix86_c_mode_for_suffix
29735
29736 #ifdef HAVE_AS_TLS
29737 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
29738 #define TARGET_ASM_OUTPUT_DWARF_DTPREL i386_output_dwarf_dtprel
29739 #endif
29740
29741 #ifdef SUBTARGET_INSERT_ATTRIBUTES
29742 #undef TARGET_INSERT_ATTRIBUTES
29743 #define TARGET_INSERT_ATTRIBUTES SUBTARGET_INSERT_ATTRIBUTES
29744 #endif
29745
29746 #undef TARGET_MANGLE_TYPE
29747 #define TARGET_MANGLE_TYPE ix86_mangle_type
29748
29749 #undef TARGET_STACK_PROTECT_FAIL
29750 #define TARGET_STACK_PROTECT_FAIL ix86_stack_protect_fail
29751
29752 #undef TARGET_FUNCTION_VALUE
29753 #define TARGET_FUNCTION_VALUE ix86_function_value
29754
29755 #undef TARGET_SECONDARY_RELOAD
29756 #define TARGET_SECONDARY_RELOAD ix86_secondary_reload
29757
29758 #undef TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST
29759 #define TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST x86_builtin_vectorization_cost
29760
29761 #undef TARGET_SET_CURRENT_FUNCTION
29762 #define TARGET_SET_CURRENT_FUNCTION ix86_set_current_function
29763
29764 #undef TARGET_OPTION_VALID_ATTRIBUTE_P
29765 #define TARGET_OPTION_VALID_ATTRIBUTE_P ix86_valid_target_attribute_p
29766
29767 #undef TARGET_OPTION_SAVE
29768 #define TARGET_OPTION_SAVE ix86_function_specific_save
29769
29770 #undef TARGET_OPTION_RESTORE
29771 #define TARGET_OPTION_RESTORE ix86_function_specific_restore
29772
29773 #undef TARGET_OPTION_PRINT
29774 #define TARGET_OPTION_PRINT ix86_function_specific_print
29775
29776 #undef TARGET_OPTION_CAN_INLINE_P
29777 #define TARGET_OPTION_CAN_INLINE_P ix86_can_inline_p
29778
29779 #undef TARGET_EXPAND_TO_RTL_HOOK
29780 #define TARGET_EXPAND_TO_RTL_HOOK ix86_maybe_switch_abi
29781
29782 struct gcc_target targetm = TARGET_INITIALIZER;
29783 \f
29784 #include "gt-i386.h"